Added flat acquisition
This commit is contained in:
@@ -10,30 +10,20 @@ eyex:
|
|||||||
enabled: true
|
enabled: true
|
||||||
readOnly: false
|
readOnly: false
|
||||||
softwareTrigger: false
|
softwareTrigger: false
|
||||||
# eyey:
|
|
||||||
# readoutPriority: baseline
|
eyez:
|
||||||
# description: X-ray eye axis Y
|
readoutPriority: baseline
|
||||||
# deviceClass: tomcat_bec.devices.psimotor.EpicsMotorEC
|
description: X-ray eye axis Z
|
||||||
# deviceConfig:
|
deviceClass: tomcat_bec.devices.psimotor.EpicsMotorEC
|
||||||
# prefix: MTEST-X05LA-ES2-XRAYEYE:M2
|
deviceConfig:
|
||||||
# deviceTags:
|
prefix: MTEST-X05LA-ES2-XRAYEYE:M3
|
||||||
# - xray-eye
|
deviceTags:
|
||||||
# onFailure: buffer
|
- xray-eye
|
||||||
# enabled: true
|
onFailure: buffer
|
||||||
# readOnly: false
|
enabled: true
|
||||||
# softwareTrigger: false
|
readOnly: false
|
||||||
# eyez:
|
softwareTrigger: false
|
||||||
# readoutPriority: baseline
|
|
||||||
# description: X-ray eye axis Z
|
|
||||||
# deviceClass: tomcat_bec.devices.psimotor.EpicsMotorEC
|
|
||||||
# deviceConfig:
|
|
||||||
# prefix: MTEST-X05LA-ES2-XRAYEYE:M3
|
|
||||||
# deviceTags:
|
|
||||||
# - xray-eye
|
|
||||||
# onFailure: buffer
|
|
||||||
# enabled: true
|
|
||||||
# readOnly: false
|
|
||||||
# softwareTrigger: false
|
|
||||||
femto_mean_curr:
|
femto_mean_curr:
|
||||||
readoutPriority: monitored
|
readoutPriority: monitored
|
||||||
description: Femto mean current
|
description: Femto mean current
|
||||||
|
|||||||
@@ -1,2 +1,2 @@
|
|||||||
from .tutorial_fly_scan import AcquireDark, AcquireFlat, TutorialFlyScanContLine
|
from .tutorial_fly_scan import AcquireDark, AcquireWhite, TutorialFlyScanContLine
|
||||||
from .tomcat_scans import TomcatStepScan, TomcatSnapNStep, TomcatSimpleSequence
|
from .tomcat_scans import TomcatStepScan, TomcatSnapNStep, TomcatSimpleSequence
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ class AcquireDark(Acquire):
|
|||||||
image_height : int, optional
|
image_height : int, optional
|
||||||
ROI size in the y-direction [pixels]
|
ROI size in the y-direction [pixels]
|
||||||
acq_mode : str, optional
|
acq_mode : str, optional
|
||||||
Predefined acquisition mode (default=)
|
Predefined acquisition mode (default= 'default')
|
||||||
file_path : str, optional
|
file_path : str, optional
|
||||||
File path for standard daq
|
File path for standard daq
|
||||||
|
|
||||||
@@ -51,39 +51,58 @@ class AcquireDark(Acquire):
|
|||||||
yield from super().scan_core()
|
yield from super().scan_core()
|
||||||
|
|
||||||
|
|
||||||
class AcquireFlat(Acquire):
|
class AcquireWhite(Acquire):
|
||||||
scan_name = "acquire_flat"
|
scan_name = "acquire_white"
|
||||||
required_kwargs = ["num"]
|
required_kwargs = ["exp_burst", "sample_position_out", "sample_angle_out"]
|
||||||
gui_config = {"Acquisition parameters": ["num"]}
|
gui_config = {"Acquisition parameters": ["exp_burst"]}
|
||||||
|
|
||||||
def __init__(self, num: int, out_position: float, **kwargs):
|
def __init__(self, exp_burst: int, sample_position_out: float, sample_angle_out: float, **kwargs):
|
||||||
"""
|
"""
|
||||||
Acquire a flat field image. This scan is used to acquire a flat field image. The flat field image is an image taken
|
Acquire flat field images. This scan is used to acquire flat field images. The flat field image is an image taken
|
||||||
with the shutter open but the sample out of the beam. The flat field image is used to correct the data images for
|
with the shutter open but the sample out of the beam. Flat field images are used to correct the data images for
|
||||||
non-uniformity in the detector.
|
non-uniformity in the detector.
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
num (int): number of flat field images to acquire
|
exp_burst : int
|
||||||
out_position (float): position to move the sample stage to take the flat field image
|
Number of flat field images to acquire (no default)
|
||||||
|
sample_position_out : float
|
||||||
|
Position to move the sample stage to position the sample out of beam and take flat field images
|
||||||
|
sample_angle_out : float
|
||||||
|
Angular position where to take the flat field images
|
||||||
|
exp_time : float, optional
|
||||||
|
Exposure time [ms]. If not specified, the currently configured value on the camera will be used
|
||||||
|
exp_period : float, optional
|
||||||
|
Exposure period [ms]. If not specified, the currently configured value on the camera will be used
|
||||||
|
image_width : int, optional
|
||||||
|
ROI size in the x-direction [pixels]. If not specified, the currently configured value on the camera will be used
|
||||||
|
image_height : int, optional
|
||||||
|
ROI size in the y-direction [pixels]. If not specified, the currently configured value on the camera will be used
|
||||||
|
acq_mode : str, optional
|
||||||
|
Predefined acquisition mode (default= 'default')
|
||||||
|
file_path : str, optional
|
||||||
|
File path for standard daq
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
ScanReport
|
ScanReport
|
||||||
|
|
||||||
Examples:
|
Examples:
|
||||||
>>> scans.acquire_flat(5, 20)
|
>>> scans.acquire_white(5, 20)
|
||||||
|
|
||||||
"""
|
"""
|
||||||
super().__init__(**kwargs)
|
super().__init__(**kwargs)
|
||||||
self.burst_at_each_point = num
|
self.burst_at_each_point = 1
|
||||||
self.out_position = out_position
|
self.sample_position_out = sample_position_out
|
||||||
self.sample_stage = "samy" # change to the correct sample stage device
|
self.sample_angle_out = sample_angle_out
|
||||||
self.shutter = "hx" # change to the correct shutter device
|
|
||||||
|
self.scan_motors = ["eyex", "eyez", "es1_roty"] # change to the correct shutter device
|
||||||
|
# self.scan_motors = ["eyex", "eyez"] # change to the correct shutter device
|
||||||
|
self.dark_shutter_pos = 1 ### change with a variable
|
||||||
|
|
||||||
|
|
||||||
def scan_core(self):
|
def scan_core(self):
|
||||||
# open the shutter and move the sample stage to the out position
|
# open the shutter and move the sample stage to the out position
|
||||||
yield from self.stubs.set_and_wait(
|
yield from self._move_scan_motors_and_wait([self.dark_shutter_pos, self.sample_position_out, self.sample_angle_out])
|
||||||
device=[self.shutter, self.sample_stage], positions=[1, self.out_position]
|
# yield from self._move_scan_motors_and_wait([self.dark_shutter_pos, self.sample_position_out])
|
||||||
)
|
|
||||||
yield from super().scan_core()
|
yield from super().scan_core()
|
||||||
|
|
||||||
|
|
||||||
@@ -168,7 +187,7 @@ class TutorialFlyScanContLine(AsyncFlyScanBase):
|
|||||||
show_asap=True,
|
show_asap=True,
|
||||||
rid=self.metadata.get("RID"),
|
rid=self.metadata.get("RID"),
|
||||||
)
|
)
|
||||||
flats = AcquireFlat(
|
flats = AcquireWhite(
|
||||||
num=self.num_flats,
|
num=self.num_flats,
|
||||||
exp_time=self.exp_time,
|
exp_time=self.exp_time,
|
||||||
out_position=self.sample_out,
|
out_position=self.sample_out,
|
||||||
|
|||||||
@@ -12,6 +12,11 @@ class Measurement:
|
|||||||
self.nimages_dark = 50
|
self.nimages_dark = 50
|
||||||
self.nimages_white = 100
|
self.nimages_white = 100
|
||||||
|
|
||||||
|
self.start_angle = 0
|
||||||
|
self.sample_angle_out = 0
|
||||||
|
self.sample_position_in = 0
|
||||||
|
self.sample_position_out = 1
|
||||||
|
|
||||||
# To be able to keep what is already set on the camera
|
# To be able to keep what is already set on the camera
|
||||||
self.exposure_time = None
|
self.exposure_time = None
|
||||||
self.exposure_period = None
|
self.exposure_period = None
|
||||||
@@ -29,12 +34,20 @@ class Measurement:
|
|||||||
|
|
||||||
self.build_filename()
|
self.build_filename()
|
||||||
|
|
||||||
def build_filename(self):
|
def build_filename(self, acquisition_type='data'):
|
||||||
"""
|
"""
|
||||||
Build and set filepath for bec
|
Build and set filepath for bec
|
||||||
Build filepath and file prefix for stddaq
|
Build filepath and file prefix for stddaq
|
||||||
|
|
||||||
|
acquisition_type : string, optional
|
||||||
|
Type of images: a choice between dark, white, or data (default = data)
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
if acquisition_type != "data" and acquisition_type != "dark" and acquisition_type != "white":
|
||||||
|
print("WARNING: chosen acquisition type not permitted! \n")
|
||||||
|
print("The chosen acquitisition type as been set to \"data\"!")
|
||||||
|
acquisition_type == "data"
|
||||||
|
|
||||||
self.scan_sample_name = 'S' + str(bec.queue.next_scan_number) + '_' + self.sample_name
|
self.scan_sample_name = 'S' + str(bec.queue.next_scan_number) + '_' + self.sample_name
|
||||||
|
|
||||||
# File path for bec
|
# File path for bec
|
||||||
@@ -44,11 +57,13 @@ class Measurement:
|
|||||||
self.file_path = os.path.join('/data/test/test-beamline',bec.system_config.file_directory, '_device_dat', self.device_name) # _device_dat does not work for now.
|
self.file_path = os.path.join('/data/test/test-beamline',bec.system_config.file_directory, '_device_dat', self.device_name) # _device_dat does not work for now.
|
||||||
# A hack for now to create the right permissions
|
# A hack for now to create the right permissions
|
||||||
self.base_path = os.path.join('/data/test/test-beamline',self.data_path)
|
self.base_path = os.path.join('/data/test/test-beamline',self.data_path)
|
||||||
self.file_prefix = self.scan_sample_name + '_' + self.device_name + '_data_dark_'
|
self.file_prefix = self.scan_sample_name + '_' + self.device_name + '_' + acquisition_type + '_'
|
||||||
|
|
||||||
def configure(self,sample_name=None, data_path=None, exposure_time=None,
|
def configure(self,sample_name=None, data_path=None, exposure_time=None,
|
||||||
exposure_period=None, roix=None, roiy=None,nimages=None,
|
exposure_period=None, roix=None, roiy=None,nimages=None,
|
||||||
nimages_dark=None, nimages_white=None):
|
nimages_dark=None, nimages_white=None,
|
||||||
|
start_angle=None, sample_angle_out=None,
|
||||||
|
sample_position_in=None, sample_position_out=None):
|
||||||
"""
|
"""
|
||||||
Reconfigure the measurement with any number of new parameter
|
Reconfigure the measurement with any number of new parameter
|
||||||
|
|
||||||
@@ -56,24 +71,34 @@ class Measurement:
|
|||||||
----------
|
----------
|
||||||
sample_name : string, optional
|
sample_name : string, optional
|
||||||
Name of the sample or measurement. This name will be used to construct
|
Name of the sample or measurement. This name will be used to construct
|
||||||
the name of the measurement directory (default=None)
|
the name of the measurement directory (default = None)
|
||||||
data_path : string, optional
|
data_path : string, optional
|
||||||
Information used to build the data directory for the measurement
|
Information used to build the data directory for the measurement
|
||||||
(default=None)
|
(default = None)
|
||||||
exposure_time : float, optional
|
exposure_time : float, optional
|
||||||
Exposure time [ms] (default=None)
|
Exposure time [ms] (default = None)
|
||||||
exposure_period : float, optional
|
exposure_period : float, optional
|
||||||
Exposure period [ms] (default=None)
|
Exposure period [ms] (default = None)
|
||||||
roix : int, optional
|
roix : int, optional
|
||||||
ROI size in the x-direction [pixels] (default=None)
|
ROI size in the x-direction [pixels] (default = None)
|
||||||
roiy : int, optional
|
roiy : int, optional
|
||||||
ROI size in the y-direction [pixels] (default=None)
|
ROI size in the y-direction [pixels] (default = None)
|
||||||
nimages : int, optional
|
nimages : int, optional
|
||||||
Number of images to acquire (default=None)
|
Number of images to acquire (default = None)
|
||||||
nimages_dark : int, optional
|
nimages_dark : int, optional
|
||||||
Number of dark images to acquire (default=None)
|
Number of dark images to acquire (default = None)
|
||||||
nimages_white : int, optional
|
nimages_white : int, optional
|
||||||
Number of white images to acquire (default=None)
|
Number of white images to acquire (default = None)
|
||||||
|
start_angle : float, optional
|
||||||
|
The start angle for the scan [deg] (default = None)
|
||||||
|
sample_angle_out : float, optional
|
||||||
|
Sample rotation angle for sample out of the beam [deg]
|
||||||
|
(default = None)
|
||||||
|
sample_position_in : float, optional
|
||||||
|
Sample stage X position for sample in beam [um] (default = None)
|
||||||
|
sample_position_out : float, optional
|
||||||
|
Sample stage X position for sample out of the beam [um]
|
||||||
|
(default = None)
|
||||||
"""
|
"""
|
||||||
|
|
||||||
if sample_name != None:
|
if sample_name != None:
|
||||||
@@ -94,6 +119,14 @@ class Measurement:
|
|||||||
self.roix = roix
|
self.roix = roix
|
||||||
if roiy != None:
|
if roiy != None:
|
||||||
self.roiy = roiy
|
self.roiy = roiy
|
||||||
|
if start_angle != None:
|
||||||
|
self.start_angle = start_angle
|
||||||
|
if sample_angle_out != None:
|
||||||
|
self.sample_angle_out = sample_angle_out
|
||||||
|
if sample_position_in != None:
|
||||||
|
self.sample_position_in = sample_position_in
|
||||||
|
if sample_position_out != None:
|
||||||
|
self.sample_position_out = sample_position_out
|
||||||
|
|
||||||
self.build_filename()
|
self.build_filename()
|
||||||
|
|
||||||
@@ -102,7 +135,7 @@ class Measurement:
|
|||||||
"""
|
"""
|
||||||
Show configuration
|
Show configuration
|
||||||
|
|
||||||
TODO: check active devices, write the config for each device and if none read from device
|
TODO: make it work for multiple devices
|
||||||
"""
|
"""
|
||||||
|
|
||||||
print("Sample name: " + self.sample_name)
|
print("Sample name: " + self.sample_name)
|
||||||
@@ -110,11 +143,28 @@ class Measurement:
|
|||||||
print("Number of images: " + str(self.nimages))
|
print("Number of images: " + str(self.nimages))
|
||||||
print("Number of darks: " + str(self.nimages_dark))
|
print("Number of darks: " + str(self.nimages_dark))
|
||||||
print("Number of flats: " + str(self.nimages_white))
|
print("Number of flats: " + str(self.nimages_white))
|
||||||
print("Exposure time: " + str(self.exposure_time))
|
if self.exposure_time == None:
|
||||||
print("Exposure period: " + str(self.exposure_period))
|
print("Exposure time: " + str(self.det.cfgExposure.get()))
|
||||||
print("Roix: " + str(self.roix))
|
else:
|
||||||
print("Roiy: " + str(self.roiy))
|
print("Exposure time: " + str(self.exposure_time))
|
||||||
|
if self.exposure_period == None:
|
||||||
|
print("Exposure peirod: " + str(self.det.cfgFramerate.get()))
|
||||||
|
else:
|
||||||
|
print("Exposure period: " + str(self.exposure_period))
|
||||||
|
if self.roix == None:
|
||||||
|
print("Roix: " + str(self.det.cfgRoiX.get()))
|
||||||
|
else:
|
||||||
|
print("Roix: " + str(self.roix))
|
||||||
|
if self.roiy == None:
|
||||||
|
print("Roiy: " + str(self.det.cfgRoiY.get()))
|
||||||
|
else:
|
||||||
|
print("Roiy: " + str(self.roiy))
|
||||||
|
print("Start angle: " + str(self.start_angle))
|
||||||
|
print("Sample angle out: " + str(self.sample_angle_out))
|
||||||
|
print("Sample position in: " + str(self.sample_position_in))
|
||||||
|
print("Sample position out: " + str(self.sample_position_out))
|
||||||
|
|
||||||
|
|
||||||
def acquire_darks(self,nimages_dark, exposure_time=None, exposure_period=None,
|
def acquire_darks(self,nimages_dark, exposure_time=None, exposure_period=None,
|
||||||
roix=None, roiy=None, acq_mode=None):
|
roix=None, roiy=None, acq_mode=None):
|
||||||
"""
|
"""
|
||||||
@@ -137,7 +187,7 @@ class Measurement:
|
|||||||
|
|
||||||
Example:
|
Example:
|
||||||
--------
|
--------
|
||||||
fede_darks(100, exposure_time=5)
|
m.acquire_darks(100, exposure_time=5)
|
||||||
"""
|
"""
|
||||||
# dev.es1_tasks.enabled = False
|
# dev.es1_tasks.enabled = False
|
||||||
# dev.es1_psod.enabled = False
|
# dev.es1_psod.enabled = False
|
||||||
@@ -158,10 +208,71 @@ class Measurement:
|
|||||||
if roiy != None:
|
if roiy != None:
|
||||||
self.roiy = roiy
|
self.roiy = roiy
|
||||||
|
|
||||||
self.build_filename()
|
self.build_filename(acquisition_type='dark')
|
||||||
|
|
||||||
### TODO: camera reset
|
### TODO: camera reset
|
||||||
print("Handing over to 'scans.acquire_dark")
|
print("Handing over to 'scans.acquire_dark")
|
||||||
scans.acquire_dark(exp_burst=nimages_dark, exp_time=self.exposure_time, exp_period=self.exposure_period, image_width=self.roix,
|
scans.acquire_dark(exp_burst=nimages_dark, exp_time=self.exposure_time, exp_period=self.exposure_period, image_width=self.roix,
|
||||||
image_height=self.roiy, acq_mode=acq_mode, file_path=self.file_path, nr_writers=2, base_path=self.base_path,
|
image_height=self.roiy, acq_mode=acq_mode, file_path=self.file_path, nr_writers=2, base_path=self.base_path,
|
||||||
file_prefix=self.file_prefix)
|
file_prefix=self.file_prefix)
|
||||||
|
|
||||||
|
def acquire_whites(self,nimages_whites, sample_angle_out=None, sample_position_out=None,
|
||||||
|
exposure_time=None, exposure_period=None,
|
||||||
|
roix=None, roiy=None, acq_mode=None):
|
||||||
|
"""
|
||||||
|
Acquire a set of whites images with shutters open and sample out of beam.
|
||||||
|
|
||||||
|
Parameters
|
||||||
|
----------
|
||||||
|
nimages_whites : int
|
||||||
|
Number of white images to acquire (no default)
|
||||||
|
sample_angle_out : float, optional
|
||||||
|
Sample rotation angle for sample out of the beam [deg]
|
||||||
|
sample_position_out : float, optional
|
||||||
|
Sample stage X position for sample out of the beam [um]
|
||||||
|
exposure_time : float, optional
|
||||||
|
Exposure time [ms]. If not specified, the currently configured value on the camera will be used
|
||||||
|
exposure_period : float, optional
|
||||||
|
Exposure period [ms]
|
||||||
|
roix : int, optional
|
||||||
|
ROI size in the x-direction [pixels]
|
||||||
|
roiy : int, optional
|
||||||
|
ROI size in the y-direction [pixels]
|
||||||
|
acq_mode : str, optional
|
||||||
|
Predefined acquisition mode (default=None)
|
||||||
|
|
||||||
|
Example:
|
||||||
|
--------
|
||||||
|
m.acquire_whites(100, exposure_time=5)
|
||||||
|
"""
|
||||||
|
# dev.es1_tasks.enabled = False
|
||||||
|
# dev.es1_psod.enabled = False
|
||||||
|
# dev.es1_ddaq.enabled = False
|
||||||
|
# dev.es1_ismc.enabled = False
|
||||||
|
# dev.es1_roty.enabled = False
|
||||||
|
dev.gfcam.enabled = True
|
||||||
|
dev.gfdaq.enabled = True
|
||||||
|
dev.daq_stream0.enabled = True
|
||||||
|
dev.daq_stream1.enabled = False
|
||||||
|
|
||||||
|
if sample_angle_out != None:
|
||||||
|
self.sample_angle_out = sample_angle_out
|
||||||
|
if sample_position_out != None:
|
||||||
|
self.sample_position_out = sample_position_out
|
||||||
|
if exposure_time != None:
|
||||||
|
self.exposure_time = exposure_time
|
||||||
|
if exposure_period != None:
|
||||||
|
self.exposure_period = exposure_period
|
||||||
|
if roix != None:
|
||||||
|
self.roix = roix
|
||||||
|
if roiy != None:
|
||||||
|
self.roiy = roiy
|
||||||
|
|
||||||
|
self.build_filename(acquisition_type='white')
|
||||||
|
|
||||||
|
### TODO: camera reset
|
||||||
|
print("Handing over to 'scans.acquire_whites")
|
||||||
|
scans.acquire_white(exp_burst=nimages_whites, sample_angle_out=self.sample_angle_out, sample_position_out= self.sample_position_out,
|
||||||
|
exp_time=self.exposure_time, exp_period=self.exposure_period, image_width=self.roix,
|
||||||
|
image_height=self.roiy, acq_mode=acq_mode, file_path=self.file_path, nr_writers=2, base_path=self.base_path,
|
||||||
|
file_prefix=self.file_prefix)
|
||||||
Reference in New Issue
Block a user