def __check_numerical_values(self, value_maps, label): """ Checks the values of the numerical parameters. """ invalid_numericals = dict() invalid_mock = dict() invalid_untreated = dict() pool_map = value_maps[TransfectionParameters.MOLECULE_DESIGN_POOL] for parameter, value_map in value_maps.iteritems(): if not parameter in _SCENARIO_PARAMETERS.NUMERICAL_PARAMETERS: continue for rack_pos, value in value_map.iteritems(): if value is None: continue pool = pool_map[rack_pos] if (pool == MOCK_POSITION_TYPE): if not TransfectionParameters.is_valid_mock_value( value, parameter): add_list_map_element(invalid_mock, parameter, rack_pos.label) elif TransfectionParameters.is_untreated_type(pool): if parameter in (TransfectionParameters.FINAL_CONCENTRATION, TransfectionParameters.REAGENT_DIL_FACTOR) \ and not TransfectionPosition.\ is_valid_untreated_value(value): add_list_map_element(invalid_untreated, parameter, rack_pos.label) elif not is_valid_number(value): info = '%s (%s)' % (rack_pos.label, value) add_list_map_element(invalid_numericals, parameter, info) if len(invalid_numericals) > 0: records_str = self.__get_error_record_string(invalid_numericals) msg = 'The levels of some factors must be positive numbers. The ' \ 'following positions in design rack %s have invalid ' \ 'values: %s.' % (label, records_str) self.add_error(msg) if len(invalid_mock) > 0: records_str = self.__get_error_record_string(invalid_mock) msg = 'The levels of some factors for mock positions allow only ' \ 'for the values "None" or "mock" (or no level). Some ' \ 'positions in design rack "%s" have invalid levels. ' \ 'Affected positions: %s.' % (label, records_str) self.add_error(msg) if len(invalid_untreated) > 0: records_str = self.__get_error_record_string(invalid_untreated) msg = 'The levels of some factors for untreated positions allow ' \ 'only for the values "None" and "untreated" (or no level). ' \ 'Some position in design rack "%s" have invalid levels. ' \ 'Affected positions: %s.' % (label, records_str) self.add_error(msg)
def __check_numerical_values(self, value_maps, label): """ Checks the values of the numerical parameters. """ invalid_numericals = dict() invalid_mock = dict() invalid_untreated = dict() pool_map = value_maps[TransfectionParameters.MOLECULE_DESIGN_POOL] for parameter, value_map in value_maps.iteritems(): if not parameter in _SCENARIO_PARAMETERS.NUMERICAL_PARAMETERS: continue for rack_pos, value in value_map.iteritems(): if value is None: continue pool = pool_map[rack_pos] if (pool == MOCK_POSITION_TYPE): if not TransfectionParameters.is_valid_mock_value(value, parameter): add_list_map_element(invalid_mock, parameter, rack_pos.label) elif TransfectionParameters.is_untreated_type(pool): if parameter in (TransfectionParameters.FINAL_CONCENTRATION, TransfectionParameters.REAGENT_DIL_FACTOR) \ and not TransfectionPosition.\ is_valid_untreated_value(value): add_list_map_element(invalid_untreated, parameter, rack_pos.label) elif not is_valid_number(value): info = '%s (%s)' % (rack_pos.label, value) add_list_map_element(invalid_numericals, parameter, info) if len(invalid_numericals) > 0: records_str = self.__get_error_record_string(invalid_numericals) msg = 'The levels of some factors must be positive numbers. The ' \ 'following positions in design rack %s have invalid ' \ 'values: %s.' % (label, records_str) self.add_error(msg) if len(invalid_mock) > 0: records_str = self.__get_error_record_string(invalid_mock) msg = 'The levels of some factors for mock positions allow only ' \ 'for the values "None" or "mock" (or no level). Some ' \ 'positions in design rack "%s" have invalid levels. ' \ 'Affected positions: %s.' % (label, records_str) self.add_error(msg) if len(invalid_untreated) > 0: records_str = self.__get_error_record_string(invalid_untreated) msg = 'The levels of some factors for untreated positions allow ' \ 'only for the values "None" and "untreated" (or no level). ' \ 'Some position in design rack "%s" have invalid levels. ' \ 'Affected positions: %s.' % (label, records_str) self.add_error(msg)
def __check_design_racks(self): """ Checks the presence of parameters for each rack design rack. """ self.add_debug('Check design racks ...') validators = dict() for parameter in _SCENARIO_PARAMETERS.POTENTIAL_PARAMETERS: validator = TransfectionParameters.create_validator_from_parameter( parameter) validators[parameter] = validator for design_rack in self.__design_racks: value_maps = self.__get_values_for_rack_layout(validators, design_rack.rack_layout) if self.__check_for_molecule_designs(value_maps, design_rack.label): self.__check_numerical_values(value_maps, design_rack.label) self.__check_reagent_name(value_maps, design_rack.label) self.__check_value_presence(value_maps, design_rack.label)
def __check_design_racks(self): """ Checks the presence of parameters for each rack design rack. """ self.add_debug('Check design racks ...') validators = dict() for parameter in _SCENARIO_PARAMETERS.POTENTIAL_PARAMETERS: validator = TransfectionParameters.create_validator_from_parameter( parameter) validators[parameter] = validator for design_rack in self.__design_racks: value_maps = self.__get_values_for_rack_layout( validators, design_rack.rack_layout) if self.__check_for_molecule_designs(value_maps, design_rack.label): self.__check_numerical_values(value_maps, design_rack.label) self.__check_reagent_name(value_maps, design_rack.label) self.__check_value_presence(value_maps, design_rack.label)
def __check_reagent_name(self, value_maps, label): """ Checks the reagent name for each rack position in a layout (if this parameter is an allowed one). The reagent name must have a special value for untreated positions and be at least two character long for other positions. """ if not TransfectionParameters.REAGENT_NAME \ in self.__forbidden_parameters: pool_map = value_maps[TransfectionParameters.MOLECULE_DESIGN_POOL] name_map = value_maps[TransfectionParameters.REAGENT_NAME] invalid_untreated = [] invalid_others = [] for rack_pos, reagent_name in name_map.iteritems(): if reagent_name is None: continue pool = pool_map[rack_pos] if TransfectionParameters.is_untreated_type(pool): if not TransfectionPosition.is_valid_untreated_value( reagent_name): invalid_untreated.append(rack_pos.label) elif not len(reagent_name) > 1: invalid_others.append(rack_pos.label) if len(invalid_untreated): msg = 'Untreated position must only have the reagent names ' \ '"None", "untreated" or no reagent name at all. The ' \ 'following untreated positions in design rack "%s" ' \ 'have invalid reagent names: %s.' \ % (label, ', '.join(sorted(invalid_untreated))) self.add_error(msg) if len(invalid_others): msg = 'The reagent name must be at least 2 characters long. ' \ 'The following positions in design rack "%s" have ' \ 'invalid reagent names: %s.' \ % (label, ', '.join(sorted(invalid_others))) self.add_error(msg)
def __check_reagent_name(self, value_maps, label): """ Checks the reagent name for each rack position in a layout (if this parameter is an allowed one). The reagent name must have a special value for untreated positions and be at least two character long for other positions. """ if not TransfectionParameters.REAGENT_NAME \ in self.__forbidden_parameters: pool_map = value_maps[TransfectionParameters.MOLECULE_DESIGN_POOL] name_map = value_maps[TransfectionParameters.REAGENT_NAME] invalid_untreated = [] invalid_others = [] for rack_pos, reagent_name in name_map.iteritems(): if reagent_name is None: continue pool = pool_map[rack_pos] if TransfectionParameters.is_untreated_type(pool): if not TransfectionPosition.is_valid_untreated_value( reagent_name): invalid_untreated.append(rack_pos.label) elif not len(reagent_name) > 1: invalid_others.append(rack_pos.label) if len(invalid_untreated): msg = 'Untreated position must only have the reagent names ' \ '"None", "untreated" or no reagent name at all. The ' \ 'following untreated positions in design rack "%s" ' \ 'have invalid reagent names: %s.' \ % (label, ', '.join(sorted(invalid_untreated))) self.add_error(msg) if len(invalid_others): msg = 'The reagent name must be at least 2 characters long. ' \ 'The following positions in design rack "%s" have ' \ 'invalid reagent names: %s.' \ % (label, ', '.join(sorted(invalid_others))) self.add_error(msg)
def __check_value_presence(self, value_maps, label): """ Checks the presence of mandatory, optional and forbidden parameters for each rack position in a layout. """ pool_map = value_maps[TransfectionParameters.MOLECULE_DESIGN_POOL] pool_forbidden = TransfectionParameters.MOLECULE_DESIGN_POOL in \ self.__forbidden_parameters non_empty = [] missing_value = dict() additional_values = dict() inconsistent_optionals = dict() for rack_pos in get_positions_for_shape(self._rack_shape): pool_id = pool_map[rack_pos] is_untreated = (isinstance(pool_id, basestring) and \ TransfectionParameters.is_untreated_type(pool_id.lower())) if is_untreated: continue if pool_id is None: # Empty position should not have values for parameter, value_map in value_maps.iteritems(): if not value_map[rack_pos] is None: non_empty.append(rack_pos.label) break if not pool_forbidden: continue for parameter, value_map in value_maps.iteritems(): if parameter == TransfectionParameters.MOLECULE_DESIGN_POOL: continue elif pool_id == MOCK_POSITION_TYPE and \ parameter == TransfectionParameters.FINAL_CONCENTRATION: continue value = value_map[rack_pos] # Check consistency of definition present_parameter = self.__parameter_presence[parameter] if present_parameter and value is None: if not inconsistent_optionals.has_key(parameter): inconsistent_optionals[parameter] = [] inconsistent_optionals[parameter].append(rack_pos.label) elif not present_parameter and not value is None and \ not pool_forbidden: self.__parameter_presence[parameter] = True # Check mandatory and forbidden parameters if parameter in self.__mandatory_parameters and \ value is None: if not missing_value.has_key(parameter): missing_value[parameter] = [] missing_value[parameter].append(rack_pos.label) elif parameter in self.__forbidden_parameters and \ not value is None: if not additional_values.has_key(parameter): additional_values[parameter] = [] info = '%s (%s)' % (rack_pos.label, value) additional_values[parameter].append(info) # Error recording if len(non_empty) > 0 and not pool_forbidden: msg = 'Some rack positions in design rack %s contain values ' \ 'although there are no molecule designs for them: %s.' \ % (label, ', '.join(sorted(non_empty))) self.add_error(msg) if len(missing_value) > 0: records_str = self.__get_error_record_string(missing_value) msg = 'There are mandatory values missing for some rack ' \ 'positions in design rack %s: %s. Assumed scenario: %s.' \ % (label, records_str, self.scenario.display_name) self.add_error(msg) if len(additional_values) > 0: records_str = self.__get_error_record_string(additional_values) msg = 'Some factors must not be specified in %s scenarios. The ' \ 'following position in design rack %s contain ' \ 'specifications for forbidden factors: %s.' \ % (self.scenario.display_name, label, records_str) self.add_error(msg) if len(inconsistent_optionals) > 0: records_str = self.__get_error_record_string( inconsistent_optionals) msg = 'If you specify a factor, you have to specify it for each ' \ 'non-empty well in all design racks. The following wells ' \ 'in design rack %s lack a specification: %s.' \ % (label, records_str) self.add_error(msg)
def __check_value_presence(self, value_maps, label): """ Checks the presence of mandatory, optional and forbidden parameters for each rack position in a layout. """ pool_map = value_maps[TransfectionParameters.MOLECULE_DESIGN_POOL] pool_forbidden = TransfectionParameters.MOLECULE_DESIGN_POOL in \ self.__forbidden_parameters non_empty = [] missing_value = dict() additional_values = dict() inconsistent_optionals = dict() for rack_pos in get_positions_for_shape(self._rack_shape): pool_id = pool_map[rack_pos] is_untreated = (isinstance(pool_id, basestring) and \ TransfectionParameters.is_untreated_type(pool_id.lower())) if is_untreated: continue if pool_id is None: # Empty position should not have values for parameter, value_map in value_maps.iteritems(): if not value_map[rack_pos] is None: non_empty.append(rack_pos.label) break if not pool_forbidden: continue for parameter, value_map in value_maps.iteritems(): if parameter == TransfectionParameters.MOLECULE_DESIGN_POOL: continue elif pool_id == MOCK_POSITION_TYPE and \ parameter == TransfectionParameters.FINAL_CONCENTRATION: continue value = value_map[rack_pos] # Check consistency of definition present_parameter = self.__parameter_presence[parameter] if present_parameter and value is None: if not inconsistent_optionals.has_key(parameter): inconsistent_optionals[parameter] = [] inconsistent_optionals[parameter].append(rack_pos.label) elif not present_parameter and not value is None and \ not pool_forbidden: self.__parameter_presence[parameter] = True # Check mandatory and forbidden parameters if parameter in self.__mandatory_parameters and \ value is None: if not missing_value.has_key(parameter): missing_value[parameter] = [] missing_value[parameter].append(rack_pos.label) elif parameter in self.__forbidden_parameters and \ not value is None: if not additional_values.has_key(parameter): additional_values[parameter] = [] info = '%s (%s)' % (rack_pos.label, value) additional_values[parameter].append(info) # Error recording if len(non_empty) > 0 and not pool_forbidden: msg = 'Some rack positions in design rack %s contain values ' \ 'although there are no molecule designs for them: %s.' \ % (label, ', '.join(sorted(non_empty))) self.add_error(msg) if len(missing_value) > 0: records_str = self.__get_error_record_string(missing_value) msg = 'There are mandatory values missing for some rack ' \ 'positions in design rack %s: %s. Assumed scenario: %s.' \ % (label, records_str, self.scenario.display_name) self.add_error(msg) if len(additional_values) > 0: records_str = self.__get_error_record_string(additional_values) msg = 'Some factors must not be specified in %s scenarios. The ' \ 'following position in design rack %s contain ' \ 'specifications for forbidden factors: %s.' \ % (self.scenario.display_name, label, records_str) self.add_error(msg) if len(inconsistent_optionals) > 0: records_str = self.__get_error_record_string(inconsistent_optionals) msg = 'If you specify a factor, you have to specify it for each ' \ 'non-empty well in all design racks. The following wells ' \ 'in design rack %s lack a specification: %s.' \ % (label, records_str) self.add_error(msg)