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