mirror of
https://github.com/slsdetectorgroup/slsDetectorPackage.git
synced 2025-06-23 01:58:00 +02:00
Dev/pyctbgui merge (#960)
* added empty c extension * added rotation to the decoding * added color map, options and findex * minor * move checks to before acquisition * added pixel map based decoder * cleanup * no thread creation for single thread processing * added rotation and test to compare * allow high and low water mark for zmq (also buffer size) for fast readouts * removed roatation during decoding * added Transpose to image and invert Y False to invert it * retains the zoomed state after the first image of gui, catch and display exception if no detector connected * moved start frame to dockable widget, removed extra frame number label, moved current measurement also to dockable widget, hide frame plot entirely when showing patternviewer * first image dependin on which plot * remember settings of main window size and position, dockewidget if docked, its size and posisiotn as well, then update it next time the gui is opened * change in comment * using c decoder for moench 04 and matterhorn * catch exception from invalid image from decoder * clean up * update row and col when choosing image type, neeeded to show values * fix for previous PR * disable resetting colormap values keep the range selected for every new acquisition * fix typos + tested on virtual matterhorn * minor print * refactored Slow ADCs Tab * refactored DAC tab * refactored power supplies * refactored signals tab * refactored transceiver tab * fix typo * fix typo2 * remove commented code * delete commented code * delete commented code * delete commented signals code * remove commented code for transceiver tab * refactor adc tab * refactor Pattern Tab * Refactor transceivers tab (PR#5) (#118) * refactored transceiver tab * remove commented code for transceiver tab --------- Co-authored-by: Erik Frojdh <erik.frojdh@gmail.com> * refactor adc tab (PR#6) (#119) * refactor adc tab * refactored Plot and Acquisition Tabs * fix the regression issue * restructure project files * applying singleton and renaming tabs to services * working install using pip * applies singleton to tab classes and remove CI erros * added pyzmq and pillow * remove the singleton implementation and keep changes * fix merge errors in mainWindow * moved misplaced init file * rename service to tab * reorganize imports * iterate over tabs * reorder tabs * add slowadc to the list * saving changes (buggy) power supply ui not showing in the gui * split power supply tab * fixed tests * add hardcoded values to defines file * fix error * separate power supply * fix errors for powerSuppliesTab * split dacs * split slow adcs * split signals tab * added tests for bit_utils * add slowAdc class to defines * split transceiver ui file * split adc.ui * split pattern ui file * split plot and acquisition ui file * added basic test for parsing bit names * removed redundant code in read_alias_file * fix dacs ui position * testing for correct exception * cmd and args at split * group radio buttons * fix comments from PR#1 * show legend * added python version and dev requirements to setup.py * fix dac issue * moved _decoder into pkg * added inplace build * removed clear * fixed dependencies * make tests run without slsdet * updated name of action * define colcount * fixed loading of alias file * add yapf and ruff * apply formatting * fix E and F rules * add more ruff rules * change variable name * squashing gh debugging commits and add pre-commit * update label values to mv units * add hook for yapf * reconfigure yapf precommit hook * add format and check_format to makefile * change gh actions * update readme * added check_format * WIP * added linting in github action * updated readme] * add more control for color choice * remove useless file * fix un-updated line after refactoring Defines BIT0_31_MASK is not found in Defines.signals * visually improve the interface * fix last commit * add only selected plots for legend * add hide legend button * change hide legend to show legend checkbox show legend is checked by default * add support for saving in numpy * solve conversations * fix acq index offset * fix browse button in pattern error * fix other browse button errors * finish tests and add usage.md * remove buffer * add file,numpy-like interface and tests * remove useless .npy files * subscriptible npz files * remove useless files * remove repetetive tests * save changes * add mode r+, add with support,remove logging * remove offset of acqIndex between raw and numpy saving * fix only saving last frame * save signals of multiple devices * add comments and move condition for clearer code * fix bug when vieweing pattern file * iterate over enabled and plotted plots * add padestal substraction to transceiver and analog data * init pedestal frames to detector.frames * restore old exception * add pedestal substraction for digital signals * remove frames spinbox from plotTab * remove comments and use str instead of Path * avoid saving all frames * correct exception and log error's trace * add gui tests * add waveform test * add pedestal test * refactor by using fixtures * add tests for moench analog and pattern * add pytest-qt to dependencies * add save and load gui parameters * remove nohup file * fix old bug IndexError * save plot type * a * handle canceling load, loading matterhorn pedestal for moench * remove comparing .png files for pattern test * save plot type * red error on status bar when shape mismatch for loaded pedestal * fix makefile and docstrings * fix PRs conversation * move code into different function * fix wrong function names for power supply * removed old ctbgui * removed unnecessary files --------- Co-authored-by: Erik Frojdh <erik.frojdh@gmail.com> Co-authored-by: Braham Bechir <braham_b@pc11979.psi.ch> Co-authored-by: Bechir <bechir.braham@psi.ch> Co-authored-by: Bechir <bechir.brahem420@gmail.com>
This commit is contained in:
0
pyctbgui/tests/gui/__init__.py
Normal file
0
pyctbgui/tests/gui/__init__.py
Normal file
11
pyctbgui/tests/gui/conftest.py
Normal file
11
pyctbgui/tests/gui/conftest.py
Normal file
@ -0,0 +1,11 @@
|
||||
import pytest
|
||||
|
||||
from pyctbgui.ui import MainWindow
|
||||
|
||||
|
||||
@pytest.fixture(scope='package')
|
||||
def main():
|
||||
main = MainWindow()
|
||||
main.show()
|
||||
yield main
|
||||
main.close()
|
BIN
pyctbgui/tests/gui/data/matterhorm_image_transceiver.npy
Normal file
BIN
pyctbgui/tests/gui/data/matterhorm_image_transceiver.npy
Normal file
Binary file not shown.
BIN
pyctbgui/tests/gui/data/matterhorn_waveform_transceiver1and2.npz
Normal file
BIN
pyctbgui/tests/gui/data/matterhorn_waveform_transceiver1and2.npz
Normal file
Binary file not shown.
BIN
pyctbgui/tests/gui/data/moench04_image_analog.npy
Normal file
BIN
pyctbgui/tests/gui/data/moench04_image_analog.npy
Normal file
Binary file not shown.
BIN
pyctbgui/tests/gui/data/moench04_waveform_adc.npz
Normal file
BIN
pyctbgui/tests/gui/data/moench04_waveform_adc.npz
Normal file
Binary file not shown.
232
pyctbgui/tests/gui/data/pattern.pat
Normal file
232
pyctbgui/tests/gui/data/pattern.pat
Normal file
@ -0,0 +1,232 @@
|
||||
patword 0x0000 0x000000006b2e8001
|
||||
patword 0x0001 0x000000006b2e8001
|
||||
patword 0x0002 0x000000006b2e8001
|
||||
patword 0x0003 0x000000006b2e8001
|
||||
patword 0x0004 0x000000006b2e8001
|
||||
patword 0x0005 0x000000006b2e8001
|
||||
patword 0x0006 0x000000006b2e8001
|
||||
patword 0x0007 0x000000006b2e8001
|
||||
patword 0x0008 0x000000006b2e8001
|
||||
patword 0x0009 0x000000006b2e8001
|
||||
patword 0x000a 0x000000006b2e8001
|
||||
patword 0x000b 0x000000006b2e8001
|
||||
patword 0x000c 0x00000000692e8001
|
||||
patword 0x000d 0x00000000692e8001
|
||||
patword 0x000e 0x00000000692e8001
|
||||
patword 0x000f 0x00000000692e8001
|
||||
patword 0x0010 0x00000000692e8001
|
||||
patword 0x0011 0x00000000692e8001
|
||||
patword 0x0012 0x00000000692e8001
|
||||
patword 0x0013 0x00000000692e8001
|
||||
patword 0x0014 0x00000000692e8001
|
||||
patword 0x0015 0x00000000692e8001
|
||||
patword 0x0016 0x00000000682e8001
|
||||
patword 0x0017 0x00000000682e8001
|
||||
patword 0x0018 0x00000000682e8001
|
||||
patword 0x0019 0x00000000682e8001
|
||||
patword 0x001a 0x00000000482c8001
|
||||
patword 0x001b 0x00000000482c8001
|
||||
patword 0x001c 0x00000000482c8001
|
||||
patword 0x001d 0x00000000482c8001
|
||||
patword 0x001e 0x00000000482c8001
|
||||
patword 0x001f 0x00000000482c8001
|
||||
patword 0x0020 0x00000000482c8001
|
||||
patword 0x0021 0x00000000482c8001
|
||||
patword 0x0022 0x00000000482c8001
|
||||
patword 0x0023 0x00000000482c8001
|
||||
patword 0x0024 0x00000000482c8001
|
||||
patword 0x0025 0x00000000482c8001
|
||||
patword 0x0026 0x00000000482c8001
|
||||
patword 0x0027 0x00000000482c8001
|
||||
patword 0x0028 0x00000000482c8001
|
||||
patword 0x0029 0x00000000482c8001
|
||||
patword 0x002a 0x00000000482c8001
|
||||
patword 0x002b 0x00000000482c8001
|
||||
patword 0x002c 0x00000000482c8001
|
||||
patword 0x002d 0x00000000482c8001
|
||||
patword 0x002e 0x00000000582c8001
|
||||
patword 0x002f 0x00000000582c8001
|
||||
patword 0x0030 0x00000000582c8001
|
||||
patword 0x0031 0x00000000582c8001
|
||||
patword 0x0032 0x00000000582c8001
|
||||
patword 0x0033 0x00000000582c8001
|
||||
patword 0x0034 0x00000000582c8001
|
||||
patword 0x0035 0x00000000582c8001
|
||||
patword 0x0036 0x00000000582c8001
|
||||
patword 0x0037 0x00000000582c8001
|
||||
patword 0x0038 0x00000000582c8001
|
||||
patword 0x0039 0x00000000582c8001
|
||||
patword 0x003a 0x00000000582c8001
|
||||
patword 0x003b 0x00000000582c8001
|
||||
patword 0x003c 0x00000000582c8001
|
||||
patword 0x003d 0x00000000582c8001
|
||||
patword 0x003e 0x00000000582c8001
|
||||
patword 0x003f 0x00000000582c8001
|
||||
patword 0x0040 0x00000000582c8001
|
||||
patword 0x0041 0x00000000582c8001
|
||||
patword 0x0042 0x00000000582c9011
|
||||
patword 0x0043 0x00000000582c9011
|
||||
patword 0x0044 0x00000000582c8001
|
||||
patword 0x0045 0x00000000582c8001
|
||||
patword 0x0046 0x00000000582c8001
|
||||
patword 0x0047 0x00000000582c8001
|
||||
patword 0x0048 0x00000000582c8001
|
||||
patword 0x0049 0x00000000582c8001
|
||||
patword 0x004a 0x00000000582c8001
|
||||
patword 0x004b 0x00000000582c8001
|
||||
patword 0x004c 0x00000000582c8001
|
||||
patword 0x004d 0x00000000582c8001
|
||||
patword 0x004e 0x00000000582c8001
|
||||
patword 0x004f 0x00000000582c8001
|
||||
patword 0x0050 0x00000000582c8001
|
||||
patword 0x0051 0x00000000582c8001
|
||||
patword 0x0052 0x00000000582c8001
|
||||
patword 0x0053 0x00000000582c8001
|
||||
patword 0x0054 0x00000000582c8001
|
||||
patword 0x0055 0x00000000582c8001
|
||||
patword 0x0056 0x00000000582c8001
|
||||
patword 0x0057 0x00000000582c8001
|
||||
patword 0x0058 0x00000000582c8001
|
||||
patword 0x0059 0x00000000582c8001
|
||||
patword 0x005a 0x00000000582c8041
|
||||
patword 0x005b 0x00000000582c8041
|
||||
patword 0x005c 0x00000000582c8141
|
||||
patword 0x005d 0x00000000582c8041
|
||||
patword 0x005e 0x00000000582c8041
|
||||
patword 0x005f 0x00000000582c8041
|
||||
patword 0x0060 0x00000000582c8041
|
||||
patword 0x0061 0x00000000582c8041
|
||||
patword 0x0062 0x00000000582c8041
|
||||
patword 0x0063 0x00000000582c8041
|
||||
patword 0x0064 0x00000000582c8041
|
||||
patword 0x0065 0x00000000582c8041
|
||||
patword 0x0066 0x00000000582c8041
|
||||
patword 0x0067 0x00000000582c8041
|
||||
patword 0x0068 0x00000000582c8041
|
||||
patword 0x0069 0x00000000582c8041
|
||||
patword 0x006a 0x00000000582c8041
|
||||
patword 0x006b 0x00000000582c8041
|
||||
patword 0x006c 0x00000000582c8041
|
||||
patword 0x006d 0x00000000582c8041
|
||||
patword 0x006e 0x00000000582c8041
|
||||
patword 0x006f 0x00000000582c8041
|
||||
patword 0x0070 0x00000000582c8041
|
||||
patword 0x0071 0x00000000582c8041
|
||||
patword 0x0072 0x00000000582c8041
|
||||
patword 0x0073 0x00000000582c8041
|
||||
patword 0x0074 0x00000000d82c8941
|
||||
patword 0x0075 0x00000000d82c8041
|
||||
patword 0x0076 0x00000000582c8001
|
||||
patword 0x0077 0x00000000582c8001
|
||||
patword 0x0078 0xc0000000582c8001
|
||||
patword 0x0079 0xc0000000582c8801
|
||||
patword 0x007a 0xc0000000582c8001
|
||||
patword 0x007b 0xc0000000582c8801
|
||||
patword 0x007c 0xc0000000582c8001
|
||||
patword 0x007d 0xc0000000582c8801
|
||||
patword 0x007e 0xc0000000582c8001
|
||||
patword 0x007f 0xc0000000582c8801
|
||||
patword 0x0080 0xc0000000582c8001
|
||||
patword 0x0081 0xc0000000582c8801
|
||||
patword 0x0082 0xc0000000582c8001
|
||||
patword 0x0083 0xc0000000582c8801
|
||||
patword 0x0084 0xc0000000582c8001
|
||||
patword 0x0085 0xc0000000582c8801
|
||||
patword 0x0086 0xc0000000582c8001
|
||||
patword 0x0087 0xc0000000582c8801
|
||||
patword 0x0088 0xc0000000582c8001
|
||||
patword 0x0089 0xc0000000582c8801
|
||||
patword 0x008a 0xc0000000582c8001
|
||||
patword 0x008b 0xc0000000582c8801
|
||||
patword 0x008c 0xc0000000582c8001
|
||||
patword 0x008d 0xc0000000582c8801
|
||||
patword 0x008e 0xc0000000582c8001
|
||||
patword 0x008f 0xc0000000582c8801
|
||||
patword 0x0090 0xc0000000582c8001
|
||||
patword 0x0091 0xc0000000582c8901
|
||||
patword 0x0092 0xc0000000582c8001
|
||||
patword 0x0093 0xc0000000582c8801
|
||||
patword 0x0094 0xc0000000582c8001
|
||||
patword 0x0095 0xc0000000582c8801
|
||||
patword 0x0096 0xc0000000582c8001
|
||||
patword 0x0097 0xc0000000582c8801
|
||||
patword 0x0098 0xc0000000582c8001
|
||||
patword 0x0099 0xc0000000582c8801
|
||||
patword 0x009a 0xc0000000582c8001
|
||||
patword 0x009b 0xc0000000582c8801
|
||||
patword 0x009c 0xc0000000582c8001
|
||||
patword 0x009d 0xc0000000582c8801
|
||||
patword 0x009e 0xc0000000582c8001
|
||||
patword 0x009f 0xc0000000582c8801
|
||||
patword 0x00a0 0xc0000000582c8001
|
||||
patword 0x00a1 0xc0000000582c8801
|
||||
patword 0x00a2 0xc0000000582c8001
|
||||
patword 0x00a3 0xc0000000582c8801
|
||||
patword 0x00a4 0xc0000000582c8001
|
||||
patword 0x00a5 0xc0000000582c8801
|
||||
patword 0x00a6 0xc0000000582c8001
|
||||
patword 0x00a7 0xc0000000582c8801
|
||||
patword 0x00a8 0xc0000000582c8001
|
||||
patword 0x00a9 0xc0000000d82c8901
|
||||
patword 0x00aa 0xc0000000d82c8001
|
||||
patword 0x00ab 0xc0000000582c8801
|
||||
patword 0x00ac 0xc0000000582c8001
|
||||
patword 0x00ad 0xc0000000582c8801
|
||||
patword 0x00ae 0xc0000000582c8001
|
||||
patword 0x00af 0xc0000000582c8801
|
||||
patword 0x00b0 0xc0000000582c8001
|
||||
patword 0x00b1 0xc0000000582c8801
|
||||
patword 0x00b2 0xc0000000582c8001
|
||||
patword 0x00b3 0xc0000000582c8801
|
||||
patword 0x00b4 0xc0000000582c8001
|
||||
patword 0x00b5 0xc0000000582c8801
|
||||
patword 0x00b6 0xc0000000582c8001
|
||||
patword 0x00b7 0xc0000000582c8801
|
||||
patword 0x00b8 0xc0000000582c8001
|
||||
patword 0x00b9 0xc0000000582c8801
|
||||
patword 0x00ba 0xc0000000582c8001
|
||||
patword 0x00bb 0xc0000000582c8801
|
||||
patword 0x00bc 0xc0000000582c8001
|
||||
patword 0x00bd 0xc0000000582c8801
|
||||
patword 0x00be 0xc0000000582c8001
|
||||
patword 0x00bf 0xc0000000582c8801
|
||||
patword 0x00c0 0xc0000000582c8001
|
||||
patword 0x00c1 0xc0000000582c8801
|
||||
patword 0x00c2 0xc0000000582c8001
|
||||
patword 0x00c3 0xc0000000582c8901
|
||||
patword 0x00c4 0xc0000000582c8001
|
||||
patword 0x00c5 0xc0000000582c8801
|
||||
patword 0x00c6 0xc0000000582c8001
|
||||
patword 0x00c7 0xc0000000582c8801
|
||||
patword 0x00c8 0xc0000000582c8001
|
||||
patword 0x00c9 0xc0000000582c8801
|
||||
patword 0x00ca 0xc0000000582c8001
|
||||
patword 0x00cb 0xc0000000582c8801
|
||||
patword 0x00cc 0xc0000000582c8001
|
||||
patword 0x00cd 0xc0000000582c8801
|
||||
patword 0x00ce 0xc0000000582c8001
|
||||
patword 0x00cf 0xc0000000582c8801
|
||||
patword 0x00d0 0xc0000000582c8001
|
||||
patword 0x00d1 0xc0000000582c8801
|
||||
patword 0x00d2 0xc0000000582c8001
|
||||
patword 0x00d3 0xc0000000582c8801
|
||||
patword 0x00d4 0xc0000000582c8001
|
||||
patword 0x00d5 0xc0000000582c8801
|
||||
patword 0x00d6 0xc0000000582c8001
|
||||
patword 0x00d7 0xc0000000582c8801
|
||||
patword 0x00d8 0xc0000000582c8001
|
||||
patword 0x00d9 0xc0000000582c8801
|
||||
patword 0x00da 0xc0000000582c8001
|
||||
patword 0x00db 0x00000000582c8001
|
||||
patword 0x00dc 0x00000000582c8001
|
||||
patword 0x00dd 0x00000000482c8901
|
||||
patword 0x00de 0x00000000482c8001
|
||||
patword 0x00df 0x00000000482c8901
|
||||
patword 0x00e0 0x00000000482c8001
|
||||
patword 0x00e1 0x000000006b2e8001
|
||||
patlimits 0x0000 0x00e1
|
||||
patioctrl 0x01000000fb7fdd55
|
||||
patloop 0 0x00a9 0x00da
|
||||
patnloop 0 199
|
||||
patwait 0 0x0018
|
||||
patwaittime 0 800
|
BIN
pyctbgui/tests/gui/data/pattern.png
Normal file
BIN
pyctbgui/tests/gui/data/pattern.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 46 KiB |
9
pyctbgui/tests/gui/data/simulator.config
Normal file
9
pyctbgui/tests/gui/data/simulator.config
Normal file
@ -0,0 +1,9 @@
|
||||
hostname localhost
|
||||
rx_hostname localhost
|
||||
udp_dstip auto
|
||||
udp_srcip auto
|
||||
|
||||
romode analog
|
||||
asamples 5000
|
||||
tsamples 288
|
||||
|
57
pyctbgui/tests/gui/test_analog_moench.py
Normal file
57
pyctbgui/tests/gui/test_analog_moench.py
Normal file
@ -0,0 +1,57 @@
|
||||
from pathlib import Path
|
||||
|
||||
import numpy as np
|
||||
from pytestqt.qt_compat import qt_api
|
||||
|
||||
from .utils import setup_gui, defaultParams
|
||||
|
||||
|
||||
def test_image_acq(main, qtbot, tmp_path):
|
||||
"""
|
||||
tests Analog image acquisition and numpy saving
|
||||
"""
|
||||
params = defaultParams()
|
||||
params.detector = "Moench04"
|
||||
params.mode = "Analog"
|
||||
params.enabled = list(range(32))
|
||||
|
||||
setup_gui(qtbot, main, params, tmp_path=tmp_path)
|
||||
|
||||
qtbot.mouseClick(main.pushButtonStart, qt_api.QtCore.Qt.MouseButton.LeftButton)
|
||||
|
||||
acqIndex = main.acquisitionTab.view.spinBoxAcquisitionIndex.value() - 1
|
||||
newPath = main.acquisitionTab.outputDir / f'{main.acquisitionTab.outputFileNamePrefix}_{acqIndex}.npy'
|
||||
qtbot.wait_until(lambda: newPath.is_file())
|
||||
|
||||
testArray = np.load(newPath)
|
||||
dataArray = np.load(Path(__file__).parent / 'data' / 'moench04_image_analog.npy')
|
||||
|
||||
assert testArray.shape == (1, 400, 400)
|
||||
assert np.array_equal(dataArray, testArray)
|
||||
|
||||
|
||||
def test_waveform_acq(main, qtbot, tmp_path):
|
||||
"""
|
||||
tests Analog waveform acquisition and numpy saving
|
||||
"""
|
||||
params = defaultParams()
|
||||
params.image = False
|
||||
params.detector = "Moench04"
|
||||
params.mode = "Analog"
|
||||
params.enabled = list(range(32))
|
||||
params.plotted = params.enabled
|
||||
|
||||
setup_gui(qtbot, main, params, tmp_path=tmp_path)
|
||||
|
||||
qtbot.mouseClick(main.pushButtonStart, qt_api.QtCore.Qt.MouseButton.LeftButton)
|
||||
|
||||
acqIndex = main.acquisitionTab.view.spinBoxAcquisitionIndex.value() - 1
|
||||
newPath = main.acquisitionTab.outputDir / f'{main.acquisitionTab.outputFileNamePrefix}_{acqIndex}.npz'
|
||||
|
||||
qtbot.wait_until(lambda: newPath.is_file())
|
||||
testArray = np.load(newPath)
|
||||
dataArray = np.load(Path(__file__).parent / 'data' / 'moench04_waveform_adc.npz')
|
||||
files = [f"ADC{i}" for i in params.enabled]
|
||||
assert testArray.files == files
|
||||
for i in files:
|
||||
assert np.array_equal(dataArray[i], testArray[i])
|
27
pyctbgui/tests/gui/test_pattern.py
Normal file
27
pyctbgui/tests/gui/test_pattern.py
Normal file
@ -0,0 +1,27 @@
|
||||
from pathlib import Path
|
||||
|
||||
from pytestqt.qt_compat import qt_api
|
||||
|
||||
from pyctbgui.utils.defines import Defines
|
||||
from tests.gui.utils import defaultParams
|
||||
|
||||
|
||||
def test_view_pattern(main, qtbot, tmp_path):
|
||||
"""
|
||||
Tests pattern file viewing
|
||||
"""
|
||||
params = defaultParams()
|
||||
params.image = False
|
||||
main.tabWidget.setCurrentIndex(Defines.pattern.tabIndex)
|
||||
qtbot.keyClicks(main.patternTab.view.lineEditPatternFile, "tests/gui/data/pattern.pat")
|
||||
qtbot.mouseClick(main.patternTab.view.pushButtonViewPattern, qt_api.QtCore.Qt.MouseButton.LeftButton)
|
||||
qtbot.wait_until(lambda: main.patternTab.figure is not None)
|
||||
assert main.patternTab.figure is not None
|
||||
|
||||
# save pattern
|
||||
main.patternTab.figure.savefig(tmp_path / "pattern.png")
|
||||
assert Path(tmp_path / "pattern.png").exists()
|
||||
|
||||
# pattern files generated from python3.10 libraries differ from python3.11. this would make this
|
||||
# test flaky so we skip it for now
|
||||
# assert filecmp.cmp("tests/gui/data/pattern.png", tmp_path / "pattern.png")
|
34
pyctbgui/tests/gui/test_pedestal_matterhorn.py
Normal file
34
pyctbgui/tests/gui/test_pedestal_matterhorn.py
Normal file
@ -0,0 +1,34 @@
|
||||
import numpy as np
|
||||
from pytestqt.qt_compat import qt_api
|
||||
|
||||
from tests.gui.utils import defaultParams, setup_gui
|
||||
|
||||
|
||||
def test_pedestal_substraction(main, qtbot, tmp_path):
|
||||
"""
|
||||
tests Transceiver image acquisition, numpy saving and pedestal substraction
|
||||
"""
|
||||
|
||||
# record 10 frames
|
||||
params = defaultParams()
|
||||
params.pedestalRecord = True
|
||||
params.nFrames = 10
|
||||
params.numpy = False
|
||||
setup_gui(qtbot, main, params, tmp_path=tmp_path)
|
||||
qtbot.mouseClick(main.pushButtonStart, qt_api.QtCore.Qt.MouseButton.LeftButton)
|
||||
qtbot.wait_until(lambda: main.plotTab.view.labelPedestalFrames.text() == 'recorded frames: 10')
|
||||
|
||||
# apply pedestal and save
|
||||
params.pedestalRecord = False
|
||||
params.numpy = True
|
||||
params.nFrames = 2
|
||||
setup_gui(qtbot, main, params, tmp_path=tmp_path)
|
||||
qtbot.mouseClick(main.pushButtonStart, qt_api.QtCore.Qt.MouseButton.LeftButton)
|
||||
acqIndex = main.acquisitionTab.view.spinBoxAcquisitionIndex.value() - 1
|
||||
newPath = main.acquisitionTab.outputDir / f'{main.acquisitionTab.outputFileNamePrefix}_{acqIndex}.npy'
|
||||
qtbot.wait_until(lambda: newPath.is_file())
|
||||
|
||||
testArray = np.load(newPath)
|
||||
|
||||
assert testArray.shape == (2, 48, 48)
|
||||
assert np.array_equal(testArray, np.zeros((2, 48, 48)))
|
28
pyctbgui/tests/gui/test_signal_matterhorn.py
Normal file
28
pyctbgui/tests/gui/test_signal_matterhorn.py
Normal file
@ -0,0 +1,28 @@
|
||||
# from pathlib import Path
|
||||
#
|
||||
# import numpy as np
|
||||
# from pytestqt.qt_compat import qt_api
|
||||
#
|
||||
# from .utils import setup_gui, defaultParams
|
||||
#
|
||||
#
|
||||
# def test_waveform_signals(main, qtbot, tmp_path):
|
||||
# """
|
||||
# tests signals waveform acquisition and numpy saving
|
||||
# """
|
||||
# params = defaultParams()
|
||||
# params.image = False
|
||||
# params.mode = "Signal"
|
||||
# params.enabled = list(range(128))
|
||||
# params.plotted = params.enabled
|
||||
#
|
||||
# setup_gui(qtbot, main, params, tmp_path=tmp_path)
|
||||
#
|
||||
# qtbot.mouseClick(main.pushButtonStart, qt_api.QtCore.Qt.MouseButton.LeftButton)
|
||||
#
|
||||
# acqIndex = main.acquisitionTab.view.spinBoxAcquisitionIndex.value() - 1
|
||||
# newPath = main.acquisitionTab.outputDir / f'{main.acquisitionTab.outputFileNamePrefix}_{acqIndex}.npz'
|
||||
#
|
||||
# qtbot.wait_until(lambda: newPath.is_file())
|
||||
# testArray = np.load(newPath)
|
||||
#
|
50
pyctbgui/tests/gui/test_transceiver_matterhorn.py
Normal file
50
pyctbgui/tests/gui/test_transceiver_matterhorn.py
Normal file
@ -0,0 +1,50 @@
|
||||
from pathlib import Path
|
||||
|
||||
import numpy as np
|
||||
from pytestqt.qt_compat import qt_api
|
||||
|
||||
from .utils import setup_gui, defaultParams
|
||||
|
||||
|
||||
def test_image_acq(main, qtbot, tmp_path):
|
||||
"""
|
||||
tests Transceiver image acquisition and numpy saving
|
||||
"""
|
||||
|
||||
setup_gui(qtbot, main, tmp_path=tmp_path)
|
||||
|
||||
qtbot.mouseClick(main.pushButtonStart, qt_api.QtCore.Qt.MouseButton.LeftButton)
|
||||
|
||||
acqIndex = main.acquisitionTab.view.spinBoxAcquisitionIndex.value() - 1
|
||||
newPath = main.acquisitionTab.outputDir / f'{main.acquisitionTab.outputFileNamePrefix}_{acqIndex}.npy'
|
||||
qtbot.wait_until(lambda: newPath.is_file())
|
||||
|
||||
testArray = np.load(newPath)
|
||||
dataArray = np.load(Path(__file__).parent / 'data' / 'matterhorm_image_transceiver.npy')
|
||||
|
||||
assert testArray.shape == (1, 48, 48)
|
||||
assert np.array_equal(dataArray, testArray)
|
||||
|
||||
|
||||
def test_waveform_acq(main, qtbot, tmp_path):
|
||||
"""
|
||||
tests Transceiver waveform acquisition and numpy saving
|
||||
"""
|
||||
params = defaultParams()
|
||||
params.image = False
|
||||
params.enabled = [0, 1]
|
||||
params.plotted = [0, 1]
|
||||
|
||||
setup_gui(qtbot, main, params, tmp_path=tmp_path)
|
||||
|
||||
qtbot.mouseClick(main.pushButtonStart, qt_api.QtCore.Qt.MouseButton.LeftButton)
|
||||
|
||||
acqIndex = main.acquisitionTab.view.spinBoxAcquisitionIndex.value() - 1
|
||||
newPath = main.acquisitionTab.outputDir / f'{main.acquisitionTab.outputFileNamePrefix}_{acqIndex}.npz'
|
||||
|
||||
qtbot.wait_until(lambda: newPath.is_file())
|
||||
testArray = np.load(newPath)
|
||||
dataArray = np.load(Path(__file__).parent / 'data' / 'matterhorn_waveform_transceiver1and2.npz')
|
||||
assert testArray.files == ['Transceiver 0', 'Transceiver 1']
|
||||
assert np.array_equal(dataArray['Transceiver 0'], testArray['Transceiver 0'])
|
||||
assert np.array_equal(dataArray['Transceiver 1'], testArray['Transceiver 1'])
|
78
pyctbgui/tests/gui/utils.py
Normal file
78
pyctbgui/tests/gui/utils.py
Normal file
@ -0,0 +1,78 @@
|
||||
from pathlib import Path
|
||||
|
||||
from pyctbgui.utils.defines import Defines
|
||||
|
||||
|
||||
class defaultParams:
|
||||
image = True
|
||||
detector = "Matterhorn"
|
||||
numpy = True
|
||||
mode = "Transceiver"
|
||||
outputDir = "/tmp"
|
||||
filename = "run"
|
||||
nFrames = 1
|
||||
enabled = []
|
||||
plotted = []
|
||||
pedestalRecord = True
|
||||
pattern = False
|
||||
|
||||
|
||||
def setup_gui(qtbot, widget, params=defaultParams(), tmp_path=Path('/tmp')):
|
||||
if params.image:
|
||||
widget.plotTab.view.radioButtonImage.setChecked(True)
|
||||
widget.plotTab.view.radioButtonWaveform.setChecked(False)
|
||||
if params.mode == "Transceiver":
|
||||
params.enabled = [0, 1]
|
||||
else:
|
||||
params.enabled = range(128)
|
||||
else:
|
||||
widget.plotTab.view.radioButtonWaveform.setChecked(True)
|
||||
widget.plotTab.view.radioButtonImage.setChecked(False)
|
||||
|
||||
if params.mode == "Transceiver":
|
||||
widget.tabWidget.setCurrentIndex(Defines.transceiver.tabIndex)
|
||||
for i in range(Defines.transceiver.count):
|
||||
# check or uncheck enable/plot checkboxes
|
||||
enable = getattr(widget.transceiverTab.view, f"checkBoxTransceiver{i}")
|
||||
enable.setChecked(i in params.enabled)
|
||||
enable = getattr(widget.transceiverTab.view, f"checkBoxTransceiver{i}Plot")
|
||||
enable.setChecked(i in params.plotted)
|
||||
elif params.mode == "Analog":
|
||||
widget.tabWidget.setCurrentIndex(Defines.adc.tabIndex)
|
||||
for i in range(Defines.adc.count):
|
||||
# check or uncheck enable/plot checkboxes
|
||||
enable = getattr(widget.adcTab.view, f"checkBoxADC{i}En")
|
||||
enable.setChecked(i in params.enabled)
|
||||
enable = getattr(widget.adcTab.view, f"checkBoxADC{i}Plot")
|
||||
enable.setChecked(i in params.plotted)
|
||||
|
||||
qtbot.wait_until(lambda: widget.plotTab.view.radioButtonImage.isChecked() == params.image)
|
||||
|
||||
qtbot.keyClicks(widget.plotTab.view.comboBoxPlot, params.detector)
|
||||
qtbot.wait_until(lambda: widget.plotTab.view.comboBoxPlot.currentText() == params.detector)
|
||||
|
||||
widget.acquisitionTab.view.checkBoxFileWriteNumpy.setChecked(params.numpy)
|
||||
|
||||
widget.acquisitionTab.view.comboBoxROMode.setCurrentIndex(-1)
|
||||
qtbot.keyClicks(widget.acquisitionTab.view.comboBoxROMode, params.mode)
|
||||
qtbot.wait_until(lambda: widget.acquisitionTab.view.comboBoxROMode.currentText() == params.mode)
|
||||
|
||||
widget.acquisitionTab.view.lineEditFilePath.setText(str(tmp_path))
|
||||
widget.acquisitionTab.setFilePath()
|
||||
|
||||
widget.acquisitionTab.view.lineEditFileName.setText(params.filename)
|
||||
widget.acquisitionTab.setFileName()
|
||||
|
||||
widget.acquisitionTab.view.spinBoxFrames.setValue(params.nFrames)
|
||||
widget.acquisitionTab.setFrames()
|
||||
|
||||
widget.plotTab.view.radioButtonPedestalRecord.setChecked(params.pedestalRecord)
|
||||
widget.plotTab.view.radioButtonPedestalApply.setChecked(not params.pedestalRecord)
|
||||
|
||||
qtbot.wait_until(lambda: widget.acquisitionTab.view.spinBoxFrames.value() == params.nFrames)
|
||||
|
||||
assert widget.acquisitionTab.view.comboBoxROMode.currentText() == params.mode
|
||||
assert widget.plotTab.view.comboBoxPlot.currentText() == params.detector
|
||||
assert widget.acquisitionTab.writeNumpy == params.numpy
|
||||
assert widget.acquisitionTab.view.spinBoxFrames.value() == params.nFrames
|
||||
assert widget.acquisitionTab.outputDir == Path(str(tmp_path))
|
Reference in New Issue
Block a user