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
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
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
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
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.')
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.')
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()
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
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
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)]
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) ]
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)
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
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
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())
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())