def readPartDocFile(self, reflist): partlist = [] docfile = "part"+self.params['timestamp']+".doc" if not os.path.isfile(docfile) or apFile.fileSize(docfile) < 50: apDisplay.printWarning("Could not find doc file "+docfile+" to read particle angles") lastdocfile = "iter%03d/part%s_it%06d.doc"%(self.lastiter, self.params['timestamp'], self.lastiter) if not os.path.isfile(lastdocfile) or apFile.fileSize(lastdocfile) < 50: apDisplay.printError("Could not find backup doc file") apDisplay.printColor("Found a backup copy of docfile", "green") shutil.copy(lastdocfile, docfile) f = open(docfile, "r") mininplane = 360.0 for line in f: if line[:2] == ' ;': continue spidict = operations.spiderInLine(line) origpartdict = self.spidict2partdict(spidict) partdict = self.adjustPartDict(origpartdict, reflist) if partdict['inplane'] < mininplane: mininplane = partdict['inplane'] partlist.append(partdict) apDisplay.printMsg("minimum inplane: "+str(mininplane)) for partdict in partlist: partdict['inplane'] = partdict['inplane']-mininplane apDisplay.printMsg("read rotation and shift parameters for "+str(len(partlist))+" particles") if len(partlist) < 1: apDisplay.printError("Did not find any particles in doc file: "+docfile) return partlist
def readPickFile(pickfile): f = open(pickfile, "r") picklist = [] for line in f: sline = line.strip() if sline[0] == ";": continue spidict = operations.spiderInLine(line) x = spidict['floatlist'][0] y = spidict['floatlist'][1] picklist.append((x,y)) picks = numpy.asarray(picklist) return picks
def readPickFile(pickfile): f = open(pickfile, "r") picklist = [] for line in f: sline = line.strip() if sline[0] == ";": continue spidict = operations.spiderInLine(line) x = spidict['floatlist'][0] y = spidict['floatlist'][1] picklist.append((x, y)) picks = numpy.asarray(picklist) return picks
def readRefDocFile(self): reflist = [] docfile = "ref"+self.params['timestamp']+".doc" if not os.path.isfile(docfile): apDisplay.printError("could not find doc file "+docfile+" to read reference angles") f = open(docfile, "r") mininplane = 360.0 for line in f: if line[:2] == ' ;': continue spidict = operations.spiderInLine(line) refdict = self.spidict2partdict(spidict) if refdict['inplane'] < mininplane: mininplane = refdict['inplane'] reflist.append(refdict) for refdict in reflist: refdict['inplane'] = refdict['inplane']-mininplane apDisplay.printMsg("read rotation and shift parameters for "+str(len(reflist))+" references") return reflist
def readPartDocFile(self): partlist = [] docfile = "part"+self.timestamp+".doc" if not os.path.isfile(docfile): apDisplay.printError("could not find doc file "+docfile+" to read particle angles") f = open(docfile, "r") mininplane = 360.0 for line in f: if line[:2] == ' ;': continue spidict = operations.spiderInLine(line) partdict = self.spidict2partdict(spidict) if partdict['inplane'] < mininplane: mininplane = partdict['inplane'] partlist.append(partdict) apDisplay.printMsg("minimum inplane: "+str(mininplane)) for partdict in partlist: partdict['inplane'] = partdict['inplane']-mininplane apDisplay.printMsg("read rotation and shift parameters for "+str(len(partlist))+" particles") return partlist
def prepareEnvelope(self, scaleFactor=1.0): """ Original envelop mrc pixel size was 0.98 Angstroms, but may be better to say 1.04 Angstroms Now converts a 1D array into the 2D spectra """ apDisplay.printMsg("Creating 2D envelop from 1D array") envelope = self.params['envelopefile'] if envelope is None: return spi = open(envelope, 'r') radialdata = [] for line in spi: sline = line.strip() if not sline or sline[0] == ";": continue spidict = operations.spiderInLine(line) # second float column radialvalue = spidict['floatlist'][1] radialdata.append(radialvalue) spi.close() ### create envelop in 2D xdata = numpy.arange(0, len(radialdata), 1.0, dtype=numpy.float32) rdata = numpy.array(radialdata, dtype=numpy.float32) def funcrad(r, xdata=None, rdata=None): return numpy.interp(r, xdata, rdata) envshape = (4096, 4096) envcalc = imagefun.fromRadialFunction(funcrad, envshape, xdata=xdata, rdata=rdata) ### scale envelope if abs(scaleFactor - 1.0) > 0.01: print "scaling envelope by", scaleFactor envcalc = ndimage.zoom(envcalc, zoom=scaleFactor, mode='nearest') ### shift center of envelope to the edges envamp = self.center(envcalc) ### mutliply real envelope function by image fft self.envamp = (envamp - envamp.min()) / (envamp.max() - envamp.min()) apDisplay.printMsg("Successfully created 2D envelop from 1D array")
def readPartDocFile(self): partlist = [] docfile = "part" + self.timestamp + ".doc" if not os.path.isfile(docfile): apDisplay.printError("could not find doc file " + docfile + " to read particle angles") f = open(docfile, "r") mininplane = 360.0 for line in f: if line[:2] == ' ;': continue spidict = operations.spiderInLine(line) partdict = self.spidict2partdict(spidict) if partdict['inplane'] < mininplane: mininplane = partdict['inplane'] partlist.append(partdict) apDisplay.printMsg("minimum inplane: " + str(mininplane)) for partdict in partlist: partdict['inplane'] = partdict['inplane'] - mininplane apDisplay.printMsg("read rotation and shift parameters for " + str(len(partlist)) + " particles") return partlist
def canClassificationToDict(self): ### read the particle classification results from CAN ### output in spider format & save as a dictionary pclass = {} spitarf = "cls.spi.tar" if not os.path.isfile(spitarf): apDisplay.printError("no SPIDER cls tar file found") spitar = tarfile.open(spitarf) ## revert when using python 2.5+ self.TarExtractall(spitar) #spitar.extractall() spitar.close() spifiles = glob.glob("classes_class_*.spi") if not spifiles: apDisplay.printError("CAN did not create SPIDER cls files") spifiles.sort() # store classification in dictionary, defined by particle number for spi in spifiles: ## get ref number from class file name refn=int(os.path.splitext(spi)[0][-4:]) f = open(spi) for l in f: if l[:2] == ' ;': continue spidict = operations.spiderInLine(l) p = int(spidict['floatlist'][0]) if p not in pclass: pclass[p]=self.sortedAvgDict[refn] else: apDisplay.printError("particle %i has more than 1 classification," +" classified to reference %i and %i"%(p,pclass[p],refn)) f.close() os.remove(spi) return pclass
def runEoTest(self, alignstack, eulerfile): evenvolfile = os.path.join(self.params['rundir'], "evenvolume%s.spi" % (self.timestamp)) oddvolfile = os.path.join(self.params['rundir'], "oddvolume%s.spi" % (self.timestamp)) eveneulerfile = os.path.join(self.params['rundir'], "eveneulers%s.spi" % (self.timestamp)) oddeulerfile = os.path.join(self.params['rundir'], "oddeulers%s.spi" % (self.timestamp)) evenpartlist = os.path.join(self.params['rundir'], "evenparts%s.lst" % (self.timestamp)) oddpartlist = os.path.join(self.params['rundir'], "oddparts%s.lst" % (self.timestamp)) ### Create New Doc Files of = open(oddeulerfile, "w") ef = open(eveneulerfile, "w") op = open(oddpartlist, "w") ep = open(evenpartlist, "w") inf = open(eulerfile, "r") evenpart = 0 oddpart = 0 for line in inf: spidict = operations.spiderInLine(line) if spidict: partnum = spidict['row'] if partnum % 2 == 0: ep.write("%d\n" % (partnum - 1)) evenpart += 1 outline = operations.spiderOutLine(evenpart, spidict['floatlist']) ef.write(outline) elif partnum % 2 == 1: op.write("%d\n" % (partnum - 1)) oddpart += 1 outline = operations.spiderOutLine(oddpart, spidict['floatlist']) of.write(outline) inf.close() of.close() ef.close() op.close() ep.close() ### Create stacks evenstack = os.path.join(self.params['rundir'], "evenstack%s.spi" % (self.timestamp)) emancmd = "proc2d %s %s list=%s spiderswap" % (alignstack, evenstack, evenpartlist) apEMAN.executeEmanCmd(emancmd, verbose=True, showcmd=True) oddstack = os.path.join(self.params['rundir'], "oddstack%s.spi" % (self.timestamp)) emancmd = "proc2d %s %s list=%s spiderswap" % (alignstack, oddstack, oddpartlist) apEMAN.executeEmanCmd(emancmd, verbose=True, showcmd=True) ### Create Volumes backproject.backproject3F(evenstack, eveneulerfile, evenvolfile, evenpart) backproject.backproject3F(oddstack, oddeulerfile, oddvolfile, oddpart) if not os.path.isfile(evenvolfile) or not os.path.isfile(oddvolfile): apDisplay.printError("Even-Odd volume creation failed") ### Calculate FSC apix = apStack.getStackPixelSizeFromStackId( self.params['tiltstackid']) * self.params['tiltbin'] emancmd = "proc3d %s %s" % (evenvolfile, evenvolfile + ".mrc") apEMAN.executeEmanCmd(emancmd, verbose=True, showcmd=True) emancmd = "proc3d %s %s" % (oddvolfile, oddvolfile + ".mrc") apEMAN.executeEmanCmd(emancmd, verbose=True, showcmd=True) fscfile = os.path.join(self.params['rundir'], "fscdata%s.fsc" % (self.timestamp)) emancmd = "proc3d %s %s fsc=%s" % (evenvolfile + ".mrc", oddvolfile + ".mrc", fscfile) apEMAN.executeEmanCmd(emancmd, verbose=True, showcmd=True) if not os.path.isfile(fscfile): apDisplay.printError("Even-Odd fsc calculation failed") boxsize = self.getBoxSize() self.fscresolution = apRecon.getResolutionFromFSCFile(fscfile, boxsize, apix, msg=True) apDisplay.printColor( ("Final FSC resolution: %.5f" % (self.fscresolution)), "cyan") for fname in (evenvolfile, oddvolfile, evenstack, oddstack, eveneulerfile, oddeulerfile, evenpartlist, oddpartlist): apFile.removeFile(fname)
def runEoTest(self, alignstack, eulerfile): evenvolfile = os.path.join(self.params['rundir'], "evenvolume%s.spi"%(self.timestamp)) oddvolfile = os.path.join(self.params['rundir'], "oddvolume%s.spi"%(self.timestamp)) eveneulerfile = os.path.join(self.params['rundir'], "eveneulers%s.spi"%(self.timestamp)) oddeulerfile = os.path.join(self.params['rundir'], "oddeulers%s.spi"%(self.timestamp)) evenpartlist = os.path.join(self.params['rundir'], "evenparts%s.lst"%(self.timestamp)) oddpartlist = os.path.join(self.params['rundir'], "oddparts%s.lst"%(self.timestamp)) ### Create New Doc Files of = open(oddeulerfile, "w") ef = open(eveneulerfile, "w") op = open(oddpartlist, "w") ep = open(evenpartlist, "w") inf = open(eulerfile, "r") evenpart = 0 oddpart = 0 for line in inf: spidict = operations.spiderInLine(line) if spidict: partnum = spidict['row'] if partnum % 2 == 0: ep.write("%d\n"%(partnum-1)) evenpart += 1 outline = operations.spiderOutLine(evenpart, spidict['floatlist']) ef.write(outline) elif partnum % 2 == 1: op.write("%d\n"%(partnum-1)) oddpart += 1 outline = operations.spiderOutLine(oddpart, spidict['floatlist']) of.write(outline) inf.close() of.close() ef.close() op.close() ep.close() ### Create stacks evenstack = os.path.join(self.params['rundir'], "evenstack%s.spi"%(self.timestamp)) emancmd = "proc2d %s %s list=%s spiderswap"%(alignstack,evenstack,evenpartlist) apEMAN.executeEmanCmd(emancmd, verbose=True, showcmd=True) oddstack = os.path.join(self.params['rundir'], "oddstack%s.spi"%(self.timestamp)) emancmd = "proc2d %s %s list=%s spiderswap"%(alignstack,oddstack,oddpartlist) apEMAN.executeEmanCmd(emancmd, verbose=True, showcmd=True) ### Create Volumes backproject.backproject3F(evenstack, eveneulerfile, evenvolfile, evenpart) backproject.backproject3F(oddstack, oddeulerfile, oddvolfile, oddpart) if not os.path.isfile(evenvolfile) or not os.path.isfile(oddvolfile): apDisplay.printError("Even-Odd volume creation failed") ### Calculate FSC apix = apStack.getStackPixelSizeFromStackId(self.params['tiltstackid'])*self.params['tiltbin'] emancmd = "proc3d %s %s"%(evenvolfile, evenvolfile+".mrc") apEMAN.executeEmanCmd(emancmd, verbose=True, showcmd=True) emancmd = "proc3d %s %s"%(oddvolfile, oddvolfile+".mrc") apEMAN.executeEmanCmd(emancmd, verbose=True, showcmd=True) fscfile = os.path.join(self.params['rundir'], "fscdata%s.fsc"%(self.timestamp)) emancmd = "proc3d %s %s fsc=%s"%(evenvolfile+".mrc", oddvolfile+".mrc", fscfile) apEMAN.executeEmanCmd(emancmd, verbose=True, showcmd=True) if not os.path.isfile(fscfile): apDisplay.printError("Even-Odd fsc calculation failed") boxsize = self.getBoxSize() self.fscresolution = apRecon.getResolutionFromFSCFile(fscfile, boxsize, apix, msg=True) apDisplay.printColor( ("Final FSC resolution: %.5f" % (self.fscresolution)), "cyan") for fname in (evenvolfile, oddvolfile, evenstack, oddstack, eveneulerfile, oddeulerfile, evenpartlist, oddpartlist): apFile.removeFile(fname)