def alreadyAcquired(self, targetdata, presetname): ''' determines if image already acquired using targetdata and presetname ''' ## if image exists with targetdata and presetdata, no acquire ## we expect target to be exact, however, presetdata may have ## changed so we only query on preset name # seems to have trouple with using original targetdata as # a query, so use a copy with only some of the fields presetquery = leginondata.PresetData(name=presetname) targetquery = leginondata.AcquisitionImageTargetData(initializer=targetdata) ## don't care if drift correction was done on target after image was ## acquired, so ignore version, delta row/col, parentimage, and fromtarget targetquery['version'] = None targetquery['delta row'] = None targetquery['delta column'] = None targetquery['image'] = None targetquery['fromtarget'] = None imagequery = leginondata.AcquisitionImageData(target=targetquery, preset=presetquery) ## other things to fill in imagequery['scope'] = leginondata.ScopeEMData() imagequery['camera'] = leginondata.CameraEMData() imagequery['session'] = leginondata.SessionData() datalist = self.research(datainstance=imagequery) if datalist: ## no need to acquire again, but need to republish self.reportStatus('output', 'Image was acquired previously, republishing') imagedata = datalist[0] self.publishDisplayWait(imagedata) return True else: return False
def start(self): sessionname = self.params['sessionname'] runname = self.params['runname'] preset = self.params['preset'] sessionq = leginondata.SessionData(name=sessionname) presetq = leginondata.PresetData(name=preset) imgquery = leginondata.AcquisitionImageData() imgquery['preset'] = presetq imgquery['session'] = sessionq imgtree = imgquery.query(readimages=False) partq = appiondata.ApContourData() sessiond = sessionq.query() file = open('contourpickerTubeCircleData-' + sessionname + '.txt', 'w') file.write('experiment_name ' + sessionname + '\n') file.write('experiment_description ' + sessiond[0]['comment'] + '\n') numimages = 0 for imgdata in imgtree: partq['image'] = imgdata partd = partq.query() if len(partd) > 0: numimages += 1 file.write('nimages ' + str(numimages) + '\n') numparticles = 0.0 numcircles = 0.0 numtubes = 0.0 for imgdata in imgtree: partq['image'] = imgdata partd = partq.query() maxversion = 0 for part in partd: if int(part['version'] ) > maxversion and part['runname'] == runname: maxversion = int(part['version']) for part in partd: if int(part['version'] ) == maxversion and part['runname'] == runname: numparticles += 1 if part['particleType'] == 'Circle': numcircles += 1 if part['particleType'] == 'Tube': numtubes += 1 file.write('nparticles ' + str(numparticles) + '\n') if numparticles == 0: precenttubes = 0 file.write('%tubes ' + str(0.0)) else: percenttubes = numtubes / numparticles percent = percenttubes * 100 percent *= 100 percent = int(percent) percent = percent / 100.0 file.write('%tubes ' + str(percent))
def getDoseFromSessionPresetNames(sessionname, presetname): ''' returns dose, in electrons per Angstrom ''' sessiondata = leginondata.SessionData(name=sessionname).query()[0] presetdata = leginondata.PresetData( name=presetname, session=sessiondata).query(results=1)[0] dose = presetdata['dose'] if not dose: raise RunTimeError("dose not available for %s session and preset %s" % (sessionname, presetname)) return dose / 1e20
def makeAlignedImageData(old_imagedata, new_camdata, new_array, alignlabel='a'): ''' Prepare ImageData to be uploaded after alignment ''' label_string = '-%s' % (alignlabel) camdata = leginondata.CameraEMData( initializer=new_camdata) # new CameraEMData for the aligned image align_presetdata = leginondata.PresetData( initializer=old_imagedata['preset']) if old_imagedata['preset'] is None: old_name = 'ma' align_presetdata = leginondata.PresetData( name='ma-%s' % (label_string), magnification=old_imagedata['scope']['magnification'], defocus=old_imagedata['scope']['defocus'], tem=old_imagedata['scope']['tem'], ccdcamera=camdata['ccdcamera'], session=old_imagedata['session'], ) else: old_name = align_presetdata['name'] align_presetdata['name'] = old_name + label_string align_presetdata['dimension'] = camdata['dimension'] align_presetdata['binning'] = camdata['binning'] align_presetdata['offset'] = camdata['offset'] align_presetdata['exposure time'] = camdata['exposure time'] # make new imagedata with the align_preset amd aligned CameraEMData imagedata = leginondata.AcquisitionImageData(initializer=old_imagedata) imagedata['preset'] = align_presetdata imagefilename = imagedata['filename'] bits = imagefilename.split(old_name) before_string = old_name.join(bits[:-1]) newfilename = align_presetdata['name'].join((before_string, bits[-1])) imagedata['camera'] = camdata imagedata['camera']['align frames'] = True imagedata['image'] = new_array imagedata['filename'] = makeUniqueImageFilename(imagedata, old_name, align_presetdata['name']) return imagedata
def importLastPresets(self): # some presets such as fa and fc is never used in image acquisition print 'importing all last version of presets....' source_session = self.getSourceSession() q = leginondata.PresetData(session=source_session) allpresets = self.research(q) lastpresets = {} for p in allpresets: if p['name'] not in lastpresets: lastpresets[p['name']] = p lastpreset_list = map((lambda x: lastpresets[x]), lastpresets.keys()) self.publish(lastpreset_list)
def processImageData(self, imagedata): ''' Gets and publishes target information of specified image leginondata. ''' if self.settings['ignore images']: return for target_name in self.targetnames: self.setTargets([], target_name, block=True) self.setTargetImageVector(imagedata) # check if there is already a target list for this image # or any other versions of this image (all from same target/preset) # exclude sublists (like rejected target lists) qtarget = imagedata['target'] try: pname = imagedata['preset']['name'] qpreset = leginondata.PresetData(name=pname) except: qpreset = None qimage = leginondata.AcquisitionImageData(target=qtarget, preset=qpreset) previouslists = self.researchTargetLists(image=qimage, sublist=False) if previouslists: # I hope you can only have one target list on an image, right? targetlist = previouslists[0] db = False self.logger.info('Existing target list on this image...') self.displayPreviousTargets(targetlist) else: # no previous list, so create one and fill it with targets targetlist = self.newTargetList(image=imagedata, queue=self.settings['queue']) db = True if self.settings['allow append'] or len(previouslists) == 0: self.findTargets(imagedata, targetlist) self.logger.debug('Publishing targetlist...') ## if queue is turned on, do not notify other nodes of each target list publish if self.settings['queue']: pubevent = False else: pubevent = True self.publish(targetlist, database=db, pubevent=pubevent) self.logger.debug('Published targetlist %s' % (targetlist.dbid, )) if self.settings['wait for done'] and not self.settings['queue']: self.makeTargetListEvent(targetlist) self.setStatus('waiting') self.waitForTargetListDone() self.setStatus('processing')
def recentImageVersion(self, imagedata): # find most recent version of this image p = leginondata.PresetData(name=imagedata['preset']['name']) q = leginondata.AcquisitionImageData() q['session'] = imagedata['session'] q['target'] = imagedata['target'] q['list'] = imagedata['list'] q['preset'] = p allimages = q.query() version = 0 for im in allimages: if im['version'] > version: version = im['version'] return version
def getTiltSeries(self, targetdata, presetdata): ''' targetdata argument is target about to be acquired. Find the tilt series that this new image will belong to if it exists, otherwise create a new tilt series. ''' commontarget = targetdata['image']['target'] targetnumber = targetdata['number'] qimage1 = leginondata.AcquisitionImageData(target=commontarget) qtarget = leginondata.AcquisitionImageTargetData(image=qimage1, number=targetnumber) qpreset = leginondata.PresetData(name=presetdata['name'], session=presetdata['session']) qimage2 = leginondata.AcquisitionImageData(target=qtarget, preset=qpreset, session=presetdata['session']) images = self.research(qimage2, readimages=False) if images: tiltseries = images[0]['tilt series'] defocus = images[0]['scope']['defocus'] else: tiltseries = None defocus = None return tiltseries, defocus
def getImageList(self): self.childpreset = self.settings['child preset'] childpresetq = leginondata.PresetData(session=self.session, name=self.childpreset) q = leginondata.AcquisitionImageData(session=self.session, preset=childpresetq) images = self.research(datainstance=q, readimages=False) self.imageids = [] nongrid = 0 for image in images: if image['grid'] is None: nongrid += 1 else: anc = self.getAncestor(image) if anc is not None: self.imageids.append((image.dbid, anc.dbid)) if nongrid > 0: self.logger.warning( '%d images are not from grids loaded by a robot' % nongrid) if not self.imageids: self.logger.error('No %s images in session' % (self.childpreset, )) self.currentindex = None
def getImageList(self): preset = self.settings['preset'] self.parentdir = self.session['image path'] maskname = self.settings['run'] if self.settings['path'] is None or self.settings['path'] == '': rundir = self.handleDefaultPath(maskname) else: rundir = os.path.join(self.settings['path'], maskname) self.logger.info('mask run dir %s' % rundir) self.bin = self.settings['bin'] presetq = leginondata.PresetData(session=self.session, name=preset) q = leginondata.AcquisitionImageData(session=self.session, preset=presetq) allimages = self.research(datainstance=q, readimages=False) self.maskrundata, self.maskparamsdata = apMask.getMaskParamsByRunName( maskname, self.session) if not self.maskrundata: apMask.insertManualMaskRun(self.session, rundir, maskname, self.bin) self.maskrundata, self.maskparamsdata = apMask.getMaskParamsByRunName( maskname, self.session) images = allimages try: maskdir = os.path.join(rundir, "masks") self.makeRecursivePath(maskdir) except: self.logger.warning('can not create mask directory') else: if self.settings['continueon']: mode = 'continue' else: mode = 'overwrite empty masks' self.logger.warning('Mask Run exists, will %s' % (mode, )) savedbin = self.maskparamsdata['bin'] if self.bin != savedbin: self.logger.warning('Change binning to that of the saved %s', (savedbin, )) self.bin = savedbin savedrundir = self.maskrundata['path']['path'] if rundir != savedrundir: self.logger.warning( 'Change mask run path to that of the saved %s', (savedrundir, )) rundir = savedrundir images = [] for imgdata in allimages: regions = apMask.getMaskRegions(self.maskrundata, imgdata) maskfile = os.path.join(rundir, "masks", imgdata['filename'] + '_mask.png') if mode == 'continue': if not os.path.exists(maskfile): images.append(imgdata) else: if mode == 'overwrite empty masks': if len(regions) == 0: images.append(imgdata) self.maskdir = os.path.join(self.maskrundata['path']['path'], "masks") if images: goodfiles = map((lambda x: x['filename']), images) goodfiles.sort() self.images = [] self.files = [] for i, filename in enumerate(goodfiles): q = leginondata.AcquisitionImageData(session=self.session, filename=filename) imgdatalist = self.research(datainstance=q, readimages=False) if imgdatalist: imgdata = imgdatalist[0] self.images.append(imgdata) self.files.append(filename) if self.noreject and apDatabase.getImgAssessmentStatus( imgdata) == False: self.files.pop() self.images.pop() else: self.logger.error('No %s files in session' % (preset, )) return if len(self.files) > 0: self.currentindex = 0 self.displayCurrent() else: self.logger.error('No %s files in session' % (preset, ))
def start(self): sessionname = self.params['sessionname'] runname = self.params['runname'] preset = self.params['preset'] sessionq = leginondata.SessionData(name=sessionname) presetq = leginondata.PresetData(name=preset) imgquery = leginondata.AcquisitionImageData() imgquery['preset'] = presetq imgquery['session'] = sessionq imgtree = imgquery.query(readimages=False) partq = appiondata.ApContourData() sessiond = sessionq.query() selectionid = apParticle.getSelectionIdFromName(runname, sessionname) if not selectionid: apDisplay.printWarning( 'No Object Tracing Run found in database, Skipping.......') return selectionrundata = apParticle.getSelectionRunDataFromID(selectionid) file = open('contourpickerData-' + sessionname + '.txt', 'w') file.write('session_id ' + runname + '\n') file.write('usr_id ' + os.getlogin() + '\n') file.write('experiment_name ' + sessionname + '\n') file.write('experiment_description ' + sessiond[0]['comment'].strip() + '\n') file.write('nimages ' + str(len(imgtree)) + '\n') for imgdata in imgtree: file.write('START_IMAGE' + '\n') partq['image'] = imgdata partq['selectionrun'] = selectionrundata partd = partq.query() if len(partd) > 0: file.write('image_refID ' + str(partd[0]['image'].dbid) + '\n') file.write('image_name ' + imgdata['filename'] + '\n') if len(partd) > 0: file.write('time_roi ' + str(partd[0].timestamp) + '\n') #file.write('time_roi ' + partd[0]['DEF_timestamp'] + '\n') file.write('dfac = 1\n') maxversion = 0 numparticles = 0 for part in partd: if int(part['version']) > maxversion: maxversion = int(part['version']) for part in partd: if int(part['version']) == maxversion: numparticles += 1 file.write('version_id ' + str(maxversion) + '\n') file.write('ncontours ' + str(numparticles) + '\n') pointq = appiondata.ApContourPointData() for part in partd: if int(part['version']) == maxversion: # file.write('contour_number ' + ) file.write('method_used ' + part['method'] + ' ') pointq['contour'] = part pointd = pointq.query() for point in pointd: file.write( str(point['x']) + ',' + str(point['y']) + ';') file.write('\n') file.write('END_IMAGE' + '\n')
if test: return True # check stage position if movetype == 'modeled stage position': scopeparam = 'stage position' else: scopeparam = movetype emtargetdata[scopeparam] = dict(scopedata[scopeparam]) emtargetdata['target'] = targetdata #emtargetdata['preset'] = presetdata query = leginondata.AcquisitionImageTargetData() query['session'] = self.session query['preset'] = leginondata.PresetData() query['preset']['name'] = presetname query['grid'] = griddata try: targetdata['number'] = max( [r['number'] for r in self.research(query)]) + 1 except ValueError: targetdata['number'] = 0 self.logger.debug('new number: %s' % (targetdata['number'], )) targetdata['preset'] = presetdata targetdata['grid'] = griddata targetdata['version'] = 0 targetdata['status'] = 'done' targetdata['list'] = None targetdata['image'] = None