Example #1
0
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