mirror of
https://github.com/slsdetectorgroup/slsDetectorPackage.git
synced 2025-06-19 00:07:13 +02:00
Compare commits
38 Commits
Author | SHA1 | Date | |
---|---|---|---|
f08006db46 | |||
d5df63ce49 | |||
64d59b1dff | |||
a0bc843018 | |||
6126a401d0 | |||
7665d7b33a | |||
d3d8d7ba8e | |||
938d90bfb8 | |||
990f32397b | |||
53b1456f1a | |||
fbb901c8cc | |||
7b7641fb53 | |||
4de49906d4 | |||
c9b5db4d7f | |||
2e6378f241 | |||
692584ced8 | |||
4ae93dbc73 | |||
f37ceaf517 | |||
75a9002f2c | |||
cfec18e441 | |||
3ff7654c29 | |||
9781dbe49e | |||
e777c0fa79 | |||
9981632b2d | |||
d8436da540 | |||
4dc4c1ec0a | |||
6537aa1ceb | |||
467be41ccb | |||
73a39fcafe | |||
041c9fefa0 | |||
4f4f3baefc | |||
3523de8ba9 | |||
e77a93021d | |||
4dc14bf9d6 | |||
a5cdd687e6 | |||
89175586b4 | |||
c3bbe45b68 | |||
8f64449117 |
@ -4,4 +4,3 @@ IndentWidth: 4
|
|||||||
UseTab: Never
|
UseTab: Never
|
||||||
ColumnLimit: 80
|
ColumnLimit: 80
|
||||||
AlignConsecutiveAssignments: false
|
AlignConsecutiveAssignments: false
|
||||||
AlignConsecutiveMacros: true
|
|
11
.clang-tidy
11
.clang-tidy
@ -1,32 +1,23 @@
|
|||||||
---
|
---
|
||||||
Checks: '*,
|
Checks: '*,
|
||||||
-altera-*,
|
|
||||||
-android-cloexec-fopen,
|
-android-cloexec-fopen,
|
||||||
-cppcoreguidelines-pro-bounds-array-to-pointer-decay,
|
-cppcoreguidelines-pro-bounds-array-to-pointer-decay,
|
||||||
-cppcoreguidelines-pro-bounds-pointer-arithmetic,
|
-cppcoreguidelines-pro-bounds-pointer-arithmetic,
|
||||||
-fuchsia*,
|
-fuchsia*,
|
||||||
-readability-else-after-return,
|
-readability-else-after-return,
|
||||||
-readability-avoid-const-params-in-decls,
|
-readability-avoid-const-params-in-decls,
|
||||||
-readability-identifier-length,
|
|
||||||
-cppcoreguidelines-pro-bounds-constant-array-index,
|
-cppcoreguidelines-pro-bounds-constant-array-index,
|
||||||
-cppcoreguidelines-pro-type-reinterpret-cast,
|
-cppcoreguidelines-pro-type-reinterpret-cast,
|
||||||
-llvm-header-guard,
|
-llvm-header-guard,
|
||||||
-modernize-use-nodiscard,
|
|
||||||
-misc-non-private-member-variables-in-classes,
|
|
||||||
-readability-static-accessed-through-instance,
|
-readability-static-accessed-through-instance,
|
||||||
-readability-braces-around-statements,
|
-readability-braces-around-statements,
|
||||||
-readability-isolate-declaration,
|
|
||||||
-readability-implicit-bool-conversion,
|
|
||||||
-readability-identifier-length,
|
|
||||||
-readability-identifier-naming,
|
|
||||||
-hicpp-signed-bitwise,
|
-hicpp-signed-bitwise,
|
||||||
-hicpp-no-array-decay,
|
-hicpp-no-array-decay,
|
||||||
-hicpp-braces-around-statements,
|
-hicpp-braces-around-statements,
|
||||||
-google-runtime-references,
|
-google-runtime-references,
|
||||||
-google-readability-todo,
|
-google-readability-todo,
|
||||||
-google-readability-braces-around-statements,
|
-google-readability-braces-around-statements,
|
||||||
-modernize-use-trailing-return-type,
|
-modernize-use-trailing-return-type'
|
||||||
-llvmlibc-*'
|
|
||||||
|
|
||||||
HeaderFilterRegex: \.h
|
HeaderFilterRegex: \.h
|
||||||
AnalyzeTemporaryDtors: false
|
AnalyzeTemporaryDtors: false
|
||||||
|
42
.github/ISSUE_TEMPLATE/bug_report.md
vendored
42
.github/ISSUE_TEMPLATE/bug_report.md
vendored
@ -1,42 +0,0 @@
|
|||||||
---
|
|
||||||
name: Bug Report
|
|
||||||
about: Create a report to help us improve
|
|
||||||
title: New Bug Report
|
|
||||||
labels: action - Bug, priority - Unclassified, status - Pending
|
|
||||||
template: bug_report.md
|
|
||||||
---
|
|
||||||
<!-- Preview changes before submitting -->
|
|
||||||
<!-- Please fill out everything with an *, as this report will be discarded otherwise -->
|
|
||||||
<!-- This is a comment, the syntax is a bit different from c++ or bash -->
|
|
||||||
|
|
||||||
##### *Distribution:
|
|
||||||
<!-- RHEL7, RHEL6, Fedora, etc -->
|
|
||||||
|
|
||||||
|
|
||||||
##### *Detector type:
|
|
||||||
<!-- If applicable, Eiger, Jungfrau, Mythen3, Gotthard2, Gotthard, Moench, ChipTestBoard -->
|
|
||||||
|
|
||||||
##### *Software Package Version:
|
|
||||||
<!-- developer, 4.2.0, 4.1.1, etc -->
|
|
||||||
|
|
||||||
##### Priority:
|
|
||||||
<!-- Super Low, Low, Medium, High, Super High -->
|
|
||||||
|
|
||||||
##### *Describe the bug
|
|
||||||
<!-- A clear and concise description of what the bug is -->
|
|
||||||
|
|
||||||
##### Expected behavior
|
|
||||||
<!-- A clear and concise description of what you expected to happen. -->
|
|
||||||
|
|
||||||
##### To Reproduce
|
|
||||||
<!-- Steps to reproduce the behavior: -->
|
|
||||||
<!-- 1. Go to '...' -->
|
|
||||||
<!-- 2. Click on '....' -->
|
|
||||||
<!-- 3. Scroll down to '....' -->
|
|
||||||
<!-- 4. See error -->
|
|
||||||
|
|
||||||
##### Screenshots
|
|
||||||
<!-- If applicable, add screenshots to help explain your problem. -->
|
|
||||||
|
|
||||||
##### Additional context
|
|
||||||
<!-- Add any other context about the problem here. -->
|
|
28
.github/ISSUE_TEMPLATE/change_request.md
vendored
28
.github/ISSUE_TEMPLATE/change_request.md
vendored
@ -1,28 +0,0 @@
|
|||||||
---
|
|
||||||
name: Change Request
|
|
||||||
about: Suggest a change to an existing feature
|
|
||||||
title: New Change Request
|
|
||||||
labels: action - Change, priority - Unclassified, status - Pending
|
|
||||||
template: change_request.md
|
|
||||||
---
|
|
||||||
<!-- Preview changes before submitting -->
|
|
||||||
<!-- Please fill out everything with an *, as this report will be discarded otherwise -->
|
|
||||||
<!-- This is a comment, the syntax is a bit different from c++ or bash -->
|
|
||||||
|
|
||||||
##### *Detector type:
|
|
||||||
<!-- If applicable, Eiger, Jungfrau, Mythen3, Gotthard2, Gotthard, Moench, ChipTestBoard -->
|
|
||||||
|
|
||||||
##### *Software Package Version:
|
|
||||||
<!-- developer, 4.2.0, 4.1.1, etc -->
|
|
||||||
|
|
||||||
##### Priority:
|
|
||||||
<!-- Super Low, Low, Medium, High, Super High -->
|
|
||||||
|
|
||||||
##### *State the change request:
|
|
||||||
<!-- A clear and concise description of what the change is to an existing feature -->
|
|
||||||
|
|
||||||
##### Is your change request related to a problem. Please describe:
|
|
||||||
<!-- A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] -->
|
|
||||||
|
|
||||||
##### Additional context:
|
|
||||||
<!-- Add any other context about the feature here -->
|
|
1
.github/ISSUE_TEMPLATE/config.yml
vendored
1
.github/ISSUE_TEMPLATE/config.yml
vendored
@ -1 +0,0 @@
|
|||||||
blank_issues_enabled: false
|
|
34
.github/ISSUE_TEMPLATE/feature_request.md
vendored
34
.github/ISSUE_TEMPLATE/feature_request.md
vendored
@ -1,34 +0,0 @@
|
|||||||
---
|
|
||||||
name: Feature Request
|
|
||||||
about: Suggest a feature, documentation or submit a question
|
|
||||||
title: New Feature Request
|
|
||||||
labels: action - Enhancement, priority - Unclassified, status - Pending
|
|
||||||
template: feature_request.md
|
|
||||||
---
|
|
||||||
<!-- Preview changes before submitting -->
|
|
||||||
<!-- Please fill out everything with an *, as this report will be discarded otherwise -->
|
|
||||||
<!-- This is a comment, the syntax is a bit different from c++ or bash -->
|
|
||||||
|
|
||||||
##### *Detector type:
|
|
||||||
<!-- If applicable, Eiger, Jungfrau, Mythen3, Gotthard2, Gotthard, Moench, ChipTestBoard -->
|
|
||||||
|
|
||||||
##### *Software Package Version:
|
|
||||||
<!-- developer, 4.2.0, 4.1.1, etc -->
|
|
||||||
|
|
||||||
##### Priority:
|
|
||||||
<!-- Super Low, Low, Medium, High, Super High -->
|
|
||||||
|
|
||||||
##### *State the feature:
|
|
||||||
<!-- A clear and concise description of what the feature is -->
|
|
||||||
|
|
||||||
##### Is your feature request related to a problem. Please describe:
|
|
||||||
<!-- A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] -->
|
|
||||||
|
|
||||||
##### Describe the solution you'd like:
|
|
||||||
<!-- A clear and concise description of what you want to happen -->
|
|
||||||
|
|
||||||
##### Describe alternatives you've considered:
|
|
||||||
<!-- A clear and concise description of any alternative solutions or features you've considered -->
|
|
||||||
|
|
||||||
##### Additional context:
|
|
||||||
<!-- Add any other context about the feature here -->
|
|
47
.github/workflows/cmake.yaml
vendored
47
.github/workflows/cmake.yaml
vendored
@ -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
|
|
||||||
|
|
||||||
- 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
|
|
||||||
|
|
||||||
- name: Python unit tests
|
|
||||||
working-directory: ${{github.workspace}}/build/bin
|
|
||||||
run: |
|
|
||||||
python -m pytest ${{github.workspace}}/python/tests
|
|
||||||
|
|
||||||
|
|
42
.github/workflows/conda_library.yaml
vendored
42
.github/workflows/conda_library.yaml
vendored
@ -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
|
|
42
.github/workflows/conda_python.yaml
vendored
42
.github/workflows/conda_python.yaml
vendored
@ -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
2
.gitignore
vendored
@ -9,7 +9,7 @@ bin/
|
|||||||
*.o
|
*.o
|
||||||
*.so
|
*.so
|
||||||
.*
|
.*
|
||||||
build/
|
build
|
||||||
RELEASE.txt
|
RELEASE.txt
|
||||||
Testing/
|
Testing/
|
||||||
|
|
||||||
|
3
.gitmodules
vendored
3
.gitmodules
vendored
@ -0,0 +1,3 @@
|
|||||||
|
[submodule "python/pybind11"]
|
||||||
|
path = libs/pybind11
|
||||||
|
url = https://github.com/pybind/pybind11.git
|
||||||
|
11
.travis.yml
11
.travis.yml
@ -4,6 +4,12 @@ language: cpp
|
|||||||
|
|
||||||
os: linux
|
os: linux
|
||||||
|
|
||||||
|
# env:
|
||||||
|
# matrix:
|
||||||
|
# - CONDA_PY="3.7"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
dist: bionic
|
dist: bionic
|
||||||
|
|
||||||
install:
|
install:
|
||||||
@ -31,8 +37,7 @@ script:
|
|||||||
|
|
||||||
deploy:
|
deploy:
|
||||||
provider: script
|
provider: script
|
||||||
script: find $HOME/miniconda/envs/testenv/conda-bld/${TRAVIS_OS_NAME}-64 -name "*.tar.bz2" -exec anaconda -v --show-traceback -t $CONDA_TOKEN upload --force {} \;
|
script: find $HOME/miniconda/envs/testenv/conda-bld/${TRAVIS_OS_NAME}-64 -name "*.tar.bz2" -exec anaconda -t $CONDA_TOKEN upload --force {} \;
|
||||||
on:
|
on:
|
||||||
branch: developer
|
branch: udp
|
||||||
tags: true
|
|
||||||
|
|
||||||
|
344
CMakeLists.txt
Normal file → Executable file
344
CMakeLists.txt
Normal file → Executable file
@ -1,95 +1,13 @@
|
|||||||
# SPDX-License-Identifier: LGPL-3.0-or-other
|
cmake_minimum_required(VERSION 3.12)
|
||||||
# Copyright (C) 2021 Contributors to the SLS Detector Package
|
|
||||||
cmake_minimum_required(VERSION 3.15)
|
|
||||||
project(slsDetectorPackage)
|
project(slsDetectorPackage)
|
||||||
|
set(PROJECT_VERSION 5.0.0)
|
||||||
|
include(CheckIPOSupported)
|
||||||
|
|
||||||
# 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(CMAKE_CXX_FLAGS_RELEASE "-O3 -DNDEBUG")
|
|
||||||
|
|
||||||
cmake_policy(SET CMP0074 NEW)
|
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/project_version.cmake)
|
||||||
include(cmake/SlsAddFlag.cmake)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# Using FetchContent to get libzmq
|
|
||||||
include(FetchContent)
|
|
||||||
option(SLS_FETCH_ZMQ_FROM_GITHUB "Fetch zmq from github" OFF)
|
|
||||||
option(SLS_FETCH_PYBIND11_FROM_GITHUB "Fetch pybind11 from github" OFF)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# Allow FetchContent_Populate to be called with a single argument
|
|
||||||
# otherwise deprecated warning is issued
|
|
||||||
# Note: From cmake 3.28 we can pass EXCLUDE_FROM_ALL to FetchContent_Declare
|
|
||||||
# and avoid direct use of Populate
|
|
||||||
if (${CMAKE_VERSION} VERSION_GREATER_EQUAL "3.30")
|
|
||||||
cmake_policy(SET CMP0169 OLD)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# Patch libzmq to set minimum cmake version to 3.15 to avoid warnings
|
|
||||||
# with newer cmake versions
|
|
||||||
# Patch is applied in the FetchContent_Declare
|
|
||||||
set(SLS_LIBZMQ_VERSION "4.3.4")
|
|
||||||
|
|
||||||
|
|
||||||
if(SLS_FETCH_ZMQ_FROM_GITHUB)
|
|
||||||
# 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()
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# Include additional modules that are used unconditionally
|
||||||
include(GNUInstallDirs)
|
include(GNUInstallDirs)
|
||||||
|
|
||||||
# If conda build, always set lib dir to 'lib'
|
# If conda build, always set lib dir to 'lib'
|
||||||
@ -103,7 +21,7 @@ string(TOLOWER "${PROJECT_NAME}" PROJECT_NAME_LOWER)
|
|||||||
|
|
||||||
# Set targets export name (used by slsDetectorPackage and dependencies)
|
# Set targets export name (used by slsDetectorPackage and dependencies)
|
||||||
set(TARGETS_EXPORT_NAME "${PROJECT_NAME_LOWER}-targets")
|
set(TARGETS_EXPORT_NAME "${PROJECT_NAME_LOWER}-targets")
|
||||||
set(namespace "sls::")
|
#set(namespace "${PROJECT_NAME}::")
|
||||||
|
|
||||||
set(CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake" ${CMAKE_MODULE_PATH})
|
set(CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake" ${CMAKE_MODULE_PATH})
|
||||||
|
|
||||||
@ -114,79 +32,18 @@ if (CMAKE_CURRENT_SOURCE_DIR STREQUAL CMAKE_SOURCE_DIR)
|
|||||||
set(SLS_MASTER_PROJECT ON)
|
set(SLS_MASTER_PROJECT ON)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
option (SLS_USE_HDF5 "HDF5 File format" OFF)
|
||||||
|
option (SLS_USE_TEXTCLIENT "Text Client" ON)
|
||||||
option(SLS_USE_HDF5 "HDF5 File format" OFF)
|
option (SLS_USE_RECEIVER "Receiver" ON)
|
||||||
option(SLS_BUILD_SHARED_LIBRARIES "Build shared libaries" ON)
|
option (SLS_USE_GUI "GUI" OFF)
|
||||||
option(SLS_USE_TEXTCLIENT "Text Client" ON)
|
option (SLS_USE_SIMULATOR "Simulator" OFF)
|
||||||
option(SLS_USE_DETECTOR "Detector libs" ON)
|
option (SLS_USE_TESTS "TESTS" OFF)
|
||||||
option(SLS_USE_RECEIVER "Receiver" ON)
|
option (SLS_USE_INTEGRATION_TESTS "Integration Tests" OFF)
|
||||||
option(SLS_USE_RECEIVER_BINARIES "Receiver binaries" ON)
|
|
||||||
option(SLS_USE_GUI "GUI" OFF)
|
|
||||||
option(SLS_USE_SIMULATOR "Simulator" OFF)
|
|
||||||
option(SLS_USE_TESTS "TESTS" OFF)
|
|
||||||
option(SLS_USE_INTEGRATION_TESTS "Integration Tests" OFF)
|
|
||||||
option(SLS_USE_SANITIZER "Sanitizers for debugging" OFF)
|
option(SLS_USE_SANITIZER "Sanitizers for debugging" OFF)
|
||||||
option(SLS_USE_PYTHON "Python bindings" OFF)
|
option(SLS_USE_PYTHON "Python bindings" OFF)
|
||||||
option(SLS_INSTALL_PYTHONEXT "Install the python extension in the install tree under CMAKE_INSTALL_PREFIX/python/" OFF)
|
|
||||||
option(SLS_USE_CTBGUI "ctb GUI" OFF)
|
option(SLS_USE_CTBGUI "ctb GUI" OFF)
|
||||||
option(SLS_BUILD_DOCS "docs" OFF)
|
option(SLS_BUILD_DOCS "docs" OFF)
|
||||||
option(SLS_BUILD_EXAMPLES "examples" OFF)
|
option(SLS_BUILD_EXAMPLES "examples" OFF)
|
||||||
option(SLS_TUNE_LOCAL "tune to local machine" OFF)
|
|
||||||
option(SLS_DEVEL_HEADERS "install headers for devel" OFF)
|
|
||||||
option(SLS_USE_MOENCH "compile zmq and post processing for Moench" OFF)
|
|
||||||
option(SLS_USE_JUNGFRAU "compile post processing for Jungfrau" OFF)
|
|
||||||
|
|
||||||
#Convenience option to switch off defaults when building Moench binaries only
|
|
||||||
option(SLS_BUILD_ONLY_MOENCH "compile only Moench" OFF)
|
|
||||||
if(SLS_BUILD_ONLY_MOENCH)
|
|
||||||
message(STATUS "Build MOENCH binaries only!")
|
|
||||||
set(SLS_BUILD_SHARED_LIBRARIES OFF CACHE BOOL "Disabled for MOENCH_ONLY" FORCE)
|
|
||||||
set(SLS_USE_TEXTCLIENT OFF CACHE BOOL "Disabled for MOENCH_ONLY" FORCE)
|
|
||||||
set(SLS_USE_DETECTOR OFF CACHE BOOL "Disabled for MOENCH_ONLY" FORCE)
|
|
||||||
set(SLS_USE_RECEIVER OFF CACHE BOOL "Disabled for MOENCH_ONLY" FORCE)
|
|
||||||
set(SLS_USE_RECEIVER_BINARIES OFF CACHE BOOL "Disabled for MOENCH_ONLY" FORCE)
|
|
||||||
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)
|
|
||||||
message(STATUS "External build using already installed libraries")
|
|
||||||
set(SLS_BUILD_SHARED_LIBRARIES OFF CACHE BOOL "Should already exist" FORCE)
|
|
||||||
set(SLS_USE_TEXTCLIENT OFF CACHE BOOL "Should already exist" FORCE)
|
|
||||||
set(SLS_USE_DETECTOR OFF CACHE BOOL "Should already exist" FORCE)
|
|
||||||
set(SLS_USE_RECEIVER OFF CACHE BOOL "Should already exist" FORCE)
|
|
||||||
set(SLS_USE_RECEIVER_BINARIES OFF CACHE BOOL "Should already exist" FORCE)
|
|
||||||
set(SLS_MASTER_PROJECT OFF CACHE BOOL "No master proj in case of extbuild" FORCE)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
#Maybe have an option guarding this?
|
|
||||||
set(SLS_INTERNAL_RAPIDJSON_DIR ${CMAKE_CURRENT_SOURCE_DIR}/libs/rapidjson)
|
|
||||||
|
|
||||||
set(SLS_INTERNAL_QWT_DIR ${CMAKE_CURRENT_SOURCE_DIR}/libs/qwt-6.1.5)
|
|
||||||
|
|
||||||
set(ClangFormat_EXCLUDE_PATTERNS "build/"
|
|
||||||
"libs/"
|
|
||||||
"slsDetectorCalibration/"
|
|
||||||
"manual/"
|
|
||||||
"python/"
|
|
||||||
"sample/"
|
|
||||||
${CMAKE_BINARY_DIR})
|
|
||||||
find_package(ClangFormat)
|
|
||||||
|
|
||||||
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
|
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
|
||||||
|
|
||||||
if (NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)
|
if (NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)
|
||||||
@ -195,36 +52,14 @@ if (NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)
|
|||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
|
||||||
#Enable LTO if available
|
#Add two fake libraries to manage options
|
||||||
include(CheckIPOSupported)
|
add_library(slsProjectOptions INTERFACE)
|
||||||
check_ipo_supported(RESULT SLS_LTO_AVAILABLE)
|
add_library(slsProjectWarnings INTERFACE)
|
||||||
if((CMAKE_BUILD_TYPE STREQUAL "Release") AND SLS_LTO_AVAILABLE)
|
target_compile_features(slsProjectOptions INTERFACE cxx_std_11)
|
||||||
message(STATUS "Building with link time optimization")
|
target_compile_options(slsProjectWarnings INTERFACE
|
||||||
else()
|
|
||||||
message(STATUS "Building without link time optimization")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
|
|
||||||
if(SLS_EXT_BUILD)
|
|
||||||
# Find ourself in case of external build
|
|
||||||
find_package(slsDetectorPackage ${PROJECT_VERSION} REQUIRED)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# slsProjectOptions and slsProjectWarnings are used
|
|
||||||
# to control options for the libraries
|
|
||||||
if(NOT TARGET slsProjectOptions)
|
|
||||||
add_library(slsProjectOptions INTERFACE)
|
|
||||||
target_compile_features(slsProjectOptions INTERFACE cxx_std_11)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if (NOT TARGET slsProjectWarnings)
|
|
||||||
add_library(slsProjectWarnings INTERFACE)
|
|
||||||
target_compile_options(slsProjectWarnings INTERFACE
|
|
||||||
-Wall
|
-Wall
|
||||||
-Wextra
|
-Wextra
|
||||||
-Wno-unused-parameter
|
-Wno-unused-parameter #Needs to be slowly mitigated
|
||||||
# -Wold-style-cast
|
# -Wold-style-cast
|
||||||
-Wnon-virtual-dtor
|
-Wnon-virtual-dtor
|
||||||
-Woverloaded-virtual
|
-Woverloaded-virtual
|
||||||
@ -232,92 +67,102 @@ if (NOT TARGET slsProjectWarnings)
|
|||||||
-Wformat=2
|
-Wformat=2
|
||||||
-Wredundant-decls
|
-Wredundant-decls
|
||||||
# -Wconversion
|
# -Wconversion
|
||||||
-Wvla
|
|
||||||
-Wdouble-promotion
|
-Wdouble-promotion
|
||||||
-Werror=return-type
|
-Werror=return-type
|
||||||
)
|
|
||||||
# Add or disable warnings depending on if the compiler supports them
|
|
||||||
# The function checks internally and sets HAS_warning-name
|
|
||||||
sls_enable_cxx_warning("-Wnull-dereference")
|
|
||||||
sls_enable_cxx_warning("-Wduplicated-cond")
|
|
||||||
sls_disable_cxx_warning("-Wclass-memaccess")
|
|
||||||
|
|
||||||
if (CMAKE_CXX_COMPILER_VERSION VERSION_LESS 5 AND "${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU")
|
)
|
||||||
|
|
||||||
|
|
||||||
|
#Testing for minimum version for compilers
|
||||||
|
if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")
|
||||||
|
if (CMAKE_CXX_COMPILER_VERSION VERSION_LESS 3.2)
|
||||||
|
message(FATAL_ERROR "Clang version must be at least 3.2!")
|
||||||
|
endif()
|
||||||
|
target_compile_options(slsProjectWarnings INTERFACE -Wshadow) #Clag does not warn on constructor
|
||||||
|
elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU")
|
||||||
|
if (CMAKE_CXX_COMPILER_VERSION VERSION_LESS 4.8)
|
||||||
|
message(FATAL_ERROR "GCC version must be at least 4.8!")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if (CMAKE_CXX_COMPILER_VERSION VERSION_LESS 5)
|
||||||
target_compile_options(slsProjectWarnings INTERFACE
|
target_compile_options(slsProjectWarnings INTERFACE
|
||||||
-Wno-missing-field-initializers)
|
-Wno-missing-field-initializers)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
if (CMAKE_CXX_COMPILER_VERSION VERSION_GREATER 6.0)
|
||||||
|
target_compile_options(slsProjectWarnings INTERFACE
|
||||||
|
-Wno-misleading-indentation # mostly in rapidjson remove using clang format
|
||||||
|
-Wduplicated-cond
|
||||||
|
-Wnull-dereference )
|
||||||
|
|
||||||
endif()
|
endif()
|
||||||
|
if (CMAKE_CXX_COMPILER_VERSION VERSION_GREATER 8.0)
|
||||||
|
target_compile_options(slsProjectWarnings INTERFACE
|
||||||
|
-Wno-class-memaccess )
|
||||||
|
|
||||||
|
endif()
|
||||||
if (NOT TARGET slsProjectCSettings)
|
|
||||||
#Settings for C code
|
|
||||||
add_library(slsProjectCSettings INTERFACE)
|
|
||||||
target_compile_options(slsProjectCSettings INTERFACE
|
|
||||||
-std=gnu99 #fixed
|
|
||||||
-Wall
|
|
||||||
-Wextra
|
|
||||||
-Wno-unused-parameter
|
|
||||||
-Wdouble-promotion
|
|
||||||
-Wformat=2
|
|
||||||
-Wredundant-decls
|
|
||||||
-Wdouble-promotion
|
|
||||||
-Werror=return-type
|
|
||||||
-Wno-format-overflow
|
|
||||||
-Wno-format-truncation
|
|
||||||
)
|
|
||||||
sls_disable_c_warning("-Wstringop-truncation")
|
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
|
||||||
if(SLS_USE_SANITIZER)
|
if(SLS_USE_SANITIZER)
|
||||||
target_compile_options(slsProjectOptions INTERFACE -fsanitize=address,undefined -fno-omit-frame-pointer)
|
target_compile_options(slsProjectOptions INTERFACE -fsanitize=address,undefined -fno-omit-frame-pointer)
|
||||||
target_link_libraries(slsProjectOptions INTERFACE -fsanitize=address,undefined)
|
target_link_libraries(slsProjectOptions INTERFACE -fsanitize=address,undefined)
|
||||||
#target_compile_options(slsProjectOptions INTERFACE -fsanitize=thread -fno-omit-frame-pointer)
|
# target_compile_options(slsProjectOptions INTERFACE -fsanitize=thread)
|
||||||
#target_link_libraries(slsProjectOptions INTERFACE -fsanitize=thread)
|
# target_link_libraries(slsProjectOptions INTERFACE -fsanitize=thread)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
#rapidjson
|
||||||
|
add_library(rapidjson INTERFACE)
|
||||||
|
target_include_directories(rapidjson INTERFACE
|
||||||
|
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/libs/rapidjson>
|
||||||
|
)
|
||||||
|
|
||||||
if(SLS_TUNE_LOCAL)
|
# Install fake the libraries
|
||||||
target_compile_options(slsProjectOptions INTERFACE -mtune=native -march=native)
|
install(TARGETS slsProjectOptions slsProjectWarnings rapidjson
|
||||||
endif()
|
|
||||||
|
|
||||||
|
|
||||||
if(SLS_MASTER_PROJECT)
|
|
||||||
install(TARGETS slsProjectOptions slsProjectWarnings
|
|
||||||
EXPORT "${TARGETS_EXPORT_NAME}"
|
EXPORT "${TARGETS_EXPORT_NAME}"
|
||||||
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
|
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
|
||||||
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
|
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
|
||||||
PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
|
PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
|
||||||
)
|
)
|
||||||
endif()
|
|
||||||
|
|
||||||
set(CMAKE_POSITION_INDEPENDENT_CODE ON)
|
set(CMAKE_POSITION_INDEPENDENT_CODE ON)
|
||||||
set(CMAKE_INSTALL_RPATH $ORIGIN)
|
set(CMAKE_INSTALL_RPATH $ORIGIN)
|
||||||
|
# set(CMAKE_BUILD_WITH_INSTALL_RPATH TRUE)
|
||||||
set(CMAKE_BUILD_WITH_INSTALL_RPATH FALSE)
|
set(CMAKE_BUILD_WITH_INSTALL_RPATH FALSE)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
find_package(ZeroMQ 4 REQUIRED)
|
||||||
|
|
||||||
if (SLS_USE_TESTS)
|
if (SLS_USE_TESTS)
|
||||||
enable_testing()
|
enable_testing()
|
||||||
add_subdirectory(tests)
|
add_subdirectory(tests)
|
||||||
endif(SLS_USE_TESTS)
|
endif(SLS_USE_TESTS)
|
||||||
|
|
||||||
|
|
||||||
if(NOT SLS_EXT_BUILD)
|
|
||||||
add_subdirectory(slsSupportLib)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if (SLS_USE_DETECTOR OR SLS_USE_TEXTCLIENT)
|
|
||||||
|
# Common functionallity to detector and receiver
|
||||||
|
add_subdirectory(slsSupportLib)
|
||||||
|
|
||||||
|
if (SLS_USE_TEXTCLIENT)
|
||||||
add_subdirectory(slsDetectorSoftware)
|
add_subdirectory(slsDetectorSoftware)
|
||||||
endif ()
|
endif (SLS_USE_TEXTCLIENT)
|
||||||
|
|
||||||
|
|
||||||
if (SLS_USE_RECEIVER)
|
if (SLS_USE_RECEIVER)
|
||||||
|
if (SLS_USE_HDF5)
|
||||||
|
find_package(HDF5 1.10 COMPONENTS CXX REQUIRED)
|
||||||
|
endif (SLS_USE_HDF5)
|
||||||
add_subdirectory(slsReceiverSoftware)
|
add_subdirectory(slsReceiverSoftware)
|
||||||
endif (SLS_USE_RECEIVER)
|
endif (SLS_USE_RECEIVER)
|
||||||
|
|
||||||
if (SLS_USE_GUI)
|
if (SLS_USE_GUI)
|
||||||
add_subdirectory(libs/qwt)
|
find_package(Qt4 REQUIRED)
|
||||||
|
find_package(Qwt 6 REQUIRED)
|
||||||
|
if (QT4_FOUND AND QWT_FOUND)
|
||||||
add_subdirectory(slsDetectorGui)
|
add_subdirectory(slsDetectorGui)
|
||||||
|
endif()
|
||||||
endif (SLS_USE_GUI)
|
endif (SLS_USE_GUI)
|
||||||
|
|
||||||
if (SLS_USE_SIMULATOR)
|
if (SLS_USE_SIMULATOR)
|
||||||
@ -329,40 +174,18 @@ if (SLS_USE_INTEGRATION_TESTS)
|
|||||||
endif (SLS_USE_INTEGRATION_TESTS)
|
endif (SLS_USE_INTEGRATION_TESTS)
|
||||||
|
|
||||||
if (SLS_USE_PYTHON)
|
if (SLS_USE_PYTHON)
|
||||||
find_package (Python 3.8 COMPONENTS Interpreter Development)
|
set(PYBIND11_CPP_STANDARD -std=c++11)
|
||||||
if(SLS_FETCH_PYBIND11_FROM_GITHUB)
|
add_subdirectory(libs/pybind11)
|
||||||
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)
|
|
||||||
|
|
||||||
add_subdirectory(python)
|
add_subdirectory(python)
|
||||||
endif(SLS_USE_PYTHON)
|
endif(SLS_USE_PYTHON)
|
||||||
|
|
||||||
if (SLS_USE_CTBGUI)
|
if (SLS_USE_CTBGUI)
|
||||||
add_subdirectory(pyctbgui)
|
add_subdirectory(ctbGui)
|
||||||
endif(SLS_USE_CTBGUI)
|
endif(SLS_USE_CTBGUI)
|
||||||
|
|
||||||
# Workaround for file note being copied to build directory
|
configure_file( .clang-tidy
|
||||||
# when issuing a python -m build
|
|
||||||
# TODO! Proper fix
|
|
||||||
if(EXISTS ".clang-tidy")
|
|
||||||
configure_file(.clang-tidy
|
|
||||||
${CMAKE_BINARY_DIR}/.clang-tidy
|
${CMAKE_BINARY_DIR}/.clang-tidy
|
||||||
)
|
)
|
||||||
endif()
|
|
||||||
|
|
||||||
|
|
||||||
if (SLS_BUILD_EXAMPLES)
|
if (SLS_BUILD_EXAMPLES)
|
||||||
add_subdirectory(sample)
|
add_subdirectory(sample)
|
||||||
@ -372,18 +195,13 @@ if(SLS_BUILD_DOCS)
|
|||||||
add_subdirectory(docs)
|
add_subdirectory(docs)
|
||||||
endif(SLS_BUILD_DOCS)
|
endif(SLS_BUILD_DOCS)
|
||||||
|
|
||||||
if(SLS_USE_MOENCH)
|
|
||||||
add_subdirectory(slsDetectorCalibration/tiffio)
|
|
||||||
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)
|
if(SLS_MASTER_PROJECT)
|
||||||
set(CMAKE_INSTALL_DIR "share/cmake/${PROJECT_NAME}")
|
# Set install dir CMake packages
|
||||||
set(PROJECT_LIBRARIES slsSupportShared slsDetectorShared slsReceiverShared)
|
set(CMAKE_INSTALL_DIR ${CMAKE_INSTALL_DATADIR}/cmake/sls)
|
||||||
|
# Set the list of exported targets
|
||||||
|
set(PROJECT_LIBRARIES slsSupportLib slsDetectorShared slsReceiverShared)
|
||||||
|
# Generate and install package config file and version
|
||||||
include(cmake/package_config.cmake)
|
include(cmake/package_config.cmake)
|
||||||
endif()
|
endif()
|
17
COPYING
17
COPYING
@ -1,17 +0,0 @@
|
|||||||
The SLS Detector Package is provided under:
|
|
||||||
|
|
||||||
SPDX-License-Identifier: LGPL-3.0-or-later
|
|
||||||
|
|
||||||
Being under the terms of the GNU Lesser General Public License version 3 or later,
|
|
||||||
according with:
|
|
||||||
|
|
||||||
LICENSES/LGPL-3.0
|
|
||||||
|
|
||||||
Source code under the Apache 2.0 License have the SPDX Identifier and are
|
|
||||||
according with:
|
|
||||||
|
|
||||||
LICENSES/ThirdParty/Apache-2.0
|
|
||||||
|
|
||||||
All contributions to the SLS Detector Package are subject to this COPYING file.
|
|
||||||
|
|
||||||
|
|
688
LICENSES/GPL-3.0
688
LICENSES/GPL-3.0
@ -1,688 +0,0 @@
|
|||||||
Valid-License-Identifier: GPL-3.0
|
|
||||||
Valid-License-Identifier: GPL-3.0+
|
|
||||||
SPDX-URL: https://spdx.org/licenses/GPL-3.0-or-later.html
|
|
||||||
Usage-Guide:
|
|
||||||
To use this license in source code, put one of the following SPDX
|
|
||||||
tag/value pairs into a comment according to the placement
|
|
||||||
guidelines in the licensing rules documentation.
|
|
||||||
For 'GNU Library General Public License (LGPL) version 3.0 only' use:
|
|
||||||
SPDX-License-Identifier: GPL-3.0
|
|
||||||
For 'GNU Library General Public License (LGPL) version 3.0 or any later
|
|
||||||
version' use:
|
|
||||||
SPDX-License-Identifier: GPL-3.0-or-later
|
|
||||||
License-Text:
|
|
||||||
|
|
||||||
GNU GENERAL PUBLIC LICENSE
|
|
||||||
Version 3, 29 June 2007
|
|
||||||
|
|
||||||
Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
|
|
||||||
Everyone is permitted to copy and distribute verbatim copies
|
|
||||||
of this license document, but changing it is not allowed.
|
|
||||||
|
|
||||||
Preamble
|
|
||||||
|
|
||||||
The GNU General Public License is a free, copyleft license for
|
|
||||||
software and other kinds of works.
|
|
||||||
|
|
||||||
The licenses for most software and other practical works are designed
|
|
||||||
to take away your freedom to share and change the works. By contrast,
|
|
||||||
the GNU General Public License is intended to guarantee your freedom to
|
|
||||||
share and change all versions of a program--to make sure it remains free
|
|
||||||
software for all its users. We, the Free Software Foundation, use the
|
|
||||||
GNU General Public License for most of our software; it applies also to
|
|
||||||
any other work released this way by its authors. You can apply it to
|
|
||||||
your programs, too.
|
|
||||||
|
|
||||||
When we speak of free software, we are referring to freedom, not
|
|
||||||
price. Our General Public Licenses are designed to make sure that you
|
|
||||||
have the freedom to distribute copies of free software (and charge for
|
|
||||||
them if you wish), that you receive source code or can get it if you
|
|
||||||
want it, that you can change the software or use pieces of it in new
|
|
||||||
free programs, and that you know you can do these things.
|
|
||||||
|
|
||||||
To protect your rights, we need to prevent others from denying you
|
|
||||||
these rights or asking you to surrender the rights. Therefore, you have
|
|
||||||
certain responsibilities if you distribute copies of the software, or if
|
|
||||||
you modify it: responsibilities to respect the freedom of others.
|
|
||||||
|
|
||||||
For example, if you distribute copies of such a program, whether
|
|
||||||
gratis or for a fee, you must pass on to the recipients the same
|
|
||||||
freedoms that you received. You must make sure that they, too, receive
|
|
||||||
or can get the source code. And you must show them these terms so they
|
|
||||||
know their rights.
|
|
||||||
|
|
||||||
Developers that use the GNU GPL protect your rights with two steps:
|
|
||||||
(1) assert copyright on the software, and (2) offer you this License
|
|
||||||
giving you legal permission to copy, distribute and/or modify it.
|
|
||||||
|
|
||||||
For the developers' and authors' protection, the GPL clearly explains
|
|
||||||
that there is no warranty for this free software. For both users' and
|
|
||||||
authors' sake, the GPL requires that modified versions be marked as
|
|
||||||
changed, so that their problems will not be attributed erroneously to
|
|
||||||
authors of previous versions.
|
|
||||||
|
|
||||||
Some devices are designed to deny users access to install or run
|
|
||||||
modified versions of the software inside them, although the manufacturer
|
|
||||||
can do so. This is fundamentally incompatible with the aim of
|
|
||||||
protecting users' freedom to change the software. The systematic
|
|
||||||
pattern of such abuse occurs in the area of products for individuals to
|
|
||||||
use, which is precisely where it is most unacceptable. Therefore, we
|
|
||||||
have designed this version of the GPL to prohibit the practice for those
|
|
||||||
products. If such problems arise substantially in other domains, we
|
|
||||||
stand ready to extend this provision to those domains in future versions
|
|
||||||
of the GPL, as needed to protect the freedom of users.
|
|
||||||
|
|
||||||
Finally, every program is threatened constantly by software patents.
|
|
||||||
States should not allow patents to restrict development and use of
|
|
||||||
software on general-purpose computers, but in those that do, we wish to
|
|
||||||
avoid the special danger that patents applied to a free program could
|
|
||||||
make it effectively proprietary. To prevent this, the GPL assures that
|
|
||||||
patents cannot be used to render the program non-free.
|
|
||||||
|
|
||||||
The precise terms and conditions for copying, distribution and
|
|
||||||
modification follow.
|
|
||||||
|
|
||||||
TERMS AND CONDITIONS
|
|
||||||
|
|
||||||
0. Definitions.
|
|
||||||
|
|
||||||
"This License" refers to version 3 of the GNU General Public License.
|
|
||||||
|
|
||||||
"Copyright" also means copyright-like laws that apply to other kinds of
|
|
||||||
works, such as semiconductor masks.
|
|
||||||
|
|
||||||
"The Program" refers to any copyrightable work licensed under this
|
|
||||||
License. Each licensee is addressed as "you". "Licensees" and
|
|
||||||
"recipients" may be individuals or organizations.
|
|
||||||
|
|
||||||
To "modify" a work means to copy from or adapt all or part of the work
|
|
||||||
in a fashion requiring copyright permission, other than the making of an
|
|
||||||
exact copy. The resulting work is called a "modified version" of the
|
|
||||||
earlier work or a work "based on" the earlier work.
|
|
||||||
|
|
||||||
A "covered work" means either the unmodified Program or a work based
|
|
||||||
on the Program.
|
|
||||||
|
|
||||||
To "propagate" a work means to do anything with it that, without
|
|
||||||
permission, would make you directly or secondarily liable for
|
|
||||||
infringement under applicable copyright law, except executing it on a
|
|
||||||
computer or modifying a private copy. Propagation includes copying,
|
|
||||||
distribution (with or without modification), making available to the
|
|
||||||
public, and in some countries other activities as well.
|
|
||||||
|
|
||||||
To "convey" a work means any kind of propagation that enables other
|
|
||||||
parties to make or receive copies. Mere interaction with a user through
|
|
||||||
a computer network, with no transfer of a copy, is not conveying.
|
|
||||||
|
|
||||||
An interactive user interface displays "Appropriate Legal Notices"
|
|
||||||
to the extent that it includes a convenient and prominently visible
|
|
||||||
feature that (1) displays an appropriate copyright notice, and (2)
|
|
||||||
tells the user that there is no warranty for the work (except to the
|
|
||||||
extent that warranties are provided), that licensees may convey the
|
|
||||||
work under this License, and how to view a copy of this License. If
|
|
||||||
the interface presents a list of user commands or options, such as a
|
|
||||||
menu, a prominent item in the list meets this criterion.
|
|
||||||
|
|
||||||
1. Source Code.
|
|
||||||
|
|
||||||
The "source code" for a work means the preferred form of the work
|
|
||||||
for making modifications to it. "Object code" means any non-source
|
|
||||||
form of a work.
|
|
||||||
|
|
||||||
A "Standard Interface" means an interface that either is an official
|
|
||||||
standard defined by a recognized standards body, or, in the case of
|
|
||||||
interfaces specified for a particular programming language, one that
|
|
||||||
is widely used among developers working in that language.
|
|
||||||
|
|
||||||
The "System Libraries" of an executable work include anything, other
|
|
||||||
than the work as a whole, that (a) is included in the normal form of
|
|
||||||
packaging a Major Component, but which is not part of that Major
|
|
||||||
Component, and (b) serves only to enable use of the work with that
|
|
||||||
Major Component, or to implement a Standard Interface for which an
|
|
||||||
implementation is available to the public in source code form. A
|
|
||||||
"Major Component", in this context, means a major essential component
|
|
||||||
(kernel, window system, and so on) of the specific operating system
|
|
||||||
(if any) on which the executable work runs, or a compiler used to
|
|
||||||
produce the work, or an object code interpreter used to run it.
|
|
||||||
|
|
||||||
The "Corresponding Source" for a work in object code form means all
|
|
||||||
the source code needed to generate, install, and (for an executable
|
|
||||||
work) run the object code and to modify the work, including scripts to
|
|
||||||
control those activities. However, it does not include the work's
|
|
||||||
System Libraries, or general-purpose tools or generally available free
|
|
||||||
programs which are used unmodified in performing those activities but
|
|
||||||
which are not part of the work. For example, Corresponding Source
|
|
||||||
includes interface definition files associated with source files for
|
|
||||||
the work, and the source code for shared libraries and dynamically
|
|
||||||
linked subprograms that the work is specifically designed to require,
|
|
||||||
such as by intimate data communication or control flow between those
|
|
||||||
subprograms and other parts of the work.
|
|
||||||
|
|
||||||
The Corresponding Source need not include anything that users
|
|
||||||
can regenerate automatically from other parts of the Corresponding
|
|
||||||
Source.
|
|
||||||
|
|
||||||
The Corresponding Source for a work in source code form is that
|
|
||||||
same work.
|
|
||||||
|
|
||||||
2. Basic Permissions.
|
|
||||||
|
|
||||||
All rights granted under this License are granted for the term of
|
|
||||||
copyright on the Program, and are irrevocable provided the stated
|
|
||||||
conditions are met. This License explicitly affirms your unlimited
|
|
||||||
permission to run the unmodified Program. The output from running a
|
|
||||||
covered work is covered by this License only if the output, given its
|
|
||||||
content, constitutes a covered work. This License acknowledges your
|
|
||||||
rights of fair use or other equivalent, as provided by copyright law.
|
|
||||||
|
|
||||||
You may make, run and propagate covered works that you do not
|
|
||||||
convey, without conditions so long as your license otherwise remains
|
|
||||||
in force. You may convey covered works to others for the sole purpose
|
|
||||||
of having them make modifications exclusively for you, or provide you
|
|
||||||
with facilities for running those works, provided that you comply with
|
|
||||||
the terms of this License in conveying all material for which you do
|
|
||||||
not control copyright. Those thus making or running the covered works
|
|
||||||
for you must do so exclusively on your behalf, under your direction
|
|
||||||
and control, on terms that prohibit them from making any copies of
|
|
||||||
your copyrighted material outside their relationship with you.
|
|
||||||
|
|
||||||
Conveying under any other circumstances is permitted solely under
|
|
||||||
the conditions stated below. Sublicensing is not allowed; section 10
|
|
||||||
makes it unnecessary.
|
|
||||||
|
|
||||||
3. Protecting Users' Legal Rights From Anti-Circumvention Law.
|
|
||||||
|
|
||||||
No covered work shall be deemed part of an effective technological
|
|
||||||
measure under any applicable law fulfilling obligations under article
|
|
||||||
11 of the WIPO copyright treaty adopted on 20 December 1996, or
|
|
||||||
similar laws prohibiting or restricting circumvention of such
|
|
||||||
measures.
|
|
||||||
|
|
||||||
When you convey a covered work, you waive any legal power to forbid
|
|
||||||
circumvention of technological measures to the extent such circumvention
|
|
||||||
is effected by exercising rights under this License with respect to
|
|
||||||
the covered work, and you disclaim any intention to limit operation or
|
|
||||||
modification of the work as a means of enforcing, against the work's
|
|
||||||
users, your or third parties' legal rights to forbid circumvention of
|
|
||||||
technological measures.
|
|
||||||
|
|
||||||
4. Conveying Verbatim Copies.
|
|
||||||
|
|
||||||
You may convey verbatim copies of the Program's source code as you
|
|
||||||
receive it, in any medium, provided that you conspicuously and
|
|
||||||
appropriately publish on each copy an appropriate copyright notice;
|
|
||||||
keep intact all notices stating that this License and any
|
|
||||||
non-permissive terms added in accord with section 7 apply to the code;
|
|
||||||
keep intact all notices of the absence of any warranty; and give all
|
|
||||||
recipients a copy of this License along with the Program.
|
|
||||||
|
|
||||||
You may charge any price or no price for each copy that you convey,
|
|
||||||
and you may offer support or warranty protection for a fee.
|
|
||||||
|
|
||||||
5. Conveying Modified Source Versions.
|
|
||||||
|
|
||||||
You may convey a work based on the Program, or the modifications to
|
|
||||||
produce it from the Program, in the form of source code under the
|
|
||||||
terms of section 4, provided that you also meet all of these conditions:
|
|
||||||
|
|
||||||
a) The work must carry prominent notices stating that you modified
|
|
||||||
it, and giving a relevant date.
|
|
||||||
|
|
||||||
b) The work must carry prominent notices stating that it is
|
|
||||||
released under this License and any conditions added under section
|
|
||||||
7. This requirement modifies the requirement in section 4 to
|
|
||||||
"keep intact all notices".
|
|
||||||
|
|
||||||
c) You must license the entire work, as a whole, under this
|
|
||||||
License to anyone who comes into possession of a copy. This
|
|
||||||
License will therefore apply, along with any applicable section 7
|
|
||||||
additional terms, to the whole of the work, and all its parts,
|
|
||||||
regardless of how they are packaged. This License gives no
|
|
||||||
permission to license the work in any other way, but it does not
|
|
||||||
invalidate such permission if you have separately received it.
|
|
||||||
|
|
||||||
d) If the work has interactive user interfaces, each must display
|
|
||||||
Appropriate Legal Notices; however, if the Program has interactive
|
|
||||||
interfaces that do not display Appropriate Legal Notices, your
|
|
||||||
work need not make them do so.
|
|
||||||
|
|
||||||
A compilation of a covered work with other separate and independent
|
|
||||||
works, which are not by their nature extensions of the covered work,
|
|
||||||
and which are not combined with it such as to form a larger program,
|
|
||||||
in or on a volume of a storage or distribution medium, is called an
|
|
||||||
"aggregate" if the compilation and its resulting copyright are not
|
|
||||||
used to limit the access or legal rights of the compilation's users
|
|
||||||
beyond what the individual works permit. Inclusion of a covered work
|
|
||||||
in an aggregate does not cause this License to apply to the other
|
|
||||||
parts of the aggregate.
|
|
||||||
|
|
||||||
6. Conveying Non-Source Forms.
|
|
||||||
|
|
||||||
You may convey a covered work in object code form under the terms
|
|
||||||
of sections 4 and 5, provided that you also convey the
|
|
||||||
machine-readable Corresponding Source under the terms of this License,
|
|
||||||
in one of these ways:
|
|
||||||
|
|
||||||
a) Convey the object code in, or embodied in, a physical product
|
|
||||||
(including a physical distribution medium), accompanied by the
|
|
||||||
Corresponding Source fixed on a durable physical medium
|
|
||||||
customarily used for software interchange.
|
|
||||||
|
|
||||||
b) Convey the object code in, or embodied in, a physical product
|
|
||||||
(including a physical distribution medium), accompanied by a
|
|
||||||
written offer, valid for at least three years and valid for as
|
|
||||||
long as you offer spare parts or customer support for that product
|
|
||||||
model, to give anyone who possesses the object code either (1) a
|
|
||||||
copy of the Corresponding Source for all the software in the
|
|
||||||
product that is covered by this License, on a durable physical
|
|
||||||
medium customarily used for software interchange, for a price no
|
|
||||||
more than your reasonable cost of physically performing this
|
|
||||||
conveying of source, or (2) access to copy the
|
|
||||||
Corresponding Source from a network server at no charge.
|
|
||||||
|
|
||||||
c) Convey individual copies of the object code with a copy of the
|
|
||||||
written offer to provide the Corresponding Source. This
|
|
||||||
alternative is allowed only occasionally and noncommercially, and
|
|
||||||
only if you received the object code with such an offer, in accord
|
|
||||||
with subsection 6b.
|
|
||||||
|
|
||||||
d) Convey the object code by offering access from a designated
|
|
||||||
place (gratis or for a charge), and offer equivalent access to the
|
|
||||||
Corresponding Source in the same way through the same place at no
|
|
||||||
further charge. You need not require recipients to copy the
|
|
||||||
Corresponding Source along with the object code. If the place to
|
|
||||||
copy the object code is a network server, the Corresponding Source
|
|
||||||
may be on a different server (operated by you or a third party)
|
|
||||||
that supports equivalent copying facilities, provided you maintain
|
|
||||||
clear directions next to the object code saying where to find the
|
|
||||||
Corresponding Source. Regardless of what server hosts the
|
|
||||||
Corresponding Source, you remain obligated to ensure that it is
|
|
||||||
available for as long as needed to satisfy these requirements.
|
|
||||||
|
|
||||||
e) Convey the object code using peer-to-peer transmission, provided
|
|
||||||
you inform other peers where the object code and Corresponding
|
|
||||||
Source of the work are being offered to the general public at no
|
|
||||||
charge under subsection 6d.
|
|
||||||
|
|
||||||
A separable portion of the object code, whose source code is excluded
|
|
||||||
from the Corresponding Source as a System Library, need not be
|
|
||||||
included in conveying the object code work.
|
|
||||||
|
|
||||||
A "User Product" is either (1) a "consumer product", which means any
|
|
||||||
tangible personal property which is normally used for personal, family,
|
|
||||||
or household purposes, or (2) anything designed or sold for incorporation
|
|
||||||
into a dwelling. In determining whether a product is a consumer product,
|
|
||||||
doubtful cases shall be resolved in favor of coverage. For a particular
|
|
||||||
product received by a particular user, "normally used" refers to a
|
|
||||||
typical or common use of that class of product, regardless of the status
|
|
||||||
of the particular user or of the way in which the particular user
|
|
||||||
actually uses, or expects or is expected to use, the product. A product
|
|
||||||
is a consumer product regardless of whether the product has substantial
|
|
||||||
commercial, industrial or non-consumer uses, unless such uses represent
|
|
||||||
the only significant mode of use of the product.
|
|
||||||
|
|
||||||
"Installation Information" for a User Product means any methods,
|
|
||||||
procedures, authorization keys, or other information required to install
|
|
||||||
and execute modified versions of a covered work in that User Product from
|
|
||||||
a modified version of its Corresponding Source. The information must
|
|
||||||
suffice to ensure that the continued functioning of the modified object
|
|
||||||
code is in no case prevented or interfered with solely because
|
|
||||||
modification has been made.
|
|
||||||
|
|
||||||
If you convey an object code work under this section in, or with, or
|
|
||||||
specifically for use in, a User Product, and the conveying occurs as
|
|
||||||
part of a transaction in which the right of possession and use of the
|
|
||||||
User Product is transferred to the recipient in perpetuity or for a
|
|
||||||
fixed term (regardless of how the transaction is characterized), the
|
|
||||||
Corresponding Source conveyed under this section must be accompanied
|
|
||||||
by the Installation Information. But this requirement does not apply
|
|
||||||
if neither you nor any third party retains the ability to install
|
|
||||||
modified object code on the User Product (for example, the work has
|
|
||||||
been installed in ROM).
|
|
||||||
|
|
||||||
The requirement to provide Installation Information does not include a
|
|
||||||
requirement to continue to provide support service, warranty, or updates
|
|
||||||
for a work that has been modified or installed by the recipient, or for
|
|
||||||
the User Product in which it has been modified or installed. Access to a
|
|
||||||
network may be denied when the modification itself materially and
|
|
||||||
adversely affects the operation of the network or violates the rules and
|
|
||||||
protocols for communication across the network.
|
|
||||||
|
|
||||||
Corresponding Source conveyed, and Installation Information provided,
|
|
||||||
in accord with this section must be in a format that is publicly
|
|
||||||
documented (and with an implementation available to the public in
|
|
||||||
source code form), and must require no special password or key for
|
|
||||||
unpacking, reading or copying.
|
|
||||||
|
|
||||||
7. Additional Terms.
|
|
||||||
|
|
||||||
"Additional permissions" are terms that supplement the terms of this
|
|
||||||
License by making exceptions from one or more of its conditions.
|
|
||||||
Additional permissions that are applicable to the entire Program shall
|
|
||||||
be treated as though they were included in this License, to the extent
|
|
||||||
that they are valid under applicable law. If additional permissions
|
|
||||||
apply only to part of the Program, that part may be used separately
|
|
||||||
under those permissions, but the entire Program remains governed by
|
|
||||||
this License without regard to the additional permissions.
|
|
||||||
|
|
||||||
When you convey a copy of a covered work, you may at your option
|
|
||||||
remove any additional permissions from that copy, or from any part of
|
|
||||||
it. (Additional permissions may be written to require their own
|
|
||||||
removal in certain cases when you modify the work.) You may place
|
|
||||||
additional permissions on material, added by you to a covered work,
|
|
||||||
for which you have or can give appropriate copyright permission.
|
|
||||||
|
|
||||||
Notwithstanding any other provision of this License, for material you
|
|
||||||
add to a covered work, you may (if authorized by the copyright holders of
|
|
||||||
that material) supplement the terms of this License with terms:
|
|
||||||
|
|
||||||
a) Disclaiming warranty or limiting liability differently from the
|
|
||||||
terms of sections 15 and 16 of this License; or
|
|
||||||
|
|
||||||
b) Requiring preservation of specified reasonable legal notices or
|
|
||||||
author attributions in that material or in the Appropriate Legal
|
|
||||||
Notices displayed by works containing it; or
|
|
||||||
|
|
||||||
c) Prohibiting misrepresentation of the origin of that material, or
|
|
||||||
requiring that modified versions of such material be marked in
|
|
||||||
reasonable ways as different from the original version; or
|
|
||||||
|
|
||||||
d) Limiting the use for publicity purposes of names of licensors or
|
|
||||||
authors of the material; or
|
|
||||||
|
|
||||||
e) Declining to grant rights under trademark law for use of some
|
|
||||||
trade names, trademarks, or service marks; or
|
|
||||||
|
|
||||||
f) Requiring indemnification of licensors and authors of that
|
|
||||||
material by anyone who conveys the material (or modified versions of
|
|
||||||
it) with contractual assumptions of liability to the recipient, for
|
|
||||||
any liability that these contractual assumptions directly impose on
|
|
||||||
those licensors and authors.
|
|
||||||
|
|
||||||
All other non-permissive additional terms are considered "further
|
|
||||||
restrictions" within the meaning of section 10. If the Program as you
|
|
||||||
received it, or any part of it, contains a notice stating that it is
|
|
||||||
governed by this License along with a term that is a further
|
|
||||||
restriction, you may remove that term. If a license document contains
|
|
||||||
a further restriction but permits relicensing or conveying under this
|
|
||||||
License, you may add to a covered work material governed by the terms
|
|
||||||
of that license document, provided that the further restriction does
|
|
||||||
not survive such relicensing or conveying.
|
|
||||||
|
|
||||||
If you add terms to a covered work in accord with this section, you
|
|
||||||
must place, in the relevant source files, a statement of the
|
|
||||||
additional terms that apply to those files, or a notice indicating
|
|
||||||
where to find the applicable terms.
|
|
||||||
|
|
||||||
Additional terms, permissive or non-permissive, may be stated in the
|
|
||||||
form of a separately written license, or stated as exceptions;
|
|
||||||
the above requirements apply either way.
|
|
||||||
|
|
||||||
8. Termination.
|
|
||||||
|
|
||||||
You may not propagate or modify a covered work except as expressly
|
|
||||||
provided under this License. Any attempt otherwise to propagate or
|
|
||||||
modify it is void, and will automatically terminate your rights under
|
|
||||||
this License (including any patent licenses granted under the third
|
|
||||||
paragraph of section 11).
|
|
||||||
|
|
||||||
However, if you cease all violation of this License, then your
|
|
||||||
license from a particular copyright holder is reinstated (a)
|
|
||||||
provisionally, unless and until the copyright holder explicitly and
|
|
||||||
finally terminates your license, and (b) permanently, if the copyright
|
|
||||||
holder fails to notify you of the violation by some reasonable means
|
|
||||||
prior to 60 days after the cessation.
|
|
||||||
|
|
||||||
Moreover, your license from a particular copyright holder is
|
|
||||||
reinstated permanently if the copyright holder notifies you of the
|
|
||||||
violation by some reasonable means, this is the first time you have
|
|
||||||
received notice of violation of this License (for any work) from that
|
|
||||||
copyright holder, and you cure the violation prior to 30 days after
|
|
||||||
your receipt of the notice.
|
|
||||||
|
|
||||||
Termination of your rights under this section does not terminate the
|
|
||||||
licenses of parties who have received copies or rights from you under
|
|
||||||
this License. If your rights have been terminated and not permanently
|
|
||||||
reinstated, you do not qualify to receive new licenses for the same
|
|
||||||
material under section 10.
|
|
||||||
|
|
||||||
9. Acceptance Not Required for Having Copies.
|
|
||||||
|
|
||||||
You are not required to accept this License in order to receive or
|
|
||||||
run a copy of the Program. Ancillary propagation of a covered work
|
|
||||||
occurring solely as a consequence of using peer-to-peer transmission
|
|
||||||
to receive a copy likewise does not require acceptance. However,
|
|
||||||
nothing other than this License grants you permission to propagate or
|
|
||||||
modify any covered work. These actions infringe copyright if you do
|
|
||||||
not accept this License. Therefore, by modifying or propagating a
|
|
||||||
covered work, you indicate your acceptance of this License to do so.
|
|
||||||
|
|
||||||
10. Automatic Licensing of Downstream Recipients.
|
|
||||||
|
|
||||||
Each time you convey a covered work, the recipient automatically
|
|
||||||
receives a license from the original licensors, to run, modify and
|
|
||||||
propagate that work, subject to this License. You are not responsible
|
|
||||||
for enforcing compliance by third parties with this License.
|
|
||||||
|
|
||||||
An "entity transaction" is a transaction transferring control of an
|
|
||||||
organization, or substantially all assets of one, or subdividing an
|
|
||||||
organization, or merging organizations. If propagation of a covered
|
|
||||||
work results from an entity transaction, each party to that
|
|
||||||
transaction who receives a copy of the work also receives whatever
|
|
||||||
licenses to the work the party's predecessor in interest had or could
|
|
||||||
give under the previous paragraph, plus a right to possession of the
|
|
||||||
Corresponding Source of the work from the predecessor in interest, if
|
|
||||||
the predecessor has it or can get it with reasonable efforts.
|
|
||||||
|
|
||||||
You may not impose any further restrictions on the exercise of the
|
|
||||||
rights granted or affirmed under this License. For example, you may
|
|
||||||
not impose a license fee, royalty, or other charge for exercise of
|
|
||||||
rights granted under this License, and you may not initiate litigation
|
|
||||||
(including a cross-claim or counterclaim in a lawsuit) alleging that
|
|
||||||
any patent claim is infringed by making, using, selling, offering for
|
|
||||||
sale, or importing the Program or any portion of it.
|
|
||||||
|
|
||||||
11. Patents.
|
|
||||||
|
|
||||||
A "contributor" is a copyright holder who authorizes use under this
|
|
||||||
License of the Program or a work on which the Program is based. The
|
|
||||||
work thus licensed is called the contributor's "contributor version".
|
|
||||||
|
|
||||||
A contributor's "essential patent claims" are all patent claims
|
|
||||||
owned or controlled by the contributor, whether already acquired or
|
|
||||||
hereafter acquired, that would be infringed by some manner, permitted
|
|
||||||
by this License, of making, using, or selling its contributor version,
|
|
||||||
but do not include claims that would be infringed only as a
|
|
||||||
consequence of further modification of the contributor version. For
|
|
||||||
purposes of this definition, "control" includes the right to grant
|
|
||||||
patent sublicenses in a manner consistent with the requirements of
|
|
||||||
this License.
|
|
||||||
|
|
||||||
Each contributor grants you a non-exclusive, worldwide, royalty-free
|
|
||||||
patent license under the contributor's essential patent claims, to
|
|
||||||
make, use, sell, offer for sale, import and otherwise run, modify and
|
|
||||||
propagate the contents of its contributor version.
|
|
||||||
|
|
||||||
In the following three paragraphs, a "patent license" is any express
|
|
||||||
agreement or commitment, however denominated, not to enforce a patent
|
|
||||||
(such as an express permission to practice a patent or covenant not to
|
|
||||||
sue for patent infringement). To "grant" such a patent license to a
|
|
||||||
party means to make such an agreement or commitment not to enforce a
|
|
||||||
patent against the party.
|
|
||||||
|
|
||||||
If you convey a covered work, knowingly relying on a patent license,
|
|
||||||
and the Corresponding Source of the work is not available for anyone
|
|
||||||
to copy, free of charge and under the terms of this License, through a
|
|
||||||
publicly available network server or other readily accessible means,
|
|
||||||
then you must either (1) cause the Corresponding Source to be so
|
|
||||||
available, or (2) arrange to deprive yourself of the benefit of the
|
|
||||||
patent license for this particular work, or (3) arrange, in a manner
|
|
||||||
consistent with the requirements of this License, to extend the patent
|
|
||||||
license to downstream recipients. "Knowingly relying" means you have
|
|
||||||
actual knowledge that, but for the patent license, your conveying the
|
|
||||||
covered work in a country, or your recipient's use of the covered work
|
|
||||||
in a country, would infringe one or more identifiable patents in that
|
|
||||||
country that you have reason to believe are valid.
|
|
||||||
|
|
||||||
If, pursuant to or in connection with a single transaction or
|
|
||||||
arrangement, you convey, or propagate by procuring conveyance of, a
|
|
||||||
covered work, and grant a patent license to some of the parties
|
|
||||||
receiving the covered work authorizing them to use, propagate, modify
|
|
||||||
or convey a specific copy of the covered work, then the patent license
|
|
||||||
you grant is automatically extended to all recipients of the covered
|
|
||||||
work and works based on it.
|
|
||||||
|
|
||||||
A patent license is "discriminatory" if it does not include within
|
|
||||||
the scope of its coverage, prohibits the exercise of, or is
|
|
||||||
conditioned on the non-exercise of one or more of the rights that are
|
|
||||||
specifically granted under this License. You may not convey a covered
|
|
||||||
work if you are a party to an arrangement with a third party that is
|
|
||||||
in the business of distributing software, under which you make payment
|
|
||||||
to the third party based on the extent of your activity of conveying
|
|
||||||
the work, and under which the third party grants, to any of the
|
|
||||||
parties who would receive the covered work from you, a discriminatory
|
|
||||||
patent license (a) in connection with copies of the covered work
|
|
||||||
conveyed by you (or copies made from those copies), or (b) primarily
|
|
||||||
for and in connection with specific products or compilations that
|
|
||||||
contain the covered work, unless you entered into that arrangement,
|
|
||||||
or that patent license was granted, prior to 28 March 2007.
|
|
||||||
|
|
||||||
Nothing in this License shall be construed as excluding or limiting
|
|
||||||
any implied license or other defenses to infringement that may
|
|
||||||
otherwise be available to you under applicable patent law.
|
|
||||||
|
|
||||||
12. No Surrender of Others' Freedom.
|
|
||||||
|
|
||||||
If conditions are imposed on you (whether by court order, agreement or
|
|
||||||
otherwise) that contradict the conditions of this License, they do not
|
|
||||||
excuse you from the conditions of this License. If you cannot convey a
|
|
||||||
covered work so as to satisfy simultaneously your obligations under this
|
|
||||||
License and any other pertinent obligations, then as a consequence you may
|
|
||||||
not convey it at all. For example, if you agree to terms that obligate you
|
|
||||||
to collect a royalty for further conveying from those to whom you convey
|
|
||||||
the Program, the only way you could satisfy both those terms and this
|
|
||||||
License would be to refrain entirely from conveying the Program.
|
|
||||||
|
|
||||||
13. Use with the GNU Affero General Public License.
|
|
||||||
|
|
||||||
Notwithstanding any other provision of this License, you have
|
|
||||||
permission to link or combine any covered work with a work licensed
|
|
||||||
under version 3 of the GNU Affero General Public License into a single
|
|
||||||
combined work, and to convey the resulting work. The terms of this
|
|
||||||
License will continue to apply to the part which is the covered work,
|
|
||||||
but the special requirements of the GNU Affero General Public License,
|
|
||||||
section 13, concerning interaction through a network will apply to the
|
|
||||||
combination as such.
|
|
||||||
|
|
||||||
14. Revised Versions of this License.
|
|
||||||
|
|
||||||
The Free Software Foundation may publish revised and/or new versions of
|
|
||||||
the GNU General Public License from time to time. Such new versions will
|
|
||||||
be similar in spirit to the present version, but may differ in detail to
|
|
||||||
address new problems or concerns.
|
|
||||||
|
|
||||||
Each version is given a distinguishing version number. If the
|
|
||||||
Program specifies that a certain numbered version of the GNU General
|
|
||||||
Public License "or any later version" applies to it, you have the
|
|
||||||
option of following the terms and conditions either of that numbered
|
|
||||||
version or of any later version published by the Free Software
|
|
||||||
Foundation. If the Program does not specify a version number of the
|
|
||||||
GNU General Public License, you may choose any version ever published
|
|
||||||
by the Free Software Foundation.
|
|
||||||
|
|
||||||
If the Program specifies that a proxy can decide which future
|
|
||||||
versions of the GNU General Public License can be used, that proxy's
|
|
||||||
public statement of acceptance of a version permanently authorizes you
|
|
||||||
to choose that version for the Program.
|
|
||||||
|
|
||||||
Later license versions may give you additional or different
|
|
||||||
permissions. However, no additional obligations are imposed on any
|
|
||||||
author or copyright holder as a result of your choosing to follow a
|
|
||||||
later version.
|
|
||||||
|
|
||||||
15. Disclaimer of Warranty.
|
|
||||||
|
|
||||||
THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
|
|
||||||
APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
|
|
||||||
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
|
|
||||||
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
|
|
||||||
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
|
||||||
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
|
|
||||||
IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
|
|
||||||
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
|
|
||||||
|
|
||||||
16. Limitation of Liability.
|
|
||||||
|
|
||||||
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
|
|
||||||
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
|
|
||||||
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
|
|
||||||
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
|
|
||||||
USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
|
|
||||||
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
|
|
||||||
PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
|
|
||||||
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
|
|
||||||
SUCH DAMAGES.
|
|
||||||
|
|
||||||
17. Interpretation of Sections 15 and 16.
|
|
||||||
|
|
||||||
If the disclaimer of warranty and limitation of liability provided
|
|
||||||
above cannot be given local legal effect according to their terms,
|
|
||||||
reviewing courts shall apply local law that most closely approximates
|
|
||||||
an absolute waiver of all civil liability in connection with the
|
|
||||||
Program, unless a warranty or assumption of liability accompanies a
|
|
||||||
copy of the Program in return for a fee.
|
|
||||||
|
|
||||||
END OF TERMS AND CONDITIONS
|
|
||||||
|
|
||||||
How to Apply These Terms to Your New Programs
|
|
||||||
|
|
||||||
If you develop a new program, and you want it to be of the greatest
|
|
||||||
possible use to the public, the best way to achieve this is to make it
|
|
||||||
free software which everyone can redistribute and change under these terms.
|
|
||||||
|
|
||||||
To do so, attach the following notices to the program. It is safest
|
|
||||||
to attach them to the start of each source file to most effectively
|
|
||||||
state the exclusion of warranty; and each file should have at least
|
|
||||||
the "copyright" line and a pointer to where the full notice is found.
|
|
||||||
|
|
||||||
<one line to give the program's name and a brief idea of what it does.>
|
|
||||||
Copyright (C) <year> <name of author>
|
|
||||||
|
|
||||||
This program is free software: you can redistribute it and/or modify
|
|
||||||
it under the terms of the GNU General Public License as published by
|
|
||||||
the Free Software Foundation, either version 3 of the License, or
|
|
||||||
(at your option) any later version.
|
|
||||||
|
|
||||||
This program is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
GNU General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
|
||||||
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
Also add information on how to contact you by electronic and paper mail.
|
|
||||||
|
|
||||||
If the program does terminal interaction, make it output a short
|
|
||||||
notice like this when it starts in an interactive mode:
|
|
||||||
|
|
||||||
<program> Copyright (C) <year> <name of author>
|
|
||||||
This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
|
|
||||||
This is free software, and you are welcome to redistribute it
|
|
||||||
under certain conditions; type `show c' for details.
|
|
||||||
|
|
||||||
The hypothetical commands `show w' and `show c' should show the appropriate
|
|
||||||
parts of the General Public License. Of course, your program's commands
|
|
||||||
might be different; for a GUI interface, you would use an "about box".
|
|
||||||
|
|
||||||
You should also get your employer (if you work as a programmer) or school,
|
|
||||||
if any, to sign a "copyright disclaimer" for the program, if necessary.
|
|
||||||
For more information on this, and how to apply and follow the GNU GPL, see
|
|
||||||
<https://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
The GNU General Public License does not permit incorporating your program
|
|
||||||
into proprietary programs. If your program is a subroutine library, you
|
|
||||||
may consider it more useful to permit linking proprietary applications with
|
|
||||||
the library. If this is what you want to do, use the GNU Lesser General
|
|
||||||
Public License instead of this License. But first, please read
|
|
||||||
<https://www.gnu.org/licenses/why-not-lgpl.html>.
|
|
@ -1,179 +0,0 @@
|
|||||||
Valid-License-Identifier: LGPL-3.0
|
|
||||||
Valid-License-Identifier: LGPL-3.0+
|
|
||||||
SPDX-URL: https://spdx.org/licenses/LGPL-3.0-or-later.html
|
|
||||||
Usage-Guide:
|
|
||||||
To use this license in source code, put one of the following SPDX
|
|
||||||
tag/value pairs into a comment according to the placement
|
|
||||||
guidelines in the licensing rules documentation.
|
|
||||||
For 'GNU Library General Public License (LGPL) version 3.0 only' use:
|
|
||||||
SPDX-License-Identifier: LGPL-3.0
|
|
||||||
For 'GNU Library General Public License (LGPL) version 3.0 or any later
|
|
||||||
version' use:
|
|
||||||
SPDX-License-Identifier: LGPL-3.0-or-later
|
|
||||||
License-Text:
|
|
||||||
|
|
||||||
GNU LESSER GENERAL PUBLIC LICENSE
|
|
||||||
Version 3, 29 June 2007
|
|
||||||
|
|
||||||
Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
|
|
||||||
Everyone is permitted to copy and distribute verbatim copies
|
|
||||||
of this license document, but changing it is not allowed.
|
|
||||||
|
|
||||||
|
|
||||||
This version of the GNU Lesser General Public License incorporates
|
|
||||||
the terms and conditions of version 3 of the GNU General Public
|
|
||||||
License, supplemented by the additional permissions listed below.
|
|
||||||
|
|
||||||
0. Additional Definitions.
|
|
||||||
|
|
||||||
As used herein, "this License" refers to version 3 of the GNU Lesser
|
|
||||||
General Public License, and the "GNU GPL" refers to version 3 of the GNU
|
|
||||||
General Public License.
|
|
||||||
|
|
||||||
"The Library" refers to a covered work governed by this License,
|
|
||||||
other than an Application or a Combined Work as defined below.
|
|
||||||
|
|
||||||
An "Application" is any work that makes use of an interface provided
|
|
||||||
by the Library, but which is not otherwise based on the Library.
|
|
||||||
Defining a subclass of a class defined by the Library is deemed a mode
|
|
||||||
of using an interface provided by the Library.
|
|
||||||
|
|
||||||
A "Combined Work" is a work produced by combining or linking an
|
|
||||||
Application with the Library. The particular version of the Library
|
|
||||||
with which the Combined Work was made is also called the "Linked
|
|
||||||
Version".
|
|
||||||
|
|
||||||
The "Minimal Corresponding Source" for a Combined Work means the
|
|
||||||
Corresponding Source for the Combined Work, excluding any source code
|
|
||||||
for portions of the Combined Work that, considered in isolation, are
|
|
||||||
based on the Application, and not on the Linked Version.
|
|
||||||
|
|
||||||
The "Corresponding Application Code" for a Combined Work means the
|
|
||||||
object code and/or source code for the Application, including any data
|
|
||||||
and utility programs needed for reproducing the Combined Work from the
|
|
||||||
Application, but excluding the System Libraries of the Combined Work.
|
|
||||||
|
|
||||||
1. Exception to Section 3 of the GNU GPL.
|
|
||||||
|
|
||||||
You may convey a covered work under sections 3 and 4 of this License
|
|
||||||
without being bound by section 3 of the GNU GPL.
|
|
||||||
|
|
||||||
2. Conveying Modified Versions.
|
|
||||||
|
|
||||||
If you modify a copy of the Library, and, in your modifications, a
|
|
||||||
facility refers to a function or data to be supplied by an Application
|
|
||||||
that uses the facility (other than as an argument passed when the
|
|
||||||
facility is invoked), then you may convey a copy of the modified
|
|
||||||
version:
|
|
||||||
|
|
||||||
a) under this License, provided that you make a good faith effort to
|
|
||||||
ensure that, in the event an Application does not supply the
|
|
||||||
function or data, the facility still operates, and performs
|
|
||||||
whatever part of its purpose remains meaningful, or
|
|
||||||
|
|
||||||
b) under the GNU GPL, with none of the additional permissions of
|
|
||||||
this License applicable to that copy.
|
|
||||||
|
|
||||||
3. Object Code Incorporating Material from Library Header Files.
|
|
||||||
|
|
||||||
The object code form of an Application may incorporate material from
|
|
||||||
a header file that is part of the Library. You may convey such object
|
|
||||||
code under terms of your choice, provided that, if the incorporated
|
|
||||||
material is not limited to numerical parameters, data structure
|
|
||||||
layouts and accessors, or small macros, inline functions and templates
|
|
||||||
(ten or fewer lines in length), you do both of the following:
|
|
||||||
|
|
||||||
a) Give prominent notice with each copy of the object code that the
|
|
||||||
Library is used in it and that the Library and its use are
|
|
||||||
covered by this License.
|
|
||||||
|
|
||||||
b) Accompany the object code with a copy of the GNU GPL and this license
|
|
||||||
document.
|
|
||||||
|
|
||||||
4. Combined Works.
|
|
||||||
|
|
||||||
You may convey a Combined Work under terms of your choice that,
|
|
||||||
taken together, effectively do not restrict modification of the
|
|
||||||
portions of the Library contained in the Combined Work and reverse
|
|
||||||
engineering for debugging such modifications, if you also do each of
|
|
||||||
the following:
|
|
||||||
|
|
||||||
a) Give prominent notice with each copy of the Combined Work that
|
|
||||||
the Library is used in it and that the Library and its use are
|
|
||||||
covered by this License.
|
|
||||||
|
|
||||||
b) Accompany the Combined Work with a copy of the GNU GPL and this license
|
|
||||||
document.
|
|
||||||
|
|
||||||
c) For a Combined Work that displays copyright notices during
|
|
||||||
execution, include the copyright notice for the Library among
|
|
||||||
these notices, as well as a reference directing the user to the
|
|
||||||
copies of the GNU GPL and this license document.
|
|
||||||
|
|
||||||
d) Do one of the following:
|
|
||||||
|
|
||||||
0) Convey the Minimal Corresponding Source under the terms of this
|
|
||||||
License, and the Corresponding Application Code in a form
|
|
||||||
suitable for, and under terms that permit, the user to
|
|
||||||
recombine or relink the Application with a modified version of
|
|
||||||
the Linked Version to produce a modified Combined Work, in the
|
|
||||||
manner specified by section 6 of the GNU GPL for conveying
|
|
||||||
Corresponding Source.
|
|
||||||
|
|
||||||
1) Use a suitable shared library mechanism for linking with the
|
|
||||||
Library. A suitable mechanism is one that (a) uses at run time
|
|
||||||
a copy of the Library already present on the user's computer
|
|
||||||
system, and (b) will operate properly with a modified version
|
|
||||||
of the Library that is interface-compatible with the Linked
|
|
||||||
Version.
|
|
||||||
|
|
||||||
e) Provide Installation Information, but only if you would otherwise
|
|
||||||
be required to provide such information under section 6 of the
|
|
||||||
GNU GPL, and only to the extent that such information is
|
|
||||||
necessary to install and execute a modified version of the
|
|
||||||
Combined Work produced by recombining or relinking the
|
|
||||||
Application with a modified version of the Linked Version. (If
|
|
||||||
you use option 4d0, the Installation Information must accompany
|
|
||||||
the Minimal Corresponding Source and Corresponding Application
|
|
||||||
Code. If you use option 4d1, you must provide the Installation
|
|
||||||
Information in the manner specified by section 6 of the GNU GPL
|
|
||||||
for conveying Corresponding Source.)
|
|
||||||
|
|
||||||
5. Combined Libraries.
|
|
||||||
|
|
||||||
You may place library facilities that are a work based on the
|
|
||||||
Library side by side in a single library together with other library
|
|
||||||
facilities that are not Applications and are not covered by this
|
|
||||||
License, and convey such a combined library under terms of your
|
|
||||||
choice, if you do both of the following:
|
|
||||||
|
|
||||||
a) Accompany the combined library with a copy of the same work based
|
|
||||||
on the Library, uncombined with any other library facilities,
|
|
||||||
conveyed under the terms of this License.
|
|
||||||
|
|
||||||
b) Give prominent notice with the combined library that part of it
|
|
||||||
is a work based on the Library, and explaining where to find the
|
|
||||||
accompanying uncombined form of the same work.
|
|
||||||
|
|
||||||
6. Revised Versions of the GNU Lesser General Public License.
|
|
||||||
|
|
||||||
The Free Software Foundation may publish revised and/or new versions
|
|
||||||
of the GNU Lesser General Public License from time to time. Such new
|
|
||||||
versions will be similar in spirit to the present version, but may
|
|
||||||
differ in detail to address new problems or concerns.
|
|
||||||
|
|
||||||
Each version is given a distinguishing version number. If the
|
|
||||||
Library as you received it specifies that a certain numbered version
|
|
||||||
of the GNU Lesser General Public License "or any later version"
|
|
||||||
applies to it, you have the option of following the terms and
|
|
||||||
conditions either of that published version or of any later version
|
|
||||||
published by the Free Software Foundation. If the Library as you
|
|
||||||
received it does not specify a version number of the GNU Lesser
|
|
||||||
General Public License, you may choose any version of the GNU Lesser
|
|
||||||
General Public License ever published by the Free Software Foundation.
|
|
||||||
|
|
||||||
If the Library as you received it specifies that a proxy can decide
|
|
||||||
whether future versions of the GNU Lesser General Public License shall
|
|
||||||
apply, that proxy's public statement of acceptance of any version is
|
|
||||||
permanent authorization for you to choose that version for the
|
|
||||||
Library.
|
|
@ -1,210 +0,0 @@
|
|||||||
Valid-License-Identifier: Apache-2.0
|
|
||||||
SPDX-URL: https://spdx.org/licenses/Apache-2.0.html
|
|
||||||
Usage-Guide:
|
|
||||||
To use this license in source code, put one of the following SPDX
|
|
||||||
tag/value pairs into a comment according to the placement
|
|
||||||
guidelines in the licensing rules documentation.
|
|
||||||
SPDX-License-Identifier: Apache-2.0
|
|
||||||
License-Text:
|
|
||||||
|
|
||||||
Apache License
|
|
||||||
Version 2.0, January 2004
|
|
||||||
http://www.apache.org/licenses/
|
|
||||||
|
|
||||||
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
|
||||||
|
|
||||||
1. Definitions.
|
|
||||||
|
|
||||||
"License" shall mean the terms and conditions for use, reproduction,
|
|
||||||
and distribution as defined by Sections 1 through 9 of this document.
|
|
||||||
|
|
||||||
"Licensor" shall mean the copyright owner or entity authorized by
|
|
||||||
the copyright owner that is granting the License.
|
|
||||||
|
|
||||||
"Legal Entity" shall mean the union of the acting entity and all
|
|
||||||
other entities that control, are controlled by, or are under common
|
|
||||||
control with that entity. For the purposes of this definition,
|
|
||||||
"control" means (i) the power, direct or indirect, to cause the
|
|
||||||
direction or management of such entity, whether by contract or
|
|
||||||
otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
|
||||||
outstanding shares, or (iii) beneficial ownership of such entity.
|
|
||||||
|
|
||||||
"You" (or "Your") shall mean an individual or Legal Entity
|
|
||||||
exercising permissions granted by this License.
|
|
||||||
|
|
||||||
"Source" form shall mean the preferred form for making modifications,
|
|
||||||
including but not limited to software source code, documentation
|
|
||||||
source, and configuration files.
|
|
||||||
|
|
||||||
"Object" form shall mean any form resulting from mechanical
|
|
||||||
transformation or translation of a Source form, including but
|
|
||||||
not limited to compiled object code, generated documentation,
|
|
||||||
and conversions to other media types.
|
|
||||||
|
|
||||||
"Work" shall mean the work of authorship, whether in Source or
|
|
||||||
Object form, made available under the License, as indicated by a
|
|
||||||
copyright notice that is included in or attached to the work
|
|
||||||
(an example is provided in the Appendix below).
|
|
||||||
|
|
||||||
"Derivative Works" shall mean any work, whether in Source or Object
|
|
||||||
form, that is based on (or derived from) the Work and for which the
|
|
||||||
editorial revisions, annotations, elaborations, or other modifications
|
|
||||||
represent, as a whole, an original work of authorship. For the purposes
|
|
||||||
of this License, Derivative Works shall not include works that remain
|
|
||||||
separable from, or merely link (or bind by name) to the interfaces of,
|
|
||||||
the Work and Derivative Works thereof.
|
|
||||||
|
|
||||||
"Contribution" shall mean any work of authorship, including
|
|
||||||
the original version of the Work and any modifications or additions
|
|
||||||
to that Work or Derivative Works thereof, that is intentionally
|
|
||||||
submitted to Licensor for inclusion in the Work by the copyright owner
|
|
||||||
or by an individual or Legal Entity authorized to submit on behalf of
|
|
||||||
the copyright owner. For the purposes of this definition, "submitted"
|
|
||||||
means any form of electronic, verbal, or written communication sent
|
|
||||||
to the Licensor or its representatives, including but not limited to
|
|
||||||
communication on electronic mailing lists, source code control systems,
|
|
||||||
and issue tracking systems that are managed by, or on behalf of, the
|
|
||||||
Licensor for the purpose of discussing and improving the Work, but
|
|
||||||
excluding communication that is conspicuously marked or otherwise
|
|
||||||
designated in writing by the copyright owner as "Not a Contribution."
|
|
||||||
|
|
||||||
"Contributor" shall mean Licensor and any individual or Legal Entity
|
|
||||||
on behalf of whom a Contribution has been received by Licensor and
|
|
||||||
subsequently incorporated within the Work.
|
|
||||||
|
|
||||||
2. Grant of Copyright License. Subject to the terms and conditions of
|
|
||||||
this License, each Contributor hereby grants to You a perpetual,
|
|
||||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
|
||||||
copyright license to reproduce, prepare Derivative Works of,
|
|
||||||
publicly display, publicly perform, sublicense, and distribute the
|
|
||||||
Work and such Derivative Works in Source or Object form.
|
|
||||||
|
|
||||||
3. Grant of Patent License. Subject to the terms and conditions of
|
|
||||||
this License, each Contributor hereby grants to You a perpetual,
|
|
||||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
|
||||||
(except as stated in this section) patent license to make, have made,
|
|
||||||
use, offer to sell, sell, import, and otherwise transfer the Work,
|
|
||||||
where such license applies only to those patent claims licensable
|
|
||||||
by such Contributor that are necessarily infringed by their
|
|
||||||
Contribution(s) alone or by combination of their Contribution(s)
|
|
||||||
with the Work to which such Contribution(s) was submitted. If You
|
|
||||||
institute patent litigation against any entity (including a
|
|
||||||
cross-claim or counterclaim in a lawsuit) alleging that the Work
|
|
||||||
or a Contribution incorporated within the Work constitutes direct
|
|
||||||
or contributory patent infringement, then any patent licenses
|
|
||||||
granted to You under this License for that Work shall terminate
|
|
||||||
as of the date such litigation is filed.
|
|
||||||
|
|
||||||
4. Redistribution. You may reproduce and distribute copies of the
|
|
||||||
Work or Derivative Works thereof in any medium, with or without
|
|
||||||
modifications, and in Source or Object form, provided that You
|
|
||||||
meet the following conditions:
|
|
||||||
|
|
||||||
(a) You must give any other recipients of the Work or
|
|
||||||
Derivative Works a copy of this License; and
|
|
||||||
|
|
||||||
(b) You must cause any modified files to carry prominent notices
|
|
||||||
stating that You changed the files; and
|
|
||||||
|
|
||||||
(c) You must retain, in the Source form of any Derivative Works
|
|
||||||
that You distribute, all copyright, patent, trademark, and
|
|
||||||
attribution notices from the Source form of the Work,
|
|
||||||
excluding those notices that do not pertain to any part of
|
|
||||||
the Derivative Works; and
|
|
||||||
|
|
||||||
(d) If the Work includes a "NOTICE" text file as part of its
|
|
||||||
distribution, then any Derivative Works that You distribute must
|
|
||||||
include a readable copy of the attribution notices contained
|
|
||||||
within such NOTICE file, excluding those notices that do not
|
|
||||||
pertain to any part of the Derivative Works, in at least one
|
|
||||||
of the following places: within a NOTICE text file distributed
|
|
||||||
as part of the Derivative Works; within the Source form or
|
|
||||||
documentation, if provided along with the Derivative Works; or,
|
|
||||||
within a display generated by the Derivative Works, if and
|
|
||||||
wherever such third-party notices normally appear. The contents
|
|
||||||
of the NOTICE file are for informational purposes only and
|
|
||||||
do not modify the License. You may add Your own attribution
|
|
||||||
notices within Derivative Works that You distribute, alongside
|
|
||||||
or as an addendum to the NOTICE text from the Work, provided
|
|
||||||
that such additional attribution notices cannot be construed
|
|
||||||
as modifying the License.
|
|
||||||
|
|
||||||
You may add Your own copyright statement to Your modifications and
|
|
||||||
may provide additional or different license terms and conditions
|
|
||||||
for use, reproduction, or distribution of Your modifications, or
|
|
||||||
for any such Derivative Works as a whole, provided Your use,
|
|
||||||
reproduction, and distribution of the Work otherwise complies with
|
|
||||||
the conditions stated in this License.
|
|
||||||
|
|
||||||
5. Submission of Contributions. Unless You explicitly state otherwise,
|
|
||||||
any Contribution intentionally submitted for inclusion in the Work
|
|
||||||
by You to the Licensor shall be under the terms and conditions of
|
|
||||||
this License, without any additional terms or conditions.
|
|
||||||
Notwithstanding the above, nothing herein shall supersede or modify
|
|
||||||
the terms of any separate license agreement you may have executed
|
|
||||||
with Licensor regarding such Contributions.
|
|
||||||
|
|
||||||
6. Trademarks. This License does not grant permission to use the trade
|
|
||||||
names, trademarks, service marks, or product names of the Licensor,
|
|
||||||
except as required for reasonable and customary use in describing the
|
|
||||||
origin of the Work and reproducing the content of the NOTICE file.
|
|
||||||
|
|
||||||
7. Disclaimer of Warranty. Unless required by applicable law or
|
|
||||||
agreed to in writing, Licensor provides the Work (and each
|
|
||||||
Contributor provides its Contributions) on an "AS IS" BASIS,
|
|
||||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
|
||||||
implied, including, without limitation, any warranties or conditions
|
|
||||||
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
|
|
||||||
PARTICULAR PURPOSE. You are solely responsible for determining the
|
|
||||||
appropriateness of using or redistributing the Work and assume any
|
|
||||||
risks associated with Your exercise of permissions under this License.
|
|
||||||
|
|
||||||
8. Limitation of Liability. In no event and under no legal theory,
|
|
||||||
whether in tort (including negligence), contract, or otherwise,
|
|
||||||
unless required by applicable law (such as deliberate and grossly
|
|
||||||
negligent acts) or agreed to in writing, shall any Contributor be
|
|
||||||
liable to You for damages, including any direct, indirect, special,
|
|
||||||
incidental, or consequential damages of any character arising as a
|
|
||||||
result of this License or out of the use or inability to use the
|
|
||||||
Work (including but not limited to damages for loss of goodwill,
|
|
||||||
work stoppage, computer failure or malfunction, or any and all
|
|
||||||
other commercial damages or losses), even if such Contributor
|
|
||||||
has been advised of the possibility of such damages.
|
|
||||||
|
|
||||||
9. Accepting Warranty or Additional Liability. While redistributing
|
|
||||||
the Work or Derivative Works thereof, You may choose to offer,
|
|
||||||
and charge a fee for, acceptance of support, warranty, indemnity,
|
|
||||||
or other liability obligations and/or rights consistent with this
|
|
||||||
License. However, in accepting such obligations, You may act only
|
|
||||||
on Your own behalf and on Your sole responsibility, not on behalf
|
|
||||||
of any other Contributor, and only if You agree to indemnify,
|
|
||||||
defend, and hold each Contributor harmless for any liability
|
|
||||||
incurred by, or claims asserted against, such Contributor by reason
|
|
||||||
of your accepting any such warranty or additional liability.
|
|
||||||
|
|
||||||
END OF TERMS AND CONDITIONS
|
|
||||||
|
|
||||||
APPENDIX: How to apply the Apache License to your work.
|
|
||||||
|
|
||||||
To apply the Apache License to your work, attach the following
|
|
||||||
boilerplate notice, with the fields enclosed by brackets "[]"
|
|
||||||
replaced with your own identifying information. (Don't include
|
|
||||||
the brackets!) The text should be enclosed in the appropriate
|
|
||||||
comment syntax for the file format. We also recommend that a
|
|
||||||
file or class name and description of purpose be included on the
|
|
||||||
same "printed page" as the copyright notice for easier
|
|
||||||
identification within third-party archives.
|
|
||||||
|
|
||||||
Copyright [yyyy] [name of copyright owner]
|
|
||||||
|
|
||||||
Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
you may not use this file except in compliance with the License.
|
|
||||||
You may obtain a copy of the License at
|
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing, software
|
|
||||||
distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
See the License for the specific language governing permissions and
|
|
||||||
limitations under the License.
|
|
346
README.md
346
README.md
@ -1,281 +1,91 @@
|
|||||||
## Dependencies
|
### Documentation
|
||||||
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.
|
Detailed documentation can be found on the [official site.](https://www.psi.ch/detectors/users-support)
|
||||||
|
|
||||||
## Documentaion
|
### Binaries
|
||||||
Detailed documentation including installation can be found in the [software wiki](https://slsdetectorgroup.github.io/devdoc/index.html).
|
Documentation to obtain the binaries via the conda package is available for [lib](https://github.com/slsdetectorgroup/sls_detector_lib) and [gui](https://github.com/slsdetectorgroup/sls_detector_gui)
|
||||||
|
|
||||||
Different releases can be found on the [official site](https://www.psi.ch/en/lxn/software-releases).
|
### Source code
|
||||||
|
One can also obtain the source code from this repository and compile while realizing the setup dependencies as required.
|
||||||
Firmware compatiblity can be found in [firmware page](https://github.com/slsdetectorgroup/slsDetectorFirmware)
|
```
|
||||||
|
git clone https://github.com/slsdetectorgroup/slsDetectorPackage.git
|
||||||
## Installation
|
|
||||||
|
|
||||||
### 1. Install binaries using conda
|
|
||||||
Conda is not only useful to manage python environments but can also
|
|
||||||
be used as a user space package manager. Dates in the tag (for eg. 2020.07.23.dev0)
|
|
||||||
are from the developer branch. Please use released tags for stability.
|
|
||||||
|
|
||||||
We have three different packages available:
|
|
||||||
* **slsdetlib** shared libraries and command line utilities
|
|
||||||
* **slsdetgui** GUI
|
|
||||||
* **slsdet** Python bindings
|
|
||||||
|
|
||||||
```
|
```
|
||||||
#Add channels for dependencies and our library
|
#### Setup dependencies
|
||||||
conda config --add channels conda-forge
|
* Gui Client <br>
|
||||||
conda config --add channels slsdetectorgroup
|
Requirements: Qt 4.8 and Qwt 6.0
|
||||||
conda config --set channel_priority strict
|
```
|
||||||
|
export QTDIR=/usr/local/Trolltech/
|
||||||
|
export QWTDIR=/usr/local/qwt-6.0.1/
|
||||||
|
```
|
||||||
|
If either of them does not exist, the GUI client will not be built.
|
||||||
|
|
||||||
#create and activate an environment with our library
|
* Advanced user Calibration wizards<br>
|
||||||
#replace 6.1.1 with the required tag
|
Requirements: ROOT
|
||||||
conda create -n myenv slsdetlib=6.1.1
|
```
|
||||||
conda activate myenv
|
export ROOTSYS=/usr/local/root-5.34
|
||||||
|
|
||||||
#ready to use
|
|
||||||
sls_detector_get exptime
|
|
||||||
etc ...
|
|
||||||
```
|
```
|
||||||
|
|
||||||
|
#### Compilation
|
||||||
|
|
||||||
|
Compiling can be done in two ways.
|
||||||
|
|
||||||
|
**1. Compile using script cmk.sh**<br>
|
||||||
|
|
||||||
|
After compiling, the libraries and executables will be found in `slsDetectorPackage/build/bin` directory<br>
|
||||||
|
|
||||||
|
Usage: [-c] [-b] [-h] [-d HDF5 directory] [-j]<br>
|
||||||
|
* -[no option]: only make<br>
|
||||||
|
* -c: Clean<br>
|
||||||
|
* -b: Builds/Rebuilds CMake files normal mode<br>
|
||||||
|
* -h: Builds/Rebuilds Cmake files with HDF5 package<br>
|
||||||
|
* -d: HDF5 Custom Directory<br>
|
||||||
|
* -t: Build/Rebuilds only text client<br>
|
||||||
|
* -r: Build/Rebuilds only receiver<br>
|
||||||
|
* -g: Build/Rebuilds only gui<br>
|
||||||
|
* -j: Number of threads to compile through<br>
|
||||||
|
* -e: Debug mode
|
||||||
|
|
||||||
|
Basic Option:
|
||||||
|
./cmk.sh -b
|
||||||
|
|
||||||
|
For only make:
|
||||||
|
./cmk.sh
|
||||||
|
|
||||||
|
For make clean;make:
|
||||||
|
./cmk.sh -c
|
||||||
|
|
||||||
|
For using hdf5 without custom dir /blabla:
|
||||||
|
./cmk.sh -h -d /blabla
|
||||||
|
|
||||||
|
For rebuilding cmake without hdf5
|
||||||
|
./cmk.sh -b
|
||||||
|
|
||||||
|
For using multiple cores to compile faster:
|
||||||
|
./cmk.sh -j9<br>
|
||||||
|
|
||||||
|
|
||||||
|
For rebuilding only certain sections<br>
|
||||||
|
./cmk.sh -tg #only text client and gui<br>
|
||||||
|
./cmk.sh -r #only receiver<br>
|
||||||
|
|
||||||
|
|
||||||
|
**2. Compile without script**<br>
|
||||||
|
Use cmake to create out-of-source builds, by creating a build folder parallel to source directory.
|
||||||
```
|
```
|
||||||
# List available versions
|
$ cd ..
|
||||||
# lib and binaries
|
$ mkdir slsDetectorPackage-build
|
||||||
conda search slsdetlib
|
$ cd slsDetectorPackage-build
|
||||||
# python
|
$ cmake ../slsDetectorPackage -DCMAKE_BUILD_TYPE=Debug -DSLS_USE_HDF5=OFF
|
||||||
conda search slsdet
|
$ make
|
||||||
# gui
|
|
||||||
conda search slsdetgui
|
|
||||||
```
|
```
|
||||||
|
|
||||||
## 2. Build from source
|
Use the following as an example to compile statically and using specific hdf5 folder
|
||||||
|
|
||||||
### 2.1 Download Source Code from github
|
|
||||||
```
|
```
|
||||||
git clone https://github.com/slsdetectorgroup/slsDetectorPackage.git --branch 7.0.0
|
$ HDF5_ROOT=/opt/hdf5v1.10.0 cmake ../slsDetectorPackage -DCMAKE_BUILD_TYPE=Debug -DSLS_USE_HDF5=ON
|
||||||
|
```
|
||||||
|
After compiling, the libraries and executables will be found at `bin` directory
|
||||||
```
|
```
|
||||||
|
$ ls bin/
|
||||||
> **Note:** For v6.x.x of slsDetectorPackage and older, refer [pybind11 notes on cloning](#Pybind-and-Zeromq).
|
gui_client libSlsDetector.a libSlsDetector.so libSlsReceiver.a libSlsReceiver.so
|
||||||
|
sls_detector_acquire sls_detector_get slsDetectorGui sls_detector_help sls_detector_put slsReceiver slsMultiReceiver
|
||||||
|
|
||||||
### 2.2 Build from source
|
|
||||||
|
|
||||||
|
|
||||||
### Build using CMake
|
|
||||||
|
|
||||||
```
|
```
|
||||||
# outside slsDetecorPackage folder
|
|
||||||
mkdir build && cd build
|
|
||||||
|
|
||||||
# configure & generate Makefiles using cmake
|
|
||||||
# by listing all your options (alternately use ccmake described below)
|
|
||||||
# cmake3 for some systems
|
|
||||||
cmake ../slsDetectorPackage -DCMAKE_INSTALL_PREFIX=/your/install/path
|
|
||||||
|
|
||||||
# compiled to the build/bin directory
|
|
||||||
make -j12 #or whatever number of cores you are using to build
|
|
||||||
|
|
||||||
# install headers and libs in /your/install/path directory
|
|
||||||
make install
|
|
||||||
```
|
|
||||||
|
|
||||||
Instead of the cmake command, one can use ccmake to get a list of options to configure and generate Makefiles at ease.
|
|
||||||
|
|
||||||
|
|
||||||
```
|
|
||||||
# ccmake3 for some systems
|
|
||||||
ccmake ..
|
|
||||||
|
|
||||||
# choose the options
|
|
||||||
# first press [c] - configure (unil you see [g])
|
|
||||||
# then press [g] - generate
|
|
||||||
```
|
|
||||||
|
|
||||||
|Example cmake options|Comment|
|
|
||||||
|---|---|
|
|
||||||
| -DSLS_USE_PYTHON=ON | Python |
|
|
||||||
| -DPython_FIND_VIRTUALENV=ONLY | Python from only the conda env |
|
|
||||||
| -DSLS_USE_GUI=ON | GUI |
|
|
||||||
| -DSLS_USE_HDF5=ON | HDF5 |
|
|
||||||
| -DSLS_USE_SIMULATOR=ON | Simulator |
|
|
||||||
|
|
||||||
> **Note:** For v7.x.x of slsDetectorPackage and older, refer [zeromq notes for cmake option to hint library location](#Pybind-and-Zeromq).
|
|
||||||
|
|
||||||
### 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]
|
|
||||||
-[no option]: only make
|
|
||||||
-b: Builds/Rebuilds CMake files normal mode
|
|
||||||
-c: Clean
|
|
||||||
-d: HDF5 Custom Directory
|
|
||||||
-e: Debug mode
|
|
||||||
-g: Build/Rebuilds gui
|
|
||||||
-h: Builds/Rebuilds Cmake files with HDF5 package
|
|
||||||
-i: Builds tests
|
|
||||||
-j: Number of threads to compile through
|
|
||||||
-k: CMake command
|
|
||||||
-l: Install directory
|
|
||||||
-m: Manuals
|
|
||||||
-n: Manuals without compiling doxygen (only rst)
|
|
||||||
-p: Builds/Rebuilds Python API
|
|
||||||
-r: Build/Rebuilds only receiver
|
|
||||||
-s: Simulator
|
|
||||||
-t: Build/Rebuilds only text client
|
|
||||||
-u: Chip Test Gui
|
|
||||||
-z: Moench zmq processor
|
|
||||||
|
|
||||||
|
|
||||||
# display all options
|
|
||||||
./cmk.sh -?
|
|
||||||
|
|
||||||
# new build and compile in parallel (recommended basic option):
|
|
||||||
./cmk.sh -cbj5
|
|
||||||
|
|
||||||
# new build, python and compile in parallel:
|
|
||||||
./cmk.sh -cbpj5
|
|
||||||
|
|
||||||
#For rebuilding only certain sections
|
|
||||||
./cmk.sh -tg #only text client and gui
|
|
||||||
./cmk.sh -r #only receiver
|
|
||||||
```
|
|
||||||
|
|
||||||
> **Note:** For v7.x.x of slsDetectorPackage and older, refer [zeromq notes for cmk script option to hint library location](#Pybind-and-Zeromq).
|
|
||||||
|
|
||||||
### Build on old distributions
|
|
||||||
|
|
||||||
If your linux distribution doesn't come with a C++11 compiler (gcc>4.8) then
|
|
||||||
it's possible to install a newer gcc using conda and build the slsDetectorPackage
|
|
||||||
using this compiler
|
|
||||||
|
|
||||||
```
|
|
||||||
#Create an environment with the dependencies
|
|
||||||
conda create -n myenv gxx_linux-64 cmake zmq
|
|
||||||
conda activate myenv
|
|
||||||
|
|
||||||
# outside slsDetecorPackage folder
|
|
||||||
mkdir build && cd build
|
|
||||||
cmake ../slsDetectorPackage -DCMAKE_PREFIX_PATH=$CONDA_PREFIX
|
|
||||||
make -j12
|
|
||||||
```
|
|
||||||
|
|
||||||
> **Note:** For v7.x.x of slsDetectorPackage and older, refer [zeromq notes for dependencies for conda](#Pybind-and-Zeromq).
|
|
||||||
|
|
||||||
|
|
||||||
### Build slsDetectorGui (Qt5)
|
|
||||||
|
|
||||||
1. Using pre-built binary on conda
|
|
||||||
```
|
|
||||||
conda create -n myenv slsdetgui=7.0.0
|
|
||||||
conda activate myenv
|
|
||||||
```
|
|
||||||
|
|
||||||
2. Using system installation on RHEL7
|
|
||||||
```
|
|
||||||
yum install qt5-qtbase-devel.x86_64
|
|
||||||
yum install qt5-qtsvg-devel.x86_64
|
|
||||||
```
|
|
||||||
|
|
||||||
3. Using 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
|
|
||||||
```
|
|
||||||
#Add channels for dependencies and our library
|
|
||||||
conda config --add channels conda-forge
|
|
||||||
conda config --add channels slsdetectorgroup
|
|
||||||
conda config --set channel_priority strict
|
|
||||||
|
|
||||||
# create environment to compile
|
|
||||||
# on rhel7
|
|
||||||
conda create -n slsgui zeromq gxx_linux-64 gxx_linux-64 mesa-libgl-devel-cos6-x86_64 qt
|
|
||||||
# on fedora or newer systems
|
|
||||||
conda create -n slsgui zeromq qt
|
|
||||||
|
|
||||||
# when using conda compilers, would also need libgl, but no need for it on fedora unless maybe using it with ROOT
|
|
||||||
|
|
||||||
# activate environment
|
|
||||||
conda activate slsgui
|
|
||||||
|
|
||||||
# compile with cmake outside slsDetecorPackage folder
|
|
||||||
mkdir build && cd build
|
|
||||||
cmake ../slsDetectorPackage -DSLS_USE_GUI=ON
|
|
||||||
make -j12
|
|
||||||
|
|
||||||
# or compile with cmk.sh
|
|
||||||
cd slsDetectorPackage
|
|
||||||
./cmk.sh -cbgj9
|
|
||||||
```
|
|
||||||
|
|
||||||
> **Note:** For v7.x.x of slsDetectorPackage and older, refer [zeromq notes for dependencies for conda](#Pybind-and-Zeromq).
|
|
||||||
|
|
||||||
### 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
|
|
||||||
```
|
|
||||||
|
|
||||||
```
|
|
||||||
# using cmake or ccmake to enable DSLS_BUILD_DOCS
|
|
||||||
# outside slsDetecorPackage folder
|
|
||||||
mkdir build && cd build
|
|
||||||
cmake ../slsDetectorPackage -DSLS_BUILD_DOCS=ON
|
|
||||||
|
|
||||||
make docs # generate API docs and build Sphinx RST
|
|
||||||
make rst # rst only, saves time in case the API did not change
|
|
||||||
```
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## Pybind and Zeromq
|
|
||||||
|
|
||||||
### 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
|
|
220
RELEASE.txt
Normal file → Executable file
220
RELEASE.txt
Normal file → Executable file
@ -1,218 +1,2 @@
|
|||||||
SLS Detector Package Minor Release 9.2.0 released on 02.06.2025
|
Draft
|
||||||
==================================================================
|
- dr 4, 8, 16 in eiger -> speed 0, 32 stays same (speed 1)
|
||||||
|
|
||||||
This document describes the differences between v9.2.0 and v9.1.1
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
CONTENTS
|
|
||||||
--------
|
|
||||||
1 New or Changed Features
|
|
||||||
2 On-board Detector Server Compatibility
|
|
||||||
3 Firmware Requirements
|
|
||||||
4 Kernel Requirements
|
|
||||||
5 Download, Documentation & Support
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
1 New or Changed Features
|
|
||||||
=========================
|
|
||||||
|
|
||||||
|
|
||||||
Python
|
|
||||||
------
|
|
||||||
|
|
||||||
|
|
||||||
* Python module is now built using scikit-build-core
|
|
||||||
|
|
||||||
|
|
||||||
* slsdet is available on PyPI from this release onwards
|
|
||||||
|
|
||||||
|
|
||||||
* Updated documentation on python module installation
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
2 On-board Detector Server Compatibility
|
|
||||||
==========================================
|
|
||||||
|
|
||||||
|
|
||||||
Eiger 9.0.0
|
|
||||||
Jungfrau 9.1.0
|
|
||||||
Mythen3 9.1.1
|
|
||||||
Gotthard2 9.0.0
|
|
||||||
Gotthard 9.0.0
|
|
||||||
Moench 9.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'
|
|
||||||
|
|
||||||
Instructions available at
|
|
||||||
https://slsdetectorgroup.github.io/devdoc/serverupgrade.html
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
3 Firmware Requirements
|
|
||||||
========================
|
|
||||||
|
|
||||||
|
|
||||||
Eiger 02.10.2023 (v32) (updated in 7.0.3)
|
|
||||||
|
|
||||||
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)
|
|
||||||
|
|
||||||
Mythen3 13.11.2024 (v2.0) (updated in 9.0.0)
|
|
||||||
|
|
||||||
Gotthard2 03.10.2024 (v1.0) (updated in 9.0.0)
|
|
||||||
|
|
||||||
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)
|
|
||||||
|
|
||||||
|
|
||||||
Detector Upgrade
|
|
||||||
----------------
|
|
||||||
|
|
||||||
The following can be upgraded remotely:
|
|
||||||
|
|
||||||
Eiger via bit files
|
|
||||||
Jungfrau via command <.pof>
|
|
||||||
Mythen3 via command <.rbf>
|
|
||||||
Gotthard2 via command <.rbf>
|
|
||||||
Moench via command <.pof>
|
|
||||||
|
|
||||||
Gotthard cannot be upgraded remotely
|
|
||||||
|
|
||||||
Except Eiger,
|
|
||||||
upgrade
|
|
||||||
Using command 'programfpga' or
|
|
||||||
|
|
||||||
udpate both on-board detector server and firmware simultaneously
|
|
||||||
Using command 'update'
|
|
||||||
|
|
||||||
|
|
||||||
Instructions available at
|
|
||||||
https://slsdetectorgroup.github.io/devdoc/firmware.html
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
4 Kernel Requirements
|
|
||||||
======================
|
|
||||||
|
|
||||||
|
|
||||||
Blackfin
|
|
||||||
--------
|
|
||||||
Latest version: Fri Oct 29 00:00:00 2021
|
|
||||||
|
|
||||||
Older ones will work, but might have issues with programming firmware via
|
|
||||||
the package.
|
|
||||||
|
|
||||||
|
|
||||||
Nios
|
|
||||||
-----
|
|
||||||
Compatible version: Mon May 10 18:00:21 CEST 2021
|
|
||||||
|
|
||||||
|
|
||||||
Kernel Upgrade
|
|
||||||
---------------
|
|
||||||
Eiger via bit files
|
|
||||||
Others via command
|
|
||||||
|
|
||||||
Commands: udpatekernel, kernelversion
|
|
||||||
Instructions available at
|
|
||||||
https://slsdetectorgroup.github.io/devdoc/commandline.html
|
|
||||||
https://slsdetectorgroup.github.io/devdoc/detector.html
|
|
||||||
https://slsdetectorgroup.github.io/devdoc/pydetector.html
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
5 Download, Documentation & Support
|
|
||||||
====================================
|
|
||||||
|
|
||||||
Download
|
|
||||||
--------
|
|
||||||
|
|
||||||
The Source Code:
|
|
||||||
https://github.com/slsdetectorgroup/slsDetectorPackage
|
|
||||||
|
|
||||||
Documentation
|
|
||||||
-------------
|
|
||||||
|
|
||||||
Installation:
|
|
||||||
https://slsdetectorgroup.github.io/devdoc/installation.html
|
|
||||||
|
|
||||||
Quick Start Guide:
|
|
||||||
https://slsdetectorgroup.github.io/devdoc/quick_start_guide.html
|
|
||||||
|
|
||||||
Firmware Upgrade:
|
|
||||||
https://slsdetectorgroup.github.io/devdoc/firmware.html
|
|
||||||
|
|
||||||
Detector Server upgrade:
|
|
||||||
https://slsdetectorgroup.github.io/devdoc/serverupgrade.html
|
|
||||||
|
|
||||||
Detector Simulators:
|
|
||||||
https://slsdetectorgroup.github.io/devdoc/virtualserver.html
|
|
||||||
|
|
||||||
Consuming slsDetectorPackage:
|
|
||||||
https://slsdetectorgroup.github.io/devdoc/consuming.html
|
|
||||||
|
|
||||||
API Examples:
|
|
||||||
https://github.com/slsdetectorgroup/api-examples
|
|
||||||
|
|
||||||
Command Line Documentation:
|
|
||||||
https://slsdetectorgroup.github.io/devdoc/commandline.html
|
|
||||||
|
|
||||||
C++ API Documentation:
|
|
||||||
https://slsdetectorgroup.github.io/devdoc/detector.html
|
|
||||||
|
|
||||||
C++ API Example:
|
|
||||||
https://slsdetectorgroup.github.io/devdoc/examples.html#
|
|
||||||
|
|
||||||
Python API Documentation:
|
|
||||||
https://slsdetectorgroup.github.io/devdoc/pygettingstarted.html
|
|
||||||
|
|
||||||
Python API Example:
|
|
||||||
https://slsdetectorgroup.github.io/devdoc/pyexamples.html
|
|
||||||
|
|
||||||
Receivers (including custom receiver):
|
|
||||||
https://slsdetectorgroup.github.io/devdoc/receivers.html
|
|
||||||
https://slsdetectorgroup.github.io/devdoc/slsreceiver.html
|
|
||||||
|
|
||||||
Detector UDP Header:
|
|
||||||
https://slsdetectorgroup.github.io/devdoc/udpheader.html
|
|
||||||
https://slsdetectorgroup.github.io/devdoc/udpdetspec.html
|
|
||||||
|
|
||||||
slsReceiver Zmq Format:
|
|
||||||
https://slsdetectorgroup.github.io/devdoc/slsreceiver.html#zmq-json-header-format
|
|
||||||
|
|
||||||
TroubleShooting:
|
|
||||||
https://slsdetectorgroup.github.io/devdoc/troubleshooting.html
|
|
||||||
https://slsdetectorgroup.github.io/devdoc/troubleshooting.html#receiver-pc-tuning-options
|
|
||||||
|
|
||||||
Further Documentation:
|
|
||||||
https://www.psi.ch/en/detectors/documentation
|
|
||||||
|
|
||||||
Info on Releases:
|
|
||||||
https://www.psi.ch/en/detectors/software
|
|
||||||
|
|
||||||
|
|
||||||
Support
|
|
||||||
-------
|
|
||||||
|
|
||||||
dhanya.thattil@psi.ch
|
|
||||||
erik.frojdh@psi.ch
|
|
||||||
alice.mazzoleni@psi.ch
|
|
||||||
|
@ -1 +0,0 @@
|
|||||||
slsDetectorSoftware/generator/autocomplete/bash_autocomplete.sh
|
|
@ -1,39 +0,0 @@
|
|||||||
# Find Clang format
|
|
||||||
if(NOT ClangFormat_BIN_NAME)
|
|
||||||
set(ClangFormat_BIN_NAME clang-format)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# if custom path check there first
|
|
||||||
if(ClangFormat_ROOT_DIR)
|
|
||||||
find_program(ClangFormat_BIN
|
|
||||||
NAMES
|
|
||||||
${ClangFormat_BIN_NAME}
|
|
||||||
PATHS
|
|
||||||
"${ClangFormat_ROOT_DIR}"
|
|
||||||
NO_DEFAULT_PATH)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
find_program(ClangFormat_BIN NAMES ${ClangFormat_BIN_NAME})
|
|
||||||
|
|
||||||
include(FindPackageHandleStandardArgs)
|
|
||||||
FIND_PACKAGE_HANDLE_STANDARD_ARGS(
|
|
||||||
ClangFormat
|
|
||||||
DEFAULT_MSG
|
|
||||||
ClangFormat_BIN)
|
|
||||||
|
|
||||||
mark_as_advanced(
|
|
||||||
ClangFormat_BIN)
|
|
||||||
|
|
||||||
if(ClangFormat_FOUND)
|
|
||||||
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
|
|
||||||
message(STATUS "found clang-format \"${CLANG_VERSION}\" adding formatting targets")
|
|
||||||
include(clang-format)
|
|
||||||
else()
|
|
||||||
message(STATUS "clang-format version \"${CLANG_VERSION}\" found but need at least 9. Not setting up format targets")
|
|
||||||
endif()
|
|
||||||
else()
|
|
||||||
message(STATUS "clang-format not found. Not setting up format targets")
|
|
||||||
endif()
|
|
118
cmake/FindQwt.cmake
Executable file
118
cmake/FindQwt.cmake
Executable file
@ -0,0 +1,118 @@
|
|||||||
|
# Qt Widgets for Technical Applications
|
||||||
|
# available at http://www.http://qwt.sourceforge.net/
|
||||||
|
#
|
||||||
|
# The module defines the following variables:
|
||||||
|
# QWT_FOUND - the system has Qwt
|
||||||
|
# QWT_INCLUDE_DIR - where to find qwt_plot.h
|
||||||
|
# QWT_INCLUDE_DIRS - qwt includes
|
||||||
|
# QWT_LIBRARY - where to find the Qwt library
|
||||||
|
# QWT_LIBRARIES - aditional libraries
|
||||||
|
# QWT_MAJOR_VERSION - major version
|
||||||
|
# QWT_MINOR_VERSION - minor version
|
||||||
|
# QWT_PATCH_VERSION - patch version
|
||||||
|
# QWT_VERSION_STRING - version (ex. 5.2.1)
|
||||||
|
# QWT_ROOT_DIR - root dir (ex. /usr/local)
|
||||||
|
|
||||||
|
#=============================================================================
|
||||||
|
# Copyright 2010-2013, Julien Schueller
|
||||||
|
# All rights reserved.
|
||||||
|
#
|
||||||
|
# Redistribution and use in source and binary forms, with or without
|
||||||
|
# modification, are permitted provided that the following conditions are met:
|
||||||
|
#
|
||||||
|
# 1. Redistributions of source code must retain the above copyright notice, this
|
||||||
|
# list of conditions and the following disclaimer.
|
||||||
|
# 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||||
|
# this list of conditions and the following disclaimer in the documentation
|
||||||
|
# and/or other materials provided with the distribution.
|
||||||
|
#
|
||||||
|
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||||
|
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||||
|
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
|
||||||
|
# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||||
|
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||||
|
# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
# The views and conclusions contained in the software and documentation are those
|
||||||
|
# of the authors and should not be interpreted as representing official policies,
|
||||||
|
# either expressed or implied, of the FreeBSD Project.
|
||||||
|
#=============================================================================
|
||||||
|
|
||||||
|
|
||||||
|
find_path ( QWT_INCLUDE_DIR
|
||||||
|
NAMES qwt_plot.h
|
||||||
|
HINTS $ENV{QWTDIR} $ENV{QWTDIR}/src ${QT_INCLUDE_DIR}
|
||||||
|
PATH_SUFFIXES qwt qwt-qt3 qwt-qt4 qwt-qt5
|
||||||
|
)
|
||||||
|
|
||||||
|
set ( QWT_INCLUDE_DIRS ${QWT_INCLUDE_DIR} )
|
||||||
|
|
||||||
|
# version
|
||||||
|
set ( _VERSION_FILE ${QWT_INCLUDE_DIR}/qwt_global.h )
|
||||||
|
if ( EXISTS ${_VERSION_FILE} )
|
||||||
|
file ( STRINGS ${_VERSION_FILE} _VERSION_LINE REGEX "define[ ]+QWT_VERSION_STR" )
|
||||||
|
if ( _VERSION_LINE )
|
||||||
|
string ( REGEX REPLACE ".*define[ ]+QWT_VERSION_STR[ ]+\"(.*)\".*" "\\1" QWT_VERSION_STRING "${_VERSION_LINE}" )
|
||||||
|
string ( REGEX REPLACE "([0-9]+)\\.([0-9]+)\\.([0-9]+)" "\\1" QWT_MAJOR_VERSION "${QWT_VERSION_STRING}" )
|
||||||
|
string ( REGEX REPLACE "([0-9]+)\\.([0-9]+)\\.([0-9]+)" "\\2" QWT_MINOR_VERSION "${QWT_VERSION_STRING}" )
|
||||||
|
string ( REGEX REPLACE "([0-9]+)\\.([0-9]+)\\.([0-9]+)" "\\3" QWT_PATCH_VERSION "${QWT_VERSION_STRING}" )
|
||||||
|
endif ()
|
||||||
|
endif ()
|
||||||
|
|
||||||
|
|
||||||
|
# check version
|
||||||
|
set ( _QWT_VERSION_MATCH TRUE )
|
||||||
|
if ( Qwt_FIND_VERSION AND QWT_VERSION_STRING )
|
||||||
|
if ( Qwt_FIND_VERSION_EXACT )
|
||||||
|
if ( NOT Qwt_FIND_VERSION VERSION_EQUAL QWT_VERSION_STRING )
|
||||||
|
set ( _QWT_VERSION_MATCH FALSE )
|
||||||
|
endif ()
|
||||||
|
else ()
|
||||||
|
if ( QWT_VERSION_STRING VERSION_LESS Qwt_FIND_VERSION )
|
||||||
|
set ( _QWT_VERSION_MATCH FALSE )
|
||||||
|
endif ()
|
||||||
|
endif ()
|
||||||
|
endif ()
|
||||||
|
|
||||||
|
|
||||||
|
find_library ( QWT_LIBRARY
|
||||||
|
NAMES qwt qwt-qt3 qwt-qt4 qwt-qt5
|
||||||
|
HINTS $ENV{QWTDIR}/lib ${QT_LIBRARY_DIR}
|
||||||
|
)
|
||||||
|
|
||||||
|
set ( QWT_LIBRARIES ${QWT_LIBRARY} )
|
||||||
|
|
||||||
|
|
||||||
|
# try to guess root dir from include dir
|
||||||
|
if ( QWT_INCLUDE_DIR )
|
||||||
|
string ( REGEX REPLACE "(.*)/include.*" "\\1" QWT_ROOT_DIR ${QWT_INCLUDE_DIR} )
|
||||||
|
# try to guess root dir from library dir
|
||||||
|
elseif ( QWT_LIBRARY )
|
||||||
|
string ( REGEX REPLACE "(.*)/lib[/|32|64].*" "\\1" QWT_ROOT_DIR ${QWT_LIBRARY} )
|
||||||
|
endif ()
|
||||||
|
|
||||||
|
|
||||||
|
# handle the QUIETLY and REQUIRED arguments
|
||||||
|
include ( FindPackageHandleStandardArgs )
|
||||||
|
if ( CMAKE_VERSION LESS 2.8.3 )
|
||||||
|
find_package_handle_standard_args( Qwt DEFAULT_MSG QWT_LIBRARY QWT_INCLUDE_DIR _QWT_VERSION_MATCH )
|
||||||
|
else ()
|
||||||
|
find_package_handle_standard_args( Qwt REQUIRED_VARS QWT_LIBRARY QWT_INCLUDE_DIR _QWT_VERSION_MATCH VERSION_VAR QWT_VERSION_STRING )
|
||||||
|
endif ()
|
||||||
|
|
||||||
|
|
||||||
|
mark_as_advanced (
|
||||||
|
QWT_LIBRARY
|
||||||
|
QWT_LIBRARIES
|
||||||
|
QWT_INCLUDE_DIR
|
||||||
|
QWT_INCLUDE_DIRS
|
||||||
|
QWT_MAJOR_VERSION
|
||||||
|
QWT_MINOR_VERSION
|
||||||
|
QWT_PATCH_VERSION
|
||||||
|
QWT_VERSION_STRING
|
||||||
|
QWT_ROOT_DIR
|
||||||
|
)
|
@ -1,6 +1,6 @@
|
|||||||
#Look for an executable called sphinx-build
|
#Look for an executable called sphinx-build
|
||||||
find_program(SPHINX_EXECUTABLE
|
find_program(SPHINX_EXECUTABLE
|
||||||
NAMES sphinx-build sphinx-build-3.6
|
NAMES sphinx-build
|
||||||
DOC "Path to sphinx-build executable")
|
DOC "Path to sphinx-build executable")
|
||||||
|
|
||||||
include(FindPackageHandleStandardArgs)
|
include(FindPackageHandleStandardArgs)
|
||||||
|
112
cmake/FindZeroMQ.cmake
Executable file
112
cmake/FindZeroMQ.cmake
Executable file
@ -0,0 +1,112 @@
|
|||||||
|
|
||||||
|
# This file is originally from https://github.com/zeromq/azmq and distributed
|
||||||
|
# under Boost Software Lincese 1.0
|
||||||
|
# Boost Software License - Version 1.0 - August 17th, 2003
|
||||||
|
|
||||||
|
# Permission is hereby granted, free of charge, to any person or organization
|
||||||
|
# obtaining a copy of the software and accompanying documentation covered by
|
||||||
|
# this license (the "Software") to use, reproduce, display, distribute,
|
||||||
|
# execute, and transmit the Software, and to prepare derivative works of the
|
||||||
|
# Software, and to permit third-parties to whom the Software is furnished to
|
||||||
|
# do so, all subject to the following:
|
||||||
|
|
||||||
|
# The copyright notices in the Software and this entire statement, including
|
||||||
|
# the above license grant, this restriction and the following disclaimer,
|
||||||
|
# must be included in all copies of the Software, in whole or in part, and
|
||||||
|
# all derivative works of the Software, unless such copies or derivative
|
||||||
|
# works are solely in the form of machine-executable object code generated by
|
||||||
|
# a source language processor.
|
||||||
|
|
||||||
|
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
# FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
|
||||||
|
# SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
|
||||||
|
# FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
|
||||||
|
# ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||||
|
# DEALINGS IN THE SOFTWARE.
|
||||||
|
# --------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
# Find ZeroMQ Headers/Libs
|
||||||
|
|
||||||
|
# Variables
|
||||||
|
# ZMQ_ROOT - set this to a location where ZeroMQ may be found
|
||||||
|
#
|
||||||
|
# ZeroMQ_FOUND - True of ZeroMQ found
|
||||||
|
# ZeroMQ_INCLUDE_DIRS - Location of ZeroMQ includes
|
||||||
|
# ZeroMQ_LIBRARIES - ZeroMQ libraries
|
||||||
|
|
||||||
|
include(FindPackageHandleStandardArgs)
|
||||||
|
|
||||||
|
if (NOT ZMQ_ROOT)
|
||||||
|
set(ZMQ_ROOT "$ENV{ZMQ_ROOT}")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if (NOT ZMQ_ROOT)
|
||||||
|
find_path(_ZeroMQ_ROOT NAMES include/zmq.h)
|
||||||
|
else()
|
||||||
|
set(_ZeroMQ_ROOT "${ZMQ_ROOT}")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
find_path(ZeroMQ_INCLUDE_DIRS NAMES zmq.h HINTS ${_ZeroMQ_ROOT}/include)
|
||||||
|
|
||||||
|
if (ZeroMQ_INCLUDE_DIRS)
|
||||||
|
set(_ZeroMQ_H ${ZeroMQ_INCLUDE_DIRS}/zmq.h)
|
||||||
|
|
||||||
|
function(_zmqver_EXTRACT _ZeroMQ_VER_COMPONENT _ZeroMQ_VER_OUTPUT)
|
||||||
|
set(CMAKE_MATCH_1 "0")
|
||||||
|
set(_ZeroMQ_expr "^[ \\t]*#define[ \\t]+${_ZeroMQ_VER_COMPONENT}[ \\t]+([0-9]+)$")
|
||||||
|
file(STRINGS "${_ZeroMQ_H}" _ZeroMQ_ver REGEX "${_ZeroMQ_expr}")
|
||||||
|
string(REGEX MATCH "${_ZeroMQ_expr}" ZeroMQ_ver "${_ZeroMQ_ver}")
|
||||||
|
set(${_ZeroMQ_VER_OUTPUT} "${CMAKE_MATCH_1}" PARENT_SCOPE)
|
||||||
|
endfunction()
|
||||||
|
|
||||||
|
_zmqver_EXTRACT("ZMQ_VERSION_MAJOR" ZeroMQ_VERSION_MAJOR)
|
||||||
|
_zmqver_EXTRACT("ZMQ_VERSION_MINOR" ZeroMQ_VERSION_MINOR)
|
||||||
|
_zmqver_EXTRACT("ZMQ_VERSION_PATCH" ZeroMQ_VERSION_PATCH)
|
||||||
|
|
||||||
|
message(STATUS "ZeroMQ version: ${ZeroMQ_VERSION_MAJOR}.${ZeroMQ_VERSION_MINOR}.${ZeroMQ_VERSION_PATCH}")
|
||||||
|
|
||||||
|
# We should provide version to find_package_handle_standard_args in the same format as it was requested,
|
||||||
|
# otherwise it can't check whether version matches exactly.
|
||||||
|
if (ZeroMQ_FIND_VERSION_COUNT GREATER 2)
|
||||||
|
set(ZeroMQ_VERSION "${ZeroMQ_VERSION_MAJOR}.${ZeroMQ_VERSION_MINOR}.${ZeroMQ_VERSION_PATCH}")
|
||||||
|
else()
|
||||||
|
# User has requested ZeroMQ version without patch part => user is not interested in specific patch =>
|
||||||
|
# any patch should be an exact match.
|
||||||
|
set(ZeroMQ_VERSION "${ZeroMQ_VERSION_MAJOR}.${ZeroMQ_VERSION_MINOR}")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if (NOT ${CMAKE_CXX_PLATFORM_ID} STREQUAL "Windows")
|
||||||
|
find_library(ZeroMQ_LIBRARIES NAMES zmq HINTS ${_ZeroMQ_ROOT}/lib)
|
||||||
|
else()
|
||||||
|
find_library(
|
||||||
|
ZeroMQ_LIBRARY_RELEASE
|
||||||
|
NAMES
|
||||||
|
libzmq
|
||||||
|
"libzmq-${CMAKE_VS_PLATFORM_TOOLSET}-mt-${ZeroMQ_VERSION_MAJOR}_${ZeroMQ_VERSION_MINOR}_${ZeroMQ_VERSION_PATCH}"
|
||||||
|
HINTS
|
||||||
|
${_ZeroMQ_ROOT}/lib
|
||||||
|
)
|
||||||
|
|
||||||
|
find_library(
|
||||||
|
ZeroMQ_LIBRARY_DEBUG
|
||||||
|
NAMES
|
||||||
|
libzmq_d
|
||||||
|
"libzmq-${CMAKE_VS_PLATFORM_TOOLSET}-mt-gd-${ZeroMQ_VERSION_MAJOR}_${ZeroMQ_VERSION_MINOR}_${ZeroMQ_VERSION_PATCH}"
|
||||||
|
HINTS
|
||||||
|
${_ZeroMQ_ROOT}/lib)
|
||||||
|
|
||||||
|
# On Windows we have to use corresponding version (i.e. Release or Debug) of ZeroMQ because of `errno` CRT global variable
|
||||||
|
# See more at http://www.drdobbs.com/avoiding-the-visual-c-runtime-library/184416623
|
||||||
|
set(ZeroMQ_LIBRARIES optimized "${ZeroMQ_LIBRARY_RELEASE}" debug "${ZeroMQ_LIBRARY_DEBUG}")
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
find_package_handle_standard_args(ZeroMQ FOUND_VAR ZeroMQ_FOUND
|
||||||
|
REQUIRED_VARS ZeroMQ_INCLUDE_DIRS ZeroMQ_LIBRARIES
|
||||||
|
VERSION_VAR ZeroMQ_VERSION)
|
||||||
|
|
||||||
|
if (ZeroMQ_FOUND)
|
||||||
|
mark_as_advanced(ZeroMQ_INCLUDE_DIRS ZeroMQ_LIBRARIES ZeroMQ_VERSION
|
||||||
|
ZeroMQ_VERSION_MAJOR ZeroMQ_VERSION_MINOR ZeroMQ_VERSION_PATCH)
|
||||||
|
endif()
|
@ -1,64 +0,0 @@
|
|||||||
include(CheckCXXCompilerFlag)
|
|
||||||
include(CheckCCompilerFlag)
|
|
||||||
|
|
||||||
|
|
||||||
function(enable_cxx_warning flag target)
|
|
||||||
string(REPLACE "-W" "HAS_" flag_name ${flag})
|
|
||||||
check_cxx_compiler_flag(${flag} ${flag_name})
|
|
||||||
if(${flag_name})
|
|
||||||
target_compile_options(${target} INTERFACE ${flag})
|
|
||||||
message(STATUS "Adding: ${flag} to ${target}")
|
|
||||||
else()
|
|
||||||
message(STATUS "Flag: ${flag} not supported")
|
|
||||||
endif()
|
|
||||||
endfunction()
|
|
||||||
|
|
||||||
function(enable_c_warning flag target)
|
|
||||||
string(REPLACE "-W" "HAS_" flag_name ${flag})
|
|
||||||
check_c_compiler_flag(${flag} ${flag_name})
|
|
||||||
if(${flag_name})
|
|
||||||
target_compile_options(${target} INTERFACE ${flag})
|
|
||||||
message(STATUS "Adding: ${flag} to ${target}")
|
|
||||||
else()
|
|
||||||
message(STATUS "Flag: ${flag} not supported")
|
|
||||||
endif()
|
|
||||||
endfunction()
|
|
||||||
|
|
||||||
|
|
||||||
function(disable_cxx_warning flag target)
|
|
||||||
string(REPLACE "-W" "HAS_" flag_name ${flag})
|
|
||||||
check_cxx_compiler_flag(${flag} ${flag_name})
|
|
||||||
|
|
||||||
if(${flag_name})
|
|
||||||
string(REPLACE "-W" "-Wno-" neg_flag ${flag})
|
|
||||||
message(STATUS "Adding: ${neg_flag} to ${target}")
|
|
||||||
target_compile_options(${target} INTERFACE ${neg_flag})
|
|
||||||
else()
|
|
||||||
message(STATUS "Warning: ${flag} not supported no need to disable")
|
|
||||||
endif()
|
|
||||||
endfunction()
|
|
||||||
|
|
||||||
function(disable_c_warning flag target)
|
|
||||||
string(REPLACE "-W" "HAS_" flag_name ${flag})
|
|
||||||
check_c_compiler_flag(${flag} ${flag_name})
|
|
||||||
if(${flag_name})
|
|
||||||
string(REPLACE "-W" "-Wno-" neg_flag ${flag})
|
|
||||||
message(STATUS "Adding: ${neg_flag} to ${target}")
|
|
||||||
target_compile_options(${target} INTERFACE ${neg_flag})
|
|
||||||
else()
|
|
||||||
message(STATUS "Warning: ${flag} not supported no need to disable")
|
|
||||||
endif()
|
|
||||||
endfunction()
|
|
||||||
|
|
||||||
|
|
||||||
function(sls_disable_c_warning flag)
|
|
||||||
disable_c_warning(${flag} slsProjectCSettings)
|
|
||||||
endfunction()
|
|
||||||
|
|
||||||
function(sls_enable_cxx_warning flag)
|
|
||||||
enable_cxx_warning(${flag} slsProjectWarnings)
|
|
||||||
endfunction()
|
|
||||||
|
|
||||||
function(sls_disable_cxx_warning flag)
|
|
||||||
disable_cxx_warning(${flag} slsProjectWarnings)
|
|
||||||
endfunction()
|
|
@ -1,47 +0,0 @@
|
|||||||
# A CMake script to find all source files and setup clang-format targets for them
|
|
||||||
|
|
||||||
# Find all source files
|
|
||||||
set(ClangFormat_CXX_FILE_EXTENSIONS ${ClangFormat_CXX_FILE_EXTENSIONS} *.cpp *.h *.cxx *.hxx *.hpp *.cc *.ipp *.c)
|
|
||||||
file(GLOB_RECURSE ALL_SOURCE_FILES ${ClangFormat_CXX_FILE_EXTENSIONS})
|
|
||||||
|
|
||||||
# Don't include some common build folders
|
|
||||||
set(ClangFormat_EXCLUDE_PATTERNS ${ClangFormat_EXCLUDE_PATTERNS} "/CMakeFiles/" "cmake")
|
|
||||||
|
|
||||||
# get all project files file
|
|
||||||
foreach (SOURCE_FILE ${ALL_SOURCE_FILES})
|
|
||||||
foreach (EXCLUDE_PATTERN ${ClangFormat_EXCLUDE_PATTERNS})
|
|
||||||
string(FIND ${SOURCE_FILE} ${EXCLUDE_PATTERN} EXCLUDE_FOUND)
|
|
||||||
if (NOT ${EXCLUDE_FOUND} EQUAL -1)
|
|
||||||
list(REMOVE_ITEM ALL_SOURCE_FILES ${SOURCE_FILE})
|
|
||||||
endif ()
|
|
||||||
endforeach ()
|
|
||||||
endforeach ()
|
|
||||||
|
|
||||||
#target for formatting soruce files
|
|
||||||
add_custom_target(format
|
|
||||||
COMMENT "Running clang-format to change files"
|
|
||||||
COMMAND ${ClangFormat_BIN}
|
|
||||||
-style=file
|
|
||||||
-i
|
|
||||||
${ALL_SOURCE_FILES}
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
#target to check format on source files
|
|
||||||
add_custom_target(format-check
|
|
||||||
COMMENT "Checking clang-format changes"
|
|
||||||
# Use ! to negate the result for correct output
|
|
||||||
COMMAND !
|
|
||||||
${ClangFormat_BIN}
|
|
||||||
-style=file
|
|
||||||
-output-replacements-xml
|
|
||||||
${ALL_SOURCE_FILES}
|
|
||||||
| grep -q "replacement offset"
|
|
||||||
)
|
|
||||||
|
|
||||||
# debug to check which file will be formatted
|
|
||||||
add_custom_target(
|
|
||||||
listformatfiles
|
|
||||||
COMMAND
|
|
||||||
echo ${ALL_SOURCE_FILES}
|
|
||||||
)
|
|
@ -15,21 +15,17 @@ configure_package_config_file(
|
|||||||
write_basic_package_version_file(
|
write_basic_package_version_file(
|
||||||
"${PROJECT_BINARY_DIR}/${PROJECT_NAME_LOWER}-config-version.cmake"
|
"${PROJECT_BINARY_DIR}/${PROJECT_NAME_LOWER}-config-version.cmake"
|
||||||
VERSION ${PROJECT_VERSION}
|
VERSION ${PROJECT_VERSION}
|
||||||
COMPATIBILITY SameMajorVersion
|
COMPATIBILITY SameMajorVersion)
|
||||||
)
|
|
||||||
|
|
||||||
install(FILES
|
install(FILES
|
||||||
"${PROJECT_BINARY_DIR}/${PROJECT_NAME_LOWER}-config.cmake"
|
"${PROJECT_BINARY_DIR}/${PROJECT_NAME_LOWER}-config.cmake"
|
||||||
"${PROJECT_BINARY_DIR}/${PROJECT_NAME_LOWER}-config-version.cmake"
|
"${PROJECT_BINARY_DIR}/${PROJECT_NAME_LOWER}-config-version.cmake"
|
||||||
COMPONENT devel
|
COMPONENT devel
|
||||||
DESTINATION ${CMAKE_INSTALL_DIR}
|
DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME_LOWER})
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
if (PROJECT_LIBRARIES OR PROJECT_STATIC_LIBRARIES)
|
if (PROJECT_LIBRARIES OR PROJECT_STATIC_LIBRARIES)
|
||||||
install(
|
install(
|
||||||
EXPORT "${TARGETS_EXPORT_NAME}"
|
EXPORT "${TARGETS_EXPORT_NAME}"
|
||||||
FILE ${PROJECT_NAME_LOWER}-targets.cmake
|
FILE ${PROJECT_NAME_LOWER}-targets.cmake
|
||||||
DESTINATION ${CMAKE_INSTALL_DIR}
|
DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME_LOWER})
|
||||||
)
|
|
||||||
endif ()
|
endif ()
|
||||||
|
@ -12,10 +12,8 @@ include(CMakeFindDependencyMacro)
|
|||||||
|
|
||||||
set(SLS_USE_HDF5 "@SLS_USE_HDF5@")
|
set(SLS_USE_HDF5 "@SLS_USE_HDF5@")
|
||||||
|
|
||||||
|
|
||||||
find_dependency(Threads)
|
|
||||||
|
|
||||||
# Add optional dependencies here
|
# Add optional dependencies here
|
||||||
|
find_dependency(Threads)
|
||||||
if (SLS_USE_HDF5)
|
if (SLS_USE_HDF5)
|
||||||
find_dependency(HDF5)
|
find_dependency(HDF5)
|
||||||
endif ()
|
endif ()
|
||||||
|
161
cmk.sh
161
cmk.sh
@ -1,9 +1,5 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
# SPDX-License-Identifier: LGPL-3.0-or-other
|
|
||||||
# Copyright (C) 2021 Contributors to the SLS Detector Package
|
|
||||||
CMAKE="cmake3"
|
|
||||||
BUILDDIR="build"
|
BUILDDIR="build"
|
||||||
INSTALLDIR=""
|
|
||||||
HDF5DIR="/opt/hdf5v1.10.0"
|
HDF5DIR="/opt/hdf5v1.10.0"
|
||||||
HDF5=0
|
HDF5=0
|
||||||
COMPILERTHREADS=0
|
COMPILERTHREADS=0
|
||||||
@ -15,9 +11,6 @@ PYTHON=0
|
|||||||
TESTS=0
|
TESTS=0
|
||||||
SIMULATOR=0
|
SIMULATOR=0
|
||||||
CTBGUI=0
|
CTBGUI=0
|
||||||
MANUALS=0
|
|
||||||
MANUALS_ONLY_RST=0
|
|
||||||
MOENCHZMQ=0
|
|
||||||
|
|
||||||
|
|
||||||
CLEAN=0
|
CLEAN=0
|
||||||
@ -26,26 +19,21 @@ CMAKE_PRE=""
|
|||||||
CMAKE_POST=""
|
CMAKE_POST=""
|
||||||
|
|
||||||
usage() { echo -e "
|
usage() { echo -e "
|
||||||
Usage: $0 [-b] [-c] [-d <HDF5 directory>] [-e] [-g] [-h] [-i] [-j <Number of threads>] [-k <CMake command>] [-l <Install directory>] [-m] [-n] [-p] [-r] [-s] [-t] [-u] [-z]
|
Usage: $0 [-c] [-b] [-p] [e] [t] [r] [g] [s] [u] [i] [-h] [-d <HDF5 directory>] [-j] <Number of threads>
|
||||||
-[no option]: only make
|
-[no option]: only make
|
||||||
-b: Builds/Rebuilds CMake files normal mode
|
|
||||||
-c: Clean
|
-c: Clean
|
||||||
-d: HDF5 Custom Directory
|
-b: Builds/Rebuilds CMake files normal mode
|
||||||
-e: Debug mode
|
|
||||||
-g: Build/Rebuilds gui
|
|
||||||
-h: Builds/Rebuilds Cmake files with HDF5 package
|
|
||||||
-i: Builds tests
|
|
||||||
-j: Number of threads to compile through
|
|
||||||
-k: CMake command
|
|
||||||
-l: Install directory
|
|
||||||
-m: Manuals
|
|
||||||
-n: Manuals without compiling doxygen (only rst)
|
|
||||||
-p: Builds/Rebuilds Python API
|
-p: Builds/Rebuilds Python API
|
||||||
-r: Build/Rebuilds only receiver
|
-h: Builds/Rebuilds Cmake files with HDF5 package
|
||||||
-s: Simulator
|
-d: HDF5 Custom Directory
|
||||||
-t: Build/Rebuilds only text client
|
-t: Build/Rebuilds only text client
|
||||||
|
-r: Build/Rebuilds only receiver
|
||||||
|
-g: Build/Rebuilds only gui
|
||||||
|
-s: Simulator
|
||||||
-u: Chip Test Gui
|
-u: Chip Test Gui
|
||||||
-z: Moench zmq processor
|
-j: Number of threads to compile through
|
||||||
|
-e: Debug mode
|
||||||
|
-i: Builds tests
|
||||||
|
|
||||||
Rebuild when you switch to a new build and compile in parallel:
|
Rebuild when you switch to a new build and compile in parallel:
|
||||||
./cmk.sh -bj5
|
./cmk.sh -bj5
|
||||||
@ -81,61 +69,37 @@ For rebuilding only certain sections
|
|||||||
|
|
||||||
" ; exit 1; }
|
" ; exit 1; }
|
||||||
|
|
||||||
while getopts ":bcd:eghij:k:l:mnpq:rstuz" opt ; do
|
while getopts ":bpchd:j:trgeisu" opt ; do
|
||||||
case $opt in
|
case $opt in
|
||||||
b)
|
b)
|
||||||
echo "Building of CMake files Required"
|
echo "Building of CMake files Required"
|
||||||
REBUILD=1
|
REBUILD=1
|
||||||
;;
|
;;
|
||||||
|
p)
|
||||||
|
echo "Compiling Options: Python"
|
||||||
|
PYTHON=1
|
||||||
|
REBUILD=1
|
||||||
|
;;
|
||||||
c)
|
c)
|
||||||
echo "Clean Required"
|
echo "Clean Required"
|
||||||
CLEAN=1
|
CLEAN=1
|
||||||
;;
|
;;
|
||||||
d)
|
|
||||||
echo "New HDF5 directory: $OPTARG"
|
|
||||||
HDF5DIR=$OPTARG
|
|
||||||
;;
|
|
||||||
e)
|
|
||||||
echo "Compiling Options: Debug"
|
|
||||||
DEBUG=1
|
|
||||||
;;
|
|
||||||
g)
|
|
||||||
echo "Compiling Options: GUI"
|
|
||||||
GUI=1
|
|
||||||
REBUILD=1
|
|
||||||
;;
|
|
||||||
h)
|
h)
|
||||||
echo "Building of CMake files with HDF5 option Required"
|
echo "Building of CMake files with HDF5 option Required"
|
||||||
HDF5=1
|
HDF5=1
|
||||||
REBUILD=1
|
REBUILD=1
|
||||||
;;
|
;;
|
||||||
i)
|
d)
|
||||||
echo "Compiling Options: Tests"
|
echo "New HDF5 directory: $OPTARG"
|
||||||
TESTS=1
|
HDF5DIR=$OPTARG
|
||||||
;;
|
;;
|
||||||
j)
|
j)
|
||||||
echo "Number of compiler threads: $OPTARG"
|
echo "Number of compiler threads: $OPTARG"
|
||||||
COMPILERTHREADS=$OPTARG
|
COMPILERTHREADS=$OPTARG
|
||||||
;;
|
;;
|
||||||
k)
|
t)
|
||||||
echo "CMake command: $OPTARG"
|
echo "Compiling Options: Text Client"
|
||||||
CMAKE="$OPTARG"
|
TEXTCLIENT=1
|
||||||
;;
|
|
||||||
l)
|
|
||||||
echo "CMake install directory: $OPTARG"
|
|
||||||
INSTALLDIR="$OPTARG"
|
|
||||||
;;
|
|
||||||
m)
|
|
||||||
echo "Compiling Manuals"
|
|
||||||
MANUALS=1
|
|
||||||
;;
|
|
||||||
n)
|
|
||||||
echo "Compiling Manuals (Only RST)"
|
|
||||||
MANUALS_ONLY_RST=1
|
|
||||||
;;
|
|
||||||
p)
|
|
||||||
echo "Compiling Options: Python"
|
|
||||||
PYTHON=1
|
|
||||||
REBUILD=1
|
REBUILD=1
|
||||||
;;
|
;;
|
||||||
r)
|
r)
|
||||||
@ -143,23 +107,27 @@ while getopts ":bcd:eghij:k:l:mnpq:rstuz" opt ; do
|
|||||||
RECEIVER=1
|
RECEIVER=1
|
||||||
REBUILD=1
|
REBUILD=1
|
||||||
;;
|
;;
|
||||||
|
g)
|
||||||
|
echo "Compiling Options: GUI"
|
||||||
|
GUI=1
|
||||||
|
REBUILD=1
|
||||||
|
;;
|
||||||
|
e)
|
||||||
|
echo "Compiling Options: Debug"
|
||||||
|
DEBUG=1
|
||||||
|
;;
|
||||||
|
i)
|
||||||
|
echo "Compiling Options: Tests"
|
||||||
|
TESTS=1
|
||||||
|
;;
|
||||||
s)
|
s)
|
||||||
echo "Compiling Options: Simulator"
|
echo "Compiling Options: Simulator"
|
||||||
SIMULATOR=1
|
SIMULATOR=1
|
||||||
;;
|
;;
|
||||||
t)
|
|
||||||
echo "Compiling Options: Text Client"
|
|
||||||
TEXTCLIENT=1
|
|
||||||
REBUILD=1
|
|
||||||
;;
|
|
||||||
u)
|
u)
|
||||||
echo "Compiling Options: Chip Test Gui"
|
echo "Compiling Options: Chip Test Gui"
|
||||||
CTBGUI=1
|
CTBGUI=1
|
||||||
;;
|
;;
|
||||||
z)
|
|
||||||
echo "Compiling Moench Zmq Processor"
|
|
||||||
MOENCHZMQ=1
|
|
||||||
;;
|
|
||||||
\?)
|
\?)
|
||||||
echo "Invalid option: -$OPTARG"
|
echo "Invalid option: -$OPTARG"
|
||||||
usage
|
usage
|
||||||
@ -219,8 +187,8 @@ fi
|
|||||||
|
|
||||||
#Debug
|
#Debug
|
||||||
if [ $DEBUG -eq 1 ]; then
|
if [ $DEBUG -eq 1 ]; then
|
||||||
# CMAKE_POST+=" -DCMAKE_BUILD_TYPE=Debug "
|
CMAKE_POST+=" -DCMAKE_BUILD_TYPE=Debug "
|
||||||
CMAKE_POST+=" -DCMAKE_BUILD_TYPE=Debug -DSLS_USE_SANITIZER=ON "
|
# CMAKE_POST+=" -DCMAKE_BUILD_TYPE=Debug -DSLS_USE_SANITIZER=ON "
|
||||||
echo "Debug Option enabled"
|
echo "Debug Option enabled"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
@ -230,18 +198,6 @@ if [ $SIMULATOR -eq 1 ]; then
|
|||||||
echo "Simulator Option enabled"
|
echo "Simulator Option enabled"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
#Manuals
|
|
||||||
if [ $MANUALS -eq 1 ]; then
|
|
||||||
CMAKE_POST+=" -DSLS_BUILD_DOCS=ON "
|
|
||||||
echo "Manuals Option enabled"
|
|
||||||
fi
|
|
||||||
|
|
||||||
#Moench zmq processor
|
|
||||||
if [ $MOENCHZMQ -eq 1 ]; then
|
|
||||||
CMAKE_POST+=" -DSLS_USE_MOENCH=ON "
|
|
||||||
echo "Moench Zmq Processor Option enabled"
|
|
||||||
fi
|
|
||||||
|
|
||||||
#Chip Test Gui
|
#Chip Test Gui
|
||||||
if [ $CTBGUI -eq 1 ]; then
|
if [ $CTBGUI -eq 1 ]; then
|
||||||
CMAKE_POST+=" -DSLS_USE_CTBGUI=ON "
|
CMAKE_POST+=" -DSLS_USE_CTBGUI=ON "
|
||||||
@ -254,6 +210,7 @@ if [ $TESTS -eq 1 ]; then
|
|||||||
echo "Tests Option enabled"
|
echo "Tests Option enabled"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|
||||||
#hdf5 rebuild
|
#hdf5 rebuild
|
||||||
if [ $HDF5 -eq 1 ]; then
|
if [ $HDF5 -eq 1 ]; then
|
||||||
# CMAKE_PRE+="HDF5_ROOT="$HDF5DIR
|
# CMAKE_PRE+="HDF5_ROOT="$HDF5DIR
|
||||||
@ -265,15 +222,7 @@ else
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
|
|
||||||
#install
|
|
||||||
if [ -n "$INSTALLDIR" ]; then
|
|
||||||
CMAKE_POST+=" -DCMAKE_INSTALL_PREFIX=$INSTALLDIR"
|
|
||||||
CMAKE_POST+=" -DCMAKE_FIND_ROOT_PATH=$INSTALLDIR"
|
|
||||||
fi
|
|
||||||
|
|
||||||
|
|
||||||
#enter build dir
|
#enter build dir
|
||||||
#pushd $BUILDDIR;
|
|
||||||
cd $BUILDDIR;
|
cd $BUILDDIR;
|
||||||
echo "in "$PWD
|
echo "in "$PWD
|
||||||
|
|
||||||
@ -282,7 +231,7 @@ echo "in "$PWD
|
|||||||
#cmake
|
#cmake
|
||||||
if [ $REBUILD -eq 1 ]; then
|
if [ $REBUILD -eq 1 ]; then
|
||||||
rm -f CMakeCache.txt
|
rm -f CMakeCache.txt
|
||||||
BUILDCOMMAND="$CMAKE_PRE $CMAKE $CMAKE_POST .."
|
BUILDCOMMAND="$CMAKE_PRE cmake3 $CMAKE_POST .."
|
||||||
echo $BUILDCOMMAND
|
echo $BUILDCOMMAND
|
||||||
eval $BUILDCOMMAND
|
eval $BUILDCOMMAND
|
||||||
fi
|
fi
|
||||||
@ -295,45 +244,15 @@ fi
|
|||||||
|
|
||||||
#make
|
#make
|
||||||
if [ $COMPILERTHREADS -gt 0 ]; then
|
if [ $COMPILERTHREADS -gt 0 ]; then
|
||||||
if [ $MANUALS -eq 0 ] && [ $MANUALS_ONLY_RST -eq 0 ]; then
|
|
||||||
BUILDCOMMAND="make -j$COMPILERTHREADS"
|
BUILDCOMMAND="make -j$COMPILERTHREADS"
|
||||||
echo $BUILDCOMMAND
|
echo $BUILDCOMMAND
|
||||||
eval $BUILDCOMMAND
|
eval $BUILDCOMMAND
|
||||||
else
|
|
||||||
if [ $MANUALS -eq 1 ]; then
|
|
||||||
BUILDCOMMAND="make docs -j$COMPILERTHREADS"
|
|
||||||
echo $BUILDCOMMAND
|
|
||||||
eval $BUILDCOMMAND
|
|
||||||
else
|
|
||||||
BUILDCOMMAND="make rst -j$COMPILERTHREADS"
|
|
||||||
echo $BUILDCOMMAND
|
|
||||||
eval $BUILDCOMMAND
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
else
|
else
|
||||||
if [ $MANUALS -eq 0 ] && [ $MANUALS_ONLY_RST -eq 0 ]; then
|
|
||||||
echo "make"
|
|
||||||
make
|
make
|
||||||
else
|
|
||||||
if [ $MANUALS -eq 1 ]; then
|
|
||||||
echo "make docs"
|
|
||||||
make docs
|
|
||||||
else
|
|
||||||
echo "make rst"
|
|
||||||
make rst
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
|
|
||||||
#install
|
|
||||||
if [ -n "$INSTALLDIR" ]; then
|
|
||||||
make install
|
|
||||||
# popd
|
|
||||||
# $CMAKE --build $BUILDDIR --target install
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
20
conda-recepie/build.sh
Executable file
20
conda-recepie/build.sh
Executable file
@ -0,0 +1,20 @@
|
|||||||
|
|
||||||
|
mkdir build
|
||||||
|
mkdir install
|
||||||
|
cd build
|
||||||
|
cmake .. \
|
||||||
|
-DCMAKE_PREFIX_PATH=$CONDA_PREFIX \
|
||||||
|
-DCMAKE_INSTALL_PREFIX=install \
|
||||||
|
-DSLS_USE_TEXTCLIENT=ON \
|
||||||
|
-DSLS_USE_RECEIVER=ON \
|
||||||
|
-DSLS_USE_GUI=ON \
|
||||||
|
-DSLS_USE_TESTS=ON \
|
||||||
|
-DSLS_USE_PYTHON=OFF \
|
||||||
|
-DCMAKE_BUILD_TYPE=Release \
|
||||||
|
-DSLS_USE_HDF5=OFF\
|
||||||
|
|
||||||
|
|
||||||
|
cmake --build . -- -j10
|
||||||
|
cmake --build . --target install
|
||||||
|
|
||||||
|
CTEST_OUTPUT_ON_FAILURE=1 ctest -j 2
|
4
conda-recepie/build_pylib.sh
Executable file
4
conda-recepie/build_pylib.sh
Executable file
@ -0,0 +1,4 @@
|
|||||||
|
|
||||||
|
echo "|<-------- starting python build"
|
||||||
|
cd python
|
||||||
|
${PYTHON} setup.py install
|
7
conda-recepie/conda_build_config.yaml
Normal file
7
conda-recepie/conda_build_config.yaml
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
python:
|
||||||
|
- 3.6
|
||||||
|
- 3.7
|
||||||
|
- 3.8
|
||||||
|
|
||||||
|
numpy:
|
||||||
|
- 1.17
|
9
conda-recepie/copy_ctbgui.sh
Normal file
9
conda-recepie/copy_ctbgui.sh
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
mkdir $PREFIX/lib
|
||||||
|
mkdir $PREFIX/bin
|
||||||
|
mkdir $PREFIX/include
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
cp build/bin/ctbGui $PREFIX/bin/.
|
||||||
|
cp build/bin/libctbRootLib.so $PREFIX/lib/.
|
||||||
|
|
3
conda-recepie/copy_gui.sh
Executable file
3
conda-recepie/copy_gui.sh
Executable file
@ -0,0 +1,3 @@
|
|||||||
|
#Copy the GUI
|
||||||
|
mkdir $PREFIX/bin
|
||||||
|
cp build/bin/slsDetectorGui $PREFIX/bin/.
|
22
conda-recepie/copy_lib.sh
Executable file
22
conda-recepie/copy_lib.sh
Executable file
@ -0,0 +1,22 @@
|
|||||||
|
|
||||||
|
mkdir $PREFIX/lib
|
||||||
|
mkdir $PREFIX/bin
|
||||||
|
mkdir $PREFIX/include
|
||||||
|
mkdir $PREFIX/include/slsDetectorPackage
|
||||||
|
|
||||||
|
#Shared and static libraries
|
||||||
|
cp build/bin/libSlsDetector.so $PREFIX/lib/.
|
||||||
|
cp build/bin/libSlsReceiver.so $PREFIX/lib/.
|
||||||
|
cp build/bin/libSlsSupport.so $PREFIX/lib/.
|
||||||
|
|
||||||
|
#Binaries
|
||||||
|
cp build/bin/sls_detector_acquire $PREFIX/bin/.
|
||||||
|
cp build/bin/sls_detector_get $PREFIX/bin/.
|
||||||
|
cp build/bin/sls_detector_put $PREFIX/bin/.
|
||||||
|
cp build/bin/sls_detector_help $PREFIX/bin/.
|
||||||
|
cp build/bin/slsReceiver $PREFIX/bin/.
|
||||||
|
cp build/bin/slsMultiReceiver $PREFIX/bin/.
|
||||||
|
|
||||||
|
#Which headers do we need for development??
|
||||||
|
cp build/install/include/* $PREFIX/include/slsDetectorPackage/
|
||||||
|
# cp include/some_lib.h $PREFIX/include/.
|
96
conda-recepie/meta.yaml
Executable file
96
conda-recepie/meta.yaml
Executable file
@ -0,0 +1,96 @@
|
|||||||
|
|
||||||
|
package:
|
||||||
|
name: sls_detector_software
|
||||||
|
version: "udp"
|
||||||
|
|
||||||
|
source:
|
||||||
|
- path: ..
|
||||||
|
|
||||||
|
build:
|
||||||
|
number: 1
|
||||||
|
binary_relocation: True
|
||||||
|
rpaths:
|
||||||
|
- lib/
|
||||||
|
|
||||||
|
requirements:
|
||||||
|
build:
|
||||||
|
- {{ compiler('c') }}
|
||||||
|
- {{compiler('cxx')}}
|
||||||
|
- cmake
|
||||||
|
- qwt 6.*
|
||||||
|
- qt 4.8.*
|
||||||
|
- zeromq
|
||||||
|
- xorg-libx11
|
||||||
|
- xorg-libice
|
||||||
|
- xorg-libxext
|
||||||
|
- xorg-libsm
|
||||||
|
- xorg-libxau
|
||||||
|
- xorg-libxrender
|
||||||
|
- xorg-libxfixes
|
||||||
|
- {{ cdt('mesa-libgl-devel') }} # [linux]
|
||||||
|
- {{ cdt('mesa-libegl-devel') }} # [linux]
|
||||||
|
- {{ cdt('mesa-dri-drivers') }} # [linux]
|
||||||
|
- {{ cdt('libselinux') }} # [linux]
|
||||||
|
- {{ cdt('libxdamage') }} # [linux]
|
||||||
|
- {{ cdt('libxxf86vm') }} # [linux]
|
||||||
|
|
||||||
|
host:
|
||||||
|
- libstdcxx-ng
|
||||||
|
- libgcc-ng
|
||||||
|
- xorg-libx11
|
||||||
|
- xorg-libice
|
||||||
|
- xorg-libxext
|
||||||
|
- xorg-libsm
|
||||||
|
- xorg-libxau
|
||||||
|
- xorg-libxrender
|
||||||
|
- xorg-libxfixes
|
||||||
|
|
||||||
|
run:
|
||||||
|
- libstdcxx-ng
|
||||||
|
- libgcc-ng
|
||||||
|
|
||||||
|
|
||||||
|
outputs:
|
||||||
|
- name: slsdetlib
|
||||||
|
script: copy_lib.sh
|
||||||
|
|
||||||
|
requirements:
|
||||||
|
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
|
||||||
|
|
||||||
|
run:
|
||||||
|
- libstdcxx-ng
|
||||||
|
- libgcc-ng
|
||||||
|
- python
|
||||||
|
- numpy
|
||||||
|
- {{ pin_subpackage('slsdetlib', exact=True) }}
|
||||||
|
|
||||||
|
|
||||||
|
test:
|
||||||
|
imports:
|
||||||
|
- slsdet
|
||||||
|
|
||||||
|
- name: slsdetgui
|
||||||
|
script: copy_gui.sh
|
||||||
|
requirements:
|
||||||
|
run:
|
||||||
|
- {{ pin_subpackage('slsdetlib', exact=True) }}
|
||||||
|
- qwt 6.*
|
||||||
|
- qt 4.8.*
|
1
conda-recepie/run_test.sh
Executable file
1
conda-recepie/run_test.sh
Executable file
@ -0,0 +1 @@
|
|||||||
|
ctest -j2
|
@ -1,28 +0,0 @@
|
|||||||
# 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
|
|
||||||
cd build
|
|
||||||
cmake .. -G Ninja \
|
|
||||||
-DCMAKE_PREFIX_PATH=$CONDA_PREFIX \
|
|
||||||
-DCMAKE_INSTALL_PREFIX=install \
|
|
||||||
-DSLS_USE_TEXTCLIENT=ON \
|
|
||||||
-DSLS_USE_RECEIVER=ON \
|
|
||||||
-DSLS_USE_GUI=ON \
|
|
||||||
-DSLS_USE_MOENCH=ON\
|
|
||||||
-DSLS_USE_TESTS=ON \
|
|
||||||
-DSLS_USE_PYTHON=OFF \
|
|
||||||
-DCMAKE_BUILD_TYPE=Release \
|
|
||||||
-DSLS_USE_HDF5=OFF \
|
|
||||||
|
|
||||||
NCORES=$(getconf _NPROCESSORS_ONLN)
|
|
||||||
echo "Building using: ${NCORES} cores"
|
|
||||||
cmake --build . -- -j${NCORES}
|
|
||||||
cmake --build . --target install
|
|
||||||
|
|
||||||
CTEST_OUTPUT_ON_FAILURE=1 ctest -j 1
|
|
@ -1,13 +0,0 @@
|
|||||||
|
|
||||||
c_compiler:
|
|
||||||
- gcc # [linux]
|
|
||||||
|
|
||||||
c_stdlib:
|
|
||||||
- sysroot # [linux]
|
|
||||||
|
|
||||||
cxx_compiler:
|
|
||||||
- gxx # [linux]
|
|
||||||
|
|
||||||
|
|
||||||
c_stdlib_version: # [linux]
|
|
||||||
- 2.17 # [linux]
|
|
@ -1,5 +0,0 @@
|
|||||||
# SPDX-License-Identifier: LGPL-3.0-or-other
|
|
||||||
# Copyright (C) 2021 Contributors to the SLS Detector Package
|
|
||||||
#Copy the GUI
|
|
||||||
mkdir -p $PREFIX/bin
|
|
||||||
cp build/install/bin/slsDetectorGui $PREFIX/bin/.
|
|
@ -1,24 +0,0 @@
|
|||||||
# SPDX-License-Identifier: LGPL-3.0-or-other
|
|
||||||
# Copyright (C) 2021 Contributors to the SLS Detector Package
|
|
||||||
|
|
||||||
mkdir -p $PREFIX/lib
|
|
||||||
mkdir -p $PREFIX/bin
|
|
||||||
mkdir -p $PREFIX/include/sls
|
|
||||||
|
|
||||||
#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
|
|
||||||
cp -rv build/install/share $PREFIX
|
|
@ -1,6 +0,0 @@
|
|||||||
# SPDX-License-Identifier: LGPL-3.0-or-other
|
|
||||||
# Copyright (C) 2021 Contributors to the SLS Detector Package
|
|
||||||
|
|
||||||
#Copy the Moench executables
|
|
||||||
mkdir -p $PREFIX/bin
|
|
||||||
cp build/install/bin/moench* $PREFIX/bin/.
|
|
@ -1,78 +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
|
|
||||||
|
|
||||||
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) }}
|
|
@ -1,16 +0,0 @@
|
|||||||
python:
|
|
||||||
- 3.11
|
|
||||||
- 3.12
|
|
||||||
- 3.13
|
|
||||||
|
|
||||||
c_compiler:
|
|
||||||
- gcc # [linux]
|
|
||||||
|
|
||||||
c_stdlib:
|
|
||||||
- sysroot # [linux]
|
|
||||||
|
|
||||||
cxx_compiler:
|
|
||||||
- gxx # [linux]
|
|
||||||
|
|
||||||
c_stdlib_version: # [linux]
|
|
||||||
- 2.17 # [linux]
|
|
@ -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 # [not win]
|
|
||||||
|
|
||||||
requirements:
|
|
||||||
build:
|
|
||||||
- python {{python}}
|
|
||||||
- {{ compiler('c') }}
|
|
||||||
- {{ stdlib("c") }}
|
|
||||||
- {{ compiler('cxx') }}
|
|
||||||
|
|
||||||
host:
|
|
||||||
- cmake
|
|
||||||
- ninja
|
|
||||||
- python {{python}}
|
|
||||||
- pip
|
|
||||||
- scikit-build-core
|
|
||||||
- pybind11 >=2.13.0
|
|
||||||
- fmt
|
|
||||||
- zeromq
|
|
||||||
- nlohmann_json
|
|
||||||
- catch2
|
|
||||||
|
|
||||||
run:
|
|
||||||
- python {{python}}
|
|
||||||
- numpy
|
|
||||||
|
|
||||||
|
|
||||||
test:
|
|
||||||
imports:
|
|
||||||
- slsdet
|
|
||||||
|
|
||||||
|
|
||||||
about:
|
|
||||||
summary: An example project built with pybind11 and scikit-build.
|
|
||||||
# license_file: LICENSE
|
|
89
ctbGui/CMakeLists.txt
Normal file
89
ctbGui/CMakeLists.txt
Normal file
@ -0,0 +1,89 @@
|
|||||||
|
|
||||||
|
|
||||||
|
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.cpp
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
#TODO! Replace with target
|
||||||
|
target_include_directories(ctbGui PRIVATE
|
||||||
|
${CMAKE_SOURCE_DIR}/slsDetectorCalibration/dataStructures
|
||||||
|
${CMAKE_SOURCE_DIR}/slsDetectorCalibration/interpolations
|
||||||
|
${CMAKE_SOURCE_DIR}/slsDetectorCalibration/
|
||||||
|
)
|
||||||
|
|
||||||
|
# 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
|
||||||
|
include("${ROOT_DIR}/modules/RootNewMacros.cmake")
|
||||||
|
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
|
||||||
|
slsSupportLib
|
||||||
|
${ROOT_LIBRARIES}
|
||||||
|
${ROOT_EXE_LINKER_FLAGS}
|
||||||
|
)
|
||||||
|
|
||||||
|
set_target_properties(
|
||||||
|
ctbRootLib PROPERTIES
|
||||||
|
LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin
|
||||||
|
)
|
||||||
|
|
||||||
|
target_link_libraries(ctbGui PUBLIC
|
||||||
|
slsDetectorShared
|
||||||
|
slsSupportLib
|
||||||
|
ctbRootLib
|
||||||
|
${TIFF_LIBRARIES}
|
||||||
|
)
|
||||||
|
|
||||||
|
set_target_properties(ctbGui PROPERTIES
|
||||||
|
RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin
|
||||||
|
|
||||||
|
)
|
44
ctbGui/Makefile.root5
Normal file
44
ctbGui/Makefile.root5
Normal file
@ -0,0 +1,44 @@
|
|||||||
|
|
||||||
|
|
||||||
|
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)
|
||||||
|
|
46
ctbGui/Makefile.root6
Normal file
46
ctbGui/Makefile.root6
Normal file
@ -0,0 +1,46 @@
|
|||||||
|
|
||||||
|
|
||||||
|
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)
|
||||||
|
|
2117
ctbGui/ctbAcquisition.cpp
Executable file
2117
ctbGui/ctbAcquisition.cpp
Executable file
File diff suppressed because it is too large
Load Diff
242
ctbGui/ctbAcquisition.h
Executable file
242
ctbGui/ctbAcquisition.h
Executable file
@ -0,0 +1,242 @@
|
|||||||
|
#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, ADCSAR2, MYTHEN301, MYTHEN302};
|
||||||
|
|
||||||
|
|
||||||
|
private:
|
||||||
|
TGTextEntry *eOutdir;
|
||||||
|
TGTextEntry *eFname;
|
||||||
|
TGNumberEntry *eFindex;
|
||||||
|
TGCheckButton *cFileSave;
|
||||||
|
|
||||||
|
|
||||||
|
TGNumberEntry *eSerOff;
|
||||||
|
TGNumberEntry *eDynRange;
|
||||||
|
TGNumberEntry *eNumCount;
|
||||||
|
|
||||||
|
|
||||||
|
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(detectorData*, long unsigned int, unsigned int, void*);
|
||||||
|
int StopFlag;
|
||||||
|
|
||||||
|
int plotData(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 canvasClicked();
|
||||||
|
void FitADC();
|
||||||
|
void plotBit();
|
||||||
|
ClassDef(ctbAcquisition,0)
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
614
ctbGui/ctbAdcs.cpp
Executable file
614
ctbGui/ctbAdcs.cpp
Executable file
@ -0,0 +1,614 @@
|
|||||||
|
#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 "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);
|
||||||
|
}
|
155
ctbGui/ctbAdcs.h
Executable file
155
ctbGui/ctbAdcs.h
Executable file
@ -0,0 +1,155 @@
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#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
|
||||||
|
|
||||||
|
|
214
ctbGui/ctbDacs.cpp
Executable file
214
ctbGui/ctbDacs.cpp
Executable file
@ -0,0 +1,214 @@
|
|||||||
|
|
||||||
|
#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 "Detector.h"
|
||||||
|
#include "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();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void ctbDac::setValue(Long_t a) {setValue();}
|
||||||
|
|
||||||
|
void ctbDac::setValue() {
|
||||||
|
|
||||||
|
cout << "setting dac! "<< id << " value " << dacsEntry->GetIntNumber() << " units " << dacsUnit->IsOn() << endl;
|
||||||
|
|
||||||
|
try {
|
||||||
|
myDet->setDAC(static_cast<slsDetectorDefs::dacIndex>(id), 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 {
|
||||||
|
myDet->setDAC(static_cast<slsDetectorDefs::dacIndex>(id), -100, false);
|
||||||
|
} CATCH_DISPLAY ("Could not power off dac " + to_string(id) + ".", "ctbDac::setOn")
|
||||||
|
}
|
||||||
|
getValue();
|
||||||
|
}
|
||||||
|
|
||||||
|
int ctbDac::getValue() {
|
||||||
|
try {
|
||||||
|
int val = myDet->getDAC(static_cast<slsDetectorDefs::dacIndex>(id), 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
Executable file
77
ctbGui/ctbDacs.h
Executable file
@ -0,0 +1,77 @@
|
|||||||
|
|
||||||
|
|
||||||
|
#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();
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
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
|
||||||
|
|
84
ctbGui/ctbDefs.h
Executable file
84
ctbGui/ctbDefs.h
Executable file
@ -0,0 +1,84 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
#include <stdexcept>
|
||||||
|
#include <chrono>
|
||||||
|
|
||||||
|
//#include "sls_detector_exceptions.h"
|
||||||
|
//#include "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")) {
|
||||||
|
throw;
|
||||||
|
}
|
||||||
|
if (exceptionMessage.find("annot connect")) {
|
||||||
|
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);
|
||||||
|
};
|
||||||
|
|
||||||
|
};
|
157
ctbGui/ctbGui.cpp
Executable file
157
ctbGui/ctbGui.cpp
Executable file
@ -0,0 +1,157 @@
|
|||||||
|
#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 "Detector.h"
|
||||||
|
#include "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;
|
||||||
|
}
|
15
ctbGui/ctbLinkDef.h
Executable file
15
ctbGui/ctbLinkDef.h
Executable file
@ -0,0 +1,15 @@
|
|||||||
|
#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;
|
584
ctbGui/ctbMain.cpp
Executable file
584
ctbGui/ctbMain.cpp
Executable file
@ -0,0 +1,584 @@
|
|||||||
|
#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 "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;
|
||||||
|
|
||||||
|
|
||||||
|
setReadoutMode(pat->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);
|
||||||
|
}
|
128
ctbGui/ctbMain.h
Executable file
128
ctbGui/ctbMain.h
Executable file
@ -0,0 +1,128 @@
|
|||||||
|
#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
|
1096
ctbGui/ctbPattern.cpp
Executable file
1096
ctbGui/ctbPattern.cpp
Executable file
File diff suppressed because it is too large
Load Diff
179
ctbGui/ctbPattern.h
Executable file
179
ctbGui/ctbPattern.h
Executable file
@ -0,0 +1,179 @@
|
|||||||
|
#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
|
223
ctbGui/ctbPowers.cpp
Normal file
223
ctbGui/ctbPowers.cpp
Normal file
@ -0,0 +1,223 @@
|
|||||||
|
#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 "Detector.h"
|
||||||
|
#include "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();
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
67
ctbGui/ctbPowers.h
Normal file
67
ctbGui/ctbPowers.h
Normal file
@ -0,0 +1,67 @@
|
|||||||
|
#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
|
531
ctbGui/ctbSignals.cpp
Executable file
531
ctbGui/ctbSignals.cpp
Executable file
@ -0,0 +1,531 @@
|
|||||||
|
#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 "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")
|
||||||
|
|
||||||
|
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")
|
||||||
|
}
|
121
ctbGui/ctbSignals.h
Executable file
121
ctbGui/ctbSignals.h
Executable file
@ -0,0 +1,121 @@
|
|||||||
|
#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
|
182
ctbGui/ctbSlowAdcs.cpp
Normal file
182
ctbGui/ctbSlowAdcs.cpp
Normal file
@ -0,0 +1,182 @@
|
|||||||
|
|
||||||
|
#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 "Detector.h"
|
||||||
|
#include "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();
|
||||||
|
}
|
||||||
|
}
|
78
ctbGui/ctbSlowAdcs.h
Normal file
78
ctbGui/ctbSlowAdcs.h
Normal file
@ -0,0 +1,78 @@
|
|||||||
|
|
||||||
|
|
||||||
|
#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
|
||||||
|
|
110
ctbGui/patternGenerator/deserializer.cpp
Normal file
110
ctbGui/patternGenerator/deserializer.cpp
Normal file
@ -0,0 +1,110 @@
|
|||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <sys/utsname.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
#include <errno.h>
|
||||||
|
#include <math.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
#include <stdarg.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
|
int main(int argc, char *argv[]) {
|
||||||
|
|
||||||
|
int iarg;
|
||||||
|
char fname[10000];
|
||||||
|
uint64_t word;
|
||||||
|
int val[64];
|
||||||
|
int bit[64];
|
||||||
|
FILE *fdin;
|
||||||
|
|
||||||
|
int nb=2;
|
||||||
|
int off=0;
|
||||||
|
int ioff=0;
|
||||||
|
int dr=24;
|
||||||
|
int idr=0;
|
||||||
|
int ib=0;
|
||||||
|
int iw=0;
|
||||||
|
bit[0]=19;
|
||||||
|
bit[1]=8;
|
||||||
|
// for (iarg=0; iarg<argc; iarg++) printf("%d %s\n",iarg, argv[iarg]);
|
||||||
|
|
||||||
|
if (argc<2) printf("Error: usage is %s fname [dr off b0 b1 bn]\n");
|
||||||
|
|
||||||
|
if (argc>2) dr=atoi(argv[2]);
|
||||||
|
if (argc>3) off=atoi(argv[3]);
|
||||||
|
if (argc>4) {
|
||||||
|
for (ib=0; ib<64; ib++) {
|
||||||
|
if (argc>4+ib) {
|
||||||
|
bit[ib]=atoi(argv[4+ib]);
|
||||||
|
nb++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
idr=0;
|
||||||
|
for (ib=0; ib<nb; ib++) {
|
||||||
|
val[ib]=0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
fdin=fopen(argv[1],"rb");
|
||||||
|
if (fdin==NULL) {
|
||||||
|
printf("Cannot open input file %s for reading\n",argv[1]);
|
||||||
|
return 200;
|
||||||
|
}
|
||||||
|
|
||||||
|
while (fread((void*)&word, 8, 1, fdin)) {
|
||||||
|
// printf("%llx\n",word);
|
||||||
|
if (ioff<off) ioff++;
|
||||||
|
else {
|
||||||
|
|
||||||
|
for (ib=0; ib<nb; ib++) {
|
||||||
|
if (word&(1<<bit[ib])) val[ib]|=(1<<idr);
|
||||||
|
}
|
||||||
|
idr++;
|
||||||
|
if (idr==dr) {
|
||||||
|
idr=0;
|
||||||
|
fprintf(stdout,"%d\t",iw++);
|
||||||
|
for (ib=0; ib<nb; ib++) {
|
||||||
|
#ifdef HEX
|
||||||
|
fprintf(stdout,"%08llx\t",val[ib]);
|
||||||
|
#else
|
||||||
|
fprintf(stdout,"%lld\t",val[ib]);
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
val[ib]=0;
|
||||||
|
}
|
||||||
|
fprintf(stdout,"\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
if (idr!=0) {
|
||||||
|
fprintf(stdout,"%d\t",iw++);
|
||||||
|
for (ib=0; ib<nb; ib++) {
|
||||||
|
#ifdef HEX
|
||||||
|
fprintf(stdout,"%08llx\t",val[ib]);
|
||||||
|
#else
|
||||||
|
fprintf(stdout,"%lld\t",val[ib]);
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
val[ib]=0;
|
||||||
|
}
|
||||||
|
fprintf(stdout,"\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
fclose(fdin);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
@ -1,5 +1,3 @@
|
|||||||
# SPDX-License-Identifier: LGPL-3.0-or-other
|
|
||||||
# Copyright (C) 2021 Contributors to the SLS Detector Package
|
|
||||||
if [ "$#" -eq 0 ]; then
|
if [ "$#" -eq 0 ]; then
|
||||||
echo "Wrong number of arguments: usage should be $0 patname"
|
echo "Wrong number of arguments: usage should be $0 patname"
|
||||||
exit 1
|
exit 1
|
||||||
@ -21,10 +19,8 @@ fi
|
|||||||
|
|
||||||
if [ -f "$infile" ]
|
if [ -f "$infile" ]
|
||||||
then
|
then
|
||||||
dir=$(dirname $infile)
|
gcc -DINFILE="\"$infile\"" -DOUTFILE="\"$outfile\"" -DOUTFILEBIN="\"$outfilebin\"" -o $exe generator.c ;
|
||||||
gcc -DINFILE="\"$infile\"" -DOUTFILE="\"$outfile\"" -DOUTFILEBIN="\"$outfilebin\"" -o $exe generator.c -I$dir;
|
|
||||||
echo compiling
|
echo compiling
|
||||||
echo gcc -DINFILE="\"$infile\"" -DOUTFILE="\"$outfile\"" -DOUTFILEBIN="\"$outfilebin\"" -o $exe generator.c -I$dir;
|
|
||||||
$exe ;
|
$exe ;
|
||||||
echo cleaning
|
echo cleaning
|
||||||
rm $exe
|
rm $exe
|
177
ctbGui/patternGenerator/generator.c
Executable file
177
ctbGui/patternGenerator/generator.c
Executable file
@ -0,0 +1,177 @@
|
|||||||
|
/****************************************************************************
|
||||||
|
usage to generate a patter test.pat from test.p
|
||||||
|
|
||||||
|
gcc -DINFILE="\"test.p\"" -DOUTFILE="\"test.pat\"" -o test.exe generator.c ; ./test.exe ; rm test.exe
|
||||||
|
|
||||||
|
|
||||||
|
*************************************************************************/
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <sys/utsname.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
#include <errno.h>
|
||||||
|
#include <math.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
#include <stdarg.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
|
#define MAXLOOPS 3
|
||||||
|
#define MAXTIMERS 3
|
||||||
|
#define MAXWORDS 1024
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
uint64_t pat=0;
|
||||||
|
uint64_t iopat=0;
|
||||||
|
uint64_t clkpat=0;
|
||||||
|
|
||||||
|
int iaddr=0;
|
||||||
|
int waitaddr[3]={MAXWORDS,MAXWORDS,MAXWORDS};
|
||||||
|
int startloopaddr[3]={MAXWORDS,MAXWORDS,MAXWORDS};
|
||||||
|
int stoploopaddr[3]={MAXWORDS,MAXWORDS,MAXWORDS};
|
||||||
|
int start=0, stop=0;
|
||||||
|
uint64_t waittime[3]={0,0,0};
|
||||||
|
int nloop[3]={0,0,0};
|
||||||
|
|
||||||
|
char infile[10000], outfile[10000];
|
||||||
|
|
||||||
|
FILE *fd, *fd1;
|
||||||
|
uint64_t PAT[MAXWORDS];
|
||||||
|
|
||||||
|
|
||||||
|
int i,ii,iii,j,jj,jjj,pixx,pixy,memx,memy,muxout,memclk,colclk,rowclk,muxclk,memcol,memrow,loopcounter;
|
||||||
|
|
||||||
|
void setstart() {
|
||||||
|
start=iaddr;
|
||||||
|
}
|
||||||
|
|
||||||
|
void setstop() {
|
||||||
|
stop=iaddr;
|
||||||
|
}
|
||||||
|
|
||||||
|
void setinput(int bit) {
|
||||||
|
uint64_t mask=1;
|
||||||
|
mask=mask<<bit;
|
||||||
|
iopat &= ~mask;
|
||||||
|
}
|
||||||
|
|
||||||
|
void setoutput(int bit) {
|
||||||
|
uint64_t mask=1;
|
||||||
|
mask=mask<<bit;
|
||||||
|
iopat |= mask;
|
||||||
|
}
|
||||||
|
|
||||||
|
void setclk(int bit) {
|
||||||
|
uint64_t mask=1;
|
||||||
|
mask=mask<<bit;
|
||||||
|
iopat |= mask;
|
||||||
|
clkpat |= mask;
|
||||||
|
}
|
||||||
|
|
||||||
|
void clearbit(int bit){
|
||||||
|
uint64_t mask=1;
|
||||||
|
mask=mask<<bit;
|
||||||
|
pat &= ~mask;
|
||||||
|
}
|
||||||
|
void setbit(int bit){
|
||||||
|
uint64_t mask=1;
|
||||||
|
mask=mask<<bit;
|
||||||
|
pat |= mask;
|
||||||
|
}
|
||||||
|
|
||||||
|
int checkbit(int bit) {
|
||||||
|
uint64_t mask=1;
|
||||||
|
mask=mask<<bit;
|
||||||
|
return (pat & mask ) >>bit;
|
||||||
|
}
|
||||||
|
|
||||||
|
void setstartloop(int iloop) {
|
||||||
|
if (iloop>=0 && iloop<MAXLOOPS)
|
||||||
|
startloopaddr[iloop]=iaddr;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void setstoploop(int iloop) {
|
||||||
|
if (iloop>=0 && iloop<MAXLOOPS)
|
||||||
|
stoploopaddr[iloop]=iaddr;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void setnloop(int iloop, int n) {
|
||||||
|
if (iloop>=0 && iloop<MAXLOOPS)
|
||||||
|
nloop[iloop]=n;
|
||||||
|
}
|
||||||
|
|
||||||
|
void setwaitpoint(int iloop) {
|
||||||
|
if (iloop>=0 && iloop<MAXTIMERS)
|
||||||
|
waitaddr[iloop]=iaddr;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void setwaittime(int iloop, uint64_t t) {
|
||||||
|
if (iloop>=0 && iloop<MAXTIMERS)
|
||||||
|
waittime[iloop]=t;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void pw(){
|
||||||
|
if (iaddr<MAXWORDS)
|
||||||
|
PAT[iaddr]= pat;
|
||||||
|
fprintf(fd,"patword 0x%04x 0x%016llx\n",iaddr, pat);
|
||||||
|
iaddr++;
|
||||||
|
if (iaddr>=MAXWORDS) printf("ERROR: too many word in the pattern (%d instead of %d)!",iaddr, MAXWORDS);
|
||||||
|
}
|
||||||
|
|
||||||
|
int parseCommand(int clk, int cmdbit, int cmd, int length) {
|
||||||
|
int ibit;
|
||||||
|
clearbit(clk);
|
||||||
|
for (ibit=0; ibit<length; ibit++) {
|
||||||
|
if (cmd&(1>>ibit))
|
||||||
|
setbit(cmdbit);
|
||||||
|
else
|
||||||
|
clearbit(cmdbit);
|
||||||
|
pw();
|
||||||
|
/******/
|
||||||
|
setbit(clk);
|
||||||
|
pw();
|
||||||
|
/******/
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
main(void) {
|
||||||
|
int iloop=0;
|
||||||
|
fd=fopen(OUTFILE,"w");
|
||||||
|
#include INFILE
|
||||||
|
|
||||||
|
fprintf(fd,"patioctrl 0x%016llx\n",iopat);
|
||||||
|
fprintf(fd,"patclkctrl 0x%016llx\n",clkpat);
|
||||||
|
fprintf(fd,"patlimits 0x%04x 0x%04x\n",start, stop);
|
||||||
|
|
||||||
|
for (iloop=0; iloop<MAXLOOPS; iloop++) {
|
||||||
|
fprintf(fd,"patloop%d 0x%04x 0x%04x\n",iloop, startloopaddr[iloop], stoploopaddr[iloop]);
|
||||||
|
if ( startloopaddr[iloop]<0 || stoploopaddr[iloop]<= startloopaddr[iloop]) nloop[iloop]=0;
|
||||||
|
fprintf(fd,"patnloop%d %d\n",iloop, nloop[iloop]);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (iloop=0; iloop<MAXTIMERS; iloop++) {
|
||||||
|
fprintf(fd,"patwait%d 0x%04x\n",iloop, waitaddr[iloop]);
|
||||||
|
if (waitaddr[iloop]<0) waittime[iloop]=0;
|
||||||
|
fprintf(fd,"patwaittime%d %lld\n",iloop, waittime[iloop]);
|
||||||
|
}
|
||||||
|
|
||||||
|
close((int)fd);
|
||||||
|
fd1=fopen(OUTFILEBIN,"w");
|
||||||
|
fwrite(PAT,sizeof(uint64_t),iaddr, fd1);
|
||||||
|
close((int)fd1);
|
||||||
|
}
|
201
ctbGui/patternGenerator/test.p
Executable file
201
ctbGui/patternGenerator/test.p
Executable file
@ -0,0 +1,201 @@
|
|||||||
|
//define signals and directions (Input, outputs, clocks)
|
||||||
|
|
||||||
|
|
||||||
|
#define compTestIN 1
|
||||||
|
setoutput(compTestIN);
|
||||||
|
|
||||||
|
#define curON 32
|
||||||
|
setoutput(curON);
|
||||||
|
|
||||||
|
#define side_clk 2
|
||||||
|
setclk(side_clk);
|
||||||
|
|
||||||
|
#define side_din 3
|
||||||
|
setoutput(side_din);
|
||||||
|
|
||||||
|
#define clear_shr 4
|
||||||
|
setoutput(clear_shr);
|
||||||
|
|
||||||
|
#define bottom_din 5
|
||||||
|
setoutput(bottom_din);
|
||||||
|
|
||||||
|
#define bottom_clk 6
|
||||||
|
setclk(bottom_clk);
|
||||||
|
|
||||||
|
#define gHG 7
|
||||||
|
setoutput(gHG);
|
||||||
|
|
||||||
|
#define bypassCDS 31
|
||||||
|
setoutput(bypassCDS);
|
||||||
|
|
||||||
|
|
||||||
|
#define ENprechPRE 8
|
||||||
|
setoutput(ENprechPRE);
|
||||||
|
|
||||||
|
|
||||||
|
#define res 9
|
||||||
|
setoutput(res);
|
||||||
|
|
||||||
|
#define pulseOFF 30
|
||||||
|
setoutput(pulseOFF);
|
||||||
|
|
||||||
|
#define connCDS 27
|
||||||
|
setoutput(connCDS);
|
||||||
|
|
||||||
|
#define Dsg_1 24
|
||||||
|
setoutput(Dsg_1);
|
||||||
|
|
||||||
|
|
||||||
|
#define Dsg_2 25
|
||||||
|
setoutput(Dsg_2);
|
||||||
|
|
||||||
|
|
||||||
|
#define Dsg_3 23
|
||||||
|
setoutput(Dsg_3);
|
||||||
|
|
||||||
|
#define sto0 10
|
||||||
|
setoutput(sto0);
|
||||||
|
|
||||||
|
#define sto1 11
|
||||||
|
setoutput(sto1);
|
||||||
|
|
||||||
|
#define sto2 12
|
||||||
|
setoutput(sto2);
|
||||||
|
|
||||||
|
#define resCDS 13
|
||||||
|
setoutput(resCDS);
|
||||||
|
|
||||||
|
#define prechargeConnect 14
|
||||||
|
setoutput(prechargeConnect);
|
||||||
|
|
||||||
|
#define pulse 15
|
||||||
|
setoutput(pulse);
|
||||||
|
|
||||||
|
#define PCT_mode 21
|
||||||
|
setoutput(PCT_mode);
|
||||||
|
|
||||||
|
#define res_DGS 16
|
||||||
|
setoutput(res_DGS);
|
||||||
|
|
||||||
|
#define adc_ena 17
|
||||||
|
setoutput(adc_ena);
|
||||||
|
|
||||||
|
|
||||||
|
#define CLKBIT 18
|
||||||
|
setclk(CLKBIT);
|
||||||
|
|
||||||
|
|
||||||
|
#define adc_sync 63
|
||||||
|
setoutput(adc_sync);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#define PW pw()
|
||||||
|
#define SB(x) setbit(x)
|
||||||
|
#define CB(x) clearbit(x)
|
||||||
|
#define CLOCK clearbit(CLKBIT); pw();setbit(CLKBIT);pw()
|
||||||
|
#define LCLOCK clearbit(CLKBIT); pw();setbit(CLKBIT);pw();clearbit(CLKBIT); pw()
|
||||||
|
#define CLOCKS(x) for (i=0;i<x;i++) {clearbit(CLKBIT);pw(); setbit(CLKBIT); pw();}
|
||||||
|
#define STOP setstop();
|
||||||
|
#define START setstart();
|
||||||
|
#define REPEAT(x) for (i=0;i<(x);i++) {pw();}
|
||||||
|
#define DOFOR(x) for (j=0;j<(x);j++) {
|
||||||
|
// }
|
||||||
|
#define STARTUP1 CB(compTestIN);SB(clear_shr);CB(side_clk);CB(side_din);CB(bottom_din);CB(bottom_clk);
|
||||||
|
#define STARTUP2 CB(pulse);SB(PCT_mode);SB(pulseOFF);CB(curON);
|
||||||
|
#define STARTUP3 SB(res);SB(gHG);SB(ENprechPRE);
|
||||||
|
#define STARTUP4 SB(bypassCDS); CB(connCDS);CB(sto0);SB(sto1);SB(sto2);
|
||||||
|
#define STARTUP5 SB(resCDS);CB(Dsg_1);CB(Dsg_2);SB(Dsg_3);CB(prechargeConnect);SB(res_DGS);
|
||||||
|
#define STARTUP STARTUP1 STARTUP2 STARTUP3 STARTUP4 STARTUP5 PW;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
//****NOTES****//
|
||||||
|
//FUNCTIONS
|
||||||
|
//Declare functions at the beginning
|
||||||
|
void load_pix(int nx, int ny)
|
||||||
|
{//SELECT PIXEL 1,1 for readout
|
||||||
|
SB(clear_shr);PW;PW;
|
||||||
|
CB(clear_shr);PW;PW;PW;PW;
|
||||||
|
|
||||||
|
SB(side_din);PW;
|
||||||
|
SB(side_clk);PW;
|
||||||
|
CB(side_din);
|
||||||
|
setstartloop(0); //loop on the rows
|
||||||
|
SB(side_clk);PW;
|
||||||
|
setstoploop(0); //finish loop on the rows
|
||||||
|
setnloop(0,ny); //set number row selected -can be changed dynamically
|
||||||
|
CB(side_clk);PW;
|
||||||
|
SB(bottom_din);PW;
|
||||||
|
SB(bottom_clk);PW;
|
||||||
|
CB(bottom_din);
|
||||||
|
setstartloop(1); //loop on the columns
|
||||||
|
SB(bottom_clk);PW;
|
||||||
|
setstoploop(1); //loop on the columns
|
||||||
|
setnloop(1,ny); //set number columns selected -can be changed dynamically
|
||||||
|
}
|
||||||
|
|
||||||
|
void load_col(void)
|
||||||
|
{//SELECT COLUMN 1 for readout
|
||||||
|
SB(clear_shr);PW;PW;
|
||||||
|
CB(clear_shr);PW;PW;PW;PW;
|
||||||
|
SB(bottom_din);PW;
|
||||||
|
SB(bottom_clk);PW;
|
||||||
|
CB(bottom_clk);PW;
|
||||||
|
CB(bottom_din);PW;
|
||||||
|
}
|
||||||
|
//END of FUNCTIONS
|
||||||
|
////////////////////////////////////////////////////////
|
||||||
|
//LET BYPASS PREAMP AND CDS and write on preamp out.//
|
||||||
|
//THIS ALLOWS CHECKING SOURCE FOLLOWERS //
|
||||||
|
////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
|
||||||
|
PW;
|
||||||
|
|
||||||
|
SB(5); PW;
|
||||||
|
|
||||||
|
CB(5); PW;
|
||||||
|
|
||||||
|
START; //pattern starts from here
|
||||||
|
STARTUP;
|
||||||
|
setwaitpoint(0); //set wait points
|
||||||
|
PW;
|
||||||
|
setwaittime(0,20); //wait time - can be changed dynamically
|
||||||
|
SB(adc_ena);PW;
|
||||||
|
printf("ADC sync %x %d %llx\n",iaddr,adc_sync, pat);
|
||||||
|
SB(adc_sync);PW;
|
||||||
|
printf("ADC sync %x %d %llx\n",iaddr, adc_sync, pat);
|
||||||
|
CB(gHG);
|
||||||
|
setwaitpoint(1); //set wait points
|
||||||
|
setwaittime(1,16); //wait time - can be changed dynamically
|
||||||
|
CB(adc_sync);PW;
|
||||||
|
load_pix(10, 20);
|
||||||
|
|
||||||
|
CB(res);
|
||||||
|
//CB(Dsg_3);PW;
|
||||||
|
CB(res_DGS);
|
||||||
|
setwaitpoint(2); //set wait points
|
||||||
|
setwaittime(2,1000); //wait time - can be changed dynamically
|
||||||
|
|
||||||
|
//SB(res_DGS);
|
||||||
|
//PW;
|
||||||
|
//SB(Dsg_3);
|
||||||
|
//
|
||||||
|
//CB(connCDS);
|
||||||
|
//TEST SIGNALS END
|
||||||
|
//
|
||||||
|
REPEAT(20)
|
||||||
|
|
||||||
|
//****************//
|
||||||
|
//*FINAL COMMANDS*//
|
||||||
|
//****************//
|
||||||
|
CB(adc_ena);PW;
|
||||||
|
//STARTUP;
|
||||||
|
STOP; PW; //stops here
|
||||||
|
//REPEAT(4);
|
@ -1,38 +1,35 @@
|
|||||||
# SPDX-License-Identifier: LGPL-3.0-or-other
|
find_package(Doxygen)
|
||||||
# Copyright (C) 2021 Contributors to the SLS Detector Package
|
find_package(Sphinx)
|
||||||
find_package(Doxygen REQUIRED)
|
|
||||||
find_package(Sphinx REQUIRED)
|
|
||||||
|
|
||||||
|
|
||||||
|
if (DOXYGEN_FOUND AND SPHINX_FOUND)
|
||||||
|
message(${CMAKE_PROJECT_SORURCE_DIR}/slsDetectorSoftware/src)
|
||||||
# Utility to generate command line documentation
|
# Utility to generate command line documentation
|
||||||
add_executable(gendoc src/gendoc.cpp)
|
add_executable(gendoc src/gendoc.cpp)
|
||||||
# This is a bit hacky, but better than exposing stuff?
|
# This is a bit hacky, but better than exposing stuff?
|
||||||
target_include_directories(gendoc PRIVATE ${PROJECT_SOURCE_DIR}/slsDetectorSoftware/src)
|
target_include_directories(gendoc PRIVATE ${PROJECT_SOURCE_DIR}/slsDetectorSoftware/src)
|
||||||
target_link_libraries(gendoc PRIVATE
|
target_link_libraries(gendoc PRIVATE
|
||||||
slsDetectorShared
|
slsDetectorShared
|
||||||
)
|
)
|
||||||
set_target_properties(gendoc PROPERTIES
|
set_target_properties(gendoc PROPERTIES
|
||||||
RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin
|
RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#Doxygen
|
#Doxygen
|
||||||
set(DOXYGEN_IN ${CMAKE_CURRENT_SOURCE_DIR}/Doxyfile.in)
|
set(DOXYGEN_IN ${CMAKE_CURRENT_SOURCE_DIR}/Doxyfile.in)
|
||||||
set(DOXYGEN_OUT ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile)
|
set(DOXYGEN_OUT ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile)
|
||||||
configure_file(${DOXYGEN_IN} ${DOXYGEN_OUT} @ONLY)
|
configure_file(${DOXYGEN_IN} ${DOXYGEN_OUT} @ONLY)
|
||||||
|
|
||||||
#Sphinx
|
#Sphinx
|
||||||
set(SPHINX_SOURCE ${CMAKE_CURRENT_SOURCE_DIR}/src)
|
set(SPHINX_SOURCE ${CMAKE_CURRENT_SOURCE_DIR}/src)
|
||||||
set(SPHINX_BUILD ${CMAKE_CURRENT_BINARY_DIR})
|
set(SPHINX_BUILD ${CMAKE_CURRENT_BINARY_DIR})
|
||||||
|
|
||||||
set(SPHINX_SOURCE_FILES
|
set(SPHINX_SOURCE_FILES
|
||||||
src/commandline.rst
|
src/commandline.rst
|
||||||
src/container_utils.rst
|
src/container_utils.rst
|
||||||
src/consuming.rst
|
|
||||||
src/dependencies.rst
|
src/dependencies.rst
|
||||||
src/detector.rst
|
src/detector.rst
|
||||||
src/index.rst
|
src/index.rst
|
||||||
@ -40,57 +37,25 @@ set(SPHINX_SOURCE_FILES
|
|||||||
src/pydetector.rst
|
src/pydetector.rst
|
||||||
src/pyenums.rst
|
src/pyenums.rst
|
||||||
src/pyexamples.rst
|
src/pyexamples.rst
|
||||||
src/servers.rst
|
src/receiver.rst
|
||||||
src/receiver_api.rst
|
|
||||||
src/result.rst
|
src/result.rst
|
||||||
src/type_traits.rst
|
src/type_traits.rst
|
||||||
src/ToString.rst
|
src/ToString.rst
|
||||||
src/examples.rst
|
|
||||||
src/pygettingstarted.rst
|
|
||||||
src/firmware.rst
|
|
||||||
src/serverupgrade.rst
|
|
||||||
src/virtualserver.rst
|
|
||||||
src/serverdefaults.rst
|
|
||||||
src/quick_start_guide.rst
|
|
||||||
src/troubleshooting.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
|
|
||||||
)
|
|
||||||
|
|
||||||
foreach(filename ${SPHINX_SOURCE_FILES})
|
)
|
||||||
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/${filename}
|
|
||||||
|
foreach(filename ${SPHINX_SOURCE_FILES})
|
||||||
|
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/${filename}
|
||||||
"${SPHINX_BUILD}/${filename}")
|
"${SPHINX_BUILD}/${filename}")
|
||||||
endforeach(filename ${SPHINX_SOURCE_FILES})
|
endforeach(filename ${SPHINX_SOURCE_FILES})
|
||||||
|
|
||||||
configure_file(
|
configure_file(
|
||||||
"${CMAKE_CURRENT_SOURCE_DIR}/conf.py.in"
|
"${CMAKE_CURRENT_SOURCE_DIR}/conf.py.in"
|
||||||
"${SPHINX_BUILD}/conf.py"
|
"${SPHINX_BUILD}/conf.py"
|
||||||
@ONLY)
|
@ONLY)
|
||||||
|
|
||||||
configure_file(
|
add_custom_target(docs
|
||||||
"${CMAKE_CURRENT_SOURCE_DIR}/gen_server_doc.py.in"
|
|
||||||
"${SPHINX_BUILD}/gen_server_doc.py"
|
|
||||||
@ONLY)
|
|
||||||
|
|
||||||
configure_file(
|
|
||||||
"${CMAKE_CURRENT_SOURCE_DIR}/static/extra.css"
|
|
||||||
"${SPHINX_BUILD}/static/css/extra.css"
|
|
||||||
@ONLY)
|
|
||||||
|
|
||||||
add_custom_target(server_rst python gen_server_doc.py)
|
|
||||||
|
|
||||||
add_custom_target(docs
|
|
||||||
gendoc
|
gendoc
|
||||||
COMMAND python gen_server_doc.py
|
|
||||||
COMMAND ${DOXYGEN_EXECUTABLE} ${DOXYGEN_OUT}
|
COMMAND ${DOXYGEN_EXECUTABLE} ${DOXYGEN_OUT}
|
||||||
COMMAND ${SPHINX_EXECUTABLE} -a -b html
|
COMMAND ${SPHINX_EXECUTABLE} -a -b html
|
||||||
-Dbreathe_projects.slsDetectorPackage=${CMAKE_CURRENT_BINARY_DIR}/xml
|
-Dbreathe_projects.slsDetectorPackage=${CMAKE_CURRENT_BINARY_DIR}/xml
|
||||||
@ -99,11 +64,6 @@ add_custom_target(docs
|
|||||||
${SPHINX_BUILD}/html
|
${SPHINX_BUILD}/html
|
||||||
COMMENT "Generating documentation with Sphinx")
|
COMMENT "Generating documentation with Sphinx")
|
||||||
|
|
||||||
add_custom_target(rst
|
else (DOXYGEN_FOUND AND SPHINX_FOUND)
|
||||||
COMMAND ${SPHINX_EXECUTABLE} -a -b html
|
message("Doxygen and Sphinx are needed to build documentation")
|
||||||
-Dbreathe_projects.slsDetectorPackage=${CMAKE_CURRENT_BINARY_DIR}/xml
|
endif (DOXYGEN_FOUND AND SPHINX_FOUND)
|
||||||
-c "${SPHINX_BUILD}"
|
|
||||||
${SPHINX_BUILD}/src
|
|
||||||
${SPHINX_BUILD}/html
|
|
||||||
COMMENT "Generating documentation with Sphinx")
|
|
||||||
|
|
||||||
|
@ -890,7 +890,7 @@ EXCLUDE_SYMLINKS = NO
|
|||||||
# Note that the wildcards are matched against the file with absolute path, so to
|
# 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 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
|
# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names
|
||||||
# (namespaces, classes, functions, etc.) that should be excluded from the
|
# (namespaces, classes, functions, etc.) that should be excluded from the
|
||||||
|
@ -21,7 +21,7 @@ print(sys.path)
|
|||||||
# -- Project information -----------------------------------------------------
|
# -- Project information -----------------------------------------------------
|
||||||
|
|
||||||
project = 'slsDetectorPackage'
|
project = 'slsDetectorPackage'
|
||||||
copyright = '2020, PSD Detector Group'
|
copyright = '2019, PSD Detector Group'
|
||||||
author = 'PSD Detector Group'
|
author = 'PSD Detector Group'
|
||||||
version = '@PROJECT_VERSION@'
|
version = '@PROJECT_VERSION@'
|
||||||
|
|
||||||
@ -59,8 +59,4 @@ html_theme = "sphinx_rtd_theme"
|
|||||||
# Add any paths that contain custom static files (such as style sheets) here,
|
# Add any paths that contain custom static files (such as style sheets) here,
|
||||||
# relative to this directory. They are copied after the builtin static files,
|
# relative to this directory. They are copied after the builtin static files,
|
||||||
# so a file named "default.css" will overwrite the builtin "default.css".
|
# so a file named "default.css" will overwrite the builtin "default.css".
|
||||||
html_static_path = ['static']
|
#html_static_path = ['_static']
|
||||||
|
|
||||||
|
|
||||||
def setup(app):
|
|
||||||
app.add_css_file('css/extra.css') # may also be an URL
|
|
||||||
|
@ -1,86 +0,0 @@
|
|||||||
import os
|
|
||||||
import re
|
|
||||||
from pathlib import Path
|
|
||||||
def remove_comments(text):
|
|
||||||
def replacer(match):
|
|
||||||
s = match.group(0)
|
|
||||||
if s.startswith('/'):
|
|
||||||
return " " # note: a space and not an empty string
|
|
||||||
else:
|
|
||||||
return s
|
|
||||||
pattern = re.compile(
|
|
||||||
r'//.*?$|/\*.*?\*/|\'(?:\\.|[^\\\'])*\'|"(?:\\.|[^\\"])*"',
|
|
||||||
re.DOTALL | re.MULTILINE
|
|
||||||
)
|
|
||||||
return re.sub(pattern, replacer, text)
|
|
||||||
|
|
||||||
|
|
||||||
# @CMAKE_CURRENT_BINARY_DIR@
|
|
||||||
|
|
||||||
print('\n\n\n\n SERVER CSV')
|
|
||||||
|
|
||||||
src = Path('@CMAKE_SOURCE_DIR@')/'slsDetectorServers/'
|
|
||||||
detectors = ['Mythen3', 'Gotthard2', 'Eiger',
|
|
||||||
'Jungfrau', 'Moench', 'Gotthard', 'Ctb']
|
|
||||||
|
|
||||||
|
|
||||||
for det in detectors:
|
|
||||||
print(det)
|
|
||||||
in_fname = src/f'{det.lower()}DetectorServer/slsDetectorServer_defs.h'
|
|
||||||
#print(f'Reading: {in_fname}')
|
|
||||||
with open(in_fname) as f:
|
|
||||||
lines = f.read().replace('\\\n', '')
|
|
||||||
lines = lines.splitlines(keepends = True)
|
|
||||||
|
|
||||||
lines = [l.strip('#define').strip(' ') for l in lines if l.startswith('#define')]
|
|
||||||
output = []
|
|
||||||
signals = []
|
|
||||||
fields = ['Name,', 'Value', 'Comment']
|
|
||||||
excluded = ['DAC_NAMES', 'DEFAULT_DAC_VALS', 'CLK_NAMES', 'ONCHIP_DAC_NAMES']
|
|
||||||
header = f'{fields[0]:35}{fields[1]:35}\n'
|
|
||||||
output.append(header)
|
|
||||||
signals.append(header)
|
|
||||||
dac_names = []
|
|
||||||
dac_values = []
|
|
||||||
for line in lines:
|
|
||||||
name, *parts = line.split()
|
|
||||||
arg = ' '.join(parts)
|
|
||||||
value, *comments = arg.split('//')
|
|
||||||
value = value.strip('() ')
|
|
||||||
# value = value.replace(', ', ' ')
|
|
||||||
value = value.replace('\"', '')
|
|
||||||
if name not in excluded:
|
|
||||||
name += ','
|
|
||||||
if name.startswith('SIGNAL_'):
|
|
||||||
signals.append(f'{name:35}{value}\n')
|
|
||||||
else:
|
|
||||||
output.append(f'{name:35}\"{value}\"\n')
|
|
||||||
elif name == 'DAC_NAMES':
|
|
||||||
dac_names = [v.strip(', ') for v in value.split()]
|
|
||||||
dac_names = [n+',' for n in dac_names]
|
|
||||||
elif name == 'DEFAULT_DAC_VALS':
|
|
||||||
dac_values = remove_comments(value).strip('{}; ')
|
|
||||||
dac_values = dac_values.replace(',', '').split()
|
|
||||||
dac_values = [v.strip('') for v in dac_values]
|
|
||||||
|
|
||||||
print(f"dac_names: {len(dac_names)}, dac_values={len(dac_values)}")
|
|
||||||
if len(dac_values) == 0:
|
|
||||||
dac_values = ['N/A']*len(dac_names)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
rstpath = Path('@CMAKE_SOURCE_DIR@')/'docs/src/'
|
|
||||||
|
|
||||||
out_fname = Path.cwd()/f'src/{det.lower()}.csv'
|
|
||||||
out_dac_fname = Path.cwd()/f'src/{det.lower()}-dacs.csv'
|
|
||||||
#print(f'Writing: {out_fname}')
|
|
||||||
with open(out_fname, 'w') as f:
|
|
||||||
f.writelines(output)
|
|
||||||
|
|
||||||
output = [f'{n:35}{v}\n' for n,v in zip(dac_names, dac_values)]
|
|
||||||
output.insert(0, header)
|
|
||||||
|
|
||||||
with open(out_dac_fname, 'w') as f:
|
|
||||||
f.writelines(output)
|
|
||||||
|
|
||||||
print('END\n\n\n\n')
|
|
@ -1,438 +0,0 @@
|
|||||||
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.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
.. _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"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Gotthard I
|
|
||||||
^^^^^^^^^^^
|
|
||||||
|
|
||||||
.. code-block:: text
|
|
||||||
|
|
||||||
{
|
|
||||||
"Version": 7.2,
|
|
||||||
"Timestamp": "Wed Nov 13 15:16:19 2024",
|
|
||||||
"Detector Type": "Gotthard",
|
|
||||||
"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": 1,
|
|
||||||
"Receiver Roi": {
|
|
||||||
"xmin": 4294967295,
|
|
||||||
"xmax": 4294967295,
|
|
||||||
"ymin": 4294967295,
|
|
||||||
"ymax": 4294967295
|
|
||||||
},
|
|
||||||
"Exptime": "1.00001ms",
|
|
||||||
"Period": "1s",
|
|
||||||
"Detector Roi": {
|
|
||||||
"xmin": 4294967295,
|
|
||||||
"xmax": 4294967295
|
|
||||||
},
|
|
||||||
"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 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"
|
|
||||||
}
|
|
||||||
}
|
|
@ -4,100 +4,13 @@ Command line interface
|
|||||||
Usage
|
Usage
|
||||||
-------------
|
-------------
|
||||||
|
|
||||||
The syntax is *'[detector index]-[module index]:[command]'*, where the indices are by default '0', when not specified.
|
Commands can be uses either with sls_detector_get or sls_detector_put
|
||||||
|
|
||||||
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.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Help
|
|
||||||
--------
|
|
||||||
|
|
||||||
.. code-block::
|
.. code-block::
|
||||||
|
|
||||||
# get list of commands
|
sls_detector_get vrf
|
||||||
sls_detector_get list
|
|
||||||
|
|
||||||
# search for a particular command using a word
|
|
||||||
sls_detector_get list | grep adc
|
|
||||||
|
|
||||||
# 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
|
Commands
|
||||||
-----------
|
-----------
|
||||||
|
|
||||||
.. include:: ../commands.rst
|
.. include:: ../commands.rst
|
||||||
|
|
||||||
|
|
||||||
Deprecated 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
|
|
||||||
:widths: 35, 35
|
|
||||||
:header-rows: 1
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -1,116 +0,0 @@
|
|||||||
Consuming slsDetectorPackage
|
|
||||||
===============================
|
|
||||||
|
|
||||||
Depending on how you want to build your integration with
|
|
||||||
slsDetectorPackage there are a few different ways to
|
|
||||||
consume our package. The recommended way is to use one of the
|
|
||||||
CMake approaches.
|
|
||||||
|
|
||||||
One can test with :ref:`detector simulators<Virtual Detector Servers>` before testing the API with a real detector or when a real detector is not at hand.
|
|
||||||
|
|
||||||
CMake: slsDetectorPackage as submodule in your project
|
|
||||||
---------------------------------------------------------------
|
|
||||||
|
|
||||||
If you are using CMake to build your integration and want to build everything
|
|
||||||
in one go, we support adding slsDetectorPackage as a subfolder in your cmake project.
|
|
||||||
|
|
||||||
A minimal CMakeLists.txt could look like this:
|
|
||||||
|
|
||||||
.. code-block:: cmake
|
|
||||||
|
|
||||||
project(myDetectorIntegration)
|
|
||||||
cmake_minimum_required(VERSION 3.14)
|
|
||||||
add_subdirectory(slsDetectorPackage)
|
|
||||||
|
|
||||||
#Add your executable
|
|
||||||
add_executable(example main.cpp)
|
|
||||||
target_compile_features(example PRIVATE cxx_std_11)
|
|
||||||
|
|
||||||
#Link towards slsDetectorShared
|
|
||||||
target_link_libraries(example slsDetectorShared)
|
|
||||||
|
|
||||||
A fully working example can be found at:
|
|
||||||
|
|
||||||
https://github.com/slsdetectorgroup/cmake-subfolder-example
|
|
||||||
|
|
||||||
|
|
||||||
CMake: find_package(slsDetectorPackage)
|
|
||||||
------------------------------------------
|
|
||||||
|
|
||||||
If you have compiled and installed slsDetectorPackage we also support
|
|
||||||
find_package in CMake. If installed in a system wide location no path
|
|
||||||
should be needed, otherwise specify cmake prefix path.
|
|
||||||
|
|
||||||
.. code-block:: cmake
|
|
||||||
|
|
||||||
cmake_minimum_required(VERSION 3.14)
|
|
||||||
project(myintegration)
|
|
||||||
|
|
||||||
find_package(slsDetectorPackage 5.0 REQUIRED)
|
|
||||||
add_executable(example main.cpp)
|
|
||||||
target_link_libraries(example slsDetectorShared)
|
|
||||||
|
|
||||||
|
|
||||||
Then assuming the slsDetectorPackage is installed in /path/to/sls/install
|
|
||||||
you should be able to configure and build your project in this way.
|
|
||||||
|
|
||||||
.. code-block:: bash
|
|
||||||
|
|
||||||
cmake ../path/to/your/source -DCMAKE_PREFIX_PATH=/path/to/sls/install
|
|
||||||
make
|
|
||||||
|
|
||||||
|
|
||||||
A minimal example is available at: https://github.com/slsdetectorgroup/minimal-cmake
|
|
||||||
|
|
||||||
|
|
||||||
CMake: find_package and conda
|
|
||||||
----------------------------------
|
|
||||||
|
|
||||||
.. note::
|
|
||||||
|
|
||||||
conda can also be used for installing dependencies such as zmq, Qt4 etc.
|
|
||||||
|
|
||||||
find_package(slsDetectorPackage) also works if you have installed slsDetectorPackage using conda.
|
|
||||||
The only difference is that you point CMake to $CONDA_PREFIX
|
|
||||||
|
|
||||||
|
|
||||||
.. code-block:: bash
|
|
||||||
|
|
||||||
#assuming myenv contains slsdetlib
|
|
||||||
conda activate myenv
|
|
||||||
cmake ../path/to/your/source -DCMAKE_PREFIX_PATH=$CONDA_PREFIX
|
|
||||||
make
|
|
||||||
|
|
||||||
Depending on your system compiler you might also have to install gxx_linux-64 to compiled.
|
|
||||||
|
|
||||||
No tools minimal approach
|
|
||||||
-----------------------------
|
|
||||||
|
|
||||||
While not recommended it is still possible to specify the include and library paths
|
|
||||||
manually when invoking g++. This can sometimes be handy for a quick try.
|
|
||||||
|
|
||||||
.. code-block:: cpp
|
|
||||||
|
|
||||||
#include "sls/Detector.h"
|
|
||||||
#include <iostream>
|
|
||||||
int main(){
|
|
||||||
|
|
||||||
sls::Detector det;
|
|
||||||
|
|
||||||
//Get all values and print them
|
|
||||||
std::cout << "Hostname: " << det.getHostname() << "\n";
|
|
||||||
std::cout << "Type: " << det.getDetectorType() << "\n";
|
|
||||||
std::cout << "Udp ip: " << det.getSourceUDPIP() << "\n";
|
|
||||||
|
|
||||||
|
|
||||||
//Get mac addr
|
|
||||||
const int module = 0;
|
|
||||||
auto mac = det.getSourceUDPMAC()[module];
|
|
||||||
std::cout << "Mac addr of module "<< module << " is " << mac.str() << '\n';
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
.. code-block:: bash
|
|
||||||
|
|
||||||
g++ -I/install/path/include/ -L/install/path/lib64/ myapp.cpp -lSlsDetector -lSlsSupport -Wl,-rpath=../install/path/lib64
|
|
@ -13,42 +13,26 @@ To use the basic building blocks, meaning sls_detector_get/put and
|
|||||||
the shared libraries these are needed:
|
the shared libraries these are needed:
|
||||||
|
|
||||||
* Linux, preferably recent kernel (currently no cross platform support)
|
* Linux, preferably recent kernel (currently no cross platform support)
|
||||||
* CMake >= 3.14
|
* CMake > 3.9
|
||||||
* C++11 compatible compiler. (We test with gcc and clang)
|
* C++11 compatible compiler. (We test with gcc and clang)
|
||||||
|
* ZeroMQ version 4
|
||||||
-----------------------
|
|
||||||
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>`
|
|
||||||
|
|
||||||
-----------------------
|
-----------------------
|
||||||
GUI
|
GUI
|
||||||
-----------------------
|
-----------------------
|
||||||
|
|
||||||
* Qt 5.9
|
The GUI is currently using Qt4 but watch out for an upgrade to 5.
|
||||||
* Qwt 6.1.5 (packaged in libs)
|
|
||||||
|
* Qt 4.8
|
||||||
|
* Qwt 6
|
||||||
|
|
||||||
-----------------------
|
-----------------------
|
||||||
Moench executables
|
Python bindings
|
||||||
-----------------------
|
-----------------------
|
||||||
|
|
||||||
* libtiff
|
* Python > 3.6
|
||||||
|
* pybind11 (packaged in libs/)
|
||||||
|
|
||||||
|
|
||||||
-----------------------
|
-----------------------
|
||||||
Documentation
|
Documentation
|
||||||
@ -58,7 +42,7 @@ The documentation that you are reading now is built with
|
|||||||
|
|
||||||
* Doxygen (to extract C++ classes etc.)
|
* Doxygen (to extract C++ classes etc.)
|
||||||
* Breathe (Sphinx plugin to handle doxygen xml)
|
* Breathe (Sphinx plugin to handle doxygen xml)
|
||||||
* Sphinx with sphinx_rtd_theme
|
* Sphinx
|
||||||
|
|
||||||
-----------------------
|
-----------------------
|
||||||
Packaged in libs/
|
Packaged in libs/
|
||||||
@ -67,5 +51,3 @@ Packaged in libs/
|
|||||||
* catch2 (unit testing)
|
* catch2 (unit testing)
|
||||||
* rapidjson (streaming from receiver)
|
* rapidjson (streaming from receiver)
|
||||||
* pybind11 (python bindings)
|
* pybind11 (python bindings)
|
||||||
* qwt (gui plotting)
|
|
||||||
* libzmq (streaming to/from receiver)
|
|
@ -1,17 +1,15 @@
|
|||||||
Detector
|
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
|
detectors from C++. This API is also used internally
|
||||||
for the Python bindings and the command line interface.
|
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.
|
through this class.
|
||||||
|
|
||||||
Most, if not all, functions are called in parallel
|
Most, if not all, functions are called in parallel
|
||||||
and the return value is a thin std::vector wrapper
|
and the return value is a thin std::vector wrapper
|
||||||
containing results from all modules. (:ref:`Result class<Result Class>`)
|
containing results from all modules. (Result<T>)
|
||||||
|
|
||||||
Here are some :ref:`examples <Cplusplus Api Examples>` on how to use the API.
|
|
||||||
|
|
||||||
.. doxygenclass:: sls::Detector
|
.. doxygenclass:: sls::Detector
|
||||||
:members:
|
:members:
|
||||||
|
@ -1,119 +0,0 @@
|
|||||||
.. _Cplusplus Api Examples:
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Examples
|
|
||||||
===========
|
|
||||||
|
|
||||||
Setup
|
|
||||||
------------
|
|
||||||
|
|
||||||
The examples here assume that you have compiled and installed slsDetectorPackage
|
|
||||||
to ~/sls/install and that the option for SLS_USE_SIMULATOR was enabled. This also builds
|
|
||||||
the virtual detector servers that we will be using for testing.
|
|
||||||
|
|
||||||
We also add ~/sls/detector/install/bin to the path for convenience.
|
|
||||||
|
|
||||||
Compile examples
|
|
||||||
-------------------
|
|
||||||
|
|
||||||
The source code of the examples is available at:
|
|
||||||
https://github.com/slsdetectorgroup/api-examples
|
|
||||||
|
|
||||||
|
|
||||||
.. code-block:: bash
|
|
||||||
|
|
||||||
git clone https://github.com/slsdetectorgroup/api-examples.git
|
|
||||||
mkdir build && cd build
|
|
||||||
cmake ../api-examples -DCMAKE_PREFIX_PATH=~/sls/detector/install
|
|
||||||
make
|
|
||||||
|
|
||||||
Below follows a short description of what is included in the examples.
|
|
||||||
|
|
||||||
|
|
||||||
Running a config file [e1]
|
|
||||||
-----------------------------
|
|
||||||
|
|
||||||
|
|
||||||
.. code-block:: cpp
|
|
||||||
|
|
||||||
#include "sls/Detector.h"
|
|
||||||
...
|
|
||||||
sls::Detector det;
|
|
||||||
det.loadConfig("path/to/config/file.config");
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
To configure the connection between PC and detector the easiest
|
|
||||||
is to run a config file. For this example we first launch a virtual Jungfrau server and
|
|
||||||
then set up the detector.
|
|
||||||
|
|
||||||
**Launch a virtual detector server**
|
|
||||||
|
|
||||||
.. code-block:: bash
|
|
||||||
|
|
||||||
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.
|
|
||||||
|
|
||||||
**Run example to configure**
|
|
||||||
|
|
||||||
.. code-block:: bash
|
|
||||||
|
|
||||||
./e1-config one_det_no_receiver.config
|
|
||||||
- 12:01:06.371 INFO: Shared memory deleted /slsDetectorPackage_multi_0_sls_0
|
|
||||||
- 12:01:06.371 INFO: Shared memory deleted /slsDetectorPackage_multi_0
|
|
||||||
- 12:01:06.372 INFO: Shared memory created /slsDetectorPackage_multi_0
|
|
||||||
- 12:01:06.376 INFO: Loading configuration file: one_det_no_receiver.config
|
|
||||||
- 12:01:06.376 INFO: Adding detector localhost
|
|
||||||
- 12:01:06.377 INFO: Shared memory created /slsDetectorPackage_multi_0_sls_0
|
|
||||||
- 12:01:06.377 INFO: Checking Detector Version Compatibility
|
|
||||||
- 12:01:06.378 INFO: Detector connecting - updating!
|
|
||||||
hostname [localhost]
|
|
||||||
|
|
||||||
|
|
||||||
Jungfrau detector with 1 modules configured
|
|
||||||
|
|
||||||
|
|
||||||
Using the return type sls::Result [e2]
|
|
||||||
-----------------------------------------
|
|
||||||
|
|
||||||
Since many our detectors have multiple modules we cannot return
|
|
||||||
a single value when reading from the Detector. Hostname, Ip and also
|
|
||||||
for example exposure time can differ between modules.
|
|
||||||
|
|
||||||
Therefore we return Result<T> which is a thin wrapper around
|
|
||||||
std::vector.
|
|
||||||
|
|
||||||
.. code-block:: cpp
|
|
||||||
|
|
||||||
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);
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Setting exposure time [e3]
|
|
||||||
-----------------------------------------
|
|
||||||
|
|
||||||
For setting times, like exposure time, period, delay etc.
|
|
||||||
we use std::chrono::duration.
|
|
||||||
|
|
||||||
Example 3 shows how to set and read exposure time as well
|
|
||||||
as converting to floating point.
|
|
||||||
|
|
||||||
.. code-block:: cpp
|
|
||||||
|
|
||||||
#include "sls/Detector.h"
|
|
||||||
#include <chrono>
|
|
||||||
...
|
|
||||||
std::chrono::microseconds t0{500};
|
|
||||||
det.setExptime(t0);
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -1,62 +0,0 @@
|
|||||||
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>`_.
|
|
||||||
|
|
@ -1,402 +0,0 @@
|
|||||||
Firmware Upgrade
|
|
||||||
=================
|
|
||||||
|
|
||||||
Eiger
|
|
||||||
-------------
|
|
||||||
|
|
||||||
Download
|
|
||||||
^^^^^^^^^^^^^
|
|
||||||
- `bcp script <https://github.com/slsdetectorgroup/slsDetectorFirmware/blob/master/binaries/eiger/bcp>`__
|
|
||||||
|
|
||||||
- detector server corresponding to package in slsDetectorPackage/serverBin
|
|
||||||
|
|
||||||
- `bit files <https://github.com/slsdetectorgroup/slsDetectorFirmware>`__
|
|
||||||
|
|
||||||
Upgrade
|
|
||||||
^^^^^^^^
|
|
||||||
#. Tftp must be already installed on your pc to use the bcp script.
|
|
||||||
|
|
||||||
#. Copy new servers to the board. See :ref:`how to upgrade detector servers<Detector Server Upgrade>` for more detals. A reboot should have started the new linked servers automatically. For Eiger, do not reboot yet as we need to program the firmware via bit files.
|
|
||||||
|
|
||||||
* This step is crucial when registers between firmwares change. Failure to do so will result in linux on boards to crash and boards can't be pinged anymore.
|
|
||||||
|
|
||||||
#. Bring the board into programmable mode using either of the 2 ways. Both methods result in only the central LED blinking.
|
|
||||||
|
|
||||||
* **Manual:**
|
|
||||||
|
|
||||||
Do a hard reset for each half module on back panel boards, between the LEDs, closer to each of the 1G ethernet connectors. Push until all LEDs start to blink.
|
|
||||||
|
|
||||||
* Software:
|
|
||||||
|
|
||||||
.. code-block:: bash
|
|
||||||
|
|
||||||
# Option 1: if the old server is still running:
|
|
||||||
sls_detector_put execcommand "./boot_recovery"
|
|
||||||
|
|
||||||
# Option 2:
|
|
||||||
ssh root@bebxxx
|
|
||||||
cd executables
|
|
||||||
./boot_recovery
|
|
||||||
|
|
||||||
#. Start a terminal for each half module and run the following to see progress.
|
|
||||||
|
|
||||||
.. code-block:: bash
|
|
||||||
|
|
||||||
nc -p 3000 -u bebxxx 3000
|
|
||||||
# Press enter twice to see prompt with board name.
|
|
||||||
> bebxxx
|
|
||||||
# After each bcp command, wait for this terminal to print "Success".
|
|
||||||
|
|
||||||
|
|
||||||
#. In another terminal, run the following to update firmware. Please update bit files with great caution as it could make your board inaccessible, if done incorrectly.
|
|
||||||
|
|
||||||
.. code-block:: bash
|
|
||||||
|
|
||||||
#update back end fpga
|
|
||||||
bcp download.bit bebxxx:/fw0
|
|
||||||
|
|
||||||
#update front left fpga
|
|
||||||
bcp download.bit bebxxx:/febl
|
|
||||||
|
|
||||||
#update front right fpga
|
|
||||||
bcp download.bit bebxxx:/febr
|
|
||||||
|
|
||||||
#update kernel (only if required by us)
|
|
||||||
bcp download.bit bebxxx:/kernel
|
|
||||||
|
|
||||||
#. Reboot the detector.
|
|
||||||
|
|
||||||
.. code-block:: bash
|
|
||||||
|
|
||||||
# In the first terminal where we saw "Succeess"
|
|
||||||
# reconfig febX is necessary only if you have flashed a new feb firmware
|
|
||||||
reconfig febl
|
|
||||||
reconfig febr
|
|
||||||
# will reboot controller
|
|
||||||
reconfig fw0
|
|
||||||
|
|
||||||
.. note ::
|
|
||||||
|
|
||||||
If the detector servers did not start up automatically after reboot, you need to add scripts to do that. See :ref:`Automatic start<Automatic start servers>` for more details.
|
|
||||||
|
|
||||||
Jungfrau
|
|
||||||
-------------
|
|
||||||
|
|
||||||
Download
|
|
||||||
^^^^^^^^^^^^^
|
|
||||||
- detector server corresponding to package in slsDetectorPackage/serverBin
|
|
||||||
|
|
||||||
- `pof files <https://github.com/slsdetectorgroup/slsDetectorFirmware>`__
|
|
||||||
|
|
||||||
|
|
||||||
Upgrade
|
|
||||||
^^^^^^^^
|
|
||||||
|
|
||||||
.. warning ::
|
|
||||||
|
|
||||||
In case you have had issues in the past with programming via software:
|
|
||||||
|
|
||||||
* 6.1.2 server has a fix for seamless fpga programming
|
|
||||||
|
|
||||||
* We recommend first updating the on-board detector server to 6.1.2 (with client 6.1.x) using command `updatedetectorserver <commandline.html#term-updatedetectorserver-server_name-with-full-path>`_.
|
|
||||||
|
|
||||||
* Then use command 'programfpga' to only update firmware or use command 'update' to update firmware and server to the latest release.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Check :ref:`firmware troubleshooting <blackfin firmware troubleshooting>` if you run into issues while programming firmware.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Program from console
|
|
||||||
.. code-block:: bash
|
|
||||||
|
|
||||||
# These instructions are for upgrades from v5.0.0. For earlier versions, please contact us.
|
|
||||||
|
|
||||||
# Always ensure that the client and server software are of the same release.
|
|
||||||
|
|
||||||
# copies server, links new server to jungfrauDetectorServer,
|
|
||||||
# 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
|
|
||||||
sls_detector_put update jungfrauDetectorServervxxx pcxxx xx.pof
|
|
||||||
|
|
||||||
# v6.1.1 - present (copies server from the full path provided)
|
|
||||||
sls_detector_put update jungfrauDetectorServervxxx xx.pof
|
|
||||||
|
|
||||||
# Or only program firmware
|
|
||||||
sls_detector_put programfpga xxx.pof
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
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
|
|
||||||
-----------
|
|
||||||
|
|
||||||
Download
|
|
||||||
^^^^^^^^^^^^^
|
|
||||||
|
|
||||||
- detector server corresponding to package in slsDetectorPackage/serverBin
|
|
||||||
|
|
||||||
- `rbf files <https://github.com/slsdetectorgroup/slsDetectorFirmware>`__
|
|
||||||
|
|
||||||
|
|
||||||
Upgrade
|
|
||||||
^^^^^^^^
|
|
||||||
|
|
||||||
Program from console
|
|
||||||
.. code-block:: bash
|
|
||||||
|
|
||||||
# Always ensure that the client and server software are of the same release.
|
|
||||||
|
|
||||||
# copies server, links new server to mythen3DetectorServer,
|
|
||||||
# removes old server from respawn, sets up new lnked server to respawn
|
|
||||||
# programs fpga, reboots
|
|
||||||
|
|
||||||
# older versions: v5.0.0 - 6.0.0 using tftp from tftp folder of pc
|
|
||||||
sls_detector_put update mythen3DetectorServervxxx pcxxx xxx.rbf
|
|
||||||
|
|
||||||
# v6.1.1 - present (copies server from the full path provided)
|
|
||||||
sls_detector_put update mythen3DetectorServervxxx xxx.rbf
|
|
||||||
|
|
||||||
# Or only program firmware
|
|
||||||
sls_detector_put programfpga xxx.rbf
|
|
||||||
|
|
||||||
.. note ::
|
|
||||||
|
|
||||||
If the detector servers did not start up automatically after reboot, you need to add scripts to do that. See :ref:`Automatic start<Automatic start servers>` for more details.
|
|
||||||
|
|
||||||
Gotthard II
|
|
||||||
-------------
|
|
||||||
|
|
||||||
Download
|
|
||||||
^^^^^^^^^^^^^
|
|
||||||
- detector server corresponding to package in slsDetectorPackage/serverBin
|
|
||||||
|
|
||||||
- `rbf files <https://github.com/slsdetectorgroup/slsDetectorFirmware>`__
|
|
||||||
|
|
||||||
Upgrade
|
|
||||||
^^^^^^^^
|
|
||||||
|
|
||||||
Program from console
|
|
||||||
.. code-block:: bash
|
|
||||||
|
|
||||||
# Always ensure that the client and server software are of the same release.
|
|
||||||
|
|
||||||
# copies server, links new server to gotthard2DetectorServer,
|
|
||||||
# removes old server from respawn, sets up new lnked server to respawn
|
|
||||||
# programs fpga, reboots
|
|
||||||
|
|
||||||
# older versions: v5.0.0 - 6.0.0 using tftp from tftp folder of pc
|
|
||||||
sls_detector_put update gotthard2DetectorServervxxx pcxxx xxx.rbf
|
|
||||||
|
|
||||||
# v6.1.1 - present (copies server from the full path provided)
|
|
||||||
sls_detector_put update gotthard2DetectorServervxxx xxx.rbf
|
|
||||||
|
|
||||||
# Or only program firmware
|
|
||||||
sls_detector_put programfpga xxx.rbf
|
|
||||||
|
|
||||||
.. note ::
|
|
||||||
|
|
||||||
If the detector servers did not start up automatically after reboot, you need to add scripts to do that. See :ref:`Automatic start<Automatic start servers>` for more details.
|
|
||||||
|
|
||||||
Moench
|
|
||||||
-------
|
|
||||||
|
|
||||||
Download
|
|
||||||
^^^^^^^^^^^^^
|
|
||||||
- detector server corresponding to package in slsDetectorPackage/serverBin
|
|
||||||
|
|
||||||
- `pof files <https://github.com/slsdetectorgroup/slsDetectorFirmware>`__
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Upgrade
|
|
||||||
^^^^^^^^
|
|
||||||
|
|
||||||
.. warning ::
|
|
||||||
|
|
||||||
In case you have had issues in the past with programming via software:
|
|
||||||
|
|
||||||
* 6.1.2 server has a fix for seamless fpga programming
|
|
||||||
|
|
||||||
* We recommend first updating the on-board detector server to 6.1.2 (with client 6.1.x) using command `updatedetectorserver <commandline.html#term-updatedetectorserver-server_name-with-full-path>`_.
|
|
||||||
|
|
||||||
* Then use command 'programfpga' to only update firmware or use command 'update' to update firmware and server to the latest release.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Check :ref:`firmware troubleshooting <blackfin firmware troubleshooting>` if you run into issues while programming firmware.
|
|
||||||
|
|
||||||
|
|
||||||
Program from console
|
|
||||||
.. code-block:: bash
|
|
||||||
|
|
||||||
# Always ensure that the client and server software are of the same release.
|
|
||||||
|
|
||||||
# copies server, links new server to moenchDetectorServer,
|
|
||||||
# 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
|
|
||||||
sls_detector_put update moenchDetectorServervxxx pcxxx xx.pof
|
|
||||||
|
|
||||||
# v6.1.1 - present (copies server from the full path provided)
|
|
||||||
sls_detector_put update moenchDetectorServervxxx xx.pof
|
|
||||||
|
|
||||||
# Or only program firmware
|
|
||||||
sls_detector_put programfpga xxx.pof
|
|
||||||
|
|
||||||
Ctb
|
|
||||||
----
|
|
||||||
|
|
||||||
Download
|
|
||||||
^^^^^^^^^^^^^
|
|
||||||
- detector server corresponding to package in slsDetectorPackage/serverBin
|
|
||||||
|
|
||||||
- `pof files <https://github.com/slsdetectorgroup/slsDetectorFirmware>`__
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Upgrade
|
|
||||||
^^^^^^^^
|
|
||||||
|
|
||||||
Check :ref:`firmware troubleshooting <blackfin firmware troubleshooting>` if you run into issues while programming firmware.
|
|
||||||
|
|
||||||
|
|
||||||
Program from console
|
|
||||||
.. code-block:: bash
|
|
||||||
|
|
||||||
# Always ensure that the client and server software are of the same release.
|
|
||||||
|
|
||||||
# copies server, links new server to ctbDetectorServer,
|
|
||||||
# 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
|
|
||||||
sls_detector_put update ctbDetectorServervxxx pcxxx xx.pof
|
|
||||||
|
|
||||||
# v6.1.1 - present (copies server from the full path provided)
|
|
||||||
sls_detector_put update ctbDetectorServervxxx xx.pof
|
|
||||||
|
|
||||||
# Or only program firmware
|
|
||||||
sls_detector_put programfpga xxx.pof
|
|
||||||
|
|
||||||
|
|
||||||
.. _blackfin firmware troubleshooting:
|
|
||||||
|
|
||||||
Firmware Troubleshooting with blackfin
|
|
||||||
----------------------------------------
|
|
||||||
|
|
||||||
1. v4.x.x client after programming will most likely reboot the blackfin processor, regardless of error.
|
|
||||||
|
|
||||||
2. v5.x.x-rcx client after programming will not reboot the blackfin processor, if error occurred.
|
|
||||||
|
|
||||||
3. If a reboot occured with an incomplete firmware in flash, the blackfin will most likely not find the mtd3 drive. To see if this drive exists:
|
|
||||||
|
|
||||||
.. code-block:: bash
|
|
||||||
|
|
||||||
# connect to the board
|
|
||||||
telnet bchipxxx
|
|
||||||
|
|
||||||
# view of mtd3 existing
|
|
||||||
root:/> more /proc/mtd
|
|
||||||
dev: size erasesize name
|
|
||||||
mtd0: 00040000 00020000 "bootloader(nor)"
|
|
||||||
mtd1: 00100000 00020000 "linux kernel(nor)"
|
|
||||||
mtd2: 002c0000 00020000 "file system(nor)"
|
|
||||||
mtd3: 01000000 00010000 "bitfile(spi)"
|
|
||||||
|
|
||||||
4. If one can see the mtd3 drive, one can already try to flash again using the **programfpga** command (without rebooting blackfin or detector).
|
|
||||||
|
|
||||||
5. If one can't list it, read the next section to try to get the blackfin to list it.
|
|
||||||
|
|
||||||
How to get back mtd3 drive remotely (udpating kernel)
|
|
||||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
||||||
You have 2 alternatives to update the kernel.
|
|
||||||
|
|
||||||
1. Commands via software (>= v6.0.0)
|
|
||||||
|
|
||||||
.. code-block:: bash
|
|
||||||
|
|
||||||
sls_detector_put updatekernel /home/...path-to-kernel-image
|
|
||||||
|
|
||||||
|
|
||||||
2. or command line
|
|
||||||
|
|
||||||
.. code-block:: bash
|
|
||||||
|
|
||||||
# step 1: get the kernel image (uImage.lzma) from slsdetectorgroup
|
|
||||||
# and copy it to pc's tftp folder
|
|
||||||
|
|
||||||
# step 2: connect to the board
|
|
||||||
telnet bchipxxx
|
|
||||||
|
|
||||||
#step 3: go to directory for space
|
|
||||||
cd /var/tmp/
|
|
||||||
|
|
||||||
# step 3: copy kernel to board
|
|
||||||
tftp pcxxx -r uImage.lzma -g
|
|
||||||
|
|
||||||
# step 4: verify kernel copied properly
|
|
||||||
ls -lrt
|
|
||||||
|
|
||||||
# step 5: erase flash
|
|
||||||
flash_eraseall /dev/mtd1
|
|
||||||
|
|
||||||
# step 6: copy new image to kernel drive
|
|
||||||
cat uImage.lzma > /dev/mtd1
|
|
||||||
|
|
||||||
# step 7:
|
|
||||||
sync
|
|
||||||
|
|
||||||
# step 8:
|
|
||||||
reboot
|
|
||||||
|
|
||||||
# step 9: verification
|
|
||||||
telnet bchipxxx
|
|
||||||
uname -a # verify kernel date
|
|
||||||
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>`.
|
|
@ -1,5 +1,3 @@
|
|||||||
// SPDX-License-Identifier: LGPL-3.0-or-other
|
|
||||||
// Copyright (C) 2021 Contributors to the SLS Detector Package
|
|
||||||
/**
|
/**
|
||||||
* Utility program to generate input files for the command line
|
* Utility program to generate input files for the command line
|
||||||
* documentation. Uses the string returned from sls_detector_help cmd
|
* documentation. Uses the string returned from sls_detector_help cmd
|
||||||
@ -11,9 +9,10 @@
|
|||||||
#include <string>
|
#include <string>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
#include "Caller.h"
|
|
||||||
#include "sls/Detector.h"
|
#include "CmdProxy.h"
|
||||||
#include "sls/sls_detector_defs.h"
|
#include "Detector.h"
|
||||||
|
#include "sls_detector_defs.h"
|
||||||
|
|
||||||
std::string replace_all(const std::string &src, const std::string &from,
|
std::string replace_all(const std::string &src, const std::string &from,
|
||||||
const std::string &to) {
|
const std::string &to) {
|
||||||
@ -37,28 +36,21 @@ int main() {
|
|||||||
|
|
||||||
std::cout << "Generating command line documentation!\n";
|
std::cout << "Generating command line documentation!\n";
|
||||||
|
|
||||||
sls::Caller caller(nullptr);
|
sls::CmdProxy proxy(nullptr);
|
||||||
auto commands = caller.getAllCommands();
|
auto commands = proxy.GetProxyCommands();
|
||||||
|
|
||||||
std::ofstream fs("commands.rst");
|
std::ofstream fs("commands.rst");
|
||||||
fs << ".. glossary::\n";
|
fs << ".. glossary::\n";
|
||||||
|
|
||||||
for (const auto &cmd : commands) {
|
for (const auto &cmd : commands) {
|
||||||
std::ostringstream os;
|
std::ostringstream os;
|
||||||
std::cout << cmd << '\n';
|
proxy.Call(cmd, {}, -1, slsDetectorDefs::HELP_ACTION, os);
|
||||||
caller.call(cmd, {}, -1, slsDetectorDefs::HELP_ACTION, os);
|
|
||||||
|
|
||||||
auto tmp = os.str().erase(0, cmd.size());
|
auto tmp = os.str().erase(0, cmd.size());
|
||||||
auto usage = tmp.substr(0, tmp.find_first_of('\n'));
|
auto usage = tmp.substr(0, tmp.find_first_of('\n'));
|
||||||
tmp.erase(0, usage.size());
|
tmp.erase(0, usage.size());
|
||||||
auto help = replace_all(tmp, "\n\t", "\n\t\t| ");
|
auto help = replace_all(tmp, "\n\t", "\n\t\t");
|
||||||
fs << '\t' << cmd << usage << help << "\n";
|
fs << '\t' << cmd << usage << help << "\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
std::ofstream fs2("deprecated.csv");
|
|
||||||
fs2 << "Old, New\n";
|
|
||||||
auto cmds = caller.GetDeprecatedCommands();
|
|
||||||
for (auto it : cmds) {
|
|
||||||
fs2 << it.first << ", " << it.second << '\n';
|
|
||||||
}
|
|
||||||
}
|
}
|
@ -1,89 +0,0 @@
|
|||||||
|
|
||||||
|
|
||||||
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>`
|
|
||||||
|
|
||||||
|
|
||||||
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.
|
|
||||||
|
|
||||||
|
|
@ -6,18 +6,12 @@
|
|||||||
Welcome to slsDetectorPackage's documentation!
|
Welcome to slsDetectorPackage's documentation!
|
||||||
==============================================
|
==============================================
|
||||||
|
|
||||||
.. note ::
|
|
||||||
|
|
||||||
This is the documentation for the latest development version of slsDetectorPackage.
|
|
||||||
For further documentation, visit the official page: https://www.psi.ch/en/detectors/documentation
|
|
||||||
|
|
||||||
.. toctree::
|
.. toctree::
|
||||||
:maxdepth: 3
|
:maxdepth: 1
|
||||||
:caption: Installation:
|
:caption: Installation:
|
||||||
|
|
||||||
installation
|
installation
|
||||||
dependencies
|
dependencies
|
||||||
consuming
|
|
||||||
|
|
||||||
.. toctree::
|
.. toctree::
|
||||||
:caption: C++ API
|
:caption: C++ API
|
||||||
@ -25,24 +19,21 @@ Welcome to slsDetectorPackage's documentation!
|
|||||||
|
|
||||||
detector
|
detector
|
||||||
result
|
result
|
||||||
receiver_api
|
receiver
|
||||||
examples
|
|
||||||
|
|
||||||
.. toctree::
|
.. toctree::
|
||||||
:caption: Python API
|
:caption: Python API
|
||||||
:maxdepth: 2
|
:maxdepth: 2
|
||||||
|
|
||||||
pygettingstarted
|
|
||||||
pydetector
|
pydetector
|
||||||
pyenums
|
pyenums
|
||||||
pyexamples
|
pyexamples
|
||||||
|
|
||||||
.. toctree::
|
.. toctree::
|
||||||
:caption: Command line
|
:caption: Command line
|
||||||
:maxdepth: 1
|
:maxdepth: 2
|
||||||
|
|
||||||
commandline
|
commandline
|
||||||
quick_start_guide
|
|
||||||
|
|
||||||
.. toctree::
|
.. toctree::
|
||||||
:caption: Developer
|
:caption: Developer
|
||||||
@ -51,60 +42,6 @@ Welcome to slsDetectorPackage's documentation!
|
|||||||
type_traits
|
type_traits
|
||||||
ToString
|
ToString
|
||||||
|
|
||||||
.. toctree::
|
|
||||||
:caption: Firmware
|
|
||||||
:maxdepth: 2
|
|
||||||
|
|
||||||
firmware
|
|
||||||
|
|
||||||
.. toctree::
|
|
||||||
:caption: Detector Server
|
|
||||||
:maxdepth: 2
|
|
||||||
|
|
||||||
servers
|
|
||||||
serverupgrade
|
|
||||||
virtualserver
|
|
||||||
serverdefaults
|
|
||||||
|
|
||||||
|
|
||||||
.. toctree::
|
|
||||||
:caption: Detector UDP Header
|
|
||||||
:maxdepth: 2
|
|
||||||
|
|
||||||
udpheader
|
|
||||||
udpconfig
|
|
||||||
udpdetspec
|
|
||||||
|
|
||||||
.. toctree::
|
|
||||||
:caption: Receiver
|
|
||||||
:maxdepth: 2
|
|
||||||
|
|
||||||
slsreceiver
|
|
||||||
receivers
|
|
||||||
|
|
||||||
|
|
||||||
.. toctree::
|
|
||||||
:caption: Receiver Files
|
|
||||||
:maxdepth: 3
|
|
||||||
|
|
||||||
fileformat
|
|
||||||
slsreceiverheaderformat
|
|
||||||
masterfileattributes
|
|
||||||
binaryfileformat
|
|
||||||
hdf5fileformat
|
|
||||||
|
|
||||||
.. toctree::
|
|
||||||
:caption: Receiver ZMQ Stream
|
|
||||||
:maxdepth: 2
|
|
||||||
|
|
||||||
zmqjsonheaderformat
|
|
||||||
|
|
||||||
.. toctree::
|
|
||||||
:caption: Troubleshooting
|
|
||||||
|
|
||||||
troubleshooting
|
|
||||||
|
|
||||||
|
|
||||||
.. Indices and tables
|
.. Indices and tables
|
||||||
.. ==================
|
.. ==================
|
||||||
|
|
||||||
|
@ -1,376 +1,5 @@
|
|||||||
|
|
||||||
|
|
||||||
.. _Installation:
|
|
||||||
|
|
||||||
|
|
||||||
Installation
|
Installation
|
||||||
===============
|
==============================================
|
||||||
|
|
||||||
.. contents::
|
|
||||||
:local:
|
|
||||||
:depth: 2
|
|
||||||
:backlinks: top
|
|
||||||
|
|
||||||
|
|
||||||
Overview
|
|
||||||
--------------
|
|
||||||
|
|
||||||
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.
|
|
||||||
|
|
||||||
:ref:`conda pre-built binaries`:
|
|
||||||
Install pre-built binaries for the C++ client, receiver, GUI and the Python API (``slsdet``), simplifying setup across platforms.
|
|
||||||
|
|
||||||
:ref:`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.
|
|
||||||
|
|
||||||
:ref:`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 :doc:`dependencies <../dependencies>` installed. If installing using conda, conda will manage the dependencies. Avoid installing packages with pip and conda simultaneously.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
.. _conda pre-built binaries:
|
|
||||||
|
|
||||||
1. Install pre-built binaries using conda (Recommended)
|
|
||||||
--------------------------------------------------------
|
|
||||||
|
|
||||||
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 four different packages available:
|
|
||||||
============== =============================================
|
|
||||||
Package Description
|
|
||||||
============== =============================================
|
|
||||||
slsdetlib shared libraries and command line utilities
|
|
||||||
slsdetgui GUI
|
|
||||||
slsdet Python bindings
|
|
||||||
moenchzmq moench
|
|
||||||
============== =============================================
|
|
||||||
|
|
||||||
.. code-block:: bash
|
|
||||||
|
|
||||||
#Add channels for dependencies and our library
|
|
||||||
conda config --add channels conda-forge
|
|
||||||
conda config --add channels slsdetectorgroup
|
|
||||||
conda config --set channel_priority strict
|
|
||||||
|
|
||||||
#create and activate an environment with our library
|
|
||||||
#replace 6.1.1 with the required tag
|
|
||||||
conda create -n myenv slsdetlib=6.1.1
|
|
||||||
conda activate myenv
|
|
||||||
|
|
||||||
#ready to use
|
|
||||||
sls_detector_get exptime
|
|
||||||
...
|
|
||||||
|
|
||||||
|
|
||||||
.. code-block:: bash
|
|
||||||
|
|
||||||
#List available versions
|
|
||||||
# lib and binaries
|
|
||||||
conda search slsdetlib
|
|
||||||
# python
|
|
||||||
conda search slsdet
|
|
||||||
# gui
|
|
||||||
conda search slsdetgui
|
|
||||||
# moench
|
|
||||||
conda search moenchzmq
|
|
||||||
|
|
||||||
|
|
||||||
.. _pip:
|
|
||||||
|
|
||||||
2. Pip
|
|
||||||
-------
|
|
||||||
The Python extension module ``slsdet`` can be installed using pip. This is available from v9.2.0 onwards.
|
|
||||||
|
|
||||||
.. code-block:: bash
|
|
||||||
|
|
||||||
#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 .
|
|
||||||
|
|
||||||
|
|
||||||
.. _build from source:
|
|
||||||
|
|
||||||
3. Build from source
|
|
||||||
-------------------------
|
|
||||||
|
|
||||||
3.1. Download Source Code from github
|
|
||||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
||||||
|
|
||||||
.. code-block:: bash
|
|
||||||
|
|
||||||
git clone https://github.com/slsdetectorgroup/slsDetectorPackage.git --branch 6.1.1
|
|
||||||
|
|
||||||
.. note ::
|
|
||||||
|
|
||||||
For v6.x.x of slsDetectorPackage and older, refer :ref:`pybind11 notes on cloning. <pybind for different slsDetectorPackage versions>`
|
|
||||||
|
|
||||||
.. _build from source using cmake:
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
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
|
|
||||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
||||||
|
|
||||||
.. code-block:: bash
|
|
||||||
|
|
||||||
# outside slsDetecorPackage folder
|
|
||||||
mkdir build && cd build
|
|
||||||
|
|
||||||
# configure & generate Makefiles using cmake
|
|
||||||
# by listing all your options (alternately use ccmake described below)
|
|
||||||
# cmake3 for some systems
|
|
||||||
cmake ../slsDetectorPackage -DCMAKE_INSTALL_PREFIX=/your/install/path
|
|
||||||
|
|
||||||
# compiled to the build/bin directory
|
|
||||||
make -j12 #or whatever number of cores you are using to build
|
|
||||||
|
|
||||||
# install headers and libs in /your/install/path directory
|
|
||||||
make install
|
|
||||||
|
|
||||||
|
|
||||||
Instead of the cmake command, one can use ccmake to get a list of options to configure and generate Makefiles at ease.
|
|
||||||
|
|
||||||
.. code-block:: bash
|
|
||||||
|
|
||||||
# ccmake3 for some systems
|
|
||||||
ccmake ..
|
|
||||||
|
|
||||||
# choose the options
|
|
||||||
# first press [c] - configure (until you see [g])
|
|
||||||
# then press [g] - generate
|
|
||||||
|
|
||||||
|
|
||||||
=============================== ===============================
|
|
||||||
Example cmake options Comment
|
|
||||||
=============================== ===============================
|
|
||||||
-DSLS_USE_PYTHON=ON Python
|
|
||||||
-DPython_FIND_VIRTUALENV=ONLY Python from the conda env
|
|
||||||
-DSLS_USE_GUI=ON GUI
|
|
||||||
-DSLS_USE_HDF5=ON HDF5
|
|
||||||
-DSLS_USE_SIMULATOR=ON Simulator
|
|
||||||
=============================== ===============================
|
|
||||||
|
|
||||||
.. note ::
|
|
||||||
|
|
||||||
For v7.x.x of slsDetectorPackage and older, refer :ref:`zeromq notes for cmake option to hint library location. <zeromq for different slsDetectorPackage versions>`
|
|
||||||
|
|
||||||
|
|
||||||
3.2.2. Build using in-built cmk.sh script
|
|
||||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
||||||
|
|
||||||
|
|
||||||
.. code-block:: bash
|
|
||||||
|
|
||||||
The binaries are generated in slsDetectorPackage/build/bin directory.
|
|
||||||
|
|
||||||
Usage: $0 [-b] [-c] [-d <HDF5 directory>] [-e] [-g] [-h] [-i]
|
|
||||||
[-j <Number of threads>] [-k <CMake command>] [-l <Install directory>]
|
|
||||||
[-m] [-n] [-p] [-r] [-s] [-t] [-u] [-z]
|
|
||||||
-[no option]: only make
|
|
||||||
-b: Builds/Rebuilds CMake files normal mode
|
|
||||||
-c: Clean
|
|
||||||
-d: HDF5 Custom Directory
|
|
||||||
-e: Debug mode
|
|
||||||
-g: Build/Rebuilds gui
|
|
||||||
-h: Builds/Rebuilds Cmake files with HDF5 package
|
|
||||||
-i: Builds tests
|
|
||||||
-j: Number of threads to compile through
|
|
||||||
-k: CMake command
|
|
||||||
-l: Install directory
|
|
||||||
-m: Manuals
|
|
||||||
-n: Manuals without compiling doxygen (only rst)
|
|
||||||
-p: Builds/Rebuilds Python API
|
|
||||||
-r: Build/Rebuilds only receiver
|
|
||||||
-s: Simulator
|
|
||||||
-t: Build/Rebuilds only text client
|
|
||||||
-u: Chip Test Gui
|
|
||||||
-z: Moench zmq processor
|
|
||||||
|
|
||||||
|
|
||||||
# display all options
|
|
||||||
./cmk.sh -?
|
|
||||||
|
|
||||||
# new build and compile in parallel (recommended basic option):
|
|
||||||
./cmk.sh -cbj5
|
|
||||||
|
|
||||||
# new build, python and compile in parallel:
|
|
||||||
./cmk.sh -cbpj5
|
|
||||||
|
|
||||||
#For rebuilding only certain sections
|
|
||||||
./cmk.sh -tg #only text client and gui
|
|
||||||
./cmk.sh -r #only receiver
|
|
||||||
|
|
||||||
.. note ::
|
|
||||||
|
|
||||||
For v7.x.x of slsDetectorPackage and older, refer :ref:`zeromq notes for cmk script option to hint library location. <zeromq for different slsDetectorPackage versions>`
|
|
||||||
|
|
||||||
|
|
||||||
3.3. Build on old distributions using conda
|
|
||||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
||||||
|
|
||||||
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
|
|
||||||
|
|
||||||
.. code-block:: bash
|
|
||||||
|
|
||||||
#Create an environment with the dependencies
|
|
||||||
conda create -n myenv gxx_linux-64 cmake
|
|
||||||
conda activate myenv
|
|
||||||
|
|
||||||
# outside slsDetecorPackage folder
|
|
||||||
mkdir build && cd build
|
|
||||||
cmake ../slsDetectorPackage -DCMAKE_PREFIX_PATH=$CONDA_PREFIX
|
|
||||||
make -j12
|
|
||||||
|
|
||||||
|
|
||||||
.. note ::
|
|
||||||
|
|
||||||
For v7.x.x of slsDetectorPackage and older, refer :ref:`zeromq notes for dependencies for conda. <zeromq for different slsDetectorPackage versions>`
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
3.4. Build slsDetectorGui (Qt5)
|
|
||||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
||||||
|
|
||||||
1. Using pre-built binary on conda
|
|
||||||
|
|
||||||
.. code-block:: bash
|
|
||||||
|
|
||||||
conda create -n myenv slsdetgui=7.0.0
|
|
||||||
conda activate myenv
|
|
||||||
|
|
||||||
|
|
||||||
2. Using system installation on RHEL7
|
|
||||||
|
|
||||||
.. code-block:: bash
|
|
||||||
|
|
||||||
yum install qt5-qtbase-devel.x86_64
|
|
||||||
yum install qt5-qtsvg-devel.x86_64
|
|
||||||
|
|
||||||
3. Using system installation on RHEL8
|
|
||||||
|
|
||||||
.. code-block:: bash
|
|
||||||
|
|
||||||
yum install qt5-qtbase-devel.x86_64
|
|
||||||
yum install qt5-qtsvg-devel.x86_64
|
|
||||||
yum install expat-devel.x86_64
|
|
||||||
|
|
||||||
4. Using conda
|
|
||||||
|
|
||||||
.. code-block:: bash
|
|
||||||
|
|
||||||
#Add channels for dependencies and our library
|
|
||||||
conda config --add channels conda-forge
|
|
||||||
conda config --add channels slsdetectorgroup
|
|
||||||
conda config --set channel_priority strict
|
|
||||||
|
|
||||||
# create environment to compile
|
|
||||||
# on rhel7
|
|
||||||
conda create -n slsgui gxx_linux-64 gxx_linux-64 mesa-libgl-devel-cos6-x86_64 qt
|
|
||||||
# on fedora or newer systems
|
|
||||||
conda create -n slsgui qt
|
|
||||||
|
|
||||||
# when using conda compilers, would also need libgl, but no need for it on fedora unless maybe using it with ROOT
|
|
||||||
|
|
||||||
# activate environment
|
|
||||||
conda activate slsgui
|
|
||||||
|
|
||||||
# compile with cmake outside slsDetecorPackage folder
|
|
||||||
mkdir build && cd build
|
|
||||||
cmake ../slsDetectorPackage -DSLS_USE_GUI=ON
|
|
||||||
make -j12
|
|
||||||
|
|
||||||
# or compile with cmk.sh
|
|
||||||
cd slsDetectorPackage
|
|
||||||
./cmk.sh -cbgj9
|
|
||||||
|
|
||||||
.. note ::
|
|
||||||
|
|
||||||
For v7.x.x of slsDetectorPackage and older, refer :ref:`zeromq notes for dependencies for conda. <zeromq for different slsDetectorPackage versions>`
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
3.5. Build this documentation
|
|
||||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
||||||
|
|
||||||
The documentation for the slsDetectorPackage is build using a combination
|
|
||||||
of Doxygen, Sphinx and Breathe. The easiest way to install the dependencies
|
|
||||||
is to use conda
|
|
||||||
|
|
||||||
.. code-block:: bash
|
|
||||||
|
|
||||||
conda create -n myenv python=3.12 sphinx sphinx_rtd_theme breathe doxygen numpy
|
|
||||||
|
|
||||||
|
|
||||||
.. code-block:: bash
|
|
||||||
|
|
||||||
# using cmake or ccmake to enable DSLS_BUILD_DOCS
|
|
||||||
# outside slsDetecorPackage folder
|
|
||||||
mkdir build && cd build
|
|
||||||
cmake ../slsDetectorPackage -DSLS_BUILD_DOCS=ON
|
|
||||||
|
|
||||||
make docs # generate API docs and build Sphinx RST
|
|
||||||
make rst # rst only, saves time in case the API did not change
|
|
||||||
|
|
||||||
|
|
||||||
4. Pybind and Zeromq
|
|
||||||
-------------------------
|
|
||||||
|
|
||||||
.. _pybind for different slsDetectorPackage versions:
|
|
||||||
|
|
||||||
|
|
||||||
| **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 <https://github.com/pybind/pybind11>`__].
|
|
||||||
| * 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.
|
|
||||||
|
|
||||||
.. code-block:: bash
|
|
||||||
|
|
||||||
# Note: Only for v6.x.x versions and older
|
|
||||||
|
|
||||||
# clone using recursive to get pybind11 submodule
|
|
||||||
git clone --recursive https://github.com/slsdetectorgroup/slsDetectorPackage.git
|
|
||||||
|
|
||||||
# update submodule when switching between releases
|
|
||||||
cd slsDetectorPackage
|
|
||||||
git submodule update --init
|
|
||||||
|
|
||||||
|
|
||||||
.. _zeromq for different slsDetectorPackage versions:
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
| **Zeromq**
|
|
||||||
| v8.0.0+:
|
|
||||||
| zeromq (v4.3.4) is built
|
|
||||||
| * by default from tar file in repo (libs/libzmq/libzmq-4.3.4.tar.gz)
|
|
||||||
| * or use advanced option SLS_FETCH_ZMQ_FROM_GITHUB [`link <https://github.com/zeromq/libzmq.git>`__].
|
|
||||||
|
|
|
||||||
| v7.x.x and older:
|
|
||||||
| zeromq-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
|
|
||||||
|
|
||||||
|
get the source etc.
|
@ -1,409 +0,0 @@
|
|||||||
|
|
||||||
.. _master file attributes:
|
|
||||||
|
|
||||||
Master File Attributes
|
|
||||||
=======================
|
|
||||||
|
|
||||||
These attributes are the same in binary and HDF5 file, but vary depending on detector type.
|
|
||||||
|
|
||||||
|
|
||||||
Eiger
|
|
||||||
^^^^^
|
|
||||||
|
|
||||||
+-----------------------+-------------------------------------------------+
|
|
||||||
| **Key** | **Description** |
|
|
||||||
+-----------------------+-------------------------------------------------+
|
|
||||||
| Version | Version of the master file |
|
|
||||||
| | Current value:8.0 |
|
|
||||||
+-----------------------+-------------------------------------------------+
|
|
||||||
| Timestamp | Timestamp of creation of master file |
|
|
||||||
+-----------------------+-------------------------------------------------+
|
|
||||||
| Detector Type | Detector type |
|
|
||||||
+-----------------------+-------------------------------------------------+
|
|
||||||
| Timing Mode | Timing Mode |
|
|
||||||
+-----------------------+-------------------------------------------------+
|
|
||||||
| Geometry | Number of UDP ports in x and y dimension for |
|
|
||||||
| | complete detector |
|
|
||||||
+-----------------------+-------------------------------------------------+
|
|
||||||
| Image Size in bytes | Image size in bytes per UDP port |
|
|
||||||
+-----------------------+-------------------------------------------------+
|
|
||||||
| Pixels | Number of pixels in x and y dimension |
|
|
||||||
| | per UDP port |
|
|
||||||
+-----------------------+-------------------------------------------------+
|
|
||||||
| Max Frames Per File | Maximum frames per file |
|
|
||||||
+-----------------------+-------------------------------------------------+
|
|
||||||
| Frame Discard Policy | Receiever Frame discard policy |
|
|
||||||
| | for partial frames |
|
|
||||||
+-----------------------+-------------------------------------------------+
|
|
||||||
| Frame Padding | Receiver Frame padding enable |
|
|
||||||
| | for partial frames |
|
|
||||||
+-----------------------+-------------------------------------------------+
|
|
||||||
| Scan Parameters | Scanning mode on detector |
|
|
||||||
+-----------------------+-------------------------------------------------+
|
|
||||||
| Total Frames | Total number of frames and triggers expected |
|
|
||||||
+-----------------------+-------------------------------------------------+
|
|
||||||
| Receiver Roi | Receiver ROI in file including xmax and ymax |
|
|
||||||
+-----------------------+-------------------------------------------------+
|
|
||||||
| Dynamic Range | Bits per pixel |
|
|
||||||
+-----------------------+-------------------------------------------------+
|
|
||||||
| Ten Giga | 10GbE enable for data |
|
|
||||||
+-----------------------+-------------------------------------------------+
|
|
||||||
| Exptime | Exposure time |
|
|
||||||
+-----------------------+-------------------------------------------------+
|
|
||||||
| Period | Period between frames |
|
|
||||||
+-----------------------+-------------------------------------------------+
|
|
||||||
| Threshold Energy | Threshold energy |
|
|
||||||
+-----------------------+-------------------------------------------------+
|
|
||||||
| Sub Exptime | Sub exposure time in 32 bit mode |
|
|
||||||
+-----------------------+-------------------------------------------------+
|
|
||||||
| Sub Period | Sub period between frames in 32 bit mode |
|
|
||||||
+-----------------------+-------------------------------------------------+
|
|
||||||
| Quad | Quad enable (hardware) |
|
|
||||||
+-----------------------+-------------------------------------------------+
|
|
||||||
| Number of rows | Number of rows enabled for readout |
|
|
||||||
+-----------------------+-------------------------------------------------+
|
|
||||||
| Rate Corrections | Rate Corrections |
|
|
||||||
+-----------------------+-------------------------------------------------+
|
|
||||||
| Frames in File | Number of frames written to file by Receiver 0 |
|
|
||||||
+-----------------------+-------------------------------------------------+
|
|
||||||
| Frame Header Format | Expected frame header format for the data files |
|
|
||||||
+-----------------------+-------------------------------------------------+
|
|
||||||
|
|
||||||
|
|
||||||
Jungfrau
|
|
||||||
^^^^^^^^
|
|
||||||
|
|
||||||
+-----------------------+-------------------------------------------------+
|
|
||||||
| **Key** | **Description** |
|
|
||||||
+-----------------------+-------------------------------------------------+
|
|
||||||
| Version | Version of the master file |
|
|
||||||
| | Current value:8.0 |
|
|
||||||
+-----------------------+-------------------------------------------------+
|
|
||||||
| Timestamp | Timestamp of creation of master file |
|
|
||||||
+-----------------------+-------------------------------------------------+
|
|
||||||
| Detector Type | Detector type |
|
|
||||||
+-----------------------+-------------------------------------------------+
|
|
||||||
| Timing Mode | Timing Mode |
|
|
||||||
+-----------------------+-------------------------------------------------+
|
|
||||||
| Geometry | Number of UDP ports in x and y dimension for |
|
|
||||||
| | complete detector |
|
|
||||||
+-----------------------+-------------------------------------------------+
|
|
||||||
| Image Size in bytes | Image size in bytes per UDP port |
|
|
||||||
+-----------------------+-------------------------------------------------+
|
|
||||||
| Pixels | Number of pixels in x and y dimension |
|
|
||||||
| | per UDP port |
|
|
||||||
+-----------------------+-------------------------------------------------+
|
|
||||||
| Max Frames Per File | Maximum frames per file |
|
|
||||||
+-----------------------+-------------------------------------------------+
|
|
||||||
| Frame Discard Policy | Receiever Frame discard policy |
|
|
||||||
| | for partial frames |
|
|
||||||
+-----------------------+-------------------------------------------------+
|
|
||||||
| Frame Padding | Receiver Frame padding enable |
|
|
||||||
| | for partial frames |
|
|
||||||
+-----------------------+-------------------------------------------------+
|
|
||||||
| Scan Parameters | Scanning mode on detector |
|
|
||||||
+-----------------------+-------------------------------------------------+
|
|
||||||
| Total Frames | Total number of frames and triggers expected |
|
|
||||||
+-----------------------+-------------------------------------------------+
|
|
||||||
| Receiver Roi | Receiver ROI in file including xmax and ymax |
|
|
||||||
+-----------------------+-------------------------------------------------+
|
|
||||||
| Exptime | Exposure time |
|
|
||||||
+-----------------------+-------------------------------------------------+
|
|
||||||
| Period | Period between frames |
|
|
||||||
+-----------------------+-------------------------------------------------+
|
|
||||||
| Number of UDP | Number of UDP Interfaces enabled per module |
|
|
||||||
| Interfaces | |
|
|
||||||
+-----------------------+-------------------------------------------------+
|
|
||||||
| Number of rows | Number of rows enabled for readout |
|
|
||||||
+-----------------------+-------------------------------------------------+
|
|
||||||
| Frames in File | Number of frames written to file by Receiver 0 |
|
|
||||||
+-----------------------+-------------------------------------------------+
|
|
||||||
| Frame Header Format | Expected frame header format for the data files |
|
|
||||||
+-----------------------+-------------------------------------------------+
|
|
||||||
|
|
||||||
Gotthard II
|
|
||||||
^^^^^^^^^^^^
|
|
||||||
|
|
||||||
+-----------------------+-------------------------------------------------+
|
|
||||||
| **Key** | **Description** |
|
|
||||||
+-----------------------+-------------------------------------------------+
|
|
||||||
| Version | Version of the master file |
|
|
||||||
| | Current value:8.0 |
|
|
||||||
+-----------------------+-------------------------------------------------+
|
|
||||||
| Timestamp | Timestamp of creation of master file |
|
|
||||||
+-----------------------+-------------------------------------------------+
|
|
||||||
| Detector Type | Detector type |
|
|
||||||
+-----------------------+-------------------------------------------------+
|
|
||||||
| Timing Mode | Timing Mode |
|
|
||||||
+-----------------------+-------------------------------------------------+
|
|
||||||
| Geometry | Number of UDP ports in x and y dimension for |
|
|
||||||
| | complete detector |
|
|
||||||
+-----------------------+-------------------------------------------------+
|
|
||||||
| Image Size in bytes | Image size in bytes per UDP port |
|
|
||||||
+-----------------------+-------------------------------------------------+
|
|
||||||
| Pixels | Number of pixels in x and y dimension |
|
|
||||||
| | per UDP port |
|
|
||||||
+-----------------------+-------------------------------------------------+
|
|
||||||
| Max Frames Per File | Maximum frames per file |
|
|
||||||
+-----------------------+-------------------------------------------------+
|
|
||||||
| Frame Discard Policy | Receiever Frame discard policy |
|
|
||||||
| | for partial frames |
|
|
||||||
+-----------------------+-------------------------------------------------+
|
|
||||||
| Frame Padding | Receiver Frame padding enable |
|
|
||||||
| | for partial frames |
|
|
||||||
+-----------------------+-------------------------------------------------+
|
|
||||||
| Scan Parameters | Scanning mode on detector |
|
|
||||||
+-----------------------+-------------------------------------------------+
|
|
||||||
| Total Frames | Total number of frames and triggers expected |
|
|
||||||
+-----------------------+-------------------------------------------------+
|
|
||||||
| Receiver Roi | Receiver ROI in file including xmax and ymax |
|
|
||||||
+-----------------------+-------------------------------------------------+
|
|
||||||
| Exptime | Exposure time |
|
|
||||||
+-----------------------+-------------------------------------------------+
|
|
||||||
| Period | Period between frames |
|
|
||||||
+-----------------------+-------------------------------------------------+
|
|
||||||
| Burst Mode | Burst mode of detector |
|
|
||||||
+-----------------------+-------------------------------------------------+
|
|
||||||
| Frames in File | Number of frames written to file by Receiver 0 |
|
|
||||||
+-----------------------+-------------------------------------------------+
|
|
||||||
| Frame Header Format | Expected frame header format for the data files |
|
|
||||||
+-----------------------+-------------------------------------------------+
|
|
||||||
|
|
||||||
Mythen3
|
|
||||||
^^^^^^^
|
|
||||||
|
|
||||||
|
|
||||||
+-----------------------+-------------------------------------------------+
|
|
||||||
| **Key** | **Description** |
|
|
||||||
+-----------------------+-------------------------------------------------+
|
|
||||||
| Version | Version of the master file |
|
|
||||||
| | Current value:8.0 |
|
|
||||||
+-----------------------+-------------------------------------------------+
|
|
||||||
| Timestamp | Timestamp of creation of master file |
|
|
||||||
+-----------------------+-------------------------------------------------+
|
|
||||||
| Detector Type | Detector type |
|
|
||||||
+-----------------------+-------------------------------------------------+
|
|
||||||
| Timing Mode | Timing Mode |
|
|
||||||
+-----------------------+-------------------------------------------------+
|
|
||||||
| Geometry | Number of UDP ports in x and y dimension for |
|
|
||||||
| | complete detector |
|
|
||||||
+-----------------------+-------------------------------------------------+
|
|
||||||
| Image Size in bytes | Image size in bytes per UDP port |
|
|
||||||
+-----------------------+-------------------------------------------------+
|
|
||||||
| Pixels | Number of pixels in x and y dimension |
|
|
||||||
| | per UDP port |
|
|
||||||
+-----------------------+-------------------------------------------------+
|
|
||||||
| Max Frames Per File | Maximum frames per file |
|
|
||||||
+-----------------------+-------------------------------------------------+
|
|
||||||
| Frame Discard Policy | Receiever Frame discard policy |
|
|
||||||
| | for partial frames |
|
|
||||||
+-----------------------+-------------------------------------------------+
|
|
||||||
| Frame Padding | Receiver Frame padding enable |
|
|
||||||
| | for partial frames |
|
|
||||||
+-----------------------+-------------------------------------------------+
|
|
||||||
| Scan Parameters | Scanning mode on detector |
|
|
||||||
+-----------------------+-------------------------------------------------+
|
|
||||||
| Total Frames | Total number of frames and triggers expected |
|
|
||||||
+-----------------------+-------------------------------------------------+
|
|
||||||
| Receiver Roi | Receiver ROI in file including xmax and ymax |
|
|
||||||
+-----------------------+-------------------------------------------------+
|
|
||||||
| Dynamic Range | Bits per pixel |
|
|
||||||
+-----------------------+-------------------------------------------------+
|
|
||||||
| Ten Giga | 10GbE enable for data |
|
|
||||||
+-----------------------+-------------------------------------------------+
|
|
||||||
| Period | Period between frames |
|
|
||||||
+-----------------------+-------------------------------------------------+
|
|
||||||
| Counter Mask | Mask of counters enabled |
|
|
||||||
+-----------------------+-------------------------------------------------+
|
|
||||||
| Exptime1 | Exposure time of counter 1 |
|
|
||||||
+-----------------------+-------------------------------------------------+
|
|
||||||
| Exptime2 | Exposure time of counter 2 |
|
|
||||||
+-----------------------+-------------------------------------------------+
|
|
||||||
| Exptime3 | Exposure time of counter 3 |
|
|
||||||
+-----------------------+-------------------------------------------------+
|
|
||||||
| GateDelay1 | Gate delay of counter 1 |
|
|
||||||
+-----------------------+-------------------------------------------------+
|
|
||||||
| GateDelay2 | Gate delay of counter 2 |
|
|
||||||
+-----------------------+-------------------------------------------------+
|
|
||||||
| GateDelay3 | Gate delay of counter 3 |
|
|
||||||
+-----------------------+-------------------------------------------------+
|
|
||||||
| Gates | Number of gates |
|
|
||||||
+-----------------------+-------------------------------------------------+
|
|
||||||
| Threshold energies | Threshold energy of all 3 counters |
|
|
||||||
+-----------------------+-------------------------------------------------+
|
|
||||||
| Frames in File | Number of frames written to file by Receiver 0 |
|
|
||||||
+-----------------------+-------------------------------------------------+
|
|
||||||
| Frame Header Format | Expected frame header format for the data files |
|
|
||||||
+-----------------------+-------------------------------------------------+
|
|
||||||
|
|
||||||
|
|
||||||
Moench
|
|
||||||
^^^^^^
|
|
||||||
|
|
||||||
+-----------------------+-------------------------------------------------+
|
|
||||||
| **Key** | **Description** |
|
|
||||||
+-----------------------+-------------------------------------------------+
|
|
||||||
| Version | Version of the master file |
|
|
||||||
| | Current value:8.0 |
|
|
||||||
+-----------------------+-------------------------------------------------+
|
|
||||||
| Timestamp | Timestamp of creation of master file |
|
|
||||||
+-----------------------+-------------------------------------------------+
|
|
||||||
| Detector Type | Detector type |
|
|
||||||
+-----------------------+-------------------------------------------------+
|
|
||||||
| Timing Mode | Timing Mode |
|
|
||||||
+-----------------------+-------------------------------------------------+
|
|
||||||
| Geometry | Number of UDP ports in x and y dimension for |
|
|
||||||
| | complete detector |
|
|
||||||
+-----------------------+-------------------------------------------------+
|
|
||||||
| Image Size in bytes | Image size in bytes per UDP port |
|
|
||||||
+-----------------------+-------------------------------------------------+
|
|
||||||
| Pixels | Number of pixels in x and y dimension |
|
|
||||||
| | per UDP port |
|
|
||||||
+-----------------------+-------------------------------------------------+
|
|
||||||
| Max Frames Per File | Maximum frames per file |
|
|
||||||
+-----------------------+-------------------------------------------------+
|
|
||||||
| Frame Discard Policy | Receiever Frame discard policy |
|
|
||||||
| | for partial frames |
|
|
||||||
+-----------------------+-------------------------------------------------+
|
|
||||||
| Frame Padding | Receiver Frame padding enable |
|
|
||||||
| | for partial frames |
|
|
||||||
+-----------------------+-------------------------------------------------+
|
|
||||||
| Scan Parameters | Scanning mode on detector |
|
|
||||||
+-----------------------+-------------------------------------------------+
|
|
||||||
| Total Frames | Total number of frames and triggers expected |
|
|
||||||
+-----------------------+-------------------------------------------------+
|
|
||||||
| Receiver Roi | Receiver ROI in file including xmax and ymax |
|
|
||||||
+-----------------------+-------------------------------------------------+
|
|
||||||
| Exptime | Exposure time |
|
|
||||||
+-----------------------+-------------------------------------------------+
|
|
||||||
| Period | Period between frames |
|
|
||||||
+-----------------------+-------------------------------------------------+
|
|
||||||
| Number of UDP | Number of UDP Interfaces enabled per module |
|
|
||||||
| Interfaces | |
|
|
||||||
+-----------------------+-------------------------------------------------+
|
|
||||||
| Number of rows | Number of rows enabled for readout |
|
|
||||||
+-----------------------+-------------------------------------------------+
|
|
||||||
| Frames in File | Number of frames written to file by Receiver 0 |
|
|
||||||
+-----------------------+-------------------------------------------------+
|
|
||||||
| Frame Header Format | Expected frame header format for the data files |
|
|
||||||
+-----------------------+-------------------------------------------------+
|
|
||||||
|
|
||||||
Gotthard I
|
|
||||||
^^^^^^^^^^^
|
|
||||||
|
|
||||||
+-----------------------+-------------------------------------------------+
|
|
||||||
| **Key** | **Description** |
|
|
||||||
+-----------------------+-------------------------------------------------+
|
|
||||||
| Version | Version of the master file |
|
|
||||||
| | Current value:8.0 |
|
|
||||||
+-----------------------+-------------------------------------------------+
|
|
||||||
| Timestamp | Timestamp of creation of master file |
|
|
||||||
+-----------------------+-------------------------------------------------+
|
|
||||||
| Detector Type | Detector type |
|
|
||||||
+-----------------------+-------------------------------------------------+
|
|
||||||
| Timing Mode | Timing Mode |
|
|
||||||
+-----------------------+-------------------------------------------------+
|
|
||||||
| Geometry | Number of UDP ports in x and y dimension for |
|
|
||||||
| | complete detector |
|
|
||||||
+-----------------------+-------------------------------------------------+
|
|
||||||
| Image Size in bytes | Image size in bytes per UDP port |
|
|
||||||
+-----------------------+-------------------------------------------------+
|
|
||||||
| Pixels | Number of pixels in x and y dimension |
|
|
||||||
| | per UDP port |
|
|
||||||
+-----------------------+-------------------------------------------------+
|
|
||||||
| Max Frames Per File | Maximum frames per file |
|
|
||||||
+-----------------------+-------------------------------------------------+
|
|
||||||
| Frame Discard Policy | Receiever Frame discard policy |
|
|
||||||
| | for partial frames |
|
|
||||||
+-----------------------+-------------------------------------------------+
|
|
||||||
| Frame Padding | Receiver Frame padding enable |
|
|
||||||
| | for partial frames |
|
|
||||||
+-----------------------+-------------------------------------------------+
|
|
||||||
| Scan Parameters | Scanning mode on detector |
|
|
||||||
+-----------------------+-------------------------------------------------+
|
|
||||||
| Total Frames | Total number of frames and triggers expected |
|
|
||||||
+-----------------------+-------------------------------------------------+
|
|
||||||
| Receiver Roi | Receiver ROI in file including xmax and ymax |
|
|
||||||
+-----------------------+-------------------------------------------------+
|
|
||||||
| Exptime | Exposure time |
|
|
||||||
+-----------------------+-------------------------------------------------+
|
|
||||||
| Period | Period between frames |
|
|
||||||
+-----------------------+-------------------------------------------------+
|
|
||||||
| Detector Roi | Roi in detector restricted to an ADC. |
|
|
||||||
| | Includes xmax |
|
|
||||||
+-----------------------+-------------------------------------------------+
|
|
||||||
| Burst Mode | Burst mode of detector |
|
|
||||||
+-----------------------+-------------------------------------------------+
|
|
||||||
| Frames in File | Number of frames written to file by Receiver 0 |
|
|
||||||
+-----------------------+-------------------------------------------------+
|
|
||||||
| Frame Header Format | Expected frame header format for the data files |
|
|
||||||
+-----------------------+-------------------------------------------------+
|
|
||||||
|
|
||||||
Chip Test Board
|
|
||||||
^^^^^^^^^^^^^^^
|
|
||||||
|
|
||||||
|
|
||||||
+-----------------------+-------------------------------------------------+
|
|
||||||
| **Key** | **Description** |
|
|
||||||
+-----------------------+-------------------------------------------------+
|
|
||||||
| Version | Version of the master file |
|
|
||||||
| | Current value:8.0 |
|
|
||||||
+-----------------------+-------------------------------------------------+
|
|
||||||
| Timestamp | Timestamp of creation of master file |
|
|
||||||
+-----------------------+-------------------------------------------------+
|
|
||||||
| Detector Type | Detector type |
|
|
||||||
+-----------------------+-------------------------------------------------+
|
|
||||||
| Timing Mode | Timing Mode |
|
|
||||||
+-----------------------+-------------------------------------------------+
|
|
||||||
| Geometry | Number of UDP ports in x and y dimension for |
|
|
||||||
| | complete detector |
|
|
||||||
+-----------------------+-------------------------------------------------+
|
|
||||||
| Image Size in bytes | Image size in bytes per UDP port |
|
|
||||||
+-----------------------+-------------------------------------------------+
|
|
||||||
| Pixels | Number of pixels in x and y dimension |
|
|
||||||
| | per UDP port |
|
|
||||||
+-----------------------+-------------------------------------------------+
|
|
||||||
| Max Frames Per File | Maximum frames per file |
|
|
||||||
+-----------------------+-------------------------------------------------+
|
|
||||||
| Frame Discard Policy | Receiever Frame discard policy |
|
|
||||||
| | for partial frames |
|
|
||||||
+-----------------------+-------------------------------------------------+
|
|
||||||
| Frame Padding | Receiver Frame padding enable |
|
|
||||||
| | for partial frames |
|
|
||||||
+-----------------------+-------------------------------------------------+
|
|
||||||
| Scan Parameters | Scanning mode on detector |
|
|
||||||
+-----------------------+-------------------------------------------------+
|
|
||||||
| Total Frames | Total number of frames and triggers expected |
|
|
||||||
+-----------------------+-------------------------------------------------+
|
|
||||||
| Receiver Roi | Receiver ROI in file including xmax and ymax |
|
|
||||||
+-----------------------+-------------------------------------------------+
|
|
||||||
| Exptime | Exposure time |
|
|
||||||
+-----------------------+-------------------------------------------------+
|
|
||||||
| Period | Period between frames |
|
|
||||||
+-----------------------+-------------------------------------------------+
|
|
||||||
| Ten Giga | Ten giga enable |
|
|
||||||
+-----------------------+-------------------------------------------------+
|
|
||||||
| ADC Mask | Mask of channels enabled in ADC |
|
|
||||||
+-----------------------+-------------------------------------------------+
|
|
||||||
| Analog Flag | Analog readout enable |
|
|
||||||
+-----------------------+-------------------------------------------------+
|
|
||||||
| Analog Samples | Number of analog samples |
|
|
||||||
+-----------------------+-------------------------------------------------+
|
|
||||||
| Digital Flag | Digital readout enable |
|
|
||||||
+-----------------------+-------------------------------------------------+
|
|
||||||
| Digital Samples | Number of digital samples |
|
|
||||||
+-----------------------+-------------------------------------------------+
|
|
||||||
| Dbit Offset | Digital offset of valid data in bytes |
|
|
||||||
+-----------------------+-------------------------------------------------+
|
|
||||||
| Dbit Bitset | Digital 64 bit mask of bits enabled in receiver |
|
|
||||||
+-----------------------+-------------------------------------------------+
|
|
||||||
| Transceiver Mask | Mask of channels enabled in Transceiver |
|
|
||||||
+-----------------------+-------------------------------------------------+
|
|
||||||
| Transceiver Flag | Transceiver readout enable |
|
|
||||||
+-----------------------+-------------------------------------------------+
|
|
||||||
| Transceiver Samples | Number of transceiver samples |
|
|
||||||
+-----------------------+-------------------------------------------------+
|
|
||||||
| Frames in File | Number of frames written to file by Receiver 0 |
|
|
||||||
+-----------------------+-------------------------------------------------+
|
|
||||||
| Frame Header Format | Expected frame header format for the data files |
|
|
||||||
+-----------------------+-------------------------------------------------+
|
|
@ -1,10 +1,9 @@
|
|||||||
Detector
|
Detector
|
||||||
=====================================================
|
=====================================================
|
||||||
|
|
||||||
.. py:currentmodule:: slsdet
|
.. py:currentmodule:: sls_detector
|
||||||
|
|
||||||
.. autoclass:: Detector
|
.. autoclass:: ExperimentalDetector
|
||||||
:members:
|
:members:
|
||||||
:undoc-members:
|
:undoc-members:
|
||||||
:show-inheritance:
|
:show-inheritance:
|
||||||
:inherited-members:
|
|
@ -4,86 +4,9 @@ Enums
|
|||||||
These enums are defined in slsDetectorDefs in the C++ package and
|
These enums are defined in slsDetectorDefs in the C++ package and
|
||||||
exposed to Python through pybind11.
|
exposed to Python through pybind11.
|
||||||
|
|
||||||
|
.. py:currentmodule:: sls_detector
|
||||||
::
|
|
||||||
|
|
||||||
# Most settings are represented as enums that can be
|
|
||||||
# explicitly imported
|
|
||||||
|
|
||||||
from slsdet import Detector, fileFormat
|
|
||||||
d = Detector()
|
|
||||||
d.fformat = fileFormat.BINARY
|
|
||||||
|
|
||||||
# Altough not recommended for convenience all enums
|
|
||||||
# and some other things can be impored using *
|
|
||||||
|
|
||||||
from slsdet import *
|
|
||||||
d.speed = speedLevel.FULL_SPEED
|
|
||||||
|
|
||||||
# To list the available enums, use dir()
|
|
||||||
|
|
||||||
import slsdet.enums
|
|
||||||
for enum in dir(slsdet.enums):
|
|
||||||
# filter out special memebers
|
|
||||||
if not enum.startswith('_'):
|
|
||||||
print(enum)
|
|
||||||
|
|
||||||
|
|
||||||
.. py:currentmodule:: slsdet
|
|
||||||
|
|
||||||
.. autoclass:: runStatus
|
.. autoclass:: runStatus
|
||||||
|
:members:
|
||||||
:undoc-members:
|
:undoc-members:
|
||||||
|
:show-inheritance:
|
||||||
.. autoclass:: detectorType
|
|
||||||
:undoc-members:
|
|
||||||
|
|
||||||
.. autoclass:: frameDiscardPolicy
|
|
||||||
:undoc-members:
|
|
||||||
|
|
||||||
.. autoclass:: fileFormat
|
|
||||||
:undoc-members:
|
|
||||||
|
|
||||||
.. autoclass:: dimension
|
|
||||||
:undoc-members:
|
|
||||||
|
|
||||||
.. autoclass:: externalSignalFlag
|
|
||||||
:undoc-members:
|
|
||||||
|
|
||||||
.. autoclass:: timingMode
|
|
||||||
:undoc-members:
|
|
||||||
|
|
||||||
.. autoclass:: dacIndex
|
|
||||||
:undoc-members:
|
|
||||||
|
|
||||||
.. autoclass:: detectorSettings
|
|
||||||
:undoc-members:
|
|
||||||
|
|
||||||
.. autoclass:: clockIndex
|
|
||||||
:undoc-members:
|
|
||||||
|
|
||||||
.. autoclass:: speedLevel
|
|
||||||
:undoc-members:
|
|
||||||
|
|
||||||
.. autoclass:: readoutMode
|
|
||||||
:undoc-members:
|
|
||||||
|
|
||||||
.. autoclass:: burstMode
|
|
||||||
:undoc-members:
|
|
||||||
|
|
||||||
.. autoclass:: timingSourceType
|
|
||||||
:undoc-members:
|
|
||||||
|
|
||||||
.. autoclass:: M3_GainCaps
|
|
||||||
:undoc-members:
|
|
||||||
|
|
||||||
.. autoclass:: portPosition
|
|
||||||
:undoc-members:
|
|
||||||
|
|
||||||
.. autoclass:: streamingInterface
|
|
||||||
:undoc-members:
|
|
||||||
|
|
||||||
.. autoclass:: vetoAlgorithm
|
|
||||||
:undoc-members:
|
|
||||||
|
|
||||||
.. autoclass:: gainMode
|
|
||||||
:undoc-members:
|
|
||||||
|
@ -1,92 +1,7 @@
|
|||||||
Examples
|
Examples
|
||||||
================
|
================
|
||||||
|
|
||||||
Some short examples on how to use slsdet. If something is missing don't hesitate to
|
Some short hints on how to use the detector
|
||||||
open an issue in our our `github repo
|
|
||||||
<https://github.com/slsdetectorgroup/slsDetectorPackage>`_.
|
|
||||||
|
|
||||||
|
|
||||||
------------------------------------
|
|
||||||
Setting exposure time
|
|
||||||
------------------------------------
|
|
||||||
|
|
||||||
Setting and reading back exposure time can be done either using a Python
|
|
||||||
datetime.timedelta, DurationWrapper or by setting the time in seconds.
|
|
||||||
|
|
||||||
::
|
|
||||||
|
|
||||||
# Set exposure time to 1.2 seconds
|
|
||||||
>>> d.exptime = 1.2
|
|
||||||
>>> d.exptime = 5e-07
|
|
||||||
|
|
||||||
# Setting exposure time using timedelta (upto microseconds precision)
|
|
||||||
import datetime as dt
|
|
||||||
>>> d.exptime = dt.timedelta(seconds = 1.2)
|
|
||||||
>>> d.exptime = dt.timedelta(seconds = 1, microseconds = 3)
|
|
||||||
|
|
||||||
# With timedelta any arbitrary combination of units can be used
|
|
||||||
>>> t = dt.timedelta(microseconds = 100, seconds = 5.3, minutes = .3)
|
|
||||||
|
|
||||||
# using DurationWrapper to set in seconds
|
|
||||||
>>> from slsdet import DurationWrapper
|
|
||||||
>>> d.exptime = DurationWrapper(1.2)
|
|
||||||
|
|
||||||
# using DurationWrapper to set in ns
|
|
||||||
>>> t = DurationWrapper()
|
|
||||||
>>> t.set_count(500)
|
|
||||||
>>> d.exptime = t
|
|
||||||
|
|
||||||
# To set exposure time for individual detector one have to resort
|
|
||||||
# to the C++ style API.
|
|
||||||
# Sets exposure time to 1.2 seconds for module 0, 6 and 12
|
|
||||||
>>> d.setExptime(1.2, [0, 6, 12])
|
|
||||||
>>> d.setExptime(dt.timedelta(seconds = 1.2), [0, 6, 12])
|
|
||||||
|
|
||||||
# to get in seconds
|
|
||||||
>>> d.period
|
|
||||||
181.23
|
|
||||||
|
|
||||||
# to get in DurationWrapper
|
|
||||||
>>> d.getExptime()
|
|
||||||
[sls::DurationWrapper(total_seconds: 181.23 count: 181230000000)]
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
------------------------------------
|
|
||||||
Converting numbers to hex
|
|
||||||
------------------------------------
|
|
||||||
|
|
||||||
Python support entering numbers in format by using the 0x prefix. However, when reading
|
|
||||||
back you will get a normal integer. This can then be converted to a hex string representation
|
|
||||||
using the built in hex() function.
|
|
||||||
|
|
||||||
.. code-block :: python
|
|
||||||
|
|
||||||
from slsdet import Detector
|
|
||||||
>>> d = Detector()
|
|
||||||
>>> d.patwait0 = 0xaa
|
|
||||||
>>> d.patwait0
|
|
||||||
170
|
|
||||||
|
|
||||||
# Convert to string
|
|
||||||
>>> hex(d.patwait0)
|
|
||||||
'0xaa'
|
|
||||||
|
|
||||||
For multiple values one can use a list comprehension to loop over the values.
|
|
||||||
|
|
||||||
.. code-block :: python
|
|
||||||
|
|
||||||
>>> values = [1,2,3,4,5]
|
|
||||||
>>> [(v) for v in values]
|
|
||||||
['0x1', '0x2', '0x3', '0x4', '0x5']
|
|
||||||
|
|
||||||
# or to a single string by passing the list to .join
|
|
||||||
>>> ', '.join([hex(v) for v in values])
|
|
||||||
'0x1, 0x2, 0x3, 0x4, 0x5'
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
------------------------
|
------------------------
|
||||||
Simple threshold scan
|
Simple threshold scan
|
||||||
@ -159,39 +74,37 @@ But lets start looking at the at the manual way:
|
|||||||
::
|
::
|
||||||
|
|
||||||
import time
|
import time
|
||||||
from slsdet import Detector, runStatus
|
from sls_detector import Eiger
|
||||||
|
d = Eiger()
|
||||||
|
|
||||||
|
n = 10
|
||||||
|
t = 1
|
||||||
|
|
||||||
n_frames = 10
|
d.exposure_time = t
|
||||||
t_exp = 1
|
d.n_frames = n
|
||||||
|
d.reset_frames_caught()
|
||||||
|
|
||||||
# Set exposure time and number of frames
|
#Start the measurement
|
||||||
d = Detector()
|
|
||||||
d.exptime = t_exp
|
|
||||||
d.frames = n_frames
|
|
||||||
|
|
||||||
# Start the measurement
|
|
||||||
t0 = time.time()
|
t0 = time.time()
|
||||||
d.startDetector()
|
d.start_receiver()
|
||||||
d.startReceiver()
|
d.start_detector()
|
||||||
|
|
||||||
# Wait for the detector to be ready or do other important stuff
|
#Wait for the detector to be ready or do other important stuff
|
||||||
time.sleep(t_exp * n_frames)
|
time.sleep(t*n)
|
||||||
|
|
||||||
# check if the detector is ready otherwise wait a bit longer
|
#check if the detector is ready otherwise wait a bit longer
|
||||||
while d.status != runStatus.IDLE:
|
while d.status != 'idle':
|
||||||
time.sleep(0.1)
|
time.sleep(0.1)
|
||||||
|
|
||||||
# Stop the receiver after we got the frames
|
#Stop the receiver after we got the frames
|
||||||
# Detector is already idle so we don't need to stop it
|
#Detector is already idle so we don't need to stop it
|
||||||
d.stopReceiver()
|
d.stop_receiver()
|
||||||
|
|
||||||
lost = d.rx_framescaught - n_frames
|
|
||||||
print(
|
|
||||||
f"{n_frames} frames of {t_exp}s took {time.time()-t0:{.3}}s with {lost} frames lost "
|
|
||||||
)
|
|
||||||
|
|
||||||
|
lost = d.frames_caught - n
|
||||||
|
print(f'{n} frames of {t}s took {time.time()-t0:{.3}}s with {lost} frames lost ')
|
||||||
|
|
||||||
|
#Reset to not interfere with a potential next measurement
|
||||||
|
d.reset_frames_caught()
|
||||||
|
|
||||||
Instead launching d.acq() from a different process is a bit easier since the control of receiver and detector
|
Instead launching d.acq() from a different process is a bit easier since the control of receiver and detector
|
||||||
is handled in the acq call. However, you need to join the process used otherwise a lot of zombie processes would
|
is handled in the acq call. However, you need to join the process used otherwise a lot of zombie processes would
|
||||||
@ -201,113 +114,30 @@ hang around until the main process exits.
|
|||||||
|
|
||||||
import time
|
import time
|
||||||
from multiprocessing import Process
|
from multiprocessing import Process
|
||||||
from slsdet import Detector, runStatus
|
from sls_detector import Eiger
|
||||||
|
|
||||||
|
def acquire():
|
||||||
|
"""
|
||||||
|
Create a new Eiger object that still referes to the same actual detector
|
||||||
|
and same shared memory. Then launch acq.
|
||||||
|
"""
|
||||||
|
detector = Eiger()
|
||||||
|
detector.acq()
|
||||||
|
|
||||||
d = Detector()
|
#This is the detector we use throughout the session
|
||||||
|
d = Eiger()
|
||||||
|
|
||||||
#Create a separate process to run acquire in
|
#Process to run acquire
|
||||||
p = Process(target=d.acquire)
|
p = Process(target=acquire)
|
||||||
|
|
||||||
#Start the thread and short sleep to allow the acq to start
|
#Start the thread and short sleep to allow the acq to start
|
||||||
p.start()
|
p.start()
|
||||||
time.sleep(0.01)
|
time.sleep(0.01)
|
||||||
|
|
||||||
#Do some other work
|
#Do some other work
|
||||||
while d.status != runStatus.IDLE:
|
while d.busy is True:
|
||||||
print("Working")
|
print(d.busy)
|
||||||
time.sleep(0.1)
|
time.sleep(0.1)
|
||||||
|
|
||||||
#Join the process
|
#Join the process
|
||||||
p.join()
|
p.join()
|
||||||
|
|
||||||
|
|
||||||
------------------------------
|
|
||||||
Setting and getting times
|
|
||||||
------------------------------
|
|
||||||
|
|
||||||
::
|
|
||||||
|
|
||||||
import datetime as dt
|
|
||||||
from slsdet import Detector
|
|
||||||
from slsdet.utils import element_if_equal
|
|
||||||
|
|
||||||
d = Detector()
|
|
||||||
|
|
||||||
# The simplest way is to set the exposure time in
|
|
||||||
# seconds by using the exptime property
|
|
||||||
# This sets the exposure time for all modules
|
|
||||||
d.exptime = 0.5
|
|
||||||
|
|
||||||
# exptime also accepts a python datetime.timedelta (upto microseconds resolution)
|
|
||||||
t = dt.timedelta(milliseconds = 2.3)
|
|
||||||
d.exptime = t
|
|
||||||
|
|
||||||
# or combination of units
|
|
||||||
t = dt.timedelta(minutes = 3, seconds = 1.23)
|
|
||||||
d.exptime = t
|
|
||||||
|
|
||||||
# using DurationWrapper to set in seconds
|
|
||||||
>>> from slsdet import DurationWrapper
|
|
||||||
>>> d.exptime = DurationWrapper(1.2)
|
|
||||||
|
|
||||||
# using DurationWrapper to set in ns
|
|
||||||
>>> t = DurationWrapper()
|
|
||||||
>>> t.set_count(500)
|
|
||||||
>>> d.exptime = t
|
|
||||||
|
|
||||||
# exptime however always returns the time in seconds
|
|
||||||
>>> d.exptime
|
|
||||||
181.23
|
|
||||||
|
|
||||||
# To get back the exposure time for each module
|
|
||||||
# it's possible to use getExptime, this also returns
|
|
||||||
# the values as DurationWrapper
|
|
||||||
|
|
||||||
>>> d.getExptime()
|
|
||||||
[sls::DurationWrapper(total_seconds: 181.23 count: 181230000000)]
|
|
||||||
|
|
||||||
# In case the values are the same it's possible to use the
|
|
||||||
# element_if_equal function to reduce the values to a single
|
|
||||||
# value
|
|
||||||
|
|
||||||
>>> t = d.getExptime()
|
|
||||||
>>> element_if_equal(t)
|
|
||||||
sls::DurationWrapper(total_seconds: 1.2 count: 1200000000)
|
|
||||||
|
|
||||||
|
|
||||||
--------------
|
|
||||||
Reading dacs
|
|
||||||
--------------
|
|
||||||
|
|
||||||
::
|
|
||||||
|
|
||||||
from slsdet import Detector, Eiger, dacIndex
|
|
||||||
|
|
||||||
#using the specialized class
|
|
||||||
e = Eiger()
|
|
||||||
>>> e.dacs
|
|
||||||
========== DACS =========
|
|
||||||
vsvp : 0 0
|
|
||||||
vtrim : 2480 2480
|
|
||||||
vrpreamp : 3300 3300
|
|
||||||
vrshaper : 1400 1400
|
|
||||||
vsvn : 4000 4000
|
|
||||||
vtgstv : 2556 2556
|
|
||||||
vcmp_ll : 1000 1000
|
|
||||||
vcmp_lr : 1000 1000
|
|
||||||
vcal : 0 0
|
|
||||||
vcmp_rl : 1000 1000
|
|
||||||
rxb_rb : 1100 1100
|
|
||||||
rxb_lb : 1100 1100
|
|
||||||
vcmp_rr : 1000 1000
|
|
||||||
vcp : 1000 1000
|
|
||||||
vcn : 2000 2000
|
|
||||||
vishaper : 1550 1550
|
|
||||||
iodelay : 650 650
|
|
||||||
|
|
||||||
# or using the general class and the list
|
|
||||||
d = Detector()
|
|
||||||
for dac in d.daclist:
|
|
||||||
r = d.getDAC(dac, False)
|
|
||||||
print(f'{dac.name:10s} {r}')
|
|
||||||
|
@ -1,260 +0,0 @@
|
|||||||
Getting Started
|
|
||||||
==================
|
|
||||||
|
|
||||||
|
|
||||||
--------------------
|
|
||||||
Which Python?
|
|
||||||
--------------------
|
|
||||||
|
|
||||||
We require at least Python 3.8 and strongly recommended that you don't use the system
|
|
||||||
Python installation. The examples in this documentation uses `conda
|
|
||||||
<https://docs.conda.io/en/latest/miniconda.html>`_ since it provides good support
|
|
||||||
also for non Python packages but there are also other alternatives like, pyenv.
|
|
||||||
|
|
||||||
Using something like conda also allows you to quickly switch beteen different Python
|
|
||||||
environments.
|
|
||||||
|
|
||||||
---------------------
|
|
||||||
Building from Source
|
|
||||||
---------------------
|
|
||||||
|
|
||||||
If you are not installing slsdet binaries from conda, but instead building from
|
|
||||||
source, please refer to :ref:`the installation section<Installation>` for details.
|
|
||||||
|
|
||||||
Don't forget to compile with the option SLS_USE_PYTHON=ON to enable the Python
|
|
||||||
bindings or if you use the cmk.sh script -p.
|
|
||||||
|
|
||||||
.. note ::
|
|
||||||
|
|
||||||
Ensure that the sls det python lib compiled is for the expected python version.
|
|
||||||
For example, build/bin/_slsdet.cpython-39-x86_64-linux-gnu.so for Python v3.9.x
|
|
||||||
|
|
||||||
|
|
||||||
---------------------
|
|
||||||
PYTHONPATH
|
|
||||||
---------------------
|
|
||||||
|
|
||||||
If you install slsdet binaries using conda everything is set up and you can
|
|
||||||
directly start using the Python bindings. However, if you build
|
|
||||||
from source you need to tell Python where to find slsdet to use it. This
|
|
||||||
can be done by adding your build/bin directory to PYTHONPATH.
|
|
||||||
|
|
||||||
.. code-block:: bash
|
|
||||||
|
|
||||||
export PYTHONPATH = /path/to/your/build/bin:$PYTHONPATH
|
|
||||||
|
|
||||||
--------------------------------------
|
|
||||||
Which detector class should I use?
|
|
||||||
--------------------------------------
|
|
||||||
|
|
||||||
We provide a generic class called Detector and detector specific
|
|
||||||
versions like, Eiger, Jungfrau etc. The most or all functionality
|
|
||||||
is there in the base class except the convenient access to dacs
|
|
||||||
and temperatures.
|
|
||||||
|
|
||||||
::
|
|
||||||
|
|
||||||
from slsdet import Detector, Eiger
|
|
||||||
|
|
||||||
d = Detector()
|
|
||||||
e = Eiger()
|
|
||||||
|
|
||||||
# Both classes can be used to control an Eiger detector
|
|
||||||
d.exptime = 0.5
|
|
||||||
e.period = 1
|
|
||||||
|
|
||||||
# But Eiger gives a simpler interface to the dacs
|
|
||||||
>>> e.dacs
|
|
||||||
========== DACS =========
|
|
||||||
vsvp : 0
|
|
||||||
vtrim : 2480
|
|
||||||
vrpreamp : 3300
|
|
||||||
vrshaper : 1400
|
|
||||||
vsvn : 4000
|
|
||||||
vtgstv : 2556
|
|
||||||
vcmp_ll : 1000
|
|
||||||
vcmp_lr : 1000
|
|
||||||
vcal : 0
|
|
||||||
vcmp_rl : 1000
|
|
||||||
rxb_rb : 1100
|
|
||||||
rxb_lb : 1100
|
|
||||||
vcmp_rr : 1000
|
|
||||||
vcp : 1000
|
|
||||||
vcn : 2000
|
|
||||||
vishaper : 1550
|
|
||||||
iodelay : 650
|
|
||||||
|
|
||||||
|
|
||||||
.. note ::
|
|
||||||
|
|
||||||
Depending on user feedback we might move some detector specific
|
|
||||||
functionality to the specialized classes.
|
|
||||||
|
|
||||||
|
|
||||||
----------------------------------
|
|
||||||
Hey, there seems to be two APIs?
|
|
||||||
----------------------------------
|
|
||||||
|
|
||||||
To make the Python API approachable, both if you come from the command line
|
|
||||||
or are using the C++ API, we provide two interfaces to the detector.
|
|
||||||
One is property based and tries to stay as close to the command line syntax
|
|
||||||
as is possible, and the other one directly maps the C++ API found in Detector.h.
|
|
||||||
There is also an underlying design reason for the two APIs since we auto
|
|
||||||
generate the bindings to the C++ code using a mix of pybind11 and clang-tools.
|
|
||||||
The property based API covers most of the functionality but in some cases
|
|
||||||
you have to reach for the C++ like interface.
|
|
||||||
|
|
||||||
|
|
||||||
::
|
|
||||||
|
|
||||||
d = Detector()
|
|
||||||
|
|
||||||
# C++ like API
|
|
||||||
d.setExptime(0.1)
|
|
||||||
|
|
||||||
# or a bit more pythonic
|
|
||||||
d.exptime = 0.1
|
|
||||||
|
|
||||||
The c++ style API offers more control over access to individual modules
|
|
||||||
in a large detector.
|
|
||||||
|
|
||||||
::
|
|
||||||
|
|
||||||
# Set exposure time for module 1, 5 and 7
|
|
||||||
d.setExptime(0.1, [1,5,7])
|
|
||||||
|
|
||||||
--------------------
|
|
||||||
Finding functions
|
|
||||||
--------------------
|
|
||||||
|
|
||||||
To find out which properties and methods that a Python object have you
|
|
||||||
can use dir()
|
|
||||||
|
|
||||||
::
|
|
||||||
|
|
||||||
>>> from slsdet import Detector
|
|
||||||
>>> d = Detector()
|
|
||||||
>>> dir(d)
|
|
||||||
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__',
|
|
||||||
'__eq__', '__format__', '__ge__', '__getattribute__', '__gt__',
|
|
||||||
'__hash__', '__init__', '__init_subclass__', '__le__', '__len__',
|
|
||||||
'__lt__', '__module__', '__ne__', '__new__', '__reduce__',
|
|
||||||
'__reduce_ex__', '__repr__', '__setattr__', '__sizeof__',
|
|
||||||
'__str__', '__subclasshook__', '_adc_register', '_frozen',
|
|
||||||
'_register', 'acquire', 'adcclk', 'adcphase', 'adcpipeline',
|
|
||||||
'adcreg', 'asamples', 'auto_comp_disable', 'clearAcquiringFlag',
|
|
||||||
'clearBit', 'clearROI', 'client_version', 'config',
|
|
||||||
'counters', 'daclist', 'dacvalues', 'dbitclk', 'dbitphase' ...
|
|
||||||
|
|
||||||
Since the list for Detector is rather long it's an good idea to filter it.
|
|
||||||
The following example gives you properties and methods containing time in
|
|
||||||
their name.
|
|
||||||
|
|
||||||
::
|
|
||||||
|
|
||||||
>>> [item for item in dir(d) if 'time' in item]
|
|
||||||
['compdisabletime', 'exptime', 'exptimel', 'frametime', 'getExptime',
|
|
||||||
'getExptimeForAllGates', 'getExptimeLeft', 'getSubExptime', 'patwaittime',
|
|
||||||
'patwaittime0', 'patwaittime1', 'patwaittime2', 'runtime', 'setExptime',
|
|
||||||
'setSubExptime', 'subdeadtime', 'subexptime']
|
|
||||||
|
|
||||||
|
|
||||||
The above method works on any Python object but for convenience we also
|
|
||||||
included two functions to find names. View prints the names one per line
|
|
||||||
while find returns a list of names.
|
|
||||||
|
|
||||||
::
|
|
||||||
|
|
||||||
from slsdet.lookup import view, find
|
|
||||||
|
|
||||||
>>> view('exptime')
|
|
||||||
exptime
|
|
||||||
exptimel
|
|
||||||
getExptime
|
|
||||||
getExptimeForAllGates
|
|
||||||
getExptimeLeft
|
|
||||||
getSubExptime
|
|
||||||
setExptime
|
|
||||||
setSubExptime
|
|
||||||
subexptime
|
|
||||||
|
|
||||||
|
|
||||||
>>> find('exptime')
|
|
||||||
['exptime', 'getExptime', 'getExptimeForAllGates', 'getExptimeLeft',
|
|
||||||
'getSubExptime', 'setExptime', 'setSubExptime', 'subexptime']
|
|
||||||
|
|
||||||
|
|
||||||
------------------------------------
|
|
||||||
Finding out what the function does
|
|
||||||
------------------------------------
|
|
||||||
|
|
||||||
To access the documentation of a function directly from the Python prompt use help().
|
|
||||||
|
|
||||||
.. code-block :: python
|
|
||||||
|
|
||||||
>>> help(Detector.period)
|
|
||||||
Help on property:
|
|
||||||
|
|
||||||
Period between frames, accepts either a value in seconds or datetime.timedelta
|
|
||||||
|
|
||||||
Note
|
|
||||||
-----
|
|
||||||
:getter: always returns in seconds. To get in DurationWrapper, use getPeriod
|
|
||||||
|
|
||||||
Example
|
|
||||||
-----------
|
|
||||||
>>> # setting directly in seconds
|
|
||||||
>>> d.period = 1.05
|
|
||||||
>>>
|
|
||||||
>>> # setting directly in seconds
|
|
||||||
>>> d.period = 5e-07
|
|
||||||
>>>
|
|
||||||
>>> # using timedelta (up to microseconds precision)
|
|
||||||
>>> from datatime import timedelta
|
|
||||||
>>> d.period = timedelta(seconds = 1, microseconds = 3)
|
|
||||||
>>>
|
|
||||||
>>> # using DurationWrapper to set in seconds
|
|
||||||
>>> from slsdet import DurationWrapper
|
|
||||||
>>> d.period = DurationWrapper(1.2)
|
|
||||||
>>>
|
|
||||||
>>> # using DurationWrapper to set in ns
|
|
||||||
>>> t = DurationWrapper()
|
|
||||||
>>> t.set_count(500)
|
|
||||||
>>> d.period = t
|
|
||||||
>>>
|
|
||||||
>>> # to get in seconds
|
|
||||||
>>> d.period
|
|
||||||
181.23
|
|
||||||
>>>
|
|
||||||
>>> d.getExptime()
|
|
||||||
[sls::DurationWrapper(total_seconds: 181.23 count: 181230000000)]
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
----------------------
|
|
||||||
Where are the ENUMs?
|
|
||||||
----------------------
|
|
||||||
|
|
||||||
To set some of the detector settings like file format you have
|
|
||||||
to pass in an enum.
|
|
||||||
|
|
||||||
::
|
|
||||||
|
|
||||||
>>> d.setFileFormat(fileFormat.BINARY)
|
|
||||||
|
|
||||||
The enums can be found in slsdet.enums
|
|
||||||
|
|
||||||
::
|
|
||||||
|
|
||||||
import slsdet
|
|
||||||
>>> [e for e in dir(slsdet.enums) if not e.startswith('_')]
|
|
||||||
['M3_GainCaps', 'burstMode', 'clockIndex', 'cls', 'dacIndex', 'detectorSettings',
|
|
||||||
'detectorType', 'dimension', 'externalSignalFlag', 'fileFormat',
|
|
||||||
'frameDiscardPolicy', 'gainMode', 'name', 'polarity', 'portPosition',
|
|
||||||
'readoutMode', 'runStatus', 'speedLevel', 'streamingInterface', 'timingMode',
|
|
||||||
'timingSourceType', 'vetoAlgorithm']
|
|
||||||
|
|
||||||
|
|
||||||
# Even though importing using * is not recommended one could
|
|
||||||
# get all the enums like this:
|
|
||||||
>>> from slsdet.enums import *
|
|
@ -1,150 +0,0 @@
|
|||||||
Quick Start Guide
|
|
||||||
=================
|
|
||||||
|
|
||||||
Detector
|
|
||||||
--------
|
|
||||||
Start up detector (with cooling if required). Ensure both control server and stop server is running on-board.
|
|
||||||
|
|
||||||
Or use a detector simulator to test. Click :ref:`here<Virtual Detector Servers>` for further instructions.
|
|
||||||
|
|
||||||
Receiver
|
|
||||||
--------
|
|
||||||
|
|
||||||
| One has to start the slsReceiver before loading config file or using any receiver commands (prefix: **rx_** )
|
|
||||||
|
|
||||||
For a Single Module
|
|
||||||
.. code-block:: bash
|
|
||||||
|
|
||||||
# default port 1954
|
|
||||||
slsReceiver
|
|
||||||
|
|
||||||
# custom port 2012
|
|
||||||
slsReceiver -t2012
|
|
||||||
|
|
||||||
|
|
||||||
For Multiple Modules
|
|
||||||
.. code-block:: bash
|
|
||||||
|
|
||||||
# slsMultiReceiver [starting port] [number of receivers] [print each frame header for debugging]
|
|
||||||
slsMultiReceiver 2012 2 0
|
|
||||||
|
|
||||||
|
|
||||||
Client
|
|
||||||
------
|
|
||||||
|
|
||||||
Refer :ref:`Sample Config file` to create config file.
|
|
||||||
|
|
||||||
.. code-block:: bash
|
|
||||||
|
|
||||||
# load config file
|
|
||||||
sls_detector_put config /path/sample.config
|
|
||||||
|
|
||||||
# set number of frames
|
|
||||||
sls_detector_put frames 5
|
|
||||||
|
|
||||||
# acquire
|
|
||||||
sls_detector_acquire
|
|
||||||
|
|
||||||
|
|
||||||
.. _Sample Config file:
|
|
||||||
|
|
||||||
Sample Config file
|
|
||||||
^^^^^^^^^^^^^^^^^^
|
|
||||||
There are sample config files for each detector in slsDetectorPackage/examples folder.
|
|
||||||
|
|
||||||
For a Single Module
|
|
||||||
.. code-block:: bash
|
|
||||||
|
|
||||||
# connects to module
|
|
||||||
hostname bchipxxx
|
|
||||||
|
|
||||||
# connects to receiver at default port
|
|
||||||
rx_hostname mpc1922
|
|
||||||
# or to connect to specific port
|
|
||||||
# rx_hostname mpc1922:2012
|
|
||||||
|
|
||||||
# sets destination udp ports (not needed, default is 50001)
|
|
||||||
udp_dstport 50012
|
|
||||||
|
|
||||||
# 1g data out
|
|
||||||
# source udp ips must be same subnet at destintaion udp ips
|
|
||||||
# udp_srcip 192.168.1.112
|
|
||||||
# destination udp ip picked up from rx_hostname (if auto)
|
|
||||||
# udp_dstip auto
|
|
||||||
|
|
||||||
# 10g data out
|
|
||||||
udp_srcip 10.30.20.200
|
|
||||||
udp_dstip 10.30.20.6
|
|
||||||
|
|
||||||
# set file path
|
|
||||||
fpath /tmp
|
|
||||||
|
|
||||||
For a Single Module with custom Receiver (not slsReceiver)
|
|
||||||
.. code-block:: bash
|
|
||||||
|
|
||||||
# connects to module
|
|
||||||
hostname bchipxxx
|
|
||||||
|
|
||||||
# sets destination udp ports (not needed, default is 50001)
|
|
||||||
udp_dstport 50012
|
|
||||||
|
|
||||||
# source udp ips must be same subnet at destintaion udp ips
|
|
||||||
udp_srcip 192.168.1.112
|
|
||||||
|
|
||||||
# destination udp ip
|
|
||||||
udp_dstip 192.168.1.100
|
|
||||||
|
|
||||||
# source udp mac
|
|
||||||
udp_srcmac aa:bb:cc:dd:ee:ff
|
|
||||||
|
|
||||||
# destination udp mac
|
|
||||||
udp_dstmac 3c:ab:98:bf:50:60
|
|
||||||
|
|
||||||
# set file path
|
|
||||||
fpath /tmp
|
|
||||||
|
|
||||||
For Multiple Modules
|
|
||||||
.. code-block:: bash
|
|
||||||
|
|
||||||
# connects to mulitple modules
|
|
||||||
hostname bchipxxx+bchipyyy+
|
|
||||||
|
|
||||||
# tcp port increases for each module (multi detector command)
|
|
||||||
rx_tcpport 2012
|
|
||||||
|
|
||||||
# connects to receivers at ports 2012 and 2014
|
|
||||||
rx_hostname mpc1922
|
|
||||||
|
|
||||||
# increasing udp ports (multi detector command)
|
|
||||||
udp_dstport 50012
|
|
||||||
|
|
||||||
# source udp ips must be same subnet at destintaion udp ips
|
|
||||||
0:udp_srcip 192.168.1.112
|
|
||||||
1:udp_srcip 192.168.1.114
|
|
||||||
|
|
||||||
# destination udp ip picked up from rx_hostname (if auto)
|
|
||||||
udp_dstip auto
|
|
||||||
|
|
||||||
# set file path
|
|
||||||
fpath /tmp
|
|
||||||
|
|
||||||
.. note ::
|
|
||||||
The **hostname** and **detsize** command in a multi module system can affect the row and column values in the udp/zmq header. The modules are stacked row by row until they reach the y-axis limit set by detsize (if specified). Then, stacking continues in the next column and so on.
|
|
||||||
|
|
||||||
|
|
||||||
Gui
|
|
||||||
----
|
|
||||||
|
|
||||||
Compile with SLS_USE_GUI=ON in cmake or -g option in cmk.sh script. One can also just use the conda binary. Refer :ref:`installation instructions<Installation>`.
|
|
||||||
|
|
||||||
.. code-block:: bash
|
|
||||||
|
|
||||||
slsDetectorGui
|
|
||||||
|
|
||||||
|
|
||||||
.. note ::
|
|
||||||
| The streaming high water mark (commmand: rx_zmqhwm) and the receiving high water mark (command: zmqhwm) is by default the lib zmq's default (currently 1000).
|
|
||||||
| At Gui startup, these values are set to 2. Hence, for very fast detectors, many frames will be dropped to be able to view the latest in the gui.
|
|
||||||
| One can still change this setting in the gui in the Plot tab (ZMQ Streaming), from the command line or API.
|
|
||||||
| Both hwm's can be set to a -1 to use the lib's default.
|
|
||||||
| Since the dummy end of acquisition packet streamed from receiver might also be lost, receiver restreams until gui acknowledges.
|
|
@ -1,6 +1,6 @@
|
|||||||
Receiver
|
Receiver
|
||||||
==============================================
|
==============================================
|
||||||
|
|
||||||
.. doxygenclass:: sls::Receiver
|
.. doxygenclass:: slsReceiver
|
||||||
:members:
|
:members:
|
||||||
.. :undoc-members:
|
.. :undoc-members:
|
@ -1,38 +0,0 @@
|
|||||||
Custom Receiver
|
|
||||||
=================
|
|
||||||
|
|
||||||
The receiver essentially listens to UDP data packets sent out by the detector.
|
|
||||||
|
|
||||||
To know more about detector receiver setup in the config file, please check out :ref:`the detector-receiver UDP configuration in the config file<detector udp header config>` and the :ref:`detector udp format<detector udp header>`.
|
|
||||||
|
|
||||||
|
|
||||||
| Please note the following when using a custom receiver:
|
|
||||||
|
|
||||||
* **udp_dstmac** must be configured in the config file. This parameter is not required when using an in-built receiver.
|
|
||||||
|
|
||||||
* Cannot use "auto" for **udp_dstip**.
|
|
||||||
|
|
||||||
* No **rx_** commands in the config file. These commands are for configuring the slsReceiver.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
The main difference is the lack of **rx_** commands or file commands (eg. **f**write, **f**path) and the **udp_dstmac** is required in config file.
|
|
||||||
|
|
||||||
Example of a custom receiver config file
|
|
||||||
|
|
||||||
.. code-block:: bash
|
|
||||||
|
|
||||||
# detector hostname
|
|
||||||
hostname bchip052
|
|
||||||
|
|
||||||
# udp destination port (receiver)
|
|
||||||
udp_dstport 50004
|
|
||||||
|
|
||||||
# udp destination ip (receiver)
|
|
||||||
udp_dstip 10.0.1.100
|
|
||||||
|
|
||||||
# udp source ip (same subnet as udp_dstip)
|
|
||||||
udp_srcip 10.0.1.184
|
|
||||||
|
|
||||||
# udp destination mac
|
|
||||||
udp_dstmac 22:47:d5:48:ad:ef
|
|
@ -1,5 +1,3 @@
|
|||||||
.. _Result Class:
|
|
||||||
|
|
||||||
Result
|
Result
|
||||||
==============================================
|
==============================================
|
||||||
|
|
||||||
|
@ -1,106 +0,0 @@
|
|||||||
Default Values
|
|
||||||
==============================================
|
|
||||||
|
|
||||||
Mythen3
|
|
||||||
-------------
|
|
||||||
|
|
||||||
.. csv-table:: Default values
|
|
||||||
:file: mythen3.csv
|
|
||||||
:widths: 35, 35
|
|
||||||
:header-rows: 1
|
|
||||||
|
|
||||||
DACS
|
|
||||||
^^^^^^^^^^^^^
|
|
||||||
|
|
||||||
.. csv-table:: Mythen3 DACS
|
|
||||||
:file: mythen3-dacs.csv
|
|
||||||
:widths: 35, 35
|
|
||||||
:header-rows: 1
|
|
||||||
|
|
||||||
Gotthard2
|
|
||||||
-------------
|
|
||||||
|
|
||||||
.. csv-table:: Default values
|
|
||||||
:file: gotthard2.csv
|
|
||||||
:widths: 35, 35
|
|
||||||
:header-rows: 1
|
|
||||||
|
|
||||||
DACS
|
|
||||||
^^^^^^^^^^^^^
|
|
||||||
|
|
||||||
.. csv-table:: Gotthard 2 DACS
|
|
||||||
:file: gotthard2-dacs.csv
|
|
||||||
:widths: 35, 35
|
|
||||||
:header-rows: 1
|
|
||||||
|
|
||||||
Moench
|
|
||||||
-------------
|
|
||||||
|
|
||||||
.. csv-table:: Default values
|
|
||||||
:file: moench.csv
|
|
||||||
:widths: 35, 35
|
|
||||||
:header-rows: 1
|
|
||||||
|
|
||||||
DACS
|
|
||||||
^^^^^^^^^^^^^
|
|
||||||
|
|
||||||
.. csv-table:: Moench DACS
|
|
||||||
:file: moench-dacs.csv
|
|
||||||
:widths: 35, 35
|
|
||||||
:header-rows: 1
|
|
||||||
|
|
||||||
Ctb
|
|
||||||
-------------
|
|
||||||
|
|
||||||
.. csv-table:: Default values
|
|
||||||
:file: ctb.csv
|
|
||||||
:widths: 35, 35
|
|
||||||
:header-rows: 1
|
|
||||||
|
|
||||||
Eiger
|
|
||||||
-------------
|
|
||||||
|
|
||||||
.. csv-table:: Default values
|
|
||||||
:file: eiger.csv
|
|
||||||
:widths: 35, 35
|
|
||||||
:header-rows: 1
|
|
||||||
|
|
||||||
DACS
|
|
||||||
^^^^^^^^^^^^^
|
|
||||||
|
|
||||||
.. csv-table:: Eiger DACS
|
|
||||||
:file: eiger-dacs.csv
|
|
||||||
:widths: 35, 35
|
|
||||||
:header-rows: 1
|
|
||||||
|
|
||||||
Jungfrau
|
|
||||||
-------------
|
|
||||||
|
|
||||||
.. csv-table:: Default values
|
|
||||||
:file: jungfrau.csv
|
|
||||||
:widths: 35, 35
|
|
||||||
:header-rows: 1
|
|
||||||
|
|
||||||
DACS
|
|
||||||
^^^^^^^^^^^^^
|
|
||||||
|
|
||||||
.. csv-table:: Jungfrau DACS
|
|
||||||
:file: jungfrau-dacs.csv
|
|
||||||
:widths: 35, 35
|
|
||||||
:header-rows: 1
|
|
||||||
|
|
||||||
Gotthard
|
|
||||||
-------------
|
|
||||||
|
|
||||||
.. csv-table:: Default values
|
|
||||||
:file: gotthard.csv
|
|
||||||
:widths: 35, 35
|
|
||||||
:header-rows: 1
|
|
||||||
|
|
||||||
DACS
|
|
||||||
^^^^^^^^^^^^^
|
|
||||||
|
|
||||||
.. csv-table:: Gotthard DACS
|
|
||||||
:file: gotthard-dacs.csv
|
|
||||||
:widths: 35, 35
|
|
||||||
:header-rows: 1
|
|
@ -1,99 +0,0 @@
|
|||||||
Getting Started
|
|
||||||
===============
|
|
||||||
|
|
||||||
Detector Servers include:
|
|
||||||
* Control server [default port: 1952]
|
|
||||||
* Almost all client communication.
|
|
||||||
* Stop server [default port: 1953]
|
|
||||||
* Client requests for detector status, stop acquisition, temperature, advanced read/write registers.
|
|
||||||
|
|
||||||
When using a blocking acquire command (sls_detector_acquire or Detector::acquire), the control server is blocked until end of acquisition. However, stop server commands could be used in parallel.
|
|
||||||
|
|
||||||
|
|
||||||
Location
|
|
||||||
---------
|
|
||||||
slsDetectorPackage/serverBin/ folder in every release.
|
|
||||||
|
|
||||||
|
|
||||||
.. _Detector Server Arguments:
|
|
||||||
|
|
||||||
Arguments
|
|
||||||
---------
|
|
||||||
|
|
||||||
.. code-block:: bash
|
|
||||||
|
|
||||||
Possible arguments are:
|
|
||||||
-v, --version : Software version
|
|
||||||
-p, --port <port> : TCP communication port with client.
|
|
||||||
-g, --nomodule : [Mythen3][Gotthard2]
|
|
||||||
Generic or No Module mode. Skips detector type checks.
|
|
||||||
-f, --phaseshift <value> : [Gotthard] only. Sets phase shift.
|
|
||||||
-d, --devel : Developer mode. Skips firmware checks.
|
|
||||||
-u, --update : Update mode. Skips firmware checks and initial detector setup.
|
|
||||||
-i, --ignore-config : [Eiger][Jungfrau][Gotthard][Gotthard2][Moench]
|
|
||||||
Ignore config file.
|
|
||||||
-m, --master <master> : [Eiger][Mythen3][Gotthard][Gotthard2]
|
|
||||||
Set Master to 0 or 1. Precedence over config file. Only for virtual servers except Eiger.
|
|
||||||
-t, --top <top> : [Eiger] Set Top to 0 or 1. Precedence over config file.
|
|
||||||
-s, --stopserver : Stop server. Do not use as it is created by control server
|
|
||||||
|
|
||||||
|
|
||||||
.. _Automatic start servers:
|
|
||||||
|
|
||||||
Automatic start
|
|
||||||
------------------
|
|
||||||
|
|
||||||
One can start the on-board detector server automatically upon powering on the board.
|
|
||||||
|
|
||||||
#. Create a soft link to the binary on board:
|
|
||||||
.. code-block:: bash
|
|
||||||
|
|
||||||
ln -sf someDetectorServervx.x.x someDetectorServer
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#. Do the following depending on the detector type :
|
|
||||||
|
|
||||||
Eiger
|
|
||||||
.. code-block:: bash
|
|
||||||
|
|
||||||
# create script in rc5.d on the board
|
|
||||||
vi /etc/rc5.d/S50board_com.sh
|
|
||||||
|
|
||||||
# enter the following (edit server name)
|
|
||||||
#! /bin/sh
|
|
||||||
/home/root/executables/eigerDetectorServer &> /dev/null &
|
|
||||||
exit 0
|
|
||||||
|
|
||||||
Jungfrau | Moench | CTB | Gotthard I
|
|
||||||
.. code-block:: bash
|
|
||||||
|
|
||||||
# Edit inittab on board
|
|
||||||
vi /etc/inittab
|
|
||||||
|
|
||||||
# enter the following line
|
|
||||||
ttyS0::respawn:/./xxxDetectorServer
|
|
||||||
|
|
||||||
|
|
||||||
Gotthard II | Mythen III
|
|
||||||
.. code-block:: bash
|
|
||||||
|
|
||||||
# create script in init.d on board
|
|
||||||
vi /etc/init.d/S99detServer.sh
|
|
||||||
|
|
||||||
# enter the following (edit server name)
|
|
||||||
#! /bin/sh
|
|
||||||
cd /root >> /dev/null
|
|
||||||
/root/xxxDetectorServer >> /dev/null &
|
|
||||||
|
|
||||||
|
|
||||||
#. Sync, reboot and verify:
|
|
||||||
.. code-block:: bash
|
|
||||||
|
|
||||||
sync
|
|
||||||
|
|
||||||
# physically reboot for Gotthard II or Mythen III
|
|
||||||
reboot
|
|
||||||
|
|
||||||
# verify
|
|
||||||
ps -ef | grep xxxDetectorServer
|
|
@ -1,67 +0,0 @@
|
|||||||
.. _Detector Server Upgrade:
|
|
||||||
|
|
||||||
Upgrade
|
|
||||||
========
|
|
||||||
|
|
||||||
|
|
||||||
**Location:** slsDetectorPackage/serverBin/ folder for every release.
|
|
||||||
|
|
||||||
.. note ::
|
|
||||||
|
|
||||||
For Mythen3, Gotthard2 and Eiger, you need to add scripts to automatically start detector server upon power on. See :ref:`Automatic start<Automatic start servers>` for more details.
|
|
||||||
|
|
||||||
.. note ::
|
|
||||||
|
|
||||||
Eiger requires a manual reboot. Or killall the servers and restart the new linked one. If you are in the process of updating firmware, then don't reboot yet.
|
|
||||||
|
|
||||||
|
|
||||||
6.1.1+ (no tftp required)
|
|
||||||
---------------------------------------
|
|
||||||
|
|
||||||
#. Program from console
|
|
||||||
|
|
||||||
.. code-block:: bash
|
|
||||||
|
|
||||||
# the following command copies new server, creates a soft link to xxxDetectorServerxxx
|
|
||||||
# [Jungfrau][CTB][Moench] also deletes the old server binary and edits initttab to respawn server on reboot
|
|
||||||
# Then, the detector controller will reboot (except Eiger)
|
|
||||||
sls_detector_put updatedetectorserver /complete-path-to-binary/xxxDetectorServerxxx
|
|
||||||
|
|
||||||
#. Copy the detector server specific config files or any others required to the detector:
|
|
||||||
|
|
||||||
.. code-block:: bash
|
|
||||||
|
|
||||||
sls_detector_put execcommand "tftp pcxxx -r configxxx -g"
|
|
||||||
|
|
||||||
5.0.0 - 6.1.1
|
|
||||||
--------------
|
|
||||||
|
|
||||||
#. Install tftp and copy detector server binary to tftp folder
|
|
||||||
#. Program from console
|
|
||||||
|
|
||||||
.. code-block:: bash
|
|
||||||
|
|
||||||
# the following command copies new server from pc tftp folder, creates a soft link to xxxDetectorServerxxx
|
|
||||||
# [Jungfrau][CTB][Moench] also edits initttab to respawn server on reboot
|
|
||||||
# Then, the detector controller will reboot (except Eiger)
|
|
||||||
sls_detector_put copydetectorserver xxxDetectorServerxxx pcxxx
|
|
||||||
|
|
||||||
#. Copy the detector server specific config files or any others required to the detector:
|
|
||||||
|
|
||||||
.. code-block:: bash
|
|
||||||
|
|
||||||
sls_detector_put execcommand "tftp pcxxx -r configxxx -g"
|
|
||||||
|
|
||||||
|
|
||||||
Troubleshooting with tftp
|
|
||||||
^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
||||||
|
|
||||||
#. tftp write error: There is no space left. Please delete some old binaries and try again.
|
|
||||||
|
|
||||||
#. text file busy: You are trying to copy the same server.
|
|
||||||
|
|
||||||
|
|
||||||
< 5.0.0
|
|
||||||
--------
|
|
||||||
|
|
||||||
Please contact us.
|
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user