Exemplo n.º 1
0
    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)
Exemplo n.º 2
0
    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)
Exemplo n.º 3
0
    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)
Exemplo n.º 4
0
    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)
Exemplo n.º 5
0
    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)
Exemplo n.º 6
0
    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)
Exemplo n.º 7
0
    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)
Exemplo n.º 8
0
    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)