From db77926df8aee072c89f235f6e1549dd4e9ce102 Mon Sep 17 00:00:00 2001 From: gac-x04sa Date: Thu, 7 Mar 2019 16:55:39 +0100 Subject: [PATCH] Closedown --- config/settings.properties | 2 +- script/device/Auto.py | 334 ------------------------------------- script/local.py | 11 +- script/utils/Auto.py | 20 ++- 4 files changed, 22 insertions(+), 345 deletions(-) delete mode 100644 script/device/Auto.py diff --git a/config/settings.properties b/config/settings.properties index ad25994..c5d7d9c 100644 --- a/config/settings.properties +++ b/config/settings.properties @@ -1,4 +1,4 @@ -#Thu Mar 07 13:59:01 CET 2019 +#Thu Mar 07 16:20:05 CET 2019 count_time=0.1 geometry=fourcv roi=190 45 290 125 diff --git a/script/device/Auto.py b/script/device/Auto.py deleted file mode 100644 index fbd012d..0000000 --- a/script/device/Auto.py +++ /dev/null @@ -1,334 +0,0 @@ -#============================================================================== -# Translated from original macro auto.mac by C. M. Schlepuetz -#API: -#auto_set_level - activate or deactivate automatic filter and exposure setting -#auto_set_exposure - define the short and long exposure time used in case of automatic exposure setting -#auto_show - display current automatic filter settings\n") -#auto_show_xposure - display current exposure time settings\n") -# -# -# Description This macro provides a set of definitions which allow for -# automatic filter transmission and exposure time adjustments -# during experiments. Type 'autohelp' for information on the -# respective commands and their usage. -# After each count command, the obtained counts are evaluated and -# compared to four global threshold levels defining five -# different ranges of count rates: Poor, Acceptable, Good, -# Optimal, and Saturated. According to this analysis, filters and -# optionally also the exposure time are adjusted automatically. -# The general strategy to determine which action should be taken -# is to optimize the speed of data aquisition, even at the -# possible cost of a moderate reduction in signal-to-noise ratio. -# Presently, only two distinct exposure times are supported, a -# shorter one (t1) and a longer one (t2). -# The actions taken are summarized in the following diagram: -# -# -# Count rate | Threshold | Optimize only | Optimize filters and -# Region | level | filters (Level 1) | exposure time (Level 2) -# --------------------------------------------------------------------------- -# Saturated | | decrease transm. | 1. decrease exptime -# | | | 2. decrease tramsm. -# ------------ TH4 -------------------------------------------------------- -# Optimal | | - | 1. decrease exptime -# | | | -# ------------ TH3 -------------------------------------------------------- -# Good | | increase tramsm. | 1. decrease exptime (>=1s) -# | | | 2. increse transm. -# ------------ TH2 = 1.5* ------------------------------------------------- -# Acceptable | (t2/t1)*TH1 | increase tramsm. | 1. increase transm. -# | | | (no change in exptime) -# ------------ TH1 --------------------------------------------------------- -# Poor | | increase tramsm. | 1. increase trams. -# | | | 2. increase exptime -# --------------------------------------------------------------------------- -# -# Note: In the "Good" region, the expure time is decreased to t1 only -# if t1 is >= 1s, otherwise a 1 second exposure time is used. -# This macro is based on an earlier version by O. Bunk -# and R. Herger -# -#============================================================================== - - - - -def auto_init(): - global AUTO_LEVEL - global AUTO_RETRY_MAX - global AUTO_COUNT_TIME - global AUTO_EXP_LO, AUTO_EXP_HI - global AUTO_THRESH1, AUTO_THRESH2, AUTO_THRESH3, AUTO_THRESH4 - global AUTO_THRESH1_COUNT, AUTO_THRESH2_COUNT - global AUTO_THRESH3_COUNT, AUTO_THRESH4_COUNT - - AUTO_LEVEL = 0; AUTO_RETRY_MAX = 20 - AUTO_COUNT_TIME = 0 - AUTO_EXP_LO = 1; AUTO_EXP_HI = 10 - # for safety, set the thresh values gigantically high to start with - AUTO_THRESH1=1e8; AUTO_THRESH2=1e9; AUTO_THRESH3=1e10; AUTO_THRESH4=1e11 - - # for safety, set the thresh values gigantically high to start with - AUTO_THRESH1_COUNT=100; AUTO_THRESH2_COUNT=100; AUTO_THRESH3_COUNT=100 - AUTO_THRESH4_COUNT=100 - COUNT_TIME = AUTO_EXP_LO - -auto_init() - - - - - -def auto_set_level(auto_level = None, max_tries = 20): - """ - Usage : autoSetLevel [] - can be: - 0 - automatic filter and exposure OFF - 1 - automatic filter ON, automatic exposure OFF - 2 - automatic filter and exposure ON - optionally specifies the number of retries before giving up (default = 20) - """ - global AUTO_LEVEL, AUTO_RETRY_MAX - if auto_level is not None: - AUTO_LEVEL = auto_level - AUTO_RETRY_MAX = max_tries - auto_show() - - -def auto_set_exposure(short_exp, long_exp): - """ - set the standard exposure times used in case of automatic filter and exposure settings. - Usage : autoSetExposure - where is the shorter and - the longer exposure time in seconds [s]. - """ - global AUTO_EXP_LO, AUTO_EXP_HI, AUTO_THRESH1, AUTO_THRESH2, AUTO_THRESH3, AUTO_THRESH4 - - AUTO_EXP_LO = short_exp - AUTO_EXP_HI = long_exp - if (AUTO_EXP_LO >= AUTO_EXP_HI): - AUTO_EXP_LO = 1 - AUTO_EXP_HI = 10 - print "Invalid auto_set_exposure values - set to default values <<" - auto_show_exposure() - # set AUTO_TRESH2 1.5 times higher than ratio of counting times to avoid oscillations - AUTO_THRESH2 = AUTO_THRESH1 * (AUTO_EXP_HI/AUTO_EXP_LO) * 1.5 - - -def auto_show(): - """ - show the auto-level settings. - inform the user on the currently active auto-level - """ - global AUTO_LEVEL - if (AUTO_LEVEL == 0): - print("Auto-level has been set to %d.\n" % AUTO_LEVEL) - print("Automatic filter setting is OFF.\n") - print("Automatic exposure setting is OFF.\n") - elif (AUTO_LEVEL == 1): - print("Auto-level has been set to %d.\n" % AUTO_LEVEL) - print("Automatic filter setting is ON.\n") - print("Automatic exposure setting is OFF.\n") - elif (AUTO_LEVEL == 2): - print("Auto-level has been set to %d.\n" % AUTO_LEVEL) - print("Automatic filter setting is ON.\n") - print("Automatic exposure setting is ON.\n") - else: - AUTO_LEVEL = 0 - print("Unknown auto-level - resetting to %d <<"% AUTO_LEVEL) - print("Automatic filter setting is OFF.\n") - print("Automatic exposure setting is OFF.\n") - - - if(AUTO_LEVEL>1): - print("Detector exposure times: short = %d s, long = %d s\n" % (AUTO_EXP_LO,AUTO_EXP_HI)) - - #TODO: if Image being sampled, show it - #if(((whatis("IMAGE_IS_ON") & 0x08000000) != 0) && (IMAGE_IS_ON == 1)){ - # image_show() - -def auto_show_exposure(): - """ - show the auto-level exposure settings. - """ - global AUTO_EXP_LO, AUTO_EXP_HI - print("Detector exposure times: short = %d s, long = %d s\n" % (AUTO_EXP_LO,AUTO_EXP_HI)) - - - -def auto_calc_exposure(): - #If automatic exposure setting is activated round the current SPEC COUNT_TIME to either low or high exposure. - global COUNT_TIME,AUTO_LEVEL, AUTO_EXP_LO, AUTO_EXP_HI - if (AUTO_LEVEL == 2): - if (COUNT_TIME <= 0.5*(AUTO_EXP_LO+AUTO_EXP_HI)): - COUNT_TIME = AUTO_EXP_LO - else: - COUNT_TIME = AUTO_EXP_HI - return COUNT_TIME - -def auto_adjust(): - # - automatically adjusts the filter transmission and - # exposure time of the currently active detector to obtain - # the best possible signal level. - # The function returns 1 if transmission or exposure - # time are changed, 0 otherwise. - # This routine should be performed after the counting - # process (this is usually done by autoAdjustRedo() ). - # Internal routine. - # - # Note: For area detectors, the background is not subtracted since over- - # and under-exposure have to be avoided on an absolute scale. - - global COUNT_TIME - - global AUTO_LEVEL - global AUTO_RETRY_MAX - global AUTO_COUNT_TIME - global AUTO_EXP_LO, AUTO_EXP_HI - global AUTO_THRESH1, AUTO_THRESH2, AUTO_THRESH3, AUTO_THRESH4 - global AUTO_THRESH1_COUNT, AUTO_THRESH2_COUNT - global AUTO_THRESH3_COUNT, AUTO_THRESH4_COUNT - - if (AUTO_LEVEL < 1): - return(0) # do nothing when auto-level is zero - - # set exposure times to default if they are not defined yet - if (AUTO_EXP_LO < 0.0000001): - AUTO_EXP_LO = 1 - if (AUTO_EXP_HI < 0.0000001): - AUTO_EXP_HI = 10 - - autoAdjusted = 0 - autoExposure = auto_calc_exposure() - autoTransmVal = transm.getPosition() - - # try to set filters and exposure time - if (AUTO_THRESH4_COUNT > 2): - # intensity too high -> reduce exposure time or filter transmission - if ((AUTO_LEVEL >= 2) and (autoExposure > AUTO_EXP_LO)): - autoExposure = AUTO_EXP_LO - print("Intensity too high - setting exposure to %d sec\n"% autoExposure) - else: - autoTransmVal /= 10.0 - transm.write(autoTransmVal) - print("Intensity too high, reducing transmission to %.3e\n" % transm.getPosition()) - autoAdjusted = 1 - - if (AUTO_THRESH2_COUNT < 1): - # intensity too low -> take out filter or increase exposure time - if (autoTransmVal < 1.0): - # take out filter - if (autoTransmVal < 1e-10): - autoTransmVal = transm.getPosition() - - autoTransmVal *= 10.0 - if (AUTO_THRESH1_COUNT < 1) : - autoTransmVal *= 5.0 - - # readjust transmission-soll if it is > 1 now. - if (autoTransmVal > 1.0): - autoTransmVal = 1.0 - transm.write(autoTransmVal) - print("Intensity too low, increasing transmission to %.3e\n"% transm.getPosition()) - autoAdjusted = 1 - else: - # increase exposure time? - if ((AUTO_LEVEL >= 2) and (autoExposure < AUTO_EXP_HI)): - # check for long exposure-time - if (AUTO_THRESH1_COUNT < 1): - autoExposure = AUTO_EXP_HI - autoAdjusted = 1 - print("Intensity too low - setting exposure to %d sec\n"% autoExposure) - - if ((AUTO_THRESH3_COUNT < 1) and (AUTO_THRESH2_COUNT > 1)): - # decrease exptime? - if ((AUTO_LEVEL >= 2) and (autoExposure > AUTO_EXP_LO)): - autoExposure = AUTO_EXP_LO - if (autoExposure < 1): - autoExposure = 1 - if (autoExposure != COUNT_TIME): - autoAdjusted = 1 - print("High intensity - setting exposure to %d sec\n" % autoExposure) - else: - # increase transmission ? - if (autoTransmVal < 1.0): - # take out filter - if (autoTransmVal < 1e-10): - autoTransmVal = transm.getPosition() - autoTransmVal *= 10.0 - # readjust transmission-soll if it is > 1 now. - if (autoTransmVal > 1.0): - autoTransmVal = 1.0 - transm.write(autoTransmVal) - print("Intensity too low, increasing transmission to %.3e\n" % transm.getPosition()) - autoAdjusted = 1 - - if ((AUTO_THRESH4_COUNT < 1) and (AUTO_THRESH3_COUNT > 1)): - # decrease exptime? - if ((AUTO_LEVEL >= 2) and (autoExposure > AUTO_EXP_LO)): - autoExposure = AUTO_EXP_LO - autoAdjusted = 1 - print("High intensity - setting exposure to %d sec\n" % autoExposure) - autoAdjusted = 1 - - if (AUTO_LEVEL == 2): - AUTO_COUNT_TIME = autoExposure - COUNT_TIME = AUTO_COUNT_TIME - _ctime = AUTO_COUNT_TIME # set the counting time for a scan to - return autoAdjusted - - - -def auto_adjust_redo(): - # autoAdjustRedo() - determines whether auto-adjusting has been successful. - # If not, counting is repeated until the best possible - # filter and exposure settings have been obtained. - # This routine is performed after the counting process - # (in user_count_end). - # Internal routine. - # - # Note: This macro makes use of the 'recount' macro which has been added to - # site.mac. - - global AUTO_LEVEL, AUTO_RETRY_MAX - _success = 1 - if (AUTO_LEVEL < 1): - return(_success) - retryCount = 0 - redo = 1 - while (redo != 0): - redo = 0 - retryCount = retryCount+1 - if (auto_adjust() != 0): - if (retryCount < AUTO_RETRY_MAX): - redo = 1 - else: - print " >>Couldn\'t optimize filter and exposure settings. <<" - if (redo != 0): - recount(COUNT_TIME) - else: - _success = 1 - redo = 0 - - return (_success) - - - -################################################################################################### -#Callbacks -################################################################################################### -def before_scan(): - if (AUTO_LEVEL > 0): - transm.write(1e-10) # if automatic filter setting is active start scan with very lowfilter transmission - - -def before_sample(): - if(AUTO_LEVEL > 1): - auto_calc_exposure() # if automatic exposure setting is activated calculate exposure time - - -def after_sample(): - if (AUTO_LEVEL > 0): - success = auto_adjust_redo() # automatic filter and exposure setting (if activated) - return success - diff --git a/script/local.py b/script/local.py index a24447e..828cfd3 100644 --- a/script/local.py +++ b/script/local.py @@ -202,7 +202,7 @@ def trigger_detectors(position, scan): close_shutter() -def save_metadata(rec): +def save_metadata(rec, scan): print "Acquired record ", rec.index if get_exec_pars().save: if rec.index == 0: @@ -211,6 +211,15 @@ def save_metadata(rec): +def before_sample(position, scan): + auto_before_sample(position, scan) + trigger_detectors(position, scan) + + +def after_sample(rec, scan): + if auto_after_sample(rec, scan): + save_metadata(rec, scan) + ################################################################################################### # Scan metadata ################################################################################################### diff --git a/script/utils/Auto.py b/script/utils/Auto.py index 4755676..7de8d3c 100644 --- a/script/utils/Auto.py +++ b/script/utils/Auto.py @@ -269,20 +269,19 @@ def auto_adjust(): ################################################################################################### #Callbacks ################################################################################################### -def auto_before_scan(): - global AUTO_LEVEL - if (AUTO_LEVEL > 0): - transm.write(1e-10) # if automatic filter setting is active start scan with very lowfilter transmission - -def auto_before_sample(): +def auto_before_sample(position, scan): global AUTO_LEVEL, RETRY_COUNT - RETRY_COUNT = 0 + if scan.recordIndex==1: + if (AUTO_LEVEL > 0): + transm.write(1e-10) # if automatic filter setting is active start scan with very lowfilter transmission + RETRY_COUNT = 0 if(AUTO_LEVEL > 1): auto_calc_exposure() # if automatic exposure setting is activated calculate exposure time def auto_after_sample(rec, scan): + "Return True if level was ok (not invalidating the record)" global AUTO_LEVEL, AUTO_RETRY_MAX, RETRY_COUNT resample = False if (AUTO_LEVEL > 0): @@ -291,8 +290,11 @@ def auto_after_sample(rec, scan): if (RETRY_COUNT < AUTO_RETRY_MAX): resample = True else: - print " >>Couldn\'t optimize filter and exposure settings. <<" - + print " >>Couldn\'t optimize filter and exposure settings. <<" if resample: rec.invalidate() + return False + else: + RETRY_COUNT = 0 + return True \ No newline at end of file