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
	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