def createParticleDataFile(self, iteration, package_database_object): ''' puts all relevant particle information into a single text file that can be read by the uploader ''' os.chdir(self.projmatchpath) ### read particle info paramfile = os.path.join(self.projmatchpath, "recon_it%03d_data.star"%(iteration)) parttree = self.parseParticleDataIterationFile(paramfile) ### write data in appion format to input file for uploading to the database partdatafilepath = os.path.join(self.resultspath, "particle_data_%s_it%.3d_vol001.txt" % (self.params['timestamp'], iteration)) particledataf = open(partdatafilepath, "w") particledataf.write("### column info: ") particledataf.write("(1) particle number ") particledataf.write("(2) phi ") particledataf.write("(3) theta ") particledataf.write("(4) omega ") particledataf.write("(5) shiftx ") particledataf.write("(6) shifty ") particledataf.write("(7) mirror ") particledataf.write("(8) 3D reference # ") particledataf.write("(9) 2D class # ") particledataf.write("(10) quality factor ") particledataf.write("(11) kept particle ") particledataf.write("(12) postRefine kept particle \n") ### add each particle to the file count = 0 for partnum, partdict in parttree.items(): count += 1 if count % 500 == 0: apDisplay.printMsg("Wrote %d particles to Particle Data File: %s"%(count,partdatafilepath)) phi, theta, omega = apEulerCalc.convertFrealignEulersTo3DEM(float(partdict['angleRot']), float(partdict['angleTilt']), float(partdict['anglePsi'])) particledataf.write("%.6d\t" % partnum) ### NOTE: IT IS IMPORTANT TO START WITH 1, OTHERWISE STACKMAPPING IS WRONG!!! particledataf.write("%.6f\t" % phi) particledataf.write("%.6f\t" % theta) particledataf.write("%.6f\t" % omega) particledataf.write("%.6f\t" % float(partdict['originX'])) particledataf.write("%.6f\t" % float(partdict['originY'])) particledataf.write("%.6d\t" % 0) particledataf.write("%.6d\t" % 1) particledataf.write("%.6d\t" % 0) particledataf.write("%.6d\t" % 1) # DOn't think this applies to Relion? #if partdict['phase_residual'] > package_database_object['thresh']: #particledataf.write("%.6f\t" % 1) #else: #particledataf.write("%.6f\t" % 1) #TODO: this should be false??? particledataf.write("%.6f\t" % 1) particledataf.write("%.6f\n" % 1) ### close the new file particledataf.close() os.chdir(self.params['rundir']) return