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]