Ejemplo n.º 1
0
    def __init__(self, volume_calculator, iso_request_label, parent=None):
        """
        Constructor.

        :param volume_calculator: Determines transfer and dilution volumes
            for pool stock sample ISO requests.
        :type volume_calculator: :class:`VolumeCalculator`
        :param int number_designs: The number of single molecule designs for
            each pool (positive number).
        :param int target_volume: The final volume for the new pool stock
            tubes in ul (positive number).
        :param int target_concentration: The final pool concentration for the
            new pool stock tubes in nM (positive number).
        :param str iso_request_label: The plate set label of the ISO request
            to be created - will be used as part of the worklist name.
        """
        BaseTool.__init__(self, parent=parent)
        #: The plate set label of the ISO request to be created - will be used
        #: as part of the worklist name.
        self.iso_request_label = iso_request_label
        #: The :class:`VolumeCalculator` determines transfer and buffer volumes
        #: and might also adjust the target volume for the ISO request.
        self.volume_calculator = volume_calculator
        #: The worklist series for the ISO request.
        self.__worklist_series = None
Ejemplo n.º 2
0
    def __init__(self, base_layout, stock_concentration,
                 library_name, preparation_buffer_volume,
                 pool_buffer_volume=None, parent=None):
        """
        Constructor.

        :param base_layout: Layout defining which positions of the layout
            are allowed to take up library samples.
        :type base_layout: :class:`LibraryBaseLayout`
        :param int stock_concentration: Concentration of the single
            source molecule designs in the stock in nM (positive number).
        :param str library_name: Name of the library to be created.
        :param float preparation_buffer_volume: Buffer volume for preparation
            plates in ul.
        :param float pool_buffer_volume: Buffer volume for pool
            plates in ul. May be `None` if no pool racks are created.
        """
        BaseTool.__init__(self, parent=parent)
        self.base_layout = base_layout
        self.stock_concentration = stock_concentration
        self.library_name = library_name
        self.preparation_buffer_volume = preparation_buffer_volume
        self.pool_buffer_volume = pool_buffer_volume
        #: The worklist series for the ISO request.
        self.__worklist_series = None
        #: The last used worklist index (within the series).
        self.__last_worklist_index = None
        #: The base layout for each sector.
        self.__sector_layouts = None
Ejemplo n.º 3
0
    def __init__(self, iso, user, parent=None):
        """
        Constructor.

        :param iso: library creation ISO to execute.
        :param user: User performing the execution.
        """
        BaseTool.__init__(self, parent=parent)
        self.iso = iso
        self.user = user
        #:
        self.__single_stock_rack_map = None
        #:
        self.__pool_stock_rack_map = None
        #:
        self.__prep_plate_map = None
        #:
        self.__ssc_layout_map = None
        #:
        self.__empty_stock_rack_positions_map = None
        #:
        self.__stock_trf_exc_wl_map = None
        # These are attributes required by the Trac reporter that this
        # executor is passed to.
        self.mode = StockTransferWriterExecutor.MODE_EXECUTE
        self.entity = iso
Ejemplo n.º 4
0
    def __init__(self, iso_request, ticket_numbers=None, reporter=None,
                 parent=None):
        """
        Constructor.

        :param iso_request: The ISO request for which to generate the ISOs.
        :type iso_request:
            :class:`thelma.entities.iso.StockSampleGenerationIsoRequest`
        :param ticket_numbers: The user might specify ticket numbers for the
            ISO tickets. The number of ticket number must either be 1 (in
            which case all ISOs get the same ticket number) or equal to the
            number of ISOs. If there is no ticket number specified, the
            tool will generate new tickets for each ISO.
            Attention: It is not checked whether these given tickets exist!
        :type ticket_numbers: :class:`list` of `int`
        :default ticket_numbers: *None*
        :param reporter: This user will become reporter of the tickets (if
            new tickets are created). If you do not want to create tickets,
            the user might be *None*.
        :type reporter: :class:`thelma.entities.user.User`
        :default reporter: *None*
        """
        BaseTool.__init__(self, parent=parent)
        self.iso_request = iso_request
        self.ticket_numbers = ticket_numbers
        self.reporter = reporter
        #: The number of ISOs created (for checking reasons).
        self.__new_iso_counter = None
Ejemplo n.º 5
0
    def __init__(self, iso_request, number_isos,
                 excluded_racks=None, requested_tubes=None, parent=None):
        """
        Constructor.

        :param iso_request: The ISO request containing the ISO layout for the
            ISO (and experiment metadata with the molecule design pools).
        :type iso_request: :class:`thelma.entities.iso.IsoRequest`
        :param int number_isos: The number of ISOs ordered.
        :param excluded_racks: A list of barcodes from stock racks that shall
            not be used for stock sample picking.
        :type excluded_racks: A list of rack barcodes
        :param requested_tubes: A list of barcodes from stock tubes that are
            supposed to be used.
        :type requested_tubes: A list of tube barcodes.
        """
        BaseTool.__init__(self, parent=parent)
        #: The ISO request defining the ISO layout
        #: (:class:`thelma.entities.iso.IsoRequest`)
        self.iso_request = iso_request
        #: The number of ISOs ordered.
        self.number_isos = number_isos
        #: A list of barcodes from stock racks that shall not be used for
        #: stock sample (molecule design pool) picking.
        self.excluded_racks = excluded_racks
        if excluded_racks is None:
            self.excluded_racks = []
        if requested_tubes is None:
            requested_tubes = []
        #: A list of barcodes from stock tubes that are supposed to be used
        #: (for fixed positions).
        self.requested_tubes = requested_tubes
Ejemplo n.º 6
0
    def __init__(
        self,
        base_layout,
        stock_concentration,
        library_name,
        preparation_buffer_volume,
        pool_buffer_volume=None,
        parent=None,
    ):
        """
        Constructor.

        :param base_layout: Layout defining which positions of the layout
            are allowed to take up library samples.
        :type base_layout: :class:`LibraryBaseLayout`
        :param int stock_concentration: Concentration of the single
            source molecule designs in the stock in nM (positive number).
        :param str library_name: Name of the library to be created.
        :param float preparation_buffer_volume: Buffer volume for preparation
            plates in ul.
        :param float pool_buffer_volume: Buffer volume for pool
            plates in ul. May be `None` if no pool racks are created.
        """
        BaseTool.__init__(self, parent=parent)
        self.base_layout = base_layout
        self.stock_concentration = stock_concentration
        self.library_name = library_name
        self.preparation_buffer_volume = preparation_buffer_volume
        self.pool_buffer_volume = pool_buffer_volume
        #: The worklist series for the ISO request.
        self.__worklist_series = None
        #: The last used worklist index (within the series).
        self.__last_worklist_index = None
        #: The base layout for each sector.
        self.__sector_layouts = None
Ejemplo n.º 7
0
    def __init__(self,
                 iso_request,
                 ticket_numbers=None,
                 reporter=None,
                 parent=None):
        """
        Constructor.

        :param iso_request: The ISO request for which to generate the ISOs.
        :type iso_request:
            :class:`thelma.entities.iso.StockSampleGenerationIsoRequest`
        :param ticket_numbers: The user might specify ticket numbers for the
            ISO tickets. The number of ticket number must either be 1 (in
            which case all ISOs get the same ticket number) or equal to the
            number of ISOs. If there is no ticket number specified, the
            tool will generate new tickets for each ISO.
            Attention: It is not checked whether these given tickets exist!
        :type ticket_numbers: :class:`list` of `int`
        :default ticket_numbers: *None*
        :param reporter: This user will become reporter of the tickets (if
            new tickets are created). If you do not want to create tickets,
            the user might be *None*.
        :type reporter: :class:`thelma.entities.user.User`
        :default reporter: *None*
        """
        BaseTool.__init__(self, parent=parent)
        self.iso_request = iso_request
        self.ticket_numbers = ticket_numbers
        self.reporter = reporter
        #: The number of ISOs created (for checking reasons).
        self.__new_iso_counter = None
Ejemplo n.º 8
0
    def __init__(self,
                 iso,
                 single_stock_racks,
                 pool_stock_racks=None,
                 include_dummy_output=False,
                 parent=None):
        """
        Constructor.

        :param list single_stock_racks: Barcodes for single stock racks (must
            be empty).
        :param list pool_stock_racks: Optional pool stock rack barcodes.
            Each pool stock rack is expected to contain empty tubes in the
            expected positions.
        :param bool include_dummy_output: Flag indicating if the writer should
            return a dummy output file for the tube transfers.
        """
        BaseTool.__init__(self, parent=parent)
        self.iso = iso
        self.single_stock_racks = single_stock_racks
        self.pool_stock_racks = pool_stock_racks
        self.include_dummy_output = include_dummy_output
        #: Pool stock rack buffer volume in ul.
        self.__pool_stock_rack_buffer_volume = None
        #: Map tube rack barcode -> tube rack.
        self.__tube_rack_map = None
        #: Map sector index -> single stock rack barcodes.
        self.__single_stock_rack_map = None
        #: Map sector index -> pool stock rack barcode.
        self.__pool_stock_rack_map = None
        #: Map rack barcode -> location string.
        self.__source_rack_locations = None
Ejemplo n.º 9
0
    def __init__(self, volume_calculator, iso_request_label, parent=None):
        """
        Constructor.

        :param volume_calculator: Determines transfer and dilution volumes
            for pool stock sample ISO requests.
        :type volume_calculator: :class:`VolumeCalculator`
        :param int number_designs: The number of single molecule designs for
            each pool (positive number).
        :param int target_volume: The final volume for the new pool stock
            tubes in ul (positive number).
        :param int target_concentration: The final pool concentration for the
            new pool stock tubes in nM (positive number).
        :param str iso_request_label: The plate set label of the ISO request
            to be created - will be used as part of the worklist name.
        """
        BaseTool.__init__(self, parent=parent)
        #: The plate set label of the ISO request to be created - will be used
        #: as part of the worklist name.
        self.iso_request_label = iso_request_label
        #: The :class:`VolumeCalculator` determines transfer and buffer volumes
        #: and might also adjust the target volume for the ISO request.
        self.volume_calculator = volume_calculator
        #: The worklist series for the ISO request.
        self.__worklist_series = None
Ejemplo n.º 10
0
    def __init__(self,
                 base_layout,
                 stock_concentration,
                 library_name,
                 parent=None):
        """
        Constructor.

        :param base_layout: The layout defining which positions of the layout
            are allowed to take up library samples.
        :type base_layout: :class:`LibraryBaseLayout`
        :param int stock_concentration: The concentration of the single
            source molecule designs in the stock in nM (positive number).
        :param str library_name: The name of the library to be created.
        """
        BaseTool.__init__(self, parent=parent)
        #: Defines which positions of the layout are allowed to take up
        #: library samples.
        self.base_layout = base_layout
        #: The concentration of the single source molecule designs in the
        #: stock in nM.
        self.stock_concentration = stock_concentration
        #: The name of the library to be created.
        self.library_name = library_name
        #: The worklist series for the ISO request.
        self.__worklist_series = None
        #: The last used worklist index (within the series).
        self.__last_worklist_index = None
        #: The base layout for each quadrant.
        self.__quadrant_layouts = None
        #: The volume transferred from the pool stock rack to the preparation
        #: plate.
        self.__stock_to_prep_vol = None
Ejemplo n.º 11
0
    def __init__(self, iso, user, parent=None):
        """
        Constructor.

        :param iso: library creation ISO to execute.
        :param user: User performing the execution.
        """
        BaseTool.__init__(self, parent=parent)
        self.iso = iso
        self.user = user
        #:
        self.__single_stock_rack_map = None
        #:
        self.__pool_stock_rack_map = None
        #:
        self.__prep_plate_map = None
        #:
        self.__ssc_layout_map = None
        #:
        self.__empty_stock_rack_positions_map = None
        #:
        self.__stock_trf_exc_wl_map = None
        # These are attributes required by the Trac reporter that this
        # executor is passed to.
        self.mode = StockTransferWriterExecutor.MODE_EXECUTE
        self.entity = iso
Ejemplo n.º 12
0
 def __init__(self, parent=None):
     BaseTool.__init__(self, parent=parent)
     #: The source layout.
     self._source_layout = None
     #: A set of all hash values.
     self._hash_values = None
     #: The column maps for the different target layouts (working positions
     #: mapped onto column indices) - the keys of this dictionary should
     #: be suitable for sorting. Otherwise there are irrelevant.
     self._column_maps = None
     #: The rack shape of the source layout.
     self.__source_rack_shape = None
     #: The minimum distance in rows two well of a column must have for
     #: the Biomek to pipet them together. The value is 1 for 384-well
     #: plates and 0 (=no distance) for 96-well plates.
     self.__trg_min_row_distance = None
     #: The minimum distance in rows two well of a column must have for
     #: the Biomek to pipet them together. The value is 1 for 384-well
     #: plates and 0 (=no distance) for 96-well plates.
     self.__src_min_row_distance = None
     #: The transfer items that are already part of a subcolumn.
     self.__subcolumn_tids = None
     #: All :class:`TransferSubcolumn` objects mapped onto their length.
     self.__subcolumn_lengths = None
     #: Stores :class:`SourceSubcolumn` objects managing the remaining free
     #: positions for the source transfection layout.
     self.__free_positions = None
Ejemplo n.º 13
0
    def __init__(self, library_name, stream, requester, parent=None):
        """
        Constructor:

        :param library_name: The name of the library to be created.
        :type library_name: :class:`str`
        :param stream: Excel file stream containing one sheet with the
            base layout and one with the molecule design data.
        :param requester: This user will be owner and reporter of the ISO
            trac tickets.
        :type requester: :class:`thelma.entities.user.User`
        """
        BaseTool.__init__(self, parent=parent)
        #: The name of the library to be created.
        self.library_name = library_name
        #: Excel file stream containing one sheet with the base layout and one
        #: with the molecule design data.
        self.stream = stream
        #: This user will be owner and reporter of the ISO trac tickets.
        self.requester = requester

        #: The base layout (384-well) defining which position might contain
        #: libary samples.
        self.__base_layout = None
        #: The pool set containing the stock sample pools for the library.
        self.__pool_set = None
        #: The worklist series (generated by the
        #: :class:`LibraryCreationWorklistGenerator`).
        self.__worklist_series = None

        #: The stock concentration for the single molecule design pools.
        self.__stock_concentration = None
        #: The number of plates (ISOs) depends on the number of positions in the
        #: base layouts and the number of pools in the molecule design set.
        self.__number_plates = None
Ejemplo n.º 14
0
    def __init__(self, iso, single_stock_racks, pool_stock_racks=None,
                 include_dummy_output=False, parent=None):
        """
        Constructor.

        :param list single_stock_racks: Barcodes for single stock racks (must
            be empty).
        :param list pool_stock_racks: Optional pool stock rack barcodes.
            Each pool stock rack is expected to contain empty tubes in the
            expected positions.
        :param bool include_dummy_output: Flag indicating if the writer should
            return a dummy output file for the tube transfers.
        """
        BaseTool.__init__(self, parent=parent)
        self.iso = iso
        self.single_stock_racks = single_stock_racks
        self.pool_stock_racks = pool_stock_racks
        self.include_dummy_output = include_dummy_output
        #: Pool stock rack buffer volume in ul.
        self.__pool_stock_rack_buffer_volume = None
        #: Map tube rack barcode -> tube rack.
        self.__tube_rack_map = None
        #: Map sector index -> single stock rack barcodes.
        self.__single_stock_rack_map = None
        #: Map sector index -> pool stock rack barcode.
        self.__pool_stock_rack_map = None
        #: Map rack barcode -> location string.
        self.__source_rack_locations = None
Ejemplo n.º 15
0
    def __init__(self, molecule_design_pools, stock_concentration,
                 take_out_volume,
                 excluded_racks=None, requested_tubes=None, parent=None):
        """
        Constructor.

        :param molecule_design_pools: The molecule design pool IDs for which
            to run the query.
        :type molecule_design_pools: :class:`set` of molecule design pool IDs
        :param int stock_concentration: The stock concentration of the single
            molecule design pools for the library in nM (positive number).
        :param int take_out_volume: The volume that shall be removed from the
            single molecule design stock in ul (positive number).
        :param requested_tubes: A list of barcodes from stock tubes that are
            supposed to be used.
        :type requested_tubes: A list of tube barcodes.
        :param excluded_racks: A list of barcodes from stock racks that shall
            not be used for molecule design picking.
        :type excluded_racks: A list of rack barcodes
        """
        BaseTool.__init__(self, parent=parent)
        #: The molecule design pool IDs for which to run the query.
        self.molecule_design_pools = molecule_design_pools
        #: The stock concentration of the single molecule design pools for
        #: the library in nM.
        self.stock_concentration = stock_concentration
        #: The volume that shall be removed from the single molecule design
        #: stock in ul.
        self.take_out_volume = take_out_volume
        if excluded_racks is None: excluded_racks = []
        #: A list of barcodes from stock racks that shall not be used for
        #: molecule design picking.
        self.excluded_racks = excluded_racks
        if requested_tubes is None: requested_tubes = []
        #: A list of barcodes from stock tubes that are supposed to be used
        #: (for fixed positions).
        self.requested_tubes = requested_tubes
        #: The DB session used for the queries.
        self.__session = None
        #: The library candidated mapped onto pool IDs.
        self.__library_candidates = None
        #: Maps library pool IDs onto molecule design IDs. ATTENTION: a molecule
        #: design pool can point to several library pools! For this reason,
        #: library pool IDs are stored in lists.
        self.__md_map = None
        #: Maps molecule design IDs onto single molecule design pool IDs.
        self.__single_pool_map = None
        #: Stores the suitable stock sample IDs for the single molecule
        #: designs pools used to create the library pools. The results are
        #: determined by the :class:`SINGLE_POOL_QUERY`.
        self.__stock_samples = None

        #: The picked library candidates for the pools in the order of
        #: completion.
        self.__picked_candidates = None

        #: If an siRNA is used in several pools this map will store the data
        #: of which ISO candidate has been used for which one.
        self.__multi_pool_iso_candidates = None
Ejemplo n.º 16
0
    def __init__(self, library_creation_iso, tube_destination_racks,
                 pool_stock_racks, parent=None):
        """
        Constructor:

        :param library_creation_iso: The library creation ISO for which to
            generate the worklist files.
        :type library_creation_iso:
            :class:`thelma.entities.library.LibraryCreationIso`

        :param tube_destination_racks: The barcodes for the destination
            rack for the single molecule design tube (these racks have to be
            empty).
        :type tube_destination_racks: map of barcode lists
            (:class:`basestring`) mapped onto sector indices.

        :param pool_stock_racks: The barcodes for the pool stock racks
            (these racks have to have empty tubes in defined positions).
        :type pool_stock_racks: map of barcodes
            (:class:`basestring`) mapped onto sector indices.
        """
        BaseTool.__init__(self, parent=parent)

        #: The library creation ISO for which to generate the worklist files.
        self.library_creation_iso = library_creation_iso
        #: The barcodes for the destination rack for the single molecule
        #: design tube (these racks have to be empty).
        self.tube_destination_racks = tube_destination_racks
        #: The barcodes for the pool stock racks rack for the single molecule
        #: design tube (these racks have to have empty tubes in defined
        #: positions).
        self.pool_stock_racks = pool_stock_racks

        #: The name of the library that is created here.
        self.library_name = None
        #: The layout number of the ISO.
        self.layout_number = None

        #: Stores the generated file streams (mapped onto file names).
        self.__file_map = None

        #: Maps tube racks onto barcodes.
        self.__rack_map = None
        #: The library layout for the ISO.
        self.__library_layout = None
        #: Maps library position onto sector indices.
        self.__library_sectors = None
        #: Maps translated library position onto sector indices.
        self.__translated_sectors = None

        #: Maps tube onto tube barcodes.
        self.__tube_map = dict()
        #: The tube transfer data items for the tube handler worklist writer
        #: sorted by sector index.
        self.__tube_transfers = None
        #: Stores the rack location for each source rack (single molecule
        #: design pools).
        self.__source_rack_locations = None
Ejemplo n.º 17
0
 def __init__(self, parent=None):
     BaseTool.__init__(self, parent=parent)
     reg = get_current_registry()
     self.tractor_api = reg.getUtility(ITractor)
     #: The value return of the :func:`send_request` method.
     self.return_value = None
     #: Is set to *True*, if all Trac request have been completed
     #: successfully.
     self.was_successful = False
Ejemplo n.º 18
0
 def __init__(self,
              source_barcode,
              target_barcodes,
              transfer_volume,
              parent=None):
     BaseTool.__init__(self, parent=parent)
     self.__source_barcode = source_barcode
     self.__target_barcodes = target_barcodes.split(',')
     self.__transfer_volume = float(transfer_volume) * 1e-6
Ejemplo n.º 19
0
    def __init__(self, isos, parent=None):
        """
        Constructor.

        :param isos: The ISOs to be reset.
        :type isos: :class:`list` of :class:`StockSampleCreationIso`s
        """
        BaseTool.__init__(self, parent=parent)
        #: The ISOs to be reset.
        self.isos = isos
Ejemplo n.º 20
0
    def __init__(self, isos, parent=None):
        """
        Constructor.

        :param isos: The ISOs to be reset.
        :type isos: :class:`list` of :class:`StockSampleCreationIso`s
        """
        BaseTool.__init__(self, parent=parent)
        #: The ISOs to be reset.
        self.isos = isos
Ejemplo n.º 21
0
 def __init__(self, parent=None):
     BaseTool.__init__(self, parent=parent)
     #: The stream to be generated.
     self.__stream = None
     #: Maps :class:`CsvColumnDictionary`s onto column indices.
     self._index_map = None
     #: A list with of :class:`CsvColumnDictionary` (to be set by the
     #: subclasses).
     self._column_map_list = None
     #: A boolean that defines whether to print a header.
     self._write_headers = True
Ejemplo n.º 22
0
 def __init__(self, iso_concentration, iso_volume, layout_filename_q1,
              layout_filename_q2, layout_filename_q3, layout_filename_q4,
              target_barcode, parent=None):
     BaseTool.__init__(self, parent=parent)
     self.__iso_concentration = float(iso_concentration) * 1e-9
     self.__iso_volume = float(iso_volume) * 1e-6
     self.__layout_filename_q1 = layout_filename_q1
     self.__layout_filename_q2 = layout_filename_q2
     self.__layout_filename_q3 = layout_filename_q3
     self.__layout_filename_q4 = layout_filename_q4
     self.__target_barcode = target_barcode
Ejemplo n.º 23
0
 def __init__(self, parent=None):
     BaseTool.__init__(self, parent=parent)
     #: The stream to be generated.
     self.__stream = None
     #: Maps :class:`CsvColumnDictionary`s onto column indices.
     self._index_map = None
     #: A list with of :class:`CsvColumnDictionary` (to be set by the
     #: subclasses).
     self._column_map_list = None
     #: A boolean that defines whether to print a header.
     self._write_headers = True
Ejemplo n.º 24
0
    def __init__(self, experiments, parent=None):
        """
        Constructor.

        :param experiments: A list of experiments that all belong
            to the same experiment design.
        :type experiments: :class:`list` of
            :class:`thelma.entities.experiment.Experiment`
        """
        BaseTool.__init__(self, parent=parent)
        #: A list of experiments that all belong to the same experiment design.
        self.experiments = experiments
        #: The experiment type of the experiment metadata.
        self._experiment_type = None
Ejemplo n.º 25
0
    def __init__(self, experiments, parent=None):
        """
        Constructor.

        :param experiments: A list of experiments that all belong
            to the same experiment design.
        :type experiments: :class:`list` of
            :class:`thelma.entities.experiment.Experiment`
        """
        BaseTool.__init__(self, parent=parent)
        #: A list of experiments that all belong to the same experiment design.
        self.experiments = experiments
        #: The experiment type of the experiment metadata.
        self._experiment_type = None
Ejemplo n.º 26
0
    def __init__(self, step_number, rack_transfer_job, parent=None):
        """
        Constructor.

        :param int step_number: The step number (of all rack transfers in
            the series).
        :param rack_transfer_job: The job to write down.
        :type rack_transfer_job: :class:`RackSampleTransferJob`
        """
        BaseTool.__init__(self, parent=parent)
        #: The step (of all rack transfers in teh series).
        self.step_number = step_number
        #: The job to write down.
        self.rack_transfer_job = rack_transfer_job
Ejemplo n.º 27
0
    def __init__(self, stream=None, parent=None):
        """
        Constructor.

        :param stream: the opened file to parse
        :type stream: a file stream
        """
        BaseTool.__init__(self, parent=parent)
        #: The stream for the parser.
        self.stream = stream
        #: The parser handled by the parser handler.
        self.parser = None
        #: The object to be passed as result.
        self.return_value = None
Ejemplo n.º 28
0
    def __init__(self, stream=None, parent=None):
        """
        Constructor.

        :param stream: the opened file to parse
        :type stream: a file stream
        """
        BaseTool.__init__(self, parent=parent)
        #: The stream for the parser.
        self.stream = stream
        #: The parser handled by the parser handler.
        self.parser = None
        #: The object to be passed as result.
        self.return_value = None
Ejemplo n.º 29
0
    def __init__(self, step_number, rack_transfer_job, parent=None):
        """
        Constructor.

        :param int step_number: The step number (of all rack transfers in
            the series).
        :param rack_transfer_job: The job to write down.
        :type rack_transfer_job: :class:`RackSampleTransferJob`
        """
        BaseTool.__init__(self, parent=parent)
        #: The step (of all rack transfers in teh series).
        self.step_number = step_number
        #: The job to write down.
        self.rack_transfer_job = rack_transfer_job
Ejemplo n.º 30
0
    def __init__(self,
                 rack_scanning_files,
                 adjust_database=False,
                 user=None,
                 parent=None):
        """
        Constructor.

        :param rack_scanning_files The rack scanning stream, either
            a single rack scanning file, as zip archive or as directory path
            (if containing several files).
        :param bool adjust_database: Indicdates if the DB should be adjusted
            or if only a report should be generated.
        :default adjust_database: *False*
        :param user: The user who wants to update the DB - must not be *None* if
            :attr:`adjust_database` is *True*.
        :type user: :class:`thelma.entities.user.User`
        :default user: *None*
        """
        BaseTool.__init__(self, parent=parent)
        #: The rack scanning stream (single file, zip archive or directory -
        #: in case of an directory, :attr:`is_directory` must be *True*).
        self.rack_scanning_files = rack_scanning_files
        #: Shall the DB be adjusted or do you only want to have a report?
        self.adjust_database = adjust_database
        #: The user who wants to update the database.
        self.user = user
        #: The rack scanning layouts resulting from the file parsing mapped
        #: onto rack barcodes.
        self.__file_layouts = None
        #: The rack scanning layouts created from the DB racks mapped
        #: onto rack barcodes.
        self.__db_layouts = None
        #: The rack entities mapped onto barcodes.
        self.__racks = None
        #: The tube entities mapped onto barcodes.
        self.__tubes = None
        #: The stream for the overview file.
        self.__overview_stream = None
        #: The tube transfers for the DB adjustment.
        self.__tube_transfers = None
        #: The tube transfer worklist (only for *True* :attr:`adjust_database`).
        self.__tube_transfer_worklist = None
        #: The allowed maximum age of a file stream as :class:`timedelta`.
        self.__max_age = None
        #: The current time as datetime.
        self.__now = None
        #: The tube transfer data for the differences found.
        self.__differences = None
Ejemplo n.º 31
0
    def __init__(self, stream, parent=None):
        """
        Constructor.

        :param stream: The open file to parse.
        :type stream: :class:`stream`
        """
        BaseTool.__init__(self, parent=parent)
        #: The stream to be parsed.
        self.stream = stream
        #: Is set to true if the parser attempts to run.
        self.has_run = False
        #: If *True* if the parsing process is aborted at the next
        #: :func:`has_errors` check. This variable is used if you want to abort
        #: parsing without raising an error.
        self.abort_execution = False
Ejemplo n.º 32
0
    def __init__(self, stream, parent=None):
        """
        Constructor.

        :param stream: The open file to parse.
        :type stream: :class:`stream`
        """
        BaseTool.__init__(self, parent=parent)
        #: The stream to be parsed.
        self.stream = stream
        #: Is set to true if the parser attempts to run.
        self.has_run = False
        #: If *True* if the parsing process is aborted at the next
        #: :func:`has_errors` check. This variable is used if you want to abort
        #: parsing without raising an error.
        self.abort_execution = False
Ejemplo n.º 33
0
    def __init__(self, rack_scanning_files, adjust_database=False, user=None,
                 parent=None):
        """
        Constructor.

        :param rack_scanning_files The rack scanning stream, either
            a single rack scanning file, as zip archive or as directory path
            (if containing several files).
        :param bool adjust_database: Indicdates if the DB should be adjusted
            or if only a report should be generated.
        :default adjust_database: *False*
        :param user: The user who wants to update the DB - must not be *None* if
            :attr:`adjust_database` is *True*.
        :type user: :class:`thelma.entities.user.User`
        :default user: *None*
        """
        BaseTool.__init__(self, parent=parent)
        #: The rack scanning stream (single file, zip archive or directory -
        #: in case of an directory, :attr:`is_directory` must be *True*).
        self.rack_scanning_files = rack_scanning_files
        #: Shall the DB be adjusted or do you only want to have a report?
        self.adjust_database = adjust_database
        #: The user who wants to update the database.
        self.user = user
        #: The rack scanning layouts resulting from the file parsing mapped
        #: onto rack barcodes.
        self.__file_layouts = None
        #: The rack scanning layouts created from the DB racks mapped
        #: onto rack barcodes.
        self.__db_layouts = None
        #: The rack entities mapped onto barcodes.
        self.__racks = None
        #: The tube entities mapped onto barcodes.
        self.__tubes = None
        #: The stream for the overview file.
        self.__overview_stream = None
        #: The tube transfers for the DB adjustment.
        self.__tube_transfers = None
        #: The tube transfer worklist (only for *True* :attr:`adjust_database`).
        self.__tube_transfer_worklist = None
        #: The allowed maximum age of a file stream as :class:`timedelta`.
        self.__max_age = None
        #: The current time as datetime.
        self.__now = None
        #: The tube transfer data for the differences found.
        self.__differences = None
Ejemplo n.º 34
0
    def __init__(self, molecule_design_library, parent=None):
        """
        Constructor:

        :param molecule_design_library: The molecule design library for which to
            generate the ISOs.
        :type molecule_design_library:
            :class:`thelma.entities.library.MoleculeDesignLibrary`
        """
        BaseTool.__init__(self, parent=parent)
        #: The molecule design library for which to generate an ISO.
        self.molecule_design_library = molecule_design_library

        #: The ISO request is an attribute of the library.
        self.__iso_request = None
        #: The number of ISOs created (for checking reasons).
        self.__new_iso_counter = None
Ejemplo n.º 35
0
    def __init__(self, transfer_jobs, user=None, parent=None):
        """
        Constructor.

        :param dict transfer_jobs: maps job indices to
            :class:`LiquidTransferJob` objects.
        :param user: The user used for the simulated executions.
        :type user: :class:`thelma.entities.user.User`
        :default user: None
        """
        BaseTool.__init__(self, parent=parent)
        #: :class:`LiquidTransferJob` objects mapped onto job indices.
        self.transfer_jobs = transfer_jobs
        #: Stores all involved real racks (mapped onto their barcode).
        self._barcode_map = None
        #: The user used for the simulated executions.
        self.user = user
Ejemplo n.º 36
0
    def __init__(self, experiment_design, parent=None):
        """
        Constructor.

        :param experiment_design: The experiment containing the data for the
                ISO layout.
        :type experiment_design: :class:`thelma.entities.experiment.ExperimentDesign`
        """
        BaseTool.__init__(self, parent=parent)
        self.experiment_design = experiment_design
        #: The transfection layouts of the design racks.
        self.__experiment_layouts = None
        #: Used to sort floating positions within the layouts.
        self.__placeholder_maps = None
        #: The ISO layout created from the experiment designs layout
        #: (:class:`TransfectionLayout`).
        self.__iso_layout = None
Ejemplo n.º 37
0
    def __init__(self, transfer_jobs, user=None, parent=None):
        """
        Constructor.

        :param dict transfer_jobs: maps job indices to
            :class:`LiquidTransferJob` objects.
        :param user: The user used for the simulated executions.
        :type user: :class:`thelma.entities.user.User`
        :default user: None
        """
        BaseTool.__init__(self, parent=parent)
        #: :class:`LiquidTransferJob` objects mapped onto job indices.
        self.transfer_jobs = transfer_jobs
        #: Stores all involved real racks (mapped onto their barcode).
        self._barcode_map = None
        #: The user used for the simulated executions.
        self.user = user
Ejemplo n.º 38
0
    def __init__(self, library_layout, stock_racks, parent=None):
        """
        Constructor.

        :param library_layout: Contains the pool and molecule design data.
        :type library_layout: :class:`LibraryLayout`
        :param stock_racks: The stock racks for each sector.
        :type stock_racks: lists of racks mapped onto sector indices
        """
        BaseTool.__init__(self, parent=parent)
        #: Contains the pool and molecule design data.
        self.library_layout = library_layout
        #: The stock racks for each sector (lists) mapped onto sector indices.
        self.stock_racks = stock_racks

        #: The rack shape of a stock rack (96 wells).
        self.stock_rack_shape = None
Ejemplo n.º 39
0
    def __init__(self, experiment_design, parent=None):
        """
        Constructor.

        :param experiment_design: The experiment containing the data for the
                ISO layout.
        :type experiment_design: :class:`thelma.entities.experiment.ExperimentDesign`
        """
        BaseTool.__init__(self, parent=parent)
        self.experiment_design = experiment_design
        #: The transfection layouts of the design racks.
        self.__experiment_layouts = None
        #: Used to sort floating positions within the layouts.
        self.__placeholder_maps = None
        #: The ISO layout created from the experiment designs layout
        #: (:class:`TransfectionLayout`).
        self.__iso_layout = None
Ejemplo n.º 40
0
    def __init__(self, library_layout, stock_racks, parent=None):
        """
        Constructor.

        :param library_layout: Contains the pool and molecule design data.
        :type library_layout: :class:`LibraryLayout`
        :param stock_racks: The stock racks for each sector.
        :type stock_racks: lists of racks mapped onto sector indices
        """
        BaseTool.__init__(self, parent=parent)
        #: Contains the pool and molecule design data.
        self.library_layout = library_layout
        #: The stock racks for each sector (lists) mapped onto sector indices.
        self.stock_racks = stock_racks

        #: The rack shape of a stock rack (96 wells).
        self.stock_rack_shape = None
Ejemplo n.º 41
0
    def __init__(self, stock_sample_creation_iso, user, parent=None):
        """
        Constructor:

        :param stock_sample_creation_iso: The pool stock sample creation ISO
            for which to execute the worklists.
        :type stock_sample_creation_iso:
            :class:`thelma.entities.iso.StockSampleCreationIso`
        :param user: The user conducting the execution.
        :type user: :class:`thelma.entities.user.User`
        """
        BaseTool.__init__(self, parent=parent)
        #: The stock sample creation ISO for which to execute the worklists.
        self.stock_sample_creation_iso = stock_sample_creation_iso
        #: The user conducting the execution.
        self.user = user

        #: The library layout for this ISO.
        self.__library_layout = None
        #: Maps library position onto sector indices.
        self.__library_sectors = None

        #: The ISO sample stock racks mapped onto sector indices.
        self.__sample_stock_racks = None
        #: Maps tube racks (for 1 molecule design stock racks) onto sector
        #: indices.
        self.__stock_rack_map = None

        #: The library source (preparation) plates (plate entities) mapped
        #: onto sector indices.
        self.__library_source_plates = None

        #: The executed stock transfer worklists (mapped onto job indices;
        #: refers to transfer from single molecule design to pool stock rack).
        #: Required for reporting.
        self.__stock_transfer_worklists = None

        #: The transfer jobs for the series executor.
        self.__transfer_jobs = None
        #: The indices for the rack transfer jobs mapped onto the worklist
        #: they belong to.
        self.__rack_transfer_indices = None
        #: Position with transfers but without library position (96-well,
        #: mapped onto sectors).
        self.__ignore_positions_96 = None
Ejemplo n.º 42
0
    def __init__(self, stock_sample_creation_iso, user, parent=None):
        """
        Constructor:

        :param stock_sample_creation_iso: The pool stock sample creation ISO
            for which to execute the worklists.
        :type stock_sample_creation_iso:
            :class:`thelma.entities.iso.StockSampleCreationIso`
        :param user: The user conducting the execution.
        :type user: :class:`thelma.entities.user.User`
        """
        BaseTool.__init__(self, parent=parent)
        #: The stock sample creation ISO for which to execute the worklists.
        self.stock_sample_creation_iso = stock_sample_creation_iso
        #: The user conducting the execution.
        self.user = user

        #: The library layout for this ISO.
        self.__library_layout = None
        #: Maps library position onto sector indices.
        self.__library_sectors = None

        #: The ISO sample stock racks mapped onto sector indices.
        self.__sample_stock_racks = None
        #: Maps tube racks (for 1 molecule design stock racks) onto sector
        #: indices.
        self.__stock_rack_map = None

        #: The library source (preparation) plates (plate entities) mapped
        #: onto sector indices.
        self.__library_source_plates = None

        #: The executed stock transfer worklists (mapped onto job indices;
        #: refers to transfer from single molecule design to pool stock rack).
        #: Required for reporting.
        self.__stock_transfer_worklists = None

        #: The transfer jobs for the series executor.
        self.__transfer_jobs = None
        #: The indices for the rack transfer jobs mapped onto the worklist
        #: they belong to.
        self.__rack_transfer_indices = None
        #: Position with transfers but without library position (96-well,
        #: mapped onto sectors).
        self.__ignore_positions_96 = None
Ejemplo n.º 43
0
    def __init__(self, tube_transfers, user, parent=None):
        """
        Constructor.

        :param list tube_transfer: A list of :class:`TubeTransfer` entities
            to execute.
        :type tube_transfer: :class:`list`
        :param user: The user conducting the update.
        :type user: :class:`thelma.entities.user.User`
        """
        BaseTool.__init__(self, parent=parent)
        #: The tube transfer entities to execute.
        self.tube_transfers = tube_transfers
        #: The user conducting the update.
        self.user = user
        #: The tubes of each rack mapped onto rack positions (racks as
        #: barcodes).
        self.__rack_containers = None
Ejemplo n.º 44
0
    def __init__(self, tube_transfers, user, parent=None):
        """
        Constructor.

        :param list tube_transfer: A list of :class:`TubeTransfer` entities
            to execute.
        :type tube_transfer: :class:`list`
        :param user: The user conducting the update.
        :type user: :class:`thelma.entities.user.User`
        """
        BaseTool.__init__(self, parent=parent)
        #: The tube transfer entities to execute.
        self.tube_transfers = tube_transfers
        #: The user conducting the update.
        self.user = user
        #: The tubes of each rack mapped onto rack positions (racks as
        #: barcodes).
        self.__rack_containers = None
Ejemplo n.º 45
0
    def __init__(self,
                 experiment_design,
                 label,
                 source_layout,
                 scenario,
                 supports_mastermix,
                 design_rack_associations=None,
                 parent=None):
        """
        Constructor.

        :param experiment_design: The experiment design for which to generate
            the worklist series.
        :type experiment_design:
            :class:`thelma.entities.experiment.ExperimentDesign`
        :param str label: A label as prefix for the worklists.
        :param source_layout: The source plate layout.
        :type source_layout: :class:`TransfectionLayout`
        :param scenario: the experiment metadata type - it defines the
            storage location for the cell plate preparation worklists.
        :type scenario: :class:`thelma.entities.experiment.ExperimentMetadataType`
        :param bool supports_mastermix: Flag indicating if the tool should
            create worklists for OptiMem and reagent dilution.
        :param design_rack_associations: Maps design rack labels to well
            association maps (created by the :class:`WellAssociator`).
        """
        BaseTool.__init__(self, parent=parent)
        #: The experiment design for which to generate the worklist series.
        self.experiment_design = experiment_design
        #: A label as prefix for the worklist name.
        self.label = label
        #: The transfection layout for the source plate (ISO plate).
        self.source_layout = source_layout
        #: The scenario defines the storage location for the cell plate
        #: preparation worklists.
        self.scenario = scenario
        #: Shall the tool create worklists for OptiMem and reagent dilution?
        self.supports_mastermix = supports_mastermix
        #: Maps well association maps onto design rack labels.
        self.design_rack_associations = design_rack_associations
        #: The worklist series for the experiment design (if applicable).
        self.__design_series = None
        #: The worklist series for each experiment design rack.
        self.__rack_worklists = None
Ejemplo n.º 46
0
    def __init__(self,
                 iso_request,
                 job_owner,
                 number_isos,
                 excluded_racks=None,
                 requested_tubes=None,
                 parent=None):
        """
        Constructor.

        :param iso_request: The ISO request that will take up the ISOs.
        :type iso_request: :class:`thelma.entities.iso.IsoRequest` subclass
        :param job_owner: The job owner will be set as user for the ISO job.
        :type job_owner: :class:`thelma.entities.user.User`
        :param int number_isos: The number of ISOs ordered (positive number).
        :param excluded_racks: A list of barcodes from stock racks that shall
            not be used for stock sample picking.
        :type excluded_racks: A list of rack barcodes
        :param requested_tubes: A list of barcodes from stock tubes that are
            supposed to be used.
        :type requested_tubes: A list of tube barcodes.
        """
        BaseTool.__init__(self, parent=parent)
        #: The ISO request that will take up the ISOs.
        self.iso_request = iso_request
        #: The job owner will be set as user for the ISO job.
        self.job_owner = job_owner
        #: The number of ISOs ordered.
        self.number_isos = number_isos
        #: A list of barcodes from stock racks that shall not be used for
        #: stock sample (molecule design pool) picking.
        self.excluded_racks = excluded_racks
        if excluded_racks is None:
            self.excluded_racks = []
        if requested_tubes is None:
            requested_tubes = []
        #: A list of barcodes from stock tubes that are supposed to be used
        #: (for fixed positions).
        self.requested_tubes = requested_tubes
        #: The ISOs for the new job.
        self._isos = None
        #: The new ISO job.
        self._iso_job = None
Ejemplo n.º 47
0
    def __init__(self, rack_layout, parent=None):
        """
        Constructor.

        :param rack_layout: The rack layout containing the ISO data.
        :type rack_layout: :class:`thelma.entities.racklayout.RackLayout`
        """
        BaseTool.__init__(self, parent=parent)
        #: The rack layout containing the data for the working layout.
        self.rack_layout = rack_layout
        #: A map containing the validator objects for each parameter
        #: (:class:`thelma.tools.utils.base.ParameterAliasValidator`).
        self._parameter_validators = None
        #: Maps the derived WorkingPositions onto rack positions.
        self.__position_map = None
        #: Parameters which do not have to be specified in the layout at all.
        self._optional_parameters = None
        #: Lists for intermediate error storage.
        self._multiple_tags = None
Ejemplo n.º 48
0
    def __init__(self,
                 iso_request_label,
                 stream,
                 target_volume,
                 target_concentration,
                 parent=None):
        """
        Constructor.

        :param str iso_request_label: Will be used as label of the
            ISO request and be part of worklist name.
        :param stream: Excel file stream containing a sheet with the
            molecule design data.
        :param int target_volume: The final volume for the new pool stock
            tubes in ul (positive number).
        :param int target_concentration: The final pool concentration for
            the new pool stock tubes in nM (positive number).
        """
        BaseTool.__init__(self, parent=parent)
        #: The label for the ISO request and be part of buffer worklist name.
        self.iso_request_label = iso_request_label
        #: Excel file stream containing one sheet with the molecule design data.
        self.stream = stream
        #: The final volume for the new pool stock tubes in ul.
        self.target_volume = target_volume
        #: The final pool concentration for the new pool stock tubes in nM.
        self.target_concentration = target_concentration
        #: The pool set containing the stock sample pools for the ISO request.
        self.__pool_set = None
        #: The number of single designs in a pool must be the same for all
        #: pools.
        self.__number_designs = None
        #: The default stock concentration for the single molecule designs.
        self.__stock_concentration = None
        #: The target volume might need to be adjusted due to pipetting
        #: constraints to maintain the target concentration.
        self.__adj_target_volume = None
        #: The worklist series (generated by the
        #: :class:`PoolCreationWorklistGenerator`).
        self.__worklist_series = None
        #: The number of ISOs depends on the number of pools to be generated
        #: and the number of available positions.
        self.__expected_number_isos = None
Ejemplo n.º 49
0
    def __init__(self, output_file_stream, user, parent=None):
        """
        Constructor.

        :param output_file_stream: The content of the XL20 output file, as
            :class:`basestring`, file or :class:`StringIO`.
        :param user: The user who wants to update the DB.
        :type user: :class:`thelma.entities.user.User`
        """
        BaseTool.__init__(self, parent=parent)
        #: The XL20 output file.
        self.output_file_stream = output_file_stream
        #: The user who wants to update the DB.
        self.user = user
        #: The tube transfers for the DB adjustment.
        self.__tube_transfers = None
        #: The tube transfer worklist (only for *True* :attr:`adjust_database`).
        self.__tube_transfer_worklist = None
        #: The timestamp for the worklist (the earliest timestamp from the file)
        self.__timestamp = None
Ejemplo n.º 50
0
    def __init__(self, output_file_stream, user, parent=None):
        """
        Constructor.

        :param output_file_stream: The content of the XL20 output file, as
            :class:`basestring`, file or :class:`StringIO`.
        :param user: The user who wants to update the DB.
        :type user: :class:`thelma.entities.user.User`
        """
        BaseTool.__init__(self, parent=parent)
        #: The XL20 output file.
        self.output_file_stream = output_file_stream
        #: The user who wants to update the DB.
        self.user = user
        #: The tube transfers for the DB adjustment.
        self.__tube_transfers = None
        #: The tube transfer worklist (only for *True* :attr:`adjust_database`).
        self.__tube_transfer_worklist = None
        #: The timestamp for the worklist (the earliest timestamp from the file)
        self.__timestamp = None
Ejemplo n.º 51
0
    def __init__(self, working_layout, attribute_name, number_sectors=4,
                 parent=None):
        """
        Constructor.

        :param working_layout: The working layout whose positions to check.
        :type working_layout: :class:`WorkingLayout`
        :param str attribute_name: The name of the attribute to be determined.
        :param int number_sectors: The number of rack sectors.
        :default number_sectors: *4*
        """
        BaseTool.__init__(self, parent=parent)
        #: The working layout whose positions to checks.
        self.working_layout = working_layout
        #: The name of the attribute to be determined.
        self.attribute_name = attribute_name
        #: The number of rack sectors.
        self.number_sectors = number_sectors
        #: The attribute value for each sector.
        self.__sectors = None
Ejemplo n.º 52
0
    def __init__(self, experiment_metadata, experiment_metadata_link,
                 iso_request_link, parent=None):
        """
        Constructor.

        :param experiment_metadata: The update experiment metadata.
        :type experiment_metadata:
            :class:`thelma.entities.experiment.ExperimentMetadata`
        :param str experiment_metadata_link: Link to the experiment metadata
            in TheLMA.
        :param str iso_request_link: Link to the ISO request in TheLMA.
        """
        BaseTool.__init__(self, parent=parent)
        #: The experiment metadata object the ticket belongs to.
        self.experiment_metadata = experiment_metadata
        #: Link to the experiment metadata in TheLMA.
        self.experiment_metadata_link = experiment_metadata_link
        #: Link to the ISO request in TheLMA.
        self.iso_request_link = iso_request_link
        #: The completed table part of the description.
        self.__wiki_table = None
Ejemplo n.º 53
0
    def __init__(self, iso_request_label, stream, target_volume,
                 target_concentration, parent=None):
        """
        Constructor.

        :param str iso_request_label: Will be used as label of the
            ISO request and be part of worklist name.
        :param stream: Excel file stream containing a sheet with the
            molecule design data.
        :param int target_volume: The final volume for the new pool stock
            tubes in ul (positive number).
        :param int target_concentration: The final pool concentration for
            the new pool stock tubes in nM (positive number).
        """
        BaseTool.__init__(self, parent=parent)
        #: The label for the ISO request and be part of buffer worklist name.
        self.iso_request_label = iso_request_label
        #: Excel file stream containing one sheet with the molecule design data.
        self.stream = stream
        #: The final volume for the new pool stock tubes in ul.
        self.target_volume = target_volume
        #: The final pool concentration for the new pool stock tubes in nM.
        self.target_concentration = target_concentration
        #: The pool set containing the stock sample pools for the ISO request.
        self.__pool_set = None
        #: The number of single designs in a pool must be the same for all
        #: pools.
        self.__number_designs = None
        #: The default stock concentration for the single molecule designs.
        self.__stock_concentration = None
        #: The target volume might need to be adjusted due to pipetting
        #: constraints to maintain the target concentration.
        self.__adj_target_volume = None
        #: The worklist series (generated by the
        #: :class:`PoolCreationWorklistGenerator`).
        self.__worklist_series = None
        #: The number of ISOs depends on the number of pools to be generated
        #: and the number of available positions.
        self.__expected_number_isos = None
Ejemplo n.º 54
0
    def __init__(self, experiment_design, label, source_layout, scenario,
                 supports_mastermix, design_rack_associations=None,
                 parent=None):
        """
        Constructor.

        :param experiment_design: The experiment design for which to generate
            the worklist series.
        :type experiment_design:
            :class:`thelma.entities.experiment.ExperimentDesign`
        :param str label: A label as prefix for the worklists.
        :param source_layout: The source plate layout.
        :type source_layout: :class:`TransfectionLayout`
        :param scenario: the experiment metadata type - it defines the
            storage location for the cell plate preparation worklists.
        :type scenario: :class:`thelma.entities.experiment.ExperimentMetadataType`
        :param bool supports_mastermix: Flag indicating if the tool should
            create worklists for OptiMem and reagent dilution.
        :param design_rack_associations: Maps design rack labels to well
            association maps (created by the :class:`WellAssociator`).
        """
        BaseTool.__init__(self, parent=parent)
        #: The experiment design for which to generate the worklist series.
        self.experiment_design = experiment_design
        #: A label as prefix for the worklist name.
        self.label = label
        #: The transfection layout for the source plate (ISO plate).
        self.source_layout = source_layout
        #: The scenario defines the storage location for the cell plate
        #: preparation worklists.
        self.scenario = scenario
        #: Shall the tool create worklists for OptiMem and reagent dilution?
        self.supports_mastermix = supports_mastermix
        #: Maps well association maps onto design rack labels.
        self.design_rack_associations = design_rack_associations
        #: The worklist series for the experiment design (if applicable).
        self.__design_series = None
        #: The worklist series for each experiment design rack.
        self.__rack_worklists = None