def __process_single_design_transfers(self, sector_index, sector_layout): stock_transfer_volume = self.iso.iso_request.stock_volume wl_label = LABELS.create_sector_stock_transfer_worklist_label( self.iso.label, LABELS.ROLE_SINGLE_DESIGN_STOCK, sector_index) wl_series = self.__make_stock_rack_worklist_series( wl_label, stock_transfer_volume, sector_layout) tube_map = self.__get_tube_map_for_sector(sector_layout) sector_tube_transfers = [] sdssr_barcodes = self.__single_stock_rack_map[sector_index] for design_number, sdssr_barcode in enumerate(sdssr_barcodes): tube_transfers = self.__build_tube_transfers( design_number, sdssr_barcode, sector_layout, tube_map) sector_tube_transfers.extend(tube_transfers) if len(sdssr_barcodes) == 1: # Setting the design number to None shortens worklist and # stock rack labels. design_number = None self.__process_stock_rack(LABELS.ROLE_SINGLE_DESIGN_STOCK, sector_index, design_number, sdssr_barcode, wl_series, sector_layout) return sector_tube_transfers
def __process_stock_rack(self, role, sector_index, design_number, tube_rack_barcode, worklist_series, working_rack_layout): label = LABELS.create_sector_stock_rack_label( self.iso.label, role, sector_index, design_number=design_number) tube_rack = self.__tube_rack_map[tube_rack_barcode] rack_layout = working_rack_layout.create_rack_layout() # Check if we have an existing stock rack to update, using the # label to find it. exst_isrs = [isr for isr in self.iso.iso_stock_racks if isr.label == label] if len(exst_isrs) == 1: exst_isr = exst_isrs[0] exst_isr.worklist_series = worklist_series exst_isr.rack = tube_rack exst_isr.rack_layout = rack_layout elif len(exst_isrs) == 0: # FIXME: Using instantiation for side effects. IsoSectorStockRack(self.iso, sector_index, label, tube_rack, rack_layout, worklist_series) else: self.add_error('More than one stock rack have the same ' 'label (%s).' % exst_isrs[0].label)
def __process_pool_transfers(self, sector_index, sector_layout): pp_vol = self.iso.iso_request.preparation_plate_volume \ * VOLUME_CONVERSION_FACTOR # Create a worklist series for the stock transfer. wl_label = LABELS.create_sector_stock_transfer_worklist_label( self.iso.label, LABELS.ROLE_POOL_STOCK, sector_index) prep_transfer_volume = get_preparation_plate_transfer_volume( preparation_plate_volume=pp_vol) \ / VOLUME_CONVERSION_FACTOR wl_series = self.__make_stock_rack_worklist_series( wl_label, prep_transfer_volume, None) # Process the new pool rack. self.__process_stock_rack(LABELS.ROLE_POOL_STOCK, sector_index, None, self.__pool_stock_rack_map[sector_index], wl_series, sector_layout)
def __build_stock_rack_maps(self): for isr in self.iso.iso_sector_stock_racks: label_values = LABELS.parse_sector_stock_rack_label(isr.label) rack_role = label_values[LABELS.MARKER_RACK_ROLE] sector_index = label_values[LABELS.MARKER_SECTOR_INDEX] if rack_role == LABELS.ROLE_POOL_STOCK: if self.__pool_stock_rack_map is None: self.__pool_stock_rack_map = {} self.__pool_stock_rack_map[sector_index] = isr elif rack_role == LABELS.ROLE_SINGLE_DESIGN_STOCK: # The rack number encodes the single design number. rn = label_values.get(LABELS.MARKER_RACK_NUM) if not rn is None: sdss_racks = \ self.__single_stock_rack_map.get(sector_index) if sdss_racks is None: sdss_racks = \ [None] * self.iso.iso_request.number_designs self.__single_stock_rack_map[sector_index] = \ sdss_racks sdss_racks[rn - 1] = isr else: self.__single_stock_rack_map[sector_index] = [isr] else: msg = 'Invalid rack role "%s".' % rack_role self.add_error(msg) # Sanity checks. if not self.__pool_stock_rack_map is None \ and not sorted(self.__pool_stock_rack_map.keys()) \ == sorted(self.__single_stock_rack_map.keys()): msg = 'Not all pool stock racks have single design stock ' \ 'racks or vice versa!' self.add_error(msg) if not set([len(val) for val in self.__single_stock_rack_map.values()]) \ == set([self.iso.iso_request.number_designs]): msg = 'The number of single design stock racks needs to be ' \ 'the same in all sectors.' self.add_error(msg)
def __process_pool_transfers(self, sector_index, sector_layout): pp_vol = self.iso.iso_request.preparation_plate_volume \ * VOLUME_CONVERSION_FACTOR # Create a worklist series for the stock transfer. wl_label = LABELS.create_sector_stock_transfer_worklist_label( self.iso.label, LABELS.ROLE_POOL_STOCK, sector_index) prep_transfer_volume = get_preparation_plate_transfer_volume( preparation_plate_volume=pp_vol) \ / VOLUME_CONVERSION_FACTOR wl_series = self.__make_stock_rack_worklist_series( wl_label, prep_transfer_volume, None) # Process the new pool rack. self.__process_stock_rack( LABELS.ROLE_POOL_STOCK, sector_index, None, self.__pool_stock_rack_map[sector_index], wl_series, sector_layout)
def __process_stock_rack(self, role, sector_index, design_number, tube_rack_barcode, worklist_series, working_rack_layout): label = LABELS.create_sector_stock_rack_label( self.iso.label, role, sector_index, design_number=design_number) tube_rack = self.__tube_rack_map[tube_rack_barcode] rack_layout = working_rack_layout.create_rack_layout() # Check if we have an existing stock rack to update, using the # label to find it. exst_isrs = [ isr for isr in self.iso.iso_stock_racks if isr.label == label ] if len(exst_isrs) == 1: exst_isr = exst_isrs[0] exst_isr.worklist_series = worklist_series exst_isr.rack = tube_rack exst_isr.rack_layout = rack_layout elif len(exst_isrs) == 0: # FIXME: Using instantiation for side effects. IsoSectorStockRack(self.iso, sector_index, label, tube_rack, rack_layout, worklist_series) else: self.add_error('More than one stock rack have the same ' 'label (%s).' % exst_isrs[0].label)