Files
dev/script/test/TestSpectrum.py
2023-05-01 11:28:04 +02:00

149 lines
4.3 KiB
Python

#If running from editor
if (get_exec_pars().source == CommandSource.ui):
ROI = {"Region1": [10,5,20, 10], "Region2": [60,60,40, 40]}
SAVE_SPECTRUM = True
SAVE_IMAGES = True
WITH_I0 = False
SWITCH_POL = False
EXPOSURE = 1.0
AVERAGE = 2
NUMBER_SCANS =1
RANGES = [[500.0, 1000.0, 100.0]]
print "Starting AbsSpec: ",SAVE_SPECTRUM, SAVE_IMAGES, WITH_I0, SWITCH_POL, EXPOSURE, AVERAGE, NUMBER_SCANS, RANGES
run("eiger")
machine_cur=sin
Keithley_1_raw = cv
def get_dry_run():
return True
def set_outliers_threshold(value):
set_setting("OUTLIERS_THRESHOLD", int(value))
def get_outliers_threshold():
try:
return int(get_setting("OUTLIERS_THRESHOLD"))
except:
return 0
def get_outliers_mask_file():
return get_setting("OUTLIERS_MASK_FILE")
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= "AbsortionSpectrum_{seq}%03d_{count}%02d"
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)
else:
print "Energy=" + str(pos)
sync_energy=SyncEnergy()
set_device_alias(sync_energy, "Energy") #Set display name
sensors = rois + [machine_cur]
if WITH_I0:
sensors = sensors + [Keithley_1_raw]
####
def __save_as_tiff(index, data, filename,metadata={}):
if type(data) == Data:
ip = load_array(data.matrix)
else:
ip = data
metadata["Timestamp"] = time.strftime("%y/%m/%d %H:%M:%S",time.localtime())
if not os.path.exists(os.path.dirname(filename)):
os.makedirs(os.path.dirname(filename))
save_image(ip, filename,"tiff", metadata)
d = get_ip_array(ip)
import java.util.Arrays as Arrays
ip=open_image(filename)
read = get_ip_array(ip)
if not Arrays.deepEquals(read, d):
print "Error reading array"
print index, filename
index=0
for name,r in ROI.items():
s=0.0
for i in range(r[2]):
for j in range(r[3]):
#s = s + d[r[0]+i][r[1]+j]
el=data.getElement(r[0]+i, r[1]+j, False)
s = s + (0 if (math.isnan(el)) else el)
roi = data.getRoi(Rectangle(r[0],r[1], r[2], r[3]))
print name, s, rois[index].take(), roi.integrate(False)
index=index+1
####
av=None
def grab_image(position, scan):
global av
av = average_eiger_frames(AVERAGE, roi=None, wait_next=True)
if SAVE_IMAGES:
filename = get_exec_pars().path + "/" + str(scan.currentPass) + "/s" + "{seq}%03d" + "_" + ("%03d.tif" % scan.recordIndex)
filename = get_context().setup.expandPath(filename)
#print filename
#save_as_tiff(av, filename, metadata={})
#fork((__save_as_tiff,(scan.recordIndex, av, filename)),)
__save_as_tiff(scan.recordIndex, av, filename)
class Average(ReadableMatrix):
def read(self):
return av.matrix
def getWidth(self):
return image.getData().getWidth()
def getHeight(self):
return image.getData().getHeight()
averager=Average()
set_device_alias(averager, "Image") #Set display name
sensors.append(averager)
#Initialize vartiables
if not get_dry_run() and str(get_setting("AUTO_SWITCH_VALVE")).lower() == "true":
open_vg10()
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:
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()
restore_eiger()
print "Running time: " + str(time.time() - start)