mirror of
https://github.com/slsdetectorgroup/slsDetectorPackage.git
synced 2025-06-07 10:30:41 +02:00
Merge branch 'developer' into dev/multirxr_proper_cleanup_on_ctrlc
This commit is contained in:
commit
6e6b1b64e4
@ -1,4 +1,4 @@
|
|||||||
name: CMake
|
name: Native CMake Build
|
||||||
|
|
||||||
on: [push, pull_request]
|
on: [push, pull_request]
|
||||||
|
|
||||||
@ -14,7 +14,13 @@ jobs:
|
|||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
name: Configure and build using cmake
|
name: Configure and build using cmake
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v4
|
||||||
|
- uses: actions/setup-python@v5
|
||||||
|
with:
|
||||||
|
python-version: 3.12
|
||||||
|
cache: 'pip'
|
||||||
|
- run: pip install pytest numpy
|
||||||
|
|
||||||
- uses: awalsh128/cache-apt-pkgs-action@latest
|
- uses: awalsh128/cache-apt-pkgs-action@latest
|
||||||
with:
|
with:
|
||||||
packages: libhdf5-dev qtbase5-dev qt5-qmake libqt5svg5-dev libpng-dev libtiff-dev
|
packages: libhdf5-dev qtbase5-dev qt5-qmake libqt5svg5-dev libpng-dev libtiff-dev
|
||||||
@ -27,12 +33,15 @@ jobs:
|
|||||||
|
|
||||||
- name: Build
|
- name: Build
|
||||||
# Build your program with the given configuration
|
# Build your program with the given configuration
|
||||||
run: cmake --build ${{github.workspace}}/build -j2 --config ${{env.BUILD_TYPE}}
|
run: cmake --build ${{github.workspace}}/build -j4 --config ${{env.BUILD_TYPE}}
|
||||||
|
|
||||||
- name: Test
|
- name: C++ unit tests
|
||||||
working-directory: ${{github.workspace}}/build
|
working-directory: ${{github.workspace}}/build
|
||||||
# Execute tests defined by the CMake configuration.
|
|
||||||
# See https://cmake.org/cmake/help/latest/manual/ctest.1.html for more detail
|
|
||||||
run: ctest -C ${{env.BUILD_TYPE}} -j1
|
run: ctest -C ${{env.BUILD_TYPE}} -j1
|
||||||
|
|
||||||
|
- name: Python unit tests
|
||||||
|
working-directory: ${{github.workspace}}/build/bin
|
||||||
|
run: |
|
||||||
|
python -m pytest ${{github.workspace}}/python/tests
|
||||||
|
|
||||||
|
|
42
.github/workflows/conda_library.yaml
vendored
Normal file
42
.github/workflows/conda_library.yaml
vendored
Normal file
@ -0,0 +1,42 @@
|
|||||||
|
name: Build slsdetlib
|
||||||
|
|
||||||
|
on: [pull_request]
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build:
|
||||||
|
strategy:
|
||||||
|
fail-fast: false
|
||||||
|
matrix:
|
||||||
|
platform: [ubuntu-latest, ] # macos-12, windows-2019]
|
||||||
|
python-version: ["3.12",]
|
||||||
|
|
||||||
|
runs-on: ${{ matrix.platform }}
|
||||||
|
|
||||||
|
# The setup-miniconda action needs this to activate miniconda
|
||||||
|
defaults:
|
||||||
|
run:
|
||||||
|
shell: "bash -l {0}"
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Get conda
|
||||||
|
uses: conda-incubator/setup-miniconda@v3.0.4
|
||||||
|
with:
|
||||||
|
python-version: ${{ matrix.python-version }}
|
||||||
|
channels: conda-forge
|
||||||
|
|
||||||
|
- name: Prepare
|
||||||
|
run: conda install conda-build conda-verify pytest anaconda-client
|
||||||
|
|
||||||
|
- name: Disable upload
|
||||||
|
run: conda config --set anaconda_upload no
|
||||||
|
|
||||||
|
- name: Build
|
||||||
|
run: conda build conda-recipes/main-library --output-folder build_output
|
||||||
|
|
||||||
|
- name: Upload all Conda packages
|
||||||
|
uses: actions/upload-artifact@v4
|
||||||
|
with:
|
||||||
|
name: conda-packages
|
||||||
|
path: build_output/** # Uploads all packages
|
42
.github/workflows/conda_python.yaml
vendored
Normal file
42
.github/workflows/conda_python.yaml
vendored
Normal file
@ -0,0 +1,42 @@
|
|||||||
|
name: slsdet
|
||||||
|
|
||||||
|
on: [pull_request]
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build:
|
||||||
|
strategy:
|
||||||
|
fail-fast: false
|
||||||
|
matrix:
|
||||||
|
platform: [ubuntu-latest, ] # macos-12, windows-2019]
|
||||||
|
python-version: ["3.12",]
|
||||||
|
|
||||||
|
runs-on: ${{ matrix.platform }}
|
||||||
|
|
||||||
|
# The setup-miniconda action needs this to activate miniconda
|
||||||
|
defaults:
|
||||||
|
run:
|
||||||
|
shell: "bash -l {0}"
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Get conda
|
||||||
|
uses: conda-incubator/setup-miniconda@v3.0.4
|
||||||
|
with:
|
||||||
|
python-version: ${{ matrix.python-version }}
|
||||||
|
channels: conda-forge
|
||||||
|
|
||||||
|
- name: Prepare
|
||||||
|
run: conda install conda-build conda-verify pytest anaconda-client
|
||||||
|
|
||||||
|
- name: Disable upload
|
||||||
|
run: conda config --set anaconda_upload no
|
||||||
|
|
||||||
|
- name: Build
|
||||||
|
run: conda build conda-recipes/python-client --output-folder build_output
|
||||||
|
|
||||||
|
- name: Upload all Conda packages
|
||||||
|
uses: actions/upload-artifact@v4
|
||||||
|
with:
|
||||||
|
name: conda-packages
|
||||||
|
path: build_output/** # Uploads all packages
|
@ -1,6 +1,6 @@
|
|||||||
# SPDX-License-Identifier: LGPL-3.0-or-other
|
# SPDX-License-Identifier: LGPL-3.0-or-other
|
||||||
# Copyright (C) 2021 Contributors to the SLS Detector Package
|
# Copyright (C) 2021 Contributors to the SLS Detector Package
|
||||||
cmake_minimum_required(VERSION 3.14)
|
cmake_minimum_required(VERSION 3.15)
|
||||||
project(slsDetectorPackage)
|
project(slsDetectorPackage)
|
||||||
|
|
||||||
# Read VERSION file into project version
|
# Read VERSION file into project version
|
||||||
@ -29,20 +29,40 @@ include(FetchContent)
|
|||||||
option(SLS_FETCH_ZMQ_FROM_GITHUB "Fetch zmq from github" OFF)
|
option(SLS_FETCH_ZMQ_FROM_GITHUB "Fetch zmq from github" OFF)
|
||||||
option(SLS_FETCH_PYBIND11_FROM_GITHUB "Fetch pybind11 from github" OFF)
|
option(SLS_FETCH_PYBIND11_FROM_GITHUB "Fetch pybind11 from github" OFF)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# Allow FetchContent_Populate to be called with a single argument
|
||||||
|
# otherwise deprecated warning is issued
|
||||||
|
# Note: From cmake 3.28 we can pass EXCLUDE_FROM_ALL to FetchContent_Declare
|
||||||
|
# and avoid direct use of Populate
|
||||||
|
if (${CMAKE_VERSION} VERSION_GREATER_EQUAL "3.30")
|
||||||
|
cmake_policy(SET CMP0169 OLD)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# Patch libzmq to set minimum cmake version to 3.15 to avoid warnings
|
||||||
|
# with newer cmake versions
|
||||||
|
# Patch is applied in the FetchContent_Declare
|
||||||
|
set(SLS_LIBZMQ_VERSION "4.3.4")
|
||||||
|
|
||||||
|
|
||||||
if(SLS_FETCH_ZMQ_FROM_GITHUB)
|
if(SLS_FETCH_ZMQ_FROM_GITHUB)
|
||||||
# Opt in to pull down a zmq version from github instead of
|
# Opt in to pull down a zmq version from github instead of
|
||||||
# using the bundled verison
|
# using the bundled version
|
||||||
FetchContent_Declare(
|
FetchContent_Declare(
|
||||||
libzmq
|
libzmq
|
||||||
GIT_REPOSITORY https://github.com/zeromq/libzmq.git
|
GIT_REPOSITORY https://github.com/zeromq/libzmq.git
|
||||||
GIT_TAG v4.3.4
|
GIT_TAG v${SLS_LIBZMQ_VERSION}
|
||||||
|
PATCH_COMMAND ${CMAKE_COMMAND} -E chdir <SOURCE_DIR> patch -p1 < ${CMAKE_CURRENT_SOURCE_DIR}/libs/libzmq/libzmq_cmake_version.patch
|
||||||
|
UPDATE_DISCONNECTED 1
|
||||||
)
|
)
|
||||||
else()
|
else()
|
||||||
# Standard behaviour use libzmq included in this repo (libs/libzmq)
|
# Standard behaviour use libzmq included in this repo (libs/libzmq)
|
||||||
FetchContent_Declare(
|
FetchContent_Declare(
|
||||||
libzmq
|
libzmq
|
||||||
URL ${CMAKE_CURRENT_SOURCE_DIR}/libs/libzmq/libzmq-4.3.4.tar.gz
|
URL ${CMAKE_CURRENT_SOURCE_DIR}/libs/libzmq/libzmq-${SLS_LIBZMQ_VERSION}.tar.gz
|
||||||
URL_HASH MD5=cc20b769ac10afa352e5ed2769bb23b3
|
URL_HASH MD5=cc20b769ac10afa352e5ed2769bb23b3
|
||||||
|
PATCH_COMMAND ${CMAKE_COMMAND} -E chdir <SOURCE_DIR> patch -p1 < ${CMAKE_CURRENT_SOURCE_DIR}/libs/libzmq/libzmq_cmake_version.patch
|
||||||
|
UPDATE_DISCONNECTED 1
|
||||||
)
|
)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
@ -54,6 +74,11 @@ set(ENABLE_CPACK OFF CACHE BOOL "")
|
|||||||
set(ENABLE_CLANG OFF CACHE BOOL "")
|
set(ENABLE_CLANG OFF CACHE BOOL "")
|
||||||
set(ENABLE_CURVE OFF CACHE BOOL "")
|
set(ENABLE_CURVE OFF CACHE BOOL "")
|
||||||
set(ENABLE_DRAFTS OFF CACHE BOOL "")
|
set(ENABLE_DRAFTS OFF CACHE BOOL "")
|
||||||
|
set(ENABLE_PRECOMPILED OFF CACHE BOOL "")
|
||||||
|
set(WITH_DOC OFF CACHE BOOL "")
|
||||||
|
set(WITH_DOCS OFF CACHE BOOL "")
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# Using GetProperties and Populate to be able to exclude zmq
|
# Using GetProperties and Populate to be able to exclude zmq
|
||||||
# from install (not possible with FetchContent_MakeAvailable(libzmq))
|
# from install (not possible with FetchContent_MakeAvailable(libzmq))
|
||||||
@ -191,7 +216,7 @@ endif()
|
|||||||
# to control options for the libraries
|
# to control options for the libraries
|
||||||
if(NOT TARGET slsProjectOptions)
|
if(NOT TARGET slsProjectOptions)
|
||||||
add_library(slsProjectOptions INTERFACE)
|
add_library(slsProjectOptions INTERFACE)
|
||||||
target_compile_features(slsProjectOptions INTERFACE cxx_std_11)
|
target_compile_features(slsProjectOptions INTERFACE cxx_std_11)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if (NOT TARGET slsProjectWarnings)
|
if (NOT TARGET slsProjectWarnings)
|
||||||
@ -329,9 +354,15 @@ if (SLS_USE_CTBGUI)
|
|||||||
add_subdirectory(pyctbgui)
|
add_subdirectory(pyctbgui)
|
||||||
endif(SLS_USE_CTBGUI)
|
endif(SLS_USE_CTBGUI)
|
||||||
|
|
||||||
configure_file( .clang-tidy
|
# Workaround for file note being copied to build directory
|
||||||
${CMAKE_BINARY_DIR}/.clang-tidy
|
# when issuing a python -m build
|
||||||
)
|
# TODO! Proper fix
|
||||||
|
if(EXISTS ".clang-tidy")
|
||||||
|
configure_file(.clang-tidy
|
||||||
|
${CMAKE_BINARY_DIR}/.clang-tidy
|
||||||
|
)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
|
||||||
if (SLS_BUILD_EXAMPLES)
|
if (SLS_BUILD_EXAMPLES)
|
||||||
add_subdirectory(sample)
|
add_subdirectory(sample)
|
||||||
|
@ -1,11 +0,0 @@
|
|||||||
# SPDX-License-Identifier: LGPL-3.0-or-other
|
|
||||||
# Copyright (C) 2021 Contributors to the SLS Detector Package
|
|
||||||
|
|
||||||
echo "|<-------- starting python build"
|
|
||||||
|
|
||||||
cd python
|
|
||||||
|
|
||||||
# copy VERSION into slsdet for installation
|
|
||||||
cp ../VERSION slsdet/VERSION
|
|
||||||
|
|
||||||
${PYTHON} setup.py install
|
|
@ -1,8 +0,0 @@
|
|||||||
python:
|
|
||||||
- 3.8
|
|
||||||
- 3.9
|
|
||||||
- 3.10
|
|
||||||
- 3.11
|
|
||||||
- 3.12
|
|
||||||
- 3.13
|
|
||||||
|
|
@ -1,11 +0,0 @@
|
|||||||
# SPDX-License-Identifier: LGPL-3.0-or-other
|
|
||||||
# Copyright (C) 2021 Contributors to the SLS Detector Package
|
|
||||||
mkdir $PREFIX/lib
|
|
||||||
mkdir $PREFIX/bin
|
|
||||||
mkdir $PREFIX/include
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
cp build/bin/ctbGui $PREFIX/bin/.
|
|
||||||
cp build/bin/libctbRootLib.so $PREFIX/lib/.
|
|
||||||
|
|
@ -1,125 +0,0 @@
|
|||||||
package:
|
|
||||||
name: sls_detector_software
|
|
||||||
version: {{ environ.get('GIT_DESCRIBE_TAG', '') }}
|
|
||||||
|
|
||||||
|
|
||||||
source:
|
|
||||||
path: ..
|
|
||||||
|
|
||||||
build:
|
|
||||||
number: 0
|
|
||||||
binary_relocation: True
|
|
||||||
rpaths:
|
|
||||||
- lib/
|
|
||||||
|
|
||||||
requirements:
|
|
||||||
build:
|
|
||||||
- {{ compiler('c') }}
|
|
||||||
- {{compiler('cxx')}}
|
|
||||||
- cmake
|
|
||||||
- qt 5.*
|
|
||||||
- xorg-libx11
|
|
||||||
- xorg-libice
|
|
||||||
- xorg-libxext
|
|
||||||
- xorg-libsm
|
|
||||||
- xorg-libxau
|
|
||||||
- xorg-libxrender
|
|
||||||
- xorg-libxfixes
|
|
||||||
- {{ cdt('mesa-libgl-devel') }} # [linux]
|
|
||||||
- {{ cdt('mesa-libegl-devel') }} # [linux]
|
|
||||||
- {{ cdt('mesa-dri-drivers') }} # [linux]
|
|
||||||
- {{ cdt('libselinux') }} # [linux]
|
|
||||||
- {{ cdt('libxdamage') }} # [linux]
|
|
||||||
- {{ cdt('libxxf86vm') }} # [linux]
|
|
||||||
- expat
|
|
||||||
|
|
||||||
host:
|
|
||||||
- libstdcxx-ng
|
|
||||||
- libgcc-ng
|
|
||||||
- xorg-libx11
|
|
||||||
- xorg-libice
|
|
||||||
- xorg-libxext
|
|
||||||
- xorg-libsm
|
|
||||||
- xorg-libxau
|
|
||||||
- xorg-libxrender
|
|
||||||
- xorg-libxfixes
|
|
||||||
- expat
|
|
||||||
|
|
||||||
run:
|
|
||||||
- libstdcxx-ng
|
|
||||||
- libgcc-ng
|
|
||||||
|
|
||||||
|
|
||||||
outputs:
|
|
||||||
- name: slsdetlib
|
|
||||||
script: copy_lib.sh
|
|
||||||
|
|
||||||
requirements:
|
|
||||||
build:
|
|
||||||
- {{ compiler('c') }}
|
|
||||||
- {{compiler('cxx')}}
|
|
||||||
- libstdcxx-ng
|
|
||||||
- libgcc-ng
|
|
||||||
|
|
||||||
run:
|
|
||||||
- libstdcxx-ng
|
|
||||||
- libgcc-ng
|
|
||||||
|
|
||||||
- name: slsdet
|
|
||||||
script: build_pylib.sh
|
|
||||||
|
|
||||||
requirements:
|
|
||||||
build:
|
|
||||||
- python
|
|
||||||
- {{ compiler('c') }}
|
|
||||||
- {{compiler('cxx')}}
|
|
||||||
- {{ pin_subpackage('slsdetlib', exact=True) }}
|
|
||||||
- setuptools
|
|
||||||
- pybind11=2.13
|
|
||||||
|
|
||||||
host:
|
|
||||||
- python
|
|
||||||
- {{ pin_subpackage('slsdetlib', exact=True) }}
|
|
||||||
- setuptools
|
|
||||||
- pybind11=2.13
|
|
||||||
|
|
||||||
|
|
||||||
run:
|
|
||||||
- libstdcxx-ng
|
|
||||||
- libgcc-ng
|
|
||||||
- python
|
|
||||||
- numpy
|
|
||||||
- {{ pin_subpackage('slsdetlib', exact=True) }}
|
|
||||||
|
|
||||||
test:
|
|
||||||
imports:
|
|
||||||
- slsdet
|
|
||||||
|
|
||||||
|
|
||||||
- name: slsdetgui
|
|
||||||
script: copy_gui.sh
|
|
||||||
requirements:
|
|
||||||
|
|
||||||
build:
|
|
||||||
- {{ compiler('c') }}
|
|
||||||
- {{compiler('cxx')}}
|
|
||||||
- {{ pin_subpackage('slsdetlib', exact=True) }}
|
|
||||||
|
|
||||||
run:
|
|
||||||
- {{ pin_subpackage('slsdetlib', exact=True) }}
|
|
||||||
- qt 5.*
|
|
||||||
- expat
|
|
||||||
|
|
||||||
- name: moenchzmq
|
|
||||||
script: copy_moench.sh
|
|
||||||
requirements:
|
|
||||||
|
|
||||||
build:
|
|
||||||
- {{ compiler('c') }}
|
|
||||||
- {{compiler('cxx')}}
|
|
||||||
- {{ pin_subpackage('slsdetlib', exact=True) }}
|
|
||||||
|
|
||||||
|
|
||||||
run:
|
|
||||||
- {{ pin_subpackage('slsdetlib', exact=True) }}
|
|
||||||
- expat
|
|
@ -1,3 +0,0 @@
|
|||||||
# SPDX-License-Identifier: LGPL-3.0-or-other
|
|
||||||
# Copyright (C) 2021 Contributors to the SLS Detector Package
|
|
||||||
ctest -j2
|
|
@ -8,7 +8,7 @@ if [ ! -d "install" ]; then
|
|||||||
mkdir install
|
mkdir install
|
||||||
fi
|
fi
|
||||||
cd build
|
cd build
|
||||||
cmake .. \
|
cmake .. -G Ninja \
|
||||||
-DCMAKE_PREFIX_PATH=$CONDA_PREFIX \
|
-DCMAKE_PREFIX_PATH=$CONDA_PREFIX \
|
||||||
-DCMAKE_INSTALL_PREFIX=install \
|
-DCMAKE_INSTALL_PREFIX=install \
|
||||||
-DSLS_USE_TEXTCLIENT=ON \
|
-DSLS_USE_TEXTCLIENT=ON \
|
||||||
@ -18,7 +18,7 @@ cmake .. \
|
|||||||
-DSLS_USE_TESTS=ON \
|
-DSLS_USE_TESTS=ON \
|
||||||
-DSLS_USE_PYTHON=OFF \
|
-DSLS_USE_PYTHON=OFF \
|
||||||
-DCMAKE_BUILD_TYPE=Release \
|
-DCMAKE_BUILD_TYPE=Release \
|
||||||
-DSLS_USE_HDF5=OFF\
|
-DSLS_USE_HDF5=OFF \
|
||||||
|
|
||||||
NCORES=$(getconf _NPROCESSORS_ONLN)
|
NCORES=$(getconf _NPROCESSORS_ONLN)
|
||||||
echo "Building using: ${NCORES} cores"
|
echo "Building using: ${NCORES} cores"
|
13
conda-recipes/main-library/conda_build_config.yaml
Normal file
13
conda-recipes/main-library/conda_build_config.yaml
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
|
||||||
|
c_compiler:
|
||||||
|
- gcc # [linux]
|
||||||
|
|
||||||
|
c_stdlib:
|
||||||
|
- sysroot # [linux]
|
||||||
|
|
||||||
|
cxx_compiler:
|
||||||
|
- gxx # [linux]
|
||||||
|
|
||||||
|
|
||||||
|
c_stdlib_version: # [linux]
|
||||||
|
- 2.17 # [linux]
|
@ -4,7 +4,6 @@
|
|||||||
mkdir -p $PREFIX/lib
|
mkdir -p $PREFIX/lib
|
||||||
mkdir -p $PREFIX/bin
|
mkdir -p $PREFIX/bin
|
||||||
mkdir -p $PREFIX/include/sls
|
mkdir -p $PREFIX/include/sls
|
||||||
# mkdir $PREFIX/include/slsDetectorPackage
|
|
||||||
|
|
||||||
#Shared and static libraries
|
#Shared and static libraries
|
||||||
cp build/install/lib/* $PREFIX/lib/
|
cp build/install/lib/* $PREFIX/lib/
|
||||||
@ -15,8 +14,10 @@ cp build/install/bin/sls_detector_acquire_zmq $PREFIX/bin/.
|
|||||||
cp build/install/bin/sls_detector_get $PREFIX/bin/.
|
cp build/install/bin/sls_detector_get $PREFIX/bin/.
|
||||||
cp build/install/bin/sls_detector_put $PREFIX/bin/.
|
cp build/install/bin/sls_detector_put $PREFIX/bin/.
|
||||||
cp build/install/bin/sls_detector_help $PREFIX/bin/.
|
cp build/install/bin/sls_detector_help $PREFIX/bin/.
|
||||||
|
cp build/install/bin/sls_detector $PREFIX/bin/.
|
||||||
cp build/install/bin/slsReceiver $PREFIX/bin/.
|
cp build/install/bin/slsReceiver $PREFIX/bin/.
|
||||||
cp build/install/bin/slsMultiReceiver $PREFIX/bin/.
|
cp build/install/bin/slsMultiReceiver $PREFIX/bin/.
|
||||||
|
cp build/install/bin/slsFrameSynchronizer $PREFIX/bin/.
|
||||||
|
|
||||||
|
|
||||||
cp build/install/include/sls/* $PREFIX/include/sls
|
cp build/install/include/sls/* $PREFIX/include/sls
|
79
conda-recipes/main-library/meta.yaml
Executable file
79
conda-recipes/main-library/meta.yaml
Executable file
@ -0,0 +1,79 @@
|
|||||||
|
package:
|
||||||
|
name: sls_detector_software
|
||||||
|
version: 2025.3.19
|
||||||
|
|
||||||
|
|
||||||
|
source:
|
||||||
|
path: ../..
|
||||||
|
|
||||||
|
build:
|
||||||
|
number: 0
|
||||||
|
binary_relocation: True
|
||||||
|
rpaths:
|
||||||
|
- lib/
|
||||||
|
|
||||||
|
requirements:
|
||||||
|
build:
|
||||||
|
- {{ compiler('c') }}
|
||||||
|
- {{ stdlib("c") }}
|
||||||
|
- {{ compiler('cxx') }}
|
||||||
|
- git
|
||||||
|
- cmake
|
||||||
|
- ninja
|
||||||
|
- qt 5.*
|
||||||
|
|
||||||
|
host:
|
||||||
|
- libstdcxx-ng
|
||||||
|
- libgcc-ng
|
||||||
|
- libgl-devel # [linux]
|
||||||
|
- libtiff
|
||||||
|
- zlib
|
||||||
|
|
||||||
|
run:
|
||||||
|
- libstdcxx-ng
|
||||||
|
- libgcc-ng
|
||||||
|
|
||||||
|
|
||||||
|
outputs:
|
||||||
|
- name: slsdetlib
|
||||||
|
script: copy_lib.sh
|
||||||
|
|
||||||
|
requirements:
|
||||||
|
build:
|
||||||
|
- {{ compiler('c') }}
|
||||||
|
- {{ stdlib("c") }}
|
||||||
|
- {{ compiler('cxx') }}
|
||||||
|
|
||||||
|
run:
|
||||||
|
- libstdcxx-ng
|
||||||
|
- libgcc-ng
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
- name: slsdetgui
|
||||||
|
script: copy_gui.sh
|
||||||
|
requirements:
|
||||||
|
|
||||||
|
build:
|
||||||
|
- {{ compiler('c') }}
|
||||||
|
- {{compiler('cxx')}}
|
||||||
|
- {{ pin_subpackage('slsdetlib', exact=True) }}
|
||||||
|
|
||||||
|
run:
|
||||||
|
- {{ pin_subpackage('slsdetlib', exact=True) }}
|
||||||
|
- qt 5.*
|
||||||
|
|
||||||
|
|
||||||
|
- name: moenchzmq
|
||||||
|
script: copy_moench.sh
|
||||||
|
requirements:
|
||||||
|
|
||||||
|
build:
|
||||||
|
- {{ compiler('c') }}
|
||||||
|
- {{compiler('cxx')}}
|
||||||
|
- {{ pin_subpackage('slsdetlib', exact=True) }}
|
||||||
|
|
||||||
|
|
||||||
|
run:
|
||||||
|
- {{ pin_subpackage('slsdetlib', exact=True) }}
|
16
conda-recipes/python-client/conda_build_config.yaml
Normal file
16
conda-recipes/python-client/conda_build_config.yaml
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
python:
|
||||||
|
- 3.11
|
||||||
|
- 3.12
|
||||||
|
- 3.13
|
||||||
|
|
||||||
|
c_compiler:
|
||||||
|
- gcc # [linux]
|
||||||
|
|
||||||
|
c_stdlib:
|
||||||
|
- sysroot # [linux]
|
||||||
|
|
||||||
|
cxx_compiler:
|
||||||
|
- gxx # [linux]
|
||||||
|
|
||||||
|
c_stdlib_version: # [linux]
|
||||||
|
- 2.17 # [linux]
|
45
conda-recipes/python-client/meta.yaml
Normal file
45
conda-recipes/python-client/meta.yaml
Normal file
@ -0,0 +1,45 @@
|
|||||||
|
package:
|
||||||
|
name: slsdet
|
||||||
|
version: 2025.3.19 #TODO! how to not duplicate this?
|
||||||
|
|
||||||
|
source:
|
||||||
|
path: ../..
|
||||||
|
|
||||||
|
build:
|
||||||
|
number: 0
|
||||||
|
script:
|
||||||
|
- unset CMAKE_GENERATOR && {{ PYTHON }} -m pip install . -vv # [not win]
|
||||||
|
|
||||||
|
requirements:
|
||||||
|
build:
|
||||||
|
- python {{python}}
|
||||||
|
- {{ compiler('c') }}
|
||||||
|
- {{ stdlib("c") }}
|
||||||
|
- {{ compiler('cxx') }}
|
||||||
|
|
||||||
|
|
||||||
|
host:
|
||||||
|
- cmake
|
||||||
|
- ninja
|
||||||
|
- python {{python}}
|
||||||
|
- pip
|
||||||
|
- scikit-build-core
|
||||||
|
- pybind11 >=2.13.0
|
||||||
|
- fmt
|
||||||
|
- zeromq
|
||||||
|
- nlohmann_json
|
||||||
|
- catch2
|
||||||
|
|
||||||
|
run:
|
||||||
|
- python {{python}}
|
||||||
|
- numpy
|
||||||
|
|
||||||
|
|
||||||
|
test:
|
||||||
|
imports:
|
||||||
|
- slsdet
|
||||||
|
|
||||||
|
|
||||||
|
about:
|
||||||
|
summary: An example project built with pybind11 and scikit-build.
|
||||||
|
# license_file: LICENSE
|
@ -54,6 +54,7 @@ set(SPHINX_SOURCE_FILES
|
|||||||
src/serverdefaults.rst
|
src/serverdefaults.rst
|
||||||
src/quick_start_guide.rst
|
src/quick_start_guide.rst
|
||||||
src/troubleshooting.rst
|
src/troubleshooting.rst
|
||||||
|
src/pattern.rst
|
||||||
src/receivers.rst
|
src/receivers.rst
|
||||||
src/slsreceiver.rst
|
src/slsreceiver.rst
|
||||||
src/udpheader.rst
|
src/udpheader.rst
|
||||||
|
@ -37,6 +37,7 @@ Welcome to slsDetectorPackage's documentation!
|
|||||||
pyenums
|
pyenums
|
||||||
pyexamples
|
pyexamples
|
||||||
pyPatternGenerator
|
pyPatternGenerator
|
||||||
|
pattern
|
||||||
|
|
||||||
.. toctree::
|
.. toctree::
|
||||||
:caption: Command line
|
:caption: Command line
|
||||||
|
122
docs/src/pattern.rst
Normal file
122
docs/src/pattern.rst
Normal file
@ -0,0 +1,122 @@
|
|||||||
|
Pattern
|
||||||
|
========================
|
||||||
|
|
||||||
|
This is a test and development feature implemented only for Ctb, Xilinx_Ctb and Mythen3.
|
||||||
|
|
||||||
|
A pattern is a sequence of 64-bit words which is executed using a clock on the FPGA. Each of the 64 bits is connected to a pin or internal signal of the FPGA. The purpose of a pattern is to provide a way to change these 64 signals with precise timing. Commands run by the detector server could manipulate the same signals as the pattern, but they cannot enforce a change in a specific clock cycle.
|
||||||
|
|
||||||
|
**Usage**
|
||||||
|
|
||||||
|
A pattern is written to memory on the FPGA using the patword command.
|
||||||
|
|
||||||
|
.. code-block::
|
||||||
|
|
||||||
|
patword 0x0000 0x000000000000000A
|
||||||
|
patword 0x0001 0x000000000000000B
|
||||||
|
patword 0x0002 0x000000000000000C
|
||||||
|
patword 0x0003 0x000000000000000D
|
||||||
|
patword 0x0004 0x000000000000000E
|
||||||
|
|
||||||
|
The example above writes a five-word pattern into FPGA memory. The first argument is the memory address, the second argument is the content to be written into this address. Before executing a pattern one has to set the address limits of the pattern:
|
||||||
|
|
||||||
|
.. code-block::
|
||||||
|
|
||||||
|
patlimits 0x0000 0x0004
|
||||||
|
|
||||||
|
This instructs the firmware to execute the commands from address 0 to 4 (including 0 and 4). The execution can be started from the pyctbgui or with the commands
|
||||||
|
|
||||||
|
.. code-block::
|
||||||
|
|
||||||
|
start [Ctb, Xilinx_Ctb]
|
||||||
|
patternstart [Mythen3]
|
||||||
|
|
||||||
|
The maximal number of patword addresses is 8192. However, it is possible to extend the length of the pattern sequence using loops and wait commands. Loops can be configured with the following commands:
|
||||||
|
|
||||||
|
.. code-block::
|
||||||
|
|
||||||
|
patloop 0 0x0001 0x0003
|
||||||
|
patnloop 0 7
|
||||||
|
|
||||||
|
The first argument of both commands is the ID of the loop. Ctb and Xilinx_Ctb can have 6 loops (ID 0-5), Mythen3 can have 4 loop definitions. The commands above configure the loop with ID 0 to run 7 times and jump from the patword with address 3 to the patword with address 1. Important: If patnloop is set to 1, the addresses 0x1-0x3 will execute exactly once; if it is set to 0, the pattern addresses will be skipped.
|
||||||
|
|
||||||
|
The same idea is used to introduce wait times. The example below causes the patword at address 0x0002 to be active for 9 clock cycles before the execution continues.
|
||||||
|
|
||||||
|
.. code-block::
|
||||||
|
|
||||||
|
patwait 0 0x0002
|
||||||
|
patwaittime 0 9
|
||||||
|
|
||||||
|
Waits can be placed inside a loop and loops can be nested.
|
||||||
|
|
||||||
|
**patioctrl**
|
||||||
|
|
||||||
|
The function of each bit in the sequence of 64-bit words depends on the connected detector and firmware version. Some of the 64 bits might connect directly to pads of a chip. The patioctrl command is used to configure the direction of some of these signals (not all of them !! See tables below). Signals where the corresponding bit in the argument of patioctrl is set to 1 will be driven from the FPGA.
|
||||||
|
|
||||||
|
**patsetbit and patmask**
|
||||||
|
|
||||||
|
The functions patsetbit and patmask can be used to ignore a specific bit of the pattern.
|
||||||
|
Example:
|
||||||
|
|
||||||
|
.. code-block::
|
||||||
|
|
||||||
|
patmask 0x0101
|
||||||
|
patsetbit 0x0001
|
||||||
|
|
||||||
|
Patmask configures bit 0 and 8 of the pattern to be set to their value in patsetbit. These bits will be ignored during pattern execution and will always be 0 (bit 8) and 1 (bit 0).
|
||||||
|
|
||||||
|
The mappings of bit positions in the pattern word to signals/pads of the FPGA are listed below for the three detector types where patterns are used. In the case of the two CTB's, connections of the signals to actual pads of a chip depend on the layout of the used detector adapter board. Therefore, each type of detector adapter board adds an additional mapping layer.
|
||||||
|
|
||||||
|
**CTB Pattern Bit Mapping**
|
||||||
|
|
||||||
|
.. table::
|
||||||
|
|
||||||
|
+----+---+------+----+----------+-------------------+----------------+
|
||||||
|
| 63 | 62| 61-57| 56 | 55-48 | 47-32 | 31-0 |
|
||||||
|
+----+---+------+----+----------+-------------------+----------------+
|
||||||
|
| A | D| --- | T | EXTIO | DO, stream source | DIO |
|
||||||
|
+----+---+------+----+----------+-------------------+----------------+
|
||||||
|
|
||||||
|
DIO: Driving the 32 FPGA pins corresponding to the lowest 32 bits of the patioctrl command. If bits in patioctrl are 0, the same bit positions in DIO will switch to input pins and connect to dbit sampling. Additionally, some of these 32 bits have an automatic override by detector-specific statemachines which is active whenever one of these statemachines is running (currently bits 7,8,11,14 and 20).
|
||||||
|
|
||||||
|
DO: Directly connected to 16 FPGA pins. Output only. Not influenced by patioctrl. Also connected to bit 47-32 in all Ctb dbit samples. All of them can be used as dbit sample trigger. In addition, every bit of DO can be selected as trigger for sending out a udp packet with samples to the receiver.
|
||||||
|
|
||||||
|
EXTIO: Similar to DIO, but not used as input to the fpga. With the corresponding patioctrl bits set to 0 these pins will switch to a high impedance mode and be ignored by the firmware.
|
||||||
|
|
||||||
|
T: trigger output
|
||||||
|
|
||||||
|
D: enable signal for digital sampling
|
||||||
|
|
||||||
|
A: adc enable
|
||||||
|
|
||||||
|
**Xilinx_CTB Pattern Bit Mapping**
|
||||||
|
|
||||||
|
.. table::
|
||||||
|
|
||||||
|
+-------+----------------+
|
||||||
|
| 63-32 | 31-0 |
|
||||||
|
+-------+----------------+
|
||||||
|
| --- | DIO |
|
||||||
|
+-------+----------------+
|
||||||
|
|
||||||
|
DIO: Driving the 32 FPGA pins corresponding to the lowest 32 bits of the patioctrl command. If bits in patioctrl are 0, the same bit positions in DIO will switch to input pins and connect to dbit sampling. Additionally, some of these 32 bits have an automatic override by detector-specific statemachines which is active whenever these sm's are running (currently bits 7,8,11,14 and 20).
|
||||||
|
|
||||||
|
|
||||||
|
**Mythen3 Pattern Bit Mapping**
|
||||||
|
|
||||||
|
.. table::
|
||||||
|
|
||||||
|
+-------+--------+-------+--------+------------+----------+----------+-----+-----+
|
||||||
|
| 63-33 | 32 | 31-25 | 24 | 23 | 22 | 21 | 20 | 19 |
|
||||||
|
+-------+--------+-------+--------+------------+----------+----------+-----+-----+
|
||||||
|
| --- | signARD| --- | CHSclk | cnt_rst | sto_rst | STATLOAD | STO | SIN |
|
||||||
|
+-------+--------+-------+--------+------------+----------+----------+-----+-----+
|
||||||
|
|
||||||
|
.. table::
|
||||||
|
|
||||||
|
+---------+-----+-------+-------+----+-------+---------+--------+
|
||||||
|
| 18 | 17 | 16-14 | 13 | 12 | 11 | 10 | 9-0 |
|
||||||
|
+---------+-----+-------+-------+----+-------+---------+--------+
|
||||||
|
| SR_MODE | clk | EN | PULSE | RD | CHSIN | ANAMode | TBLOAD |
|
||||||
|
+---------+-----+-------+-------+----+-------+---------+--------+
|
||||||
|
|
||||||
|
For Mythen3 the pattern word only connects to output pins of the FPGA when the pattern is running. Afterwards the signals will switch back to other logic in the FPGA. Both CTB's hold the last executed pattern word until a new pattern is started.
|
18
libs/libzmq/libzmq_cmake_version.patch
Normal file
18
libs/libzmq/libzmq_cmake_version.patch
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
diff --git a/CMakeLists.txt b/CMakeLists.txt
|
||||||
|
index dd3d8eb9..c0187747 100644
|
||||||
|
--- a/CMakeLists.txt
|
||||||
|
+++ b/CMakeLists.txt
|
||||||
|
@@ -1,11 +1,8 @@
|
||||||
|
# CMake build script for ZeroMQ
|
||||||
|
project(ZeroMQ)
|
||||||
|
|
||||||
|
-if(${CMAKE_SYSTEM_NAME} STREQUAL Darwin)
|
||||||
|
- cmake_minimum_required(VERSION 3.0.2)
|
||||||
|
-else()
|
||||||
|
- cmake_minimum_required(VERSION 2.8.12)
|
||||||
|
-endif()
|
||||||
|
+cmake_minimum_required(VERSION 3.15)
|
||||||
|
+message(STATUS "Patched cmake version")
|
||||||
|
|
||||||
|
include(CheckIncludeFiles)
|
||||||
|
include(CheckCCompilerFlag)
|
@ -12,5 +12,6 @@ slsDetectorPackage/8.0.1_rh8 stable cmake/3.15.5 Qt/5.12.10
|
|||||||
slsDetectorPackage/8.0.2_rh7 stable cmake/3.15.5 Qt/5.12.10
|
slsDetectorPackage/8.0.2_rh7 stable cmake/3.15.5 Qt/5.12.10
|
||||||
slsDetectorPackage/8.0.2_rh8 stable cmake/3.15.5 Qt/5.12.10
|
slsDetectorPackage/8.0.2_rh8 stable cmake/3.15.5 Qt/5.12.10
|
||||||
slsDetectorPackage/9.0.0_rh8 stable cmake/3.15.5 Qt/5.12.10
|
slsDetectorPackage/9.0.0_rh8 stable cmake/3.15.5 Qt/5.12.10
|
||||||
|
slsDetectorPackage/9.1.0_rh8 stable cmake/3.15.5 Qt/5.12.10
|
||||||
|
|
||||||
|
|
||||||
|
27
pyproject.toml
Normal file
27
pyproject.toml
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
[build-system]
|
||||||
|
requires = ["scikit-build-core>=0.10", "pybind11", "numpy"]
|
||||||
|
build-backend = "scikit_build_core.build"
|
||||||
|
|
||||||
|
[project]
|
||||||
|
name = "slsdet"
|
||||||
|
version = "2025.3.19"
|
||||||
|
|
||||||
|
|
||||||
|
[tool.cibuildwheel]
|
||||||
|
before-all = "uname -a"
|
||||||
|
|
||||||
|
[tool.scikit-build]
|
||||||
|
build.verbose = true
|
||||||
|
cmake.build-type = "Release"
|
||||||
|
install.components = ["python"]
|
||||||
|
|
||||||
|
|
||||||
|
[tool.scikit-build.cmake.define]
|
||||||
|
#Only build the control software and python ext
|
||||||
|
SLS_USE_RECEIVER = "OFF"
|
||||||
|
SLS_USE_RECEIVER_BINARIES = "OFF"
|
||||||
|
SLS_USE_TEXTCLIENT = "OFF"
|
||||||
|
SLS_BUILD_SHARED_LIBRARIES = "OFF"
|
||||||
|
|
||||||
|
SLS_USE_PYTHON = "ON"
|
||||||
|
SLS_INSTALL_PYTHONEXT = "ON"
|
@ -20,7 +20,7 @@ target_link_libraries(_slsdet PUBLIC
|
|||||||
|
|
||||||
|
|
||||||
set_target_properties(_slsdet PROPERTIES
|
set_target_properties(_slsdet PROPERTIES
|
||||||
LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin
|
LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin/slsdet
|
||||||
)
|
)
|
||||||
|
|
||||||
#Copy Python code
|
#Copy Python code
|
||||||
@ -72,9 +72,18 @@ configure_file( ${CMAKE_CURRENT_SOURCE_DIR}/../VERSION
|
|||||||
if(SLS_INSTALL_PYTHONEXT)
|
if(SLS_INSTALL_PYTHONEXT)
|
||||||
install(TARGETS _slsdet
|
install(TARGETS _slsdet
|
||||||
EXPORT "${TARGETS_EXPORT_NAME}"
|
EXPORT "${TARGETS_EXPORT_NAME}"
|
||||||
LIBRARY DESTINATION ${CMAKE_INSTALL_PREFIX}/python
|
LIBRARY DESTINATION slsdet
|
||||||
|
COMPONENT python
|
||||||
)
|
)
|
||||||
|
install(
|
||||||
|
FILES ${PYTHON_FILES}
|
||||||
|
DESTINATION slsdet
|
||||||
|
COMPONENT python
|
||||||
|
)
|
||||||
|
install(
|
||||||
|
FILES ../VERSION
|
||||||
|
DESTINATION slsdet
|
||||||
|
COMPONENT python
|
||||||
|
)
|
||||||
|
|
||||||
install(FILES ${PYTHON_FILES} DESTINATION ${CMAKE_INSTALL_PREFIX}/python/slsdet)
|
|
||||||
install(FILES ../VERSION DESTINATION ${CMAKE_INSTALL_PREFIX}/python/slsdet)
|
|
||||||
endif()
|
endif()
|
@ -1,77 +0,0 @@
|
|||||||
# SPDX-License-Identifier: LGPL-3.0-or-other
|
|
||||||
# Copyright (C) 2021 Contributors to the SLS Detector Package
|
|
||||||
"""
|
|
||||||
Setup file for slsdet
|
|
||||||
Build upon the pybind11 example found here: https://github.com/pybind/python_example
|
|
||||||
"""
|
|
||||||
|
|
||||||
import os
|
|
||||||
import sys
|
|
||||||
from setuptools import setup, find_packages
|
|
||||||
from pybind11.setup_helpers import Pybind11Extension, build_ext
|
|
||||||
|
|
||||||
def read_version():
|
|
||||||
try:
|
|
||||||
version_file = os.path.join(os.path.dirname(__file__), 'slsdet', 'VERSION')
|
|
||||||
with open(version_file, "r") as f:
|
|
||||||
return f.read().strip()
|
|
||||||
except:
|
|
||||||
raise RuntimeError("VERSION file not found in slsdet package from setup.py.")
|
|
||||||
|
|
||||||
__version__ = read_version()
|
|
||||||
|
|
||||||
|
|
||||||
def get_conda_path():
|
|
||||||
"""
|
|
||||||
Keep this a function if we need some fancier logic later
|
|
||||||
"""
|
|
||||||
print('Prefix: ', os.environ['CONDA_PREFIX'])
|
|
||||||
return os.environ['CONDA_PREFIX']
|
|
||||||
|
|
||||||
|
|
||||||
#TODO migrate to CMake build or fetch files from cmake?
|
|
||||||
ext_modules = [
|
|
||||||
Pybind11Extension(
|
|
||||||
'_slsdet',
|
|
||||||
['src/main.cpp',
|
|
||||||
'src/enums.cpp',
|
|
||||||
'src/current.cpp',
|
|
||||||
'src/detector.cpp',
|
|
||||||
'src/network.cpp',
|
|
||||||
'src/pattern.cpp',
|
|
||||||
'src/scan.cpp',
|
|
||||||
'src/duration.cpp',
|
|
||||||
'src/DurationWrapper.cpp',
|
|
||||||
'src/pedestal.cpp',
|
|
||||||
]
|
|
||||||
|
|
||||||
|
|
||||||
,
|
|
||||||
include_dirs=[
|
|
||||||
os.path.join(get_conda_path(), 'include'),
|
|
||||||
|
|
||||||
],
|
|
||||||
libraries=['SlsDetector', 'SlsSupport', 'SlsReceiver'],
|
|
||||||
library_dirs=[
|
|
||||||
os.path.join(get_conda_path(), 'lib'),
|
|
||||||
],
|
|
||||||
language='c++'
|
|
||||||
),
|
|
||||||
]
|
|
||||||
|
|
||||||
setup(
|
|
||||||
name='slsdet',
|
|
||||||
version=__version__,
|
|
||||||
author='Erik Frojdh',
|
|
||||||
author_email='erik.frojdh@psi.ch',
|
|
||||||
url='https://github.com/slsdetectorgroup/slsDetectorPackage',
|
|
||||||
description='Detector API for SLS Detector Group detectors',
|
|
||||||
long_description='',
|
|
||||||
packages=find_packages(exclude=['contrib', 'docs', 'tests']),
|
|
||||||
package_data={
|
|
||||||
'slsdet': ['VERSION'],
|
|
||||||
},
|
|
||||||
ext_modules=ext_modules,
|
|
||||||
cmdclass={"build_ext": build_ext},
|
|
||||||
zip_safe=False,
|
|
||||||
)
|
|
@ -14,7 +14,7 @@ from .pattern import Pattern, patternParameters
|
|||||||
from .gaincaps import Mythen3GainCapsWrapper
|
from .gaincaps import Mythen3GainCapsWrapper
|
||||||
from .PatternGenerator import PatternGenerator
|
from .PatternGenerator import PatternGenerator
|
||||||
|
|
||||||
import _slsdet
|
from . import _slsdet
|
||||||
xy = _slsdet.xy
|
xy = _slsdet.xy
|
||||||
defs = _slsdet.slsDetectorDefs
|
defs = _slsdet.slsDetectorDefs
|
||||||
|
|
||||||
@ -41,3 +41,6 @@ def read_version():
|
|||||||
|
|
||||||
__version__ = read_version()
|
__version__ = read_version()
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -4,7 +4,7 @@ from .detector import Detector, freeze
|
|||||||
from .utils import element_if_equal
|
from .utils import element_if_equal
|
||||||
from .dacs import DetectorDacs, NamedDacs
|
from .dacs import DetectorDacs, NamedDacs
|
||||||
from .powers import DetectorPowers, NamedPowers
|
from .powers import DetectorPowers, NamedPowers
|
||||||
import _slsdet
|
from . import _slsdet
|
||||||
dacIndex = _slsdet.slsDetectorDefs.dacIndex
|
dacIndex = _slsdet.slsDetectorDefs.dacIndex
|
||||||
from .detector_property import DetectorProperty
|
from .detector_property import DetectorProperty
|
||||||
|
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
from .detector_property import DetectorProperty
|
from .detector_property import DetectorProperty
|
||||||
from functools import partial
|
from functools import partial
|
||||||
import numpy as np
|
import numpy as np
|
||||||
import _slsdet
|
from . import _slsdet
|
||||||
from .detector import freeze
|
from .detector import freeze
|
||||||
dacIndex = _slsdet.slsDetectorDefs.dacIndex
|
dacIndex = _slsdet.slsDetectorDefs.dacIndex
|
||||||
class Dac(DetectorProperty):
|
class Dac(DetectorProperty):
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
# SPDX-License-Identifier: LGPL-3.0-or-other
|
# SPDX-License-Identifier: LGPL-3.0-or-other
|
||||||
# Copyright (C) 2021 Contributors to the SLS Detector Package
|
# Copyright (C) 2021 Contributors to the SLS Detector Package
|
||||||
from _slsdet import CppDetectorApi
|
from ._slsdet import CppDetectorApi
|
||||||
from _slsdet import slsDetectorDefs
|
from ._slsdet import slsDetectorDefs
|
||||||
from _slsdet import IpAddr, MacAddr
|
from ._slsdet import IpAddr, MacAddr
|
||||||
|
|
||||||
runStatus = slsDetectorDefs.runStatus
|
runStatus = slsDetectorDefs.runStatus
|
||||||
timingMode = slsDetectorDefs.timingMode
|
timingMode = slsDetectorDefs.timingMode
|
||||||
@ -15,7 +15,7 @@ defs = slsDetectorDefs
|
|||||||
|
|
||||||
from .utils import element_if_equal, all_equal, get_set_bits, list_to_bitmask
|
from .utils import element_if_equal, all_equal, get_set_bits, list_to_bitmask
|
||||||
from .utils import Geometry, to_geo, element, reduce_time, is_iterable, hostname_list
|
from .utils import Geometry, to_geo, element, reduce_time, is_iterable, hostname_list
|
||||||
from _slsdet import xy
|
from ._slsdet import xy
|
||||||
from .gaincaps import Mythen3GainCapsWrapper
|
from .gaincaps import Mythen3GainCapsWrapper
|
||||||
from . import utils as ut
|
from . import utils as ut
|
||||||
from .proxy import JsonProxy, SlowAdcProxy, ClkDivProxy, MaxPhaseProxy, ClkFreqProxy, PatLoopProxy, PatNLoopProxy, PatWaitProxy, PatWaitTimeProxy
|
from .proxy import JsonProxy, SlowAdcProxy, ClkDivProxy, MaxPhaseProxy, ClkFreqProxy, PatLoopProxy, PatNLoopProxy, PatWaitProxy, PatWaitTimeProxy
|
||||||
|
@ -11,7 +11,7 @@ Created on Wed Dec 6 11:51:18 2017
|
|||||||
from .detector import Detector
|
from .detector import Detector
|
||||||
from .temperature import Temperature, DetectorTemperature
|
from .temperature import Temperature, DetectorTemperature
|
||||||
from .dacs import DetectorDacs
|
from .dacs import DetectorDacs
|
||||||
import _slsdet
|
from . import _slsdet
|
||||||
dacIndex = _slsdet.slsDetectorDefs.dacIndex
|
dacIndex = _slsdet.slsDetectorDefs.dacIndex
|
||||||
from .detector_property import DetectorProperty
|
from .detector_property import DetectorProperty
|
||||||
|
|
||||||
|
@ -15,8 +15,8 @@ if dt === detectorType.EIGER:
|
|||||||
"""
|
"""
|
||||||
|
|
||||||
|
|
||||||
import _slsdet
|
from . import _slsdet
|
||||||
for name, cls in _slsdet.slsDetectorDefs.__dict__.items():
|
for name, cls in _slsdet.slsDetectorDefs.__dict__.items():
|
||||||
if isinstance(cls, type):
|
if isinstance(cls, type):
|
||||||
exec(f'{name} = {cls.__module__}.{cls.__qualname__}')
|
exec(f'{name} = _slsdet.{cls.__qualname__}')
|
||||||
|
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
|
|
||||||
|
|
||||||
import _slsdet
|
from . import _slsdet
|
||||||
gc = _slsdet.slsDetectorDefs.M3_GainCaps
|
gc = _slsdet.slsDetectorDefs.M3_GainCaps
|
||||||
|
|
||||||
|
|
||||||
|
@ -11,7 +11,7 @@ from .detector import Detector, freeze
|
|||||||
|
|
||||||
# from .adcs import Adc, DetectorAdcs
|
# from .adcs import Adc, DetectorAdcs
|
||||||
from .dacs import DetectorDacs
|
from .dacs import DetectorDacs
|
||||||
import _slsdet
|
from . import _slsdet
|
||||||
dacIndex = _slsdet.slsDetectorDefs.dacIndex
|
dacIndex = _slsdet.slsDetectorDefs.dacIndex
|
||||||
from .detector_property import DetectorProperty
|
from .detector_property import DetectorProperty
|
||||||
|
|
||||||
|
@ -11,7 +11,7 @@ from .detector import Detector, freeze
|
|||||||
|
|
||||||
# from .adcs import Adc, DetectorAdcs
|
# from .adcs import Adc, DetectorAdcs
|
||||||
from .dacs import DetectorDacs
|
from .dacs import DetectorDacs
|
||||||
import _slsdet
|
from . import _slsdet
|
||||||
dacIndex = _slsdet.slsDetectorDefs.dacIndex
|
dacIndex = _slsdet.slsDetectorDefs.dacIndex
|
||||||
from .detector_property import DetectorProperty
|
from .detector_property import DetectorProperty
|
||||||
|
|
||||||
|
@ -9,7 +9,7 @@ This file contains the specialization for the Moench detector
|
|||||||
|
|
||||||
from .detector import Detector, freeze
|
from .detector import Detector, freeze
|
||||||
from .dacs import DetectorDacs
|
from .dacs import DetectorDacs
|
||||||
import _slsdet
|
from . import _slsdet
|
||||||
dacIndex = _slsdet.slsDetectorDefs.dacIndex
|
dacIndex = _slsdet.slsDetectorDefs.dacIndex
|
||||||
from .detector_property import DetectorProperty
|
from .detector_property import DetectorProperty
|
||||||
|
|
||||||
|
@ -11,7 +11,7 @@ from .detector import Detector, freeze
|
|||||||
|
|
||||||
# from .adcs import Adc, DetectorAdcs
|
# from .adcs import Adc, DetectorAdcs
|
||||||
from .dacs import DetectorDacs
|
from .dacs import DetectorDacs
|
||||||
import _slsdet
|
from . import _slsdet
|
||||||
dacIndex = _slsdet.slsDetectorDefs.dacIndex
|
dacIndex = _slsdet.slsDetectorDefs.dacIndex
|
||||||
gc_enums = _slsdet.slsDetectorDefs.M3_GainCaps
|
gc_enums = _slsdet.slsDetectorDefs.M3_GainCaps
|
||||||
from .detector_property import DetectorProperty
|
from .detector_property import DetectorProperty
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
# SPDX-License-Identifier: LGPL-3.0-or-other
|
# SPDX-License-Identifier: LGPL-3.0-or-other
|
||||||
# Copyright (C) 2021 Contributors to the SLS Detector Package
|
# Copyright (C) 2021 Contributors to the SLS Detector Package
|
||||||
import _slsdet
|
from . import _slsdet
|
||||||
|
|
||||||
from _slsdet import Pattern
|
from ._slsdet import Pattern
|
||||||
|
|
||||||
|
|
||||||
class patternParameters(_slsdet.patternParameters):
|
class patternParameters(_slsdet.patternParameters):
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
from .detector_property import DetectorProperty
|
from .detector_property import DetectorProperty
|
||||||
from functools import partial
|
from functools import partial
|
||||||
import numpy as np
|
import numpy as np
|
||||||
import _slsdet
|
from . import _slsdet
|
||||||
from .detector import freeze
|
from .detector import freeze
|
||||||
dacIndex = _slsdet.slsDetectorDefs.dacIndex
|
dacIndex = _slsdet.slsDetectorDefs.dacIndex
|
||||||
class Power(DetectorProperty):
|
class Power(DetectorProperty):
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
from .utils import element_if_equal
|
from .utils import element_if_equal
|
||||||
from .enums import dacIndex
|
from .enums import dacIndex
|
||||||
from .defines import M3_MAX_PATTERN_LEVELS, MAX_PATTERN_LEVELS
|
from .defines import M3_MAX_PATTERN_LEVELS, MAX_PATTERN_LEVELS
|
||||||
from _slsdet import slsDetectorDefs
|
from ._slsdet import slsDetectorDefs
|
||||||
detectorType = slsDetectorDefs.detectorType
|
detectorType = slsDetectorDefs.detectorType
|
||||||
|
|
||||||
|
|
||||||
|
@ -6,7 +6,7 @@ but not directly used in controlling the detector
|
|||||||
"""
|
"""
|
||||||
|
|
||||||
from collections import namedtuple
|
from collections import namedtuple
|
||||||
import _slsdet #C++ lib
|
from . import _slsdet #C++ lib
|
||||||
import functools
|
import functools
|
||||||
import datetime as dt
|
import datetime as dt
|
||||||
import pathlib
|
import pathlib
|
||||||
|
@ -1,3 +1,4 @@
|
|||||||
|
#include <chrono>
|
||||||
#include "py_headers.h"
|
#include "py_headers.h"
|
||||||
|
|
||||||
#include "DurationWrapper.h"
|
#include "DurationWrapper.h"
|
||||||
@ -19,4 +20,25 @@ void init_duration(py::module &m) {
|
|||||||
<< " count: " << self.count() << ")";
|
<< " count: " << self.count() << ")";
|
||||||
return ss.str();
|
return ss.str();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
m.def(
|
||||||
|
"test_return_DurationWrapper",
|
||||||
|
[]() {
|
||||||
|
DurationWrapper t(1.3);
|
||||||
|
return t;
|
||||||
|
},
|
||||||
|
R"(
|
||||||
|
Test function to return a DurationWrapper object. Ensures that the automatic conversion in typecaster.h works.
|
||||||
|
)");
|
||||||
|
|
||||||
|
m.def(
|
||||||
|
"test_duration_to_ns",
|
||||||
|
[](const std::chrono::nanoseconds t) {
|
||||||
|
//Duration wrapper is used to be able to convert from time in python to chrono::nanoseconds
|
||||||
|
//return count to have something to test
|
||||||
|
return t.count();
|
||||||
|
},
|
||||||
|
R"(
|
||||||
|
Test function convert DurationWrapper or number to chrono::ns. Ensures that the automatic conversion in typecaster.h works.
|
||||||
|
)"); // default value to test the default constructor
|
||||||
}
|
}
|
||||||
|
@ -54,11 +54,16 @@ template <> struct type_caster<std::chrono::nanoseconds> {
|
|||||||
value = duration_cast<nanoseconds>(duration<double>(PyFloat_AsDouble(src.ptr())));
|
value = duration_cast<nanoseconds>(duration<double>(PyFloat_AsDouble(src.ptr())));
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
// If invoked with an int we assume it is nanoseconds and convert, same as in chrono.h
|
||||||
|
if (PyLong_Check(src.ptr())) {
|
||||||
|
value = duration_cast<nanoseconds>(duration<int64_t>(PyLong_AsLongLong(src.ptr())));
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// Lastly if we were actually called with a DurationWrapper object we get
|
// Lastly if we were actually called with a DurationWrapper object we get
|
||||||
// the number of nanoseconds and create a std::chrono::nanoseconds from it
|
// the number of nanoseconds and create a std::chrono::nanoseconds from it
|
||||||
py::object py_cls = py::module::import("_slsdet").attr("DurationWrapper");
|
py::object py_cls = py::module::import("slsdet._slsdet").attr("DurationWrapper");
|
||||||
if (py::isinstance(src, py_cls)){
|
if (py::isinstance(src, py_cls)){
|
||||||
sls::DurationWrapper *cls = src.cast<sls::DurationWrapper *>();
|
sls::DurationWrapper *cls = src.cast<sls::DurationWrapper *>();
|
||||||
value = nanoseconds(cls->count());
|
value = nanoseconds(cls->count());
|
||||||
@ -77,7 +82,7 @@ template <> struct type_caster<std::chrono::nanoseconds> {
|
|||||||
* set the count from chrono::nanoseconds and return
|
* set the count from chrono::nanoseconds and return
|
||||||
*/
|
*/
|
||||||
static handle cast(std::chrono::nanoseconds src, return_value_policy /* policy */, handle /* parent */) {
|
static handle cast(std::chrono::nanoseconds src, return_value_policy /* policy */, handle /* parent */) {
|
||||||
py::object py_cls = py::module::import("_slsdet").attr("DurationWrapper");
|
py::object py_cls = py::module::import("slsdet._slsdet").attr("DurationWrapper");
|
||||||
py::object* obj = new py::object;
|
py::object* obj = new py::object;
|
||||||
*obj = py_cls();
|
*obj = py_cls();
|
||||||
sls::DurationWrapper *dur = obj->cast<sls::DurationWrapper *>();
|
sls::DurationWrapper *dur = obj->cast<sls::DurationWrapper *>();
|
||||||
|
58
python/tests/test_DurationWrapper.py
Normal file
58
python/tests/test_DurationWrapper.py
Normal file
@ -0,0 +1,58 @@
|
|||||||
|
import pytest
|
||||||
|
|
||||||
|
from slsdet import DurationWrapper
|
||||||
|
|
||||||
|
#import the compiled extension to use test functions for the automatic conversion
|
||||||
|
from slsdet import _slsdet
|
||||||
|
|
||||||
|
|
||||||
|
def test_default_construction_of_DurationWrapper():
|
||||||
|
"""Test default construction of DurationWrapper"""
|
||||||
|
t = DurationWrapper()
|
||||||
|
assert t.count() == 0
|
||||||
|
assert t.total_seconds() == 0
|
||||||
|
|
||||||
|
def test_construction_of_DurationWrapper():
|
||||||
|
"""Test construction of DurationWrapper with total_seconds"""
|
||||||
|
t = DurationWrapper(5)
|
||||||
|
assert t.count() == 5e9
|
||||||
|
assert t.total_seconds() == 5
|
||||||
|
|
||||||
|
def test_set_count_on_DurationWrapper():
|
||||||
|
"""Test set_count on DurationWrapper"""
|
||||||
|
t = DurationWrapper()
|
||||||
|
t.set_count(10)
|
||||||
|
assert t.count() == 10
|
||||||
|
assert t.total_seconds() == 10e-9
|
||||||
|
t.set_count(0)
|
||||||
|
assert t.count() == 0
|
||||||
|
assert t.total_seconds() == 0
|
||||||
|
|
||||||
|
|
||||||
|
def test_return_a_DurationWrapper_from_cpp():
|
||||||
|
"""Test returning a DurationWrapper from C++"""
|
||||||
|
t = _slsdet.test_return_DurationWrapper()
|
||||||
|
assert t.count() == 1.3e9
|
||||||
|
assert t.total_seconds() == 1.3
|
||||||
|
|
||||||
|
def test_call_a_cpp_function_with_a_duration_wrapper():
|
||||||
|
"""C++ functions can accept a DurationWrapper"""
|
||||||
|
t = DurationWrapper(5)
|
||||||
|
assert _slsdet.test_duration_to_ns(t) == 5e9
|
||||||
|
|
||||||
|
def test_call_a_cpp_function_converting_number_to_DurationWrapper():
|
||||||
|
"""int and float can be converted to std::chrono::nanoseconds"""
|
||||||
|
assert _slsdet.test_duration_to_ns(0) == 0
|
||||||
|
assert _slsdet.test_duration_to_ns(3) == 3e9
|
||||||
|
assert _slsdet.test_duration_to_ns(1.3) == 1.3e9
|
||||||
|
assert _slsdet.test_duration_to_ns(10e-9) == 10
|
||||||
|
|
||||||
|
def test_call_a_cpp_function_with_datetime_timedelta():
|
||||||
|
"""datetime.timedelta can be converted to std::chrono::nanoseconds"""
|
||||||
|
import datetime
|
||||||
|
t = datetime.timedelta(seconds=5)
|
||||||
|
assert _slsdet.test_duration_to_ns(t) == 5e9
|
||||||
|
t = datetime.timedelta(seconds=0)
|
||||||
|
assert _slsdet.test_duration_to_ns(t) == 0
|
||||||
|
t = datetime.timedelta(seconds=1.3)
|
||||||
|
assert _slsdet.test_duration_to_ns(t) == 1.3e9
|
@ -23,7 +23,7 @@ typedef struct __attribute__((packed)) {
|
|||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
class Pattern {
|
class Pattern {
|
||||||
patternParameters *pat = new patternParameters{};
|
patternParameters *pat = new patternParameters{};
|
||||||
std::ostream& stream(std::ostream &os) const;
|
std::ostream &stream(std::ostream &os) const;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
Pattern();
|
Pattern();
|
||||||
|
@ -243,10 +243,10 @@ size_t Pattern::load(const std::string &fname) {
|
|||||||
return numPatWords;
|
return numPatWords;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::ostream& Pattern::stream(std::ostream &os) const{
|
std::ostream &Pattern::stream(std::ostream &os) const {
|
||||||
for (uint32_t i = pat->limits[0]; i <= pat->limits[1]; ++i) {
|
for (uint32_t i = pat->limits[0]; i <= pat->limits[1]; ++i) {
|
||||||
os << "patword " << ToStringHex(i, 4) << " "
|
os << "patword " << ToStringHex(i, 4) << " "
|
||||||
<< ToStringHex(pat->word[i], 16) << std::endl;
|
<< ToStringHex(pat->word[i], 16) << std::endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
// patioctrl
|
// patioctrl
|
||||||
@ -254,13 +254,12 @@ std::ostream& Pattern::stream(std::ostream &os) const{
|
|||||||
|
|
||||||
// patlimits
|
// patlimits
|
||||||
os << "patlimits " << ToStringHex(pat->limits[0], 4) << " "
|
os << "patlimits " << ToStringHex(pat->limits[0], 4) << " "
|
||||||
<< ToStringHex(pat->limits[1], 4) << std::endl;
|
<< ToStringHex(pat->limits[1], 4) << std::endl;
|
||||||
|
|
||||||
for (size_t i = 0; i < MAX_PATTERN_LEVELS; ++i) {
|
for (size_t i = 0; i < MAX_PATTERN_LEVELS; ++i) {
|
||||||
// patloop
|
// patloop
|
||||||
os << "patloop " << i << " "
|
os << "patloop " << i << " " << ToStringHex(pat->startloop[i], 4) << " "
|
||||||
<< ToStringHex(pat->startloop[i], 4) << " "
|
<< ToStringHex(pat->stoploop[i], 4) << std::endl;
|
||||||
<< ToStringHex(pat->stoploop[i], 4) << std::endl;
|
|
||||||
// patnloop
|
// patnloop
|
||||||
os << "patnloop " << i << " " << pat->nloop[i] << std::endl;
|
os << "patnloop " << i << " " << pat->nloop[i] << std::endl;
|
||||||
}
|
}
|
||||||
@ -268,10 +267,10 @@ std::ostream& Pattern::stream(std::ostream &os) const{
|
|||||||
for (size_t i = 0; i < MAX_PATTERN_LEVELS; ++i) {
|
for (size_t i = 0; i < MAX_PATTERN_LEVELS; ++i) {
|
||||||
// patwait
|
// patwait
|
||||||
os << "patwait " << i << " " << ToStringHex(pat->wait[i], 4)
|
os << "patwait " << i << " " << ToStringHex(pat->wait[i], 4)
|
||||||
<< std::endl;
|
<< std::endl;
|
||||||
// patwaittime
|
// patwaittime
|
||||||
os << "patwaittime " << i << " " << pat->waittime[i];
|
os << "patwaittime " << i << " " << pat->waittime[i];
|
||||||
if (i<MAX_PATTERN_LEVELS-1)
|
if (i < MAX_PATTERN_LEVELS - 1)
|
||||||
os << std::endl;
|
os << std::endl;
|
||||||
}
|
}
|
||||||
return os;
|
return os;
|
||||||
|
@ -9,4 +9,4 @@
|
|||||||
#define APIMOENCH "developer 0x250310"
|
#define APIMOENCH "developer 0x250310"
|
||||||
#define APIEIGER "developer 0x250310"
|
#define APIEIGER "developer 0x250310"
|
||||||
#define APIXILINXCTB "developer 0x250311"
|
#define APIXILINXCTB "developer 0x250311"
|
||||||
#define APIJUNGFRAU "developer 0x250318"
|
#define APIJUNGFRAU "developer 0x250318"
|
||||||
|
Loading…
x
Reference in New Issue
Block a user