Beispiel #1
0
def get_sector_layouts_for_384_layout(layout, sector_layout_class=None):
    """
    Converts the given 384 layout into four 96 well sector layouts of the
    given layout class.

    :param sector_layout_class: Class to use for the sector layouts.
    :returns: map sector index -> 96 well layout
    :rtype: dict
    """
    if sector_layout_class is None:
        sector_layout_class = type(layout)
    sec_pos_map_384 = QuadrantIterator.sort_into_sectors(layout, 4)
    rs96 = get_96_rack_shape()
    sec_layout_map = {}
    for sec_idx in range(4):
        sec_wrk_poss_384 = sec_pos_map_384[sec_idx]
        if len(sec_wrk_poss_384) < 1:
            # FIXME: Should break here.
            continue
        trl = RackSectorTranslator(4, sec_idx, 0,
                                   behaviour=RackSectorTranslator.ONE_TO_MANY)
        sec_layout = sector_layout_class(rs96)
        for sec_wrk_pos_384 in sec_wrk_poss_384:
            sec_pos_96 = trl.translate(sec_wrk_pos_384.rack_position)
            sec_wrk_pos_96 = sec_wrk_pos_384.clone()
            sec_wrk_pos_96.rack_position = sec_pos_96
            sec_layout.add_position(sec_wrk_pos_96)
        sec_layout_map[sec_idx] = sec_layout
    return sec_layout_map
Beispiel #2
0
    def __set_source_values(self):
        """
        There are two sizes available: 96 positions and 384 positions. If
        possible (less than 97 distinct hash values), we use the smaller one.
        Also sets the source rack shape and minimum row distances.
        """
        self.add_debug('Determine rack shape ...')

        small_shape = get_96_rack_shape()
        large_shape = get_384_rack_shape()
        if len(self._hash_values) > large_shape.size:
            msg = 'The number of source positions (%i) exceeds %i! ' \
                  'Redesign your experiment or talk to the IT ' \
                  'department, please.' \
                  % (len(self._hash_values), large_shape.size)
            self.add_error(msg)
        elif len(self._hash_values) > small_shape.size:
            source_rack_shape = large_shape
        else:
            source_rack_shape = small_shape

        if not self.has_errors():
            self._source_layout = self._init_source_layout(source_rack_shape)
            self.__source_rack_shape = self._source_layout.shape
            if self.__source_rack_shape.name == RACK_SHAPE_NAMES.SHAPE_384:
                self.__src_min_row_distance = 1
            else:
                self.__src_min_row_distance = 0
            target_layout_shape = self._get_target_layout_shape()
            if target_layout_shape.name == RACK_SHAPE_NAMES.SHAPE_384:
                self.__trg_min_row_distance = 1
            else:
                self.__trg_min_row_distance = 0
Beispiel #3
0
 def get_positions_without_tube(self):
     """
     Returns the positions in the rack that are not occupied at the moment.
     """
     shape_96 = get_96_rack_shape()
     free_positions = []
     for rack_pos in get_positions_for_shape(shape_96):
         if not self.tubes.has_key(rack_pos):
             free_positions.append(rack_pos)
     return free_positions
Beispiel #4
0
 def get_positions_without_tube(self):
     """
     Returns the positions in the rack that are not occupied at the moment.
     """
     shape_96 = get_96_rack_shape()
     free_positions = []
     for rack_pos in get_positions_for_shape(shape_96):
         if not self.tubes.has_key(rack_pos):
             free_positions.append(rack_pos)
     return free_positions
Beispiel #5
0
 def run(self):
     self.reset()
     self.add_info('Start ISO reset ...')
     self.__check_input()
     if not self.has_errors():
         for iso in self.isos:
             iso.molecule_design_pool_set = None
             iso.rack_layout = RackLayout(get_96_rack_shape())
         self.return_value = self.isos
         self.add_info('ISO reset completed.')
Beispiel #6
0
 def run(self):
     self.reset()
     self.add_info('Start ISO reset ...')
     self.__check_input()
     if not self.has_errors():
         for iso in self.isos:
             iso.molecule_design_pool_set = None
             iso.rack_layout = RackLayout(get_96_rack_shape())
         self.return_value = self.isos
         self.add_info('ISO reset completed.')
Beispiel #7
0
    def __init__(self, rack_barcode, timestamp):
        """
        Constructor
        """
        #: The barcode of the scanned rack.
        self.rack_barcode = rack_barcode
        #: The timestamp of the scanning file.
        self.timestamp = timestamp

        #: The shape of the layout (:class:`thelma.entities.rack.RackShape`)
        self.shape = get_96_rack_shape()
        #: Maps tube barcodes onto rack positions.
        self._position_map = dict()
Beispiel #8
0
 def __make_generate_isos_patch_representation(self, iso_request):
     isor = iso_request.get_entity()
     # FIXME: The status should be part of the ISO_STATUS const group.
     iso = LabIso('NEW ISO',
                  0,
                  RackLayout(shape=get_96_rack_shape()),
                  iso_request=isor,
                  status='NEW')
     isor.isos.append(iso)
     rpr = as_representer(iso_request, XmlMime)
     patch_ctxt = self.__get_patch_context(iso_request,
                                           ('isos', ('isos', 'status')))
     with patch_ctxt:
         rpr_str = rpr.to_string(iso_request)
     return rpr_str
Beispiel #9
0
 def __make_generate_isos_patch_representation(self, iso_request):
     isor = iso_request.get_entity()
     # FIXME: The status should be part of the ISO_STATUS const group.
     iso = LabIso('NEW ISO',
                  0,
                  RackLayout(shape=get_96_rack_shape()),
                  iso_request=isor,
                  status='NEW')
     isor.isos.append(iso)
     rpr = as_representer(iso_request, XmlMime)
     patch_ctxt = self.__get_patch_context(iso_request,
                                           ('isos', ('isos', 'status')))
     with patch_ctxt:
         rpr_str = rpr.to_string(iso_request)
     return rpr_str
Beispiel #10
0
    def _initialize_parser_keys(self):
        """
        We need to set floating related parser values. Also the allowed
        layout dimension are the fixed (96-well or 384-well).
        """
        parameter_set = MoleculeDesignPoolParameters
        validator = parameter_set.create_validator_from_parameter(
                                          parameter_set.MOLECULE_DESIGN_POOL)
        self.parser.molecule_design_id_predicates = validator.aliases
        self.parser.no_id_indicator = parameter_set.FLOATING_INDICATOR

        shape96 = get_96_rack_shape()
        shape384 = get_384_rack_shape()
        self.parser.allowed_rack_dimensions = [
                    (shape96.number_rows, shape96.number_columns),
                    (shape384.number_rows, shape384.number_columns)]
Beispiel #11
0
    def _initialize_parser_keys(self):
        """
        We need to set floating related parser values. Also the allowed
        layout dimension are the fixed (96-well or 384-well).
        """
        parameter_set = MoleculeDesignPoolParameters
        validator = parameter_set.create_validator_from_parameter(
            parameter_set.MOLECULE_DESIGN_POOL)
        self.parser.molecule_design_id_predicates = validator.aliases
        self.parser.no_id_indicator = parameter_set.FLOATING_INDICATOR

        shape96 = get_96_rack_shape()
        shape384 = get_384_rack_shape()
        self.parser.allowed_rack_dimensions = [
            (shape96.number_rows, shape96.number_columns),
            (shape384.number_rows, shape384.number_columns)
        ]
Beispiel #12
0
 def __sort_into_sectors(self):
     # Create a rack layout for each quadrant.
     self.add_debug('Sort positions into sectors ...')
     quadrant_positions = QuadrantIterator.sort_into_sectors(
         self.base_layout, NUMBER_SECTORS)
     rack_shape_96 = get_96_rack_shape()
     for sector_index, positions in quadrant_positions.iteritems():
         if len(positions) < 1: continue
         base_layout = LibraryBaseLayout(shape=rack_shape_96)
         for pos in positions:
             base_layout.add_position(pos)
         if len(base_layout) > 0:
             self.__quadrant_layouts[sector_index] = base_layout
     if len(self.__quadrant_layouts) < NUMBER_SECTORS:
         missing_sectors = []
         for sector_index in range(NUMBER_SECTORS):
             if not self.__quadrant_layouts.has_key(sector_index):
                 missing_sectors.append(str(sector_index + 1))
         msg = 'Some rack sectors are empty. You do not require stock ' \
               'racks for them: %s!' % (', '.join(missing_sectors))
         self.add_warning(msg)
Beispiel #13
0
 def __create_isos(self):
     # Creates the ISOs. At this the tool checks whether there are already
     # ISOs at the ISO request. The tool add ISOs until the number of plates
     # (ISO request attribute) is reached.
     self.add_debug('Create ISOs ...')
     current_iso_count = len(self.iso_request.isos)
     new_iso_count = self.iso_request.expected_number_isos
     for i in range(current_iso_count, new_iso_count):
         layout_number = i + 1
         iso_label = LABELS.create_iso_label(self.iso_request.label,
                                             layout_number)
         ticket_number = self.__get_ticket_number(iso_label, layout_number)
         if ticket_number is None:
             break
         # FIXME: Using side effect of instantiation.
         StockSampleCreationIso(iso_label,
                                self.iso_request.number_designs,
                                RackLayout(shape=get_96_rack_shape()),
                                ticket_number,
                                layout_number,
                                iso_request=self.iso_request)
         self.__new_iso_counter += 1
Beispiel #14
0
 def __create_isos(self):
     # Creates the ISOs. At this the tool checks whether there are already
     # ISOs at the ISO request. The tool add ISOs until the number of plates
     # (ISO request attribute) is reached.
     self.add_debug('Create ISOs ...')
     current_iso_count = len(self.iso_request.isos)
     new_iso_count = self.iso_request.expected_number_isos
     for i in range(current_iso_count, new_iso_count):
         layout_number = i + 1
         iso_label = LABELS.create_iso_label(self.iso_request.label,
                                             layout_number)
         ticket_number = self.__get_ticket_number(iso_label, layout_number)
         if ticket_number is None:
             break
         # FIXME: Using side effect of instantiation.
         StockSampleCreationIso(iso_label,
                                self.iso_request.number_designs,
                                RackLayout(shape=get_96_rack_shape()),
                                ticket_number,
                                layout_number,
                                iso_request=self.iso_request)
         self.__new_iso_counter += 1
Beispiel #15
0
 def _get_number_of_avaible_positions(self):
     """
     Returns the number of positions available for the new pools in the
     final stock rack or plate.
     """
     return len(get_96_rack_shape())
Beispiel #16
0
 def _get_number_of_avaible_positions(self):
     """
     Returns the number of positions available for the new pools in the
     final stock rack or plate.
     """
     return len(get_96_rack_shape())