[3dem] Dose-symmetric tilt scheme for electron cryo tomography
Ben Engel
bdengel at gmail.com
Mon May 22 02:27:09 PDT 2017
Hi Davide,
Yes, we've expanded Wim's script to use target counts (but did not
implement 1/cos), which will give you longer exposures at the higher tilt
angles. Our script also allows you to start the tomogram at a pre-tilt
(say, 10 degrees). This is useful for tomography of FIB lamellas, which
are inclined (and thus 0 degrees isn't the least tilted projection). You
can just set this parameter to 0 degrees though.
One improvement that is still needed is a check for the stage tilt angle
before acquiring a record image. Our stage sometimes gets stuck before
reaching the desired tilt and will then take an image at this incorrect
tilt. I guess this should be fairly easy to implement.
I am attaching the script, and also notes from Philipp Stawski, who did
most of the work.
Also, if you find the Hagen Scheme (TM) as useful as we do, please tell
David Mastronarde. If enough of us bug him, perhaps this feature will find
its way into standard tilt-series acquisition in a future release of
SerialEM.
Good luck,
Ben
------
*Hi Everyone, *
as promised here is a version of the Hagen tilt scheme that I modified so
that it can be started at any starting angle.
For lamellae, the pre tilt is 7 º, i.e. if you’re milling at 18º, 11º stage
tilt should be your actual ‘0º’. I routinely use a starting angle of 10º,
and this results in virtually the same number of counts when tilting +xº
and -xº from your actual zero.
*The procedure to use the script is as follows:*
0) Set up your SerialEM session as usual.
1) Copy the contents of the file to an empty macro slot and change
parameters as needed. (Once you save your settings the script will be there
permanently)
2) Check and adjust AngleOffset (your starting angle), CountTarget (the
number of counts you’re asking for each image), step (the angle increment)
and tilttimes (how many times the script will do +step -> -step ->
-2*step -> +2*step, e.g. for step = 2, tilt times = 15 you will get ±60º
around your actual ‘zero’)
Make sure you’re not exceeding the stage limits!!!
3) Do rough and fine eucentric height.
4) Tilt to your actual zero (i.e. ~11º for 18º milling angle).
5) Select record and focus area and run autofocus.
6) Run the script from the dop-down menu.
7) After taking the first record, the script will ask for a name for the
tomogram stack file (you can open a new file before running the script,
too).
8) When done, the script will tilt back to your actual zero and the log
will read ‘Tomogram done!'
A few remarks:
• The script can be paused at any time by pressing ‘STOP’ and resumed by
pressing ‘RESUME’. However, there is a chance that it can get stuck in a
loop.
I therefore suggest you currently don’t stop it while it is waiting to
take the record (i.e. Log should not say ‘Record settling!’).
• If you run another script or change a script while paused, *you will not
be able to resume*! There is currently no option to continue an already
started
tomogram acquisition, but I’m working on that and will let you know once
it is done.
• When setting up your tomogram, adjust your record exposure so that you’re
roughly getting the set number of counts. Otherwise your first image
will be off in counts (under/overexposed).
• If you don’t want to use counts, just comment out the lines that say
‘SetExposureForMean $CountTarget'. We can have a look how to implement
a 1/cos approach for increasing the exposure timing.
If you have any questions on how to run the script or on our experience
with it so far, don’t hesitate to ask.
Best,
Philipp.
On Mon, May 22, 2017 at 9:34 AM, Davide Floris <dafloris at biophys.mpg.de>
wrote:
> Dear all,
> I’m wondering if any of you involved in electron cryo tomography has
> implemented the dose-symmetric tilt scheme from
> “Implementation of a cryo-electron tomography tilt-scheme optimized for
> high resolution subtomogram averaging” (Hagen WJ, Wan W, Briggs JA; JSB,
> 197(2):191-198; Feb 2017)
> to use longer exposure times as the tilt angle increases. In latitude it’s
> possible to do this by selecting the option “1/cosine^n” in the exposure
> time parameters, but of course it is not possible to use a symmetric
> acquisition.
> Has anybody tried to modify the SerialEM macro in this sense?
> Thanks a lot for the kind attention.
> Best regards,
>
> Davide Floris
> _________________________________________________
>
> Davide Floris
> PhD student
> Max Planck Institute of Biophysics
> Structural Biology Department
> Max-von-Laue Straße 3
> 60438 Frankfurt am Main
> Germany
>
> (L2.090): +49-69-6303-3037 <+49%2069%2063033037>
> (B2.205): +49-69-6303-3049 <+49%2069%2063033049>
>
>
> _______________________________________________
> 3dem mailing list
> 3dem at ncmir.ucsd.edu
> https://mail.ncmir.ucsd.edu/mailman/listinfo/3dem
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.ncmir.ucsd.edu/pipermail/3dem/attachments/20170522/a365b081/attachment-0001.html>
-------------- next part --------------
MacroName DoseSymmetricTomo_Starting_At_Offset
# EMBL Heidelberg 2015 Wim J. H. Hagen
#
# Edited: B. Engel, P. Stawski 2017
# using fixed counts and starting at an angle offset (for lamellae)
# attempts to fix issues where stage can get stuck (tracking error) on plus2 tilt (from small negative values, e.g. -30 to + 50)
# this should be split in even more steps ...
#
# Roll Buffers A-> H.
# Uses LowDose
# Run eucentric rough and fine
# Track plus K
# Track min L
# Record plus M
# Record min N
########## SETTINGS #############
step = 2 # stage tilt step in degrees
tilttimes = 15 # multiply by 4 images + 1 image - check that you're not exceeding the stage limits!
Tiltbacklash = -2 # negative tilts will be backlashed, must be negative value!
Driftcrit = 3 # Angstrom/second
Driftinterval = 10 # wait time between drift measurements in seconds
Drifttimes = 10 # maximum number of drift measurements before moving on and taking images anyway
RecordAreaWaitTime = 20 # waiting time in s before taking the record image (fixes issues with blurry images)
CountTarget = 100 # set target counts for tomogram
AngleOffset = 10 # starting angle
######## internal variables ######
LoopCount = 1
########## END SETTINGS ##########
tiltangle = $AngleOffset
# start at AngleOffset, i.e. "Zero"
Echo
Echo Taking image at $tiltangle degrees:
CallFunction DoseSymmetricTomo_Starting_At_Offset::TiltZero_OFF
# prevent runaway focus
AbsoluteFocusLimits -10 10
FocusChangeLimits -2 2
Loop $tilttimes
# tilt plus1
tiltangle = $AngleOffset + $step * $LoopCount
Echo
Echo Taking image at $tiltangle degrees:
CallFunction DoseSymmetricTomo_Starting_At_Offset::TiltPlus_OFF
# tilt min1
tiltangle = $AngleOffset - $step * $LoopCount
Echo
Echo Taking image at $tiltangle degrees:
CallFunction DoseSymmetricTomo_Starting_At_Offset::TiltMinus_OFF
# tilt min2
tiltangle = $AngleOffset - $step * ($LoopCount + 1)
Echo
Echo Taking image at $tiltangle degrees:
CallFunction DoseSymmetricTomo_Starting_At_Offset::TiltMinus_OFF
# how to fix the stage tracking issues upon tilting back up...
tmp = ($tiltangle + $AngleOffset) * 0.5
TiltTo $tmp # see if this works ...
TiltTo $AngleOffset # stupid at low tilts but necessary at high tilts with the current stage
# tilt plus2
tiltangle = $AngleOffset + $step * ($LoopCount + 1)
Echo
Echo Taking image at $tiltangle degrees:
CallFunction DoseSymmetricTomo_Starting_At_Offset::TiltPlus_OFF
LoopCount = $LoopCount + 2
EndLoop
# when done
TiltTo $AngleOffset
ResetImageShift
T
SetDefocus 0
CloseFile # added this so you don't need to remember ;-)
Echo Tomogram done!
Exit
# individual functions called during the script main loop
function TiltZero_OFF
# store stage position
ReportStageXYZ
StageX = $ReportedValue1
StageY = $ReportedValue2
# drift and tracking
T
Copy A K
Copy A L
Delay $driftinterval
Loop $drifttimes index
T
AlignTo K
ReportAlignShift
dx = $reportedValue3
dy = $reportedValue4
dist = sqrt $dx * $dx + $dy * $dy
rate = $dist / $driftinterval * 10
echo Rate = $rate A/sec
If $rate < $driftcrit
echo Drift is low enough after shot $index
break
Elseif $index < $drifttimes
Delay $driftinterval
Else
echo Drift never got below $driftcrit: Skipping ...
break
Endif
EndLoop
# autofocus
G
G
G
# store defocus
ReportDefocus
focusplus = $RepVal1
focusmin = $RepVal1
# acquire tilt image
GoToLowDoseArea R
Echo Record settling!
Delay $RecordAreaWaitTime
R
S
ReportMeanCounts A
# target counts for tomogram (leave uncommented)
SetExposureForMean $CountTarget
Copy A M
Copy A N
# store image shifts
ReportImageShift
ISxplus = $RepVal1
ISyplus = $RepVal2
ISxminus = $RepVal1
ISyminus = $RepVal2
# tracking after just to be sure
T
Copy A K
Copy A L
endfunction
function TiltPlus_OFF
# tilt stage
TiltTo $tiltangle
# reset stage XY
MoveStageTo $StageX $StageY
# set defocus and image shift
GoToLowDoseArea R
SetDefocus $focusplus
SetImageShift $ISxplus $ISyplus
# drift and tracking
T
AlignTo K
Delay $driftinterval
Loop $drifttimes index
T
AlignTo K
ReportAlignShift
dx = $reportedValue3
dy = $reportedValue4
dist = sqrt $dx * $dx + $dy * $dy
rate = $dist / $driftinterval * 10
echo Rate = $rate A/sec
If $rate < $driftcrit
echo Drift is low enough after shot $index
break
Elseif $index < $drifttimes
Delay $driftinterval
Else
echo Drift never got below $driftcrit: Skipping ...
break
Endif
EndLoop
# autofocus. Two rounds. Remove one G for single focus round.
G
G
# store defocus
ReportDefocus
focusplus = $RepVal1
# acquire tilt image
GoToLowDoseArea R
Echo Record settling!
Delay $RecordAreaWaitTime
R
S
ReportMeanCounts A
# target counts (comment out if plus is higher tilt)
SetExposureForMean $CountTarget
# tracking after
AlignTo M
Copy A M
# store image shifts
ReportImageShift
ISxplus = $RepVal1
ISyplus = $RepVal2
# new track reference
T
Copy A K
endfunction
Function TiltMinus_OFF
# tilt stage with backlash
TiltTo $tiltangle
TiltBy $Tiltbacklash
TiltTo $tiltangle
# reset stage XY
MoveStageTo $StageX $StageY
# set defocus and image shift
GoToLowDoseArea R
SetDefocus $focusmin
SetImageShift $ISxminus $ISyminus
# drift and tracking
T
AlignTo L
Delay $driftinterval
Loop $drifttimes index
T
AlignTo L
ReportAlignShift
dx = $reportedValue3
dy = $reportedValue4
dist = sqrt $dx * $dx + $dy * $dy
rate = $dist / $driftinterval * 10
echo Rate = $rate A/sec
If $rate < $driftcrit
echo Drift is low enough after shot $index
break
Elseif $index < $drifttimes
Delay $driftinterval
Else
echo Drift never got below $driftcrit: Skipping ...
break
Endif
EndLoop
# autofocus. Two rounds. Remove one G for single focus round.
G
G
# store defocus
ReportDefocus
focusmin = $RepVal1
# acquire tilt image
GoToLowDoseArea R
Echo Record settling!
Delay $RecordAreaWaitTime
R
S
ReportMeanCounts A
# target counts (comment out if minus is higher tilt)
# SetExposureForMean $CountTarget
# tracking after
AlignTo N
Copy A N
# store image shifts
ReportImageShift
ISxminus = $RepVal1
ISyminus = $RepVal2
# new track reference
T
Copy A L
endfunction
More information about the 3dem
mailing list