Skip to main content

No project description provided

Project description

LiberTEM-dectris-rs

LiberTEM-dectris-rs on GitHub

This is a Python package for efficiently receiving data from DECTRIS detectors with the zeromq interface. The low-level, high-frequency operations are performed in a background thread implemented in rust, and multiple frames are batched together for further processing in Python.

It is built for LiberTEM-live, but can also be used stand-alone.

Usage

import numpy as np
import libertem_dectris
from libertem_live.detectors.dectris.DEigerClient import DEigerClient

# trigger acquisition via the REST API, needs `libertem-live`
nimages = 256 * 256
ec = DEigerClient('localhost', 8910)  # hostname and port of the DCU REST API
ec.setDetectorConfig('ntrigger', 1)
ec.setDetectorConfig('nimages', 1)
ec.setDetectorConfig('trigger_mode', 'exte')
ec.setDetectorConfig('ntrigger', nimages)
result = ec.sendDetectorCommand('arm')
sequence_id = result['sequence id'] 

conn = libertem_dectris.DectrisConnection(
    uri="tcp://localhost:9999",
    handle_path="/tmp/dectris_shm",
    frame_stack_size=32,
    num_slots=2000,
    bytes_per_frame=512*512,
    huge=False,
)

# as we have armed the detector above, we know the sequence number
# that we should expect:
# (in other cases, can also call
# `conn.start_passive` and `conn.wait_for_arm` to passively wait for
# the detector to be armed)
conn.start(sequence_id)

# any other process can use a `CamClient` to use data
# stored in the SHM:
cam_client = libertem_dectris.CamClient(conn.get_socket_path())

try:
    while True:
        # get at most `max_size` frames as a stack
        # (might get less at the end of the acquisition)
        stack_handle = conn.get_next_stack(max_size=32)

        # if the receiver is idle, stack_handle will be None here:
        if stack_handle is None:
            break

        # the expected shape and data type:
        frame_shape = tuple(reversed(stack_handle.get_shape()))
        dtype = np.dtype(stack_handle.get_pixel_type()).newbyteorder(
            stack_handle.get_endianess()
        )

        # pre-allocate some memory for the pixel data:
        # (would be pulled out of the loop in real code)
        buf = np.zeros((len(stack_handle),) + frame_shape, dtype=dtype)

        # decompress into the pre-allocated buffer
        cam_client.decompress_frame_stack(stack_handle, out=buf)

        # free up the shared memory slot for this frame stack:
        cam_client.done(stack_handle)

        # we can still use the decompressed data:
        buf.sum()
finally:
    conn.close()  # clean up background thread etc.
    cam_client.close()

Changelog

v0.2.12

  • Refactored and unified interface - allows for more code sharing between crates
  • Some robustness changes around adding timeout parameters for many top-level operations

v0.2.11

  • Re-release for CI changes

v0.2.10

  • Add functionality to generate mock data for sending via the simulator
  • Add missing numpy dependency
  • Make debug output a bit more reliable

v0.2.9

  • Add more debug and trace output

v0.2.7

  • Log more details in DectrisConnection.log_shm_stats and change log level to INFO
  • Increase timeout for sending headers and frames

v0.2.4 - v0.2.6

  • Updated examples and CI configuration

v0.2.3

  • Add env_logger: set environment variable LIBERTEM_DECTRIS_LOG_LEVEL to e.g. 'INFO' to enable logging
  • Improved error handling: raise an exception instead of panicing on serialization errors
  • Ignore messages with mismatching series ID
  • Add explicit checks for the correct header_detail levels
  • Move code into monorepo

v0.2.2

  • Vendor bitshuffle and add Frame.decompress_into method, PR #10

v0.2.1

  • Catch frame ID mismatch, PR #9

v0.2.0

  • Added libertem_dectris.headers submodule that exports header classes
  • Added ways to create libertem_dectris.Frame and libertem_dectris.FrameStack objects from Python, mostly useful for testing
  • Added binding to random port for the simulator
  • Properly parametrize with zmq endpoint URI
  • Fix many clippy complaints

v0.1.0

Initial release!

Development

This package is using pyo3 with maturin to create the Python bindings. First, make sure maturin is installed in your Python environment:

(venv) $ pip install maturin

Then, after each change to the rust code, run maturin develop -r to build and install a new version of the wheel.

As we vendor bitshuffle, make sure to clone with git clone --recursive ..., or manually take care of initializing and updating submodules.

Release

  • update changelog above
  • bump version in Cargo.toml if not already bumped, and push
  • create a release from the GitHub UI, creating a new tag vX.Y.Z
  • done!

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

libertem_dectris-0.2.12.tar.gz (2.2 MB view details)

Uploaded Source

Built Distributions

libertem_dectris-0.2.12-cp37-abi3-win_amd64.whl (1.1 MB view details)

Uploaded CPython 3.7+ Windows x86-64

libertem_dectris-0.2.12-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (15.9 MB view details)

Uploaded CPython 3.7+ manylinux: glibc 2.17+ x86-64

libertem_dectris-0.2.12-cp37-abi3-macosx_11_0_x86_64.whl (1.4 MB view details)

Uploaded CPython 3.7+ macOS 11.0+ x86-64

libertem_dectris-0.2.12-cp37-abi3-macosx_11_0_arm64.whl (1.3 MB view details)

Uploaded CPython 3.7+ macOS 11.0+ ARM64

File details

Details for the file libertem_dectris-0.2.12.tar.gz.

File metadata

  • Download URL: libertem_dectris-0.2.12.tar.gz
  • Upload date:
  • Size: 2.2 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: maturin/1.7.1

File hashes

Hashes for libertem_dectris-0.2.12.tar.gz
Algorithm Hash digest
SHA256 f44de61feb6d6c38143b9036f048d12d253ff92ab8c4966a38f2ef1a21edbbce
MD5 8d4038b48d15f1e961c0bd3f9a4897b7
BLAKE2b-256 3e3394575c2dcb73b3a250c05a0276eaa55a93e49e58cffe75a2c9d8196a9f4b

See more details on using hashes here.

File details

Details for the file libertem_dectris-0.2.12-cp37-abi3-win_amd64.whl.

File metadata

File hashes

Hashes for libertem_dectris-0.2.12-cp37-abi3-win_amd64.whl
Algorithm Hash digest
SHA256 777630ed831d092a048af2f5d9a0f7085acd2ff83d0254faf9679c4115c01c05
MD5 3c2722303a68f80ee1ef1b571399d73d
BLAKE2b-256 9b981a745eb314cd1939c270990a9940ee2cefc11fa15cd8b576a8430a201045

See more details on using hashes here.

File details

Details for the file libertem_dectris-0.2.12-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for libertem_dectris-0.2.12-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 3cf055878cc15b1c5079240ee9e04645b93385aa61ccb3a12c26ddf4d50bfd97
MD5 8312c4273b7c8fd6be2ac6aa01d39097
BLAKE2b-256 4483cdcdd749373936f53931dfd37ed0fe0e61374f8c63fb722f58a123cc39c7

See more details on using hashes here.

File details

Details for the file libertem_dectris-0.2.12-cp37-abi3-macosx_11_0_x86_64.whl.

File metadata

File hashes

Hashes for libertem_dectris-0.2.12-cp37-abi3-macosx_11_0_x86_64.whl
Algorithm Hash digest
SHA256 c7cc55d7665affa243ccca64935bcd1bf85458f35fd100f8c0d8962d59fb74fa
MD5 c7a6c3142352ac53a642bd244d10cab6
BLAKE2b-256 35b6264426e44b19c73e3d38e4bdd1754adc80de7fe50c8681f4d2e6ffdce916

See more details on using hashes here.

File details

Details for the file libertem_dectris-0.2.12-cp37-abi3-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for libertem_dectris-0.2.12-cp37-abi3-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 8885ae05af974b826615f32d19a9e9fe56d57bb14399e8c5d1126f044458aab1
MD5 1e7d369651fcad273e47e38bb8d3cb3c
BLAKE2b-256 febaad8923a73a6797779c56626de31ad871a93244721489f0f246ec965a3557

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page