Compare commits

..

5 Commits

Author SHA1 Message Date
77c558a7be formatting 2023-03-24 12:54:55 +01:00
378fc301b8 updating client version, release version and project_version in CMakeLists.txt 2023-03-23 15:43:17 +01:00
Dhanya Thattil
87d6e16090 7.0.1 fix det server version (#702)
* check server version before initial checks, catch old server version exception, get old server version as 64 bit and print it along with exception
2023-03-23 15:37:01 +01:00
Dhanya Thattil
2ef021041c rx_arping sigchld (#701)
* rx_arping pclose gave -1 due to sigchld being ignored, fixed with sig handler doing a wait
2023-03-23 13:58:40 +01:00
Dhanya Thattil
574127b5ac fix hdf5 compilation using det spec fields in header (#700)
* fix hdf5 compilation using det spec fields in header
2023-03-23 12:30:38 +01:00
814 changed files with 93349 additions and 258223 deletions

View File

@@ -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

View File

@@ -1,33 +0,0 @@
name: Build on local RHEL8
on:
push:
branches:
- developer
workflow_dispatch:
permissions:
contents: read
jobs:
build:
runs-on: "detectors-software-RH8"
steps:
- uses: actions/checkout@v4
- name: Build library
run: |
source /home/gitea_runner/.bashrc
conda activate det
mkdir build && cd build
conda activate det
cmake .. -DSLS_USE_PYTHON=ON
make -j 2
cd ../pyctbgui
make
- name: Deploy to NFS update server
if: gitea.ref == 'refs/heads/developer'
run: |
sftp -r gitea_runner@mpc2935:/slsDetectorSoftware/RH8 <<< $'put build/bin'
sftp -r gitea_runner@mpc2935:/slsDetectorSoftware/RH8 <<< $'put pyctbgui'

View File

@@ -1,29 +0,0 @@
name: Build on RHEL8
on:
push:
workflow_dispatch:
permissions:
contents: read
jobs:
build:
runs-on: "ubuntu-latest"
container:
image: gitea.psi.ch/detectors/rhel8-detectors-dev
steps:
- name: Clone repository
run: |
echo Cloning ${{ github.ref_name }}
git clone https://${{secrets.GITHUB_TOKEN}}@gitea.psi.ch/${{ github.repository }}.git --branch=${{ github.ref_name }} .
- name: Build library
run: |
mkdir build && cd build
cmake .. -DSLS_USE_PYTHON=ON -DSLS_USE_TESTS=ON -DSLS_USE_SIMULATOR=ON
make -j 2
- name: C++ unit tests
working-directory: ${{gitea.workspace}}/build
run: ctest -j1 --rerun-failed --output-on-failure

View File

@@ -1,30 +0,0 @@
name: Build on local RHEL9
on:
push:
branches:
- developer
workflow_dispatch:
permissions:
contents: read
jobs:
build:
runs-on: "detectors-software-RH9"
steps:
- uses: actions/checkout@v4
- name: Build library
run: |
mkdir build && cd build
cmake -DSLS_USE_PYTHON=ON -DPython_EXECUTABLE=/usr/bin/python3.13 -DPython_INCLUDE_DIR=/usr/include/python3.13 -DPython_LIBRARY=/usr/lib64/libpython3.13.so ..
make -j 2
cd ../pyctbgui
make
- name: Deploy to NFS update server
if: gitea.ref == 'refs/heads/developer'
run: |
sftp -r gitea_runner@mpc2935:/slsDetectorSoftware/RH9 <<< $'put build/bin'
sftp -r gitea_runner@mpc2935:/slsDetectorSoftware/RH9 <<< $'put pyctbgui'

View File

@@ -1,27 +0,0 @@
name: Build on RHEL9
on:
push:
workflow_dispatch:
permissions:
contents: read
jobs:
build:
runs-on: "ubuntu-latest"
container:
image: gitea.psi.ch/detectors/rhel9-detectors-dev
steps:
- uses: actions/checkout@v4
- name: Build library
run: |
mkdir build && cd build
cmake .. -DSLS_USE_PYTHON=ON -DSLS_USE_TESTS=ON -DSLS_USE_SIMULATOR=ON
make -j 2
- name: C++ unit tests
working-directory: ${{gitea.workspace}}/build
run: ctest -j1 --rerun-failed --output-on-failure

View File

@@ -1,64 +0,0 @@
name: Build wheel
on:
workflow_dispatch:
pull_request:
push:
branches:
- main
release:
types:
- published
jobs:
build_wheels:
name: Build wheels on ${{ matrix.os }}
runs-on: ${{ matrix.os }}
strategy:
matrix:
os: [ubuntu-latest,]
steps:
- uses: actions/checkout@v4
- name: Build wheels
run: pipx run cibuildwheel==3.2.1
- uses: actions/upload-artifact@v4
with:
name: cibw-wheels-${{ matrix.os }}-${{ strategy.job-index }}
path: ./wheelhouse/*.whl
build_sdist:
name: Build source distribution
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Build sdist
run: pipx run build --sdist
- uses: actions/upload-artifact@v4
with:
name: cibw-sdist
path: dist/*.tar.gz
upload_pypi:
needs: [build_wheels, build_sdist]
runs-on: ubuntu-latest
environment: pypi
permissions:
id-token: write
if: github.event_name == 'release' && github.event.action == 'published'
# or, alternatively, upload to PyPI on every tag starting with 'v' (remove on: release above to use this)
# if: github.event_name == 'push' && startsWith(github.ref, 'refs/tags/v')
steps:
- uses: actions/download-artifact@v4
with:
# unpacks all CIBW artifacts into dist/
pattern: cibw-*
path: dist
merge-multiple: true
- uses: pypa/gh-action-pypi-publish@release/v1

View File

@@ -1,47 +0,0 @@
name: Native CMake Build
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@v4
- uses: actions/setup-python@v5
with:
python-version: 3.12
cache: 'pip'
- run: pip install pytest numpy colorama
- uses: awalsh128/cache-apt-pkgs-action@latest
with:
packages: libhdf5-dev qtbase5-dev qt5-qmake libqt5svg5-dev libpng-dev libtiff-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 -j4 --config ${{env.BUILD_TYPE}}
- name: C++ unit tests
working-directory: ${{github.workspace}}/build
run: ctest -C ${{env.BUILD_TYPE}} -j1 --rerun-failed --output-on-failure
- name: Python unit tests
working-directory: ${{github.workspace}}/build/bin
run: |
python -m pytest ${{github.workspace}}/python/tests

View File

@@ -1,47 +0,0 @@
name: Build and deploy slsdetlib
on:
release:
types:
- published
jobs:
build:
strategy:
fail-fast: false
matrix:
platform: [ubuntu-latest, ] # macos-12, windows-2019]
python-version: ["3.12",]
runs-on: ${{ matrix.platform }}
# The setup-miniconda action needs this to activate miniconda
defaults:
run:
shell: "bash -l {0}"
steps:
- uses: actions/checkout@v4
- name: Get conda
uses: conda-incubator/setup-miniconda@v3.0.4
with:
python-version: ${{ matrix.python-version }}
channels: conda-forge
- name: Prepare
run: conda install conda-build conda-verify pytest anaconda-client
- name: Enable upload
run: conda config --set anaconda_upload yes
- name: Build
env:
CONDA_TOKEN: ${{ secrets.CONDA_TOKEN }}
run: conda build conda-recipes/main-library --user slsdetectorgroup --token ${CONDA_TOKEN} --output-folder build_output
- name: Upload all Conda to github as artifacts
uses: actions/upload-artifact@v4
with:
name: conda-packages
path: build_output/** # Uploads all packages

View File

@@ -1,47 +0,0 @@
name: deploy slsdet
on:
release:
types:
- published
jobs:
build:
strategy:
fail-fast: false
matrix:
platform: [ubuntu-latest, ] # macos-12, windows-2019]
python-version: ["3.12",]
runs-on: ${{ matrix.platform }}
# The setup-miniconda action needs this to activate miniconda
defaults:
run:
shell: "bash -l {0}"
steps:
- uses: actions/checkout@v4
- name: Get conda
uses: conda-incubator/setup-miniconda@v3.0.4
with:
python-version: ${{ matrix.python-version }}
channels: conda-forge
- name: Prepare
run: conda install conda-build conda-verify pytest anaconda-client
- name: Enable upload
run: conda config --set anaconda_upload yes
- name: Build
env:
CONDA_TOKEN: ${{ secrets.CONDA_TOKEN }}
run: conda build conda-recipes/python-client --user slsdetectorgroup --token ${CONDA_TOKEN} --output-folder build_output
- name: Upload all Conda packages
uses: actions/upload-artifact@v4
with:
name: conda-packages
path: build_output/** # Uploads all packages

View File

@@ -1,42 +0,0 @@
name: Build slsdetlib
on: [pull_request]
jobs:
build:
strategy:
fail-fast: false
matrix:
platform: [ubuntu-latest, ] # macos-12, windows-2019]
python-version: ["3.12",]
runs-on: ${{ matrix.platform }}
# The setup-miniconda action needs this to activate miniconda
defaults:
run:
shell: "bash -l {0}"
steps:
- uses: actions/checkout@v4
- name: Get conda
uses: conda-incubator/setup-miniconda@v3.0.4
with:
python-version: ${{ matrix.python-version }}
channels: conda-forge
- name: Prepare
run: conda install conda-build conda-verify pytest anaconda-client
- name: Disable upload
run: conda config --set anaconda_upload no
- name: Build
run: conda build conda-recipes/main-library --output-folder build_output
- name: Upload all Conda packages
uses: actions/upload-artifact@v4
with:
name: conda-packages
path: build_output/** # Uploads all packages

View File

@@ -1,42 +0,0 @@
name: slsdet
on: [pull_request]
jobs:
build:
strategy:
fail-fast: false
matrix:
platform: [ubuntu-latest, ] # macos-12, windows-2019]
python-version: ["3.12",]
runs-on: ${{ matrix.platform }}
# The setup-miniconda action needs this to activate miniconda
defaults:
run:
shell: "bash -l {0}"
steps:
- uses: actions/checkout@v4
- name: Get conda
uses: conda-incubator/setup-miniconda@v3.0.4
with:
python-version: ${{ matrix.python-version }}
channels: conda-forge
- name: Prepare
run: conda install conda-build conda-verify pytest anaconda-client
- name: Disable upload
run: conda config --set anaconda_upload no
- name: Build
run: conda build conda-recipes/python-client --output-folder build_output
- name: Upload all Conda packages
uses: actions/upload-artifact@v4
with:
name: conda-packages
path: build_output/** # Uploads all packages

2
.gitignore vendored
View File

@@ -9,7 +9,7 @@ bin/
*.o
*.so
.*
build/
build
RELEASE.txt
Testing/

View File

@@ -1,170 +1,15 @@
# SPDX-License-Identifier: LGPL-3.0-or-other
# Copyright (C) 2021 Contributors to the SLS Detector Package
cmake_minimum_required(VERSION 3.15)
cmake_minimum_required(VERSION 3.12)
project(slsDetectorPackage)
# Read VERSION file into project version
set(VERSION_FILE "${CMAKE_CURRENT_SOURCE_DIR}/VERSION")
file(READ "${VERSION_FILE}" VERSION_CONTENT)
string(STRIP "${VERSION_CONTENT}" PROJECT_VERSION_STRING)
set(PROJECT_VERSION ${PROJECT_VERSION_STRING})
# Pass it to the compiler
add_compile_definitions(SLS_DET_VERSION="${PROJECT_VERSION}")
set(PROJECT_VERSION 7.0.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)
include(cmake/helpers.cmake)
find_package(Threads REQUIRED)
# POSIX threads are required for the moment but we use CMake to find them
# Once migrated to std::thread this can be removed
if(NOT CMAKE_USE_PTHREADS_INIT)
message(FATAL_ERROR "A POSIX threads (pthread) implementation is required, but was not found.")
endif()
option(SLS_USE_SYSTEM_ZMQ "Use system installed libzmq" OFF)
# 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)
# Allow FetchContent_Populate to be called with a single argument
# otherwise deprecated warning is issued
# Note: From cmake 3.28 we can pass EXCLUDE_FROM_ALL to FetchContent_Declare
# and avoid direct use of Populate
if (${CMAKE_VERSION} VERSION_GREATER_EQUAL "3.30")
cmake_policy(SET CMP0169 OLD)
endif()
# Patch libzmq to set minimum cmake version to 3.15 to avoid warnings
# with newer cmake versions
# Patch is applied in the FetchContent_Declare
set(SLS_LIBZMQ_VERSION "4.3.4")
find_program(PATCH_EXECUTABLE patch)
if(NOT PATCH_EXECUTABLE)
message(FATAL_ERROR "The 'patch' tool is required for patching lib zeromq. Please install it.")
endif()
if(SLS_USE_SYSTEM_ZMQ)
# find_package(ZeroMQ REQUIRED)
# 1) Try a CMake package config if available (vcpkg, Homebrew, source builds)
# Many installs export either ZeroMQ::libzmq or libzmq.
find_package(ZeroMQ QUIET CONFIG)
set(ZEROMQ_TARGET "")
if (TARGET ZeroMQ::libzmq)
set(ZEROMQ_TARGET ZeroMQ::libzmq)
message(STATUS "Found target: ${ZEROMQ_TARGET} version: ${ZeroMQ_VERSION}")
elseif (TARGET libzmq)
set(ZEROMQ_TARGET libzmq)
message(STATUS "Found target: ${ZEROMQ_TARGET} version: ${ZeroMQ_VERSION}")
elseif (TARGET ZeroMQ::ZeroMQ) # rare older naming
set(ZEROMQ_TARGET ZeroMQ::ZeroMQ)
message(STATUS "Found target: ${ZEROMQ_TARGET} version: ${ZeroMQ_VERSION}")
endif()
# 2) Fallback: use pkg-config hints + manual find_* to create an imported target
if (NOT ZEROMQ_TARGET)
find_package(PkgConfig QUIET)
if (PkgConfig_FOUND)
pkg_check_modules(PC_ZeroMQ QUIET libzmq)
endif()
find_path(ZEROMQ_INCLUDE_DIR
NAMES zmq.h
HINTS ${PC_ZeroMQ_INCLUDE_DIRS}
)
find_library(ZEROMQ_LIBRARY
NAMES zmq libzmq
HINTS ${PC_ZeroMQ_LIBRARY_DIRS}
)
if (ZEROMQ_INCLUDE_DIR AND ZEROMQ_LIBRARY)
add_library(libzmq UNKNOWN IMPORTED)
set_target_properties(libzmq PROPERTIES
IMPORTED_LOCATION "${ZEROMQ_LIBRARY}"
INTERFACE_INCLUDE_DIRECTORIES "${ZEROMQ_INCLUDE_DIR}"
)
set(ZEROMQ_TARGET libzmq)
endif()
message(STATUS "ZeroMQ version (pkg-config): ${PC_ZeroMQ_VERSION}")
endif()
# 3) Error out if still not found, with a helpful message
if (NOT ZEROMQ_TARGET)
message(FATAL_ERROR "ZeroMQ (libzmq) not found. Please install ZeroMQ development files.")
endif()
# Use it
# target_link_libraries(your_target PRIVATE ${ZEROMQ_TARGET})
message(STATUS "Using system installed libzmq: ${ZeroMQ_LIBRARIES}")
message(STATUS "ZeroMQ target: ${ZEROMQ_TARGET}")
message(STATUS "ZeroMQ include dirs: ${ZeroMQ_INCLUDE_DIRS}")
else()
if(SLS_FETCH_ZMQ_FROM_GITHUB)
# Opt in to pull down a zmq version from github instead of
# using the bundled version
FetchContent_Declare(
libzmq
GIT_REPOSITORY https://github.com/zeromq/libzmq.git
GIT_TAG v${SLS_LIBZMQ_VERSION}
PATCH_COMMAND ${CMAKE_COMMAND} -E chdir <SOURCE_DIR> patch -p1 < ${CMAKE_CURRENT_SOURCE_DIR}/libs/libzmq/libzmq_cmake_version.patch
UPDATE_DISCONNECTED 1
)
else()
# Standard behaviour use libzmq included in this repo (libs/libzmq)
FetchContent_Declare(
libzmq
URL ${CMAKE_CURRENT_SOURCE_DIR}/libs/libzmq/libzmq-${SLS_LIBZMQ_VERSION}.tar.gz
URL_HASH MD5=cc20b769ac10afa352e5ed2769bb23b3
PATCH_COMMAND ${CMAKE_COMMAND} -E chdir <SOURCE_DIR> patch -p1 < ${CMAKE_CURRENT_SOURCE_DIR}/libs/libzmq/libzmq_cmake_version.patch
UPDATE_DISCONNECTED 1
)
endif()
# 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 "")
set(ENABLE_PRECOMPILED OFF CACHE BOOL "")
set(WITH_DOC OFF CACHE BOOL "")
set(WITH_DOCS OFF CACHE BOOL "")
# Using GetProperties and Populate to be able to exclude zmq
# 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()
endif()
include(cmake/SlsFindZeroMQ.cmake)
include(GNUInstallDirs)
# If conda build, always set lib dir to 'lib'
@@ -192,7 +37,7 @@ endif()
option(SLS_USE_HDF5 "HDF5 File format" OFF)
option(SLS_BUILD_SHARED_LIBRARIES "Build shared libaries" OFF)
option(SLS_BUILD_SHARED_LIBRARIES "Build shared libaries" ON)
option(SLS_USE_TEXTCLIENT "Text Client" ON)
option(SLS_USE_DETECTOR "Detector libs" ON)
option(SLS_USE_RECEIVER "Receiver" ON)
@@ -210,7 +55,6 @@ 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)
@@ -224,18 +68,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)
@@ -256,6 +88,7 @@ set(SLS_INTERNAL_QWT_DIR ${CMAKE_CURRENT_SOURCE_DIR}/libs/qwt-6.1.5)
set(ClangFormat_EXCLUDE_PATTERNS "build/"
"libs/"
"slsDetectorCalibration/"
"ctbGui/"
"manual/"
"python/"
"sample/"
@@ -264,9 +97,11 @@ find_package(ClangFormat)
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
default_build_type("Release")
set_std_fs_lib()
message(STATUS "Extra linking to fs lib:${STD_FS_LIB}")
if (NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)
message(STATUS "No build type selected, default to Release")
set(CMAKE_BUILD_TYPE "Release" CACHE STRING "Build type (default Release)" FORCE)
endif()
#Enable LTO if available
include(CheckIPOSupported)
@@ -289,7 +124,7 @@ endif()
# to control options for the libraries
if(NOT TARGET slsProjectOptions)
add_library(slsProjectOptions INTERFACE)
target_compile_features(slsProjectOptions INTERFACE cxx_std_17)
target_compile_features(slsProjectOptions INTERFACE cxx_std_11)
endif()
if (NOT TARGET slsProjectWarnings)
@@ -337,24 +172,18 @@ if (NOT TARGET slsProjectCSettings)
-Wredundant-decls
-Wdouble-promotion
-Werror=return-type
-Wno-format-overflow
-Wno-format-truncation
)
sls_disable_c_warning("-Wstringop-truncation")
target_link_libraries(slsProjectCSettings INTERFACE
Threads::Threads
)
endif()
if(SLS_USE_SANITIZER)
target_compile_options(slsProjectOptions INTERFACE -fsanitize=address,undefined -fno-omit-frame-pointer)
target_link_libraries(slsProjectOptions INTERFACE -fsanitize=address,undefined)
#target_compile_options(slsProjectOptions INTERFACE -fsanitize=thread -fno-omit-frame-pointer)
#target_link_libraries(slsProjectOptions INTERFACE -fsanitize=thread)
# target_compile_options(slsProjectOptions INTERFACE -fsanitize=thread)
# target_link_libraries(slsProjectOptions INTERFACE -fsanitize=thread)
endif()
if(SLS_TUNE_LOCAL)
target_compile_options(slsProjectOptions INTERFACE -mtune=native -march=native)
endif()
@@ -373,6 +202,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)
@@ -405,41 +238,18 @@ if (SLS_USE_INTEGRATION_TESTS)
endif (SLS_USE_INTEGRATION_TESTS)
if (SLS_USE_PYTHON)
find_package (Python 3.8 COMPONENTS Interpreter Development.Module REQUIRED)
set(PYBIND11_FINDPYTHON ON) # Needed for RH8
if(SLS_FETCH_PYBIND11_FROM_GITHUB)
FetchContent_Declare(
pybind11
GIT_REPOSITORY https://github.com/pybind/pybind11
GIT_TAG v2.13.6
)
else()
# https://github.com/pybind/pybind11/releases
FetchContent_Declare(
pybind11
URL ${CMAKE_CURRENT_SOURCE_DIR}/libs/pybind11/v2.13.6.tar.gz
URL_HASH MD5=a04dead9c83edae6d84e2e343da7feeb
)
endif()
FetchContent_MakeAvailable(pybind11)
find_package (Python 3.6 COMPONENTS Interpreter Development)
add_subdirectory(libs/pybind ${CMAKE_BINARY_DIR}/bin/)
add_subdirectory(python)
endif(SLS_USE_PYTHON)
if (SLS_USE_CTBGUI)
add_subdirectory(pyctbgui)
add_subdirectory(ctbGui)
endif(SLS_USE_CTBGUI)
# Workaround for file note being copied to build directory
# when issuing a python -m build
# TODO! Proper fix
if(EXISTS ".clang-tidy")
configure_file(.clang-tidy
${CMAKE_BINARY_DIR}/.clang-tidy
)
endif()
configure_file( .clang-tidy
${CMAKE_BINARY_DIR}/.clang-tidy
)
if (SLS_BUILD_EXAMPLES)
add_subdirectory(sample)
@@ -454,13 +264,8 @@ 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)
include(cmake/package_config.cmake)
endif()
endif()

156
README.md
View File

@@ -1,33 +1,20 @@
## Dependencies
Before building from source make sure that you have the [dependencies](https://slsdetectorgroup.github.io/devdoc/dependencies.html) installed. If installing using conda, conda will manage the dependencies. Avoid also installing dependency packages with pip.
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.
## Documentaion
Detailed documentation including installation can be found in the [software wiki](https://slsdetectorgroup.github.io/devdoc/index.html).
List of releases can be found on the [official site](https://www.psi.ch/en/lxn/software-releases).
Firmware compatiblity can be found in [firmware page](https://github.com/slsdetectorgroup/slsDetectorFirmware)
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).
## Installation
The slsDetectorPackage provides core detector software implemented in C++, along with Python bindings packaged as the slsdet Python extension module. Choose the option that best fits your environment and use case.
1. **Install pre-built binaries using conda (Recommended)**: Install pre-built binaries for the C++ client, receiver, GUI and the Python API (`slsdet`), simplifying setup across platforms.
2. **Pip**: Install only the Python extension module, either by downloading the pre-built library from PyPI or by building the extension locally from source. Available only from v9.2.0 onwards.
3. **Build from source**: Compile the entire package yourself, including both the C++ core and the Python bindings, for maximum control and customization. However, make sure that you have the dependencies installed. If installing using conda, conda will manage the dependencies. Avoid installing packages with pip and conda simultaneously.
### 1. Install pre-built binaries using conda (Recommended)
### 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
* **slsdetlib** shared libraries and command line utilities
* **slsdetgui** GUI
* **slsdet** Python bindings
* **moenchzmq** Moench
```
#Add channels for dependencies and our library
@@ -53,38 +40,35 @@ conda search slsdetlib
conda search slsdet
# gui
conda search slsdetgui
# moench
conda search moenchzmq
```
## 2. Pip
The Python extension module `slsdet` can be installed using pip. This is available from v9.2.0 onwards.
### 2. Build from source
```
#Install the Python extension module from PyPI
pip install slsdet
# or install the python extension locally from source
git clone https://github.com/slsdetectorgroup/slsDetectorPackage.git --branch 9.2.0
cd slsDetectorPackage
pip install .
```
## 3. Build from source
### 3.1. Download Source Code from github
##### 2.1 Download Source Code from github
```
git clone https://github.com/slsdetectorgroup/slsDetectorPackage.git --branch 7.0.0
```
> **Note:** For v6.x.x of slsDetectorPackage and older, refer [pybind11 notes on cloning](#Pybind-and-Zeromq).
**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.
```
# 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
```
##### 2.2 Build from source
### 3.2. Build from source
One can either build using cmake or use the in-built cmk.sh script.
### 3.2.1. Build using CMake
###### Build using CMake
```
# outside slsDetecorPackage folder
@@ -110,28 +94,26 @@ Instead of the cmake command, one can use ccmake to get a list of options to con
ccmake ..
# choose the options
# first press [c] - configure (unil you see [g])
# 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 env |
| -DPython_FIND_VIRTUALENV=ONLY | Python from only the conda environment |
| -DZeroMQ_HINT=/usr/lib64 | Use system zmq instead |
| -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 [zeromq notes for cmake option to hint library location](#Pybind-and-Zeromq).
### 3.2.2. Build using in-built cmk.sh script
###### Build using in-built cmk.sh script
```
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]
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
@@ -146,13 +128,14 @@ Usage: $0 [-b] [-c] [-d <HDF5 directory>] [-e] [-g] [-h] [-i]
-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
# display all options
./cmk.sh -?
@@ -162,16 +145,13 @@ Usage: $0 [-b] [-c] [-d <HDF5 directory>] [-e] [-g] [-h] [-i]
# 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
#To use the system zmq (/usr/lib64) instead
./cmk.sh -cbj5 -q /usr/lib64
```
> **Note:** For v7.x.x of slsDetectorPackage and older, refer [zeromq notes for cmk script option to hint library location](#Pybind-and-Zeromq).
###### Build on old distributions
### 3.3. Build on old distributions using conda
If your linux distribution doesn't come with a C++17 compiler (gcc>8) then
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
@@ -186,10 +166,7 @@ cmake ../slsDetectorPackage -DCMAKE_PREFIX_PATH=$CONDA_PREFIX
make -j12
```
> **Note:** For v7.x.x of slsDetectorPackage and older, refer [zeromq notes for dependencies for conda](#Pybind-and-Zeromq).
### 3.4. Build slsDetectorGui (Qt5)
###### Build slsDetectorGui (Qt5)
1. Using pre-built binary on conda
```
@@ -203,14 +180,7 @@ yum install qt5-qtbase-devel.x86_64
yum install qt5-qtsvg-devel.x86_64
```
3. Using system installation on RHEL8
```
yum install qt5-qtbase-devel.x86_64
yum install qt5-qtsvg-devel.x86_64
yum install expat-devel.x86_64
```
4. Using conda
3. Using conda
```
#Add channels for dependencies and our library
conda config --add channels conda-forge
@@ -238,15 +208,13 @@ cd slsDetectorPackage
./cmk.sh -cbgj9
```
> **Note:** For v7.x.x of slsDetectorPackage and older, refer [zeromq notes for dependencies for conda](#Pybind-and-Zeromq).
### 3.5. Build documentation from package
###### 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=3.12 sphinx sphinx_rtd_theme breathe doxygen numpy
conda create -n myenv python sphinx_rtd_theme breathe
```
```
@@ -260,48 +228,6 @@ make rst # rst only, saves time in case the API did not change
```
## 4. Pybind and Zeromq
### Pybind11 for Python
**v8.0.0+**:
pybind11 is built
* by default from tar file in repo (libs/pybind/v2.1x.0.tar.gz)
* or use advanced option SLS_FETCH_PYBIND11_FROM_GITHUB [link].
* v9.0.0+: pybind11 (v2.13.6)
* v8.x.x : pybind11 (v2.11.0)
**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.
```
# 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
**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].
**v7.x.x and older**:
zeromq-devel 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
## Support
dhanya.thattil@psi.ch
erik.frojdh@psi.ch
alice.mazzoleni@psi.ch

View File

@@ -1,63 +1,76 @@
SLS Detector Package Major Release x.x.x released on xx.xx.202x
SLS Detector Package Major Release 7.0.1 released on 24.03.2023
===============================================================
This document describes the differences between vx.x.x and v10.0.0
This document describes the differences between v7.0.1 and v7.0.0
CONTENTS
--------
1 New, Changed or Resolved Features
1.1 Compilation
1.2 Callback
1.3 Python
1.4 Client
1.5 Detector Server
1.6 Simulator
1.7 Receiver
1.8 Gui
2 On-board Detector Server Compatibility
3 Firmware Requirements
4 Kernel Requirements
5 Download, Documentation & Support
1 Resolved Issues
2 On-board Detector Server Compatibility
3 Firmware Requirements
4 Kernel Requirements
5 Download, Documentation & Support
1 New, Changed or Resolved Features
=====================================
Building shared libraries is disabled by default. If you need to link
against any of the libSls*.so libraries, you can enable this by passing
-DSLS_BUILD_SHARED_LIBRARIES=ON to CMake.
Added SLS_USE_SYSTEM_ZMQ option (default OFF) to use the libzmq of the host
instead of the one included in our repo.
1 Resolved Issues
=================
Experimental support for building the detector client (including python bindings) on macOS
``rx_dbitlist`` keeps the order of the passed bit list
Receiver
--------
* HDF5 Compilation
Compilation issues from 7.0.0 fixed.
* Arping error
Cmdline: rx_arping
API: setRxArping/ getRxArping
Even if arping was successful, it gave an error. Fixed.
Client
------
* Detector Server Version from previous Releases
Hostname command would hang with 7.0.0 client if the detector server
was from a previous release (eg. 6.1.2). In this case, the user cannot
get the detector server version.
Fixed that the hostname command will throw an exception about
incompatible server with its version in the message. Now, the user can
get the version number without having to telnet or ssh to the detector.
With this info, one can then update to matching client for that server
and start the detector updation process.
2 On-board Detector Server Compatibility
==========================================
Eiger 10.0.0
Jungfrau 10.0.0
Mythen3 10.0.0
Gotthard2 10.0.0
Moench 10.0.0
Eiger 7.0.0
Jungfrau 7.0.0
Mythen3 7.0.0
Gotthard2 7.0.0
Gotthard 7.0.0
Moench 7.0.0
Ctb 7.0.0
On-board Detector Server Upgrade
--------------------------------
From v6.1.0 (without tftp):
update only on-board detector server
Using command 'updatedetectorserver'
udpate both on-board detector server and firmware simultaneously
Using command 'update'
Using command 'updatedetectorserver'
From 5.0.0 (with tftp):
Using command 'copydetectorserver'
Instructions available at
https://slsdetectorgroup.github.io/devdoc/serverupgrade.html
@@ -68,16 +81,22 @@ Experimental support for building the detector client (including python bindings
3 Firmware Requirements
========================
Eiger 02.10.2023 (v32) (updated in 7.0.3)
Eiger 20.02.2023 (v31)
Jungfrau 09.02.2025 (v1.6, HW v1.0) (updated in 9.1.0)
08.02.2025 (v2.6, HW v2.0) (updated in 9.1.0)
Jungfrau 04.11.2022 (v1.4, HW v1.0)
03.11.2022 (v2.4, HW v2.0)
Mythen3 13.11.2024 (v2.0) (updated in 9.0.0)
Mythen3 24.01.2023 (v1.4)
Gotthard2 03.10.2024 (v1.0) (updated in 9.0.0)
Gotthard2 23.11.2022 (v0.3)
Moench 26.10.2023 (v2.0) (updated in 8.0.2)
Gotthard 08.02.2018 (50um and 25um Master)
09.02.2018 (25 um Slave)
Moench 05.12.2022 (v0.3)
Ctb 05.12.2022 (v1.1)
Detector Upgrade
@@ -90,12 +109,15 @@ Experimental support for building the detector client (including python bindings
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 on-board detector server and firmware simultaneously
udpate both server and firmware simultaneously
Using command 'update'
@@ -108,7 +130,6 @@ Experimental support for building the detector client (including python bindings
4 Kernel Requirements
======================
Blackfin
--------
Latest version: Fri Oct 29 00:00:00 2021
@@ -116,12 +137,10 @@ Experimental support for building the detector client (including python bindings
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
@@ -153,7 +172,7 @@ Experimental support for building the detector client (including python bindings
Quick Start Guide:
https://slsdetectorgroup.github.io/devdoc/quick_start_guide.html
Firmware Upgrade:
https://slsdetectorgroup.github.io/devdoc/firmware.html
@@ -166,15 +185,6 @@ Experimental support for building the detector client (including python bindings
Consuming slsDetectorPackage:
https://slsdetectorgroup.github.io/devdoc/consuming.html
Software Architecture
https://slsdetectorgroup.github.io/devdoc/softwarearchitecture.html
Set up commands in config file
https://slsdetectorgroup.github.io/devdoc/configcommands.html
Image Size and Output Characteristics
https://slsdetectorgroup.github.io/devdoc/dataformat.html
API Examples:
https://github.com/slsdetectorgroup/api-examples
@@ -201,14 +211,6 @@ Experimental support for building the detector client (including python bindings
https://slsdetectorgroup.github.io/devdoc/udpheader.html
https://slsdetectorgroup.github.io/devdoc/udpdetspec.html
Output Data:
https://slsdetectorgroup.github.io/devdoc/dataformat.html
https://slsdetectorgroup.github.io/devdoc/fileformat.html
https://slsdetectorgroup.github.io/devdoc/slsreceiverheaderformat.html
https://slsdetectorgroup.github.io/devdoc/masterfileattributes.html
https://slsdetectorgroup.github.io/devdoc/binaryfileformat.html
https://slsdetectorgroup.github.io/devdoc/hdf5fileformat.html
slsReceiver Zmq Format:
https://slsdetectorgroup.github.io/devdoc/slsreceiver.html#zmq-json-header-format
@@ -228,4 +230,4 @@ Experimental support for building the detector client (including python bindings
dhanya.thattil@psi.ch
erik.frojdh@psi.ch
alice.mazzoleni@psi.ch

View File

@@ -1 +0,0 @@
0.0.0

View File

@@ -1 +0,0 @@
slsDetectorSoftware/generator/autocomplete/bash_autocomplete.sh

View File

@@ -25,9 +25,7 @@ mark_as_advanced(
ClangFormat_BIN)
if(ClangFormat_FOUND)
execute_process(COMMAND ${ClangFormat_BIN} --version
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
OUTPUT_VARIABLE CLANG_VERSION_TEXT)
exec_program(${ClangFormat_BIN} ${CMAKE_CURRENT_SOURCE_DIR} ARGS --version OUTPUT_VARIABLE CLANG_VERSION_TEXT)
string(REGEX MATCH "([0-9]+)\\.[0-9]+\\.[0-9]+" CLANG_VERSION ${CLANG_VERSION_TEXT})
if((${CLANG_VERSION} GREATER "9") OR (${CLANG_VERSION} EQUAL "9"))
# A CMake script to find all source files and setup clang-format targets for them

38
cmake/SlsFindZeroMQ.cmake Normal file
View 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()

View File

@@ -1,46 +0,0 @@
function(default_build_type val)
if (NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)
message(STATUS "No build type selected, default to Release")
set(CMAKE_BUILD_TYPE ${val} CACHE STRING "Build type (default ${val})" FORCE)
endif()
endfunction()
function(set_std_fs_lib)
# from pybind11
# Check if we need to add -lstdc++fs or -lc++fs or nothing
if(DEFINED CMAKE_CXX_STANDARD AND CMAKE_CXX_STANDARD LESS 17)
set(STD_FS_NO_LIB_NEEDED TRUE)
elseif(MSVC)
set(STD_FS_NO_LIB_NEEDED TRUE)
else()
file(
WRITE ${CMAKE_CURRENT_BINARY_DIR}/main.cpp
"#include <filesystem>\nint main(int argc, char ** argv) {\n std::filesystem::path p(argv[0]);\n return p.string().length();\n}"
)
try_compile(
STD_FS_NO_LIB_NEEDED ${CMAKE_CURRENT_BINARY_DIR}
SOURCES ${CMAKE_CURRENT_BINARY_DIR}/main.cpp
COMPILE_DEFINITIONS -std=c++17)
try_compile(
STD_FS_NEEDS_STDCXXFS ${CMAKE_CURRENT_BINARY_DIR}
SOURCES ${CMAKE_CURRENT_BINARY_DIR}/main.cpp
COMPILE_DEFINITIONS -std=c++17
LINK_LIBRARIES stdc++fs)
try_compile(
STD_FS_NEEDS_CXXFS ${CMAKE_CURRENT_BINARY_DIR}
SOURCES ${CMAKE_CURRENT_BINARY_DIR}/main.cpp
COMPILE_DEFINITIONS -std=c++17
LINK_LIBRARIES c++fs)
endif()
if(${STD_FS_NEEDS_STDCXXFS})
set(STD_FS_LIB stdc++fs PARENT_SCOPE)
elseif(${STD_FS_NEEDS_CXXFS})
set(STD_FS_LIB c++fs PARENT_SCOPE)
elseif(${STD_FS_NO_LIB_NEEDED})
set(STD_FS_LIB "" PARENT_SCOPE)
else()
message(WARNING "Unknown C++17 compiler - not passing -lstdc++fs")
set(STD_FS_LIB "")
endif()
endfunction()

View 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 )

View File

@@ -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(

View File

@@ -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

15
cmk.sh
View File

@@ -18,6 +18,7 @@ CTBGUI=0
MANUALS=0
MANUALS_ONLY_RST=0
MOENCHZMQ=0
ZMQ_HINT_DIR=""
CLEAN=0
@@ -26,7 +27,7 @@ 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 [-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
@@ -41,6 +42,7 @@ Usage: $0 [-b] [-c] [-d <HDF5 directory>] [-e] [-g] [-h] [-i] [-j <Number of thr
-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
@@ -138,6 +140,10 @@ while getopts ":bcd:eghij:k:l:mnpq:rstuz" opt ; do
PYTHON=1
REBUILD=1
;;
q)
echo "Zmq hint directory: $OPTARG"
ZMQ_HINT_DIR=$OPTARG
;;
r)
echo "Compiling Options: Receiver"
RECEIVER=1
@@ -254,6 +260,13 @@ if [ $TESTS -eq 1 ]; then
echo "Tests Option enabled"
fi
#zmq hint dir
if [ -n "$ZMQ_HINT_DIR" ]; then
CMAKE_POST+=" -DZeroMQ_HINT="$ZMQ_HINT_DIR
CMAKE_POST+=" -DZeroMQ_DIR="
# echo "Enabling Zmq Hint Directory: $ZMQ_HINT_DIR"
fi
#hdf5 rebuild
if [ $HDF5 -eq 1 ]; then
# CMAKE_PRE+="HDF5_ROOT="$HDF5DIR

View File

@@ -1,14 +1,10 @@
# SPDX-License-Identifier: LGPL-3.0-or-other
# Copyright (C) 2021 Contributors to the SLS Detector Package
if [ ! -d "build" ]; then
mkdir build
fi
if [ ! -d "install" ]; then
mkdir install
fi
mkdir build
mkdir install
cd build
cmake .. -G Ninja \
cmake .. \
-DCMAKE_PREFIX_PATH=$CONDA_PREFIX \
-DCMAKE_INSTALL_PREFIX=install \
-DSLS_USE_TEXTCLIENT=ON \
@@ -18,8 +14,7 @@ cmake .. -G Ninja \
-DSLS_USE_TESTS=ON \
-DSLS_USE_PYTHON=OFF \
-DCMAKE_BUILD_TYPE=Release \
-DSLS_USE_HDF5=OFF \
-DSLS_USE_SYSTEM_ZMQ=ON \
-DSLS_USE_HDF5=OFF\
NCORES=$(getconf _NPROCESSORS_ONLN)
echo "Building using: ${NCORES} cores"

6
conda-recepie/build_pylib.sh Executable file
View File

@@ -0,0 +1,6 @@
# SPDX-License-Identifier: LGPL-3.0-or-other
# Copyright (C) 2021 Contributors to the SLS Detector Package
echo "|<-------- starting python build"
cd python
${PYTHON} setup.py install

View File

@@ -0,0 +1,8 @@
python:
- 3.8
- 3.9
- 3.10
- 3.11
numpy:
- 1.17

View File

@@ -0,0 +1,11 @@
# 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/.

View File

@@ -4,20 +4,18 @@
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_acquire_zmq $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/sls_detector $PREFIX/bin/.
cp build/install/bin/slsReceiver $PREFIX/bin/.
cp build/install/bin/slsMultiReceiver $PREFIX/bin/.
cp build/install/bin/slsFrameSynchronizer $PREFIX/bin/.
cp build/install/include/sls/* $PREFIX/include/sls

131
conda-recepie/meta.yaml Executable file
View File

@@ -0,0 +1,131 @@
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.*
- 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
- zeromq
- xorg-libx11
- xorg-libice
- xorg-libxext
- xorg-libsm
- xorg-libxau
- xorg-libxrender
- xorg-libxfixes
- expat
run:
- zeromq
- libstdcxx-ng
- libgcc-ng
outputs:
- name: slsdetlib
script: copy_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_pylib.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) }}
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

3
conda-recepie/run_test.sh Executable file
View File

@@ -0,0 +1,3 @@
# SPDX-License-Identifier: LGPL-3.0-or-other
# Copyright (C) 2021 Contributors to the SLS Detector Package
ctest -j2

View File

@@ -1,13 +0,0 @@
c_compiler:
- gcc # [linux]
c_stdlib:
- sysroot # [linux]
cxx_compiler:
- gxx # [linux]
c_stdlib_version: # [linux]
- 2.17 # [linux]

View File

@@ -1,80 +0,0 @@
source:
path: ../..
{% set version = load_file_regex(load_file = 'VERSION', regex_pattern = '(\d+(?:\.\d+)*(?:[\+\w\.]+))').group(1) %}
package:
name: sls_detector_software
version: {{ version }}
build:
number: 0
binary_relocation: True
rpaths:
- lib/
requirements:
build:
- {{ compiler('c') }}
- {{ stdlib("c") }}
- {{ compiler('cxx') }}
- git
- cmake
- ninja
- qt 5.*
host:
- libstdcxx-ng
- libgcc-ng
- libgl-devel # [linux]
- libtiff
- zlib
- expat
- zeromq
run:
- libstdcxx-ng
- libgcc-ng
outputs:
- name: slsdetlib
script: copy_lib.sh
requirements:
build:
- {{ compiler('c') }}
- {{ stdlib("c") }}
- {{ compiler('cxx') }}
run:
- libstdcxx-ng
- libgcc-ng
- name: slsdetgui
script: copy_gui.sh
requirements:
build:
- {{ compiler('c') }}
- {{compiler('cxx')}}
- {{ pin_subpackage('slsdetlib', exact=True) }}
run:
- {{ pin_subpackage('slsdetlib', exact=True) }}
- qt 5.*
- name: moenchzmq
script: copy_moench.sh
requirements:
build:
- {{ compiler('c') }}
- {{compiler('cxx')}}
- {{ pin_subpackage('slsdetlib', exact=True) }}
run:
- {{ pin_subpackage('slsdetlib', exact=True) }}

View File

@@ -1,18 +0,0 @@
python:
- 3.11
- 3.12
- 3.13
- 3.14
c_compiler:
- gcc # [linux]
c_stdlib:
- sysroot # [linux]
cxx_compiler:
- gxx # [linux]
c_stdlib_version: # [linux]
- 2.17 # [linux]

View File

@@ -1,45 +0,0 @@
source:
path: ../..
{% set version = load_file_regex(load_file = 'VERSION', regex_pattern = '(\d+(?:\.\d+)*(?:[\+\w\.]+))').group(1) %}
package:
name: slsdet
version: {{ version }}
build:
number: 0
script:
- unset CMAKE_GENERATOR && {{ PYTHON }} -m pip install . -vv --config-settings=cmake.define.SLS_USE_SYSTEM_ZMQ=ON # [not win]
requirements:
build:
- python
- {{ compiler('c') }}
- {{ stdlib("c") }}
- {{ compiler('cxx') }}
host:
- cmake
- ninja
- python
- pip
- scikit-build-core
- pybind11 >=2.13.0
- fmt
- zeromq
- nlohmann_json
- catch2
run:
- python
- numpy
test:
imports:
- slsdet
about:
summary: An example project built with pybind11 and scikit-build.
# license_file: LICENSE

90
ctbGui/CMakeLists.txt Normal file
View File

@@ -0,0 +1,90 @@
# SPDX-License-Identifier: LGPL-3.0-or-other
# Copyright (C) 2021 Contributors to the SLS Detector Package
find_package(ROOT CONFIG REQUIRED COMPONENTS Core Gui)
find_package(TIFF REQUIRED)
target_include_directories(ROOT::Core INTERFACE "${ROOT_INCLUDE_DIRS}")
add_library(ROOT::Flags_CXX IMPORTED INTERFACE)
separate_arguments(ROOT_CXX_FLAGS)
target_compile_options(ROOT::Flags_CXX INTERFACE ${ROOT_CXX_FLAGS})
separate_arguments(ROOT_DEFINITIONS)
target_compile_definitions(ROOT::Flags_CXX INTERFACE ${ROOT_DEFINITIONS})
# This fixes a bug in the linker flags
string(REPLACE "-L " "-L" ROOT_EXE_LINKER_FLAGS "${ROOT_EXE_LINKER_FLAGS}")
separate_arguments(ROOT_EXE_LINKER_FLAGS)
# Stuck into using old property method due to separate -L and -l arguments
# (A full path to -l is better!)
set_property(TARGET ROOT::Flags_CXX PROPERTY
INTERFACE_LINK_LIBRARIES ${ROOT_EXE_LINKER_FLAGS})
set_property(TARGET ROOT::Core PROPERTY
INTERFACE_INCLUDE_DIRECTORIES "${ROOT_INCLUDE_DIRS}")
add_executable(ctbGui
ctbGui.cpp
ctbMain.cpp
ctbDacs.cpp
ctbPowers.cpp
ctbSlowAdcs.cpp
ctbSignals.cpp
ctbAdcs.cpp
ctbPattern.cpp
ctbAcquisition.cpp
${CMAKE_SOURCE_DIR}/slsDetectorCalibration/tiffio/src/tiffIO.cpp
)
#TODO! Replace with target
target_include_directories(ctbGui PRIVATE
${CMAKE_SOURCE_DIR}/slsDetectorCalibration/dataStructures
${CMAKE_SOURCE_DIR}/slsDetectorCalibration/interpolations
${CMAKE_SOURCE_DIR}/slsDetectorCalibration/
${CMAKE_SOURCE_DIR}/slsDetectorCalibration/tiffio/include/
)
# Headders needed for ROOT dictionary generation
set( HEADERS
ctbDefs.h
ctbMain.h
ctbDacs.h
ctbPattern.h
ctbSignals.h
ctbAdcs.h
ctbAcquisition.h
ctbPowers.h
ctbSlowAdcs.h
)
#set(ROOT_INCLUDE_PATH ${CMAKE_CURRENT_SOURCE_DIR})
# ROOT dictionary generation
root_generate_dictionary(ctbDict ${HEADERS} LINKDEF ctbLinkDef.h)
add_library(ctbRootLib SHARED ctbDict.cxx)
target_include_directories(ctbRootLib PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})
target_link_libraries(ctbRootLib PUBLIC
ROOT::Core
slsDetectorShared
${ROOT_LIBRARIES}
${ROOT_EXE_LINKER_FLAGS}
)
set_target_properties(
ctbRootLib PROPERTIES
LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin
)
target_link_libraries(ctbGui PUBLIC
slsDetectorShared
ctbRootLib
${TIFF_LIBRARIES}
)
set_target_properties(ctbGui PROPERTIES
RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin
)

46
ctbGui/Makefile.root5 Normal file
View File

@@ -0,0 +1,46 @@
# SPDX-License-Identifier: LGPL-3.0-or-other
# Copyright (C) 2021 Contributors to the SLS Detector Package
INCS=ctbMain.h ctbDacs.h ctbPattern.h ctbSignals.h ctbAdcs.h ctbAcquisition.h ctbPowers.h ctbSlowAdcs.h
SRC= $(INCS:.h=.cpp) ctbDict.cpp
LINKDEF=ctbLinkDef.h
ZMQLIB=../slsReceiverSoftware/include
LIBRARYCBF=$(CBFLIBDIR)/lib/*.o
INCDIR=-I../slsReceiverSoftware/include/ -I../slsDetectorSoftware/include/ -I../slsSupportLib/include/ -I../slsDetectorCalibration -I../slsDetectorCalibration/dataStructures -I$(CBFLIBDIR)/include -I../slsDetectorCalibration/interpolations
LDFLAG=-L../build/bin -lSlsDetector -lSlsSupport -L/usr/lib64/ -lpthread -lm -lstdc++ -lzmq -pthread -lrt -ltiff -L$(ZMQLIB) -L$(CBFLIBDIR)/lib/ -std=c++11
#
MAIN=ctbGui.cpp
DESTDIR?=../build/bin
OBJS = $(SRC:.cpp=.o) $(MAIN:.cpp=.o)
all: $(DESTDIR)/ctbGui
doc:
cd manual && make DESTDIR=$(DESTDIR)
htmldoc:
cd manual && make html DESTDIR=$(DESTDIR)
ctbDict.cpp: $(INCS) $(LINKDEF)
rootcint -f ctbDict.cpp -c $(INCS) $(LINKDEF)
%.o : %.cpp
echo $@
g++ -DMYROOT `root-config --cflags --glibs` -lMinuit -DCTB $(LDFLAG) -o $@ -c $< $(INCDIR)
#$(CXX) -o $@ -c $< $(INCLUDES) $(DFLAGS) -fPIC $(EPICSFLAGS) -lpthread #$(FLAGS)
$(DESTDIR)/ctbGui: $(OBJS) $(LINKDEF)
g++ -DMYROOT `root-config --cflags --glibs` -lMinuit -DCTB $(LDFLAG) -o ctbGui $(INCDIR) $(OBJS) ../slsDetectorCalibration/tiffIO.cpp
mv ctbGui $(DESTDIR)
clean:
rm -f $(DESTDIR)/ctbGui *.o ctbDict.* $(OBJS)

48
ctbGui/Makefile.root6 Normal file
View File

@@ -0,0 +1,48 @@
# SPDX-License-Identifier: LGPL-3.0-or-other
# Copyright (C) 2021 Contributors to the SLS Detector Package
INCS=ctbMain.h ctbDacs.h ctbPattern.h ctbSignals.h ctbAdcs.h ctbAcquisition.h ctbPowers.h ctbSlowAdcs.h
SRC= $(INCS:.h=.cpp) ctbDict.cpp
LINKDEF=ctbLinkDef.h
#ctbActions.h
ZMQLIB=../slsReceiverSoftware/include
LIBRARYCBF=$(CBFLIBDIR)/lib/*.o
INCDIR=-I../slsReceiverSoftware/include/ -I../slsDetectorSoftware/include/ -I../slsSupportLib/include/ -I../slsDetectorCalibration -I../slsDetectorCalibration/dataStructures -I$(CBFLIBDIR)/include -I../slsDetectorCalibration/interpolations
LDFLAG=-L../build/bin -lSlsDetector -lSlsSupport -L/usr/lib64/ -lpthread -lm -lstdc++ -lzmq -pthread -lrt -ltiff -L$(ZMQLIB) -L$(CBFLIBDIR)/lib/ -std=c++11
#
MAIN=ctbGui.cpp
DESTDIR?=../build/bin
OBJS = $(SRC:.cpp=.o) $(MAIN:.cpp=.o)
all: $(DESTDIR)/ctbGui
doc:
cd manual && make DESTDIR=$(DESTDIR)
htmldoc:
cd manual && make html DESTDIR=$(DESTDIR)
ctbDict.cpp: $(INCS) $(LINKDEF)
rootcling -f ctbDict.cpp -c $(INCS) $(LINKDEF)
%.o : %.cpp
echo $@
g++ -DMYROOT `source root-config --cflags --glibs` -lMinuit -DCTB $(LDFLAG) -o $@ -c $< $(INCDIR)
#$(CXX) -o $@ -c $< $(INCLUDES) $(DFLAGS) -fPIC $(EPICSFLAGS) -lpthread #$(FLAGS)
$(DESTDIR)/ctbGui: $(OBJS) $(LINKDEF)
g++ -DMYROOT `source root-config --cflags --glibs` -lMinuit -DCTB $(LDFLAG) -o ctbGui $(INCDIR) $(OBJS) ../slsDetectorCalibration/tiffIO.cpp
mv ctbGui $(DESTDIR)
clean:
rm -f $(DESTDIR)/ctbGui *.o ctbDict.* $(OBJS)

2277
ctbGui/ctbAcquisition.cpp Normal file

File diff suppressed because it is too large Load Diff

248
ctbGui/ctbAcquisition.h Normal file
View File

@@ -0,0 +1,248 @@
// SPDX-License-Identifier: LGPL-3.0-or-other
// Copyright (C) 2021 Contributors to the SLS Detector Package
#ifndef CTBACQUISITION_H
#define CTBACQUISITION_H
#include <TGFrame.h>
#include "ctbAdcs.h"
#include "ctbSignals.h"
#include "ctbPattern.h"
class TGTextEntry;
class TGLabel;
class TGNumberEntry;
class TGCheckButton;
class TThread;
class TGraph;
class TMultiGraph;
class THStack;
class TGButtonGroup;
class TGRadioButton;
class TGComboBox;
class TTimer;
class TCanvas;
class TH2F;
class TH1F;
class TGLabel;
class TGTextButton;
namespace sls
{
class Detector;
class detectorData;
};
template <class dataType> class slsDetectorData;
class singlePhotonDetector;
//class singlePhotonDetector;
class commonModeSubtraction;
#include <string>
#include <stdint.h>
using namespace std;
class ctbAcquisition : public TGGroupFrame {
enum {DESERIALIZER, MOENCH04, MOENCH02, MOENCH03, IMAGE32B, IMAGE16B, ADCSAR2, MYTHEN301, MYTHEN302};
private:
TGTextEntry *eOutdir;
TGTextEntry *eFname;
TGNumberEntry *eFindex;
TGCheckButton *cFileSave;
TGNumberEntry *eSerOff;
TGNumberEntry *eDynRange;
TGNumberEntry *eNumCount;
TGNumberEntry *ePixX;
TGNumberEntry *ePixY;
TGNumberEntry *eFitADC;
TGNumberEntry *eBitPlot;
TGNumberEntry *eMinRaw;
TGNumberEntry *eMaxRaw;
TGNumberEntry *eMinPedSub;
TGNumberEntry *eMaxPedSub;
TGCheckButton *cMinMaxRaw;
TGCheckButton *cMinMaxPedSub;
TGNumberEntry *eMeasurements;
TGTextButton *bStatus;
// TGTextButton
TGCheckButton *cCompile;
TGTextButton *cLoad;
// TGCheckButton *cRun;
TThread *acqThread;
THStack *adcStack;
THStack *bitStack;
THStack *countsStack;
TH1F *adcHisto[NADCS];
TH1F *countsHisto[NADCS];
TH1F *bitHisto[NSIGNALS];
float bitOffset[NSIGNALS];
// int enableFlag[NADCS+4];
int roMode;
int dBitOffset;
TH1F *adcFit;
TH1F *bitPlot;
TH1F *countsFit;
TH2F *h2DMapAn; // for 2D detectors
TH2F *h2DMapDig; // for 2D detectors
TH1F *h1DMap; //for 1D detectors
// TH2F *h2Scan; // for 2D detectors
// TMultiGraph *mgAdcs;
// TH1I *plotAdc[NADCS];
sls::Detector* myDet;
int plotFlag[NADCS];
int bitPlotFlag[NSIGNALS];
int ip;
// int nChannels;
// int chanEnable;
//int nADCs;
std::vector <int> dbitlist;
std::vector <int> adclist;
TGButtonGroup *bgPlot;// = new TGVButtonGroup(main_frame);
TGRadioButton *rbPlotOff;
TGRadioButton *rbWaveform;
TGRadioButton *rbDistribution;
TGRadioButton *rb2D;
// TGRadioButton *rbScan;
TGComboBox *cbDetType;
TGCheckButton *cbGetPedestal;
TGCheckButton *cbSubtractPedestal;
TGCheckButton *cbCommonMode;
TGTextButton *bResetPedestal;
TGLabel *lClickX;
TGLabel *lClickY;
TGLabel *lClickValue;
TCanvas *myCanvas;
TTimer *plotTimer;
char patternFile[10000];
char patternCompiler[10000];
int globalPlot;
int adcPlot;
int dbitPlot;
int tenG;
int nAnalogSamples, nDigitalSamples;
// int iScanStep;
slsDetectorData<uint16_t> *dataStructure;
singlePhotonDetector *photonFinder;
//singlePhotonDetector *photonFinder;
commonModeSubtraction *commonMode;
int cmSub;
int stop;
uint64_t dBitMask;
int deserializer;
public:
ctbAcquisition(TGVerticalFrame*, sls::Detector*);
void setOutdir();
void setFname();
void setMeasurements();
void setFsave(Bool_t);
void changePlot(Int_t);
void changeDetector(Int_t);
void changePlot();
void changeDetector();
void setFindex();
void Draw();
void setCanvas(TCanvas*);
void toggleAcquisition();
void loadPattern();
static void* ThreadHandle(void *arg);
void update();
void acquisitionFinished();
// string getParameters();
void setGraph (int i ,int en, Pixel_t col);
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*);
int StopFlag;
int plotData(sls::detectorData*, int);
void setPatternFile(const char* t);
void setPatternCompiler(const char* t);
void setAnalogSamples(int);
void setDigitalSamples(int);
void setADCEnable(Int_t);
void setDbitEnable(Int_t);
void setReadoutMode(int);
void updateChans();
void resetPedestal();
void ToggleCommonMode(Bool_t);
void TogglePedSub(Bool_t);
void ChangeHistoLimitsPedSub(Long_t );
void ChangeHistoLimitsRaw(Long_t);
void ChangeHistoLimitsPedSub( );
void ChangeHistoLimitsRaw();
void ChangeHistoLimitsPedSub(Bool_t );
void ChangeHistoLimitsRaw(Bool_t);
void ChangeSerialOffset();
void ChangeSerialOffset(Long_t);
void ChangeNumberOfChannels();
void ChangeNumberOfChannels(Long_t);
void ChangeDynamicRange();
void ChangeDynamicRange(Long_t);
void ChangeImagePixels();
void ChangeImagePixels(Long_t);
void canvasClicked();
void FitADC();
void plotBit();
ClassDef(ctbAcquisition,0)
};
#endif

616
ctbGui/ctbAdcs.cpp Normal file
View File

@@ -0,0 +1,616 @@
// SPDX-License-Identifier: LGPL-3.0-or-other
// Copyright (C) 2021 Contributors to the SLS Detector Package
#include <TApplication.h>
#include <TGClient.h>
#include <TCanvas.h>
#include <TF1.h>
#include <TRandom.h>
#include <TGButton.h>
#include <TRootEmbeddedCanvas.h>
#include <TGButtonGroup.h>
#include <TGNumberEntry.h>
#include <TGLabel.h>
#include <TList.h>
#include <TGFileDialog.h>
#include <TGComboBox.h>
#include <TH2F.h>
#include <TColor.h>
#include <TH1F.h>
#include <TGraphErrors.h>
#include <TGColorSelect.h>
#include <THStack.h>
#include <TGTab.h>
#include <stdio.h>
#include <iostream>
#include <fstream>
#include "ctbAdcs.h"
#include "ctbDefs.h"
#include "sls/Detector.h"
using namespace std;
ctbAdc::ctbAdc(TGVerticalFrame *page, int i, sls::Detector *det)
: TGHorizontalFrame(page, 800,800), id(i), myDet(det) {
TGHorizontalFrame *hframe=this;
char tit[100];
page->AddFrame(hframe,new TGLayoutHints(kLHintsTop | kLHintsExpandX , 1,1,1,1));
hframe->MapWindow();
sprintf(tit, "ADC%d", id);
sAdcLabel= new TGLabel(hframe, tit);
hframe->AddFrame(sAdcLabel,new TGLayoutHints(kLHintsTop | kLHintsLeft| kLHintsExpandX, 1, 1, 1, 1));
sAdcLabel->MapWindow();
sAdcLabel->SetTextJustify(kTextLeft);
sAdcInvert= new TGCheckButton(hframe, "Inv");
hframe->AddFrame( sAdcInvert,new TGLayoutHints(kLHintsTop | kLHintsLeft| kLHintsExpandX, 1, 1, 1, 1));
sAdcInvert->MapWindow();
sAdcInvert->Connect("Toggled(Bool_t)","ctbAdc",this,"ToggledInvert(Bool_t)");
sAdcEnable= new TGCheckButton(hframe, "En");
hframe->AddFrame( sAdcEnable,new TGLayoutHints(kLHintsTop | kLHintsLeft| kLHintsExpandX, 1, 1, 1, 1));
sAdcEnable->MapWindow();
// sAdcEnable->SetOn(kTRUE);
// sAdcEnable->SetEnabled(kFALSE);
sAdcEnable->Connect("Toggled(Bool_t)","ctbAdc",this,"ToggledEnable(Bool_t)");
sAdcPlot= new TGCheckButton(hframe, "Plot");
hframe->AddFrame( sAdcPlot,new TGLayoutHints(kLHintsTop | kLHintsLeft| kLHintsExpandX, 1, 1, 1, 1));
sAdcPlot->MapWindow();
sAdcPlot->Connect("Toggled(Bool_t)","ctbAdc",this,"ToggledPlot(Bool_t)");
fColorSel = new TGColorSelect(hframe, id+1, 0);
fColorSel->Connect("ColorSelected(Pixel_t)","ctbAdc",this,"ColorChanged(Pixel_t)");
hframe->AddFrame(fColorSel, new TGLayoutHints(kLHintsTop |
kLHintsLeft, 2, 0, 2, 2));
fColorSel->SetColor(TColor::Number2Pixel(id+1));
// sprintf(tit,"adc%d",id);
// gADC=new TGraph();
// gADC->SetName(tit);
// gADC->SetLineColor(id+1);
// gADC->SetMarkerColor(id+1);
};
Pixel_t ctbAdc::getColor(){
return fColorSel->GetColor();
}
Bool_t ctbAdc::getEnabled(){
return getPlot();
}
Bool_t ctbAdc::getPlot(){
return sAdcPlot->IsOn();
}
Bool_t ctbAdc::getInverted(){
return sAdcInvert->IsOn();
}
Bool_t ctbAdc::getEnable(){
return sAdcEnable->IsOn();
}
void ctbAdc::setInverted(Bool_t b){
// cout << id << "set enabled " << b << endl;
if (b)
sAdcInvert->SetOn(kTRUE,kTRUE);
else
sAdcInvert->SetOn(kFALSE,kTRUE);
}
void ctbAdc::setEnable(Bool_t b){
// cout << id << "set enabled " << b << endl;
if (b)
sAdcEnable->SetOn(kTRUE,kFALSE);
else
sAdcEnable->SetOn(kFALSE,kFALSE);
}
void ctbAdc::setAdcAlias(char *tit, int plot, int color) {
if (tit)
sAdcLabel->SetText(tit);
if (plot>0)
sAdcPlot->SetOn(kTRUE,kTRUE);
else if (plot==0)
sAdcPlot->SetOn(kFALSE,kTRUE);
if (color>=0)
fColorSel->SetColor(color);
fColorSel->SetEnabled(sAdcPlot->IsOn());
}
string ctbAdc::getAdcAlias() {
char line[1000];
sprintf(line,"ADC%d %s %d %lx\n",id,sAdcLabel->GetText()->Data(),sAdcPlot->IsOn(),fColorSel->GetColor());
return string(line);
}
void ctbAdc::update() {
//Emit("ToggledAdcEnable(Int_t)", id);
}
void ctbAdc::ToggledPlot(Bool_t b){
// Long_t mask=b<<id;
// ToggledAdcPlot(mask);
cout << "Colsel " << id << " enable " << b << endl;
if (b)
fColorSel->SetEnabled(kTRUE);
else
fColorSel->SetEnabled(kFALSE);
// fColorSel->SetEnabled(sAdcPlot->IsOn());
Emit("ToggledAdcPlot(Int_t)", id);
}
void ctbAdc::ToggledInvert(Bool_t b){
// fColorSel->SetEnabled(sAdcPlot->IsOn());
Emit("ToggledAdcInvert(Int_t)", id);
}
void ctbAdc::ToggledEnable(Bool_t b){
fColorSel->SetEnabled(sAdcPlot->IsOn());
Emit("ToggledAdcEnable(Int_t)", id);
}
void ctbAdc::ColorChanged(Pixel_t) {
Emit("ToggledAdcPlot(Int_t)", id);
}
void ctbAdc::ToggledAdcPlot(Int_t b){
Emit("ToggledAdcPlot(Int_t)", id);
}
void ctbAdc::ToggledAdcInvert(Int_t b){
Emit("ToggledAdcInvert(Int_t)", id);
}
void ctbAdc::ToggledAdcEnable(Int_t b){
Emit("ToggledAdcEnable(Int_t)", id);
}
void ctbAdc::setEnabled(Bool_t b){
// cout << id << "set enabled " << b << endl;
if (b)
sAdcPlot->SetOn(kTRUE,kFALSE);
else
sAdcPlot->SetOn(kFALSE,kFALSE);
}
void ctbAdc::setPlot(Bool_t b){
// cout << id << "set enabled " << b << endl;
if (b)
sAdcPlot->SetOn(kTRUE,kTRUE);
else
sAdcPlot->SetOn(kFALSE,kTRUE);
}
ctbAdcs::ctbAdcs(TGVerticalFrame *page, sls::Detector *det)
: TGGroupFrame(page,"Adcs",kVerticalFrame), myDet(det) {
SetTitlePos(TGGroupFrame::kLeft);
page->AddFrame(this,new TGLayoutHints( kLHintsTop | kLHintsExpandX , 10,10,10,10));
MapWindow();
TGHorizontalFrame* hframe=new TGHorizontalFrame(this, 800,800);
AddFrame(hframe,new TGLayoutHints(kLHintsTop | kLHintsExpandX , 1,1,1,1));
hframe->MapWindow();
int idac=0;
TGHorizontalFrame* hhframe=new TGHorizontalFrame(this, 800,800);
AddFrame(hhframe,new TGLayoutHints(kLHintsTop | kLHintsExpandX , 1,1,1,1));
hhframe->MapWindow();
TGVerticalFrame *vframe;
for (idac=0; idac<NADCS; idac++) {
if (idac%16==0) {
vframe=new TGVerticalFrame(hhframe, 400,800);
hhframe->AddFrame(vframe,new TGLayoutHints(kLHintsTop | kLHintsExpandX , 1,1,1,1));
vframe->MapWindow();
}
sAdc[idac]=new ctbAdc(vframe,idac,myDet);
sAdc[idac]->Connect("ToggledAdcPlot(Int_t)","ctbAdcs",this,"ToggledAdcPlot(Int_t)");
sAdc[idac]->Connect("ToggledAdcInvert(Int_t)","ctbAdcs",this,"ToggledAdcInvert(Int_t)");
sAdc[idac]->Connect("ToggledAdcEnable(Int_t)","ctbAdcs",this,"ToggledAdcEnable(Int_t)");
}
hframe=new TGHorizontalFrame(this, 800,800);
AddFrame(hframe,new TGLayoutHints(kLHintsTop | kLHintsExpandX , 1,1,1,1));
hframe->MapWindow();
bCheckHalf[0]=new TGTextButton(hframe, "All 0-15");
hframe->AddFrame(bCheckHalf[0],new TGLayoutHints(kLHintsTop | kLHintsExpandX, 5, 5, 5, 5));
bCheckHalf[0]->MapWindow();
bCheckHalf[0]->Connect("Clicked()","ctbAdcs",this,"CheckHalf0()");
bRemoveHalf[0]=new TGTextButton(hframe, "None 0-15");
hframe->AddFrame(bRemoveHalf[0],new TGLayoutHints(kLHintsBottom | kLHintsExpandX, 5, 5, 5, 5));
bRemoveHalf[0]->MapWindow();
bRemoveHalf[0]->Connect("Clicked()","ctbAdcs",this,"RemoveHalf0()");
bCheckHalf[1]=new TGTextButton(hframe, "All 16-23");
hframe->AddFrame(bCheckHalf[1],new TGLayoutHints(kLHintsTop | kLHintsExpandX, 5, 5, 5, 5));
bCheckHalf[1]->MapWindow();
bCheckHalf[1]->Connect("Clicked()","ctbAdcs",this,"CheckHalf1()");
// bCheckAll->Connect("Clicked()","ctbAdcs",this,"CheckAll()");
bRemoveHalf[1]=new TGTextButton(hframe, "None 16-23");
hframe->AddFrame(bRemoveHalf[1],new TGLayoutHints(kLHintsBottom | kLHintsExpandX, 5, 5, 5, 5));
bRemoveHalf[1]->MapWindow();
bRemoveHalf[1]->Connect("Clicked()","ctbAdcs",this,"RemoveHalf1()");
// bRemoveAll->Connect("Clicked()","ctbAdcs",this,"RemoveAll()");
hframe=new TGHorizontalFrame(this, 800,800);
AddFrame(hframe,new TGLayoutHints(kLHintsTop | kLHintsExpandX , 1,1,1,1));
hframe->MapWindow();
bCheckAll=new TGTextButton(hframe, "All");
hframe->AddFrame(bCheckAll,new TGLayoutHints(kLHintsTop | kLHintsExpandX, 5, 5, 5, 5));
bCheckAll->MapWindow();
bCheckAll->Connect("Clicked()","ctbAdcs",this,"CheckAll()");
bRemoveAll=new TGTextButton(hframe, "None");
hframe->AddFrame(bRemoveAll,new TGLayoutHints(kLHintsBottom | kLHintsExpandX, 5, 5, 5, 5));
bRemoveAll->MapWindow();
bRemoveAll->Connect("Clicked()","ctbAdcs",this,"RemoveAll()");
hframe=new TGHorizontalFrame(this, 800,50);
AddFrame(hframe,new TGLayoutHints(kLHintsTop | kLHintsExpandX , 1,1,1,1));
hframe->MapWindow();
TGLabel *label= new TGLabel(hframe, "Inversion mask: ");
hframe->AddFrame(label,new TGLayoutHints(kLHintsTop | kLHintsLeft| kLHintsExpandX, 1, 1, 1, 1));
label->MapWindow();
label->SetTextJustify(kTextLeft);
eInversionMask = new TGNumberEntry(hframe, 0, 16,999, TGNumberFormat::kNESHex,
TGNumberFormat::kNEANonNegative,
TGNumberFormat::kNELNoLimits);
hframe->AddFrame(eInversionMask,new TGLayoutHints(kLHintsTop | kLHintsExpandX, 1, 1, 1, 1));
eInversionMask->MapWindow();
eInversionMask->Resize(150,30);
eInversionMask->SetState(kFALSE);
hframe=new TGHorizontalFrame(this, 800,50);
AddFrame(hframe,new TGLayoutHints(kLHintsTop | kLHintsExpandX , 1,1,1,1));
hframe->MapWindow();
label= new TGLabel(hframe, "Enable mask: ");
hframe->AddFrame(label,new TGLayoutHints(kLHintsTop | kLHintsLeft| kLHintsExpandX, 1, 1, 1, 1));
label->MapWindow();
label->SetTextJustify(kTextLeft);
eEnableMask = new TGNumberEntry(hframe, 0, 16,999, TGNumberFormat::kNESHex,
TGNumberFormat::kNEANonNegative,
TGNumberFormat::kNELNoLimits);
hframe->AddFrame(eEnableMask,new TGLayoutHints(kLHintsTop | kLHintsExpandX, 1, 1, 1, 1));
eEnableMask->MapWindow();
eEnableMask->Resize(150,30);
eEnableMask->SetState(kFALSE);
}
int ctbAdcs::setEnable(int reg) {
try {
if (reg > -1) {
myDet->setADCEnableMask(reg);
}
auto retval = myDet->getADCEnableMask().tsquash("Different values");
eEnableMask->SetHexNumber(retval);
return retval;
} CATCH_DISPLAY ("Could not set/get adc enablemask.", "ctbAdcs::setEnable")
return -1;
}
int ctbAdcs::setInvert(int reg) {
try {
if (reg > -1) {
myDet->setADCInvert(reg);
}
auto retval = myDet->getADCInvert().tsquash("Different values");
eInversionMask->SetHexNumber(retval);
return retval;
} CATCH_DISPLAY ("Could not set/get adc enablemask.", "ctbAdcs::setEnable")
return -1;
}
void ctbAdcs::update() {
Int_t invreg;
Int_t disreg;
disreg=setEnable();
invreg=setInvert();
for (int is=0; is<NADCS; is++) {
sAdc[is]->setAdcAlias(NULL,-1,-1);
if (invreg & (1<<is) )
sAdc[is]->setInverted(kTRUE);
else
sAdc[is]->setInverted(kFALSE);
if (disreg & (1<<is) )
sAdc[is]->setEnable(kTRUE);
else
sAdc[is]->setEnable(kFALSE);
}
Emit("AdcEnable(Int_t)", disreg);
}
string ctbAdcs::getAdcParameters() {
ostringstream line;
line << "reg "<< hex << setInvert() << "# ADC invert reg" << dec << endl;
line << "reg "<< hex << setEnable() << " # ADC enable reg"<< dec << endl;
return line.str();
}
void ctbAdcs::CheckAll() {
for (int is=0; is<NADCS; is++){
sAdc[is]->setPlot(kTRUE);
}
}
void ctbAdcs::RemoveAll() {
for (int is=0; is<NADCS; is++) {
sAdc[is]->setPlot(kFALSE);
}
}
void ctbAdcs::CheckHalf0() {
for (int is=0; is<NADCS/2; is++) {
sAdc[is]->setPlot(kTRUE);
}
}
void ctbAdcs::RemoveHalf0() {
for (int is=0; is<NADCS/2; is++){
sAdc[is]->setPlot(kFALSE);
}
}
void ctbAdcs::CheckHalf1() {
for (int is=NADCS/2; is<NADCS; is++){
sAdc[is]->setPlot(kTRUE);
}
}
void ctbAdcs::RemoveHalf1() {
for (int is=NADCS/2; is<NADCS; is++){
sAdc[is]->setPlot(kFALSE);
}
}
int ctbAdcs::setAdcAlias(string line) {
int is=-1, plot=0, color=-1;
char tit[100];
int narg=sscanf(line.c_str(),"ADC%d %s %d %x",&is,tit,&plot, &color);
if (narg<2)
return -1;
if (narg!=3)
color=-1;
if (is>=0 && is<NADCS) {
sAdc[is]->setAdcAlias(tit,plot,color);
}
return is;
}
string ctbAdcs::getAdcAlias() {
ostringstream line;
for (int is=0; is<NADCS; is++)
line << sAdc[is]->getAdcAlias();
return line.str();
}
void ctbAdcs::ToggledAdcPlot(Int_t b){
Emit("ToggledAdcPlot(Int_t)", b);
}
void ctbAdcs::AdcEnable(Int_t b){
Emit("AdcEnable(Int_t)", b);
}
void ctbAdcs::ToggledAdcEnable(Int_t b){
Int_t oreg=setEnable();
Int_t m=1<<b;
if (sAdc[b]->getEnable())
oreg|=m;
else
oreg&=~m;
setEnable(oreg);
Emit("AdcEnable(Int_t)", oreg);
}
void ctbAdcs::ToggledAdcInvert(Int_t b){
Int_t oreg=setInvert();
Int_t m=1<<b;
if (sAdc[b]->getInverted())
oreg|=m;
else
oreg&=~m;
setInvert(oreg);
}
Pixel_t ctbAdcs::getColor(int i){
if (i>=0 && i<NADCS)
return sAdc[i]->getColor();
return static_cast<Pixel_t>(-1);
}
Bool_t ctbAdcs::getEnabled(int i){
if (i>=0 && i<NADCS)
return sAdc[i]->getEnabled();
return static_cast<Bool_t>(-1);
}
Bool_t ctbAdcs::getEnable(int i){
if (i>=0 && i<NADCS)
return sAdc[i]->getEnable();
return static_cast<Bool_t>(-1);
}
Bool_t ctbAdcs::getPlot(int i){
if (i>=0 && i<NADCS)
return sAdc[i]->getPlot();
return static_cast<Bool_t>(-1);
}

157
ctbGui/ctbAdcs.h Normal file
View File

@@ -0,0 +1,157 @@
// SPDX-License-Identifier: LGPL-3.0-or-other
// Copyright (C) 2021 Contributors to the SLS Detector Package
#ifndef CTBADCS_H
#define CTBADCS_H
#include <TGFrame.h>
#define NADCS 32
class TRootEmbeddedCanvas;
class TGButtonGroup;
class TGVerticalFrame;
class TGHorizontalFrame;
class TGTextEntry;
class TGLabel;
class TGNumberEntry;
class TH2F;
class TGComboBox;
class TGCheckButton;
class TGColorSelect;
class TColor;
class THStack;
class TGraphErrors;
class TGTextButton;
class TGTab;
class TGraph;
namespace sls
{
class Detector;
};
#include <string>
using namespace std;
class ctbAdc : public TGHorizontalFrame {
private:
TGLabel *sAdcLabel;
TGCheckButton *sAdcEnable;
TGCheckButton *sAdcPlot;
TGCheckButton *sAdcInvert;
TGColorSelect *fColorSel;
// TGraph *gADC;
int id;
sls::Detector *myDet;
public:
ctbAdc(TGVerticalFrame *page, int i, sls::Detector *det);
void setAdcAlias(char *tit, int plot, int color);
string getAdcAlias();
void ToggledAdcPlot(Int_t b);
void ToggledAdcEnable(Int_t b);
void ToggledAdcInvert(Int_t b);
void ToggledPlot(Bool_t b);
void ToggledEnable(Bool_t b);
void ToggledInvert(Bool_t b);
void ColorChanged(Pixel_t);
void setEnabled(Bool_t b);
Bool_t getEnabled();
// TGraph *getGraph();
void update();
Pixel_t getColor();
Bool_t getEnable();
void setEnable(Bool_t);
void setPlot(Bool_t);
Bool_t getInverted();
Bool_t getPlot();
void setInverted(Bool_t);
ClassDef(ctbAdc,0)
};
class ctbAdcs : public TGGroupFrame {
private:
ctbAdc *sAdc[NADCS];
sls::Detector *myDet;
TGTextButton *bCheckAll;
TGTextButton *bRemoveAll;
TGTextButton *bCheckHalf[2];
TGTextButton *bRemoveHalf[2];
TGNumberEntry *eInversionMask;
TGNumberEntry *eEnableMask;
/* TGTextButton *bPlotSelected; */
/* TGNumberEntry *eMinX; */
/* TGNumberEntry *eMaxX; */
/* TGNumberEntry *eMinY; */
/* TGNumberEntry *eMaxY; */
/* TGTextButton *bGetPixel; */
/* TGNumberEntry *ePixelX; */
/* TGNumberEntry *ePixelY; */
/* TGLabel *lPixelValue; */
public:
ctbAdcs(TGVerticalFrame *page, sls::Detector *det);
int setAdcAlias(string line);
string getAdcAlias();
string getAdcParameters();
void ToggledAdcPlot(Int_t);
void ToggledAdcInvert(Int_t);
void ToggledAdcEnable(Int_t);
void AdcEnable(Int_t b);
// TGraph *getGraph(int i);
void CheckAll();
void RemoveAll();
void update();
int setInvert(int reg=-1);
int setEnable(int reg=-1);
Pixel_t getColor(int i);
Bool_t getEnabled(int i);
Bool_t getPlot(int i);
Bool_t getEnable(int i);
void CheckHalf0();
void RemoveHalf0();
void CheckHalf1();
void RemoveHalf1();
ClassDef(ctbAdcs,0)
};
#endif

235
ctbGui/ctbDacs.cpp Normal file
View File

@@ -0,0 +1,235 @@
// SPDX-License-Identifier: LGPL-3.0-or-other
// Copyright (C) 2021 Contributors to the SLS Detector Package
#include <stdio.h>
#include <iostream>
#include <fstream>
#include <TGTextEntry.h>
#include <TGLabel.h>
#include <TGNumberEntry.h>
#include <TGButton.h>
#include "ctbDacs.h"
#include "ctbDefs.h"
#include "sls/Detector.h"
#include "sls/sls_detector_defs.h"
using namespace std;
ctbDac::ctbDac(TGGroupFrame *page, int idac, sls::Detector *det) : TGHorizontalFrame(page, 800,50) , id(idac), myDet(det) {
TGHorizontalFrame *hframe=this;
page->AddFrame(hframe,new TGLayoutHints(kLHintsTop | kLHintsExpandX , 1,1,1,1));
MapWindow();
char tit[100];
sprintf(tit, "DAC %d:",idac);
dacsLabel= new TGCheckButton(hframe, tit);// new TGLabel(hframe, tit);
dacsLabel->SetOn(kTRUE, kTRUE);
dacsLabel->Connect("Toggled(Bool_t)","ctbDac",this,"setOn(Bool_t)");
hframe->AddFrame(dacsLabel,new TGLayoutHints(kLHintsTop | kLHintsLeft| kLHintsExpandX, 5, 5, 5, 5));
dacsLabel->MapWindow();
dacsLabel->SetTextJustify(kTextLeft);
dacsEntry = new TGNumberEntry(hframe, 0, 9,999, TGNumberFormat::kNESInteger,
TGNumberFormat::kNEANonNegative,
TGNumberFormat::kNELLimitMinMax,
0, 65535);
hframe->AddFrame(dacsEntry,new TGLayoutHints(kLHintsTop | kLHintsExpandX, 5, 5, 5, 5));
dacsEntry->MapWindow();
dacsEntry->Resize(150,30);
dacsUnit= new TGCheckButton(hframe, "mV");
// if (idac!=slsDetectorDefs::ADC_VPP) {
hframe->AddFrame( dacsUnit,new TGLayoutHints(kLHintsTop | kLHintsLeft| kLHintsExpandX, 5, 5, 5, 5));
dacsUnit->MapWindow();
if (idac==slsDetectorDefs::ADC_VPP) {
dacsUnit->SetEnabled(kFALSE);
hframe->HideFrame(dacsUnit);
dacsUnit->MapWindow();
cout << "hiding!" << endl;
}
if (idac==slsDetectorDefs::HIGH_VOLTAGE) {
dacsUnit->SetText("V");
dacsUnit->SetOn(kTRUE,kTRUE);
dacsUnit->SetEnabled(kFALSE);
}
//}
sprintf(tit, "xxx");
dacsValue= new TGLabel(hframe, tit);
hframe->AddFrame( dacsValue,new TGLayoutHints(kLHintsTop | kLHintsLeft| kLHintsExpandX, 5, 5, 5, 5));
dacsValue->MapWindow();
dacsValue->SetTextJustify(kTextLeft);
TGTextEntry *e=dacsEntry->TGNumberEntry::GetNumberEntry();
e->Connect("ReturnPressed()","ctbDac",this,"setValue()");
// e->Connect("ValueSet(Long_t)","ctbDac",this,"setValue(Long_t)");
dacsEntry->Connect("ValueSet(Long_t)","ctbDac",this,"setValue(Long_t)");
// cout << "(((((((((((((((((((((((((((((((" << dacsEntry->GetListOfSignals()->At(0)->IsA() << endl;
}
int ctbDac::setLabel(char *tit, int mv) {
if(tit)
dacsLabel->SetText(tit);
if (mv==1)
dacsUnit->SetOn(kTRUE,kTRUE);
else if (mv==0)
dacsUnit->SetOn(kFALSE,kTRUE);
// else if (mv==2) {
// ;}
// else if (mv==3)
// ;
return id;
}
string ctbDac::getLabel() {
ostringstream line;
line << dacsLabel->GetText() << " " << dacsUnit->IsOn() << endl;
// line << "DAC" << dec << id << " " << dacsUnit->IsOn() << endl;
return line.str();
}
int ctbDac::getMoenchDacId() {
slsDetectorDefs::dacIndex moenchDacIndices[8] = {slsDetectorDefs::VBP_COLBUF, slsDetectorDefs::VIPRE, slsDetectorDefs::VIN_CM, slsDetectorDefs::VB_SDA, slsDetectorDefs::VCASC_SFP, slsDetectorDefs::VOUT_CM, slsDetectorDefs::VIPRE_CDS, slsDetectorDefs::IBIAS_SFP};
if (id >= 8) {
return id;
}
return static_cast<int>(moenchDacIndices[id]);
}
void ctbDac::setValue(Long_t a) {setValue();}
void ctbDac::setValue() {
cout << "setting dac! "<< id << " value " << dacsEntry->GetIntNumber() << " units " << dacsUnit->IsOn() << endl;
try {
int sid = id;
if (myDet->getDetectorType().squash() == slsDetectorDefs::MOENCH) {
sid = getMoenchDacId();
}
myDet->setDAC(static_cast<slsDetectorDefs::dacIndex>(sid), dacsEntry->GetIntNumber(), dacsUnit->IsOn());
} CATCH_DISPLAY ("Could not set dac " + to_string(id) + ".", "ctbDac::setValue")
getValue();
}
void ctbDac::setOn(Bool_t b) {
// cout << "setting dac! "<< id << endl;
if ( dacsLabel->IsOn()) {
setValue();
} else {
try {
int sid = id;
if (myDet->getDetectorType().squash() == slsDetectorDefs::MOENCH) {
sid = getMoenchDacId();
}
myDet->setDAC(static_cast<slsDetectorDefs::dacIndex>(sid), -100, false);
} CATCH_DISPLAY ("Could not power off dac " + to_string(id) + ".", "ctbDac::setOn")
}
getValue();
}
int ctbDac::getValue() {
try {
int sid = id;
if (myDet->getDetectorType().squash() == slsDetectorDefs::MOENCH) {
sid = getMoenchDacId();
}
int val = myDet->getDAC(static_cast<slsDetectorDefs::dacIndex>(sid), dacsUnit->IsOn()).tsquash("Different values");
cout << "dac " << id << " " << val << endl;
dacsValue->SetText(to_string(val).c_str());
if (val >= 0) {
dacsLabel->SetOn(kTRUE);
} else {
dacsLabel->SetOn(kFALSE);
}
return val;
} CATCH_DISPLAY ("Could not get dac " + to_string(id) + ".", "ctbDac::getValue")
return -1;
}
ctbDacs::ctbDacs(TGVerticalFrame *page, sls::Detector *det) : TGGroupFrame(page,"DACs",kVerticalFrame) , myDet(det){
SetTitlePos(TGGroupFrame::kLeft);
page->AddFrame(this,new TGLayoutHints( kLHintsTop | kLHintsExpandX , 10,10,10,10));
MapWindow();
// cout << "window mapped " << endl;
for (int idac=0; idac<NDACS; idac++) {
dacs[idac]=new ctbDac(this, idac, myDet);
}
dacs[NDACS]=new ctbDac(this, slsDetectorDefs::ADC_VPP, myDet);
dacs[NDACS+1]=new ctbDac(this, slsDetectorDefs::HIGH_VOLTAGE, myDet);
dacs[NDACS]->setLabel((char*)"ADC Vpp",2);
dacs[NDACS+1]->setLabel((char*)"High Voltage",3);
}
int ctbDacs::setDacAlias(string line) {
int is=-1, mv=0;
char tit[100];
int narg=sscanf(line.c_str(),"DAC%d %s %d",&is,tit,&mv);
if (narg<2)
return -1;
if (is>=0 && is<NDACS)
dacs[is]->setLabel(tit,mv);
return is;
}
string ctbDacs::getDacAlias() {
ostringstream line;
for (int i=0; i<NDACS; i++)
line << dacs[i]->getLabel() << endl;
return line.str();
}
string ctbDacs::getDacParameters() {
ostringstream line;
for (int i=0; i<NDACS; i++) {
//line << "dacs:" << i << " " << dacs[i]->getValue << endl;
line << "dac:" << i << " " << dacs[i]->getValue() << endl;
}
return line.str();
}
void ctbDacs::update() {
for (int idac=0; idac<NDACS+1; idac++) {
dacs[idac]->getValue();
}
}

77
ctbGui/ctbDacs.h Normal file
View File

@@ -0,0 +1,77 @@
// SPDX-License-Identifier: LGPL-3.0-or-other
// Copyright (C) 2021 Contributors to the SLS Detector Package
#ifndef CTBDACS_H
#define CTBDACS_H
#include <TGFrame.h>
#define NDACS 18
//#define NDACS 16
class TGTextEntry;
class TGLabel;
class TGNumberEntry;
class TGCheckButton;
namespace sls
{
class Detector;
};
#include <string>
using namespace std;
class ctbDac : public TGHorizontalFrame {
protected:
// TGLabel *dacsLabel;
TGNumberEntry *dacsEntry;
TGCheckButton *dacsUnit;
TGCheckButton *dacsLabel;
TGLabel *dacsValue;
int id;
sls::Detector* myDet;
public:
ctbDac(TGGroupFrame*, int , sls::Detector*);
void setValue();
void setValue(Long_t);
int getValue();
void setOn(Bool_t);
int setLabel(char *tit, int mv);
string getLabel();
int getMoenchDacId();
ClassDef(ctbDac,0)
};
class ctbDacs : public TGGroupFrame {
private:
ctbDac *dacs[NDACS+2];
sls::Detector* myDet;
public:
ctbDacs(TGVerticalFrame *page, sls::Detector*);
int setDacAlias(string line);
// int setDacAlias(string line);
string getDacAlias();
string getDacParameters();
void update();
ClassDef(ctbDacs,0)
};
#endif

86
ctbGui/ctbDefs.h Normal file
View File

@@ -0,0 +1,86 @@
// SPDX-License-Identifier: LGPL-3.0-or-other
// Copyright (C) 2021 Contributors to the SLS Detector Package
#pragma once
#include <string>
#include <stdexcept>
#include <chrono>
//#include "sls/sls_detector_exceptions.h"
//#include "sls/ansi.h"
#define RED "\x1b[31m"
#define RESET "\x1b[0m"
#define BOLD "\x1b[1m"
#define cprintf(code, format, ...) printf(code format RESET, ##__VA_ARGS__)
#define CATCH_DISPLAY(m, s) catch(...) { ctbDefs::DisplayExceptions(m, s); }
#define CATCH_HANDLE(...) catch(...) { ctbDefs::HandleExceptions(__VA_ARGS__); }
class ctbDefs {
public:
/**
* Empty Constructor
*/
ctbDefs(){};
// convert double seconds to chrono ns
static std::chrono::nanoseconds ConvertDoubleStoChronoNS(double timeS) {
using std::chrono::duration;
using std::chrono::duration_cast;
using std::chrono::nanoseconds;
return duration_cast<nanoseconds>(duration<double>(timeS));
}
// convert chrono ns to doubel s
static double ConvertChronoNStoDoubleS(std::chrono::nanoseconds timeNs) {
using std::chrono::duration;
using std::chrono::duration_cast;
return duration_cast<duration<double>>(timeNs).count();
}
static void DisplayExceptions(std::string emsg, std::string src) {
try {
throw;
} /* catch (const sls::SocketError &e) {
throw;
} catch (const sls::SharedMemoryError &e) {
throw;
} */catch (const std::exception &e) {
ExceptionMessage(emsg, e.what(), src);
}
};
template <class CT> struct NonDeduced { using type = CT; };
template <class S, typename RT, typename... CT>
static void HandleExceptions(const std::string emsg, const std::string src, S* s,
RT (S::*somefunc)(CT...),
typename NonDeduced<CT>::type... Args) {
try {
throw;
} /*catch (const sls::SocketError &e) {
throw;
} catch (const sls::SharedMemoryError &e) {
throw;
} */catch (const std::exception &e) {
ExceptionMessage(emsg, e.what(), src);
(s->*somefunc)(Args...);
}
};
static void ExceptionMessage(std::string message,
std::string exceptionMessage,
std::string source) {
// because sls_detector_exceptions cannot be included
if (exceptionMessage.find("hared memory") != std::string::npos) {
throw;
}
if (exceptionMessage.find("annot connect") != std::string::npos) {
throw;
}
cprintf(RED, "Warning (%s): %s [Caught Exception: %s]\n", source.c_str(), message.c_str(), exceptionMessage.c_str());
//return Message(qDefs::WARNING, message + std::string("\nCaught exception:\n") + exceptionMessage, source);
};
};

159
ctbGui/ctbGui.cpp Normal file
View File

@@ -0,0 +1,159 @@
// SPDX-License-Identifier: LGPL-3.0-or-other
// Copyright (C) 2021 Contributors to the SLS Detector Package
#include <TApplication.h>
#include <TColor.h>
#include <TStyle.h>
#include <TROOT.h>
#include <stdlib.h>
#include <stdio.h>
#include <iostream>
#include <fstream>
#include <string>
#include "sls/Detector.h"
#include "sls/sls_detector_defs.h"
//#include "sls_receiver_defs.h"
#include "ctbMain.h"
#include "ctbDefs.h"
using namespace std;
int main(int argc, char **argv) {
string afname, cfname, pfname;
int id=0;
int af=0, cf=0, pf=0;
cout << " *** " << argc << endl;
for (int ia=0; ia<argc; ia++) {
if (strcmp(argv[ia],"-alias")==0) {
if (ia+1<argc) {
afname=argv[ia+1];
ia++;
af=1;
}
} else if (strcmp(argv[ia],"-config")==0) {
if (ia+1<argc) {
cfname=argv[ia+1];
ia++;
cf=1;
}
} else if (strcmp(argv[ia],"-par")==0) {
if (ia+1<argc) {
pfname=argv[ia+1];
ia++;
pf=1;
}
} else if (strcmp(argv[ia],"-id")==0) {
if (ia+1<argc) {
id=atoi(argv[ia+1]);
ia++;
}
}
}
cout << " *** " << endl;
sls::Detector *myDet = nullptr;
try {
/****** Create detector ****************/
myDet=new sls::Detector(id);
cout << "Created multi detector id " << id << endl;
if (cf) {
myDet->loadConfig(cfname);
cout << "Config file loaded successfully" << endl;
} else {
cout << "No config file specified" << endl;
}
cout << "hostname " << myDet->getHostname() << endl;
if (pf) {
myDet->loadParameters(pfname);
cout << "Loaded parameter file successfully" << endl;
} else{
cout << "No parameter file specified" << endl;
}
} CATCH_DISPLAY ("Could not create detector/ load config/parameters.", "ctbGui::main")
/***********Create GUI stuff *******************/
TApplication theApp("App",&argc,argv);
gStyle->SetDrawBorder(0);
gStyle->SetCanvasColor(kWhite);
gStyle->SetCanvasDefH(800);
gStyle->SetCanvasDefW(800);
gStyle->SetCanvasBorderMode(0);
gStyle->SetPadBorderMode(0);
gStyle->SetPaintTextFormat("5.2f");
gStyle->SetLineWidth(2);
gStyle->SetTextSize(1.1);
gStyle->SetLabelSize(0.04,"xy");
gStyle->SetTitleSize(0.05,"xy");
gStyle->SetTitleOffset(1.0,"x");
gStyle->SetTitleOffset(1.1,"y");
gStyle->SetPadTopMargin(0.15);
gStyle->SetPadRightMargin(0.15);
gStyle->SetPadBottomMargin(0.15);
gStyle->SetPadLeftMargin(0.15);
gStyle->SetLegendBorderSize(1);
gStyle->SetFrameBorderMode(0);
gStyle->SetFrameFillColor(kWhite);
// gStyle->SetLegendFillColor(kWhite);
gStyle->SetTitleFillColor(kWhite);
gStyle->SetFillColor(kWhite);
gStyle->SetStatFontSize(0.03);
gStyle->SetStatBorderSize(1);
gStyle->SetStatFormat("6.4g");
gStyle->SetStatX(0.95);
gStyle->SetStatY(0.95);
gStyle->SetStatW(0.2);
gStyle->SetStatH(0.2);
gStyle->SetTitleX(0.1);
gStyle->SetTitleY(0.95);
gStyle->SetTitleBorderSize(0);
gStyle->SetTitleFontSize(0.05);
gROOT->SetStyle("Default");
TColor::InitializeColors();
const Int_t NRGBs = 5;
const Int_t NCont = 90;
Double_t stops[NRGBs] = { 0.00, 0.34, 0.61, 0.84, 1.00 };
Double_t red[NRGBs] = { 0.00, 0.00, 0.87, 1.00, 0.51 };
Double_t green[NRGBs] = { 0.00, 0.81, 1.00, 0.20, 0.00 };
Double_t blue[NRGBs] = { 0.51, 1.00, 0.12, 0.00, 0.00 };
TColor::CreateGradientColorTable(NRGBs, stops, red, green, blue, NCont);
gStyle->SetNumberContours(NCont);
gROOT->ForceStyle();
ctbMain *mf=new ctbMain(gClient->GetRoot(), myDet);
cout << " *** " << argc << endl;
for (int ia=0; ia<argc; ia++)
cout << argv[ia] << endl;
cout << " *** " << endl;
if (af)
mf->loadAlias(afname);
else
cout << "no alias specified" << endl;
theApp.Run();
return 0;
}

17
ctbGui/ctbLinkDef.h Normal file
View File

@@ -0,0 +1,17 @@
// SPDX-License-Identifier: LGPL-3.0-or-other
// Copyright (C) 2021 Contributors to the SLS Detector Package
#pragma link C++ class ctbMain;
#pragma link C++ class ctbDacs;
#pragma link C++ class ctbDac;
#pragma link C++ class ctbSignals;
#pragma link C++ class ctbSignal;
#pragma link C++ class ctbAdc;
#pragma link C++ class ctbAdcs;
#pragma link C++ class ctbLoop;
#pragma link C++ class ctbWait;
#pragma link C++ class ctbPattern;
#pragma link C++ class ctbAcquisition;
#pragma link C++ class ctbPower;
#pragma link C++ class ctbPowers;
#pragma link C++ class ctbSlowAdc;
#pragma link C++ class ctbSlowAdcs;

588
ctbGui/ctbMain.cpp Normal file
View File

@@ -0,0 +1,588 @@
// SPDX-License-Identifier: LGPL-3.0-or-other
// Copyright (C) 2021 Contributors to the SLS Detector Package
#include <TApplication.h>
#include <TGClient.h>
#include <TCanvas.h>
#include <TF1.h>
#include <TRandom.h>
#include <TGButton.h>
#include <TRootEmbeddedCanvas.h>
#include <TGButtonGroup.h>
#include <TGNumberEntry.h>
#include <TGLabel.h>
#include <TList.h>
#include <TGFileDialog.h>
#include <TGComboBox.h>
#include <TH2F.h>
#include <TColor.h>
#include <TH1F.h>
#include <TGraphErrors.h>
#include <THStack.h>
#include <TGTab.h>
#include <TApplication.h>
#include <TGCanvas.h>
#include <stdlib.h>
#include <TGMenu.h>
#include <TGDockableFrame.h>
//#include <TGMenuBar.h>
//#include <TGPopupMenu.h>
#include <stdio.h>
#include <iostream>
#include <fstream>
#include <string>
#include "sls/Detector.h"
#include "ctbDefs.h"
#include "ctbMain.h"
#include "ctbDacs.h"
#include "ctbSlowAdcs.h"
#include "ctbPowers.h"
#include "ctbSignals.h"
#include "ctbPattern.h"
#include "ctbAdcs.h"
#include "ctbAcquisition.h"
//#include "ctbActions.h"
using namespace std;
ctbMain::ctbMain(const TGWindow *p, sls::Detector *det)
: TGMainFrame(p,800,800), pwrs(NULL), senses(NULL) {
myDet=det;
Connect("CloseWindow()", "ctbMain", this, "CloseWindow()");
// fMenuDock = new TGDockableFrame(this);
// AddFrame(fMenuDock, new TGLayoutHints(kLHintsExpandX, 0, 0, 1, 0));
// fMenuDock->SetWindowName("GuiTest Menu");
fMenuBarLayout = new TGLayoutHints(kLHintsTop | kLHintsExpandX);
fMenuBarItemLayout = new TGLayoutHints(kLHintsTop | kLHintsLeft, 0, 4, 0, 0);
fMenuBarHelpLayout = new TGLayoutHints(kLHintsTop | kLHintsRight);
fMenuFile = new TGPopupMenu(gClient->GetRoot());
int im=0;
fMenuFile->AddEntry("Open Alias", im++);
fMenuFile->AddEntry("Save Alias", im++);
fMenuFile->AddSeparator();
fMenuFile->AddEntry("Open Parameters", im++);
fMenuFile->AddEntry("Save Parameters", im++);
fMenuFile->AddSeparator();
fMenuFile->AddEntry("Open Configuration", im++);
fMenuFile->AddEntry("Save Configuration", im++);
fMenuFile->AddSeparator();
fMenuFile->AddEntry("Open Pattern", im++);
fMenuFile->AddEntry("Save Pattern", im++);
fMenuFile->AddSeparator();
fMenuFile->AddEntry("Exit", im++);
fMenuFile->Connect("Activated(Int_t)", "ctbMain", this,
"HandleMenu(Int_t)");
i_dacs=-1;
i_pwrs=-1;
i_senses=-1;
i_sig=-1;
i_adcs=-1;
i_pat=-1;
i_acq=-1;
int i_page=0;
TGVerticalFrame *vframe=new TGVerticalFrame(this, 800,1200); //main frame
fMenuBar = new TGMenuBar(vframe, 1, 1, kHorizontalFrame);
fMenuBar->AddPopup("&File", fMenuFile, fMenuBarItemLayout);
// fMenuBar->AddPopup("&Test", fMenuTest, fMenuBarItemLayout);
// fMenuBar->AddPopup("&View", fMenuView, fMenuBarItemLayout);
// fMenuBar->AddPopup("&Help", fMenuHelp, fMenuBarHelpLayout);
vframe->AddFrame(fMenuBar, fMenuBarLayout);
TGHorizontalFrame* hpage=new TGHorizontalFrame(vframe, 800,1200); //horizontal frame. Inside there should be the tab and the canvas
mtab=new TGTab(hpage, 1500, 1200); //tab!
// page=new TGVerticalFrame(mtab, 1500,1200);
cout << "DACS" << endl;
TGCompositeFrame *tf = mtab->AddTab("DACs");
TGVerticalFrame *page=new TGVerticalFrame(tf, 1500,1200);
tf->AddFrame(page, new TGLayoutHints(kLHintsExpandX | kLHintsExpandY, 10,10,10,1));
dacs=new ctbDacs(page, myDet);
i_dacs=i_page++;
cout << "power " << endl;
tf = mtab->AddTab("Power Supplies");
page=new TGVerticalFrame(tf, 1500,1200);
tf->AddFrame(page, new TGLayoutHints(kLHintsExpandX | kLHintsExpandY, 10,10,10,1));
pwrs=new ctbPowers(page, myDet);
i_pwrs=i_page++;
cout << "sense " << endl;
tf = mtab->AddTab("Sense");
page=new TGVerticalFrame(tf, 1500,1200);
tf->AddFrame(page, new TGLayoutHints(kLHintsExpandX | kLHintsExpandY, 10,10,10,1));
senses=new ctbSlowAdcs(page, myDet);
i_senses=i_page++;
cout << "signals " << endl;
tf = mtab->AddTab("Signals");
page=new TGVerticalFrame(tf, 1500,1200);
tf->AddFrame(page, new TGLayoutHints(kLHintsExpandX | kLHintsExpandY, 10,10,10,1));
sig=new ctbSignals(page, myDet);
sig->Connect("ToggledSignalPlot(Int_t)","ctbMain",this,"setSignalPlot(Int_t)");
i_sig=i_page++;
cout << "adcs " << endl;
tf = mtab->AddTab("ADCs");
page=new TGVerticalFrame(tf, 1500,1200);
tf->AddFrame(page, new TGLayoutHints(kLHintsExpandX | kLHintsExpandY, 10,10,10,1));
adcs=new ctbAdcs(page, myDet);
adcs->Connect("ToggledAdcPlot(Int_t)","ctbMain",this,"setADCPlot(Int_t)");
adcs->Connect("AdcEnable(Int_t)","ctbMain",this,"setADCEnable(Int_t)");
i_adcs=i_page++;
cout << "pattern" << endl;
tf = mtab->AddTab("Pattern");
page=new TGVerticalFrame(tf, 1500,1200);
tf->AddFrame(page, new TGLayoutHints(kLHintsExpandX | kLHintsExpandY, 10,10,10,1));
pat=new ctbPattern(page, myDet);
pat->Connect("patternFileChanged(const char*)","ctbMain",this,"setPatternFile(const char*)");
pat->Connect("patternCompilerChanged(const char*)","ctbMain",this,"setPatternCompiler(const char*)");
pat->Connect("analogSamplesChanged(const int)","ctbMain",this,"setAnalogSamples(int)");
pat->Connect("digitalSamplesChanged(const int)","ctbMain",this,"setDigitalSamples(int)");
pat->Connect("readoutModeChanged(int)","ctbMain",this,"setReadoutMode(int)");
i_pat=i_page++;
cout << "acquisition" << endl;
tf = mtab->AddTab("Acquisition");
page=new TGVerticalFrame(tf, 1500,1200);
tf->AddFrame(page, new TGLayoutHints(kLHintsExpandX | kLHintsExpandY, 10,10,10,1));
acq=new ctbAcquisition(page, myDet);
i_acq=i_page++;
// cout << "actions" << endl;
// tf = mtab->AddTab("Actions");
// page=new TGVerticalFrame(tf, 1500,1200);
// tf->AddFrame(page, new TGLayoutHints(kLHintsExpandX | kLHintsExpandY, 10,10,10,1));
// actions=new ctbActions(page, myDet);
// i_actions=i_page++;
cout << "tabs finished" << endl;
hpage->AddFrame(mtab,new TGLayoutHints(kLHintsExpandX | kLHintsExpandY, 10,10,10,1));
vframe->AddFrame(hpage,new TGLayoutHints(kLHintsExpandX | kLHintsExpandY, 10,10,10,1));
AddFrame(vframe,new TGLayoutHints(kLHintsExpandX | kLHintsExpandY, 10,10,10,1));
vframe->MapWindow();
hpage->MapWindow();
mtab->MapWindow();
page->MapWindow();
// Sets window name and shows the main frame
cout << "dockabel" << endl;
TGDockableFrame *fdock=new TGDockableFrame(hpage);
hpage->AddFrame(fdock, new TGLayoutHints(kLHintsBottom | kLHintsCenterX | kLHintsExpandX | kLHintsExpandY, 10,10,10,10));
fdock->MapWindow();
cout << "canvas" << endl;
// // Creates widgets of the example
fEcanvas = new TRootEmbeddedCanvas ("Ecanvas",fdock,800,800);//hpage,800,800);
//fEcanvas = new TRootEmbeddedCanvas ("Ecanvas",this,800,800);//hpage,800,800);
// fEcanvas->Resize();
// fEcanvas->GetCanvas()->Update();
//AddFrame(fEcanvas, new TGLayoutHints(kLHintsBottom | kLHintsCenterX | kLHintsExpandX | kLHintsExpandY, 10,10,10,10));
// // hpage->
fdock->AddFrame(fEcanvas, new TGLayoutHints(kLHintsBottom | kLHintsCenterX | kLHintsExpandX | kLHintsExpandY, 10,10,10,10));
fEcanvas->MapWindow();
acq->setCanvas(getCanvas());
hpage->MapSubwindows();
mtab->Connect("Selected(Int_t)","ctbMain",this,"tabSelected(Int_t)");
cout << "connect mtab" << endl;
try{
setReadoutMode(pat->getReadoutMode());
} CATCH_DISPLAY ("Could not get readout flags", "ctbPattern::getReadoutMode")
setADCEnable(adcs->setEnable());
setAnalogSamples(pat->getAnalogSamples());
setDigitalSamples(pat->getDigitalSamples());
tabSelected(0);
SetWindowName("CTB Gui");
MapSubwindows();
Resize(1500,1200);
MapWindow();
}
void ctbMain::CloseWindow() {
gApplication->Terminate();
}
TCanvas* ctbMain::getCanvas() {
return fEcanvas->GetCanvas();
}
void ctbMain::HandleMenu(Int_t id)
{
// Handle menu items.
switch (id) {
case 0: // fMenuFile->AddEntry("Open Alias", im++);
cout << "Open Alias" << endl;
{
static TString dir(".");
TGFileInfo fi;
//fi.fFileTypes = filetypes;
fi.fIniDir = StrDup(dir);
printf("fIniDir = %s\n", fi.fIniDir);
new TGFileDialog(gClient->GetRoot(), this, kFDOpen, &fi);
printf("Open file: %s (dir: %s)\n", fi.fFilename, fi.fIniDir);
// dir = fi.fIniDir;
if (fi.fFilename)
loadAlias(fi.fFilename);
}
break;
case 1: // fMenuFile->AddEntry("Save Alias", im++);
cout << "Save Alias" << endl;
{
static TString dir(".");
TGFileInfo fi;
//fi.fFileTypes = filetypes;
fi.fIniDir = StrDup(dir);
printf("fIniDir = %s\n", fi.fIniDir);
new TGFileDialog(gClient->GetRoot(), this, kFDSave, &fi);
printf("Save file: %s (dir: %s)\n", fi.fFilename, fi.fIniDir);
// dir = fi.fIniDir;
if (fi.fFilename)
saveAlias(fi.fFilename);
}
break;
case 2: //fMenuFile->AddEntry("Open Parameters", im++);
cout << "Open Parameters" << endl;
{
static TString dir(".");
TGFileInfo fi;
//fi.fFileTypes = filetypes;
fi.fIniDir = StrDup(dir);
printf("fIniDir = %s\n", fi.fIniDir);
new TGFileDialog(gClient->GetRoot(), this, kFDOpen, &fi);
printf("Open file: %s (dir: %s)\n", fi.fFilename, fi.fIniDir);
// dir = fi.fIniDir;
if (fi.fFilename)
loadParameters(fi.fFilename);
}
break;
case 3: // fMenuFile->AddEntry("Open Configuration", im++);
cout << "Open configuration" << endl;
{
static TString dir(".");
TGFileInfo fi;
//fi.fFileTypes = filetypes;
fi.fIniDir = StrDup(dir);
printf("fIniDir = %s\n", fi.fIniDir);
new TGFileDialog(gClient->GetRoot(), this, kFDOpen, &fi);
printf("Open file: %s (dir: %s)\n", fi.fFilename, fi.fIniDir);
// dir = fi.fIniDir;
if (fi.fFilename)
loadConfiguration(fi.fFilename);
}
break;
case 4: //fMenuFile->AddEntry("Open Pattern", im++);
cout << "Open pattern" << endl;
{
static TString dir(".");
TGFileInfo fi;
//fi.fFileTypes = filetypes;
fi.fIniDir = StrDup(dir);
printf("fIniDir = %s\n", fi.fIniDir);
new TGFileDialog(gClient->GetRoot(), this, kFDOpen, &fi);
printf("Open file: %s (dir: %s)\n", fi.fFilename, fi.fIniDir);
// dir = fi.fIniDir;
if (fi.fFilename)
loadParameters(fi.fFilename);
}
break;
case 5: //fMenuFile->AddEntry("Save Pattern", im++);
cout << "Save pattern" << endl;
{
static TString dir(".");
TGFileInfo fi;
//fi.fFileTypes = filetypes;
fi.fIniDir = StrDup(dir);
printf("fIniDir = %s\n", fi.fIniDir);
new TGFileDialog(gClient->GetRoot(), this, kFDSave, &fi);
printf("Open file: %s (dir: %s)\n", fi.fFilename, fi.fIniDir);
// dir = fi.fIniDir;
if (fi.fFilename)
savePattern(fi.fFilename);
}
break;
case 6: // fMenuFile->AddEntry("Exit", im++);
CloseWindow();
default:
printf("Menu item %d selected\n", id);
break;
}
}
int ctbMain::setADCPlot(Int_t i) {
// cout << "ADC " << i << " plot or color toggled" << endl;
// acq->setGraph(i,adcs->getGraph(i));
acq->setGraph(i,adcs->getEnabled(i),adcs->getColor(i));
return -1;
}
int ctbMain::setSignalPlot(Int_t i) {
// cout << "ADC " << i << " plot or color toggled" << endl;
// acq->setGraph(i,adcs->getGraph(i));
acq->setBitGraph(i,sig->getPlot(i),sig->getColor(i));
return -1;
}
void ctbMain::loadConfiguration(string fname) {
try{
myDet->loadConfig(fname);
} CATCH_DISPLAY ("Could not load config.", "ctbMain::loadConfiguration")
}
void ctbMain::loadParameters(string fname) {
try{
myDet->loadParameters(fname);
} CATCH_DISPLAY ("Could not load parameters.", "ctbMain::loadParameters")
}
void ctbMain::savePattern(string fname) {
try{
myDet->savePattern(fname);
} CATCH_DISPLAY ("Could not save pattern.", "ctbMain::savePattern")
}
int ctbMain::loadAlias(string fname) {
string line;
char aaaa[1000];
int i;
ifstream myfile (fname.c_str());
if (myfile.is_open())
{
while ( getline (myfile,line) )
{
// cout << line ;
if (sscanf(line.c_str(),"BIT%d",&i)>0) {
//cout << "*******" << line<< endl;
sig->setSignalAlias(line);
// cout << line ;
} else if (sscanf(line.c_str(),"DAC%d",&i)>0) {
dacs->setDacAlias(line);
// cout << "+++++++++" << line<< endl;
} else if (sscanf(line.c_str(),"ADC%d",&i)>0) {
adcs->setAdcAlias(line);
// cout << "---------" << line<< endl;
} // else
// cout << "<<<<<<<" << line << endl;
else if (sscanf(line.c_str(),"PAT%s",aaaa)>0) {
pat->setPatternAlias(line);
// cout << "---------" << line<< endl;
} else if (sscanf(line.c_str(),"V%s",aaaa)>0) {
if (pwrs) pwrs->setPwrAlias(line);
// cout << "+++++++++" << line<< endl;
} else if (sscanf(line.c_str(),"SENSE%d",&i)>0) {
if (senses) senses->setSlowAdcAlias(line);
// cout << "+++++++++" << line<< endl;
}
}
myfile.close();
}
else cout << "Unable to open file";
return 0;
}
int ctbMain::saveAlias(string fname) {
string line;
ofstream myfile (fname.c_str());
if (myfile.is_open())
{
//while ( getline (myfile,line) )
// {
// cout << line ;
//if (sscanf(line.c_str(),"BIT%d",&i)>0) {
//cout << "*******" << line<< endl;
myfile << sig->getSignalAlias();
// cout << line ;
// } else if (sscanf(line.c_str(),"DAC%d",&i)>0) {
myfile << dacs->getDacAlias();
if (pwrs) myfile << pwrs->getPwrAlias();
if (senses) myfile << senses->getSlowAdcAlias();
// cout << "+++++++++" << line<< endl;
// } else if (sscanf(line.c_str(),"ADC%d",&i)>0) {
myfile << adcs->getAdcAlias();
// cout << "---------" << line<< endl;
// } // else
// cout << "<<<<<<<" << line << endl;
myfile << pat->getPatternAlias();
//}
myfile.close();
}
else cout << "Unable to open file";
return 0;
}
void ctbMain::tabSelected(Int_t i) {
// cout << "Selected tab " << i << endl;
// cout << "Current tab is " << mtab->GetCurrent() << endl;
if (i==i_dacs) dacs->update();
else if (i==i_pwrs) pwrs->update();
else if (i==i_senses) ;//senses->update();
else if (i==i_sig) sig->update();
else if (i==i_adcs) adcs->update();
else if (i==i_pat) pat->update();
else if (i==i_acq) acq->update();
else if (i==i_acq) acq->update();
// else if (i==i_actions) actions->update();
else cout << "Unknown tab " << i << endl;
}
void ctbMain::setPatternFile(const char* t) {
acq->setPatternFile(t);
}
void ctbMain::setPatternCompiler(const char* t) {
acq->setPatternCompiler(t);
}
void ctbMain::setAnalogSamples(const int n) {
acq->setAnalogSamples(n);
}
void ctbMain::setDigitalSamples(const int n) {
acq->setDigitalSamples(n);
}
void ctbMain::setReadoutMode(int flags) {
acq->setReadoutMode(flags);
}
void ctbMain::setADCEnable(Int_t reg){
acq->setADCEnable(reg);
}

130
ctbGui/ctbMain.h Normal file
View File

@@ -0,0 +1,130 @@
// SPDX-License-Identifier: LGPL-3.0-or-other
// Copyright (C) 2021 Contributors to the SLS Detector Package
#ifndef CTBMAIN_H
#define CTBMAIN_H
#include <TGFrame.h>
class TRootEmbeddedCanvas;
class TGButtonGroup;
class TGVerticalFrame;
class TGHorizontalFrame;
class TGTextEntry;
class TGLabel;
class TGNumberEntry;
class TH2F;
class TGComboBox;
class TGCheckButton;
class THStack;
class TGraphErrors;
class TGTextButton;
class TGTab;
class TGMenuBar;
class TGPopupMenu;
class TGDockableFrame;
class TGLayoutHints;
class TGCanvas;
class TCanvas;
class ctbDacs;
class ctbSlowAdcs;
class ctbPowers;
class ctbSignals;
namespace sls
{
class Detector;
};
class ctbPattern;
class ctbAdcs;
class ctbAcquisition;
//class ctbActions;
#include <string>
using namespace std;
class ctbMain : public TGMainFrame {
private:
sls::Detector *myDet;
TRootEmbeddedCanvas *fEcanvas;
TRootEmbeddedCanvas *fModulecanvas;
TGButtonGroup *br;
TGTab *mtab;
ctbDacs *dacs;
int i_dacs;
ctbPowers *pwrs;
int i_pwrs;
ctbSlowAdcs *senses;
int i_senses;
ctbSignals *sig;
int i_sig;
ctbAdcs *adcs;
int i_adcs;
ctbPattern *pat;
int i_pat;
ctbAcquisition *acq;
int i_acq;
// ctbActions *actions;
int i_actions;
TGDockableFrame *fMenuDock;
TGMenuBar *fMenuBar;
TGPopupMenu *fMenuFile, *fMenuTest, *fMenuView, *fMenuHelp;
TGPopupMenu *fCascadeMenu, *fCascade1Menu, *fCascade2Menu;
TGPopupMenu *fMenuNew1, *fMenuNew2;
TGLayoutHints *fMenuBarLayout, *fMenuBarItemLayout, *fMenuBarHelpLayout;
TGCanvas *myCanvas;
public:
ctbMain(const TGWindow *p, sls::Detector *det);
int loadAlias(string fname);
int saveAlias(string fname);
void loadParameters(string fname);
void savePattern(string fname);
void loadConfiguration(string fname);
void tabSelected(Int_t);
int setADCPlot(Int_t);
int setSignalPlot(Int_t);
void CloseWindow();
void setPatternFile(const char* t);
void setPatternCompiler(const char* t);
void setAnalogSamples(const int);
void setDigitalSamples(const int);
void setReadoutMode(int);
void setADCEnable(Int_t);
void HandleMenu(Int_t);
TCanvas* getCanvas();
ClassDef(ctbMain,0)
};
#endif

1111
ctbGui/ctbPattern.cpp Normal file

File diff suppressed because it is too large Load Diff

181
ctbGui/ctbPattern.h Normal file
View File

@@ -0,0 +1,181 @@
// SPDX-License-Identifier: LGPL-3.0-or-other
// Copyright (C) 2021 Contributors to the SLS Detector Package
#ifndef CTBPATTERN_H
#define CTBPATTERN_H
#include <TGFrame.h>
#define NLOOPS 3
#define NWAITS 3
#define NADCS 32
#define PATLEN 1024
class TRootEmbeddedCanvas;
class TGButtonGroup;
class TGVerticalFrame;
class TGHorizontalFrame;
class TGTextEntry;
class TGLabel;
class TGNumberEntry;
class TH2F;
class TGComboBox;
class TGCheckButton;
class TGTextEntry;
class TGCheckButton;
class THStack;
class TGraphErrors;
class energyCalibration;
class TGTextButton;
class TGTab;
namespace sls
{
class Detector;
};
#include <string>
using namespace std;
class ctbLoop : public TGHorizontalFrame {
private:
TGNumberEntry *eLoopStartAddr;
TGNumberEntry *eLoopStopAddr;
TGNumberEntry *eLoopNumber;
int id;
sls::Detector *myDet;
public:
ctbLoop(TGGroupFrame *page, int i,sls::Detector *det);
void setNLoops();
void update();
ClassDef(ctbLoop,0)
};
class ctbWait : public TGHorizontalFrame {
private:
TGNumberEntry *eWaitAddr;
TGNumberEntry *eWaitTime;
int id;
sls::Detector *myDet;
public:
ctbWait(TGGroupFrame *page, int i,sls::Detector *det);
void setWaitTime();
void update();
ClassDef(ctbWait,0)
};
class ctbPattern : public TGGroupFrame {
private:
TGNumberEntry *eAdcClkFreq;
TGNumberEntry *eRunClkFreq;
TGNumberEntry *eDBitClkFreq;
TGNumberEntry *eAdcClkPhase;
TGNumberEntry *eDBitClkPhase;
//TGNumberEntry *eRunClkPhase;
TGNumberEntry *eStartAddr;
TGNumberEntry *eStopAddr;
TGNumberEntry *eFrames;
TGNumberEntry *ePeriod;
TGNumberEntry *eTriggers;
// TGNumberEntry *eMeasurements;
TGNumberEntry *eAdcPipeline;
TGNumberEntry *eDBitPipeline;
ctbLoop *eLoop[NLOOPS];
ctbWait *eWait[NWAITS];
TGTextEntry *patternCompiler;
TGTextEntry *patternFile;
TGTextButton *browseCompiler;
TGTextButton *browseFile;
TGNumberEntry *eAnalogSamples;
TGNumberEntry *eDigitalSamples;
TGCheckButton *cbAnalog;
TGCheckButton *cbDigital;
char pat[PATLEN*8];
sls::Detector *myDet;
public:
ctbPattern(TGVerticalFrame *page, sls::Detector *det);
void update();
void setAdcFreq();
void setRunFreq();
void setDBitFreq();
void setAdcPhase();
void setDBitPhase();
// void setRunPhase();
void setAdcPipeline();
void setDBitPipeline();
void setFrames();
void setTriggers();
// void setMeasurements();
void setPeriod();
void chooseCompiler();
void choosePattern();
string getCompiler();
string getPatternFile();
void setPatternAlias(string);
string getPatternAlias();
int getAnalogSamples();
void setAnalogSamples();
int getDigitalSamples();
void setDigitalSamples();
void setReadoutMode(Bool_t);
int getReadoutMode();
void setFile();
void setCompiler();
void patternFileChanged(const char*);
void patternCompilerChanged(const char*);
void analogSamplesChanged(const int t);
void digitalSamplesChanged(const int t);
void readoutModeChanged(int);
ClassDef(ctbPattern,0)
};
#endif

225
ctbGui/ctbPowers.cpp Normal file
View File

@@ -0,0 +1,225 @@
// SPDX-License-Identifier: LGPL-3.0-or-other
// Copyright (C) 2021 Contributors to the SLS Detector Package
#include <TGFrame.h>
#include <TGButtonGroup.h>
#include <TGNumberEntry.h>
#include <TGLabel.h>
#include <TList.h>
#include <stdio.h>
#include <iostream>
#include <fstream>
#include "ctbDefs.h"
#include "ctbDacs.h"
#include "ctbPowers.h"
#include "sls/Detector.h"
#include "sls/sls_detector_defs.h"
using namespace std;
ctbPower::ctbPower(TGGroupFrame* f, int i, sls::Detector* d)
: ctbDac(f, i, d)
{
cout << "****************************************************************power " << i << endl;
dacsUnit->SetOn(kTRUE);
dacsUnit->SetEnabled(kFALSE);
switch(i) {
case slsDetectorDefs::V_POWER_IO:
dacsLabel->SetText("VIO");
break;
case slsDetectorDefs::V_POWER_A:
dacsLabel->SetText("VA");
break;
case slsDetectorDefs::V_POWER_B:
dacsLabel->SetText("VB");
break;
case slsDetectorDefs::V_POWER_C:
dacsLabel->SetText("VC");
break;
case slsDetectorDefs::V_POWER_D:
dacsLabel->SetText("VD");
break;
case slsDetectorDefs::V_POWER_CHIP:
dacsLabel->SetText("VCHIP");
dacsLabel->SetEnabled(kFALSE);
break;
default:
dacsLabel->SetText("Bad index");
break;
};
TGTextEntry *e=dacsEntry->TGNumberEntry::GetNumberEntry();
e->Disconnect ("ReturnPressed()");
e->Disconnect ("ValueSet(Long_t)");
e->Connect("ReturnPressed()","ctbPower",this,"setValue()");
dacsEntry->Connect("ValueSet(Long_t)","ctbPower",this,"setValue(Long_t)");
};
string ctbPower::getLabel() {
ostringstream line;
switch (id) {
case slsDetectorDefs::V_POWER_IO:
line << "VIO";
break;
case slsDetectorDefs::V_POWER_A:
line << "VA";
break;
case slsDetectorDefs::V_POWER_B:
line << "VB";
break;
case slsDetectorDefs::V_POWER_C:
line << "VC";
break;
case slsDetectorDefs::V_POWER_D:
line << "VD";
break;
case slsDetectorDefs::V_POWER_CHIP:
line << "VCHIP";
break;
default:
line << "VBAD";
break;
}
line << " " << dacsLabel->GetText() << endl;
return line.str();
}
void ctbPower::setValue(Long_t a) {ctbPower::setValue();}
void ctbPower::setValue() {
cout << "***************************Setting power " << dacsEntry->GetIntNumber() << " " << id << " " << 1 << endl;
try {
myDet->setVoltage(static_cast<slsDetectorDefs::dacIndex>(id), dacsEntry->GetIntNumber());
} CATCH_DISPLAY ("Could not set power " + to_string(id) + ".", "ctbPower::setValue")
getValue();
}
int ctbPower::getValue() {
try {
int val = myDet->getVoltage(static_cast<slsDetectorDefs::dacIndex>(id)).tsquash("Different values");
cout << "****************************Getting power " << val << " " << id << " " << 1 << endl;
dacsValue->SetText(to_string(val).c_str());
if (val > 0) {
if (id != static_cast<int>(slsDetectorDefs::V_POWER_CHIP))
dacsLabel->SetOn(kTRUE);
} else {
dacsLabel->SetOn(kFALSE);
}
return val;
} CATCH_DISPLAY ("Could not get power " + to_string(id) + ".", "ctbPower::getValue")
return -1;
}
ctbPowers::ctbPowers(TGVerticalFrame* page, sls::Detector* det) : TGGroupFrame(page,"Power Supplies",kVerticalFrame) , myDet(det){
SetTitlePos(TGGroupFrame::kLeft);
page->AddFrame(this,new TGLayoutHints( kLHintsTop | kLHintsExpandX , 10,10,10,10));
MapWindow();
// cout << "window mapped " << endl;
for (int idac=0; idac<NPOWERS; idac++) {
dacs[idac]=new ctbPower(this, slsDetectorDefs::V_POWER_A+idac, myDet);
}
}
int ctbPowers::setPwrAlias(string line) {
int is=-1;
char tit[100];
if (sscanf(line.c_str(),"VA %s",tit)) {
dacs[0]->setLabel(tit,1);
is=0;
}
if (sscanf(line.c_str(),"VB %s",tit)) {
dacs[1]->setLabel(tit,1);
is=1;
}
if (sscanf(line.c_str(),"VC %s",tit)) {
dacs[2]->setLabel(tit,1);
is=2;
}
if (sscanf(line.c_str(),"VD %s",tit)) {
dacs[3]->setLabel(tit,1);
is=3;
}
if (sscanf(line.c_str(),"VIO %s",tit)) {
dacs[4]->setLabel(tit,1);
is=4;
}
if (sscanf(line.c_str(),"VCHIP %s",tit)) {
dacs[5]->setLabel(tit,1);
is=5;
}
return is;
}
string ctbPowers::getPwrAlias() {
ostringstream line;
for (int i=0; i<NPOWERS; i++)
line << dacs[i]->getLabel() << endl;
return line.str();
}
string ctbPowers::getPwrParameters() {
ostringstream line;
line << "v_a" << " " << dacs[0]->getValue() << " mv" << endl;
line << "v_b" << " " << dacs[1]->getValue() << " mv" << endl;
line << "v_c" << " " << dacs[2]->getValue() << " mv" << endl;
line << "v_d" << " " << dacs[3]->getValue() << " mv" << endl;
line << "v_io" << " " << dacs[4]->getValue() << " mv" << endl;
line << "v_chip" << " " << dacs[5]->getValue() << " mv" << endl;
// for (int i=0; i<POWERS; i++) {
// //line << "dacs:" << i << " " << dacs[i]->getValue << endl;
// line << "dac:" << i << " " << dacs[i]->getValue() << endl;
// }
return line.str();
}
void ctbPowers::update() {
for (int idac=0; idac<NPOWERS; idac++) {
dacs[idac]->getValue();
}
}

69
ctbGui/ctbPowers.h Normal file
View File

@@ -0,0 +1,69 @@
// SPDX-License-Identifier: LGPL-3.0-or-other
// Copyright (C) 2021 Contributors to the SLS Detector Package
#ifndef CTBPOWERS_H
#define CTBPOWERS_H
#include <TGFrame.h>
#define NPOWERS 6
class TGTextEntry;
class TGLabel;
class TGNumberEntry;
class TGCheckButton;
namespace sls
{
class Detector;
};
#include <string>
using namespace std;
class ctbPower : public ctbDac {
public:
ctbPower(TGGroupFrame* f, int i, sls::Detector* d);
string getLabel();
int getValue();
void setValue();
void setValue(Long_t);
ClassDef(ctbPower,0)
};
class ctbPowers : public TGGroupFrame
{
private:
ctbPower *dacs[NPOWERS];
sls::Detector* myDet;
public:
//ctbPowers();
ctbPowers(TGVerticalFrame*, sls::Detector*);
int setPwrAlias(string);
string getPwrAlias();
string getPwrParameters();
void update();
ClassDef(ctbPowers,0)
};
#endif

543
ctbGui/ctbSignals.cpp Normal file
View File

@@ -0,0 +1,543 @@
// SPDX-License-Identifier: LGPL-3.0-or-other
// Copyright (C) 2021 Contributors to the SLS Detector Package
#include <TApplication.h>
#include <TGClient.h>
#include <TCanvas.h>
#include <TF1.h>
#include <TRandom.h>
#include <TGButton.h>
#include <TRootEmbeddedCanvas.h>
#include <TGButtonGroup.h>
#include <TGNumberEntry.h>
#include <TGLabel.h>
#include <TList.h>
#include <TGFileDialog.h>
#include <TGComboBox.h>
#include <TH2F.h>
#include <TColor.h>
#include <TH1F.h>
#include <TGraphErrors.h>
#include <THStack.h>
#include <TGTab.h>
#include <stdio.h>
#include <iostream>
#include <fstream>
#include <TGButton.h>
#include <TRootEmbeddedCanvas.h>
#include <TGButtonGroup.h>
#include <TGNumberEntry.h>
#include <TGLabel.h>
#include <stdio.h>
#include <iostream>
#include <fstream>
#include <TColor.h>
#include <TGColorSelect.h>
#include "ctbSignals.h"
#include "ctbDefs.h"
#include "sls/Detector.h"
using namespace std;
//#define DEFAULTFN "run_0.encal"
ctbSignal::ctbSignal(TGFrame *page, int i, sls::Detector *det)
: TGHorizontalFrame(page, 800,50), myDet(det), id(i), hsig(NULL) {
TGHorizontalFrame *hframe=this;
char tit[100];
sprintf(tit, "BIT%d ",id);
sLabel= new TGLabel(hframe, tit);
hframe->AddFrame( sLabel,new TGLayoutHints(kLHintsTop | kLHintsLeft| kLHintsExpandX, 1, 1, 1, 1));
sLabel->MapWindow();
sLabel->SetTextJustify(kTextLeft);
sOutput= new TGCheckButton(hframe, "Out");
hframe->AddFrame( sOutput,new TGLayoutHints(kLHintsTop | kLHintsLeft| kLHintsExpandX, 1, 1, 1, 1));
sOutput->MapWindow();
sOutput->Connect("Toggled(Bool_t)","ctbSignal",this,"ToggledOutput(Bool_t)");
sDbitList= new TGCheckButton(hframe, "DB List");
hframe->AddFrame( sDbitList,new TGLayoutHints(kLHintsTop | kLHintsLeft| kLHintsExpandX, 1, 1, 1, 1));
sDbitList->MapWindow();
sDbitList->Connect("Toggled(Bool_t)","ctbSignal",this,"ToggledDbitList(Bool_t)");
sPlot= new TGCheckButton(hframe, "Plot");
hframe->AddFrame( sPlot,new TGLayoutHints(kLHintsTop | kLHintsLeft| kLHintsExpandX, 1, 1, 1, 1));
sPlot->MapWindow();
sPlot->Connect("Toggled(Bool_t)","ctbSignal",this,"ToggledPlot(Bool_t)");
fColorSel = new TGColorSelect(hframe, id+1, 0);
fColorSel->Connect("ColorSelected(Pixel_t)","ctbSignal",this,"ColorChanged(Pixel_t)");
hframe->AddFrame(fColorSel, new TGLayoutHints(kLHintsTop |
kLHintsLeft, 2, 0, 2, 2));
fColorSel->SetColor(TColor::Number2Pixel(id+1));
ToggledOutput(kFALSE);
ToggledPlot(kFALSE);
// if (id==63) {
// sOutput->SetOn(kTRUE);
// sOutput->SetEnabled(kFALSE);
// }
// #ifdef CTB
// if (id==62) {
// sOutput->SetOn(kTRUE);
// sOutput->SetEnabled(kFALSE);
// }
// // if (id>=32 && id<48)
// // fixOutput(1);
// // else if (id>=48 && id<64)
// // fixOutput(0);
// #endif
}
int ctbSignal::setSignalAlias(char *tit, int plot, int col) {
if (tit)
sLabel->SetText(tit);
if (plot>0) {
sPlot->SetOn(kTRUE,kTRUE);
} else if (plot==0)
sPlot->SetOn(kFALSE,kTRUE);
if (col>=0)
fColorSel->SetColor(col);//TColor::Number2Pixel(col+1));
fColorSel->SetEnabled(sPlot->IsOn());
return 0;
}
string ctbSignal::getSignalAlias() {
ostringstream oss;
oss << "BIT" << dec << id << " " << sLabel->GetText()->Data() << " " << sPlot->IsOn() << hex << " " << fColorSel->GetColor() << endl;
return oss.str();
}
int ctbSignal::setOutput(Long64_t r) {
// cout << hex << r << dec <<endl;
Long64_t mask=((Long64_t)1<<id);
if (r&mask)
sOutput->SetOn(kTRUE,kTRUE);
else
sOutput->SetOn(kFALSE,kTRUE);
return sOutput->IsOn();
}
int ctbSignal::fixOutput(int i) {
if (i) {
sPlot->SetOn(kFALSE);
//sClock->SetOn(kFALSE,kTRUE);
sOutput->SetOn(kTRUE);
// sPlot->SetEnabled(kFALSE);
// sClock->SetEnabled(kTRUE);
} else {
sOutput->SetOn(kFALSE,kTRUE);
// sClock->SetOn(kFALSE);
// sClock->SetEnabled(kFALSE);
sPlot->SetEnabled(kTRUE);
}
sOutput->SetEnabled(kFALSE);
return 0;
}
int ctbSignal::setDbitList(Long64_t r) {
if (r)
sDbitList->SetOn(kTRUE,kFALSE);
else
sDbitList->SetOn(kFALSE,kFALSE);
return sDbitList->IsOn();
}
int ctbSignal::isDbitList() { return sDbitList->IsOn();}
int ctbSignal::isOutput() { return sOutput->IsOn();}
int ctbSignal::isPlot() { return sPlot->IsOn();}
Pixel_t ctbSignal::getColor(){return fColorSel->GetColor();}
void ctbSignal::ToggledOutput(Bool_t b) {
ToggledSignalOutput(id);
if (b) {
// sClock->SetEnabled(kTRUE);
sPlot->SetOn(kFALSE);
// sPlot->SetEnabled(kFALSE);
fColorSel->SetEnabled(kFALSE);
} else {
// sClock->SetEnabled(kFALSE);
// sClock->SetOn(kFALSE);
sPlot->SetEnabled(kTRUE);
if ( sPlot->IsOn())
fColorSel->SetEnabled(kFALSE);
else
fColorSel->SetEnabled(kTRUE);
}
}
void ctbSignal::ToggledDbitList(Bool_t b){
Long_t mask=id;
ToggledSignalDbitList(mask);
}
void ctbSignal::ToggledPlot(Bool_t b){
Long_t mask=b<<id;
ToggledSignalPlot(mask);
fColorSel->SetEnabled(b);
}
void ctbSignal::ColorChanged(Pixel_t p){
ToggledSignalPlot(id);
}
void ctbSignal::ToggledSignalOutput(Int_t b) {
cout << "Toggle signal " << id << " " << b << " " << sOutput->IsOn() <<endl;;
Emit("ToggledSignalOutput(Int_t)", id);
}
void ctbSignal::ToggledSignalDbitList(Int_t b){
cout << "Toggle dbitlist " << id << " " << b << endl;;
Emit("ToggledSignalDbitList(Int_t)", id);
}
void ctbSignal::ToggledSignalPlot(Int_t b){
Emit("ToggledSignalPlot(Int_t)", id);
}
ctbSignals::ctbSignals(TGVerticalFrame *page, sls::Detector *det)
: TGGroupFrame(page,"IO Signals",kVerticalFrame), myDet(det) {
SetTitlePos(TGGroupFrame::kLeft);
page->AddFrame(this,new TGLayoutHints( kLHintsTop | kLHintsExpandX , 10,10,10,10));
MapWindow();
TGHorizontalFrame *hframe;
TGHorizontalFrame* hhframe=new TGHorizontalFrame(this, 800,800);
AddFrame(hhframe,new TGLayoutHints(kLHintsTop | kLHintsExpandX , 1,1,1,1));
hhframe->MapWindow();
TGVerticalFrame *vframe;
int idac=0;
for (idac=0; idac<NSIGNALS; idac++) {
if (idac%((NSIGNALS+2)/2)==0) {
vframe=new TGVerticalFrame(hhframe, 400,800);
hhframe->AddFrame(vframe,new TGLayoutHints(kLHintsTop | kLHintsExpandX , 1,1,1,1));
vframe->MapWindow();
}
signals[idac]=new ctbSignal(vframe,idac,myDet);
signals[idac]->Connect("ToggledSignalOutput(Int_t)","ctbSignals",this,"ToggledOutReg(Int_t)");
signals[idac]->Connect("ToggledSignalDbitList(Int_t)","ctbSignals",this,"ToggledDbitList(Int_t)");
signals[idac]->Connect("ToggledSignalPlot(Int_t)","ctbSignals",this,"ToggledPlot(Int_t)");
vframe->AddFrame(signals[idac],new TGLayoutHints(kLHintsTop | kLHintsExpandX , 1,1,1,1));
signals[idac]->MapWindow();
}
hframe=new TGHorizontalFrame(vframe, 800,50);
vframe->AddFrame(hframe,new TGLayoutHints(kLHintsTop | kLHintsExpandX , 1,1,1,1));
hframe->MapWindow();
TGLabel *label= new TGLabel(hframe, "IO Control Register: ");
hframe->AddFrame(label,new TGLayoutHints(kLHintsTop | kLHintsLeft| kLHintsExpandX, 1, 1, 1, 1));
label->MapWindow();
label->SetTextJustify(kTextLeft);
eIOCntrlRegister = new TGNumberEntry(hframe, 0, 16,999, TGNumberFormat::kNESHex,
TGNumberFormat::kNEANonNegative,
TGNumberFormat::kNELNoLimits);
hframe->AddFrame(eIOCntrlRegister,new TGLayoutHints(kLHintsTop | kLHintsExpandX, 1, 1, 1, 1));
eIOCntrlRegister->MapWindow();
eIOCntrlRegister->Resize(150,30);
hframe=new TGHorizontalFrame(vframe, 800,50);
vframe->AddFrame(hframe,new TGLayoutHints(kLHintsTop | kLHintsExpandX , 1,1,1,1));
hframe->MapWindow();
label= new TGLabel(hframe, "DBit Offset: ");
hframe->AddFrame(label,new TGLayoutHints(kLHintsTop | kLHintsLeft| kLHintsExpandX, 1, 1, 1, 1));
label->MapWindow();
label->SetTextJustify(kTextLeft);
eDbitOffset = new TGNumberEntry(hframe, 0, 9,999, TGNumberFormat::kNESInteger,
TGNumberFormat::kNEANonNegative,
TGNumberFormat::kNELNoLimits);
hframe->AddFrame(eDbitOffset,new TGLayoutHints(kLHintsTop | kLHintsExpandX, 1, 1, 1, 1));
eDbitOffset->MapWindow();
eDbitOffset->Resize(150,30);
TGTextEntry *e= eDbitOffset->TGNumberEntry::GetNumberEntry();
e->Connect("ReturnPressed()","ctbSignals",this,"setDbitOffset()");
e->Connect("ValueSet(Long_t)","ctbSignals",this,"setDbitOffset(Long_t)");
}
int ctbSignals::setSignalAlias(string line) {
int is=-1, plot=0, col=-1;
char tit[100];
int narg=sscanf(line.c_str(),"BIT%d %s %d %d",&is,tit,&plot,&col);
if (narg<2)
return -1;
if (is>=0 && is<NIOSIGNALS) {
signals[is]->setSignalAlias(tit,plot,col);
}
return is;
}
string ctbSignals::getSignalAlias() {
ostringstream oss;
for (int is=0; is<NIOSIGNALS; is++)
oss << signals[is]->getSignalAlias() << endl;
return oss.str();
}
void ctbSignals::update() {
try {
Long64_t oreg = static_cast<Long64_t>(myDet->getPatternIOControl().tsquash("Different values"));
cout << hex << oreg << dec << endl;
for (int idac=0; idac<NIOSIGNALS; idac++) {
signals[idac]->setOutput(oreg);
}
} CATCH_DISPLAY ("Could not get patternIOcontrol.", "ctbSignals::update")
if (myDet->getDetectorType().squash() == slsDetectorDefs::MOENCH) {
// enable all
for (int is=0; is<64; is++) {
signals[is]->setDbitList(1);
}
eDbitOffset->SetNumber(0);
}
// ctb
else {
try {
auto dbitlist = myDet->getRxDbitList().tsquash("Different values");
// enable all
if (dbitlist.empty()) {
for (int is=0; is<64; is++) {
signals[is]->setDbitList(1);
}
}
else {
// disable all
for (int is=0; is<64; is++) {
signals[is]->setDbitList(0);
}
// enable selected
for (const auto &value : dbitlist) {
signals[value]->setDbitList(1);
}
}
} CATCH_DISPLAY ("Could not get receiver dbit list.", "ctbSignals::update")
try {
auto val = myDet->getRxDbitOffset().tsquash("Different values");
eDbitOffset->SetNumber(val);
} CATCH_DISPLAY ("Could not get receiver dbit offset.", "ctbSignals::update")
}
}
string ctbSignals::getSignalParameters() {
try {
auto val = myDet->getPatternIOControl().tsquash("Different values");
ostringstream line;
line << "patioctrl " << hex << val << dec << endl;
return line.str();
} CATCH_DISPLAY ("Could not get patternIOcontrol.", "ctbSignals::getSignalParameters")
return ("");
}
void ctbSignals::ToggledOutReg(Int_t mask) {
try {
Long64_t oreg = static_cast<Long64_t>(myDet->getPatternIOControl().tsquash("Different values"));
Long64_t m=((Long64_t)1)<<mask;
cout << dec << sizeof(Long64_t) << " " << mask << " " << hex << m << " ioreg " << oreg;
if (signals[mask]->isOutput()) {
cout << " or " << m ;
oreg|=m;
} else {
cout << " not " << ~m ;
oreg&=~m;
}
cout << " after " << oreg << endl;
myDet->setPatternIOControl(static_cast<uint64_t>(oreg));
oreg = static_cast<Long64_t>(myDet->getPatternIOControl().tsquash("Different values"));
cout << dec << sizeof(Long64_t) << " " << mask << " " << hex << m << " ioreg " << oreg << endl;
eIOCntrlRegister->SetText(to_string(oreg).c_str());
} CATCH_DISPLAY ("Could not get/set patternIOcontrol.", "ctbSignals::ToggledOutReg")
}
void ctbSignals::ToggledDbitList(Int_t mask){
try {
auto dbitlist = myDet->getRxDbitList().tsquash("Different values");
// anyway all enabled
if ((dbitlist.empty()) && (signals[mask]->isDbitList())) {
;
}
// set the dbitlist
else {
std::vector <int> new_dbitlist;
for (int is=0; is<64; is++) {
if (signals[is]->isDbitList()){
new_dbitlist.push_back(is);
cout << is << " " << new_dbitlist.size() - 1 << endl;
}
}
if (new_dbitlist.size() > 64)
new_dbitlist.clear();
myDet->setRxDbitList(new_dbitlist);
// get list again
dbitlist = myDet->getRxDbitList().tsquash("Different values");
}
// enable all
if (dbitlist.empty()) {
for (int is=0; is<64; is++) {
signals[is]->setDbitList(1);
}
}
else {
// disable all
for (int is=0; is<64; is++) {
signals[is]->setDbitList(0);
}
// enable selected
for (const auto &value : dbitlist) {
signals[value]->setDbitList(1);
}
}
} CATCH_DISPLAY ("Could not get/set receiver dbit list.", "ctbSignals::ToggledDbitList")
}
void ctbSignals::ToggledPlot(Int_t b) {
Emit("ToggledSignalPlot(Int_t)", b);
}
void ctbSignals::ToggledSignalPlot(Int_t b) {
Emit("ToggledSignalPlot(Int_t)", b);
}
Pixel_t ctbSignals::getColor(int i){
if (i>=0 && i<NSIGNALS)
return signals[i]->getColor();
return static_cast<Pixel_t>(-1);
}
int ctbSignals::getPlot(int i){
if (i>=0 && i<NSIGNALS)
return signals[i]->isPlot();
return -1;
};
void ctbSignals::setDbitOffset(Long_t) {
setDbitOffset();
}
void ctbSignals::setDbitOffset(){
try {
myDet->setRxDbitOffset(eDbitOffset->GetNumber());
} CATCH_DISPLAY ("Could not set receiver dbit offset.", "ctbSignals::setDbitOffset")
}

123
ctbGui/ctbSignals.h Normal file
View File

@@ -0,0 +1,123 @@
// SPDX-License-Identifier: LGPL-3.0-or-other
// Copyright (C) 2021 Contributors to the SLS Detector Package
#ifndef CTBSIGNALS_H
#define CTBSIGNALS_H
#include <TGFrame.h>
#define NSIGNALS 64
#define NIOSIGNALS 64 //for moench board was 52
#define ADCLATCH 63
#define DIGSIGLATCH 62
class TGTextEntry;
class TGLabel;
class TGNumberEntry;
class TGCheckButton;
class TH1I;
class TGTextButton;
class TGColorSelect;
class TGNumberEntry;
namespace sls
{
class Detector;
};
class ctbSignal;
#include <string>
using namespace std;
class ctbSignal : public TGHorizontalFrame {
// RQ_OBJECT("ctbSignal")
private:
TGLabel *sLabel;
TGCheckButton *sOutput;
TGCheckButton *sDbitList;
TGCheckButton *sPlot;
TGLabel *sValue;
TGNumberEntry *sEntry;
TGColorSelect *fColorSel;
sls::Detector *myDet;
Int_t id;
TH1I *hsig;
public:
ctbSignal(TGFrame *page, int i, sls::Detector *det);
int setSignalAlias(char *tit, int plot, int col);
string getSignalAlias();
TH1I *getPlot() {return hsig;};
int setOutput(Long64_t);
int fixOutput(int);
int setDbitList(Long64_t);
void ToggledOutput(Bool_t);
void ToggledDbitList(Bool_t);
void ToggledPlot(Bool_t);
void ColorChanged(Pixel_t);
int isDbitList();
int isOutput();
int isPlot();
Pixel_t getColor();
void ToggledSignalOutput(Int_t); //*SIGNAL*
void ToggledSignalDbitList(Int_t); //*SIGNAL*
void ToggledSignalPlot(Int_t); //*SIGNAL*
ClassDef(ctbSignal,0)
};
class ctbSignals : public TGGroupFrame {
private:
ctbSignal *signals[NSIGNALS];
TGNumberEntry *eIOCntrlRegister;
TGNumberEntry *eDbitOffset;
sls::Detector *myDet;
public:
ctbSignals(TGVerticalFrame *page, sls::Detector *det);
int setSignalAlias(string line);
string getSignalAlias();
int getPlot(int);
Pixel_t getColor(int);
void update();
// void saveParameters();
string getSignalParameters();
//void setDbitList(Int_t);
void setDbitOffset(Long_t);
void setDbitOffset();
void ToggledOutReg(Int_t);
void ToggledDbitList(Int_t);
void ToggledPlot(Int_t);
void ToggledSignalPlot(Int_t); //*SIGNAL*
ClassDef(ctbSignals,0)
};
#endif

184
ctbGui/ctbSlowAdcs.cpp Normal file
View File

@@ -0,0 +1,184 @@
// SPDX-License-Identifier: LGPL-3.0-or-other
// Copyright (C) 2021 Contributors to the SLS Detector Package
#include <stdio.h>
#include <iostream>
#include <fstream>
#include <TGTextEntry.h>
#include <TGLabel.h>
#include <TGNumberEntry.h>
#include <TGButton.h>
#include "ctbSlowAdcs.h"
#include "ctbDefs.h"
#include "sls/Detector.h"
#include "sls/sls_detector_defs.h"
using namespace std;
ctbSlowAdc::ctbSlowAdc(TGGroupFrame *page, int idac, sls::Detector *det) : TGHorizontalFrame(page, 800,50) , id(idac), myDet(det) {
TGHorizontalFrame *hframe=this;
page->AddFrame(hframe,new TGLayoutHints(kLHintsTop | kLHintsExpandX , 1,1,1,1));
MapWindow();
char tit[100];
sprintf(tit, "SENSE %d:",idac-1000);
dacsLabel= new TGLabel(hframe, tit);// new TGLabel(hframe, tit);
hframe->AddFrame(dacsLabel,new TGLayoutHints(kLHintsTop | kLHintsLeft| kLHintsExpandX, 5, 5, 5, 5));
dacsLabel->MapWindow();
dacsLabel->SetTextJustify(kTextLeft);
sprintf(tit, "xxx");
dacsValue= new TGLabel(hframe, tit);
hframe->AddFrame( dacsValue,new TGLayoutHints(kLHintsTop | kLHintsLeft| kLHintsExpandX, 5, 5, 5, 5));
dacsValue->MapWindow();
dacsValue->SetTextJustify(kTextLeft);
TGTextButton *b= new TGTextButton(hframe, "Update");
hframe->AddFrame( b,new TGLayoutHints(kLHintsTop | kLHintsLeft| kLHintsExpandX, 5, 5, 5, 5));
b->MapWindow();
b->SetTextJustify(kTextLeft);
b->Connect("Clicked()","ctbSlowAdc",this,"getValue()");
}
int ctbSlowAdc::setLabel(char *tit) {
if(tit)
dacsLabel->SetText(tit);
return id;
}
string ctbSlowAdc::getLabel() {
ostringstream line;
line << dacsLabel->GetText() << endl;
// line << "DAC" << dec << id << " " << dacsUnit->IsOn() << endl;
return line.str();
}
int ctbSlowAdc::getValue() {
try {
std::string s;
// temp
if (id == static_cast<int>(slsDetectorDefs::SLOW_ADC_TEMP)) {
int val = myDet->getTemperature(static_cast<slsDetectorDefs::dacIndex>(id)).tsquash("Different values");
cout << "slow adc temp" << " " << val << endl;
s = to_string(val) + " " + to_string(0x00b0) + "C";//<2F>C
dacsValue->SetText(s.c_str());
return val;
}
// mv
else {
int val = myDet->getSlowADC(static_cast<slsDetectorDefs::dacIndex>(id)).tsquash("Different values");
cout << "slow adc " << id << " " << val << endl;
s = to_string(val) + " mV";
dacsValue->SetText(s.c_str());
return val;
}
} CATCH_DISPLAY ("Could not get slow dac " + to_string(id) + ".", "ctbSlowAdc::getValue")
return -1;
}
ctbSlowAdcs::ctbSlowAdcs(TGVerticalFrame *page, sls::Detector *det) : TGGroupFrame(page,"Sense",kVerticalFrame) , myDet(det){
SetTitlePos(TGGroupFrame::kLeft);
page->AddFrame(this,new TGLayoutHints( kLHintsTop | kLHintsExpandX , 10,10,10,10));
MapWindow();
// cout << "window mapped " << endl;
for (int idac=0; idac<NSLOWADCS + 1; idac++) {
adcs[idac]=new ctbSlowAdc(this, idac+1000, myDet);
}
adcs[NSLOWADCS]->setLabel((char*)"Temperature");
}
int ctbSlowAdcs::setSlowAdcAlias(string line) {
int is=-1, mv=0;
char tit[100];
int narg=sscanf(line.c_str(),"SENSE%d %s %d",&is,tit,&mv);
if (narg<2)
return -1;
if (is>=0 && is<NSLOWADCS)
adcs[is]->setLabel(tit);
return is;
}
string ctbSlowAdcs::getSlowAdcAlias() {
ostringstream line;
for (int i=0; i<NSLOWADCS; i++)
line << adcs[i]->getLabel() << endl;
return line.str();
}
string ctbSlowAdcs::getAdcParameters() {
ostringstream line;
for (int i=0; i<NSLOWADCS; i++) {
//line << "dacs:" << i << " " << dacs[i]->getValue << endl;
line << "adc:" << i << " " << adcs[i]->getValue() << endl;
}
line << "adc:-1" << adcs[NSLOWADCS]->getValue() << endl;
return line.str();
}
void ctbSlowAdcs::update() {
for (int idac=0; idac<NSLOWADCS+1; idac++) {
adcs[idac]->getValue();
}
}

80
ctbGui/ctbSlowAdcs.h Normal file
View File

@@ -0,0 +1,80 @@
// SPDX-License-Identifier: LGPL-3.0-or-other
// Copyright (C) 2021 Contributors to the SLS Detector Package
#ifndef CTBSLOWADCS_H
#define CTBSLOWADCS_H
#include <TGFrame.h>
//#define NDACS 16
#define NSLOWADCS 8
class TGTextEntry;
class TGLabel;
class TGNumberEntry;
class TGCheckButton;
class TGTextButton;
namespace sls
{
class Detector;
};
#include <string>
using namespace std;
class ctbSlowAdc : public TGHorizontalFrame {
protected:
// TGLabel *dacsLabel;
// TGNumberEntry *dacsEntry;
// TGCheckButton *dacsUnit;
TGLabel *dacsLabel;
TGLabel *dacsValue;
int id;
sls::Detector* myDet;
public:
ctbSlowAdc(TGGroupFrame*, int , sls::Detector*);
int getValue();
int setLabel(char *tit);
string getLabel();
ClassDef(ctbSlowAdc,0)
};
class ctbSlowAdcs : public TGGroupFrame {
private:
ctbSlowAdc *adcs[NSLOWADCS+1];
sls::Detector* myDet;
public:
ctbSlowAdcs(TGVerticalFrame *page, sls::Detector*);
int setSlowAdcAlias(string line);
// int setDacAlias(string line);
string getSlowAdcAlias();
string getAdcParameters();
void update();
ClassDef(ctbSlowAdcs,0)
};
#endif

View File

@@ -11,8 +11,7 @@ add_executable(gendoc src/gendoc.cpp)
# This is a bit hacky, but better than exposing stuff?
target_include_directories(gendoc PRIVATE ${PROJECT_SOURCE_DIR}/slsDetectorSoftware/src)
target_link_libraries(gendoc PRIVATE
slsDetectorStatic
slsDetectorShared
)
set_target_properties(gendoc PROPERTIES
RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin
@@ -41,9 +40,7 @@ set(SPHINX_SOURCE_FILES
src/pydetector.rst
src/pyenums.rst
src/pyexamples.rst
src/pyPatternGenerator.rst
src/servers.rst
src/multidet.rst
src/receiver_api.rst
src/result.rst
src/type_traits.rst
@@ -56,21 +53,11 @@ set(SPHINX_SOURCE_FILES
src/serverdefaults.rst
src/quick_start_guide.rst
src/troubleshooting.rst
src/pattern.rst
src/receivers.rst
src/slsreceiver.rst
src/udpheader.rst
src/udpconfig.rst
src/udpdetspec.rst
src/fileformat.rst
src/slsreceiverheaderformat.rst
src/masterfileattributes.rst
src/binaryfileformat.rst
src/hdf5fileformat.rst
src/zmqjsonheaderformat.rst
src/dataformat.rst
src/softwarearchitecture.rst
src/configcommands.rst
)
foreach(filename ${SPHINX_SOURCE_FILES})
@@ -88,16 +75,11 @@ configure_file(
"${SPHINX_BUILD}/gen_server_doc.py"
@ONLY)
configure_file(
configure_file(
"${CMAKE_CURRENT_SOURCE_DIR}/static/extra.css"
"${SPHINX_BUILD}/static/css/extra.css"
@ONLY)
file(COPY ${CMAKE_CURRENT_SOURCE_DIR}/src/images
DESTINATION ${SPHINX_BUILD}/src)
add_custom_target(server_rst python gen_server_doc.py)
add_custom_target(docs

View File

@@ -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

View File

@@ -20,7 +20,7 @@ print(sys.path)
# -- Project information -----------------------------------------------------
project = 'slsDetectorPackage @PROJECT_VERSION@'
project = 'slsDetectorPackage'
copyright = '2020, PSD Detector Group'
author = 'PSD Detector Group'
version = '@PROJECT_VERSION@'
@@ -63,4 +63,4 @@ html_static_path = ['static']
def setup(app):
app.add_css_file('css/extra.css') # may also be an URL
app.add_stylesheet('css/extra.css') # may also be an URL

View File

@@ -21,7 +21,7 @@ print('\n\n\n\n SERVER CSV')
src = Path('@CMAKE_SOURCE_DIR@')/'slsDetectorServers/'
detectors = ['Mythen3', 'Gotthard2', 'Eiger',
'Jungfrau', 'Moench', 'Ctb']
'Jungfrau', 'Moench', 'Gotthard', 'Ctb']
for det in detectors:

File diff suppressed because it is too large Load Diff

View File

@@ -1,787 +0,0 @@
<mxfile host="app.diagrams.net" agent="Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36" version="28.1.0">
<diagram name="Page-1" id="SqHbah1k9D3XqnipfQD4">
<mxGraphModel grid="0" page="0" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" pageScale="1" pageWidth="850" pageHeight="1100" math="0" shadow="0">
<root>
<mxCell id="0" />
<mxCell id="1" parent="0" />
<mxCell id="kpcteDQP5Q-WdnKVJ5EM-1" value="" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#BBDDFF;strokeColor=#BBEEFF;" vertex="1" parent="1">
<mxGeometry x="459" y="71" width="171" height="134" as="geometry" />
</mxCell>
<mxCell id="QgYz-w7MwsADk0cZRM1J-27" value="&lt;p&gt;&lt;font face=&quot;Courier New&quot; style=&quot;&quot;&gt;Client listening to&amp;nbsp;&lt;br&gt;&lt;font style=&quot;&quot;&gt;zmqport&lt;/font&gt; : &lt;font style=&quot;&quot;&gt;&lt;b style=&quot;&quot;&gt;30001&lt;/b&gt;&lt;/font&gt;&lt;br&gt;&lt;font style=&quot;&quot;&gt;zmqip&lt;/font&gt;&amp;nbsp; &amp;nbsp;: &lt;font style=&quot;&quot;&gt;&lt;b style=&quot;&quot;&gt;129.129.100.115&lt;/b&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;" style="text;html=1;align=left;verticalAlign=middle;resizable=1;points=[];autosize=1;strokeColor=#4A7B72;fillColor=default;fontColor=#4A7B72;movable=1;rotatable=1;deletable=1;editable=1;locked=0;connectable=1;" vertex="1" parent="1">
<mxGeometry x="-351.99" y="2247" width="186.49" height="51" as="geometry" />
</mxCell>
<mxCell id="IUwO_ccEPv4BRx6tuxwP-13" value="&lt;font face=&quot;Comic Sans MS&quot;&gt;Client/ GUI&lt;/font&gt;" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#AAAAFF;strokeColor=#AAAAFF;labelPosition=center;verticalLabelPosition=middle;align=center;verticalAlign=middle;fontSize=17;gradientColor=none;fontColor=#FFFFFF;" vertex="1" parent="1">
<mxGeometry x="457.65" y="2121" width="132" height="68" as="geometry" />
</mxCell>
<mxCell id="hmBfKhxy8mBhXzrh4bXw-164" value="" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#f5f5f5;fontColor=#333333;strokeColor=#E6E6E6;" vertex="1" parent="1">
<mxGeometry x="-340" y="4949" width="810" height="621" as="geometry" />
</mxCell>
<mxCell id="hmBfKhxy8mBhXzrh4bXw-162" value="" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#DDEEDD;fontColor=#333333;strokeColor=#E6E6E6;" vertex="1" parent="1">
<mxGeometry x="-240" y="5215" width="680" height="325" as="geometry" />
</mxCell>
<mxCell id="hmBfKhxy8mBhXzrh4bXw-149" value="&lt;font face=&quot;Courier New&quot;&gt;&amp;lt;&amp;lt;class&amp;gt;&amp;gt; Module&lt;/font&gt;" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#AAEEEE;strokeColor=#77BBBB;labelPosition=center;verticalLabelPosition=middle;align=center;verticalAlign=middle;fontSize=17;gradientColor=none;fontColor=#FFFFFF;" vertex="1" parent="1">
<mxGeometry x="58.870000000000005" y="5418" width="196" height="84" as="geometry" />
</mxCell>
<mxCell id="hmBfKhxy8mBhXzrh4bXw-148" value="&lt;font face=&quot;Courier New&quot;&gt;&amp;lt;&amp;lt;class&amp;gt;&amp;gt; Module&lt;/font&gt;" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#99DDDD;strokeColor=#77BBBB;labelPosition=center;verticalLabelPosition=middle;align=center;verticalAlign=middle;fontSize=17;gradientColor=none;fontColor=#FFFFFF;" vertex="1" parent="1">
<mxGeometry x="47.629999999999995" y="5405" width="196" height="84" as="geometry" />
</mxCell>
<mxCell id="hmBfKhxy8mBhXzrh4bXw-147" value="&lt;font face=&quot;Courier New&quot;&gt;&amp;lt;&amp;lt;class&amp;gt;&amp;gt; Module&lt;/font&gt;" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#88CCCC;strokeColor=#77BBBB;labelPosition=center;verticalLabelPosition=middle;align=center;verticalAlign=middle;fontSize=17;gradientColor=none;fontColor=#FFFFFF;" vertex="1" parent="1">
<mxGeometry x="37.129999999999995" y="5392" width="196" height="84" as="geometry" />
</mxCell>
<mxCell id="hmBfKhxy8mBhXzrh4bXw-146" value="&lt;font face=&quot;Courier New&quot;&gt;&amp;lt;&amp;lt;class&amp;gt;&amp;gt; Module (s)&lt;/font&gt;" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#77BBBB;strokeColor=#77BBBB;labelPosition=center;verticalLabelPosition=middle;align=center;verticalAlign=middle;fontSize=17;gradientColor=none;fontColor=#FFFFFF;" vertex="1" parent="1">
<mxGeometry x="25.239999999999995" y="5381" width="196" height="84" as="geometry" />
</mxCell>
<mxCell id="hmBfKhxy8mBhXzrh4bXw-80" value="" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#f5f5f5;fontColor=#333333;strokeColor=#E6E6E6;" vertex="1" parent="1">
<mxGeometry x="-277" y="4445" width="732" height="426" as="geometry" />
</mxCell>
<mxCell id="hmBfKhxy8mBhXzrh4bXw-123" value="&lt;font face=&quot;Courier New&quot;&gt;Data Streamer&lt;/font&gt;" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#9AC7BF;strokeColor=#77BBBB;labelPosition=center;verticalLabelPosition=middle;align=center;verticalAlign=middle;fontSize=17;gradientColor=none;fontColor=#FFFFFF;dashed=1;" vertex="1" parent="1">
<mxGeometry x="197.2" y="4642.5" width="179.12" height="84" as="geometry" />
</mxCell>
<mxCell id="hmBfKhxy8mBhXzrh4bXw-122" value="Data Processor" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#AAAAFF;strokeColor=#9999FF;labelPosition=center;verticalLabelPosition=middle;align=center;verticalAlign=middle;fontSize=17;gradientColor=none;fontColor=#FFFFFF;dashed=1;" vertex="1" parent="1">
<mxGeometry x="-7.720000000000024" y="4643" width="167.88" height="84" as="geometry" />
</mxCell>
<mxCell id="hmBfKhxy8mBhXzrh4bXw-119" value="&lt;font face=&quot;Courier New&quot;&gt;Listener&lt;/font&gt;" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#99BBEE;strokeColor=#77AADD;labelPosition=center;verticalLabelPosition=middle;align=center;verticalAlign=middle;fontSize=17;gradientColor=none;fontColor=#FFFFFF;dashed=1;" vertex="1" parent="1">
<mxGeometry x="-192" y="4651" width="146" height="84" as="geometry" />
</mxCell>
<mxCell id="hmBfKhxy8mBhXzrh4bXw-62" value="" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#f5f5f5;fontColor=#333333;strokeColor=#E6E6E6;" vertex="1" parent="1">
<mxGeometry x="-242.75" y="4184" width="762.75" height="176" as="geometry" />
</mxCell>
<mxCell id="hmBfKhxy8mBhXzrh4bXw-54" value="" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#f5f5f5;fontColor=#333333;strokeColor=#E6E6E6;" vertex="1" parent="1">
<mxGeometry x="-119" y="3595" width="547" height="397" as="geometry" />
</mxCell>
<mxCell id="hmBfKhxy8mBhXzrh4bXw-36" value="" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#EEEEFF;fontColor=#333333;strokeColor=#E6E6E6;" vertex="1" parent="1">
<mxGeometry x="157.39" y="3717" width="200.61" height="243" as="geometry" />
</mxCell>
<mxCell id="hmBfKhxy8mBhXzrh4bXw-33" value="" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#CCE5FF;fontColor=#333333;strokeColor=#E6E6E6;" vertex="1" parent="1">
<mxGeometry x="-67" y="3727" width="187" height="233" as="geometry" />
</mxCell>
<mxCell id="OOa9Ru9pQldXh4IZuxHQ-7" value="Module 3" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#99CCFF;strokeColor=#99CCFF;labelPosition=center;verticalLabelPosition=middle;align=center;verticalAlign=middle;fontSize=17;gradientColor=none;fontColor=#FFFFFF;" vertex="1" parent="1">
<mxGeometry x="490" y="128" width="132" height="68" as="geometry" />
</mxCell>
<mxCell id="OOa9Ru9pQldXh4IZuxHQ-2" value="Module 2" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#88BBEE;strokeColor=#88BBEE;labelPosition=center;verticalLabelPosition=middle;align=center;verticalAlign=middle;fontSize=17;gradientColor=none;fontColor=#FFFFFF;" vertex="1" parent="1">
<mxGeometry x="482" y="121" width="132" height="68" as="geometry" />
</mxCell>
<mxCell id="OOa9Ru9pQldXh4IZuxHQ-6" value="Module 1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#77AADD;strokeColor=#77AADD;labelPosition=center;verticalLabelPosition=middle;align=center;verticalAlign=middle;fontSize=17;gradientColor=none;fontColor=#FFFFFF;" vertex="1" parent="1">
<mxGeometry x="474" y="113" width="132" height="68" as="geometry" />
</mxCell>
<mxCell id="OOa9Ru9pQldXh4IZuxHQ-3" value="Module (s)" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#6699CC;strokeColor=#6699CC;labelPosition=center;verticalLabelPosition=middle;align=center;verticalAlign=middle;fontSize=17;gradientColor=none;fontColor=#FFFFFF;" vertex="1" parent="1">
<mxGeometry x="466.29999999999995" y="106" width="132" height="68" as="geometry" />
</mxCell>
<mxCell id="J8_Ag6N0oFm1g001oKw5-6" value="TCP" style="shape=doubleArrow;whiteSpace=wrap;html=1;strokeColor=#BBBBFF;align=center;verticalAlign=middle;fontFamily=Helvetica;fontSize=12;fontColor=#FFFFFF;fillColor=#BBBBFF;gradientColor=none;arrowWidth=0.39080459770114734;arrowSize=0.11650485436893204;rotation=15;" vertex="1" parent="1">
<mxGeometry x="197" y="889" width="241.01" height="30" as="geometry" />
</mxCell>
<mxCell id="OOa9Ru9pQldXh4IZuxHQ-63" value="" style="shape=doubleArrow;whiteSpace=wrap;html=1;strokeColor=#CCCCFF;align=center;verticalAlign=middle;fontFamily=Helvetica;fontSize=12;fontColor=default;fillColor=#CCCCFF;gradientColor=none;" vertex="1" parent="1">
<mxGeometry x="298.5" y="137" width="150" height="30" as="geometry" />
</mxCell>
<mxCell id="OOa9Ru9pQldXh4IZuxHQ-62" value="" style="shape=doubleArrow;whiteSpace=wrap;html=1;strokeColor=#BBBBFF;align=center;verticalAlign=middle;fontFamily=Helvetica;fontSize=12;fontColor=default;fillColor=#BBBBFF;gradientColor=none;" vertex="1" parent="1">
<mxGeometry x="294.62" y="133" width="150" height="30" as="geometry" />
</mxCell>
<mxCell id="OOa9Ru9pQldXh4IZuxHQ-61" value="" style="shape=doubleArrow;whiteSpace=wrap;html=1;strokeColor=#AAAAFF;align=center;verticalAlign=middle;fontFamily=Helvetica;fontSize=12;fontColor=default;fillColor=#AAAAFF;gradientColor=none;" vertex="1" parent="1">
<mxGeometry x="290.62" y="129" width="150" height="30" as="geometry" />
</mxCell>
<mxCell id="OOa9Ru9pQldXh4IZuxHQ-22" value="" style="shape=singleArrow;direction=south;whiteSpace=wrap;html=1;fillColor=#99CCFF;gradientColor=none;strokeColor=#99CCFF;arrowWidth=0.3473368342085482;arrowSize=0.26612903225806445;" vertex="1" parent="1">
<mxGeometry x="517" y="246.87" width="43" height="130" as="geometry" />
</mxCell>
<mxCell id="OOa9Ru9pQldXh4IZuxHQ-20" value="" style="shape=singleArrow;direction=south;whiteSpace=wrap;html=1;fillColor=#88BBEE;gradientColor=none;strokeColor=#88BBEE;arrowWidth=0.2813203300825186;arrowSize=0.28179723502304177;" vertex="1" parent="1">
<mxGeometry x="512" y="240" width="43" height="130" as="geometry" />
</mxCell>
<mxCell id="OOa9Ru9pQldXh4IZuxHQ-21" value="" style="shape=singleArrow;direction=south;whiteSpace=wrap;html=1;fillColor=#77AADD;gradientColor=none;strokeColor=#77AADD;arrowWidth=0.26856714178544006;arrowSize=0.24723502304147474;" vertex="1" parent="1">
<mxGeometry x="505.88" y="232" width="43" height="130" as="geometry" />
</mxCell>
<mxCell id="OOa9Ru9pQldXh4IZuxHQ-16" value="UDP" style="shape=singleArrow;direction=south;whiteSpace=wrap;html=1;fillColor=#6699CC;gradientColor=none;strokeColor=#6699CC;arrowWidth=0.2713178294573608;arrowSize=0.23333333333333386;fontColor=#FFFFFF;labelPosition=center;verticalLabelPosition=middle;align=center;verticalAlign=middle;textDirection=vertical-lr;spacing=0;spacingBottom=0;spacingLeft=-2;" vertex="1" parent="1">
<mxGeometry x="499" y="224" width="43" height="130" as="geometry" />
</mxCell>
<mxCell id="OOa9Ru9pQldXh4IZuxHQ-5" value="Client / GUI" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#AAAAFF;strokeColor=#AAAAFF;labelPosition=center;verticalLabelPosition=middle;align=center;verticalAlign=middle;fontSize=17;gradientColor=none;fontColor=#FFFFFF;" vertex="1" parent="1">
<mxGeometry x="125" y="109" width="132" height="68" as="geometry" />
</mxCell>
<mxCell id="OOa9Ru9pQldXh4IZuxHQ-1" value="" style="points=[[0.35,0,0],[0.98,0.51,0],[1,0.71,0],[0.67,1,0],[0,0.795,0],[0,0.65,0]];verticalLabelPosition=bottom;sketch=0;html=1;verticalAlign=top;aspect=fixed;align=center;pointerEvents=1;shape=mxgraph.cisco19.user;fillColor=#AAAAFF;strokeColor=none;" vertex="1" parent="1">
<mxGeometry x="166" y="59" width="50" height="50" as="geometry" />
</mxCell>
<mxCell id="OOa9Ru9pQldXh4IZuxHQ-35" value="" style="shape=singleArrow;direction=east;whiteSpace=wrap;html=1;fillColor=#BBFFDD;gradientColor=none;strokeColor=#BBFFDD;arrowWidth=0.3640710382513589;arrowSize=0.1682103825136619;flipH=1;" vertex="1" parent="1">
<mxGeometry x="255.375" y="433.625" width="150" height="30" as="geometry" />
</mxCell>
<mxCell id="OOa9Ru9pQldXh4IZuxHQ-36" value="" style="shape=singleArrow;direction=east;whiteSpace=wrap;html=1;fillColor=#AAEECC;gradientColor=none;strokeColor=#AAEECC;arrowWidth=0.39166666666667427;arrowSize=0.1850757575757575;flipH=1;" vertex="1" parent="1">
<mxGeometry x="256.625" y="428.375" width="150" height="30" as="geometry" />
</mxCell>
<mxCell id="OOa9Ru9pQldXh4IZuxHQ-37" value="" style="shape=singleArrow;direction=east;whiteSpace=wrap;html=1;fillColor=#99DDBB;gradientColor=none;strokeColor=#99DDBB;arrowWidth=0.3072404371584601;arrowSize=0.20247267759562873;flipH=1;" vertex="1" parent="1">
<mxGeometry x="260.875" y="424.625" width="150" height="30" as="geometry" />
</mxCell>
<mxCell id="OOa9Ru9pQldXh4IZuxHQ-38" value="ZMQ" style="shape=singleArrow;direction=east;whiteSpace=wrap;html=1;fillColor=#88CCAA;gradientColor=none;strokeColor=#88CCAA;arrowWidth=0.3015258215962414;arrowSize=0.21895539906103256;flipH=1;fontSize=10;fontColor=#FFFFFF;spacing=0;spacingBottom=2;" vertex="1" parent="1">
<mxGeometry x="264" y="416" width="150" height="35" as="geometry" />
</mxCell>
<mxCell id="OOa9Ru9pQldXh4IZuxHQ-43" value="" style="shape=singleArrow;direction=east;whiteSpace=wrap;html=1;fillColor=#BBFFDD;gradientColor=none;strokeColor=#BBFFDD;arrowWidth=0.30195728510032327;arrowSize=0.10804578407150964;rotation=45;flipV=0;flipH=1;" vertex="1" parent="1">
<mxGeometry x="188.495" y="295.625" width="270" height="40" as="geometry" />
</mxCell>
<mxCell id="OOa9Ru9pQldXh4IZuxHQ-44" value="" style="shape=singleArrow;direction=east;whiteSpace=wrap;html=1;fillColor=#AAEECC;gradientColor=none;strokeColor=#AAEECC;arrowWidth=0.3059021565555355;arrowSize=0.11059978613932724;rotation=45;flipV=0;flipH=1;" vertex="1" parent="1">
<mxGeometry x="187.745" y="288.375" width="270" height="40" as="geometry" />
</mxCell>
<mxCell id="OOa9Ru9pQldXh4IZuxHQ-45" value="" style="shape=singleArrow;direction=east;whiteSpace=wrap;html=1;fillColor=#99DDBB;gradientColor=none;strokeColor=#99DDBB;arrowWidth=0.2606119807565733;arrowSize=0.11229881466462685;rotation=45;flipV=0;flipH=1;" vertex="1" parent="1">
<mxGeometry x="185.995" y="281.625" width="270" height="40" as="geometry" />
</mxCell>
<mxCell id="OOa9Ru9pQldXh4IZuxHQ-46" value="ZMQ" style="shape=singleArrow;direction=east;whiteSpace=wrap;html=1;fillColor=#88CCAA;gradientColor=none;strokeColor=#88CCAA;arrowWidth=0.26899866177272147;arrowSize=0.11295618290402748;rotation=45;flipV=0;flipH=1;fontColor=#FFFFFF;fontSize=10;" vertex="1" parent="1">
<mxGeometry x="185.12" y="274" width="270" height="40" as="geometry" />
</mxCell>
<mxCell id="OOa9Ru9pQldXh4IZuxHQ-47" value="" style="shape=singleArrow;direction=north;whiteSpace=wrap;html=1;fillColor=#BBFFDD;gradientColor=none;strokeColor=#BBFFDD;arrowWidth=0.3881614350818457;arrowSize=0.13584129099660103;flipH=1;" vertex="1" parent="1">
<mxGeometry x="162.115" y="191.255" width="30" height="200" as="geometry" />
</mxCell>
<mxCell id="OOa9Ru9pQldXh4IZuxHQ-48" value="" style="shape=singleArrow;direction=north;whiteSpace=wrap;html=1;fillColor=#AAEECC;gradientColor=none;strokeColor=#AAEECC;arrowWidth=0.4039236188616011;arrowSize=0.13625893792486793;flipH=1;" vertex="1" parent="1">
<mxGeometry x="166.365" y="194.005" width="30" height="200" as="geometry" />
</mxCell>
<mxCell id="OOa9Ru9pQldXh4IZuxHQ-49" value="" style="shape=singleArrow;direction=north;whiteSpace=wrap;html=1;fillColor=#99DDBB;gradientColor=none;strokeColor=#99DDBB;arrowWidth=0.278008144362146;arrowSize=0.14744102244191368;flipH=1;" vertex="1" parent="1">
<mxGeometry x="170.615" y="196.255" width="30" height="200" as="geometry" />
</mxCell>
<mxCell id="OOa9Ru9pQldXh4IZuxHQ-50" value="ZMQ" style="shape=singleArrow;direction=north;whiteSpace=wrap;html=1;fillColor=#88CCAA;gradientColor=none;strokeColor=#88CCAA;arrowWidth=0.29264320269609984;arrowSize=0.15799814659217704;flipH=1;textDirection=vertical-lr;fontSize=10;fontColor=#FFFFFF;spacingLeft=-1;spacing=0;" vertex="1" parent="1">
<mxGeometry x="175" y="198.63" width="32.74" height="200" as="geometry" />
</mxCell>
<mxCell id="OOa9Ru9pQldXh4IZuxHQ-51" value="External&amp;nbsp;&lt;div&gt;Processing&lt;/div&gt;&lt;div&gt;Chain&lt;/div&gt;" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#99DDBB;strokeColor=#99DDBB;labelPosition=center;verticalLabelPosition=middle;align=center;verticalAlign=middle;fontSize=17;gradientColor=none;fontColor=#FFFFFF;" vertex="1" parent="1">
<mxGeometry x="126.99" y="409.37" width="115.01" height="85.63" as="geometry" />
</mxCell>
<mxCell id="OOa9Ru9pQldXh4IZuxHQ-56" value="" style="shape=doubleArrow;whiteSpace=wrap;html=1;rotation=45;arrowWidth=0.27989643421967686;arrowSize=0.14277638849485402;fillColor=#CCCCFF;strokeColor=#CCCCFF;" vertex="1" parent="1">
<mxGeometry x="244.9904832720494" y="263.6209665440989" width="250" height="40" as="geometry" />
</mxCell>
<mxCell id="OOa9Ru9pQldXh4IZuxHQ-57" value="" style="shape=doubleArrow;whiteSpace=wrap;html=1;rotation=45;arrowWidth=0.27989643421967686;arrowSize=0.14277638849485402;fillColor=#BBBBFF;strokeColor=#BBBBFF;" vertex="1" parent="1">
<mxGeometry x="245.7404832720494" y="257.8709665440989" width="250" height="40" as="geometry" />
</mxCell>
<mxCell id="OOa9Ru9pQldXh4IZuxHQ-58" value="" style="shape=doubleArrow;whiteSpace=wrap;html=1;rotation=45;arrowWidth=0.27989643421967686;arrowSize=0.14277638849485402;fillColor=#AAAAFF;strokeColor=#AAAAFF;" vertex="1" parent="1">
<mxGeometry x="245.9904832720494" y="251.8709665440989" width="250" height="40" as="geometry" />
</mxCell>
<mxCell id="OOa9Ru9pQldXh4IZuxHQ-59" value="TCP" style="shape=doubleArrow;whiteSpace=wrap;html=1;rotation=45;arrowWidth=0.27989643421967686;arrowSize=0.14277638849485402;fillColor=#9999FF;strokeColor=#9999FF;fontColor=#FFFFFF;fontSize=10;" vertex="1" parent="1">
<mxGeometry x="245.73999999999995" y="245.25048327204945" width="250" height="40" as="geometry" />
</mxCell>
<mxCell id="OOa9Ru9pQldXh4IZuxHQ-60" value="TCP" style="shape=doubleArrow;whiteSpace=wrap;html=1;strokeColor=#9999FF;align=center;verticalAlign=middle;fontFamily=Helvetica;fontSize=10;fontColor=#FFFFFF;fillColor=#9999FF;gradientColor=none;" vertex="1" parent="1">
<mxGeometry x="285.62" y="125" width="150" height="30" as="geometry" />
</mxCell>
<mxCell id="OOa9Ru9pQldXh4IZuxHQ-67" value="Control 1:N" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;fontColor=#666666;" vertex="1" parent="1">
<mxGeometry x="325" y="114" width="79" height="26" as="geometry" />
</mxCell>
<mxCell id="OOa9Ru9pQldXh4IZuxHQ-68" value="Control 1:N" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;rotation=45;fontColor=#666666;" vertex="1" parent="1">
<mxGeometry x="343" y="243" width="79" height="26" as="geometry" />
</mxCell>
<mxCell id="OOa9Ru9pQldXh4IZuxHQ-69" value="Raw Data Packets&amp;nbsp;&lt;span style=&quot;background-color: transparent; color: light-dark(rgb(102, 102, 102), rgb(149, 149, 149));&quot;&gt;1:1&lt;/span&gt;" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;rotation=90;fontColor=#666666;" vertex="1" parent="1">
<mxGeometry x="499" y="285.25" width="137" height="26" as="geometry" />
</mxCell>
<mxCell id="OOa9Ru9pQldXh4IZuxHQ-70" value="Image Data 1:N" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;rotation=45;fontColor=#666666;" vertex="1" parent="1">
<mxGeometry x="285.00493141924176" y="277.62493141924176" width="102" height="26" as="geometry" />
</mxCell>
<mxCell id="OOa9Ru9pQldXh4IZuxHQ-71" value="Assembled Data 1:N" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;rotation=0;fontColor=#666666;" vertex="1" parent="1">
<mxGeometry x="289.6190475583121" y="407.6190475583121" width="128" height="26" as="geometry" />
</mxCell>
<mxCell id="OOa9Ru9pQldXh4IZuxHQ-72" value="Processed Data 1:1" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;rotation=90;fontColor=#666666;" vertex="1" parent="1">
<mxGeometry x="143.87" y="303.87" width="123" height="26" as="geometry" />
</mxCell>
<mxCell id="OOa9Ru9pQldXh4IZuxHQ-99" value="UDP" style="shape=singleArrow;direction=south;whiteSpace=wrap;html=1;fillColor=#77AADD;gradientColor=none;strokeColor=#77AADD;arrowWidth=0.2713178294573608;arrowSize=0.23333333333333386;fontColor=#FFFFFF;labelPosition=center;verticalLabelPosition=middle;align=center;verticalAlign=middle;textDirection=vertical-lr;spacing=0;spacingBottom=0;spacingLeft=-2;" vertex="1" parent="1">
<mxGeometry x="295.39" y="1604" width="43" height="188" as="geometry" />
</mxCell>
<mxCell id="OOa9Ru9pQldXh4IZuxHQ-101" value="Client" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#AAAAFF;strokeColor=#AAAAFF;labelPosition=center;verticalLabelPosition=middle;align=center;verticalAlign=middle;fontSize=17;gradientColor=none;fontColor=#FFFFFF;" vertex="1" parent="1">
<mxGeometry x="54.37" y="836" width="132" height="68" as="geometry" />
</mxCell>
<mxCell id="OOa9Ru9pQldXh4IZuxHQ-102" value="Module&#xa;1952 / 1953&#xa;bchip100" style="rounded=1;whiteSpace=wrap;fillColor=#88BBEE;strokeColor=#88BBEE;labelPosition=center;verticalLabelPosition=middle;align=center;verticalAlign=middle;fontSize=17;gradientColor=none;fontColor=#FFFFFF;" vertex="1" parent="1">
<mxGeometry x="599" y="816" width="137" height="85" as="geometry" />
</mxCell>
<mxCell id="OOa9Ru9pQldXh4IZuxHQ-103" value="" style="points=[[0.35,0,0],[0.98,0.51,0],[1,0.71,0],[0.67,1,0],[0,0.795,0],[0,0.65,0]];verticalLabelPosition=bottom;sketch=0;html=1;verticalAlign=top;aspect=fixed;align=center;pointerEvents=1;shape=mxgraph.cisco19.user;fillColor=#AAAAFF;strokeColor=none;" vertex="1" parent="1">
<mxGeometry x="95.37" y="786" width="50" height="50" as="geometry" />
</mxCell>
<mxCell id="OOa9Ru9pQldXh4IZuxHQ-111" value="Receiver&lt;div&gt;pc1234&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;font style=&quot;color: rgb(0, 76, 153);&quot;&gt;10.0.1&lt;/font&gt;&lt;/b&gt;.100&lt;/div&gt;" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#88BBEE;strokeColor=#88BBEE;labelPosition=center;verticalLabelPosition=middle;align=center;verticalAlign=middle;fontSize=17;gradientColor=none;fontColor=#FFFFFF;" vertex="1" parent="1">
<mxGeometry x="258.39" y="1811" width="132" height="95" as="geometry" />
</mxCell>
<mxCell id="OOa9Ru9pQldXh4IZuxHQ-117" value="ZMQ" style="shape=singleArrow;direction=east;whiteSpace=wrap;html=1;fillColor=#99DDBB;gradientColor=none;strokeColor=#99DDBB;arrowWidth=0.2417936862291299;arrowSize=0.08753046681068456;rotation=38;flipV=0;flipH=1;fontColor=#FFFFFF;fontSize=10;" vertex="1" parent="1">
<mxGeometry x="-393.75" y="2375.63" width="285.05" height="40" as="geometry" />
</mxCell>
<mxCell id="OOa9Ru9pQldXh4IZuxHQ-122" value="&lt;font face=&quot;Comic Sans MS&quot;&gt;External&amp;nbsp;&lt;/font&gt;&lt;div&gt;&lt;font face=&quot;Comic Sans MS&quot;&gt;Process&lt;/font&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;font face=&quot;Comic Sans MS&quot; style=&quot;color: rgb(0, 76, 153);&quot;&gt;129.129.200.175&lt;/font&gt;&lt;/span&gt;&lt;/div&gt;" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#99DDBB;strokeColor=#99DDBB;labelPosition=center;verticalLabelPosition=middle;align=center;verticalAlign=middle;fontSize=17;gradientColor=none;fontColor=#FFFFFF;" vertex="1" parent="1">
<mxGeometry x="449.19" y="2444" width="139.01" height="72.63" as="geometry" />
</mxCell>
<mxCell id="OOa9Ru9pQldXh4IZuxHQ-127" value="TCP" style="shape=doubleArrow;whiteSpace=wrap;html=1;strokeColor=#BBBBFF;align=center;verticalAlign=middle;fontFamily=Helvetica;fontSize=10;fontColor=#FFFFFF;fillColor=#BBBBFF;gradientColor=none;arrowWidth=0.39080459770114734;arrowSize=0.11650485436893204;rotation=0;" vertex="1" parent="1">
<mxGeometry x="200" y="854" width="235" height="30" as="geometry" />
</mxCell>
<mxCell id="OOa9Ru9pQldXh4IZuxHQ-128" value="Control" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;fontColor=#666666;" vertex="1" parent="1">
<mxGeometry x="309" y="838" width="57" height="26" as="geometry" />
</mxCell>
<mxCell id="OOa9Ru9pQldXh4IZuxHQ-130" value="Raw Data&amp;nbsp;&lt;div&gt;Packets&lt;/div&gt;" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;rotation=0;fontColor=#666666;" vertex="1" parent="1">
<mxGeometry x="240.76" y="1654" width="74" height="41" as="geometry" />
</mxCell>
<mxCell id="OOa9Ru9pQldXh4IZuxHQ-133" value="Processed Data" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;rotation=0;fontColor=#004C99;" vertex="1" parent="1">
<mxGeometry x="472.15000000000003" y="2363" width="103" height="26" as="geometry" />
</mxCell>
<mxCell id="OOa9Ru9pQldXh4IZuxHQ-135" value="&lt;font style=&quot;&quot; face=&quot;Courier New&quot;&gt;port&amp;nbsp; &amp;nbsp; &amp;nbsp;= 1952&lt;br&gt;stopport = 1953&lt;br&gt;hostname = bchip100&lt;/font&gt;" style="text;align=left;verticalAlign=middle;resizable=1;points=[];autosize=1;strokeColor=#8888FF;fillColor=default;movable=1;rotatable=1;deletable=1;editable=1;locked=0;connectable=1;html=1;fontColor=#6666DD;" vertex="1" parent="1">
<mxGeometry x="446" y="845" width="142" height="58" as="geometry" />
</mxCell>
<mxCell id="J8_Ag6N0oFm1g001oKw5-7" value="&lt;pre style=&quot;&quot;&gt;&lt;pre&gt;udp src port: hardcoded (32410)&lt;br&gt;&lt;span style=&quot;background-color: transparent;&quot;&gt;udp_srcip&amp;nbsp; : &lt;b&gt;&lt;font style=&quot;&quot;&gt;10.0.1&lt;/font&gt;&lt;/b&gt;.15&lt;/span&gt;&lt;/pre&gt;&lt;/pre&gt;" style="text;html=1;align=left;verticalAlign=middle;resizable=1;points=[];autosize=1;strokeColor=#004C99;fillColor=default;fontColor=#004C99;movable=1;rotatable=1;deletable=1;editable=1;locked=0;connectable=1;fontFamily=Helvetica;fontSize=12;" vertex="1" parent="1">
<mxGeometry x="17.11" y="1530.5" width="226.52" height="40" as="geometry" />
</mxCell>
<mxCell id="J8_Ag6N0oFm1g001oKw5-10" value="Module&lt;div&gt;bchip100&lt;/div&gt;" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#88BBEE;strokeColor=#88BBEE;labelPosition=center;verticalLabelPosition=middle;align=center;verticalAlign=middle;fontSize=17;gradientColor=none;fontColor=#FFFFFF;" vertex="1" parent="1">
<mxGeometry x="255.39" y="1520" width="132" height="68" as="geometry" />
</mxCell>
<mxCell id="J8_Ag6N0oFm1g001oKw5-14" value="&lt;pre style=&quot;&quot;&gt;udp_dstport: 50001&lt;br&gt;&lt;span style=&quot;background-color: transparent;&quot;&gt;udp_dstip&amp;nbsp; : &lt;b&gt;&lt;font style=&quot;&quot;&gt;10.0.1&lt;/font&gt;&lt;/b&gt;.100&lt;br&gt;&lt;/span&gt;&lt;span style=&quot;background-color: transparent;&quot;&gt;udp_dstmac : (specify for&lt;br&gt;&lt;/span&gt;&lt;span style=&quot;background-color: transparent;&quot;&gt; custom receivers)&lt;/span&gt;&lt;/pre&gt;" style="text;html=1;align=left;verticalAlign=middle;resizable=1;points=[];autosize=1;strokeColor=#004C99;fillColor=default;fontColor=#004C99;movable=1;rotatable=1;deletable=1;editable=1;locked=0;connectable=1;" vertex="1" parent="1">
<mxGeometry x="20.47" y="1831" width="225.52" height="64" as="geometry" />
</mxCell>
<mxCell id="J8_Ag6N0oFm1g001oKw5-16" value="UDP" style="shape=singleArrow;direction=south;whiteSpace=wrap;html=1;fillColor=#77AADD;gradientColor=none;strokeColor=#77AADD;arrowWidth=0.2713178294573608;arrowSize=0.23333333333333386;fontColor=#FFFFFF;labelPosition=center;verticalLabelPosition=middle;align=center;verticalAlign=middle;textDirection=vertical-lr;spacing=0;spacingBottom=0;spacingLeft=-2;" vertex="1" parent="1">
<mxGeometry x="450.9" y="1602" width="43" height="188" as="geometry" />
</mxCell>
<mxCell id="J8_Ag6N0oFm1g001oKw5-17" value="Receiver&lt;div&gt;pc1234&lt;/div&gt;&lt;div&gt;&lt;font style=&quot;color: rgb(0, 76, 153);&quot;&gt;&lt;b style=&quot;&quot;&gt;10.0.2&lt;/b&gt;&lt;/font&gt;.100&lt;/div&gt;" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#88BBEE;strokeColor=#88BBEE;labelPosition=center;verticalLabelPosition=middle;align=center;verticalAlign=middle;fontSize=17;gradientColor=none;fontColor=#FFFFFF;" vertex="1" parent="1">
<mxGeometry x="413.9" y="1809" width="132" height="95" as="geometry" />
</mxCell>
<mxCell id="J8_Ag6N0oFm1g001oKw5-18" value="Raw Data&amp;nbsp;&lt;div&gt;Packets&lt;/div&gt;" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;rotation=0;fontColor=#666666;" vertex="1" parent="1">
<mxGeometry x="396.27" y="1652" width="74" height="41" as="geometry" />
</mxCell>
<mxCell id="J8_Ag6N0oFm1g001oKw5-19" value="Module&lt;div&gt;bchip101&lt;/div&gt;" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#88BBEE;strokeColor=#88BBEE;labelPosition=center;verticalLabelPosition=middle;align=center;verticalAlign=middle;fontSize=17;gradientColor=none;fontColor=#FFFFFF;" vertex="1" parent="1">
<mxGeometry x="410.9" y="1518" width="132" height="68" as="geometry" />
</mxCell>
<mxCell id="J8_Ag6N0oFm1g001oKw5-20" value="&lt;pre style=&quot;&quot;&gt;&lt;pre&gt;udp src port: hardcoded (32410)&lt;br&gt;&lt;span style=&quot;background-color: transparent;&quot;&gt;udp_srcip&amp;nbsp; : &lt;b&gt;&lt;font style=&quot;&quot;&gt;10.0.2&lt;/font&gt;&lt;/b&gt;.15&lt;/span&gt;&lt;/pre&gt;&lt;/pre&gt;" style="text;html=1;align=left;verticalAlign=middle;resizable=1;points=[];autosize=1;strokeColor=#004C99;fillColor=default;fontColor=#004C99;movable=1;rotatable=1;deletable=1;editable=1;locked=0;connectable=1;fontFamily=Helvetica;fontSize=12;" vertex="1" parent="1">
<mxGeometry x="553.6999999999999" y="1533.5" width="227.61" height="37" as="geometry" />
</mxCell>
<mxCell id="J8_Ag6N0oFm1g001oKw5-21" value="&lt;pre style=&quot;&quot;&gt;udp_dstport: 50002&lt;br&gt;&lt;span style=&quot;background-color: transparent;&quot;&gt;udp_dstip&amp;nbsp; : &lt;b&gt;&lt;font style=&quot;&quot;&gt;10.0.2&lt;/font&gt;&lt;/b&gt;.100&lt;br&gt;&lt;/span&gt;&lt;span style=&quot;background-color: transparent;&quot;&gt;udp_dstmac : (specify for&lt;br&gt;&lt;/span&gt;&lt;span style=&quot;background-color: transparent;&quot;&gt; custom receivers)&lt;/span&gt;&lt;/pre&gt;" style="text;html=1;align=left;verticalAlign=middle;resizable=1;points=[];autosize=1;strokeColor=#004C99;fillColor=default;fontColor=#004C99;movable=1;rotatable=1;deletable=1;editable=1;locked=0;connectable=1;" vertex="1" parent="1">
<mxGeometry x="558" y="1820" width="227" height="68" as="geometry" />
</mxCell>
<mxCell id="J8_Ag6N0oFm1g001oKw5-24" value="TCP" style="shape=doubleArrow;whiteSpace=wrap;html=1;strokeColor=#BBBBFF;align=center;verticalAlign=middle;fontFamily=Helvetica;fontSize=12;fontColor=#FFFFFF;fillColor=#BBBBFF;gradientColor=none;arrowWidth=0.3696597117203055;arrowSize=0.07695194442744;rotation=45;" vertex="1" parent="1">
<mxGeometry x="165.19" y="1269.62" width="328.51" height="30" as="geometry" />
</mxCell>
<mxCell id="J8_Ag6N0oFm1g001oKw5-25" value="Client" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#AAAAFF;strokeColor=#AAAAFF;labelPosition=center;verticalLabelPosition=middle;align=center;verticalAlign=middle;fontSize=17;gradientColor=none;fontColor=#FFFFFF;" vertex="1" parent="1">
<mxGeometry x="62.99999999999999" y="1131" width="132" height="68" as="geometry" />
</mxCell>
<mxCell id="J8_Ag6N0oFm1g001oKw5-27" value="" style="points=[[0.35,0,0],[0.98,0.51,0],[1,0.71,0],[0.67,1,0],[0,0.795,0],[0,0.65,0]];verticalLabelPosition=bottom;sketch=0;html=1;verticalAlign=top;aspect=fixed;align=center;pointerEvents=1;shape=mxgraph.cisco19.user;fillColor=#AAAAFF;strokeColor=none;" vertex="1" parent="1">
<mxGeometry x="104" y="1081" width="50" height="50" as="geometry" />
</mxCell>
<mxCell id="J8_Ag6N0oFm1g001oKw5-28" value="TCP" style="shape=doubleArrow;whiteSpace=wrap;html=1;strokeColor=#BBBBFF;align=center;verticalAlign=middle;fontFamily=Helvetica;fontSize=10;fontColor=#FFFFFF;fillColor=#BBBBFF;gradientColor=none;arrowWidth=0.3826240220923713;arrowSize=0.09377242087427196;rotation=32;" vertex="1" parent="1">
<mxGeometry x="190.48" y="1225.3" width="272.63" height="30" as="geometry" />
</mxCell>
<mxCell id="J8_Ag6N0oFm1g001oKw5-29" value="Control" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;fontColor=#666666;" vertex="1" parent="1">
<mxGeometry x="317.2" y="1199" width="57" height="26" as="geometry" />
</mxCell>
<mxCell id="J8_Ag6N0oFm1g001oKw5-33" value="Module&#xa;1952 / 1953&#xa;bchip101" style="rounded=1;whiteSpace=wrap;fillColor=#88BBEE;strokeColor=#88BBEE;labelPosition=center;verticalLabelPosition=middle;align=center;verticalAlign=middle;fontSize=17;gradientColor=none;fontColor=#FFFFFF;fontFamily=Helvetica;" vertex="1" parent="1">
<mxGeometry x="599" y="912" width="137" height="85" as="geometry" />
</mxCell>
<mxCell id="J8_Ag6N0oFm1g001oKw5-34" value="&lt;font face=&quot;Courier New&quot;&gt;Receiver&lt;/font&gt;&lt;div&gt;&lt;span style=&quot;background-color: transparent; color: light-dark(rgb(255, 255, 255), rgb(18, 18, 18));&quot;&gt;1954&lt;/span&gt;&lt;/div&gt;&lt;div&gt;pc1234&lt;span style=&quot;background-color: transparent; color: light-dark(rgb(255, 255, 255), rgb(18, 18, 18));&quot;&gt;&lt;/span&gt;&lt;/div&gt;" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#88BBEE;strokeColor=#88BBEE;labelPosition=center;verticalLabelPosition=middle;align=center;verticalAlign=middle;fontSize=17;gradientColor=none;fontColor=#FFFFFF;" vertex="1" parent="1">
<mxGeometry x="648" y="1273.5" width="137" height="85" as="geometry" />
</mxCell>
<mxCell id="J8_Ag6N0oFm1g001oKw5-35" value="&lt;font face=&quot;Courier New&quot;&gt;Receiver&lt;br&gt;&lt;/font&gt;&lt;div&gt;&lt;span style=&quot;background-color: transparent; color: light-dark(rgb(255, 255, 255), rgb(18, 18, 18));&quot;&gt;1955&lt;/span&gt;&lt;/div&gt;&lt;div&gt;pc1234&lt;/div&gt;" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#88BBEE;strokeColor=#88BBEE;labelPosition=center;verticalLabelPosition=middle;align=center;verticalAlign=middle;fontSize=17;gradientColor=none;fontColor=#FFFFFF;fontFamily=Helvetica;" vertex="1" parent="1">
<mxGeometry x="648" y="1369.5" width="137" height="85" as="geometry" />
</mxCell>
<mxCell id="J8_Ag6N0oFm1g001oKw5-43" value="ZMQ" style="shape=singleArrow;direction=east;whiteSpace=wrap;html=1;fillColor=#99DDBB;gradientColor=none;strokeColor=#99DDBB;arrowWidth=0.27577655701663845;arrowSize=0.06779431315598941;rotation=48;flipV=0;flipH=1;fontColor=#FFFFFF;fontSize=10;" vertex="1" parent="1">
<mxGeometry x="-419.7" y="2435.9" width="336.9" height="40" as="geometry" />
</mxCell>
<mxCell id="IUwO_ccEPv4BRx6tuxwP-4" value="&lt;font style=&quot;&quot; face=&quot;Courier New&quot;&gt;port&amp;nbsp; &amp;nbsp; &amp;nbsp;= 1952&lt;br&gt;stopport = 1953&lt;br&gt;hostname = bchip101&lt;/font&gt;" style="text;align=left;verticalAlign=middle;resizable=1;points=[];autosize=1;strokeColor=#8888FF;fillColor=default;movable=1;rotatable=1;deletable=1;editable=1;locked=0;connectable=1;html=1;fontColor=#6666DD;" vertex="1" parent="1">
<mxGeometry x="446" y="912" width="141" height="58" as="geometry" />
</mxCell>
<mxCell id="IUwO_ccEPv4BRx6tuxwP-5" value="&lt;font face=&quot;Courier New&quot; style=&quot;&quot;&gt;rx_tcpport&amp;nbsp; = 1954&lt;br&gt;rx_hostname = pc1234&lt;/font&gt;" style="text;align=left;verticalAlign=middle;resizable=1;points=[];autosize=1;strokeColor=#8888FF;fillColor=default;movable=1;rotatable=1;deletable=1;editable=1;locked=0;connectable=1;html=1;fontColor=#6666DD;" vertex="1" parent="1">
<mxGeometry x="461.43" y="1294.5" width="150.45" height="43" as="geometry" />
</mxCell>
<mxCell id="IUwO_ccEPv4BRx6tuxwP-6" value="&lt;font face=&quot;Courier New&quot; style=&quot;&quot;&gt;rx_tcpport&amp;nbsp; = 1955&lt;br&gt;rx_hostname = pc1234&lt;/font&gt;" style="text;align=left;verticalAlign=middle;resizable=1;points=[];autosize=1;strokeColor=#8888FF;fillColor=default;movable=1;rotatable=1;deletable=1;editable=1;locked=0;connectable=1;html=1;fontColor=#6666DD;" vertex="1" parent="1">
<mxGeometry x="458.5" y="1395" width="153.38" height="43" as="geometry" />
</mxCell>
<mxCell id="IUwO_ccEPv4BRx6tuxwP-7" value="&lt;font&gt;GUI:&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;div&gt;rx_zmqport (30001)&amp;nbsp;&lt;span style=&quot;background-color: transparent; color: light-dark(rgb(136, 136, 255), rgb(105, 105, 207));&quot;&gt;=&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: transparent; color: light-dark(rgb(136, 136, 255), rgb(105, 105, 207));&quot;&gt;zmqport (30001)&lt;/span&gt;&lt;/div&gt;" style="text;html=1;align=left;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;fontColor=#8888FF;fontSize=17;" vertex="1" parent="1">
<mxGeometry x="-135.12" y="2343.0000000000005" width="310" height="53" as="geometry" />
</mxCell>
<mxCell id="IUwO_ccEPv4BRx6tuxwP-11" value="" style="endArrow=classic;html=1;rounded=0;fontColor=#AAAAFF;strokeColor=#AAAAFF;exitX=0.296;exitY=0.054;exitDx=0;exitDy=0;exitPerimeter=0;entryX=1.002;entryY=0.486;entryDx=0;entryDy=0;entryPerimeter=0;" edge="1" parent="1" source="IUwO_ccEPv4BRx6tuxwP-7" target="QgYz-w7MwsADk0cZRM1J-27">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="-362.87" y="2530.63" as="sourcePoint" />
<mxPoint x="-463.99579291044756" y="2345" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="IUwO_ccEPv4BRx6tuxwP-12" value="" style="endArrow=classic;html=1;rounded=0;fontColor=#AAAAFF;strokeColor=#AAAAFF;exitX=0.48;exitY=1.008;exitDx=0;exitDy=0;exitPerimeter=0;entryX=0.548;entryY=-0.039;entryDx=0;entryDy=0;entryPerimeter=0;" edge="1" parent="1" source="IUwO_ccEPv4BRx6tuxwP-7" target="QgYz-w7MwsADk0cZRM1J-18">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="-354.5" y="2562" as="sourcePoint" />
<mxPoint x="-146.5" y="2600" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="IUwO_ccEPv4BRx6tuxwP-14" value="" style="points=[[0.35,0,0],[0.98,0.51,0],[1,0.71,0],[0.67,1,0],[0,0.795,0],[0,0.65,0]];verticalLabelPosition=bottom;sketch=0;html=1;verticalAlign=top;aspect=fixed;align=center;pointerEvents=1;shape=mxgraph.cisco19.user;fillColor=#AAAAFF;strokeColor=none;" vertex="1" parent="1">
<mxGeometry x="498.64999999999986" y="2071" width="50" height="50" as="geometry" />
</mxCell>
<mxCell id="IUwO_ccEPv4BRx6tuxwP-15" value="ZMQ" style="shape=singleArrow;direction=east;whiteSpace=wrap;html=1;fillColor=#77AADD;gradientColor=none;strokeColor=#77AADD;arrowWidth=0.29750455482560484;arrowSize=0.24452443902291207;rotation=0;flipV=0;flipH=1;fontColor=#FFFFFF;fontSize=10;" vertex="1" parent="1">
<mxGeometry x="658" y="2504.9" width="90" height="40" as="geometry" />
</mxCell>
<mxCell id="IUwO_ccEPv4BRx6tuxwP-16" value="&lt;pre style=&quot;&quot;&gt;&lt;span style=&quot;background-color: transparent;&quot;&gt;&lt;font style=&quot;&quot;&gt;Receiver streaming out&lt;br&gt;&lt;font style=&quot;&quot;&gt;rx_zmqport&lt;/font&gt;&amp;nbsp;= &lt;font style=&quot;&quot;&gt;&lt;b style=&quot;&quot;&gt;30001&lt;/b&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;" style="text;html=1;align=left;verticalAlign=middle;resizable=1;points=[];autosize=1;strokeColor=#4A7B72;fillColor=default;fontColor=#4A7B72;movable=1;rotatable=1;deletable=1;editable=1;locked=0;connectable=1;" vertex="1" parent="1">
<mxGeometry x="755" y="2501.7000000000003" width="166" height="43.2" as="geometry" />
</mxCell>
<mxCell id="IUwO_ccEPv4BRx6tuxwP-17" value="&lt;font face=&quot;Comic Sans MS&quot;&gt;Receiver&lt;/font&gt;&lt;div&gt;&lt;font face=&quot;Comic Sans MS&quot;&gt;pc1234&lt;/font&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;font style=&quot;color: rgb(74, 123, 114);&quot; face=&quot;Comic Sans MS&quot;&gt;129.129.100.115&lt;/font&gt;&lt;/span&gt;&lt;/div&gt;" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#88BBEE;strokeColor=#88BBEE;labelPosition=center;verticalLabelPosition=middle;align=center;verticalAlign=middle;fontSize=17;gradientColor=none;fontColor=#FFFFFF;" vertex="1" parent="1">
<mxGeometry x="932" y="2459.9" width="137" height="85" as="geometry" />
</mxCell>
<mxCell id="IUwO_ccEPv4BRx6tuxwP-18" value="&lt;font face=&quot;Comic Sans MS&quot;&gt;Receiver&lt;/font&gt;&lt;div&gt;&lt;font face=&quot;Comic Sans MS&quot;&gt;pc1234&lt;/font&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;font face=&quot;Comic Sans MS&quot; style=&quot;color: rgb(74, 123, 114);&quot;&gt;129.129.100.115&lt;/font&gt;&lt;/span&gt;&lt;/div&gt;" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#88BBEE;strokeColor=#88BBEE;labelPosition=center;verticalLabelPosition=middle;align=center;verticalAlign=middle;fontSize=17;gradientColor=none;fontColor=#FFFFFF;fontFamily=Helvetica;" vertex="1" parent="1">
<mxGeometry x="932" y="2561" width="137" height="85" as="geometry" />
</mxCell>
<mxCell id="IUwO_ccEPv4BRx6tuxwP-19" value="&lt;pre style=&quot;&quot;&gt;&lt;pre&gt;&lt;span style=&quot;background-color: transparent;&quot;&gt;&lt;font style=&quot;&quot;&gt;Receiver streaming out&lt;br&gt;&lt;font style=&quot;&quot;&gt;rx_zmqport&lt;/font&gt;&amp;nbsp;= &lt;font style=&quot;&quot;&gt;&lt;b style=&quot;&quot;&gt;30002&lt;/b&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/pre&gt;" style="text;html=1;align=left;verticalAlign=middle;resizable=1;points=[];autosize=1;strokeColor=#4A7B72;fillColor=default;fontColor=#4A7B72;movable=1;rotatable=1;deletable=1;editable=1;locked=0;connectable=1;" vertex="1" parent="1">
<mxGeometry x="755" y="2561" width="166" height="44" as="geometry" />
</mxCell>
<mxCell id="IUwO_ccEPv4BRx6tuxwP-20" value="ZMQ" style="shape=singleArrow;direction=east;whiteSpace=wrap;html=1;fillColor=#77AADD;gradientColor=none;strokeColor=#77AADD;arrowWidth=0.3650504445573688;arrowSize=0.19810994147613833;rotation=0;flipV=0;flipH=1;fontColor=#FFFFFF;fontSize=10;" vertex="1" parent="1">
<mxGeometry x="656" y="2561" width="90" height="40" as="geometry" />
</mxCell>
<mxCell id="IUwO_ccEPv4BRx6tuxwP-22" value="&lt;p&gt;&lt;font face=&quot;Courier New&quot; style=&quot;&quot;&gt;Client listening to&amp;nbsp;&lt;br&gt;&lt;font&gt;zmqport&lt;/font&gt; : &lt;font style=&quot;&quot;&gt;&lt;b style=&quot;&quot;&gt;30004&lt;/b&gt;&lt;/font&gt;&lt;br&gt;&lt;font&gt;zmqip&lt;/font&gt;&amp;nbsp; &amp;nbsp;: &lt;font style=&quot;&quot;&gt;&lt;b style=&quot;&quot;&gt;129.129.200.175 &lt;/b&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;" style="text;html=1;align=left;verticalAlign=middle;resizable=1;points=[];autosize=1;strokeColor=#004C99;fillColor=default;fontColor=#004C99;movable=1;rotatable=1;deletable=1;editable=1;locked=0;connectable=1;" vertex="1" parent="1">
<mxGeometry x="320.39" y="2204" width="198" height="49" as="geometry" />
</mxCell>
<mxCell id="IUwO_ccEPv4BRx6tuxwP-23" value="&lt;font style=&quot;font-size: 17px;&quot;&gt;External Process:&lt;/font&gt;&lt;div&gt;&lt;font style=&quot;font-size: 17px;&quot;&gt;rx_zmqport (30001)&amp;nbsp;&lt;/font&gt;&lt;span style=&quot;font-size: 17px; background-color: transparent; color: light-dark(rgb(136, 136, 255), rgb(105, 105, 207));&quot;&gt;!=&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-size: 17px; background-color: transparent; color: light-dark(rgb(136, 136, 255), rgb(105, 105, 207));&quot;&gt;zmqport (30004)&lt;/span&gt;&lt;/div&gt;" style="text;html=1;align=left;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;fontColor=#8888FF;" vertex="1" parent="1">
<mxGeometry x="754" y="2312.0000000000005" width="315" height="53" as="geometry" />
</mxCell>
<mxCell id="IUwO_ccEPv4BRx6tuxwP-25" value="" style="endArrow=classic;html=1;rounded=0;fontColor=#AAAAFF;strokeColor=#AAAAFF;exitX=0.497;exitY=0.986;exitDx=0;exitDy=0;exitPerimeter=0;entryX=0.482;entryY=0.009;entryDx=0;entryDy=0;entryPerimeter=0;" edge="1" parent="1" source="IUwO_ccEPv4BRx6tuxwP-23" target="IUwO_ccEPv4BRx6tuxwP-16">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="612.31" y="2482" as="sourcePoint" />
<mxPoint x="820.31" y="2520" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="IUwO_ccEPv4BRx6tuxwP-27" value="ZMQ" style="shape=singleArrow;direction=north;whiteSpace=wrap;html=1;fillColor=#99DDBB;gradientColor=none;strokeColor=#99DDBB;arrowWidth=0.26530437257911216;arrowSize=0.11592009478500508;rotation=0;flipV=0;flipH=1;fontColor=#FFFFFF;fontSize=10;textDirection=vertical-lr;" vertex="1" parent="1">
<mxGeometry x="527.5699999999999" y="2258.1" width="40" height="100" as="geometry" />
</mxCell>
<mxCell id="IUwO_ccEPv4BRx6tuxwP-28" value="&lt;p&gt;&lt;font style=&quot;&quot; face=&quot;Courier New&quot;&gt;Client listening to&amp;nbsp;&lt;br&gt;&lt;font&gt;zmqport&lt;/font&gt; : &lt;font style=&quot;&quot;&gt;&lt;b style=&quot;&quot;&gt;30003&lt;/b&gt;&lt;/font&gt;&lt;br&gt;&lt;font&gt;zmqip&lt;/font&gt;&amp;nbsp; &amp;nbsp;: &lt;font style=&quot;&quot;&gt;&lt;b style=&quot;&quot;&gt;129.129.200.175 &lt;/b&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;" style="text;html=1;align=left;verticalAlign=middle;resizable=1;points=[];autosize=1;strokeColor=#004C99;fillColor=default;fontColor=#004C99;movable=1;rotatable=1;deletable=1;editable=1;locked=0;connectable=1;" vertex="1" parent="1">
<mxGeometry x="528.9" y="2204" width="198" height="49" as="geometry" />
</mxCell>
<mxCell id="IUwO_ccEPv4BRx6tuxwP-30" value="ZMQ" style="shape=singleArrow;direction=north;whiteSpace=wrap;html=1;fillColor=#99DDBB;gradientColor=none;strokeColor=#99DDBB;arrowWidth=0.3197480273847759;arrowSize=0.13373882001308657;rotation=0;flipV=0;flipH=1;fontColor=#FFFFFF;fontSize=10;textDirection=vertical-lr;" vertex="1" parent="1">
<mxGeometry x="478.2" y="2258.1" width="40" height="100" as="geometry" />
</mxCell>
<mxCell id="IUwO_ccEPv4BRx6tuxwP-31" value="Assembled Data" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;rotation=-90;fontColor=#4A7B72;" vertex="1" parent="1">
<mxGeometry x="594" y="2535" width="106" height="26" as="geometry" />
</mxCell>
<mxCell id="IUwO_ccEPv4BRx6tuxwP-33" value="&lt;p&gt;&lt;font face=&quot;Courier New&quot; style=&quot;&quot;&gt;External Process&amp;nbsp;listening to&amp;nbsp;&lt;br&gt;Ports : &lt;font style=&quot;&quot;&gt;&lt;b&gt;30001, 30002&lt;/b&gt;&lt;/font&gt;&lt;br&gt;Ip&amp;nbsp; &amp;nbsp; : &lt;font style=&quot;&quot;&gt;&lt;b style=&quot;&quot;&gt;129.129.100.115 &lt;/b&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;" style="text;align=left;verticalAlign=middle;resizable=1;points=[];autosize=1;strokeColor=#4A7B72;fillColor=default;fontColor=#4A7B72;movable=1;rotatable=1;deletable=1;editable=1;locked=0;connectable=1;html=1;spacing=0;spacingLeft=5;" vertex="1" parent="1">
<mxGeometry x="414" y="2525.63" width="221" height="51.37" as="geometry" />
</mxCell>
<mxCell id="IUwO_ccEPv4BRx6tuxwP-37" value="" style="endArrow=classic;html=1;rounded=0;fontColor=#AAAAFF;strokeColor=#AAAAFF;entryX=1.005;entryY=0.41;entryDx=0;entryDy=0;entryPerimeter=0;exitX=0.476;exitY=-0.014;exitDx=0;exitDy=0;exitPerimeter=0;" edge="1" parent="1" source="IUwO_ccEPv4BRx6tuxwP-23" target="IUwO_ccEPv4BRx6tuxwP-28">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="803" y="2313" as="sourcePoint" />
<mxPoint x="519.31" y="2373.93" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="IUwO_ccEPv4BRx6tuxwP-46" value="&lt;p&gt;&lt;font style=&quot;&quot; face=&quot;Courier New&quot;&gt;External Process&amp;nbsp;streaming out&amp;nbsp;&lt;br&gt;Ports : &lt;b&gt;30003, 30004&lt;/b&gt;&lt;/font&gt;&lt;/p&gt;" style="text;align=left;verticalAlign=middle;resizable=1;points=[];autosize=1;strokeColor=#004C99;fillColor=default;fontColor=#004C99;movable=1;rotatable=1;deletable=1;editable=1;locked=0;connectable=1;html=1;" vertex="1" parent="1">
<mxGeometry x="418.9" y="2396" width="222.1" height="36" as="geometry" />
</mxCell>
<mxCell id="IUwO_ccEPv4BRx6tuxwP-50" value="" style="shape=image;editableCssRules=.*;verticalLabelPosition=bottom;labelBackgroundColor=default;verticalAlign=top;aspect=fixed;imageAspect=0;image=data:image/svg+xml,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9Ii0wLjUgLTAuNSAyOCAyOCIgaGVpZ2h0PSIyOCIgd2lkdGg9IjI4IiBzdHlsZT0iY29sb3Itc2NoZW1lOiBsaWdodCBkYXJrOyI+JiN4YTsJICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPi5zdDAgeyBzdG9wLWNvbG9yOiBsaWdodC1kYXJrKHJnYigxNzAsIDE3MCwgMjU1KSwgcmdiKDAsIDIwNiwgMTcyKSk7IH0gLnN0MSB7IHN0b3AtY29sb3I6IGxpZ2h0LWRhcmsocmdiKDE3OCwgMTAyLCAyNTUpLCByZ2IoNywgMTMxLCAxNDMpKTsgfSA8L3N0eWxlPiYjeGE7CTxkZWZzPiYjeGE7CQk8bGluZWFyR3JhZGllbnQgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIHkyPSIyNS4zMDkiIHgyPSIyMy40NTQiIHkxPSIzLjQ3NCIgeDE9IjIuMDM5IiBpZD0iQSI+JiN4YTsJCQk8c3RvcCBjbGFzcz0ic3QwIi8+JiN4YTsJCQk8c3RvcCBjbGFzcz0ic3QxIiBvZmZzZXQ9IjEiLz4mI3hhOwkJPC9saW5lYXJHcmFkaWVudD4mI3hhOwk8L2RlZnM+JiN4YTsJPHBhdGggZmlsbD0idXJsKCNBKSIgZD0iTTE1LjI1IDEzLjE3M2ExLjcgMS43IDAgMCAwLS4xMTYtLjY4Yy0uMDg1LS4yMTYtLjIxMy0uNDEzLS4zNzYtLjU3OHMtLjM2Mi0uMjkxLS41NzgtLjM3Ni0uNDQ4LS4xMjQtLjY4LS4xMTZjLS4yMzItLjAwOC0uNDY0LjAzMS0uNjguMTE2cy0uNDEzLjIxMy0uNTc4LjM3Ni0uMjkxLjM2Mi0uMzc2LjU3OGExLjcgMS43IDAgMCAwLS4xMTYuNjh2N2MwIC40NzIuMTY1Ljg5Mi40OTIgMS4yNTguMTY1LjE2My4zNjIuMjkxLjU3OS4zNzVzLjQ0OC4xMjMuNjguMTE1YTEuNyAxLjcgMCAwIDAgMS4yNTgtLjQ5Yy4zMjctLjM2Ni40OTItLjc4NC40OTItMS4yNnYtN3pNMTMuNS0uNWMxLjkzMiAwIDMuNzM2LjM2NiA1LjQxNCAxLjA5NCAxLjcxMy43MyAzLjIwOCAxLjczMiA0LjQ4MyAzLjAwOCAxLjI4MyAxLjI4NyAyLjMwNSAyLjgxIDMuMDA4IDQuNDg1LjczIDEuNjc2IDEuMDk0IDMuNDgyIDEuMDk0IDUuNDEzYTEzLjgyIDEzLjgyIDAgMCAxLTEuMDk0IDUuNDY5Yy0uNzEzIDEuNjU0LTEuNzM0IDMuMTU4LTMuMDA4IDQuNDMxLTEuMjg2IDEuMjgyLTIuODA5IDIuMzAzLTQuNDgzIDMuMDA2LTEuNzEuNzM2LTMuNTUzIDEuMTA4LTUuNDE0IDEuMDk0LTEuODc4LjAxMS0zLjczOS0uMzYxLTUuNDY5LTEuMDk0YTE0LjIzIDE0LjIzIDAgMCAxLTcuNDM3LTcuNDM3QTEzLjgyIDEzLjgyIDAgMCAxLS41IDEzLjVjMC0xLjkzMi4zNjQtMy43MzYgMS4wOTQtNS40MTMuNzMtMS43MTUgMS43MzItMy4yMDkgMy4wMDgtNC40ODVTNi4zNzggMS4zMDcgOC4wMzEuNTk0QTEzLjgyIDEzLjgyIDAgMCAxIDEzLjUtLjV6bTAgOS43MzVhMi4wMSAyLjAxIDAgMCAwIDEuNDc3LS42MDIgMi4wMSAyLjAxIDAgMCAwIC42MDItMS40NzdjMC0uNTgzLS4yMDEtMS4wNzQtLjYwMi0xLjQ3NS0uMTg0LS4yMS0uNDExLS4zNzctLjY2Ni0uNDkxcy0uNTMyLS4xNy0uODExLS4xNjZjLS4yNzktLjAwNC0uNTU2LjA1Mi0uODExLjE2NnMtLjQ4Mi4yODEtLjY2Ni40OTFjLS40MDEuNDAxLS42Ljg5Mi0uNiAxLjQ3NXMuMiAxLjA3Ni42IDEuNDc3Ljg5My42MDIgMS40NzcuNjAyeiIvPiYjeGE7PC9zdmc+;" vertex="1" parent="1">
<mxGeometry x="-169" y="2355.5" width="28" height="28" as="geometry" />
</mxCell>
<mxCell id="IUwO_ccEPv4BRx6tuxwP-52" value="" style="shape=image;editableCssRules=.*;verticalLabelPosition=bottom;labelBackgroundColor=default;verticalAlign=top;aspect=fixed;imageAspect=0;image=data:image/svg+xml,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9Ii0wLjUgLTAuNSAyOCAyOCIgaGVpZ2h0PSIyOCIgd2lkdGg9IjI4IiBzdHlsZT0iY29sb3Itc2NoZW1lOiBsaWdodCBkYXJrOyI+JiN4YTsJICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPi5zdDAgeyBzdG9wLWNvbG9yOiBsaWdodC1kYXJrKHJnYigxNzAsIDE3MCwgMjU1KSwgcmdiKDAsIDIwNiwgMTcyKSk7IH0gLnN0MSB7IHN0b3AtY29sb3I6IGxpZ2h0LWRhcmsocmdiKDE3OCwgMTAyLCAyNTUpLCByZ2IoNywgMTMxLCAxNDMpKTsgfSA8L3N0eWxlPiYjeGE7CTxkZWZzPiYjeGE7CQk8bGluZWFyR3JhZGllbnQgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIHkyPSIyNS4zMDkiIHgyPSIyMy40NTQiIHkxPSIzLjQ3NCIgeDE9IjIuMDM5IiBpZD0iQSI+JiN4YTsJCQk8c3RvcCBjbGFzcz0ic3QwIi8+JiN4YTsJCQk8c3RvcCBjbGFzcz0ic3QxIiBvZmZzZXQ9IjEiLz4mI3hhOwkJPC9saW5lYXJHcmFkaWVudD4mI3hhOwk8L2RlZnM+JiN4YTsJPHBhdGggZmlsbD0idXJsKCNBKSIgZD0iTTE1LjI1IDEzLjE3M2ExLjcgMS43IDAgMCAwLS4xMTYtLjY4Yy0uMDg1LS4yMTYtLjIxMy0uNDEzLS4zNzYtLjU3OHMtLjM2Mi0uMjkxLS41NzgtLjM3Ni0uNDQ4LS4xMjQtLjY4LS4xMTZjLS4yMzItLjAwOC0uNDY0LjAzMS0uNjguMTE2cy0uNDEzLjIxMy0uNTc4LjM3Ni0uMjkxLjM2Mi0uMzc2LjU3OGExLjcgMS43IDAgMCAwLS4xMTYuNjh2N2MwIC40NzIuMTY1Ljg5Mi40OTIgMS4yNTguMTY1LjE2My4zNjIuMjkxLjU3OS4zNzVzLjQ0OC4xMjMuNjguMTE1YTEuNyAxLjcgMCAwIDAgMS4yNTgtLjQ5Yy4zMjctLjM2Ni40OTItLjc4NC40OTItMS4yNnYtN3pNMTMuNS0uNWMxLjkzMiAwIDMuNzM2LjM2NiA1LjQxNCAxLjA5NCAxLjcxMy43MyAzLjIwOCAxLjczMiA0LjQ4MyAzLjAwOCAxLjI4MyAxLjI4NyAyLjMwNSAyLjgxIDMuMDA4IDQuNDg1LjczIDEuNjc2IDEuMDk0IDMuNDgyIDEuMDk0IDUuNDEzYTEzLjgyIDEzLjgyIDAgMCAxLTEuMDk0IDUuNDY5Yy0uNzEzIDEuNjU0LTEuNzM0IDMuMTU4LTMuMDA4IDQuNDMxLTEuMjg2IDEuMjgyLTIuODA5IDIuMzAzLTQuNDgzIDMuMDA2LTEuNzEuNzM2LTMuNTUzIDEuMTA4LTUuNDE0IDEuMDk0LTEuODc4LjAxMS0zLjczOS0uMzYxLTUuNDY5LTEuMDk0YTE0LjIzIDE0LjIzIDAgMCAxLTcuNDM3LTcuNDM3QTEzLjgyIDEzLjgyIDAgMCAxLS41IDEzLjVjMC0xLjkzMi4zNjQtMy43MzYgMS4wOTQtNS40MTMuNzMtMS43MTUgMS43MzItMy4yMDkgMy4wMDgtNC40ODVTNi4zNzggMS4zMDcgOC4wMzEuNTk0QTEzLjgyIDEzLjgyIDAgMCAxIDEzLjUtLjV6bTAgOS43MzVhMi4wMSAyLjAxIDAgMCAwIDEuNDc3LS42MDIgMi4wMSAyLjAxIDAgMCAwIC42MDItMS40NzdjMC0uNTgzLS4yMDEtMS4wNzQtLjYwMi0xLjQ3NS0uMTg0LS4yMS0uNDExLS4zNzctLjY2Ni0uNDkxcy0uNTMyLS4xNy0uODExLS4xNjZjLS4yNzktLjAwNC0uNTU2LjA1Mi0uODExLjE2NnMtLjQ4Mi4yODEtLjY2Ni40OTFjLS40MDEuNDAxLS42Ljg5Mi0uNiAxLjQ3NXMuMiAxLjA3Ni42IDEuNDc3Ljg5My42MDIgMS40NzcuNjAyeiIvPiYjeGE7PC9zdmc+;" vertex="1" parent="1">
<mxGeometry x="726" y="2324.5" width="28" height="28" as="geometry" />
</mxCell>
<mxCell id="IUwO_ccEPv4BRx6tuxwP-57" value="Module 3" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#99CCFF;strokeColor=#99CCFF;labelPosition=center;verticalLabelPosition=middle;align=center;verticalAlign=middle;fontSize=17;gradientColor=none;fontColor=#FFFFFF;" vertex="1" parent="1">
<mxGeometry x="475.70000000000005" y="413.27" width="132" height="68" as="geometry" />
</mxCell>
<mxCell id="IUwO_ccEPv4BRx6tuxwP-58" value="Module 2" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#88BBEE;strokeColor=#88BBEE;labelPosition=center;verticalLabelPosition=middle;align=center;verticalAlign=middle;fontSize=17;gradientColor=none;fontColor=#FFFFFF;" vertex="1" parent="1">
<mxGeometry x="467.70000000000005" y="406.27" width="132" height="68" as="geometry" />
</mxCell>
<mxCell id="IUwO_ccEPv4BRx6tuxwP-59" value="Module 1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#77AADD;strokeColor=#77AADD;labelPosition=center;verticalLabelPosition=middle;align=center;verticalAlign=middle;fontSize=17;gradientColor=none;fontColor=#FFFFFF;" vertex="1" parent="1">
<mxGeometry x="459.70000000000005" y="398.27" width="132" height="68" as="geometry" />
</mxCell>
<mxCell id="IUwO_ccEPv4BRx6tuxwP-60" value="Receiver (s)" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#6699CC;strokeColor=#6699CC;labelPosition=center;verticalLabelPosition=middle;align=center;verticalAlign=middle;fontSize=17;gradientColor=none;fontColor=#FFFFFF;" vertex="1" parent="1">
<mxGeometry x="452" y="391.27" width="132" height="68" as="geometry" />
</mxCell>
<mxCell id="IUwO_ccEPv4BRx6tuxwP-61" value="Option 1: Directly&amp;nbsp;" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;fontColor=#666666;rotation=45;" vertex="1" parent="1">
<mxGeometry x="255.39" y="309.63" width="113" height="26" as="geometry" />
</mxCell>
<mxCell id="IUwO_ccEPv4BRx6tuxwP-62" value="Option 2: Indirectly" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;fontColor=#666666;rotation=0;" vertex="1" parent="1">
<mxGeometry x="291.99605691619604" y="446.99605691619604" width="118" height="26" as="geometry" />
</mxCell>
<mxCell id="hmBfKhxy8mBhXzrh4bXw-14" value="Client" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;fontColor=#666666;" vertex="1" parent="1">
<mxGeometry x="-173" y="3875.5" width="47" height="26" as="geometry" />
</mxCell>
<mxCell id="hmBfKhxy8mBhXzrh4bXw-15" value="" style="endArrow=classic;startArrow=classic;html=1;rounded=0;entryX=0.016;entryY=0.505;entryDx=0;entryDy=0;entryPerimeter=0;fontColor=#666666;strokeColor=#666666;" edge="1" parent="1">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="-132" y="3889" as="sourcePoint" />
<mxPoint x="-46.998000000000104" y="3889.405" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="hmBfKhxy8mBhXzrh4bXw-57" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;strokeColor=#666666;" edge="1" parent="1" source="hmBfKhxy8mBhXzrh4bXw-27" target="hmBfKhxy8mBhXzrh4bXw-28">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="hmBfKhxy8mBhXzrh4bXw-27" value="&lt;div&gt;&lt;font face=&quot;Courier New&quot;&gt;Control Server&lt;/font&gt;&lt;/div&gt;&lt;div&gt;&lt;font face=&quot;Courier New&quot;&gt;( C 98 )&lt;/font&gt;&lt;/div&gt;" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#77AADD;strokeColor=#77AADD;labelPosition=center;verticalLabelPosition=middle;align=center;verticalAlign=middle;fontSize=17;gradientColor=none;fontColor=#FFFFFF;" vertex="1" parent="1">
<mxGeometry x="-47" y="3750" width="146" height="60" as="geometry" />
</mxCell>
<mxCell id="hmBfKhxy8mBhXzrh4bXw-28" value="&lt;div&gt;&lt;font face=&quot;Courier New&quot;&gt;Stop Server&lt;/font&gt;&lt;/div&gt;&lt;div&gt;&lt;font face=&quot;Courier New&quot;&gt;( C 98 )&lt;/font&gt;&lt;/div&gt;" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#77AADD;strokeColor=#77AADD;labelPosition=center;verticalLabelPosition=middle;align=center;verticalAlign=middle;fontSize=17;gradientColor=none;fontColor=#FFFFFF;" vertex="1" parent="1">
<mxGeometry x="-47" y="3853" width="146" height="60" as="geometry" />
</mxCell>
<mxCell id="hmBfKhxy8mBhXzrh4bXw-29" value="Client&amp;nbsp;" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;fontColor=#666666;" vertex="1" parent="1">
<mxGeometry x="-173" y="3766.5" width="50" height="26" as="geometry" />
</mxCell>
<mxCell id="hmBfKhxy8mBhXzrh4bXw-30" value="" style="endArrow=classic;startArrow=classic;html=1;rounded=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;fontColor=#666666;strokeColor=#666666;" edge="1" parent="1" target="hmBfKhxy8mBhXzrh4bXw-27">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="-133" y="3780" as="sourcePoint" />
<mxPoint x="-48" y="3783" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="hmBfKhxy8mBhXzrh4bXw-34" value="On-board CPU" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;fontSize=17;fontColor=#666666;" vertex="1" parent="1">
<mxGeometry x="-34" y="3921" width="120" height="32" as="geometry" />
</mxCell>
<mxCell id="hmBfKhxy8mBhXzrh4bXw-35" value="Registers" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#AAAAFF;strokeColor=#AAAAFF;labelPosition=center;verticalLabelPosition=middle;align=center;verticalAlign=middle;fontSize=17;gradientColor=none;fontColor=#FFFFFF;" vertex="1" parent="1">
<mxGeometry x="182.34000000000003" y="3872.5" width="152" height="40" as="geometry" />
</mxCell>
<mxCell id="hmBfKhxy8mBhXzrh4bXw-37" value="FPGA ( VHDL )" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;fontSize=17;fontColor=#666666;" vertex="1" parent="1">
<mxGeometry x="184.00000000000003" y="3921" width="131" height="32" as="geometry" />
</mxCell>
<mxCell id="hmBfKhxy8mBhXzrh4bXw-38" value="UDP Generator" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#AAAAFF;strokeColor=#AAAAFF;labelPosition=center;verticalLabelPosition=middle;align=center;verticalAlign=middle;fontSize=17;gradientColor=none;fontColor=#FFFFFF;" vertex="1" parent="1">
<mxGeometry x="182.75" y="3820" width="152" height="40" as="geometry" />
</mxCell>
<mxCell id="hmBfKhxy8mBhXzrh4bXw-39" value="Readout and Processing Logic" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#AAAAFF;strokeColor=#AAAAFF;labelPosition=center;verticalLabelPosition=middle;align=center;verticalAlign=middle;fontSize=17;gradientColor=none;fontColor=#FFFFFF;" vertex="1" parent="1">
<mxGeometry x="183.5" y="3740" width="152" height="70" as="geometry" />
</mxCell>
<mxCell id="hmBfKhxy8mBhXzrh4bXw-40" value="" style="endArrow=classic;startArrow=classic;html=1;rounded=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;exitX=1;exitY=0.5;exitDx=0;exitDy=0;fontColor=#666666;strokeColor=#666666;" edge="1" parent="1" source="hmBfKhxy8mBhXzrh4bXw-28" target="hmBfKhxy8mBhXzrh4bXw-35">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="64.37" y="3696" as="sourcePoint" />
<mxPoint x="176.37" y="3696" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="hmBfKhxy8mBhXzrh4bXw-41" value="&lt;span style=&quot;background-color: transparent;&quot;&gt;Stop&lt;/span&gt;" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;fontColor=#666666;rotation=5;" vertex="1" parent="1">
<mxGeometry x="117.61000000000001" y="3867" width="40" height="26" as="geometry" />
</mxCell>
<mxCell id="hmBfKhxy8mBhXzrh4bXw-42" value="" style="endArrow=classic;startArrow=classic;html=1;rounded=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;exitX=1;exitY=0.5;exitDx=0;exitDy=0;fontColor=#666666;strokeColor=#666666;" edge="1" parent="1" source="hmBfKhxy8mBhXzrh4bXw-27" target="hmBfKhxy8mBhXzrh4bXw-35">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="69.37" y="3580" as="sourcePoint" />
<mxPoint x="176.37" y="3696" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="hmBfKhxy8mBhXzrh4bXw-43" value="&lt;span style=&quot;background-color: transparent;&quot;&gt;Control&lt;/span&gt;" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;rotation=53;fontColor=#666666;" vertex="1" parent="1">
<mxGeometry x="113" y="3811" width="55" height="26" as="geometry" />
</mxCell>
<mxCell id="hmBfKhxy8mBhXzrh4bXw-46" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.75;exitDx=0;exitDy=0;fontColor=#666666;strokeColor=#666666;dashed=1;" edge="1" parent="1" source="hmBfKhxy8mBhXzrh4bXw-38">
<mxGeometry relative="1" as="geometry">
<mxPoint x="446" y="3849" as="targetPoint" />
<mxPoint x="350.27" y="3843" as="sourcePoint" />
</mxGeometry>
</mxCell>
<mxCell id="hmBfKhxy8mBhXzrh4bXw-48" value="" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#FFFFDD;fontColor=#333333;strokeColor=#E6E6E6;" vertex="1" parent="1">
<mxGeometry x="157" y="3626" width="202" height="57" as="geometry" />
</mxCell>
<mxCell id="hmBfKhxy8mBhXzrh4bXw-49" value="Sensor &amp;amp; Chip" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;fontSize=17;fontColor=#666666;" vertex="1" parent="1">
<mxGeometry x="198.2" y="3638.5" width="119" height="32" as="geometry" />
</mxCell>
<mxCell id="hmBfKhxy8mBhXzrh4bXw-50" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.25;exitY=0;exitDx=0;exitDy=0;entryX=0.25;entryY=1;entryDx=0;entryDy=0;fontColor=#666666;strokeColor=#666666;" edge="1" parent="1" source="hmBfKhxy8mBhXzrh4bXw-36" target="hmBfKhxy8mBhXzrh4bXw-48">
<mxGeometry relative="1" as="geometry">
<mxPoint x="213.19" y="3721" as="sourcePoint" />
<mxPoint x="212.19" y="3689" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="hmBfKhxy8mBhXzrh4bXw-51" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.644;exitY=0.993;exitDx=0;exitDy=0;entryX=0.65;entryY=0.007;entryDx=0;entryDy=0;entryPerimeter=0;exitPerimeter=0;fontColor=#666666;strokeColor=#666666;" edge="1" parent="1" source="hmBfKhxy8mBhXzrh4bXw-48" target="hmBfKhxy8mBhXzrh4bXw-36">
<mxGeometry relative="1" as="geometry">
<mxPoint x="281.19" y="3689" as="sourcePoint" />
<mxPoint x="281.19" y="3721" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="hmBfKhxy8mBhXzrh4bXw-52" value="Control" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;fontColor=#666666;" vertex="1" parent="1">
<mxGeometry x="154.39000000000001" y="3686" width="55" height="26" as="geometry" />
</mxCell>
<mxCell id="hmBfKhxy8mBhXzrh4bXw-53" value="Data" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;fontColor=#666666;" vertex="1" parent="1">
<mxGeometry x="285.62" y="3686" width="41" height="26" as="geometry" />
</mxCell>
<mxCell id="hmBfKhxy8mBhXzrh4bXw-55" value="MODULE" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;fontSize=17;fontColor=#666666;" vertex="1" parent="1">
<mxGeometry x="-19" y="3642" width="91" height="32" as="geometry" />
</mxCell>
<mxCell id="hmBfKhxy8mBhXzrh4bXw-58" value="&lt;span style=&quot;background-color: transparent;&quot;&gt;Spawns&lt;/span&gt;" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;fontColor=#666666;" vertex="1" parent="1">
<mxGeometry x="22" y="3817" width="55" height="26" as="geometry" />
</mxCell>
<mxCell id="hmBfKhxy8mBhXzrh4bXw-59" value="&lt;font face=&quot;Courier New&quot;&gt;On-board&amp;nbsp;&lt;/font&gt;&lt;div&gt;&lt;font face=&quot;Courier New&quot;&gt;Detector&amp;nbsp;&lt;/font&gt;&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;; background-color: transparent; color: light-dark(rgb(255, 255, 255), rgb(18, 18, 18));&quot;&gt;Server&lt;/span&gt;&lt;/div&gt;" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#77AADD;strokeColor=#77AADD;labelPosition=center;verticalLabelPosition=middle;align=center;verticalAlign=middle;fontSize=17;gradientColor=none;fontColor=#FFFFFF;" vertex="1" parent="1">
<mxGeometry x="-202.75" y="4236" width="160" height="84" as="geometry" />
</mxCell>
<mxCell id="hmBfKhxy8mBhXzrh4bXw-60" value="Firmware&amp;nbsp;&lt;div&gt;( *.bit, *.pof, *.rbf )&lt;/div&gt;" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#9999FF;strokeColor=#9999FF;labelPosition=center;verticalLabelPosition=middle;align=center;verticalAlign=middle;fontSize=17;gradientColor=none;fontColor=#FFFFFF;" vertex="1" parent="1">
<mxGeometry x="37.86" y="4236" width="160" height="84" as="geometry" />
</mxCell>
<mxCell id="hmBfKhxy8mBhXzrh4bXw-61" value="&lt;font face=&quot;Courier New&quot;&gt;slsDetectorPackage&lt;/font&gt;&lt;div&gt;&lt;font face=&quot;Courier New&quot;&gt;( Client /&amp;amp; Receiver )&lt;/font&gt;&lt;/div&gt;" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#77BBBB;strokeColor=#77BBBB;labelPosition=center;verticalLabelPosition=middle;align=center;verticalAlign=middle;fontSize=17;gradientColor=none;fontColor=#FFFFFF;" vertex="1" parent="1">
<mxGeometry x="278.75" y="4236" width="200" height="84" as="geometry" />
</mxCell>
<mxCell id="hmBfKhxy8mBhXzrh4bXw-64" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.25;exitDx=0;exitDy=0;fontColor=#666666;strokeColor=#666666;" edge="1" parent="1" source="hmBfKhxy8mBhXzrh4bXw-38">
<mxGeometry relative="1" as="geometry">
<mxPoint x="447" y="3830" as="targetPoint" />
<mxPoint x="356" y="3811" as="sourcePoint" />
</mxGeometry>
</mxCell>
<mxCell id="hmBfKhxy8mBhXzrh4bXw-66" value="UDP Port" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;fontColor=#666666;" vertex="1" parent="1">
<mxGeometry x="350.12" y="3810" width="65" height="26" as="geometry" />
</mxCell>
<mxCell id="hmBfKhxy8mBhXzrh4bXw-67" value="UDP Port 2" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;fontColor=#666666;" vertex="1" parent="1">
<mxGeometry x="349.62" y="3829" width="74" height="26" as="geometry" />
</mxCell>
<mxCell id="hmBfKhxy8mBhXzrh4bXw-68" value="TCP Port&lt;div&gt;&lt;span style=&quot;background-color: transparent; color: light-dark(rgb(102, 102, 102), rgb(149, 149, 149));&quot;&gt;Control&lt;/span&gt;&lt;/div&gt;" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;fontColor=#666666;" vertex="1" parent="1">
<mxGeometry x="-124" y="3759" width="63" height="41" as="geometry" />
</mxCell>
<mxCell id="hmBfKhxy8mBhXzrh4bXw-69" value="&lt;span style=&quot;background-color: transparent; color: light-dark(rgb(102, 102, 102), rgb(149, 149, 149));&quot;&gt;TCP Port&lt;/span&gt;&lt;div&gt;&lt;span style=&quot;background-color: transparent; color: light-dark(rgb(102, 102, 102), rgb(149, 149, 149));&quot;&gt;Stop&lt;/span&gt;&lt;/div&gt;" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;fontColor=#666666;" vertex="1" parent="1">
<mxGeometry x="-125" y="3868" width="63" height="41" as="geometry" />
</mxCell>
<mxCell id="hmBfKhxy8mBhXzrh4bXw-71" value="Receiver" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;fontColor=#666666;" vertex="1" parent="1">
<mxGeometry x="438.20000000000005" y="3817" width="61" height="26" as="geometry" />
</mxCell>
<mxCell id="hmBfKhxy8mBhXzrh4bXw-72" value="Receiver" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;fontColor=#666666;" vertex="1" parent="1">
<mxGeometry x="438.38" y="3836" width="61" height="26" as="geometry" />
</mxCell>
<mxCell id="hmBfKhxy8mBhXzrh4bXw-75" value="&lt;font face=&quot;Courier New&quot;&gt;Listener&lt;/font&gt;" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#77AADD;strokeColor=#77AADD;labelPosition=center;verticalLabelPosition=middle;align=center;verticalAlign=middle;fontSize=17;gradientColor=none;fontColor=#FFFFFF;" vertex="1" parent="1">
<mxGeometry x="-208" y="4630.5" width="146" height="84" as="geometry" />
</mxCell>
<mxCell id="hmBfKhxy8mBhXzrh4bXw-77" value="Data Processor" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#9999FF;strokeColor=#9999FF;labelPosition=center;verticalLabelPosition=middle;align=center;verticalAlign=middle;fontSize=17;gradientColor=none;fontColor=#FFFFFF;" vertex="1" parent="1">
<mxGeometry x="-22.51" y="4628" width="167.88" height="84" as="geometry" />
</mxCell>
<mxCell id="hmBfKhxy8mBhXzrh4bXw-79" value="&lt;font face=&quot;Courier New&quot;&gt;Data Streamer&lt;/font&gt;" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#77BBBB;strokeColor=#77BBBB;labelPosition=center;verticalLabelPosition=middle;align=center;verticalAlign=middle;fontSize=17;gradientColor=none;fontColor=#FFFFFF;" vertex="1" parent="1">
<mxGeometry x="182.34" y="4628" width="179.12" height="84" as="geometry" />
</mxCell>
<mxCell id="hmBfKhxy8mBhXzrh4bXw-82" value="" style="endArrow=classic;startArrow=classic;html=1;rounded=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;fontColor=#666666;strokeColor=#666666;" edge="1" parent="1" target="hmBfKhxy8mBhXzrh4bXw-84">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="-289" y="4550" as="sourcePoint" />
<mxPoint x="-253" y="4554.5" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="hmBfKhxy8mBhXzrh4bXw-106" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;strokeColor=#666666;" edge="1" parent="1" source="hmBfKhxy8mBhXzrh4bXw-84" target="hmBfKhxy8mBhXzrh4bXw-75">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="hmBfKhxy8mBhXzrh4bXw-107" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;strokeColor=#666666;" edge="1" parent="1" source="hmBfKhxy8mBhXzrh4bXw-84" target="hmBfKhxy8mBhXzrh4bXw-77">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="hmBfKhxy8mBhXzrh4bXw-108" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.25;exitDx=0;exitDy=0;strokeColor=#666666;" edge="1" parent="1" source="hmBfKhxy8mBhXzrh4bXw-84" target="hmBfKhxy8mBhXzrh4bXw-79">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="hmBfKhxy8mBhXzrh4bXw-84" value="&lt;font face=&quot;Courier New&quot;&gt;TCP Server&lt;/font&gt;" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#AAAADD;strokeColor=#77AADD;labelPosition=center;verticalLabelPosition=middle;align=center;verticalAlign=middle;fontSize=17;gradientColor=none;fontColor=#FFFFFF;" vertex="1" parent="1">
<mxGeometry x="-208" y="4508" width="146" height="84" as="geometry" />
</mxCell>
<mxCell id="hmBfKhxy8mBhXzrh4bXw-85" value="Client&amp;nbsp;" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;fontColor=#666666;" vertex="1" parent="1">
<mxGeometry x="-330" y="4537" width="50" height="26" as="geometry" />
</mxCell>
<mxCell id="hmBfKhxy8mBhXzrh4bXw-86" value="TCP Port&lt;div&gt;&lt;span style=&quot;background-color: transparent; color: light-dark(rgb(102, 102, 102), rgb(149, 149, 149));&quot;&gt;Control&lt;/span&gt;&lt;/div&gt;" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;fontColor=#666666;" vertex="1" parent="1">
<mxGeometry x="-276" y="4529.5" width="63" height="41" as="geometry" />
</mxCell>
<mxCell id="hmBfKhxy8mBhXzrh4bXw-87" value="" style="endArrow=classic;html=1;rounded=0;entryX=0.01;entryY=0.83;entryDx=0;entryDy=0;strokeColor=#666666;entryPerimeter=0;" edge="1" parent="1" target="hmBfKhxy8mBhXzrh4bXw-75">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="-291" y="4700" as="sourcePoint" />
<mxPoint x="-265" y="4672" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="hmBfKhxy8mBhXzrh4bXw-88" value="Module" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;fontColor=#666666;" vertex="1" parent="1">
<mxGeometry x="-339" y="4686" width="55" height="26" as="geometry" />
</mxCell>
<mxCell id="hmBfKhxy8mBhXzrh4bXw-89" value="UDP Port" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;fontColor=#666666;" vertex="1" parent="1">
<mxGeometry x="-278" y="4679.5" width="65" height="26" as="geometry" />
</mxCell>
<mxCell id="hmBfKhxy8mBhXzrh4bXw-91" value="Data" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;fontColor=#666666;" vertex="1" parent="1">
<mxGeometry x="351.12" y="3846.5" width="41" height="26" as="geometry" />
</mxCell>
<mxCell id="hmBfKhxy8mBhXzrh4bXw-94" value="" style="endArrow=classic;html=1;rounded=0;strokeColor=#666666;exitX=0.5;exitY=1;exitDx=0;exitDy=0;" edge="1" parent="1" source="hmBfKhxy8mBhXzrh4bXw-75" target="hmBfKhxy8mBhXzrh4bXw-95">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="-50" y="4739" as="sourcePoint" />
<mxPoint y="4689" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="hmBfKhxy8mBhXzrh4bXw-95" value="Assembles&amp;nbsp;&lt;div&gt;&lt;span style=&quot;background-color: transparent; color: light-dark(rgb(102, 102, 102), rgb(149, 149, 149));&quot;&gt;into images in memory&lt;/span&gt;&lt;/div&gt;" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=#666666;fillColor=none;fontColor=#666666;" vertex="1" parent="1">
<mxGeometry x="-199" y="4754" width="129" height="41" as="geometry" />
</mxCell>
<mxCell id="hmBfKhxy8mBhXzrh4bXw-96" value="Optional callbacks&amp;nbsp;&lt;div&gt;for online processing&lt;/div&gt;" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=#666666;fillColor=none;fontColor=#666666;" vertex="1" parent="1">
<mxGeometry x="-39.62" y="4754" width="119" height="41" as="geometry" />
</mxCell>
<mxCell id="hmBfKhxy8mBhXzrh4bXw-98" value="" style="endArrow=classic;html=1;rounded=0;strokeColor=#666666;exitX=0.25;exitY=1;exitDx=0;exitDy=0;" edge="1" parent="1" source="hmBfKhxy8mBhXzrh4bXw-77" target="hmBfKhxy8mBhXzrh4bXw-96">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="54.370000000000005" y="4719" as="sourcePoint" />
<mxPoint x="54.370000000000005" y="4754" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="hmBfKhxy8mBhXzrh4bXw-99" value="Optional File" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=#666666;fillColor=none;fontColor=#666666;" vertex="1" parent="1">
<mxGeometry x="63" y="4810" width="82" height="26" as="geometry" />
</mxCell>
<mxCell id="hmBfKhxy8mBhXzrh4bXw-100" value="" style="endArrow=classic;html=1;rounded=0;strokeColor=#666666;exitX=0.754;exitY=0.979;exitDx=0;exitDy=0;exitPerimeter=0;" edge="1" parent="1" source="hmBfKhxy8mBhXzrh4bXw-77" target="hmBfKhxy8mBhXzrh4bXw-99">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="86.62" y="4759" as="sourcePoint" />
<mxPoint x="121.99000000000001" y="4801" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="hmBfKhxy8mBhXzrh4bXw-101" value="Optional Data Streaming" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=#666666;fillColor=none;fontColor=#666666;" vertex="1" parent="1">
<mxGeometry x="203.5" y="4774" width="138" height="26" as="geometry" />
</mxCell>
<mxCell id="hmBfKhxy8mBhXzrh4bXw-102" value="" style="endArrow=classic;html=1;rounded=0;strokeColor=#666666;exitX=0.5;exitY=1;exitDx=0;exitDy=0;" edge="1" parent="1" source="hmBfKhxy8mBhXzrh4bXw-79" target="hmBfKhxy8mBhXzrh4bXw-101">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="275.12" y="4724" as="sourcePoint" />
<mxPoint x="310.49" y="4766" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="hmBfKhxy8mBhXzrh4bXw-103" value="" style="endArrow=classic;html=1;rounded=0;entryX=-0.002;entryY=0.873;entryDx=0;entryDy=0;strokeColor=#666666;dashed=1;entryPerimeter=0;" edge="1" parent="1" target="hmBfKhxy8mBhXzrh4bXw-119">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="-291" y="4723" as="sourcePoint" />
<mxPoint x="-208" y="4723.5" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="hmBfKhxy8mBhXzrh4bXw-104" value="Module" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;fontColor=#666666;" vertex="1" parent="1">
<mxGeometry x="-339" y="4708" width="55" height="26" as="geometry" />
</mxCell>
<mxCell id="hmBfKhxy8mBhXzrh4bXw-105" value="UDP Port 2" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;fontColor=#666666;" vertex="1" parent="1">
<mxGeometry x="-284" y="4702.5" width="74" height="26" as="geometry" />
</mxCell>
<mxCell id="hmBfKhxy8mBhXzrh4bXw-116" value="RECEIVER" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;fontSize=17;fontColor=#666666;" vertex="1" parent="1">
<mxGeometry x="24.71" y="4472" width="101" height="32" as="geometry" />
</mxCell>
<mxCell id="hmBfKhxy8mBhXzrh4bXw-117" value="UPGRADE COMPONENTS" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;fontSize=17;fontColor=#666666;" vertex="1" parent="1">
<mxGeometry x="11.369999999999997" y="4196" width="218" height="32" as="geometry" />
</mxCell>
<mxCell id="hmBfKhxy8mBhXzrh4bXw-121" value="&lt;div&gt;&lt;span style=&quot;background-color: transparent; color: light-dark(rgb(102, 102, 102), rgb(149, 149, 149));&quot;&gt;Data packets&lt;/span&gt;&lt;/div&gt;" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;fontColor=#666666;" vertex="1" parent="1">
<mxGeometry x="-284" y="4657" width="80" height="26" as="geometry" />
</mxCell>
<mxCell id="hmBfKhxy8mBhXzrh4bXw-124" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1.001;exitY=0.818;exitDx=0;exitDy=0;fontColor=#666666;strokeColor=#666666;dashed=1;exitPerimeter=0;" edge="1" parent="1" source="hmBfKhxy8mBhXzrh4bXw-123">
<mxGeometry relative="1" as="geometry">
<mxPoint x="469" y="4711" as="targetPoint" />
<mxPoint x="382.62" y="4711" as="sourcePoint" />
</mxGeometry>
</mxCell>
<mxCell id="hmBfKhxy8mBhXzrh4bXw-125" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.75;exitDx=0;exitDy=0;fontColor=#666666;strokeColor=#666666;" edge="1" parent="1" source="hmBfKhxy8mBhXzrh4bXw-79">
<mxGeometry relative="1" as="geometry">
<mxPoint x="470" y="4691" as="targetPoint" />
<mxPoint x="382.62" y="4691" as="sourcePoint" />
</mxGeometry>
</mxCell>
<mxCell id="hmBfKhxy8mBhXzrh4bXw-126" value="ZMQ Port" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;fontColor=#666666;" vertex="1" parent="1">
<mxGeometry x="370.74" y="4671" width="68" height="26" as="geometry" />
</mxCell>
<mxCell id="hmBfKhxy8mBhXzrh4bXw-127" value="ZMQ Port 2" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;fontColor=#666666;" vertex="1" parent="1">
<mxGeometry x="369.24" y="4690" width="77" height="26" as="geometry" />
</mxCell>
<mxCell id="hmBfKhxy8mBhXzrh4bXw-128" value="GUI" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;fontColor=#666666;" vertex="1" parent="1">
<mxGeometry x="462.82000000000005" y="4678" width="39" height="26" as="geometry" />
</mxCell>
<mxCell id="hmBfKhxy8mBhXzrh4bXw-129" value="GUI" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;fontColor=#666666;" vertex="1" parent="1">
<mxGeometry x="462" y="4697" width="39" height="26" as="geometry" />
</mxCell>
<mxCell id="hmBfKhxy8mBhXzrh4bXw-130" value="Images" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;fontColor=#666666;" vertex="1" parent="1">
<mxGeometry x="370.24" y="4653" width="53" height="26" as="geometry" />
</mxCell>
<mxCell id="hmBfKhxy8mBhXzrh4bXw-131" value="&lt;font face=&quot;Courier New&quot;&gt;C++ API&lt;/font&gt;" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#77BBBB;strokeColor=#77BBBB;labelPosition=center;verticalLabelPosition=middle;align=center;verticalAlign=middle;fontSize=17;gradientColor=none;fontColor=#FFFFFF;" vertex="1" parent="1">
<mxGeometry x="-199" y="4999" width="146" height="84" as="geometry" />
</mxCell>
<mxCell id="hmBfKhxy8mBhXzrh4bXw-132" value="&lt;font face=&quot;Courier New&quot;&gt;Python API&lt;/font&gt;&lt;span style=&quot;color: rgba(0, 0, 0, 0); font-family: monospace; font-size: 0px; text-align: start; text-wrap-mode: nowrap;&quot;&gt;%3CmxGraphModel%3E%3Croot%3E%3CmxCell%20id%3D%220%22%2F%3E%3CmxCell%20id%3D%221%22%20parent%3D%220%22%2F%3E%3CmxCell%20id%3D%222%22%20value%3D%22%26lt%3Bfont%20face%3D%26quot%3BCourier%20New%26quot%3B%26gt%3BC%2B%2B%20API%26lt%3B%2Ffont%26gt%3B%22%20style%3D%22rounded%3D1%3BwhiteSpace%3Dwrap%3Bhtml%3D1%3BfillColor%3D%2377AADD%3BstrokeColor%3D%2377AADD%3BlabelPosition%3Dcenter%3BverticalLabelPosition%3Dmiddle%3Balign%3Dcenter%3BverticalAlign%3Dmiddle%3BfontSize%3D17%3BgradientColor%3Dnone%3BfontColor%3D%23FFFFFF%3B%22%20vertex%3D%221%22%20parent%3D%221%22%3E%3CmxGeometry%20x%3D%22-180%22%20y%3D%224998%22%20width%3D%22146%22%20height%3D%2284%22%20as%3D%22geometry%22%2F%3E%3C%2FmxCell%3E%3C%2Froot%3E%3C%2FmxGraphModel%3E&lt;/span&gt;" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#77BBBB;strokeColor=#77BBBB;labelPosition=center;verticalLabelPosition=middle;align=center;verticalAlign=middle;fontSize=17;gradientColor=none;fontColor=#FFFFFF;" vertex="1" parent="1">
<mxGeometry x="-202.75" y="5120" width="146" height="84" as="geometry" />
</mxCell>
<mxCell id="hmBfKhxy8mBhXzrh4bXw-133" value="&lt;font face=&quot;Courier New&quot;&gt;CLI&lt;/font&gt;" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#77BBBB;strokeColor=#77BBBB;labelPosition=center;verticalLabelPosition=middle;align=center;verticalAlign=middle;fontSize=17;gradientColor=none;fontColor=#FFFFFF;" vertex="1" parent="1">
<mxGeometry x="-202.75" y="5240" width="146" height="84" as="geometry" />
</mxCell>
<mxCell id="hmBfKhxy8mBhXzrh4bXw-134" value="&lt;font face=&quot;Courier New&quot;&gt;Qt GUI&lt;/font&gt;" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#77BBBB;strokeColor=#77BBBB;labelPosition=center;verticalLabelPosition=middle;align=center;verticalAlign=middle;fontSize=17;gradientColor=none;fontColor=#FFFFFF;" vertex="1" parent="1">
<mxGeometry x="-202.75" y="5360" width="146" height="84" as="geometry" />
</mxCell>
<mxCell id="hmBfKhxy8mBhXzrh4bXw-135" value="" style="points=[[0.35,0,0],[0.98,0.51,0],[1,0.71,0],[0.67,1,0],[0,0.795,0],[0,0.65,0]];verticalLabelPosition=bottom;sketch=0;html=1;verticalAlign=top;aspect=fixed;align=center;pointerEvents=1;shape=mxgraph.cisco19.user;fillColor=#77BBBB;strokeColor=#77BBBB;" vertex="1" parent="1">
<mxGeometry x="-336.5" y="5154" width="50" height="50" as="geometry" />
</mxCell>
<mxCell id="hmBfKhxy8mBhXzrh4bXw-137" value="&lt;font face=&quot;Courier New&quot;&gt;&amp;lt;&amp;lt;class&amp;gt;&amp;gt; Detector&lt;/font&gt;" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#77BBBB;strokeColor=#77BBBB;labelPosition=center;verticalLabelPosition=middle;align=center;verticalAlign=middle;fontSize=17;gradientColor=none;fontColor=#FFFFFF;" vertex="1" parent="1">
<mxGeometry x="24.710000000000004" y="5239" width="196" height="84" as="geometry" />
</mxCell>
<mxCell id="hmBfKhxy8mBhXzrh4bXw-138" value="Module 3" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#99CCFF;strokeColor=#99CCFF;labelPosition=center;verticalLabelPosition=middle;align=center;verticalAlign=middle;fontSize=17;gradientColor=none;fontColor=#FFFFFF;" vertex="1" parent="1">
<mxGeometry x="-61.06999999999997" y="5622" width="132" height="68" as="geometry" />
</mxCell>
<mxCell id="hmBfKhxy8mBhXzrh4bXw-139" value="Module 2" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#88BBEE;strokeColor=#88BBEE;labelPosition=center;verticalLabelPosition=middle;align=center;verticalAlign=middle;fontSize=17;gradientColor=none;fontColor=#FFFFFF;" vertex="1" parent="1">
<mxGeometry x="-72.06999999999996" y="5615" width="132" height="68" as="geometry" />
</mxCell>
<mxCell id="hmBfKhxy8mBhXzrh4bXw-140" value="Module 1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#77AADD;strokeColor=#77AADD;labelPosition=center;verticalLabelPosition=middle;align=center;verticalAlign=middle;fontSize=17;gradientColor=none;fontColor=#FFFFFF;" vertex="1" parent="1">
<mxGeometry x="-80.06999999999996" y="5607" width="132" height="68" as="geometry" />
</mxCell>
<mxCell id="hmBfKhxy8mBhXzrh4bXw-141" value="Module (s)" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#6699CC;strokeColor=#6699CC;labelPosition=center;verticalLabelPosition=middle;align=center;verticalAlign=middle;fontSize=17;gradientColor=none;fontColor=#FFFFFF;" vertex="1" parent="1">
<mxGeometry x="-87.77000000000001" y="5600" width="132" height="68" as="geometry" />
</mxCell>
<mxCell id="hmBfKhxy8mBhXzrh4bXw-142" value="Module 3" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#99CCFF;strokeColor=#99CCFF;labelPosition=center;verticalLabelPosition=middle;align=center;verticalAlign=middle;fontSize=17;gradientColor=none;fontColor=#FFFFFF;" vertex="1" parent="1">
<mxGeometry x="132.00000000000006" y="5622" width="132" height="68" as="geometry" />
</mxCell>
<mxCell id="hmBfKhxy8mBhXzrh4bXw-143" value="Module 2" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#88BBEE;strokeColor=#88BBEE;labelPosition=center;verticalLabelPosition=middle;align=center;verticalAlign=middle;fontSize=17;gradientColor=none;fontColor=#FFFFFF;" vertex="1" parent="1">
<mxGeometry x="121.00000000000006" y="5615" width="132" height="68" as="geometry" />
</mxCell>
<mxCell id="hmBfKhxy8mBhXzrh4bXw-144" value="Module 1" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#77AADD;strokeColor=#77AADD;labelPosition=center;verticalLabelPosition=middle;align=center;verticalAlign=middle;fontSize=17;gradientColor=none;fontColor=#FFFFFF;" vertex="1" parent="1">
<mxGeometry x="113.00000000000006" y="5607" width="132" height="68" as="geometry" />
</mxCell>
<mxCell id="hmBfKhxy8mBhXzrh4bXw-145" value="Receiver (s)" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#6699CC;strokeColor=#6699CC;labelPosition=center;verticalLabelPosition=middle;align=center;verticalAlign=middle;fontSize=17;gradientColor=none;fontColor=#FFFFFF;" vertex="1" parent="1">
<mxGeometry x="105.30000000000001" y="5600" width="132" height="68" as="geometry" />
</mxCell>
<mxCell id="hmBfKhxy8mBhXzrh4bXw-150" value="" style="endArrow=classic;html=1;rounded=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;strokeColor=#666666;" edge="1" parent="1" target="hmBfKhxy8mBhXzrh4bXw-131">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="-284" y="5189" as="sourcePoint" />
<mxPoint x="-234" y="5139" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="hmBfKhxy8mBhXzrh4bXw-151" value="" style="endArrow=classic;html=1;rounded=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;strokeColor=#666666;" edge="1" parent="1" target="hmBfKhxy8mBhXzrh4bXw-132">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="-284" y="5190" as="sourcePoint" />
<mxPoint x="-234" y="5140" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="hmBfKhxy8mBhXzrh4bXw-152" value="" style="endArrow=classic;html=1;rounded=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;strokeColor=#666666;" edge="1" parent="1" target="hmBfKhxy8mBhXzrh4bXw-133">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="-284" y="5190" as="sourcePoint" />
<mxPoint x="-234" y="5140" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="hmBfKhxy8mBhXzrh4bXw-153" value="" style="endArrow=classic;html=1;rounded=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;strokeColor=#666666;" edge="1" parent="1" target="hmBfKhxy8mBhXzrh4bXw-134">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="-284" y="5190" as="sourcePoint" />
<mxPoint x="-234" y="5140" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="hmBfKhxy8mBhXzrh4bXw-154" value="" style="endArrow=classic;html=1;rounded=0;strokeColor=#666666;exitX=1;exitY=0.401;exitDx=0;exitDy=0;exitPerimeter=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1" source="hmBfKhxy8mBhXzrh4bXw-131" target="hmBfKhxy8mBhXzrh4bXw-137">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="-30.629999999999995" y="5028" as="sourcePoint" />
<mxPoint x="10" y="5010" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="hmBfKhxy8mBhXzrh4bXw-155" value="" style="endArrow=classic;html=1;rounded=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;strokeColor=#666666;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" edge="1" parent="1" source="hmBfKhxy8mBhXzrh4bXw-132" target="hmBfKhxy8mBhXzrh4bXw-137">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="-53" y="5162" as="sourcePoint" />
<mxPoint x="28" y="5134" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="hmBfKhxy8mBhXzrh4bXw-156" value="" style="endArrow=classic;html=1;rounded=0;strokeColor=#666666;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1" source="hmBfKhxy8mBhXzrh4bXw-133" target="hmBfKhxy8mBhXzrh4bXw-137">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="-40" y="5178" as="sourcePoint" />
<mxPoint x="20" y="5170" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="hmBfKhxy8mBhXzrh4bXw-157" value="" style="endArrow=classic;html=1;rounded=0;strokeColor=#666666;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1" source="hmBfKhxy8mBhXzrh4bXw-134" target="hmBfKhxy8mBhXzrh4bXw-137">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="-50" y="5328" as="sourcePoint" />
<mxPoint x="10" y="5040" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="hmBfKhxy8mBhXzrh4bXw-159" value="" style="endArrow=classic;html=1;rounded=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;strokeColor=#666666;exitX=0.5;exitY=1;exitDx=0;exitDy=0;" edge="1" parent="1" source="hmBfKhxy8mBhXzrh4bXw-137" target="hmBfKhxy8mBhXzrh4bXw-146">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="-10" y="5606" as="sourcePoint" />
<mxPoint x="71" y="5578" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="hmBfKhxy8mBhXzrh4bXw-160" value="" style="endArrow=classic;html=1;rounded=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;strokeColor=#666666;exitX=0.5;exitY=1;exitDx=0;exitDy=0;" edge="1" parent="1" source="hmBfKhxy8mBhXzrh4bXw-146" target="hmBfKhxy8mBhXzrh4bXw-141">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="150" y="5518" as="sourcePoint" />
<mxPoint x="231" y="5490" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="hmBfKhxy8mBhXzrh4bXw-161" value="" style="endArrow=classic;html=1;rounded=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;strokeColor=#666666;exitX=0.5;exitY=1;exitDx=0;exitDy=0;" edge="1" parent="1" source="hmBfKhxy8mBhXzrh4bXw-146" target="hmBfKhxy8mBhXzrh4bXw-145">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="123" y="5470" as="sourcePoint" />
<mxPoint x="341" y="5430" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="hmBfKhxy8mBhXzrh4bXw-163" value="slsDetectorPackage&lt;div&gt;Client ( C++17 )&lt;/div&gt;" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;fontSize=17;fontColor=#666666;" vertex="1" parent="1">
<mxGeometry x="-191" y="5478" width="160" height="50" as="geometry" />
</mxCell>
<mxCell id="hmBfKhxy8mBhXzrh4bXw-165" value="CLIENT" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;fontSize=17;fontColor=#666666;" vertex="1" parent="1">
<mxGeometry x="172.38" y="5083" width="80" height="30" as="geometry" />
</mxCell>
<mxCell id="hmBfKhxy8mBhXzrh4bXw-166" value="&lt;font face=&quot;Courier New&quot;&gt;Shared Memory (s)&lt;/font&gt;" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#77BBBB;strokeColor=#77BBBB;labelPosition=center;verticalLabelPosition=middle;align=center;verticalAlign=middle;fontSize=17;gradientColor=none;fontColor=#FFFFFF;" vertex="1" parent="1">
<mxGeometry x="250" y="5311" width="169" height="70" as="geometry" />
</mxCell>
<mxCell id="hmBfKhxy8mBhXzrh4bXw-167" value="" style="endArrow=classic;html=1;rounded=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;strokeColor=#666666;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" edge="1" parent="1" source="hmBfKhxy8mBhXzrh4bXw-137" target="hmBfKhxy8mBhXzrh4bXw-166">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="120" y="5350" as="sourcePoint" />
<mxPoint x="120" y="5408" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="hmBfKhxy8mBhXzrh4bXw-168" value="" style="endArrow=classic;html=1;rounded=0;entryX=0.5;entryY=1;entryDx=0;entryDy=0;strokeColor=#666666;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" edge="1" parent="1" source="hmBfKhxy8mBhXzrh4bXw-146" target="hmBfKhxy8mBhXzrh4bXw-166">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="260" y="5340" as="sourcePoint" />
<mxPoint x="260" y="5398" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="QgYz-w7MwsADk0cZRM1J-14" value="Assembled Data" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;rotation=40;fontColor=#666666;" vertex="1" parent="1">
<mxGeometry x="-271.5" y="2438" width="106" height="26" as="geometry" />
</mxCell>
<mxCell id="QgYz-w7MwsADk0cZRM1J-18" value="&lt;pre style=&quot;&quot;&gt;&lt;span style=&quot;background-color: transparent;&quot;&gt;&lt;font style=&quot;&quot;&gt;Receiver streaming out&lt;br&gt;&lt;font style=&quot;&quot;&gt;rx_zmqport&lt;/font&gt;&amp;nbsp;= &lt;font style=&quot;&quot;&gt;&lt;b style=&quot;&quot;&gt;30001&lt;/b&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;" style="text;html=1;align=left;verticalAlign=middle;resizable=1;points=[];autosize=1;strokeColor=#4A7B72;fillColor=default;fontColor=#4A7B72;movable=1;rotatable=1;deletable=1;editable=1;locked=0;connectable=1;" vertex="1" parent="1">
<mxGeometry x="-130.5" y="2471.13" width="166" height="43.2" as="geometry" />
</mxCell>
<mxCell id="QgYz-w7MwsADk0cZRM1J-19" value="&lt;font face=&quot;Comic Sans MS&quot;&gt;Receiver&lt;/font&gt;&lt;div&gt;&lt;font face=&quot;Comic Sans MS&quot;&gt;pc1234&lt;/font&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;font style=&quot;color: rgb(74, 123, 114);&quot; face=&quot;Comic Sans MS&quot;&gt;129.129.100.115&lt;/font&gt;&lt;/span&gt;&lt;/div&gt;" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#88BBEE;strokeColor=#88BBEE;labelPosition=center;verticalLabelPosition=middle;align=center;verticalAlign=middle;fontSize=17;gradientColor=none;fontColor=#FFFFFF;" vertex="1" parent="1">
<mxGeometry x="46.5" y="2448" width="137" height="85" as="geometry" />
</mxCell>
<mxCell id="QgYz-w7MwsADk0cZRM1J-20" value="&lt;font face=&quot;Courier New&quot;&gt;Receiver&lt;/font&gt;&lt;div&gt;pc1234&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;font style=&quot;color: rgb(74, 123, 114);&quot;&gt;129.129.100.115&lt;/font&gt;&lt;/span&gt;&lt;/div&gt;" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#88BBEE;strokeColor=#88BBEE;labelPosition=center;verticalLabelPosition=middle;align=center;verticalAlign=middle;fontSize=17;gradientColor=none;fontColor=#FFFFFF;fontFamily=Helvetica;" vertex="1" parent="1">
<mxGeometry x="46.5" y="2549.1" width="137" height="85" as="geometry" />
</mxCell>
<mxCell id="QgYz-w7MwsADk0cZRM1J-21" value="&lt;pre style=&quot;&quot;&gt;&lt;pre&gt;&lt;span style=&quot;background-color: transparent;&quot;&gt;&lt;font style=&quot;&quot;&gt;Receiver streaming out&lt;br&gt;&lt;font style=&quot;&quot;&gt;rx_zmqport&lt;/font&gt;&amp;nbsp;= &lt;font style=&quot;&quot;&gt;&lt;b style=&quot;&quot;&gt;30002&lt;/b&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/pre&gt;" style="text;html=1;align=left;verticalAlign=middle;resizable=1;points=[];autosize=1;strokeColor=#4A7B72;fillColor=default;fontColor=#4A7B72;movable=1;rotatable=1;deletable=1;editable=1;locked=0;connectable=1;" vertex="1" parent="1">
<mxGeometry x="-130.5" y="2563.1" width="166" height="44" as="geometry" />
</mxCell>
<mxCell id="QgYz-w7MwsADk0cZRM1J-24" value="&lt;font face=&quot;Comic Sans MS&quot;&gt;Client/ GUI&lt;/font&gt;" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#AAAAFF;strokeColor=#AAAAFF;labelPosition=center;verticalLabelPosition=middle;align=center;verticalAlign=middle;fontSize=17;gradientColor=none;fontColor=#FFFFFF;" vertex="1" parent="1">
<mxGeometry x="-498" y="2235" width="132" height="68" as="geometry" />
</mxCell>
<mxCell id="QgYz-w7MwsADk0cZRM1J-25" value="" style="points=[[0.35,0,0],[0.98,0.51,0],[1,0.71,0],[0.67,1,0],[0,0.795,0],[0,0.65,0]];verticalLabelPosition=bottom;sketch=0;html=1;verticalAlign=top;aspect=fixed;align=center;pointerEvents=1;shape=mxgraph.cisco19.user;fillColor=#AAAAFF;strokeColor=none;" vertex="1" parent="1">
<mxGeometry x="-457.0000000000001" y="2185" width="50" height="50" as="geometry" />
</mxCell>
<mxCell id="QgYz-w7MwsADk0cZRM1J-26" value="&lt;p&gt;&lt;font face=&quot;Courier New&quot; style=&quot;&quot;&gt;Client listening to&amp;nbsp;&lt;br&gt;&lt;font style=&quot;&quot;&gt;zmqport&lt;/font&gt; : &lt;font style=&quot;&quot;&gt;&lt;b style=&quot;&quot;&gt;30001&lt;/b&gt;&lt;/font&gt;&lt;br&gt;&lt;font style=&quot;&quot;&gt;zmqip&lt;/font&gt;&amp;nbsp; &amp;nbsp;: &lt;font style=&quot;&quot;&gt;&lt;b style=&quot;&quot;&gt;129.129.100.115&lt;/b&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;" style="text;html=1;align=left;verticalAlign=middle;resizable=1;points=[];autosize=1;strokeColor=#4A7B72;fillColor=default;fontColor=#4A7B72;movable=1;rotatable=1;deletable=1;editable=1;locked=0;connectable=1;" vertex="1" parent="1">
<mxGeometry x="-559" y="2319.63" width="187" height="56" as="geometry" />
</mxCell>
<mxCell id="kpcteDQP5Q-WdnKVJ5EM-2" value="&lt;font style=&quot;font-size: 17px;&quot; face=&quot;Comic Sans MS&quot;&gt;Detector&lt;/font&gt;" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;fontColor=#737373;" vertex="1" parent="1">
<mxGeometry x="499.15" y="71" width="77" height="32" as="geometry" />
</mxCell>
</root>
</mxGraphModel>
</diagram>
</mxfile>

View File

@@ -1,387 +0,0 @@
.. _binary file format:
Binary File Format
====================
This is the default file format that can be configured using command `fformat <commandline.html#term-fformat-binary-hdf5>`_.
.. code-block:: bash
sls_detector_put fformat binary
Master File
--------------
* File Name: [fpath]/[fname]_master_[findex].json :ref:`Details here<file name format>`
* It is in json format and created for every acquisition.
* It contains :ref:`attributes<master file attributes>` relevant to the acquisition. This can vary with detector type shown in :ref:`master json file examples <json master file examples>` here.
* It shows the :ref:`**SLS Receiver Header** <sls receiver header format>` format used in data files.
* Enabled/disabled using command `fmaster <commandline.html#term-fmaster-0-1>`_.
Data File
----------
* File Name: [fpath]/[fname]_dx_fy_[findex].raw :ref:`Details here<file name format>`
* It store multiple frames sequentially, with total number of frames determined by `rx_framesperfile <commandline.html#term-rx_framesperfile-n_frames>`_ parameter.
* Each frame includes a :ref:`**sls_receiver_header** <sls receiver header format>` structure, followed by the actual frame data.
* More details on :ref:`slsReceiverHeader<sls receiver header format>` and the actual image data is described in the :ref:`Detector Image Size and Format <data format>` section.
.. _json master file examples:
JSON Master File Examples
---------------------------------------------------
Eiger
^^^^^
.. code-block:: text
{
"Version": 7.2,
"Timestamp": "Wed Nov 13 15:46:30 2024",
"Detector Type": "Eiger",
"Timing Mode": "auto",
"Geometry": {
"x": 2,
"y": 1
},
"Image Size in bytes": 262144,
"Pixels": {
"x": 512,
"y": 256
},
"Max Frames Per File": 10000,
"Frame Discard Policy": "nodiscard",
"Frame Padding": 1,
"Scan Parameters": "[disabled]",
"Total Frames": 1,
"Receiver Roi": {
"xmin": 4294967295,
"xmax": 4294967295,
"ymin": 4294967295,
"ymax": 4294967295
},
"Dynamic Range": 16,
"Ten Giga": 0,
"Exptime": "1s",
"Period": "1s",
"Threshold Energy": -1,
"Sub Exptime": "2.62144ms",
"Sub Period": "2.62144ms",
"Quad": 0,
"Number of rows": 256,
"Rate Corrections": "[0]",
"Frames in File": 1,
"Frame Header Format": {
"Frame Number": "8 bytes",
"SubFrame Number/ExpLength": "4 bytes",
"Packet Number": "4 bytes",
"Bunch ID": "8 bytes",
"Timestamp": "8 bytes",
"Module Id": "2 bytes",
"Row": "2 bytes",
"Column": "2 bytes",
"Reserved": "2 bytes",
"Debug": "4 bytes",
"Round Robin Number": "2 bytes",
"Detector Type": "1 byte",
"Header Version": "1 byte",
"Packets Caught Mask": "64 bytes"
}
}
Jungfrau
^^^^^^^^
.. code-block:: text
{
"Version": 7.2,
"Timestamp": "Wed Nov 13 13:03:53 2024",
"Detector Type": "Jungfrau",
"Timing Mode": "auto",
"Geometry": {
"x": 1,
"y": 1
},
"Image Size in bytes": 1048576,
"Pixels": {
"x": 1024,
"y": 512
},
"Max Frames Per File": 10000,
"Frame Discard Policy": "nodiscard",
"Frame Padding": 1,
"Scan Parameters": "[disabled]",
"Total Frames": 1000,
"Receiver Roi": {
"xmin": 4294967295,
"xmax": 4294967295,
"ymin": 4294967295,
"ymax": 4294967295
},
"Exptime": "10us",
"Period": "2ms",
"Number of UDP Interfaces": 1,
"Number of rows": 512,
"Frames in File": 10,
"Frame Header Format": {
"Frame Number": "8 bytes",
"SubFrame Number/ExpLength": "4 bytes",
"Packet Number": "4 bytes",
"Bunch ID": "8 bytes",
"Timestamp": "8 bytes",
"Module Id": "2 bytes",
"Row": "2 bytes",
"Column": "2 bytes",
"Reserved": "2 bytes",
"Debug": "4 bytes",
"Round Robin Number": "2 bytes",
"Detector Type": "1 byte",
"Header Version": "1 byte",
"Packets Caught Mask": "64 bytes"
}
}
Gotthard2
^^^^^^^^^^^^
.. code-block:: text
{
"Version": 7.2,
"Timestamp": "Wed Nov 13 14:18:17 2024",
"Detector Type": "Gotthard2",
"Timing Mode": "auto",
"Geometry": {
"x": 1,
"y": 1
},
"Image Size in bytes": 2560,
"Pixels": {
"x": 1280,
"y": 1
},
"Max Frames Per File": 20000,
"Frame Discard Policy": "nodiscard",
"Frame Padding": 1,
"Scan Parameters": "[disabled]",
"Total Frames": 10,
"Receiver Roi": {
"xmin": 4294967295,
"xmax": 4294967295,
"ymin": 4294967295,
"ymax": 4294967295
},
"Exptime": "0ns",
"Period": "0ns",
"Burst Mode": "burst_internal",
"Frames in File": 10,
"Frame Header Format": {
"Frame Number": "8 bytes",
"SubFrame Number/ExpLength": "4 bytes",
"Packet Number": "4 bytes",
"Bunch ID": "8 bytes",
"Timestamp": "8 bytes",
"Module Id": "2 bytes",
"Row": "2 bytes",
"Column": "2 bytes",
"Reserved": "2 bytes",
"Debug": "4 bytes",
"Round Robin Number": "2 bytes",
"Detector Type": "1 byte",
"Header Version": "1 byte",
"Packets Caught Mask": "64 bytes"
}
}
Mythen3
^^^^^^^
.. code-block:: text
{
"Version": 7.2,
"Timestamp": "Wed Nov 13 14:39:14 2024",
"Detector Type": "Mythen3",
"Timing Mode": "auto",
"Geometry": {
"x": 1,
"y": 1
},
"Image Size in bytes": 15360,
"Pixels": {
"x": 3840,
"y": 1
},
"Max Frames Per File": 10000,
"Frame Discard Policy": "nodiscard",
"Frame Padding": 1,
"Scan Parameters": "[disabled]",
"Total Frames": 1,
"Receiver Roi": {
"xmin": 4294967295,
"xmax": 4294967295,
"ymin": 4294967295,
"ymax": 4294967295
},
"Dynamic Range": 32,
"Ten Giga": 1,
"Period": "2ms",
"Counter Mask": "0x7",
"Exptime1": "0.1s",
"Exptime2": "0.1s",
"Exptime3": "0.1s",
"GateDelay1": "0ns",
"GateDelay2": "0ns",
"GateDelay3": "0ns",
"Gates": 1,
"Threshold Energies": "[-1, -1, -1]",
"Frames in File": 1,
"Frame Header Format": {
"Frame Number": "8 bytes",
"SubFrame Number/ExpLength": "4 bytes",
"Packet Number": "4 bytes",
"Bunch ID": "8 bytes",
"Timestamp": "8 bytes",
"Module Id": "2 bytes",
"Row": "2 bytes",
"Column": "2 bytes",
"Reserved": "2 bytes",
"Debug": "4 bytes",
"Round Robin Number": "2 bytes",
"Detector Type": "1 byte",
"Header Version": "1 byte",
"Packets Caught Mask": "64 bytes"
}
}
Moench
^^^^^^
.. code-block:: text
{
"Version": 7.2,
"Timestamp": "Wed Nov 13 14:41:32 2024",
"Detector Type": "Moench",
"Timing Mode": "auto",
"Geometry": {
"x": 1,
"y": 1
},
"Image Size in bytes": 320000,
"Pixels": {
"x": 400,
"y": 400
},
"Max Frames Per File": 100000,
"Frame Discard Policy": "discardpartial",
"Frame Padding": 1,
"Scan Parameters": "[disabled]",
"Total Frames": 1,
"Receiver Roi": {
"xmin": 4294967295,
"xmax": 4294967295,
"ymin": 4294967295,
"ymax": 4294967295
},
"Exptime": "10us",
"Period": "2ms",
"Number of UDP Interfaces": 1,
"Number of rows": 400,
"Frames in File": 1,
"Frame Header Format": {
"Frame Number": "8 bytes",
"SubFrame Number/ExpLength": "4 bytes",
"Packet Number": "4 bytes",
"Bunch ID": "8 bytes",
"Timestamp": "8 bytes",
"Module Id": "2 bytes",
"Row": "2 bytes",
"Column": "2 bytes",
"Reserved": "2 bytes",
"Debug": "4 bytes",
"Round Robin Number": "2 bytes",
"Detector Type": "1 byte",
"Header Version": "1 byte",
"Packets Caught Mask": "64 bytes"
}
}
Chip Test Board
^^^^^^^^^^^^^^^
.. code-block:: text
{
"Version": 7.2,
"Timestamp": "Wed Nov 13 15:32:59 2024",
"Detector Type": "ChipTestBoard",
"Timing Mode": "auto",
"Geometry": {
"x": 1,
"y": 1
},
"Image Size in bytes": 48018,
"Pixels": {
"x": 3,
"y": 1
},
"Max Frames Per File": 20000,
"Frame Discard Policy": "nodiscard",
"Frame Padding": 1,
"Scan Parameters": "[disabled]",
"Total Frames": 1,
"Receiver Roi": {
"xmin": 4294967295,
"xmax": 4294967295,
"ymin": 4294967295,
"ymax": 4294967295
},
"Exptime": "0ns",
"Period": "0.18s",
"Ten Giga": 0,
"ADC Mask": "0x2202",
"Analog Flag": 1,
"Analog Samples": 8003,
"Digital Flag": 0,
"Digital Samples": 1000,
"Dbit Offset": 0,
"Dbit Reorder": 1,
"Dbit Bitset": 0,
"Transceiver Mask": "0x3",
"Transceiver Flag": 0,
"Transceiver Samples": 1,
"Frames in File": 1,
"Frame Header Format": {
"Frame Number": "8 bytes",
"SubFrame Number/ExpLength": "4 bytes",
"Packet Number": "4 bytes",
"Bunch ID": "8 bytes",
"Timestamp": "8 bytes",
"Module Id": "2 bytes",
"Row": "2 bytes",
"Column": "2 bytes",
"Reserved": "2 bytes",
"Debug": "4 bytes",
"Round Robin Number": "2 bytes",
"Detector Type": "1 byte",
"Header Version": "1 byte",
"Packets Caught Mask": "64 bytes"
}
}

View File

@@ -4,56 +4,11 @@ Command line interface
Usage
-------------
The syntax is *'[detector index]-[module index]:[command]'*, where the indices are by default '0', when not specified.
.. _cl-module-index-label:
Module index
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Modules are indexed based on their order in the hostname command. They are used to configure a specific module within a detector and are followed by a ':' in syntax.
.. code-block::
# Applies to all modules of detector 0
sls_detector_put exptime 5s
# Applies to only the 4th module
sls_detector_put 3:exptime 5s
Detector index
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
This index is useful when configuring multiple detectors from a single host. Each detector uses a unique shared memory identified by a detector index, derived again from the hostname command. It is followed by a '-'.
.. code-block::
# For detector with index 2 in shared memory
sls_detector_put 2-hostname bchip133+bchip123+bchip456
# Without '-', the detector index defaults to 0
sls_detector_put hostname bchip133+bchip123+bchip456
# Accessing all modules with detector index 2
sls_detector_put 2-exptime
# Starting acquisition only for detector with index 2
sls_detector_put 2-start
# Applies only to the 2nd detector, 4th module
sls_detector_put 1-3:exptime 5s
Command Execution
^^^^^^^^^^^^^^^^^^^^^^^
Commands can be executed using:
* **sls_detector_put**: setting values
* **sls_detector_get**: getting values
* **sls_detector**: automatically infers based on the number of arguments.
* **sls_detector_help**: gets help on the specific command
* **sls_detector_acquire**: initiates acquisition with the detector. This command blocks until the entire acquisition process is completed.
Commands can be used either with sls_detector_get or sls_detector_put
.. code-block::
sls_detector_get vrf
Help
--------
@@ -69,19 +24,6 @@ Help
# get help for a particular command
sls_detector_get -h fpath
sls_detector_help fpath
# list of deprecated commands
list deprecated
Autocompletion
---------------
bash_autocomplete.sh or zsh_autocomplete.sh must be sourced from the main package folder to enable auto completion of commands and arguments for the command line on that shell.
.. code-block::
source bash_autocomplete.sh
Commands
@@ -90,14 +32,14 @@ Commands
.. include:: ../commands.rst
Deprecated commands
Depreciated commands
------------------------
.. note ::
All the dac commands are preceded with the **dac** command. Use command **daclist** to get correct list of dac command arguments for current detector.
.. csv-table:: Deprecated commands
:file: ../deprecated.csv
.. csv-table:: Depreciated commands
:file: ../depreciated.csv
:widths: 35, 35
:header-rows: 1

View File

@@ -1,242 +0,0 @@
.. _setup commands:
Setup Commands
================================
Introduction
-------------
To connect to any device, one needs a unique combination of **IP address** (which identifies the device) and **port number** (which specifies the service).
This package typically deals with two types of network interfaces:
* **1 GbE public interface** - Accessible from anywhere on the network. Connectivity can be verified by pinging this interface from any PC.
* **10 GbE private interface** - Dedicated to high-speed data transfer with a specific PC. In addition to the 1 GbE public interface (MTU 1500), the device may include one or more private 10 GbE interfaces (MTU 9000), which are not accessible from other machines.
Client to Module
-----------------
.. figure:: images/Client_module_commands.png
:target: _images/Client_module_commands.png
:width: 700px
:align: center
:alt: Client Module Commands
Client Module TCP Commands
The client configures and controls modules via the 1 GbE public TCP interface.
* Should be able to ping the module's hostname from any PC on the network.
* If one cannot ping, ensure that it is powered on.
* If the command cannot connect to the port (`hostname command <commandline.html#term-hostname>`_ failed), the onboard servers may not have started yet.
Each physical module has its own unique IP address. As the IPs are already different, all modules can share the same default ports:
* 1952 - Default Module TCP Control Port
* 1953 - Default Module TCP Stop port
.. code-block:: bash
# Therefore, one can use
hostname bchip100+bchip101+
# instead of
hostname bchip100:1952+bchip101:1954+
**Simulators**, however, usually run on the same PC. See `virtual servers <https://slsdetectorgroup.github.io/devdoc/virtualserver.html>`_ for more details. In that case, each instance must use a different port. By incrementing port numbers, you can also use the virtual command for convenience.
.. code-block:: bash
# Therefore, one can use
virtual 2 1952
# instead of
hostname localhost:1952+localhost:1954+
Client to Receiver
--------------------
.. figure:: images/Client_receiver_commands.png
:target: _images/Client_receiver_commands.png
:align: center
:alt: Client Receiver Commands
Client Receiver TCP Commands
Each module has a receiver, which can be either local or remote.
The client can configure and control receivers via the 1 GbE public TCP interface:
* Should be able to ping the receiver's hostname from any PC on the network.
* If one cannot ping, ensure that it is powered on.
* If the command cannot connect to the port (`rx_hostname command <commandline.html#term-rx_hostname-hostname-or-ip-address>`_ failed), the receivers may not have started yet.
Since multiple receiver processes typically run on the same PC, they share the same IP. Here, each receiver process must use a different TCP port for a unique connection.
* 1954 - Default Receiver TCP port
Configuring the receiver with the command `rx_hostname command <commandline.html#term-rx_hostname-hostname-or-ip-address>`_, sets up a receiver for every module in shared memory automatically ie. every module's receiver TCP port will automatically increment in shared memory. The starting port is defined by the command `rx_tcpport <commandline.html#term-rx_tcpport-port>`_ with the default being 1954.
A multi-module command (without colon or module index) sets incremental ports starting from the specified port number.
.. code-block:: bash
hostname bchip100+bchip101+bchip102+bchip103+
rx_tcport 2000 # sets the receiver port to 2000, 2001, 2002, 2003
For example, using default TCP ports (1954, 1955):
.. code-block:: bash
hostname bchip100+bchip101+
rx_hostname localhost
# Equivalent to:
rx_hostname localhost:1954+localhost:1955+
# or set to another set of ports (automatically incremented)
rx_tcpport 1984
rx_hostname localhost
# instead of
rx_hostname localhost:1984+localhost:1985+
Module to Receiver
-------------------
.. figure:: images/Module_receiver_commands.png
:target: _images/Module_receiver_commands.png
:align: center
:alt: Module Receiver Commands
Module Receiver UDP Commands
**10GbE Interface**
The module typically sends images to the receiver via a 10 GbE private interface on the receiver PC, which has an MTU of 9000 to support jumbo packets. The private interface is not reachable from other machines, so it cannot be pinged from anywhere.
**Multiple UDP Packets**
Images are split into UDP packets for transmission. Unlike TCP, UDP is connectionless and does not guarantee delivery. Therefore, the receiver PC must be tuned for reliable reception. See `Troubleshooting <https://slsdetectorgroup.github.io/devdoc/troubleshooting.html>`_.
**UDP Configuration**
Unlike TCP, the module (hardware) requires explicit configuration for sending images via UDP, including:
* Source and destination IPs
* Source and destination MAC addresses
* Source and destination ports
**UDP Destination**
Info on where to send the image from the module to.
**UDP Desination IP** - The IP of the receiver PC's 10 GbE interface, usually found via ``ifconfig``. Command: `udp_dstip <commandline.html#term-udp_dstip-x.x.x.x-or-auto>`_. For 1GbE interface and for this command, one can use 'auto' as an argument, which will pick up the IP from the `rx_hostname command <commandline.html#term-rx_hostname-hostname-or-ip-address>`_.
**UDP desintation MAC** - Also obtained from the interface using ``ifconfig``. For built-in receivers, the module configures this automatically from the ``UDP destination IP``. For custom receivers, it must be explicitly provided. Command: `udp_dstmac <commandline.html#term-udp_dstmac-x-x-x-x-x-x>`_
**UDP destination port** - Ensure uniqueness if multiple users share the interface. Command: `udp_dstport <commandline.html#term-udp_dstport-n>`_
* 50001 - Default Receiver UDP port
**UDP Source**
As it is a one-way communication (module to receiver with no reply or acknowledgements), info on the source of the image is more for debugging purposes and prevent packet rejection.
**UDP source IP** - Must be on the same subnet as the destination IP (same first three octets) to prevent packet rejection by the receiver interface. For 1GbE interface and for this command (except for Eiger), one can use ``auto`` as an argument, which will pick up the IP from the `hostname command <commandline.html#term-hostname>`_. Command: `udp_srcip <commandline.html#term-udp_srcip-x.x.x.x-or-auto>`_
.. code-block:: bash
# 10 GbE interface
hostname bchip100
udp_dstip 10.0.2.1
udp_srcip 10.0.2.19
rx_hostname localhost
# 1 GbE interface
hostname bchip100
rx_hostname localhost
udp_dstip auto # this command uses IP from rx_hostname. So, it comes after.
udp_srcip auto # this command uses IP from hostname
**UDP source MAC** - By default, it is set to ``aa:bb:cc:dd:xx:yy`` where ``xx`` and ``yy`` are module row and column indices to differentiate the modules while debugging. Command: `udp_srcmac <commandline.html#term-udp_srcmac-x-x-x-x-x-x>`_
**UDP source port** - This is hardcoded in every module to the same value in the detector server and cannot be changed.
Note: If there is a second UDP port on the module, use 'udp_dstport2' or 'udp_dstip2'etc. See `here <https://slsdetectorgroup.github.io/devdoc/dataformat.html>`_ for more detector specific info.
Receiver to GUI
-----------------
.. figure:: images/Receiver_gui_commands.png
:target: _images/Receiver_gui_commands.png
:align: center
:alt: Receiver GUI Commands
Receiver GUI Commands
Enabling the GUI automatically streams images from the receiver via ZMQ sockets. Even without the GUI, streaming can be activated explicitly using the command `rx_zmqstream <commandline.html#term-rx_zmqstream-0-1>`_. ZMQ streaming uses TCP/IP, so the ports must be configured appropriately.
**Receiver ZMQ Port** - Port from which the receiver streams ZMQ packets. Command: `rx_zmqport <commandline.html#term-rx_zmqport-port>`_
* 30001 - Default Receiver ZMQ Port (stream out from)
**Client ZMQ Port** - Port that the client ZMQ socket listens to. Command: `zmqport <commandline.html#term-zmqport-port>`_
* 30001 - Default Client ZMQ Port (listens to)
**Client ZMQ IP** - IP address the client ZMQ socket listens to. Command: `zmqip <commandline.html#term-zmqip-x.x.x.x>`_. By default, this is set to the IP of ``rx_hostname``, but can be set to any IP address that the client can reach.
* Default: Receivers hostname (rx_hostname)
.. note ::
``zmqport`` and ``zmqip`` need to be set up in shared memory before starting up the Gui. If the Gui is already running, change it in the Advanced Tab directly in the Gui.
``rx_zmqstream`` is set to 1 when the GUI is started, but has to be manually set back to 0 to disable zmq streaming in the receiver for better performance when not using the Gui.
The GUI hwm (high water mark, which is like a measurement of the number of enqueued zmq packets) values are set to a low number (from library default of possibly 1000 to 2) to reduce the zmq buffer to display only some of the images. Resetting it back to -1 or 1000 should only matter if one plans to not use the Gui and still zmq stream without wanting to drop zmq images (eg. for external processing chain).
Receiver to External Processing
--------------------------------
.. figure:: images/Receiver_external_process_commands.png
:target: _images/Receiver_external_process_commands.png
:align: center
:alt: Click to zoom
Receiver External Process Commands
Images from the receiver can also be streamed to an external processing chain for further processing or storage. In this setup:
* The external processor listens to the ZMQ ports and IPs that the receiver streams from.
* The client ZMQ sockets now listen to the ports and IPs that the external processor streams from instead of the receiver.
**Receiver ZMQ Port** - Port from which the receiver streams ZMQ packets. Command: `rx_zmqport <commandline.html#term-rx_zmqport-port>`_
* 30001 - Default Receiver ZMQ Port (stream out from)
**Client ZMQ Port** - Port that the client ZMQ socket listens to. Command: `zmqport <commandline.html#term-zmqport-port>`_. In this set up, it should listen to the zmq port that the external process is streaming out from.
* 30001 - Default Client ZMQ Port (listens to)
**Client ZMQ IP** - IP address the client ZMQ socket listens to. Command: `zmqip <commandline.html#term-zmqip-x.x.x.x>`_. By default, this is set to the IP of ``rx_hostname``, but in this set up, it should listen to the zmq IP that the external process is streaming out from.
* Default: Receivers hostname (rx_hostname)

View File

@@ -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)

View File

@@ -1,330 +0,0 @@
.. _data format:
Detector Image Size and Format
================================
Each UDP port creates its own output file, which contains the data of the image transmitted over that port. More on number of files and naming for each file in the `File format <fileformat.html>`_ section.
Jungfrau
-------------
Single Port Configuration
^^^^^^^^^^^^^^^^^^^^^^^^^^
.. image:: images/Jungfrau_module.png
:target: _images/Jungfrau_module.png
:width: 650px
:align: center
:alt: Jungfrau Module Single Port Configuration
By default, only the outer 10GbE interface is enabled, transmitting the full image over a single UDP port. This results in one file per module containing the complete image.
Total image size = 524,288 bytes
- 8 chips (2 x 4 grid)
- 256 x 256 pixels (chip size)
- 2 bytes (pixel width)
Double Port Configuration
^^^^^^^^^^^^^^^^^^^^^^^^^^
.. image:: images/Jungfrau_two_port.png
:target: _images/Jungfrau_two_port.png
:width: 500px
:align: center
:alt: Jungfrau Module Two Port Configuration
If both interfaces are enabled using the `numinterfaces <commandline.html#term-numinterfaces-1-2>`_ command on compatible hardware and firmware, the image splits into top and bottom halves sent over two UDP ports:
- The top half transmits via the inner interface (`udp_dstport2 <commandline.html#term-udp_dstport2-n>`_ and `udp_dstip2 <commandline.html#term-udp_dstip2-x.x.x.x-or-auto>`_).
- The bottom half uses the outer interface(`udp_dstport <commandline.html#term-udp_dstport-n>`_ and `udp_dstip <commandline.html#term-udp_dstip-x.x.x.x-or-auto>`_).
The number of files per module equals the active UDP ports—two files per module when both interfaces are used.
Image size per UDP port or File = 262,144 bytes
- **Complete Image size / 2**
Read Partial Rows
^^^^^^^^^^^^^^^^^^
.. image:: images/Jungfrau_read_rows.png
:target: _images/Jungfrau_read_rows.png
:width: 550px
:align: center
:alt: Jungfrau Module Read Partial Rows Configuration
The number of image rows per port can be adjusted using the `readnrows <commandline.html#term-readnrows>`_ command. By default, 512 rows are read, but a smaller value centers the readout vertically (e.g., 8 rows reads 4 above and 4 below the center). Increasing the value symmetrically expands the region toward the top and bottom. Permissible values are multiples of 8.
Total image size = 32,768 bytes
- 8 chips (2 x 4 grid)
- **8** x 256 pixels (chip size: **8 rows**)
- 2 bytes (pixel width)
Note: Still in prototype stage, writes complete image (padded or not depending on `rx_padding <commandline.html#term-rx_padding-0-1>`_ parameter) to file. Only the summary written to console in the receiver handles the `readnrows <commandline.html#term-readnrows>`_ to calculate to calculate complete images received. Only reduces network load, not file size. Use `rx_roi <commandline.html#term-rx_roi-xmin-xmax-ymin-ymax>`_ for file size.
Moench
-------------
Single Port Configuration
^^^^^^^^^^^^^^^^^^^^^^^^^^
.. image:: images/Moench_module.png
:target: _images/Moench_module.png
:width: 550px
:align: center
:alt: Moench Module Single Port Configuration
By default, only the outer 10GbE interface is enabled, transmitting the full image over a single UDP port. This results in one file per module containing the complete image.
Total image size = 320,000 bytes
- 400 x 400 pixels (chip size)
- 2 bytes (pixel width)
Double Port Configuration
^^^^^^^^^^^^^^^^^^^^^^^^^^
.. image:: images/Moench_two_port.png
:target: _images/Moench_two_port.png
:width: 400px
:align: center
:alt: Moench Module Two Port Configuration
If both interfaces are enabled using the `numinterfaces <commandline.html#term-numinterfaces-1-2>`_ command on compatible hardware and firmware, the image splits into top and bottom halves sent over two UDP ports:
- The top half transmits via the inner interface (`udp_dstport2 <commandline.html#term-udp_dstport2-n>`_ and `udp_dstip2 <commandline.html#term-udp_dstip2-x.x.x.x-or-auto>`_).
- The bottom half uses the outer interface(`udp_dstport <commandline.html#term-udp_dstport-n>`_ and `udp_dstip <commandline.html#term-udp_dstip-x.x.x.x-or-auto>`_).
The number of files per module equals the active UDP ports—two files per module when both interfaces are used.
Image size per UDP port or File = 160,000 bytes
- **Complete Image size / 2**
Read Partial Rows
^^^^^^^^^^^^^^^^^^
.. image:: images/Moench_read_rows.png
:target: _images/Moench_read_rows.png
:width: 400px
:align: center
:alt: Moench Module Read Partial Rows Configuration
The number of image rows per port can be adjusted using the `readnrows <commandline.html#term-readnrows>`_ command. By default, 400 rows are read, but a smaller value centers the readout vertically (e.g., 16 rows reads 8 above and 8 below the center). Increasing the value symmetrically expands the region toward the top and bottom. Permissible values are multiples of 16.
Total image size = 12,800 bytes
- **16** x 400 pixels (chip size: **16 rows**)
- 2 bytes (pixel width)
Note: Still in prototype stage, writes complete image (padded or not depending on `rx_padding <commandline.html#term-rx_padding-0-1>`_ parameter) to file. Only the summary written to console in the receiver handles the read n rows to calculate complete images received. Only reduces network load, not file size. Use `rx_roi <commandline.html#term-rx_roi-xmin-xmax-ymin-ymax>`_ for file size.
Eiger
-------------
Default Configuration
^^^^^^^^^^^^^^^^^^^^^^^^^^
.. image:: images/Eiger_module.png
:target: _images/Eiger_module.png
:width: 350px
:align: center
:alt: Eiger Module Default Configuration
Each Eiger module has two independent identical readout systems (other than firmware), each with its own control port and `hostname <commandline.html#term-hostname>`_ to be configured with. They are referred to as the 'top' and 'bottom' half modules. The bottom half module is flipped vertically.
Each half module has 2 parallel UDP ports for 2 chips each. The left UDP port is configured with `udp_dstport <commandline.html#term-udp_dstport-n>`_, while the right UDP port is configured with `udp_dstport2 <commandline.html#term-udp_dstport2-n>`_. This is vice versa for the bottom half module.
Image size per UDP port or File = 262,144 bytes
- 2 chips (1 x 2 grid)
- 256 x 256 pixels (chip size)
- 2 bytes (default pixel width)
The myth, the legend, the bottom ports: Demystifying them
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.. figure:: images/Eiger_bottom_1.png
:target: _images/Eiger_bottom_1.png
:width: 350px
:align: center
:alt: Eiger Bottom as Firmware gets it
How the firmware gets the images
.. figure:: images/Eiger_bottom_2.png
:target: _images/Eiger_bottom_2.png
:width: 350px
:align: center
:alt: Eiger Bottom after the firmware flips it horizontally
After the firmware flips it horizontally
.. figure:: images/Eiger_bottom_3.png
:target: _images/Eiger_bottom_3.png
:width: 350px
:align: center
:alt: After the software swaps the udp ports
After the software swaps the udp ports
.. figure:: images/Eiger_bottom_4.png
:target: _images/Eiger_bottom_4.png
:width: 400px
:align: center
:alt: After the gui has flipped the bottom vertically
After the gui has flipped the bottom vertically
Note: The same process happens for the bottom 2 udp ports of the quad.
Pixel width
^^^^^^^^^^^^^
The pixel width can be configured to 4, 8, 16 (default) or 32 bits using the command `dr <commandline.html#term-dr-value>`_. This affects image size per UDP port or file.
Flip rows
^^^^^^^^^^
One can use the command `fliprows <commandline.html#term-fliprows-0-1>`_ to flip the rows vertically for the bottom or top half module. It is sent out to the reciever, but does not flip rows in the output file itself, but rather streams out this info via the json header and thus instructs the GUI to display them correctly.
1GbE/ 10GbE Interfaces
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Both UDP ports `udp_dstport <commandline.html#term-udp_dstport-n>`_ and `udp_dstport2 <commandline.html#term-udp_dstport2-n>`_ are used in Eiger as shows in the figure. Both of them can be set to use either the 1GbE or the 10GbE interface for data. The 1GbE interface is used also for control and configuration. For data, the 1GbE interface is enabled by default. It can be disabled by enabling the `tengiga <commandline.html#term-tengiga-0-1>`_ command and updating both the `udp_dstport <commandline.html#term-udp_dstport-n>`_ , `udp_dstport2 <commandline.html#term-udp_dstport2-n>`_ , `udp_dstip <commandline.html#term-udp_dstip-x.x.x.x-or-auto>`_ commands to match the 1GbE or 10GbE interface. This setting only affects packetsize and number of packets, but does not affect the total image size.
Reducing network load
^^^^^^^^^^^^^^^^^^^^^^
**Activate**: By default, the `hostname <commandline.html#term-hostname>`_ command activates the respective half module it connects to, enabling all UDP ports. To deactivate an entire half module (i.e., both UDP ports), use the `activate <commandline.html#term-activate-0-1>`_ command. This disables both UDP ports for that half module, so no data is transmitted from it — only half of the module is read out. To specify which half module to activate or deactivate, use the module index (for Eiger, each half module has its own module index).
**Datastream**: The `datastream <commandline.html#term-datastream-left-right-0-1>`_ command with arguments to specify which port can be used to disable the data streaming from one or both the two UDP ports in a half module. This allows for more flexible configurations, such as reading only two chips or one UDP port of a half module. To specify which half module to activate or deactivate, use the module index (for Eiger, each half module has its own module index).
Note: Only the activated ports will write data as it does not make sense to write an empty file.
**Read Partial Rows**: The number of image rows per port can be adjusted using the `readnrows <commandline.html#term-readnrows>`_ command. By default, 256 rows are read, but a smaller value centers the readout vertically (e.g., 8 rows reads 4 above and 4 below the center). Increasing the value symmetrically expands the region toward the top and bottom. Permissible values depend on dynamic range and 10GbE enable.
.. image:: images/Eiger_read_rows.png
:target: _images/Eiger_read_rows.png
:width: 400px
:align: center
:alt: Eiger Module Read Partial Rows Configuration
Total image size per UDP Port = 8,192 bytes
- 2 chips (1 x 2 grid)
- **8** x 256 pixels (chip size: **8 rows**)
- 2 bytes (default pixel width)
Note: Still in prototype stage, writes complete image (padded or not depending on `rx_padding <commandline.html#term-rx_padding-0-1>`_ parameter) to file. Only the summary written to console in the receiver handles the `readnrows <commandline.html#term-readnrows>`_ to calculate complete images received. Only reduces network load, not file size. Use `rx_roi <commandline.html#term-rx_roi-xmin-xmax-ymin-ymax>`_ for file size.
Quad
^^^^^^
The Eiger quad is a special hardware configuration that uses only the top half-module to create a quad layout. In this setup, the second half of the top module—normally associated with the right-side UDP port—is used to represent the inverted bottom half of the quad.
As with any standard half-module, it includes one control TCP port (with a hostname) and two UDP data ports (top and bottom). When the quad option is enabled, the firmware automatically flips the second UDP port vertically.
In this configuration, the fliprows command cannot be used to flip the entire half-module. Instead, the receiver automatically includes row-flipping information only for the second UDP port in the JSON header, so the GUI can apply the correct orientation during display
.. image:: images/Eiger_quad.png
:target: _images/Eiger_quad.png
:width: 300px
:align: center
:alt: Eiger Quad Configuration
Image size per UDP port = same as a normal Eiger UDP port
Mythen3
-------------
Default Configuration
^^^^^^^^^^^^^^^^^^^^^^^^^^
.. image:: images/Mythen3_module.png
:target: _images/Mythen3_module.png
:align: center
:alt: Mythen3 Module Default Configuration
Each Mythen3 module is a 1D detector with 10 chips, each with 128 channels. Each channel has 3 counters that are enabled by default.
Image size = 15,360 bytes
- 10 chips (1 x 10 grid)
- 128 channels
- 3 counters
- 4 bytes (default pixel width)
Counters
^^^^^^^^^^^
If all 3 counters are enabeld, the frame size for each channel is multiplied by 3. The counters are stored consecutively per channel. One can disable one or more of the counters using the `counters <commandline.html#term-counters-i0-i1-i2-...>`_ command. The frame size will then be reduced accordingly.
Image size = 10,240 bytes
- 10 chips (1 x 10 grid)
- 128 channels
- 2 counters (0, 1 enabled)
- 4 bytes (default pixel width)
Pixel width
^^^^^^^^^^^^^
The pixel width can be configured to 8, 16 or 32 (default) bits using the command `dr <commandline.html#term-dr-value>`_. 32 bits is actually 24 bits in the chip. This setting does affect image size.
1GbE/ 10GbE Interfaces
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
The UDP port can be set to use either the 1GbE or the 10GbE interface for data. The 1GbE interface is used also for control and configuration. For data, the 10GbE interface is enabled by default. It can be disabled by using the `tengiga <commandline.html#term-tengiga-0-1>`_ command and updating the `udp_dstport <commandline.html#term-udp_dstport-n>`_ and `udp_dstip <commandline.html#term-udp_dstip-x.x.x.x-or-auto>`_ commands to match the 1GbE or 10GbE interface. This setting only affects packetsize and number of packets, but does not affect the total image size.
Gotthard2
-------------
Default Configuration
^^^^^^^^^^^^^^^^^^^^^^^^^^
.. image:: images/Gotthard2_module.png
:target: _images/Gotthard2_module.png
:align: center
:alt: Gotthard2 Module Default Configuration
Each Gotthard2 module is a 1D detector with 10 chips, each with 128 channels.
Image size = 2,560 bytes
- 10 chips (1 x 10 grid)
- 128 channels
- 2 bytes (pixel width)
Veto Info
^^^^^^^^^^^
One can enable veto data in the chip of the Gotthard2 module using the `veto <commandline.html#term-veto-0-1>`_ command. By default, this is disabled. This does not affect the image size as veto information is not sent out through the same 10GbE interface.
One can either stream out the veto info through the low latency link (2.5 gbps) or for debugging purposes through another 10GbE interface.
For debugging purposes, the veto info can be enabled using the `numinterfaces <commandline.html#term-numinterfaces-1-2>`_ command and the following parameters are updated: `udp_dstport2 <commandline.html#term-udp_dstport2-n>`_ and `udp_dstip2 <commandline.html#term-udp_dstip2-x.x.x.x-or-auto>`_. The veto data from this port is of course written to a separate file and is not combined in the virtual HDF5 file mapping (complete image mapped).

View File

@@ -13,41 +13,24 @@ 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
* C++17 compatible compiler. (We test with gcc and clang)
.. note ::
For v9.x.x of slsDetectorPackage and older, C++11 compatible compiler.
-----------------------
Python bindings
-----------------------
* Python >= 3.8
* pybind11 2.13.6 (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>`
* CMake > 3.12
* C++11 compatible compiler. (We test with gcc and clang)
* ZeroMQ version 4
-----------------------
GUI
-----------------------
* Qt 5.9
* Qwt 6.1.5 (packaged in libs)
* Qwt 6.1.5 (packaged in libs/)
-----------------------
Python bindings
-----------------------
* Python > 3.6
* pybind11 (packaged in libs/)
-----------------------
Moench executables
@@ -71,6 +54,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)

View File

@@ -1,17 +1,15 @@
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>`)
Here are some :ref:`examples <Cplusplus Api Examples>` on how to use the API.
containing results from all modules. (Result<T>)
.. doxygenclass:: sls::Detector
:members:

View File

@@ -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);

View File

@@ -1,75 +0,0 @@
.. _file format:
File format
================================
If `fwrite <commandline.html#term-fwrite-0-1>`_ is enabled, the receiver will write data to files.
Number of Files
----------------
Every acquisition will create a master file and data files.
An acquisition can have multiple data files for a single frame. The number of files is determined by the number of UDP ports per module and the number of modules.
* Every modules has its own receiver process. Every receiver process can have 1 or 2 UDP ports.
* Each UDP port will create its own file. Therefore, each receiver can write 1 or 2 files.
* So, for example a detector with 4 modules with 2 UDP ports each will create a total of 8 files with file names containing UDP port index **'_d0'** to **'_d7'**.
A new file containing **'_f[file_index]'** in file name is also created when reaching the maximum frames per file. Configured using `rx_framesperfile <commandline.html#term-rx_framesperfile-n_frames>`_.
.. _file name format:
Naming
-------
| Master File Name: [fpath]/[fname]_master_[findex].[ext]
| Data File Name: [fpath]/[fname]_dx_fy_[findex].[ext]
* fpath: file path set using command `fpath <commandline.html#term-fpath-path>`_. Default: '/'
* fname: file name prefix using command `fname <commandline.html#term-fname-name>`_. Default: "run"
* findex: acquisition index using command `findex <commandline.html#term-findex-n_value>`_. Automatically incremented for every acquisition with `sls_detector_acquire <commandline.html#term-acquire>`_ (if `fwrite <commandline.html#term-fwrite-0-1>`_ enabled).
* x: unique udp port index. New file per UDP port.
* y: file index. New file created after reaching max frames per file.
* ext: file extension. Default: "raw"(data file) or "json"(master file)
Some file name examples:
.. code-block:: bash
# first file
path-to-file/run_d0_f0_0.raw
# first file for second UDP port
path-to-file/run_d1_f0_0.raw
# second file after reaching max frames in first file
path-to-file/run_d0_f1_0.raw
# second acquisition, first file
path-to-file/run_d0_f0_1.raw
Formats
--------
There are 2 file formats supported by the receiver:
* Binary - extension .json (master file) or .raw (data files)
* HDF5 - extension .h5
The default is binary. HDF5 can be enabled by compiling the package with HDF5 option enabled. The file format is set using the command `fformat <commandline.html#term-fformat-binary-hdf5>`_.
Content
--------
| `Master File`: Contains the metadata of the acquisition. The content is described in :ref:`master file attributes <master file attributes>`.
| `Data File`: Contains the metadata for each image (:ref:`slsReceiverHeader<sls receiver header format>`) and the `data of the image` transmitted over that port. The image data is described in :ref:`Detector Image Size and Format <data format>` section.
| More content and examples are found in the :ref:`HDF5 file format <hdf5 file format>` and :ref:`Binary file format <binary file format>` sections.

View File

@@ -1,5 +1,3 @@
.. _firmware upgrade:
Firmware Upgrade
=================
@@ -100,7 +98,7 @@ Upgrade
* 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 <commandline.html#term-updatedetectorserver-server_name-with-full-path>`_.
* 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.
@@ -122,7 +120,7 @@ Program from console
# 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
# v5.0.0 - 6.0.0 (copies server from tftp folder of the pc)
sls_detector_put update jungfrauDetectorServervxxx pcxxx xx.pof
# v6.1.1 - present (copies server from the full path provided)
@@ -133,6 +131,42 @@ Program from console
Gotthard I
-----------
Download
^^^^^^^^^^^^^
- detector server corresponding to package in slsDetectorPackage/serverBin
- `pof files <https://github.com/slsdetectorgroup/slsDetectorFirmware>`__
.. _firmware upgrade using blaster for blackfin:
Upgrade
^^^^^^^^
.. warning ::
| Gotthard firmware cannot be upgraded remotely and requires the use of USB-Blaster.
| It is generally updated by us.
#. Download `Altera Quartus software or Quartus programmer <https://fpgasoftware.intel.com/20.1/?edition=standard&platform=linux&product=qprogrammer#tabs-4>`__.
#. Start Quartus programmer, click on Hardware Setup. In the "Currently selected hardware" window, select USB-Blaster.
#. In the Mode combo box, select "Active Serial Programming".
#. Plug the end of your USB-Blaster with the adaptor provided to the connector 'AS config' on the Gotthard board.
#. Click on 'Add file'. Select programming (pof) file provided by us.
#. Check "Program/Configure" and "Verify". Push the start button. Wait until the programming process is finished.
#. In case of error messages, check the polarity of cable (that pin1 corresponds) and that the correct programming connector is selected.
#. Reboot the detector.
Mythen III
-----------
@@ -156,7 +190,7 @@ Program from console
# 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
# v5.0.0 - 6.0.0 (copies server from tftp folder of the pc)
sls_detector_put update mythen3DetectorServervxxx pcxxx xxx.rbf
# v6.1.1 - present (copies server from the full path provided)
@@ -190,7 +224,7 @@ Program from console
# 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
# v5.0.0 - 6.0.0 (copies server from tftp folder of the pc)
sls_detector_put update gotthard2DetectorServervxxx pcxxx xxx.rbf
# v6.1.1 - present (copies server from the full path provided)
@@ -223,7 +257,7 @@ Upgrade
* 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 <commandline.html#term-updatedetectorserver-server_name-with-full-path>`_.
* 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.
@@ -241,7 +275,7 @@ Program from console
# 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
# v5.0.0 - 6.0.0 (copies server from tftp folder of the pc)
sls_detector_put update moenchDetectorServervxxx pcxxx xx.pof
# v6.1.1 - present (copies server from the full path provided)
@@ -276,7 +310,7 @@ Program from console
# 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
# v5.0.0 - 6.0.0 (copies server from tftp folder of the pc)
sls_detector_put update ctbDetectorServervxxx pcxxx xx.pof
# v6.1.1 - present (copies server from the full path provided)
@@ -362,3 +396,7 @@ How to get back mtd3 drive remotely (udpating kernel)
more /proc/mtd # verify mtd3 is listed
Last Resort using USB Blaster
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
If none of these steps work, the last resort might be physically upgrading the firmware using a USB blaster, which also requires opening up the detector. Instructions for all the blackfin detectors are the same as the one for :ref:`gotthard firmware upgrade <firmware upgrade using blaster for blackfin>`.

View File

@@ -11,7 +11,7 @@
#include <string>
#include <vector>
#include "Caller.h"
#include "CmdProxy.h"
#include "sls/Detector.h"
#include "sls/sls_detector_defs.h"
@@ -37,8 +37,8 @@ int main() {
std::cout << "Generating command line documentation!\n";
sls::Caller caller(nullptr);
auto commands = caller.getAllCommands();
sls::CmdProxy proxy(nullptr);
auto commands = proxy.GetProxyCommands();
std::ofstream fs("commands.rst");
fs << ".. glossary::\n";
@@ -46,7 +46,7 @@ int main() {
for (const auto &cmd : commands) {
std::ostringstream os;
std::cout << cmd << '\n';
caller.call(cmd, {}, -1, slsDetectorDefs::HELP_ACTION, os);
proxy.Call(cmd, {}, -1, slsDetectorDefs::HELP_ACTION, os);
auto tmp = os.str().erase(0, cmd.size());
auto usage = tmp.substr(0, tmp.find_first_of('\n'));
@@ -55,9 +55,9 @@ int main() {
fs << '\t' << cmd << usage << help << "\n";
}
std::ofstream fs2("deprecated.csv");
std::ofstream fs2("depreciated.csv");
fs2 << "Old, New\n";
auto cmds = caller.GetDeprecatedCommands();
auto cmds = proxy.GetDepreciatedCommands();
for (auto it : cmds) {
fs2 << it.first << ", " << it.second << '\n';
}

View File

@@ -1,91 +0,0 @@
.. _hdf5 file format:
HDF5 File Format
================================
Compilation
-------------
#. Compile the package with HDF5 option enabled
#. Using cmk script: ./cmk.sh -hj9 -d [path of hdf5 dir] (-d is optional and for custom installation folder)
#. Enable using cmake option **-DSLS_USE_HDF5=ON** and **-DCMAKE_INSTALL_PREFIX=/path/to/custom/hdf/installation** (optional).
Setup
-------
#. Start Receiver process
#. Load config file
#. Set file format using command `fformat <commandline.html#term-fformat-binary-hdf5>`_.
.. code-block:: bash
sls_detector_put fformat hdf5
Master File
-------------
* File Name: [fpath]/[fname]_master_[findex].h5 :ref:`Details here<file name format>`
* It contains :ref:`attributes<master file attributes>` relevant to the acquisition. This can vary with detector type.
.. code-block:: text
/ # Root level
|---> entry # entry group
| |---> data # data group
| |---> column # dataset of each sls_receiver_header member
| |---> data
| |---> detector header version
| |---> detector specific 1
| |---> detector specific 2
| |---> detector specific 3
| |---> detector specific 4
| |---> detector type
| |---> exp length or sub exposure time
| |---> frame number
| |---> mod id
| |---> packets caught
| |---> packets caught bit mask
| |---> row
| |---> timestamp
| |---> instrument # instrument group
| |---> beam # beam group
| |---> detector # detector group
| |---> Master File Attribute 1 # dataset of each master file attribute
| |---> Master File Attribute 2
| |---> Master File Attribute 3
| |---> Master File Attribute ..
| |---> sample # sample group
If more than 1 data file per frame:
* The dataset of each :ref:`**SLS Receiver Header** <sls receiver header format>` member is a virtual dataset.
* **data** dataset is a virtual dataset.
More details regarding master file attributes can be found :ref:`here<master file attributes>`.
Data File
-----------
* File Name: [fpath]/[fname]_dx_fy_[findex].h5 :ref:`Details here<file name format>`
* More details on :ref:`slsReceiverHeader<sls receiver header format>` and the actual image data is described in the :ref:`Detector Image Size and Format <data format>` section.
Virtual Data File
------------------
* File Name: [fpath]/[fname]_virtual_[findex].h5 :ref:`Details here<file name format>`
* For multiple modules, a virtual file linking data from all the modules is created. The individual files are expected to be present.
* It is linked in the master file.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 111 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 45 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 43 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 118 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 35 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 96 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 47 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 42 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 73 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 88 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 43 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 66 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 113 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 95 KiB

Some files were not shown because too many files have changed in this diff Show More