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
Exemple #2
0
    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
Exemple #8
0
	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
Exemple #9
0
    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, ))
Exemple #11
0
    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