def __isShortTiltSeries(self, tiltseriesdata): imgtree = apDatabase.getImagesFromTiltSeries(tiltseriesdata,False) imagelimit = self.params['imagelimit'] is_short = len(imgtree) < imagelimit if is_short: apDisplay.printWarning("Tilt series has less than %d images" % imagelimit) return is_short
def _startLoop(self, tiltseriesdata): """ initilizes several parameters for a new series and checks if it is okay to start processing series """ #calc series left self.stats[ 'seriesleft'] = self.stats['seriescount'] - self.stats['count'] if self.params['background'] is False: apDisplay.printColor( "\nStarting series %d ( skip:%d, remain:%d ) id:%d" % ( tiltseriesdata['number'], self.stats['skipcount'], self.stats['seriesleft'], tiltseriesdata.dbid, ), "green") #only if a series was processed last if (self.stats['lastcount'] != self.stats['count']): sys.stderr.write("\n") self.stats['lastcount'] = self.stats['count'] self._checkMemLeak() # skip if last image belong to the series doesn't exist: imgtree = apDatabase.getImagesFromTiltSeries(tiltseriesdata, False) imgpath = os.path.join(tiltseriesdata['session']['image path'], imgtree[0]['filename'] + '.mrc') if not os.path.isfile(imgpath): apDisplay.printWarning(imgpath + " not found, skipping") return False # skip if there are some problem with the series if self.__isShortTiltSeries(tiltseriesdata) or self.isBadTiltSeries( tiltseriesdata): apDisplay.printWarning( "Series %d is not good enough for processing, skipping" % (tiltseriesdata['number'])) seriesname = "series%3d" % (tiltseriesdata['number']) self._writeDoneDict(seriesname) self.stats['count'] += 1 return False # check to see if series has already been processed if self._alreadyProcessed(tiltseriesdata): return False self.stats['waittime'] = 0 if self.reprocessSeries(tiltseriesdata) is True: if self.params['background'] is True: sys.stderr.write(",") else: """apDisplay.printMsg("reprocessing series %d" % (tiltseriesdata['number']))""" else: if self.params['background'] is True: sys.stderr.write(".") else: """apDisplay.printMsg("processing series %d" % (tiltseriesdata['number']))""" return True
def processTiltSeries(self, tiltseriesdata): """ Call your processing command from here per tilt series Here we just print out the filenames of the images in the tilt series """ print "Tiltseries %d -------------------" % tiltseriesdata['number'] imgtree = apDatabase.getImagesFromTiltSeries(tiltseriesdata,True) for imagedata in imgtree: print imagedata['filename']
def _startLoop(self, tiltseriesdata): """ initilizes several parameters for a new series and checks if it is okay to start processing series """ #calc series left self.stats['seriesleft'] = self.stats['seriescount'] - self.stats['count'] if self.params['background'] is False: apDisplay.printColor( "\nStarting series %d ( skip:%d, remain:%d ) id:%d" %(tiltseriesdata['number'], self.stats['skipcount'], self.stats['seriesleft'], tiltseriesdata.dbid,), "green") #only if a series was processed last if(self.stats['lastcount'] != self.stats['count']): sys.stderr.write("\n") self.stats['lastcount'] = self.stats['count'] self._checkMemLeak() # skip if last image belong to the series doesn't exist: imgtree = apDatabase.getImagesFromTiltSeries(tiltseriesdata,False) imgpath = os.path.join(tiltseriesdata['session']['image path'], imgtree[0]['filename']+'.mrc') if not os.path.isfile(imgpath): apDisplay.printWarning(imgpath+" not found, skipping") return False # skip if there are some problem with the series if self.__isShortTiltSeries(tiltseriesdata) or self.isBadTiltSeries(tiltseriesdata): apDisplay.printWarning("Series %d is not good enough for processing, skipping" % (tiltseriesdata['number'])) seriesname = "series%3d" % (tiltseriesdata['number']) self._writeDoneDict(seriesname) self.stats['count'] += 1 return False # check to see if series has already been processed if self._alreadyProcessed(tiltseriesdata): return False self.stats['waittime'] = 0 if self.reprocessSeries(tiltseriesdata) is True: if self.params['background'] is True: sys.stderr.write(",") else: """apDisplay.printMsg("reprocessing series %d" % (tiltseriesdata['number']))""" else: if self.params['background'] is True: sys.stderr.write(".") else: """apDisplay.printMsg("processing series %d" % (tiltseriesdata['number']))""" return True
def run(self): """ processes all series """ ### get tilt series from database self._getAllSeries() os.chdir(self.params['rundir']) self.preLoopFunctions() ### start the loop self.notdone=True self.badprocess = False self.stats['startloop'] = time.time() while self.notdone: apDisplay.printColor("\nBeginning Main Loop", "green") seriesnum = 0 while seriesnum < len(self.seriestree) and self.notdone is True: self.stats['startseries'] = time.time() tiltseriesdata = self.seriestree[seriesnum] seriesnum += 1 ### CHECK IF IT IS OKAY TO START PROCESSING IMAGE if not self._startLoop(tiltseriesdata): continue ### set the pixel size imgtree = apDatabase.getImagesFromTiltSeries(tiltseriesdata,False) self.params['apix'] = apDatabase.getPixelSize(imgtree[0]) if not self.params['background']: apDisplay.printMsg("Pixel size: "+str(self.params['apix'])) ### START any custom functions HERE: results = self.loopProcessTiltSeries(tiltseriesdata) ### WRITE db data if self.badprocess is False: if self.params['commit'] is True: if not self.params['background']: apDisplay.printColor(" ==== Committing data to database ==== ", "blue") self.loopCommitToDatabase(tiltseriesdata) self.commitResultsToDatabase(tiltseriesdata, results) else: apDisplay.printWarning("not committing results to database, all data will be lost") apDisplay.printMsg("to preserve data start script over and add 'commit' flag") self.writeResultsToFiles(tiltseriesdata, results) else: apDisplay.printWarning("IMAGE FAILED; nothing inserted into database") self.badprocess = False self.stats['lastpeaks'] = 0 ### FINISH with custom functions seriesname = "series%3d" % (tiltseriesdata['number']) self._writeDoneDict(seriesname) loadavg = os.getloadavg()[0] if loadavg > 2.0: apDisplay.printMsg("Load average is high "+str(round(loadavg,2))) loadsquared = loadavg*loadavg time.sleep(loadsquared) apDisplay.printMsg("New load average "+str(round(os.getloadavg()[0],2))) self._printSummary() if self.params['limit'] is not None and self.stats['count'] > self.params['limit']: apDisplay.printWarning("reached series limit of "+str(self.params['limit'])+"; now stopping") #END LOOP OVER IMAGES if self.notdone is True: self.notdone = self._waitForMoreSeries(timeout_min=self.params['timeout']) #END NOTDONE LOOP self.postLoopFunctions() self.close()