def numberParticlesInStack(stackname, startnum=0, verbose=True): ### new faster methond apImagicFile.numberStackFile(stackname, startnum=0) return # store the particle number in the stack header # NOTE!!! CONFORMS TO EMAN CONVENTION, STARTS AT 0!!! import EMAN t0 = time.time() apDisplay.printMsg("saving particle numbers to stack header") n = EMAN.fileCount(stackname)[0] im = EMAN.EMData() i = 0 back = "\b\b\b\b\b\b\b" while i < n: j = startnum + i im.readImage(stackname, i) im.setNImg(j) im.writeImage(stackname, i) if verbose is True and i % 100 == 0: sys.stderr.write(back + back + back + str(j) + " of " + str(n)) i += 1 sys.stderr.write("\n") apDisplay.printMsg("finished in " + apDisplay.timeString(time.time() - t0)) return
def writeImageToImage(instack, inn, outstack, outn=-1, particles=0): import EMAN # copy an image from an input stack to another one img = EMAN.EMData() img.readImage(instack, inn) img.setNImg(particles) img.writeImage(outstack, outn) return
def writeBlankImage(outfile, boxsize, place, type=None): import EMAN a = EMAN.EMData() a.setSize(boxsize, boxsize) a.zero() if type == 'spider': a.writeImage(outfile, place, EMAN.EMData.SINGLE_SPIDER) else: a.writeImage(outfile, place) return
def writeStackParticlesToFile(stackname, filename): import EMAN # write out the particle numbers from imagic header to a file # NOTE!!! CONFORMS TO EMAN CONVENTION, STARTS AT 0!!! apDisplay.printMsg("saving list of saved particles to:") apDisplay.printMsg(filename) f = open(filename, 'w') n = EMAN.fileCount(stackname)[0] im = EMAN.EMData() for i in range(n): im.readImage(stackname, i) f.write(str(im.NImg()) + "\n") f.close() return
def getClassInfo(classes): import EMAN # read a classes.*.img file, get # of images imgnum, imgtype = EMAN.fileCount(classes) img = EMAN.EMData() img.readImage(classes, 0, 1) # for projection images, get eulers projeulers = [] for i in range(imgnum): img.readImage(classes, i, 1) e = img.getEuler() alt = e.thetaMRC() * 180. / math.pi az = e.phiMRC() * 180. / math.pi phi = e.omegaMRC() * 180. / math.pi eulers = [alt, az, phi] if i % 2 == 0: projeulers.append(eulers) return projeulers
def makeClassAverages(lst, outputstack, e, mask): import EMAN #align images in class print "creating class average from", lst, "to", outputstack images = EMAN.readImages(lst, -1, -1, 0) for image in images: image.rotateAndTranslate() if image.isFlipped(): image.hFlip() #make class average avg = EMAN.EMData() avg.makeMedian(images) #write class average avg.setRAlign(e) avg.setNImg(len(images)) avg.applyMask(mask, 0) avg.writeImage(outputstack, -1)
def checkStackNumbering(stackname): import EMAN # check that the numbering is stored in the NImg parameter apDisplay.printMsg("checking that original stack is numbered") n = EMAN.fileCount(stackname)[0] im = EMAN.EMData() im.readImage(stackname, n - 1) # if last particle is not numbered with same value as # of particles, # renumber the entire stack if n - 1 != im.NImg(): apDisplay.printWarning( "Original stack is not numbered! numbering now...") # check that the stack exists in a writable directory and is not read-only if os.access(stackname, os.W_OK) is True: numberParticlesInStack(stackname, startnum=0, verbose=True) else: apDisplay.printWarning( "old stack header exists in a READ-only directory and cannot be numbered according to EMAN" ) return
def makeClassAverages(lst, outputstack, classdata, params): #align images in class images = EMAN.readImages(lst, -1, -1, 0) for image in images: image.rotateAndTranslate() if image.isFlipped(): image.hFlip() #make class average avg = EMAN.EMData() avg.makeMedian(images) #write class average e = EMAN.Euler() alt = classdata['euler1'] * math.pi / 180 az = classdata['euler2'] * math.pi / 180 phi = 0.0 e.setAngle(alt, az, phi) avg.setRAlign(e) avg.setNImg(len(images)) avg.applyMask(params['mask'], 0) avg.writeImage(outputstack, -1)
# get eulers from proj.img file import sys, os from math import pi try: import EMAN except ImportError: print "EMAN module did not get imported" if __name__ == "__main__": if len(sys.argv) !=3: print "Usage: getProjEulers.py <infile> <outfile>\n" sys.exit(1) projfile = sys.argv[1] outfile = sys.argv[2] out = open(outfile, "w") count,imgtype = EMAN.fileCount(projfile) imgs = EMAN.EMData() imgs.readImage(projfile,0,1) for i in range(count): imgs.readImage(projfile,i,1) e = imgs.getEuler() alt = e.alt()*180./pi az = e.az()*180./pi phi = e.phi()*180./pi out.write("%i\t%f\t%f\t%f\n" % (i,alt,az,phi)) out.close()
#!/usr/bin/env python # this will save the particle stack number into the header of a stack. # use this if you want to run cenalignint, and keep track of the particles. # NOTE!!! CONFORMS TO EMAN CONVENTION, STARTS AT 0!!!! import sys try: import EMAN except ImportError: print "EMAN module did not get imported" if __name__ == "__main__": if len(sys.argv) < 2: print "usage: renumber.py [filename]" sys.exit() filename = sys.argv[1] n = EMAN.fileCount(filename)[0] im = EMAN.EMData() for i in range(n): im.readImage(filename, i) im.setNImg(i) im.writeImage(filename, i) print i
def start(self): self.params['outputstack'] = os.path.join(self.params['rundir'], self.params['stackname']) particles, self.params['refineiter'] = getParticleInfo( self.params['reconid'], self.params['iter']) stackdata = particles[0]['particle']['stack'] stack = os.path.join(stackdata['path']['path'], stackdata['name']) classes, cstats = determineClasses(particles) rejectlst = [] if self.params['sigma'] is not None: cutoff = cstats[ 'meanquality'] + self.params['sigma'] * cstats['stdquality'] apDisplay.printMsg("Cutoff = " + str(cutoff)) rejectlst = self.removePtclsByQualityFactor( particles, rejectlst, cutoff) if self.params['avgjump'] is not None: rejectlst = self.removePtclsByJumps(particles, rejectlst) if self.params['rejectlst']: rejectlst = removePtclsByLst(rejectlst, self.params) classkeys = classes.keys() classkeys.sort() classnum = 0 totalptcls = 0 keepfile = open('keep.lst', 'w') keepfile.write('#LST\n') reject = open('reject.lst', 'w') reject.write('#LST\n') apDisplay.printMsg("Processing classes") #loop through classes for key in classkeys: # file to hold particles of this class clsfile = open('clstmp.lst', 'w') clsfile.write('#LST\n') classnum += 1 if classnum % 10 == 1: apDisplay.printMsg( str(classnum) + " of " + (str(len(classkeys)))) images = EMAN.EMData() #loop through particles in class nptcls = 0 for ptcl in classes[key]['particles']: if ptcl['mirror']: mirror = 1 else: mirror = 0 rot = ptcl['euler3'] rot = rot * math.pi / 180 if ptcl['particle']['particleNumber'] not in rejectlst: l = '%d\t%s\t%f,\t%f,%f,%f,%d\n' % ( ptcl['particle']['particleNumber'] - 1, stack, ptcl['quality_factor'], rot, ptcl['shiftx'], ptcl['shifty'], mirror) keepfile.write(l) clsfile.write(l) totalptcls += 1 nptcls += 1 else: reject.write('%d\t%s\t%f,\t%f,%f,%f,%d\n' % (ptcl['particle']['particleNumber'] - 1, stack, ptcl['quality_factor'], rot, ptcl['shiftx'], ptcl['shifty'], mirror)) #if ptcl['quality_factor']>cstats['meanquality']+3*cstats['stdquality']: # high.write('%d\t%s\t%f,\t%f,%f,%f,%d\n' % (ptcl['particle']['particleNumber']-1, # stack,ptcl['quality_factor'],rot,ptcl['shiftx'],ptcl['shifty'],mirror)) clsfile.close() if nptcls < 1: continue if self.params['skipavg'] is False: makeClassAverages('clstmp.lst', self.params['outputstack'], classes[key], self.params) if self.params['eotest'] is True: self.makeEvenOddClasses('clstmp.lst', classes[key]) apDisplay.printMsg("\n") reject.close() keepfile.close() os.remove('clstmp.lst') # make 3d density file if specified: if self.params['make3d'] is not None: self.params['make3d'] = os.path.basename(self.params['make3d']) outfile = os.path.join(self.params['rundir'], self.params['make3d']) apEMAN.make3d(self.params['stackname'], outfile, sym=self.params['sym'], mode=self.params['mode'], hard=self.params['hard']) apEMAN.executeEmanCmd("proc3d %s %s mask=%d norm" % (outfile, outfile, self.params['mask'])) if self.params['eotest'] is True: apEMAN.make3d(self.params['oddstack'], "odd.mrc", sym=self.params['sym'], mode=self.params['mode'], hard=self.params['hard']) apEMAN.make3d(self.params['evenstack'], "even.mrc", sym=self.params['sym'], mode=self.params['mode'], hard=self.params['hard']) apEMAN.executeEmanCmd("proc3d odd.mrc even.mrc fsc=fsc.eotest") if os.path.exists(outfile): # run rmeasure apix = apStack.getStackPixelSizeFromStackId(self.params['stackid']) box = apVolume.getModelDimensions(outfile) apDisplay.printMsg('inserting density into database') symdata = apSymmetry.findSymmetry(self.params['sym']) if not symdata: apDisplay.printError('no symmetry associated with this model') modq = appiondata.Ap3dDensityData() modq['session'] = apStack.getSessionDataFromStackId( self.params['stackid']) modq['name'] = self.params['make3d'] modq['path'] = appiondata.ApPathData( path=os.path.abspath(self.params['rundir'])) modq['boxsize'] = box modq['mask'] = self.params['mask'] modq['pixelsize'] = apix fscres = apRecon.getResolutionFromFSCFile('fsc.eotest', box, apix, msg=True) modq['resolution'] = fscres modq['rmeasure'] = apRecon.runRMeasure(apix, outfile) modq['md5sum'] = apFile.md5sumfile(outfile) modq['maxjump'] = self.params['avgjump'] modq['sigma'] = self.params['sigma'] modq['hard'] = self.params['hard'] modq['symmetry'] = symdata modq['refineIter'] = self.params['refineiter'] if self.params['commit'] is True: modq.insert() apChimera.filterAndChimera(outfile, res=fscres, apix=apix, box=box, chimtype='snapshot', zoom=self.params['zoom'], sym=self.params['sym'], mass=self.params['mass']) else: apDisplay.printError( 'no 3d volume was generated - check the class averages:') apDisplay.printError(self.params['stackname']) apDisplay.printError( 'hard may be set too high, or avg euler jump set too low for the # of particles' ) stackstr = str(stackdata.dbid) reconstr = str(self.params['reconid']) apDisplay.printColor( "Make a new stack with only non-jumpers:\n" + "subStack.py --projectid=" + str(self.params['projectid']) + " -s " + stackstr + " \\\n " + " -k " + os.path.join(self.params['rundir'], "keep.lst") + " \\\n " + " -d 'recon " + reconstr + " sitters' -n sitters" + reconstr + " -C ", "purple")
fsp = fsp.split('.')[0] + '.good.lst' f = open(fsp, 'w') for l in lines: d = l.strip().split() if len(d) < 3: f.write(l) continue if d[3][-1] == '1': f.write(l) f.close() n = EMAN.fileCount(fsp)[0] classnamepath = fsp.split('.')[0] + '.dir' if not os.path.exists(classnamepath): os.mkdir(classnamepath) b = EMAN.EMData() b.readImage(fsp, 0) e = b.getEuler() a = EMAN.EMData() if format == "eman" or format == "imagic": outname = "aligned.hed" else: outname = "aligned.spi" startn = 1 if params['noproj'] is True: startn = 0 print "creating aligned stack" for i in range(startn, n): a.readImage(fsp, i)
rap = float(s[1]) elif (s[0] == 'norm'): norm = int(s[1]) elif (s[0] == 'searchx'): searchx = int(s[1]) elif (s[0] == 'searchy'): searchy = int(s[1]) elif (s[0] == 'searchz'): searchz = int(s[1]) else: print("Unknown argument " + a) exit(1) print target, probe targetMRC = EMAN.EMData() targetMRC.readImage(argv[1], -1) targetMean = targetMRC.Mean() targetSigma = targetMRC.Sigma() print "Target Information" print " mean: %f" % (targetMean) print " sigma: %f" % (targetSigma) target_xsize = targetMRC.xSize() target_ysize = targetMRC.ySize() target_zsize = targetMRC.zSize() if (target_xsize != target_ysize != target_zsize) or (target_xsize % 2 == 1): print "The density map must be even and cubic. Terminating." sys.exit() box = target_xsize