Example #1
0
 def runLigPgm(self, vol, ligtemp, inactivate=True, inacttemp=65):
     if inactivate:
         pgm = "LIG15-%.0f" % ligtemp
         worklist.pyrun(
             'PTC\\ptcsetpgm.py %s TEMP@%.0f,900 TEMP@%.0f,600 TEMP@25,30' %
             (pgm, ligtemp, inacttemp))
         self.e.runpgm(pgm,
                       27,
                       False,
                       vol,
                       hotlidmode="TRACKING",
                       hotlidtemp=10)
     elif ligtemp == 25:
         worklist.comment('Ligation at room temp')
         self.e.pause(15 * 60)
     else:
         pgm = "TRP%.0f-15" % ligtemp
         worklist.pyrun('PTC\\ptcsetpgm.py %s TEMP@%.0f,900 TEMP@25,30' %
                        (pgm, ligtemp))
         self.e.runpgm(pgm,
                       17,
                       False,
                       vol,
                       hotlidmode="TRACKING",
                       hotlidtemp=10)
Example #2
0
    def run(self,confirm=False,enzName="EvaUSER",waitForPTC=True):
        """Run the dilutions and QPCR setup"""
        # Setup qPCRs
        #self.jobq.dump()
        self.idler(100000)
        if waitForPTC:
            self.trp.e.waitpgm()		# May still need to wait for TC to complete before able to do final jobs
            self.idler(100000)
        worklist.flushQueue()
        if self.jobq.len()>0:
            logging.error( "Blocked jobs remain on queue:")
            self.jobq.dump()
            assert False

        if len(self.dilProds)==0:
            return
        
        if confirm:
            worklist.userprompt('Continue to setup qPCR')

        worklist.comment('Starting qPCR setup')
        self.trp.e.sanitize(force=True)
        if all([allp in p for allp in self.allprimers() for p in self.primers]):
            print("All samples use same qPCR primers")
            # This allows the Eva to be distributed all at once
            self.trp.runQPCR(src=self.dilProds,vol=self.volume,primers=self.allprimers(),nreplicates=self.nreplicates,enzName=enzName)
        else:
            for p in self.allprimers():
                # Build list of relevant entries
                ind=[ i for i in range(len(self.dilProds)) if p in self.primers[i]]
                self.trp.runQPCR(src=[self.dilProds[i] for i in ind],vol=self.volume,primers=[p],nreplicates=[self.nreplicates[i] for i in ind],enzName=enzName)
Example #3
0
    def runQPCR(self,src,vol,primers,nreplicates=1,enzName="EvaUSER"):
        ## QPCR setup
        worklist.comment("runQPCR: primers=%s, source=%s"%([p for p in primers],[s.name for s in src]))
        [src,vol,nreplicates]=listify([src,vol,nreplicates])
        self.e.shakeSamples(src,returnPlate=True)

        # Build a list of sets to be run
        torun=[]
        for repl in range(max(nreplicates)):
            for p in primers:
                for i in range(len(src)):
                    if nreplicates[i]<=repl:
                        continue
                    if repl==0:
                        sampname="%s.Q%s"%(src[i].name,p)
                    else:
                        sampname="%s.Q%s.%d"%(src[i].name,p,repl+1)
                    s=Sample(sampname,decklayout.QPCRPLATE)
                    torun=torun+[(src[i],s,p,vol[i])]

        # Add enzyme
        e=reagents.getsample(enzName)
        v=[a[3]/e.conc.dilutionneeded() for a in torun]
        t=[a[1] for a in torun]
        self.e.multitransfer(v,e,t)

        # Make the target have 'none' concentration so we can multiadd to it again
        for s in t:
            s.conc=None

        # Fill the master mixes
        dil={}
        for p in primers:
            mname="P-%s"%p
            if not reagents.isReagent(mname):
                reagents.add(name=mname,conc=4,extraVol=30)
            mq=reagents.getsample(mname)
            t=[a[1] for a in torun if a[2]==p]
            v=[a[3]/mq.conc.dilutionneeded() for a in torun if a[2]==p]
            assert(v>0)
            self.e.multitransfer(v,mq,t,(False,False))
            dil[p]=1.0/(1-1/e.conc.dilutionneeded()-1/mq.conc.dilutionneeded())
            
        # Add the samples
        self.e.sanitize()		# In case we are aligned
        for a in torun:
            s=a[0]
            t=a[1]
            p=a[2]
            v=a[3]/dil[p]
            t.conc=None		# Concentration of master mix is irrelevant now
            self.e.transfer(v,s,t)
            
        return [a[1] for a in torun]
Example #4
0
 def runLigPgm(self,vol,ligtemp,inactivate=True,inacttemp=65):
     if inactivate:
         pgm="LIG15-%.0f"%ligtemp
         worklist.pyrun('PTC\\ptcsetpgm.py %s TEMP@%.0f,900 TEMP@%.0f,600 TEMP@25,30'%(pgm,ligtemp,inacttemp))
         self.e.runpgm(pgm,27,False,vol,hotlidmode="TRACKING",hotlidtemp=10)
     elif ligtemp==25:
         worklist.comment('Ligation at room temp')
         self.e.pause(15*60)
     else:
         pgm="TRP%.0f-15"%ligtemp
         worklist.pyrun('PTC\\ptcsetpgm.py %s TEMP@%.0f,900 TEMP@25,30'%(pgm,ligtemp))
         self.e.runpgm(pgm,17,False,vol,hotlidmode="TRACKING",hotlidtemp=10)
Example #5
0
    def runT7Setup(self, theo, src, vol, srcdil, tgt=None, rlist=["MT7"]):
        [theo, src, tgt, srcdil] = listify([theo, src, tgt, srcdil])
        for i in range(len(src)):
            if tgt[i] is None:
                if theo[i]:
                    tgt[i] = Sample("%s.T+" % src[i].name,
                                    decklayout.SAMPLEPLATE)
                else:
                    tgt[i] = Sample("%s.T-" % src[i].name,
                                    decklayout.SAMPLEPLATE)

        worklist.comment("runT7: source=%s" % [str(s) for s in src])

        rvols = [reagents.getsample(x).conc.volneeded(vol) for x in rlist]
        rtotal = sum(rvols)
        sourcevols = [vol * 1.0 / s for s in srcdil]
        if any(theo):
            theovols = [
                (vol * 1.0 /
                 reagents.getsample("Theo").conc.dilutionneeded() if t else 0)
                for t in theo
            ]
            watervols = [
                vol - theovols[i] - sourcevols[i] - rtotal
                for i in range(len(src))
            ]
        else:
            watervols = [vol - sourcevols[i] - rtotal for i in range(len(src))]

        if any([w < -1e-10 for w in watervols]):
            print "runT7Setup: Negative amount of water required: ", watervols
            assert False
        if sum(watervols) > 0.01:
            self.e.multitransfer(watervols, decklayout.WATER, tgt)
        for ir in range(len(rlist)):
            self.e.multitransfer([rvols[ir] for s in tgt],
                                 reagents.getsample(rlist[ir]), tgt)
        if any(theo):
            self.e.multitransfer(
                [tv for tv in theovols if tv > 0.01],
                reagents.getsample("Theo"),
                [tgt[i] for i in range(len(theovols)) if theovols[i] > 0],
                ignoreContents=True)
        for i in range(len(src)):
            self.e.transfer(sourcevols[i], src[i], tgt[i])
        self.e.shakeSamples(tgt, returnPlate=True)
        for t in tgt:
            t.ingredients['BIND'] = 1e-20 * sum(t.ingredients.values())
        return tgt
Example #6
0
 def run(self):
     'Run the dilutions and QPCR setup'
     # Setup qPCRs
     #self.jobq.dump()
     self.idler(100000)
     self.trp.e.waitpgm()		# May still need to wait for PTC to complete before able to do final jobs
     self.idler(100000)
     
     if self.jobq.len()>0:
         logging.error( "Blocked jobs remain on queue:",fatal=False)
         self.jobq.dump()
         assert False
     worklist.comment('Starting qPCR setup')
     for p in self.allprimers():
         # Build list of relevant entries
         ind=[ i for i in range(len(self.dilProds)) if p in self.primers[i]]
         self.trp.runQPCR(src=[self.dilProds[i] for i in ind],vol=self.volume,primers=[p],nreplicates=[self.nreplicates[i] for i in ind])
Example #7
0
    def runT7Setup(self,src,vol,srcdil,ligands=None,tgt=None,rlist=["MT7"]):
        if isinstance(ligands,bool):
            if not ligands:
                ligands=None
            else:
                assert('runT7Setup:  ligands arg should be ligand samples or None, not True')
                
        [ligands,src,tgt,srcdil]=listify([ligands,src,tgt,srcdil])
        for i in range(len(src)):
            if tgt[i] is None:
                if ligands[i] is not None:
                    tgt[i]=Sample("%s.T+%s"%(src[i].name,ligands[i].name),decklayout.SAMPLEPLATE)
                else:
                    tgt[i]=Sample("%s.T-"%src[i].name,decklayout.SAMPLEPLATE)


        worklist.comment("runT7: source=%s"%[str(s) for s in src])

        rvols=[reagents.getsample(x).conc.volneeded(vol) for x in rlist]
        rtotal=sum(rvols)
        sourcevols=[vol*1.0/s for s in srcdil]
        ligandvols=[0 for s in srcdil]
        watervols=[0 for s in srcdil]
        for i in range(len(srcdil)):
            if ligands[i] is not None:
                ligandvols[i]=vol*1.0/ligands[i].conc.dilutionneeded()
                watervols[i]=vol-ligandvols[i]-sourcevols[i]-rtotal
            else:
                watervols[i]=vol-sourcevols[i]-rtotal

        if any([w<-.01 for w in watervols]):
            logging.error("runT7Setup: Negative amount of water required: "+str(watervols))

        if sum(watervols)>0.01:
            self.e.multitransfer(watervols,decklayout.WATER,tgt)
        for ir in range(len(rlist)):
            self.e.multitransfer([rvols[ir] for s in tgt],reagents.getsample(rlist[ir]),tgt)
        for i in range(len(ligands)):
            if ligandvols[i] > 0.01:
                self.e.transfer(ligandvols[i],ligands[i],tgt[i])
        for i in range(len(src)):
            self.e.transfer(sourcevols[i],src[i],tgt[i])
        self.e.shakeSamples(tgt,returnPlate=True)
        for t in tgt:
            t.ingredients['BIND']=1e-20*sum(t.ingredients.values())
        return tgt
Example #8
0
    def runQPCR(self, src, vol, srcdil, primers=["A", "B"], nreplicates=1):
        ## QPCR setup
        worklist.comment("runQPCR: primers=%s, source=%s" %
                         ([p for p in primers], [s.name for s in src]))
        [src, vol, srcdil,
         nreplicates] = listify([src, vol, srcdil, nreplicates])
        self.e.shakeSamples(src, returnPlate=True)

        # Build a list of sets to be run
        torun = []
        for repl in range(max(nreplicates)):
            for p in primers:
                for i in range(len(src)):
                    if nreplicates[i] <= repl:
                        continue
                    if repl == 0:
                        sampname = "%s.Q%s" % (src[i].name, p)
                    else:
                        sampname = "%s.Q%s.%d" % (src[i].name, p, repl + 1)
                    s = Sample(sampname, decklayout.QPCRPLATE)
                    torun = torun + [(src[i], s, p, vol[i])]

        # Fill the master mixes
        dil = {}
        for p in primers:
            mname = "MQ%s" % p
            if not reagents.isReagent(mname):
                reagents.add(name=mname, conc=15.0 / 9.0, extraVol=30)
            mq = reagents.getsample(mname)
            t = [a[1] for a in torun if a[2] == p]
            v = [a[3] / mq.conc.dilutionneeded() for a in torun if a[2] == p]
            self.e.multitransfer(v, mq, t, (False, False))
            dil[p] = 1.0 / (1 - 1 / mq.conc.dilutionneeded())

        # Add the samples
        self.e.sanitize()  # In case we are aligned
        for a in torun:
            s = a[0]
            t = a[1]
            p = a[2]
            v = a[3] / dil[p]
            t.conc = None  # Concentration of master mix is irrelevant now
            self.e.transfer(v, s, t)

        return [a[1] for a in torun]
Example #9
0
    def pgm(self):
        self.q = QSetup(self, maxdil=16, debug=False, mindilvol=100)
        self.e.addIdleProgram(self.q.idler)

        if self.doqpcr:
            self.q.addReferences(dstep=10, primers=self.qprimers, ref=reagents.getsample("BT5310"))

        print("### Barcoding #### (%.0f min)" % (clock.elapsed() / 60.0))
        bcout = self.barcoding(names=[x['name'] for x in self.inputs], left=[x['left'] for x in self.inputs],
                               right=[x['right'] for x in self.inputs])

        for i in range(len(self.inputs)):
            x = self.inputs[i]
            if 'bconc' in x and x['bconc'] is not None:
                print("Resetting concentration of %s from expected %.1f to bconc setting of %.1f nM" % \
                      (x['name'], bcout[i].conc.stock, x['bconc']))
                bcout[i].conc.stock = x['bconc']

        print("### qPCR #### (%.0f min)" % (clock.elapsed() / 60.0))
        self.q.run(confirm=False, enzName='EvaGreen')
        print("### qPCR Done #### (%.0f min)" % (clock.elapsed() / 60.0))
        print("### Final PCR Done #### (%.0f min)" % (clock.elapsed() / 60.0))
        worklist.flushQueue()

        if all(['bconc' in x and x['bconc'] is not None for x in self.inputs]):
            print("### Mixdown #### (%.0f min)" % (clock.elapsed() / 60.0))
            worklist.flushQueue()
            worklist.comment('Start mixdown only at this point')
            self.e.sanitize(force=True)
            # mixdown = self.mix(bcout, [x['weight'] for x in self.inputs])
            # Set default mix number to 1
            for x in self.inputs:
                if 'mix' not in x:
                    x['mix']=1
            mixes=set([x['mix'] for x in self.inputs])
            for m in mixes:
                sel=[ i for i in range(len(self.inputs)) if self.inputs[i]['mix']==m] 
                print("sel=",sel)
                mixdown = self.mix([bcout[i] for i in sel], [self.inputs[i]['weight'] for i in sel],prefix="Mix%d_"%m)
                mixdown.name="Mix%d_Final"%m
            # self.q.addSamples(mixdown, needDil=mixdown.conc.stock * 1e-9 / self.qconc, primers=self.qprimers,nreplicates=3)
        else:
            print("### Not doing mixdown as bconc not set in all inputs")
Example #10
0
    def run(self,confirm=False,enzName="EvaUSER"):
        'Run the dilutions and QPCR setup'
        # Setup qPCRs
        #self.jobq.dump()
        self.idler(100000)
        self.trp.e.waitpgm()		# May still need to wait for PTC to complete before able to do final jobs
        self.idler(100000)
        worklist.flushQueue()
        if self.jobq.len()>0:
            logging.error( "Blocked jobs remain on queue:",fatal=False)
            self.jobq.dump()
            assert False

        if confirm:
            worklist.userprompt('Continue to setup qPCR')

        worklist.comment('Starting qPCR setup')
        self.trp.e.sanitize(force=True)
        for p in self.allprimers():
            # Build list of relevant entries
            ind=[ i for i in range(len(self.dilProds)) if p in self.primers[i]]
            self.trp.runQPCR(src=[self.dilProds[i] for i in ind],vol=self.volume,primers=[p],nreplicates=[self.nreplicates[i] for i in ind],enzName=enzName)
Example #11
0
    def runT7Setup(self,theo,src,vol,srcdil,tgt=None,rlist=["MT7"]):
        [theo,src,tgt,srcdil]=listify([theo,src,tgt,srcdil])
        for i in range(len(src)):
            if tgt[i] is None:
                if theo[i]:
                    tgt[i]=Sample("%s.T+"%src[i].name,decklayout.SAMPLEPLATE)
                else:
                    tgt[i]=Sample("%s.T-"%src[i].name,decklayout.SAMPLEPLATE)


        worklist.comment("runT7: source=%s"%[str(s) for s in src])

        rvols=[reagents.getsample(x).conc.volneeded(vol) for x in rlist]
        rtotal=sum(rvols)
        sourcevols=[vol*1.0/s for s in srcdil]
        if any(theo):
            theovols=[(vol*1.0/reagents.getsample("Theo").conc.dilutionneeded() if t else 0) for t in theo]
            watervols=[vol-theovols[i]-sourcevols[i]-rtotal for i in range(len(src))]
        else:
            watervols=[vol-sourcevols[i]-rtotal for i in range(len(src))]

        if any([w<-1e-10 for w in watervols]):
            print "runT7Setup: Negative amount of water required: ",watervols
            assert False
        if sum(watervols)>0.01:
            self.e.multitransfer(watervols,decklayout.WATER,tgt)
        for ir in range(len(rlist)):
            self.e.multitransfer([rvols[ir] for s in tgt],reagents.getsample(rlist[ir]),tgt)
        if any(theo):
            self.e.multitransfer([tv for tv in theovols if tv>0.01],reagents.getsample("Theo"),[tgt[i] for i in range(len(theovols)) if theovols[i]>0],ignoreContents=True)
        for i in range(len(src)):
            self.e.transfer(sourcevols[i],src[i],tgt[i])
        self.e.shakeSamples(tgt,returnPlate=True)
        for t in tgt:
            t.ingredients['BIND']=1e-20*sum(t.ingredients.values())
        return tgt