Module gonioanalysis.droso

General methods common for both DrosoM and DrosoX.

Functions

def simple_select(list_of_strings)

Simple command line user interface for selecting a string from a list of many strings.

Returns the string selected.

Classes

class DrosoSelect (datadir=None)

Selecting a Droso folder based on user input or programmatically.

Folder has to start with "Droso".

TODO: - add programmatic selection methods of folders

datadir Where the different droso folder are in

Expand source code
class DrosoSelect:
    '''
    Selecting a Droso folder based on user input or programmatically.

    Folder has to start with "Droso".

    TODO:
    - add programmatic selection methods of folders
    '''

    def __init__(self, datadir=None):
        '''
        datadir     Where the different droso folder are in
        '''
        if datadir is None:
            self.path = input("Input data directory >> ")
        else:
            self.path = datadir

        folders = [fn for fn in os.listdir(self.path) if isdir(join(self.path, fn))]
        self.folders = [os.path.join(self.path, fn) for fn in folders]
 
        self.groups = SpecimenGroups()
    

    def parse_specimens(self, user_input):
        '''
        Parse user input to get manalyser names.

        Arguments
        ---------
        *user_input : string
            Comma separated list of specimen names or indices of self.folders,
            or a group name.
        
        Raises ValueError if unable to parse.
        '''
        
        # 1) If user supplies a specimen group name
        if user_input in self.groups.get_groups().keys():
            user_input = ','.join(self.groups.get_specimens(user_input))

            sel_keys = [os.path.basename(x) for x in user_input.split(',')]
            selections = [folder for folder in self.folders if os.path.basename(folder) in sel_keys]
            
            if len(selections) == len(sel_keys):
                print('Selecting by group.')
            else:
                print('Group is invalid; Specified specimens do not exist')
         
        else:
            # 2) Otherwise first try if indices to self.folders
            try:
                sel_indices = [int(i) for i in user_input.split(',')]
                selections = [self.filt_folders[i] for i in sel_indices]
            except IndexError:
                print('One of the given numbers goes over limits, try again.')
            
            # 3) Next try if specifying by specimen names
            except ValueError:
                print('Not number values given, trying with base names')
                
                sel_keys = [os.path.basename(x) for x in user_input.split(',')]
                selections = [folder for folder in self.folders if os.path.basename(folder) in sel_keys]
                
                if len(selections) == len(sel_keys):
                    print('Worked.')
                else:
                    print('Did not work, try again.')
        
        try:
            selections
        except:
            ValueError("parse_specimens unable to process {}".format(user_input))

        return selections
        

    def ask_user(self, startswith='', endswith='', contains=''):
        '''
        In terminal, ask user to select a Droso folder and can perform simple
        filtering of folders based on folder name.

        INPUT ARGUMENTS         DESCRIPTION
        startswith              Folder's name has to start with this string
        endswith                Folder's name has to have this string in the end
        contains                Folder's name has to have this string somewhere

        RETURNS                 A list of directories (strings) that the user selected?
        '''
        available_commands = ['new_group', 'list_groups', ]

        # Filtering of folders based on their name: startswith, endswith, and contains
        self.filt_folders = [f for f in self.folders if
                os.path.split(f)[1].startswith(startswith) and os.path.split(f)[1].endswith(endswith) and contains in os.path.split(f)[1]]
        
        folders = self.filt_folders

        print('\nSelect a Droso folder (give either number or drosoname, to select many comma split)')
        for i, folder in enumerate(folders):
            print("  {}) {}".format(i, folder))
        
        print('Type help for additional commands')

        while True:
            user_input = input('>> ')

            # 
            splitted = user_input.split(' ')
            if splitted[0] == 'help':
                print('Following commands are avaible')
                for cmd in available_commands:
                    print('  '+cmd)
            elif splitted[0] == 'new_group':
                self.groups.new_group(*splitted[1:])
            elif splitted[0] == 'list_groups':
                print(self.groups.get_groups())
            else:
                try:
                    selections = self.parse_specimens(user_input)
                    break
                except ValueError:
                    pass

        print('\nSelected {}\n'.format(selections))
        
        self.groups.save_groups()
    
        return selections

Methods

def ask_user(self, startswith='', endswith='', contains='')

In terminal, ask user to select a Droso folder and can perform simple filtering of folders based on folder name.

INPUT ARGUMENTS DESCRIPTION startswith Folder's name has to start with this string endswith Folder's name has to have this string in the end contains Folder's name has to have this string somewhere

RETURNS A list of directories (strings) that the user selected?

def parse_specimens(self, user_input)

Parse user input to get manalyser names.

Arguments

*user_input : string
Comma separated list of specimen names or indices of self.folders, or a group name.

Raises ValueError if unable to parse.

class SpecimenGroups

Managing specimens into groups.

Expand source code
class SpecimenGroups:
    '''
    Managing specimens into groups. 
    '''

    def __init__(self):
        self.groups = {}
        
        self.load_groups()

    def load_groups(self):
        try:
            with open(os.path.join(GONIODIR, 'specimen_groups.txt'), 'r') as fp:
                self.groups = json.load(fp)
        except FileNotFoundError:
            print('No specimen groups')

    def save_groups(self):
        '''
        Save groups but only if groups has some members (does not save an empty dict)
        '''
        if len(self.groups.keys()) >= 0:
            with open(os.path.join(GONIODIR, 'specimen_groups.txt'), 'w') as fp:
                json.dump(self.groups, fp)

      
    def new_group(self, group_name, *specimens):
        self.groups[group_name] = [*specimens]
    

    def get_groups(self):
        '''
        Returns the groups dictionary
        '''
        return self.groups

    def get_specimens(self, group_name):
        return self.groups[group_name]

Methods

def get_groups(self)

Returns the groups dictionary

def get_specimens(self, group_name)
def load_groups(self)
def new_group(self, group_name, *specimens)
def save_groups(self)

Save groups but only if groups has some members (does not save an empty dict)