Пример #1
0
        def getTips(self, rack_type=None, tip_mask=-1, tips=None) -> (int, list):
            """     Mount only one kind of new tip at a time or just the tips given in the list
            :param rack_type:
            :param tips:
            :rtype : int
            :param tip_mask:
            :return: the mask that can be used
            :raise "Tip already in position " + str(i):
            """
            if tip_mask == -1:  tip_mask = tipsMask[self.nTips]
            n = Lab.count_tips(tip_mask)
            assert n <= self.nTips
            t = 0
            if tips is None:   # deprecated
                assert isinstance(rack_type, Lab.Labware.DITIrackType)
                tips = [Lab.Tip(rack_type) for i in range(n)]
            else:
                assert n == len(tips)

            for i, tp in enumerate(self.Tips):
                if tip_mask & (1 << i):
                    if tp is not None:
                        raise "A Tip from rack type " + tp.type.name + " is already in position " + str(i)
                    self.Tips[i] = tips[t]
                    t += 1
            return tip_mask, (tips[t:] if t < n else [])
Пример #2
0
        def getMoreTips(self, rack_type, tip_mask=-1, tips=None) ->(int, list):
            """ Mount only the tips with are not already mounted.
                Mount only one kind of tip at a time, but not necessary the same of the already mounted.
                    :rtype : int
                    :param tip_mask: int
                    :return: the mask that can be used
                    """
            if tip_mask == -1:  tip_mask = tipsMask[self.nTips]
            n = Lab.count_tips(tip_mask)
            assert n <= self.nTips
            t = 0
            if tips is None:   # deprecated
                assert isinstance(rack_type, Lab.Labware.DITIrack)
                tips = [Lab.Tip(rack_type) for i in range(n)]
            else:
                assert n == len(tips)

            for i, tp in enumerate(self.Tips):
                if tip_mask & (1 << i):
                    if tp:  # already in position
                        if tp.type is not tips[t].type:
                            raise "A Tip from rack type " + tp.type.name + " is already in position " + str(i) + \
                                    " and we need " + tips[t].type.name
                        tip_mask ^= (1 << i)  # todo raise if dif maxVol? or if vol not 0?
                    else:
                        self.Tips[i] = tips[t]
                        t += 1
            return tip_mask, tips[t:] if t < n else []
Пример #3
0
    def pipette(self, action, volume, labware_selection, tip_mask=-1) -> (list, int):
        volume, tip_mask = self.curArm().pipette(action, volume, tip_mask)
        w = 0
        # assert isinstance(labware_selection, Lab.Labware)
        wells = labware_selection.selected_wells()
        for i, tp in enumerate(self.curArm().Tips):
                if tip_mask & (1 << i):
                    dv = action*volume[i]
                    if wells[w].reactive is None:
                        print("WARNING !!! There is nothing in well {:d} of rack {:s}".format(wells[w].offset+1,
                                                                                            labware_selection.label))
                    assert wells[w].vol is not None, "Volume of " + wells[w].reactive.name + " not initialized."
                    nv = wells[w].vol - dv

                    assert  nv <= wells[w].labware.type.maxVol, "Error trying to change the volume of " + \
                         wells[w].reactive.name + " from " + str(wells[w].vol)  + " to " + str(nv)

                    if nv < 0 :
                        if nv < -self.allow_air:
                            print("WARNING !!! trying to change the volume of " + \
                            wells[w].reactive.name + " from " + str(wells[w].vol)  + " to " + str(nv) + ". Set to 0.")
                        dv = wells[w].vol

                    wells[w].vol -= dv
                    if    action == Robot.Arm.Aspire:
                        self.curArm().Tips[i] = Lab.usedTip(tp, wells[w])
                        wells[w].log(-dv)
                    elif  action == Robot.Arm.Dispense:
                        assert isinstance(tp, Lab.usedTip)
                        wells[w].log(-dv, tp.origin)
                    w += 1
        return volume, tip_mask
Пример #4
0
    def where_preserve_tips(self, TIP_MASK)->list:      #  [Lab.DITIrack]
        """ Return a list of racks with the tips-wells already selected.

        :param selection:
        :return:
        """   # todo this in Labware??

        TIP_MASK = TIP_MASK if TIP_MASK != -1 else tipsMask[nTips]
        types = []
        t_masks = []
        racks = []
        tips = []

        for i, tip in enumerate(self.curArm().Tips):
            if TIP_MASK & (1 << i):
                assert tip, "There are no tip mounted in position " + str(i)
                tips += [tip]
                if tip.type in types:
                    t_masks[types.index(tip.type)] |= (1 << i)
                else:
                    types += [tip.type]
                    t_masks += [(1 << i)]

        assert len(types)==1   # todo temporally assumed only one type of tips
        tpe = types[0]
        m = t_masks[0]

        if not self.usePreservedtips:  # no re-back DiTi for multiple reuse
            assert isinstance(tpe, Lab.Labware.DITIrackType)
            if not tpe.last_preserved_tips:
                tpe.last_preserved_tips = tpe.pick_next_rack.Wells[0] # todo set to first tip used !!!!!
            w = tpe.last_preserved_tips
            assert isinstance(w, Lab.Well)
            cont = False
            rack = w.labware
            assert isinstance(rack, Lab.DITIrack)
            ip = w.offset
            n = Lab.count_tips(m)
            while n:
                cont, fw = rack.find_free_wells(n, init_pos=ip)
                if cont:
                    racks += [rack]
                    rack.selectOnly([w.offset for w in fw])
                    n -= len(fw)
                    rack = rack.next_rack(self.worktable)
                    ip = 0
            return racks

        for tp in tips:
            assert isinstance(tp, Lab.usedTip)
            react_well = tp.origin.track
            assert react_well.offset in tp.type.preserved_tips, "There are no tip preserved for sample "+str(i)
            tip_well = tp.type.preserved_tips[react_well.offset]
            assert isinstance(tip_well, Lab.Well)
            if tip_well.labware in racks:
                tip_well.selFlag = True
            else:
                racks += [ tip_well.labware]
                tip_well.labware.selectOnly(tip_well.offset)
        return racks
Пример #5
0
 def set_worktable(self,templateFile):
     w = Lab.WorkTable.curWorkTable
     if not w:
         w = Lab.WorkTable(templateFile)
     else:
         w.parseWorTableFile(templateFile)
     self.worktable = w
Пример #6
0
    def where_are_preserved_tips(self, selected_reactive, TIP_MASK, type)->list:  # [Lab.DITIrack]
        """

        :param TIP_MASK:
        :param type:
        :return:  Return a list of racks with the tips-wells already selected.
        """
        TIP_MASK = TIP_MASK if TIP_MASK != -1 else tipsMask[nTips]
        type = type if type else Lab.def_DiTi
        n = Lab.count_tips(TIP_MASK)
        assert n == len(selected_reactive)
        where = []
        for react_offset in selected_reactive:
            assert react_offset in type.preserved_tips, "There are no tip preserved for sample "+str(react_offset+1)
            well_tip = type.preserved_tips[react_offset]
            assert isinstance(well_tip, Lab.Well)
            if well_tip.labware in where:
                well_tip.selFlag = True
            else:
                where += [well_tip.labware]
                well_tip.labware.selectOnly(well_tip.offset)
        return where
Пример #7
0
 def setUsed(self, tipMask, labware_selection):
     # Deprecated ??????
     mask, tips = self.curArm().drop_test(tipMask)
     assert len(tips) == len(labware_selection.selected())
     for i, w in enumerate(labware_selection.selected_wells()):
         self.curArm().Tips[tips[i]] = Lab.usedTip(self.curArm().Tips[tips[i]], w)
Пример #8
0
    def Run(self):
        self.set_EvoMode()
        self.initialize()
        Rtv.NumOfSamples = self.NumOfSamples
        NumOfSamples = self.NumOfSamples
        wt           = self.worktable

        Itr.comment((self.version + 'for extracting RNA from {:s} samples with the MN-Vet kit').format(str(NumOfSamples))).exec()

                                                               # Get Labwares (Cuvette, eppys, etc.) from the work table

        if self.add_VL:
            LysBuf      = wt.getLabware(Lab.Trough_100ml,   "2-Vl Lysis Buffer"     )

        if self.do_extraction:
            BindBuf     = wt.getLabware(Lab.Trough_100ml,   "3-VEB Binding Buffer"  )
            ElutBuf     = wt.getLabware(Lab.Trough_100ml,   "1-VEL-ElutionBuffer"   )
            Eluat       = wt.getLabware(Lab.EppRack3x16R,    "Eluat")

        Samples     = wt.getLabware(Lab.EppRack3x16,     "Proben")
        Lysis       = Samples

        DiTi1000_1  = wt.getLabware(Lab.DiTi_1000ul,    "1000-1")
        DiTi1000_2  = wt.getLabware(Lab.DiTi_1000ul,    "1000-2")
        DiTi1000_3  = wt.getLabware(Lab.DiTi_1000ul,    "1000-3")

        Reactives   = wt.getLabware(Lab.GreinRack16_2mL, "Reactives" )

        if self.do_extraction:
            self.TeMg_Heat = wt.getLabware(Lab.TeMag48, "48 Pos Heat")
            self.TeMag     = wt.getLabware(Lab.TeMag48, "48PosMagnet")
            TeMag          = self.TeMag
            Lysis  =  TeMag

                                                               #  Set the initial position of the tips

        self.go_first_pos()

                                                               # Set volumen / sample

        SampleVolume        = 200.0
        LysisBufferVolume   = 180.0             # VL
        IC2Volume           = 4.0               # IC2
        BindingBufferVolume = 600.0             # VEB
        B_BeadsVolume       = 20.0              # B-Beads
        VEW1Volume          = 600.0             # VEW1
        VEW2Volume          = 600.0             # VEW2
        EtOH80pVolume       = 600.0
        ProtKVolume         = 20.0
        cRNAVolume          = 4.0
        IC_MS2Volume        = 20.0              # MS2
        ElutionBufferVolume = 100.0             # VEL

        InitLysisVol        = 0.0
        if self.do_extraction:
            if not self.add_samples:    InitLysisVol += SampleVolume
            if not self.add_preMix:     InitLysisVol += ProtKVolume + cRNAVolume + IC_MS2Volume
            if not self.add_VL:         InitLysisVol += LysisBufferVolume


        # Liquid classes used for pippetting.
                                                        # Others liquidClass names are defined in "protocol_steps.py"

        SampleLiqClass      = "Serum Asp"  # = TissueHomLiqClass   # SerumLiqClass="Serum Asp preMix3"

        all_samples = range(NumOfSamples)
        maxTips     = min  (self.nTips, NumOfSamples)
        maxMask     = Rbt.tipsMask[maxTips]
        if self.do_extraction:
            par         = TeMag.parallelOrder(self.nTips, all_samples)

                                                        # Define the reactives in each labware (Cuvette, eppys, etc.)

        # IC2         = Rtv.Reagent("IC2 - synthetic RNA " ,  Reactives, pos=13, volpersample=  IC2Volume ,defLiqClass=W_liquidClass)

        if self.add_preMix:
            ProtK = Rtv.Reagent("Proteinase K ",
                                Reactives,
                                replicas=2,
                                pos=[15, 16],  # only 16 ?  pos=16
                                volpersample=ProtKVolume,
                                defLiqClass=Small_vol_disp)

            cRNA   = Rtv.Reagent("Carrier RNA ", Reactives, pos=14, volpersample=cRNAVolume, defLiqClass=Small_vol_disp)
            IC_MS2 = Rtv.Reagent("IC MS2 phage culture ", Reactives, pos=13, volpersample=IC_MS2Volume, defLiqClass=Small_vol_disp)

            pK_cRNA_MS2 = Rtv.preMix("ProtK+cRNA+IC-MS2 mix ",
                                     Reactives,
                                     pos=8,
                                     components=[cRNA, ProtK, IC_MS2],
                                     defLiqClass=W_liquidClass,
                                     excess=20)

        if self.add_VL:
            LysisBuffer = Rtv.Reagent("VL - Lysis Buffer ", LysBuf, volpersample=LysisBufferVolume, defLiqClass='MN VL')

        if self.do_extraction:
            B_Beads         = Rtv.Reagent("B - Beads ",
                                          Reactives,
                                          pos          = [1,2],
                                          initial_vol  = 1200,
                                          volpersample = B_BeadsVolume,
                                          defLiqClass  = Beads_LC_2,
                                          maxFull      = 70)

            BindingBuffer   = Rtv.Reagent("VEB - Binding Buffer ", BindBuf, volpersample=BindingBufferVolume, defLiqClass=B_liquidClass)

            VEW1            = Rtv.Reagent("VEW1 - Wash Buffer ",
                                          wt.getLabware(Lab.Trough_100ml, "4-VEW1 Wash Buffe"),
                                          volpersample  = VEW1Volume,
                                          defLiqClass   = B_liquidClass)

            VEW2            = Rtv.Reagent("VEW2 - WashBuffer ",
                                          wt.getLabware(Lab.Trough_100ml,  "5-VEW2-WashBuffer" ),
                                          volpersample  =VEW2Volume,
                                          defLiqClass   =B_liquidClass)

            EtOH80p         = Rtv.Reagent("Ethanol 80% ",
                                          Lab.getLabware(Lab.Trough_100ml,  "7-EtOH80p"     ),
                                          volpersample=EtOH80pVolume, defLiqClass=B_liquidClass)

            ElutionBuffer   = Rtv.Reagent("Elution Buffer ",
                                          ElutBuf,
                                          volpersample  =ElutionBufferVolume,
                                          defLiqClass   =B_liquidClass)            # defLiqClass="Eluat"   ??

                                                        # Show the CheckList GUI to the user for possible small changes
        self.CheckList()
        self.set_EvoMode()
                                                        # Define the reactives not shown in the CheckList GUI
                                                        # Define samples and the place for temporal reactions
        for s in all_samples:
            Rtv.Reagent("lysis_{:02d}".format(s + 1), Lysis, initial_vol=InitLysisVol,
                        pos=s + 1, defLiqClass=SampleLiqClass, excess=0)
            if self.do_extraction:
                Rtv.Reagent("RNA_{:02d}".format(s + 1), Eluat, initial_vol= 0.0,
                            pos=s+1, defLiqClass=def_liquidClass, excess=0)
                if self.add_samples:
                    Rtv.Reagent("probe_{:02d}".format(s + 1), Samples, single_use=SampleVolume,
                                pos=s+1, defLiqClass=SampleLiqClass, excess=0)

        Itr.wash_tips(wasteVol=30, FastWash=True).exec()
        if self.do_extraction:
            Te_MagS_ActivateHeater(50).exec()
            Te_MagS_MoveToPosition(Te_MagS_MoveToPosition.Dispense).exec()

        if self.add_preMix:                                                               #  add  ProtK+cRNA+MS2 mix
            with self.tips(tipsMask=maxMask, reuse=True, drop=False):
                self.makePreMix(pK_cRNA_MS2)
                self.spread  (  reactive=pK_cRNA_MS2,   to_labware_region= Lysis.selectOnly(all_samples))

        if self.add_samples:                                                               # add samples
            with self.tips(reuse=True, drop=True, preserve=True):
                self.transfer( from_labware_region  = Samples,
                               to_labware_region    = Lysis,
                               volume               = SampleVolume,
                               using_liquid_class   = (SampleLiqClass, "Serum Disp postMix3"),
                               optimizeFrom         = False,
                               optimizeTo           = True,
                               NumSamples           = NumOfSamples)
            Itr.wash_tips(wasteVol=4, FastWash=True).exec()

        if self.add_VL:                                                                     # add  LysisBuffer
            with self.tips(reuse=True, drop=False):    # better reuse=True, drop=False ??
                self.spread  (  reactive=LysisBuffer,   to_labware_region= Lysis.selectOnly(all_samples))


        if not self.do_extraction:
            self.done()
            return

        with incubation(10): pass


        with group("Beads binding"):

            with self.tips(tipsMask=maxMask, reuse=True, drop=False):
                for p in [40, 50, 60, 65]:
                    self.mix_reactive(B_Beads, LiqClass=Beads_LC_1, cycles=1, maxTips=maxTips, v_perc=p)
            with self.tips(reuse=True, drop=True):
                self.spread( reactive=B_Beads,      to_labware_region=TeMag.selectOnly(all_samples))

            with self.tips(reuse=True, drop=False, preserve=True, usePreserved=True):
                self.wash_in_TeMag(reactive=BindingBuffer, wells=all_samples)



        with self.tips(reuse=True, drop=False, preserve=True):
            self.wash_in_TeMag(reactive=VEW1, wells=all_samples)
            self.wash_in_TeMag(reactive=VEW2, wells=all_samples)

            with self.group("Wash in TeMag with " + EtOH80p.name), self.tips():
                self.spread( reactive=EtOH80p, to_labware_region= TeMag.selectOnly(all_samples))

                with parallel_execution_of(mix_mag_sub, repeat=NumOfSamples//self.nTips + 1):
                    self.mix( TeMag.selectOnly(all_samples), EtOH80p.defLiqClass)
                with incubation(minutes=0.5):
                    Te_MagS_MoveToPosition(Te_MagS_MoveToPosition.Aspirate, z_pos=24).exec()
                with self.tips(usePreserved=self.preserveingTips()):
                    self.waste( from_labware_region=    TeMag.selectOnly(all_samples))

                with incubation(minutes=4):
                    Te_MagS_MoveToPosition(Te_MagS_MoveToPosition.Incubation).exec()
                with incubation(minutes=4):
                    Te_MagS_MoveToPosition(Te_MagS_MoveToPosition.Aspirate, z_pos=24).exec()


            self.spread( reactive=ElutionBuffer, to_labware_region=TeMag.selectOnly(all_samples))
            with incubation(minutes=2):
                Te_MagS_MoveToPosition(Te_MagS_MoveToPosition.Incubation).exec()

            Te_MagS_MoveToPosition(Te_MagS_MoveToPosition.Dispense).exec()
            with parallel_execution_of(mix_mag_eluat, repeat=NumOfSamples//self.nTips+1):
                self.mix(TeMag.selectOnly(all_samples), ElutionBuffer.defLiqClass)

            with self.tips(usePreserved=self.preserveingTips(), preserve=False, drop=True):
                with incubation(minutes=1.0, timer=2):
                    Te_MagS_MoveToPosition(Te_MagS_MoveToPosition.Aspirate).exec()
                self.transfer(   from_labware_region=   TeMag.selectOnly(all_samples),
                                 to_labware_region=     Eluat.selectOnly(all_samples),
                                 volume=                ElutionBufferVolume,
                                 optimizeTo=            False,
                                 using_liquid_class=(ElutionBuffer.defLiqClass, ElutionBuffer.defLiqClass))
        self.done()
Пример #9
0
def init_RNAextraction():
    import EvoScriPy.Labware as Lab

    print('Init init_RNAextraction()')

    # https://docs.python.org/3.5/reference/simple_stmts.html#global
    # https://www.python.org/dev/peps/pep-3104/   for nonlocal
    # https://docs.python.org/3/faq/programming.html#id8
    global TeMg_Heat, TeMag, WashCleanerS, WashWaste, WashCleanerL, DiTiWaste, ElutBuf, LysBuf, BindBuf
    global BioWaste, Unused8, Unused9, DiTi1000_1, DiTi1000_2, DiTi1000_3, Reactives, Reactives, Eluat, Samples

    TeMg_Heat = Lab.Labware(Lab.TeMag48, Lab.Labware.Location(14, 1),
                            "48 Pos Heat")
    TeMag = Lab.Labware(Lab.TeMag48, Lab.Labware.Location(14, 2),
                        "48PosMagnet")
    WashCleanerS = Lab.Cuvette(Lab.CleanerSWS, Lab.Labware.Location(22, 1),
                               "Washstation 2Grid Cleaner short")
    WashWaste = Lab.Cuvette(Lab.WasteWS, Lab.Labware.Location(22, 2),
                            "Washstation 2Grid Waste")
    WashCleanerL = Lab.Cuvette(Lab.CleanerLWS, Lab.Labware.Location(22, 3),
                               "Washstation 2Grid Cleaner long")
    DiTiWaste = Lab.DITIwaste(Lab.DiTi_Waste, Lab.Labware.Location(22, 7),
                              "Washstation 2Grid DiTi Waste")

    Lab.def_LabW = Lab.Labware(type=Lab.MP96well,
                               location=Lab.Labware.Location(1, 2))
    Lab.def_WashWaste = WashWaste
    Lab.def_WashCleaner = WashCleanerS
    Lab.def_DiTiWaste = DiTiWaste
    Lab.def_DiTi = Lab.DiTi_1000ul  # todo revise

    ElutBuf = Lab.Cuvette(Lab.Trough_100ml, Lab.Labware.Location(6, 1),
                          "1-VEL-ElutionBuffer")
    LysBuf = Lab.Cuvette(Lab.Trough_100ml, Lab.Labware.Location(6, 2),
                         "2-Vl Lysis Buffer")
    BindBuf = Lab.Cuvette(Lab.Trough_100ml, Lab.Labware.Location(6, 3),
                          "3-VEB Binding Buffer")

    BioWaste = Lab.Cuvette(Lab.Trough_100ml, Lab.Labware.Location(22, 6),
                           "6-Waste")
    Unused8 = Lab.Cuvette(Lab.Trough_100ml, Lab.Labware.Location(24, 2),
                          "8-Unused")
    Unused9 = Lab.Cuvette(Lab.Trough_100ml, Lab.Labware.Location(24, 3),
                          "9-Unused")

    DiTi1000_1 = Lab.DITIrack(Lab.DiTi_1000ul, Lab.Labware.Location(25, 1),
                              "1000-1")
    DiTi1000_2 = Lab.DITIrack(Lab.DiTi_1000ul, Lab.Labware.Location(25, 2),
                              "1000-2")
    DiTi1000_3 = Lab.DITIrack(Lab.DiTi_1000ul, Lab.Labware.Location(25, 3),
                              "1000-3")

    Reactives = Lab.Labware(Lab.GreinRack16_2mL, Lab.Labware.Location(7, 1),
                            "Reactives")
    Eluat = Lab.Labware(Lab.EppRack3x16R, Lab.Labware.Location(8, 1), "Eluat")
    Samples = Lab.Labware(Lab.EppRack3x16, Lab.Labware.Location(11, 1),
                          "Proben")
Пример #10
0
def extractRNA_with_MN_Vet_Kit(NumOfSamples, CheckList=None):

    Rtv.NumOfSamples = NumOfSamples
    import protocols.RNAextractionMN_Mag.RobotInitRNAextraction as RI

    Itr.comment('Extracting RNA from {:s} samples with the MN-Vet kit'.format(
        str(NumOfSamples))).exec()

    # DiTi1000_1.fill('C06')
    # DiTi1000_2.fill('A11')
    # DiTi1000_3.fill('A10')
    Itr.set_DITI_Counter2(RI.DiTi1000_1, posInRack='A01').exec()

    SampleVolume = 200.0
    LysisBufferVolume = 180.0
    IC2Volume = 4.0
    BindingBufferVolume = 600.0
    B_BeadsVolume = 20.0
    VEW1Volume = 600.0
    VEW2Volume = 600.0
    EtOH80pVolume = 600.0
    ProtKVolume = 20.0
    cRNAVolume = 4.0
    IC_MS2Volume = 20.0
    ElutionBufferVolume = 100.0

    SampleLiqClass = "Serum Asp"  # = TissueHomLiqClass   # SerumLiqClass="Serum Asp preMix3"

    all_samples = range(Rtv.NumOfSamples)
    maxTips = min(Rbt.nTips, Rtv.NumOfSamples)
    maxMask = Rbt.tipsMask[maxTips]
    par = RI.TeMag.parallelOrder(Rbt.nTips, all_samples)

    LysisBuffer = Rtv.Reactive("VL - Lysis Buffer ",
                               RI.LysBuf,
                               volpersample=LysisBufferVolume,
                               defLiqClass=B_liquidClass)
    IC2 = Rtv.Reactive("IC2 - synthetic RNA ",
                       RI.Reactives,
                       pos=11,
                       volpersample=IC2Volume,
                       defLiqClass=W_liquidClass)
    BindingBuffer = Rtv.Reactive("VEB - Binding Buffer ",
                                 RI.BindBuf,
                                 volpersample=BindingBufferVolume,
                                 defLiqClass=B_liquidClass)
    B_Beads = Rtv.Reactive("B - Beads ",
                           RI.Reactives,
                           initial_vol=1200,
                           pos=1,
                           volpersample=B_BeadsVolume,
                           replicas=2,
                           defLiqClass=Beads_LC_2)

    VEW1 = Rtv.Reactive("VEW1 - Wash Buffer ",
                        Lab.Cuvette(Lab.Trough_100ml,
                                    Lab.Labware.Location(22, 4),
                                    "4-VEW1 Wash Buffer"),
                        volpersample=VEW1Volume,
                        defLiqClass=B_liquidClass)
    VEW2 = Rtv.Reactive("VEW2 - WashBuffer ",
                        Lab.Cuvette(Lab.Trough_100ml,
                                    Lab.Labware.Location(22, 5),
                                    "5-VEW2-WashBuffer"),
                        volpersample=VEW2Volume,
                        defLiqClass=B_liquidClass)
    EtOH80p = Rtv.Reactive("Ethanol 80% ",
                           Lab.Cuvette(Lab.Trough_100ml,
                                       Lab.Labware.Location(24, 1),
                                       "7-Ethanol 80%"),
                           volpersample=EtOH80pVolume,
                           defLiqClass=B_liquidClass)
    ElutionBuffer = Rtv.Reactive("Elution Buffer ",
                                 RI.ElutBuf,
                                 volpersample=ElutionBufferVolume,
                                 defLiqClass="Eluat")

    ProtK = Rtv.Reactive("Proteinase K ",
                         RI.Reactives,
                         pos=16,
                         volpersample=ProtKVolume,
                         defLiqClass=Small_vol_disp)
    cRNA = Rtv.Reactive("Carrier RNA ",
                        RI.Reactives,
                        pos=15,
                        volpersample=cRNAVolume,
                        defLiqClass=Small_vol_disp)
    IC_MS2 = Rtv.Reactive("IC MS2 phage culture ",
                          RI.Reactives,
                          pos=14,
                          volpersample=IC_MS2Volume,
                          defLiqClass=Small_vol_disp)
    pK_cRNA_MS2 = Rtv.preMix("ProtK+cRNA+IC-MS2 mix ",
                             RI.Reactives,
                             pos=12,
                             components=[ProtK, cRNA, IC_MS2],
                             defLiqClass=W_liquidClass,
                             replicas=2)
    Waste = Rtv.Reactive("Waste ", RI.WashWaste)

    if CheckList is not None:
        CheckList()

    for s in all_samples:
        Rtv.Reactive("probe_{:02d}".format(s + 1),
                     RI.Samples,
                     single_use=SampleVolume,
                     pos=s + 1,
                     defLiqClass=SampleLiqClass,
                     excess=0)
        Rtv.Reactive("lysis_{:02d}".format(s + 1),
                     RI.TeMag,
                     initial_vol=0.0,
                     pos=par[s] + 1,
                     defLiqClass=def_liquidClass,
                     excess=0)
        Rtv.Reactive("RNA_{:02d}".format(s + 1),
                     RI.Eluat,
                     initial_vol=0.0,
                     pos=s + 1,
                     defLiqClass=def_liquidClass,
                     excess=0)

    Itr.wash_tips(wasteVol=30, FastWash=True).exec()
    Te_MagS_ActivateHeater(50).exec()
    Te_MagS_MoveToPosition(Te_MagS_MoveToPosition.Dispense).exec()

    with tips(tipsMask=maxMask, reuse=True, drop=False):
        pK_cRNA_MS2.make()
        spread(reactive=pK_cRNA_MS2,
               to_labware_region=RI.TeMag.selectOnly(all_samples))

    with tips(reuse=True, drop=True, preserve=True):
        transfer(from_labware_region=RI.Samples,
                 to_labware_region=RI.TeMag,
                 volume=SampleVolume,
                 using_liquid_class=(SampleLiqClass, "Serum Disp postMix3"),
                 optimizeFrom=False,
                 optimizeTo=True,
                 NumSamples=Rtv.NumOfSamples)
    Itr.wash_tips(wasteVol=4, FastWash=True).exec()

    with tips(reuse=False, drop=True):
        spread(reactive=LysisBuffer,
               to_labware_region=RI.TeMag.selectOnly(all_samples))

    with incubation(10):
        pass

    with tips(tipsMask=maxMask, reuse=True, drop=False):
        for p in [40, 50, 60, 65]:
            mix_reactive(B_Beads,
                         LiqClass=Beads_LC_1,
                         cycles=1,
                         maxTips=maxTips,
                         v_perc=p)


#        mix_reactive(B_Beads, LiqClass=Beads_LC_2, cycles=3, maxTips=maxTips, v_perc=90)

    with tips(reuse=True, drop=True):
        spread(reactive=B_Beads,
               to_labware_region=RI.TeMag.selectOnly(all_samples))

    with tips(reuse=True, drop=False, preserve=True, usePreserved=True):
        wash_in_TeMag(reactive=BindingBuffer, wells=all_samples)

    with tips(reuse=True, drop=False, preserve=True):
        wash_in_TeMag(reactive=VEW1, wells=all_samples)
        wash_in_TeMag(reactive=VEW2, wells=all_samples)

        with group("Wash in TeMag with " + EtOH80p.name), tips():
            spread(reactive=EtOH80p,
                   to_labware_region=RI.TeMag.selectOnly(all_samples))

            with parallel_execution_of(mix_mag_sub,
                                       repeat=Rtv.NumOfSamples // Rbt.nTips +
                                       1):
                mix(RI.TeMag.selectOnly(all_samples), EtOH80p.defLiqClass)
            with incubation(minutes=0.5):
                Te_MagS_MoveToPosition(Te_MagS_MoveToPosition.Aspirate,
                                       z_pos=24).exec()
            with tips(usePreserved=preserveingTips()):
                waste(from_labware_region=RI.TeMag.selectOnly(all_samples))

            with incubation(minutes=4):
                Te_MagS_MoveToPosition(
                    Te_MagS_MoveToPosition.Incubation).exec()
            with incubation(minutes=4):
                Te_MagS_MoveToPosition(Te_MagS_MoveToPosition.Aspirate,
                                       z_pos=24).exec()

        spread(reactive=ElutionBuffer,
               to_labware_region=RI.TeMag.selectOnly(all_samples))
        with incubation(minutes=2):
            Te_MagS_MoveToPosition(Te_MagS_MoveToPosition.Incubation).exec()

        Te_MagS_MoveToPosition(Te_MagS_MoveToPosition.Dispense).exec()
        with parallel_execution_of(mix_mag_eluat,
                                   repeat=Rtv.NumOfSamples // Rbt.nTips + 1):
            mix(RI.TeMag.selectOnly(all_samples), ElutionBuffer.defLiqClass)

        with tips(usePreserved=preserveingTips(), preserve=False, drop=True):
            with incubation(minutes=1.0, timer=2):
                Te_MagS_MoveToPosition(Te_MagS_MoveToPosition.Aspirate).exec()
            transfer(from_labware_region=RI.TeMag.selectOnly(all_samples),
                     to_labware_region=RI.Eluat.selectOnly(all_samples),
                     volume=ElutionBufferVolume,
                     optimizeTo=False,
                     using_liquid_class=(ElutionBuffer.defLiqClass,
                                         ElutionBuffer.defLiqClass))