def averageSubStack(partlist, stackfile, bin=1): if len(partlist) > 300: partlist = partlist[:300] boxsize = apImagicFile.getBoxsize(stackfile) if len(partlist) == 0: binboxsize = boxsize/bin blank = numpy.ones((binboxsize, binboxsize), dtype=numpy.float32) return blank if not os.path.isfile(stackfile): apDisplay.printWarning("could not find stack, "+stackfile) return False partdatalist = apImagicFile.readParticleListFromStack(stackfile, partlist, boxsize, msg=False) partdataarray = numpy.asarray(partdatalist) finaldata = partdataarray.mean(0) if bin > 1: finaldata = apImage.binImg(finaldata, bin) return finaldata
def createMontageInMemory(self, apix): self.cluster_resolution = [] apDisplay.printMsg("Converting files") ### Set binning of images boxsize = apImagicFile.getBoxsize(self.instack) bin = 1 while boxsize/bin > 200: bin+=1 binboxsize = boxsize/bin ### create averages files = glob.glob(self.timestamp+".[0-9]*") files.sort(self.sortFile) montage = [] montagepngs = [] i = 0 for listname in files: i += 1 apDisplay.printMsg("%d of %d classes"%(i,len(files))) pngfile = listname+".png" if not os.path.isfile(listname) or apFile.fileSize(listname) < 1: ### create a ghost particle sys.stderr.write("skipping "+listname+"\n") blank = numpy.ones((binboxsize, binboxsize), dtype=numpy.float32) ### add to montage stack montage.append(blank) self.cluster_resolution.append(None) ### create png apImage.arrayToPng(blank, pngfile) else: ### read particle list partlist = self.readListFile(listname) ### average particles partdatalist = apImagicFile.readParticleListFromStack(self.instack, partlist, boxsize, msg=False) partdataarray = numpy.asarray(partdatalist) finaldata = partdataarray.mean(0) if bin > 1: finaldata = apImage.binImg(finaldata, bin) ### add to montage stack montage.append(finaldata) res = apFourier.spectralSNR(partdatalist, apix) self.cluster_resolution.append(res) ### create png apImage.arrayToPng(finaldata, pngfile) ### check for png file if os.path.isfile(pngfile): montagepngs.append(pngfile) else: apDisplay.printError("failed to create montage") stackname = "kerdenstack"+self.timestamp+".hed" apImagicFile.writeImagic(montage, stackname) ### create montage montagecmd = ("montage -geometry +4+4 -tile %dx%d "%(self.params['xdim'], self.params['ydim'])) for monpng in montagepngs: montagecmd += monpng+" " montagecmd += "montage.png" apEMAN.executeEmanCmd(montagecmd, showcmd=True, verbose=False) time.sleep(1) apFile.removeFilePattern(self.timestamp+".*.png") return bin
def makeNewStacks(self, parttree): ### untilted stack self.notstackdata = apStack.getOnlyStackData(self.params['notstackid']) notstackfile = os.path.join(self.notstackdata['path']['path'], self.notstackdata['name']) ### tilted stack if not self.tiltstackdata: self.tiltstackdata = apStack.getOnlyStackData(self.params['tiltstackid']) tiltstackfile = os.path.join(self.tiltstackdata['path']['path'], self.tiltstackdata['name']) ### make doc file of Euler angles #eulerfile = self.makeEulerDoc(parttree) eulerfile = os.path.join(self.params['rundir'], "eulersdoc"+self.timestamp+".spi") if os.path.isfile(eulerfile): apFile.removeFile(eulerfile) count = 0 notstacklist = [] tiltstacklist = [] sizelimit = 2048 notbox = apImagicFile.getBoxsize(notstackfile) tiltbox = apImagicFile.getBoxsize(tiltstackfile) tiltstacks = [] notstacks = [] t0 = time.time() for partdict in parttree: ### print friendly message if count % 100 == 0: backs = "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b" sys.stderr.write(backs+backs+backs+backs) if count > sizelimit: esttime = (len(parttree)/float(count)-1.0)*(time.time()-t0) sys.stderr.write(str(count)+" particles of "+str(len(parttree)) +", "+apDisplay.timeString(esttime)+" remaining") else: sys.stderr.write(str(count)+" particles of "+str(len(parttree))) ### save stacks to file to save memory if count%sizelimit == 0: if count > 1: apDisplay.printMsg("Writing stacks to file") t1 = time.time() tiltname = os.path.join(self.params['rundir'], "tiltstack%d.hed"%(count)) apFile.removeStack(tiltname) apImagicFile.writeImagic(tiltstacklist, tiltname, msg=False) tiltstacks.append(tiltname) apDisplay.printMsg("finished tilted stack in "+apDisplay.timeString(time.time()-t1)) t1 = time.time() notname = os.path.join(self.params['rundir'], "notstack%d.hed"%(count)) apFile.removeStack(notname) apImagicFile.writeImagic(notstacklist, notname, msg=False) notstacks.append(notname) apDisplay.printMsg("finished untilted stack in "+apDisplay.timeString(time.time()-t1)) ### reset stacks apDisplay.printMsg("Reset stacks in memory") notstacklist = [] tiltstacklist = [] ### increment count count += 1 ### write to Euler doc self.appendEulerDoc(eulerfile, partdict['tilt'], count) ### untilted stack notpartarray = apImagicFile.readSingleParticleFromStack(notstackfile, partdict['not'], notbox, False) notstacklist.append(notpartarray) ### tilted stack tiltpartarray = apImagicFile.readSingleParticleFromStack(tiltstackfile, partdict['tilt'], tiltbox, False) tiltstacklist.append(tiltpartarray) ### write remaining particles to stack if len(notstacklist) > 0: apDisplay.printMsg("Writing stacks to file") t1 = time.time() tiltname = os.path.join(self.params['rundir'], "tiltstack%d.hed"%(count)) apFile.removeStack(tiltname) apImagicFile.writeImagic(tiltstacklist, tiltname, msg=False) tiltstacks.append(tiltname) apDisplay.printMsg("finished tilted stack in "+apDisplay.timeString(time.time()-t1)) t1 = time.time() notname = os.path.join(self.params['rundir'], "notstack%d.hed"%(count)) apFile.removeStack(notname) apImagicFile.writeImagic(notstacklist, notname, msg=False) notstacks.append(notname) apDisplay.printMsg("finished untilted stack in "+apDisplay.timeString(time.time()-t1)) ### merge NOT stack notname = os.path.join(self.params['rundir'], "notstack.hed") apImagicFile.mergeStacks(notstacks, notname) for stackname in notstacks: apFile.removeStack(stackname, warn=False) ### merge TILT stack tiltname = os.path.join(self.params['rundir'], "tiltstack.hed") apImagicFile.mergeStacks(tiltstacks, tiltname) for stackname in tiltstacks: apFile.removeStack(stackname, warn=False) ### upload results if self.params['commit'] is True: self.uploadResults()