def setRunDir(self): """ this function only runs if no rundir is defined at the command line """ subtomorunq = appiondata.ApSubTomogramRunData() subtomorundata = subtomorunq.direct_query(self.params['subtomoId']) subtomoq = appiondata.ApTomogramData(subtomorun=subtomorundata) results = subtomoq.query(results=1) if results: subtomodir = results[0]['path']['path'] tiltdirs = subtomodir.split('/tiltseries') self.params['rundir'] = os.path.join(tiltdirs[0],"average",self.params['runname'])
def insertSubTomoRun(sessiondata, selectionrunid, stackid, name, invert=False, subbin=1): if selectionrunid: qpick = appiondata.ApSelectionRunData() pickdata = qpick.direct_query(selectionrunid) else: pickdata = None if stackid: qstack = appiondata.ApStackData() stackdata = qstack.direct_query(stackid) else: stackdata = None qrun = appiondata.ApSubTomogramRunData(session=sessiondata, pick=pickdata, stack=stackdata, runname=name, invert=invert, subbin=subbin) return publish(qrun)
def start(self): subtomorunq = appiondata.ApSubTomogramRunData() subtomorundata = subtomorunq.direct_query(self.params['subtomoId']) volshape, totalbin, pixelsize = apTomo.getSubvolumeInfo(subtomorundata) if volshape is None: apDisplay.printError('No subvolume exists for the subtomoId') sessionname = subtomorundata['session']['name'] stackq = appiondata.ApStackData() stackdata = stackq.direct_query(self.params['stackId']) diameter = apStack.getStackParticleDiameter(stackdata) diameterpixel = diameter * 1e-10 / pixelsize halfwidth = diameterpixel / 4 ztolerance = halfwidth zbackgroundrange = max(((volshape[0] - diameterpixel * 3) / 2, 10)) if self.params['commit']: avgrundata = apTomo.insertTomoAverageRun( self.params['runname'], self.params['rundir'], subtomorundata, stackdata, halfwidth, self.params['description'], ) profiles = {} sumvol = numpy.zeros(volshape) substacktype, conditionstackdata = apStack.findSubStackConditionData( stackdata) if substacktype in ['clustersub', 'alignsub']: alignstack = apStack.getAlignStack(substacktype, conditionstackdata) alignpackage = apAlignment.getAlignPackage(alignstack['alignrun']) stackprtls = apStack.getStackParticlesFromId(stackdata.dbid) i = 0 for stackp in stackprtls: alignp = apAlignment.getAlignParticle(stackp, alignstack) shift = apAlignment.getAlignShift(alignp, alignpackage) subtomodata = apTomo.getSubTomogramData(subtomorundata, stackp) subtomofile = os.path.join(subtomodata['path']['path'], subtomodata['name'] + '.rec') subvolume = apTomo.getTomoVolume(subtomodata) if subvolume is not None: zcenter = volshape[0] / 2 profile = apTomo.getParticleCenterZProfile( subvolume, shift, halfwidth, zbackgroundrange) subtomoid = subtomodata.dbid profiles[subtomoid] = profile center = apTomo.gaussianCenter(profile) if center > zcenter - ztolerance and center < zcenter + ztolerance: i += 1 shiftz = zcenter - center transformedvolume = apTomo.transformTomo( subvolume, subtomofile, alignpackage, alignp, shiftz, totalbin) ## write transformed mrc file to check the result filename = os.path.join( self.params['rundir'], './transformed%05d.mrc' % subtomoid) mrc.write(transformedvolume, filename) sumvol += transformedvolume t = numpy.sum(transformedvolume, axis=0) filename = os.path.join(self.params['rundir'], './p%05d.mrc' % subtomoid) mrc.write(transformedvolume, filename) if self.params['commit']: apTomo.insertTomoAvgParticle( avgrundata, subtomodata, alignp, shiftz) if i < 1: apDisplay.printError('no subtomogram qualifies for averaging') else: avgvol = sumvol / i avgvolfilename = sessionname + "_" + self.params['runname'] + ".mrc" avgvolpath = os.path.join(self.params['rundir'], avgvolfilename) mrc.write(avgvol, avgvolpath) if not os.path.isfile(avgvolpath): apDisplay.printError("tomogram not exist") apTomo.makeMovie(avgvolpath, self.params['maxsize']) apTomo.makeProjection(avgvolpath, self.params['maxsize']) proshape = profile.shape for id in profiles.keys(): out = open('profile_%05d.txt' % id, 'w') for z in range(0, proshape[0]): str = "%5d\t" % z str += "%6.3f\t" % profiles[id][z] str += "\n" out.write(str) out.close()