161 lines
6.4 KiB
Python
161 lines
6.4 KiB
Python
|
|
|
|
|
|
|
|
def init_eiger(exposure=None, check=True, retries=2):
|
|
"""
|
|
Set Eiger scan mode
|
|
"""
|
|
global chrono_eiger
|
|
chrono_eiger.waitTimeout(CONTINOUS_MODE_MIN_TIME)
|
|
for i in range(retries):
|
|
try:
|
|
stop_eiger() #Set mode single
|
|
eiger.setNumImages(1)# Is it relevant?]
|
|
caputq("X11MA-ES1-SD1:cam1:NumImages",1);
|
|
set_eiger_number_of_frames(1)
|
|
caget("X11MA-ES1-SD1:cam1:NumFrames_RBV") and compares before writing (therefore does nothing)
|
|
if exposure:
|
|
set_exposure_time(exposure, check)
|
|
apply_averaging_detector(is_averaging_detector())
|
|
caput("X11MA-ES1-SD1:Proc1:EnableFilter", False)
|
|
caput("X11MA-ES1-SD1:Proc1:NumFilter", 1)
|
|
caput("X11MA-ES1-SD1:cam1:NumCycles", 1)
|
|
break
|
|
except:
|
|
if i==(retries-1):
|
|
raise
|
|
else:
|
|
print "Error initializing Eiger, retrying: " + str(sys.exc_info()[1])
|
|
|
|
def restore_eiger(check=True, retries=2, exposure_time = 0.2):
|
|
"""
|
|
Set Eiger default mode
|
|
"""
|
|
global chrono_eiger
|
|
for i in range(retries):
|
|
try:
|
|
stop_eiger()
|
|
eiger.setNumImages(1)# Is it relevant?
|
|
caputq("X11MA-ES1-SD1:cam1:NumImages",1);
|
|
set_eiger_number_of_frames(1, check)
|
|
set_exposure_time(exposure_time, check)
|
|
apply_averaging_detector(False)
|
|
caput("X11MA-ES1-SD1:Proc1:EnableFilter", False)
|
|
caput("X11MA-ES1-SD1:Proc1:NumFilter", 1)
|
|
caput("X11MA-ES1-SD1:cam1:NumCycles", 1)
|
|
eiger.grabMode=eiger.GrabMode.Continuous
|
|
caputq("X11MA-ES1-SD1:cam1:ImageMode", Single)
|
|
eiger.start()
|
|
caputq("X11MA-ES1-SD1:cam1:Acquire", 1)
|
|
chrono_eiger = Chrono()
|
|
break
|
|
except:
|
|
if i==(retries-1):
|
|
raise
|
|
else:
|
|
print "Error restoring Eiger, retrying " + str(sys.exc_info()[1])
|
|
|
|
|
|
def set_exposure_time(value, check = True, retries=5):
|
|
if value == eiger.getExposure():
|
|
caget("X11MA-ES1-SD1:cam1:AcquireTime"), if equals retuem
|
|
return
|
|
started = eiger.isStarted()
|
|
caget("X11MA-ES1-SD1:cam1:Acquire"),
|
|
if started:
|
|
stop_eiger()
|
|
for i in range(retries):
|
|
try:
|
|
eiger.setExposure(value)
|
|
caputq("X11MA-ES1-SD1:cam1:AcquireTime", value)
|
|
if check:
|
|
readback=get_eiger_exposure_readback()
|
|
caget("X11MA-ES1-SD1:cam1:AcquireTime_RBV")
|
|
if abs(value - readback) > 0.01:
|
|
raise Exception("Error changing Eiger exposure time to %f: readback=%f" % (value, readback))
|
|
except:
|
|
if i==(retries-1):
|
|
raise
|
|
else:
|
|
print "Error changing Eiger exposure time: retrying"
|
|
time.sleep(0.3)
|
|
|
|
if started:
|
|
if eiger.grabMode==eiger.GrabMode.Continuous:
|
|
caget("X11MA-ES1-SD1:cam1:ImageMode")
|
|
eiger.start()
|
|
caputq("X11MA-ES1-SD1:cam1:Acquire", 1)
|
|
|
|
|
|
def set_eiger_number_of_frames(value, check = True):
|
|
if value == get_eiger_number_of_frames():
|
|
caget("X11MA-ES1-SD1:cam1:NumFrames_RBV",'i')
|
|
return
|
|
started = eiger.isStarted()
|
|
caget("X11MA-ES1-SD1:cam1:Acquire")
|
|
if started:
|
|
stop_eiger()
|
|
|
|
caput("X11MA-ES1-SD1:cam1:NumFrames",value)
|
|
if check:
|
|
readback = get_eiger_number_of_frames()
|
|
caget("X11MA-ES1-SD1:cam1:NumFrames_RBV",'i')
|
|
if value != readback:
|
|
raise Exception("Error changing Eiger number of frames to %d: readback=%d" % (value, readback))
|
|
|
|
if started:
|
|
if eiger.grabMode==eiger.GrabMode.Continuous:
|
|
caget("X11MA-ES1-SD1:cam1:ImageMode")
|
|
eiger.start()
|
|
caputq("X11MA-ES1-SD1:cam1:Acquire", 1)
|
|
|
|
|
|
def stop_eiger():
|
|
global chrono_eiger
|
|
chrono_eiger.waitTimeout(CONTINOUS_MODE_MIN_TIME)
|
|
started = eiger.isStarted()
|
|
caget("X11MA-ES1-SD1:cam1:Acquire")
|
|
if started:
|
|
eiger.stop()
|
|
caputq("X11MA-ES1-SD1:cam1:Acquire", 0)
|
|
eiger.grabMode=eiger.GrabMode.Single
|
|
caputq("X11MA-ES1-SD1:cam1:ImageMode", Single)
|
|
eiger.stop()
|
|
caputq("X11MA-ES1-SD1:cam1:Acquire", 0)
|
|
eiger.waitReady(5000)
|
|
wait until monitor of X11MA-ES1-SD1:cam1:Acquire == 0 is received
|
|
else:
|
|
eiger.grabMode=eiger.GrabMode.Single
|
|
caputq("X11MA-ES1-SD1:cam1:ImageMode", Single)
|
|
time.sleep(0.1)
|
|
|
|
|
|
def average_eiger_frames(samples, roi=None, wait_next=False, sleep=0, outliers_threshold=None, outliers_mask=None, retries=None, timeout=None):
|
|
global eiger_averaging_number_of_samples #, chrono_eiger
|
|
sample = int(samples)
|
|
if is_averaging_detector():
|
|
#Not now
|
|
else:
|
|
ret = grab_frames(image, samples, roi, wait_next, sleep, outliers_threshold, outliers_mask, retries, timeout)
|
|
if wait_next:
|
|
|
|
eiger.waitReady(5000)
|
|
eiger.start()
|
|
elif str(eiger.grabMode)=="Continuous":
|
|
if not eiger.isStarted():
|
|
eiger.start()
|
|
try:
|
|
#eiger.getDataArray().waitCacheChange(timeout)
|
|
source.waitNext(timeout)
|
|
breakzxZZy
|
|
except java.util.concurrent.TimeoutException:
|
|
if try_count == (retries-1):
|
|
raise
|
|
msg = "Eiger timeout - retrying #" + str(try_count)
|
|
print msg
|
|
log(msg)
|
|
|
|
return average_frames(ret) if samples > 1 else ret[0]
|
|
|