Source code for protocols.evo100_f.RNAextractionMN_Mag_Vet.RNAextractionMN_Mag_Vet

# Copyright (C) 2014-2019, Ariel Vina Rodriguez ( arielvina@yahoo.es )
#  distributed under the GNU General Public License, see <http://www.gnu.org/licenses/>.
#
# author Ariel Vina-Rodriguez (qPCR4vir)
# 2014-2019
__author__ = 'Ariel'

from protocols.evo100_f.evo100_f import *
from EvoScriPy.instructions_Te_MagS import *


mix_mag_sub = br"C:\Prog\robotevo\EvoScripts\subroutines\avr_MagMix.esc" .decode(EvoScriPy.evo_mode.Mode.encoding)
mix_mag_eluat = br"C:\Prog\robotevo\EvoScripts\subroutines\avr_MagMix_Eluat.esc".decode(EvoScriPy.evo_mode.Mode.encoding)
# robot.rep_sub = br"repeat_subroutine.esc" .decode(mode.Mode.encoding)
robot.rep_sub = br"C:\Prog\robotevo\EvoScripts\subroutines\repeat_subroutine.esc".decode(EvoScriPy.evo_mode.Mode.encoding)


class RNAextr_MN_Vet_Kit(Evo100_FLI):
    """Implementation of the protocol for RNA extraction using the NucleoMag® VET kit from MACHEREY-NAGEL.
    """

    name = "RNA extraction with the MN_Vet kit"
    min_s, max_s = 1, 48

    def def_versions(self):
        self.versions = {'VL-only prefill'     : self.ver_fill_inactivation,
                         'VL-pKmix prefill'    : self.ver_fill_preMix_inactivation,
                         'VL-only inactivated' : self.ver_VL_inactivated,
                         'VL-pKmix Inactivated': self.ver_preMix_inactivated,
                         'original samples'    : self.ver_original_samples}
        # add new version from plate to plate

    def versions_defaults(self):
        self.add_samples    = True
        self.add_preMix     = True
        self.add_VL         = True
        self.do_extraction  = True

    def ver_original_samples(self):
        self.versions_defaults()

    def ver_VL_inactivated(self):
        self.versions_defaults()
        self.add_VL         = False
        self.add_samples    = False

    def ver_preMix_inactivated(self):
        self.ver_VL_inactivated()
        self.add_preMix     = False

    def ver_fill_preMix_inactivation(self):
        self.versions_defaults()
        self.add_samples   = False
        self.do_extraction = False

    def ver_fill_inactivation(self):
        self.ver_fill_preMix_inactivation()
        self.add_preMix     = False

    def __init__(self,
                 GUI                            = None,
                 num_of_samples     : int       = None,
                 worktable_template_filename    = None,
                 output_filename                = None,
                 first_tip                      = None,
                 run_name           : str       = ""):

        self.versions_defaults()
        this = Path(__file__).parent
        Evo100_FLI.__init__(self,
                            GUI                         = GUI,
                            num_of_samples=num_of_samples or RNAextr_MN_Vet_Kit.max_s,
                            worktable_template_filename = worktable_template_filename or
                                                          this / 'avr_RNAext_MNVet_15TeMag.ewt',
                            output_filename         = output_filename or this / 'scripts' / 'RNAext_MNVet_TeMag',
                            first_tip= first_tip,
                            run_name                = run_name)

    def run(self):
        self.initialize()

        num_of_samples = self.num_of_samples
        wt           = self.worktable

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

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

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

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

        Samples     = wt.get_labware("Proben", labware.EppRack3x16)
        Lysis       = Samples

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

        Reagents   = wt.get_labware("Reactives", labware.GreinRack16_2mL)

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

                                                               #  Set the initial position of the tips

        self.set_first_tip()

                                                               # Set volumen / sample

        SampleVolume        = 200.0
        LysisBufferVolume   = 180.0             # VL
        IC2Volume           =   4.0             # IC2
        IC_MS2Volume        =  10.0             # MS2
        ProtKVolume         =  20.0
        cRNAVolume          =   4.0
        BindingBufferVolume = 600.0             # VEB
        B_BeadsVolume       =  20.0             # B-Beads
        VEW1Volume          = 600.0             # VEW1
        VEW2Volume          = 600.0             # VEW2
        EtOH80pVolume       = 600.0
        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(num_of_samples)
        maxTips     = min  (self.n_tips, num_of_samples)
        maxMask     = robot.mask_tips[maxTips]
        par         = Lysis.parallelOrder(self.n_tips, all_samples)

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

        # IC2         = Reagent("IC2 - synthetic RNA " ,  Reagents, pos=13,
        #                            volpersample=  IC2Volume ,def_liq_class=W_liquidClass)

        if self.add_preMix:
            ProtK = Reagent("Proteinase K ",
                            Reagents,
                            num_of_aliquots= 2,
                            minimize_aliquots   = False,
                            wells               = [15, 16],  # only 16 ?  pos=16
                            volpersample        = ProtKVolume,
                            def_liq_class       = self.Small_vol_disp)

            cRNA   = Reagent("Carrier RNA ",
                             Reagents,
                             wells= 14,
                             volpersample       = cRNAVolume,
                             def_liq_class      = self.Small_vol_disp)

            IC_MS2 = Reagent("IC MS2 phage culture ",
                             Reagents,
                             wells= 13,
                             volpersample       = IC_MS2Volume,
                             def_liq_class      = self.Small_vol_disp)

            pK_cRNA_MS2 = PreMixReagent("ProtK+cRNA+IC-MS2 mix ",
                                        Reagents,
                                        wells          = 8,
                                        components     = [cRNA, ProtK, IC_MS2],
                                        def_liq_class  = self.W_liquidClass,
                                        excess         = 20)

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

        if self.do_extraction:
            B_Beads         = Reagent("B - Beads ",
                                      Reagents,
                                      wells= [1, 2],
                                      initial_vol    = 1200.0,
                                      volpersample   = B_BeadsVolume,
                                      def_liq_class  = self.Beads_LC_2,
                                      fill_limit_aliq= 70)

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

            VEW1            = Reagent("VEW1 - Wash Buffer ",
                                      wt.get_labware("4-VEW1 Wash Buffe", labware.Trough_100ml),
                                      volpersample    = VEW1Volume,
                                      def_liq_class   = self.B_liquidClass)

            VEW2            = Reagent("VEW2 - WashBuffer ",
                                      wt.get_labware("5-VEW2-WashBuffer", labware.Trough_100ml),
                                      volpersample  =VEW2Volume,
                                      def_liq_class =self.B_liquidClass)

            EtOH80p         = Reagent("Ethanol 80% ",
                                      labware.getLabware(labware.Trough_100ml,  "7-EtOH80p"     ),
                                      volpersample=EtOH80pVolume, def_liq_class=self.B_liquidClass)

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

                                                        # Show the check_list GUI to the user for possible small changes
        self.check_list()
        self.set_EvoMode()
                                                        # Define the Reagents not shown in the check_list GUI
                                                        # Define samples and the place for intermediate reactions
        for s in all_samples:
            Reagent("lysis_{:02d}".format(s + 1),
                    Lysis,
                    initial_vol    = InitLysisVol,
                    wells          = par[s] + 1,
                    def_liq_class  = SampleLiqClass,
                    excess         = 0)

            if self.do_extraction:
                Reagent("RNA_{:02d}".format(s + 1),
                            Eluat,
                            initial_vol   = 0.0,
                            wells         = s + 1,
                            def_liq_class = self.Water_free,
                            excess        = 0)

                Reagent("probe_{:02d}".format(s + 1),
                            Samples,
                            single_use    = SampleVolume if self.add_samples else InitLysisVol,
                            wells         = s + 1,
                            def_liq_class = SampleLiqClass,
                            excess        = 0)

        instructions.wash_tips(wasteVol=30, FastWash=True).exec()
        if self.do_extraction:
            Te_MagS_ActivateHeater(50).exec()                                     # set incubation temperature at 50°C
            Te_MagS_MoveToPosition(Te_MagS_MoveToPosition.Dispense).exec()

        if self.add_preMix:                                                               # add  ProtK+cRNA+MS2 mix
            with group("Add pre mix Prot K."), self.tips(tips_mask=maxMask, reuse=True, drop=False):
                self.make_pre_mix(pK_cRNA_MS2)
                self.distribute  (reagent=pK_cRNA_MS2, to_labware_region= Lysis.selectOnly(all_samples))

        if self.do_extraction:                                                            # add samples
            with self.tips(reuse=True, drop=True, preserve=False):
                self.transfer( from_labware_region  = Samples,
                               to_labware_region    = Lysis,
                               volume               = SampleVolume if self.add_samples else InitLysisVol,
                               using_liquid_class   = (SampleLiqClass, "Serum Disp postMix3"),
                               optimize_from        = False,
                               optimize_to= True,
                               num_samples          = num_of_samples)
            instructions.wash_tips(wasteVol=4, FastWash=True).exec()

        if self.add_VL:                                                                     # add  LysisBuffer
            with self.tips(reuse=True, drop=False, drop_first=True):
                self.distribute  (reagent=LysisBuffer, to_labware_region= Lysis.selectOnly(all_samples))

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

        with incubation(10): pass # if self.add_samples

        with group("Add B-Beads"):

            with self.tips(tips_mask=maxMask, reuse=True, drop=False):
                for p in [40, 50, 60, 65]:
                    self.mix_reagent(B_Beads, liq_class=self.Beads_LC_1, cycles=1, maxTips=maxTips, v_perc=p)
            with self.tips(reuse=True, drop=True):
                self.distribute(reagent=B_Beads, to_labware_region=TeMag.selectOnly(all_samples))

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

            with group("Wash in TeMag with " + EtOH80p.name), self.tips():   # Atypical wash. Include incubation at 50°C

                self.distribute(reagent=EtOH80p, to_labware_region= TeMag.selectOnly(all_samples))

                with parallel_execution_of(mix_mag_sub, repeat=num_of_samples // self.n_tips + 1):
                    self.mix( TeMag.selectOnly(all_samples), EtOH80p.def_liq_class)

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

                with self.tips(use_preserved=self.preserveing_tips()):
                    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()

        with group("Elution"):

            with self.tips(reuse=True, drop=False):

                self.distribute(reagent=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 self.tips(reuse=True, drop=True):

                with parallel_execution_of(mix_mag_eluat, repeat=num_of_samples // self.n_tips + 1):
                    self.mix(TeMag.selectOnly(all_samples), ElutionBuffer.def_liq_class)

                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,
                                 optimize_to=            False,
                                 using_liquid_class=(ElutionBuffer.def_liq_class, ElutionBuffer.def_liq_class))

        self.drop_tips()
        self.done()

    def wash_in_TeMag(self, reagent, wells=None, using_liquid_class=None, vol=None):
        """

        :param reagent:
        :param wells:
        :param using_liquid_class: dict
        :param vol:
        """
        wells = wells or reagent.labware.selected() or range(self.num_of_samples)
        if not using_liquid_class:
            using_liquid_class = reagent.def_liq_class
        with group("Wash in TeMag with " + reagent.name):

            Te_MagS_MoveToPosition(Te_MagS_MoveToPosition.Dispense).exec()
            self.distribute(reagent=reagent, to_labware_region=self.TeMag.selectOnly(wells))

            with parallel_execution_of(mix_mag_sub, repeat=self.num_of_samples // self.n_tips + 1):
                self.mix(self.TeMag.selectOnly(wells), using_liquid_class, vol)

            with incubation(minutes=0.5, timer=2):
                Te_MagS_MoveToPosition(Te_MagS_MoveToPosition.Aspirate).exec()
            with self.tips(use_preserved=self.preserveing_tips(), preserve=False, drop=True):
                self.waste(self.TeMag.selectOnly(wells), using_liquid_class, vol)


if __name__ == "__main__":

    p = RNAextr_MN_Vet_Kit(num_of_samples= 48, run_name= "_48_original samples")

    p.use_version('original samples')
    p.set_first_tip('A01')
    p.run()