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)
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)
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]
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)
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
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])
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
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]
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")
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)
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