DECTRIS reference
- class libertem_live.detectors.dectris.DectrisAcquisition(conn: DectrisDetectorConnection, nav_shape: tuple[int, ...] | None = None, frames_per_partition: int = 128, pending_aq: DectrisPendingAcquisition | None = None, controller: DectrisActiveController | None = None, hooks: Hooks | None = None)[source]
Acquisition from a DECTRIS detector. Use
libertem_live.api.LiveContext.make_acquisition()
to instantiate this class!Examples
>>> with ctx.make_connection('dectris').open( ... api_host='127.0.0.1', ... api_port=DCU_API_PORT, ... data_host='127.0.0.1', ... data_port=DCU_DATA_PORT, ... ) as conn: ... aq = ctx.make_acquisition( ... conn=conn, ... nav_shape=(128, 128), ... )
- Parameters:
conn – An existing DectrisDetectorConnection instance
nav_shape – The navigation shape as a tuple, for example
(height, width)
for a 2D STEM scan.frames_per_partition – A tunable for configuring the feedback rate - more frames per partition means slower feedback, but less computational overhead. Might need to be tuned to adapt to the dwell time.
pending_aq – A pending acquisition in passive mode, obtained from
DectrisDetectorConnection.wait_for_acquisition()
. If this is not provided, it’s assumed that the detector should be actively armed and triggered.controller – A DectrisActiveController instance, which can be obtained from
DectrisDetectorConnection.get_active_controller()
. You can pass additional parameters toDectrisDetectorConnection.get_active_controller()
in order to change detector settings. If no controller is passed in, and pending_aq is also not given, then the acquisition will be started in active mode, leaving all detector settings unchanged.hooks – Acquisition hooks to react to certain events
- property array_backends: Sequence[Literal['numpy', 'numpy.matrix', 'cuda', 'cupy', 'sparse.COO', 'sparse.GCXS', 'sparse.DOK', 'scipy.sparse.coo_matrix', 'scipy.sparse.csr_matrix', 'scipy.sparse.csc_matrix', 'scipy.sparse.coo_array', 'scipy.sparse.csr_array', 'scipy.sparse.csc_array', 'cupyx.scipy.sparse.coo_matrix', 'cupyx.scipy.sparse.csr_matrix', 'cupyx.scipy.sparse.csc_matrix']]
The array backends the dataset can return data as.
Defaults to only NumPy arrays
New in version 0.11.0.
- property dtype
The “native” data type (either one matching the data on disk, or one that is closest)
- get_api_client() DEigerClient [source]
Get an API client, which can be used to configure the detector.
- property shape
The shape of the DataSet, as it makes sense for the application domain (for example, 4D for pixelated STEM)
- class libertem_live.detectors.dectris.DectrisConnectionBuilder[source]
Builder class that can construct
DectrisDetectorConnection
instances.Use the
open()
method to create a connection.- open(api_host: str, api_port: int, data_host: str, data_port: int, buffer_size: int = 2048, bytes_per_frame: int | None = None, frame_stack_size: int = 24, huge_pages: bool = False) DectrisDetectorConnection [source]
Connect to a DECTRIS DCU, both for detector configuration and for accessing the data stream.
- Parameters:
api_host – The hostname or IP address of the DECTRIS DCU for the REST API
api_port – The port of the REST API
data_host – The hostname or IP address of the DECTRIS DCU for the zeromq data stream
data_port – The zeromq port to use
buffer_size – The total receive buffer in MiB that is used to stream data to worker processes.
bytes_per_frame –
Roughtly how many bytes should be reserved per frame
If this is None, a rough guess will be calculated from the detector size. You can check the
bytes_per_frame
property to see if the guess matches reality, and adjust this parameter if it doesn’t.frame_stack_size – How many frames should be stacked together and put into a shared memory slot? If this is chosen too small, it might cause slowdowns because of having to handle many small objects; if it is chosen too large, it again may be slower due to having to split frame stacks more often in boundary conditions. When in doubt, leave this value at it’s default.
huge_pages –
Set to True to allocate shared memory in huge pages. This can improve performance by reducing the page fault cost. Currently only available on Linux. Enabling this requires reserving huge pages, either at system start, or before connecting.
For example, to reserve 10000 huge pages, you can run:
echo 10000 | sudo tee /proc/sys/vm/nr_hugepages
See also the
hugeadm
utility, especiallyhugeadm --explain
can be useful to check your configuration.
- class libertem_live.detectors.dectris.DectrisDetectorConnection(api_host: str, api_port: int, data_host: str, data_port: int, buffer_size: int = 2048, bytes_per_frame: int | None = None, frame_stack_size: int = 24, huge_pages: bool = False)[source]
Connection to a DECTRIS DCU, both for detector configuration and for accessing the data stream.
Please see
libertem_live.detectors.dectris.DectrisConnectionBuilder
for a description of the parameters, and uselibertem_live.api.LiveContext.make_connection()
to create a connection.Examples
>>> from libertem_live.api import LiveContext >>> with LiveContext() as ctx, ctx.make_connection('dectris').open( ... api_host='127.0.0.1', ... api_port=DCU_API_PORT, ... data_host='127.0.0.1', ... data_port=DCU_DATA_PORT, ... ) as conn: ... print("connected!") connected!
- close()[source]
Close the connection. It’s important to call this function once you don’t need the connection anymore, as an open connection might interfere with other software using the detector.
If possible, use this object as a context manager instead, using a
with
-statement.
- get_active_controller(trigger_mode: Literal['exte'] | Literal['exts'] | Literal['ints'] | Literal['inte'] | None = None, count_time: float | None = None, frame_time: float | None = None, roi_mode: str | None = None, roi_y_size: int | None = None, roi_bit_depth: int | None = None, enable_file_writing: bool | None = None, compression: str | None = None, name_pattern: str | None = None, nimages_per_file: int | None = 0, enable_corrections: bool = False, mask_to_zero: bool | None = None)[source]
Create a controller object that knows about the detector settings to apply when the acquisition starts.
Any settings left out or set to None will be left unchanged.
In general, please consult your detector manual for details!
- Parameters:
trigger_mode – One of ‘exte’, ‘inte’, ‘exts’, ‘ints’, as defined in the manual.
count_time – Exposure time per image in seconds
frame_time – The interval between start of image acquisitions in seconds. Must be greater than or equal to count_time.
roi_mode –
Configure ROI mode. Set to the string ‘disabled’ to disable ROI mode. The allowed values depend on the detector.
For example, for ARINA, to bin to frames of 96x96, set roi_mode to ‘merge2x2’.
For QUADRO and other supported detectors, to select a subset of lines as active, set roi_mode to ‘lines’. Then, additionally set roi_y_size to one of the supported values.
roi_bit_depth – For QUADRO, this can be either 8 or 16. Setting to 8 bit is required to reach the highest frame rates.
roi_y_size –
Select a subset of lines. For QUADRO, this has to be between 2 and 256, inclusive. Note that the image size is then two times this value, plus two pixels, for example if you select 64 lines, it will result in images with 130 pixels height and the full width.
Starting with DECTRIS software version “release-2022.1”, this is the total height instead, so any even number between 4 and 512, inclusive.
enable_file_writing – Enable file writing on the DCU. If set to False, explicitly disable file writing.
compression – The type of compression to enable. Can be, for example, ‘bslz4’, or ‘lz4’.
name_pattern – If given, the name pattern is set to the given string. Only set if file writing is enabled.
nimages_per_file – If file writing is enabled, split the written files such that at maximum this number of images are saved per file. The default is not to split into multiple files.
enable_corrections – Let LiberTEM automatically correct defect pixels, downloading the pixel mask from the detector configuration.
mask_to_zero –
When set to True, the bad pixels that are configured in the detector software are set to zero instead of MAX_INT. This is using the detector-internal correction facilities, not those of LiberTEM.
Needs a current version of the DECTRIS software to work correctly (at least “release-2022.1.2”).
- wait_for_acquisition(timeout: float | None = None) DectrisPendingAcquisition | None [source]
Wait for at most timeout seconds for an acquisition to start. This does not perform any triggering itself and expects something external to arm and trigger the acquisition.
Once the detector is armed, this function returns a PendingAcquisition, which can be converted to a full Acquisition object using
libertem_live.api.LiveContext.make_acquisition()
.The function returns None on timeout.
- Parameters:
timeout – Timeout in seconds. If None, wait indefinitely.
Examples
>>> with ctx.make_connection('dectris').open( ... api_host='127.0.0.1', ... api_port=DCU_API_PORT, ... data_host='127.0.0.1', ... data_port=DCU_DATA_PORT, ... ) as conn: ... # NOTE: this is the part that is usually done by an external software, ... # but we include it here to have a running example: ... ec = conn.get_api_client() ... arm_response = ec.sendDetectorCommand('arm') ... ... pending_aq = conn.wait_for_acquisition(timeout=1) ... assert pending_aq is not None, "timeout" ... ... aq = ctx.make_acquisition( ... conn=conn, ... nav_shape=(32, 32), ... pending_aq=pending_aq, ... ) ... ctx.run_udf(dataset=aq, udf=SumUDF()) {'intensity': ...}