One of the typical use cases is to take an image at each point of a scan. The detector attributes are prepared inside the gh_pre_scan hook:
#
# ScanInfo is needed by the prepareDetectorAttrs() function
#
...
scanInfo = HasyUtils.createScanInfo( self.getParentMacro().getCommand())
self.setEnv( "ScanInfo", scanInfo)
if HasyUtils.isInMg( self, detectorName):
if not HasyUtils.prepareDetectorAttrs( self,
name = detectorName,
trig_mode = 'ints',
nbFrames = 1, # per trigger
acq_time = scanInfo[ 'sampleTime'],
NbTriggers = scanInfo[ 'intervals'] + 1,
ArmFlag = True,
ImagesPerFile = 1000):
#
# sets these detector attributes ...
# CountTime
# NbImages
# NbTriggers
# TriggerMode
#
# ... and these Filewrite attributes
# FilenamePattern = current/raw/<prefix>_<ScanID>/<detectorName>/<prefix>_<ScanID>
# using ScanID, ScanFile
# ImagesPerFile = 1000 by default
#
# Eventually execute
# Arm(), if armFlag
To reset things the gh_post_scan hook is used. This is absolutely necessary because the next action could be a 'ct' which does not involve any hooks or other injected code.
class gh_post_scan(Macro):
def run( self):
if not HasyUtils.isInMg( self, detectorName):
self.output( "general_features.gh_post_scan: %s not in the MG, DONE" % detectorName)
return True
self.output( "general_features.post_scan %s to %s" % (detectorName, detectorRoot))
if not HasyUtils.resetDetectorAttrs( self, name = detectorName, rootDir = detectorRoot):
self.output( "general_features.gh_post_scan: resetDetector: returned error")
return False
res = HasyUtils.storeEnv()
self.output( "gh_post_scan: stored env in %s" % res)
return True
This is the debug output when executing an ascan:
p10/door/haspp10lab.01 [7]: ascan exp_dmy01 0 10 10 0.1
Operation will be saved in /gpfs/commissioning/raw/svk_zipgrp_00010/svk_zipgrp_00010.fio (fio)
Scan #51 started at Tue Feb 23 14:21:38 2021. It will take at least 0:00:01.100696
#Pt No exp_dmy01 lab_t01 curpetra e4m dt
general_features.pre_scan hook
scanInfo: {'sampleTime': 0.1, 'serialno': 51, 'intervals': 10, 'motors': [{'start': 0.0, 'stop': 10.0, 'name': 'exp_dmy01'}], 'title': 'ascan exp_dmy01 0.0 10.0 10 0.1'}
MsUtils.prepareEigerDectrisAttrs: CountTime to 0.1
MsUtils.prepareEigerDectrisAttrs: FrameTime to 0.1
MsUtils.prepareEigerDectrisAttrs: NbImages to 1
MsUtils.prepareEigerDectrisAttrs: TriggerMode to ints
MsUtils.prepareEigerDectrisAttrs: NbTrigger to 11
MsUtils.prepareEigerDectrisAttrs: FilenamePattern to commissioning/raw/svk_zipgrp_00051/e4m/svk_zipgrp_00010
MsUtils.prepareEigerDectrisAttrs: ImagesPerFile to 11
0 0 0.1 0.0201445 (2, 1) 1.05812
1 1 0.1 0.0201445 (2, 1) 1.92005
2 2 0.1 0.0201445 (2, 1) 2.33897
3 3 0.1 0.0198458 (2, 1) 2.7986
4 4 0.1 0.0198458 (2, 1) 3.21271
5 5 0.1 0.0195969 (2, 1) 3.67174
6 6 0.1 0.0195969 (2, 1) 4.09654
7 7 0.1 0.0195573 (2, 1) 4.55709
8 8 0.1 0.0195573 (2, 1) 4.97387
9 9 0.1 0.0195573 (2, 1) 5.43166
10 10 0.1 0.0188995 (2, 1) 5.84431
general_features.post_scan e4m to /home/p10user/temp
MsUtils.resetEigerDectrisAttrs: FilenamePattern to current/raw/SingleShots/svk_zipgrp_00010
MsUtils.resetEigerDectrisAttrs: ImagesPerFile to 1
MsUtils.resetEigerDectrisAttrs: NbImages to 1
MsUtils.resetEigerDectrisAttrs: NbTriggers to 1
MsUtils.resetEigerDectrisAttrs: TriggerMode to ints
gh_post_scan: stored env in /gpfs/commissioning/raw/svk_zipgrp_00010//svk_zipgrp_00051.env
Operation saved in /gpfs/commissioning/raw/svk_zipgrp_00010/svk_zipgrp_00051.fio (fio)
Scan #51 ended at Tue Feb 23 14:21:45 2021, taking 0:00:07.048096. Dead time 84.4% (motion dead time 1.4%)
Notice that FilenamePattern is reset to the SingleShots directory after the scan is finished. This way 'ct' will write to the correct directory.