Files
x11ma/script/templates/EigerAbsSpec.py
gac-x11ma b658ce0a15
2025-12-17 09:56:56 +01:00

149 lines
4.4 KiB
Python

#If running from editor
if (get_exec_pars().source == CommandSource.ui) and (get_exec_pars().script == "EigerAbsSpec") :
ROI = {"Region1": [10,5,20, 10], "Region2": [20,15,20, 10]}
SAVE_SPECTRUM = True
SAVE_IMAGES = True
WITH_I0 = True
SWITCH_POL = False
EXPOSURE = 1.0
AVERAGE = 1
NUMBER_SCANS = 2
RANGES = [[600.0, 605.0, 1.0]]
DRIFT_CORRECTION = True
print "Starting AbsSpec: ",SAVE_SPECTRUM, SAVE_IMAGES, WITH_I0, SWITCH_POL, EXPOSURE, AVERAGE, NUMBER_SCANS, RANGES
SAVE_DIAGS = True
calculated_shifts={}
if SWITCH_POL:
init_pol_switch("Normal")
log("ROIs: " + str(ROI))
if len(RANGES) == 0:
raise Exception("No scan range defined")
start = time.time()
init_eiger(exposure=EXPOSURE)
#set_exec_pars(name="AbsortionSpectrum", format="csv", layout="table")
tag = None #AbsortionSpectrum_{seq}%03d_{count}%02d"
set_exec_pars(name="AbsortionSpectrum")
rois = create_roi_devices(ROI)
if AVERAGE>1:
for i in range(len(rois)):
rois[i].monitored = True
rois[i] = create_averager(rois[i], AVERAGE, -1)
rois[i].monitored = True
frames=[]
class SyncEnergy(Writable):
def write(self,pos):
if not get_dry_run():
#put_energy(pos)
BML_energy.move(pos)
else:
print "Energy=" + str(pos)
sync_energy=SyncEnergy()
set_device_alias(sync_energy, "Energy") #Set display name
sensors = rois + [SR_current]
if WITH_I0:
sensors = sensors + [Keithley_1_raw]
av=None
def grab_image(position, scan):
global av
av = average_eiger_frames(AVERAGE, roi=None, wait_next=True)
if SAVE_IMAGES:
metadata = get_diags() if SAVE_DIAGS else {}
FormatTIFF.setMetadata(metadata)
if DRIFT_CORRECTION and (calc_roi is not None):
global ref_image
scan_name = get_data_manager().getScanPath(scan)
filename = get_exec_pars().path + "/" + scan_name + "_corr_" + ("%04d.tiff" % (scan.recordIndexInPass-1))
filename = Setup.expandPath(filename)
if ref_image is None:
ref_image = av
save_as_tiff(av, filename, metadata=metadata)
else:
shift_and_save_as_tiff(av, filename, ref_image, calc_roi, metadata=metadata)
class Average(ReadableMatrix):
def read(self):
return av.matrix
def getWidth(self):
return eiger.dataMatrix.getWidth()
def getHeight(self):
return eiger.dataMatrix.getHeight()
averager=Average()
set_device_alias(averager, "Image") #Set display name
if SAVE_IMAGES:
sensors.append(averager) #sensors.append(eiger.getDataMatrix())
#Initialize vartiables
if not get_dry_run() and str(get_setting("AUTO_SWITCH_VALVE")).lower() == "true":
open_vg10()
if not get_dry_run() and str(get_setting("AUTO_SWITCH_SHUTTER")).lower() == "true":
caput(FAST_SHTR, 'Open')
#put_id_offset(1, OFFSET_ID_1) #offset on ID1
#put_id_offset(2, OFFSET_ID_2) #offset on ID2
"""
if ID == "ID1":
current_pol=POL_IDS[POL_ID_1] #get_id_pol(1)
put_id_pol(1,current_pol)
caput('X11MA-ID2-GAP:SET',100) #open Gap ID2
elif ID == "ID2":
current_pol=POL_IDS[POL_ID_2]#get_id_pol(2)
put_id_pol(2,current_pol)
caput('X11MA-Ivg10D1-GAP:SET',100) #open Gap ID1
elif ID == "ID1_ID2":
polID1=POL_IDS[POL_ID_1]
polID2=POL_IDS[POL_ID_2]
put_id_pol(1,polID1)
put_id_pol(2,polID2)
wait_channel("X11PHS:alldone", 1)
"""
if DRIFT_CORRECTION:
roi = IMAGING_ROI
if roi is None:
roi = DEFAULT_ROI
calc_roi = Roi(roi.x,roi.y,roi.width, roi.height)
ref_image = None # grab_frame(image, None, True)
def after_pass(pass_number, scan):
if SWITCH_POL:
if pass_number<scan.numberOfPasses:
switch_pol()
try:
rscan(sync_energy, sensors, RANGES, latency = 0.0 , passes = NUMBER_SCANS, tag=tag, before_read=grab_image, save=SAVE_SPECTRUM, split=True, keep=False, after_pass=after_pass)
finally:
FormatTIFF.setMetadata({})
if AVERAGE>1:
for i in range(len(rois)):
rois[i].parent.monitored = False # Remove listeners on the image
if not get_dry_run() and str(get_setting("AUTO_SWITCH_VALVE")).lower() == "true":
close_vg10()
if not get_dry_run() and str(get_setting("AUTO_SWITCH_SHUTTER")).lower() == "true":
caput(FAST_SHTR, 'Close')
restore_eiger()
print "Running time: " + str(time.time() - start)