def runAceCorrect(imgdict,params): imgname = imgdict['filename'] imgpath = os.path.join(imgdict['session']['image path'], imgname+'.mrc') voltage = (imgdict['scope']['high tension']) apix = apDatabase.getPixelSize(imgdict) ctfvalues = ctfdb.getBestCtfByResolution(imgdata) conf = ctfdb.calculateConfidenceScore(bestctfvalue) ctdimname = imgname ctdimpath = os.path.join(params['rundir'],ctdimname) print "Corrected Image written to " + ctdimpath #pdb.set_trace() acecorrectcommand=("ctfcorrect1('%s', '%s', '%.32f', '%.32f', '%f', '%f', '%f');" % \ (imgpath, ctdimpath, ctfvalues['defocus1'], ctfvalues['defocus2'], -ctfvalues['angle_astigmatism'], voltage, apix)) print acecorrectcommand try: matlab = pymat.open("matlab -nosplash") except: apDisplay.environmentError() raise pymat.eval(matlab, acecorrectcommand) pymat.close(matlab) return
def phaseFlipAceTwo(self, inimgpath, imgdata): apix = apDatabase.getPixelSize(imgdata) bestctfvalue = self.getBestCtfValue(imgdata, True) if bestctfvalue is None: apDisplay.printWarning("No ctf estimation for current image") self.badprocess = True return None if bestctfvalue['acerun'] is None: apDisplay.printWarning("No ctf runid for current image") self.badprocess = True return None if bestctfvalue['ctfvalues_file'] is None: # Since method = ace2 requires a ctfvalues_file, # create file from database values ### cannot use ACE2 correction without CS value in database if not 'cs' in bestctfvalue: apDisplay.printMsg('No spherical abberation value in database, skipping image') self.badprocess = True return None # create ctfvalues_file from ctf run ctfvaluesfile = "tmp_ctfvaluesfile.txt" if abs(bestctfvalue['defocus1']) < abs(bestctfvalue['defocus2']): ## this is the canonical form df1 = abs(bestctfvalue['defocus1']) df2 = abs(bestctfvalue['defocus2']) angast = bestctfvalue['angle_astigmatism'] else: apDisplay.printWarning("|def1| > |def2|, flipping defocus axes") df1 = abs(bestctfvalue['defocus2']) df2 = abs(bestctfvalue['defocus1']) angast = bestctfvalue['angle_astigmatism'] + 90 amp = bestctfvalue['amplitude_contrast'] kv = imgdata['scope']['high tension']/1000 cs = self.getCS(bestctfvalue)/1000 conf = ctfdb.calculateConfidenceScore(bestctfvalue) if os.path.isfile(ctfvaluesfile): os.remove(ctfvaluesfile) f = open(ctfvaluesfile,'w') f.write("\tFinal Params for image: %s.mrc\n"%imgdata['filename']) # acecorrect definition is opposite to database f.write("\tFinal Defocus (m,m,deg): %.6e %.6e %.6f\n"%(df1,df2,-angast)) f.write("\tAmplitude Contrast: %.6f\n"%amp) f.write("\tVoltage (kV): %.6f\n"%kv) f.write("\tSpherical Aberration (mm): %.6e\n"%cs) f.write("\tAngstroms per pixel: %.6e\n"%apix) f.write("\tConfidence: %.6e\n"%conf) f.close() # use ace2 ctfvalues file else: ctfvaluesfile = os.path.join(bestctfvalue['acerun']['path']['path'], bestctfvalue['ctfvalues_file']) ctfvaluesfilesplit = os.path.splitext(ctfvaluesfile) while ctfvaluesfilesplit[1] != '.mrc': ctfvaluesfilesplit = os.path.splitext(ctfvaluesfilesplit[0]) ctfvaluesfile = ctfvaluesfilesplit[0]+".mrc.ctf.txt" defocus1 = bestctfvalue['defocus1'] defocus2 = bestctfvalue['defocus2'] defocus = (defocus1+defocus2)/2.0*1.0e6 apDisplay.printMsg("using ctfvaluesfile: "+ctfvaluesfile) if not os.path.isfile(ctfvaluesfile): apDisplay.printError("ctfvaluesfile does not exist") ace2exe = self.getACE2Path() outfile = os.path.join(os.getcwd(),imgdata['filename']+".mrc.corrected.mrc") ace2cmd = (ace2exe+" -ctf %s -apix %.3f -img %s -out %s" % (ctfvaluesfile, apix, inimgpath,outfile)) if self.params['fliptype'] == "ace2image": ace2cmd += " -wiener 0.1" apDisplay.printMsg("ace2 command: "+ace2cmd) apDisplay.printMsg("phaseflipping entire micrograph with defocus "+str(round(defocus,3))+" microns") #apEMAN.executeEmanCmd(ace2cmd, showcmd = True) if self.params['verbose'] is True: ace2proc = subprocess.Popen(ace2cmd, shell=True) else: aceoutf = open("ace2.out", "a") aceerrf = open("ace2.err", "a") ace2proc = subprocess.Popen(ace2cmd, shell=True, stderr=aceerrf, stdout=aceoutf) ace2proc.wait() if self.stats['count'] <= 1: ### ace2 always crashes on first image??? .fft_wisdom file?? time.sleep(0.1) if self.params['verbose'] is True: ace2proc = subprocess.Popen(ace2cmd, shell=True) else: aceoutf = open("ace2.out", "a") aceerrf = open("ace2.err", "a") ace2proc = subprocess.Popen(ace2cmd, shell=True, stderr=aceerrf, stdout=aceoutf) ace2proc.wait() if self.params['verbose'] is False: aceoutf.close() aceerrf.close() if not os.path.isfile(outfile): apDisplay.printError("ACE 2 failed to create image file:\n%s" % outfile) return outfile
def checkCtfParams(self, imgdata): shortname = apDisplay.short(imgdata['filename']) ctfvalue = self.getBestCtfValue(imgdata) ### check if we have values and if we care if ctfvalue is None: return not self.checkRequireCtf() ### check that CTF estimation is above confidence threshold conf = ctfdb.calculateConfidenceScore(ctfvalue) if self.params['ctfcutoff'] and conf < self.params['ctfcutoff']: apDisplay.printColor(shortname+" is below confidence threshold (conf="+str(round(conf,3))+")\n","cyan") return False ### check resolution requirement for CTF fit at 0.8 threshold if self.params['ctfres80min'] is not None or self.params['ctfres80max'] is not None: if not 'resolution_80_percent' in ctfvalue.keys() or ctfvalue['resolution_80_percent'] is None: apDisplay.printColor("%s: no 0.8 resolution found"%(shortname), "cyan") return False if self.params['ctfres80max'] and ctfvalue['resolution_80_percent'] > self.params['ctfres80max']: apDisplay.printColor("%s is above resolution threshold %.2f > %.2f" %(shortname, ctfvalue['resolution_80_percent'], self.params['ctfres80max']), "cyan") return False if self.params['ctfres80min'] and ctfvalue['resolution_80_percent'] < self.params['ctfres80min']: apDisplay.printColor("%s is below resolution threshold %.2f > %.2f" %(shortname, ctfvalue['resolution_80_percent'], self.params['ctfres80min']), "cyan") return False ### check resolution requirement for CTF fit at 0.5 threshold if self.params['ctfres50min'] is not None or self.params['ctfres50max'] is not None: if not 'resolution_50_percent' in ctfvalue.keys() or ctfvalue['resolution_50_percent'] is None: apDisplay.printColor("%s: no 0.5 resolution found"%(shortname), "cyan") return False if self.params['ctfres50max'] and ctfvalue['resolution_50_percent'] > self.params['ctfres50max']: apDisplay.printColor("%s is above resolution threshold %.2f > %.2f" %(shortname, ctfvalue['resolution_50_percent'], self.params['ctfres50max']), "cyan") return False if self.params['ctfres50min'] and ctfvalue['resolution_50_percent'] < self.params['ctfres50min']: apDisplay.printColor("%s is below resolution threshold %.2f > %.2f" %(shortname, ctfvalue['resolution_50_percent'], self.params['ctfres50min']), "cyan") return False if self.params['mindefocus'] is not None or self.params['maxdefocus'] is not None: ### get best defocus value ### defocus should be in negative meters if ctfvalue['defocus2'] is not None and ctfvalue['defocus1'] != ctfvalue['defocus2']: defocus = (ctfvalue['defocus1'] + ctfvalue['defocus2'])/2.0 else: defocus = ctfvalue['defocus1'] defocus = -1.0*abs(defocus) ### assume defocus values are ALWAYS negative but mindefocus is greater than maxdefocus if self.params['mindefocus']: self.params['mindefocus'] = -abs( self.params['mindefocus'] ) if self.params['maxdefocus']: self.params['maxdefocus'] = -abs( self.params['maxdefocus'] ) if self.params['mindefocus'] and self.params['maxdefocus']: if self.params['maxdefocus'] > self.params['mindefocus']: mindef = self.params['mindefocus'] maxdef = self.params['maxdefocus'] self.params['mindefocus'] = maxdef self.params['maxdefocus'] = mindef ### skip micrograph that have defocus above or below min & max defocus levels if self.params['mindefocus'] and defocus > self.params['mindefocus']: #apDisplay.printColor(shortname+" defocus ("+str(round(defocus*1e6,2))+\ # " um) is less than mindefocus ("+str(self.params['mindefocus']*1e6)+" um)\n","cyan") return False if self.params['maxdefocus'] and defocus < self.params['maxdefocus']: #apDisplay.printColor(shortname+" defocus ("+str(round(defocus*1e6,2))+\ # " um) is greater than maxdefocus ("+str(self.params['maxdefocus']*1e6)+" um)\n","cyan") return False return True
def checkCtfParams(self, imgdata): shortname = apDisplay.short(imgdata['filename']) ctfvalue = self.getBestCtfValue(imgdata) ### check if we have values and if we care if ctfvalue is None: return not self.checkRequireCtf() ### check that CTF estimation is above confidence threshold conf = ctfdb.calculateConfidenceScore(ctfvalue) if self.params['ctfcutoff'] and conf < self.params['ctfcutoff']: apDisplay.printColor( shortname + " is below confidence threshold (conf=" + str(round(conf, 3)) + ")\n", "cyan") return False ### check resolution requirement for CTF fit at 0.8 threshold if self.params['ctfres80min'] is not None or self.params[ 'ctfres80max'] is not None: if not 'resolution_80_percent' in ctfvalue.keys( ) or ctfvalue['resolution_80_percent'] is None: apDisplay.printColor( "%s: no 0.8 resolution found" % (shortname), "cyan") return False if self.params['ctfres80max'] and ctfvalue[ 'resolution_80_percent'] > self.params['ctfres80max']: apDisplay.printColor( "%s is above resolution threshold %.2f > %.2f" % (shortname, ctfvalue['resolution_80_percent'], self.params['ctfres80max']), "cyan") return False if self.params['ctfres80min'] and ctfvalue[ 'resolution_80_percent'] < self.params['ctfres80min']: apDisplay.printColor( "%s is below resolution threshold %.2f > %.2f" % (shortname, ctfvalue['resolution_80_percent'], self.params['ctfres80min']), "cyan") return False ### check resolution requirement for CTF fit at 0.5 threshold if self.params['ctfres50min'] is not None or self.params[ 'ctfres50max'] is not None: if not 'resolution_50_percent' in ctfvalue.keys( ) or ctfvalue['resolution_50_percent'] is None: apDisplay.printColor( "%s: no 0.5 resolution found" % (shortname), "cyan") return False if self.params['ctfres50max'] and ctfvalue[ 'resolution_50_percent'] > self.params['ctfres50max']: apDisplay.printColor( "%s is above resolution threshold %.2f > %.2f" % (shortname, ctfvalue['resolution_50_percent'], self.params['ctfres50max']), "cyan") return False if self.params['ctfres50min'] and ctfvalue[ 'resolution_50_percent'] < self.params['ctfres50min']: apDisplay.printColor( "%s is below resolution threshold %.2f > %.2f" % (shortname, ctfvalue['resolution_50_percent'], self.params['ctfres50min']), "cyan") return False if self.params['mindefocus'] is not None or self.params[ 'maxdefocus'] is not None: ### get best defocus value ### defocus should be in negative meters if ctfvalue['defocus2'] is not None and ctfvalue[ 'defocus1'] != ctfvalue['defocus2']: defocus = (ctfvalue['defocus1'] + ctfvalue['defocus2']) / 2.0 else: defocus = ctfvalue['defocus1'] defocus = -1.0 * abs(defocus) ### assume defocus values are ALWAYS negative but mindefocus is greater than maxdefocus if self.params['mindefocus']: self.params['mindefocus'] = -abs(self.params['mindefocus']) if self.params['maxdefocus']: self.params['maxdefocus'] = -abs(self.params['maxdefocus']) if self.params['mindefocus'] and self.params['maxdefocus']: if self.params['maxdefocus'] > self.params['mindefocus']: mindef = self.params['mindefocus'] maxdef = self.params['maxdefocus'] self.params['mindefocus'] = maxdef self.params['maxdefocus'] = mindef ### skip micrograph that have defocus above or below min & max defocus levels if self.params[ 'mindefocus'] and defocus > self.params['mindefocus']: #apDisplay.printColor(shortname+" defocus ("+str(round(defocus*1e6,2))+\ # " um) is less than mindefocus ("+str(self.params['mindefocus']*1e6)+" um)\n","cyan") return False if self.params[ 'maxdefocus'] and defocus < self.params['maxdefocus']: #apDisplay.printColor(shortname+" defocus ("+str(round(defocus*1e6,2))+\ # " um) is greater than maxdefocus ("+str(self.params['maxdefocus']*1e6)+" um)\n","cyan") return False return True
def runAce(matlab, imgdata, params, showprev=True): imgname = imgdata['filename'] if showprev is True: bestctfvalue = ctfdb.getBestCtfByResolution(imgdata) if bestctfvalue: bestconf = ctfdb.calculateConfidenceScore(bestctfvalue) print ( "Prev best: '"+bestctfvalue['acerun']['name']+"', conf="+ apDisplay.colorProb(bestconf)+", defocus="+str(round(-1.0*abs(bestctfvalue['defocus1']*1.0e6),2))+ " microns" ) if params['uncorrected']: tmpname='temporaryCorrectedImage.mrc' imgarray = apDBImage.correctImage(imgdata) imgpath = os.path.join(params['rundir'],tmpname) apImage.arrayToMrc(imgarray, imgpath) print "processing", imgpath else: imgpath = os.path.join(imgdata['session']['image path'], imgname+'.mrc') nominal = None if params['nominal'] is not None: nominal=params['nominal'] elif params['newnominal'] is True: bestctfvalue = ctfdb.getBestCtfByResolution(imgdata) nominal = bestctfvalue['defocus1'] if nominal is None: nominal = imgdata['scope']['defocus'] if nominal is None or nominal > 0 or nominal < -15e-6: apDisplay.printWarning("Nominal should be of the form nominal=-1.2e-6"+\ " for -1.2 microns NOT:"+str(nominal)) #Neil's Hack #if 'autosample' in params and params['autosample']: # x = abs(nominal*1.0e6) # val = 1.585 + 0.057587 * x - 0.044106 * x**2 + 0.010877 * x**3 # resamplefr_override = round(val,3) # print "resamplefr_override=",resamplefr_override # pymat.eval(matlab, "resamplefr="+str(resamplefr_override)+";") pymat.eval(matlab,("dforig = %e;" % nominal)) if params['stig'] == 0: plist = (imgpath, params['outtextfile'], params['display'], params['stig'],\ params['medium'], -nominal, params['tempdir']+"/") acecmd = makeMatlabCmd("ctfparams = ace(",");",plist) else: plist = (imgname, imgpath, params['outtextfile'], params['opimagedir'], \ params['matdir'], params['display'], params['stig'],\ params['medium'], -nominal, params['tempdir']+"/", params['resamplefr']) acecmd = makeMatlabCmd("ctfparams = measureAstigmatism(",");",plist) #print acecmd pymat.eval(matlab,acecmd) matfile = os.path.join(params['matdir'], imgname+".mrc.mat") if params['stig']==0: savematcmd = "save('"+matfile+"','ctfparams','scopeparams', 'dforig');" pymat.eval(matlab,savematcmd) ctfvalue = pymat.get(matlab, 'ctfparams') ctfvalue=ctfvalue[0] printResults(params, nominal, ctfvalue) return ctfvalue