Пример #1
0
	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
Пример #4
0
	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")
Пример #7
0
 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")
Пример #9
0
	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
Пример #10
0
    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)
Пример #11
0
	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)