def filterTargets(self, targetlist):
		self.logger.info('filtering target list:  convolve targets with a raster')
		newlist = []
		angledeg = self.settings['raster angle']
		anglerad = math.radians(angledeg)
		# define goodindices for raster convolution
		limitangledeg = self.settings['ellipse angle']
		limitanglerad = math.radians(limitangledeg)
		# use ellipse diameter to define raster limit
		limita = self.settings['ellipse a'] / 2.0
		limitb = self.settings['ellipse b'] / 2.0
		# create raster
		for target in targetlist:
			tiltoffset = self.researchPattern(target)
			self.goodindices = raster.createIndices2(limita,limitb,limitanglerad-anglerad,self.settings['limiting shape'],self.settings['raster offset'],self.is_odd,tiltoffset)
			self.savePattern(target)
			oldtarget = leginondata.AcquisitionImageTargetData(initializer=target)
			self.targetdata = oldtarget
			rasterpoints = self.makeRaster()
			for rp in rasterpoints:
				newtarget = leginondata.AcquisitionImageTargetData(initializer=target)
				newtarget['delta row'] += rp[0]
				newtarget['delta column'] += rp[1]
				newtarget['fromtarget'] = target
				newlist.append(newtarget)
			if not self.test or len(targetlist) % 2:
				self.is_odd = not self.is_odd
				self.setOffsetToolBar()
			self.donetargetids.append(target.dbid)
		return newlist
    def filterTargets(self, targetlist):
        limit = self.settings['limit']
        self.logger.info('filtering target list:  use center %d targets' %
                         limit)
        newlist = []
        distlist = []
        targetdistances = {}
        for target in targetlist:
            print target.dbid
            oldtarget = leginondata.AcquisitionImageTargetData(
                initializer=target)
            dist = oldtarget['delta row']**2 + oldtarget['delta column']**2
            while dist in distlist:
                dist += 0.0001
            targetdistances[dist] = target
            distlist.append(dist)
        distlist.sort()

        targetnumber = len(distlist)
        outputnumber = min([targetnumber, limit])

        for i in range(0, outputnumber):
            target = targetdistances[distlist[i]]
            newtarget = leginondata.AcquisitionImageTargetData(
                initializer=target)
            newtarget['fromtarget'] = target
            newlist.append(newtarget)
        return newlist
    def filterTargets(self, targetlist):
        self.logger.info(
            'filtering target list:  sampling extreme and median intensity stats'
        )
        newlist = []
        meanlist = []
        targetmeans = {}
        if not targetlist:
            return []
        if not targetlist[0]['image']:
            return targetlist
        imagearray = targetlist[0]['image']['image']
        shape = imagearray.shape
        half_length = self.settings['square length'] / 2
        for target in targetlist:
            oldtarget = leginondata.AcquisitionImageTargetData(
                initializer=target)
            row, col = oldtarget['delta row'] + shape[0] / 2, oldtarget[
                'delta column'] + shape[1] / 2
            rowrange = (max(0,
                            row - half_length), min(shape[0],
                                                    row + half_length))
            colrange = (max(0,
                            col - half_length), min(shape[0],
                                                    col + half_length))
            mean = imagearray[rowrange[0]:rowrange[1],
                              colrange[0]:colrange[1]].mean()
            stdv = imagearray[rowrange[0]:rowrange[1],
                              colrange[0]:colrange[1]].std()
            #make an unique key for the dictionary targetmeans
            while mean in targetmeans.keys():
                mean = mean + 0.0001
            targetmeans[mean] = target
            meanlist.append(mean)
        meanlist.sort()

        targetnumber = len(meanlist)
        outputnumbers = []
        outputnumbers.extend(range(0, self.settings['dark number']))
        outputnumbers.extend(
            range(targetnumber - self.settings['bright number'], targetnumber))
        median_start = targetnumber / 2 - self.settings['median number'] / 2
        outputnumbers.extend(
            range(median_start, median_start + self.settings['median number']))
        # get unique and sorted list
        outputnumbers = list(set(outputnumbers))
        # create a new target list with these filtered targets
        for i in outputnumbers:
            mean = meanlist[i]
            target = targetmeans[mean]
            newtarget = leginondata.AcquisitionImageTargetData(
                initializer=target)
            newtarget['fromtarget'] = target
            newlist.append(newtarget)
        return newlist
Ejemplo n.º 4
0
	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 getSiblings(self):
		siblings = []
		if self.imagedata:
			targetlistdata = self.imagedata['target']['list']
			targetq = leginondata.AcquisitionImageTargetData(list=targetlistdata,type='acquisition')
			siblings = leginondata.AcquisitionImageData(target=targetq).query()
		return siblings
 def copyTargetList(self, targetlistdata):
                 #make and publish new targetlist
                 alltargets = self.researchTargets(list=targetlistdata)
                 newtargetlistdata = self.newTargetList()
                 newtargetlistdata.update(targetlistdata)
                 self.publish(newtargetlistdata, database=True, dbforce=True)
                 #fill the list with targets
                 newtargets = []
                 newimages = {}
                 for target in alltargets:
                         if target['status'] not in ('done', 'aborted'):
                                 parentimage = target.special_getitem('image',readimages=False,dereference=True)
                                 parentid = parentimage.dbid
                                 if parentid not in newimages.keys():
                                         newimagedata = self.copyImage(parentimage)
                                         newimages[parentid] = newimagedata
                                 else:
                                         newimagedata = newimages[parentid]
                                 newtarget = leginondata.AcquisitionImageTargetData(initializer=target)
                                 newtarget['fromtarget'] = target
                                 newtarget['list'] = newtargetlistdata
                                 newtarget['image'] = newimagedata
                                 newtarget.insert(force=True)
                                 newtargets.append(newtarget)
                 if newtargets:
                         return newtargetlistdata
                 else:
                         return None
 def reacquire(self, targetdata, use_parent_mover=False):
         '''
         Reacquire parent image that created the targetdata but at current stage z.
         '''
         ### get old image
         oldimage = None
         targetlist = targetdata['list']
         # targetdata may be outdated due to other target adjustment
         # This query gives the most recent target of the same specification
         tquery = leginondata.AcquisitionImageTargetData(session=self.session, list=targetlist, number=targetdata['number'], type=targetdata['type'])
         aquery = leginondata.AcquisitionImageData(target=tquery)
         results = aquery.query(readimages=False, results=1)
         if len(results) > 0:
                 oldimage = results[0]
         if oldimage is None:
                 if targetlist:
                         self.logger.error('No image is acquired with target list %d' % targetlist.dbid)
                 return None
         oldemtarget = oldimage['emtarget']
         movetype = oldemtarget['movetype']
         try:
                 emtarget = self.targetToEMTargetData(targetdata,movetype)
         except InvalidStagePosition:
                 self.logger.error('Invalid new emtarget')
                 return None
         oldpresetdata = oldimage['preset']
         presetname = oldpresetdata['name']
         channel = int(oldimage['correction channel']==0)
         self._moveToLastFocusedStageZ()
         self.imageMoveAndPreset(oldimage,emtarget,use_parent_mover)
         targetdata = emtarget['target']
         try:
                 imagedata = self.acquireCorrectedCameraImageData(channel)
         except Exception, exc:
                 self.logger.error('Reacquire image failed: %s' % (exc,))
	def reportTargetStatus(self, target, status):
		# look up most recent version of this target
		tquery = leginondata.AcquisitionImageTargetData()
		tquery['session'] = target['session']
		tquery['list'] = target['list']
		tquery['number'] = target['number']
		tquery['type'] = target['type']
		mostrecent = tquery.query(results=1)
		if mostrecent:
			mostrecent = mostrecent[0]
		else:
			mostrecent = target

		newtarget = leginondata.AcquisitionImageTargetData(initializer=mostrecent, status=status)
		newtarget.insert(force=True)
		self.logger.debug('target stored in DB: %s, %s' % (newtarget.dbid, status))
		return newtarget
Ejemplo n.º 9
0
	def makeTransformTarget(self, target, offset):
		newtarget = leginondata.AcquisitionImageTargetData(initializer=target)
		# Fix here about version
		newtarget['delta row'] = target['delta row'] + offset['y']
		newtarget['delta column'] = target['delta column'] + offset['x']
		newtarget['fromtarget'] = target
		newtarget.insert(force=True)
		self.logger.info('target adjusted by (%.1f,%.1f) (column, row)' % (offset['x'],offset['y']))
		return newtarget
Ejemplo n.º 10
0
 def focusDone(self, targetlistdata):
     self.logger.info(
         'focus already done at previous tilt, forcing focus target status=done'
     )
     targetlist = self.getFocusTargets(targetlistdata)
     for targetdata in targetlist:
         donetarget = leginondata.AcquisitionImageTargetData(
             initializer=targetdata, status='done')
         self.publish(donetarget, database=True)
	def lastTargetNumberOnMosaic(self, imagelist):
		qimagedata = leginondata.AcquisitionImageData()
		qimagedata['list'] = imagelist
		targetquery = leginondata.AcquisitionImageTargetData(image=qimagedata, status='new')
		targets = self.research(datainstance=targetquery, results=1)
		if targets:
			for target in targets:
				if target['number'] is not None:
					return target['number']
		return 0
Ejemplo n.º 12
0
 def appendOtherTargets(self, alltargets, newtargets):
     filteredtype = self.settings['target type']
     for target in alltargets:
         if target['type'] != filteredtype and target['status'] not in (
                 'done', 'aborted'):
             newtarget = leginondata.AcquisitionImageTargetData(
                 initializer=target)
             newtarget['delta row'] = target['delta row']
             newtarget['delta column'] = target['delta column']
             if newtarget not in newtargets:
                 newtargets.append(newtarget)
     return newtargets
Ejemplo n.º 13
0
 def removeDeletedTransformedTargets(self):
     deltapositions = []
     donetargets = []
     currenttargets = self.getTargets(self.childimagedata, 'transformed',
                                      None)
     for i, target in enumerate(currenttargets):
         deltapositions.append(
             (target['delta column'], target['delta row']))
     for i, target in enumerate(self.childprevioustargets):
         if (target['delta column'],
                 target['delta row']) not in deltapositions:
             #find the ancestor target made from transformed target and remove it
             targetq = leginondata.AcquisitionImageTargetData(
                 fromtarget=self.childprevioustargets[i])
             donetargets = targetq.query()
             for j in donetargets:
                 done_target = leginondata.AcquisitionImageTargetData(
                     initializer=donetargets[0], status='done')
                 self.publish(done_target, database=True)
             #mark transformed target done, too
             done_target = leginondata.AcquisitionImageTargetData(
                 initializer=self.childprevioustargets[i], status='done')
             self.publish(done_target, database=True)
Ejemplo n.º 14
0
 def getLastFocusedStageZ(self, targetdata):
     if not targetdata or not targetdata['last_focused']:
         return None
     # FIX ME: This only works if images are taken with the last_focused
     # ImageTargetListData.  Not ideal. Can not rely on FocusResultData since
     # manual z change is not recorded and it is not possible to distinguish
     # true failuer from "fail" at eucentric focus as the contrast is lost.
     qt = leginondata.AcquisitionImageTargetData(
         list=targetdata['last_focused'])
     images = leginondata.AcquisitionImageData(
         target=qt, session=targetdata['session']).query(results=1)
     if images:
         z = images[0]['scope']['stage position']['z']
         return z
	def newTarget(self, drow, dcol, **kwargs):
		'''
		create new AcquistionImageTargetData and fill in all fields
		'''
		targetdata = leginondata.AcquisitionImageTargetData(initializer=kwargs)
		targetdata['delta row'] = drow
		targetdata['delta column'] = dcol
		if 'session' not in kwargs:
			targetdata['session'] = self.session
		if 'version' not in kwargs:
			targetdata['version'] = 0
		if 'status' not in kwargs:
			targetdata['status'] = 'new'
		return targetdata
    def reacquire(self, targetdata, use_parent_mover=False):
        '''
		Reacquire parent image that created the targetdata but at current stage z.
		'''
        ### get old image
        oldimage = None
        targetlist = targetdata['list']
        # targetdata may be outdated due to other target adjustment
        # This query gives the most recent target of the same specification
        tquery = leginondata.AcquisitionImageTargetData(
            session=self.session,
            list=targetlist,
            number=targetdata['number'],
            type=targetdata['type'])
        aquery = leginondata.AcquisitionImageData(target=tquery)
        results = aquery.query(readimages=False, results=1)
        if len(results) > 0:
            oldimage = results[0]
        if oldimage is None:
            if targetlist:
                self.logger.error('No image is acquired with target list %d' %
                                  targetlist.dbid)
            return None
        oldemtarget = oldimage['emtarget']
        movetype = oldemtarget['movetype']
        try:
            emtarget = self.targetToEMTargetData(targetdata, movetype)
        except InvalidStagePosition:
            self.logger.error('Invalid new emtarget')
            return None
        oldpresetdata = oldimage['preset']
        presetname = oldpresetdata['name']
        channel = int(oldimage['correction channel'] == 0)
        self._moveToLastFocusedStageZ()
        stagenow = self.instrument.tem.StagePosition
        msg = 'after moveToLastFocusedStageZ z %.6f' % stagenow['z']
        self.logger.debug(msg)
        # z is not changed within imageMoveAndPreset
        status = self.imageMoveAndPreset(oldimage, emtarget, use_parent_mover)

        targetdata = emtarget['target']
        # extra wait for falcon protector or normalization
        self.logger.info('Wait for %.1f second before reaquire' %
                         self.settings['pause time'])
        time.sleep(self.settings['pause time'])
        try:
            imagedata = self.acquireCorrectedCameraImageData(channel)
        except Exception, exc:
            self.logger.error('Reacquire image failed: %s' % (exc, ))
    def handleTargetListDone(self, evt):
        if not self.settings['process']:
            self.logger.info('processing turned off, ignoring event')
            return

        self.setStatus('processing')

        targetlistdata = evt['targetlist']
        # query images resulting from this targetlist
        tquery = leginondata.AcquisitionImageTargetData(list=targetlistdata)
        imquery = leginondata.AcquisitionImageData(target=tquery)

        ## query, but don't read image files yet, or else run out of memory
        imagelist = imquery.query(readimages=False)
        ## list is reverse chronological, so reverse it
        imagelist.reverse()
        self.processImageList(imagelist)
        self.setStatus('idle')
 def matrixTransformOne(self, target, matrix,newimage=None):
         row = target['delta row']
         col = target['delta column']
         rowcolmatrix = numpy.dot((row,col,1), matrix)
         newtarget = leginondata.AcquisitionImageTargetData(initializer=target)
         # Fix here about version
         newtarget['image'] = newimage
         newtarget['delta row'] = rowcolmatrix[0,0]
         newtarget['delta column'] = rowcolmatrix[0,1]
         newtarget['fromtarget'] = target
         # newimagedata can be none if it is from a virtual grid for atlas
         if newimage is not None:
                 newtarget['version'] = newimage['version']
                 newtarget['scope'] = newimage['scope']
                 newtarget['camera'] = newimage['camera']
                 newtarget['preset'] = newimage['preset']
         newtarget.insert(force=True)
         return newtarget
    def reacquireImage(self,
                       imagedata,
                       test=False,
                       target=None,
                       griddata=None):
        presetname = imagedata['preset']['name']
        self.logger.debug('preset name: %s' % (presetname, ))
        presetdata = self.presetsclient.getPresetFromDB(presetname)

        try:
            t = 'TEM'
            self.instrument.setTEM(presetdata['tem']['name'])
            t = 'CCD Camera'
            self.instrument.setCCDCamera(presetdata['ccdcamera']['name'])
        except (ValueError, TypeError, AttributeError, KeyError):
            self.logger.error('Cannot access %s for preset' % t)
            if test:
                return False
            else:
                return None

        targetdata = leginondata.AcquisitionImageTargetData(
            initializer=imagedata['target'])
        emtargetdata = leginondata.EMTargetData(
            initializer=imagedata['emtarget'])

        movetype = emtargetdata['movetype']
        calclient = self.calibrationclients[movetype]
        row = -targetdata['delta row']
        column = -targetdata['delta column']
        if target is not None:
            row -= target[0]
            column -= target[1]
        target = {'row': row, 'col': column}
        scope, camera = targetdata['scope'], targetdata['camera']
        try:
            scopedata = calclient.transform(target, scope, camera)
        except calibrationclient.NoMatrixCalibrationError, e:
            self.logger.error('No calibration for reacquisition: %s' % e)
            if test:
                return False
            else:
                return None
Ejemplo n.º 20
0
    def researchTargets(self, **kwargs):
        targetquery = leginondata.AcquisitionImageTargetData(**kwargs)
        targets = targetquery.query()
        # organize by list, number, version, status
        organized = {}
        for target in targets:
            if target['list'] is None:
                targetlist = None
            else:
                targetlist = target['list'].dbid
            if targetlist not in organized:
                organized[targetlist] = {}

            number = target['number']
            version = target['version']
            status = target['status']

            if number not in organized[targetlist]:
                organized[targetlist][number] = {'version': 0, 'targets': {}}

            recentversion = organized[targetlist][number]['version']

            if version > recentversion:
                organized[targetlist][number]['version'] = version
                organized[targetlist][number]['targets'] = {status: target}
            elif version == recentversion:
                organized[targetlist][number]['targets'][status] = target

        final = []
        tls = organized.keys()
        tls.sort()
        for targetlist in tls:
            numbers = organized[targetlist].keys()
            numbers.sort()
            for number in numbers:
                statuses = organized[targetlist][number]['targets'].keys()
                ## take only most recent status in this order:
                for status in ('done', 'aborted', 'processing', 'new'):
                    if status in organized[targetlist][number]['targets']:
                        final.append(
                            organized[targetlist][number]['targets'][status])
                        break
        return final
Ejemplo n.º 21
0
 def submitTargets(self):
     targetlistdata = self.targetlistdata
     alltargets = self.alltargets
     newtargets = self.newtargets
     totaloldtargetcount = self.getAllTargetCount(alltargets)
     self.markTargetsDone(alltargets)
     self.logger.info('Original targets marked done.')
     newtargetlistdata = self.newTargetList()
     newtargetlistdata.update(targetlistdata)
     self.publish(newtargetlistdata, database=True, dbforce=True)
     for i, filteredtarget in enumerate(newtargets):
         ## original targets are getting through the filter somehow.
         ## need to make sure we are publishing copies of them.
         newtarget = leginondata.AcquisitionImageTargetData(
             initializer=filteredtarget)
         newtarget['list'] = newtargetlistdata
         newtarget['number'] = i + 1 + totaloldtargetcount
         self.publish(newtarget, database=True, dbforce=True)
     return newtargetlistdata
Ejemplo n.º 22
0
	def transformTargets(self, matrix, targets):

		points = targetPoints(targets)
		shape = targetShape(targets[0])
		points = corners(points, shape)
		newpoints = self.transformPoints(matrix, points)
		centerpoints = centers(newpoints, shape)

		newtargets = []
		for centerpoint,target in zip(centerpoints,targets):
			tiltedtarget = leginondata.AcquisitionImageTargetData(initializer=target)
			tiltedtarget['delta row'] = centerpoint[0]
			tiltedtarget['delta column'] = centerpoint[1]
			tiltedtarget['version'] = 0
			newtargets.append(tiltedtarget)

		displaypoints = transposePoints(newpoints)
		self.setTargets(displaypoints, 'Peak')

		return newtargets
Ejemplo n.º 23
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
Ejemplo n.º 24
0
    def acquire(self, presetdata, emtarget=None, attempt=None, target=None):
        '''
		this replaces Acquisition.acquire()
		Instead of acquiring an image, we acquire a series of beam tilt images
		'''
        if self.catchBadSettings(presetdata) == 'error':
            return 'error'

        self.rpixelsize = None
        self.defocus = presetdata['defocus']
        ## sometimes have to apply or un-apply deltaz if image shifted on
        ## tilted specimen
        if emtarget is None:
            self.deltaz = 0
        else:
            self.deltaz = emtarget['delta z']

        # aquire and save the focus image
        oldbt = self.instrument.tem.BeamTilt
        tiltlist, anglelist, radlist = self.getBeamTiltList()

        ## initialize a new tableau
        self.initTableau()

        ## first target is the one given, the remaining are created now
        emtargetlist = []
        emtargetlist.append(emtarget)
        for i in range(len(tiltlist) - 1):
            ## check if target is simulated or not
            if target['type'] == 'simulated':
                newtarget = self.newSimulatedTarget(preset=presetdata)
                newemtarget = leginondata.EMTargetData(initializer=emtarget,
                                                       target=newtarget)
            else:
                lastnumber = self.lastTargetNumber(image=target['image'],
                                                   session=self.session)
                newnumber = lastnumber + 1
                newtarget = leginondata.AcquisitionImageTargetData(
                    initializer=target, number=newnumber)
                newemtarget = leginondata.EMTargetData(initializer=emtarget,
                                                       target=newtarget)

            newemtarget.insert(force=True)
            emtargetlist.append(newemtarget)

        displace = []
        for i, bt in enumerate(tiltlist):
            emtarget = emtargetlist[i]
            if i == 0:
                channel = 0
            else:
                channel = 1
            self.logger.info('Old beam tilt: %.4f, %.4f' % (
                oldbt['x'],
                oldbt['y'],
            ))
            newbt = {'x': oldbt['x'] + bt['x'], 'y': oldbt['y'] + bt['y']}
            self.instrument.tem.BeamTilt = newbt
            self.logger.info('New beam tilt: %.4f, %.4f' % (
                newbt['x'],
                newbt['y'],
            ))
            status = manualfocuschecker.ManualFocusChecker.acquire(
                self, presetdata, emtarget, channel=channel)
            imagedata = self.imagedata
            # get these values once
            if not self.rpixelsize or not self.ht or not self.cs:
                self.rpixelsize = self.btcalclient.getImageReciprocalPixelSize(
                    imagedata)
                self.ht = imagedata['scope']['high tension']
                self.cs = imagedata['scope']['tem']['cs']
            self.setImage(imagedata['image'], 'Image')
            self.instrument.tem.BeamTilt = oldbt
            angle = anglelist[i]
            rad = radlist[i]

            if self.settings['tableau type'] == 'split image-power':
                self.splitTableau(imagedata)
            elif 'beam tilt series' in self.settings['tableau type']:
                self.insertTableau(imagedata, angle, rad)
            if self.settings['tableau type'] == 'beam tilt series-image':
                try:
                    shiftinfo = self.correlateOriginal(i, imagedata)
                except Exception, e:
                    self.logger.error('Failed correlation: %s' % e)
                    return 'error'
                pixelshift = shiftinfo['pixel shift']
                displace.append((pixelshift['row'], pixelshift['col']))
Ejemplo n.º 25
0
# prompt user to confirm session before modifying database
prompt = """Found the following session:
	Name:  %s
	User:  %s %s
	Comment:  %s
Type "ok" if this is the correct session: """ % (
    sessiondata['name'], sessiondata['user']['firstname'],
    sessiondata['user']['lastname'], sessiondata['comment'])
response = raw_input(prompt)
if response != 'ok':
    print 'no change to database'
    sys.exit(1)

# find targets in this session
targetq = leginondata.AcquisitionImageTargetData(session=sessiondata)
targets = targetq.query()

print 'Found %d target records.  Searching for targets not done...' % (
    len(targets), )

# for each target, insert new target with status = 'done'
targetdict = {}
targetdatadict = {}
for target in targets:
    imref = target.special_getitem('image', dereference=False)
    if imref is None:
        filename = 'None'
    else:
        im = imref.dataclass.direct_query(imref.dbid, readimages=False)
        filename = im['filename']
            else:
                return None

        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'
class Reference(watcher.Watcher, targethandler.TargetHandler):
    panelclass = gui.wx.Reference.ReferencePanel
    settingsclass = leginondata.ReferenceSettingsData
    eventinputs = watcher.Watcher.eventinputs + \
                              presets.PresetsClient.eventinputs + \
                              [event.ReferenceTargetPublishEvent]
    eventoutputs = watcher.Watcher.eventoutputs + \
                                    presets.PresetsClient.eventoutputs

    defaultsettings = {
        'move type': 'stage position',
        'pause time': 3.0,
        'interval time': 0.0,
    }

    def __init__(self, *args, **kwargs):
        try:
            watch = kwargs['watchfor']
        except KeyError:
            watch = []
        kwargs['watchfor'] = watch + [event.ReferenceTargetPublishEvent]
        watcher.Watcher.__init__(self, *args, **kwargs)
        targethandler.TargetHandler.__init__(self)

        self.instrument = instrument.Proxy(self.objectservice, self.session)

        self.calibration_clients = {
            'image shift':
            calibrationclient.ImageShiftCalibrationClient(self),
            'stage position':
            calibrationclient.StageCalibrationClient(self),
            'modeled stage position':
            calibrationclient.ModeledStageCalibrationClient(self),
            'image beam shift':
            calibrationclient.ImageBeamShiftCalibrationClient(self),
            'beam shift':
            calibrationclient.BeamShiftCalibrationClient(self),
        }

        self.presets_client = presets.PresetsClient(self)

        self.player = player.Player(callback=self.onPlayer)
        self.panel.playerEvent(self.player.state())
        self.lock = threading.RLock()
        self.reference_target = None

        self.last_processed = None

        if self.__class__ == Reference:
            self.start()

    def processData(self, incoming_data):
        if isinstance(incoming_data, leginondata.ReferenceTargetData):
            self.processReferenceTarget(incoming_data)

    def processReferenceTarget(self, target_data):
        self.lock.acquire()
        self.reference_target = target_data
        self.lock.release()

    def getEMTargetData(self, check_preset_name=None):
        target_data = self.reference_target
        if target_data is None:
            raise MoveError('no reference target available')
        move_type = self.settings['move type']
        calibration_client = self.calibration_clients[move_type]

        target_delta_row = target_data['delta row']
        target_delta_column = target_data['delta column']
        pixel_shift = {'row': -target_delta_row, 'col': -target_delta_column}
        target_scope = leginondata.ScopeEMData(
            initializer=target_data['scope'])
        for i in ['image shift', 'beam shift', 'stage position']:
            target_scope[i] = dict(target_data['scope'][i])
        target_camera = target_data['camera']

        args = (pixel_shift, target_scope, target_camera)
        try:
            scope = calibration_client.transform(*args)
        except calibrationclient.NoMatrixCalibrationError, e:
            message = 'no %s calibration to move to reference target: %s'
            raise MoveError(message % (move_type, e))

        em_target_data = leginondata.EMTargetData()
        if check_preset_name is None:
            em_target_data['preset'] = target_data['preset']
        else:
            check_preset_data = self.presets_client.getPresetByName(
                check_preset_name)
            em_target_data['preset'] = check_preset_data
        for i in ['image shift', 'beam shift']:
            em_target_data[i] = em_target_data['preset'][i]
        em_target_data['stage position'] = scope['stage position']
        em_target_data['movetype'] = move_type
        if move_type == 'modeled stage position':
            scope_move_type = 'stage position'
        else:
            scope_move_type = move_type
        em_target_data[scope_move_type] = scope[scope_move_type]
        em_target_data['target'] = leginondata.AcquisitionImageTargetData(
            initializer=target_data)

        return em_target_data