mirror of
https://github.com/slsdetectorgroup/slsDetectorPackage.git
synced 2025-06-13 05:17:13 +02:00
Compare commits
2 Commits
Author | SHA1 | Date | |
---|---|---|---|
4a6693de3f | |||
a891db8d06 |
10
.clang-tidy
10
.clang-tidy
@ -1,24 +1,16 @@
|
||||
---
|
||||
Checks: '*,
|
||||
-altera-*,
|
||||
-android-cloexec-fopen,
|
||||
-cppcoreguidelines-pro-bounds-array-to-pointer-decay,
|
||||
-cppcoreguidelines-pro-bounds-pointer-arithmetic,
|
||||
-fuchsia*,
|
||||
-readability-else-after-return,
|
||||
-readability-avoid-const-params-in-decls,
|
||||
-readability-identifier-length,
|
||||
-cppcoreguidelines-pro-bounds-constant-array-index,
|
||||
-cppcoreguidelines-pro-type-reinterpret-cast,
|
||||
-llvm-header-guard,
|
||||
-modernize-use-nodiscard,
|
||||
-misc-non-private-member-variables-in-classes,
|
||||
-readability-static-accessed-through-instance,
|
||||
-readability-braces-around-statements,
|
||||
-readability-isolate-declaration,
|
||||
-readability-implicit-bool-conversion,
|
||||
-readability-identifier-length,
|
||||
-readability-identifier-naming,
|
||||
-hicpp-signed-bitwise,
|
||||
-hicpp-no-array-decay,
|
||||
-hicpp-braces-around-statements,
|
||||
@ -26,6 +18,8 @@ Checks: '*,
|
||||
-google-readability-todo,
|
||||
-google-readability-braces-around-statements,
|
||||
-modernize-use-trailing-return-type,
|
||||
-readability-isolate-declaration,
|
||||
-readability-implicit-bool-conversion,
|
||||
-llvmlibc-*'
|
||||
|
||||
HeaderFilterRegex: \.h
|
||||
|
38
.github/workflows/cmake.yml
vendored
38
.github/workflows/cmake.yml
vendored
@ -1,38 +0,0 @@
|
||||
name: CMake
|
||||
|
||||
on: [push, pull_request]
|
||||
|
||||
env:
|
||||
# Customize the CMake build type here (Release, Debug, RelWithDebInfo, etc.)
|
||||
BUILD_TYPE: Debug
|
||||
|
||||
jobs:
|
||||
build:
|
||||
# The CMake configure and build commands are platform agnostic and should work equally well on Windows or Mac.
|
||||
# You can convert this to a matrix build if you need cross-platform coverage.
|
||||
# See: https://docs.github.com/en/free-pro-team@latest/actions/learn-github-actions/managing-complex-workflows#using-a-build-matrix
|
||||
runs-on: ubuntu-latest
|
||||
name: Configure and build using cmake
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- uses: awalsh128/cache-apt-pkgs-action@latest
|
||||
with:
|
||||
packages: libzmq3-dev libhdf5-dev qtbase5-dev qt5-qmake libqt5svg5-dev
|
||||
version: 1.0
|
||||
|
||||
- name: Configure CMake
|
||||
# Configure CMake in a 'build' subdirectory. `CMAKE_BUILD_TYPE` is only required if you are using a single-configuration generator such as make.
|
||||
# See https://cmake.org/cmake/help/latest/variable/CMAKE_BUILD_TYPE.html?highlight=cmake_build_type
|
||||
run: cmake -B ${{github.workspace}}/build -DCMAKE_BUILD_TYPE=${{env.BUILD_TYPE}} -DSLS_USE_TESTS=ON -DSLS_USE_HDF5=ON -DSLS_USE_GUI=ON -DSLS_USE_MOENCH=ON -DSLS_USE_PYTHON=ON
|
||||
|
||||
- name: Build
|
||||
# Build your program with the given configuration
|
||||
run: cmake --build ${{github.workspace}}/build -j2 --config ${{env.BUILD_TYPE}}
|
||||
|
||||
- name: Test
|
||||
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
|
||||
|
||||
|
2
.gitignore
vendored
2
.gitignore
vendored
@ -9,7 +9,7 @@ bin/
|
||||
*.o
|
||||
*.so
|
||||
.*
|
||||
build/
|
||||
build
|
||||
RELEASE.txt
|
||||
Testing/
|
||||
|
||||
|
3
.gitmodules
vendored
3
.gitmodules
vendored
@ -0,0 +1,3 @@
|
||||
[submodule "python/pybind11"]
|
||||
path = libs/pybind11
|
||||
url = https://github.com/pybind/pybind11.git
|
||||
|
@ -1,62 +1,15 @@
|
||||
# SPDX-License-Identifier: LGPL-3.0-or-other
|
||||
# Copyright (C) 2021 Contributors to the SLS Detector Package
|
||||
cmake_minimum_required(VERSION 3.14)
|
||||
cmake_minimum_required(VERSION 3.12)
|
||||
project(slsDetectorPackage)
|
||||
set(PROJECT_VERSION 8.0.2)
|
||||
set(PROJECT_VERSION 6.1.1)
|
||||
|
||||
set(CMAKE_CXX_FLAGS_RELEASE "-O3 -DNDEBUG")
|
||||
|
||||
cmake_policy(SET CMP0074 NEW)
|
||||
|
||||
if (${CMAKE_VERSION} VERSION_GREATER "3.24")
|
||||
cmake_policy(SET CMP0135 NEW) #Fetch content download timestamp
|
||||
endif()
|
||||
include(cmake/project_version.cmake)
|
||||
include(cmake/SlsAddFlag.cmake)
|
||||
|
||||
|
||||
|
||||
# Using FetchContent to get libzmq
|
||||
include(FetchContent)
|
||||
option(SLS_FETCH_ZMQ_FROM_GITHUB "Fetch zmq from github" OFF)
|
||||
option(SLS_FETCH_PYBIND11_FROM_GITHUB "Fetch pybind11 from github" OFF)
|
||||
|
||||
if(SLS_FETCH_ZMQ_FROM_GITHUB)
|
||||
# Opt in to pull down a zmq version from github instead of
|
||||
# using the bundled verison
|
||||
FetchContent_Declare(
|
||||
libzmq
|
||||
GIT_REPOSITORY https://github.com/zeromq/libzmq.git
|
||||
GIT_TAG v4.3.4
|
||||
)
|
||||
else()
|
||||
# Standard behaviour use libzmq included in this repo (libs/libzmq)
|
||||
FetchContent_Declare(
|
||||
libzmq
|
||||
URL ${CMAKE_CURRENT_SOURCE_DIR}/libs/libzmq/libzmq-4.3.4.tar.gz
|
||||
URL_HASH MD5=cc20b769ac10afa352e5ed2769bb23b3
|
||||
)
|
||||
endif()
|
||||
|
||||
# Disable unwanted options from libzmq
|
||||
set(BUILD_TESTS OFF CACHE BOOL "Switch off libzmq test build")
|
||||
set(BUILD_SHARED OFF CACHE BOOL "Switch off libzmq shared libs")
|
||||
set(WITH_PERF_TOOL OFF CACHE BOOL "")
|
||||
set(ENABLE_CPACK OFF CACHE BOOL "")
|
||||
set(ENABLE_CLANG OFF CACHE BOOL "")
|
||||
set(ENABLE_CURVE OFF CACHE BOOL "")
|
||||
set(ENABLE_DRAFTS OFF CACHE BOOL "")
|
||||
|
||||
# Using GetProperties and Populate to be able to exclude zmq
|
||||
# from install (not possible with FetchContent_MakeAvailable(libzmq))
|
||||
FetchContent_GetProperties(libzmq)
|
||||
if(NOT libzmq_POPULATED)
|
||||
FetchContent_Populate(libzmq)
|
||||
add_subdirectory(${libzmq_SOURCE_DIR} ${libzmq_BINARY_DIR} EXCLUDE_FROM_ALL)
|
||||
endif()
|
||||
|
||||
|
||||
|
||||
include(cmake/SlsFindZeroMQ.cmake)
|
||||
include(GNUInstallDirs)
|
||||
|
||||
# If conda build, always set lib dir to 'lib'
|
||||
@ -95,14 +48,12 @@ option(SLS_USE_TESTS "TESTS" OFF)
|
||||
option(SLS_USE_INTEGRATION_TESTS "Integration Tests" OFF)
|
||||
option(SLS_USE_SANITIZER "Sanitizers for debugging" OFF)
|
||||
option(SLS_USE_PYTHON "Python bindings" OFF)
|
||||
option(SLS_INSTALL_PYTHONEXT "Install the python extension in the install tree under CMAKE_INSTALL_PREFIX/python/" OFF)
|
||||
option(SLS_USE_CTBGUI "ctb GUI" OFF)
|
||||
option(SLS_BUILD_DOCS "docs" OFF)
|
||||
option(SLS_BUILD_EXAMPLES "examples" OFF)
|
||||
option(SLS_TUNE_LOCAL "tune to local machine" OFF)
|
||||
option(SLS_DEVEL_HEADERS "install headers for devel" OFF)
|
||||
option(SLS_USE_MOENCH "compile zmq and post processing for Moench" OFF)
|
||||
option(SLS_USE_JUNGFRAU "compile post processing for Jungfrau" OFF)
|
||||
|
||||
#Convenience option to switch off defaults when building Moench binaries only
|
||||
option(SLS_BUILD_ONLY_MOENCH "compile only Moench" OFF)
|
||||
@ -116,18 +67,6 @@ if(SLS_BUILD_ONLY_MOENCH)
|
||||
set(SLS_USE_MOENCH ON CACHE BOOL "Enable" FORCE)
|
||||
endif()
|
||||
|
||||
#Convenience option to switch off defaults when building Jungfrau binaries only
|
||||
option(SLS_BUILD_ONLY_JUNGFRAU "compile only Jungfrau" OFF)
|
||||
if(SLS_BUILD_ONLY_JUNGFRAU)
|
||||
message(STATUS "Build JUNGFRAU binaries only!")
|
||||
set(SLS_BUILD_SHARED_LIBRARIES OFF CACHE BOOL "Disabled for JUNGFRAU_ONLY" FORCE)
|
||||
set(SLS_USE_TEXTCLIENT OFF CACHE BOOL "Disabled for JUNGFRAU_ONLY" FORCE)
|
||||
set(SLS_USE_DETECTOR OFF CACHE BOOL "Disabled for JUNGFRAU_ONLY" FORCE)
|
||||
set(SLS_USE_RECEIVER OFF CACHE BOOL "Disabled for JUNGFRAU_ONLY" FORCE)
|
||||
set(SLS_USE_RECEIVER_BINARIES OFF CACHE BOOL "Disabled for JUNGFRAU_ONLY" FORCE)
|
||||
set(SLS_USE_JUNGFRAU ON CACHE BOOL "Enable" FORCE)
|
||||
endif()
|
||||
|
||||
|
||||
option(SLS_EXT_BUILD "external build of part of the project" OFF)
|
||||
if(SLS_EXT_BUILD)
|
||||
@ -143,8 +82,6 @@ endif()
|
||||
#Maybe have an option guarding this?
|
||||
set(SLS_INTERNAL_RAPIDJSON_DIR ${CMAKE_CURRENT_SOURCE_DIR}/libs/rapidjson)
|
||||
|
||||
set(SLS_INTERNAL_QWT_DIR ${CMAKE_CURRENT_SOURCE_DIR}/libs/qwt-6.1.5)
|
||||
|
||||
set(ClangFormat_EXCLUDE_PATTERNS "build/"
|
||||
"libs/"
|
||||
"slsDetectorCalibration/"
|
||||
@ -262,6 +199,10 @@ set(CMAKE_POSITION_INDEPENDENT_CODE ON)
|
||||
set(CMAKE_INSTALL_RPATH $ORIGIN)
|
||||
set(CMAKE_BUILD_WITH_INSTALL_RPATH FALSE)
|
||||
|
||||
|
||||
custom_find_zmq()
|
||||
|
||||
|
||||
if (SLS_USE_TESTS)
|
||||
enable_testing()
|
||||
add_subdirectory(tests)
|
||||
@ -281,7 +222,6 @@ if (SLS_USE_RECEIVER)
|
||||
endif (SLS_USE_RECEIVER)
|
||||
|
||||
if (SLS_USE_GUI)
|
||||
add_subdirectory(libs/qwt)
|
||||
add_subdirectory(slsDetectorGui)
|
||||
endif (SLS_USE_GUI)
|
||||
|
||||
@ -295,22 +235,7 @@ endif (SLS_USE_INTEGRATION_TESTS)
|
||||
|
||||
if (SLS_USE_PYTHON)
|
||||
find_package (Python 3.6 COMPONENTS Interpreter Development)
|
||||
if(SLS_FETCH_PYBIND11_FROM_GITHUB)
|
||||
FetchContent_Declare(
|
||||
pybind11
|
||||
GIT_REPOSITORY https://github.com/pybind/pybind11
|
||||
GIT_TAG v2.11.0
|
||||
)
|
||||
|
||||
else()
|
||||
FetchContent_Declare(
|
||||
pybind11
|
||||
URL ${CMAKE_SOURCE_DIR}/libs/pybind11/v2.11.0.tar.gz
|
||||
URL_HASH MD5=90c4946e87c64d8d8fc0ae4edf35d780
|
||||
)
|
||||
endif()
|
||||
FetchContent_MakeAvailable(pybind11)
|
||||
|
||||
add_subdirectory(libs/pybind11 ${CMAKE_BINARY_DIR}/bin/)
|
||||
add_subdirectory(python)
|
||||
endif(SLS_USE_PYTHON)
|
||||
|
||||
@ -335,11 +260,6 @@ if(SLS_USE_MOENCH)
|
||||
add_subdirectory(slsDetectorCalibration/moenchExecutables)
|
||||
endif(SLS_USE_MOENCH)
|
||||
|
||||
if(SLS_USE_JUNGFRAU)
|
||||
add_subdirectory(slsDetectorCalibration/tiffio)
|
||||
add_subdirectory(slsDetectorCalibration/jungfrauExecutables)
|
||||
endif(SLS_USE_JUNGFRAU)
|
||||
|
||||
if(SLS_MASTER_PROJECT)
|
||||
set(CMAKE_INSTALL_DIR "share/cmake/${PROJECT_NAME}")
|
||||
set(PROJECT_LIBRARIES slsSupportShared slsDetectorShared slsReceiverShared)
|
||||
|
277
README.md
277
README.md
@ -1,233 +1,102 @@
|
||||
## Dependencies
|
||||
Before building from source make sure that you have the [software wiki](https://slsdetectorgroup.github.io/devdoc/dependencies.html) installed. If installing using conda, conda will manage the dependencies. Avoid also installing packages with pip.
|
||||
### Note
|
||||
|
||||
## Documentaion
|
||||
Detailed documentation can be found in the [software wiki](https://slsdetectorgroup.github.io/devdoc/index.html) and on the [official site](https://www.psi.ch/en/detectors/software).
|
||||
Please do not update to any xxxx.xx.xx.dev0 tags. They are not releases, but tags for internal usage.
|
||||
Use only releases with tags such as x.x.x or x.x.x-rcx.
|
||||
|
||||
## Installation
|
||||
### Documentation
|
||||
##### 5.0.0 - Latest Release
|
||||
Detailed documentation on the latest release can be found in the [software wiki](https://slsdetectorgroup.github.io/devdoc/index.html) and on the [official site](https://www.psi.ch/en/detectors/software).
|
||||
|
||||
### 1. Install binaries using conda
|
||||
Conda is not only useful to manage python environments but can also
|
||||
be used as a user space package manager. Dates in the tag (for eg. 2020.07.23.dev0)
|
||||
are from the developer branch. Please use released tags for stability.
|
||||
|
||||
We have three different packages available:
|
||||
* **slsdetlib** shared libraries and command line utilities
|
||||
* **slsdetgui** GUI
|
||||
* **slsdet** Python bindings
|
||||
##### Older Releases
|
||||
Documentation is found in the package.
|
||||
|
||||
### Binaries
|
||||
Binaries for the slsDetectorPackage are available through conda.
|
||||
```
|
||||
#Add channels for dependencies and our library
|
||||
#Add conda channels
|
||||
conda config --add channels conda-forge
|
||||
conda config --add channels slsdetectorgroup
|
||||
conda config --set channel_priority strict
|
||||
|
||||
#create and activate an environment with our library
|
||||
#replace 6.1.1 with the required tag
|
||||
conda create -n myenv slsdetlib=6.1.1
|
||||
conda activate myenv
|
||||
conda install slsdetlib #only shared lib and command line
|
||||
conda install slsdet #python bindings (includes slsdetlib)
|
||||
conda install slsdetgui #gui (includes qt4)
|
||||
|
||||
#ready to use
|
||||
sls_detector_get exptime
|
||||
etc ...
|
||||
```
|
||||
#Install specific version
|
||||
conda install slsdet=2020.03.02.dev0 #developer version from 3 March 2020
|
||||
|
||||
```
|
||||
# List available versions
|
||||
# lib and binaries
|
||||
conda search slsdetlib
|
||||
# python
|
||||
conda search slsdet
|
||||
# gui
|
||||
conda search slsdetgui
|
||||
```
|
||||
|
||||
### 2. Build from source
|
||||
|
||||
##### 2.1 Download Source Code from github
|
||||
### Source code
|
||||
One can also obtain the source code from this repository and compile.
|
||||
```
|
||||
git clone https://github.com/slsdetectorgroup/slsDetectorPackage.git --branch 7.0.0
|
||||
```
|
||||
|
||||
**Pybind for Python**<br>
|
||||
* **v7.0.0+**:
|
||||
pybind11 packaged into 'libs/pybind'. No longer a submodule. No need for "recursive" or "submodule update".
|
||||
|
||||
* **Older versions**:
|
||||
pybind11 is a submodule. Must be cloned using "recursive" and updated when switching between versions using the following commands.
|
||||
git clone https://github.com/slsdetectorgroup/slsDetectorPackage.git
|
||||
|
||||
```
|
||||
# clone using recursive to get pybind11 submodule
|
||||
git clone --recursive https://github.com/slsdetectorgroup/slsDetectorPackage.git
|
||||
#### Dependencies
|
||||
|
||||
# update submodule when switching between releases
|
||||
cd slsDetectorPackage
|
||||
git submodule update --init
|
||||
Refer [this page](https://slsdetectorgroup.github.io/devdoc/dependencies.html) for dependencies.
|
||||
|
||||
|
||||
#### Compilation
|
||||
|
||||
Compiling can be done in two ways. Either with the convenience script
|
||||
cmk.sh or directly with cmake for more control.
|
||||
|
||||
**1. Compile using script cmk.sh**<br>
|
||||
|
||||
These are mainly aimed at those not familiar with using ccmake and cmake.
|
||||
```
|
||||
The binaries are generated in slsDetectorPackage/build/bin directory.
|
||||
|
||||
##### 2.2 Build from source
|
||||
|
||||
|
||||
###### Build using CMake
|
||||
|
||||
```
|
||||
# outside slsDetecorPackage folder
|
||||
mkdir build && cd build
|
||||
|
||||
# configure & generate Makefiles using cmake
|
||||
# by listing all your options (alternately use ccmake described below)
|
||||
# cmake3 for some systems
|
||||
cmake ../slsDetectorPackage -DCMAKE_INSTALL_PREFIX=/your/install/path
|
||||
|
||||
# compiled to the build/bin directory
|
||||
make -j12 #or whatever number of cores you are using to build
|
||||
|
||||
# install headers and libs in /your/install/path directory
|
||||
make install
|
||||
```
|
||||
|
||||
Instead of the cmake command, one can use ccmake to get a list of options to configure and generate Makefiles at ease.
|
||||
|
||||
|
||||
```
|
||||
# ccmake3 for some systems
|
||||
ccmake ..
|
||||
|
||||
# choose the options
|
||||
# first press [c] - configure
|
||||
# then press [g] - generate
|
||||
```
|
||||
|
||||
|Example cmake options|Comment|
|
||||
|---|---|
|
||||
| -DSLS_USE_PYTHON=ON | Python |
|
||||
| -DPython_FIND_VIRTUALENV=ONLY | Python from only the conda environment |
|
||||
| -DZeroMQ_HINT=/usr/lib64 | Use system zmq instead |
|
||||
| -DSLS_USE_GUI=ON | GUI |
|
||||
|
||||
|
||||
###### Build using in-built cmk.sh script
|
||||
|
||||
```
|
||||
The binaries are generated in slsDetectorPackage/build/bin directory.
|
||||
|
||||
Usage: ./cmk.sh [-b] [-c] [-d <HDF5 directory>] [e] [g] [-h] [i] [-j <Number of threads>]
|
||||
[-k <CMake command>] [-l <Install directory>] [m] [n] [-p] [-q <Zmq hint directory>]
|
||||
[r] [s] [t] [u] [z]
|
||||
-[no option]: only make
|
||||
-b: Builds/Rebuilds CMake files normal mode
|
||||
-c: Clean
|
||||
-d: HDF5 Custom Directory
|
||||
-e: Debug mode
|
||||
-g: Build/Rebuilds gui
|
||||
-h: Builds/Rebuilds Cmake files with HDF5 package
|
||||
-i: Builds tests
|
||||
-j: Number of threads to compile through
|
||||
-k: CMake command
|
||||
-l: Install directory
|
||||
-m: Manuals
|
||||
-n: Manuals without compiling doxygen (only rst)
|
||||
-p: Builds/Rebuilds Python API
|
||||
-q: Zmq hint directory
|
||||
-r: Build/Rebuilds only receiver
|
||||
-s: Simulator
|
||||
-t: Build/Rebuilds only text client
|
||||
-u: Chip Test Gui
|
||||
-z: Moench zmq processor
|
||||
Usage: ./cmk.sh [-c] [-b] [-p] [e] [t] [r] [g] [s] [u] [i] [m] [n] [-h] [z] [-d <HDF5 directory>] [-l Install directory] [-k <CMake command>] [-j <Number of threads>]
|
||||
-[no option]: only make
|
||||
-c: Clean
|
||||
-b: Builds/Rebuilds CMake files normal mode
|
||||
-p: Builds/Rebuilds Python API
|
||||
-h: Builds/Rebuilds Cmake files with HDF5 package
|
||||
-d: HDF5 Custom Directory
|
||||
-k: CMake command
|
||||
-l: Install directory
|
||||
-t: Build/Rebuilds only text client
|
||||
-r: Build/Rebuilds only receiver
|
||||
-g: Build/Rebuilds only gui
|
||||
-s: Simulator
|
||||
-u: Chip Test Gui
|
||||
-j: Number of threads to compile through
|
||||
-e: Debug mode
|
||||
-i: Builds tests
|
||||
-m: Manuals
|
||||
-n: Manuals without compiling doxygen (only rst)
|
||||
-z: Moench zmq processor
|
||||
|
||||
|
||||
# display all options
|
||||
./cmk.sh -?
|
||||
# get all options
|
||||
./cmk.sh -?
|
||||
|
||||
# new build and compile in parallel (recommended basic option):
|
||||
./cmk.sh -cbj5
|
||||
|
||||
# new build, python and compile in parallel:
|
||||
./cmk.sh -cbpj5
|
||||
|
||||
#To use the system zmq (/usr/lib64) instead
|
||||
./cmk.sh -cbj5 -q /usr/lib64
|
||||
# new build and compile in parallel:
|
||||
./cmk.sh -bj5
|
||||
```
|
||||
|
||||
**2. Compile without script**<br>
|
||||
Use cmake to create out-of-source builds, by creating a build folder parallel to source directory. This would create a debug build with address sanitizers.
|
||||
```
|
||||
$ mkdir build
|
||||
$ cd build
|
||||
$ cmake ../slsDetectorPackage -DCMAKE_BUILD_TYPE=Debug -DSLS_USE_SANITIZER=ON
|
||||
$ make -j12 #or whatever number of threads wanted
|
||||
```
|
||||
|
||||
###### Build on old distributions
|
||||
|
||||
If your linux distribution doesn't come with a C++11 compiler (gcc>4.8) then
|
||||
it's possible to install a newer gcc using conda and build the slsDetectorPackage
|
||||
using this compiler
|
||||
|
||||
To install binaries using CMake
|
||||
```
|
||||
#Create an environment with the dependencies
|
||||
conda create -n myenv gxx_linux-64 cmake zmq
|
||||
conda activate myenv
|
||||
|
||||
# outside slsDetecorPackage folder
|
||||
mkdir build && cd build
|
||||
cmake ../slsDetectorPackage -DCMAKE_PREFIX_PATH=$CONDA_PREFIX
|
||||
make -j12
|
||||
```
|
||||
|
||||
###### Build slsDetectorGui (Qt5)
|
||||
|
||||
1. Using pre-built binary on conda
|
||||
```
|
||||
conda create -n myenv slsdetgui=7.0.0
|
||||
conda activate myenv
|
||||
```
|
||||
|
||||
2. Using system installation on RHEL7
|
||||
```
|
||||
yum install qt5-qtbase-devel.x86_64
|
||||
yum install qt5-qtsvg-devel.x86_64
|
||||
```
|
||||
|
||||
3. Using conda
|
||||
```
|
||||
#Add channels for dependencies and our library
|
||||
conda config --add channels conda-forge
|
||||
conda config --add channels slsdetectorgroup
|
||||
conda config --set channel_priority strict
|
||||
|
||||
# create environment to compile
|
||||
# on rhel7
|
||||
conda create -n slsgui zeromq gxx_linux-64 gxx_linux-64 mesa-libgl-devel-cos6-x86_64 qt
|
||||
# on fedora or newer systems
|
||||
conda create -n slsgui zeromq qt
|
||||
|
||||
# when using conda compilers, would also need libgl, but no need for it on fedora unless maybe using it with ROOT
|
||||
|
||||
# activate environment
|
||||
conda activate slsgui
|
||||
|
||||
# compile with cmake outside slsDetecorPackage folder
|
||||
mkdir build && cd build
|
||||
cmake ../slsDetectorPackage -DSLS_USE_GUI=ON
|
||||
make -j12
|
||||
|
||||
# or compile with cmk.sh
|
||||
cd slsDetectorPackage
|
||||
./cmk.sh -cbgj9
|
||||
```
|
||||
|
||||
###### Build documentation from package
|
||||
The documentation for the slsDetectorPackage is build using a combination
|
||||
of Doxygen, Sphinx and Breathe. The easiest way to install the dependencies
|
||||
is to use conda
|
||||
|
||||
```
|
||||
conda create -n myenv python sphinx_rtd_theme breathe
|
||||
```
|
||||
|
||||
```
|
||||
# using cmake or ccmake to enable DSLS_BUILD_DOCS
|
||||
# outside slsDetecorPackage folder
|
||||
mkdir build && cd build
|
||||
cmake ../slsDetectorPackage -DSLS_BUILD_DOCS=ON
|
||||
|
||||
make docs # generate API docs and build Sphinx RST
|
||||
make rst # rst only, saves time in case the API did not change
|
||||
git clone --recursive https://github.com/slsdetectorgroup/slsDetectorPackage.git
|
||||
mkdir build && cd build
|
||||
cmake ../slsDetectorPackage -DCMAKE_INSTALL_PREFIX=/your/install/path
|
||||
make -j12 #or whatever number of cores you are using to build
|
||||
make install
|
||||
```
|
||||
|
||||
|
||||
## Support
|
||||
### Support
|
||||
dhanya.thattil@psi.ch
|
||||
erik.frojdh@psi.ch
|
||||
erik.frojdh@psi.ch
|
311
RELEASE.txt
Normal file → Executable file
311
RELEASE.txt
Normal file → Executable file
@ -1,217 +1,148 @@
|
||||
SLS Detector Package Bug Fix Release 8.0.2 released on 18.09.2024
|
||||
=================================================================
|
||||
SLS Detector Package Minor Release 7.0.0 released on 25.11.2021
|
||||
===============================================================
|
||||
|
||||
This document describes the differences between v8.0.2 and v8.0.1
|
||||
This document describes the differences between v7.0.0 and v6.x.x
|
||||
|
||||
|
||||
|
||||
CONTENTS
|
||||
--------
|
||||
1 Resolved Issues
|
||||
2 On-board Detector Server Compatibility
|
||||
3 Firmware Requirements
|
||||
4 Kernel Requirements
|
||||
5 Download, Documentation & Support
|
||||
1. New or Changed Features
|
||||
2. Resolved Issues
|
||||
3. Firmware Requirements
|
||||
4. Kernel Requirements
|
||||
5. Download, Documentation & Support
|
||||
|
||||
|
||||
|
||||
|
||||
1 Resolved Issues
|
||||
=================
|
||||
1. New or Changed Features
|
||||
==========================
|
||||
|
||||
- Fixed minor warnings (will fix commandline print of excess packets for missing packets)
|
||||
- ctb slow adcs and any other adcs (other than temp) goes to the control Server
|
||||
- number of udp interfaces is 2 for Eiger (CHANGE IN API??)
|
||||
- added module id for virtual servers into the udp header
|
||||
- refactoring (rxr)
|
||||
- fixed patsetbit and patsetmask for moench
|
||||
- changed default vref of adc9257 to 2V for moench (from 1.33V)
|
||||
- moench and ctb - can set the starting frame number of next acquisition
|
||||
- mythen server kernel check incompatible (cet timezone)
|
||||
- rx_arping
|
||||
- rx_threadsids max is now 9 (breaking api)
|
||||
- fixed datastream disabling for eiger. Its only available in 10g mode.
|
||||
- m3 server crash (vthrehsold dac names were not provided)
|
||||
- allow vtrim to be interpolated for Eiger settings
|
||||
- m3 setThresholdEnergy and setAllThresholdEnergy was overwriting gaincaps with settings enum
|
||||
- can set localhost with virtual server with minimum configuration: (hostname localhost, rx_hostname localhost, udp_dstip auto)
|
||||
- increases the progress according to listened index. (not processed index)
|
||||
- current frame index points to listened frame index (not processed index)
|
||||
- when in discard partial frames or empty mode, the frame number doesnt increase by 1, it increases to that number (so its faster)
|
||||
- file write disabled by default
|
||||
- eiger 12 bit mode
|
||||
- start non blocking acquisition at modular level
|
||||
- connect master commands to api (allow set master for eiger)
|
||||
--ignore-config command line
|
||||
- command line argument 'master' mainly for virtual servers (also master/top for real eiger), only one virtual server for eiger, use command lines for master/top
|
||||
- stop servers also check for errors at startup( in case it was running with an older version)
|
||||
- hostname cmd failed when connecting to servers in update mode (ctb, moench, jungfrau, eiger)
|
||||
- missingpackets signed (negative => extra packets)
|
||||
- framescaught and frameindex now returns a vector for each port
|
||||
- progress looks at activated or enabled ports, so progress does not stagnate
|
||||
- (eiger) disable datastreaming also for virtual servers only for 10g
|
||||
- missing packets also takes care of disabled ports
|
||||
- added geometry to metadata
|
||||
- 10g eiger nextframenumber get fixed.
|
||||
- stop, able to set nextframenumber to a consistent (max + 1) for all modules if different (eiger/ctb/jungfrau/moench)
|
||||
- ctb: can set names for all the dacs
|
||||
- fpga/kernel programming, checks if drive is a special file and not a normal file
|
||||
- gotthard 25 um image reconstructed in gui and virtual hdf5 (firmware updated for slave to reverse channels)
|
||||
- master binary file in json format now
|
||||
- fixed bug introduced in 6.0.0: hdf5 files created 1 file per frame after the initial file which had maxframesperfile
|
||||
- m3 polarity, interpolation (enables all counters when enabled), pump probe, analog pulsing, digital pulsing
|
||||
- updatedetectorserver - removes old server current binary pointing to for blackfin
|
||||
- removing copydetectorserver using tftp
|
||||
>>>>>>> developer
|
||||
- registerCallBackRawDataReady and registerCallBackRawDataModifyReady now gives a sls_receiver_header* instead of a char*, and uint32_t to size_t
|
||||
- registerCallBackStartAcquisition gave incorrect imagesize (+120 bytes). corrected.
|
||||
- registerCallBackStartAcquisition parameter is a const string reference
|
||||
- m3 (runnig config second time with tengiga 0, dr !=32, counters !=0x7) calculated incorrect image size expected
|
||||
- fixed row column indexing (mainly for multi module Jungfrau 2 interfaces )
|
||||
- eiger gui row indices not flipped anymore (fix in config)
|
||||
|
||||
2. Resolved Issues
|
||||
==================
|
||||
|
||||
|
||||
Compilation
|
||||
-----------
|
||||
|
||||
|
||||
* Rapidjson compilation with gcc 14
|
||||
Fixed a compile issue with gcc 14. Same fix in later commits to rapidjson.
|
||||
|
||||
|
||||
Client
|
||||
------
|
||||
|
||||
|
||||
* getenv("HOME") returning nullptr
|
||||
When this happens, especially for systemd, it segfaults. Protection
|
||||
provided by using empty string in this case.
|
||||
|
||||
|
||||
* [Mythen3] Bad channel list for multi module
|
||||
Exception thrown when loading multi module bad channel file skipping
|
||||
modules in between. Fixed.
|
||||
|
||||
|
||||
* [Gotthard2] Stopping a blocking acquisition
|
||||
A check added in v8.0.0 to catch slaves that might be in waiting forever
|
||||
also catches Gotthard2 25um slaves that might only be in waiting
|
||||
temporarily. This is fixed with a 50ms sleep before checking again
|
||||
(upto 1s).
|
||||
|
||||
|
||||
* [Moench] Acquire finished processing call back
|
||||
New executable 'sls_detector_acquire_zmq' added to listen to all zmq
|
||||
packets from post processor or external process to signal end of post
|
||||
processing. Post processor refactoring of zmq socket creation added.
|
||||
|
||||
|
||||
Gui / Callback
|
||||
--------------
|
||||
|
||||
|
||||
* [Gotthard2] Stopping a blocking acquisition
|
||||
From the previous issue, call back for acquisition finished status gives
|
||||
error for inconsistent states. Again, a check every 50ms upto 1s is
|
||||
added to let go the temporarily waiting slave.
|
||||
|
||||
|
||||
* Different file paths
|
||||
Fixes file path resetting when different modules have different fpath set.
|
||||
|
||||
|
||||
Receiver
|
||||
--------
|
||||
|
||||
|
||||
* HDF5 fill value
|
||||
Fix the fill value to accomodate all datatypes.
|
||||
|
||||
|
||||
Firmware
|
||||
--------
|
||||
|
||||
|
||||
* [Moench] Overflow with exptime of 0
|
||||
Fixed overflow when subtracting 1 clock cycle from exptime.
|
||||
|
||||
|
||||
On-board Detector Server
|
||||
------------------------
|
||||
|
||||
|
||||
* [Moench] Few changes in Server:
|
||||
- Max shifts of adc clock changed from 240 to 200.
|
||||
|
||||
- Fixed overflow when subtracting 2 clock cycles from exptime of 0ms.
|
||||
|
||||
- Default readout speed to half speed from quarter.
|
||||
|
||||
- Change default ADC phase to 150 for full readout speed.
|
||||
|
||||
- Change default vipre_cds dac from 800 to 1280.
|
||||
|
||||
|
||||
* [Mythen3] Change Clk divider from 10 (100MHz) to 20 (50MHz) at startup.
|
||||
|
||||
|
||||
* [Jungfrau] Fix for HW v1.0 boards for unreliable ADC 2
|
||||
Issues sometimes seen on some HW v 1.0 boards are fixed with phase
|
||||
relationship of 120 degrees. HW v2.0 boards are not affected.
|
||||
3. Firmware Requirements
|
||||
========================
|
||||
|
||||
|
||||
Documentation
|
||||
-------------
|
||||
|
||||
|
||||
* Updated troubleshooting documentaion to check links and disable firewall
|
||||
|
||||
|
||||
* Excluded non UTF-8 encoded libzmq documents due to machine dependent
|
||||
compilation issues.
|
||||
|
||||
|
||||
|
||||
2 On-board Detector Server Compatibility
|
||||
==========================================
|
||||
|
||||
|
||||
Eiger 8.0.0
|
||||
Jungfrau 8.0.2
|
||||
Mythen3 8.0.2
|
||||
Gotthard2 8.0.0
|
||||
Gotthard 8.0.0
|
||||
Moench 8.0.2
|
||||
Ctb 8.0.0
|
||||
Eiger
|
||||
=====
|
||||
Compatible version : 08.10.2021 (v29)
|
||||
|
||||
Jungfrau
|
||||
========
|
||||
Compatible version : 31.08.2021 (v1.2, PCB v1.0)
|
||||
: 08.10.2021 (v2.2, PCB v2.0)
|
||||
|
||||
On-board Detector Server Upgrade
|
||||
--------------------------------
|
||||
Gotthard
|
||||
========
|
||||
Compatible version : 08.02.2018 (50um and 25um Master)
|
||||
: 09.02.2018 (25 um Slave)
|
||||
|
||||
From v6.1.0 (without tftp):
|
||||
Using command 'updatedetectorserver'
|
||||
Mythen3
|
||||
=======
|
||||
Compatible version : 10.09.2021 (v1.1)
|
||||
|
||||
Gotthard2
|
||||
=========
|
||||
Compatible version : 27.05.2021 (v0.1)
|
||||
|
||||
Moench
|
||||
======
|
||||
Compatible version : 05.10.2020 (v1.0)
|
||||
|
||||
Ctb
|
||||
===
|
||||
Compatible version : 05.10.2020 (v1.0)
|
||||
|
||||
Detector Upgrade
|
||||
================
|
||||
The following can be upgraded remotely:
|
||||
Eiger via bit files
|
||||
Jungfrau via command <.pof>
|
||||
Mythen3 via command <.rbf>
|
||||
Gotthard2 via command <.rbf>
|
||||
Moench via command <.pof>
|
||||
Ctb via command <.pof>
|
||||
|
||||
The following cannot be upgraded remotely:
|
||||
Gotthard
|
||||
|
||||
Instructions available at
|
||||
https://slsdetectorgroup.github.io/devdoc/firmware.html
|
||||
and
|
||||
https://slsdetectorgroup.github.io/devdoc/serverupgrade.html
|
||||
|
||||
|
||||
|
||||
|
||||
3 Firmware Requirements
|
||||
========================
|
||||
|
||||
|
||||
Eiger 02.10.2023 (v32) (updated in 7.0.3)
|
||||
|
||||
Jungfrau 20.09.2023 (v1.5, HW v1.0) (updated in 8.0.0)
|
||||
21.09.2023 (v2.5, HW v2.0) (updated in 8.0.0)
|
||||
|
||||
Mythen3 24.01.2023 (v1.4) (updated in 7.0.0)
|
||||
|
||||
Gotthard2 23.11.2022 (v0.3) (updated in 7.0.0)
|
||||
|
||||
Gotthard 08.02.2018 (50um and 25um Master)
|
||||
09.02.2018 (25 um Slave)
|
||||
|
||||
Moench 26.10.2023 (v0.3.2) (updated in 8.0.2,
|
||||
under development)
|
||||
|
||||
Ctb 28.08.2023 (v1.2) (updated in 8.0.0)
|
||||
|
||||
|
||||
Detector Upgrade
|
||||
----------------
|
||||
|
||||
The following can be upgraded remotely:
|
||||
|
||||
Eiger via bit files
|
||||
Jungfrau via command <.pof>
|
||||
Mythen3 via command <.rbf>
|
||||
Gotthard2 via command <.rbf>
|
||||
Moench via command <.pof>
|
||||
Ctb via command <.pof>
|
||||
|
||||
Gotthard cannot be upgraded remotely
|
||||
|
||||
Except Eiger,
|
||||
upgrade
|
||||
using command 'programfpga' or
|
||||
|
||||
udpate both server and firmware simultaneously
|
||||
using command 'update'
|
||||
|
||||
|
||||
Instructions available at
|
||||
https://slsdetectorgroup.github.io/devdoc/firmware.html
|
||||
|
||||
|
||||
|
||||
|
||||
4 Kernel Requirements
|
||||
4. Kernel Requirements
|
||||
======================
|
||||
|
||||
Blackfin
|
||||
--------
|
||||
========
|
||||
Latest version: Fri Oct 29 00:00:00 2021
|
||||
|
||||
Older ones will work, but might have issues with programming firmware via
|
||||
the package.
|
||||
|
||||
Nios
|
||||
-----
|
||||
====
|
||||
Compatible version: Mon May 10 18:00:21 CEST 2021
|
||||
|
||||
Kernel Upgrade
|
||||
---------------
|
||||
==============
|
||||
Eiger via bit files
|
||||
Others via command
|
||||
|
||||
@ -223,8 +154,7 @@ This document describes the differences between v8.0.2 and v8.0.1
|
||||
|
||||
|
||||
|
||||
|
||||
5 Download, Documentation & Support
|
||||
5. Download, Documentation & Support
|
||||
====================================
|
||||
|
||||
Download
|
||||
@ -237,10 +167,7 @@ This document describes the differences between v8.0.2 and v8.0.1
|
||||
-------------
|
||||
|
||||
Installation:
|
||||
https://slsdetectorgroup.github.io/devdoc/installation.html
|
||||
|
||||
Quick Start Guide:
|
||||
https://slsdetectorgroup.github.io/devdoc/quick_start_guide.html
|
||||
https://slsdetectorgroup.github.io/devdoc/installation.html#
|
||||
|
||||
Firmware Upgrade:
|
||||
https://slsdetectorgroup.github.io/devdoc/firmware.html
|
||||
@ -260,6 +187,9 @@ This document describes the differences between v8.0.2 and v8.0.1
|
||||
Command Line Documentation:
|
||||
https://slsdetectorgroup.github.io/devdoc/commandline.html
|
||||
|
||||
Quick Start Guide:
|
||||
https://slsdetectorgroup.github.io/devdoc/quick_start_guide.html
|
||||
|
||||
C++ API Documentation:
|
||||
https://slsdetectorgroup.github.io/devdoc/detector.html
|
||||
|
||||
@ -276,16 +206,8 @@ This document describes the differences between v8.0.2 and v8.0.1
|
||||
https://slsdetectorgroup.github.io/devdoc/receivers.html
|
||||
https://slsdetectorgroup.github.io/devdoc/slsreceiver.html
|
||||
|
||||
Detector UDP Header:
|
||||
https://slsdetectorgroup.github.io/devdoc/udpheader.html
|
||||
https://slsdetectorgroup.github.io/devdoc/udpdetspec.html
|
||||
|
||||
slsReceiver Zmq Format:
|
||||
https://slsdetectorgroup.github.io/devdoc/slsreceiver.html#zmq-json-header-format
|
||||
|
||||
TroubleShooting:
|
||||
https://slsdetectorgroup.github.io/devdoc/troubleshooting.html
|
||||
https://slsdetectorgroup.github.io/devdoc/troubleshooting.html#receiver-pc-tuning-options
|
||||
|
||||
Further Documentation:
|
||||
https://www.psi.ch/en/detectors/documentation
|
||||
@ -299,3 +221,4 @@ This document describes the differences between v8.0.2 and v8.0.1
|
||||
|
||||
dhanya.thattil@psi.ch
|
||||
erik.frojdh@psi.ch
|
||||
|
||||
|
118
cmake/FindQwt.cmake
Executable file
118
cmake/FindQwt.cmake
Executable file
@ -0,0 +1,118 @@
|
||||
# Qt Widgets for Technical Applications
|
||||
# available at http://www.http://qwt.sourceforge.net/
|
||||
#
|
||||
# The module defines the following variables:
|
||||
# QWT_FOUND - the system has Qwt
|
||||
# QWT_INCLUDE_DIR - where to find qwt_plot.h
|
||||
# QWT_INCLUDE_DIRS - qwt includes
|
||||
# QWT_LIBRARY - where to find the Qwt library
|
||||
# QWT_LIBRARIES - aditional libraries
|
||||
# QWT_MAJOR_VERSION - major version
|
||||
# QWT_MINOR_VERSION - minor version
|
||||
# QWT_PATCH_VERSION - patch version
|
||||
# QWT_VERSION_STRING - version (ex. 5.2.1)
|
||||
# QWT_ROOT_DIR - root dir (ex. /usr/local)
|
||||
|
||||
#=============================================================================
|
||||
# Copyright 2010-2013, Julien Schueller
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
#
|
||||
# 1. Redistributions of source code must retain the above copyright notice, this
|
||||
# list of conditions and the following disclaimer.
|
||||
# 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||
# this list of conditions and the following disclaimer in the documentation
|
||||
# and/or other materials provided with the distribution.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
|
||||
# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
# The views and conclusions contained in the software and documentation are those
|
||||
# of the authors and should not be interpreted as representing official policies,
|
||||
# either expressed or implied, of the FreeBSD Project.
|
||||
#=============================================================================
|
||||
|
||||
|
||||
find_path ( QWT_INCLUDE_DIR
|
||||
NAMES qwt_plot.h
|
||||
HINTS $ENV{QWTDIR} $ENV{QWTDIR}/src ${QT_INCLUDE_DIR}
|
||||
PATH_SUFFIXES qwt qwt-qt3 qwt-qt4 qwt-qt5
|
||||
)
|
||||
|
||||
set ( QWT_INCLUDE_DIRS ${QWT_INCLUDE_DIR} )
|
||||
|
||||
# version
|
||||
set ( _VERSION_FILE ${QWT_INCLUDE_DIR}/qwt_global.h )
|
||||
if ( EXISTS ${_VERSION_FILE} )
|
||||
file ( STRINGS ${_VERSION_FILE} _VERSION_LINE REGEX "define[ ]+QWT_VERSION_STR" )
|
||||
if ( _VERSION_LINE )
|
||||
string ( REGEX REPLACE ".*define[ ]+QWT_VERSION_STR[ ]+\"(.*)\".*" "\\1" QWT_VERSION_STRING "${_VERSION_LINE}" )
|
||||
string ( REGEX REPLACE "([0-9]+)\\.([0-9]+)\\.([0-9]+)" "\\1" QWT_MAJOR_VERSION "${QWT_VERSION_STRING}" )
|
||||
string ( REGEX REPLACE "([0-9]+)\\.([0-9]+)\\.([0-9]+)" "\\2" QWT_MINOR_VERSION "${QWT_VERSION_STRING}" )
|
||||
string ( REGEX REPLACE "([0-9]+)\\.([0-9]+)\\.([0-9]+)" "\\3" QWT_PATCH_VERSION "${QWT_VERSION_STRING}" )
|
||||
endif ()
|
||||
endif ()
|
||||
|
||||
|
||||
# check version
|
||||
set ( _QWT_VERSION_MATCH TRUE )
|
||||
if ( Qwt_FIND_VERSION AND QWT_VERSION_STRING )
|
||||
if ( Qwt_FIND_VERSION_EXACT )
|
||||
if ( NOT Qwt_FIND_VERSION VERSION_EQUAL QWT_VERSION_STRING )
|
||||
set ( _QWT_VERSION_MATCH FALSE )
|
||||
endif ()
|
||||
else ()
|
||||
if ( QWT_VERSION_STRING VERSION_LESS Qwt_FIND_VERSION )
|
||||
set ( _QWT_VERSION_MATCH FALSE )
|
||||
endif ()
|
||||
endif ()
|
||||
endif ()
|
||||
|
||||
|
||||
find_library ( QWT_LIBRARY
|
||||
NAMES qwt qwt-qt3 qwt-qt4 qwt-qt5
|
||||
HINTS $ENV{QWTDIR}/lib ${QT_LIBRARY_DIR}
|
||||
)
|
||||
|
||||
set ( QWT_LIBRARIES ${QWT_LIBRARY} )
|
||||
|
||||
|
||||
# try to guess root dir from include dir
|
||||
if ( QWT_INCLUDE_DIR )
|
||||
string ( REGEX REPLACE "(.*)/include.*" "\\1" QWT_ROOT_DIR ${QWT_INCLUDE_DIR} )
|
||||
# try to guess root dir from library dir
|
||||
elseif ( QWT_LIBRARY )
|
||||
string ( REGEX REPLACE "(.*)/lib[/|32|64].*" "\\1" QWT_ROOT_DIR ${QWT_LIBRARY} )
|
||||
endif ()
|
||||
|
||||
|
||||
# handle the QUIETLY and REQUIRED arguments
|
||||
include ( FindPackageHandleStandardArgs )
|
||||
if ( CMAKE_VERSION LESS 2.8.3 )
|
||||
find_package_handle_standard_args( Qwt DEFAULT_MSG QWT_LIBRARY QWT_INCLUDE_DIR _QWT_VERSION_MATCH )
|
||||
else ()
|
||||
find_package_handle_standard_args( Qwt REQUIRED_VARS QWT_LIBRARY QWT_INCLUDE_DIR _QWT_VERSION_MATCH VERSION_VAR QWT_VERSION_STRING )
|
||||
endif ()
|
||||
|
||||
|
||||
mark_as_advanced (
|
||||
QWT_LIBRARY
|
||||
QWT_LIBRARIES
|
||||
QWT_INCLUDE_DIR
|
||||
QWT_INCLUDE_DIRS
|
||||
QWT_MAJOR_VERSION
|
||||
QWT_MINOR_VERSION
|
||||
QWT_PATCH_VERSION
|
||||
QWT_VERSION_STRING
|
||||
QWT_ROOT_DIR
|
||||
)
|
38
cmake/SlsFindZeroMQ.cmake
Normal file
38
cmake/SlsFindZeroMQ.cmake
Normal file
@ -0,0 +1,38 @@
|
||||
function(custom_find_zmq)
|
||||
set(ZeroMQ_HINT "" CACHE STRING "Hint where ZeroMQ could be found")
|
||||
#Adapted from: https://github.com/zeromq/cppzmq/
|
||||
if (NOT TARGET libzmq)
|
||||
if(ZeroMQ_HINT)
|
||||
message(STATUS "Looking for ZeroMQ in: ${ZeroMQ_HINT}")
|
||||
find_package(ZeroMQ 4
|
||||
NO_DEFAULT_PATH
|
||||
HINTS ${ZeroMQ_HINT}
|
||||
)
|
||||
else()
|
||||
find_package(ZeroMQ 4 QUIET)
|
||||
endif()
|
||||
|
||||
# libzmq autotools install: fallback to pkg-config
|
||||
if(ZeroMQ_FOUND)
|
||||
message(STATUS "Found libzmq using find_package")
|
||||
else()
|
||||
message(STATUS "CMake libzmq package not found, trying again with pkg-config (normal install of zeromq)")
|
||||
list (APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_LIST_DIR}/cmake/libzmq-pkg-config)
|
||||
find_package(ZeroMQ 4 REQUIRED)
|
||||
endif()
|
||||
|
||||
# TODO "REQUIRED" above should already cause a fatal failure if not found, but this doesn't seem to work
|
||||
if(NOT ZeroMQ_FOUND)
|
||||
message(FATAL_ERROR "ZeroMQ was not found, neither as a CMake package nor via pkg-config")
|
||||
endif()
|
||||
|
||||
if (ZeroMQ_FOUND AND NOT TARGET libzmq)
|
||||
message(FATAL_ERROR "ZeroMQ version not supported!")
|
||||
endif()
|
||||
endif()
|
||||
|
||||
get_target_property(VAR libzmq IMPORTED_LOCATION)
|
||||
message(STATUS "Using libzmq: ${VAR}")
|
||||
|
||||
|
||||
endfunction()
|
36
cmake/libzmq-pkg-config/FindZeroMQ.cmake
Executable file
36
cmake/libzmq-pkg-config/FindZeroMQ.cmake
Executable file
@ -0,0 +1,36 @@
|
||||
#From: https://github.com/zeromq/cppzmq/
|
||||
set(PKG_CONFIG_USE_CMAKE_PREFIX_PATH ON)
|
||||
find_package(PkgConfig)
|
||||
pkg_check_modules(PC_LIBZMQ QUIET libzmq)
|
||||
|
||||
set(ZeroMQ_VERSION ${PC_LIBZMQ_VERSION})
|
||||
|
||||
find_path(ZeroMQ_INCLUDE_DIR zmq.h
|
||||
PATHS ${ZeroMQ_DIR}/include
|
||||
${PC_LIBZMQ_INCLUDE_DIRS}
|
||||
)
|
||||
|
||||
find_library(ZeroMQ_LIBRARY
|
||||
NAMES zmq
|
||||
PATHS ${ZeroMQ_DIR}/lib
|
||||
${PC_LIBZMQ_LIBDIR}
|
||||
${PC_LIBZMQ_LIBRARY_DIRS}
|
||||
)
|
||||
|
||||
if(ZeroMQ_LIBRARY OR ZeroMQ_STATIC_LIBRARY)
|
||||
set(ZeroMQ_FOUND ON)
|
||||
message(STATUS "Found libzmq using PkgConfig")
|
||||
endif()
|
||||
|
||||
set ( ZeroMQ_LIBRARIES ${ZeroMQ_LIBRARY} )
|
||||
set ( ZeroMQ_INCLUDE_DIRS ${ZeroMQ_INCLUDE_DIR} )
|
||||
|
||||
if (NOT TARGET libzmq)
|
||||
add_library(libzmq UNKNOWN IMPORTED)
|
||||
set_target_properties(libzmq PROPERTIES
|
||||
IMPORTED_LOCATION ${ZeroMQ_LIBRARIES}
|
||||
INTERFACE_INCLUDE_DIRECTORIES ${ZeroMQ_INCLUDE_DIRS})
|
||||
endif()
|
||||
|
||||
include ( FindPackageHandleStandardArgs )
|
||||
find_package_handle_standard_args ( ZeroMQ DEFAULT_MSG ZeroMQ_LIBRARIES ZeroMQ_INCLUDE_DIRS )
|
@ -25,6 +25,11 @@ install(FILES
|
||||
DESTINATION ${CMAKE_INSTALL_DIR}
|
||||
)
|
||||
|
||||
install(FILES
|
||||
"${CMAKE_SOURCE_DIR}/cmake/libzmq-pkg-config/FindZeroMQ.cmake"
|
||||
COMPONENT devel
|
||||
DESTINATION ${CMAKE_INSTALL_DIR}/libzmq-pkg-config
|
||||
)
|
||||
|
||||
if (PROJECT_LIBRARIES OR PROJECT_STATIC_LIBRARIES)
|
||||
install(
|
||||
|
@ -13,6 +13,17 @@ include(CMakeFindDependencyMacro)
|
||||
set(SLS_USE_HDF5 "@SLS_USE_HDF5@")
|
||||
|
||||
|
||||
find_package(ZeroMQ 4 QUIET)
|
||||
# libzmq autotools install: fallback to pkg-config
|
||||
if(NOT ZeroMQ_FOUND)
|
||||
list (APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_LIST_DIR}/libzmq-pkg-config)
|
||||
find_package(ZeroMQ 4 REQUIRED)
|
||||
endif()
|
||||
|
||||
if(NOT ZeroMQ_FOUND)
|
||||
message(FATAL_ERROR "ZeroMQ was NOT found!")
|
||||
endif()
|
||||
|
||||
find_dependency(Threads)
|
||||
|
||||
# Add optional dependencies here
|
||||
|
119
cmk.sh
119
cmk.sh
@ -26,25 +26,25 @@ CMAKE_PRE=""
|
||||
CMAKE_POST=""
|
||||
|
||||
usage() { echo -e "
|
||||
Usage: $0 [-b] [-c] [-d <HDF5 directory>] [-e] [-g] [-h] [-i] [-j <Number of threads>] [-k <CMake command>] [-l <Install directory>] [-m] [-n] [-p] [-r] [-s] [-t] [-u] [-z]
|
||||
Usage: $0 [-c] [-b] [-p] [e] [t] [r] [g] [s] [u] [i] [m] [n] [-h] [z] [-d <HDF5 directory>] [-l Install directory] [-k <CMake command>] [-j <Number of threads>]
|
||||
-[no option]: only make
|
||||
-b: Builds/Rebuilds CMake files normal mode
|
||||
-c: Clean
|
||||
-d: HDF5 Custom Directory
|
||||
-e: Debug mode
|
||||
-g: Build/Rebuilds gui
|
||||
-b: Builds/Rebuilds CMake files normal mode
|
||||
-p: Builds/Rebuilds Python API
|
||||
-h: Builds/Rebuilds Cmake files with HDF5 package
|
||||
-i: Builds tests
|
||||
-j: Number of threads to compile through
|
||||
-d: HDF5 Custom Directory
|
||||
-k: CMake command
|
||||
-l: Install directory
|
||||
-t: Build/Rebuilds only text client
|
||||
-r: Build/Rebuilds only receiver
|
||||
-g: Build/Rebuilds only gui
|
||||
-s: Simulator
|
||||
-u: Chip Test Gui
|
||||
-j: Number of threads to compile through
|
||||
-e: Debug mode
|
||||
-i: Builds tests
|
||||
-m: Manuals
|
||||
-n: Manuals without compiling doxygen (only rst)
|
||||
-p: Builds/Rebuilds Python API
|
||||
-r: Build/Rebuilds only receiver
|
||||
-s: Simulator
|
||||
-t: Build/Rebuilds only text client
|
||||
-u: Chip Test Gui
|
||||
-z: Moench zmq processor
|
||||
|
||||
Rebuild when you switch to a new build and compile in parallel:
|
||||
@ -81,50 +81,69 @@ For rebuilding only certain sections
|
||||
|
||||
" ; exit 1; }
|
||||
|
||||
while getopts ":bcd:eghij:k:l:mnpq:rstuz" opt ; do
|
||||
while getopts ":bpchd:k:l:j:trgeisumnz" opt ; do
|
||||
case $opt in
|
||||
b)
|
||||
echo "Building of CMake files Required"
|
||||
REBUILD=1
|
||||
;;
|
||||
p)
|
||||
echo "Compiling Options: Python"
|
||||
PYTHON=1
|
||||
REBUILD=1
|
||||
;;
|
||||
c)
|
||||
echo "Clean Required"
|
||||
CLEAN=1
|
||||
;;
|
||||
d)
|
||||
echo "New HDF5 directory: $OPTARG"
|
||||
HDF5DIR=$OPTARG
|
||||
;;
|
||||
e)
|
||||
echo "Compiling Options: Debug"
|
||||
DEBUG=1
|
||||
;;
|
||||
g)
|
||||
echo "Compiling Options: GUI"
|
||||
GUI=1
|
||||
REBUILD=1
|
||||
;;
|
||||
h)
|
||||
echo "Building of CMake files with HDF5 option Required"
|
||||
HDF5=1
|
||||
REBUILD=1
|
||||
;;
|
||||
i)
|
||||
echo "Compiling Options: Tests"
|
||||
TESTS=1
|
||||
;;
|
||||
j)
|
||||
echo "Number of compiler threads: $OPTARG"
|
||||
COMPILERTHREADS=$OPTARG
|
||||
;;
|
||||
k)
|
||||
echo "CMake command: $OPTARG"
|
||||
CMAKE="$OPTARG"
|
||||
d)
|
||||
echo "New HDF5 directory: $OPTARG"
|
||||
HDF5DIR=$OPTARG
|
||||
;;
|
||||
l)
|
||||
echo "CMake install directory: $OPTARG"
|
||||
INSTALLDIR="$OPTARG"
|
||||
;;
|
||||
k)
|
||||
echo "CMake command: $OPTARG"
|
||||
CMAKE="$OPTARG"
|
||||
;;
|
||||
j)
|
||||
echo "Number of compiler threads: $OPTARG"
|
||||
COMPILERTHREADS=$OPTARG
|
||||
;;
|
||||
t)
|
||||
echo "Compiling Options: Text Client"
|
||||
TEXTCLIENT=1
|
||||
REBUILD=1
|
||||
;;
|
||||
r)
|
||||
echo "Compiling Options: Receiver"
|
||||
RECEIVER=1
|
||||
REBUILD=1
|
||||
;;
|
||||
g)
|
||||
echo "Compiling Options: GUI"
|
||||
GUI=1
|
||||
REBUILD=1
|
||||
;;
|
||||
e)
|
||||
echo "Compiling Options: Debug"
|
||||
DEBUG=1
|
||||
;;
|
||||
i)
|
||||
echo "Compiling Options: Tests"
|
||||
TESTS=1
|
||||
;;
|
||||
s)
|
||||
echo "Compiling Options: Simulator"
|
||||
SIMULATOR=1
|
||||
;;
|
||||
m)
|
||||
echo "Compiling Manuals"
|
||||
MANUALS=1
|
||||
@ -133,33 +152,14 @@ while getopts ":bcd:eghij:k:l:mnpq:rstuz" opt ; do
|
||||
echo "Compiling Manuals (Only RST)"
|
||||
MANUALS_ONLY_RST=1
|
||||
;;
|
||||
p)
|
||||
echo "Compiling Options: Python"
|
||||
PYTHON=1
|
||||
REBUILD=1
|
||||
;;
|
||||
r)
|
||||
echo "Compiling Options: Receiver"
|
||||
RECEIVER=1
|
||||
REBUILD=1
|
||||
;;
|
||||
s)
|
||||
echo "Compiling Options: Simulator"
|
||||
SIMULATOR=1
|
||||
;;
|
||||
t)
|
||||
echo "Compiling Options: Text Client"
|
||||
TEXTCLIENT=1
|
||||
REBUILD=1
|
||||
z)
|
||||
echo "Compiling Moench Zmq Processor"
|
||||
MOENCHZMQ=1
|
||||
;;
|
||||
u)
|
||||
echo "Compiling Options: Chip Test Gui"
|
||||
CTBGUI=1
|
||||
;;
|
||||
z)
|
||||
echo "Compiling Moench Zmq Processor"
|
||||
MOENCHZMQ=1
|
||||
;;
|
||||
\?)
|
||||
echo "Invalid option: -$OPTARG"
|
||||
usage
|
||||
@ -254,6 +254,7 @@ if [ $TESTS -eq 1 ]; then
|
||||
echo "Tests Option enabled"
|
||||
fi
|
||||
|
||||
|
||||
#hdf5 rebuild
|
||||
if [ $HDF5 -eq 1 ]; then
|
||||
# CMAKE_PRE+="HDF5_ROOT="$HDF5DIR
|
||||
|
@ -1,7 +0,0 @@
|
||||
python:
|
||||
- 3.8
|
||||
- 3.9
|
||||
- 3.10
|
||||
- 3.11
|
||||
- 3.12
|
||||
|
@ -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,5 +0,0 @@
|
||||
# SPDX-License-Identifier: LGPL-3.0-or-other
|
||||
# Copyright (C) 2021 Contributors to the SLS Detector Package
|
||||
#Copy the GUI
|
||||
mkdir -p $PREFIX/bin
|
||||
cp build/install/bin/slsDetectorGui $PREFIX/bin/.
|
@ -1,22 +0,0 @@
|
||||
# SPDX-License-Identifier: LGPL-3.0-or-other
|
||||
# Copyright (C) 2021 Contributors to the SLS Detector Package
|
||||
|
||||
mkdir -p $PREFIX/lib
|
||||
mkdir -p $PREFIX/bin
|
||||
mkdir -p $PREFIX/include/sls
|
||||
# mkdir $PREFIX/include/slsDetectorPackage
|
||||
|
||||
#Shared and static libraries
|
||||
cp build/install/lib/* $PREFIX/lib/
|
||||
|
||||
#Binaries
|
||||
cp build/install/bin/sls_detector_acquire $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_help $PREFIX/bin/.
|
||||
cp build/install/bin/slsReceiver $PREFIX/bin/.
|
||||
cp build/install/bin/slsMultiReceiver $PREFIX/bin/.
|
||||
|
||||
|
||||
cp build/install/include/sls/* $PREFIX/include/sls
|
||||
cp -rv build/install/share $PREFIX
|
@ -1,6 +0,0 @@
|
||||
# SPDX-License-Identifier: LGPL-3.0-or-other
|
||||
# Copyright (C) 2021 Contributors to the SLS Detector Package
|
||||
|
||||
#Copy the Moench executables
|
||||
mkdir -p $PREFIX/bin
|
||||
cp build/install/bin/moench* $PREFIX/bin/.
|
@ -1,126 +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.11
|
||||
|
||||
host:
|
||||
- python
|
||||
- {{ pin_subpackage('slsdetlib', exact=True) }}
|
||||
- pybind11=2.11
|
||||
|
||||
|
||||
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
|
24
conda-recipes/ctbgui/build.sh
Executable file
24
conda-recipes/ctbgui/build.sh
Executable file
@ -0,0 +1,24 @@
|
||||
# SPDX-License-Identifier: LGPL-3.0-or-other
|
||||
# Copyright (C) 2021 Contributors to the SLS Detector Package
|
||||
|
||||
mkdir build
|
||||
|
||||
cd build
|
||||
cmake .. \
|
||||
-DCMAKE_PREFIX_PATH=$CONDA_PREFIX \
|
||||
-DCMAKE_INSTALL_PREFIX=$PREFIX \
|
||||
-DSLS_USE_CTBGUI=ON \
|
||||
-DSLS_EXT_BUILD=ON\
|
||||
-DCMAKE_BUILD_TYPE=Release \
|
||||
-DSLS_USE_HDF5=OFF\
|
||||
|
||||
NCORES=$(getconf _NPROCESSORS_ONLN)
|
||||
echo "Building using: ${NCORES} cores"
|
||||
cmake --build . -- -j${NCORES}
|
||||
cmake --build . --target install
|
||||
|
||||
CTEST_OUTPUT_ON_FAILURE=1 ctest -j 2
|
||||
|
||||
#Clean up for the next build
|
||||
# cd ..
|
||||
# rm -rf build
|
94
conda-recipes/ctbgui/meta.yaml
Normal file
94
conda-recipes/ctbgui/meta.yaml
Normal file
@ -0,0 +1,94 @@
|
||||
package:
|
||||
name: ctbgui
|
||||
version: {{ environ.get('GIT_DESCRIBE_TAG', '') }}
|
||||
|
||||
source:
|
||||
- path: ../..
|
||||
|
||||
build:
|
||||
number: 0
|
||||
binary_relocation: True
|
||||
rpaths:
|
||||
- lib/
|
||||
|
||||
requirements:
|
||||
build:
|
||||
- {{ compiler('c') }}
|
||||
- {{compiler('cxx')}}
|
||||
- slsdetlib {{ environ.get('GIT_DESCRIBE_TAG', '') }}
|
||||
- cmake
|
||||
- root
|
||||
# - qwt 6.*
|
||||
# - qt 4.8.*
|
||||
# - zeromq
|
||||
# - 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
|
||||
- root
|
||||
- slsdetlib {{ environ.get('GIT_DESCRIBE_TAG', '') }}
|
||||
# - zeromq
|
||||
# - xorg-libx11
|
||||
# - xorg-libice
|
||||
# - xorg-libxext
|
||||
# - xorg-libsm
|
||||
# - xorg-libxau
|
||||
# - xorg-libxrender
|
||||
# - xorg-libxfixes
|
||||
# - expat
|
||||
|
||||
run:
|
||||
# - zeromq
|
||||
- libstdcxx-ng
|
||||
- libgcc-ng
|
||||
- root
|
||||
# - slsdetlib {{ environ.get('GIT_DESCRIBE_TAG', '') }}
|
||||
# - qwt 6.*
|
||||
# - qt 4.8.*
|
||||
# - expat
|
||||
|
||||
|
||||
|
||||
# - name: slsdetgui
|
||||
# script: copy_gui.sh
|
||||
# requirements:
|
||||
|
||||
# build:
|
||||
# - {{ compiler('c') }}
|
||||
# - {{compiler('cxx')}}
|
||||
# - {{ pin_subpackage('slsdetlib', exact=True) }}
|
||||
# - qwt 6.*
|
||||
|
||||
# run:
|
||||
# - {{ pin_subpackage('slsdetlib', exact=True) }}
|
||||
# - qwt 6.*
|
||||
# - qt 4.8.*
|
||||
# - 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
|
25
conda-recipes/moenchzmq/build.sh
Executable file
25
conda-recipes/moenchzmq/build.sh
Executable file
@ -0,0 +1,25 @@
|
||||
# SPDX-License-Identifier: LGPL-3.0-or-other
|
||||
# Copyright (C) 2021 Contributors to the SLS Detector Package
|
||||
|
||||
mkdir build
|
||||
|
||||
cd build
|
||||
cmake .. \
|
||||
-DCMAKE_PREFIX_PATH=$CONDA_PREFIX \
|
||||
-DCMAKE_INSTALL_PREFIX=$PREFIX \
|
||||
-DSLS_USE_MOENCH=ON\
|
||||
-DSLS_USE_TESTS=ON \
|
||||
-DSLS_EXT_BUILD=ON \
|
||||
-DCMAKE_BUILD_TYPE=Release \
|
||||
-DSLS_USE_HDF5=OFF\
|
||||
|
||||
NCORES=$(getconf _NPROCESSORS_ONLN)
|
||||
echo "Building using: ${NCORES} cores"
|
||||
cmake --build . -- -j${NCORES}
|
||||
cmake --build . --target install
|
||||
|
||||
CTEST_OUTPUT_ON_FAILURE=1 ctest -j 2
|
||||
|
||||
#Clean up for the next build
|
||||
# cd ..
|
||||
# rm -rf build
|
36
conda-recipes/moenchzmq/meta.yaml
Executable file
36
conda-recipes/moenchzmq/meta.yaml
Executable file
@ -0,0 +1,36 @@
|
||||
|
||||
package:
|
||||
name: moenchzmq
|
||||
version: {{ environ.get('GIT_DESCRIBE_TAG', '') }}
|
||||
|
||||
source:
|
||||
- path: ../..
|
||||
|
||||
build:
|
||||
number: 0
|
||||
binary_relocation: True
|
||||
rpaths:
|
||||
- lib/
|
||||
|
||||
requirements:
|
||||
build:
|
||||
- {{ compiler('c') }}
|
||||
- {{compiler('cxx')}}
|
||||
- cmake
|
||||
- libstdcxx-ng
|
||||
- libgcc-ng
|
||||
- zeromq
|
||||
- libtiff
|
||||
- slsdetlib {{ environ.get('GIT_DESCRIBE_TAG', '') }}
|
||||
|
||||
host:
|
||||
- zeromq
|
||||
- libtiff
|
||||
- slsdetlib {{ environ.get('GIT_DESCRIBE_TAG', '') }}
|
||||
|
||||
run:
|
||||
- libstdcxx-ng
|
||||
- libgcc-ng
|
||||
- zeromq
|
||||
- libtiff
|
||||
- slsdetlib {{ environ.get('GIT_DESCRIBE_TAG', '') }}
|
4
conda-recepie/build_pylib.sh → conda-recipes/slsdet/build.sh
Executable file → Normal file
4
conda-recepie/build_pylib.sh → conda-recipes/slsdet/build.sh
Executable file → Normal file
@ -2,5 +2,7 @@
|
||||
# Copyright (C) 2021 Contributors to the SLS Detector Package
|
||||
|
||||
echo "|<-------- starting python build"
|
||||
echo $PWD
|
||||
cd python
|
||||
${PYTHON} setup.py install
|
||||
echo "folder: $PWD"
|
||||
${PYTHON} setup.py install
|
2
conda-recipes/slsdet/conda_build_config.yaml
Normal file
2
conda-recipes/slsdet/conda_build_config.yaml
Normal file
@ -0,0 +1,2 @@
|
||||
python:
|
||||
- 3.9
|
34
conda-recipes/slsdet/meta.yaml
Executable file
34
conda-recipes/slsdet/meta.yaml
Executable file
@ -0,0 +1,34 @@
|
||||
|
||||
package:
|
||||
name: slsdet
|
||||
version: {{ environ.get('GIT_DESCRIBE_TAG', '') }}
|
||||
|
||||
source:
|
||||
- path: ../..
|
||||
|
||||
build:
|
||||
number: 0
|
||||
binary_relocation: True
|
||||
rpaths:
|
||||
- lib/
|
||||
|
||||
requirements:
|
||||
build:
|
||||
- python
|
||||
- {{ compiler('c') }}
|
||||
- {{compiler('cxx')}}
|
||||
- cmake
|
||||
- slsdetlib {{ environ.get('GIT_DESCRIBE_TAG', '') }}
|
||||
- setuptools
|
||||
|
||||
host:
|
||||
- python
|
||||
- slsdetlib {{ environ.get('GIT_DESCRIBE_TAG', '') }}
|
||||
|
||||
|
||||
run:
|
||||
- libstdcxx-ng
|
||||
- libgcc-ng
|
||||
- python
|
||||
- numpy
|
||||
- slsdetlib {{ environ.get('GIT_DESCRIBE_TAG', '') }}
|
24
conda-recipes/slsdetgui/build.sh
Executable file
24
conda-recipes/slsdetgui/build.sh
Executable file
@ -0,0 +1,24 @@
|
||||
# SPDX-License-Identifier: LGPL-3.0-or-other
|
||||
# Copyright (C) 2021 Contributors to the SLS Detector Package
|
||||
|
||||
mkdir build
|
||||
|
||||
cd build
|
||||
cmake .. \
|
||||
-DCMAKE_PREFIX_PATH=$CONDA_PREFIX \
|
||||
-DCMAKE_INSTALL_PREFIX=$PREFIX \
|
||||
-DSLS_USE_GUI=ON \
|
||||
-DSLS_EXT_BUILD=ON\
|
||||
-DCMAKE_BUILD_TYPE=Release \
|
||||
-DSLS_USE_HDF5=OFF\
|
||||
|
||||
NCORES=$(getconf _NPROCESSORS_ONLN)
|
||||
echo "Building using: ${NCORES} cores"
|
||||
cmake --build . -- -j${NCORES}
|
||||
cmake --build . --target install
|
||||
|
||||
CTEST_OUTPUT_ON_FAILURE=1 ctest -j 2
|
||||
|
||||
#Clean up for the next build
|
||||
# cd ..
|
||||
# rm -rf build
|
91
conda-recipes/slsdetgui/meta.yaml
Normal file
91
conda-recipes/slsdetgui/meta.yaml
Normal file
@ -0,0 +1,91 @@
|
||||
package:
|
||||
name: slsdetgui
|
||||
version: {{ environ.get('GIT_DESCRIBE_TAG', '') }}
|
||||
|
||||
source:
|
||||
- path: ../..
|
||||
|
||||
build:
|
||||
number: 0
|
||||
binary_relocation: True
|
||||
rpaths:
|
||||
- lib/
|
||||
|
||||
requirements:
|
||||
build:
|
||||
- {{ compiler('c') }}
|
||||
- {{compiler('cxx')}}
|
||||
- slsdetlib {{ environ.get('GIT_DESCRIBE_TAG', '') }}
|
||||
- cmake
|
||||
- qwt 6.*
|
||||
- qt 4.8.*
|
||||
- zeromq
|
||||
- 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
|
||||
- slsdetlib {{ environ.get('GIT_DESCRIBE_TAG', '') }}
|
||||
- zeromq
|
||||
- xorg-libx11
|
||||
- xorg-libice
|
||||
- xorg-libxext
|
||||
- xorg-libsm
|
||||
- xorg-libxau
|
||||
- xorg-libxrender
|
||||
- xorg-libxfixes
|
||||
- expat
|
||||
|
||||
run:
|
||||
- zeromq
|
||||
- libstdcxx-ng
|
||||
- libgcc-ng
|
||||
- slsdetlib {{ environ.get('GIT_DESCRIBE_TAG', '') }}
|
||||
- qwt 6.*
|
||||
- qt 4.8.*
|
||||
- expat
|
||||
|
||||
|
||||
|
||||
# - name: slsdetgui
|
||||
# script: copy_gui.sh
|
||||
# requirements:
|
||||
|
||||
# build:
|
||||
# - {{ compiler('c') }}
|
||||
# - {{compiler('cxx')}}
|
||||
# - {{ pin_subpackage('slsdetlib', exact=True) }}
|
||||
# - qwt 6.*
|
||||
|
||||
# run:
|
||||
# - {{ pin_subpackage('slsdetlib', exact=True) }}
|
||||
# - qwt 6.*
|
||||
# - qt 4.8.*
|
||||
# - 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
|
@ -2,17 +2,18 @@
|
||||
# Copyright (C) 2021 Contributors to the SLS Detector Package
|
||||
|
||||
mkdir build
|
||||
mkdir install
|
||||
|
||||
cd build
|
||||
cmake .. \
|
||||
-DCMAKE_PREFIX_PATH=$CONDA_PREFIX \
|
||||
-DCMAKE_INSTALL_PREFIX=install \
|
||||
-DCMAKE_INSTALL_PREFIX=$PREFIX \
|
||||
-DSLS_USE_TEXTCLIENT=ON \
|
||||
-DSLS_USE_RECEIVER=ON \
|
||||
-DSLS_USE_GUI=ON \
|
||||
-DSLS_USE_MOENCH=ON\
|
||||
-DSLS_USE_GUI=OFF \
|
||||
-DSLS_USE_MOENCH=OFF\
|
||||
-DSLS_USE_TESTS=ON \
|
||||
-DSLS_USE_PYTHON=OFF \
|
||||
-DSLS_DEVEL_HEADERS=ON \
|
||||
-DCMAKE_BUILD_TYPE=Release \
|
||||
-DSLS_USE_HDF5=OFF\
|
||||
|
||||
@ -21,4 +22,8 @@ echo "Building using: ${NCORES} cores"
|
||||
cmake --build . -- -j${NCORES}
|
||||
cmake --build . --target install
|
||||
|
||||
CTEST_OUTPUT_ON_FAILURE=1 ctest -j 1
|
||||
CTEST_OUTPUT_ON_FAILURE=1 ctest -j 2
|
||||
|
||||
#Clean up for the next build
|
||||
# cd ..
|
||||
# rm -rf build
|
90
conda-recipes/slsdetlib/meta.yaml
Executable file
90
conda-recipes/slsdetlib/meta.yaml
Executable file
@ -0,0 +1,90 @@
|
||||
|
||||
package:
|
||||
name: slsdetlib
|
||||
version: {{ environ.get('GIT_DESCRIBE_TAG', '') }}
|
||||
|
||||
source:
|
||||
- path: ../..
|
||||
|
||||
build:
|
||||
number: 0
|
||||
binary_relocation: True
|
||||
rpaths:
|
||||
- lib/
|
||||
|
||||
requirements:
|
||||
build:
|
||||
- {{ compiler('c') }}
|
||||
- {{compiler('cxx')}}
|
||||
- cmake
|
||||
- libstdcxx-ng
|
||||
- libgcc-ng
|
||||
- zeromq
|
||||
|
||||
host:
|
||||
- zeromq
|
||||
|
||||
run:
|
||||
- libstdcxx-ng
|
||||
- libgcc-ng
|
||||
- zeromq
|
||||
|
||||
|
||||
# outputs:
|
||||
# - name: slsdetlib
|
||||
# script: build_lib.sh
|
||||
|
||||
# requirements:
|
||||
# build:
|
||||
# - {{ compiler('c') }}
|
||||
# - {{compiler('cxx')}}
|
||||
# - libstdcxx-ng
|
||||
# - libgcc-ng
|
||||
# - zeromq
|
||||
|
||||
# host:
|
||||
# - zeromq
|
||||
|
||||
# run:
|
||||
# - libstdcxx-ng
|
||||
# - libgcc-ng
|
||||
# - zeromq
|
||||
|
||||
# - name: slsdet
|
||||
# script: build_py.sh
|
||||
|
||||
# requirements:
|
||||
# build:
|
||||
# - python
|
||||
# - {{ compiler('c') }}
|
||||
# - {{compiler('cxx')}}
|
||||
# - {{ pin_subpackage('slsdetlib', exact=True) }}
|
||||
# - setuptools
|
||||
|
||||
# host:
|
||||
# - python
|
||||
# - {{ pin_subpackage('slsdetlib', exact=True) }}
|
||||
|
||||
|
||||
# run:
|
||||
# - libstdcxx-ng
|
||||
# - libgcc-ng
|
||||
# - python
|
||||
# - numpy
|
||||
# - {{ pin_subpackage('slsdetlib', exact=True) }}
|
||||
|
||||
# - name: slsdetgui
|
||||
# script: build_gui.sh
|
||||
# requirements:
|
||||
|
||||
# build:
|
||||
# - {{ compiler('c') }}
|
||||
# - {{compiler('cxx')}}
|
||||
# - {{ pin_subpackage('slsdetlib', exact=True) }}
|
||||
# - qwt 6.*
|
||||
|
||||
# run:
|
||||
# - {{ pin_subpackage('slsdetlib', exact=True) }}
|
||||
# - qwt 6.*
|
||||
# - qt 4.8.*
|
||||
# - expat
|
@ -83,8 +83,12 @@ target_link_libraries(ctbGui PUBLIC
|
||||
${TIFF_LIBRARIES}
|
||||
)
|
||||
|
||||
set_target_properties(ctbGui PROPERTIES
|
||||
RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin
|
||||
|
||||
)
|
||||
#set_target_properties(ctbGui PROPERTIES
|
||||
# RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin
|
||||
#
|
||||
#)
|
||||
|
||||
install(TARGETS ctbGui ctbRootLib
|
||||
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
|
||||
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
|
||||
)
|
@ -828,14 +828,14 @@ void ctbAcquisition::setCanvas(TCanvas* c) {
|
||||
myCanvas->AddExec("dynamic",Form("((ctbAcquisition*)%p)->canvasClicked()",this));
|
||||
// myCanvas->AddExec("ex","canvasClicked()");
|
||||
}
|
||||
void ctbAcquisition::dataCallback(sls::detectorData *data, long unsigned int index, unsigned int dum, void* pArgs) {
|
||||
void ctbAcquisition::dataCallback(detectorData *data, long unsigned int index, unsigned int dum, void* pArgs) {
|
||||
|
||||
// return
|
||||
((ctbAcquisition*)pArgs)->plotData(data,index);
|
||||
}
|
||||
|
||||
|
||||
int ctbAcquisition::plotData(sls::detectorData *data, int index) {
|
||||
int ctbAcquisition::plotData(detectorData *data, int index) {
|
||||
|
||||
/*
|
||||
******************************************************************
|
||||
@ -988,7 +988,7 @@ sample1 (dbit0 + dbit1 +...)if (cmd == "rx_dbitlist") {
|
||||
ped=0;
|
||||
aval=dataStructure->getValue(data->data,x,y);
|
||||
//aval=dataStructure->getChannel(data->data,x,y);
|
||||
// cout << x << " " <<y << " "<< aval << endl;
|
||||
cout << x << " " <<y << " "<< aval << endl;
|
||||
if (cbGetPedestal->IsOn()) {
|
||||
if (photonFinder) {
|
||||
photonFinder->addToPedestal(aval,x,y);
|
||||
|
@ -28,8 +28,8 @@ class TGTextButton;
|
||||
namespace sls
|
||||
{
|
||||
class Detector;
|
||||
class detectorData;
|
||||
};
|
||||
class detectorData;
|
||||
|
||||
template <class dataType> class slsDetectorData;
|
||||
|
||||
@ -201,10 +201,10 @@ class ctbAcquisition : public TGGroupFrame {
|
||||
void setBitGraph (int i ,int en, Pixel_t col);
|
||||
void startAcquisition();
|
||||
static void progressCallback(double,void*);
|
||||
static void dataCallback(sls::detectorData*, long unsigned int, unsigned int, void*);
|
||||
static void dataCallback(detectorData*, long unsigned int, unsigned int, void*);
|
||||
int StopFlag;
|
||||
|
||||
int plotData(sls::detectorData*, int);
|
||||
int plotData(detectorData*, int);
|
||||
|
||||
void setPatternFile(const char* t);
|
||||
|
||||
|
112
ctbGui/patternGenerator/deserializer.cpp
Normal file
112
ctbGui/patternGenerator/deserializer.cpp
Normal file
@ -0,0 +1,112 @@
|
||||
// SPDX-License-Identifier: LGPL-3.0-or-other
|
||||
// Copyright (C) 2021 Contributors to the SLS Detector Package
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <stdint.h>
|
||||
#include <string.h>
|
||||
#include <sys/utsname.h>
|
||||
#include <sys/types.h>
|
||||
#include <unistd.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
#include <errno.h>
|
||||
#include <math.h>
|
||||
#include <fcntl.h>
|
||||
#include <stdarg.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
|
||||
int main(int argc, char *argv[]) {
|
||||
|
||||
int iarg;
|
||||
char fname[10000];
|
||||
uint64_t word;
|
||||
int val[64];
|
||||
int bit[64];
|
||||
FILE *fdin;
|
||||
|
||||
int nb=2;
|
||||
int off=0;
|
||||
int ioff=0;
|
||||
int dr=24;
|
||||
int idr=0;
|
||||
int ib=0;
|
||||
int iw=0;
|
||||
bit[0]=19;
|
||||
bit[1]=8;
|
||||
// for (iarg=0; iarg<argc; iarg++) printf("%d %s\n",iarg, argv[iarg]);
|
||||
|
||||
if (argc<2) printf("Error: usage is %s fname [dr off b0 b1 bn]\n");
|
||||
|
||||
if (argc>2) dr=atoi(argv[2]);
|
||||
if (argc>3) off=atoi(argv[3]);
|
||||
if (argc>4) {
|
||||
for (ib=0; ib<64; ib++) {
|
||||
if (argc>4+ib) {
|
||||
bit[ib]=atoi(argv[4+ib]);
|
||||
nb++;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
idr=0;
|
||||
for (ib=0; ib<nb; ib++) {
|
||||
val[ib]=0;
|
||||
}
|
||||
|
||||
|
||||
fdin=fopen(argv[1],"rb");
|
||||
if (fdin==NULL) {
|
||||
printf("Cannot open input file %s for reading\n",argv[1]);
|
||||
return 200;
|
||||
}
|
||||
|
||||
while (fread((void*)&word, 8, 1, fdin)) {
|
||||
// printf("%llx\n",word);
|
||||
if (ioff<off) ioff++;
|
||||
else {
|
||||
|
||||
for (ib=0; ib<nb; ib++) {
|
||||
if (word&(1<<bit[ib])) val[ib]|=(1<<idr);
|
||||
}
|
||||
idr++;
|
||||
if (idr==dr) {
|
||||
idr=0;
|
||||
fprintf(stdout,"%d\t",iw++);
|
||||
for (ib=0; ib<nb; ib++) {
|
||||
#ifdef HEX
|
||||
fprintf(stdout,"%08llx\t",val[ib]);
|
||||
#else
|
||||
fprintf(stdout,"%lld\t",val[ib]);
|
||||
|
||||
#endif
|
||||
|
||||
val[ib]=0;
|
||||
}
|
||||
fprintf(stdout,"\n");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
if (idr!=0) {
|
||||
fprintf(stdout,"%d\t",iw++);
|
||||
for (ib=0; ib<nb; ib++) {
|
||||
#ifdef HEX
|
||||
fprintf(stdout,"%08llx\t",val[ib]);
|
||||
#else
|
||||
fprintf(stdout,"%lld\t",val[ib]);
|
||||
|
||||
#endif
|
||||
|
||||
val[ib]=0;
|
||||
}
|
||||
fprintf(stdout,"\n");
|
||||
}
|
||||
|
||||
fclose(fdin);
|
||||
|
||||
return 0;
|
||||
}
|
179
ctbGui/patternGenerator/generator.c
Normal file
179
ctbGui/patternGenerator/generator.c
Normal file
@ -0,0 +1,179 @@
|
||||
// SPDX-License-Identifier: LGPL-3.0-or-other
|
||||
// Copyright (C) 2021 Contributors to the SLS Detector Package
|
||||
/****************************************************************************
|
||||
usage to generate a patter test.pat from test.p
|
||||
|
||||
gcc -DINFILE="\"test.p\"" -DOUTFILE="\"test.pat\"" -o test.exe generator.c ; ./test.exe ; rm test.exe
|
||||
|
||||
|
||||
*************************************************************************/
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <stdint.h>
|
||||
#include <string.h>
|
||||
#include <sys/utsname.h>
|
||||
#include <sys/types.h>
|
||||
#include <unistd.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
#include <errno.h>
|
||||
#include <math.h>
|
||||
#include <fcntl.h>
|
||||
#include <stdarg.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#define MAXLOOPS 3
|
||||
#define MAXTIMERS 3
|
||||
#define MAXWORDS 1024
|
||||
|
||||
|
||||
|
||||
uint64_t pat=0;
|
||||
uint64_t iopat=0;
|
||||
uint64_t clkpat=0;
|
||||
|
||||
int iaddr=0;
|
||||
int waitaddr[3]={MAXWORDS,MAXWORDS,MAXWORDS};
|
||||
int startloopaddr[3]={MAXWORDS,MAXWORDS,MAXWORDS};
|
||||
int stoploopaddr[3]={MAXWORDS,MAXWORDS,MAXWORDS};
|
||||
int start=0, stop=0;
|
||||
uint64_t waittime[3]={0,0,0};
|
||||
int nloop[3]={0,0,0};
|
||||
|
||||
char infile[10000], outfile[10000];
|
||||
|
||||
FILE *fd, *fd1;
|
||||
uint64_t PAT[MAXWORDS];
|
||||
|
||||
|
||||
int i,ii,iii,j,jj,jjj,pixx,pixy,memx,memy,muxout,memclk,colclk,rowclk,muxclk,memcol,memrow,loopcounter;
|
||||
|
||||
void setstart() {
|
||||
start=iaddr;
|
||||
}
|
||||
|
||||
void setstop() {
|
||||
stop=iaddr;
|
||||
}
|
||||
|
||||
void setinput(int bit) {
|
||||
uint64_t mask=1;
|
||||
mask=mask<<bit;
|
||||
iopat &= ~mask;
|
||||
}
|
||||
|
||||
void setoutput(int bit) {
|
||||
uint64_t mask=1;
|
||||
mask=mask<<bit;
|
||||
iopat |= mask;
|
||||
}
|
||||
/*
|
||||
void setclk(int bit) {
|
||||
uint64_t mask=1;
|
||||
mask=mask<<bit;
|
||||
iopat |= mask;
|
||||
clkpat |= mask;
|
||||
}
|
||||
*/
|
||||
void clearbit(int bit){
|
||||
uint64_t mask=1;
|
||||
mask=mask<<bit;
|
||||
pat &= ~mask;
|
||||
}
|
||||
void setbit(int bit){
|
||||
uint64_t mask=1;
|
||||
mask=mask<<bit;
|
||||
pat |= mask;
|
||||
}
|
||||
|
||||
int checkbit(int bit) {
|
||||
uint64_t mask=1;
|
||||
mask=mask<<bit;
|
||||
return (pat & mask ) >>bit;
|
||||
}
|
||||
|
||||
void setstartloop(int iloop) {
|
||||
if (iloop>=0 && iloop<MAXLOOPS)
|
||||
startloopaddr[iloop]=iaddr;
|
||||
}
|
||||
|
||||
|
||||
void setstoploop(int iloop) {
|
||||
if (iloop>=0 && iloop<MAXLOOPS)
|
||||
stoploopaddr[iloop]=iaddr;
|
||||
}
|
||||
|
||||
|
||||
void setnloop(int iloop, int n) {
|
||||
if (iloop>=0 && iloop<MAXLOOPS)
|
||||
nloop[iloop]=n;
|
||||
}
|
||||
|
||||
void setwaitpoint(int iloop) {
|
||||
if (iloop>=0 && iloop<MAXTIMERS)
|
||||
waitaddr[iloop]=iaddr;
|
||||
}
|
||||
|
||||
|
||||
void setwaittime(int iloop, uint64_t t) {
|
||||
if (iloop>=0 && iloop<MAXTIMERS)
|
||||
waittime[iloop]=t;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
void pw(){
|
||||
if (iaddr<MAXWORDS)
|
||||
PAT[iaddr]= pat;
|
||||
fprintf(fd,"patword 0x%04x 0x%016llx\n",iaddr, pat);
|
||||
iaddr++;
|
||||
if (iaddr>=MAXWORDS) printf("ERROR: too many word in the pattern (%d instead of %d)!",iaddr, MAXWORDS);
|
||||
}
|
||||
|
||||
int parseCommand(int clk, int cmdbit, int cmd, int length) {
|
||||
int ibit;
|
||||
clearbit(clk);
|
||||
for (ibit=0; ibit<length; ibit++) {
|
||||
if (cmd&(1>>ibit))
|
||||
setbit(cmdbit);
|
||||
else
|
||||
clearbit(cmdbit);
|
||||
pw();
|
||||
/******/
|
||||
setbit(clk);
|
||||
pw();
|
||||
/******/
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
|
||||
main(void) {
|
||||
int iloop=0;
|
||||
fd=fopen(OUTFILE,"w");
|
||||
#include INFILE
|
||||
|
||||
fprintf(fd,"patioctrl 0x%016llx\n",iopat);
|
||||
//fprintf(fd,"patclkctrl 0x%016llx\n",clkpat);
|
||||
fprintf(fd,"patlimits 0x%04x 0x%04x\n",start, stop);
|
||||
|
||||
for (iloop=0; iloop<MAXLOOPS; iloop++) {
|
||||
fprintf(fd,"patloop%d 0x%04x 0x%04x\n",iloop, startloopaddr[iloop], stoploopaddr[iloop]);
|
||||
if ( startloopaddr[iloop]<0 || stoploopaddr[iloop]<= startloopaddr[iloop]) nloop[iloop]=0;
|
||||
fprintf(fd,"patnloop%d %d\n",iloop, nloop[iloop]);
|
||||
}
|
||||
|
||||
for (iloop=0; iloop<MAXTIMERS; iloop++) {
|
||||
fprintf(fd,"patwait%d 0x%04x\n",iloop, waitaddr[iloop]);
|
||||
if (waitaddr[iloop]<0) waittime[iloop]=0;
|
||||
fprintf(fd,"patwaittime%d %lld\n",iloop, waittime[iloop]);
|
||||
}
|
||||
|
||||
close((int)fd);
|
||||
fd1=fopen(OUTFILEBIN,"w");
|
||||
fwrite(PAT,sizeof(uint64_t),iaddr, fd1);
|
||||
close((int)fd1);
|
||||
}
|
201
ctbGui/patternGenerator/test.p
Executable file
201
ctbGui/patternGenerator/test.p
Executable file
@ -0,0 +1,201 @@
|
||||
//define signals and directions (Input, outputs, clocks)
|
||||
|
||||
|
||||
#define compTestIN 1
|
||||
setoutput(compTestIN);
|
||||
|
||||
#define curON 32
|
||||
setoutput(curON);
|
||||
|
||||
#define side_clk 2
|
||||
setclk(side_clk);
|
||||
|
||||
#define side_din 3
|
||||
setoutput(side_din);
|
||||
|
||||
#define clear_shr 4
|
||||
setoutput(clear_shr);
|
||||
|
||||
#define bottom_din 5
|
||||
setoutput(bottom_din);
|
||||
|
||||
#define bottom_clk 6
|
||||
setclk(bottom_clk);
|
||||
|
||||
#define gHG 7
|
||||
setoutput(gHG);
|
||||
|
||||
#define bypassCDS 31
|
||||
setoutput(bypassCDS);
|
||||
|
||||
|
||||
#define ENprechPRE 8
|
||||
setoutput(ENprechPRE);
|
||||
|
||||
|
||||
#define res 9
|
||||
setoutput(res);
|
||||
|
||||
#define pulseOFF 30
|
||||
setoutput(pulseOFF);
|
||||
|
||||
#define connCDS 27
|
||||
setoutput(connCDS);
|
||||
|
||||
#define Dsg_1 24
|
||||
setoutput(Dsg_1);
|
||||
|
||||
|
||||
#define Dsg_2 25
|
||||
setoutput(Dsg_2);
|
||||
|
||||
|
||||
#define Dsg_3 23
|
||||
setoutput(Dsg_3);
|
||||
|
||||
#define sto0 10
|
||||
setoutput(sto0);
|
||||
|
||||
#define sto1 11
|
||||
setoutput(sto1);
|
||||
|
||||
#define sto2 12
|
||||
setoutput(sto2);
|
||||
|
||||
#define resCDS 13
|
||||
setoutput(resCDS);
|
||||
|
||||
#define prechargeConnect 14
|
||||
setoutput(prechargeConnect);
|
||||
|
||||
#define pulse 15
|
||||
setoutput(pulse);
|
||||
|
||||
#define PCT_mode 21
|
||||
setoutput(PCT_mode);
|
||||
|
||||
#define res_DGS 16
|
||||
setoutput(res_DGS);
|
||||
|
||||
#define adc_ena 17
|
||||
setoutput(adc_ena);
|
||||
|
||||
|
||||
#define CLKBIT 18
|
||||
setclk(CLKBIT);
|
||||
|
||||
|
||||
#define adc_sync 63
|
||||
setoutput(adc_sync);
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
#define PW pw()
|
||||
#define SB(x) setbit(x)
|
||||
#define CB(x) clearbit(x)
|
||||
#define CLOCK clearbit(CLKBIT); pw();setbit(CLKBIT);pw()
|
||||
#define LCLOCK clearbit(CLKBIT); pw();setbit(CLKBIT);pw();clearbit(CLKBIT); pw()
|
||||
#define CLOCKS(x) for (i=0;i<x;i++) {clearbit(CLKBIT);pw(); setbit(CLKBIT); pw();}
|
||||
#define STOP setstop();
|
||||
#define START setstart();
|
||||
#define REPEAT(x) for (i=0;i<(x);i++) {pw();}
|
||||
#define DOFOR(x) for (j=0;j<(x);j++) {
|
||||
// }
|
||||
#define STARTUP1 CB(compTestIN);SB(clear_shr);CB(side_clk);CB(side_din);CB(bottom_din);CB(bottom_clk);
|
||||
#define STARTUP2 CB(pulse);SB(PCT_mode);SB(pulseOFF);CB(curON);
|
||||
#define STARTUP3 SB(res);SB(gHG);SB(ENprechPRE);
|
||||
#define STARTUP4 SB(bypassCDS); CB(connCDS);CB(sto0);SB(sto1);SB(sto2);
|
||||
#define STARTUP5 SB(resCDS);CB(Dsg_1);CB(Dsg_2);SB(Dsg_3);CB(prechargeConnect);SB(res_DGS);
|
||||
#define STARTUP STARTUP1 STARTUP2 STARTUP3 STARTUP4 STARTUP5 PW;
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
//****NOTES****//
|
||||
//FUNCTIONS
|
||||
//Declare functions at the beginning
|
||||
void load_pix(int nx, int ny)
|
||||
{//SELECT PIXEL 1,1 for readout
|
||||
SB(clear_shr);PW;PW;
|
||||
CB(clear_shr);PW;PW;PW;PW;
|
||||
|
||||
SB(side_din);PW;
|
||||
SB(side_clk);PW;
|
||||
CB(side_din);
|
||||
setstartloop(0); //loop on the rows
|
||||
SB(side_clk);PW;
|
||||
setstoploop(0); //finish loop on the rows
|
||||
setnloop(0,ny); //set number row selected -can be changed dynamically
|
||||
CB(side_clk);PW;
|
||||
SB(bottom_din);PW;
|
||||
SB(bottom_clk);PW;
|
||||
CB(bottom_din);
|
||||
setstartloop(1); //loop on the columns
|
||||
SB(bottom_clk);PW;
|
||||
setstoploop(1); //loop on the columns
|
||||
setnloop(1,ny); //set number columns selected -can be changed dynamically
|
||||
}
|
||||
|
||||
void load_col(void)
|
||||
{//SELECT COLUMN 1 for readout
|
||||
SB(clear_shr);PW;PW;
|
||||
CB(clear_shr);PW;PW;PW;PW;
|
||||
SB(bottom_din);PW;
|
||||
SB(bottom_clk);PW;
|
||||
CB(bottom_clk);PW;
|
||||
CB(bottom_din);PW;
|
||||
}
|
||||
//END of FUNCTIONS
|
||||
////////////////////////////////////////////////////////
|
||||
//LET BYPASS PREAMP AND CDS and write on preamp out.//
|
||||
//THIS ALLOWS CHECKING SOURCE FOLLOWERS //
|
||||
////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
PW;
|
||||
|
||||
SB(5); PW;
|
||||
|
||||
CB(5); PW;
|
||||
|
||||
START; //pattern starts from here
|
||||
STARTUP;
|
||||
setwaitpoint(0); //set wait points
|
||||
PW;
|
||||
setwaittime(0,20); //wait time - can be changed dynamically
|
||||
SB(adc_ena);PW;
|
||||
printf("ADC sync %x %d %llx\n",iaddr,adc_sync, pat);
|
||||
SB(adc_sync);PW;
|
||||
printf("ADC sync %x %d %llx\n",iaddr, adc_sync, pat);
|
||||
CB(gHG);
|
||||
setwaitpoint(1); //set wait points
|
||||
setwaittime(1,16); //wait time - can be changed dynamically
|
||||
CB(adc_sync);PW;
|
||||
load_pix(10, 20);
|
||||
|
||||
CB(res);
|
||||
//CB(Dsg_3);PW;
|
||||
CB(res_DGS);
|
||||
setwaitpoint(2); //set wait points
|
||||
setwaittime(2,1000); //wait time - can be changed dynamically
|
||||
|
||||
//SB(res_DGS);
|
||||
//PW;
|
||||
//SB(Dsg_3);
|
||||
//
|
||||
//CB(connCDS);
|
||||
//TEST SIGNALS END
|
||||
//
|
||||
REPEAT(20)
|
||||
|
||||
//****************//
|
||||
//*FINAL COMMANDS*//
|
||||
//****************//
|
||||
CB(adc_ena);PW;
|
||||
//STARTUP;
|
||||
STOP; PW; //stops here
|
||||
//REPEAT(4);
|
@ -55,9 +55,6 @@ set(SPHINX_SOURCE_FILES
|
||||
src/troubleshooting.rst
|
||||
src/receivers.rst
|
||||
src/slsreceiver.rst
|
||||
src/udpheader.rst
|
||||
src/udpconfig.rst
|
||||
src/udpdetspec.rst
|
||||
)
|
||||
|
||||
foreach(filename ${SPHINX_SOURCE_FILES})
|
||||
|
@ -890,7 +890,7 @@ EXCLUDE_SYMLINKS = NO
|
||||
# Note that the wildcards are matched against the file with absolute path, so to
|
||||
# exclude all test directories for example use the pattern */test/*
|
||||
|
||||
EXCLUDE_PATTERNS = */docs/* */tests/* */python/* */manual */slsDetectorServers/* */libs/* */integrationTests *README* */slsDetectorGui/* */ctbGui/* */slsDetectorCalibration/* *TobiSchluter*
|
||||
EXCLUDE_PATTERNS = */docs/* */tests/* */python/* */manual */slsDetectorServers/* */libs/* */integrationTests *README* */slsDetectorGui/* */ctbGui/* */slsDetectorCalibration/*
|
||||
|
||||
# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names
|
||||
# (namespaces, classes, functions, etc.) that should be excluded from the
|
||||
|
@ -19,7 +19,7 @@ A minimal CMakeLists.txt could look like this:
|
||||
.. code-block:: cmake
|
||||
|
||||
project(myDetectorIntegration)
|
||||
cmake_minimum_required(VERSION 3.14)
|
||||
cmake_minimum_required(VERSION 3.12)
|
||||
add_subdirectory(slsDetectorPackage)
|
||||
|
||||
#Add your executable
|
||||
@ -43,7 +43,7 @@ should be needed, otherwise specify cmake prefix path.
|
||||
|
||||
.. code-block:: cmake
|
||||
|
||||
cmake_minimum_required(VERSION 3.14)
|
||||
cmake_minimum_required(VERSION 3.12)
|
||||
project(myintegration)
|
||||
|
||||
find_package(slsDetectorPackage 5.0 REQUIRED)
|
||||
|
@ -13,36 +13,26 @@ To use the basic building blocks, meaning sls_detector_get/put and
|
||||
the shared libraries these are needed:
|
||||
|
||||
* Linux, preferably recent kernel (currently no cross platform support)
|
||||
* CMake >= 3.14
|
||||
* CMake > 3.12
|
||||
* C++11 compatible compiler. (We test with gcc and clang)
|
||||
* ZeroMQ version 4
|
||||
|
||||
-----------------------
|
||||
GUI
|
||||
-----------------------
|
||||
|
||||
The GUI is currently using Qt4 but watch out for an upgrade to 5.
|
||||
|
||||
* Qt 4.8
|
||||
* Qwt 6.1
|
||||
|
||||
-----------------------
|
||||
Python bindings
|
||||
-----------------------
|
||||
|
||||
* Python > 3.6
|
||||
* pybind11 2.11.0 (packaged in libs)
|
||||
* pybind11 (packaged in libs/)
|
||||
|
||||
.. note ::
|
||||
|
||||
Refer :ref:`pybind11 notes. <pybind for different slsDetectorPackage versions>`
|
||||
|
||||
-----------------------
|
||||
ZeroMQ
|
||||
-----------------------
|
||||
|
||||
* Zeromq 4.3.4 (packaged in libs)
|
||||
|
||||
.. note ::
|
||||
|
||||
Refer :ref:`zeromq notes. <zeromq for different slsDetectorPackage versions>`
|
||||
|
||||
-----------------------
|
||||
GUI
|
||||
-----------------------
|
||||
|
||||
* Qt 5.9
|
||||
* Qwt 6.1.5 (packaged in libs)
|
||||
|
||||
-----------------------
|
||||
Moench executables
|
||||
@ -66,6 +56,4 @@ Packaged in libs/
|
||||
|
||||
* catch2 (unit testing)
|
||||
* rapidjson (streaming from receiver)
|
||||
* pybind11 (python bindings)
|
||||
* qwt (gui plotting)
|
||||
* libzmq (streaming to/from receiver)
|
||||
* pybind11 (python bindings)
|
@ -1,19 +1,16 @@
|
||||
Detector
|
||||
==============================================
|
||||
|
||||
The sls::Detector is the public API to control
|
||||
The sls::Detector is the new public API to control
|
||||
detectors from C++. This API is also used internally
|
||||
for the Python bindings and the command line interface.
|
||||
If a receiver has been configured, this is also controlled
|
||||
If a receiver has been configured this is also controlled
|
||||
through this class.
|
||||
|
||||
Most, if not all, functions are called in parallel
|
||||
and the return value is a thin std::vector wrapper
|
||||
containing results from all modules. (:ref:`Result class<Result Class>`)
|
||||
containing results from all modules. (Result<T>)
|
||||
|
||||
Here are some :ref:`examples <Cplusplus Api Examples>` on how to use the API.
|
||||
|
||||
.. _Cplusplus Api Examples:
|
||||
.. doxygenclass:: sls::Detector
|
||||
:members:
|
||||
:undoc-members:
|
@ -1,4 +1,3 @@
|
||||
.. _Cplusplus Api Examples:
|
||||
|
||||
|
||||
|
||||
@ -54,8 +53,8 @@ then set up the detector.
|
||||
|
||||
jungfrauDetectorServer_virtual
|
||||
|
||||
This launches a virtual Jungfrau detector server. As default it uses port 1952 and 1953
|
||||
for communication over TCP. Most commands go on 1952 and only a few such as stop and status on 1953.
|
||||
This launches a virtual Jungfrau detector server. As default is uses port 1952 and 1953
|
||||
for communication over TCP. Most commands go on 1952 and only stop and status on 1953.
|
||||
|
||||
**Run example to configure**
|
||||
|
||||
@ -91,10 +90,7 @@ std::vector.
|
||||
sls::Result<int> res1{1, 1, 1};
|
||||
std::cout << "res1: " << res1 << '\n';
|
||||
res1.squash();
|
||||
# return -1 if different
|
||||
res1.squash(-1);
|
||||
# throw exception with custom message if different
|
||||
res1.tsquash("Values are different);
|
||||
|
||||
|
||||
|
||||
|
@ -92,40 +92,25 @@ Download
|
||||
Upgrade
|
||||
^^^^^^^^
|
||||
|
||||
.. warning ::
|
||||
|
||||
In case you have had issues in the past with programming via software:
|
||||
|
||||
* 6.1.2 server has a fix for seamless fpga programming
|
||||
|
||||
* We recommend first updating the on-board detector server to 6.1.2 (with client 6.1.x) using command 'updatedetectorserver' or 'copydetectorserver'.
|
||||
|
||||
* Then use command 'programfpga' to only update firmware or use command 'update' to update firmware and server to the latest release.
|
||||
.. note ::
|
||||
|
||||
These instructions are for upgrades from v5.0.0. For earlier versions, contact us.
|
||||
|
||||
|
||||
Check :ref:`firmware troubleshooting <blackfin firmware troubleshooting>` if you run into issues while programming firmware.
|
||||
|
||||
|
||||
Always ensure that the client and server software are of the same release.
|
||||
|
||||
|
||||
Program from console
|
||||
.. code-block:: bash
|
||||
|
||||
# These instructions are for upgrades from v5.0.0. For earlier versions, please contact us.
|
||||
|
||||
# Always ensure that the client and server software are of the same release.
|
||||
|
||||
# copies server, links new server to jungfrauDetectorServer,
|
||||
# copies server from tftp folder of pc, links new server to jungfrauDetectorServer,
|
||||
# removes old server from respawn, sets up new lnked server to respawn
|
||||
# programs fpga, reboots
|
||||
|
||||
# older versions: v5.0.0 - 6.0.0 using tftp from tftp folder of pc
|
||||
# programs fpga,
|
||||
# reboots
|
||||
sls_detector_put update jungfrauDetectorServervxxx pcxxx xx.pof
|
||||
|
||||
# v6.1.1 - present (copies server from the full path provided)
|
||||
sls_detector_put update jungfrauDetectorServervxxx xx.pof
|
||||
|
||||
# Or only program firmware
|
||||
sls_detector_put programfpga xxx.pof
|
||||
|
||||
@ -170,6 +155,10 @@ Upgrade
|
||||
Mythen III
|
||||
-----------
|
||||
|
||||
.. note ::
|
||||
|
||||
As it is still in development, the rbf files must be picked up from us.
|
||||
|
||||
Download
|
||||
^^^^^^^^^^^^^
|
||||
|
||||
@ -181,21 +170,16 @@ Download
|
||||
Upgrade
|
||||
^^^^^^^^
|
||||
|
||||
Always ensure that the client and server software are of the same release.
|
||||
|
||||
Program from console
|
||||
.. code-block:: bash
|
||||
|
||||
# Always ensure that the client and server software are of the same release.
|
||||
|
||||
# copies server, links new server to mythen3DetectorServer,
|
||||
# removes old server from respawn, sets up new lnked server to respawn
|
||||
# programs fpga, reboots
|
||||
|
||||
# older versions: v5.0.0 - 6.0.0 using tftp from tftp folder of pc
|
||||
# copies server from tftp folder of pc, links new server to mythen3DetectorServer,
|
||||
# programs fpga,
|
||||
# reboots
|
||||
sls_detector_put update mythen3DetectorServervxxx pcxxx xxx.rbf
|
||||
|
||||
# v6.1.1 - present (copies server from the full path provided)
|
||||
sls_detector_put update mythen3DetectorServervxxx xxx.rbf
|
||||
|
||||
# Or only program firmware
|
||||
sls_detector_put programfpga xxx.rbf
|
||||
|
||||
@ -215,21 +199,16 @@ Download
|
||||
Upgrade
|
||||
^^^^^^^^
|
||||
|
||||
Always ensure that the client and server software are of the same release.
|
||||
|
||||
Program from console
|
||||
.. code-block:: bash
|
||||
|
||||
# Always ensure that the client and server software are of the same release.
|
||||
|
||||
# copies server, links new server to gotthard2DetectorServer,
|
||||
# removes old server from respawn, sets up new lnked server to respawn
|
||||
# programs fpga, reboots
|
||||
|
||||
# older versions: v5.0.0 - 6.0.0 using tftp from tftp folder of pc
|
||||
# copies server from tftp folder of pc, links new server to gotthard2DetectorServer,
|
||||
# programs fpga,
|
||||
# reboots
|
||||
sls_detector_put update gotthard2DetectorServervxxx pcxxx xxx.rbf
|
||||
|
||||
# v6.1.1 - present (copies server from the full path provided)
|
||||
sls_detector_put update gotthard2DetectorServervxxx xxx.rbf
|
||||
|
||||
# Or only program firmware
|
||||
sls_detector_put programfpga xxx.rbf
|
||||
|
||||
@ -251,36 +230,19 @@ Download
|
||||
Upgrade
|
||||
^^^^^^^^
|
||||
|
||||
.. warning ::
|
||||
|
||||
In case you have had issues in the past with programming via software:
|
||||
|
||||
* 6.1.2 server has a fix for seamless fpga programming
|
||||
|
||||
* We recommend first updating the on-board detector server to 6.1.2 (with client 6.1.x) using command 'updatedetectorserver' or 'copydetectorserver'.
|
||||
|
||||
* Then use command 'programfpga' to only update firmware or use command 'update' to update firmware and server to the latest release.
|
||||
|
||||
|
||||
|
||||
Check :ref:`firmware troubleshooting <blackfin firmware troubleshooting>` if you run into issues while programming firmware.
|
||||
|
||||
Always ensure that the client and server software are of the same release.
|
||||
|
||||
Program from console
|
||||
.. code-block:: bash
|
||||
|
||||
# Always ensure that the client and server software are of the same release.
|
||||
|
||||
# copies server, links new server to moenchDetectorServer,
|
||||
# copies server from tftp folder of pc, links new server to moenchDetectorServer,
|
||||
# removes old server from respawn, sets up new lnked server to respawn
|
||||
# programs fpga, reboots
|
||||
|
||||
# older versions: v5.0.0 - 6.0.0 using tftp from tftp folder of pc
|
||||
# programs fpga,
|
||||
# reboots
|
||||
sls_detector_put update moenchDetectorServervxxx pcxxx xx.pof
|
||||
|
||||
# v6.1.1 - present (copies server from the full path provided)
|
||||
sls_detector_put update moenchDetectorServervxxx xx.pof
|
||||
|
||||
# Or only program firmware
|
||||
sls_detector_put programfpga xxx.pof
|
||||
|
||||
@ -300,22 +262,17 @@ Upgrade
|
||||
|
||||
Check :ref:`firmware troubleshooting <blackfin firmware troubleshooting>` if you run into issues while programming firmware.
|
||||
|
||||
Always ensure that the client and server software are of the same release.
|
||||
|
||||
Program from console
|
||||
.. code-block:: bash
|
||||
|
||||
# Always ensure that the client and server software are of the same release.
|
||||
|
||||
# copies server, links new server to ctbDetectorServer,
|
||||
# copies server from tftp folder of pc, links new server to ctbDetectorServer,
|
||||
# removes old server from respawn, sets up new lnked server to respawn
|
||||
# programs fpga, reboots
|
||||
|
||||
# older versions: v5.0.0 - 6.0.0 using tftp from tftp folder of pc
|
||||
# programs fpga,
|
||||
# reboots
|
||||
sls_detector_put update ctbDetectorServervxxx pcxxx xx.pof
|
||||
|
||||
# v6.1.1 - present (copies server from the full path provided)
|
||||
sls_detector_put update ctbDetectorServervxxx xx.pof
|
||||
|
||||
# Or only program firmware
|
||||
sls_detector_put programfpga xxx.pof
|
||||
|
||||
|
@ -8,8 +8,8 @@ Welcome to slsDetectorPackage's documentation!
|
||||
|
||||
.. note ::
|
||||
|
||||
This is the documentation for the latest development version of slsDetectorPackage.
|
||||
For further documentation, visit the official page: https://www.psi.ch/en/detectors/documentation
|
||||
This is the documentation for the latest development version of slsDetectorPackage
|
||||
For documentation on current and previous releases visit the official page: https://www.psi.ch/en/detectors/documentation
|
||||
|
||||
.. toctree::
|
||||
:maxdepth: 1
|
||||
@ -66,15 +66,6 @@ Welcome to slsDetectorPackage's documentation!
|
||||
virtualserver
|
||||
serverdefaults
|
||||
|
||||
|
||||
.. toctree::
|
||||
:caption: Detector UDP Header
|
||||
:maxdepth: 2
|
||||
|
||||
udpheader
|
||||
udpconfig
|
||||
udpdetspec
|
||||
|
||||
.. toctree::
|
||||
:caption: Receiver
|
||||
:maxdepth: 2
|
||||
|
@ -1,28 +1,100 @@
|
||||
|
||||
|
||||
|
||||
.. note ::
|
||||
|
||||
The default branch of our git repository is developer. It contains the
|
||||
latest development version. It is expected to compile and work but
|
||||
features might be added or tweaked. In some cases the API might also change
|
||||
without being communicated. If absolute stability of the API is needed please
|
||||
use one of the release versions.
|
||||
|
||||
.. warning ::
|
||||
|
||||
Before building from source make sure that you have the
|
||||
:doc:`dependencies <../dependencies>` installed. If installing using conda, conda will
|
||||
manage the dependencies. Avoid also installing packages with pip.
|
||||
|
||||
manage the dependencies.
|
||||
|
||||
|
||||
.. _Installation:
|
||||
|
||||
|
||||
Installation
|
||||
===============
|
||||
==============================================
|
||||
|
||||
.. _build from source using cmake:
|
||||
|
||||
Build from source using CMake
|
||||
---------------------------------
|
||||
|
||||
Note that on some systems, for example RH7, cmake v3+ is available under the cmake3 alias.
|
||||
It is also required to clone with the option --recursive to get the git submodules used
|
||||
in the package.
|
||||
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
git clone --recursive https://github.com/slsdetectorgroup/slsDetectorPackage.git
|
||||
mkdir build && cd build
|
||||
cmake ../slsDetectorPackage -DCMAKE_INSTALL_PREFIX=/your/install/path
|
||||
make -j12 #or whatever number of cores you are using to build
|
||||
make install
|
||||
|
||||
The easiest way to configure options is to use the ccmake utility.
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
#from the build directory
|
||||
ccmake .
|
||||
|
||||
|
||||
Build using cmk.sh script
|
||||
-------------------------
|
||||
These are mainly aimed at those not familiar with using ccmake and cmake.
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
The binaries are generated in slsDetectorPackage/build/bin directory.
|
||||
|
||||
Usage: $0 [-c] [-b] [-p] [e] [t] [r] [g] [s] [u] [i] [m] [n] [-h] [z] [-d <HDF5 directory>] [-l Install directory] [-k <CMake command>] [-j <Number of threads>]
|
||||
-[no option]: only make
|
||||
-c: Clean
|
||||
-b: Builds/Rebuilds CMake files normal mode
|
||||
-p: Builds/Rebuilds Python API
|
||||
-h: Builds/Rebuilds Cmake files with HDF5 package
|
||||
-d: HDF5 Custom Directory
|
||||
-k: CMake command
|
||||
-l: Install directory
|
||||
-t: Build/Rebuilds only text client
|
||||
-r: Build/Rebuilds only receiver
|
||||
-g: Build/Rebuilds only gui
|
||||
-s: Simulator
|
||||
-u: Chip Test Gui
|
||||
-j: Number of threads to compile through
|
||||
-e: Debug mode
|
||||
-i: Builds tests
|
||||
-m: Manuals
|
||||
-n: Manuals without compiling doxygen (only rst)
|
||||
-z: Moench zmq processor
|
||||
|
||||
# get all options
|
||||
./cmk.sh -?
|
||||
|
||||
# new build and compile in parallel:
|
||||
./cmk.sh -bj5
|
||||
|
||||
|
||||
Install binaries using conda
|
||||
-------------------------------
|
||||
--------------------------------
|
||||
|
||||
Conda is not only useful to manage python environments but can also
|
||||
be used as a user space package manager. Dates in the tag (for eg. 2020.07.23.dev0)
|
||||
are from the developer branch. Please use released tags for stability.
|
||||
be used as a user space package manager.
|
||||
|
||||
We have three different packages available:
|
||||
|
||||
* **slsdetlib** shared libraries and command line utilities
|
||||
* **slsdetgui** GUI
|
||||
* **slsdet** Python bindings
|
||||
* **slsdetlib**, shared libraries and command line utilities
|
||||
* **slsdetgui**, GUI
|
||||
* **slsdet**, Python bindings
|
||||
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
@ -31,9 +103,9 @@ We have three different packages available:
|
||||
conda config --add channels slsdetectorgroup
|
||||
conda config --set channel_priority strict
|
||||
|
||||
#create and activate an environment with our library
|
||||
#replace 6.1.1 with the required tag
|
||||
conda create -n myenv slsdetlib=6.1.1
|
||||
#cerate an environment with our library, then activate
|
||||
#replace 2020.07.20.dev0 with the required tag
|
||||
conda create -n myenv slsdetlib=2020.07.23.dev0
|
||||
conda activate myenv
|
||||
|
||||
#ready to use
|
||||
@ -44,136 +116,11 @@ We have three different packages available:
|
||||
.. code-block:: bash
|
||||
|
||||
#List available versions
|
||||
# lib and binaries
|
||||
conda search slsdetlib
|
||||
# python
|
||||
conda search slsdet
|
||||
# gui
|
||||
conda search slsdetgui
|
||||
|
||||
|
||||
|
||||
|
||||
Build from source
|
||||
-------------------
|
||||
|
||||
1. Download Source Code from github
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
git clone https://github.com/slsdetectorgroup/slsDetectorPackage.git --branch 6.1.1
|
||||
|
||||
.. note ::
|
||||
|
||||
For v6.x.x of slsDetectorPackage and older, refer :ref:`pybind11 notes on cloning. <pybind for different slsDetectorPackage versions>`
|
||||
|
||||
.. _build from source using cmake:
|
||||
|
||||
|
||||
|
||||
2. Build from Source
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
Build using CMake
|
||||
^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
# outside slsDetecorPackage folder
|
||||
mkdir build && cd build
|
||||
|
||||
# configure & generate Makefiles using cmake
|
||||
# by listing all your options (alternately use ccmake described below)
|
||||
# cmake3 for some systems
|
||||
cmake ../slsDetectorPackage -DCMAKE_INSTALL_PREFIX=/your/install/path
|
||||
|
||||
# compiled to the build/bin directory
|
||||
make -j12 #or whatever number of cores you are using to build
|
||||
|
||||
# install headers and libs in /your/install/path directory
|
||||
make install
|
||||
|
||||
|
||||
Instead of the cmake command, one can use ccmake to get a list of options to configure and generate Makefiles at ease.
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
# ccmake3 for some systems
|
||||
ccmake ..
|
||||
|
||||
# choose the options
|
||||
# first press [c] - configure (maybe multiple times till you see [g])
|
||||
# then press [g] - generate
|
||||
|
||||
|
||||
=============================== ===============================
|
||||
Example cmake options Comment
|
||||
=============================== ===============================
|
||||
-DSLS_USE_PYTHON=ON Python
|
||||
-DPython_FIND_VIRTUALENV=ONLY Python from the conda env
|
||||
-DSLS_USE_GUI=ON GUI
|
||||
-DSLS_USE_HDF5=ON HDF5
|
||||
-DSLS_USE_SIMULATOR=ON Simulator
|
||||
=============================== ===============================
|
||||
|
||||
.. note ::
|
||||
|
||||
For v7.x.x of slsDetectorPackage and older, refer :ref:`zeromq notes for cmake option to hint library location. <zeromq for different slsDetectorPackage versions>`
|
||||
|
||||
|
||||
Build using in-built cmk.sh script
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
The binaries are generated in slsDetectorPackage/build/bin directory.
|
||||
|
||||
Usage: $0 [-b] [-c] [-d <HDF5 directory>] [-e] [-g] [-h] [-i]
|
||||
[-j <Number of threads>] [-k <CMake command>] [-l <Install directory>]
|
||||
[-m] [-n] [-p] [-r] [-s] [-t] [-u] [-z]
|
||||
-[no option]: only make
|
||||
-b: Builds/Rebuilds CMake files normal mode
|
||||
-c: Clean
|
||||
-d: HDF5 Custom Directory
|
||||
-e: Debug mode
|
||||
-g: Build/Rebuilds gui
|
||||
-h: Builds/Rebuilds Cmake files with HDF5 package
|
||||
-i: Builds tests
|
||||
-j: Number of threads to compile through
|
||||
-k: CMake command
|
||||
-l: Install directory
|
||||
-m: Manuals
|
||||
-n: Manuals without compiling doxygen (only rst)
|
||||
-p: Builds/Rebuilds Python API
|
||||
-r: Build/Rebuilds only receiver
|
||||
-s: Simulator
|
||||
-t: Build/Rebuilds only text client
|
||||
-u: Chip Test Gui
|
||||
-z: Moench zmq processor
|
||||
|
||||
|
||||
# display all options
|
||||
./cmk.sh -?
|
||||
|
||||
# new build and compile in parallel (recommended basic option):
|
||||
./cmk.sh -cbj5
|
||||
|
||||
# new build, python and compile in parallel:
|
||||
./cmk.sh -cbpj5
|
||||
|
||||
#For rebuilding only certain sections
|
||||
./cmk.sh -tg #only text client and gui
|
||||
./cmk.sh -r #only receiver
|
||||
|
||||
.. note ::
|
||||
|
||||
For v7.x.x of slsDetectorPackage and older, refer :ref:`zeromq notes for cmk script option to hint library location. <zeromq for different slsDetectorPackage versions>`
|
||||
|
||||
|
||||
Build on old distributions
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
Build from source on old distributions
|
||||
-----------------------------------------
|
||||
|
||||
If your linux distribution doesn't come with a C++11 compiler (gcc>4.8) then
|
||||
it's possible to install a newer gcc using conda and build the slsDetectorPackage
|
||||
@ -182,74 +129,14 @@ using this compiler
|
||||
.. code-block:: bash
|
||||
|
||||
#Create an environment with the dependencies
|
||||
conda create -n myenv gxx_linux-64 cmake
|
||||
conda create -n myenv gxx_linux-64 cmake zmq
|
||||
conda activate myenv
|
||||
|
||||
# outside slsDetecorPackage folder
|
||||
mkdir build && cd build
|
||||
cmake ../slsDetectorPackage -DCMAKE_PREFIX_PATH=$CONDA_PREFIX
|
||||
make -j12
|
||||
|
||||
|
||||
.. note ::
|
||||
|
||||
For v7.x.x of slsDetectorPackage and older, refer :ref:`zeromq notes for dependencies for conda. <zeromq for different slsDetectorPackage versions>`
|
||||
|
||||
|
||||
|
||||
Build slsDetectorGui (Qt5)
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
1. Using pre-built binary on conda
|
||||
.. code-block:: bash
|
||||
|
||||
conda create -n myenv slsdetgui=7.0.0
|
||||
conda activate myenv
|
||||
|
||||
|
||||
2. Using system installation on RHEL7
|
||||
.. code-block:: bash
|
||||
|
||||
yum install qt5-qtbase-devel.x86_64
|
||||
yum install qt5-qtsvg-devel.x86_64
|
||||
|
||||
|
||||
3. Using conda
|
||||
.. code-block:: bash
|
||||
|
||||
#Add channels for dependencies and our library
|
||||
conda config --add channels conda-forge
|
||||
conda config --add channels slsdetectorgroup
|
||||
conda config --set channel_priority strict
|
||||
|
||||
# create environment to compile
|
||||
# on rhel7
|
||||
conda create -n slsgui gxx_linux-64 gxx_linux-64 mesa-libgl-devel-cos6-x86_64 qt
|
||||
# on fedora or newer systems
|
||||
conda create -n slsgui qt
|
||||
|
||||
# when using conda compilers, would also need libgl, but no need for it on fedora unless maybe using it with ROOT
|
||||
|
||||
# activate environment
|
||||
conda activate slsgui
|
||||
|
||||
# compile with cmake outside slsDetecorPackage folder
|
||||
mkdir build && cd build
|
||||
cmake ../slsDetectorPackage -DSLS_USE_GUI=ON
|
||||
make -j12
|
||||
|
||||
# or compile with cmk.sh
|
||||
cd slsDetectorPackage
|
||||
./cmk.sh -cbgj9
|
||||
|
||||
.. note ::
|
||||
|
||||
For v7.x.x of slsDetectorPackage and older, refer :ref:`zeromq notes for dependencies for conda. <zeromq for different slsDetectorPackage versions>`
|
||||
|
||||
|
||||
|
||||
Build this documentation
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
-------------------------------
|
||||
|
||||
The documentation for the slsDetectorPackage is build using a combination
|
||||
of Doxygen, Sphinx and Breathe. The easiest way to install the dependencies
|
||||
@ -257,63 +144,11 @@ is to use conda
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
conda create -n myenv python=3.12 sphinx sphinx_rtd_theme breathe doxygen numpy
|
||||
conda create -n myenv python sphinx sphinx_rtd_theme
|
||||
|
||||
Then enable the option SLS_BUILD_DOCS to create the targets
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
# using cmake or ccmake to enable DSLS_BUILD_DOCS
|
||||
# outside slsDetecorPackage folder
|
||||
mkdir build && cd build
|
||||
cmake ../slsDetectorPackage -DSLS_BUILD_DOCS=ON
|
||||
|
||||
make docs # generate API docs and build Sphinx RST
|
||||
make rst # rst only, saves time in case the API did not change
|
||||
|
||||
|
||||
Pybind and Zeromq
|
||||
^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
.. _pybind for different slsDetectorPackage versions:
|
||||
|
||||
|
||||
| **Pybind for Python**
|
||||
| v8.0.0+:
|
||||
| pybind11 (v2.11.0) is built
|
||||
| * by default from tar file in repo (libs/pybind/v2.11.0.tar.gz)
|
||||
| * or use advanced option SLS_FETCH_PYBIND11_FROM_GITHUB [`link <https://github.com/pybind/pybind11>`__].
|
||||
|
|
||||
| v7.x.x:
|
||||
| pybind11 packaged into 'libs/pybind'. No longer a submodule. No need for "recursive" or "submodule update".
|
||||
|
|
||||
| Older versions:
|
||||
| pybind11 is a submodule. Must be cloned using "recursive" and updated when switching between versions using the following commands.
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
# Note: Only for v6.x.x versions and older
|
||||
|
||||
# clone using recursive to get pybind11 submodule
|
||||
git clone --recursive https://github.com/slsdetectorgroup/slsDetectorPackage.git
|
||||
|
||||
# update submodule when switching between releases
|
||||
cd slsDetectorPackage
|
||||
git submodule update --init
|
||||
|
||||
|
||||
.. _zeromq for different slsDetectorPackage versions:
|
||||
|
||||
|
||||
|
||||
| **Zeromq**
|
||||
| v8.0.0+:
|
||||
| zeromq (v4.3.4) is built
|
||||
| * by default from tar file in repo (libs/libzmq/libzmq-4.3.4.tar.gz)
|
||||
| * or use advanced option SLS_FETCH_ZMQ_FROM_GITHUB [`link <https://github.com/zeromq/libzmq.git>`__].
|
||||
|
|
||||
| v7.x.x and older:
|
||||
| zeromq must be installed and one can hint its location using
|
||||
| * cmake option:'-DZeroMQ_HINT=/usr/lib64' or
|
||||
| * option '-q' in cmk.sh script: : ./cmk.sh -cbj5 -q /usr/lib64
|
||||
| * 'zeromq' dependency added when installing using conda
|
||||
|
||||
make rst # rst only, saves time in case the API did not change
|
@ -10,46 +10,27 @@ open an issue in our our `github repo
|
||||
Setting exposure time
|
||||
------------------------------------
|
||||
|
||||
Setting and reading back exposure time can be done either using a Python
|
||||
datetime.timedelta, DurationWrapper or by setting the time in seconds.
|
||||
Setting and reading back exposure time can be done either using a Python datetime.timedelta
|
||||
or by setting the time in seconds.
|
||||
|
||||
::
|
||||
|
||||
# Set exposure time to 1.2 seconds
|
||||
>>> d.exptime = 1.2
|
||||
>>> d.exptime = 5e-07
|
||||
|
||||
# Setting exposure time using timedelta (upto microseconds precision)
|
||||
# Setting exposure time using timedelta
|
||||
import datetime as dt
|
||||
>>> d.exptime = dt.timedelta(seconds = 1.2)
|
||||
>>> d.exptime = dt.timedelta(seconds = 1, microseconds = 3)
|
||||
|
||||
# With timedelta any arbitrary combination of units can be used
|
||||
>>> t = dt.timedelta(microseconds = 100, seconds = 5.3, minutes = .3)
|
||||
|
||||
# using DurationWrapper to set in seconds
|
||||
>>> from slsdet import DurationWrapper
|
||||
>>> d.exptime = DurationWrapper(1.2)
|
||||
|
||||
# using DurationWrapper to set in ns
|
||||
>>> t = DurationWrapper()
|
||||
>>> t.set_count(500)
|
||||
>>> d.exptime = t
|
||||
|
||||
# To set exposure time for individual detector one have to resort
|
||||
# to the C++ style API.
|
||||
# Sets exposure time to 1.2 seconds for module 0, 6 and 12
|
||||
>>> d.setExptime(1.2, [0, 6, 12])
|
||||
>>> d.setExptime(dt.timedelta(seconds = 1.2), [0, 6, 12])
|
||||
|
||||
# to get in seconds
|
||||
>>> d.period
|
||||
181.23
|
||||
|
||||
# to get in DurationWrapper
|
||||
>>> d.getExptime()
|
||||
[sls::DurationWrapper(total_seconds: 181.23 count: 181230000000)]
|
||||
|
||||
|
||||
|
||||
------------------------------------
|
||||
@ -239,7 +220,8 @@ Setting and getting times
|
||||
# This sets the exposure time for all modules
|
||||
d.exptime = 0.5
|
||||
|
||||
# exptime also accepts a python datetime.timedelta (upto microseconds resolution)
|
||||
# exptime also accepts a python datetime.timedelta
|
||||
# which can be used to set the time in almost any unit
|
||||
t = dt.timedelta(milliseconds = 2.3)
|
||||
d.exptime = t
|
||||
|
||||
@ -247,25 +229,16 @@ Setting and getting times
|
||||
t = dt.timedelta(minutes = 3, seconds = 1.23)
|
||||
d.exptime = t
|
||||
|
||||
# using DurationWrapper to set in seconds
|
||||
>>> from slsdet import DurationWrapper
|
||||
>>> d.exptime = DurationWrapper(1.2)
|
||||
|
||||
# using DurationWrapper to set in ns
|
||||
>>> t = DurationWrapper()
|
||||
>>> t.set_count(500)
|
||||
>>> d.exptime = t
|
||||
|
||||
# exptime however always returns the time in seconds
|
||||
>>> d.exptime
|
||||
181.23
|
||||
|
||||
# To get back the exposure time for each module
|
||||
# it's possible to use getExptime, this also returns
|
||||
# the values as DurationWrapper
|
||||
# the values as datetime.timedelta
|
||||
|
||||
>>> d.getExptime()
|
||||
[sls::DurationWrapper(total_seconds: 181.23 count: 181230000000)]
|
||||
[datetime.timedelta(seconds=181, microseconds=230000), datetime.timedelta(seconds=181, microseconds=230000)]
|
||||
|
||||
# In case the values are the same it's possible to use the
|
||||
# element_if_equal function to reduce the values to a single
|
||||
@ -273,8 +246,7 @@ Setting and getting times
|
||||
|
||||
>>> t = d.getExptime()
|
||||
>>> element_if_equal(t)
|
||||
sls::DurationWrapper(total_seconds: 1.2 count: 1200000000)
|
||||
|
||||
datetime.timedelta(seconds=1)
|
||||
|
||||
--------------
|
||||
Reading dacs
|
||||
|
@ -6,7 +6,7 @@ Getting Started
|
||||
Which Python?
|
||||
--------------------
|
||||
|
||||
We require at least Python 3.6 and strongly recommended that you don't use the system
|
||||
We require at lest Python 3.6 and strongly recommended that you don't use the system
|
||||
Python installation. The examples in this documentation uses `conda
|
||||
<https://docs.conda.io/en/latest/miniconda.html>`_ since it provides good support
|
||||
also for non Python packages but there are also other alternatives like, pyenv.
|
||||
@ -14,35 +14,28 @@ also for non Python packages but there are also other alternatives like, pyenv.
|
||||
Using something like conda also allows you to quickly switch beteen different Python
|
||||
environments.
|
||||
|
||||
---------------------
|
||||
Building from Source
|
||||
---------------------
|
||||
|
||||
If you are not installing slsdet binaries from conda, but instead building from
|
||||
source, please refer to :ref:`the installation section<Installation>` for details.
|
||||
|
||||
Don't forget to compile with the option SLS_USE_PYTHON=ON to enable the Python
|
||||
bindings or if you use the cmk.sh script -p.
|
||||
|
||||
.. note ::
|
||||
|
||||
Ensure that the sls det python lib compiled is for the expected python version.
|
||||
For example, build/bin/_slsdet.cpython-39-x86_64-linux-gnu.so for Python v3.9.x
|
||||
.. warning ::
|
||||
|
||||
If you use conda avoid also installing packages with pip.
|
||||
|
||||
---------------------
|
||||
PYTHONPATH
|
||||
---------------------
|
||||
|
||||
If you install slsdet binaries using conda everything is set up and you can
|
||||
If you install slsdet using conda everything is set up and you can
|
||||
directly start using the Python bindings. However, if you build
|
||||
from source you need to tell Python where to find slsdet to use it. This
|
||||
can be done by adding your build/bin directory to PYTHONPATH.
|
||||
from source you need to tell Python where to find slsdet. This
|
||||
is be done by adding your build/bin directory to PYTHONPATH.
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
export PYTHONPATH = /path/to/your/build/bin:$PYTHONPATH
|
||||
|
||||
.. note ::
|
||||
|
||||
Don't forget to compile with the option SLS_USE_PYTHON=ON to enable
|
||||
the Python bindings or if you use the cmk.sh script -p.
|
||||
|
||||
--------------------------------------
|
||||
Which detector class should I use?
|
||||
--------------------------------------
|
||||
@ -153,11 +146,9 @@ their name.
|
||||
::
|
||||
|
||||
>>> [item for item in dir(d) if 'time' in item]
|
||||
['compdisabletime', 'exptime', 'exptimel', 'frametime', 'getExptime',
|
||||
'getExptimeForAllGates', 'getExptimeLeft', 'getSubExptime', 'patwaittime',
|
||||
'patwaittime0', 'patwaittime1', 'patwaittime2', 'runtime', 'setExptime',
|
||||
'setSubExptime', 'subdeadtime', 'subexptime']
|
||||
|
||||
['exptime', 'getExptime', 'getExptimeForAllGates', 'getExptimeLeft',
|
||||
'getSubExptime', 'patwaittime0', 'patwaittime1', 'patwaittime2',
|
||||
'setExptime', 'setSubExptime', 'subdeadtime', 'subexptime']
|
||||
|
||||
The above method works on any Python object but for convenience we also
|
||||
included two functions to find names. View prints the names one per line
|
||||
@ -169,7 +160,6 @@ while find returns a list of names.
|
||||
|
||||
>>> view('exptime')
|
||||
exptime
|
||||
exptimel
|
||||
getExptime
|
||||
getExptimeForAllGates
|
||||
getExptimeLeft
|
||||
@ -178,7 +168,6 @@ while find returns a list of names.
|
||||
setSubExptime
|
||||
subexptime
|
||||
|
||||
|
||||
>>> find('exptime')
|
||||
['exptime', 'getExptime', 'getExptimeForAllGates', 'getExptimeLeft',
|
||||
'getSubExptime', 'setExptime', 'setSubExptime', 'subexptime']
|
||||
@ -196,39 +185,19 @@ To access the documentation of a function directly from the Python prompt use he
|
||||
Help on property:
|
||||
|
||||
Period between frames, accepts either a value in seconds or datetime.timedelta
|
||||
|
||||
|
||||
Note
|
||||
-----
|
||||
:getter: always returns in seconds. To get in DurationWrapper, use getPeriod
|
||||
|
||||
Example
|
||||
:getter: always returns in seconds. To get in datetime.delta, use getPeriod
|
||||
|
||||
Examples
|
||||
-----------
|
||||
>>> # setting directly in seconds
|
||||
>>> d.period = 1.05
|
||||
>>>
|
||||
>>> # setting directly in seconds
|
||||
>>> d.period = 5e-07
|
||||
>>>
|
||||
>>> # using timedelta (up to microseconds precision)
|
||||
>>> from datatime import timedelta
|
||||
>>> d.period = timedelta(seconds = 1, microseconds = 3)
|
||||
>>>
|
||||
>>> # using DurationWrapper to set in seconds
|
||||
>>> from slsdet import DurationWrapper
|
||||
>>> d.period = DurationWrapper(1.2)
|
||||
>>>
|
||||
>>> # using DurationWrapper to set in ns
|
||||
>>> t = DurationWrapper()
|
||||
>>> t.set_count(500)
|
||||
>>> d.period = t
|
||||
>>>
|
||||
>>> # to get in seconds
|
||||
>>> d.period = datetime.timedelta(minutes = 3, seconds = 1.23)
|
||||
>>> d.period
|
||||
181.23
|
||||
>>>
|
||||
>>> d.getExptime()
|
||||
[sls::DurationWrapper(total_seconds: 181.23 count: 181230000000)]
|
||||
|
||||
>>> d.getPeriod()
|
||||
[datetime.timedelta(seconds=181, microseconds=230000)]
|
||||
|
||||
|
||||
----------------------
|
||||
@ -248,12 +217,11 @@ The enums can be found in slsdet.enums
|
||||
|
||||
import slsdet
|
||||
>>> [e for e in dir(slsdet.enums) if not e.startswith('_')]
|
||||
['M3_GainCaps', 'burstMode', 'clockIndex', 'cls', 'dacIndex', 'detectorSettings',
|
||||
'detectorType', 'dimension', 'externalSignalFlag', 'fileFormat',
|
||||
'frameDiscardPolicy', 'gainMode', 'name', 'polarity', 'portPosition',
|
||||
'readoutMode', 'runStatus', 'speedLevel', 'streamingInterface', 'timingMode',
|
||||
'timingSourceType', 'vetoAlgorithm']
|
||||
|
||||
['burstMode', 'clockIndex', 'dacIndex',
|
||||
'detectorSettings', 'detectorType', 'dimension', 'externalSignalFlag',
|
||||
'fileFormat', 'frameDiscardPolicy',
|
||||
'readoutMode', 'runStatus', 'speedLevel', 'timingMode',
|
||||
'timingSourceType']
|
||||
|
||||
# Even though importing using * is not recommended one could
|
||||
# get all the enums like this:
|
||||
|
@ -66,15 +66,11 @@ For a Single Module
|
||||
# sets destination udp ports (not needed, default is 50001)
|
||||
udp_dstport 50012
|
||||
|
||||
# 1g data out
|
||||
# source udp ips must be same subnet at destintaion udp ips
|
||||
# udp_srcip 192.168.1.112
|
||||
# destination udp ip picked up from rx_hostname (if auto)
|
||||
# udp_dstip auto
|
||||
udp_srcip 192.168.1.112
|
||||
|
||||
# 10g data out
|
||||
udp_srcip 10.30.20.200
|
||||
udp_dstip 10.30.20.6
|
||||
# destination udp ip picked up from rx_hostname (if auto)
|
||||
udp_dstip auto
|
||||
|
||||
# set file path
|
||||
fpath /tmp
|
||||
@ -109,14 +105,12 @@ For Multiple Modules
|
||||
# connects to mulitple modules
|
||||
hostname bchipxxx+bchipyyy+
|
||||
|
||||
# tcp port increases for each module (multi detector command)
|
||||
rx_tcpport 2012
|
||||
|
||||
# connects to receivers at ports 2012 and 2014
|
||||
rx_hostname mpc1922
|
||||
rx_hostname mpc1922:2012+mpc1922:2013+
|
||||
|
||||
# increasing udp ports (multi detector command)
|
||||
udp_dstport 50012
|
||||
# sets differernt destination udp ports
|
||||
0:udp_dstport 50012
|
||||
1:udp_dstport 50014
|
||||
|
||||
# source udp ips must be same subnet at destintaion udp ips
|
||||
0:udp_srcip 192.168.1.112
|
||||
|
@ -4,8 +4,41 @@ Receivers
|
||||
Receiver processes can be run on same or different machines as the client, receives the data from the detector (via UDP packets).
|
||||
When using the slsReceiver/ slsMultiReceiver, they can be further configured by the client control software (via TCP/IP) to set file name, file path, progress of acquisition etc.
|
||||
|
||||
Detector UDP Header
|
||||
---------------------
|
||||
|
||||
To know more about detector receiver configuration, please check out :ref:`detector udp header and udp commands in the config file <detector udp header>`
|
||||
| The UDP data format for the packets consist of a common header for all detectors, followed by the data for that one packet.
|
||||
|
||||
**The SLS Detector Header**
|
||||
|
||||
.. table:: <-------------------------------- 8 bytes -------------------------------->
|
||||
:align: center
|
||||
:widths: 30,30,30,30
|
||||
|
||||
+--------------------------------------------------------------------+
|
||||
|frameNumber |
|
||||
+---------------------------------+----------------------------------+
|
||||
|expLength |packetNumber |
|
||||
+---------------------------------+----------------------------------+
|
||||
|bunchId |
|
||||
+--------------------------------------------------------------------+
|
||||
|timestamp |
|
||||
+----------------+----------------+----------------+-----------------+
|
||||
|modId |row |column |reserved |
|
||||
+----------------+----------------+----------------+--------+--------+
|
||||
|debug |roundRNumber |detType |version |
|
||||
+---------------------------------+----------------+--------+--------+
|
||||
|
||||
UDP configuration in Config file
|
||||
----------------------------------
|
||||
|
||||
#. UDP source port is hardcoded in detector server, starting at 32410.
|
||||
#. **udp_dstport** : UDP destination port number. Port in receiver pc to listen to packets from the detector.
|
||||
#. **udp_dstip** : IP address of UDP destination interface. IP address of interface in receiver pc to listen to packets from detector. If **auto** is used (only when using slsReceiver/ slsMultiReceiver), the IP of **rx_hostname** is picked up.
|
||||
#. **udp_dstmac** : Mac address of UDP destination interface. MAC address of interface in receiver pc to list to packets from detector. Only required when using custom receiver, else slsReceiver/slsMultiReceiver picks it up from **udp_dstip**.
|
||||
#. **udp_srcip** : IP address of UDP source interface. IP address of detector UDP interface to send packets from. Do not use for Eiger 1Gb interface (uses its hardware IP). For others, must be in the same subnet as **udp_dstip**.
|
||||
#. **udp_srcmac** : MAC address of UDP source interface. MAC address of detector UDP interface to send packets from. Do not use for Eiger (uses hardware mac). For others, it is not necessary, but can help for switch and debugging to put unique values for each module.
|
||||
|
||||
|
||||
Custom Receiver
|
||||
----------------
|
||||
|
@ -1,5 +1,3 @@
|
||||
.. _Result Class:
|
||||
|
||||
Result
|
||||
==============================================
|
||||
|
||||
|
@ -1,14 +1,5 @@
|
||||
Getting Started
|
||||
===============
|
||||
|
||||
Detector Servers include:
|
||||
* Control server [default port: 1952]
|
||||
* Almost all client communication.
|
||||
* Stop server [default port: 1953]
|
||||
* Client requests for detector status, stop acquisition, temperature, advanced read/write registers.
|
||||
|
||||
When using a blocking acquire command (sls_detector_acquire or Detector::acquire), the control server is blocked until end of acquisition. However, stop server commands could be used in parallel.
|
||||
|
||||
Detector Servers
|
||||
=================
|
||||
|
||||
Location
|
||||
---------
|
||||
@ -23,19 +14,26 @@ Arguments
|
||||
.. code-block:: bash
|
||||
|
||||
Possible arguments are:
|
||||
-v, --version : Software version
|
||||
-p, --port <port> : TCP communication port with client.
|
||||
-g, --nomodule : [Mythen3][Gotthard2]
|
||||
Generic or No Module mode. Skips detector type checks.
|
||||
-f, --phaseshift <value> : [Gotthard] only. Sets phase shift.
|
||||
-d, --devel : Developer mode. Skips firmware checks.
|
||||
-u, --update : Update mode. Skips firmware checks and initial detector setup.
|
||||
-i, --ignore-config : [Eiger][Jungfrau][Gotthard][Gotthard2][Moench]
|
||||
Ignore config file.
|
||||
-m, --master <master> : [Eiger][Mythen3][Gotthard][Gotthard2]
|
||||
Set Master to 0 or 1. Precedence over config file. Only for virtual servers except Eiger.
|
||||
-t, --top <top> : [Eiger] Set Top to 0 or 1. Precedence over config file.
|
||||
-s, --stopserver : Stop server. Do not use as it is created by control server
|
||||
-v, --version : Software version
|
||||
-p, --port <port> : TCP communication port with client.
|
||||
-g, --nomodule : [Mythen3][Gotthard2] Generic or No Module mode.
|
||||
Skips detector type checks.
|
||||
-f, --phaseshift <value> : [Gotthard] only. Sets phase shift.
|
||||
-d, --devel : Developer mode. Skips firmware checks.
|
||||
-u, --update : Update mode. Skips firmware checks and initial detector setup.
|
||||
-s, --stopserver : Stop server. Do not use as it is created by control server
|
||||
|
||||
|
||||
Basics
|
||||
------------
|
||||
|
||||
Detector Servers include:
|
||||
* Control server [default port: 1952]
|
||||
* Almost all client communication.
|
||||
* Stop server [default port: 1953]
|
||||
* Client requests for detector status, stop acquisition, temperature, advanced read/write registers.
|
||||
|
||||
When using a blocking acquire command (sls_detector_acquire or Detector::acquire), the control server is blocked until end of acquisition. However, stop server commands could be used in parallel.
|
||||
|
||||
|
||||
.. _Automatic start servers:
|
||||
@ -92,8 +90,6 @@ One can start the on-board detector server automatically upon powering on the bo
|
||||
.. code-block:: bash
|
||||
|
||||
sync
|
||||
|
||||
# physically reboot for Gotthard II or Mythen III
|
||||
reboot
|
||||
|
||||
# verify
|
||||
|
@ -1,6 +1,6 @@
|
||||
.. _Detector Server Upgrade:
|
||||
Upgrade
|
||||
========
|
||||
Detector Server Upgrade
|
||||
=======================
|
||||
|
||||
|
||||
**Location:** slsDetectorPackage/serverBin/ folder for every release.
|
||||
@ -14,7 +14,7 @@ Upgrade
|
||||
Eiger requires a manual reboot. Or killall the servers and restart the new linked one. If you are in the process of updating firmware, then don't reboot yet.
|
||||
|
||||
|
||||
6.1.1+ (no tftp required)
|
||||
From 6.1.1 and above (no tftp required)
|
||||
---------------------------------------
|
||||
|
||||
#. Program from console
|
||||
@ -60,7 +60,7 @@ Troubleshooting with tftp
|
||||
#. text file busy: You are trying to copy the same server.
|
||||
|
||||
|
||||
< 5.0.0
|
||||
--------
|
||||
Older than 5.0.0
|
||||
-----------------
|
||||
|
||||
Please contact us.
|
@ -52,13 +52,8 @@ Client Commands
|
||||
|
||||
# multi modules with custom ports
|
||||
rx_hostname xxx:1955+xxx:1956+
|
||||
|
||||
|
||||
# multi modules using increasing tcp ports when using multi detector command
|
||||
rx_tcpport 1955
|
||||
rx_hostname xxx
|
||||
|
||||
# or specify multi modules with custom ports on same rxr pc
|
||||
# multi modules with custom ports on same rxr pc
|
||||
0:rx_tcpport 1954
|
||||
1:rx_tcpport 1955
|
||||
2:rx_tcpport 1956
|
||||
@ -91,199 +86,16 @@ Client Commands
|
||||
sls_detector_get -h rx_framescaught
|
||||
|
||||
|
||||
ZMQ: Json Header Format
|
||||
------------------------
|
||||
|
||||
|
||||
**Change in field names from slsDetectorPackage v6.x.x to v7.0.0**
|
||||
|
||||
* detSpec1 <- bunchId
|
||||
* detSpec2 <- reserved
|
||||
* detSpec3 <- debug
|
||||
* detSpec4 <- roundRNumber
|
||||
|
||||
|
||||
**Format**
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
{
|
||||
"jsonversion": unsigned int,
|
||||
"bitmode": unsigned int,
|
||||
"fileIndex": unsigned long int,
|
||||
"detshape": [
|
||||
unsigned int,
|
||||
unsigned int
|
||||
],
|
||||
"shape": [
|
||||
unsigned int,
|
||||
unsigned int
|
||||
],
|
||||
"size": unsigned int,
|
||||
"acqIndex": unsigned long int,
|
||||
"frameIndex": unsigned long int,
|
||||
"progress": double,
|
||||
"fname": string,
|
||||
"data": unsigned int,
|
||||
"completeImage": unsigned int,
|
||||
|
||||
"frameNumber": unsigned long long int,
|
||||
"expLength": unsigned int,
|
||||
"packetNumber": unsigned int,
|
||||
"detSpec1": unsigned long int,
|
||||
"timestamp": unsigned long int,
|
||||
"modId": unsigned int,
|
||||
"row": unsigned int,
|
||||
"column": unsigned int,
|
||||
"detSpec2": unsigned int,
|
||||
"detSpec3": unsigned int,
|
||||
"detSpec4": unsigned int,
|
||||
"detType": unsigned int,
|
||||
"version": unsigned int,
|
||||
|
||||
"flipRows": unsigned int,
|
||||
"quad": unsigned int,
|
||||
"addJsonHeader": {
|
||||
string : string
|
||||
}
|
||||
}
|
||||
|
||||
+--------------+----------------------------------------------+
|
||||
| Field | Description |
|
||||
+--------------+----------------------------------------------+
|
||||
| jsonversion | Version of the json header. |
|
||||
| | Value at 4 for v6.x.x and v7.x.x |
|
||||
+--------------+----------------------------------------------+
|
||||
| bitmode | Bits per pixel [4|8|16|32] |
|
||||
+--------------+----------------------------------------------+
|
||||
| fileIndex | Current file acquisition index |
|
||||
+--------------+----------------------------------------------+
|
||||
| detshape | Geometry of the entire detector |
|
||||
+--------------+----------------------------------------------+
|
||||
| shape | Geometry of the current port streamed out |
|
||||
+--------------+----------------------------------------------+
|
||||
| size | Size of image of current port in bytesout |
|
||||
+--------------+----------------------------------------------+
|
||||
| acqIndex | Frame number from the detector (redundant) |
|
||||
+--------------+----------------------------------------------+
|
||||
| frameIndex | Frame number of current acquisition |
|
||||
| | (Starting at 0) |
|
||||
+--------------+----------------------------------------------+
|
||||
| progress | Progress of current acquisition in % |
|
||||
+--------------+----------------------------------------------+
|
||||
| fname | Current file name |
|
||||
+--------------+----------------------------------------------+
|
||||
| data | 1 if there is data following |
|
||||
| | 0 if dummy header |
|
||||
+--------------+----------------------------------------------+
|
||||
| completeImage| 1 if no missing packets for this frame |
|
||||
| | in this port, else 0 |
|
||||
+--------------+----------------------------------------------+
|
||||
| frameNumber | Frame number |
|
||||
| | [From detector udp header] |
|
||||
+--------------+----------------------------------------------+
|
||||
| expLength | subframe number (32 bit eiger) |
|
||||
| | or real time exposure time in 100ns (others) |
|
||||
| | [From detector udp header] |
|
||||
+--------------+----------------------------------------------+
|
||||
| packetNumber | Number of packets caught for that frame |
|
||||
+--------------+----------------------------------------------+
|
||||
| detSpec1 | See :ref:`here<Detector Specific Fields>` |
|
||||
| | [From detector udp header] |
|
||||
+--------------+----------------------------------------------+
|
||||
| timestamp | Timestamp with 10 MHz clock |
|
||||
| | [From detector udp header] |
|
||||
+--------------+----------------------------------------------+
|
||||
| modId | Module Id |
|
||||
| | [From detector udp header] |
|
||||
+--------------+----------------------------------------------+
|
||||
| row | Row number in detector |
|
||||
| | [From detector udp header] |
|
||||
+--------------+----------------------------------------------+
|
||||
| column | Column number in detector |
|
||||
| | [From detector udp header] |
|
||||
+--------------+----------------------------------------------+
|
||||
| detSpec2 | See :ref:`here<Detector Specific Fields>` |
|
||||
| | [From detector udp header] |
|
||||
+--------------+----------------------------------------------+
|
||||
| detSpec3 | See :ref:`here<Detector Specific Fields>` |
|
||||
| | [From detector udp header] |
|
||||
+--------------+----------------------------------------------+
|
||||
| detSpec4 | See :ref:`here<Detector Specific Fields>` |
|
||||
| | [From detector udp header] |
|
||||
+--------------+----------------------------------------------+
|
||||
| detType | Detector type enum |
|
||||
| detSpec3 | See :ref:`Detector enum<Detector Enum>` |
|
||||
| | [From detector udp header] |
|
||||
+--------------+----------------------------------------------+
|
||||
| version | Detector header version. At 2 |
|
||||
| | [From detector udp header] |
|
||||
+--------------+----------------------------------------------+
|
||||
| flipRows | 1 if rows should be flipped. |
|
||||
| | Usually for Eiger bottom. |
|
||||
+--------------+----------------------------------------------+
|
||||
| quad | 1 if its an Eiger quad. |
|
||||
+--------------+----------------------------------------------+
|
||||
| addJsonHeader| Optional custom parameters that is required |
|
||||
| | for processing code. |
|
||||
+--------------+----------------------------------------------+
|
||||
|
||||
|
||||
SLS Receiver Header Format
|
||||
--------------------------
|
||||
|
||||
It is 112 bytes and consists of:
|
||||
* 48 bytes of the SLS Detector Header (described in :ref:`the current detector header <detector udp header>`)
|
||||
* 64 bytes of packet mask
|
||||
|
||||
.. code-block:: cpp
|
||||
|
||||
typedef struct {
|
||||
uint64_t frameNumber;
|
||||
uint32_t expLength;
|
||||
uint32_t packetNumber;
|
||||
uint64_t detSpec1;
|
||||
uint64_t timestamp;
|
||||
uint16_t modId;
|
||||
uint16_t row;
|
||||
uint16_t column;
|
||||
uint16_t detSpec2;
|
||||
uint32_t detSpec3;
|
||||
uint16_t detSpec4;
|
||||
uint8_t detType;
|
||||
uint8_t version;
|
||||
} sls_detector_header;
|
||||
|
||||
struct sls_receiver_header {
|
||||
sls_detector_header detHeader; /**< is the detector header */
|
||||
sls_bitset packetsMask; /**< is the packets caught bit mask */
|
||||
};
|
||||
|
||||
|
||||
.. note ::
|
||||
|
||||
| The packetNumber in the SLS Receiver Header will be modified to number of packets caught by receiver for that frame. For eg. Jungfrau will have 128 packets per frame. If it is less, then this is a partial frame due to missing packets.
|
||||
|
||||
| Furthermore, the bit mask will specify which packets have been received.
|
||||
|
||||
|
||||
|
||||
|
||||
File format
|
||||
--------------
|
||||
|
||||
Master file is in json format.
|
||||
* The file name format is [fpath]/[fname]_dx_fy_[findex].raw, where x is module index and y is file index. **fname** is file name prefix and by default "run". **fpath** is '/' by default.
|
||||
|
||||
The file name format is [fpath]/[fname]_dx_fy_[findex].raw, where x is module index and y is file index. **fname** is file name prefix and by default "run". **fpath** is '/' by default.
|
||||
* Each acquisition will have an increasing acquisition index or findex (if file write enabled). This can be retrieved by using **findex** command.
|
||||
|
||||
* Each acquisition can have multiple files (the file index number **y**), with **rx_framesperfile** being the maximum number of frames per file. The default varies for each detector type.
|
||||
|
||||
Each acquisition will have an increasing acquisition index or findex (if file write enabled). This can be retrieved by using **findex** command.
|
||||
|
||||
|
||||
Each acquisition can have multiple files (the file index number **y**), with **rx_framesperfile** being the maximum number of frames per file. The default varies for each detector type.
|
||||
|
||||
|
||||
Some file name examples:
|
||||
* Some file name examples:
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
@ -296,19 +108,17 @@ Some file name examples:
|
||||
# second acquisition, first file
|
||||
path-to-file/run_d0_f0_1.raw
|
||||
|
||||
* Each acquisition will create a master file that can be enabled/disabled using **fmaster**. This should have parameters relevant to the acquisition.
|
||||
|
||||
Each acquisition will create a master file that can be enabled/disabled using **fmaster**. This should have parameters relevant to the acquisition.
|
||||
|
||||
* SLS Receiver Header consist of SLS Detector Header + 64 bytes of bitmask, altogether 112 bytes. The packetNumber in the sls detector header part, will be updated to number of packets caught by receiver for that frame. Furthermore, the bit mask will specify which packets have been received.
|
||||
|
||||
**Binary file format**
|
||||
|
||||
This is the default file format.
|
||||
* This is the default file format.
|
||||
|
||||
* Each data file will consist of frames, each consisting of slsReceiver Header followed by data for 1 frame.
|
||||
|
||||
Each data file will consist of frames, each consisting of slsReceiver Header followed by data for 1 frame.
|
||||
|
||||
|
||||
Master file is of ASCII format and will also include the format of the slsReceiver Header.
|
||||
* Master file is of ASCII format and will also include the format of the slsReceiver Header.
|
||||
|
||||
|
||||
**HDF5 file formats**
|
||||
@ -350,7 +160,7 @@ When handling callbacks, the control should be returned as soon as possible, to
|
||||
**Example**
|
||||
* `main cpp file <https://github.com/slsdetectorgroup/api-examples/blob/master/e4-receiver_callbacks.cpp>`_
|
||||
* `cmake file <https://github.com/slsdetectorgroup/api-examples/blob/master/CMakeLists.txt>`_.
|
||||
* how to install the slsDetectorPackage with cmake is provided :ref:`here <build from source using cmake>`.
|
||||
* how to install the slsDetectorPackage is provided :ref:`here <build from source using cmake>`.
|
||||
* compile the example **e4-rxr** by:
|
||||
|
||||
.. code-block:: bash
|
||||
|
@ -8,26 +8,21 @@ open an issue at our `github repo issues
|
||||
Common
|
||||
------
|
||||
|
||||
Missing Packets
|
||||
^^^^^^^^^^^^^^^
|
||||
Possible causes could be the following:
|
||||
|
||||
1. Total Failure of Packet Delivery
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
#. Receiver PC is not tuned for socket buffer size and input packet queue.
|
||||
* Refer to :ref:`Increase rmem_default, rmem_max and max_backlog<Receiver PC Tuning>`
|
||||
|
||||
#. Data cable plugged into the wrong interface on board (Jungfrau)
|
||||
* Please ensure that the data cable is plugged into the rightmost interface (default for single interface). The inner one is disabled for PCB v1.0 and must be selected via command for PCB v2.0.
|
||||
#. Wiring
|
||||
* Faulty wiring or connecting cable to incorrect interface.
|
||||
|
||||
#. Link up and speed
|
||||
* Check ethtool and find if Link Deteced:Yes and Speed is acceptable (>10k).
|
||||
* Check to see if the 10G link is up (blue or red LED on board, close to SFP+). If not:
|
||||
|
||||
* Check transeiver and fibers are compatible (all MMF 850nm or all SMF 1030nm)
|
||||
* Check fiber
|
||||
* Check fiber polarity (if short range, unplug the link anywhere, and look at the light/dark pattern: dark has to mate with light)
|
||||
* For Jungfrau, check if the blue sfp light is blinking rapidly (even when it is not sending data). If so, most likely the link is down and something is wrong with the board. If it connected to a switch, then you do not see it with the ethtool command if link is down. One option is to connect it directly to a pc to see if link is down.
|
||||
* With nc, try "nc -u -p 50001 -l" in receiving pc, and from another pc try "echo hallo | nc -u 10.1.2.172 50001" to send something to the recieving pc interface to see if the link is up and see if the other nc console receives the hallo.
|
||||
* Check to see if there is a blue LED on board to signal that the link is up. Check ethtool and find if Link Deteced:Yes and Speed is acceptable (>10k).
|
||||
|
||||
#. Detector is not acquiring (Not Eiger)
|
||||
* Take an acquisition with many images and using the following steps instead of acquire:
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
sls_detector_put status start
|
||||
@ -35,88 +30,44 @@ Common
|
||||
# which means the detector is acquiring.
|
||||
sls_detector_get framesl
|
||||
|
||||
# If you are using multiple modules, the previous command can return -1 because each module will return different values. Then, check for a single module instead: sls_detector_get 0:framesl
|
||||
.. note ::
|
||||
|
||||
If you are using multiple modules, the previous command can return -1 because each module will return different values. Then, check for a single module instead: sls_detector_get 0:framesl
|
||||
|
||||
#. Data cable plugged into the wrong interface on board (Jungfrau)
|
||||
* Please ensure that the data cable is plugged into the rightmost interface. The middle one is disabled for PCB v1.0 and must be selected via command for PCB v2.0.
|
||||
|
||||
#. Detector is not sending data (Except Eiger)
|
||||
* Check the board to see if the green LED close to SFP is blinking (detector is sending data). If not, detector is not operated properly (period too short/long, no trigger in trigger mode) or misconfigured and needs reboot.
|
||||
#. Detector is not sending data
|
||||
* Check the board to see if the green LED is blinking next to the data cable, which means that the detector is sending data.
|
||||
|
||||
#. Power supply
|
||||
* Check if power supply has enough current.
|
||||
* For Jungfrau, refer to :ref:`Jungfrau Power Supply Troubleshooting<Jungfrau Troubleshooting Power Supply>`.
|
||||
#. Firewall or security feature
|
||||
* A firewall or some security feature could be blocking the reception of data.
|
||||
|
||||
#. Ethernet interface not configured properly
|
||||
* Ensure that the interfaces used are configured properly with the right mask and ip. Eg. use ifconfig and route commands to verify.
|
||||
|
||||
#. Ethernet interface not configured for Jumbo frames (10Gb)
|
||||
* Ensure that the interfaces (on NIC and the switch) used in receiver pc have MTU 9000 (jumbo frames) enabled.
|
||||
* Ensure that the interfaces used in receiver pc have MTU 9000 (jumbo frames) enabled.
|
||||
|
||||
#. Detector IP (Not Eiger)
|
||||
* Ensure it is valid and does not end if 0 or 255. Also ensure that the detector ip is in the same subnet as rx_udpip and the masking in the interface configuration ensures this rule.
|
||||
|
||||
#. Check if 'rx packets' counter in 'ifconfig' do not increment for interface.
|
||||
* If no, check switch configuration if present. Port counters of switch can also help to identify problem.
|
||||
* If yes, but receiver software does not see it:
|
||||
|
||||
* Check no firewall (eg. firewalld) is present or add rules
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
# Stop and disable firewall
|
||||
service firewalld stop
|
||||
systemctl disable firewalld
|
||||
# Check status
|
||||
service firewalld status
|
||||
|
||||
* Check that selinux is disabled ( or add rules)
|
||||
|
||||
#. Source UDP IP in config file (Not Eiger)
|
||||
* Ensure it is valid and does not end if 0 or 255. Also ensure that the source ip 'udp_srcip' is in the same subnet as destination ip 'udp_dstip' and the masking in the interface configuration ensures this rule.
|
||||
* Eg. If interface IP is 102.10.10.110 and mask is 255.255.255.0, udp_srcip has to be 102.10.10.xxx (same subnet)
|
||||
* Use ifconfig and route commands to verify etheret interface configuration
|
||||
|
||||
|
||||
#. Netstat and netcat
|
||||
* Try with netstat to see if its really listening to the right interface. Or netcat to see if you get packets.
|
||||
|
||||
#. Wireshark or Tcpdump
|
||||
#. Tcpdump or wireshark
|
||||
* Use one of these to confirm that you receive packets (with the right filtering ie. source and destination ports, ip).
|
||||
|
||||
|
||||
|
||||
2. Partial or Random Packet Loss (Performance)
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
.. note ::
|
||||
|
||||
The following suggestions are for convenience. Please do not follow blindly, research each parameter and adapt it to your system.
|
||||
|
||||
#. Receiver PC is not tuned for socket buffer size and input packet queue or other parameters.
|
||||
* Refer to :ref:`Receiver PC Tuning<Receiver PC Tuning>`
|
||||
|
||||
#. Wiring
|
||||
* Faulty wiring or connecting cable to incorrect interface.
|
||||
|
||||
#. Check SFP modules
|
||||
* Check if the SFP modules on both sides of the fiber are of same type.
|
||||
|
||||
#. Pinging the subnet (receiving only a few number of packets each time)
|
||||
* If a switch is used between a receiver pc and detector instead of plugging the cables directly, one might have to ping any ip in the subnet of the Ethernet interface constantly so that it does not forget the ip during operation.
|
||||
* Eg. if rx_udpip is 10.2.3.100, then ping constantly 10.2.3.xxx, where xxx is any ip other than 100.
|
||||
* Using slsReceiver, you can use a command that does this for you:
|
||||
.. code-block:: bash
|
||||
|
||||
# arping the interface in a separate thread every minute
|
||||
sls_detector_put rx_arping 1
|
||||
|
||||
|
||||
#. Only the slaves get no data
|
||||
* Check trigger cabling and trigger configuration
|
||||
* When you cannot stop Jungfrau slaves in sync mode, refer to :ref:`Cannot stop slaves<Jungfrau Troubleshooting Sync Slaves Cannot Stop>`.
|
||||
|
||||
.. _Receiver PC Tuning:
|
||||
|
||||
Receiver PC Tuning Options
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
.. note ::
|
||||
|
||||
| xth1 is example interface name in the following examples.
|
||||
| These settings are lost at pc reboot.
|
||||
|
||||
#. Increase maximum receive socket buffer size and socket input packet queue.
|
||||
* Temporarily (until shut down)
|
||||
.. code-block:: bash
|
||||
@ -160,7 +111,6 @@ Receiver PC Tuning Options
|
||||
# check how many GB memory you can allocate, to avoid swapping otherwise
|
||||
|
||||
|
||||
|
||||
#. Modify ethtool settings.
|
||||
* rx ring parameters
|
||||
.. code-block:: bash
|
||||
@ -177,9 +127,6 @@ Receiver PC Tuning Options
|
||||
# check
|
||||
ethtool -c xth1
|
||||
|
||||
# enable adaptive xoalescence parameters
|
||||
ethtool -C xth1 adaptive-rx on
|
||||
|
||||
# set to max value in your pc settings
|
||||
ethtool -C xth1 rx-usecs 100
|
||||
|
||||
@ -191,43 +138,11 @@ Receiver PC Tuning Options
|
||||
|
||||
# set to max value in your pc settings
|
||||
ethtool -A xth1 rx on
|
||||
|
||||
* generic receiver offload (might not always work)
|
||||
.. code-block:: bash
|
||||
|
||||
.. note ::
|
||||
|
||||
# check
|
||||
ethtool -k xth1
|
||||
|
||||
# enable generic receiver offload
|
||||
ethtool -K xth1 gro
|
||||
|
||||
|
||||
#. Disable power saving in CPU frequency scaling and set system to performance
|
||||
* Check current policy (default might be powersave or schedutil)
|
||||
.. code-block:: bash
|
||||
|
||||
# check current active governor and range of cpu freq policy
|
||||
cpupower frequency-info --policy
|
||||
# list all available governors for this kernel
|
||||
cpupower frequency-info --governors
|
||||
|
||||
* Temporarily (until shut down)
|
||||
.. code-block:: bash
|
||||
|
||||
# set to performance
|
||||
sudo cpupower frequency-set -g performance
|
||||
|
||||
# or
|
||||
cpufreq-info
|
||||
for i in ‘seq 0 7‘; do cpufreq-set -c $i -g performance; done
|
||||
|
||||
* Permanently
|
||||
.. code-block:: bash
|
||||
|
||||
# edit /etc/sysconfig/cpupower to preference
|
||||
|
||||
# enable or disable permanently
|
||||
sudo systemctl enable cpupower
|
||||
| xth1 is example interface name.
|
||||
| These settings are lost at pc reboot.
|
||||
|
||||
#. Give user speicific user scheduling privileges.
|
||||
.. code-block:: bash
|
||||
@ -240,29 +155,18 @@ Receiver PC Tuning Options
|
||||
|
||||
This is also set if slsReceiver is run as root user.
|
||||
|
||||
#. Some more advanced options:
|
||||
.. warning ::
|
||||
|
||||
Please do not try if you do not understand
|
||||
#. Disable power saving in CPU frequency
|
||||
.. code-block:: bash
|
||||
|
||||
#. reduce the number of queue per NIC to the number of expected streams: ethtool -L xth0 combined 2
|
||||
#. assign each queue to its stream: ethtool -U xth0 flow-type tcp4 dst-port 50004 action 1
|
||||
#. assign to each queue (IRQ) one CPU on the right socket: echo "3"> /proc/irq/47/smp_affinity_list #change the numbers looking at /proc/interrupts
|
||||
#. disable irqbalance service
|
||||
#. Be sure that the switch knows the receiver mac address. Most switches reset the mac lists every few minutes, and since the receiver only receives, there is not a periodic refresh of the mac list. In this case, one can set a fixed mac list in the switch, or setup some kind of script arping or pinging out from that interface (will be available in 7.0.0).
|
||||
#. assign the receiver numa node (also with -m) to the socket where the NIC is attached. To know it, cat /sys/class/net/ethxxx/device/numa_node
|
||||
#. ensure file system performance can handle sustained high data rate:
|
||||
|
||||
* One can use dd:
|
||||
# or similar command depending on your distribution
|
||||
cpupower frequency-info
|
||||
cpupower frequency-set -g performance
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
dd if=/dev/zero of=/testpath/testfile bs=1M count=100000
|
||||
* Or better fio (which needs to be installed)
|
||||
# or
|
||||
cpufreq-info
|
||||
for i in ‘seq 0 7‘; do cpufreq-set -c $i -g performance; done
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
fio --name=global –directory=/testpath/ --rw=write --ioengine=libaio --direct=0 --size=200G -- numjobs=2 --iodepth=1 --bs=1M –name=job
|
||||
|
||||
slsReceiver Tuning
|
||||
^^^^^^^^^^^^^^^^^^
|
||||
@ -270,25 +174,18 @@ slsReceiver Tuning
|
||||
#. Starting receiver as root to have scheduling privileges.
|
||||
|
||||
#. For 10g, enable flow control
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
sls_detector_put flowcontrol10g 1
|
||||
|
||||
#. Increase slsReceiver ring buffer depth
|
||||
This can be tuned depending on the number of receivers (modules) and memory available.
|
||||
|
||||
#. Increase slsReceiver fifo depth between listening and processing threads.
|
||||
.. code-block:: bash
|
||||
|
||||
# sugggested not to use more than half memory of CPU socket in case of NUMA systems) for this
|
||||
|
||||
sls_detector_get rx_fifodepth
|
||||
# sets number of frames in fifo to 1024 ~1GB per receiver. Default is 2500
|
||||
sls_detector_put rx_fifodepth 1024
|
||||
|
||||
#. Increase number of frames per file
|
||||
This can reduce time taken to open and close files.
|
||||
# sets number of frames in fifo to 5000
|
||||
sls_detector_put rx_fifodepth 5000
|
||||
|
||||
#. Increase number of frames per file to reduce time taken to open and close files.
|
||||
.. code-block:: bash
|
||||
|
||||
sls_detector_get rx_framesperfile
|
||||
@ -296,31 +193,10 @@ slsReceiver Tuning
|
||||
# writes all frames into a single file
|
||||
sls_detector_put rx_framesperfile 0
|
||||
|
||||
#. Disable file write
|
||||
This can ensure it is not the file system performance hampering high date rate.
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
sls_detector_put fwrite 0
|
||||
|
||||
|
||||
Shared memory error
|
||||
^^^^^^^^^^^^^^^^^^^
|
||||
For errors due to access or size, use any of the following suggestions.
|
||||
#. Delete shared memory files and try again
|
||||
#. Use environment variable to use a different shared memory ending in jfxx
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
# shared memory ending in jfxx
|
||||
export SLSDETNAME=jfxx
|
||||
|
||||
#. USe a different multi shared memory ID
|
||||
.. code-block:: bash
|
||||
|
||||
sls_detector_put 2-config xxxx.config
|
||||
# or
|
||||
sls_detector_put 2-hostname bchipxxx
|
||||
| For errors due to access or size, delete shared memory files nd try again.
|
||||
|
||||
To list all shared memory files of sls detector package.
|
||||
.. code-block:: bash
|
||||
@ -431,24 +307,6 @@ Cannot get multi module data
|
||||
|
||||
#. Check :ref:`Common Multi Module Troubleshooting<common troubleshooting multi module data>`
|
||||
#. Power Supply
|
||||
* Jungfrau needs a ~4A per module for a short time at startup. If not, it reboots misconfigured.
|
||||
* Comment out this line in the config file: powerchip 1
|
||||
* Powering on the chip increases the power consumption by a considerable amount. If commenting out this line aids in getting data (strange data due to powered off chip), then it could be the power supply current limit. Fix it (possibly to 8A current limit) and uncomment the powerchip line back in config file.
|
||||
|
||||
|
||||
|
||||
.. _Jungfrau Troubleshooting Sync Slaves Cannot Stop:
|
||||
|
||||
Cannot stop slaves in sync mode
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
#. If cabling is accessible, ensure termination board and flatband cable between the masters and the slaves are connnected properly. Then try to stop.
|
||||
#. If cabling is inaccessible, unsync first so that the slaves can get the stop directly from the client using the command. Then, don't use sync mode until the cabling is fixed.
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
# unsync, slaves command will fail as it is still in waiting state
|
||||
sls_detector_put sync 0
|
||||
|
||||
# stop should now be successful as master does not determine the stop anymore
|
||||
sls_detector_put stop
|
||||
|
@ -1,37 +0,0 @@
|
||||
.. _detector udp header:
|
||||
|
||||
|
||||
Config file
|
||||
============
|
||||
|
||||
Commands to configure the UDP in the config file:
|
||||
|
||||
.. note ::
|
||||
|
||||
These command are recommended to be placed before "rx_hostname" if it is used.
|
||||
|
||||
Source Port
|
||||
-----------
|
||||
Hardcoded in detector server, starting at 32410.
|
||||
|
||||
udp_srcip - Source IP
|
||||
---------------------
|
||||
IP address of detector UDP interface to send packets from. Do not use for Eiger 1Gb interface (uses its hardware IP). For others, must be in the same subnet as **udp_dstip**.
|
||||
|
||||
udp_srcmac - Source MAC
|
||||
-----------------------
|
||||
MAC address of detector UDP interface to send packets from. Do not use for Eiger (uses hardware mac). For others, it is not necessary, but can help for switch and debugging to put unique values for each module.
|
||||
|
||||
|
||||
udp_dstport - Desintation Port
|
||||
-------------------------------
|
||||
Port in receiver pc to listen to packets from the detector.
|
||||
|
||||
udp_dstip - Destination IP
|
||||
--------------------------
|
||||
IP address of interface in receiver pc to listen to packets from detector. If **auto** is used (only when using slsReceiver/ slsMultiReceiver), the IP of **rx_hostname** is picked up.
|
||||
|
||||
udp_dstmac - Destination MAC
|
||||
----------------------------
|
||||
MAC address of interface in receiver pc to list to packets from detector. Only required when using custom receiver, else slsReceiver/slsMultiReceiver picks it up from **udp_dstip**.
|
||||
|
@ -1,152 +0,0 @@
|
||||
.. _detector specific fields:
|
||||
|
||||
Detector Specific Fields
|
||||
========================
|
||||
|
||||
Please check out :ref:`the current detector header <detector udp header>` to see
|
||||
where the detector specific fields are placed.
|
||||
|
||||
|
||||
|
||||
Eiger
|
||||
------
|
||||
|
||||
.. table:: Detector Specific Field
|
||||
|
||||
+----------+------------------------------+
|
||||
| expLength| Sub Frame Number |
|
||||
+----------+------------------------------+
|
||||
| detSpec1 | 0x0 |
|
||||
+----------+------------------------------+
|
||||
| detSpec2 | 0x0 |
|
||||
+----------+------------------------------+
|
||||
| detSpec3 | e14a |
|
||||
+----------+------------------------------+
|
||||
| detSpec4 | Round Robin Interface Number |
|
||||
+----------+------------------------------+
|
||||
|
||||
|
||||
Jungfrau
|
||||
---------
|
||||
|
||||
.. table:: Detector Specific Field
|
||||
|
||||
+----------+------------------------------+
|
||||
| detSpec1 | Bunch Id [#]_ |
|
||||
+----------+------------------------------+
|
||||
| detSpec2 | 0 |
|
||||
+----------+------------------------------+
|
||||
| detSpec3 | DAQ info |
|
||||
+----------+------------------------------+
|
||||
| detSpec4 | 0 |
|
||||
+----------+------------------------------+
|
||||
|
||||
|
||||
.. table:: DAQ Info Field
|
||||
|
||||
+----------+--------------------+----------------------------------------------+
|
||||
| Bits | Name | Description |
|
||||
+----------+--------------------+-----+----------------------------------------+
|
||||
| 0 | High gain | 1 | High Gain enabled |
|
||||
| | +-----+----------------------------------------+
|
||||
| | | 0 | High Gain disabled |
|
||||
+----------+--------------------+-----+----------------------------------------+
|
||||
| 1 | Fix gain stage 1 | 1 | Gain stage 1 fixed. The switch that |
|
||||
| | | | selects the gains stage 1 is active all|
|
||||
| | | | the time. |
|
||||
| | +-----+----------------------------------------+
|
||||
| | | 0 | Gain stage 1 unset. The switch that |
|
||||
| | | | selects the gains stage 1 is inactive |
|
||||
| | | | all the time. |
|
||||
+----------+--------------------+-----+----------------------------------------+
|
||||
| 2 | Fix gain stage 2 | 1 | Gain stage 2 fixed. The switch that |
|
||||
| | | | selects the gains stage 2 is active all|
|
||||
| | | | the time. |
|
||||
| | +-----+----------------------------------------+
|
||||
| | | 0 | Gain stage 2 unset. The switch that |
|
||||
| | | | selects the gains stage 2 is inactive |
|
||||
| | | | all the time. |
|
||||
+----------+--------------------+-----+----------------------------------------+
|
||||
| 4 | Comparator reset | 1 | On-chip comparator in reset state. |
|
||||
| | | | Dynamic-gain switching is therefore |
|
||||
| | | | disabled. |
|
||||
| | +-----+----------------------------------------+
|
||||
| | | 0 | On-chip comparator active. |
|
||||
+----------+--------------------+-----+-----+-----+----------------------------+
|
||||
| 7-5 | Jungfrau chip |Bit 7|Bit 6|Bit 5| Description |
|
||||
| | version +-----+-----+-----+----------------------------+
|
||||
| | | 0 | 0 | 0 | v1.0 |
|
||||
| | +-----+-----+-----+----------------------------+
|
||||
| | | 0 | 0 | 1 | v1.1 |
|
||||
| | +-----+-----+-----+----------------------------+
|
||||
| | | 0 | 1 | X | Reserved |
|
||||
| | +-----+-----+-----+----------------------------+
|
||||
| | | 1 | X | X | Reserved |
|
||||
+----------+--------------------+-----+-----+-----+----------------------------+
|
||||
| 11-8 | Storage cell select|Storage cell used for this exposure. This |
|
||||
| | |field defines the storage cell that was used |
|
||||
| | |to acquire the data of this frame |
|
||||
+----------+--------------------+-----+----------------------------------------+
|
||||
| 12 | Force switching | 1 | Forced switching to gain stage 1 at the|
|
||||
| | to gain stage 1 | | start of the exposure period. |
|
||||
| | +-----+----------------------------------------+
|
||||
| | | 0 | Disabled forced gain switching to gain |
|
||||
| | | | stage 1. Dynamic gain switching |
|
||||
| | | | conditions apply. |
|
||||
+----------+--------------------+-----+----------------------------------------+
|
||||
| 13 | Force switching | 1 | Forced switching to gain stage 2 at the|
|
||||
| | to gain stage 2 | | start of the exposure period. |
|
||||
| | +-----+----------------------------------------+
|
||||
| | | 0 | Disabled forced gain switching to gain |
|
||||
| | | | stage 2. Dynamic gain switching |
|
||||
| | | | conditions apply. |
|
||||
+----------+--------------------+-----+-----+-----+----------------------------+
|
||||
| 23-16 | 10-Gigabit event |The 8-bit event code contains value of the |
|
||||
| | code |event received over the 10 GbE interface by |
|
||||
| | |JUNGFRAU detector at the moment of the frame |
|
||||
| | |acquisition. |
|
||||
+----------+--------------------+-----+----------------------------------------+
|
||||
| 31 | External input flag| 1 | External input flag detected in the |
|
||||
| | | | last exposure. |
|
||||
| | +-----+----------------------------------------+
|
||||
| | | 0 | External input flag not detected in the|
|
||||
| | | | last exposure. |
|
||||
+----------+--------------------+-----+----------------------------------------+
|
||||
|
||||
|
||||
|
||||
Gotthard2
|
||||
----------
|
||||
|
||||
.. table:: Detector Specific Field
|
||||
|
||||
+----------+------------------------------+
|
||||
| detSpec1 | Train Id [#]_ |
|
||||
+----------+------------------------------+
|
||||
| detSpec2 | Bunch Id [#]_ |
|
||||
+----------+------------------------------+
|
||||
| detSpec3 | 0 |
|
||||
+----------+------------------------------+
|
||||
| detSpec4 | 0 |
|
||||
+----------+------------------------------+
|
||||
|
||||
|
||||
Mythen3
|
||||
----------
|
||||
|
||||
.. table:: Detector Specific Field
|
||||
|
||||
+----------+------------------------------+
|
||||
| detSpec1 | 0 |
|
||||
+----------+------------------------------+
|
||||
| detSpec2 | 0 |
|
||||
+----------+------------------------------+
|
||||
| detSpec3 | 0 |
|
||||
+----------+------------------------------+
|
||||
| detSpec4 | 0 |
|
||||
+----------+------------------------------+
|
||||
|
||||
|
||||
.. [#] **Bunch Id**: bunch identification number received by the detector at the moment of frame acquisition.
|
||||
.. [#] **Train Id**: train identification number received by the detector at the moment of frame acquisition.
|
||||
.. [#] **Bunch Id**: bunch identification number to identify every single exposure during a burst acquisition.
|
@ -1,125 +0,0 @@
|
||||
.. _detector udp header:
|
||||
|
||||
Format
|
||||
=======
|
||||
|
||||
The UDP data format for the packets consist of a common header for all detectors, followed by the data for that one packet.
|
||||
|
||||
|
||||
Current Version
|
||||
---------------------------
|
||||
|
||||
**v2.0 (slsDetectorPackage v7.0.0+)**
|
||||
|
||||
.. table:: <---------------------------------------------------- 8 bytes per row --------------------------------------------->
|
||||
:align: center
|
||||
:widths: 30,30,30,15,15
|
||||
|
||||
+---------------------------------------------------------------+
|
||||
| frameNumber |
|
||||
+-------------------------------+-------------------------------+
|
||||
| expLength | packetNumber |
|
||||
+-------------------------------+-------------------------------+
|
||||
| **detSpec1** |
|
||||
+---------------------------------------------------------------+
|
||||
| timestamp |
|
||||
+---------------+---------------+---------------+---------------+
|
||||
| modId | row | column | **detSpec2** |
|
||||
+---------------+---------------+---------------+-------+-------+
|
||||
| **detSpec3** | **detSpec4** |detType|version|
|
||||
+-------------------------------+---------------+-------+-------+
|
||||
|
||||
|
||||
.. note ::
|
||||
|
||||
Since there is no difference in the format of the UDP header from the detector
|
||||
from the previous version (v2.0), the version number stays the same.
|
||||
|
||||
Only the struture member names have changed in sls_detector_defs.h
|
||||
|
||||
|
||||
|
||||
Description
|
||||
------------
|
||||
|
||||
* **Detector specific field** descriptions are found :ref:`here<detector specific fields>`.
|
||||
|
||||
* **frameNumber**: framenumber to which the current packet belongs to.
|
||||
|
||||
* **expLength**: measured exposure time of the frame in tenths of microsecond. It is instead the sub frame number for Eiger.
|
||||
|
||||
* **packetNumber**: packet number of the frame to which the current data belongs to.
|
||||
|
||||
* **timestamp**: time measured at the start of frame exposure since the start of the current measurement. It is expressed in tenths of microsecond.
|
||||
|
||||
* **modId**: module ID picked up from det_id_[detector type].txt on the detector cpu.
|
||||
|
||||
* **row**: row position of the module in the detector system. It is calculated by the order of the module in hostname command, as well as the detsize command.
|
||||
|
||||
* **column**: column position of the module in the detector system. It is calculated by the order of the module in hostname command, as well as the detsize command.
|
||||
|
||||
* **detType**: detector type from enum of detectorType in the package.
|
||||
|
||||
* **version**: current version of the detector header (0x2).
|
||||
|
||||
|
||||
Detector Enum
|
||||
--------------
|
||||
|
||||
================ ========
|
||||
Detector Type Value
|
||||
================ ========
|
||||
GENERIC 0
|
||||
EIGER 1
|
||||
GOTTHARD 2
|
||||
JUNGFRAU 3
|
||||
CHIPTESTBOARD 4
|
||||
MOENCH 5
|
||||
MYTHEN3 6
|
||||
GOTTHARD2 7
|
||||
================ ========
|
||||
|
||||
|
||||
|
||||
Previous Versions
|
||||
-----------------
|
||||
**v2.0 (Package v4.0.0 - 6.x.x)**
|
||||
|
||||
.. table:: <---------------------------------------------------- 8 bytes ---------------------------------------------------->
|
||||
:align: center
|
||||
:widths: 30,30,30,15,15
|
||||
|
||||
+---------------------------------------------------------------+
|
||||
| frameNumber |
|
||||
+-------------------------------+-------------------------------+
|
||||
| expLength | packetNumber |
|
||||
+-------------------------------+-------------------------------+
|
||||
| bunchid |
|
||||
+---------------------------------------------------------------+
|
||||
| timestamp |
|
||||
+---------------+---------------+---------------+---------------+
|
||||
| modId | **row** | **column** | **reserved** |
|
||||
+---------------+---------------+---------------+-------+-------+
|
||||
| debug | roundRNumber |detType|version|
|
||||
+-------------------------------+---------------+-------+-------+
|
||||
|
||||
**v1.0 (Package v3.0.0 - 3.1.5)**
|
||||
|
||||
.. table:: <---------------------------------------------------- 8 bytes ---------------------------------------------------->
|
||||
:align: center
|
||||
:widths: 30,30,30,15,15
|
||||
|
||||
+---------------------------------------------------------------+
|
||||
| frameNumber |
|
||||
+-------------------------------+-------------------------------+
|
||||
| expLength | packetNumber |
|
||||
+-------------------------------+-------------------------------+
|
||||
| bunchid |
|
||||
+---------------------------------------------------------------+
|
||||
| timestamp |
|
||||
+---------------+---------------+---------------+---------------+
|
||||
| modId | xCoord | yCoord | zCoord |
|
||||
+---------------+---------------+---------------+-------+-------+
|
||||
| debug | roundRNumber |detType|version|
|
||||
+-------------------------------+---------------+-------+-------+
|
||||
|
@ -1,6 +1,6 @@
|
||||
.. _Virtual Detector Servers:
|
||||
Simulators
|
||||
===========
|
||||
Detector Simulators
|
||||
===================
|
||||
|
||||
Compilation
|
||||
-----------
|
||||
@ -13,14 +13,16 @@ Compilation
|
||||
* Using cmk.sh script,
|
||||
.. code-block:: bash
|
||||
|
||||
./cmk.sh -bsj9 # option -s is for simulator
|
||||
./cmk.sh -bsj9 #option s is for simulator
|
||||
|
||||
|
||||
Binaries
|
||||
^^^^^^^^
|
||||
.. code-block:: bash
|
||||
|
||||
eigerDetectorServer_virtual
|
||||
eigerDetectorServerMaster_virtual
|
||||
eigerDetectorServerSlaveTop_virtual
|
||||
eigerDetectorServerSlaveBottom_virtual
|
||||
jungfrauDetectorServer_virtual
|
||||
gotthardDetectorServer_virtual
|
||||
gotthard2DetectorServer_virtual
|
||||
@ -65,15 +67,7 @@ Sample Config file
|
||||
^^^^^^^^^^^^^^^^^^
|
||||
There are sample config files for each detector in slsDetectorPackage/examples folder.
|
||||
|
||||
For a Single Module (Basic)
|
||||
.. code-block:: bash
|
||||
|
||||
hostname localhost
|
||||
rx_hostname localhost
|
||||
udp_dstip auto
|
||||
|
||||
|
||||
For a Single Module (With Options)
|
||||
For a Single Module
|
||||
.. code-block:: bash
|
||||
|
||||
# connects to control port 1912
|
||||
@ -86,8 +80,7 @@ For a Single Module (With Options)
|
||||
udp_dstport 50012
|
||||
|
||||
# source udp ips must be same subnet at destintaion udp ips
|
||||
# takes the same ip as hostname
|
||||
udp_srcip auto
|
||||
udp_srcip 192.168.1.112
|
||||
|
||||
# destination udp ip picked up from rx_hostname (if auto)
|
||||
udp_dstip auto
|
||||
@ -102,14 +95,12 @@ For Multiple Modules
|
||||
virtual 2 1912
|
||||
# or hostname localhost:1912+localhost:1914+
|
||||
|
||||
# increasing receiver tcp ports (multi detector command)
|
||||
rx_tcpport 2012
|
||||
# connects to receivers at ports 2012 and 2014
|
||||
rx_hostname mpc1922:2012+mpc1922:2013+
|
||||
|
||||
# connects to reciever at port 2012 and 2013
|
||||
rx_hostname mpc1922
|
||||
|
||||
# sets increasing destination udp ports
|
||||
udp_dstport 50012
|
||||
# sets differernt destination udp ports
|
||||
0:udp_dstport 50012
|
||||
1:udp_dstport 50014
|
||||
|
||||
# source udp ips must be same subnet at destintaion udp ips
|
||||
0:udp_srcip 192.168.1.112
|
||||
@ -149,7 +140,7 @@ Gui
|
||||
Limitations
|
||||
-----------
|
||||
|
||||
#. Data coming out of virtual server is fake.
|
||||
#. Data coming out of virtual server is fake. Value at each pixel/ channel is incremented by 1.
|
||||
|
||||
#. A stop will stop the virtual acquisition only at the start of every new frame.
|
||||
|
||||
|
2
docs/static/extra.css
vendored
2
docs/static/extra.css
vendored
@ -1,4 +1,4 @@
|
||||
/* override table no-wrap */
|
||||
.wy-table-responsive table td, .wy-table-responsive table th {
|
||||
white-space: normal;
|
||||
}
|
||||
}
|
24
evalVersionVariables.sh
Executable file
24
evalVersionVariables.sh
Executable file
@ -0,0 +1,24 @@
|
||||
# SPDX-License-Identifier: LGPL-3.0-or-other
|
||||
# Copyright (C) 2021 Contributors to the SLS Detector Package
|
||||
GITREPO1='git remote -v'
|
||||
GITREPO2=" | grep \"fetch\" | cut -d' ' -f1"
|
||||
BRANCH1='git branch -v'
|
||||
BRANCH2=" | grep '*' | cut -d' ' -f2"
|
||||
REPUID1='git log --pretty=format:"%H" -1'
|
||||
AUTH1_1='git log --pretty=format:"%cn" -1'
|
||||
AUTH1_2=" | cut -d' ' -f1"
|
||||
AUTH2_1='git log --pretty=format:"%cn" -1'
|
||||
AUTH2_2=" | cut -d' ' -f2"
|
||||
FOLDERREV1='git log --oneline . ' #used for all the individual server folders
|
||||
FOLDERREV2=" | wc -l" #used for all the individual server folders
|
||||
REV1='git log --oneline '
|
||||
REV2=" | wc -l"
|
||||
|
||||
GITREPO=`eval $GITREPO1 $GITREPO2`
|
||||
BRANCH=`eval $BRANCH1 $BRANCH2`
|
||||
REPUID=`eval $REPUID1`
|
||||
AUTH1=`eval $AUTH1_1 $AUTH1_2`
|
||||
AUTH2=`eval $AUTH2_1 $AUTH2_2`
|
||||
REV=`eval $REV1 $REV2`
|
||||
FOLDERREV=`eval $FOLDERREV1 $FOLDERREV2`
|
||||
|
@ -1,6 +0,0 @@
|
||||
0
|
||||
10, 30
|
||||
40:45 50:52
|
||||
1279
|
||||
# all bad channels are applied for all counters in deector
|
||||
|
@ -4,33 +4,27 @@ detsize 1024 512
|
||||
# detector hostname for controls
|
||||
hostname beb059+beb058+
|
||||
|
||||
# increasing receiver tcp port (multi detector command)
|
||||
rx_tcpport 1991
|
||||
|
||||
# 1Gb receiver pc hostname to configure receiver
|
||||
rx_hostname x12sa-vcons
|
||||
|
||||
# or 1Gb receiver pc hostname with tcp port to configure receiver
|
||||
#rx_hostname x12sa-vcons:1991+x12sa-vcons:1992
|
||||
|
||||
# increasing udp destination ports for all half modules
|
||||
udp_dstport 50011
|
||||
# 1Gb receiver pc hostname with tcp port to configure receiver
|
||||
rx_hostname x12sa-vcons:1991+x12sa-vcons:1992
|
||||
|
||||
# udp port first quadrant, first halfmodule
|
||||
#0:udp_dstport 50011
|
||||
0:udp_dstport 50011
|
||||
|
||||
# udp port second quadrant, first halfmodule
|
||||
#0:udp_dstport2 50012
|
||||
# udp port first quadrant, second halfmodule
|
||||
#1:udp_dstport 50013
|
||||
# udp port second quadrant, second halfmodule
|
||||
#1:udp_dstport2 50014
|
||||
|
||||
0:udp_dstport2 50012
|
||||
|
||||
# udp IP of the receiver over 10Gb
|
||||
0:udp_dstip 10.0.30.210
|
||||
|
||||
# first half module 10 Gb IP (same subnet as 0:udp_dstip)
|
||||
0:udp_srcip 10.0.30.100
|
||||
|
||||
# udp port first quadrant, second halfmodule
|
||||
1:udp_dstport 50013
|
||||
|
||||
# udp port second quadrant, second halfmodule
|
||||
1:udp_dstport2 50014
|
||||
|
||||
# udp IP of the receiver over 10Gb,
|
||||
1:udp_dstip 10.0.40.210
|
||||
|
||||
|
@ -4,23 +4,18 @@ detsize 1024 512
|
||||
# detector hostname for controls
|
||||
hostname beb059+beb058+
|
||||
|
||||
# increasing receiver tcp port (multi detector command)
|
||||
rx_tcpport 1991
|
||||
|
||||
# 1Gb receiver pc hostname to configure receiver
|
||||
rx_hostname x12sa-vcons
|
||||
|
||||
# increasing udp destination ports for all half modules
|
||||
udp_dstport 50011
|
||||
# 1Gb receiver pc hostname with tcp port to configure receiver
|
||||
rx_hostname x12sa-vcons:1991+x12sa-vcons:1992
|
||||
|
||||
# udp port first quadrant, first halfmodule
|
||||
#0:udp_dstport 50011
|
||||
0:udp_dstport 50011
|
||||
#udp port second quadrant, first halfmodule
|
||||
#0:udp_dstport2 50012
|
||||
0:udp_dstport2 50012
|
||||
|
||||
# udp port first quadrant, second halfmodule
|
||||
#1:udp_dstport 50013
|
||||
1:udp_dstport 50013
|
||||
# udp port second quadrant, second halfmodule
|
||||
#1:udp_dstport2 50014
|
||||
1:udp_dstport2 50014
|
||||
|
||||
# output directory
|
||||
fpath /sls/X12SA/data/x12saop/Data10/Eiger0.5M
|
||||
|
@ -409,18 +409,18 @@ patword 018d 0008599f0008503a
|
||||
patioctrl 8f0effff6dbffdbf
|
||||
patclkctrl 0000000000000000
|
||||
patlimits 0000 018c
|
||||
patloop 0 013a 016b
|
||||
patnloop 0 199
|
||||
patloop 1 0400 0400
|
||||
patnloop 1 0
|
||||
patloop 2 0400 0400
|
||||
patnloop 2 0
|
||||
patwait 0 00aa
|
||||
patwaittime 0 10000
|
||||
patwait 1 0400
|
||||
patwaittime 1 0
|
||||
patwait 2 0400
|
||||
patwaittime 2 0
|
||||
patloop0 013a 016b
|
||||
patnloop0 199
|
||||
patloop1 0400 0400
|
||||
patnloop1 0
|
||||
patloop2 0400 0400
|
||||
patnloop2 0
|
||||
patwait0 00aa
|
||||
patwaittime0 10000
|
||||
patwait1 0400
|
||||
patwaittime1 0
|
||||
patwait2 0400
|
||||
patwaittime2 0
|
||||
|
||||
#############################################
|
||||
### edit with hostname or 1Gbs IP address of your server
|
||||
|
@ -4,18 +4,14 @@ detsize 1024 1024
|
||||
# detector hostname
|
||||
hostname bchip048+bchip052+
|
||||
|
||||
# increasing receiver ports 1954 and 1955 (multi detector command)
|
||||
rx_tcpport 1954
|
||||
|
||||
# 1Gb receiver pc hostname
|
||||
rx_hostname pcmoench01
|
||||
# 1Gb receiver pc hostname (default tcpport: 1954)
|
||||
rx_hostname pcmoench01+pcmoench01:1955
|
||||
|
||||
|
||||
# increasing udp ports 50004 and 50005 (multi detector command)
|
||||
udp_dstport 50004
|
||||
# or custom udp destination port (receiver) for 1st module
|
||||
#0:udp_dstport 50014
|
||||
|
||||
# udp configurations for 1st module
|
||||
# udp destination port (receiver)
|
||||
0:udp_dstport 50004
|
||||
|
||||
# udp destination ip (receiver)
|
||||
0:udp_dstip 10.1.1.100
|
||||
@ -23,11 +19,17 @@ udp_dstport 50004
|
||||
# udp source ip (same subnet as 0:udp_dstip)
|
||||
0:udp_srcip 10.1.1.10
|
||||
|
||||
|
||||
|
||||
# udp configurations for 2nd module
|
||||
# udp destination port (receiver)
|
||||
1:udp_dstport 50005
|
||||
|
||||
# udp destination ip (receiver)
|
||||
1:udp_dstip 10.1.2.100
|
||||
1:udp_dstip 10.1.1.100
|
||||
|
||||
# udp source ip (same subnet as 1:udp_dstip)
|
||||
1:udp_srcip 10.1.2.11
|
||||
1:udp_srcip 10.1.1.11
|
||||
|
||||
|
||||
|
||||
@ -43,5 +45,5 @@ timing trigger
|
||||
# output file directory
|
||||
fpath /external_pool/jungfrau_data/softwaretest
|
||||
|
||||
# disable file writing (default)
|
||||
# disable file writing
|
||||
fwrite 0
|
@ -3,33 +3,33 @@
|
||||
### edit with hostname or IP address of your detector
|
||||
############################################
|
||||
#hostname bchip181+
|
||||
hostname bchip135
|
||||
hostname bchip119.psi.ch
|
||||
|
||||
#############################################
|
||||
### edit with hostname or 1Gbs IP address of your server
|
||||
############################################
|
||||
rx_hostname mpc2011
|
||||
rx_hostname mpc2011:1777
|
||||
|
||||
#############################################
|
||||
### edit with 10 Gbs IP of your server
|
||||
############################################
|
||||
udp_dstip 10.1.1.102
|
||||
udp_dstip 10.1.2.102
|
||||
#############################################
|
||||
### edit with any number in the subnet of your server (first 3 numbers as above)
|
||||
############################################
|
||||
udp_srcip 10.1.1.19
|
||||
udp_dstport 32411
|
||||
udp_srcip 10.1.2.19
|
||||
udp_dstport 32000
|
||||
|
||||
#############################################
|
||||
### edit with 10 Gbs IP of your server
|
||||
############################################
|
||||
rx_zmqip 10.1.1.102
|
||||
rx_zmqport 50003
|
||||
rx_zmqip 10.1.2.102
|
||||
rx_zmqport 77000
|
||||
#############################################
|
||||
### edit with 1 Gbs IP of PC where you will run the GUI
|
||||
############################################
|
||||
zmqip 129.129.202.57
|
||||
zmqport 50001
|
||||
zmqip 129.129.202.132
|
||||
zmqport 77001
|
||||
|
||||
|
||||
|
||||
@ -38,7 +38,7 @@ rx_zmqstream 1
|
||||
|
||||
|
||||
|
||||
frames 100000
|
||||
frames 1000
|
||||
period 0.0006
|
||||
exptime 0.00035
|
||||
|
||||
@ -62,3 +62,9 @@ highvoltage 90
|
||||
#adcreg 0x14 0x40
|
||||
|
||||
|
||||
|
||||
frames 10
|
||||
period 0.1
|
||||
rx_jsonpara subframes 1
|
||||
rx_jsonpara frameMode raw
|
||||
rx_jsonpara detectorMode analog
|
||||
|
@ -1,22 +0,0 @@
|
||||
numfiles 1
|
||||
nthreads 5,
|
||||
fifosize 5000
|
||||
nsigma 5
|
||||
gainfile none
|
||||
detectorMode counting
|
||||
threshold 0
|
||||
pedestalfile none
|
||||
nframes 0
|
||||
xMin 0
|
||||
xMax 400
|
||||
yMin 0
|
||||
yMax 400
|
||||
outdir ./
|
||||
indir ./
|
||||
flist none
|
||||
fformat none
|
||||
runmin 0
|
||||
runmax -1
|
||||
readnrows 400
|
||||
eMin 0
|
||||
eMax 16000
|
@ -1,18 +1,18 @@
|
||||
# detector hostname
|
||||
hostname localhost:1910
|
||||
|
||||
# udp destination ports
|
||||
udp_dstport 50010
|
||||
|
||||
# udp source ip (same subnet as udp_dstip)
|
||||
udp_srcip 192.168.1.100
|
||||
|
||||
# receiver hostname
|
||||
rx_hostname mpc1922:2010
|
||||
|
||||
# udp destination ports
|
||||
udp_dstport 50010
|
||||
|
||||
# udp destination ip from rx_hostname
|
||||
udp_dstip auto
|
||||
|
||||
# udp source ip (same subnet as udp_dstip)
|
||||
udp_srcip 192.168.1.100
|
||||
|
||||
# output file directory
|
||||
fpath /tmp
|
||||
|
||||
@ -27,7 +27,418 @@ dbitclk 40
|
||||
|
||||
|
||||
# patterns
|
||||
pattern /tmp/pattern.pat
|
||||
patword 0x0000 0x0000000000000000
|
||||
patword 0x0001 0x0000000000000000
|
||||
patword 0x0002 0x0008000900080000
|
||||
patword 0x0003 0x0008000900080000
|
||||
patword 0x0004 0x0008000900080000
|
||||
patword 0x0005 0x0008000900080000
|
||||
patword 0x0006 0x0008000900080000
|
||||
patword 0x0007 0x0008000900080000
|
||||
patword 0x0008 0x0008000900080000
|
||||
patword 0x0009 0x0008000900080000
|
||||
patword 0x000a 0x0008000900080000
|
||||
patword 0x000b 0x0008000900080000
|
||||
patword 0x000c 0x0008000900080000
|
||||
patword 0x000d 0x0008000900080000
|
||||
patword 0x000e 0x0008000900080000
|
||||
patword 0x000f 0x0008000900080000
|
||||
patword 0x0010 0x0008000900080000
|
||||
patword 0x0011 0x0008000900080000
|
||||
patword 0x0012 0x0008000900080000
|
||||
patword 0x0013 0x0008000900080000
|
||||
patword 0x0014 0x0008000900080000
|
||||
patword 0x0015 0x0008000900080000
|
||||
patword 0x0016 0x0008400900080020
|
||||
patword 0x0017 0x0008400900080020
|
||||
patword 0x0018 0x0008599f0418503a
|
||||
patword 0x0019 0x0008599f0418503a
|
||||
patword 0x001a 0x0108599f0418503a
|
||||
patword 0x001b 0x0108599f0418503a
|
||||
patword 0x001c 0x0108599f0418503a
|
||||
patword 0x001d 0x0108599f0418503a
|
||||
patword 0x001e 0x0108599f0418503a
|
||||
patword 0x001f 0x0108599f0418503a
|
||||
patword 0x0020 0x0108599f0418503a
|
||||
patword 0x0021 0x0108599f0418503a
|
||||
patword 0x0022 0x0108599f0418503a
|
||||
patword 0x0023 0x0108599f0418503a
|
||||
patword 0x0024 0x0108599f0418503a
|
||||
patword 0x0025 0x0108599f0418503a
|
||||
patword 0x0026 0x0108599f0418503a
|
||||
patword 0x0027 0x0108599f0418503a
|
||||
patword 0x0028 0x0108599f0418503a
|
||||
patword 0x0029 0x0108599f0418503a
|
||||
patword 0x002a 0x0108599f0418503a
|
||||
patword 0x002b 0x0108599f0418503a
|
||||
patword 0x002c 0x0108599f0418503a
|
||||
patword 0x002d 0x0108599f0418503a
|
||||
patword 0x002e 0x0108599f0418503a
|
||||
patword 0x002f 0x0108599f0418503a
|
||||
patword 0x0030 0x0108599f0418503a
|
||||
patword 0x0031 0x0108599f0418503a
|
||||
patword 0x0032 0x0108599f0418503a
|
||||
patword 0x0033 0x0108599f0418503a
|
||||
patword 0x0034 0x0108599f0418503a
|
||||
patword 0x0035 0x0108599f0418503a
|
||||
patword 0x0036 0x0108599f0418503a
|
||||
patword 0x0037 0x0108599f0418503a
|
||||
patword 0x0038 0x0108599f0418503a
|
||||
patword 0x0039 0x0108599f0418503a
|
||||
patword 0x003a 0x0108599f0418503a
|
||||
patword 0x003b 0x0108599f0418503a
|
||||
patword 0x003c 0x0108599f0418503a
|
||||
patword 0x003d 0x0108599f0418503a
|
||||
patword 0x003e 0x0108599f0418503a
|
||||
patword 0x003f 0x0108599f0418503a
|
||||
patword 0x0040 0x0108599f0418503a
|
||||
patword 0x0041 0x0108599f0418503a
|
||||
patword 0x0042 0x0108599f0418503a
|
||||
patword 0x0043 0x0108599f0418503a
|
||||
patword 0x0044 0x0108599f0418503a
|
||||
patword 0x0045 0x0108599f0418503a
|
||||
patword 0x0046 0x0108599f0418503a
|
||||
patword 0x0047 0x0108599f0418503a
|
||||
patword 0x0048 0x0108599f0418503a
|
||||
patword 0x0049 0x0108599f0418503a
|
||||
patword 0x004a 0x0108599f0418503a
|
||||
patword 0x004b 0x0108599f0418503a
|
||||
patword 0x004c 0x0108599f0418503a
|
||||
patword 0x004d 0x0108599f0418503a
|
||||
patword 0x004e 0x0108599f0418503a
|
||||
patword 0x004f 0x0108599f0418503a
|
||||
patword 0x0050 0x0108599f0418503a
|
||||
patword 0x0051 0x0108599f0418503a
|
||||
patword 0x0052 0x0108599f0418503a
|
||||
patword 0x0053 0x0108599f0418503a
|
||||
patword 0x0054 0x0108599f0418503a
|
||||
patword 0x0055 0x0108599f0418503a
|
||||
patword 0x0056 0x0108599f0418503a
|
||||
patword 0x0057 0x0108599f0418503a
|
||||
patword 0x0058 0x0108599f0418503a
|
||||
patword 0x0059 0x0108599f0418503a
|
||||
patword 0x005a 0x0108599f0418503a
|
||||
patword 0x005b 0x0108599f0418503a
|
||||
patword 0x005c 0x0108599f0418503a
|
||||
patword 0x005d 0x0108599f0418503a
|
||||
patword 0x005e 0x0108599f0418503a
|
||||
patword 0x005f 0x0108599f0418503a
|
||||
patword 0x0060 0x0108599f0418503a
|
||||
patword 0x0061 0x0108599f0418503a
|
||||
patword 0x0062 0x0108599f0418503a
|
||||
patword 0x0063 0x0108599f0418503a
|
||||
patword 0x0064 0x0108599f0418503a
|
||||
patword 0x0065 0x0108599f0418503a
|
||||
patword 0x0066 0x0108599f0418503a
|
||||
patword 0x0067 0x0108599f0418503a
|
||||
patword 0x0068 0x0108599f0418503a
|
||||
patword 0x0069 0x0108599f0418503a
|
||||
patword 0x006a 0x0108599f0418503a
|
||||
patword 0x006b 0x0108599f0418503a
|
||||
patword 0x006c 0x0108599f0418503a
|
||||
patword 0x006d 0x0108599f0418503a
|
||||
patword 0x006e 0x0108599f0418503a
|
||||
patword 0x006f 0x0108599f0418503a
|
||||
patword 0x0070 0x0108599f0418503a
|
||||
patword 0x0071 0x0108599f0418503a
|
||||
patword 0x0072 0x0108599f0418503a
|
||||
patword 0x0073 0x0108599f0418503a
|
||||
patword 0x0074 0x0108599f0418503a
|
||||
patword 0x0075 0x0108599f0418503a
|
||||
patword 0x0076 0x0108599f0418503a
|
||||
patword 0x0077 0x0108599f0418503a
|
||||
patword 0x0078 0x0108599f0418503a
|
||||
patword 0x0079 0x0108599f0418503a
|
||||
patword 0x007a 0x0108599f0418503a
|
||||
patword 0x007b 0x0108599f0418503a
|
||||
patword 0x007c 0x0108599f0418503a
|
||||
patword 0x007d 0x0108599f0418503a
|
||||
patword 0x007e 0x010859960418503a
|
||||
patword 0x007f 0x010859960418503a
|
||||
patword 0x0080 0x010859960418503a
|
||||
patword 0x0081 0x010859960418503a
|
||||
patword 0x0082 0x010859960418503a
|
||||
patword 0x0083 0x010859960418503a
|
||||
patword 0x0084 0x010859960418503a
|
||||
patword 0x0085 0x010859960418503a
|
||||
patword 0x0086 0x010859960418503a
|
||||
patword 0x0087 0x010859960418503a
|
||||
patword 0x0088 0x010859960418503a
|
||||
patword 0x0089 0x010859960418503a
|
||||
patword 0x008a 0x010859960418503a
|
||||
patword 0x008b 0x010859960418503a
|
||||
patword 0x008c 0x010859960418503a
|
||||
patword 0x008d 0x010859960418503a
|
||||
patword 0x008e 0x010859960418503a
|
||||
patword 0x008f 0x010859960418503a
|
||||
patword 0x0090 0x010859960418503a
|
||||
patword 0x0091 0x010859960418503a
|
||||
patword 0x0092 0x010819960418501a
|
||||
patword 0x0093 0x010819960418501a
|
||||
patword 0x0094 0x010819960418501a
|
||||
patword 0x0095 0x010819960418501a
|
||||
patword 0x0096 0x030819960418501a
|
||||
patword 0x0097 0x030819960418501a
|
||||
patword 0x0098 0x030819960418501a
|
||||
patword 0x0099 0x030819960418501a
|
||||
patword 0x009a 0x030819960418501a
|
||||
patword 0x009b 0x030819960418501a
|
||||
patword 0x009c 0x030819960418501a
|
||||
patword 0x009d 0x030819960418501a
|
||||
patword 0x009e 0x030819960418501a
|
||||
patword 0x009f 0x030819960418501a
|
||||
patword 0x00a0 0x030819960418501a
|
||||
patword 0x00a1 0x030819960418501a
|
||||
patword 0x00a2 0x030819960418501a
|
||||
patword 0x00a3 0x030819960418501a
|
||||
patword 0x00a4 0x030819960418501a
|
||||
patword 0x00a5 0x030819960418501a
|
||||
patword 0x00a6 0x030819960418501a
|
||||
patword 0x00a7 0x030819960418501a
|
||||
patword 0x00a8 0x030819960418501a
|
||||
patword 0x00a9 0x030819960418501a
|
||||
patword 0x00aa 0x030819960418501a
|
||||
patword 0x00ab 0x030819960418501a
|
||||
patword 0x00ac 0x030819960008501a
|
||||
patword 0x00ad 0x030819960008501a
|
||||
patword 0x00ae 0x030819960008501a
|
||||
patword 0x00af 0x030819960008501a
|
||||
patword 0x00b0 0x030819960008501a
|
||||
patword 0x00b1 0x030819960008501a
|
||||
patword 0x00b2 0x030819960008501a
|
||||
patword 0x00b3 0x030819960008501a
|
||||
patword 0x00b4 0x030819960008501a
|
||||
patword 0x00b5 0x030819960008501a
|
||||
patword 0x00b6 0x030819960008501a
|
||||
patword 0x00b7 0x030819960008501a
|
||||
patword 0x00b8 0x030819960008501a
|
||||
patword 0x00b9 0x030819960008501a
|
||||
patword 0x00ba 0x030819960008501a
|
||||
patword 0x00bb 0x030819960008501a
|
||||
patword 0x00bc 0x030819960008501a
|
||||
patword 0x00bd 0x030819960008501a
|
||||
patword 0x00be 0x030819960008501a
|
||||
patword 0x00bf 0x030819960008501a
|
||||
patword 0x00c0 0x0308199f0008501a
|
||||
patword 0x00c1 0x0308199f0008501a
|
||||
patword 0x00c2 0x0308199f0008501a
|
||||
patword 0x00c3 0x0308199f0008501a
|
||||
patword 0x00c4 0x0308199f0008501a
|
||||
patword 0x00c5 0x0308199f0008501a
|
||||
patword 0x00c6 0x0308199f0008501a
|
||||
patword 0x00c7 0x0308199f0008501a
|
||||
patword 0x00c8 0x0308199f0008501a
|
||||
patword 0x00c9 0x0308199f0008501a
|
||||
patword 0x00ca 0x0308199f0008501a
|
||||
patword 0x00cb 0x0308199f0008501a
|
||||
patword 0x00cc 0x0308199f0008501a
|
||||
patword 0x00cd 0x0308199f0008501a
|
||||
patword 0x00ce 0x0308199f0008501a
|
||||
patword 0x00cf 0x0308199f0008501a
|
||||
patword 0x00d0 0x0308199f0008501a
|
||||
patword 0x00d1 0x0308199f0008501a
|
||||
patword 0x00d2 0x0308199f0008501a
|
||||
patword 0x00d3 0x0308199f0008501a
|
||||
patword 0x00d4 0x0308599f0008503a
|
||||
patword 0x00d5 0x0308599f0008503a
|
||||
patword 0x00d6 0x030c599f000850ba
|
||||
patword 0x00d7 0x030c599f000850ba
|
||||
patword 0x00d8 0x030c599f000850ba
|
||||
patword 0x00d9 0x030c599f000850ba
|
||||
patword 0x00da 0x030c599f000850ba
|
||||
patword 0x00db 0x030c599f000850ba
|
||||
patword 0x00dc 0x030c599f000850ba
|
||||
patword 0x00dd 0x030c599f000850ba
|
||||
patword 0x00de 0x030c599f000850ba
|
||||
patword 0x00df 0x030c599f000850ba
|
||||
patword 0x00e0 0x030c599f000850ba
|
||||
patword 0x00e1 0x030c599f000850ba
|
||||
patword 0x00e2 0x030c599f000850ba
|
||||
patword 0x00e3 0x030c599f000850ba
|
||||
patword 0x00e4 0x030c599f000850ba
|
||||
patword 0x00e5 0x030c599f000850ba
|
||||
patword 0x00e6 0x030c599f000850ba
|
||||
patword 0x00e7 0x030c599f000850ba
|
||||
patword 0x00e8 0x030c599f000850ba
|
||||
patword 0x00e9 0x030c599f000850ba
|
||||
patword 0x00ea 0x030c799f010858ba
|
||||
patword 0x00eb 0x030c799f010858ba
|
||||
patword 0x00ec 0x030c599f000850ba
|
||||
patword 0x00ed 0x030c599f000850ba
|
||||
patword 0x00ee 0x030c599f000850ba
|
||||
patword 0x00ef 0x030c599f000850ba
|
||||
patword 0x00f0 0x030c599f000850ba
|
||||
patword 0x00f1 0x030c599f000850ba
|
||||
patword 0x00f2 0x030c599f000850ba
|
||||
patword 0x00f3 0x030c599f000850ba
|
||||
patword 0x00f4 0x030c599f000850ba
|
||||
patword 0x00f5 0x030c599f000850ba
|
||||
patword 0x00f6 0x030c599f000850ba
|
||||
patword 0x00f7 0x030c599f000850ba
|
||||
patword 0x00f8 0x030c599f000850ba
|
||||
patword 0x00f9 0x030c599f000850ba
|
||||
patword 0x00fa 0x030c599f000850ba
|
||||
patword 0x00fb 0x030c599f000850ba
|
||||
patword 0x00fc 0x030c599f000850ba
|
||||
patword 0x00fd 0x030c599f000850ba
|
||||
patword 0x00fe 0x030c599f000850ba
|
||||
patword 0x00ff 0x030c599f000850ba
|
||||
patword 0x0100 0x030c599f000850ba
|
||||
patword 0x0101 0x030c599f000850ba
|
||||
patword 0x0102 0x030c599f400850ba
|
||||
patword 0x0103 0x030c599f400850ba
|
||||
patword 0x0104 0x030c599f600850ba
|
||||
patword 0x0105 0x030c599f400850ba
|
||||
patword 0x0106 0x030c599f400850ba
|
||||
patword 0x0107 0x030c599f400850ba
|
||||
patword 0x0108 0x870c599f682e50ba
|
||||
patword 0x0109 0x870c599f482850ba
|
||||
patword 0x010a 0x870c599f000e50ba
|
||||
patword 0x010b 0x870c599f000850ba
|
||||
patword 0x010c 0x870c599f000e50ba
|
||||
patword 0x010d 0x870c599f000850ba
|
||||
patword 0x010e 0x870c599f000e50ba
|
||||
patword 0x010f 0x870c599f000850ba
|
||||
patword 0x0110 0x870c599f000e50ba
|
||||
patword 0x0111 0x870c599f000850ba
|
||||
patword 0x0112 0x870c599f000e50ba
|
||||
patword 0x0113 0x870c599f000850ba
|
||||
patword 0x0114 0x870c599f000e50ba
|
||||
patword 0x0115 0x870c599f000850ba
|
||||
patword 0x0116 0x870c599f000e50ba
|
||||
patword 0x0117 0x870c599f000850ba
|
||||
patword 0x0118 0x870c599f000e50ba
|
||||
patword 0x0119 0x870c599f000850ba
|
||||
patword 0x011a 0x870c599f000e50ba
|
||||
patword 0x011b 0x870c599f000850ba
|
||||
patword 0x011c 0x870c599f000e50ba
|
||||
patword 0x011d 0x870c599f000850ba
|
||||
patword 0x011e 0x870c599f000e50ba
|
||||
patword 0x011f 0x870c599f000850ba
|
||||
patword 0x0120 0x870c599f000e50ba
|
||||
patword 0x0121 0x870c599f000850ba
|
||||
patword 0x0122 0x870c599f200e50ba
|
||||
patword 0x0123 0x870c599f000850ba
|
||||
patword 0x0124 0x870c599f000e50ba
|
||||
patword 0x0125 0x870c599f000850ba
|
||||
patword 0x0126 0x870c599f000e50ba
|
||||
patword 0x0127 0x870c599f000850ba
|
||||
patword 0x0128 0x870c599f000e50ba
|
||||
patword 0x0129 0x870c599f000850ba
|
||||
patword 0x012a 0x870c599f000e50ba
|
||||
patword 0x012b 0x870c599f000850ba
|
||||
patword 0x012c 0x870c599f000e50ba
|
||||
patword 0x012d 0x870c599f000850ba
|
||||
patword 0x012e 0x870c599f000e50ba
|
||||
patword 0x012f 0x870c599f000850ba
|
||||
patword 0x0130 0x870c599f000e50ba
|
||||
patword 0x0131 0x870c599f000850ba
|
||||
patword 0x0132 0x870c599f000e50ba
|
||||
patword 0x0133 0x870c599f000850ba
|
||||
patword 0x0134 0x870c599f000e50ba
|
||||
patword 0x0135 0x870c599f000850ba
|
||||
patword 0x0136 0x870c599f000e50ba
|
||||
patword 0x0137 0x870c599f000850ba
|
||||
patword 0x0138 0x870c599f000e50ba
|
||||
patword 0x0139 0x870c599f000850ba
|
||||
patword 0x013a 0x870c599f282e50ba
|
||||
patword 0x013b 0x870c599f082850ba
|
||||
patword 0x013c 0x870c599f000e50ba
|
||||
patword 0x013d 0x870c599f000850ba
|
||||
patword 0x013e 0x870c599f000e50ba
|
||||
patword 0x013f 0x870c599f000850ba
|
||||
patword 0x0140 0x870c599f000e50ba
|
||||
patword 0x0141 0x870c599f000850ba
|
||||
patword 0x0142 0x870c599f000e50ba
|
||||
patword 0x0143 0x870c599f000850ba
|
||||
patword 0x0144 0x870c599f000e50ba
|
||||
patword 0x0145 0x870c599f000850ba
|
||||
patword 0x0146 0x870c599f000e50ba
|
||||
patword 0x0147 0x870c599f000850ba
|
||||
patword 0x0148 0x870c599f000e50ba
|
||||
patword 0x0149 0x870c599f000850ba
|
||||
patword 0x014a 0x870c599f000e50ba
|
||||
patword 0x014b 0x870c599f000850ba
|
||||
patword 0x014c 0x870c599f000e50ba
|
||||
patword 0x014d 0x870c599f000850ba
|
||||
patword 0x014e 0x870c599f000e50ba
|
||||
patword 0x014f 0x870c599f000850ba
|
||||
patword 0x0150 0x870c599f000e50ba
|
||||
patword 0x0151 0x870c599f000850ba
|
||||
patword 0x0152 0x870c599f000e50ba
|
||||
patword 0x0153 0x870c599f000850ba
|
||||
patword 0x0154 0x870c599f200e50ba
|
||||
patword 0x0155 0x870c599f000850ba
|
||||
patword 0x0156 0x870c599f000e50ba
|
||||
patword 0x0157 0x870c599f000850ba
|
||||
patword 0x0158 0x870c599f000e50ba
|
||||
patword 0x0159 0x870c599f000850ba
|
||||
patword 0x015a 0x870c599f000e50ba
|
||||
patword 0x015b 0x870c599f000850ba
|
||||
patword 0x015c 0x870c599f000e50ba
|
||||
patword 0x015d 0x870c599f000850ba
|
||||
patword 0x015e 0x870c599f000e50ba
|
||||
patword 0x015f 0x870c599f000850ba
|
||||
patword 0x0160 0x870c599f000e50ba
|
||||
patword 0x0161 0x870c599f000850ba
|
||||
patword 0x0162 0x870c599f000e50ba
|
||||
patword 0x0163 0x870c599f000850ba
|
||||
patword 0x0164 0x870c599f000e50ba
|
||||
patword 0x0165 0x870c599f000850ba
|
||||
patword 0x0166 0x870c599f000e50ba
|
||||
patword 0x0167 0x870c599f000850ba
|
||||
patword 0x0168 0x870c599f000e50ba
|
||||
patword 0x0169 0x870c599f000850ba
|
||||
patword 0x016a 0x870c599f000e50ba
|
||||
patword 0x016b 0x870c599f000850ba
|
||||
patword 0x016c 0x070c599f000850ba
|
||||
patword 0x016d 0x070c599f000850ba
|
||||
patword 0x016e 0x000c599f000850ba
|
||||
patword 0x016f 0x000c599f000850ba
|
||||
patword 0x0170 0x0008599f200e503a
|
||||
patword 0x0171 0x0008599f0008503a
|
||||
patword 0x0172 0x0008599f200e503a
|
||||
patword 0x0173 0x0008599f0008503a
|
||||
patword 0x0174 0x0008599f0008503a
|
||||
patword 0x0175 0x0008599f0008503a
|
||||
patword 0x0176 0x0008599f0008503a
|
||||
patword 0x0177 0x0008599f0008503a
|
||||
patword 0x0178 0x0008599f0008503a
|
||||
patword 0x0179 0x0008599f0008503a
|
||||
patword 0x017a 0x0008599f0008503a
|
||||
patword 0x017b 0x0008599f0008503a
|
||||
patword 0x017c 0x0008599f0008503a
|
||||
patword 0x017d 0x0008599f0008503a
|
||||
patword 0x017e 0x0008599f0008503a
|
||||
patword 0x017f 0x0008599f0008503a
|
||||
patword 0x0180 0x0008599f0008503a
|
||||
patword 0x0181 0x0008599f0008503a
|
||||
patword 0x0182 0x0008599f0008503a
|
||||
patword 0x0183 0x0008599f0008503a
|
||||
patword 0x0184 0x0008599f0008503a
|
||||
patword 0x0185 0x0008599f0008503a
|
||||
patword 0x0186 0x0008599f0008503a
|
||||
patword 0x0187 0x0008599f0008503a
|
||||
patword 0x0188 0x0008599f0008503a
|
||||
patword 0x0189 0x0008599f0008503a
|
||||
patword 0x018a 0x0008599f0008503a
|
||||
patword 0x018b 0x0008599f0008503a
|
||||
patword 0x018c 0x0008599f0008503a
|
||||
patword 0x018d 0x0008599f0008503a
|
||||
patioctrl 0x8f0effff6dbffdbf
|
||||
patlimits 0x0000 0x018c
|
||||
patloop0 0x013a 0x016b
|
||||
patnloop0 0x199
|
||||
patloop1 0x0400 0x0400
|
||||
patnloop1 0
|
||||
patloop2 0x0400 0x0400
|
||||
patnloop2 0
|
||||
patwait0 0x00aa
|
||||
patwaittime0 10000
|
||||
patwait1 0x0400
|
||||
patwaittime1 0
|
||||
patwait2 0x0400
|
||||
patwaittime2 0
|
||||
|
||||
# dacs
|
||||
dac 6 800
|
||||
|
@ -1,13 +1,13 @@
|
||||
# detector hostname
|
||||
hostname localhost:1900
|
||||
|
||||
# receiver hostname
|
||||
rx_hostname mpc1922:2000
|
||||
|
||||
# udp destination ports
|
||||
udp_dstport 50000
|
||||
udp_dstport2 50001
|
||||
|
||||
# receiver hostname
|
||||
rx_hostname mpc1922:2000
|
||||
|
||||
# udp destination ip from rx_hostname
|
||||
udp_dstip auto
|
||||
|
||||
|
@ -1,13 +1,15 @@
|
||||
# detector hostname
|
||||
hostname localhost:1900+localhost:1902+
|
||||
|
||||
# udp destination ports
|
||||
udp_dstport 50000
|
||||
udp_dstport2 50001
|
||||
|
||||
# receiver hostname
|
||||
rx_hostname mpc1922:2000+mpc1922:2001+
|
||||
|
||||
# udp destination ports
|
||||
0:udp_dstport 50000
|
||||
0:udp_dstport2 50001
|
||||
1:udp_dstport 50002
|
||||
1:udp_dstport2 50003
|
||||
|
||||
# udp destination ip from rx_hostname
|
||||
udp_dstip auto
|
||||
|
||||
|
@ -1,18 +1,18 @@
|
||||
# detector hostname
|
||||
hostname localhost:1904
|
||||
|
||||
# udp destination ports
|
||||
udp_dstport 50004
|
||||
|
||||
# udp source ip (same subnet as udp_dstip)
|
||||
udp_srcip 192.168.1.100
|
||||
|
||||
# receiver hostname
|
||||
rx_hostname mpc1922:2004
|
||||
|
||||
# udp destination ports
|
||||
udp_dstport 50004
|
||||
|
||||
# udp destination ip from rx_hostname
|
||||
udp_dstip auto
|
||||
|
||||
# udp source ip (same subnet as udp_dstip)
|
||||
udp_srcip 192.168.1.100
|
||||
|
||||
# output file directory
|
||||
fpath /tmp
|
||||
|
||||
|
@ -1,12 +1,24 @@
|
||||
# detector hostname
|
||||
hostname localhost:1914
|
||||
|
||||
# receiver hostname
|
||||
rx_hostname mpc1922:2014
|
||||
|
||||
# udp destination ports
|
||||
udp_dstport 50014
|
||||
|
||||
# udp destination ip from rx_hostname
|
||||
udp_dstip auto
|
||||
|
||||
# udp source ip (same subnet as udp_dstip)
|
||||
udp_srcip 192.168.1.100
|
||||
|
||||
# output file directory
|
||||
fpath /tmp
|
||||
|
||||
# disable file writing
|
||||
fwrite 0
|
||||
|
||||
# enable 2nd interface for veto debugging
|
||||
# udp destination port for veto
|
||||
udp_dstport2 50015
|
||||
@ -15,18 +27,6 @@ udp_dstip2 auto
|
||||
# udp source ip (same subnet as udp_dstip)
|
||||
udp_srcip2 192.168.1.100
|
||||
|
||||
# receiver hostname
|
||||
rx_hostname mpc1922:2014
|
||||
|
||||
# udp destination ip from rx_hostname
|
||||
udp_dstip auto
|
||||
|
||||
# output file directory
|
||||
fpath /tmp
|
||||
|
||||
# disable file writing
|
||||
fwrite 0
|
||||
|
||||
# to enable 2nd interface for veto debugging
|
||||
numinterfaces 2
|
||||
|
||||
|
@ -1,21 +1,21 @@
|
||||
# detector hostname
|
||||
hostname localhost:1906
|
||||
|
||||
# receiver hostname
|
||||
rx_hostname mpc1922:2006
|
||||
|
||||
# udp destination ports
|
||||
udp_dstport 50006
|
||||
udp_dstport2 50007
|
||||
|
||||
# udp source ip (same subnet as udp_dstip)
|
||||
udp_srcip 192.168.1.100
|
||||
udp_srcip2 192.168.1.100
|
||||
|
||||
# receiver hostname
|
||||
rx_hostname mpc1922:2006
|
||||
|
||||
# udp destination ip from rx_hostname
|
||||
udp_dstip auto
|
||||
udp_dstip2 auto
|
||||
|
||||
# udp source ip (same subnet as udp_dstip)
|
||||
udp_srcip 192.168.1.100
|
||||
udp_srcip2 192.168.1.100
|
||||
|
||||
# output file directory
|
||||
fpath /tmp
|
||||
|
||||
|
@ -4,33 +4,31 @@ detsize 2048 1024
|
||||
# detector hostname
|
||||
virtual 4 1952
|
||||
|
||||
# udp destination ports
|
||||
udp_dstport 50001
|
||||
#0:udp_dstport2 50001
|
||||
#0:udp_dstport2 50002
|
||||
#1:udp_dstport 50003
|
||||
#1:udp_dstport2 50004
|
||||
#2:udp_dstport 50005
|
||||
#2:udp_dstport2 50006
|
||||
#3:udp_dstport 50007
|
||||
#3:udp_dstport2 50008
|
||||
|
||||
# udp source ip (same subnet as udp_dstip)
|
||||
udp_srcip 192.168.1.100
|
||||
udp_srcip2 192.168.1.100
|
||||
|
||||
# receiver hostname and tcpports
|
||||
rx_tcpport 1970
|
||||
#0:rx_tcpport 1970
|
||||
#1:rx_tcpport 1971
|
||||
#2:rx_tcpport 1972
|
||||
#3:rx_tcpport 1973
|
||||
0:rx_tcpport 1970
|
||||
1:rx_tcpport 1971
|
||||
2:rx_tcpport 1972
|
||||
3:rx_tcpport 1973
|
||||
rx_hostname mpc1922
|
||||
|
||||
# udp destination ports
|
||||
0:udp_dstport2 50001
|
||||
0:udp_dstport2 50002
|
||||
1:udp_dstport 50003
|
||||
1:udp_dstport2 50004
|
||||
2:udp_dstport 50005
|
||||
2:udp_dstport2 50006
|
||||
3:udp_dstport 50007
|
||||
3:udp_dstport2 50008
|
||||
|
||||
# udp destination ip from rx_hostname
|
||||
udp_dstip auto
|
||||
udp_dstip2 auto
|
||||
|
||||
# udp source ip (same subnet as udp_dstip)
|
||||
udp_srcip 192.168.1.100
|
||||
udp_srcip2 192.168.1.100
|
||||
|
||||
# transmission delay frame
|
||||
0:txndelay_frame 0
|
||||
1:txndelay_frame 1
|
||||
|
@ -1,18 +1,18 @@
|
||||
# detector hostname
|
||||
hostname localhost:1908
|
||||
|
||||
# udp destination ports
|
||||
udp_dstport 50008
|
||||
|
||||
# udp source ip (same subnet as udp_dstip)
|
||||
udp_srcip 192.168.1.100
|
||||
|
||||
# receiver hostname
|
||||
rx_hostname mpc1922:2008
|
||||
|
||||
# udp destination ports
|
||||
udp_dstport 50008
|
||||
|
||||
# udp destination ip from rx_hostname
|
||||
udp_dstip auto
|
||||
|
||||
# udp source ip (same subnet as udp_dstip)
|
||||
udp_srcip 192.168.1.100
|
||||
|
||||
# output file directory
|
||||
fpath /tmp
|
||||
|
||||
|
@ -1,18 +1,18 @@
|
||||
# detector hostname
|
||||
hostname localhost:1912
|
||||
|
||||
# udp destination ports
|
||||
udp_dstport 50012
|
||||
|
||||
# udp source ip (same subnet as udp_dstip)
|
||||
udp_srcip 192.168.1.100
|
||||
|
||||
# receiver hostname
|
||||
rx_hostname mpc1922:2012
|
||||
|
||||
# udp destination ports
|
||||
udp_dstport 50012
|
||||
|
||||
# udp destination ip from rx_hostname
|
||||
udp_dstip auto
|
||||
|
||||
# udp source ip (same subnet as udp_dstip)
|
||||
udp_srcip 192.168.1.100
|
||||
|
||||
# output file directory
|
||||
fpath /tmp
|
||||
|
||||
|
@ -1,16 +0,0 @@
|
||||
numinterfaces 1
|
||||
rx_zmqip 10.1.2.102
|
||||
rx_zmqport 1978
|
||||
zmqip 129.129.202.57
|
||||
zmqport 1979
|
||||
nthreads 6
|
||||
fifosize 5000
|
||||
nsigma 5
|
||||
gainfile none
|
||||
nbinsx 5
|
||||
nbinsy 5
|
||||
etafile none
|
||||
etabinsx 1000
|
||||
etabinsy 1000
|
||||
etamin -1
|
||||
etamax 2
|
27
genVersionHeader.sh
Executable file
27
genVersionHeader.sh
Executable file
@ -0,0 +1,27 @@
|
||||
# SPDX-License-Identifier: LGPL-3.0-or-other
|
||||
# Copyright (C) 2021 Contributors to the SLS Detector Package
|
||||
#####! /bin/awk -f
|
||||
|
||||
|
||||
if [ $# -lt 3 ]
|
||||
then
|
||||
echo "wrong usage"
|
||||
exit -1
|
||||
fi
|
||||
|
||||
|
||||
fin=$1
|
||||
ftmp=$2
|
||||
fout=$3
|
||||
|
||||
|
||||
#dat=echo "date '+%Y%m%d'"
|
||||
|
||||
echo "Updating $fout"
|
||||
#echo "in: $fin tmp: $ftmp out: $fout"
|
||||
|
||||
#awk 'NR==FNR {if ($3=="Date:") {l[FNR]=$4; gsub("-","",l[FNR]);} else { if (match($0,"Rev")) {l[FNR]=$(NF);} else {l[FNR]="\""$(NF)"\"";};};next} {$0=$1" "$2" "l[FNR]}1' $fin $ftmp > $fout
|
||||
|
||||
awk 'BEGIN {l[0]=0; "date +%Y%m%d" | getline l[1]; l[2]="\"/\""; l[3]="\"nobody\""; l[3]="\"nobody\""; l[4]="\"0000-0000-0000\"";} \
|
||||
NR==FNR {if (match($0,"Rev")) {l[0]="0x"$(NF);} else if (match($0,"Date")) {l[1]="0x"$4; gsub("-","",l[1]);} else if (match($0,"URL")) {l[2]="\""$(NF)"\"";} else if (match($0,"Author")) {l[3]="\""$(NF)"\"";} else if (match($0,"UUID")) {l[4]="\""$(NF)"\"";} else if (match($0,"Branch")) {l[5]="\""$(NF)"\"";};next;}
|
||||
{if (match($2,"REV")) {$0=$1" "$2" "l[0];} else if (match($2,"DATE")) {$0=$1" "$2" "l[1];} else if (match($2,"URL")) {$0=$1" "$2" "l[2];} else if (match($2,"AUTH")) {$0=$1" "$2" "l[3];} else if (match($2,"UUID")) {$0=$1" "$2" "l[4];} else if (match($2,"BRANCH")) {$0=$1" "$2" "l[5];}}1' $fin $ftmp > $fout
|
@ -6,8 +6,6 @@
|
||||
#include "tests/globals.h"
|
||||
#include <iostream>
|
||||
|
||||
namespace sls {
|
||||
|
||||
class MultiDetectorFixture {
|
||||
protected:
|
||||
DetectorImpl d;
|
||||
@ -138,7 +136,7 @@ TEST_CASE_METHOD(MultiDetectorFixture, "Get ID", "[.eigerintegration][cli]") {
|
||||
std::string hn = test::hostname;
|
||||
hn.erase(std::remove(begin(hn), end(hn), 'b'), end(hn));
|
||||
hn.erase(std::remove(begin(hn), end(hn), 'e'), end(hn));
|
||||
auto hostnames = split(hn, '+');
|
||||
auto hostnames = sls::split(hn, '+');
|
||||
CHECK(hostnames.size() == d.getNumberOfDetectors());
|
||||
for (int i = 0; i != d.getNumberOfDetectors(); ++i) {
|
||||
CHECK(d.getId(defs::DETECTOR_SERIAL_NUMBER, 0) ==
|
||||
@ -200,5 +198,3 @@ TEST_CASE_METHOD(MultiDetectorFixture, "rate correction",
|
||||
d.setRateCorrection(200);
|
||||
CHECK(d.getRateCorrection() == 200);
|
||||
}
|
||||
|
||||
} // namespace sls
|
||||
|
@ -24,8 +24,6 @@
|
||||
// extern std::string detector_type;
|
||||
// extern dt type;
|
||||
|
||||
namespace sls {
|
||||
|
||||
TEST_CASE("Single detector no receiver", "[.integration][.single]") {
|
||||
auto t = Module::getTypeFromDetector(test::hostname);
|
||||
CHECK(t == test::type);
|
||||
@ -50,8 +48,8 @@ TEST_CASE("Set control port then create a new object with this control port",
|
||||
Is this the best way to initialize the detectors
|
||||
Using braces to make the object go out of scope
|
||||
*/
|
||||
int old_cport = DEFAULT_TCP_CNTRL_PORTNO;
|
||||
int old_sport = DEFAULT_TCP_STOP_PORTNO;
|
||||
int old_cport = DEFAULT_PORTNO;
|
||||
int old_sport = DEFAULT_PORTNO + 1;
|
||||
int new_cport = 1993;
|
||||
int new_sport = 2000;
|
||||
{
|
||||
@ -79,7 +77,7 @@ TEST_CASE("Set control port then create a new object with this control port",
|
||||
|
||||
Module d(test::type);
|
||||
d.setHostname(test::hostname);
|
||||
CHECK(d.getStopPort() == DEFAULT_TCP_STOP_PORTNO);
|
||||
CHECK(d.getStopPort() == DEFAULT_PORTNO + 1);
|
||||
d.freeSharedMemory();
|
||||
}
|
||||
|
||||
@ -285,14 +283,14 @@ TEST_CASE(
|
||||
CHECK(m.getRateCorrection() == ratecorr);
|
||||
|
||||
// ratecorr fail with dr 4 or 8
|
||||
CHECK_THROWS_AS(m.setDynamicRange(8), RuntimeError);
|
||||
CHECK_THROWS_AS(m.setDynamicRange(8), sls::RuntimeError);
|
||||
CHECK(m.getRateCorrection() == 0);
|
||||
m.setDynamicRange(16);
|
||||
m.setDynamicRange(16);
|
||||
m.setRateCorrection(ratecorr);
|
||||
m.setDynamicRange(16);
|
||||
m.setRateCorrection(ratecorr);
|
||||
CHECK_THROWS_AS(m.setDynamicRange(4), RuntimeError);
|
||||
CHECK_THROWS_AS(m.setDynamicRange(4), sls::RuntimeError);
|
||||
CHECK(m.getRateCorrection() == 0);
|
||||
}
|
||||
|
||||
@ -331,11 +329,11 @@ TEST_CASE("Chiptestboard Loading Patterns", "[.ctbintegration]") {
|
||||
m.setPatternWord(addr, word);
|
||||
CHECK(m.setPatternWord(addr, -1) == word);
|
||||
addr = MAX_ADDR;
|
||||
CHECK_THROWS_AS(m.setPatternWord(addr, word), RuntimeError);
|
||||
CHECK_THROWS_AS(m.setPatternWord(addr, word), sls::RuntimeError);
|
||||
CHECK_THROWS_WITH(m.setPatternWord(addr, word),
|
||||
Catch::Matchers::Contains("be between 0 and"));
|
||||
addr = -1;
|
||||
CHECK_THROWS_AS(m.setPatternWord(addr, word), RuntimeError);
|
||||
CHECK_THROWS_AS(m.setPatternWord(addr, word), sls::RuntimeError);
|
||||
CHECK_THROWS_WITH(m.setPatternWord(addr, word),
|
||||
Catch::Matchers::Contains("be between 0 and"));
|
||||
|
||||
@ -410,7 +408,7 @@ TEST_CASE("Chiptestboard Dbit offset, list, sampling, advinvert",
|
||||
CHECK(m.getReceiverDbitList().size() == 10);
|
||||
|
||||
list.push_back(64);
|
||||
CHECK_THROWS_AS(m.setReceiverDbitList(list), RuntimeError);
|
||||
CHECK_THROWS_AS(m.setReceiverDbitList(list), sls::RuntimeError);
|
||||
CHECK_THROWS_WITH(m.setReceiverDbitList(list),
|
||||
Catch::Matchers::Contains("be between 0 and 63"));
|
||||
|
||||
@ -478,7 +476,7 @@ TEST_CASE("Eiger or Jungfrau nextframenumber",
|
||||
CHECK(m.acquire() == slsDetectorDefs::OK);
|
||||
CHECK(m.getReceiverCurrentFrameIndex() == val);
|
||||
|
||||
CHECK_THROWS_AS(m.setNextFrameNumber(0), RuntimeError);
|
||||
CHECK_THROWS_AS(m.setNextFrameNumber(0), sls::RuntimeError);
|
||||
|
||||
if (m.getDetectorTypeAsString() == "Eiger") {
|
||||
val = 281474976710655;
|
||||
@ -513,10 +511,8 @@ TEST_CASE("Eiger partialread", "[.eigerintegration][partialread]") {
|
||||
m.setDynamicRange(8);
|
||||
m.setPartialReadout(256);
|
||||
CHECK(m.getPartialReadout() == 256);
|
||||
CHECK_THROWS_AS(m.setPartialReadout(1), RuntimeError);
|
||||
CHECK_THROWS_AS(m.setPartialReadout(1), sls::RuntimeError);
|
||||
CHECK(m.getPartialReadout() == 256);
|
||||
CHECK_THROWS_AS(m.setPartialReadout(0), RuntimeError);
|
||||
CHECK_THROWS_AS(m.setPartialReadout(0), sls::RuntimeError);
|
||||
m.setPartialReadout(256);
|
||||
}
|
||||
|
||||
} // namespace sls
|
||||
}
|
@ -6,12 +6,10 @@
|
||||
#include "tests/globals.h"
|
||||
#include <iostream>
|
||||
|
||||
namespace sls {
|
||||
|
||||
using namespace Catch::literals;
|
||||
|
||||
TEST_CASE("Initialize a multi detector", "[.integration][.multi]") {
|
||||
auto hostnames = split(test::hostname, '+');
|
||||
auto hostnames = sls::split(test::hostname, '+');
|
||||
|
||||
DetectorImpl d(0, true, true);
|
||||
d.setHostname(test::hostname.c_str());
|
||||
@ -104,5 +102,3 @@ TEST_CASE("Set and read timers", "[.integration][.multi]") {
|
||||
|
||||
d.freeSharedMemory();
|
||||
}
|
||||
|
||||
} // namespace sls
|
||||
|
Binary file not shown.
1
libs/pybind11
Submodule
1
libs/pybind11
Submodule
Submodule libs/pybind11 added at 914c06fb25
Binary file not shown.
@ -1,57 +0,0 @@
|
||||
#inspired by: https://github.com/ericriff/qwt/blob/master/CMakeLists.txt
|
||||
|
||||
# Build a static version of qwt from tar file
|
||||
cmake_minimum_required(VERSION 3.12)
|
||||
project(qwt)
|
||||
set(PROJECT_VERSION 6.1.5)
|
||||
|
||||
set(CMAKE_AUTOMOC ON)
|
||||
set(CMAKE_AUTORCC ON)
|
||||
|
||||
# Extract qwt sources from the supplied source file
|
||||
set(INTERNALQWTDIR "qwt-source/")
|
||||
set(QWTBASE ${CMAKE_CURRENT_BINARY_DIR}/${INTERNALQWTDIR})
|
||||
file(MAKE_DIRECTORY ${QWTBASE})
|
||||
execute_process(
|
||||
COMMAND tar -xf ${CMAKE_CURRENT_SOURCE_DIR}/qwt-6.1.5.tar.bz2 -C ${QWTBASE} --strip-components=1
|
||||
RESULT_VARIABLE ret
|
||||
)
|
||||
if(ret AND NOT ret EQUAL 0)
|
||||
message( FATAL_ERROR "Could not unpack qwt")
|
||||
endif()
|
||||
|
||||
# Without this define moc files are not included and linking of examples fails.
|
||||
add_definitions(-DQWT_MOC_INCLUDE)
|
||||
|
||||
find_package(Qt5 REQUIRED
|
||||
COMPONENTS
|
||||
Core
|
||||
Gui
|
||||
Widgets
|
||||
OpenGL
|
||||
Concurrent
|
||||
PrintSupport
|
||||
Svg
|
||||
)
|
||||
|
||||
|
||||
file(GLOB QWT_SOURCES ${QWTBASE}src/*.cpp)
|
||||
file(GLOB QWT_HEADERS ${QWTBASE}src/*.h)
|
||||
add_library(qwt STATIC ${QWT_SOURCES} ${QWT_HEADERS} )
|
||||
target_include_directories(qwt PUBLIC
|
||||
$<BUILD_INTERFACE:${QWTBASE}/src>
|
||||
)
|
||||
|
||||
target_link_libraries(qwt PUBLIC
|
||||
Qt5::Core
|
||||
Qt5::Gui
|
||||
Qt5::Widgets
|
||||
Qt5::OpenGL
|
||||
Qt5::Concurrent
|
||||
Qt5::PrintSupport
|
||||
Qt5::Svg
|
||||
)
|
||||
|
||||
|
||||
# Disable all warnings in QWT since we don’t want to patch the library
|
||||
target_compile_options(qwt PRIVATE -w)
|
Binary file not shown.
@ -316,8 +316,7 @@ struct GenericStringRef {
|
||||
|
||||
GenericStringRef(const GenericStringRef& rhs) : s(rhs.s), length(rhs.length) {}
|
||||
|
||||
// Removed to fix failing build in GCC 14
|
||||
// GenericStringRef& operator=(const GenericStringRef& rhs) { s = rhs.s; length = rhs.length; }
|
||||
GenericStringRef& operator=(const GenericStringRef& rhs) { s = rhs.s; length = rhs.length; }
|
||||
|
||||
//! implicit conversion to plain CharType pointer
|
||||
operator const Ch *() const { return s; }
|
||||
|
@ -1,110 +0,0 @@
|
||||
// SPDX-License-Identifier: LGPL-3.0-or-other
|
||||
// Copyright (C) 2021 Contributors to the SLS Detector Package
|
||||
|
||||
#include <errno.h>
|
||||
#include <fcntl.h>
|
||||
#include <math.h>
|
||||
#include <stdarg.h>
|
||||
#include <stdint.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <sys/stat.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/utsname.h>
|
||||
#include <unistd.h>
|
||||
|
||||
int main(int argc, char *argv[]) {
|
||||
|
||||
int iarg;
|
||||
char fname[10000];
|
||||
uint64_t word;
|
||||
int val[64];
|
||||
int bit[64];
|
||||
FILE *fdin;
|
||||
|
||||
int nb = 2;
|
||||
int off = 0;
|
||||
int ioff = 0;
|
||||
int dr = 24;
|
||||
int idr = 0;
|
||||
int ib = 0;
|
||||
int iw = 0;
|
||||
bit[0] = 19;
|
||||
bit[1] = 8;
|
||||
// for (iarg=0; iarg<argc; iarg++) printf("%d %s\n",iarg, argv[iarg]);
|
||||
|
||||
if (argc < 2)
|
||||
printf("Error: usage is %s fname [dr off b0 b1 bn]\n");
|
||||
|
||||
if (argc > 2)
|
||||
dr = atoi(argv[2]);
|
||||
if (argc > 3)
|
||||
off = atoi(argv[3]);
|
||||
if (argc > 4) {
|
||||
for (ib = 0; ib < 64; ib++) {
|
||||
if (argc > 4 + ib) {
|
||||
bit[ib] = atoi(argv[4 + ib]);
|
||||
nb++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
idr = 0;
|
||||
for (ib = 0; ib < nb; ib++) {
|
||||
val[ib] = 0;
|
||||
}
|
||||
|
||||
fdin = fopen(argv[1], "rb");
|
||||
if (fdin == NULL) {
|
||||
printf("Cannot open input file %s for reading\n", argv[1]);
|
||||
return 200;
|
||||
}
|
||||
|
||||
while (fread((void *)&word, 8, 1, fdin)) {
|
||||
// printf("%llx\n",word);
|
||||
if (ioff < off)
|
||||
ioff++;
|
||||
else {
|
||||
|
||||
for (ib = 0; ib < nb; ib++) {
|
||||
if (word & (1 << bit[ib]))
|
||||
val[ib] |= (1 << idr);
|
||||
}
|
||||
idr++;
|
||||
if (idr == dr) {
|
||||
idr = 0;
|
||||
fprintf(stdout, "%d\t", iw++);
|
||||
for (ib = 0; ib < nb; ib++) {
|
||||
#ifdef HEX
|
||||
fprintf(stdout, "%08llx\t", val[ib]);
|
||||
#else
|
||||
fprintf(stdout, "%lld\t", val[ib]);
|
||||
|
||||
#endif
|
||||
|
||||
val[ib] = 0;
|
||||
}
|
||||
fprintf(stdout, "\n");
|
||||
}
|
||||
}
|
||||
}
|
||||
if (idr != 0) {
|
||||
fprintf(stdout, "%d\t", iw++);
|
||||
for (ib = 0; ib < nb; ib++) {
|
||||
#ifdef HEX
|
||||
fprintf(stdout, "%08llx\t", val[ib]);
|
||||
#else
|
||||
fprintf(stdout, "%lld\t", val[ib]);
|
||||
|
||||
#endif
|
||||
|
||||
val[ib] = 0;
|
||||
}
|
||||
fprintf(stdout, "\n");
|
||||
}
|
||||
|
||||
fclose(fdin);
|
||||
|
||||
return 0;
|
||||
}
|
@ -1,4 +0,0 @@
|
||||
BIT0 output0 1
|
||||
BIT1 output1 1
|
||||
BIT2 output2 1
|
||||
BIT3 output3 1
|
@ -1,97 +0,0 @@
|
||||
//define signals and directions (Input, outputs, clocks)
|
||||
|
||||
|
||||
#define output0 0
|
||||
setoutput(output0);
|
||||
|
||||
#define output1 1
|
||||
setoutput(output1);
|
||||
|
||||
#define output2 2
|
||||
setoutput(output2);
|
||||
|
||||
#define output3 3
|
||||
setoutput(output3);
|
||||
|
||||
#define input0 4
|
||||
setinput(input0);
|
||||
|
||||
#define input1 5
|
||||
setinput(input1);
|
||||
|
||||
#define input2 6
|
||||
setinput(input2);
|
||||
|
||||
#define input3 7
|
||||
setinput(input3);
|
||||
|
||||
|
||||
#define PW pw()
|
||||
#define SB(x) setbit(x)
|
||||
#define CB(x) clearbit(x)
|
||||
#define CLOCK clearbit(CLKBIT); pw();setbit(CLKBIT);pw()
|
||||
#define LCLOCK clearbit(CLKBIT); pw();setbit(CLKBIT);pw();clearbit(CLKBIT); pw()
|
||||
#define CLOCKS(x) for (i=0;i<x;i++) {clearbit(CLKBIT);pw(); setbit(CLKBIT); pw();}
|
||||
#define STOP setstop();
|
||||
#define START setstart();
|
||||
#define REPEAT(x) for (i=0;i<(x);i++) {pw();}
|
||||
#define DOFOR(x) for (j=0;j<(x);j++) {
|
||||
// }
|
||||
|
||||
|
||||
#define INST0 CB(output3);CB(output2);CB(output1);CB(output0);PW;
|
||||
#define INST1 CB(output3);CB(output2);CB(output1);SB(output0);PW;
|
||||
#define INST2 CB(output3);CB(output2);SB(output1);CB(output0);PW;
|
||||
#define INST3 CB(output3);CB(output2);SB(output1);SB(output0);PW;
|
||||
#define INST4 CB(output3);SB(output2);CB(output1);CB(output0);PW;
|
||||
#define INST5 CB(output3);SB(output2);CB(output1);SB(output0);PW;
|
||||
#define INST6 CB(output3);SB(output2);SB(output1);CB(output0);PW;
|
||||
#define INST7 CB(output3);SB(output2);SB(output1);SB(output0);PW;
|
||||
#define INST8 SB(output3);CB(output2);CB(output1);CB(output0);PW;
|
||||
#define INST9 SB(output3);CB(output2);CB(output1);SB(output0);PW;
|
||||
#define INST10 SB(output3);CB(output2);SB(output1);CB(output0);PW;
|
||||
#define INST11 SB(output3);CB(output2);SB(output1);SB(output0);PW;
|
||||
#define INST12 SB(output3);SB(output2);CB(output1);CB(output0);PW;
|
||||
|
||||
START;
|
||||
INST0;
|
||||
|
||||
setwaitpoint(0);
|
||||
setwaittime(0,5);
|
||||
INST1;
|
||||
|
||||
setstartloop(5);
|
||||
setnloop(5,2);
|
||||
INST2;
|
||||
|
||||
setstartloop(0);
|
||||
setnloop(0,2);
|
||||
INST3;
|
||||
|
||||
INST4;
|
||||
|
||||
setstoploop(0);
|
||||
setstoploop(5);
|
||||
INST5;
|
||||
|
||||
INST6;
|
||||
|
||||
setwaitpoint(4);
|
||||
setwaittime(1,0);
|
||||
INST7;
|
||||
|
||||
INST8;
|
||||
|
||||
setstartloop(2);
|
||||
setnloop(2,0);
|
||||
INST9;
|
||||
|
||||
INST10;
|
||||
|
||||
setstoploop(2);
|
||||
INST11;
|
||||
|
||||
STOP;
|
||||
INST12;
|
||||
|
||||
|
@ -1,25 +0,0 @@
|
||||
patword 0x0000 0x0000000000000000
|
||||
patword 0x0001 0x0000000000000001
|
||||
patword 0x0002 0x0000000000000002
|
||||
patword 0x0003 0x0000000000000003
|
||||
patword 0x0004 0x0000000000000004
|
||||
patword 0x0005 0x0000000000000005
|
||||
patword 0x0006 0x0000000000000006
|
||||
patword 0x0007 0x0000000000000007
|
||||
patword 0x0008 0x0000000000000008
|
||||
patword 0x0009 0x0000000000000009
|
||||
patword 0x000a 0x000000000000000a
|
||||
patword 0x000b 0x000000000000000b
|
||||
patword 0x000c 0x000000000000000c
|
||||
patlimits 0x0000 0x000c
|
||||
patioctrl 0x000000000000000f
|
||||
patloop 0 0x0003 0x0005
|
||||
patnloop 0 2
|
||||
patloop 2 0x0009 0x000b
|
||||
patnloop 2 0
|
||||
patloop 5 0x0002 0x0005
|
||||
patnloop 5 2
|
||||
patwait 0 0x0001
|
||||
patwaittime 0 5
|
||||
patwait 4 0x0007
|
||||
patwaittime 4 0
|
Binary file not shown.
Before Width: | Height: | Size: 299 KiB |
@ -1,183 +0,0 @@
|
||||
// SPDX-License-Identifier: LGPL-3.0-or-other
|
||||
// Copyright (C) 2021 Contributors to the SLS Detector Package
|
||||
/****************************************************************************
|
||||
usage to generate a patter test.pat from test.p
|
||||
|
||||
gcc -DINFILE="\"test.p\"" -DOUTFILE="\"test.pat\"" -o test.exe generator.c ;
|
||||
./test.exe ; rm test.exe
|
||||
|
||||
|
||||
*************************************************************************/
|
||||
|
||||
#include <errno.h>
|
||||
#include <fcntl.h>
|
||||
#include <math.h>
|
||||
#include <stdarg.h>
|
||||
#include <stdint.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <sys/stat.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/utsname.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#define MAXLOOPS 6
|
||||
#define MAXTIMERS 6
|
||||
#define MAXWORDS 8191
|
||||
|
||||
uint64_t pat = 0;
|
||||
uint64_t iopat = 0;
|
||||
uint64_t clkpat = 0;
|
||||
|
||||
unsigned iaddr = 0;
|
||||
unsigned waitaddr[MAXTIMERS] = {MAXWORDS, MAXWORDS, MAXWORDS,
|
||||
MAXWORDS, MAXWORDS, MAXWORDS};
|
||||
unsigned startloopaddr[MAXLOOPS] = {MAXWORDS, MAXWORDS, MAXWORDS,
|
||||
MAXWORDS, MAXWORDS, MAXWORDS};
|
||||
unsigned stoploopaddr[MAXLOOPS] = {MAXWORDS, MAXWORDS, MAXWORDS,
|
||||
MAXWORDS, MAXWORDS, MAXWORDS};
|
||||
unsigned start = 0, stop = 0;
|
||||
uint64_t waittime[MAXTIMERS] = {0, 0, 0, 0, 0, 0};
|
||||
unsigned nloop[MAXLOOPS] = {0, 0, 0, 0, 0, 0};
|
||||
|
||||
char infile[10000], outfile[10000];
|
||||
|
||||
FILE *fd, *fd1;
|
||||
uint64_t PAT[MAXWORDS];
|
||||
int iopat_enable = 0;
|
||||
|
||||
int i, ii, iii, j, jj, jjj, pixx, pixy, memx, memy, muxout, memclk, colclk,
|
||||
rowclk, muxclk, memcol, memrow, loopcounter;
|
||||
|
||||
void setstart() { start = iaddr; }
|
||||
|
||||
void setstop() { stop = iaddr; }
|
||||
|
||||
void setinput(int bit) {
|
||||
uint64_t mask = 1;
|
||||
mask = mask << bit;
|
||||
iopat &= ~mask;
|
||||
iopat_enable = 1;
|
||||
}
|
||||
|
||||
void setoutput(int bit) {
|
||||
uint64_t mask = 1;
|
||||
mask = mask << bit;
|
||||
iopat |= mask;
|
||||
iopat_enable = 1;
|
||||
}
|
||||
|
||||
void clearbit(int bit) {
|
||||
uint64_t mask = 1;
|
||||
mask = mask << bit;
|
||||
pat &= ~mask;
|
||||
}
|
||||
void setbit(int bit) {
|
||||
uint64_t mask = 1;
|
||||
mask = mask << bit;
|
||||
pat |= mask;
|
||||
}
|
||||
|
||||
int checkbit(int bit) {
|
||||
uint64_t mask = 1;
|
||||
mask = mask << bit;
|
||||
return (pat & mask) >> bit;
|
||||
}
|
||||
|
||||
void setstartloop(int iloop) {
|
||||
if (iloop >= 0 && iloop < MAXLOOPS) {
|
||||
startloopaddr[iloop] = iaddr;
|
||||
}
|
||||
}
|
||||
|
||||
void setstoploop(int iloop) {
|
||||
if (iloop >= 0 && iloop < MAXLOOPS) {
|
||||
stoploopaddr[iloop] = iaddr;
|
||||
}
|
||||
}
|
||||
|
||||
void setnloop(int iloop, int n) {
|
||||
if (iloop >= 0 && iloop < MAXLOOPS) {
|
||||
nloop[iloop] = n;
|
||||
}
|
||||
}
|
||||
|
||||
void setwaitpoint(int iloop) {
|
||||
if (iloop >= 0 && iloop < MAXTIMERS) {
|
||||
waitaddr[iloop] = iaddr;
|
||||
}
|
||||
}
|
||||
|
||||
void setwaittime(int iloop, uint64_t t) {
|
||||
if (iloop >= 0 && iloop < MAXTIMERS) {
|
||||
waittime[iloop] = t;
|
||||
}
|
||||
}
|
||||
|
||||
void pw() {
|
||||
if (iaddr < MAXWORDS) {
|
||||
PAT[iaddr] = pat;
|
||||
}
|
||||
fprintf(fd, "patword 0x%04x 0x%016llx\n", iaddr, pat);
|
||||
iaddr++;
|
||||
if (iaddr >= MAXWORDS) {
|
||||
printf("ERROR: too many word in the pattern (%d instead of %d)!", iaddr,
|
||||
MAXWORDS);
|
||||
}
|
||||
}
|
||||
|
||||
int parseCommand(int clk, int cmdbit, int cmd, int length) {
|
||||
int ibit;
|
||||
clearbit(clk);
|
||||
for (ibit = 0; ibit < length; ibit++) {
|
||||
if (cmd & (1 >> ibit)) {
|
||||
setbit(cmdbit);
|
||||
} else {
|
||||
clearbit(cmdbit);
|
||||
}
|
||||
pw();
|
||||
/******/
|
||||
setbit(clk);
|
||||
pw();
|
||||
/******/
|
||||
}
|
||||
};
|
||||
|
||||
int main() {
|
||||
int iloop = 0;
|
||||
fd = fopen(OUTFILE, "w");
|
||||
#include INFILE
|
||||
|
||||
fprintf(fd, "patlimits 0x%04x 0x%04x\n", start, stop);
|
||||
|
||||
if (iopat_enable == 1) {
|
||||
fprintf(fd, "patioctrl 0x%016llx\n", iopat);
|
||||
}
|
||||
|
||||
for (iloop = 0; iloop < MAXLOOPS; iloop++) {
|
||||
if ((startloopaddr[iloop] != MAXWORDS) &&
|
||||
(stoploopaddr[iloop] != MAXWORDS)) {
|
||||
fprintf(fd, "patloop %d 0x%04x 0x%04x\n", iloop,
|
||||
startloopaddr[iloop], stoploopaddr[iloop]);
|
||||
if (stoploopaddr[iloop] <= startloopaddr[iloop]) {
|
||||
nloop[iloop] = 0;
|
||||
}
|
||||
fprintf(fd, "patnloop %d %u\n", iloop, nloop[iloop]);
|
||||
}
|
||||
}
|
||||
|
||||
for (iloop = 0; iloop < MAXTIMERS; iloop++) {
|
||||
if (waitaddr[iloop] != MAXWORDS) {
|
||||
fprintf(fd, "patwait %d 0x%04x\n", iloop, waitaddr[iloop]);
|
||||
fprintf(fd, "patwaittime %d %llu\n", iloop, waittime[iloop]);
|
||||
}
|
||||
}
|
||||
|
||||
fclose(fd);
|
||||
fd1 = fopen(OUTFILEBIN, "w");
|
||||
fwrite(PAT, sizeof(uint64_t), iaddr, fd1);
|
||||
fclose(fd1);
|
||||
|
||||
return 0;
|
||||
}
|
@ -1,610 +0,0 @@
|
||||
#!/usr/bin/env python3
|
||||
|
||||
"""
|
||||
Created on Wed May 24 09:44:53 2017
|
||||
|
||||
Plot the pattern for New Chip Test Box (.pat)
|
||||
|
||||
Changes:
|
||||
- 2017-11-21 Adapt it to python-3
|
||||
- 2017-09-25 All can be plotted
|
||||
- 2017-09-22 Can be plotted but the loop and wait not work yet
|
||||
|
||||
@author: zhang_j1
|
||||
"""
|
||||
import matplotlib.pyplot as plt
|
||||
from numpy import *
|
||||
from matplotlib.pyplot import *
|
||||
from matplotlib.patches import Rectangle
|
||||
import os
|
||||
import argparse
|
||||
|
||||
###############################################################################
|
||||
# COLORS AND LINE STYLES
|
||||
# alternating colors of the plots (2 needed)
|
||||
colors_plot = ['tab:blue', 'tab:orange']
|
||||
|
||||
# Wait colors and line styles (6 needed from 0 to 5)
|
||||
colors_wait = ['b', 'g', 'r', 'c', 'm', 'y']
|
||||
linestyles_wait = ['--', '--', '--', '--', '--', '--']
|
||||
alpha_wait = [0.5, 0.5, 0.5, 0.5, 0.5, 0.5]
|
||||
alpha_wait_rect = [0.2, 0.2, 0.2, 0.2, 0.2, 0.2]
|
||||
|
||||
# Loop colors and line styles (6 needed from 0 to 5)
|
||||
colors_loop = ['tab:green', 'tab:red', 'tab:purple', 'tab:brown', 'tab:pink', 'tab:grey']
|
||||
linestyles_loop = ['-.', '-.', '-.', '-.', '-.', '-.']
|
||||
alpha_loop = [0.5, 0.5, 0.5, 0.5, 0.5, 0.5]
|
||||
alpha_loop_rect = [0.2, 0.2, 0.2, 0.2, 0.2, 0.2]
|
||||
|
||||
# Display the count of clocks
|
||||
clock_vertical_lines_spacing = 1
|
||||
show_clocks_number = True
|
||||
|
||||
###############################################################################
|
||||
|
||||
|
||||
# Define a hex to binary function
|
||||
# global definition
|
||||
# base = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F]
|
||||
base = [str(x) for x in range(10)] + [chr(x) for x in range(ord('A'), ord('A')+6)]
|
||||
# dec2bin
|
||||
|
||||
|
||||
def dec2bin(string_num):
|
||||
num = int(string_num)
|
||||
mid = []
|
||||
while True:
|
||||
if num == 0:
|
||||
break
|
||||
num, rem = divmod(num, 2)
|
||||
mid.append(base[rem])
|
||||
|
||||
return ''.join([str(x) for x in mid[::-1]])
|
||||
|
||||
|
||||
# dec2binary: better than dec2bin
|
||||
def dec2binary(dec_num, width=None):
|
||||
return binary_repr(int(dec_num), width=width)
|
||||
|
||||
|
||||
# hex2dec
|
||||
def hex2dec(string_num):
|
||||
return str(int(string_num.upper(), 16))
|
||||
|
||||
|
||||
# hex2bin
|
||||
def hex2bin(string_num):
|
||||
return dec2bin(hex2dec(string_num.upper()))
|
||||
|
||||
|
||||
# hex2bin
|
||||
def hex2binary(string_num, width=None):
|
||||
return dec2binary(hex2dec(string_num.upper()), width=width)
|
||||
|
||||
|
||||
parser = argparse.ArgumentParser()
|
||||
|
||||
parser.add_argument('-d', '--directory', required = True, help = "Working directory where the pattern is located")
|
||||
parser.add_argument('-p', '--pattern', required = True, help = "Pattern name")
|
||||
parser.add_argument('-a', '--alias', help = "Alias name")
|
||||
parser.add_argument('-v', '--verbose', action='store_true')
|
||||
|
||||
args = parser.parse_args()
|
||||
|
||||
Folder = args.directory
|
||||
File_pat = args.pattern
|
||||
File_alias = args.alias
|
||||
verbose = args.verbose
|
||||
|
||||
# Look at the alias file and generate the lookup table for pin names
|
||||
# Create a 64 bit look up table
|
||||
table = []
|
||||
for i in range(64):
|
||||
# for special bit
|
||||
if i+1 == 59:
|
||||
table.append([str(i+1), "external_trigger"])
|
||||
elif i+1 == 63:
|
||||
table.append([str(i+1), "adc_enable"])
|
||||
elif i+1 == 62:
|
||||
table.append([str(i+1), "dbit_enable"])
|
||||
else:
|
||||
table.append([str(i+1), ""])
|
||||
|
||||
# Loop all lines
|
||||
try:
|
||||
with open(Folder + "/" + File_alias + ".alias") as f:
|
||||
lines = f.readlines()
|
||||
f.close()
|
||||
nlines = len(lines)
|
||||
except:
|
||||
nlines = 0
|
||||
|
||||
if nlines > 0:
|
||||
for i in range(nlines):
|
||||
# whether the line is bit definition
|
||||
if lines[i][0:3] == "BIT":
|
||||
# split words
|
||||
words = lines[i].split()
|
||||
bit_num = int(words[0][3:])
|
||||
table[bit_num][0] = words[0][3:]
|
||||
table[bit_num][1] = words[1]
|
||||
else:
|
||||
for i in range(64):
|
||||
table[i][0] = i
|
||||
table[i][1] = f'BIT#{i}'
|
||||
|
||||
if verbose:
|
||||
print(table)
|
||||
|
||||
# Load the pattern and get all lines
|
||||
# Loop all lines
|
||||
if os.path.exists(Folder + "/" + File_pat + ".pat"):
|
||||
with open(Folder + "/" + File_pat + ".pat") as f_pat:
|
||||
lines_pat = f_pat.readlines()
|
||||
elif os.path.exists(Folder + "/" + File_pat + ".pyat"):
|
||||
with open(Folder + "/" + File_pat + ".pyat") as f_pat:
|
||||
lines_pat = f_pat.readlines()
|
||||
else:
|
||||
print("No file found - Check it")
|
||||
exit()
|
||||
f_pat.close()
|
||||
|
||||
# number of lines for pattern file
|
||||
nlines_pat = len(lines_pat)
|
||||
# a counter
|
||||
cnt = 0
|
||||
if verbose:
|
||||
print("The total number of lines of pattern:", nlines_pat)
|
||||
|
||||
# Loop all lines of pattern
|
||||
waittime0 = None
|
||||
waittime1 = None
|
||||
waittime2 = None
|
||||
waittime3 = None
|
||||
waittime4 = None
|
||||
waittime5 = None
|
||||
|
||||
nloop0 = None
|
||||
nloop1 = None
|
||||
nloop2 = None
|
||||
nloop3 = None
|
||||
nloop4 = None
|
||||
nloop5 = None
|
||||
|
||||
for k in range(nlines_pat):
|
||||
# content of line
|
||||
words_line = lines_pat[k].split()
|
||||
if words_line[0] == "patword":
|
||||
# print words_line from b0 to b63
|
||||
bits = hex2binary(words_line[-1], 64)[::-1]
|
||||
if verbose:
|
||||
print("The bits for line-", k+1, "is:", bits)
|
||||
# convert string bits to decimal array
|
||||
num_bits = array(list(map(str, bits)), dtype="uint16")
|
||||
if cnt == 0:
|
||||
mat_pat = num_bits
|
||||
else:
|
||||
# add bits to matrix
|
||||
mat_pat = concatenate((mat_pat, num_bits), axis=0)
|
||||
cnt = cnt + 1
|
||||
# print("The matrix of pattern:", mat_pat.reshape(int(cnt), int(len(num_bits))))
|
||||
|
||||
# Look at the io: 0 for sending to ASIC, 1 for reading from ASIC
|
||||
if words_line[0] == "patioctrl":
|
||||
# print words_line
|
||||
if verbose:
|
||||
print(words_line[-1])
|
||||
bits = hex2binary(words_line[-1], 64)[::-1]
|
||||
if verbose:
|
||||
print(bits)
|
||||
# convert string bits to decimal array
|
||||
out_bits = array(list(map(str, bits)), dtype="uint16")
|
||||
|
||||
if verbose:
|
||||
print(words_line)
|
||||
# Deal with waiting point
|
||||
|
||||
# ====== WAIT ======
|
||||
if words_line[0] == "patwait" and words_line[1] == "0":
|
||||
wait0 = int(hex2dec(words_line[2]))
|
||||
if verbose:
|
||||
print("wait 0 at:", wait0)
|
||||
if words_line[0] == "patwaittime" and words_line[1] == "0":
|
||||
waittime0 = int(words_line[2])
|
||||
if verbose:
|
||||
print("wait 0 for:", waittime0)
|
||||
|
||||
if words_line[0] == "patwait" and words_line[1] == "1":
|
||||
wait1 = int(hex2dec(words_line[2]))
|
||||
if verbose:
|
||||
print("wait 1 at:", wait1)
|
||||
if words_line[0] == "patwaittime" and words_line[1] == "1":
|
||||
waittime1 = int(words_line[2])
|
||||
if verbose:
|
||||
print("wait 1 for:", waittime1)
|
||||
|
||||
if words_line[0] == "patwait" and words_line[1] == "2":
|
||||
wait2 = int(hex2dec(words_line[2]))
|
||||
if verbose:
|
||||
print("wait 2 at:", wait2)
|
||||
if words_line[0] == "patwaittime" and words_line[1] == "2":
|
||||
waittime2 = int(words_line[2])
|
||||
if verbose:
|
||||
print("wait 2 for:", waittime2)
|
||||
|
||||
if words_line[0] == "patwait" and words_line[1] == "3":
|
||||
wait3 = int(hex2dec(words_line[2]))
|
||||
if verbose:
|
||||
print("wait 0 at:", wait3)
|
||||
if words_line[0] == "patwaittime" and words_line[1] == "3":
|
||||
waittime3 = int(words_line[2])
|
||||
if verbose:
|
||||
print("wait 0 for:", waittime3)
|
||||
|
||||
if words_line[0] == "patwait" and words_line[1] == "4":
|
||||
wait4 = int(hex2dec(words_line[2]))
|
||||
if verbose:
|
||||
print("wait 1 at:", wait4)
|
||||
if words_line[0] == "patwaittime" and words_line[1] == "4":
|
||||
waittime4 = int(words_line[2])
|
||||
if verbose:
|
||||
print("wait 1 for:", waittime4)
|
||||
|
||||
if words_line[0] == "patwait" and words_line[1] == "5":
|
||||
wait5 = int(hex2dec(words_line[2]))
|
||||
if verbose:
|
||||
print("wait 2 at:", wait5)
|
||||
if words_line[0] == "patwaittime" and words_line[1] == "5":
|
||||
waittime5 = int(words_line[2])
|
||||
if verbose:
|
||||
print("wait 2 for:", waittime5)
|
||||
|
||||
# ====== LOOPS ======
|
||||
if words_line[0] == "patloop" and words_line[1] == "0":
|
||||
loop0_start = int(hex2dec(words_line[2]))
|
||||
loop0_end = int(hex2dec(words_line[3]))
|
||||
if verbose:
|
||||
print("loop 0 start:", loop0_start, ", end:", loop0_end)
|
||||
if words_line[0] == "patnloop" and words_line[1] == "0":
|
||||
nloop0 = int(words_line[2])
|
||||
if verbose:
|
||||
print("loop 0 times:", nloop0)
|
||||
|
||||
if words_line[0] == "patloop" and words_line[1] == "1":
|
||||
loop1_start = int(hex2dec(words_line[2]))
|
||||
loop1_end = int(hex2dec(words_line[3]))
|
||||
if verbose:
|
||||
print("loop 1 start:", loop1_start, ", end:", loop1_end)
|
||||
if words_line[0] == "patnloop" and words_line[1] == "1":
|
||||
nloop1 = int(words_line[2])
|
||||
if verbose:
|
||||
print("loop 1 times:", nloop1)
|
||||
|
||||
if words_line[0] == "patloop" and words_line[1] == "2":
|
||||
loop2_start = int(hex2dec(words_line[2]))
|
||||
loop2_end = int(hex2dec(words_line[3]))
|
||||
if verbose:
|
||||
print("loop 2 start:", loop2_start, ", end:", loop2_end)
|
||||
if words_line[0] == "patnloop" and words_line[1] == "2":
|
||||
nloop2 = int(words_line[2])
|
||||
if verbose:
|
||||
print("loop 2 times:", nloop2)
|
||||
|
||||
if words_line[0] == "patloop" and words_line[1] == "3":
|
||||
loop3_start = int(hex2dec(words_line[2]))
|
||||
loop3_end = int(hex2dec(words_line[3]))
|
||||
if verbose:
|
||||
print("loop 3 start:", loop3_start, ", end:", loop3_end)
|
||||
if words_line[0] == "patnloop" and words_line[1] == "3":
|
||||
nloop3 = int(words_line[2])
|
||||
if verbose:
|
||||
print("loop 3 times:", nloop3)
|
||||
|
||||
if words_line[0] == "patloop" and words_line[1] == "4":
|
||||
loop4_start = int(hex2dec(words_line[2]))
|
||||
loop4_end = int(hex2dec(words_line[3]))
|
||||
if verbose:
|
||||
print("loop 4 start:", loop4_start, ", end:", loop4_end)
|
||||
if words_line[0] == "patnloop" and words_line[1] == "4":
|
||||
nloop4 = int(words_line[2])
|
||||
if verbose:
|
||||
print("loop 4 times:", nloop4)
|
||||
|
||||
if words_line[0] == "patloop" and words_line[1] == "5":
|
||||
loop5_start = int(hex2dec(words_line[2]))
|
||||
loop5_end = int(hex2dec(words_line[3]))
|
||||
if verbose:
|
||||
print("loop 5 start:", loop5_start, ", end:", loop5_end)
|
||||
if words_line[0] == "patnloop" and words_line[1] == "5":
|
||||
nloop5 = int(words_line[2])
|
||||
if verbose:
|
||||
print("loop 5 times:", nloop5)
|
||||
# print(out_bits)
|
||||
|
||||
# internal counter
|
||||
avail_index = []
|
||||
avail_name = []
|
||||
# Remove non-used bits
|
||||
for i in range(64):
|
||||
# if out_bits[0][i] == 1:
|
||||
if out_bits[i] == 1:
|
||||
avail_index.append(i)
|
||||
avail_name.append(table[i][1])
|
||||
if verbose:
|
||||
print(avail_index)
|
||||
print(avail_name)
|
||||
|
||||
# number of effective used bits
|
||||
nbiteff = len(avail_name)
|
||||
|
||||
# subMat = mat_ext[:,index]
|
||||
# print(mat_pat.shape)
|
||||
subMat = mat_pat.reshape(int(cnt), int(len(num_bits)))[0:, avail_index]
|
||||
# subMat = mat_pat[avail_index]
|
||||
timing = linspace(0, subMat.shape[0]-1, subMat.shape[0])
|
||||
rcParams['figure.figsize'] = 15, 5
|
||||
|
||||
|
||||
# ============= PLOTTING =============
|
||||
|
||||
rcParams["font.weight"] = "bold"
|
||||
rcParams["axes.labelweight"] = "bold"
|
||||
fig2, axs2 = subplots(nbiteff, sharex='all')
|
||||
subplots_adjust(wspace=0, hspace=0)
|
||||
# axs2[nbiteff - 1].set(xlabel='Timing [clk]')
|
||||
for idx, i in enumerate(range(nbiteff)):
|
||||
|
||||
axs2[idx].plot(subMat.T[i], "-", drawstyle="steps-post", linewidth=2.0, color=colors_plot[idx % 2])
|
||||
x_additional = range(len(subMat.T[i]) - 1, len(subMat.T[i]) + 2)
|
||||
additional_stuff = [subMat.T[i][-1]] * 3
|
||||
|
||||
axs2[idx].plot(x_additional, additional_stuff,
|
||||
"--", drawstyle="steps-post", linewidth=2.0, color=colors_plot[idx % 2], alpha=0.5)
|
||||
axs2[idx].yaxis.set_ticks([0.5], minor=False)
|
||||
axs2[idx].xaxis.set_ticks(arange(0, len(subMat.T[i]) + 10, clock_vertical_lines_spacing))
|
||||
|
||||
axs2[idx].yaxis.set_ticklabels([avail_name[i]])
|
||||
axs2[idx].get_yticklabels()[0].set_color(colors_plot[idx % 2])
|
||||
|
||||
axs2[idx].grid(1, 'both', 'both', alpha=0.5)
|
||||
axs2[idx].yaxis.grid(which="both", color=colors_plot[idx % 2], alpha=0.2)
|
||||
if idx != nbiteff - 1:
|
||||
if not show_clocks_number:
|
||||
axs2[idx].xaxis.set_ticklabels([])
|
||||
axs2[idx].set(xlabel=' ', ylim=(-0.2, 1.2))
|
||||
else:
|
||||
axs2[idx].set(xlabel='Timing [clk]', ylim=(-0.2, 1.2))
|
||||
# axs2[idx].set_xlim(left=0)
|
||||
axs2[idx].set_xlim(left=0, right=len(subMat.T[i]) + 1)
|
||||
axs2[idx].spines['top'].set_visible(False)
|
||||
axs2[idx].spines['right'].set_alpha(0.2)
|
||||
axs2[idx].spines['right'].set_visible(True)
|
||||
axs2[idx].spines['bottom'].set_visible(False)
|
||||
axs2[idx].spines['left'].set_visible(False)
|
||||
|
||||
# =====================================================================================================
|
||||
# Plot the wait lines
|
||||
# Wait 0
|
||||
if waittime0 is not None:
|
||||
if waittime0 == 0:
|
||||
axs2[idx].plot([wait0, wait0], [-10, 10],
|
||||
linestyle=linestyles_wait[0], color=colors_wait[0], alpha=alpha_wait[0], linewidth=2.0)
|
||||
axs2[idx].plot([wait0 + 1, wait0 + 1], [-10, 10],
|
||||
linestyle=linestyles_wait[0], color=colors_wait[0], linewidth=2.0, alpha=alpha_wait[0])
|
||||
axs2[idx].add_patch(Rectangle((wait0, -10), 1, 20,
|
||||
label="wait 0: skipped" if idx == 0 else "",
|
||||
facecolor=colors_wait[0], alpha=alpha_wait_rect[0], hatch='\\\\'))
|
||||
else:
|
||||
axs2[idx].plot([wait0, wait0], [-10, 10],
|
||||
linestyle=linestyles_wait[0], color=colors_wait[0],
|
||||
label="wait 0: " + str(waittime0) + " clk" if idx == 0 else "",
|
||||
linewidth=2.0, alpha=alpha_wait[0])
|
||||
|
||||
# Wait 1
|
||||
if waittime1 is not None:
|
||||
if waittime1 == 0:
|
||||
axs2[idx].plot([wait1, wait1], [-10, 10],
|
||||
linestyle=linestyles_wait[1], color=colors_wait[1], alpha=alpha_wait[1], linewidth=2.0)
|
||||
axs2[idx].plot([wait1 + 1, wait1 + 1], [-10, 10],
|
||||
linestyle=linestyles_wait[1], color=colors_wait[1], linewidth=2.0, alpha=alpha_wait[1])
|
||||
axs2[idx].add_patch(Rectangle((wait1, -10), 1, 20,
|
||||
label="wait 1: skipped" if idx == 0 else "",
|
||||
facecolor=colors_wait[1], alpha=alpha_wait_rect[1], hatch='\\\\'))
|
||||
else:
|
||||
axs2[idx].plot([wait1, wait1], [-10, 10],
|
||||
linestyle=linestyles_wait[1], color=colors_wait[1],
|
||||
label="wait 1: " + str(waittime1) + " clk" if idx == 0 else "",
|
||||
linewidth=2.0, alpha=alpha_wait[1])
|
||||
|
||||
# Wait 2
|
||||
if waittime2 is not None:
|
||||
if waittime2 == 0:
|
||||
axs2[idx].plot([wait2, wait2], [-10, 10],
|
||||
linestyle=linestyles_wait[2], color=colors_wait[2], alpha=alpha_wait[2], linewidth=2.0)
|
||||
axs2[idx].plot([wait2 + 1, wait2 + 1], [-10, 10],
|
||||
linestyle=linestyles_wait[2], color=colors_wait[2], linewidth=2.0, alpha=alpha_wait[2])
|
||||
axs2[idx].add_patch(Rectangle((wait2, -10), 1, 20,
|
||||
label="wait 2: skipped" if idx == 0 else "",
|
||||
facecolor=colors_wait[2], alpha=alpha_wait_rect[2], hatch='\\\\'))
|
||||
else:
|
||||
axs2[idx].plot([wait2, wait2], [-10, 10],
|
||||
linestyle=linestyles_wait[2], color=colors_wait[2],
|
||||
label="wait 2: " + str(waittime2) + " clk" if idx == 0 else "",
|
||||
linewidth=2.0, alpha=alpha_wait[2])
|
||||
|
||||
# Wait 3
|
||||
if waittime3 is not None:
|
||||
if waittime3 == 0:
|
||||
axs2[idx].plot([wait3, wait3], [-10, 10],
|
||||
linestyle=linestyles_wait[3], color=colors_wait[3], alpha=alpha_wait[3], linewidth=2.0)
|
||||
axs2[idx].plot([wait3 + 1, wait3 + 1], [-10, 10],
|
||||
linestyle=linestyles_wait[3], color=colors_wait[3], linewidth=2.0, alpha=alpha_wait[3])
|
||||
axs2[idx].add_patch(Rectangle((wait3, -10), 1, 20,
|
||||
label="wait 3: skipped" if idx == 0 else "",
|
||||
facecolor=colors_wait[3], alpha=alpha_wait_rect[3], hatch='\\\\'))
|
||||
else:
|
||||
axs2[idx].plot([wait3, wait3], [-10, 10],
|
||||
linestyle=linestyles_wait[3], color=colors_wait[3],
|
||||
label="wait 3: " + str(waittime3) + " clk" if idx == 0 else "",
|
||||
linewidth=2.0, alpha=alpha_wait[3])
|
||||
|
||||
# Wait 4
|
||||
if waittime4 is not None:
|
||||
if waittime4 == 0:
|
||||
axs2[idx].plot([wait4, wait4], [-10, 10],
|
||||
linestyle=linestyles_wait[4], color=colors_wait[4], alpha=alpha_wait[4], linewidth=2.0)
|
||||
axs2[idx].plot([wait4 + 1, wait4 + 1], [-10, 10],
|
||||
linestyle=linestyles_wait[4], color=colors_wait[4], linewidth=2.0, alpha=alpha_wait[4])
|
||||
axs2[idx].add_patch(Rectangle((wait4, -10), 1, 20,
|
||||
label="wait 4: skipped" if idx == 0 else "",
|
||||
facecolor=colors_wait[4], alpha=alpha_wait_rect[4], hatch='\\\\'))
|
||||
else:
|
||||
axs2[idx].plot([wait4, wait4], [-10, 10],
|
||||
linestyle=linestyles_wait[4], color=colors_wait[4],
|
||||
label="wait 4: " + str(waittime4) + " clk" if idx == 0 else "",
|
||||
linewidth=2.0, alpha=alpha_wait[4])
|
||||
|
||||
# Wait 5
|
||||
if waittime5 is not None:
|
||||
if waittime5 == 0:
|
||||
axs2[idx].plot([wait5, wait5], [-10, 10],
|
||||
linestyle=linestyles_wait[5], color=colors_wait[5], alpha=alpha_wait[5], linewidth=2.0)
|
||||
axs2[idx].plot([wait5 + 1, wait5 + 1], [-10, 10],
|
||||
linestyle=linestyles_wait[5], color=colors_wait[5], linewidth=2.0, alpha=alpha_wait[5])
|
||||
axs2[idx].add_patch(Rectangle((wait5, -10), 1, 20,
|
||||
label="wait 5: skipped" if idx == 0 else "",
|
||||
facecolor=colors_wait[5], alpha=alpha_wait_rect[5], hatch='\\\\'))
|
||||
else:
|
||||
axs2[idx].plot([wait5, wait5], [-10, 10],
|
||||
linestyle=linestyles_wait[5], color=colors_wait[5],
|
||||
label="wait 5: " + str(waittime5) + " clk" if idx == 0 else "",
|
||||
linewidth=2.0, alpha=alpha_wait[5])
|
||||
|
||||
# =====================================================================================================
|
||||
# Plot the loop lines
|
||||
# Loop 0
|
||||
if nloop0 is not None:
|
||||
if nloop0 == 0:
|
||||
axs2[idx].plot([loop0_start, loop0_start], [-10, 10],
|
||||
linestyle=linestyles_loop[0], color=colors_loop[0],
|
||||
alpha=alpha_loop[0], linewidth=2.0)
|
||||
axs2[idx].plot([loop0_end + 1, loop0_end + 1], [-10, 10],
|
||||
linestyle=linestyles_loop[0], color=colors_loop[0], alpha=alpha_loop[0], linewidth=2.0)
|
||||
axs2[idx].add_patch(Rectangle((loop0_start, -10), loop0_end + 1 - loop0_start, 20,
|
||||
label="loop 0: skipped" if idx == 0 else "",
|
||||
facecolor=colors_loop[0], alpha=alpha_loop_rect[0], hatch='//'))
|
||||
else:
|
||||
axs2[idx].plot([loop0_start, loop0_start], [-10, 10],
|
||||
linestyle=linestyles_loop[0], color=colors_loop[0], alpha=alpha_loop[0],
|
||||
label="loop 0: " + str(nloop0) + " times" if idx == 0 else "", linewidth=2.0)
|
||||
axs2[idx].plot([loop0_end, loop0_end], [-10, 10],
|
||||
linestyle=linestyles_loop[0], color=colors_loop[0], alpha=alpha_loop[0], linewidth=2.0)
|
||||
|
||||
# Loop 1
|
||||
if nloop1 is not None:
|
||||
if nloop1 == 0:
|
||||
axs2[idx].plot([loop1_start, loop1_start], [-10, 10],
|
||||
linestyle=linestyles_loop[1], color=colors_loop[1],
|
||||
alpha=alpha_loop[1], linewidth=2.0)
|
||||
axs2[idx].plot([loop1_end + 1, loop1_end + 1], [-10, 10],
|
||||
linestyle=linestyles_loop[1], color=colors_loop[1], alpha=alpha_loop[1], linewidth=2.0)
|
||||
axs2[idx].add_patch(Rectangle((loop1_start, -10), loop1_end + 1 - loop1_start, 20,
|
||||
label="loop 1: skipped" if idx == 0 else "",
|
||||
facecolor=colors_loop[1], alpha=alpha_loop_rect[1], hatch='//'))
|
||||
else:
|
||||
axs2[idx].plot([loop1_start, loop1_start], [-10, 10],
|
||||
linestyle=linestyles_loop[1], color=colors_loop[1], alpha=alpha_loop[1],
|
||||
label="loop 1: " + str(nloop1) + " times" if idx == 0 else "", linewidth=2.0)
|
||||
axs2[idx].plot([loop1_end, loop1_end], [-10, 10],
|
||||
linestyle=linestyles_loop[1], color=colors_loop[1], alpha=alpha_loop[1], linewidth=2.0)
|
||||
|
||||
# Loop 2
|
||||
if nloop2 is not None:
|
||||
if nloop2 == 0:
|
||||
axs2[idx].plot([loop2_start, loop2_start], [-10, 10],
|
||||
linestyle=linestyles_loop[2], color=colors_loop[2],
|
||||
alpha=alpha_loop[2], linewidth=2.0)
|
||||
axs2[idx].plot([loop2_end + 1, loop2_end + 1], [-10, 10],
|
||||
linestyle=linestyles_loop[2], color=colors_loop[2], alpha=alpha_loop[2], linewidth=2.0)
|
||||
axs2[idx].add_patch(Rectangle((loop2_start, -10), loop2_end + 1 - loop2_start, 20,
|
||||
label="loop 2: skipped" if idx == 0 else "",
|
||||
facecolor=colors_loop[2], alpha=alpha_loop_rect[2], hatch='//'))
|
||||
else:
|
||||
axs2[idx].plot([loop2_start, loop2_start], [-10, 10],
|
||||
linestyle=linestyles_loop[2], color=colors_loop[2], alpha=alpha_loop[2],
|
||||
label="loop 2: " + str(nloop2) + " times" if idx == 0 else "", linewidth=2.0)
|
||||
axs2[idx].plot([loop2_end, loop2_end], [-10, 10],
|
||||
linestyle=linestyles_loop[2], color=colors_loop[2], alpha=alpha_loop[2], linewidth=2.0)
|
||||
|
||||
# Loop 3
|
||||
if nloop3 is not None:
|
||||
if nloop3 == 0:
|
||||
axs2[idx].plot([loop3_start, loop3_start], [-10, 10],
|
||||
linestyle=linestyles_loop[3], color=colors_loop[3],
|
||||
alpha=alpha_loop[3], linewidth=2.0)
|
||||
axs2[idx].plot([loop3_end + 1, loop3_end + 1], [-10, 10],
|
||||
linestyle=linestyles_loop[3], color=colors_loop[3], alpha=alpha_loop[3], linewidth=2.0)
|
||||
axs2[idx].add_patch(Rectangle((loop3_start, -10), loop3_end + 1 - loop3_start, 20,
|
||||
label="loop 3: skipped" if idx == 0 else "",
|
||||
facecolor=colors_loop[3], alpha=alpha_loop_rect[3], hatch='//'))
|
||||
else:
|
||||
axs2[idx].plot([loop3_start, loop3_start], [-10, 10],
|
||||
linestyle=linestyles_loop[3], color=colors_loop[3], alpha=alpha_loop[3],
|
||||
label="loop 3: " + str(nloop3) + " times" if idx == 0 else "", linewidth=2.0)
|
||||
axs2[idx].plot([loop3_end, loop3_end], [-10, 10],
|
||||
linestyle=linestyles_loop[3], color=colors_loop[3], alpha=alpha_loop[3], linewidth=2.0)
|
||||
|
||||
# Loop 4
|
||||
if nloop4 is not None:
|
||||
if nloop4 == 0:
|
||||
axs2[idx].plot([loop4_start, loop4_start], [-10, 10],
|
||||
linestyle=linestyles_loop[4], color=colors_loop[4],
|
||||
alpha=alpha_loop[4], linewidth=2.0)
|
||||
axs2[idx].plot([loop4_end + 1, loop4_end + 1], [-10, 10],
|
||||
linestyle=linestyles_loop[4], color=colors_loop[4], alpha=alpha_loop[4], linewidth=2.0)
|
||||
axs2[idx].add_patch(Rectangle((loop4_start, -10), loop4_end + 1 - loop4_start, 20,
|
||||
label="loop 4: skipped" if idx == 0 else "",
|
||||
facecolor=colors_loop[4], alpha=alpha_loop_rect[4], hatch='//'))
|
||||
else:
|
||||
axs2[idx].plot([loop4_start, loop4_start], [-10, 10],
|
||||
linestyle=linestyles_loop[4], color=colors_loop[4], alpha=alpha_loop[4],
|
||||
label="loop 4: " + str(nloop4) + " times" if idx == 0 else "", linewidth=2.0)
|
||||
axs2[idx].plot([loop4_end, loop4_end], [-10, 10],
|
||||
linestyle=linestyles_loop[4], color=colors_loop[4], alpha=alpha_loop[4], linewidth=2.0)
|
||||
|
||||
# Loop 5
|
||||
if nloop5 is not None:
|
||||
if nloop5 == 0:
|
||||
axs2[idx].plot([loop5_start, loop5_start], [-10, 10],
|
||||
linestyle=linestyles_loop[5], color=colors_loop[5],
|
||||
alpha=alpha_loop[5], linewidth=2.0)
|
||||
axs2[idx].plot([loop5_end + 1, loop5_end + 1], [-10, 10],
|
||||
linestyle=linestyles_loop[5], color=colors_loop[5], alpha=alpha_loop[5], linewidth=2.0)
|
||||
axs2[idx].add_patch(Rectangle((loop5_start, -10), loop5_end + 1 - loop5_start, 20,
|
||||
label="loop 5: skipped" if idx == 0 else "",
|
||||
facecolor=colors_loop[5], alpha=alpha_loop_rect[5], hatch='//'))
|
||||
else:
|
||||
axs2[idx].plot([loop5_start, loop5_start], [-10, 10],
|
||||
linestyle=linestyles_loop[5], color=colors_loop[5], alpha=alpha_loop[5],
|
||||
label="loop 5: " + str(nloop5) + " times" if idx == 0 else "", linewidth=2.0)
|
||||
axs2[idx].plot([loop5_end, loop5_end], [-10, 10],
|
||||
linestyle=linestyles_loop[5], color=colors_loop[5], alpha=alpha_loop[5], linewidth=2.0)
|
||||
|
||||
|
||||
n_cols = count_nonzero([waittime0 != 0, waittime1 != 0, waittime2 != 0, waittime3 != 0, waittime4 != 0, waittime5 != 0,
|
||||
nloop0 != 0, nloop1 != 0, nloop2 != 0, nloop3 != 0, nloop4 != 0, nloop5 != 0])
|
||||
if n_cols > 0:
|
||||
fig2.legend(loc="upper center", ncol=n_cols)
|
||||
# manager = get_current_fig_manager()
|
||||
# manager.window.showMaximized()
|
||||
|
||||
figure = plt.gcf() # get current figure
|
||||
figure.set_size_inches(20, 10)
|
||||
# when saving, specify the DPI
|
||||
# tight_layout()
|
||||
plt.savefig(Folder+"/"+File_pat+".png", dpi=300)
|
||||
|
||||
# Remove the white space around the plot -- only works on Unix (ImageMagick command)
|
||||
os.system(f'mogrify -trim {Folder}/{File_pat}.png')
|
||||
|
||||
show()
|
@ -1,17 +0,0 @@
|
||||
#!/usr/bin/env modbuild
|
||||
|
||||
pbuild::set_download_url "https://github.com/slsdetectorgroup/$P/archive/refs/tags/${V_PKG}.tar.gz"
|
||||
|
||||
pbuild::add_to_group 'DetectorSoftware'
|
||||
pbuild::add_configure_args '-DSLS_USE_SIMULATOR=ON'
|
||||
pbuild::add_configure_args '-DSLS_USE_GUI=ON'
|
||||
|
||||
if (( V_MAJOR < 7 )); then
|
||||
pbuild::add_patch 'files/fname-fix.patch'
|
||||
fi
|
||||
|
||||
# Local Variables:
|
||||
# mode: sh
|
||||
# sh-basic-offset: 8
|
||||
# tab-width: 8
|
||||
# End:
|
@ -1,13 +0,0 @@
|
||||
diff --git a/slsSupportLib/CMakeLists.txt b/slsSupportLib/CMakeLists.txt
|
||||
index efa8010..e842b3d 100755
|
||||
--- a/slsSupportLib/CMakeLists.txt
|
||||
+++ b/slsSupportLib/CMakeLists.txt
|
||||
@@ -46,7 +46,7 @@ if(SLS_DEVEL_HEADERS)
|
||||
include/sls/versionAPI.h
|
||||
include/sls/ZmqSocket.h
|
||||
include/sls/bit_utils.h
|
||||
- include/sls/mdf5.h
|
||||
+ include/sls/md5.h
|
||||
include/sls/md5_helper.h
|
||||
)
|
||||
endif()
|
@ -1,5 +0,0 @@
|
||||
slsDetectorPackage/6.1.1 stable cmake/3.15.5 zeromq/4.3.4
|
||||
slsDetectorPackage/7.0.1_rh7 stable cmake/3.15.5 zeromq/4.3.4 Qt/5.12.10
|
||||
slsDetectorPackage/7.0.1_rh8 stable cmake/3.15.5 zeromq/4.3.4 Qt/5.12.10
|
||||
slsDetectorPackage/7.0.2_rh7 stable cmake/3.15.5 zeromq/4.3.4 Qt/5.12.10
|
||||
slsDetectorPackage/7.0.2_rh8 stable cmake/3.15.5 zeromq/4.3.4 Qt/5.12.10
|
@ -1,3 +0,0 @@
|
||||
slsDetectorPackage/6.1.1:
|
||||
- relstage: unstable
|
||||
build_requires: cmake/3.15.5 zeromq/4.3.4
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user