Feature #5339
openImplement 'Final Image-Beam Shift' for JEOL microscopes
0%
Description
We cannot get good enough accuracy using only stage position in the navigator.
We want to improve the targeting accuracy with a combination of stage movement and final image shift. However, this requires specific relationship between the acquiring presets and parent image presets.
Not sure how this works on FEI scopes, but on the JEOL scopes, image shift does not work unless the beam is shifted as well.
So, I want to implement a 'Final Image-Beam Shift' method for the JEOL scope. Most of the code comes down to navigator.py and presets.py, specifically the lines associated with 'keep image shift':
if ievent['keep image shift']: dx = 0.0 dy = 0.0 # figure out image shift offset from current preset temname = self.currentpreset['tem']['name'] if 'Jeol' not in temname: scope_ishift = self.instrument.tem.ImageShift if self.currentpreset is None: dx = scope_ishift['x'] dy = scope_ishift['y'] else: dx = scope_ishift['x'] - self.currentpreset['image shift']['x'] dy = scope_ishift['y'] - self.currentpreset['image shift']['y'] else: # Avoid unknown bug with JEOL scopes: #can not read pre-existing image shift offset at this point self.logger.info('Jeol hack: pre-existing image shift offset dy=0,0')
for the JEOL, I implemented the change:
if ievent['keep image-beam shift']: self.logger.info('Keeping pre-existing image-beam shift offset') # send image shift offset to scope scope_ishift = self.instrument.tem.ImageShift scope_bshift = self.instrument.tem.BeamShift ix = scope_ishift['x'] + idx iy = scope_ishift['y'] + idy self.logger.info('Neil: Applying image shift of (%.2e,%.2e) to (%.2e,%.2e)'%(idx, idy, ix, iy)) bx = scope_bshift['x'] + bdx by = scope_bshift['y'] + bdy self.logger.info('Neil: Applying beam shift of (%.2e,%.2e) to (%.2e,%.2e)'%(bdx, bdy, bx, by)) self.instrument.tem.ImageShift = {'x': ix, 'y': iy} self.instrument.tem.BeamShift = {'x': bx, 'y': by}
But the problem is that the direction of the beam shift changes with the magnification and we are moving the beam in the wrong direction.
I now plan to implement a rotation matrix to move the beam in the correct direction at the corresponding magnification. In the short term, I thought about hard-coding it for our scope and then making it more general in the future, but
I have a question for Anchi: "are the beam x-y axis directions information stored in the database?"
Updated by Anchi Cheng almost 7 years ago
See Issue #3909 and its related commit. It was made originally for JEOL scope when we had one. See if that works.
On FEI scopes, user applied image shift is automatically compensated with a beam shift at a lower level so that we don't have to specify it.
keep image shift is for aligning the presets properly. It may cause problem down the line if you use that to pass this event for applying extra image-beam
shift after a stage move.
There exists an implementation of what you want called "final image shift". You will find that settings in AcquisitionSettingsData and the moveToTarget function in navigator.py NavigatorClient class. You can trace from there.
It was made for tomography and was crude because it does not have proper pause. We found that in SP operation, the call for image shift causes drift. Looking at the code, it should be made better. It can resolve your problem in a more consistent way if it is tidy up there. Want to try that ?
Updated by Anchi Cheng almost 7 years ago
- Related to Bug #3944: jeolcom image shift scale is mag dependent if PLA is used to shift added