def validateAndInsertCTFData(imgdata, ctfvalues, rundata, rundir, fftpath=None, fftfreq=None): """ function to insert CTF values in database """ apDisplay.printMsg("Committing ctf parameters for " + apDisplay.short(imgdata['filename']) + " to database") if ctfvalues is None or not 'defocus2' in ctfvalues: apDisplay.printWarning("No ctf values") return False ### convert to common convention ctfvalues = convertDefociToConvention(ctfvalues) ### check to make sure parameters are valid isvalid = checkParams(ctfvalues) if isvalid is False: apDisplay.printWarning("Bad CTF values, insert but not create images") ### run the main CTF display program opimagedir = os.path.join(rundir, "opimages") if isvalid is True: oldctfvalues = ctfvalues.copy() ctfvalues = runCTFdisplayTools(imgdata, ctfvalues, opimagedir, fftpath, fftfreq) # check if image creation failed if ctfvalues is None: ctfvalues = oldctfvalues ### clean rundir from all entries: if not rundir.endswith("/"): rundir += "/" for key in ctfvalues.keys(): if isinstance(ctfvalues[key], str) and ctfvalues[key].startswith(rundir): ctfvalues[key] = ctfvalues[key].replace(rundir, "") ### time to insert ctfq = appiondata.ApCtfData() ctfq['acerun'] = rundata ctfq['image'] = imgdata if debug is True: apDisplay.printMsg("CTF data values") print ctfvalues for key in ctfq.keys(): if key in ctfvalues: ctfq[key] = ctfvalues[key] if debug is True: apDisplay.printMsg("%s :: %s" % (key, ctfvalues[key])) elif debug is True: apDisplay.printMsg("SKIPPING %s :: %s" % (key, ctfvalues[key])) ctfdb.printCtfData(ctfq) ctfq.insert() return
def validateAndInsertCTFData(imgdata, ctfvalues, rundata, rundir, fftpath=None, fftfreq=None): """ function to insert CTF values in database """ apDisplay.printMsg("Committing ctf parameters for " +apDisplay.short(imgdata['filename'])+" to database") if ctfvalues is None or not 'defocus2' in ctfvalues: apDisplay.printWarning("No ctf values") return False ### convert to common convention ctfvalues = convertDefociToConvention(ctfvalues) ### check to make sure parameters are valid isvalid = checkParams(ctfvalues) if isvalid is False: apDisplay.printWarning("Bad CTF values, insert but not create images") ### run the main CTF display program opimagedir = os.path.join(rundir, "opimages") if isvalid is True: oldctfvalues = ctfvalues.copy() ctfvalues = runCTFdisplayTools(imgdata, ctfvalues, opimagedir, fftpath, fftfreq) # check if image creation failed if ctfvalues is None: ctfvalues = oldctfvalues ### clean rundir from all entries: if not rundir.endswith("/"): rundir += "/" for key in ctfvalues.keys(): if isinstance(ctfvalues[key], str) and ctfvalues[key].startswith(rundir): ctfvalues[key] = ctfvalues[key].replace(rundir, "") ### time to insert ctfq = appiondata.ApCtfData() ctfq['acerun'] = rundata ctfq['image'] = imgdata if debug is True: apDisplay.printMsg("CTF data values") print ctfvalues for key in ctfq.keys(): if key in ctfvalues: ctfq[key] = ctfvalues[key] if debug is True: apDisplay.printMsg("%s :: %s"%(key, ctfvalues[key])) elif debug is True: apDisplay.printMsg("SKIPPING %s :: %s"%(key, ctfvalues[key])) ctfdb.printCtfData(ctfq) ctfq.insert() return
def convertDefociToConvention(self, ctfdata): ctfdb.printCtfData(ctfdata) initdefocusratio = ctfdata['defocus2']/ctfdata['defocus1'] # program specific corrections? self.angle = ctfdata['angle_astigmatism'] #angle = round(self.angle/2.5,0)*2.5 #by convention: abs(ctfdata['defocus1']) < abs(ctfdata['defocus2']) if abs(ctfdata['defocus1']) > abs(ctfdata['defocus2']): # incorrect, need to shift angle by 90 degrees apDisplay.printWarning("|def1| > |def2|, flipping defocus axes") self.defocus1 = ctfdata['defocus2'] self.defocus2 = ctfdata['defocus1'] self.angle += 90 else: # correct, ratio > 1 self.defocus1 = ctfdata['defocus1'] self.defocus2 = ctfdata['defocus2'] if self.defocus1 < 0 and self.defocus2 < 0: apDisplay.printWarning("Negative defocus values, taking absolute value") self.defocus1 = abs(self.defocus1) self.defocus2 = abs(self.defocus2) self.defdiff = self.defocus1 - self.defocus2 #elliptical ratio is ratio of zero locations NOT defocii self.defocusratio = self.defocus2/self.defocus1 self.ellipratio = ctftools.defocusRatioToEllipseRatio(self.defocus1, self.defocus2, self.initfreq, self.cs, self.volts, self.ampcontrast) # get angle within range -90 < angle <= 90 while self.angle > 90: self.angle -= 180 while self.angle < -90: self.angle += 180 apDisplay.printColor("Final params: def1: %.2e | def2: %.2e | angle: %.1f | defratio %.2f"% (self.defocus1, self.defocus2, self.angle, self.defocusratio), "cyan") perdiff = abs(self.defocus1-self.defocus2)/abs(self.defocus1+self.defocus2) apDisplay.printMsg("Defocus Astig Percent Diff %.2f -- %.3e, %.3e" %(perdiff*100,self.defocus1,self.defocus2)) return