def runSymRelax(params, cls): print "processing class", cls #set up cls dir clsdir = cls.split('.')[0] + '.dir' os.mkdir(clsdir) # only align particles that passed coran clscmd = 'clstoaligned.py -c ' + cls + ' --format=eman --clean\n\n' # create projections of related symmetries projcmd = "python <<eof\n" projcmd += "import EMAN\n" projcmd += "map3d = EMAN.EMData()\n" projcmd += "map3d.readImage('../threed.%da.asym.mrc')\n" % ( params['iter'] - 1) projcmd += "proj = EMAN.EMData()\n" projcmd += "proj.readImage('proj.hed',%d)\n" % int(cls.split('.')[0][-4:]) projcmd += "e=proj.getEuler()\n" projcmd += "e.setSym('" + params['sym'] + "')\n" projcmd += "for s in range(e.getMaxSymEl()):\n" projcmd += " ef = e.SymN(s)\n" projcmd += " p = map3d.project3d(ef.alt(),ef.az(),ef.phi(),-1)\n" projcmd += " p.setRAlign(ef)\n" projcmd += " p.writeImage('%s',s)\n" % os.path.join(clsdir, 'proj.hed') projcmd += "eof\n\n" clscmd += projcmd ## if multiprocessor, don't run clstoaligned yet if params['proc'] == 1: #make aligned stack proc = subprocess.Popen(clscmd, shell=True) proc.wait() relaxcmd = clscmd # if no particles, continue params['nptcls'] = apEMAN.getNPtcls(cls, onlycoran=True) if params['nptcls'] == 0: print "WARNING!! no particles in class" return emancmd = ("cd %s\n" % clsdir) emancmd += "classesbymra aligned.hed proj.hed split mask=%d precen norot logit=1 maxshift=0 phase > classesbymra.log\n" % params[ 'mask'] for s in range(params['symnum']): emancmd += "proc2d aligned.hed classes.hed list=cls%04d.lst average\n" % s ## if multiprocessor, don't run yet if params['proc'] == 1: proc = subprocess.Popen(emancmd, shell=True) proc.wait() relaxcmd += emancmd return relaxcmd
def runSymRelax(params,cls): print "processing class",cls #set up cls dir clsdir=cls.split('.')[0]+'.dir' os.mkdir(clsdir) # only align particles that passed coran clscmd='clstoaligned.py -c ' + cls + ' --format=eman --clean\n\n' # create projections of related symmetries projcmd = "python <<eof\n" projcmd+= "import EMAN\n" projcmd+= "map3d = EMAN.EMData()\n" projcmd+= "map3d.readImage('../threed.%da.asym.mrc')\n" % (params['iter']-1) projcmd+= "proj = EMAN.EMData()\n" projcmd+= "proj.readImage('proj.hed',%d)\n" % int(cls.split('.')[0][-4:]) projcmd+= "e=proj.getEuler()\n" projcmd+= "e.setSym('"+params['sym']+"')\n" projcmd+= "for s in range(e.getMaxSymEl()):\n" projcmd+= " ef = e.SymN(s)\n" projcmd+= " p = map3d.project3d(ef.alt(),ef.az(),ef.phi(),-1)\n" projcmd+= " p.setRAlign(ef)\n" projcmd+= " p.writeImage('%s',s)\n" % os.path.join(clsdir,'proj.hed') projcmd+= "eof\n\n" clscmd+=projcmd ## if multiprocessor, don't run clstoaligned yet if params['proc'] == 1: #make aligned stack proc = subprocess.Popen(clscmd, shell=True) proc.wait() relaxcmd=clscmd # if no particles, continue params['nptcls']=apEMAN.getNPtcls(cls,onlycoran=True) if params['nptcls'] == 0: print "WARNING!! no particles in class" return emancmd = ("cd %s\n" % clsdir) emancmd+= "classesbymra aligned.hed proj.hed split mask=%d precen norot logit=1 maxshift=0 phase > classesbymra.log\n" % params['mask'] for s in range(params['symnum']): emancmd+="proc2d aligned.hed classes.hed list=cls%04d.lst average\n" % s ## if multiprocessor, don't run yet if params['proc'] == 1: proc = subprocess.Popen(emancmd, shell=True) proc.wait() relaxcmd+=emancmd return relaxcmd
f.close() ### order class averages in order of highest cc value sortccindex = [ i for (i, j) in sorted( enumerate(cclist), key=operator.itemgetter(1), reverse=True) ] classnamepath = os.path.join(clsdir, 'classes') for n in sortccindex: ## get N imgs clhcbasename = 'clhc_cls' + string.zfill(n + 1, 4) classname = os.path.join(classnamepath, clhcbasename + '.spi') ## save if has cc higher than cutoff if cclist[n] > params['ccCutoff']: cutofflist.append(n) nptcls = apEMAN.getNPtcls(classname, spider=True) apEMAN.writeImageToImage(os.path.join(clsdir, 'classes_avg.spi'), n, os.path.join(clsdir, 'sortavg.hed'), particles=nptcls) ### if multiple classes have values higher than cutoff if len(cutofflist) > 1: print "combining " + str(len(cutofflist)) + " of " + str( len(cclist)) + " classes" spilist = [] for n in cutofflist: clhcbasename = 'clhc_cls' + string.zfill(n + 1, 4) classname = os.path.join(classnamepath, clhcbasename + '.spi') spilist.append(classname) classname = os.path.join(classnamepath, 'combined.spi')
f.write(str(ccval)+'\n') avg.setNImg(10) avg.setRAlign(e) f.close() ### order class averages in order of highest cc value sortccindex = [i for (i,j) in sorted(enumerate(cclist),key=operator.itemgetter(1),reverse=True)] classnamepath = os.path.join(clsdir,'classes') for n in sortccindex: ## get N imgs clhcbasename = 'clhc_cls'+string.zfill(n+1,4) classname=os.path.join(classnamepath, clhcbasename+'.spi') ## save if has cc higher than cutoff if cclist[n] > params['ccCutoff']: cutofflist.append(n) nptcls=apEMAN.getNPtcls(classname,spider=True) apEMAN.writeImageToImage(os.path.join(clsdir,'classes_avg.spi'),n,os.path.join(clsdir,'sortavg.hed'),particles=nptcls) ### if multiple classes have values higher than cutoff if len(cutofflist) > 1: print "combining "+str(len(cutofflist))+" of "+str(len(cclist))+" classes" spilist=[] for n in cutofflist: clhcbasename = 'clhc_cls'+string.zfill(n+1,4) classname=os.path.join(classnamepath, clhcbasename+'.spi') spilist.append(classname) classname=os.path.join(classnamepath,'combined.spi') apEMAN.combineSpiParticleList(spilist,classname) clhcbasename='combined' # convert spider lst to EMAN lst
apEMAN.writeBlankImage('newavgs.even.hed',params['boxsize'],-1) apEMAN.writeBlankImage('newavgs.odd.hed',params['boxsize'],-1) continue avgname=os.path.join(clsdir,'classes.hed') averages=EMAN.readImages(avgname,-1,-1,0) projname=os.path.join(clsdir,'proj.hed') projections=EMAN.readImages(projname,-1,-1,0) for i in range(params['symnum']): e=projections[i].getEuler() projections[i].setNImg(-1) projections[i].writeImage('newavgs.hed',-1) #get N imgs clslstname = os.path.join(clsdir,'cls%04d.lst' % i) nptcls=apEMAN.getNPtcls(clslstname) averages[i].setNImg(nptcls) averages[i].setRAlign(e) averages[i].writeImage('newavgs.hed',-1) # convert spider lst to EMAN lst #convertlst = apEMAN.convertSpiderToEMAN(classname,clslist[cls]) if params['eotest'] is True: f = open(clslstname,'r') f.readline() lines=f.readlines() f.close() # set up even & odd lst files evenlst = os.path.join(clsdir, 'cls%04d.even.lst' % i)
def runCoranClass(params,cls): print "processing class",cls #set up cls dir clsdir=cls.split('.')[0]+'.dir' os.mkdir(clsdir) clscmd='clstoaligned.py -c ' + cls ## if multiprocessor, don't run clstoaligned yet if params['proc'] == 1: #make aligned stack proc = subprocess.Popen(clscmd, shell=True) proc.wait() corancmd=clscmd+'\n' coranbatch='coranfor'+cls.split('.')[0]+'.bat' #make spider batch params['nptcls'] = apEMAN.getNPtcls(cls) # if no particles, create an empty class average if params['nptcls'] == 0: # don't run clscmd, just make directory and empty average apEMAN.writeBlankImage(os.path.join(clsdir,'classes_avg.spi'),params['boxsize'],0,'spider') print "WARNING!! no particles in class" return # if only 3 particles or less, turn particles into the class averages elif params['nptcls'] < 4: #this is an ugly hack, just average the particles together, no ref-free # don't use mpi, just make directory with clscmd and average particles proc = subprocess.Popen(clscmd, shell=True) proc.wait() avgcmd=("proc2d %s %s average" % (os.path.join(clsdir,'aligned.spi'),os.path.join(clsdir,'classes_avg.spi'))) proc = subprocess.Popen(avgcmd, shell=True) proc.wait() dummyclsdir=os.path.join(clsdir,'classes') os.mkdir(dummyclsdir) dummyfilename='clhc_cls0001.spi' dummyfile=open(os.path.join(dummyclsdir,dummyfilename),'w') dummyfile.write(';bat/spi\n') for ptcl in range(0,params['nptcls']): dummyfile.write('%d 1 %d\n' % (ptcl,ptcl+1)) dummyfile.close() print "WARNING!! not enough particles in class for subclassification" return # otherwise, run coran else: makeSpiderCoranBatch(params,coranbatch,clsdir) ### this is how we should do this #mySpider = spyder.SpiderSession(logo=False, nproc=1) #mySpider.toSpiderQuiet("@%s\n" % coranbatch.split('.')[0]) spidercmd = ("cd %s\n" % clsdir) if params['hp'] is not None: spidercmd+=("proc2d aligned.spi alignedhp.spi spiderswap apix=%s hp=%s\n" % (params['apix'],params['hp'])) spidercmd+= ("spider bat/spi @%s\n" % coranbatch.split('.')[0]) ## if multiprocessor, don't run spider yet if params['proc'] == 1: proc = subprocess.Popen(spidercmd, shell=True) proc.wait() corancmd+=spidercmd return corancmd
def runCoranClass(params, cls): print "processing class", cls #set up cls dir clsdir = cls.split('.')[0] + '.dir' os.mkdir(clsdir) clscmd = 'clstoaligned.py -c ' + cls ## if multiprocessor, don't run clstoaligned yet if params['proc'] == 1: #make aligned stack proc = subprocess.Popen(clscmd, shell=True) proc.wait() corancmd = clscmd + '\n' coranbatch = 'coranfor' + cls.split('.')[0] + '.bat' #make spider batch params['nptcls'] = apEMAN.getNPtcls(cls) # if no particles, create an empty class average if params['nptcls'] == 0: # don't run clscmd, just make directory and empty average apEMAN.writeBlankImage(os.path.join(clsdir, 'classes_avg.spi'), params['boxsize'], 0, 'spider') print "WARNING!! no particles in class" return # if only 3 particles or less, turn particles into the class averages elif params['nptcls'] < 4: #this is an ugly hack, just average the particles together, no ref-free # don't use mpi, just make directory with clscmd and average particles proc = subprocess.Popen(clscmd, shell=True) proc.wait() avgcmd = ("proc2d %s %s average" % (os.path.join( clsdir, 'aligned.spi'), os.path.join(clsdir, 'classes_avg.spi'))) proc = subprocess.Popen(avgcmd, shell=True) proc.wait() dummyclsdir = os.path.join(clsdir, 'classes') os.mkdir(dummyclsdir) dummyfilename = 'clhc_cls0001.spi' dummyfile = open(os.path.join(dummyclsdir, dummyfilename), 'w') dummyfile.write(';bat/spi\n') for ptcl in range(0, params['nptcls']): dummyfile.write('%d 1 %d\n' % (ptcl, ptcl + 1)) dummyfile.close() print "WARNING!! not enough particles in class for subclassification" return # otherwise, run coran else: makeSpiderCoranBatch(params, coranbatch, clsdir) ### this is how we should do this #mySpider = spyder.SpiderSession(logo=False, nproc=1) #mySpider.toSpiderQuiet("@%s\n" % coranbatch.split('.')[0]) spidercmd = ("cd %s\n" % clsdir) if params['hp'] is not None: spidercmd += ( "proc2d aligned.spi alignedhp.spi spiderswap apix=%s hp=%s\n" % (params['apix'], params['hp'])) spidercmd += ("spider bat/spi @%s\n" % coranbatch.split('.')[0]) ## if multiprocessor, don't run spider yet if params['proc'] == 1: proc = subprocess.Popen(spidercmd, shell=True) proc.wait() corancmd += spidercmd return corancmd