From 70b039eb42d500f88512755e9332501e603e17aa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Erik=20Fr=C3=B6jdh?= Date: Tue, 27 Oct 2026 17:23:42 +0100 Subject: [PATCH 01/10] Enabling optimizations for for slsDetectorServers (#1631) * replaced bf specific usleep replacement with one using cycle counts to be stable while changing optimization levels * uint32_t signature on usleep since the register read is 32bit... * enabled -O2 for ctb and mythen + a few additional warnings * configure stack size for blackfin servers to 256kB instead of the default 4kB * enable opt for JF and Moench, ratemax make local for eiger * fixed misplaced volatile on Beb_Read32 * removed dead code in eiger server (which had 2 byte read passt end), usleep_bf returns -1 for sleeps that can't be represented * deal with fall through of table filling in ratecorr table * memory clobber for inline asm and added flags on eiger * -O2 for gotthard and xilinx * fixes to remove the new warnings * fixed new eiger warnings * binaries in --------- Co-authored-by: Dhanya Thattil --- slsDetectorServers/ctbDetectorServer/Makefile | 4 +- .../bin/ctbDetectorServer_developer | Bin 333120 -> 295884 bytes .../slsDetectorFunctionList.c | 8 +- slsDetectorServers/eigerDetectorServer/Beb.c | 58 ++------------- .../eigerDetectorServer/FebControl.c | 24 +++--- .../eigerDetectorServer/HardwareIO.c | 24 ++++-- .../eigerDetectorServer/LocalLinkInterface.c | 2 +- .../eigerDetectorServer/Makefile | 2 +- .../bin/eigerDetectorServer_developer | Bin 449838 -> 375016 bytes .../slsDetectorFunctionList.c | 6 +- .../gotthard2DetectorServer/Makefile | 2 +- .../bin/gotthard2DetectorServer_developer | Bin 296324 -> 240244 bytes .../jungfrauDetectorServer/Makefile | 4 +- .../bin/jungfrauDetectorServer_developer | Bin 321304 -> 286160 bytes .../slsDetectorFunctionList.c | 8 +- .../moenchDetectorServer/Makefile | 4 +- .../bin/moenchDetectorServer_developer | Bin 298888 -> 266136 bytes .../slsDetectorFunctionList.c | 6 +- .../mythen3DetectorServer/Makefile | 2 +- .../bin/mythen3DetectorServer_developer | Bin 322428 -> 262568 bytes .../slsDetectorServer/include/blackfin.h | 13 +++- .../slsDetectorServer/src/LTC2620_Driver.c | 9 +-- .../slsDetectorServer/src/blackfin.c | 69 ++++++++++++++++-- .../xilinx_ctbDetectorServer/Makefile | 2 +- .../bin/xilinx_ctbDetectorServer_developer | Bin 306352 -> 306376 bytes .../slsDetectorFunctionList.c | 4 +- slsSupportLib/include/sls/versionAPI.h | 14 ++-- 27 files changed, 149 insertions(+), 116 deletions(-) diff --git a/slsDetectorServers/ctbDetectorServer/Makefile b/slsDetectorServers/ctbDetectorServer/Makefile index f09990ae2..1a1d70418 100755 --- a/slsDetectorServers/ctbDetectorServer/Makefile +++ b/slsDetectorServers/ctbDetectorServer/Makefile @@ -10,8 +10,10 @@ script_dir = ../../etc/ CROSS = bfin-uclinux- CC = $(CROSS)gcc -CFLAGS += -Wall -std=gnu99 -DCHIPTESTBOARDD -DSTOP_SERVER -I$(main_inc) -I$(support_lib) -I$(det_lib) -I$(current_dir) #-DDEBUG1 #-DVERBOSEI #-DVERBOSE +CFLAGS += -O2 -Wall -Wextra -Wno-unused-parameter -Wformat=2 -Wredundant-decls -Werror=return-type -std=gnu99 -DCHIPTESTBOARDD -DSTOP_SERVER -I$(main_inc) -I$(support_lib) -I$(det_lib) -I$(current_dir) #-DDEBUG1 #-DVERBOSEI #-DVERBOSE LDLIBS += -lm -lrt -pthread +# FLAT stack size: elf2flt defaults to 4 KB, the update and startup paths need more than 8 KB +LDLIBS += -Wl,-elf2flt=-s262144 PROGS = ctbDetectorServer DESTDIR ?= bin INSTMODE = 0777 diff --git a/slsDetectorServers/ctbDetectorServer/bin/ctbDetectorServer_developer b/slsDetectorServers/ctbDetectorServer/bin/ctbDetectorServer_developer index b717a96dd041f9c0fa5976cd5dd72a4eab01721b..e505763a31f00a5a8a604af6097a794bfeb76841 100755 GIT binary patch literal 295884 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�O-#DLXTKWX5kPlb6g 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�bM#;LGc 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%0D-XikV+lus7mVSE?`RcilcCqy9i_A#xLwX-e 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 Ue9P5QK7gr2^t7Cw&PT=n4{B>r*8l(j diff --git a/slsDetectorServers/ctbDetectorServer/slsDetectorFunctionList.c b/slsDetectorServers/ctbDetectorServer/slsDetectorFunctionList.c index cabf6f09f..eadf83efb 100644 --- a/slsDetectorServers/ctbDetectorServer/slsDetectorFunctionList.c +++ b/slsDetectorServers/ctbDetectorServer/slsDetectorFunctionList.c @@ -1355,7 +1355,7 @@ int setVLimit(int val, char *mess) { } int validateDACIndex(enum DACINDEX ind, char *mess) { - if (ind < 0 || ind >= NDAC_ONLY) { + if (ind >= NDAC_ONLY) { sprintf(mess, "Could not set/get DAC. Invalid index %d\n", ind); LOG(logERROR, (mess)); return FAIL; @@ -1464,7 +1464,7 @@ int setDAC(enum DACINDEX ind, int val, bool mV, char *mess) { } int validatePowerDACIndex(enum powerIndex ind, char *mess) { - if (ind < 0 || ind > V_POWER_IO) { + if (ind > V_POWER_IO) { sprintf(mess, "Could not set/get Power DAC. Invalid index %d\n", ind); LOG(logERROR, (mess)); return FAIL; @@ -2330,7 +2330,7 @@ int validatePhaseinDegrees(enum CLKINDEX ind, int val, int retval) { } int setFrequency(enum CLKINDEX ind, int val) { - if (ind < 0 || ind >= NUM_CLOCKS) { + if (ind >= NUM_CLOCKS) { LOG(logERROR, ("Unknown clock index %d to set frequency\n", ind)); return FAIL; } @@ -2380,7 +2380,7 @@ int setFrequency(enum CLKINDEX ind, int val) { } int getFrequency(enum CLKINDEX ind) { - if (ind < 0 || ind >= NUM_CLOCKS) { + if (ind >= NUM_CLOCKS) { LOG(logERROR, ("Unknown clock index %d to get frequency\n", ind)); return -1; } diff --git a/slsDetectorServers/eigerDetectorServer/Beb.c b/slsDetectorServers/eigerDetectorServer/Beb.c index 9299340b9..a9605c05c 100644 --- a/slsDetectorServers/eigerDetectorServer/Beb.c +++ b/slsDetectorServers/eigerDetectorServer/Beb.c @@ -6,6 +6,7 @@ #include "xparameters.h" #include +#include #include #include #include @@ -14,20 +15,8 @@ extern int isControlServer; #define MAX(x, y) (((x) > (y)) ? (x) : (y)) -struct LocalLinkInterface ll_beb_local, *ll_beb; - struct udp_header_type udp_header; -int Beb_send_ndata; -unsigned int Beb_send_buffer_size; -unsigned int *Beb_send_data_raw; -unsigned int *Beb_send_data; - -int Beb_recv_ndata; -unsigned int Beb_recv_buffer_size; -unsigned int *Beb_recv_data_raw; -unsigned int *Beb_recv_data; - short Beb_bit_mode; int BEB_MMAP_SIZE = 0x1000; @@ -47,28 +36,6 @@ int Beb_deactivated_right_datastream = 1; int Beb_deactivated_num_destinations = 1; int Beb_Beb() { - Beb_send_ndata = 0; - Beb_send_buffer_size = 1026; - - Beb_send_data_raw = - malloc((Beb_send_buffer_size + 1) * sizeof(unsigned int)); - if (Beb_send_data_raw == NULL) { - LOG(logERROR, ("Could not allocate memory for beb (send_data_raw)\n")); - return 0; - } - Beb_send_data = &Beb_send_data_raw[1]; - - Beb_recv_ndata = 0; - Beb_recv_buffer_size = 1026; - - Beb_recv_data_raw = - malloc((Beb_recv_buffer_size + 1) * sizeof(unsigned int)); - if (Beb_recv_data_raw == NULL) { - LOG(logERROR, ("Could not allocate memory for beb (recv_data_raw)\n")); - return 0; - } - Beb_recv_data = &Beb_recv_data_raw[1]; - udp_header = (struct udp_header_type){ {0x00, 0x50, 0xc5, 0xb2, 0xcb, 0x46}, // DST MAC {0x00, 0x50, 0xc2, 0x46, 0xd9, 0x02}, // SRC MAC @@ -157,19 +124,12 @@ int Beb_SetHeaderData(uint64_t src_mac, uint32_t src_ip, uint16_t src_port, memcpy(&(udp_header.dst_port[0]), &dst_port, sizeof(udp_header.dst_port)); Beb_AdjustIPChecksum(&udp_header); - - unsigned int *base_ptr = (unsigned int *)&udp_header; - unsigned int num_words = (sizeof(struct udp_header_type) + 3) / 4; - for (unsigned int i = 0; i < num_words; i++) - Beb_send_data[i + 2] = base_ptr[i]; - for (unsigned int i = num_words; i < 16; i++) - Beb_send_data[i + 2] = 0; - return 1; } void Beb_AdjustIPChecksum(struct udp_header_type *ip) { - unsigned char *cptr = (unsigned char *)ip->ver_headerlen; + unsigned char *cptr = + (unsigned char *)ip + offsetof(struct udp_header_type, ver_headerlen); ip->ip_header_checksum[0] = 0; ip->ip_header_checksum[1] = 0; @@ -372,7 +332,7 @@ int Beb_SetTop(enum TOPINDEX ind) { } char *top_names[] = {TOP_NAMES}; - int newval = Beb_Write32(csp0base, BEB_CONFIG_WR_OFST, value); + u_int32_t newval = Beb_Write32(csp0base, BEB_CONFIG_WR_OFST, value); if (newval != value) { LOG(logERROR, ("Could not set Top flag to %s in Beb\n", top_names[ind])); @@ -417,7 +377,7 @@ int Beb_SetMaster(enum MASTERINDEX ind) { } char *master_names[] = {MASTER_NAMES}; - int newval = Beb_Write32(csp0base, BEB_CONFIG_WR_OFST, value); + u_int32_t newval = Beb_Write32(csp0base, BEB_CONFIG_WR_OFST, value); if (newval != value) { LOG(logERROR, ("Could not set Master flag to %s in Beb\n", master_names[ind])); @@ -1167,7 +1127,7 @@ int Beb_SetDetectorPosition(int pos[]) { value | ((posval << UDP_HEADER_Y_OFST) & UDP_HEADER_Y_MSK)); value = Beb_Read32(csp0base, UDP_HEADER_B_LEFT_OFST); if ((value & UDP_HEADER_Y_MSK) != - ((posval << UDP_HEADER_Y_OFST) & UDP_HEADER_Y_MSK)) { + (uint32_t)((posval << UDP_HEADER_Y_OFST) & UDP_HEADER_Y_MSK)) { LOG(logERROR, ("Could not set column position for left port\n")); ret = FAIL; } @@ -1180,7 +1140,7 @@ int Beb_SetDetectorPosition(int pos[]) { value | ((posval << UDP_HEADER_Y_OFST) & UDP_HEADER_Y_MSK)); value = Beb_Read32(csp0base, UDP_HEADER_B_RIGHT_OFST); if ((value & UDP_HEADER_Y_MSK) != - ((posval << UDP_HEADER_Y_OFST) & UDP_HEADER_Y_MSK)) { + (uint32_t)((posval << UDP_HEADER_Y_OFST) & UDP_HEADER_Y_MSK)) { LOG(logERROR, ("Could not set column position for right port\n")); ret = FAIL; } @@ -1379,9 +1339,7 @@ int Beb_open(u_int32_t **csp0base, u_int32_t offset) { } u_int32_t Beb_Read32(u_int32_t *baseaddr, u_int32_t offset) { - volatile u_int32_t value; - value = *(u_int32_t *)(baseaddr + offset / (sizeof(u_int32_t))); - return value; + return *(volatile u_int32_t *)(baseaddr + offset / sizeof(u_int32_t)); } u_int32_t Beb_Write32(u_int32_t *baseaddr, u_int32_t offset, u_int32_t data) { diff --git a/slsDetectorServers/eigerDetectorServer/FebControl.c b/slsDetectorServers/eigerDetectorServer/FebControl.c index 85a89f2d9..0d8094d74 100644 --- a/slsDetectorServers/eigerDetectorServer/FebControl.c +++ b/slsDetectorServers/eigerDetectorServer/FebControl.c @@ -46,7 +46,6 @@ int64_t Feb_Control_RateTable_Tau_in_nsec = -1; int64_t Feb_Control_RateTable_Period_in_nsec = -1; unsigned int Feb_Control_rate_correction_table[1024] = {}; double Feb_Control_rate_meas[16384] = {}; -double ratemax = -1; // setup void Feb_Control_activate(int activate) { Feb_Control_activated = activate; } @@ -138,13 +137,6 @@ void Feb_Control_CloseSerialCommunication() { int Feb_Control_CheckSetup(int master) { LOG(logDEBUG1, ("Checking Set up\n")); - - for (unsigned int j = 0; j < 4; j++) { - if (Feb_Control_idelay[j] < 0) { - LOG(logERROR, ("idelay chip %d not set.\n", j)); - return 0; - } - } int value = 0; if ((Feb_Control_master) && (!Feb_Control_GetHighVoltage(&value))) { LOG(logERROR, ("high voltage not set.\n")); @@ -492,7 +484,7 @@ float Feb_Control_DACToVoltage(unsigned int digital, unsigned int nsteps, int Feb_Control_SetDAC(unsigned int ch, int value) { unsigned int dst_num = Feb_Control_rightAddress; - if (ch < 0 || ch > 15) { + if (ch > 15) { LOG(logERROR, ("invalid ch for SetDAC.\n")); return 0; } @@ -664,7 +656,7 @@ int Feb_Control_SetTrimbits(unsigned int *trimbits, int top) { int Feb_Control_SaveAllTrimbitsTo(int value, int top) { unsigned int chanregs[Feb_Control_trimbit_size]; - for (int i = 0; i < Feb_Control_trimbit_size; i++) + for (int i = 0; i < (int)Feb_Control_trimbit_size; i++) chanregs[i] = value; return Feb_Control_SetTrimbits(chanregs, top); } @@ -1982,6 +1974,7 @@ int Feb_Control_SetRateCorrectionTau(int64_t tau_in_Nsec) { unsigned int np = 16384; // max slope 16 * 1024 double b0[1024]; double m[1024]; + double ratemax = -1; if (tau_in_sec < 0 || period_in_sec < 0) { if (dr == 32) { @@ -1999,7 +1992,7 @@ int Feb_Control_SetRateCorrectionTau(int64_t tau_in_Nsec) { LOG(logINFO, ("Changing Rate Correction Table tau:%0.8f sec, period:%f sec", tau_in_sec, period_in_sec)); LOG(logINFO, ("\tCalculating table for tau of %lld ns.\n", tau_in_Nsec)); - for (int i = 0; i < np; i++) { + for (int i = 0; i < (int)np; i++) { Feb_Control_rate_meas[i] = i * exp(-i / period_in_sec * tau_in_sec); if (Feb_Control_rate_meas[i] > ratemax) ratemax = Feb_Control_rate_meas[i]; @@ -2022,7 +2015,7 @@ int Feb_Control_SetRateCorrectionTau(int64_t tau_in_Nsec) { */ int next_i = 0; - double beforemax; + double beforemax = 0; b0[0] = 0; m[0] = 1; @@ -2032,8 +2025,9 @@ int Feb_Control_SetRateCorrectionTau(int64_t tau_in_Nsec) { for (int b = 1; b < 1024; b++) { if (m[b - 1] < 15) { double s = 0, sx = 0, sy = 0, sxx = 0, sxy = 0; + int filled = 0; for (;; next_i++) { - if (next_i >= np) { + if (next_i >= (int)np) { for (; b < 1024; b++) { if (beforemax > ratemax) b0[b] = beforemax; @@ -2044,7 +2038,7 @@ int Feb_Control_SetRateCorrectionTau(int64_t tau_in_Nsec) { (((int)(m[b] + 0.5) & 0xf) << 14) | ((int)(b0[b] + 0.5) & 0x3fff); } - b = 1024; + filled = 1; break; } @@ -2069,6 +2063,8 @@ int Feb_Control_SetRateCorrectionTau(int64_t tau_in_Nsec) { Feb_Control_rate_meas[next_i]: %f\n", x, y, s, sx, sy, sxx, sxy, next_i, b, Feb_Control_rate_meas[next_i]));*/ } + if (filled) + break; double delta = s * sxx - sx * sx; b0[b] = (sxx * sy - sx * sxy) / delta; m[b] = (s * sxy - sx * sy) / delta; diff --git a/slsDetectorServers/eigerDetectorServer/HardwareIO.c b/slsDetectorServers/eigerDetectorServer/HardwareIO.c index 7e783d5d2..6ee3b3576 100644 --- a/slsDetectorServers/eigerDetectorServer/HardwareIO.c +++ b/slsDetectorServers/eigerDetectorServer/HardwareIO.c @@ -8,7 +8,10 @@ xfs_u8 HWIO_xfs_in8(xfs_u32 InAddress) { */ xfs_u8 IoContents; - __asm__ volatile("eieio; lbz %0,0(%1)" : "=r"(IoContents) : "b"(InAddress)); + __asm__ volatile("eieio; lbz %0,0(%1)" + : "=r"(IoContents) + : "b"(InAddress) + : "memory"); return IoContents; } @@ -20,7 +23,10 @@ xfs_u16 HWIO_xfs_in16(xfs_u32 InAddress) { */ xfs_u16 IoContents; - __asm__ volatile("eieio; lhz %0,0(%1)" : "=r"(IoContents) : "b"(InAddress)); + __asm__ volatile("eieio; lhz %0,0(%1)" + : "=r"(IoContents) + : "b"(InAddress) + : "memory"); return IoContents; } @@ -32,7 +38,10 @@ xfs_u32 HWIO_xfs_in32(xfs_u32 InAddress) { */ xfs_u32 IoContents; - __asm__ volatile("eieio; lwz %0,0(%1)" : "=r"(IoContents) : "b"(InAddress)); + __asm__ volatile("eieio; lwz %0,0(%1)" + : "=r"(IoContents) + : "b"(InAddress) + : "memory"); return IoContents; } @@ -43,7 +52,8 @@ void HWIO_xfs_out8(xfs_u32 OutAddress, xfs_u8 Value) { * such that the I/O operation completes before proceeding on */ - __asm__ volatile("stb %0,0(%1); eieio" ::"r"(Value), "b"(OutAddress)); + __asm__ volatile("stb %0,0(%1); eieio" ::"r"(Value), "b"(OutAddress) + : "memory"); } /*****************************************************************************/ @@ -52,7 +62,8 @@ void HWIO_xfs_out16(xfs_u32 OutAddress, xfs_u16 Value) { * such that the I/O operation completes before proceeding on */ - __asm__ volatile("sth %0,0(%1); eieio" ::"r"(Value), "b"(OutAddress)); + __asm__ volatile("sth %0,0(%1); eieio" ::"r"(Value), "b"(OutAddress) + : "memory"); } /*****************************************************************************/ @@ -62,5 +73,6 @@ void HWIO_xfs_out32(xfs_u32 OutAddress, xfs_u32 Value) { * such that the I/O operation completes before proceeding on */ - __asm__ volatile("stw %0,0(%1); eieio" ::"r"(Value), "b"(OutAddress)); + __asm__ volatile("stw %0,0(%1); eieio" ::"r"(Value), "b"(OutAddress) + : "memory"); } diff --git a/slsDetectorServers/eigerDetectorServer/LocalLinkInterface.c b/slsDetectorServers/eigerDetectorServer/LocalLinkInterface.c index c9252cf55..310d6df75 100644 --- a/slsDetectorServers/eigerDetectorServer/LocalLinkInterface.c +++ b/slsDetectorServers/eigerDetectorServer/LocalLinkInterface.c @@ -95,7 +95,7 @@ int Local_Write(struct LocalLinkInterface *ll, unsigned int buffer_len, LOG(logDEBUG1, ("LL Write - Len: %2d - If: %X - Data: ", buffer_len, ll->ll_fifo_base)); - for (int i = 0; i < buffer_len / 4; i++) + for (int i = 0; i < (int)buffer_len / 4; i++) LOG(logDEBUG1, ("%.8X ", *(((unsigned *)buffer) + i))); while (words_send <= last_word) { diff --git a/slsDetectorServers/eigerDetectorServer/Makefile b/slsDetectorServers/eigerDetectorServer/Makefile index c582445f7..9228b35c0 100755 --- a/slsDetectorServers/eigerDetectorServer/Makefile +++ b/slsDetectorServers/eigerDetectorServer/Makefile @@ -10,7 +10,7 @@ script_dir = ../../etc/ BLACKFIN_CC = bfin-uclinux-gcc CROSS = powerpc-4xx-softfloat- CC = $(CROSS)gcc -CFLAGS += -Wall -std=gnu99 -DEIGERD -DSTOP_SERVER -I$(main_inc) -I$(support_lib) -I$(current_dir) #-DDEBUG1 #-DVERBOSEI #-DVERBOSE +CFLAGS += -O2 -Wall -Wextra -Wno-unused-parameter -Wformat=2 -Wredundant-decls -Werror=return-type -std=gnu99 -DEIGERD -DSTOP_SERVER -I$(main_inc) -I$(support_lib) -I$(current_dir) #-DDEBUG1 #-DVERBOSEI #-DVERBOSE LDLIBS += -lm -lrt -pthread PROGS = eigerDetectorServer DESTDIR = bin diff --git a/slsDetectorServers/eigerDetectorServer/bin/eigerDetectorServer_developer b/slsDetectorServers/eigerDetectorServer/bin/eigerDetectorServer_developer index aa7de8654d014a680bffb9a70fee33ca659523d0..e58bac667397d75578e474d186c9cdc736bfd1bb 100755 GIT binary patch literal 375016 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�Hw|#!<0-zwmG?#m{HUo*JpmVR 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 literal 449838 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

M3Pws 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

x2A#5_}};pC`dBl_ukG6~CSY@56t2&ZYkW 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 A=Kufz literal 296324 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 diff --git a/slsDetectorServers/jungfrauDetectorServer/Makefile b/slsDetectorServers/jungfrauDetectorServer/Makefile index b131b6340..d811eeb9a 100755 --- a/slsDetectorServers/jungfrauDetectorServer/Makefile +++ b/slsDetectorServers/jungfrauDetectorServer/Makefile @@ -9,8 +9,10 @@ script_dir = ../../etc/ CROSS = bfin-uclinux- CC = $(CROSS)gcc -CFLAGS += -Wall -std=gnu99 -DJUNGFRAUD -DSTOP_SERVER -I$(main_inc) -I$(support_lib) -I$(current_dir) #-DVERBOSEI #-DVERBOSE +CFLAGS += -O2 -Wall -Wextra -Wno-unused-parameter -Wformat=2 -Wredundant-decls -Werror=return-type -std=gnu99 -DJUNGFRAUD -DSTOP_SERVER -I$(main_inc) -I$(support_lib) -I$(current_dir) #-DVERBOSEI #-DVERBOSE LDLIBS += -lm -lrt -pthread +# FLAT stack size: elf2flt defaults to 4 KB, the update and startup paths need more than 8 KB +LDLIBS += -Wl,-elf2flt=-s262144 PROGS = jungfrauDetectorServer DESTDIR ?= bin INSTMODE = 0777 diff --git a/slsDetectorServers/jungfrauDetectorServer/bin/jungfrauDetectorServer_developer b/slsDetectorServers/jungfrauDetectorServer/bin/jungfrauDetectorServer_developer index 4f6b9ee94c975e1c2cc73c177f713fcd7a01cf49..6b3f61e435156e743d0eede0ca645cb167eb22f2 100755 GIT binary patch literal 286160 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≠6*ADTbuOUMa1 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

P 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

DO%N~t1zr}1qhIPY*gKWXJSi&sp~61;fWD>d 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≤T=l7w{4e;|QL{LF~hmcnFVR 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 literal 321304 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�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≪OyTPkKo?q|;Y% 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 NUM_CHIP_INDICES) { + if (ind >= NUM_CHIP_INDICES) { sprintf(mess, "Invalid chip index %d. Options: %s\n", (int)ind, CHIP_VALS_HELP); LOG(logERROR, (mess)); @@ -846,7 +846,7 @@ int getDefaultDac(enum DACINDEX index, enum detectorSettings sett, return FAIL; } - if (index < 0 || index >= NDAC) + if (index >= NDAC) return FAIL; *retval = defaultDacValues[index]; return OK; @@ -882,7 +882,7 @@ int setDefaultDac(enum DACINDEX index, enum detectorSettings sett, int value) { // not a special dac return FAIL; } - if (index < 0 || index >= NDAC) + if (index >= NDAC) return FAIL; LOG(logINFO, ("Setting Default Dac [%d - %s]: %d\n", (int)index, dac_names[index], value)); @@ -1564,7 +1564,7 @@ void setGainMode(enum gainMode mode) { /* parameters - dac, adc, hv */ int validateDACIndex(enum DACINDEX ind, char *mess) { - if (ind < 0 || ind >= NDAC) { + if (ind >= NDAC) { sprintf(mess, "Could not set DAC. Invalid index %d\n", ind); LOG(logERROR, (mess)); return FAIL; diff --git a/slsDetectorServers/moenchDetectorServer/Makefile b/slsDetectorServers/moenchDetectorServer/Makefile index 9578f2139..2fa63072e 100755 --- a/slsDetectorServers/moenchDetectorServer/Makefile +++ b/slsDetectorServers/moenchDetectorServer/Makefile @@ -9,8 +9,10 @@ script_dir = ../../etc/ CROSS = bfin-uclinux- CC = $(CROSS)gcc -CFLAGS += -Wall -std=gnu99 -DMOENCHD -DSTOP_SERVER -I$(main_inc) -I$(support_lib) -I$(current_dir) #-DVERBOSEI #-DVERBOSE +CFLAGS += -O2 -Wall -Wextra -Wno-unused-parameter -Wformat=2 -Wredundant-decls -Werror=return-type -std=gnu99 -DMOENCHD -DSTOP_SERVER -I$(main_inc) -I$(support_lib) -I$(current_dir) #-DVERBOSEI #-DVERBOSE LDLIBS += -lm -lrt -pthread +# FLAT stack size: elf2flt defaults to 4 KB, the update and startup paths need more than 8 KB +LDLIBS += -Wl,-elf2flt=-s262144 PROGS = moenchDetectorServer DESTDIR ?= bin INSTMODE = 0777 diff --git a/slsDetectorServers/moenchDetectorServer/bin/moenchDetectorServer_developer b/slsDetectorServers/moenchDetectorServer/bin/moenchDetectorServer_developer index fae763e3eda759262ba5c0e5567f9a987475e1d0..69af8031f9f11335d8543b840cf8413d3f3c6d5b 100755 GIT binary patch literal 266136 zcmb514O~=J`p56^I^cj;BN>afv8>Q2C)NtfEi_6bOf22Z{I{c0Qdv=}89B6Ip{it;Cpn>cRf zxGmXInB~0uu}IglFP>a_i#DY=l;e2mE!s=aOT~X&nySt2uW(rQ_U?W<{B}*5)QQ9X zno<+0D7GXuQ=9&TjU!bnctYVA?i`|pO;YcS;qSD~p3c3B6vaD!WmL4AbawhEeFKz>E(MFg7 znst(dv+y}q8LZ_MM{!t-6k8{|-~T{cxP5?ARPGFDwbku8N#WaQt>+}Q$c#-*PSsYu zA+8Fa>f8*?F)5nE|GhO?z6(j79BWfEw1lzI9JB6Ii+(Y_wn%&VK&y{W$CnSR%Fg*r^#2itI-jZ9aPn&SB)<*f=FlDwNgwKS@tvpo z&y7&6>5$SuC6F$E_<(=P#ou|p&ZrbaLqNf#A+|ks5drDE`9qs*IUE~?u znpb8#(~Z1R_BzNLzvcx+1#SF^`&+~nTU6=OTpK32=64S%D!!v>jCHs*J8`bWskqF% z@#`Hc%ukPUsV+;T&mvMR-z`M5x-ckJLGHT>9YHp*JhXCFgdFrcAS12iRdVl=bqs49!l>vyaVlsdN1` zvxkw zayoD;?7%I*1Gj=8H>qio?~+f69pw8A+!M&Z5hE-d){(*WrnO8sVRcLPxtf*+6d;5r*hq(VUr)k^(&8yIE zg4$OoHB`~x@8COY@~9jMJ1jbuk}WTe=9op_dMB-X<0eH8eMEDHw(7BH4zoNhdvn54 zwd#$E9Qtj|b$wE`X3jYDo0|`EW+xowjj6+XoUeDPS&N%e*o69*XBD9SDOFbM^SRg+c0I? zW@Yo_rHb9NpFPF z%R9+mvz)9>t1VKMI_)o|RL!wj;qdC;c~hK2 zm%j&)GsSl%Y;E(+3DR#aGi5sB)bFUK`%L-saoykSf|2YuO5S9qLK4&8H#6OBGUg9_e}bo>PzVlsS&pO;!?HI z-zywm{bWmuQ#Je+7=HK1FjhKJwQZz#8(RAV-{%?M?~EY@SS58JRV&9=Ili_9eBE#O zS`%ZYL45roy$fX-Mtot!_f^1Wmf`c`7}d3lnri2J`}Y-45|o6`e+7KrX!v|R#_9To z?7R|Irc7&`I9EiGrr zi$;I8+B*D{>${=T)@`0PYfr&6R}GC5Hq+mg*uNV4MKAtE zv#yybR|u&PvgVAxmQOZ9?(&6PRM@-LSAo#eAO3nBO%3xCTv&{6w+@)iqorCHY>Ip z)#q&)j1CD{(}-pxno|OrF^1*@pXMSoB{g-1MJeIR-WO)m76`SCP-6n2jx|d?80HK0 zygyW?*dw8G2~|L-0z%zJD6=2jDWOnL3AgP1qs=6lmrBcaXjK+PAM48v;X7tKw7qGX&pX@b}1>p-)GxnFPQF%{^@rEwV|mY*m0~h#HHxbgmQc*b|+%B zId-HNZRt|_mJ%#0!Lo}C%T)TKj||IVuxu6jw~)&g%2>D$ami=D7p%T~Fk96;H0Ggk z`m~gkXv{V=4n>>(dx!?LU&6+`@JpY(@KkNp7Gvz;)2sh#gpQr%vZL0^(O*)p@!aApWcF5($5qq{W27N`YfYPxx}(m zZ8|BKjwK^b7x!VN$5}IHcLa2PJtg(#CZEnkzYhJCYnI}g6V&J1u_JA(^!aI6a#cX# zOGDwJ=vbrQaA?yRca^;Z3@glfttPvS-0fC0yx6PvZ1UFN8qLvd z?%k!YmToI`XpQ8Bb5{P4{Gr-F87<`e0`fvWd(KKEokADSDjzs)-Sg81_qIH@h#9wAgpC|LSq;1kVr0kQ3 zw~wJ9?W^2SxEO`E$g>eMjqyHIYPOu;OdiVT;F&vy=Kfh~rJPIcNS>J+EZgH}}%(JP1JgX|8^$==0p*{_S8f1j}r!UkVf2cs7 zt)(gZ;&oD5%wiX!u@H@UhKA(YWroIdG!_!`=ROVT6&D&K^ScFBTUTtZAY=t0pCqK& z_gEz)`6#1vwv~E?k5YU*5YRr^C^g~FKJD3lZBk`wPYT$l*c@0_wQYb_zsAq z@L67#s;LfzqY|>CY2RK|_VImPs++wT+O~(HIapn@(I0LfsO4TlpSV4QPc<@COT>5L zcCW5A`mYt9Ff7;-**MNqHpJG=KEl?UJe`8SDfrujKk6N&ai8Ju3uCp%yjC-7(vjz_ z&dJy-wd$wm2RW<8d-b@Jo|RTxyj=I8lev9QAM^WN;+LEeziWJcTN*qo60~5%kk;euMa3y7)n>5 zBq{wrlpgox(BS7yx4Uo?rN@ojNTIFwe_r&gJ4`+64zJ$X(35e!*wFJvc=h#OGyESV zyifDu=jF<=H!gDJXkItgos@Eue3@p1)goH+!0f9WMoiLIIf&~=!@tD!km3JZ`uk>V z_s)>@(y2quvx76t&-xh+1N}W!v(Z!i%rcW)n?=f+#5!4%NM=3ZDs}QZ{cM-n6_=+> zYQ`1XdgYp>xl2#7J~7_HED5_kvmCIe)U(pLRMswXmr8w;8I(RN?;R)oykWU9_cPOA zUe~1V=!EU5*#5L(yVOyeVf({ITCK*FpY$=2ii$0ls}@@)rjHp~CL?L)q^x35GiIz< zCpO48o>KEWv88H!?o!3o1DnN~g|j>>{UK7dydBZRo=5EciQVjVHZ@57Ns4G3x3!O~ zPedwq=QYIqH#NkTPTgJbv%*nV>Rd`a-Z4P)?1*MH#X(S+fOI)0(k{>gsUGp@`_7SR;0MO3nPaZfR>tcAB-M zPpVdoZZT!!)jvkV>^o8ojkm)kesd)zRcppyGwEK~aF|d@J0+hPH%ZalhH6~0NnbW+ zvkeug$rl+aQw$ZwSkEcFWe$CWZsfJ6EN@?elIL#r=I!gL*ps7d4oz`f!F)U=;-+`| zS9ekV{%-Tff7+)iKa_F3G^1{1uc4g>q-0r>S=k;s#5pW^>;(1Yp#O8HZJsf8>q

    KQrtE~DEC?s9caK4GlH*_6g{DwbNxZ(5`%{hZWLeZw18 z?ijU}`_SYpt@xcAa#a3W9&5i^_VIluO9yDBJ7rzW!e;~uN9rOd%WqHk%W{;&uCEMh zElX)*F|5T^y)!iV2G-)LP`)82B(M?}{c^~{=$EJ3df6}0)qtMU zI{P_OVuRzeI0tAsyDS`vKGo149ne2qkB*)hq^~IT=!7ZHEb8Y>Oui&p=B?YjR-27` z07>*BNt6C{U*0WU7;7Wd9=8;M;`0a~dBkx1R)n7_&ODL{`5-K-JsQh`FR)ViA zd}ZP5j)1RU@x}FDXryZa-#hu<$@ez}zW<)@>1#sh|3mj@%)n0^e&XMuYN(m&%aG;>=xaMHOjOxeWZLUsj-#2lE*0e3#Xmj2T>H}lRq(^ z{OKuU1y|Yo>}gqh3ZtjVRC;K4keklu6utj91GU9BhiKYU$5_+&Xi$jubR6rAD-`{` zucdY{91=zu(*;$tCw%;UcERc8EJ6*lc9-OJG| z?@)6Kn!N&=l2;oEvzaij6Xu^ChWU&zo!f+|B+L(l$tTS04#T`jm=ml0`78OghA``V z`IT+hFXM9$?K_{_sA>C*ekPIm!c9j0-Ga?; ztd4YrStIS8UBp5jzej5y;f%I6#y3(|RVMqgUCP4()IptMx14o=I@pDOyb|1~Wx zUs_zGWpp4dhZzs(|J$U+6;v)+luN0RmQo`vHwV&EX@uoxhA^oU`avN^pp9SA^?J=1%5Xs#s--kv0B}M*21y>HFSLkg{?a3SUu^*I~8P zK1OodfI3y`iL9VmY^UQDThqnAcA)7oG(Bed2Q;rUG+#mUyMSf|n(q9LG+Xxyq|A zZB_BHF4k+`7@%eC{(6jszgN#yWS@;bvr*iIz4{rC|LWrtlb`IexrFzuuxU?p5vPI-T!X z=dT^&ln`$;N(hDPCJ9l?dh)?|Q@yjP+jzIkXAI4n-FwF?`knRWb(^d#i1q=)=6_&w zZ>{;v{81_HXS@R`@zaXMrRbJMu1PmWeO*mx8
    VhklMjqTDh$4JXO(vq;p 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

    u2+RzWZ&!DZwaMR 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

    gik$%Ud}3e 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 NdDT|q0353w|9|DSr~?21 literal 298888 zcmd3ve|!|h{r~rpKrSJ`2BI7aazWI9Xb(gUhSgKKJ8<1MG zv?hQWmFl5X(V_;W?OhHvD7DzyHX^O4)Xyy&mWV+Q36fyozR&mU?Pa5=?SEe$k2ksJ zYiH;8&d$!v&R%!vlyXhevapF-#?iQzY2|5Ib3t8GzqJwH2Rzq*a@z^~J?_8k`Qr^u zyAYdzU4&ga+EY^&IQ{1A&S!i*u>NA>UVhzs^qh@BW6VSi^X&e|WuN!> zw(;hkUYPG8ttC^_@C z&RuZBs@30{UVEK3yf&KCK4da6$i+(YdisJ!E9bZFzE1Ooe2;iqG%ePHlxY%*yWCiGGzat6YI(hUj{DNQ9=?)*_%c21m)l>BBa@B9o?J|? zO@)RQsc+a2G?wRSn7(SV(Ta=KE*Dy553R+Q;pkdO+}OUzZ|6);XsFSW=`mj@4jPR| zH8FEcMkqEXs)sc5+Kf=tWBP-RYt8)OcE?9|nBKgMf`Xx4t~&npRjxckHFM&N-n`Rv z$90L(cGQDypW`tvCl-NY8dgH8Jd!$dzo#;`Fsc!of{aRH^X^5C-(J%3ZsBBOjFpS& zVnWEoE;EXcWn&qEM16iB zGtf8SF&`WG<+wcMsg5mCaruX*nz*d$7ME3pnzSz`EF*S!4uO=GeeIR#zq*;huywKI9HS|-=0q^niM))o_fyPHbKJjUaiTMODOWI&{f}p#6PGtP$v15iCt2f8PytN zTU1%ZwMKmT9iiLTl+?4|`A0>^T8EBmpL#rz_Lhp({aO>T zn$;~KzbL|fV$gncxmWkuzr4gsM>~9Uc}`EC{mc8MSdI7e zG{$@SMNj=gtOmGZb*dJR87fwjwK%cr+bvdo{Xrw*(ZtL?S|WBpmCd_9|_M4d2@fHN5V^A*OvwjJyXLxW%}spwbM0f zPX@IoqXWN}jhI1^c)^GuTnSeyt{71aFN2pUo;@M} z*THp)%SRN!8{iF!r;PB!jc}vli6eaQ4tR&+@gsD&1#VG1W`q~+ggX_F95LA#6wk%D zADAVhopkrqBq!c}zVXUw`d7pmS0$zXophlVYK+Of;j!oIWA)JzW7h_cQQ-G_ z^Yx8U>MiFj=e&MNsUdRS*re2uW8+Ws%kg@S*JqY;Rt9G!&11)$7@ekKv~Ro@|GEBD zSypim%Oy6goYji2dymOAD!%qf;>LV?ycVjV?!;+1{6@}&fvNQ|jTDXdzZLZa^r_x5 zDSK}jzXIW?W`67WFY3igANzc^cZl!!$Ig6S50LxBpfj^?AZh;Ym|gdi=9|YPWwpe( zhTQW~Yu}32N0;QhdUBZSoc8Rwny8ki)AIPUG;CuuY2K~UD=B#Pn3TXR<7-q}i_`sy zNPUShG0THR!gtW-zcQvPFEUjL?|x1XWN-&a&b`b?YLW8nP)B)2pqJ`H*#1bqWoilH z@a8wV)mn16UP_E|!Yn7uQo{Vj7|k4|HI~LH>Bg9k9Hst~hS^zReuelI%95N;#0K~i zQSa!<6Ca$l^yd6p^26Ipca&0;2-nw)bF;-&gA92|E3z^$&3tlGBIevn^jdFTmhPp+>q(v@%}7#OKk_ZrcKwnPF1CJ_ z9AR`Gm3#H)ntkWreU29LaAa|Eto74m&&T+yqZ{&D_y8B6gadXYA5@RRl z?#votBsilaFr72r{#J1_v1$Hk(uw=GiF-J9&FJfH9=BK0HEvHNsjrg%hc5VU6uFjz zMx2zzT`9XwrL4JI$}&~TyrfL@5@T2o4<_l*iTMz6)?@y7ydH3l7je8u9p7}uWr5&4 zTc3>k@Hx)elI{cN+UbsyZt;0)pk$u-diWg2rvN?$dR!A2s`P2!vaep}S-{=<%%#8L z^vSinO!}PHrTg*Hqe$f%b-M?8SFiPwZs$$V{l;U%il%zZzXf^P>A}-ZkEA)bQ`#V@ zwfA;P8BZOjnGZed%{wD~u7u$9B1()hVqMnbReC&iqa8JA20NX$cV4ID*vN6t6M~$b z?RS$?#=WTL%ZbHuV&U&}?hTi9HgSI5IH}8h{BiCIKFfpYQ{{du&l_>Bf2rr*-Um+h zhZ6O{P+(*Goa(8S8>>V08~w)PTA>lva=C_Y-paiNGwD6_rVsijkKfQd_8IXxmAKue z$r;t0p=AvD+fc8+r4d@#%!_C3L^BR5RvCh*xjX%sa3( zuX#D9aV!|B+^DH|ZOuv8VTJnPa_#Gy`40BeZSJs^QGThC?iSV}?!KGIt4-w9y`MYn z%*M|puWucjG_9lFyz6)-xs;SHzCOY<6iU_)mLj~)9*EN zX+JOV=+WN^e>t?P$MM4-gz3JPZE&1W|u|V$!_mD9-}A&`HFzhWOr)FZ5@RQ#T4y{Vp%=N{j?`4h#5W zQj^+y-7kI4O8>hbBHH;0>x_VruE zQPray8}jDtJ6Y=JAXP_gcXl1sYZF{ipGMom((B9(WRNmCHMG?^^T)<=ac|dO@niSN z9<)HZ&Gx8t(~}Js_sJs96I=t4uoDl*|8dXitK^PJ>8ILyJ#`*^$)5Bjdrlo~+%z*5 zB(*c6CC5pv?SIbv>tkp58^V#Wo#x#)^(W0WJv~_QT08dr>8DIPA~jBW8dXQ6#$8C> zc8^o>T76Z<{2O8+Cq}eISzO{!SDvGR9@DlpWS=8|aed3(Z0asbs z<1N*+WLzz&^2_F&pwUh&+Ivc0qOQZ~^S;s{t@1LSF1d~|spa&9W=KEEpG{vddrNdX z_5bJTm_OMeW%Q%---=2bpqcMI-Ia$uHCwZumh){NC8VaPXNJ2zNqi#VYSq7JjE$uZ z+E4F6LJVem18;F928}7u6h-vu_&q!OEn+e*9g{gKCa05!$Fz7%{K)mi={rC5v^U_H zEWcJfox}B@nU9JxMSk7&v?sJB-D|hU#pHZ(>kZJNr22N!FYTeV*Nv-1B**#Nyq-Rb}7Z>=lPAlY6;4sBRrJ5m1bV#lqS7$xqlUM zTr>MQs_FxLeR!J)Z&NC~igb9tQsI>m-s|b`w&HWP zeO`Nb>{`m{kS|ck)6=?(G{d+fQD162cUgvUXF+BlkMW)vA8TgtQ1@7PRV;e=<(?!* z{Kj@tCcX_dnn=UL>oxOiMrz)Q*&#ghwITdzpJw(|A#{Yfzj%A-W7l%kc%_xD=Nji8 z&oiv#%9tAI!%4nmQ9@1R*mgoIA++1SHiWwg;e$5Ehp*39-OC7s*RJtP4?Fq#^kK=@ zo6eOO%_Lt(;%a2d)y;>U>*9gKQnRi-*G~1fzBW!9_G{+qHaqwJkHX4}M+Q9%<3c>FIMNE`COl3yn)j-2-2Uk2WVC zKYxXvuYIkbP54=q_S30vQ}FdleEkvUKk>Ea*K@u%eZGu8N}D@wV{|R;IW=dsH);Oy zkkl>dHT~z1T$hiZ6ImO5LNiBb_H%m^PnXg^IMM%UbnFv}s6Mr%EPpiP98V5$CD z$cWwjheE_>);T=8#F~jikbAQ?@btXGm_J(F=XZKxG=D0ihB=HH=5&p6#z|M4bWJ`a zvnbNjUU;Yyf6hB6XlOpo(3S>czopgb#9b%u&O0PC9OCY~hpKTm^c=t8(W|BgWB209 zhwr|eq^58# zl*716j>lXxL`vcJZPJ!VDQs^`;QqnUIiXRpLcjEJ%3@{ofPBC6a-U0Dn(_0WmXwRq zu}=Qa6FpjTwfs)3n`|uFo{L4o(vJ+do*{a0eMo<)ZCwdD!1LZxZ@KjCB%V%MJ>Kv8 zT$G!y8}t?>-X5kU<+qfS#~a|cC+`B^chyslmXB{4UhgD&arkXhu2+vUj;>`Glf8_5 zPO@G4Jk$rTH^+8q$HIGxZ!FJmcD!fM|Lvj>G&+53K6GZ9DxqO%s)7cmNqW&IrfE6U zH%&E=H%-!4l6giu^z`g!y1yh(L<4+MUfx^}CNl-EogyW+{h(7~9S5bvULGZ5ZgR(W zjke)Wzf>E*++41PO&z`Erpsdip204UjyldWSUdgeLVAJrv)8LUdyQRNYLw+>V9v8+ ze@2X|PbsEfd*4ClPW8uwQqS%jl{6c{?d< zC1tJMQr7>JDpEEy9hb{hT>21~8&v*=x;;-iaT)h)`&@mM9ivB6F&f#6o=&g-HAYi< zWf)U>x%2w3gC$1qe(IFCregHxz;R;K(v$KYN3KR#pm6)z2sP#XW6p@|sp_e{eUHaz z-{U;BCt{K2JdII&-+}13wN*S{%Q^QaopW+jjq2$i_bm4Uu4z~8YB@pGtqj7_wV<({ z)UGGBTW%U2)2Uy>qxr|FUtRTKdhIyErdLY;e6q2vS1vZ0QDaIHpWf^hsh9I(@Py-H)w{F$+7)IFZ+l)pY-NB9nv2R~KErEZq^ zJHpolUY+Np^u1K>l*Psn@^ZpkuF{YbOEip|pA$V0`SPetG;H#;>s%rIYQ-<9$C~-! zE0S*#PH*yhH|>!-xBHQQT{T&r+x$GEj4)OwWhA^TH4^^aqM+er)q^)rj$AWK8#8qN z7srMCzx6&i!gz-BCO2rIl1Tn&{lQ>F8xwl0IuQK-N}=5$EdkQ9Ih7VqdW?4U7&9GH1x zyDrZ=`g+a}^E;e3EqWc-;Qa}wud+EIeU&9=x6iGPMZ+brU{uziltlCMhWRd`?;vAo zo%G>upKSk*hc63g^E9(etH$LejDl{(->rE`^G6Bk*GT_kWugf`uQ@ws{_U~zQhvNA zex$~J3WPz_ir&8TkkSC1`yJ#?4M?|Lh`)e_Pw*JGSm#8s}ef9zcS zLsUGPM@GW!^BjNX5uf(CL8EVHNx5D7COu~Vo%NU=h=jw;@wd+jPxX|SGCM2RR`Fx$ zt6x2TiZ=1FrYoH|+TmyQ(TuD5jaHQmM`=j2#Ju0{V^Qe@~BwSCz z^-U^H;`)9Sr&-FiA+A+PzV3vm^4u<)?Hu)nmXi~NoZ-xp%l*_I^SfhX@#ABksIuCV zoInB-SGzxwk_?qf}V*cYwc(_5>ewFykF zv3jEmSI?zp1&TtRs~v5C)}C@RK%E=ZYOE9ZwLDZ~6=-pCyHJ~Kl)asc<=3`{mwO9j z@DCSdzu!{I$TWFhN#57*ck1Ii`=vgtIa5m49v_yv6J~9MJkv+QA?7wo)BRgY?c9n- zb(F?vVqPOTCBJ+7zv_5nRPX(1f9DLXx9+p!(&byWzbPs{S6|_wB;>D_cesC3w6Rn@ zA*yv14I9e-WY;}e_c>MLo<=H`lZq?$hZ^QYqy{b8ABuR)v1caD!N-CPtfx3u)(|w- z;BHNyk_hep{>p}h5oyW3zrPZf!_F*=Xsn(rG3xtx!~(@uEa|14j=-2=Rx;s3W1ne} zam}%0(mY{*b;AgJYIT{K3p?Pa&N$_ z1kWat52IhQbM2OwHg3#dC2JY8uPZ-t`VrBOn(*mo-Qvm<454~e99~gz>Lit&eI!n= zu%-sHURG(SBMlg7dRbQea8{VOzD!)_eB|^ymVYGokt>L6g1EL3*A2vV192Uu;yNZ3 zSIK9ItCWg6uH!#)+PS$ONjq1h;u_HJAl-M8{-+}Uj!2D2)Q{SD%SNd)vW~Yt5_sXq zFJ!Y0?L^YMz4H!2zLOX{6|o{x=C*6872>)vLNhn_z zCp(noo#BYLBFt2|XO7pKF=+c)L2A(tJ}=|{KqqT5614FN)`#`9`w41QD)-UewC%Ez ziQY=B+~4)lL%E)p#A?2v%!yUTlIA6y_58o+bDmIqHLMb-iB(4@8-7-y`z?J{P5O6P zeJK6AroJ-$yNNzrJ99GhNX2kBfvXuf^U=<7xMq|Rp*75Z%#6LB#S7uoxqzR%hF zq|P2ZV@~uId|1Ho1sp&8q0~gVSDms?YNB~Y*y&NqO_94V{V2v*{g%_ulKZgCd7nV< zw+>(Gbm_^xt^ASe_{fLi&nss{!+v8KJ+!kQPMw+RFNrqJrRAmk>&eL6?IG#k_Q&T< z_`FH^{N#ty21(ET?;qCV^U5>4q3YOTf6{#ZBQ38VZkur1L|SS;l(s}%Mm}uBiq`TTF9p+M4D@+db;Hj*} z(-69cQfsash(ePC7%*_7=Q%F^5CHqsxB zNBvXf>gXyrS!-ECJZp&O2Q5z9)kDSeuczB%aMe?!kGfp_-^l+)RGuA@TO{0gv|TB7 zZ~3%`?7sW?4=Gpb2}0a7UC}gE6#Hnuhuq;yoh!~empZ~~0LpxPKMhNo54Ok|Qh#4= zkvzWZbic8gT*x8K@+>I7_ty<1pUXI-j5B_w;xA|Xu0?9<4XHB{b@ub7oUx(^sC&&7V9&T8Fr`CrSsoO-k#f7avAX)Q8CB-hrI7Ruku$Dj36 zZ9i%_-)}simBmU)<2KIN#u<4nGFv2PoYPXn8SSUhj&Vjcp~@K&vdqqq6f9}B?UnH? zaes14829nhB#zZ{x?K0ibzXlB>j<;{XRmWjX13JhejEP#W6P+4@}&B0a#G6vpGkRo z6J;d%DSsz$g!>xLZbF4A^&HfoF$~{_^-r45?R9zt|Jq9(G#@_AZ@hqOKd$`7eacVa z49=Fn1#-6XQ|R!6wwj~-4B}@HKbP%wuIu0LZNksW(?X1LJaUx&$I;?I(%f`ZR-Dhq z_3Zw#;(Wngsa296tM*E*nsFNMw1i~k;H{ior>jJ?ja@bkS1+)X6k{LBtY z&2`4yvT5J!^uF@oz|dNr;H9oh8l_A;-abD0wVq!+_~l{kPj7$223f&*3V&r?=t=z5 z`FkQ|u!gYL^p`Q3lT_H!+LfrVd!E*?K}P(K_kO{N#6i9J5%$`xE52;%FD>3-OG;jR zIc2Yuyg7{3j>-Imm#r-u2Nd8$-?oy7c- zymumVHuF5*9BJbR6>!HZNScpXP8X=FK_5R~hxP zl8F^qoIQoJt1YPqlG>*%sRs+x+1D{bA5bCp<&5@uvic>kk+))gC~HzB4zf0J=tH9! zWADDsR9z00PF6E5Up$gu>nBH~uX$OZah{z+ zf6*j{wRN=N-R9fvaYs8QabglzF?nf^q+Vjuyhl?1G%<W`nERN#F>{vkFHT$6B=?_r9n?UHb2t@eyHw97 z&U)a;JXrA8kE?z75OYu|2+`8_JvL3?Ay+CT+Bx);T%Z9x|qifvW zUUxNer;OY4Rv+=7cmn0GVlTCSu8MupsdDyzQfJq&cI%4kWbM|0?HNYr)3zUXywCa$ zqn)GEb-`5$o zn|)uAhQGek6f;u20(^Hmca%nmVI% zm0iAaMtoKG@oLdpS8XFNWjwR1|0#JXxio{Etik`96QvEBsq#{;;%Za!@{&{teBYpUG&Ti-I&fQM0`BW8Ni$7^@Zn68_3-CdD&W{q) zvQ_?&X3j-n3}*miI0NYa?{-SLhYIO)EX`c}svX7{e9uXR=TqUG*)6;$)8YMnx74bYuJF8+i)LP<>FPN!NXS7#{`GFV zcSXN$cOz%q&KdQwi>Mp3aWNYgi+4Ny!6$Z0$<6oMarto?kB6U5(pZe-UmU z@JmVkW@U(8nq5+J=p%Y}JI?{%+FgU&wjp!qYkJCMj;qKQik7J7ZRuY%;(H^$e_}{~ zP<%gecbGHYAEJlKVm~17cHm+ME62SF^xXuaPqh_#ID=Wotbs z*)|Vjo2T)7qG@>@JTLV7=!@&sWsaU_WY(t3lkxzayD9w)`9GgfClTr-dhhav!Idg* zQtyAF;x=vw^^W7SiFZ)N$;YvIDo!JZNKBmh4JpBA8UKqAkQw&`*rs3Da`y#d0X6!FxGV2U*TH= zY=w9JQu`~MK47vjp0T{~mYnN1>azk3fruw`WUgL*M`&94(${^zSo-?FyDzXRk6zGR zdGx)ja?H`XLQWyRJ_N5?habaYkdq}(I=SboW>)=7S9wBK3PYL^jfGzYOp zb5LnO-jW`9V$g^a$M_)o=w#~Q3z^joOCm+Y^W99DiP}7v_qO&fI{NUblZ`cVaxtAZ zr?Linuu`Lr-fi7>k2$ZOmv%NkLf>OBeUHJkW0^I~RY`jPkXeI2b%VX6anaFR@u!aU zoORptYq{2OjhVM)hM858P#?`?jq2!qne`mKW$0<+3a@j>~g!X|HjS(67MdW?W)s0Xv5rP-(s(Gl9!f2IsKH#G<2} zLupNMgP9qbTFk?fllZIArsWOJ4UNOiKHLqxXOB*JpMBY=O8401vx4!sBYx@d`!OnP(r>s^YsLhCKN{Ma>wnS_d^xY2V?OKbgV zyN>z-y(&tKb*Ff+YTP;R@v)XGBN!`Dakw>udxbf3(C2d{2hShcb+%?c7n3>sjvq<= z9>I~W_lf_cOWSzIQ5l6Ti%pMa(6)WK^}3bz=2q3-+?r}{enPA96WWSfX>a&z-KyG~ zpQ!fcC#t={W%*b6SA~C7%D<|Vf4AY^ZTMG(fBdzolz+D=|87(M;j+9e`sMcPcFw## z-G1GUAGaSZZ16{>MN5s&Q+Ot&q(0!i`T>-jcL>+)5Y61=3B~59TzlUWBG+C%*&ivv zB{PJl%%Z(0DDczzX=dp$E$>81t?POT8Ws3~nJYbZKZttesl<;pC(F(z+}*{@yF7N! zM>C&Mdjb9W7W==ejF?QXaXBzzlSGI5RR{JPioyu&K*1Nw?Vsy>5>3Eq> z6kHX^C@V1<@v(78Kl0)?{oSGE6RT7j%=`j7BxV=FOT2$Pd4y3x+bws;m8|`!OQ%Gy z)dRT|_R$h!D?V>ksX3ahLZ6j75|Fs2lXt%6rb$v>DvJ1I)zHdcL2F$qo$8 zm2$sdGymDw-LA;fX&bS?%$1tmx0Jns>ZSZolJeKN7h&dIn%$SA{Iy1o{`w?(eGUCd zPb$P({9Ym>P+D)V%xIXa`;;}v-}9E0MGB4Lq}SV%x$B`uGhmJ*|fr~iXZMN zd-!;9?=6($D|=3Y2f>3B-`g_?2jGC>r9F$`iSR_lcl4A!d}hEi6yMUb2wng$P<%sA zKU@u0E55F$4_*zgRy?bxtoU0GuU9<1r>s2K3~yFExu?4{zTYR+%WbjWLoPIK&hX}D z4$^kN+{@X&sP$6PcBzy05#w6h93QgE7Tx;UJ7Deh8ioV~T6x zN*Ggo54;@46fc3pFsAr+coU2%UI=f4F~!%zJ7G-m95?}Eif6*!Q(2vHs?F2j0vJ=r zFNggwrnm$i17nKE!V_Uk@hG?)#uN{SD_~42&=33YXW9s-l@E90VyaXiF zAzTGxim!)Pz?kAWa2UoE&xAL_nBr;hP8d^sIot|kic4Vabn5%*Hjjl1U`!n!1sB1X z;^FWl7*kvbhhR+cKzK2XDb9yi!5gHopZI!I(P!20R|d6mNlNz?kAFya2`&Z-iICnBu45^)RM*E!+rW ziXVb^!I9By+V9Dp%(d>~u~V~X?P zN*Gg|1J}TqVh>yoV~RVxgyOmP&R0%M9d!XX$_{4~4>#uTrG7sHt1hu|6*Q(OzLgE7VTz?)%A@e+6k zj48eyZh5C;7dS^#0tHmDlHpe;}xgh36^1_*;*gc>0X+5qi>Fz9zsJA^@xLU{rDBmtoZ zAwPscHP9FcgYJPQK^U|Ynhjylolqr&L5rZ}5C+`{g&_?3A+!m?pzlN5APkxT?Se39 z8q^M9&}67!6gfCb=wfIXghAt>F%Slw3r&PD=xk^Pgh6LO3m^>gL(3ox8VH3U4C)7M zfH0^R6oD`(3)%)@(9zRqMIa3N42nY-^a<1nVNeT{H=4X2Eo4B0APjmB8Uta_+t3sU zgWiNHAPo95v>3vmm!TR6gZ>1qgD|Kbia;3jG}HuP(Bn`ugh7u$Z4d^nhVsrKp63Yt z8X5#)(B05T2!nnOO@uJ03JO6Ov=FLF1HV=Ly{f zjf600F%*O_=qFG)gh4k!6%Yo^gDN2m3PFn@44Mh8fG}t}vVUhcM`MXf}jFuRx0- z42nQ&APm|Ft%oq^8E6xPK~F$iAq-jr?SL@oey9b)px;295C;7cDi}*`9V=7~1t1K% z9hw4R&@E5}gh4-o7DE_R0o6em^j&BZgh5wBjSvP+h2DfPXcDv&!k`kU8N#4(P#c6n z=RjHG$j@;?BcTEagHD5rAPhPM8V_O60H_SYARVfJFenFF3}H|Pv;xAQ&xg_$Kp4~p zZG|vsKNN>B$bvc{4EjIFcL6=(3xsw;V;~HA3z`jK&|je{2!mdORzn!H8Hzv{^ap4c zgh9_iZ4d@M1?7#WWgjmThKe8zdI*{bVbDsb0>YqQLCYZwS_W-^FzBbyRtSS`g?2(1 zbTiZfVbFXi>q1K9LZLa3AHtwn(0B-gz5~sGFlY+22*RLCpc)8+CO{h?3_2fr6T+YX z)B<79a42g6p-&JR3i%-nIvJV>VNd}yAHtyC&@u>vdO~3cgOY```Va=SLpvc1Ismmo z7_<-aUc}hSMM5St48ovYP!PhPe?hY$4EhID1!2%%pw$otHA3|e21TJJ2!mdL5)cOc z9vT#+MF|S6gC;>3^joL`!k`DBY6yewgTfF7Er%K*3|a!kAq=_$(n`3il?eS98U|s| z0%#(HK|g>hAPo8*v<$+aYoK)y29-gZAq=`4+5uruDU^UP=mN-FO74~lje&+i7<3jC zgfQrIXf}jFL!c@MgM82m2!ryW^$-T-LhKhU24zA!Aq?vD6Bh`B4ncVrbB$dr^f5FN z!l1p-BnX4zPz8iR??Q_q4B8H@fiUQA&}ImOwn94~40;J_fiUQgP}W3h`9z`TAwPsc z>!I-w2Caoc5C%OAErT#<6%>XrXa%$h!k}M3O%MkC3`#&4bQ`2!LNDPGp-LzKVbJx^ z6bOT^gDM~lx)xdtVNf|#2Vu|^&?X3jE`@eM7<3Vobt$R6RHzsl24T=Bs2IYa5l|U~ zL8n3sAPgD=Er&4Z1ZW+EL4BaD5C&yKJ0T28q}NONS>we@xiVJDm9f%*H|b_I1RI{2 zKQmHtoSjhWLrtvsjmLb<-z;DrY60IR@v?Wdy~~8Gc<_$Ccb4pBE-QLN4d?qgRuO03 zrip#zt&^QOD=)M2T|Ok)drjUDC>YEa3ky#ac9%n*tb`N0H zV2)b7J@aQdp*anqNY~n$FVExLlXv`i9L@BzkL#D`aVm&K#kBu!9w$7V_ZX);a~Z5p zn8x~qX&qtBe7QsBaW=!775}kA=5cnyI~70IA@ew`aI4}cJ7gY*Pv>BA{-Yf-k5d2_ zD1M+r=5dPPBE`Syka?W(@OZ^{cgQ?W8C<6LXB{$+Qvp{fzO_T1Oz(x9rST>hu9~JN&FSf{F5I4^CYe=v>D5qbpHX)yJ0-}TY3Z}Rr_TCr zp1TCAe(Ic+-W98*fZbuVA2JvIsk^Sc^QkXT77brX&uB0`BUZX(eJ2A;)XP4{{aGh7 zqQeQ*W3KKYt1IoA40jJ@>byS@Bk;KWYB-Eyw?Ct}!QdQuDcj zEv{gT9VV#3L#fl3-zIAwwcfIJvnh79>*}iJjg_v{7aFJY#>U{ZB6G}(zC+BvlQe&s z{_@0g>PrmIGSkMsIK7>a?fuKT)=}iJsyu0Gsr`_ecpsrF9C|GS=(P;6ca54}8wtx^ z@2UA_u3Y<13x z2h%#$P%;>;leB89Aq7tQ}k4^iIF9#&D`Q|3~J z-OGBRduv?EGL&WaHo24?C_C=eU+D5@_ODpE^s6$L(u~sls~VRwaRqbCE1F!&&R^5I z{aSyq%b!KRp^pBh%%u#wkNDhI<5CK0Xya;{T*@w#T{Sv;XLR{AzLu7*R%d68E^W|C zX2DnLRzH`v`ax!{AJo}xqs!fTwDo8OF0HtZy&dax_S5Kcw-{|P+KDc$2CW8dfJ^H{ z>qPUpwDN~Fqx@mr8tBr(XkoOITw3T6R(L(4TPM4;b!h9*2D!AXHSFfHMz;pLv`J`_ z&`xn_>(SPu4RL9$Xsu{|mp0|MysPzF-I5(coH~~EC}BLRTSHyi_{YfS$8_sdm$n>j zIodFn77CM&ux_2^(l(%NKs()~En7=%TdP}VxU@IX-b5>MX@SQzBk;Ix4R>i(XjNz< zT-q+QU1(>zv|&$Br=HNQkuGgH+H$nBT-pw_9cX8}H2*r@Q(mWA0hhJ_Z2{USmli>b zppABE+V8kq|4z5gacPs#CZUaSX{*szqn+#0;%ITS^IY1c%rLB94y7825 zjdN*<^_r1buUi+mwBXaM(tldF#=Epev_`ZGU0U!N+&!aP6I|Llv~_5`JY9986|EKR zBA2_0-_x7;y>10v+D^2cXeBOf;s#oV4Z2n8((2Lb(JpprMbFZkc~-Y3y0jH&E6^@+ zX*ve02ORGVvLA%1GwV}14UFp)sZ{#}Ks9RHA+Qb*gmlt%a%%wG=HKI*(X**vePhZrn z=`O8&6Ya|;-TID8+kv(Nt=y&g{=i!PKj_v~F0Br&4()1}whL_++BGiC_eakCqi)S` zY5Jd7CH5!Xn(5N~5w4ktZq0IO%h8sjUF+7OXi?po?a~4bJ(tFN z+(s~_Ti(SPug0TR(Ma6=)S`KXYltyJ%l_>DJF(n(tra>A!TV+NJG8+ljWsrH%YI?fAcSYpF|X zMQcU7%cZR#j1`0--`#QQY1w~xg8Pqd{lcY%(ZXnVyR?cAi1P=!^-Gtw32hVFa+mg| z!M)bdt$SRWzMDMQty}lHv@DbB!_=)`xwJ`Wlh9VUv<1!F8=H0O*DkFdtsd<+E-kQ! z>wJ%H-RII4p)EqIacOO6ZD_SFt=J;(E!|q_($=7@L0je0vi1_^y}Gs9rFHJ3Z?;dj z?ssWhKca4Yq+1WTw5nG67OlGVpiA3@whOJ!rA^#Vo4sGR9&%}Xm%!M7_OMIyeN5f> zShpT=X=~8dpsjIf&1lVNzjbN;PiS90(XB^a+HADhXpgzHV1nx{p<7{>7ROy2cWYf* z1?^P@?bYKhZ7bSVv?pBJGW=VHf9qUY)&cVLfNuTHrAF0BH06}WrO zrENglfcCsgYe8#4t9NPZlJtF&y0y`z#nIwuFSxXzM&4_>^`c8-&mChK+9sE#dFT^* zbn6c;jc;NZ3()@P()ijZU;NaqKe@E=8RS)lZbe*LHCi=V)TL>egpsLR4KA$=tqd*C z)rV_FYetK?+tzt4r%d>qPsrODoQ!4&~|A>n_dPo3!=T zt-rXm&1jp^wz)KWr%c^?!=(lLP`-V1>#r_tGumdfzqz#anqArkv<+x`Tv`Gxfo8e1 zvcX(~gLP}KOIwY$8m+~p+3%g{)`u?5euqJ~_PMkjr_)B9u3I0uwCXcx56;l7R+si> z5%>5a-P-Tc^x@p&hwIkIF3mrJ_H=}9ed5yU(dy9>E^You@@k}R9dK#IXHlQe(ydQj z+9I??Xa`-|g7dic&(p0omli>bpdE5)>{MzL=(_cpON*aRyL-NF9d>EMig~s#)~$Az zwhV0wO>7eJkBG-%YL z)uSa{S{qs$n&xVE7hOQUT%cPXmli>bpk=tUa1C|5Mz=CuTJd=DdAx3AxwOS-i_v(VAppieVFw{l!s-9_}%3mrIcH#ZuN0#JJ5EZ^>t~B&=#TTF3oo_eWZ&S!*gk~(PpFdb7>nUa=lGt49}${ z&=P0`E^XVTl=-EM;kmTgm*L-KjN!R7Z4&M2B*ySu+IY0_Xg-%#jaH2|(51!E;%Fzi zv|*Q1Cog9V&!sIxTZT5sr6tf3XoFqa?8(G$GGllyZ4ufcv>`5SHQH)4zf0SRwiB(; zr4@Xe^7uAmcrI-Q+6=T)UD|52)o8<9+D^2cXs5ZfK~or0ox&I%Un6JTpg+Mpo{X^D zGY}moJ98UZTm$xOz!&HAGA;LBITMnyET}ajbVSi^cOC!;_D8YS?+v!m+|`^ z%$dmE_g#K>&G$?x=ZhKT&KENpnB^Gd@-;K<>j>rRaL3n{-X43uqX~OIJ0|at9zEvx zFEcq#yzDpSc~|zZpB|jOL)4ewFKs_|L38^tc{{%SnEiJA;bVNS{up1VKgRd!kMX_w zWAb+V;bZc4{NZErc04Z2Yof<{TlEOO9Z|j=N%_`+Zyoq{1mE~;9Z|k@DBn7iZ@9#_ z?r)cdcsu@c&iwqC^LG5_`0@F%CG38+l8`m?^uxTT&MX(3519VLd=1&PUw~!~NGZ%| zQ(lY9O9PU-OFt@JThyn&9yFGfQ@hLUvnI2X+Z6{I+1YCg`!Xy#z-|rZkI7Nzojl6= zpzV?wd3+1wn`X9u6lO1OEpM#ucvXe^&jZe9NwaW%((BwwK@&O7b6ah6%ysfUBc zo8--#shF2i$N3)oV9BFcLgv3^Kd#-0IKCN2`}-w7i)(50I1p zcEiHohxsWGmD#hIXRYUSH3R34;-3oY$(gcaIH8&oc8ZhQ{&GeR&sve|jMxrT}=TDlUqw;l{t}xne?7qjF z?9ujh@tr_8jfBJQ_H*kAYe_1sQgZr~R9Hh3VZM&u$hWteqOANfPbbXlTwylcDA#0H zndW>$m|2J9o*?T$x~I*WXQyr7CrzeBZgE_-?jQj?40^0_-AJxzU;P z-@2%KK9+qUAHS)*9&T%&+d(cGh0JFlrP9LV*)k1rhXjiAr32|PY8sA^F@rILB0bNwFshI}q-v#%YwZtQE~vb4fC zF&$aTE?|(uke}g#NxlWhBpz9 zDgQ-0>WD|(RreB)pSa>-s;?wS`Q@s3iXxa8NKBC z@8>m4SDED7!zF%<<-)%Fe{H z4^4zCDRPywCPJ?2!R(F2nsUE<17(1p7MU;V`1wDdeXwMWLxBH#`HT7A>yL(m#s+-Y zz*SrHd3yB)@6by>%l=N7w1DDoBwT1*!B-&*xx*Ic^--O)7qFk6e6Ni6YEpee+5aGm^t{EMl;ZaZzF4!a9f%$wc6N<(?s4pI`bPS! zRRw!TQ|+vOU{za-TrUq?+V|3Rw! z_gBY;`opBCp5Bm;ubM=x&y##%gLbc&busK2af9q2-O&7bvMDP4f~%4>T$w{%?e+&Z z$nL0JW&KUfDhicoGztKdDA9uz07dJ>x%BkOdz9BE04#=0L z+UM3_VdCs@$SXM>SJ-<0H5?YUP(IXc6uRBiPJu8O&?p8G#~x5^g@dB26En4^+lS9f78|7 z`yxN9?A{m2y}o;&?wi{6@`SY5th1yH-R-(Hzk42aJs%&hHjPTK{!i^r8Yhl%^7z($ z_Wmz?<7=N>6>AR5{x9tuZRhB`efIt@N%J@R8aevw!8b1`XY&xE?3 z$(`$fwbR$IcKVtT^o9QUNtZg~ZQg`?SIn$^T$AR^!%O^{sXrt; zF%JC--;43R_?n^2ylCcQY5$XEZ}t5J@oNme zHg@aR%!8k?Efcx!B^^Q5hz407t>xuHm3l75+E&6j*5LJbDVmwrz%wMRh9_Y6bv~Wv zlyg;&iR^;hM=R#L_LVXDGDA0ieX=XtoVv-zM8cX#Sk+t=HL+U?-LB+0GkgsrjMuPd z;)mhX{*!Ay3=`i+KGO;{v#QSiDnui$8gX^qhf+`cr0SjzrJgMRO!Drmy2e>qO?TfDZ)jH+NYD+?DyGAodn_ZgSr_jtnpLmJ$+Yctl>2hLOZVjmYvTymd zrG`Eu16viXCcdNi-c4WD5GT!ei?df|Hs7jXFCSuT`y;!YeKA(~Y^;_+>hAj79siNU z-#(}Ran6yvqLyN%#z^8Ya)y&%n)$}=FQ@3mk0nJnJormL*T93_OY9!?odzkfdcM=3 zna}ftrkUjrE+q9+Nc|M6e{H#{WAYqf?@B$EuYl+9)tD!Cq~p9Q{fpec*wtg7G=q4~ z*oU9-{mwPPUYsq?D8Wzo)&u)u^X%MJ>(4n({cxAweEgh0gM9&ylhzAWTH7AT_umnf zD=15^j(XVvJ8Ay=Up4BRG_{nM$Gf7RJ47$7ed`1A-5N>#zaFr6&K*s}>pWS{u1^Dm~?pNU;&)Xm7o0$lxx`usp9ZGdKG8(lU1UCX&=X?vwLNFF?s z{OIaQ4pY5N#zS99nzy|qdGkW_wdiHI$i^-ujGkDWetcl#!i_C_lQgQs=7vlKoT&JAAIgS&K6UU*cIG&!0y_ zsW|3+A&%kyA&#y4zB~@n^j*6a?bu`I<1U^}yPlgCc8lXTJr8Wge|c`|U?fy(tNYn@ zO)8x5p8D8mo}G&GhIVTeoNJu7nP)OXHFK!(ZA~+8bd80-ufBUAeY_05Ccz$zpZ1{K z%Qs6{*94ZjM#@g4MN2>3YX40;_$JRU**o*A(^Ns4DpG06bfsxwv-I^PO?A!EAA9h?`HV$u z&Hs| zA9ZgZ-&C>ukDr#OfI(A0tb*ROq5`6Z%GFZ2m=;7tu9R8<5ivjo1cZW!1rgHnAR=nZ zV+GW-Afgsc0X1n511cgQmIna=At6|}iduOnX`#*cJ-cUf&Ph@OpV#l7pRZS>=j@)@ z*_qkd+1c6I=|MQ8dua4JY-G(0m8mn_SI*{&F$`OWjnD4^ob)RX&K1%4*(caWz}G7T z*TYKg`KY+w9)zRCRVU-BmvL>S!S%zd!u9+qg|3xS_*LQhZm^AjZ(CWoF6pGgHyV#}RIomZ0ITs;z{*g;dNTqn&og5DMz;|< zsbI~G0ITdOU^Q03iVflI(yM@TqC%08V}EL8WYSf@*{p(dUxdE(y$V=`Dp+kJz`Fe^ zU`}SClU9;l9$v_@uu}fzej0_8dkr(=~c!xa*kBDWM?jb+J z%YOtRVU^y;@UY1`3U}w$1HX;Rqc9uLXAdTi!WSxU`fVOD2ln;Q9Qf!TM&myC-y`h; zuO1A~_h7B(b<49l;~w%7XHeDw~VeX74NCmp})- zFN3cXSDdL7voYRBYd^1^_Os;nN2C3C>_GqAifQFn9Zu-bRS z4v^a#e9X<-8jiNqyQ5W4Y4_-&wPpT?wv2LH?c}yPg|y`kX)78Jn_VFfPd>qUc={L4 z!^+>ZJe>WMmWR>geD?_*f%k6CZh0FP--?*If9hCl0sYX*&IbRuU1M6YntB!u@ z^pqm!(QwTP!qMV7SjKgzjO$1Zu9pU14X(X{Z3KL2A-EnGtl%2WXOajwZj1+#(OlW4 zAQ^2a=yU2qn`8vL!ruB-!Dz8UWy;$nJ45AmhRf}Y z(XL_>tz5%a3!uNZu=mvU}Pi+Q8kkr?ulO=Sf9&qv@h=Jak*EBDaa)=~@}jk|TE4GsZ2j0V`qcRKnW1 zbeMeiWbGs#fu-e3IE_08pOo}Halah)#J7nVL>sTBwpCj_72|F7R1)^Khj|oR_{YP- z7Opx>Hr9nxZ9t!%+mPch++M}rqS@Q+DV#NUN^7x>wy0(A!XWiniY60g(9;87f3t1G z>11~2rLf)y0p~#s=O!wgUpy@A>y?Me23v7TJIX#ABy-_(G#5 zbYdL&`rGE58=pr&!{=lNzD=HooGCna-8#I9%4sAd2$|DpJ!PAM}_srKMS7h z{h4^Or$Wn<-vt4&$9YVQ+W*~F=7|v;xXI{sn!Uy$IQ=yw;G4kOrE#&8wY#Ju z;JfjZy6>M1RE=)*J(`X0KgKQTD)c}dw=!S!05GEU;lQ!*K9u$6a<%zq(TCpXLvQq< zd9V*%SRd|1AHJwi_o44q_F<{qhs7a%Xs_x6?IQ~rjbwLDKIXs~3(2?l0Z|JpKyI~0 zolgcFlYEB|bNn<$hLTyVBX+)X->20m-LM_-J@>v2_puA;6tzaHUOx6EpH3xR(+>$P zwdxRQsp4N7Lrb;%m@<@g`dC1qHEBBoX;r?0?+W;BHSkHJ3iyXqzWu(3g!H~}h@^KC z*38O2&Km=m?IWc=ktatVhB}$`e zkDv+Srw2-lKEGyw%GrK zcFabj`z`g*U6R{r2)aKRr2FenNcu-WCEN~pF1L@aX?x9Hnh$grv^oP?of(3g|IS(a zC=`2IMX`H=6dS-O_Qc7yXeZ!nw55I?wtX6>(w^4x@Vg;eNumgqw9bYTYVEuG zaasF9-$e5z+yr`t`a0|W%Xt=i!0j3aUni)5@h(nBb^eEV%@WX{1T+``8hoenAOAZ@ zgCUFtPo22Si2dNlC4C2YL~)<>mLN?+Jkz4j$eKG8S#yUrgYCCm1z8uQ#664>cWWr| z$m43A5KV>`AC4@;Q)GHf`-#hN-U+P?w|-nZR-%n*3)<28#kBsg?s9u+KiS#ZtBYJ$B6jgZ57x7Y;L*{|yGnf9KGp2oerT+>{ZLOZ z0vG<;AH)cP|9_v*8gK6-tx<@zoMN+W=&v3t(fCw%i1VrShoRp5xB3g)FWPuJ%3y@s zI-4Km^0ajyA8$K6+VM8DzjnMuYiDge?aY_kc~fp@X-GRAHSJJLN$V&vB`+L8?5Tw! z68o7FRIzhU$Spm&Pja@iQ5C##%g;uqV+9^7P}KeP|27 zpRr544fxXciU^{Y_PS9v<#@0~SmWy=-N&C&MQEB}4Ji-~p+|>?CVC&i?38m*ybt&)_J|p}`Cgi# z^~bw1dYW9REb5Blv^qP}G4dK2Qk@q3+d(q|7dlrtDLPAukZSi#V{f}>DCSd%j5@MY zX>r{iF%tLhp^>-`t6wGN=g)qUOJaLcJmx3be3E=n%qM&mcjkj2Pc*Y>{ZzMWsBRCV z`g-8_vI_tI1}Qdq4^ixeV~HB7tG#Gys(*Pvp~0O&8e}jU^gpJJsvFzyO7)22K)CN< z_ZOvkb^$F5$wapa+047zaY=LrVqOwyShHKmiy2uqz`K! zQ|8@h@e1dEqEjfO`4Fpa=NZlq_2zsyT5fguFsF@tOwu33m@Gt3@bgV-AnAWZEaOy* zu4&`=eB>F)$I-*vHRDTJU6wo(>n(Z4h&p_2nP-uF_v}z)DyE#yxsYaTUv2|k?)aq$ zBUxw4vBY3yq=mXjHE*5-+>_5(fweeS-cSYgz>h-T*8XS*)XPVwz>CtRNUArc)M&vC z7C5{87&J|fpA`H`e-zsD(2s6FI(W1{@C*1le5MOoS1b(rU2y*tpkhL^%Qf_6Hh(aQ+;#m8MJ!Fau}^nQnl*YosH83BtcDn%trqkAN@W7_n{*; z!-8{ICj88>PQ9O)5#=b_5N*fdru3e#;dHEXyV+7txo4ivWI}nmtG{zNc-(#%a#Rfq z_*U<>x^kIT+PT|`c6S_s#}6~;EgM25Lr@5}gABv%Aj4Xq2XU$%%-o$18K54l*_{ta z?;jbB^IQB@g96)L8@D(r5!cxfg6yo!_Hbk79qR%+mK}{ z6@SNPWe5K@X4!*(x6i69O*N&X?FQunduChN_t+(i-E|x08{VgU+a6oqHuGC~+fwHq zAArAR+npRb-AR)EcCQ{yEJ^A529080PJb>v_!Z#TaiWOUQaFLw^yfA@ctPW_dm(Bp zwC%G!j5eC!7h{U=r_0b~#rJE1%rPw%J#Kg7TV^j0)9ET&27HIs>6)*H+;N=ZiZY5g zo!5fSbi0b6^YDG?_)<`sO0<;T{vGby0Hw=8KPn|kFa1I6WPSMqjrC23sZ34j#f;L6 zRg~s`b4v5SIi>mEoYMSnh0>4xDDWpr8%q1*oQg+9X+u%}A}ysopfo}GCrT3>ejAJ@ zNNL<$Wc)iw=@vzg7ilTY>6|x?C|wD9QRGkzqqO9^KbFRQ`$mZ5x`KK2qrKDz=rGJn zVt*tJ^1k39J}>2iwjGU<@1{p3{VlLcm3uO7z%1nlC-C$AOOo{0!T%{nx?xcz{+7o- zBEi3s^W^X-gliww&b_o=#rbUPse9l{F~xhF@%p>)fAXYsz`weXnTfoiD|aiio^E)o zS2vu`O_Z1E^KC*0;QaS4p|3yPMf&=apM$nvaPOhHgp4V!1qlyAJ-TAaZlDs`rbGnSy~btX{uG0q`xg*j85Ef2)rC4)>w(|qX(OI5S3g9al#l_XYQkY$m=l|@+a<*K7+5$ z;HzoDei!Yae%lTzwtO`I)V1Z|{;9KRTxVA8aJ%}FU)UFzO;}@ZISYHsSpi=v!?Qi` z9L?|?br5H&dQ1Adg1R)|n_3GRG3700n}XtUtf`SR3R=1a=7oI`^;FvPEunRlx!??D z-Od5Eb(+yz<-x+-5N+MI@<&>?2`uu9d3@@U*`Xe-+k0O*-6s7QPPYLv-3ABgHbSPG z8FVv)Zts6j{3W{W`kwf^^8n%j9@f(Bm&>7a+jB*98yRF+5oByyvw`e}P1G~f5@MWo7-Zp< zb1NieEvT{fUoCs2jrFO+o!c{1(6Gv@is1Bg?Y`1g_c z4bE?zv6hyZxH&E+Gt*$2KOnYVf57%E+`XQa=zU6(d=IER@*jRj@=R;B^6yB#f839J zhtPtppauC!!ur-9YEAeXG-1hQ8qwkm`410?IZV!i5OuBI8oc6hfa?B-pNq0Rr0|N) zlKbud#HrtR5vTa+Tz;0^&rZnw@F3^Zp6{|$iO27LcwG$CEsi_zqv z{WuTu5M>Tk#`M4%oSX=9iq<7oSAmO8pHp->=TIXx>kOi3 z14dE5e7daNL*mo}%PJ9-p5u3g(vz?Zr>DQCpeLPJb^IeWdopU$$y|zSRn8mUE>pAP zcUGKOrTm3vZ%2$_mmLxqEORbE$ROiq-K86o+8@8pc9!i z#yAxl8H${4Q1hC2dLNXL(mkaC-}p;>HsR;+-s*WZKBB`rL+M2AhtnzRD(Gb2Nm3V1 zr-j|Q)Gghn&}kg#G!Aq+`K_SSHH=QpKqo^8o!V;XWGL=me5G_Utna@*;5%HSrqiV! zS3{>>VRWMQ!|7DsLy@Owb8cJEDW~FcfL6vFvlg&a1OMSvYOt-`)y*c_fG_!Xx z=(HGgN)OWMrEf`|rtFn`(~&{W$=a!avo&pdTCA>FJi!c>Y(zd8 znJzIb|HXtJs#zwg4Oh0qKO(21PJy?Up2!c+#|OpZ^|}h0EZh-^CNIh~nfk4oCJxZV z0h(<4M##<|-w;jC>_I-bG%Zc)E{4*iyk44=gC^fpbB=JD{F-((G%CnEYoGmw=GrXKV+`o= zNSvGQI*oTb4b8RrwrHjn5zNv^tax$zYmd$19oFgJhjtH-H=Mcfnv_4@yM@Kk7#7R8SjNAe)XKCgHXm32OBC*6e>(D~3S?ZI$gD|oNVPq}cq>QZ5TS<431^U)j(p_)<*b06Jv36Q@ zfiiDnZ*i5*L~HcMXd&RMDn{P-i(Ef(kLMDzY6TfpXM4Wmbkk!+pxrT@Xclyf7Qedr zJK6=HEKAdnY-zil4VTh2R=VqTWTY8?5f?j?IUBo+efN* z-+m14wqyTpi{QrgEyRuQumV&fbWS{|J(CzsK0C>Des@_Yoxglg&^elo&jGz z931_8L@&VL=Svk{&^|_cxgVX-4?3sSMT6=0-Br|%dIqBv!!tY{t16lEyT;Aqv0~8= zbxiY8bt~XUhbZe9&$s>&Cd9a#@k^&MJd%&$;pmSWZBh2QZ`{ch#{%UExVNFZr2jh3 z|>>z`UM`vuD|{g&@D>A{}adk|Mv~y-zQ18jCvC{ zF5jt3>eF-C;MnnWpT_aPa%ZzLE2!55c6-TCN#u63-9t_EtODI!YXiw2g}qY$B`qc}Jva+1mhvodkZKo4*Es0R4)UQnBq z8T1+xwR*{+wEDwl5yx?Uvzzq)&Pj;lnCQ#{#0zUG%PJi@eIlal#Hol@qj4+9Xay=o znGno9DwwNqhGh?%iFa%+2h8tx_6AI%^41SLE~4A@*h}8T_I)|rNtkPBSDiSO^d;Sj zkP4U&^z6iNIe{;)S<7*`RfUTQxR_M9hz!?+&uc1tp4u$tqP)$Oz$X{0MP)8p*^S0$ z^2uWXMTbSpt8wycaTeb{!ls(LNsoPVAJ;M4H(L< zXvA`jrd)%kl|1p-#k?M8G`x7*;R74SHy`ua!7*M z6Fao?#}sudpntTzDL2}w?~J!iZfo_I{ET-AR<4TFraqvyQ=_%B0PXNOSIcXX*Ku+? z*=UFEbIC!U)ZEdlTe^Zi4G8v0IkQgfB+Kn|LpyC`-(Df4s1Q;#f0M9ON;g$vgxbHy z{IBWn_bKZBMvI$o73^=oXJ9-s%d~^fFhv>X(as!HZVC7*zgN?Jj`*78T@gAsl5c-6 zzTK<&c2w}&X#Co^MaYGghD*C}`CGn8q2VUba1&^F+9has9i!p3py5JI`*&Ow4JU0u zzo8ers&&Z#x&6VL`1y$88u%BxUd{Q4GzK3ziNDv{!~44`{E24M8v!HKrf(?YsM{oL z`qQA$X;5fjkU}#Mg+sAm0bh)!2TQxEv;<^5+PcK!<~IGY?b<#}QuQI4tZoJjzF!gW zl>v@AcgJHYIMHaaJP3#EYQ?8M{a!9JRu|Wc^RP}QJ;Ht5H>-ObbuVCaunpXK5`wEg z`O5j$GYChE>+LeG9c5gTG`N13tl|!KZ2ozVp@o|~P~`Wo{|=5nlQ?b8mSwyCWfYm5 zdG14xTy_#=aj?Y7UHOQ6vN`EY4=(0a>Ef4@#f}QixzS?Ww|ynXHpz~_5%CZjnEjK5 zZXvrrE?&_Cw6>U?q{Vf5l2TjdLR4PneHA{wN6LL3Q^v>lBn?hYlCNfbXE6Bivwx=@ z8z=8q;=9hXk@MV7rdq{kTI>xufgF&HPO~lW}pIU7xV;2eR+KXczEpE+h-G zNHtU38&=!QYTMcgPiH=S`RB1?lRApimv(I8!@jzWeKjZem0=axiin4QAs;O!s9LN+ zW^^r$o3L+31;3^JIN}fHG?t;5kMm<;-~H|&-aH!oj&>bFG5tF1t8(_0Dfm^ojOpG< zp_slO_U(H1ZHwTyv?CUd>1$!%EoI+T-P%WWYXSKjmcB`PFErylz0>LqOBlrG8N?rM z#XdZPp{?ILto{?M{%5y}(V(qw3akGgR{tH;50#jk!s_0^>b@GGZo{y;ajfpd2zCFw zCsZyjeL?(v3Vqxgp^pc`>ibyz9;iR)t#BG{4y(VD)xWbInyd+{zk$_nSx@~p!|JbK z^)Drc(=aEj?i^P4*9dioht-|H>i!s^Zr`xFPqMns2zBoZtJ{OsU6mN{eZDf3>;DR? z-HFv+0LYbPl0||xHMq!IfY@wVAJGihAnZE>`z||?=NI|=_27)CifPp8Tfn~~_UGcC zL%#Iq&H~y2-0p@r2?n8GqE?gbzB^QYj(kq?^8osDc1dV|z6h)R4XfQQ0;P(=>VCrN zUK^qA>tS^ZSzSNQbcE`c7sKl2vAQQB)O{wb?l@L=SA@Ecgw-9u>VA&8p>()6tge~W zwV|#y;)!eFHevPKv-bi!z7bY;IjdU(|53x|B>eg%rH=1<>KtxbK3kVKy6dm!aA)$_ zx|lA~%JrUDV}tEdyl$bi51^sPYi>Aun@?wm@ zHer2i&-yqo#42wRR<9MSHyK{4P`dryDU|1R8;R#bQ8#qV90{v?n$_)%+Z-uh(OoN} z>yu>YlVqk(K5>#hIl>^^fgY$WqcveIZD93Uf}4ZD%|XwR-!EpPSk1Smoo(M8TVh6c zJ#`*;0iRdh1su)pCBJa~7Pb9)Thf)T4<Wh|$?|d*1xe9H(DyR- zd?j4iSrx@}1%9p*4(=o5ckXKGv{i0*+Xn7a+wCTwnps|VOTOWqRo*PL6|J8o@Mc>f z8&(?W6W(@NT^&ci4Uc;G2uJ=;w3Rl>9c-)9RnRjB?G&P&!YgPeE2JI2N#R>Gze!I< zJLLZaj1wwP@BtN!X#S2wN4W2&u}t@78-(x2j^5ax!&!&*Vmw*b(|DSR6=4H-2o#TM zp-JUk08gUbZG7U3(7TO){vzP}nO42Xxk1|YNGt#W%=^(OOa4Y0c2cl2Dx5MBncNkqBhsjmx zFeB>%&B!7%oTQ%{XTS~)-H2BSOe--W%I$Rejczo&Xt!cSRDCIUN8W6~3Hn1(3UpNkG|McG|Ti z*qJzmi~HV!usIdEH5CcA8s-<+&E-}YVMG*($!PM8G&|ji|L4VGKeNLaU6$Yp;mmC@ zoOkrygcil9F(A9wluf}>bv@)t3HTh4BE(18EoHC42J*OC;=Glx>OArdm|kbPbBh@m zq#G8&pOQu6kHe2Ez_adDOF=#IOzI5j-o9fD_{~e2TGj;n?t{Q9{7l(p%6DnrA!B0k zyBD0Vw5Kx(i8W1h&^?t4J|)de6x{G>B`COl6UiGz+EWyKz}IkYz<2lD`s9rw;s5DI zx~KmwumHBW^^cD^8^)BGjj1>b?G`V;%Ti`>(1_=GN}}oNlN&>I{}K63@J38Peg89F z%ZM8*X->G2wUu?3qPwHbllF~#f8mo&+Iccf1tZ!#`R2y(d2-SnT*plLRLqk$NVE-O z<=aohJbC65;>Pc=lO}9ZYt)8!Y3IpkeRxdnL*I}-cseO`h}MTr5&B?|`_L-b2RHiQ zMju85`!JvN;WhN3xuy@rowR+3wjXz9gYZL#@1O3vozt@X6K?Ar3fbKr*GX&ZMQiJG zv{m1p@KU+0SPo-&Wr#b2I9`L$3{z zZ~L8;h12ZyfMXtTZ2meC4O+U+1F5r@DUqAoJd*xi=q}p{aW<6nPDf4ritppU< zz|m|=3(kUAG&o%7c%^cX1{^}ym$%=>$5Kbo@kS%^fpwJh%@I=~;*SEpW!B)lxk$|~ zXUD5qdp2B;Z!u2QYmY*K`4#m0B+d$*gzPBtGF5yXHGXAVsd{_|d~PSL4J|S($(Jc0 z0gq_=V>ZC@AVZlO9*Vm83T1+SVWg<<_DvoO55-tI#r<@tG7@%vETrn}$21cDc4(to zt`QhTT`vp*KFa9|o;RsmJI+&cNxth-@N`E9NxuqXKOJKx9b*Rhvh^zrZdj-7;@vpm zQ2%*~A;5mfSmbY&jb8aE4M>yC>t^#Q7MC*N8S&{``d7;AcM9(%pK8 zB8So9MRx&)4fxveBhPcH3g?mpE{paLk$VPr*t+4NEXUd>;G5;5wU^LUlD;3##w2*R zV|7dCV*)-GR(?vU8CiYyU@l37RT41r#S)+87dsoRXA{NWdMgXw4+nuaQFkktr*5F z=`*z+YID26WeDbpi8dZauH$+r3mjMLA^&a4c!;JadamO-d5cO%v^Vl`&}nVCt2uIH zkgiM8;Q8HcDlHM!Hfn)3gpGSGa22sbWaAcJ1+IUV2sqkUweo*)eD@>TnRNS6tWjyM zqXoK#-8IV(dCdSKi?IisY*m1qb;U<%D*bDzz(!YUGM|PY&%#K?h zJm~-r(KvXB#^KDLP3gsJYs5JO`x@ASzE3xdLN9i|R6jlD0m{5_oE}vlE0D6*2#fIb zHRXUbe?uA|JwF$gWj$-g{eZN8Tn*NYdsT4EYs9!6wT8y+$PKq3njh=l0{Hq0DqS1G zEj9SI1U^a(97tsR)lTM6J!Ky#SVOW&nz{#>J_*=1y6QO^TWV+q=zPZc`U0-d{HPf#9#CT5i zwtqebzZ!h?-n-&$z&CNV(0YZdN$V{ueGTU~wI{8Wv*d;)ITba5`peT1;dd#lT*)eE zM{XM}Y+gnu!QJ(gZ5>CE4iv=~`P*20+uug}RnVEfuZG&`oRH5o)Q$ZFtSxc6Ip)?a z$Vy3(Pn5Z|CXr5M@%^A!Q>8u5lx8XbRf-cS`#R5FseZo{QACO?c1R4`81M-sAf8w~ z_YP@GF$%ms@h20{Lidwh-51XyW-<@YJ=+Rs83ldH%*=CckSPB`rzrUs9{!LrI7--0 zB55+a`s2pn*zqZ+jv|6K<=3MDNEH50rxpJ%ZwO1;OXGPR0&RG#ZG+Xx6~6>7A+Br7 zNa`amt&~g8ucFd3D9x3>r5=0b(qCEWFDQ*+F{6HV&+A^f^Z+Z}ooEKXeI)1CKLYMFoN2_^82$V#c6N^1OZt+xGztGw3+wSOK|K3q49@<+*HTP7 zX0+E*TbvJEFMn#q9$ce%D~-UW^^HIWT5+%ucx*}kn_;8EEAN!p~W)ZCsFf{dTVBE1hw_o0bY-Y zV=@mp7r+NrBCdN;#H<@>pt(}#pEDANVyEa~+)j=q zy8@?W#H<@60g+*-GoW5?P~a>q+E-LR|B0TISwyK{e`XP-&Oc`siHx6;Sww+Te`b-$ zFtnLP6gdB!S%k9U_%X-dfRlNV6R(~o@E1jKy2E#3uuXWkW~rzN9ki;~;n%bPs`IW#8(e0S`nRTp^+ zGiD+WA^JzREOj{&gP+J1P{~$ZHhf{5pj~xM!#N_whHP@PY9~ADdMN|+5PMT^&K13@ zpTnEbw@ni$Kh1TkmEOJbuHf+McZtKRKGu$yFWU+pNAqbk13sa9Q-8MR{5kus&GiNN zGrg^(|CsMZVaNHc36kEZ;fug4)q51!9-VL)^5|G4-eUjvT`?m5`!0=$z8?qsT_EXa z5acYwwYvB%@P@=^W6wAn{L|DKhdR)qvxDDhMnoHfI=@(_>=Y75bH)t(BtzINPGgk*|%~ z{}G6?{=9otM{ldk>ho#01>Zncly!}UQg=hsaW8h7H!C|9KMv*WrUXRe;10xP3Eoo; zbWQc~qF$-q4HI3#UU&(tDKbqJtDF!D3Dv|Xz<=4tu!=kSE zf5N!`uim7rOF8vdZSu*#YIXWn@m=xnYt0+Sr{Lcf`quHcAZA_~nd)_ep6+Z~FWz3< zN`6<4cjeiW@UCrfGx?nd?>y{X3(&n1@>7{j>#cxq#!8E87@IBLUul8Vt;Xsx#^Nda z8*!6#=Lf|_`fWTeQg=OH?dji1uK2rlPlCtsw<8Yc#IPm-L_bE_z?F0(3eA!;R%Qd* zD<5|B?!w8(L`Vdkew2LvBL0R>J`!9ik$gv5amdG466Dp$*Jqe0;m7MzewdCc#hoYp zS6Tr%9gt66R72iblw4#$ws8Jl3;$yo{-+H7WWYB9z7g;V2EngcLF+ccJYi)%;2S}Q za?oHSXu#LIz!mtZSz$v=N7;)V>~HY7T1UOic7-NwDb4!B>fRoiNZZ&b#Dr2oLs%amNw)VE_QSdzu6**Q$aN@gD7 zX!ow6^B@x9XR?9)*hRQoeucn*-%h~imw@li58X4&uiiq8cRXOPnN0H>qZ-G3ChJbJJ z@^_6hioYtRNZ8gH`Udf_jbfk4crGJny>tCmcAFoqMQFxZwlbZ0-qM}J5FI`YtF``! z=WPV*a2Wp8X8LohRy3wb$g?!*0Z>rfDRy{~B9kR=3yWjl+aw8l*Qk5{#|?sJ)cZ%` zmpVUiPAhg5t1*>)Ye$((T}^a82mZ`aai+6&gQ>CUI&kW}r{YZsCZqRBv$bEPJ=W5| zq{rKaxNq%f7U}kENL=xm^fv*GpEOfgj1Zke?y^Nk*2E}jbCVHw~ zzfjgqkCVJ05mFT~;}`DV3Opmd2)uM6sRLA|F`oHH85 zH(DC^1nizKkS8VQ9figf$dAcmTAMQ(>)&T%QQnWbqqTbd7Hv&D=^ef%&VFCJAJtGr z>uCFq=?sQ;-?58K>*PYdXJ*#m_|x@Qvu9>}2mOP;^_CDE*I%#5Lo^)gRuT*?jwi0; z@=$?1sI)iw=V~<_XI&MJyH|2L?pm#-qeX>dG`~~{a152%d>O~Z%R~%+_6yL3FW{c0 zr9u}rTSg1yO@)AS(m`m5VN9Vho;Oh_NYhqWuXEUj6km8F!c=)>FyeHbJ6VSKO;ZuG&8K76@E$kNFr#0MWT zCXdqe;d0BX<3lgG501&9TKr&3S(;8q^R=}Dj8I>jPVR$#soOQkh}_UEC4FDabsqG@ zgPs&`m-Ibh>ri|O>1yq6mpZ%jdFa;j(8HtNQZ#GVCBn+FEFmlBnc`dE1IJmD$pPQv z=t+HEHQu_`8}j2#Y8e>PQl*u##~eL= zqudtOKQ5~=9ebY^XTFQ#|6nh+ko4mX`PhAEguJN#w0GHQGJIr{7lLEfHx+JXEEX2~ z)Wvp`!;}y zJ?G!F#b#Gt2ue(}h=1Dk-+CWg@)DvX|4Be7Zfe9;~Gxa-HWWQUcne%+8rai@So)K5HLS9c`vXtsW6XSB(zNjoWVqHY+DON zGfTeiEh}A3E#P$EplSxl$klK8lXHiGsn&N2vs>n?=dv6;0N48XsO*^;f;}jUt zY^gyEhSrwqCey}@K9MceTf>E43~GBX8vOQ!q?@$x^)h^%R%P(xHSpJI;76l@e;KDi z)q7eR%r_`Bhz8>Tg8_XL6FR?*5>TS%d)T-v{7!(vW?aTrF0^6n(wzXUUX<`dtVIFE zPSV=9#X^#jxc3leVvzKs5RGXKiF#DWVYYt}kyS4u=kx2zDE=1b@uBSi>r6p8VEz7X zPeeURzFT90I!)t!QJ-@e4S1tpT#oT@_c8_IO6;QYo58*=AX(n}ZX3+be@pd8P)qdhBk!PPKz@1#xkDnJ0(Ps+P0wTqkojDo=h}8qSm5O*v2Y76_iq2JW-L zlY}5odKVB+9)1`3->-|#lS0t25IpIi;>o3a!IMPBlLVP3FDo9pdUYnFL+X&PdxFzLp*upA9zxUepQC>WNd3SPyE+vdD1{a?%Wp*Ny8BbCumG#hes2V zrt!Y0Gtt>K(xBHbb=WH9lWa|26!i(lZoo*Z7sgjA80VHa5J|vK!=0KeU_{d?bxUZ> z`$sqs0Z2D6T@K)05L#E-MI7hr*9K)D^ErGtnw+?sb^S~~k78aqTQl_Jb3ChWq54Fp zd@XQ_wpQ90hLg6ZE50>*SSz9ljkTDmlr`_~NeP5o=3!S93S z>bWKwj%OEh94l99ah!b>IF>UQS{yev;kk#t6SxE zX1~R4^#$mMItP)lxz<*X7H={JZB=6jeGgk3(Ai-`Ov-tNX^*eB++JVgNF>^4%KhT! zA^xXVpSfxSJ%F>5D=AA>@3&;B0ncw_@9)=8WS3qkkH)ijMi1Pd6~eQRR4}5QX|7s? z@sBmK!jsp<*HL5j4=v*M!+{lAnHeJ>ppVho{~Yaqu4(^K@paVp3+48ghP2;NK)8ar za*7ONatI8a3P!X(WTFq5nm+vR8lfAmmy$md8j);z|A>4S?ZI??AO77V&G5r~p}QCB zDdo0mWQp-!#!QBvNka5ls<+{k82aHU`F-IHPxI=h#Nx-j^s$)N=DsTCJjvHFhR3U7 ze^x8Z@mMG_CeUt9|8GTLAK-s#gD!_^Jr;STSTr z^;qt~zK<2Vx!5BgRcSX`Or^9t(*h&tUxfzb5H?6Yox)hGGBmdIMEeESV#OY4B=4$CC{ z08nKzGX70Q#y`6I4|gcG#T|-md34-0@Pi zN=5A${CKSv1qDvOB{dWKU*^04qAYJ)ODn->0b542MmcZfzwtH)IOJ61BO)+ak(Hq3 zLv1I)TOL_zOd86V>ZME)dOuc0nd@K^kw+bOwMevv9PxI(YE9KdqFoSf(~!pnXPV&E zM)W?TfERI9F(!&PDYId}cP`zej7Wm`N}MXB*b|cKLdbF96oTJa!hKuVW1%yt6bDj` zIpImraI68j?6w*5%-;PkN%#?sG72&zMD|TVWZ#r(z&BiM|XA_%du!x^qYeIcqqj8Ge0CT`P{`&Q7kmZoppS<-r64`_+q}rE;L9 za!3lg;&Qs>asd$`84tN~6{vpjqy1yhXBaK5f}`bc zhu;#D*~}DUMrNc;a}P=X-HlX_##MMtKCaw7@-juKGP3A&z`((k4t`qX5q5LWyyx9z zZuI}YICYOT8W(w;kZBas)o_X-sTpX@d)peloP*v{uXE*Idl#m9+o9L(a?-q+IkEUv z+3zpShK>W(9q=93Nv;^SzI?Mz!gz8m!R?rOl_Pc&yw6IyX2%R&5xpDN51gM0 z&QDb&e{v3DSaXm&vd-X&W6(y`831kZvJ^zm%tPrslyc6$<>*aK2m2w>6B${QEEe}4W%vXXy2Cjlu~C#>8NGRQMwkTYf;*;F5T6imEKvG zj?zKP>OdhoO6@4UP)kuu^ljTZ3rZhZ_7_SWD0QH;qL!kNsI+-qHcC^Ld1!2))Q!@E zwG>H2rFFGdl-{{)4@$SAbURA7*NTj1f7RxrwC%F3DBX|J{U~+TiW3>0S{q86FWZ1p z4@x~K{is&>=l0avQChcjHA>H*^bAT@)bbescQnRCD$rI%598Ktk(iq+)mS`SM1EPV;34Z*X9Q*ozqt?;P&9+3y>>&wKW zO01;+FIWXGxrU5=u1{K%rHbTv;%E~eFjPTxM> z?wp77Np{3ejEKK%taRpW)8!$*OS&#e`5XFni8amK&j5d@D3{;;*W4p^fNq(;sB)CQ z^cefzkOvDz{+|C$`r3?hHfFCBknqdRBsi+F|58~1vrIsW$pk!jlSMhlL#dm$%{p5t zCCJvt=nH?52N=A=Fo@6d1To-$!|Ew`9J74dTY1}hgzZ2wr$OAg0H@AKyfqz*SVSEukSKj4R{(@JYrYA=9p_C<)Qsqto=MIdeVGuzr1a^ z*S*?L`AT3qYkuCgyxc};b5?_`X*<(e4|wJZ;K$}k7Q#>sk4`}vOgEbHwl%QESmqA+ zaRA*@N4WZn+@M(lXbXR7C9Fz#X^N!gXIqd2u}BozPD&}Qwxtx&Xlfmdi{l+t8Gnl(fWnaQ;mEmMuOI%A-Q zs;sFj8ayq4YI<41Zx~>{StGRjXEh$cJh6!I?1ohg@?0#x8#K$u*%KS?PNdrp)$oPQ zq%%#_U_H?VZTvE{@yo?dJF}4~ujt?!(m^`tpxheLL7$+VQj8Ot50i^>b@#W)b#``{ z1P583E#fboOeXzzD=bB~>rrsd=#>o6&}I)j*~G0Aj9aUpBmUD)9Vnx}j@9mh+K`Ei zv1V6Dyu%ykUrFcnOl2Iid+VeSP?6JVMc%zLV>fSC)J1FEfn zIg7!}Rlz(~tEOj6M3^m#%-(dsOlL3~Rp$d{0bq8j&IimV8O$OT%#9kD2aS<nCl|KTnL!?fSJ!=miq00Sqhkk{C2=>#9(@5 zn8P7U77ff<5n=8H%o4yXVK86yy8&|xV1D9v1Ll!}nv#Oznv!yx0rM}HDBRtrfjdwG z*8qv%4tU!cyl4F7fVT(m=K9M4Zv)`%0lah#JU!siXrXUC_}0U|P4#>5){AdP`#tz} zNr5RiE^gMe85|er%Vm6jd3plAO7K_W`@iv5Z+|7ef3d*ml#n@Dv8~7-S#3|Y&P=n)~jIWYki9zjC7mavJ ztzYX$YrY2x)MIkN1m z7twoP%Yx9cJzWEHOGKD7wzB~rc zFvng@2h9F}x$t5-V1C754pYf@dkxIzBf_My?Ep*%gPD5K0+_=9bM!?EU@l=Wb5$_w zE~)9+BO**1+eZQOD1&*!#caTw2$?=SeIM&3c~G8ay`2AM*P>}fejDxQK>t=NI0-#ZYfD|`RltkfRK#pWJq-t3vN_+7AfDV_9XX=!Dtqo|pwHGC6yy-Zl~ zID0zV*BJR!y5dX@_jIhCn_L78-hyZJu^v5=i_DJ!UJ=2|2fX~5=WwDY8?~FU6Ff~A zEPl3z-%DAI-S;b(F_J9a?zp+B-j$H5l{0DGbH{6y*jXkCn*WvoK1dr%Y^-GWH2TJg zI$s9AAYNXJFHm1!(UQtjy=(Es+L<+|H#JYlQw-!O#^k`>&~(V&bjY60*f+{Ax z(pBShd}vsvu3KL{!xF()=`_Ktw%1qFZ!;{?)~&B*FoHoMA9WM>sHbAxh&ealapmCO z69MX<8{@Xz<;MD4db6>`r_<-VP)eO+{;8$v2e~E{zy2go6#ZkoUwRw@>&j4H!&xdX84r zCtT-H_O}KPzRy5wU?;}LbAgwOYT$(+S=X5wz*}um-HFcqR=R!x-&pZBxKE+$SB>u< z(Yy!mQ1?z`e^F>G_BG(8neDf2NsC1r4aHZW%eBxCg8P#GRcPjo7}xmumP!0vBF>FS zG&jAs!0i17W#7z9@WvX*pPw;;*15^-q*^&j@bgU%?!K*(?D%T-0@`~Ui?wT|Js5(180Bb#g3x|3dQ1SEi5AK%bu-&pJ8B{a06|dhCYeW85 zT!GGF@0Xhn?~N6nCF?a9;YkwBQSH&zlTtZwN?BlpuG&&ZJ|-h-;pa0-wC1Kd4`Wvd z@qY`hGn&20D8u{&GM5FM=1?0D|s_fSAeW|gp*S9YfJC$TNbYE(a6*>B> zSGF&;I2Tr4uHv091fGS~YMbP<<yKp0jgkU&@4M6MG(=W5jb$JojYJmK@rb8ieOT z?0HZQ?Mscr^EmdLoAz z;5$r88oyqKEUR>zi_JC6IJG#ZC?*5ztw+co*R|Nso=P53pS|nfgUXymyym-_vV9Ly z8T@g+g_`%zccZ9r+7U+Xfk&|3mP`4Y!iVTIpV@oUgOc~eeULJkh)C69c>=BGRl&KKH4I%lo<4>XY~RFGZ5~^Pu7R+$)oJ z(=5o_EJfbC^c4=lK1I&p3a^PFOj_G<2j!_ z>s}&xUybM0>{)t=m|6wY>j2Ly>I*vpc4hKIZCWvb(0OBYSP?Fr7|km8!8h+&9V9_GriOmgOBM*41< zYZ<;<#=gsgMk_$ne*wPB#do>*ZXx?lecrm4$(lvd5YNt9(;Tq{GiFK=*>G`rTi`k5 z8B{FjGk(4o##3y9Ro@bGOE%tR&!QRCQztCrCIQl@*{?N2@9st}B-(3WaSbbIEz)?l z$CZNq6Z8|gl=WxjELcT=drcm#5?~AA**1&pP3Z0^*C0}5HQubAb;6lbL^%Z{U$-eu zECXGeo$1cUn8p_NSthepI(pC7QQm-nM7vwagPP0Vq?w%f7LsF0u5ckjB)MW!priK; z>ZW>2&_c~&;$FvCzy(HF#( z;Cpynb-tD!)tB&>uAn*t(JKdVbj<4LbyFYNPW5xy65;`L==-Muy^)s?E>C3Fl)#d+ zbjADRlb@>WiP4~GM{hPD5H%CMb7R0m^q0TEc%6`}j|bPv(N_5^hiy2{Qs*LS-QidZh+wbf%kGQo0 zn5__)oqmJibrNtCPM2A62A^RX@U0H$n1mW;!#6q`XPSdMyI<6j^H4k-6hAXgWUFG}!5iQJykmH}7|f_&=8__Rp=@&?j_ zsC_<&T^ZUr!}d9eH!T@&roT$OnSvIk1bIVor?jt7RzhpxWJ7XMvi{%kQ<1+TM%OvM ztc1m^73uVGhH4wm_RhiC-Z?ImR@!rlD3+_4sU?k%$p#~p_eOc|2<2TT`+?7Dh7YY( zcV4bUzq`CDY~|5xP0B5SY3m4+hYfyU($J7xoUBj9?2j26XZM}O$;C0cuJO~>5njow zbU5GbFX~!MXY9W!>g63br!juD?3DSW(ha3eOxK#O2Y%Hrv@)ve6{22YgnGZe;DCNi z590X}!_zaD@N7?~!B4l9={2LQm&xQZA}S}_H3=3^*sL&jQQ0EL;Q@=vXjaH$x5rs= ziyXAO1KPa|+TD?t8Trc%WgGD22KHrfnGLtJ+1MR=MfkD^U#`cO*_u2Yy%2-thJT08 z3+}Qlj{eBMF%dIEz*lfthn!e4CvC`6GY5HU<{XAD+&crlz&Y>*&Y|_pPnSeI#pO#h z>YkljGh%Pqah#h<^`68xC+A4M3zNw5rc?E0CA8aP_MXP~r{^Gs^Ae3S+Ryss5{YvTG{1D2i@mED8nfZlJ6CoNG&sj-aH7nEJRTn8 z!SRpqf(BmD;4Ekm>ARM$md?WiTCzDc7T)bR__*URr^aATjlrDS0&{A9810NMqdccl z49zgi;R}Hi;$UW2Fe~Q)*JdwMX0b?AyhlUDq)Wml_v9rS+gs-l6}w^I&?-8cKW5m3&3WaG-ETcS-C?-gC(Vn1ypLjo4S#!kFqr z^be>zZ!ThZ*?uC?_U218w&u=x#QAescW1d{hVa0hHp;S#xF39F!&gUY`05P%FbvzV zb9mes>BA@Qpg9!wHgNi8ZjFs}{}YpFws6-7d`{I6KIwCGh+i`q%Zm8dQ;X>P_e}hI z=~dij_$vSY-|TxE!FcQu5oiG5ERBt?dBc9Yp_epSNH1mTx_-^Qkwr3d?Qx7?5J zrw#@vch0c@Rz0Xa2zND3sv$X~*p9brNDgD?4+yufl2}PhVA&Jhh+Q z%#s3n-3vHs_|pKt$ca&(Zlig=`426zS^(c2uNJ{y^kOyl6Cl2)x)M+t%?77^jkCE_ z5${N`4hST^5fRphL!C>gU-4pxvGvdMpSOSOn?d#DJVGK6r-!?+}A`NQQS1@D2jrA;81Gpfbtr zK?d(2gNK@#<_L1eC0@uG$^OrQ1nA^6rzt3BQ*tP~lm-63Y}Z_)1wH>RmDcAu$eXk^ zRlTOacz>jPIzt}7+>>fYT%sK|c^u+R+Rnooab77PZJwZBBkp_2?#xE(8IWedm3!|N zTsbseNHgckwh6@9&VDfi4Dy!);+8y;=KX;I$ZLd|GkzHS7P+j|c4)QTykU^t8?d)a z9x%w2pGLq3c{dx)@UW&jF=wRb6q83Jrx5^!J6BWapG-dR)wO-ntZG0_)z^qpsd4@UACB$C4Jze3}jq<{CZF(G>% zVE-(VbuY#9PeuK7P=nSKne&jVa~{|7X%k43uDeLHJ!!%H7u{&}KY1kKF9aq+lag)C z*C!a z^d8dW;Ja^HM{gx^k^B>B!vCA`m7i5TFUE*gQ+tXz`43$@oJ5=^2LwMCRl0bkPdbo!eOY2L+XXYp&i z?Cd6ojpvMff>B~em53YuyNYCIaPBph2LQ1m0dWnW#P-(^hgD^Uq>}U=uQH=f?_AP9 z23L!E^v^})p1a6$&s~&r&s8Bm8uHHJZE^+vMGiUA7ga3xToubbhnku7!K((mY6h=b zhUW)7Kj2jZ9{#PUX7KzBo}a-(%}hfC{ZoT4Yl6A#Y5=3AHip@eXagrGpk*t(*goCB#67aK84OAM5QopZMCjRB-m)=WoR+ ziTI|(+06MEOY@1deE>I*L!50~C8DhFs>t*7Ivn@B0g4rmMVQMZG7jydUU4@bu45 zGo=lad?h)N@c5UEhw=4TukrOzJlZil-o7AaLidGy!0%wCS?ogXXBcaPUWZlpdcgPU z1->7GIGhVM)VaYb1*vHTZ0qaF7^%iBIj0&J7$r+yhp*^$qGTp0Ihav$*ahJcn0LVr zSbxvt68#GFPdFtvBTqDq5otjzexW`1dK^(Q`GU}N&s=Z=;`W)GH<{=`mj&=cEI_W@ z3&PU=?}c*I`Fy6J;-CfCdsx8zSxqBSak`9y1vps3aL8piRGk+Z>*fm{z@IylbF&3- zSO6Rr0Ed(3#cXg5+bfv;2ex+5TxQ+dqhG0ffbX@b!5i3%{Kw zS$KS=1J<n%8%<4sewQsC? zRzLlM4YRt%X_seC$rWRX3$7J&isPK~nl{IL8;3lB&EbKF!E>W{`WN{FjmgFRF%R2a z)kRntrz68a&@LG|S>C_UwLxv{^}i8=Um5JabnLzn6+RnFR4|?w7Q(~lNfzughzgIO z*T}AtPWmGOwhg=s&dyGwtFtSoxU*B&Y)VV^FMQI;#R+&G-;({S1I2xd#$c@l&5?x` zv(O^7HIudV+c_Z@apyg#IgPbN^VotnAQf*oi!xv*96To^qwZWKYK@u^WBI$RlC8Lu zxxY4s`-(bx^~g}H%vk%Ubo93KtKaOz8>*A$wZ9RIANh;?Hd9dB-7%KWWAVUw6L8-2 z#xxeueA`$WPx$=n z66SM0lU0r(sLuu|vEUq0;=(JWXLNO~KnwkwI6H>O3DS4{gS5zDwD7({UNc=?@=0Bt z@K+&%g3aqG$U|JmX7)yPH0Rk}>+6~Gq`C)AN_Dihlj``|E`Tu?!2BZBC0F2Iyr(%Y zz~-m`o1;)Ovp#sSfEUZ)#mewvfMHBsSG-NG_D7t2=l_~g#`M#fX=gxp>`TP9#v%X#<_uPB_JkN8U=Q+=L&U4Pe-!3()Pt{9v zMO81&6_GQy@q#h01#`PFlnm=tZ0<1B5!PFWRfZ-n(c|tPcxK@xK92J<9+xA}XE2Js z^}V9^I=^oLMKd3!u};&w6#c~Y zca)*kvOudbtkufz74B&Gp133WVbZpm-W1j$9j z3;O-Sb)cMAGC)ZeoieRh9Gc#}o{&3A-%?oxxe-KV#Ggmou*|2XUt zRip1i%&Ttcvp%m5=nX`kfriH(_jhjoP8ki`zN0?0FC8QC#0zZQ0)ZBtTkmz!3Ko9y z7doB#Fy0#q5if@oE%K<_os;Lw;m9m=L3`eSI3B&QgL&O6rzs9Blm#JXet3tMYpl_4Vx7CR9m%XGk zizqB@^fd-nBG#hrwNH@We_Q!nUD-%RxEOxClh7+Ys} z=?^OGlV>);b~O6uvm=oIyONYsAR zvi}M4JwJOw;jDK~5NBQWP=t6j?)?M}JFhGO<$aql=S}LvQ;1+=>lX6rkHHRPhlraBeP}97ph(W!VwSoS?Y5}bkDCfqW@yPN)v%An)_V^wcLz3D0 z?G)hfD@!+GF7<$`0C3@lIb&Eak9AcMY5Z6kH(?=F3aDwcqusV)z1W9&oU}1PV?9CI zcm<##?bQsuNIV}Juh0EWynbPl9a`gN<}H!K3JG z%|pC#f=Pj>9ksOsA}xbxKOouj{!dry`5+QF;vw&_BZQ5Z}28-M^0mBa}9Pj*M#V;1HGplS4M&2 zVB`qZvkuNwU4r_3= z0{{{9Qt)d^e(2lIZPAE#_jekPQEeKF3$<|-^fozIUdeOjn~TGsVK5weL@uSur#6)` z9p8lN{euhqme+zFYPz7a!V)(9Qc|&z7ZLMQ% zbpwXV-10ge(L^V_DemMti!j}ZJ#*N-np__zEOUklSRUwu$I<|d{oB6#8+ld!JH#eb z^6x1(SU^tcoE3R*l^jzzp271|++E)^L+XpZ;n8+wZgK!3mD?axILxfQDC4wULOqY2g3XtGk-eKT0*S$Pzk7sS9`>;yG@*6EWAcSM4d3eX7e{ z^SLkC7D^rUb$D$9;!Tp5_S~n};53LDCCbSLZ(O@C0VDIhns(nX{B?xW`BFB?sclCD zh)rtOwfmx>C#)!kAN;2B2!{S=@n>xh(3!36!T$Ye%vRh3mx|eHMC`~3*f{;q&bS#m z=w|G@p)n-HH?n@Y@a&9rPa-DqNd+6Hv=LBl#NHd6%TZhasCOW}gQagMrkJgEq}y5g z`eKUNI*9Z^mi~3I6X|ZGyIDG^I2map>Nh?~^^Gc~m@OO9HkKYf$Sq;E$0W|r0#Q_NNw(q$~&TSVG-Inv8n`czThnR~=yg%9ccO2kih;jgFK z*L={(;k;W*vxj_I)LSZkgeCB#H=5|_NSKNr$ll$nQSm0rP#e8^fW^di zc*Y}Uw%TX4necy{&4T}9Y&QH)7Qi0Bw&zKb$r!(~{xZey!3ePTe!W=fyAzQmwgESr zs@bk-#JANVzO6RY7hj_Mmrv4OmQ%gTTIDc5SvuS9pNjf5$gioT?_Ishh#u*u5q;zR zbdLI1d>_lc|D#v2anASBsJiz4k@%jA@44)ITQ7}zWD$JZOQYV>`)RJb6yKM!?|)!% zVD$Z~UK+s`->(7Q6}XSQ#@hluqxfW5cIXru6>zHv@H540$dQ}n6ro?$T&F^uCsyN7 zcXO>5I}qTr3)cQRt9=Th?_>#&fvn3KV=$g%$)+8qvRn_uldLNS)f@&KG+(1w4vZ8{ zbW6fuNc=)JzhV&?&}$JKW)^7q7|vnJ>?PZk*1_-TtpHBy`$5sCK+&hLw$e-9C&G6@ zZ#BN1yw54dA+-VPdKTodAkWxd#nU*m*MmFlhV7V)#}zEYNFv@!}nPs(Fm zhO`b^aa}-vZ^ZM)fd2O2*%Q#;FXH*dfc|d4a|6@ghylj)wytib*BkNN*p*!0SFdZ( zBYOZ7ex1Jw#&6%oG~>kkl(tFd%TSQc|KnlO`Eo0y=Sj0ad)OwKuHrg>|B#Zif0^g| zl~KlnrH4b~!B6$>yn8RDcTW~xOz(dA6z)EI>hkoiw=!qRV|f35exXb5=k*U>y!@7a<*A=T zoTBu4WmmA*+1<<c z;da2COFKBS0;SS|rTX*aOuz~|mGSSjfxP1`k#`Eqt6*RY-;cXtf=G>AVt;w^FY)A<`H(tMYh@DB@=@Uwme}7khsi z+uCABiY9d)h7iZbpL0>0gzYMf}&Emk9?h8<3$ z9>IGa^EB`I^12W`L;7zAxMD{@|25;eIiUaE!t+}J{nvu$mVo}-jpy9~{kI3tdjk4z zFP`@@{g)xNr8$wlvrUJA?|$X1-$0rRp2sZ5d}aV@f}BQP8Sa5K*o_cHeh|zrJT&v5v%@eZ zGJVSGCi@z5C8aFMi(D4c6)eYLH1tRLJ59lIWH0Cgt4YmuwjA&)?1qY}a>lQzm<6ly zNjhcfkbNN2h3o^FDg>oW6KYfLi$OJ~FJT|d?jdT(_CaV5Ti^PBuGUBDxI)G1NUj@z z-G%y3i5q!sq!TE86oun+#% zO8&>8SJ|5DC>ot^9(0y0!JaRF=YxJZLS15cP7YPd-iavt6a8{7fJUb%_V2vSn5&)~ zs!;EL1Mi zAE#tr&V0cELuZH?nm8JhBTKk#1z^?0IAt>_&PwOW!b$?1KGB z?`P@j=aF4-4C!Mm{p)#T7jS@|TSxFF&FgCyq%8<&9Y{Cng=P==u}KbEy%URD@od4K zPOm3f?9Nc-(nwHYj4(BMdrF#oEk#WjC7bY$FQ$2r`i#i(QPx@5+ivTh{(OWqfG{pe4u zMtMF)HOlj`-K@qG)JXb}*UNRig}UClpe}z@sIK*_u0}R@qq;t2*8V0|*HCzZ&#lAB zuoNN3lktiIZmm+)cT&#y}x}NzfKx2}kTbL9r zL+jmPkOtk2wl_5!os z!p`gttcKA_&(n8aO76zqd@;F8Uayjp*I%C8-MayDvLPgQ<-oaoJ@N7Tb4l*1k*;Rx zU2{q9wjsTZrFYIHxobhXg{8O8CAs?q=}%aC>s*q%BS;@%>H4`Ocju5k$I=_-lH8fl zzG(xs_vBoXyOBtbWa%|?N$!%7PG;$X)NN2M2gL6slM5INQ{_Whpa<{5T?ok?x z$i9&Ki^dQ6iR_CgiR=rx_hg$w?mhWg?!AzGaiD{0Bp(`$)sbwhhDFC@O779+sie$$#o+UJF_7+A(Jse<#V^ zz3{uVV8qa@R91oa&ryT1vd81mI9QYE72h75LCipp3a(o-~ zhRTJu-JoZ3S5NPGaBC@Q#ILiLqgXZCv3;dVL>}iIw4b{IU-9ca&XJFfzQ(A^sQ>T4 zJQm+P{a{fCVA%^;_WlGG9fRe4#L`z{J(}*pF%gBVV( z8hOqvhPM*mY|j%dmgUH_NXDDw=ljxP*Bvq~3Z7R>1%WRiTD&)#Xt9Qq{eRdK$9C!O zT`bdr&I4VI8u9Ba=VTur_Cv5e`8yXAEndV|{5ltMEo{vWeaQCKzq(lIN4iVN1%B9r zoO>9o;{vdD;7vzASQiIi&iM++MzSx6^hn_y;@lW;pOSfN2zfYchG5ub= z2{BBYE>FLEHiK_AhxGf4fc3>qq;EejApQOp(r>Z!M+Kzc_anWZrQa_g{eBGTV=TR^ zfb=_u`nb(herEyccQevvmfl`K`aKcpM3&xKK>B?$(vw-bzJT<*3uzZiZzv%BUW{}x zOFvma`n??Ka+Y3GK>B?x(ra0|s-Ulae^!~z9nrDai7`@lKZzb%?3CJ3wtchwMV8;v z#WK&H+pLz(1-^v%;En>a2n4?@GuWHrCz<)}?ZmU^d;bb(CV1eTLZ0D%#ZNlTPckFk z-i=k#-$2tVx{Ak6K}2UFe}Shj1Xl$hSng3v%L89R5R7FI9A_R@(*N+EqxSIu2-W}s zNELqMk5)Y68s-^~za4#tZ~ObTcH;IxY-Sz!9&z48qfl!<&Z3%{gI3B@IY_`+Qdd6ZvX;{ z%=`p3egX&<1V^5=Y~*=m5y{qh$kzEjvK1EKh5oDggNwko_2AojB~pfByXOZW8(XiI z#s3`U#93^J9UXj6d z1cFfvf`2ieHt~Xq(dJhH2#7XEP~#Cm@M+Me-OGI1af~+oB5^Pepfy~l#J|AdhkG1Z z8M22DvNHaK%^vcV&&FO{npbpS?M{A^j|d?74R5nan@1+%F6{g=vQ9&5Y`viSg)xtF z=3f}|I0J9wm`BSCYRU2ftUW+8@`X@b+qQf;MuPSr2rsDcOO?38;N8Pm5kTHDw+XB`~Vz38t&Uc`dMGNJq$Qbm%4#2eI1;pS1)-q6aV6Z19GOFe-Brfe28F?g} z@hG$t%C^5ie!SD?6j>gAz7Z`s#yihFC%wV-}IgNpOtY{PjQFRJmQ*dDnaM=&m=E01Wr z<(v|i(teI;{7os*nDbu`>=jF_u7fvT8Gs{|{J$Nk(#@#%=8M+5lhyn1IT}f+?_NAd zRQ*$+UgB%+CG^ZoI9KSL;yZux+zI4)t(2(AA;OFc`YFi19~$sAbpu{sfPXzZE5QXj z0{g^9<=DK9JK^KSX=|-GbFFn}cU^1qYQ12gzjTU4b6peCi8xiI3F)16XW@@3!a2(G z**VHZ%PfM;>&Z@$#=eC6BVU?S_XGS*(1D%v@~G9AAeE*tDir`5&rTXImjjpOxRGQX z%B{ow9fxwUd%ITN!EHqh;YPgQi29VA6a|bkfmp5I1b4L#WHcIAic^Vp4o0neQR`mR zx*VmKgHr!Et5E9vS)!B$l=AHKu;^sA>JRysb>pNah4WQny@+@nt{RO?|ic}ls}EZWB^RCt5I_@bQ`sKEz=QwW4_d*tI*h{jO zl4UHXl=goFDQ{)(SUZ;TJphQl*ti)V2tW7 z;qTr$MzTWtgksQk-b&Pr49d6lWtC)oIaSzD2%p%kblwHkkRrM8-i7yWynhh2XjuF= z)ulv>eOtmCN08=w8Jh3q5Ds#SA&LKXCgIW;+~51@8PXQt;|^AeCc6_YQmrm_QXk#= zvh8K~0$x^n!rxgN+||4D4E68d10`n!N~TCB0qaS?in|Er(@c-{31UWyx7{x*nx1-U zJA>r*;4bPX&k)zV7O0QzRG0f)K8^0mTa|Q*l>7>OAFog(X7xF#J6dBJbk_il2e0lKO?yRF+`H(aDEJ>yjI-PF%J}rn}NN@bbJqdaPKb-t{BdxO91AN7?PQyhlV$n*%k?NJxfV3rqMNTjI^!a{=~2FhVrCJN4BW(3$?Apf+o8|cFu_{;LR-xhM~NKYZ8O=aJRB2 zXh2UjU>F_1^$W<=Q*6&7wXaC~sRgo~GhwS*ny@t_?MlsL=TQETo%7uc>YE+Gz0zNF zd(g_MVwoBZ;F7Yfu)Vg1ByD-Dq>J^n)G+@;`lqS zW;=_si%HiU#h#XkNtIT= zs>V;DcgUtz2dGTawDDDFidPjX6NjC5QQ!aJv|{Cbb-Eq2?JgqP>Uy1^Ezic2zR|~j zE|$lWcC^@z78OfchAlLn{F&9g`m|!{y}@=0zh6XrrRyb2PqPg^w{8B;`-A(0pFe#9 z?Kc+@t#r`Kx`1Am&l?yRSRtiVZP>9zw9B2Oy&JYmeNHm=!EMgLuCi^|RklsR5+2je zH7;7uNIR{_(W2AUXk`Vkbo#yo94^4&0vwLhN^H~Y(XEzjT#hwFZ%3{Adf{>zq+U@VOa$Ie@Pe@RbJP zYs9(@Zcu0{^Omt4a1$7;-=0#q-OToe+Zn7YZOyok;A%@5YW-&d?fyf$^RtA$d;bPl zF1GjYo}q|6Noa@Hu^n&?#_V7ZaNe_RA8Pu0PG8T;(OKT z#(JrW9}a#z21*k1aYyGDLP&&8ZV8yKO%8SQxA-r_ag8rqJFy znpeq|=lRo${pauXpm&AWuy*(w`k&F1Y+EK2@i?6nQTneTN)1K`x?FFlw2nde{*Q|6eaH5^8Uqjxws{~oD~H01@jAR1uVegYrz8_?zGORJ zPZv_Gz8@0kS1cpUAtJDn(*FeJ7XcG~LIpd4xdAEskb-rHnzy|U?{nv)K_6}-^Wpxb z@KUu@_p7BE5dh}HI34=1yM}JCXhDrFuh*bPk@;%LL%xdnYCV^%(bKO+PoEmwaS|Z> zOQ`dc*XvN{uY{n-FpE?KDJEbG2@yP2$A^kyzyA;whBq!F6oL^9+ec%bJNVk~aQ@w)jVtN!OV9YXIP!f7z z_$5llp`@9W#Mm&GPUtNKY^9AjpTw`|>+AibTV{#!S~=`hm0W+TOa4oz|9Vi$(-;9? z$yw$-{G>y!6EA=Uczk+e5c+<25Huf*AUv=aoI%r$dfNd_d(fkLnt2WBUehMu z6>wn?jZy%?N#s0d*&T=mSMU zZIaH^kU^A|-d~cWX(?Jt3a-ND zF~9DefV0JS9Vqgf07Y7T6Z$}ndm=%BEg3u?huuCQ__5k4ZA6_Ln?~UK)(n5ADoBAu zMu8N}U%y0-FVX4`K@Z{(hTqk|um3!ZXs+G^ah^ur(NfUHENpV&89cpS9#yO1o>C zJ?)@-SI}=sQNk2YhWqUM@Hy`^?^xk_#_1aJB zBCq}k>1Gb&GWNDPrD-Lcq`HFkxH+W{j&stZueuuPc_$*8dcUk@&khqO-Jjdui2Fu^ zaux%)C{hK!0??AKK_n)k7ps%(0qvq%Wczkm|YIYTHu-xmLT`s4z=u@mh zzKB!Q;HLRYwx>BcN0m?hROH0Fi^K3!=qvg`FPCcRhh;~z&DYet3oz6HhFyTc1Q-Ad zV0iBcC*}WE9p1BH!86 zJR`fYxe+ilGCw|#cmGKkTo>>IW*7l}So$L;y%F`_;0N&nesBf(VbzVCG^Xvp!4G8@ z@PioS2cdzJ2Ho)A;D?F}_@OMw4>z2LzIyt*q|9k!5xqu(4 zgZwb{G4SN+{{}xaUce8Y06%mWaZ=OV{{}a-T)+*DL2kJDQBHd2)BgrHv|qptEkSOm zzMYdsME^Iqq2mH>Xb*D3I!HzB-Tw`4IB@|tbOgA;DJ{Wz(Bo;B;)jngav2JCHJg}z zKN0M~9XD}O0)MF<+}_-ZQXip|GCE>(z^E|%6erEUQl|N57@-sUjnMTNspYn4JQIUd za<*VS=uMeQUW}>f{l-)o!tDVFiO1wo@Rm`WG-Hm8R}DtNvVNoBE{ukTf_jv~xXo+` zdEENLzc^{@doo^y7`HtA#;yK%xzLu3m;E1{G!G$!q*;CmFOoyF32IDLbJ9%n<>5t? zm+`9G&qUo{(2(qmU+S;+AYPqYI4S&Jmxq@vh}ZFR*e(9T<>6Hp#Op3t z>Yu4E53iOWUSn{I*_zB>!pj9OuEK+7{G60JQN~GvY}qaC9EXjDvs@az7mZgp*bXKaYbL#9_4t+&=7=ai|XB z@X2SKG_n1cacBwR@CBkd4z2%X98REwj6;1qq-p8T<6uK>nU}Wh=A;Grm%`zr=Jqtq z^72u0pZVZuXq2fVWGwbUB7}Ytu?uA|E6Ydy1!X}z#-wr5vwj(mCdh=VpG<5=8O);c z(bJ62WlWyJO5iJ35GJk7k7A@LN14!ks~%-AKgx&9F=>_Ysf8|?=#lZ64cTbuCmVh7 zAsVASj2CkkaMHW8F9#pu6tssj#wR%G$-S3@j|XLBe2zntJbdzU@G+r`jL-5FoV0J= z<=|6+GBQ35cX3iqKvI6be~4>je8%=7N*tpf&98sHf5ad@suvLL9I$YHzJJ<-`0&}B zR0r#j#+9G%A7>DsnWs6a>ay@@4B|8CZBDx8`^&+{7R2Y%F`VT4=yLj}I*8B8Z#b#u z<4fT~o*>vlfzyU$uaL_FiNYI@V4K^s9loJz5BL~ws_{ng7LiW@UL(Bu$n(+8WJGaT z)SQ~mfa)$uZc4{VHDOl&fzM9`JW#u(stkPK z{3RE5djbyJeP^%U|3ohcdjE%GjU z9%G@K;VZGq;KZ6vtGm^!X7{_iow?83>@mQPfA1;zo63Cx@e0ImEk5N|d3GmAR}9vy z$Oq?y5AMCpLAX_la<$?v60UQ7CSV2}$v7_r5FszEBP80A>jbtA#2KS4t={j^7WPMD zO;o`CzYAL-+C>I1*tspaj%sPg-gc^gVJ3O<8~gYdwakwPDgxg#j0PRp{SK<(RB@cx z=~r%S>hQJ#|3SbXPYnMKZ>5`V?czF%Gbu)}+q2J06!_ssIZtb0D96mqc5ll9)+?m3CcF+J$>i`_|^F>suP@E4Q@=q4fNChHhx-*Be|W zAi^mKC%mBjbGWgxxViC!*O}cnRnafi(kFEW_Y(i_%U1vYD2p4$|CcZ;9^E|!RcX52 zYHkhwH>j)Hx>u~xPqjois@i&1g|~%i)opQARc%X_tBqDucpIltx0x!!b`Q}EbnrO* z^wI2ton{{ zn`XCaxmt(w4_XXu7LNWZB~=DaU75Cw)mfr)s!~*lOZGde$5-!iM!T<4Q8--1p6IDR zcsQ4cZ&A z*H|^7Mm`?^=k+YBYHL}(2KV{4ge{Xe|Lj~#t}|y%KAkI2m9G|L9n^`~V?7t`nEXc7 zhg{p4?HrdNj1hk2xK~g+G99~&d>q9VtTaZ)%@9h31&;ZG+PJ`crQrc~dBY49VykGzKirtMzS6BW8m(NRQMg%HDwy0g&NSz< z&ZnIbv#vt_tf)+M{3|uip%JnK+*fK&7UZWBgQg3uPMa`QSd~+et;<&#bk;=Ixsq^0 zm|11`VDRdhS%MZN#-N1!^y#3P!Y(I|R#xTgPu1nC4SJO5L5Xm)+MvRnl{|WGc|~i! zS`4?1Fx+Pi!}`-JULDR5}3PK)iJ(M+OIn7Te~jyu}XQ)GA4fj_>BsYi^<5q$e7t=?x* zPZh${Rmh=p=pCI&IB|jtH>8NrRp5|Tkt^hNx7+Ehn!P1BFW zv!1;x(WOvTA1wEWfvxBTNW<=ry&NZVkzDc&<02|~ri4nSfs^NfzMGxu{Hq)mM~s~p zsu+}!LW*-n{%FTc;c3*Q*?S0m-WTdSgolL_z7^U2)Ia(n87KT@V6q@T-9NAi?b~p= zjKcE(yLQ?l3>quW2+OI$yUI$nYo&gGRm*EE!*Ei_ zqNJ(9T%j`OK*B<}+I6f(m9`D_sKqexEBhbP!>oTyud)shnlhFOS+S zVCgO*%-+o{7k+P-DX#;*^sY6Ru&=U*JK}{ycG8`V(fdnQIunZ%q&0rkOrrKpb~@eX zMZ8}Xc;D*g#4P)n5|y}LTyKvOXSqKYqxD8hnDGjWQ|QhkN)*_mK!GX3UOUO@AV`7% zSmAia{Blv1J3=(^DqzEF_oYW#sf+<-uE(8GE8@4KE9gO`J++(eq|C&U=>6%AuVj zYGb51O0Y>!bKZ#__n_Y`O*9 z_Is_dA}v`vQAd=CjZQ#Im2N7b*56=Bkk)esz0s;#5HHMdKjE}VCH^S2+Lh*1sXv=# z!&j4=i&R@yIirMqnM92%L`#qw@n%D@D=jYjObH)3CeU-OxoROsNJ*3XjQG=?7UEDk zpC$~tR4pF26IVcs;>^Q+nP1vX?s%M(s`Nh9@lU%7BU_yCX2y^97=gI{?{<10ChoHz zWH|2JK1TAxW+_}TM;MZKwkTOhlcHd|=pT#Awd7Q_#V0Q#l+*Z(=*`K zS#j|~%Wcb?Ix$jj9K6MCC_XQa(f>~zSE%L>#Mv;DF}WiI;)>*abqTMY>EzV=XN7}H z4Pv>d%N->O{IixQA)z>mK|fe{*JUVPfcRBk`r~E?PAsfy`v&&q@ye80cv^M^s5(5C zkNkr5X%yF*w*fq@7RX+T;yhVj=X!E1`78x#e)(}rZgPH6T6gBzoOSu(%>HsorZtVk}h~NRE~EGhv>tGl?qcpVMOl2>bhHKa;+B%T-)`atxKludTS(c zh%TJZiQ~npHvckR?jT`jCJ(#t44^%;YOt_pmZA6wJ9Hk5py`Ob^<{)P{#-alUv2Ic z9r}rJ;e})PQ;-^>P?@mOsRf02wYnr-;M6mm>G_;kX^<~g zyggjhiK76^5NNGQ$R*Q$w(yvHi!jYyo1`|rZW=2@7XMbb2EBi?h4Nm*S6fnq8-Z)3 zzDal!xYEda2K|0!l|Fm0(25@TFo~pq_(UrnOX3RSaXazjuyKCKf5Q0+Sy1TvYhoX= z$Dqxz=5R5Aai&IWNg}MbScs3u2Cz;K@GRqhAB6|&~q3Jf^)J+4-lFTKkOs%1us1I4?N zG{zKjlW>zT0QK)S%d~kdzQIu-ghPUE1x6-!6yUmAnB~-~S3);ln?KXJ2NGrwT}cZB z!iV~|Aegg2(5sg@XF0FSSED#65y|N{-ivqmzh_lK3Mr1ewB9rX=FWA7U2@PH@^A?gIA@K`6=q#Y#YNeGrPw zBqrPZU6w7v+ZmA)S_;+rN6bBPf)5H@JDHRc-;E2xE%Va$Bw4Cg z48KXJ6prM?WvAy?3YP43>ABW2VR-hYbeGwQ_s})VR_8Z3w9q^j$nua%{2t$vuVD4k zIGGAppx@qhj{&b!&)wo~b^Fp&t#7!U!X!f()1MC_GsacumVhO!0%iyEM)zd=lm6;U?uu7 z1-_p5Y z4V4wXX-2D=xMQ0&+^9C`MucM=m=b9bUM)Ew4$`a5zZx+XBf$!%Mzl%la~8KwOmsZp z3o9Lnn0LP}kH5z9670`m75~ak$LOs(M|Y)LbIOn-Z*F(dq!*~oU3pa>8Y+4)8dkLx ztfF?u3pPiX@k(7R?e}XW~ zw#rNMpEAryp7mV`JM{?c)a`L5?&cS?54;gFa6=`ZZ*f#)xA<V1#qb$hS_i=#JD#yW3BPGvTquQM2|GlO$19cFkm$I|T8 zWm8`2$5$i%?)@{B-mAPh5%B^_f0oMUha0rkhcL_P#Vl*+FwNfZ?C(*E=33fW%%ffhQqpg5itdgP}Xl!DDv5LY03mXYe$S zZ-?*Gq(*O}-f8|3x1ua^Z9zN4Bh9Ycg>xlO>#gQNh6?i_ew<~48@F@V2MhlaTS~?X zv)xtBEN9-V<<5QMV%fXv*}EL)r?XZ%)k$OcBeAEwQ3fggAZASKGZqVLlEMv#h74s!;JPaD?RFv2Wpb@^pDR%b zJCeTh>T`bd620jCyMRz7yotHparDPg)*l&x{?L>*j-zp60LBTckPo|H8SH|q^K)Sr zn1y$s`*+xlOq(3^pB^Vd_jBB&?KD>*9mX^mw}H(?Cgv@vH#rP!j)MJLTu)x2upzf6 zdpIoGk5XkDG!s^|jr@JaE3BM&QyOXO*}~kk2nS~zZI0ltGRNqzG(W@Ztdk81=E?jO zmbdg*nNrXrxLF)6+n^Qa2v+FDFtytFb*vpvoSN$SDjxd-%qrutc-a?CIa7>>VtKL0 z?iR)v&cx0UUe$jQPqje52kUt={zTEocB+S-KE%AUGh7fXfpJZhOCy>dBb&uRXX;gb zsIMds?FnC+akx247>{x_)@jDS51S_Z!^d_0RsXR!S$L!5kZ8v!H)sUSc7EjuW8+OS zMmdY)uuolTW~1Cp{yNJv!IMEVyy2MP$>W@+bhKk=&N1J|bJV5XMZaMqoem>iR7I~m z(ygd!i>ge*NT)WAF;77ISyqj4)3A?y@B1{6r!|1!eFnn;F;@Ro+?5#dmOH~41kD)n z;%ze2@|Y*FF|S%zqvb@4t^p$q*&YUdh~-6$dDeQCs-WtxG_JNZ9?IuTwyxXN-9@p z>hf&v*K2nTSFPPO3R-(bC6!EZ%|N+VREqX~Zw6^^oy#)eNa}sUkE!Lt+Ffs}Ds!%K zs9g66E3?Z5(}YxE^{#hpYj=fXJXook3T;TWTv$UcJj0|9RjB_;j&rQt^}K5Ju2Bh9 zZL84oCY#xj;)o=}O6uHOT%zi~6^)8t--`=BHph%BZ|4rxhA?dSymV zRep;wJ?Gtg@?KTVdM`b~su#0!tJ-=o24kjKrC+>yR#djExo6BtiQIG%&HWxU_j}OX z?`7(l=ANOiuvR-pgAd5o`00FkA+uimMPKEHtd}{0JZtW2z4(g+iQ{_7#^FNqH@W7& z+p~oAXmexwGuBgH?S!l0js3TM=b>}{AH4$|9o}&EhR69ceB?;@)P`9s#(xf#EtU83 z{s3zv*D-a%HNs@rGsk09(1kkjReLN-QcVZ(q!Q@s*LDSujnKzS>$)OSYTcqFje(ar}B#&FinV!t4sA}^(QSDfY5#Xl42;el+d~Z6_;rRg_ zPV*{NA02+9)5~8gprE;PyYl(7g=QwQKe-zJVX(WwnB&AIP7lWdQe%O_mvA?*Sg@$R`x%6 zg8rx3KkI*bocV>~V~4Uaz{qF!X{FXoR?BbVw1p1-Y=GlwW=Wnp@^H+Cev&;L%WdWT z{7~!Qhq?`;aF(FT^QGSv@I~Dg@I@`O%RJJ>yislN8Eken3mf!z3%`SIls#yh?W+YB z^G59&Hk)~)9vNINtP6S$9Lyu}yjAuH*y1X%V!%ykEi~wF9eh?CqHkk8{BfX%S2L&! z0^X?AfLr#TJ>i~>xp-P&F20C)qqYaVQ5^F|{RQ5rWXpKi2Ah~SY9)Fz4&ErOcopQx zZ13L_Pq^1H|JE8=Cg&>fx7<|Go5*)X2V+$0gu#m zv5i7H^Do(~GnnsoK_Ab>d{Wc; z_@r`zIcN9tNu|J-k-<2?X;v^%d{VQ8k$^icsTvp#0fx7l4YfjcUM6F&n(TEHV!W(o1%BWB{ijm#spB_K7I;y*9=psz=2WDsgu zvKy0RNm({L9gxT#sfvI{>h6F?DkbQVT69T|)N|ux85#*c);sPB^5qA3-j|+c{Udbg zY@sorOIzKG0zRpVfKTda_?#5#+z+4BXGtW9n=O zHaYSx&U9LsPpSg_cs+XSYUY!AF5r{8bly^oX7lWy!z-l~XN@~kR2H5J{kktV8J;-( za{MZ{W+zC!VKiSc=(T2!?Kz}%n;X(>(lCu$ueXv;_CKO^(VT$3L|}#LYK_T#R;V)xipq*1;boi^#)vuanRGb;ZFyV7<|-o@LFu%=;tLTh8gHHc@y z+E^G)9t*(}W{fgZy8{rDA-7EHV@k{42G++eY*(_EvT-~a>thpXeeAJtwmwFllGR}e zXe$M)V^?c<_ZiWoAIoaw-K(664Mn=BGA~Sw!0h(tS40%glq%qvqBE7lK=p9(fSuO5 zh!!f>jThAXiM>1sUz~{|Ji-F&E}!S(7I2|Ht3GE#VD06VoDI1<^W|8No=kSqT<55t z;1CtSAr^L$j73#0VbKaKKI#KWtdM%a_jm1L_?aT&k7OYlb`0^yoX184xT7a~uwD;u zJ}?pnFdS)icvD)mBSD&?iPXnf-5BRhZWCsOxIZ276+J~gIcKxTW?w(^otb@0!6Pa; zG<6x_`UKXeM?n2S`rk0f6B#E_I}I*lm_|KeMyhc%B3`IQS_64GZDqf@v|{fJV;HAa z%@`qlaQ10ew>Sj6?O$echn3icr<^IyWya^73A3JcUa4JXj1^+Esm9M@)j}fTGy1|r z{S)qr7H)M`ImZjJ`L|#;_@}@;mq#p;mYWD3`U4<2;j1+M%`(bi7j(vvX0nNk5ILy= z=Uxv!N_30?KjrDKFsCBYhX=1(^zT_72F8Ol$?lZ_ny<{GK6x+iZP@Y}@d+F8qZ76C zujA|ZG19M5*A(jr>HV|Su5+T&mNo%Jj2D51)@);VAM{ab2LgNP2?Lx9r- z!z@N{>{8*}tTf>&$281nf33+9_PBF}u*e98#nH1mS0v&|);n)>=FHmQEEf@L0WX&? zlYB4+__=D}Pk9%V^rh>pk(euyr}{RFFB5h+Z1HcZRI?%%)4Jn4if_;j$~}J+HH9CH}eH8pi z%LDRw1N!5gS!8p{J<`hBe$Q^iI5?<}4Kq(znfEdK=7lGj`b@TFwqu62FVKrx%&lnN z08{idYre6V?6k?y07sY6diG+aZ*tG&X>6pU zbeFBA$Sx;tEObv4bS1+DpEJzSE%M;v-c@PN!NMAF@+#wMXKg+&xU{Q`SRK~R$XAuB zOI3(K*5hviI6o5}JzdFQ;X$W5P&#sD40LLSbCt0+-=)oRa$+Rv;kC1cLHTYW1GB?> z?86a>CF@;{i~5;*`SpBR8}82AY>z-653oeTPTj!l)GFZjl%4P+{GYI&1O3(FW9U;k zLNguX$A$5kBTW@XlLaxF>ag8$h|g5F@fH2!GfmtVse>H6`_b%Ohz2sO=)Osb-c+{@ zSx(WHCYOn|@c%7d)5KAvrU{NvCyUX1&| zFyJrFtS}laIq>E4hDdXUbT4nf4`<3_Jt9LAacYeCMI27|DCcto1OD$Rp>L76Z(u2M zE)C{%er1rHUukTRrNKC9I%~rrCj#aMnpB7n zLzqt;MTI^UZST5^(;0Q^933;kaYr$ z!DJC9+vv$=Y80=vaa{EabZ;BIi8UqJ5E<4rj(hgdSk!^DYD^gaELqaXuOsnGtf_$i z31^4-le@m~^Wp-GgNyO}rGHA-SN>UZaad8!2nn5Yf~8_wh0p zZUcR)4`K1t_-_2$kh}BYiSQ?DINU$sr?bguE$onK>$d6_cr_>Bs<0zds+M zX^78`dh__@vA?quf01Uw+3daN!!sa9$VM1Iw1^}8eg1+ z?V5O4LJ=tvF%L%HF8ds_B%A z7g?TK6{LsGVf?}`h?(FSMS6^Q?#n6O1esG-^}&kTU9K^K_id1uFp3Hd%YwW|lH}L% zxwagWLnY?TC25%!1zBkPx2L=4NF$|x1-ed!2A+yLU%E?7wIdFdaavod5Q}q$UY!){ zNHv~`9dYRH;JdoOJ4J8j@)1_s!TI0=9qbW;WC!%!+BuNp#vF>}5)WFq`2oJ! zb3TOQZr~Vp894I55u*cedw2k8k|6T&@+R6qTLG8_13|T zu>s9SS}kWN$Grh9K&2BR5nyK}i1zntY>OOO{9j`&pd)XcUxRy<1jPHAao6_16W+31 zeKDWLXZ4hDk#W|W0I43ojGBo;p(C$GYl}jU;LJn23j^0^J0y?hEkj8==#(o_QJW-$l<`loqk+$oIX4OA z^)fz7hfO@R!M||8_E>0*9ncy(*04yPNryK2ryP3Tf8C+={>g`)^G`bb6lCjZe?eVx z*E9Y&aN)$RXZ=$#3W*+Q3R8?Y8h!mnGk-h^fg`+Ao*b7&UT+f@Q z8n3i?u)l7E^*~)m5oVc^tvB73A!!n9^#=T}FP%|)6YR^;4n6+Qs7amqcl~7an_^$C z&|hPYT%1*V{;u)R7GopO=MknFKw++GGd&&#`MIi|M%m}CO~hPnT%1&t?4nb#sg=I< z{#{Sp5UN!ZsFffgIOvuul{gK3-l2m1CxkRAUreXO*+5$xw0?qwZ38Y-t=5&?wa%Z| zBx8G|iFb^V(qW@KJ%?-+vQ)+#jt0lNFfSNY@$?*9@tDJdIHHS69NksKjqWOjMY4cP z>bi~7*GAX={;dxhyNeRLCUS&Zl5Ifod%#Ux-vDdPQSl;RQKWU~-uOFsCFAF@A;zLWkv0{tt$``C)xOAk)s8k!~^e9Aw%E0&vh=xIOI zQ4A={ArUIq=))E+0~DwL*MDnofHcfGr|=zLQ`(pT&5>A}QR9Y=|(O+NUnpEFMA zqnYBE-Ibg^#wu&Z6A_A>(oL{jR8>As3XlBpEu0k|Np|*~amhk5bh}f`2v}(b{3S~* zulBAcuJa$3Bj9qML1&x<%S@K|P)&P{RMTD~)pQf9=_>Hsq8de$nrbzS_cW$(6|`R(5#{(jEVL*~VjUK0&5K}TaGkdrNdH>SogYVlvb@(icO;nsSd zY=#QnR67OIhP&&b5tsAHsM%CI9e6ITiNODmD^9G7!zdmzq_}1=bngN{b*6|$$TK)o z`4QtCH4FIeSkh}LunD-%vN**)i7d^726*dSNV~~eUv2rrIP77IdUG7LhC8^zUk5xP zovAjxjC5$ERhu^qsOVlEgRP!}Bn^SZ(RyWdUg1IfMB93dvO`5oaIx^g9iPTve zMI&;W>bP``{1-M_1^OyDABMF~rC1HMh;-uEKfF~TZDF=(@jr~Si0zF!5vMmEj%}LN zG^_F1MsN*MTxZ1K3@IJ?(hq-DgnJa>rRVh;vkf{&ZHuj?+L)J^`@fxYu8CCO{OhyYL6KueBq|M*C)4#=o6RBadaFOAb?h>5pDq2AIhQ<|( zi5m~_-FAQHD=b%pIT8AwhrOVD&Ex-t7z1i?g@*MBo^bZ%Vcc3AgYz#zjpi8o>PGj- z^G6w;Apv-J2G3Z)lMHyK*`_%v7OSu_Ge)v$pykloB-4EG>Y3P7z*_8278*Rsd^n)x zi%T1mS^lto`A3){1S-)JJK`d>4GPp|xyZNhz_&YjQ064& z!RNvg9I%_E4cDn8|6hp0qK7x6nTgKP0lak9>p*9U0J+vY)<%>Bmvm<9lYj+or|O5r zNZT}_qL?hP>-8LKF9Es!-7DvU6cxq=a^xaU3(py&tZy{x1GUn-Kj2+BdL`UOoNtrv zWODKr?6$r%AJ~uP!vWi`Ky!N#IzOL?cDD!GRcJgs2;FgBhAsxVHur&UKrlxJ|3;%W zSYI0QQ{OW>2KnMGi_8~qSrooF$NUO94pgl%A-eZ&o6JF>ob$QSH5S-s*lum^C?Y9S z<&vC5!&?!Bxkh5G5oIPHP65ZMNKTnNh7DHR;>FQ56H)HFcz7@^I?(~kLzYq4tQm>5 z3a=8M5?u4SM}$=+xZh+5@?D>Y`|5Ge$q=-4{d}$%k~{Kx8YQ3$kXE3?jqnVo`S9W; z)<%g+om3yyJD;9=B8aztsWg=%0W z@t3?<_CciYLb|OQb2ie9zw8q;@IUp5{aYLAt1u4t{GBp6ghErT9K$HfHoYHs(f5;Z z!fSZoOGxh$Htn!=bXI@osUJ;_3Rq^L`V`(I$!OIzARlkWecs4dAo`0i;@i4Q8lY=Q z3vJf+@hYKKlcNegK7Z$5k-JgUL1*)5V>ePV%vxwLQ?0A<$;S4;sKfmq>)j6xL_eaF z%+DI|GwvS?ddgh7EJxwuquY$O`Ml2TVSVLki~{T#j+Dhu!uNMFR>pO709WFVZN8>F=?O1-On4YEAWs;;;~#A! z%Hh}H`x2-AH+1cUe`lId2S3Zv-iAY|(3gt$l>A47Y?**{OWlEOI0c)lu2bp5tXtpG z1|dBan^mjBUIMQ3<8bmWk#_TU{<$~HcCT<-aX5NxI=($%p!irB;(giyjsx2wY>RlU zxdFJp)(`U^fjQN-4YfrEYTML{^Y~BFIUIL##5Gq!%YaV|}ykCoosaELrt@5jqt z-!|Az1Vt6_q4&msH<&j!^zmkSf0ViN)o@u(bnp)NJ5R!Ur%)BWf{nyM|eh%KaOE^GG6iV9gmfB8!y9u=loIDHnKmKJR*tM zLGAB+5WY>*!NKVHvFIbZ%g7&o2zGCbxu?kEVb%+8fP@V}ADEyAsDHlHjI!~?GSB@( zGX=cS;OW4q*uc2(0}a{6J5_|!*BI%bErb46BRmwNjTKD7zx#nCoceT_ZSvu-{I;L< zu<;go&i)USQhYyhACixa{e#>oviE;$TYbqZ?U3(R13He!sTcmvHb`c}p#soSOSVy0 z0XO!YI8et9`s$3~<{NQ-L}J%qXrN4t2$_fLF-xC{b^F1vRN$|MSDC(2-Q;ucUpHo^ z|G~P?hG$5LUvo!Bf$t4?a@WKmS|*R53tx^rC&P@8&qYd}H&80flo~nRoCbSdU3!&m zjC8L*cJ5S2_y}n&$92AwXsO``Sgg|`V=QANCzq!mXto?o;7sXSjCo}?ocv}BhyF3+ z$!tr;>O-zW!)keU&NT2{EVv~yYe$(O_&_(><5kUhx0i4Ccb@MZBQ1sh`2?i-|Izj?@KKcK{`kB1+0AY;8y0qf z#Y_Uq29OL>+9vU~n@viH#B2fx4OM5!VisJD?K!s8*3%Gg(PK4hq!6*^Y=WMmMNER6 zCIl>?0`*wM(|T)dn`J|cR$Ek%BwY6QeP*&rh^e0Q`TtKopPB5;y!Y#K`99CP3^l{r zve1hE;H1HW-LvpkabEl+WJATM=Q8Bc*{-EX%Z!VjX1J^p{ReHWta~dLK7lfG>FJKE`}ZY@Q(Oy-5Y^m|)mw`- z>gr?~H1R&R-28ghy!fl~xVw87-^M9C2a`#DcN+R9Sei}HQ1}ASheJQ3W3&e+ zb=b3Co8lQgxe+D(<`JmJ2ui4O_NYLGV6Jw_y{Y6rndZf@iH^Z9c za*{5`YH`oOTH?W4;z9q}(SHwvuN^Nld}5T(CF!6IWyh|1QH+1Ryj(P3)YYT4%0Sgk zL&;}O%?C|LR5SP+ly0ns|JSramqKgN>Xm9UoJF6^j<04v^l<@dXE~(uieulqM!uH@ z>=K2@Hyn%c@HenXR9l^RG&KbZ!Q{6Tx`z;0lm_*@LR(s9VNHKD$-zS8FPnHNdZYcs z6|gzUbd#MRlgi?O0Sm5%YLe7r?}G(9lQv;Ir)HX3E}CmZ4c?k8MrfC0lJ)qXE4+N` zFK;{+E4htXXSi+^_2J7az9&wV^io?%(~U-{a_6C)K5H9NGr35U2~1UUkeOv`WH4N8 z{wT{9848!1{|s6k_Cuj8oU&vHYvi}`-f5+I_?*@dHpwsFI{&6#B?r9=^09^Qx7#Aa z;g#l7S??(N-R+=^8#SMetMek!WSP%X{m8eFT0dyZQ9l71Qftzsw1r0+OWERJ!EDTk zS1%`hnk?Id-gasUPWt7InP@L2KX~IbaP{p9f3tg}jlJ;zm!jbreydcxGUqH-oOKi! z(Bh(UXak(YA%CkwjYGT#g(oV%T`mwPj1bZ)5=N3Jj_ss4Z4hPdyubrh^_NXUa>a@R z>tMZfn7_|nVUihZR5XNUhfdm5{ol%L)<_N2PI!e{8uf`h_jl(Pb5wUzwO>zz7gIy* z1Kx&epv-8LZY}en^d?z@`#eZaJ9`DCoSKokxZvrCYreRZDJ81egVonVGS@XttzjOx z6swRC`eI2|EA2^Z42>@X_NbEhCF}>HNuD3)_0}+~N8_9BIb53|GzLv(189o2aAPP1KwYj~|eH3;H1AxHHbM zkSm?9$&#|AZ;IzD@&%%9n03C}5ACtewOq;&=0*KdxtNM!b~z=jP$^YL%enJT@UGw{ zBdBkLBU-&I9!8Ibp&RiuuWZ&!ny|0gFWwN%=h7TR5pLMo)VhQFC*uj@4U)%rYqZ>Y z)JYgU8`n9rIAWHIVa>v$WG~e*>(kDwIo^>IC8>xBwOfnwrn#n#M|v&Tb3prjq%M? zLQrE-yQp18r5tun!CG{zU5EMmrk+Zq^1c7JbQ-7RMC&WjQbtw>OQ`AMQ?*8Ufl|J_ zs0s7hB6ETc)ECLXTw=SX!%$mZ|v45)1U@ z$k&F8B-h^_Eg{Y(YF>dE=xJ8vc0?U8_SuN8Iv1meWJyM)L>BCrg5Dy-ZX9Vd>uKkF z0a}`mAVpdbaIJR>-u|p@knVuaO!Z5uR=@c1~8lAGt)yu zdG!36?wjJ(VzSlQhfXEcs~8{}S?NN`WxG6kk6f{x)+e&Y{sb(Ft)36XI-A@=V2hcr@M}6XH$GYu#vG zH;%?xGa=5z`dvF|{c=X*Uoj#6#Inx6sH}gRn`)P=3GpVDHDk1_|1lcJ@D*`RbE!6w zN8|jJ`||ex<7k{5d#Y@2d_|mtqj4_qsW`tH7l&}#deDv)BV*)gd;@dPYUB5LN z@0tnmj1$Ia9^(BFF&B-_iK5ZC*%RVU%+r2Ro>z~?GmML;wp*%&2Td&Tye(CyPvFst z<{Y&z`MlBtk1e7%_I9XqHVzJ8Z!4`sq0u;RkHjIGbh0={M&qm=jkEs?an!Xz&1IJ< zU0DlejD~+|TzKjqs<#K_DjXRnn@!Z#P6cZYe^FLCM^s%!8cjwq<4f0(A0Rh%?P;{8 z+Tqrb{HSjyjq_OA!UFS3;wHo6}>w*^6uQ|yQTPUrYovw@5BNH9di!6o)X4v<+YHhXn^tp zH!B(;5$2n@kX9I#A}d_TgTOA*XyjXI522Je4mJq%MtRmC@3Hb~Q3ERTd8N$5qh+R` z6gL&GEdCJo?uW3~BOUCRcm|kbvr3ux=K*amFd} z`AjZ*VP5=paJpP4?Sd;WOYx~H`X&1^l1r3}TdFy^N~{x?K&o3O;mlpz%e9xqUFS@3 z_R76=8d!a>#JiT^XHRyY^j5|i1OMG)kM?%^st)!vK;Bdc&!srC1!tJogOgHqPmO8J z+UKOyi33)VT#wr{a`&@LF72ecX~btSiq$sYr9kUg$>=LP-VNC+p~hyTp2VxW2*rk! zmVwj8nUFTC!k?3T<@c9Dhp5!=r?%;BLR14fkkYtYPwAgB5K2`=g{H8oSAnbf1$0V; zxZ}s6Rj;0aR@J1d(!ke07?TE)_IVHJZ58_i-jbV!v8$rdhHCZ&|wxr zFoP}|K`tpWlIN9rQ{9NCt+_yWG(jR1nhR%Ux`C?Q2uf-r=Rw^D&|_oic$!^NVEcl= zhMIxz3sQ)?%s_uMyMW?)4-ThOTNl8RfZ+7C%nC{=;Qp2^*p`27* z?ML8|vmsx<7_~Yk6Pl;U(@zbLNrjvkOUcB$LoPWTs0bUz;7`-?6+Mgz{lQ0d!et}# zgs5eb6D1RehG-SspC$qw((n8$^rs)eCL>poNEpYVp$`HLtz$V7_7&89$||JvGk%IJox}2^j^pKQSnLkXv1OqJxj#t74QID1^>P)Ea=yh z;PX|Se4vB+m3mc0xT(EL2sec2wcsMkAF1K@g5IjA20RC2fi}*nbys#Wmbt6QI_PAH zZeZ<)YJGuvKOviZ&~E-SM|}V73c3WC{pNDQ-^n)I=f%%m@HEp3k&QKiC7!}6V|L{C z{W{5(F;L_0)Wj-0;KXjf@OHH~4xkXO8Y#d3iR7F}F~ZNB1FxKzt2SKu{ri(z*%KxC zO7m=Qd>KM7E2OZwkWgcdnLReHuEj_z$CzS?f0=E=e~fio22M8}Sj2Eq9E$PLY)XyB z};eZGK5;4roP!bnv=Q`J~12iS_TMXc=Bt&ryev4(j~Tm_Z0vH0 z!JS&&0e|;E5JOLt%8N?D10gdWkwi%2u{FtrHUIrn$;2l8tjodfx3*Lw6d z@MIXlQ_)^2L~A9q#=|wktBabSh-y8MnzBHa5SFqLAqmvt$>Q- z2l{|L&_-4=Om6JdDEfv*MMk9ZNGU0D-!S(6HfJYl1HUXR@%_;-gcA2+^wK&_XmN($ zP3Z@>CYFPUSrmGUVMm5#(xQD<9 z?&0Ee-T`r4yS1->F}_4 zNcAtZz#APG$2~S04*TpiN=SHbR`6+^lhuW^HdMY8c8hf4TAW}_`%$=KUh{_bXWBn# zpV#qW$1@$+QPS*DdxftmSE1jStnTZlp%b7!0{ScQQ|$4{+HVFjfG+}ms*e+gyq>mA z(C1Sb)}zGKo+NQaUx`H_4ZPPY`!M?QjTxyDs+fjs1x*%?vBWc`e3Aa|Gi66NK@wR2 zTjUa8oR*0>h_?svQnGQHowOzshnQNI|B>yPGPW?L{x>#Oz@rSO#+fSTM17%45u_8( zaX<{@!}C9(NY}EDq1(nz%Y?ogFi(sM`e+~Iq#Nc@d@3i&z6+p@qWUKj{{bCIUh{43 zG>>+)zw+FN`--5kc+*T8qXCSqM&N>f`|DKe5#2^DuEDHP^Ghb~1y?chZLqzhGT!~Aci8V9}u^{O~3?K7geWMh% zAaAl9qI?5NzTD_)V>mIUo86DLotWMkpbymayyMdI{=@YC)OT@uACKsFCfd{KU<*g| zW6SB3os|dLObIqr$;4f!Tyn0!`4#ylp6@u7EijgQqK@6#N@!IRXtQ#$Y$q38i<%Q^ zgkr5d1r5GpeR0PS*$kn6tj>B)@Fr12nZh5FV+i zJ%xYOC^N4q#;o-+ofxA0VWf=BIsCrp`G131{VEJtGQpjmhyhC;|L8LsE!1D96il8D zoCwaeImP6iI|%~=I{GuCOqiu#^ml7$-}~#}I>@pO?qcgxJO88ow8G`V`yNtY>?OTw z|3qoLaq20|KZ9#WEQYy5coFbypOt_+CCo^-hSGj{kaA}-;X3|r*Nnk4loOS4GOQM` zF{jFb$$I81v0BN*^3PN`7_A=(;6h1y?E&SHOvIACJ-sm(kPL*aigyF?1uas$yc-xI z&~ZM{alT_czXckr3H47|^j(@P5#zuW6`Ufh5AEm|TlT5AA}`AJRk$MH@je@~{2RJZ zgR$E+tr*l%*R)%qK{CoEA-&w&eJxtP?F{r>jyNnjlZkVm8Ke)op8-~@4C_c^j5R-` zV6{@XCBkY^xVJtvVeYFqq*tI_*yp0O3AadyEw4c6s1MIjExLhXvW=pcjH8x@I#+t= zK%Sby)1ycx*XZ{tBbJEc(@s${Zyu-gcb*y3A&d{D&LPrloEq(uWa4e0ye8|ByT7zY zzH>qCk=sA}|K1~4qRosWZ6;p$+PEG84hVgbOjLeFi)Dm99%(WDf7xPJDlInU%+=yI zMR=Tr*5!*Wrp{YT3uWa=&5^HqCfZxw;fePCa{KaS*x#+VzS_Qg8R%jwF1-L7)XxR! zChX{E>ny?zpq~t3s{jq^=)P`nXGjk|`=%L|%Pbq1s}sK_Jg8G@YTabUVj>G8=qi;S zza4vrN+Bf^+kwv^6wCb@2ATBO`z<5ye}wm(LicDzAJE+zvI~iCWOqIr!`w9SMWRnK zg=NNp9D*JdWo_ssMCy2)YpI4wViRlk?Q7Wg;y(TUlKuDZKfIs4;OlJYe6dr%yJYu$ zyN~QPE@J&WtH<5W?#4ZnX>bR`7k3BK;XajVai7NOMFyLnO}OK%DBP#ByK$ev?!kQ~ zyBBviyAStS?0(!YVK3pH#a_l;V25$fW=C+(VFz%Z%?{!|haJNGQuZS5moXD^nafxk zJHFUW{0h#qSdZF4Cnv<&NfRilWFiB#?D7*zcT5kUh9$yqe8}Oyd@-b|=L5YYrbCix zl*VEVWx;MwiNQC2hW%4b(-Z$b8w*4EzdlK-sj$D95Vm`gutZN2{S5Aj_8co{7+zyi zN4%O&Y(hPLHc2XDm!;^#_P5TRNUpYzWjfP?kX*&u)zuzRj zSnB~c?_8@>9BVbgM=w@l(%94sMAg80S{y3ZVXgi|ITdel6Y+v6Ty}xz>GPm%%%Fa< z<4=y+|7tneWX(5~KwrWVGcHx@wRJ*!UHJ24{jP@nO;P?AYSlk!_+m{7>ZJo6^`ka$ zP#L-vv?HSb5n7#PQ-MO+o_1xMCw_pPZ7o8LJ<2#WDC4vT;dc1XW1Jck-OksW7B|tp zpX!UYFZ4y*q~)M86m~2s)$#CuBNVni02^5Y8$VuL;+>=4?`-|=B2QR1uJvim-Z5Fq z7=3oMu20ccB#-|QHpgn&1}3!U^^?UO2^&Cbj-PYhNyE|z(P32dw0h!uP;WtLC%w{6 za}guvKS!v0rJbmi)bKs64TsarUyPAHNeng;N6q8;33;6U(^us&F~)n7#7MP|YeM@R zM%alfQYx$`z7k~_-$Kt#5_-D0$*P_gl>7;`RGQHf|8zpUW+fhBPp<*TFj!*}3Ijb= z8gRYx6qV|r88nvfHpIVpu77WmoX5id`-J?~OcFXZc4HI5mV8OrpHB#z_a$MUm=JdQ zmxTSd31M}UgiXz1PkgcFuC^=N&bD4WM?ZLP@;OT93>jGAbApsBNn#P&TQAQAk~o7o zqJ2FpV=R76k-_4EW^$$+{7e*UiQGr{mv>@KbHRN~}2Iy=%D;AJDz* ztrbuAyi{wDsZ3|v$VOq>gxUIUDAoA!L}%)x`Y9iXRf~&Hr)zo`e0) z#bfP<6H-#;Z8XAs2)`RGc<~4c{)6ySuu@crnwvfG4Hw0sQY;yZLn}M{zeA3bIE1p$ z8l{d&m$=cOQKTEO+B-Y=bc2J?P3LlWp=}P+x zxK*iS@H7Bf13bCGYFdk#l*k#OJn>d1f7Z?te@ML)MH<=DyuMw)S+m)FPS|h5g9PX*$W+>eR!@iA8t#a-?&#=k9q5ox@JtEcxxTZv zEqnVwXYOu!dw6$j`;Og^1ML?2c*Nx)Rm#NwO#FA?zeCv>h>s;6czhXPBapauqzvoZ zJ;3WB&!>>*Q^@lvto$seY-_ zTs-csnxs|Ku)Z=+eEEdXmrW8nHQqh(6%#^dOcFX(j+GO_4*lVaeNI%DS*AL$<9k43 zCk*7P-UaVf@KhfjtXLmbJuLA3A1Ap;wq!)-$t|GMaPHr9huB>pD_$>T5k47w2n&o^ z@pIL~HGJR4$>9nfXAYj*wX+&nfrwwM&%RJ=lmCd?UQaPJevNhYbWhpr_`fGz0k8j6 zS+E4`X2|gypXYEjR!2|#I%!|w^?w@VEq;4_kXvzg(8bMn%#knSu9$9=HUjHhx*|P< z(!4*MEJ#o1g?Kf@X9E1wH$HF1)e1jeOwz7t%*%(xBfYomG2;S-s-ti4W|!EIEl3;l z8ju#xRX8@v+{zl9MvyASi+dZZn@-GPUH#7`m-wT7Gr*BEoo`jLHZQ;u%d$PvNqGJL z8_$bmkH8W?&m=poFk1IA*cqfnERo@!;ku?1=oUy!Wys4cz%34XgWUo6TD)>57dW}M zAn!nztHK*%K&d{T?CyImX}-=RE?HB)CYgBlB~NoMPCPv7JS1p?JXc611l^Y9Jlm5@ zeEKfr(sF5h<8cmG9?-FCTBb<8X!JY$W=|l1t) zv~Fj+57grHoWzuDL)eRcx3CSxtKbo1XqPP#1*Y3B(TMqQA?3(b99u^^mQ>$7+NWWe zHqK!IwSSvNh-b{@jds&ejX_=|FOw~T=_MN*^iKDe1~%PnH-{W)ku@zkvHoVSU$A_d zwY;U;4}Ii{P24IMR@YKG5jL|_kMqPH8}tQM`*Y$;F_J8fketoYscHdWFLW*q+G@4m zbsdv(;_b;P7&CtP{u}Kmqsy{o+V{E}U=cMZUd*!1=SZ9ShBu}0Rx@`Pp?$wFl8 zrzVyy{s5?whmL#1`)W=2?}I$3EIx3R6FX?vG$T0pfveU+{ja%my-9owTvDyK}hn-rGvVAGWPUtf$k5 zb~T>xU{q-xp3Va}Yh35hh2a^&HdF&Fs_8&aT6jyh3Dj_tCYkugi}!YmVyq_!4l$X? zdy(FL;vKAfq^h;%ptn}a4b(|<>ekgg+Ed?Cj~!1A4cFH9JPI#d5oje2R=R-Kp9|e? z1~hBry(pOozDRPYRQlC;B7b-3dn~vNki|^LujzXj_J)RTt1w*4x8z2FhG_l(YfX{3 zqqfOpiD+S^+0>mKf6D~VURvk}g}G6Zrx-^{{l`O>#&6Z!XFct8hORaWJK$s+1jHUsv{t(3HuBZl8{A{ z%)uh2rO>E7z3;)Yq4H$H@}eH!h3=BdGnHEH>y@*_1@O%JcIDY}qxPo2cLS&Q9fG{| z%ptU0%q1G}?QFS0`|ZGbd^sM3Ob%b4HfM~`FyrFF8$E!=Ol z^9LYjuMt@X$3snY`U4oO0x~9ypeHB}DvIScD-_+=YdVhh; z2Tt}Z5%;$BLSLVg-LeW5w4Lyf=P!@5UT>!jcZ+bBI5(uqf_`ZuA2+u~OMrJb ziUnASPNs|LCI!1)?%?5r%Luy-zL(+35SAjg8Q0O+oxl>z4ZX5YO=Us4N!+`usk6PC z3$^!f*55b=chxJSpXk_qLN`j^q$!Usi#;5By|omYdHbPkjNMXNcPF-Rkh^cW8x zbe12fq&(^A{)2z7JOYm=1sE%D9xS#V=mF)WJ-_RCk6zY=1!>^v?06Z=dzu5@zgXn7 zdiT4*40DkqS?d*Y;^kQBu5|qJ>6Rke`)2Opa5Wsx#fj#P)sOZilTFJhj?sNAXfzvv z-4kI&kP6p`J*=oIS1cCKhd8aly|sw5Y1ZW$4|b;qs5B2BG+}hqTYpolF|L2QP`18k zVO)R{cX0IPWThV#!nsjT-*A$vdIRSO>BZySg=Q}FMvq_=;@h?P6@%XOF)r{%_a;t{ zyai)gr_X+xMbZDoE)sK zjP*IeUR`S$epC9-Lx27}^#A0oXc<;l6INL({)dnor~vG2n}Xc+ zo-GE%bL~Q|T_d^D+D^HuYdi2h z=tXKP)dqs7_2HUN+c9DiFKg(%s@r4(Q&|b5MMOy$-QS9Ly=J6KD39-b&4%j^>={C@ z1(!1l{}ylZ5^*y*pt1A|16Rql>Uh|SwpT|3 zy-$sXt+2UT8gBghT3W3Xo74f&D>&=REI{6l)KpvRPqI{` zE%m`ULoVhBaLygs@gJ}-Xbh|C-CEG$ygAGvmO&{4-`pu^!Yw^AM#q2JfhFmIS5qML z?y)L(q_p$XhhyRRge4c zPTeCciErghxW;BCwVqS-D)V!~%uGl#$@=tbN*d3fda%2tyNu)9MK}SJB|I}J&8JV5 zp=B+&Rz}G`(}tY^%-w%GMJxZ1^G@JmMWFj$dd(Mq^|hk-vDZF@hpLxe)8I*qCzgnU zV*3e8CbpfblS=Anrk0G(R7(Gcr%blXT;J}d9tQ>&_ea_{bf;?J6wCI}7*KnD{HpTp z?o_#`rz@K&)etiaGSYnZd;kcn|FCPr8+v4Ahg9)TcImGeVQHYtvg6-lftDH4`8JN5 z1rLosz*?<$Tm}iF6TA#rx+zb39zC|;_cUt!R=)XnZrA2;=`q;4!S8|nRlz7nLH`$l z_E^j892aUb5kK&4@J>31u`E602Zl_*%!Q9z-X;01&%@s}6I@%EytUmgde^}|nB7bM zZ{)@@;|ea65!$%ohW2EwhI`pL2wIux`4uA8VH0eov*l!BH#Cr4IB})1!nESPRq61C zdX=@YOoS(lbd=#gvEN;HdUbof_1T#Zmm;Tnc>FU?-%NSVMOwZU7goN$YPy_`oVe9O z#gSESugcm2pIN{2NULKDvAT3vy%qV_yS6NB-WsDb*AP=f=S6ek)^0-sy04tOnLb?&YJaJE@hfcK-mhGxaL1>dVlFSRL_1tE?4I zA!SuB$2_*-qE&qzyvn3jWU*Hp7qR|R3<@cNjt~(78VRh83y_Pe6L@2+zssA=zyJ&&V0MBUtpIi=&aOw&S2Z=*`vXAXoM&K9Y^U?>F5jPqkg5bqR)Xu zELFeY|Hv0$SW|Ua7B6+Kj9PKOH<&IvL0c_ZXM$B7_4kh0v~t`h49&`hdru`+7Gyrex=4;=)2B%;<7;&TOOK&4ONq@Ip>S{tjh&}rm$ zP)O%2Y9~+Y(=o1!us0`^{oMpF@HygbZN~rg9?v-_)%ICLg(V^NEdl!3fj8xtaYkT3 z)wP!P;_>_t`CDg<tj0+|4hTeOy#R@91J{mJCj zI4Kf(PiSd5mmYmjXyuRKFYrv(h2`IbPr9!o9-*F%C`Y=2W&V?!s5z>$DyK{!&+FK{ zc<+Ucoz6A6@bOTLG(OeTqvqH2btzs6KIR~Kvl@7uW8eR)^ z#d&smxi~Lq4(-4y!gH;&sAPMq3;Mf~wBG--R(+=51DftWV^SmK_q~v0w!u21V_sZL z?j;Wi!qO0hYdAc;elKhoGy$BUCOmQ@-+v+L4Vfc_kiERY4Q3UbIFN*{mgaayLEpZl zZ$&=J@?p0NJPj{?)=tz$!K^jeKTLld7}sUs`j+i^uzK@}WU^AWL2@)VzKYp|Ld2Yh zwPqCy2J=k?Sc#<4{IY!G`gF77+u&S(9W)9{v9o&M4~zRw~G%af#Sf3%nX~-DCxaW}@(y77L}*+?nYj zPTrk?GF~TV2!gD|h`B+WZZSLL7Eq2@!ObXhxo8gE9h6&KoZaD(jpo%z(*nHgviR>` zv*NluyaZmANZ0NcR*H6u*NrrmFB9$zS6XJEPpJQjV3lyPo$xH)wG5Zov9Zk_t%?C- zKC9l^?iw2dPYMqr-Y?vb>V^Yr6F}%6j?h;hEqXsaB?! zI4zA?iStP6w{$_bKG4$DzcI<=dGNv7)&Ij};Tno%3zvxBmhTCqLy|XNzQk;oAx|(i zz+dLxBu{t&=GP_En9&P|YiL%|*rs_;5+2pZ9(i2H zdM)R~w=&Sj#vQHjVAN3#G^6iUc;|%FOe=7YIwgldvQXY(i3Et2b8i5p0e>D0qZpbk zGgjUWQLR8DY6vxxgowY!)CQcXWi?ceMXqS$j=v%=b1Y5i%0! zFjID%kp`i-ct~)Fzrm&od1%6bI*MZ7`#JmxdIQdvDjSW@Ut0xar+HMFh6rR4Z zsm&+bA{^&&b7o4(~cqh=XjdNXhXKa;yZd z$=7ZY#>&8&y^y25^6Z=3v8)+_T28a0v2PA54Y?}d0|U}UDkGJTxZ=jXOUHdFZATs9 z(bDXw_cyk4t*$b*jO$>*QUy;;I}o};v9UHokR9u3@A1k3$Ul$u^!EIsH5g@KI-Tf5 z4Ucy#Fj~u{(w0h^tFHC1#W#urUdYGg^^z^}@6~+&`6PVMVaK?Tp@A0!jo9n0zc~=F zMYc-S(G8&e9)~2*ReI9dh&7Fu=C7|tI+aqPAOy8sIsUTe| zn2@$rFxfM+z9q0#1NzYx`Q7!WfzF_jp>tU( zPT^$7vzlCRrU(2luGoQGX=MGIQzHjjs*sY?VS>-Xa7zw;Cz1bo;4udv!LdaiskZkI zCk+^78@NyT4HC7x5q9$53x-=jx4Jdbg&HIF9s2+MyhY$>R-h~^_ArLBv=Fyti%@JT z$>&ZleZhsjp^CGa9H}s65gYop>4X^`e7*P3ezXt%d>(^b{jojR16e6jT8zEmF{J(2 z9(ys)%#_ixZl73HdJ=M8$mS8YaZh&VP@Oq~(B|{VYa{a7xW^>{@s4UmvZm+{~?@yiWE|ZU%wkGwWezxTUv!O6jH`3u=sV2ki~o6;qbEt`|Bu z`R4Z6zTOTB7j~I!*SoHbKffmp*Dd19p>M@s-2*fC#YX%O*vyXmZ)`d-ki4h52`C<~ z-ypow{b^kTR_1(^e<{whSpu7A0ANM0e75$X8!OxHzcI7#d{WC@>e6t6%g$ZmvPn(S zr*(nNG}@{yXPq;Oi$t#62=616EuYktZszg++ju{{*f;WisUK&Jz_)3d^w5ouc5;#9 z&srjfxNc{fz{xQnh>F2md)LKlb3oJW(%B-tt-t74*UXRFZK`V(tsyCXJ%yzR1A|5U z_sJR_lH69d5u7(X9YKOep0>Q;9-kRza(&N|p1D1=_WrBh1ohY1vOU;lrOHKi)Dvq>bA}M03GhlO4vczZC1-Ta0e@VA(>Aq&UM@k~8gNaOR9~qo zA57dYwLWQ#h&x<{mavZSzvMYJl`}~-iN7VzmSl|U*irFRiu*bnYYw7>(F?AfM;v_{QA#qXYnoQ_seJsTPGNOz;(iJ5c7 zNNJ4{*EYniZ3 z0}9=>W%LUngYCN^C#3P+Zk;BSzZ9BcfrY9b$nuQ|y74N*#0RZ;0)_>Dzy zZFWIgluR_fqGEtlT`NgvK33{_mr~b4kw%Ex=8vGBm!O_*)N{s2JzIWbvZOiAcn#p6 zY2`oTp!6U9O`6hMt}+jDSanejs-6C|z!guIGNrR<#{#*=b%1bl?h##9w})B&ErUAseltFIms(( zdClXQHcRnerf445JpLXiMcKefc4_by?)sA`jR}Sd~ww z-|A!j&H%sKcm4Vm8tbX7A~D)`F48`l}TKLWJYR8GeXXGl|pin8Mzy8UH*Ti zu-54=v$86fBX2rga>EKUID%_iT>dHB7-q3KGF+>*o^iU+>$GB0T2#_{kya(b{Zo6n zfa%i#ByqI>{0BTZaHc634@MzVBHkj;WeF83?T4Pfumr7^DN)ax@aqzRT2Kt+X=k4Do|>YB<8u8#7TMq-s2)gk{6{lx$gwWH|W%%KXiD1 zXE1=7HJn9zL#gz)Jn$2cK9#mmDBe-2j5U-M`wwXw?C5Q+y9|6Ux6L5<;_pC0jca7q z5;jehbl~g}?D1n`?QLd{$qU0gzUOd)LEwRKj=W_;} z^GRraoVj+M3*}q#O?(iV7i$`HGv(O(l8IN(-Bmdi{m_IR-Ut~x>_3k1(lnd|N99y@ zBb2W~%m(k3iTOC*_YSC=xOoM9$SF12VpDBPtt?ks1znY9#c{-W2>zRH@Afp;cZb`X zx_7k4x(C|3PJEQy0c7P*Bjl-keeL6*DxRFFkvBkF^vpT6zt#DRmQvbIe;7S^9pyta zh*}fp0OP*t@WD-+4*ME>*Xs|Py~?-$Rd~|f>X}B;F6ONTkh)h$UHw=i>$G8=Y?7)ty=`x>Ez zCAME<;9S9WI=dA9|6k^%UO7z| zY_sD1E$2upy%+D))>Bt3RrZj=supTu7uf}DN9ggWZ`#dLVXv4F_NQMG_R0xifAA$? zy$E|T0$iRX^cWV`r|D_ExYVVSh9AS-7fp)0zZ|i?%r?e9p$=0g$tBe`#a}4Xg_pkA zl4Er!nUMDTlY|~C|F&6kAK!9lDMp_(?CHy9`Tc)Rdirwk|1U}6+BJ~v zUMs?48vd>a;E78sXv1D0-%TQU^0^Ma+=_8JPd#?yWk~rHLXZxFd(;O{>6Aw@VI0oy z>q!dzNE=!U0d{=qTA1=RqGKAI<3p$#yV(K{D}|`VczZ;39X^N!l6JL=!_JvB?5|T{ zp;4d`{B=m3N$M)AoNvk0FMl5U@`bcNe{r&MtVh}}kNQrq;$-zFSyKS%%Q#!%eWF5v zxdpA^>Gvo!Tgt};(U(in3(#}B7(9LpsISRv=IM04e};aDTi@NA4hPSe|0DTc4$12y zII$1(PV-P5_1da61@NFnp0&u1EgyQ1nUE2>gLuLnIxOsDW;tGg(wL~XdV981o3JBR zp?7aMRu77S`er&N?=8y_x}Ui8LBuRVIe&#f2>Ni?hp<-OT;u!ghL@X*WQL<>)R3{B(#k^?8x z#L1r{PNs>o#B4~u)G*|K+7pM2NI9$K8tf&ib>zuzXS54)ykzcR*Xt&AoazZQhrQ$zAE;&Y$?1b8P`=5;K_!+6@zNmUOD6tF@k3AE#;4)wp+R-N zsA;LV03C2^TP~_Y9=I=RleO$b9hDsNM%+mb@B;cc)jq&#RG6ci%r@Xbss8F&R}_!h z@+m_V!@S*jba`zkDCUWw5Nw#-jj^V7oYuXwG=?Wv0Ouvaa}mPNiIaS8dzg>jx17Q~uY@B@=<6^_)VieVv6fwJ;oSdHrMBBs@R{<8 zat;Qe8(s#j&7^n@jbTsJ6)If;AKn%j`sku)wg8Se`k;9x{5Q($8qA>Z;r(6bZi+Rc z1)@M(;mK9nj``he5y2x=@y*rZlqxxt+YHKXZ5;nme-4K2h7p*Dnr0!$#;|mNW)!X6@h(2cy58?8Jx^YZC|-h zD+HT;fd}{HAh*(;Uf6dtw8u25srpXw3g`>5V!Of!B_q_m`vUL)J_D2uTfID4gV>P4d(}A>bxC~XS*29HV+mNgl1bDSIZJOua;!l zd9uu^fNmpRs|5}2;PQdrKiQ*}*rP6wju?5A>MR{{rkfR~1AmN)+)&mw-}UF~lS zyqTw!yLNdoCJfCoq!L3lgEe0GrW>jtq)GmEvbio)>~hy2E+2FPSx(`a{Je5u5@&P<*@$Qu&m2qWHK)(Sdm5^ge|tEj~^ffm0R>t}2=ZumN8S{YDw2@uV>z z1QS_&*!A$>D#LrLTm&AR>^qW)xxK2aM29@F0w>;_OIUcq3K#_*tL>`xpMmG3-d5LE z(!J@}D#;@bcPtW*M@%yOjz%*=*&+0p%PtM&WrP|IJL@$VRZ~4os*vD{t(KRJ&5PrD z=3AT-ssA~in@y0_!RsaL^*w0@u~f_ie&+_I9Y`XEF(#3Q3hR%gYb$BfM;8bmE&uuQ zZ^8yZE6)~Y2ek6Q@^nEfuJ-X#j${d~taeJ~=<$-x(CBkGU7-^v-Y;Hm9|@rq!#+U? zWsW{I5@IhxoDD31@26Sj|8}ydrmd*0G*GF?Yc!qS&N0lD4Xyi~@3@tBbuANE&mOv2Y71Joo!cb-`k_LX&uLNj<#!n^W}h+___n$ z$*@ijTEGS3PFj;eiw&128t(LTnq>HPd=38naA%3D=IA9(tI>YYu_5Rs&AEdICc_|9 zBM-gfxejZ{L}(uOa~(PX9(RDF9!*#IO*vFO3u&&Kq+L%c`O>@0XrPTZYu#0y6ocOI z%5&!Eb5kpa6QnBJ;JFMl)Xt^5yV}YyTE3Aq3wGdfGCLu=0Vl_>rk5faf>y}xylYn~y_GMl#15<0A`t!Iu2PP3*xLea8c4J+ z&9OJn&e^|feem9q@)#5u6z#*Qo+AtkWZyYn)aI3a9MG9*IjZ+joXSmosl{2`A<97$ zu;3o(Fj#AGimRGq*RHDQhTtnbO-TO_JychXzpMXj($3jjU6}Dzvq+;s`Viu2e}$SY z#d)G?-0NExN*@GM_&Xg0d}m4jQ`OW%F?HeL8m9fU=a)VDa94jKxj-P)?4v-L)lZ>4 zf#&X+Q&C{k4UV%tm%?M6AkfLg^xGkH^(B&=Hr-*6f-x^NKxRj4tRDXjj(F?<{=HNjgs*sr10M!9%A4%S%v_X4h}JQzOG1@im7r0_E71NMG-^MPA-_i_qT9taDx6 zyN-6R4{k#HEsYDXxev~;_e23pphs?0_^+3zXb|ETu zaMA8v8az{(K6?M+GKEp5x{lu1j`m{$2h2E)O->n`eAFB{(C%x_RmzZw5qK1M?v1Z& zaM7taRO^%NWYfS$Ddk^JNcoCW4k?v(pydrne};m`f}H7Z3T3+B)W+wikBuYa#fup_ z)a`?RwYHtTpbzyfI?4JS$d}#{sHbi2t`ldI>yZlQHcEQY*8<;7pW)nQ2enX+Yke@) zG87J&F0{<&XqTAME-|HDZbQ5Lp?g1O(gD=sfYLtSK1CWjIcUL-@wx^78U6=4 zutq{-i*>5KNJ!1cnrHRmEz)gUzv*AMpZp5SIGb%N`T{-Xz$qjlp_w#HqMz!U>!2}` zg|oZVu}mdAhM7eDXK{D!I)n1{D&^}%`OLzZcIqi#{2WSmPU)?wN~x$sTiS<$mBJfA zwcnRwhHBCOl(R*drIadifsF2G`(lCSt@=jq{_Q?4nk(G7t27$m1f{hykT><-8Kw6y zc8<}QbseLz^Iktr^cpGemi9M-rC6V+-$c_QBPZjex2s~B2WxN zHL3N2b^>&eJR^`_1o%-96@SgY{5ttZc)!Oc5@zMe zuc!PXkXM8kmLK*m!5JtAAURAX%8pUq$_|VF-nfv)aHY!Qi+^<7i%Wxx;W}@Cz7@ND z!{L(|xf0I%s>LbVn5m!~aCR@ezGC+l(}?0AY69Na@w`}h249Bs_k&kb|Esk{jTK5l zc~a_+b{c7mvUq+PNtV0o=Gc-8Z-$`Juc#Zwz|S6FbR^4p3Y+6r0*h%%(2=0$0% z^rry&XAVjaT*NXM2=&gxM)^s1=^9sw2j-T zb?ChCkB+C|qL!srh0SD@Axv#*5Ppf)v_;mk60yrXoP~YIZIgoRe;xz*n2?JJGZQ^P zehI0jFBvVk#=oPHuhLrSptOp`Ab5gThcSNVVD!%M#l2{I@Zwetei>Zwl&iF7Sv(fB z;IbzY}D*^xy;@W5A@V zqf`m|FJB1zdxZVH61HhV*zgy^hS#!qcrB${KOt;YlKO#qfa9Ri2|}YY?!0oU(aU;j zCAIAhO51xdD^s;1tFe5vj2C0xo3;}0K$h5uYa#FHy9{;w{uxi-T>SqY{(JEMHvG@S z{|)#*AOCO0{{{HJ_6%u_ZaOp8#wKMpV^qKwt=fvTHpZ~(QM;%(SSGQUSL55+u=B;8 z`e#d?z5iLU>F~37qhW2nwuZJB+w|K@w%@n?$adDpLom+z?2KK>;9thq7_;+=G zQ39@pT^+tyejlDBWJ*?kXGc3y&VlE(e34gp!pccPtLb{;Yfz$#bqR%&gdR)V6aN!p zj88r1OTv5NyVykCgXK%ZfA0(7KkfQrt1#>v2XwTq z>P?Uzk(5`1Q~2gV8&(#0@H;?4h>d+F%noh9Ab1gn;ToBN3I>NPen$KqNE7`Xs8(Al zmz?5|i5vFCx0b-3Jf6IcQ*8X5(8@j;v_T6=-Vbm#K`(L3W4;em&tfVjhxU^xuvJg- zwnK zYomhH_8t3XI}lbe(W*7OzFqo(lWYR}XGVeom&jr=+cw4aA2SQ!C&l0Y%T7Pv&4U~f2c+$bNFwGkZ+Fb zWG+(Gq8;(Y0W6At)6Il#NWBv+CZKf&y>@^7&7}eQQq;oxH<^RZcf1D!D%}lV9H_Y^ zGE~F+IomtVDex#&nRScODq6>*{xXSLgh>YL{neTMCt-WDwx_hkCNpb|^F@I$;=qzP zHn#cVzuJ!$!(AiRhaNCCnu_Bc`}Mfyz(=JKt-VrqM1l&^=YN1Ujhrf@xu(QwS;9=MJk?9rF-1w~;-grPh>0JY9r9Tj>6&5d9tdV&C zC$;jwHA#W~_me#AC(9WRoWv%hPM!gMrw(ZP7PQWE|8VWmfEivY(t!O&`!C+4v>9jl zd)5r=A1?7(-??NZ&>2KO>#FiCZ%lgzzqCqU@!Tt!=E%u9-Ifi~7SPpGBPQD$P8FM> zhkqQwy%_t)FZP?!g0O$auL`+rq)#l7e2dyE=E&Gv_})gZ42<*&#wGfTdgW)+s8>oA zZbK~FS$~vCbD;uqc+7~K8!+-WeY7-w z59ZPHK{Nha@V~72P^4^M5q#HRAJ8t1b3h`Pap#(O;IGQ!R;vZqjRKy>Iz_kfgm(IaE7PR4DV{ z!cCYDMsVRmD;K&@D|GY*Ba+E{X$020&5J}xHkzkIT$@RfwoW>dCq%P>4K+Aive0}P z#?WtMPgD%tAs()sCV853qC))53k?A~5J>ZYN4i1UUiaXQMesk83)ESuuOToGHgqSu zg=X@eLhn@nDJ10^-XD-0n!m`C!DZ?gyn->TQaKW3sr6ztDs4dbo*dm|hwe8H_ zkI>?g$`^oapwg55>c@(mfDU#7IHzoLY3Wi2?Dws}?Z&K*qsyr_I=#S)i*?_Hpr)$?8O8gpGDFg;fr zudXVoq!6UV`n#Dy+j&>OSM~6653sVH4hPmaLI86vEz(_yc!VUv`Ho6XRNiL|$>X=c zmx%g%%=Xr^Stzwa?`GJ8wHsUoC?m9uXUkwsrXZH4Dah!{k=`li7$%y+FoaRLJe4j? z_2azF^OW@d^!&v1<_Ru%U_!~=nWc8e`c}d!!vhlXs4C^;Oqn-Bs@5ljrPFonxur zDBuZXAJE0<4~;xkSY2wsxv6AFmO7_R0Z$w-o({gbs-08vu+x_tPMR+i?*VH4Nq+C*9`ICq26GLUAtq zw$E`F!wLjv9qb0~K>4+N_dkgjyn;m5A<4w!yYH(!*?k1aWO^#ueWcQ=tZ3fdOR##; zy9W?6O;Eqzjo<1oakocYDxa^*z^-5t>(}XoA8yYGc(y@5ay_%YS!K#r2$!lZ!%W z#)DQ-ZZyF=5WW?>{}${*2a^Y4WG%ZIoEC$91ld*&0u|8JKLmfST$(@+o6sDABo zk}`T_e(zPn>2@t}^z_z)x6>Rzap|UsXQ0z)tw<(%pQ7)u^SQhpQm(L);$_h4p1q}K zT+CJYYI0H4@q6IATa1M_!rDd%uVBBRy?&7`C>1An__-~n8}2H z2i8q@A!7cnS|^0WTSdwrQaRTg>2g>v{~>8EFF>iE%JU*uhFqzo^jLGSZz8S@^r4w= zLi^D>O40okrJfd9B|dsHu*Cguqt<^++C-9?|7;hXm67!vFMgtg{}$3rCKAsWk?!Y6 z7iX&N5Kw}*lck|toHh4$(h#;q3h=yAj4me>TJZ?N&AEV3ZvojT4SK&L>Z4SCo7`an~?D)-)Xl5wy{nbOTgoKBmn>Pg?MA`EOhHg1~i%uv& z92(2VlJ&s`Nc`VORsy53N}7Rl0XgB3>c?+u1an1m5PaTh3q za`B*50AlBM_FYlfTe|mQZkjv2>Z-lWW^fGMGB5rZXa{*O_Ha-I$^BJ(Z{JIAW5DZZ zV9)M@G>D!XlN`8(g1ua|uS$)zYE9vD$6`XM4Vtqw2h}47^#HQiRfrZVvRRcp>D=RR zyEkrqf#KTGzAjQJT0#wIX#wT+G&lL_tC}}`g%%ED@OFGz-@aqty2x1X88CAXAipW@ z%BuXnx00K<^pP|Q@nosGIGud|WoR{k@?CdZ_hC%vT~~-V1a-o{`)>`_qV@OHb@iV~ zPLs95C9(;-bTVOnqJG`EI$@jovytQV5_?lYAJ)&RwUGj>qaT{jU}O$L)1%cc!7dbI2Wl&;uD}^sg}^`&N=;*% z>8AR)u$!jpzfPJ@wQdhZ(uIQO?heAP8G8up;sR{19vafd9{V zaWBgAF6yvIoFNrqx6J{q-_fs^yt}+&{`-$$^_c3oa@5X?`0Iac=eR_aamXwAsbca% zoPqbJWV-x7Hiy}Bk1~huO?ID%L$b)N=<1IrRV_UES!8=}?;-z`zG&{KuSFh|3>PW~ zM#0mP^0s)!*(Jl;iqL(62k3;QQ*9AX3t2xKaLN_M%7on|6bCIlKc%mIIf+} zNnL#?fwg>1wwqQ&5j#81n#4*rJK_SDTKGO%;Kur&^O)s&f%M`2#RXVJ3s1a@*?!Uq zuNQsCl3S58RvpNm)*|8$L2ZM2ujepULBW%JVW3cJ~wIhH4kg_LA*~w<;3x)V0U6L%5D5> zdd(2|1I#)3yWrxJe++&+fcJGi4+!nBk)CFhdk1@8(Su`g|OHISDbC>p=dMhYA#&TE^kXG%>T=eCm zH0sqQu4#yy`h)bRgkF?!rO_`=lRR}=-~u&Y611`t)+Qot0&+D)jldSBPxAg;5A;LK z+cN@p0^79?p{ur?66-lJvO>HoMi)pxDH>DS?| zjpt_@ODs>FjN=5vYkhHiYWhy-jctZL7>_&YEQ?&;&Nb5?Svi$~uz-3U19%0A zA2tkjotnuRKxt9UGdV}Ep+}2Zfxi^?eXMu9{@8#@dlO$V&Nw`CkC|C3cHouaohSj8 zL&m3eY5O+A`Z5t#l7?-%7ip}yu^`qlS!+-#e%VgcF znxo{}q?HP7CMj``cRNYAc$~5E(lmH2kB1)A(!g8#D|AM(*<0dR3T*u$%T3S zN$DN>2T^+7-cPed{k^7mNF0_*IlAu{JNAA6dh9Jdht|evb>KGN&MQ}BYnqqi&>Cv7 zDt*h*y+0Q(TcSP<=9juP>eXL;uorJb+Cs<-c% zNKIwM#>7J0$@P%zE(<*V(t$lX{5#vyxhChmUj@l?P@z5xb~(?%F6X(I$gcQxyg3P9 zRNGB>`*;exs^OjGTR^ovx3wQAD!e@{4Ke$69 zof~*bpjB5E;ua2q``< z-m|;Nw$A3j7(1T*ZU2vUkXKvk!Pxi4#MA61rq9`3rTe`xA14a+kflr&Htu#5{(N^rdREUmXjsEv zH*osJdFGybcFQY(di~B9No@81`irw6yDFkiWjPdC&+o*!aCQ1@$;@oTWvlr6;k~j5 zC&O1Cem7r-6Onv^^A^ILKUmX!Qp1r_IPqqzkgPs$A5j>omJER;d-Uc4Ng>Sw zNux-Xl?-b8x)BZ#94q(}$34}HvjsX~PcdIg6|fhdp6e%lnx3&-KUpUXolNw#WX`t$Ts=ATABgAXe@ zDP>uz1e?k^qQgNa?N!n}Hmz{JKF$KmN!n4OQ~10-9(684yFW>bhgSizhR%a!UFYFV z_ikBPpjt&2Bq&zV22tyKcEoJBMj$^=NwAI!|X(dp@3C*y&S5{&tx$vqEa)rHZM zzYXpy**C0OSv>EaiEjg1p*4-wbKFK7FI@1GO=~=ICku1L8L*3vhX){8o+sOXlieN% zZT(buznhbi0E`eXRgmrR4`8akeYwpE%i1eV4qH4d@)|7ppoShi6~`@yJ@QukjfZ6k z#ibfbEDqeNJ;ma5zD^cL_yv}(h)+l_vN>#D6&fs*JKwU*MwXpD_^p8s$SRwLzk-!; zsa^}u`bqjjuuy)zY8v`ew0)VaV!H;|Jr4VTQYINF4f!|tD6Po0%0}}N=OkOdro>Vk z(H4*#LF|_-=>!%hiIB9W&Kh2hBgVM`3KG4bh&|sN)Dhu`&DW-;Q@bd6ovTWD%XGpJwdURhx zaP;Q)Yof!`{_@>r?#K|d(aFme6r}B=UXbay_g4I>lMiRQQRqT{-iY;9Qy;t z*3f;806m$(T?2o4f%=sRvYi`q8rQ*_Ev$FBeLEVup@+Q-Z>{VQ2XjthWepyY1_nPH zbaq3Uvg4i|HJJZ|^z1>6;FU^4KG8pXHbj_8+ZeS~K{-yUU7KxcMk=+~4eV=y=d~UpWd5tfQUKb8-S(`OuHT zfd&C@MGSa^tZr}b=DkIGC84N)b3f0%`Mqxpt`gqpSv?i7)Zg4|*m|VbJHYp4 z`V3nO`wTsW0^hw@(4CsarFKW#0WV~sS>5OBqr(k7EOlRWXqu8bI@B--UL9p0?~M*O z_vj~0e{6tf_f9gN{vgo|Jp2SN1fLvDKP!PL-2LQ{f%^NM~3be zFAjAce*51K*Ug6CMvaSZ6*YgPbTb~LTcE#w*n$1jehO;^T$}kP2J8nOw`IZl#P!Mg z_Y|y18VaQmC9PBtuOiL-Ewf7LHHyx| zvwoQ9$Z-V6esNNOuito60j!#XV^4fQeu89=-g$w%V;mqAy7_abOV}e#!Zb*RB<`U# zTh?U0H;eN=4u34h%~-`l{dV?Fz7_HuI%x@otZ_w|DP6@MGNA7R}J^3%iA3gY-=? zNy;03-Lral-Eao9gOcGD?55#Q2e`4*TC!uYLQb(M9-ckYNB1O)gnNee2;e$-P%@%% zn)DgUNR>$9`pM}2Jsr3&)}yxz(Oc>lY;&HZeYSHT6E`m0*nt^Cd&rVKqjI#K$F9BR zL-KOHe-E^drT2zKv^!2(gR-6(x8*|JsVU<7+8}FtD$6h>X!>%K$ zWZ%gI$iHc?5G_&wTUH)AG#?Lqt-odPi@vL|R&E%4cJO0pdS1b}YI>dq0T1C=_^LSx88=G57nrv5B+vMoo0%1P``+8Y&3u1X26RC$ z?f5#@gaEwQ+#Tr4M9A^HLU?oib+CUo$-3VT<^bn>{q)1`0UVPjG9=MEKGIhBCOLvqnMAE&?tol@1Uh>KTab#;(h%6a})VQLoQn1 z&3DW-OFzmEj^&_-84{gE-9kI=|4oIy^u?#Zv7uem-uZ!T!IXkh@t}KCImrg4{T)&h zWcX5j$9_mu_H$AeQXU%a+yDIVf&D}K_pcGU$sU;#@SeyBS*8`FC*hWwMw=V+7&!ec z#smAjg^Sah_L27HDk)i;X0!;znPeN=Po54M@ZNASESFsFj=D_jqUFewY20}7y`c02 zN%aQytzmqD#yeAZdfyDJF9+6jvT?Q41?o87c&vAUkcC!ngdbp%*DOdOt*H;v{P0Qk zUGJ&JBq^SiB(g3(IMfL0-PF@H_ke7tqUL(+YAzz&Y~mzcX3VHxa&{kL6Qj#fM$ z$LVi272^dX7d)VU%#HMO`YT~gupIrASM64|YO%Vo)}r+WCRjVDGcw zreW#LjU9}eDbSq)2agcscZ+q!>ZnG@+MGN4GHQ zCQq6p6vF4XLz*S5l8k~RO$VK00N2mK(jsqQ(+jhNKlf_&NhT38?j)lqX@nfakz9bo z{S{ISB(mQ-d-DdkZh8%EiV6C3_;(Th)f>%yc>~_QWP$!B3TN=Ixxa%^Yw}!>?;81a zb`G~;uoZ)i4A}}5VC{X5v+*kUC(dxwS7su4H7XIU?CS%>8Sv#|Utn`#sd%4{-cOXz z6mInQ@$^f6#a;IGLc9m8gvTx>P`R|OXq;vn4WMN*+$4`agmO~T?LM-ur`#{X#&}=+ zyr}O#CdlQ=@;H*TCMxCbK<+uLy;Rmw)G{O8+slL6$O~*f$^p&}z^@u;XS=Tk^_3u1 zT%raeF4slpC-F1+?3=@J!-3x-YgO{o$Bp%|`%xXJH|J3DZ#JKrs92{a^9ewlBU zCBM{9+&5$0%wuCj?dfE_K7-W(J#4%Z!eic(#dXhQ^~tq6xe~lXLMgw_M)QfNUf&oW zZY2*Ll4%?-IfkJd+21r=*uQ00$MELVb~q1*7dYfx zlxNGXu3;1W5Xa{Dvh>2gnBM%Q>80T;C;5dK$p2;%j z)BD@7!W7uYqVpWQb%xBH;_NAM5a0A z4SrP!*3LP#kc*e%ye6SzsJxe~@@9wzVQX*KkOmy=iCs&PuLQcwGleu=Zqgi`);lBF z**yn3u4kZAnT(RAK}JHp5E7u#1%HC@d-3!xnTAS&MZ8@kx+@;mZ$F+(>yl{Clgt-y zJWljW(*!Zwk|^oDz*F49F0BCB5ndAn4h|NG`||EzP1ZyYOeLvMqUQv9iLv4ikBJbrkdMN(%0bFn+&JQxQX_jEUy4hdm0|Ryc+aghngL| zIgkf+_2LyA_yr?tqEFLi3Hf?sx>axJ2EIMLkkbe}aHye&N}c{El61(slp8&m65g*= zLlP^oyBF`Vfii%vDa&-!lMhdSluq`08?U_E5FFbEIm5;NTXxK!q%F{FWo=1DTM|vj zdd-miP6K`pj@^h?lJnscjBKNSJzze$kTdkme{Ug|0AF)F{6Y0TKE9XQXk@K?9C+_g zioD}xo8rH-cPrvKdc)*v)9&YQ0w+>|mL{RC3%L9{mvyg$M+5jf=@FoXU-6Ts%QaU7Pb2}1{tE&5382Mv633sQs&CnZw4j^(<%bsTTx&6v& zb6%p7T}sLEhTZ%h*$R>0#~>fOG|s`X)2GaqYw)($0y>k8I2Te3(7fvTgZVUtIANhO zlyW~`YD}@rM;&sHx7=CTGcDBXZ=jBGDXCH`Z9=bMXS#y=oQfXjAV%#mZ{fSiw`xj{ zvs-J)6sUF6PYV_S{r=0`9C4caTJU*uG2?ULcLOKZ*q;)3k>o6fbfFs_N6Vm71OI38 z?{(e0Wy=~N@Cw)U9IYJk!bj(|0bIhK{{4}{R*0w zJZBp8^NrUEM32v4^f+$y3VKUU6|3}}46xcl?n!LeH~cC*tnBW_1(2AEy`6Q^6ZwEx==feja)>0~mk$@9=g#u+LP( zvXHz@B3WBNI>wFF^D`i8yD-E_cmemZb3=622gi!xe}U@j`WT(iP}kmQfIr^k%fv zXe6oRi|^)$rkIv~leP4lXz6sGW^5WX*J<4T8+RAyFD0{4#rUJ0rk;3U6P)0T`XfI% zG@7ZTHJ$MBKnAe%9!4j~_!U-cjD`j+6?hzU{^Lg-1F3_@2b_b9qGyY*=1evPkV zy{XW54~H50Ham{@I{IKkrj3XEAGpNn7(Ag!YQyOqeVds_ktAr~pXhZA>Kw-gG^`(# zM#kf*mcl+$3VD%D6-Md{2UEL`?uwQS8+wlP3hpDJ(&c<{5&4epl5OfO>lI#F^e4#~GzhDt|`!H=dgfO>Q;E6qe)9z42HlJ0{6P zG&diyeFxs~n%2Gtp3QsOAw`Kd4ob5!Ah-Lm*^(+5#Rc69d)oI5?fK+|n+Ka- z9K=lu(le?#{>uG(K-FMXWlHcQYs%4IFw)BX%s59X5FM2Q?)?pw3+T=y{Q>P?;IsDi ziiEX8doJ8HH)UDR820E$eNM`sOt)LE_8q8qzYr%~kX8>EbiXlWi%-;n=HL=_$I=Td zK8xh@tmlU}_Rqv_=Ei!HwL_;~(0GgSt{=6gaSF~*Qvz;8Iv@$Q_Z%3Ae^EPRec_%x zab9E3zCG5S9i*G3yd!sDl%zA7zyVm)lMj7WIz!>Ao!|k;DwYNAt_IKR9fHW_l?m9kk{HS%;ymQYUPNGrddgvt_3QI?eq0`Zm z3jC4kqJ6LWRZ!_y*dzj%^6xNRGf-KwC*dc6g=*e5!%y`{?PB+)s#Q`F{Flwdt-6?e z%D+%|6Yl3@ecRbZuj9iC@|y-*8vM(RkuO3yU9>N~1XH%d+;f9)8ZSiS4&iOGNvHRJ zzbc%<4c<(IU3Hu^*I#`5S}_AYK}OtW-Ib7AOsuiVLG}IAN%aNC{_UNKwJq#PVEBkp z)fVESIIdpG$BkgKIHP;6Gs(g0p!W}*pgHc5+WgAzX|KRb=91^T(BhojGn-!EdhotD z{Ibm!iCc2w9DFwod?-qeXWsZeNL&VQ0kqR~_*>Ntts$JE@Pl$(6zTP1!u8;1Aw$v` zZwAf$XVOdu50~P;*^wm7^WiQUQd^mVe1_qB^2D7ApT$%MHyV$BUIh;+pGuICq;z2X zx*`J{AEhVCkJ<1X?)a`sc{!dF0x8!U9)VAVKXQTfrwxOvq^_Ux zQulLN(y^a%QaL*<2=^p%svok)A)DcXdvT*4Z(=8c!}@6WD;9W$fakHr;sbT< zw&jv3#_!lt=0N~{$I3U_`uHNlh1z^@e^Y(4;DPw#p^pbDVTVInOrP9q5NC_+wm6C2 z^5!(xi&qO?+eqH{(82P~!-qRN55Kl4ZbhYt-`_p^0&G8!9vX9-4D4<1&uilxHsCuG zJgSiI`=zXmsfSa)e}DO4_Hr?22VZFd*QR|GJfG`g?WNl3Jx^p)4`knFnx5rip^Y?L z@XmHef*0>>gXb=R#_tz*O$`KtxjQuAGVTzs(j^(M!hL*!msb$J&Ph@M5e4RtXY)sQn&2`NKXQ6sVfT??*Y??#ZA|lb zJdHfb>6j-u_|}KTRIwOw8yvs@N4qv=$zVI!qv_x+_URy~rLQ}v- z8f|zj$+y{S*Uo{znXlyG-EWTUTx5HdumAgEQN%p}4^7G7*!Le+?RwOaJ zpyMoW44EvO&>BsXGvHyKK#6JFTT>?v%L_0*`UqgK-(S5ZZ}wp9(HW+$dBWHIrj?7 ze^dDu`+AEI<4|+?qN$KPL?eNw1^qLDV{b2|rWSUoS9{0Ld$N9a?x-0!kR<8}( zVw^1lnq#CtU0~^jUJUdYp)1BS4Qgnpg5tVRs}Xdt@h-H)Nh^WRg+OJT{Ic0NUN&0= zi{|Cqudw`l=s(z~eUx@QZ@k~i^Nv8$I3#DP#Sk}EJe|`oOF!Sg33t?4mIU~L?yy1k z7h1H}!ios5)k}|*nV^XUDKo4#Y!G_zMzRHy=kIS@l3`z}ey#c;%^7@)m1J2|d$HhH z$qz{;Y=>XUuw9p&JMV`y-}IYw(`1c|Z$i`C0N)p14AYK?H<52AN)cYSUnG_U3iZW- zVm;xw9C0eX^!S=B;8m5LjBbHR8ZbM!!!^N1fENf;>!8Km-Rr_`Qt`G6R5^!NVepM++{h%-YEaq*FSPO|JPn`v`><&kTTX2I>*71jd5fj4_qjrcNf??1OEMh`NgJ} z*4FnY!ais5KWU!>N&hoXKXV)u$Zg==pWaoj)1{Y-4}$t?f-eKI?wvn4Pl(pQd@X<* zQ{qEmIRLHp!r8{1CqXBm*4s$0zjr5I(93$5bTGAUvh3k4S&#f+&5uq)H}hcw-eb}T zmueFyu~P_JHdB8{e)sKuvn4QmZg^G-ol6h@i1fmPweXuHaGcyvc;Ae8Z!NE$b`$Nb zG|1vRX`3hNmrr_lXk^>xsyx+`q=x3VbFQS*$;d^R&MgZ^hLibd* zVI~V^dN)~v+kkNE^FlYRvc@0LP|$co>(P6QNlIm!tKOPkPwT!LCu@qhyw{{TU!u`~+H+3rDI74tBEkep?N*&8{dwE{pqGPVMvQS%~~`|`B}1FY+5?VKBM^k#Lh1K;@M^P7Ox z$gVCdK~&d~S$Q?@pIt}vQU$#|@nvt>(b&+)K!S>M8n&Qs<>38Y(p%6_mg9e{TlC=uGcN#GLK*wCY{WN7i4p~d?RXz`BE#j7pwtpV*`rU`1o$|7$) zq_=CuD@O+QE$j7KLFv-VXtLh#@6yQQi#pZ@3rPmy)Jcr9T=36HS(pwz-3N3&_%da$ z8_hN8d|qhic7T46LuMg_UNNQDf#i^>c=3kb50bx+vga_3!H?U?&MLr z@2s~J_|FcMi2ah)L%hD}Q+g2@I`C&@?SkOg*U#=BDq#9~XP(_ZbOL&8@$gqbT5Qx( znb-S^a_$h{ITexkM@|5gXkeQ{50dG_8!V{4dSm5gohIj za~f+Y?{0Wbc%&nrJO=RamV3=3C1R(Ph~A9-e40Bm@MIh>rfGRY2gW@UWsx<_D7yiR z6Pc8g>|cQ$;nfG4hh(SzvtO8@r$pZ6wn49Q+p(EsFAz6B@HTseAX-cGgLgW>UFQV` zkaFNyaO`U@@+jfliE2xV^h#rr{^HPkLkSuSs9ueWGz?E2ku^sv@cWm@OSPOq-ZRHW zvp1glBp6pXhv|@}8D|&98}ynP&?c$07`A%*q=B7Gv-S)$Ye{!UdXD;-_$)6?6`*Mf zz4c$DrQl{WNqQ}tVu(7YxsrJ_(nBW%o22){y&0|dgYjkB zKQ$cPE|8|+$dCrq7PV8>Z6|rrbWk#CJF~=0@jIuCSa-p(1!!&YztGwu*4pb$ zn%b*y8g$bmzXd>8PsIc~`wk48>Ei|uK4b3BBTuq>4?P1t^t}gntxi$BEmF>90sc)L zfV88i?mUKr2(eH*C`7?)^eg;r`3q)B2Rg?r-uuk_fGKW~_#NPoht?c$O9M48PT39J zaA_$t!jhpY9~^t{W&goX(mu|LXbw$hBg&qfVxexsNro(w1Ie0IMg9dbv zOV({P&hyb*SW++ipuC=JsoBLzbKRY|ZyBk5pi*ZkSzBdEjVY@aj{BlZ9|2xO>EET& zc`7}Bjo2Yw?T*tG8RIP(gK=KLmv=)7@Kwz-@ju>l_!YccWxM|sq`V?;3uLG8j*R!> zKAM|_m;ZE@cj`CYxkfh&@=4S2kKy^wbR0Cz@KE83oFdHDAH8-)KjkZ*!b`aJ2Y(CQ$0$ZS}_;N3!aUWiXO7fv^I9$wmUXyp`l z0ko&4iP0k(d9y`rBRNnx?hr@{G`t5mN&}sjpW|jf5SIWymOsxq{nKCpY+z1ik|j(a za~z|gG5jI3eK)-Ur!l;pNp|1T>jull-FJ(1bym>w-D~m#K79$3&-?U`z}k~2d~jq4 z@o;&F3v^m_@_GIj4u=hb+>2V3RAEkCVpl;xu2> zE}tc9yUWuG-pj7opCOdeVE@}lpV}YXiG6xdpZnfW5YDs$+iG+GXZLZ~!&?Kl9FGG~Epi=S9KIDfmIXE= z)#e%sdm69dP&|CJ9;PvdT_f|R$m6fX@zUZ`KMn5ReQdZuYFT11wq4N{GQC9bN@rqZN9Pn^xxnMhu$YXFj}bGukZ?o zmLy7;y9xa}IRvfV+mbqlAq!@$!h00AxuA`nAO`A)t}q;>cQ~LY^Y73fhFl9+jh{6; z=M?VueL3)W}AL$8B)_5_SSY%7m)-ehP#Ex>C|s`gVFw4XW;|9%rJ4WO-(z_e8! z!P`VA3$On;q%v`2_+b5_!CRpX%)37uC}f^*HtvODF0_k3L&-EQIA7mb4IdLfgP)+& z>GH}b1ped3mL!qQ{bH<*oYT)k%l)^|W+y%4U!~{m=u7@ ziPu02;p7SYU2NFbPqwrqQM&o9`GT~s1l$4doZXk%;HS1xwF*0&hzXDK}LAIFGfr-$1h zuU>U;(h5$VboHuxu`1?vkoN3F|DU1LKy~a7&J4BUx9!vloiP`!xOmsCh$G)4`=GZq zeivb)9PBGYipDUs0Qks6W0ta89wYagG-9qdxv`(eVHMZj3Oktu1Fc4p`J9LxJ$3BD z_nQA`^fp9{o>roKq)mPv81iRm)6bX|08y0}Yi|YS`&l;O{p&(9P8pl2FQHr>o2j>{ zhHh@^`=EmJj#~qj$6?0=99D_b^!q;(F*>gxW|b1NN{RUni+SF76z5bCY{Y*W@-mWT z$?txe-8Foi=D>R2X)@tVdjhvb8cFm%JF<|=68`JX)b~CMPVtfd0?KWG-hKNhUPK>V z*PUgNb0--n_t`W^#vi3LDU+m;YdFjNV`{+h-;K8knvT<2Z9?mpLe3-@?YI@zdlT_* zs_-Pd#(W0+c8N=bmxOy^*K%)--nSE!1$nmNdw$RJ&@hp2n5(+0rkH z7v;@Ow+8NIA@?F=7D8sF-z*p`*TI|E<{BPw!N0Dji)sH=99@T(8aAVr%{AS3ruER< z*+%FVa#PQw>Am6B{ESoc>Mh~6;3fp`&l;g+c*oSg%uN&uaKuVYu?;9A* z=|4Nz-oIG142pYkuPaRfcKZR-I%lsLai4(KBrXl&^d~rY1yFAk&A3tA`O_?kml_7o z{1mj?<5xf2SvF(Ey1sJ*^ZWW94~~ghlfNlh4BDmN9a~M(Ik76{LMj`(vxL-#7B_)n)ryn{e{Cj@iHGl zcBQZ-`v7`bAzmW>ujH9=8f*h-CcZ#wV|oY1SAga{tVCX?yYlN^ZyJ2k-O2b3ZtOY@ zX&xOq_?BVYpSNlwS3+(ES!S0m!hm-JZKAQLj9-da}GN7*bsJh}=UGygL zKU*{BOtLF$%Sk{SwV+aBTh&^XY3jY7K=G2gGz>@g5&^V1tBn z9>e{_-;W6vYhdSb=&<2m8q>#rN^L$|o(Y@6f4#+pY;>$NG61@Hco%aW9Q*UZWZb?8 z-7cK-Uo(9J|E>fbH-J4R4Zk+pTP+WzZc z4x|I~1KbxY*N&H$5WSPo3*IaF6|&z5j(v;e{XT2C13oXIKYu!olcmyZH?cWi0lHHd z(E-$XIsOU9#yUC9Y@s!s%|@H7$M-?Ykt70r^;@A$7(MQ1o|DJ@#L)kpo?pdUzu@3I zL&=UUUcpkXtB3T=2p-tTcwi?tKk&)tE7z9b7MFS+9Q)oOYv8%#1y~8s9j`*W|LeI` zf-P|So1?5nx4&r(?URXX_jZ(f`PWFw1{MxxumjIY9r8 z9WYpu^_6R-_YATuOf!p z_v&%25|VyG4oN?Ovj}O8YaQ^{!b!c+GX*Z6_UBC#=IZm0IoKdjtYFC$FZSQMXAv~e zWs3Detq1!l$+R03>yz+pCrd-scerFdMgcE(=)^0#VSD>$PQN@oXUBEj3GhihUb}Gz zY@IhJ!237{`#^*KR%0Tp5AkvhXdDA9_HGsu^f#t|XUBVav_C2in`NCw%#pmB@&Y%U zAnnT=(6gN%UnRuBr!L+>czGIhA9TY0JySu2U#Nu*s@T56UY_Fq2{h)CVH-hp>EM|M z{)7*cwj=!OFiu;>xa?%Y=_2d$mX4FOm|lFAZRqG;M@n2J5q8vCpsR?uV&pe;=aur0 zIks=csFIE3HL$8U-g`~bwaIb%tEJSwx%fL>D(~y+O-ufkq}7-!<20r+euc2Yw8F4r zGj7GYK#w2myE)lhDdIbxGxX<`Za$sBb)6Ep&8HJN2m4OK_gCZq37e7d`u==SigvT$uu~51hA!uRc5&TWyy0JX+&=-Dh*U2P&C9|(WeDU~#O*!H= z<4cFHDeUXWUffVas6=)Z@++dbOuxSY650-Ua!z)drpCiB-3;M}<+Ci_-n`Nbx8bp! zr!X2A-<|mG!ieoWh2CSNs84YslNw@`a%1nZQZn3e>~%V-=VPWfS%Ce_5l0&L+cjqg zGJ$#Q%zHyqoQPU)G>yX#hfQ4Ru38IP;R~V1yq&zt(KxvVsw_J(2Gf1&$n^~@v(Tud z`X0nc96*}QNZY~wYFM7Yz)tl4Db|1JMh#Z^%H5t9pByBQtuwe^ZahkBEKp5QJTeDsZBEOxU;+mdOx7V<+Nds ziQ%;87=`_A+KxNpyyZQ`Q*Qw-;q`^U70JeZ{j;&3yI+J~5n-zLzwg}FPrf@|22~1* z%6AH0|Kidsg+@e1;wa-r0gC z{J_k?iWhQE;cbyU4(PwaUS}XxNP~A`y?774PQY&LzBFn>l8Ivb2Q)&OD*}sPe#lEb zwB}%uILDGKec}I#kSKlwZo;mJWTj@(+i3E+ZW0ax2Za)r4LO ze4X0ROY-VC9Ugl=Nn6C;ew1nCjsv{uyN5fG#2U~;hb(W<4e-S0fCy>DYx=P$S;8~btd*{_2RDy4a}5;EuH^Hqp{Ac?=y zbUYu_c5*5&m{Oq6ET43QU2o+tq~(hV{AX$9VmWyW;*F*x_=df11yR)>WY2@I?LVif zxkuBSVj4n5(*A&3=s#vp)-Gz*qg3yGi>o&FLnF-6`3u*5IcVMaDzo@#<@wU9_#D%T zd}^PDpM~1e;olIiyFqWh$QG~9Fs>HY+NM}=8wiWMtJqsx+OspP`hzG1eZ}~viac)oI}g`vqVa#biu}Az<204i+<&U< zJgj@rRQBgmS_g$II}cxVZ?JyK)D`d*-0{Wh4k2)fi`QnPBOjMRa@e@zg^P?DG0!$b zoL$OKy$N_M5AWt4tkj5BoBX@RHdGd0c>!k+JM&ghE90jYLXLe?2e0WoJZDp!hCF6n z*)aoto2)C~N44@=DTn{n+!?r|(Yb$_O?M6&-VALa-hI3{&qg)9l@_O8VbbWoZkmmo zDXR0?Wv`&t*Rqo#=bwo&oMDWYG9;a}C!4;WoQoPd-@psFL5|w}^XzzOymmMK%|e?0 z$S$iLh7Y#0(kkbz;<)tkvN&iSaFA4Fnr3*C#cg>X*BP*m&eocoahj!h8&}}X59zpkoJ%^MdAHdiBsHZ}We zJsvl{y`I{;ge48l>+g0odlpjOc`Z8n6H!K!tEEM#akVtm3ay@&))v8ECoFL+wF<6A zw@}m8@(+s@%xVn+n%&aiZ_E|j=lOi?S%MC$R@ks;p~za>($>`EZ*KLtg^ixpg@VK9 zakY4aHUOovEELhQa8KvY|EI>I(ADgw-U%y|y0uyXoeTwIFdJMxp|m*{5olMtuE5jk zscrQ)3q=mW>UK{OQDU`4#-J-YU8s){^~l}SRru>#Cuzcx?7J6KWZx}V9Yv9iQ!+U{ z-)L)S##l@&SZ-$INc=0mbzCK;v7xa(RPurrwSl$%^-ZqUhMERnL+i#|ww7FttwOWM zTxzni|xC1hcvdkg}mst=i`i?rv!H z3aws`ptkGU7GZruW5fEk^=OJRENa;kid(2t7mnO2w>q6_X|yA1Ji^2ZBU;S%LR23n z)FZ?+JGS0X1I=jrLYgzS@uzT~Zbih;l5Gge{sFCdLL)8*W@*V9&3Ls3jb>C{#;0%rZ&X^^=6% zFiF^rp|Iv8yw?WU3g`#y1snpL0E`080W`@RHyw}(U~2#~O?cC#BAoElvYj!{eVyQG zZvxW5cAe+WqDczvFp5sA&!>S=DwRj0GA%?BLa3Y?DRA?CE}qSFa(zelc` zCCU(-v=QZ`5ml;r)jIRrTG-w#X=qXMt!(yVX&_zub@FDWpKL8v$mmAl2CO1VBre4N$Zfevyuoq<$F()y)#$&wkptf5fR#B7(tr!&Dm<+WudMgG+pvur z+_e1an(AE`eK!iiPHb>juV;tY!q)ayWZ@d>YW7wVxCI-8YZqB=rd}*ubZw~E zT$E{{GT?5An zLpdKIjymkoMe1@=#>;%8DBeYjM;*rkPo1mHhmGrMcCE+WZpLgF6B%hi?>2HfG4K!J z?*M$haQJ&KCc%s2j`~FZIXx}PjLd5xq^Fiw;HniixO{CiyBlhns%!nenzlNQ+tAR| z>_NT_4UN^czy}*@s$1M}PPU=e)lysCQrARr{WZ%-z3X%bbRh=L04fo0BZ}vof zJ8+OUc|FZ8A5D~6kF@|!TR~I^MU5anTCs!bX(&SLUn{ufQO;GiM_ogs%SQx?ygwWm zd!Nq({+i=T(TvD%wGNCfrVx#ZsFz{fI+{13v2A^grx|_o`P!n>un3~3SVC+%pO5y5 zTCSXt;#->=>gzH8Y6|#YZNv;>hXL=HuM$fQGcdYFkJZjkrJKb3d=3an{jPq3+6?TqF_ ziR)KjO#h#?EnF*38ioT{d4vVrKt5Pett~Rm_0N}IFOMPX`=sTEN~UV4@&Bmoe-yud z1Lq)H5wE$gkT#L`OfdViGt<8QP z*Mf7D;?;86ngka%KXC$r8Gqy>myuF2YgaCjkVJUoX-%^lD40`lM>8FNH2!LP!dr&1 zFtxr04+vr$2`#NI91UScA%YIKH@a$kAOxt~f`*pR2bx&15zKhAzp>#SEOCD$!#6@@ z1E~G_T*2Db>Zit_f1$8S8H=+vR>?FJ5m`iL(D}i(pgJB`7d2ws>RcfDa|Mfv%j$)w z@I~S9@L7RAH8*$|wp4JbS|-TWmR5n{LF)PC9k0eYnj6-;5FV-)=b>OOYeOU0B&g{s zJeWauOiDZxRMgnWQfk38*OFMF1dQ;9i_rm4U_voX*{bOvczYgsuMH&!$LYC{bY z1eOMCgvu)oot;X5S$^o#+FAElS*4)at6Dsa9#a3B^Zl)@{`FZXn$xmMs6hO#@V7PB zdWh#|^|a{J5MuVJ=5Pq3ClKOo(`gH^c;rlKA{N3jMTM|TECktfoVn89M2$fIFmSPL zu&7y;R-rh{#5NE|6wwA`QnRUTpdh*FEQH!17tPw>@GG=ci@Z-jhh2wRxI?(w43ZF> zg8yzd_gECvMl-f-me6#WOc+B!9#3zs?pmR#p~-_i=1~`=dN768G+Lri z2GM&yI>kbvtPxy{YXeAfY*Yv&KxKynJ^6m1r4ScS;v~ZQ>bj0D31j9K%*~#99BH|X zqYLeQq5z2i0ori6{W$f^S5xa~pj2G(B}upa<`D+J!~pQkksO z3aAF-5AI#Y2*f~unWz1Vw3P)VR>93slLzxB5*}q?Ek1uM;_VO*G!swc$KhA!^WPmx zj7UaK3r>Fd08X#X~JE1$A!+$rZM6|Qk+t8FN5Q>`+R#&G}@hz<);vIB;iz?%i2fOii~ow_tA2B4lp1w`~k&PxTqVG#}R|!ud8c8GT>C= z8*qNfG5}UCV?ewv2r(JT#VG?8mpCtOVtZ)WAwq3uta z{lmFy8W=CF6df8%oKbQS)F3&Z(g=p~IIV-V3*z7n4Q>oLmRSpa2tJ%ikn@^FaAnuu zxES;ULj(U*dh8q4K%vFkP}j<~1^6aRJC+eT;P%r2FV|Z^DX1gr@~1Q`>PyFfXfIX; z8-vS_6{Q0O`A?-~gfNLP<+h`V5z`bJ&q^;y3a=ls^#~dYbEc43;dBu+7*0!~ca)h8 zuk(l!1p5YT5W!rlu)SGo;%Hn~=WA#plniqFpGR{FmP5VZvapRY!dR?=jG?JCfr@QH zI7TxfP2**fM5aMGgrgWrQMw6wBwSD9B+;QUYHfBkwybYxq3Zw)HW*8}*Ae+q{=`%? z=@Drl-keYnTNf2X(ouKu1M^zqqRwO6&?m%O*yasHn4(f9c0;(I4MS{tLSnd$U{bS< zG76KaxD2Ab8r`f4ReT;n;1Oz<)0dL$Rf$=+kexZK4G;o?PZF36R&AFO=Bz3u`77(I zl6IxFs8R`1`j9I`BnyRARF*j$_5yVb&{w3hTMGn`5QRmhb|Js2Vl`sramW>l3X1KK z^{D%)MII+*beOyi7@Xu8ErQP@@7sLBPc#6LavHavhMDtve2l)wnL|^|HG%XXoYm-; zxqkZX_H1B+l{O}*ha9QC5i*?xSW6HHB3|Vkh*cndLFNg7A4#;0nQIZ&x|-|T=y++l zLkDW6rGZZUP#AuBaGEaIaGkJVfzlA7k<|Zkh0x865{tx5l$cs8+(Q4}7EWAg18M7D zzaAW8Ejy_};2;?jU#PqU3aF<7)NZP|@i$jkTe1;napU!OtX&EUiMSHW9cx$NuBEYE zu(j6QA>cs1{C`V5Ai{772b!kT578l$u@c{~P^h@8p{WJCNV&Ia-PnW+0Y-%5p%Co? zPz4JXu)&TlJr@!|%zz&ZBcn9bfb1sL7YBz=+u!AojXr?XtGUdMv)S$dUW<(JEqV3G>B-%XJMt3=@W8Jyj*I zE8!OTFPq_TRg=uom)ArDLWzrz2_0}E&Cep-j5T{|J#JjrdKldm-4KSqi8$TR(A?Sv zIz(RCEll#!)GDxEv-Y-9d$II|Tkub4EwaTV4~;<8S0cebTQ>%wg$fOCsL*_3KTuV2 zV-^Ypes=3Y_pcx+8$ir~o@n*}o#KjMBlU<*HYK?Lo~96co}tJJ`GT4@3tbX3+CIE1 zTOhk5`dSwAKv>k|s>O99$vF{Pi+$n3O$rIS@t=1?Q*OPxtzms`Yc9!}WA7p=iYu^+ zm4&a=yF$h}gdtcN^S}WrG69Bi*|t^Nqnk&?a&j5y8AZxRQ8=t#*?P3b1#=@LI&Ak5 zRTRp{_E%^tv3f&s%D!RQWzj>#$mqgl(3~jaNd;h=%X1OAdgQwUMn}7qep6bte~jp1 zi*ZAPi{1UHsnoJ)-A%|&by4M$((5rLu)fi#(a_nHRiF$#SjanAd^GLi#WL_=gVeP( z)-q{6HKL+uX;En<+OG0@F)Ip5A_hc8wlbRr+Eiv$vmkl|mDdIy9KuGBZ6F44>$!-o z6Wp9U?D9=hxIIJ{x@y3MxagMIFC$8!p-xa{iEsthCddO&S}PmCj*z^hwyn9DsI)qe zf9Oazhik z-T*5Ab$|_k`vE@!`~>hk;4t7ffYX2_)%I0(TeYpMq{LcUK;KL4mDL6IO1rJH%voKz z+F@71?5is6&Qfb}HTEU_SyF7pd@ZT2K>9C>t1K!3VOm{MR$#|Ek;`9Fib^F6#A`MCRKAN!tV``IB)a~| z!l@sSmWSF1#+?0L=`5rK_|$E32)x@~WZ=(C-)slm!YsDhOdTHlXGaXRWM4i4l2AsUc{M zwYXRgr?eQT>LpHViCs-QNtl|h(pj{0DW*YfH|32CQ`1=s3Rn|q1z>5=z}oD^#Zmdb zEKR5!ES|EZ)fLtfM{#WXtdqp4`3i6xR8r-kjPkfsdnb#deD+liEI)bO$?G)yP4Nz_ zt1_&5weOMN6klL3wyv(WF2TgBV-iYxxj4#KQI$WT?$|IjT>)lKZlv5FN*5W%(nSoo z+^BGyBPSy=j`GQCpt{(;gw9cU9jS9Ghst5fI4KF`FnKJZ^G?#|s5~WhYekjQUJxEw zxvWq)Iu|>}N*k9r%Svc{J83Ud+pV_BDol51{wPc-r^H@bsYJ+QRbm7^QQRDI|r`Znqvakv1n10n^S6*B!seV5Zlhm}}YMTS>b6c&Nnk>^@YUr@B7sDR;-a2eq+*4I*o zFr(;yoD76SLt&JzsB{@lB!pW_OWCm&8s~}OlzxRBxYJQsR!J<5k~TIhl+I~iVs~O_ zsJlwq{3<6Fzrs2xeVQyR1~*pY-X&DV<>IJb^~{bu?A<*6b$mfz z*o%ncqzzC4rkB_t>L26F6v`)}ze`bC1-{j~)NdL~`mLT~YWb6eskAoHl4^b`FPxT< znR1j;7p)m}+#`RhEmZ5Puvr-|P3=*CQ`z*pn%yLUgs!Ln?j6cn5QAPENA}8@3;qi$a ztS`!$5$bEi84^iK z%1oTx?#aTbyd}jz!i?IH(?xz$Jnea9El!X}OcqY-&{5>DgWO|u9+eRr#`;DKPbi^0 z#|4vwp=*%)R2LN}do^^P7h}I5OdcnNhEc-QcB^S=|ANu8I@#8z1x+#GHAo?lccGAQ zIF&nDIF+rQzZDKUC~dh7v0;>MIT%+^0->3vb|^SABm$IWauIEjajJ4C$z>~fqQWBA zJkTh{X(U+V?L0J=I6;!VphdpDjhB!r)`_lem{HStN zP9}f5Ts)N<85hgHQCq((p7LYsht`eyo5F2n#Z@IlRw-*L@|*R?PJ0E+C|i~CoI&#; zDoj2$BAXDNH-)|+n>Oq^8>rjx*>|}(rCr4!5=pWUwI9&F3E`}riu{Plbl76Y$)@y4 zos$W1jv}_lS>N%S$z#+xCjMW|ul#29Fu4F>Z)GeZzQggrgi1Lp%8DyV$Xg8gy^6=8 z!)RpyO;j(bDrNm8+9^a)*(p{Q4JdaEp(ypT0dfG6$Eo2;y-Xgbh5;*v1#|Km4n?WU zANfLIw4g$mi==)raqO^A1>^EKg!0M@T@i*)5*H$XCy9d`FG?s9K_`dGR~C)DC}PTx ziR93F3FV>wP`f4w#wY2Qil{;xG$u_*7#LH&$gS8I^>Fo;#q4GMvezR^&spF}V~HfgQItt9OsTK|`e zo0yLw$IIjk$4$&vR9awPb(wsZi=(xQBamf`Z6{mDARDWgn<8PF(C@GyYU13} z1rlbZs6ZZ%=zSeJ*X84Q2?j8B9>VzO@@XQabrbTFfGcLKLzi0e9A2hPg)1ZE9-%P{ zwsH~_)PeQkb68?iYi1#Y3)Tl|? zO6xh2*}5E^7@0=F4Wa7UrXq$cW)4EkSIii&J@2&R`a8svgvyGE3x%_>C@TtgC1(7h z1sUilbqu+q_z+c3eTkw`NaJCF3^gC%1k?bU0iA%YfPTPUz#+g1z$oAxKm(!0bU-G+ z0>}qA0X2YTKqp`;pdYXoa0qY$FbX&a(3B%TAQNB#B184?x0=5GB0eb<504D&WfO7y1HtKXhCcpy72au4v2G9)X z1Z)NL1NH(A0Zsr$0p|c3;PL5zOn?QD51<>>8bC9k6R;J~57-Mh1ULa01)KwDs*oR$ z39tb20Zu>-pc&8!*b3+e>;)VGoB)gh&H*&AYn~3s1Xuw104JaZ&sFW?a11Yi_!4xj00FQNa0_4=U=^Sa&^O03YBUz-GXY0FMLq0v@X4xC8k63&8II?*qmGNw;&H5s(QG0k;8)0c!wW zzy`p*fUSUDz;3_`fTMu70jB|<05o^NgEinPz;%FJKp|iSzzt{ybO5LwKg8c31D*!# z0~`kY4`38<7H|omzY}jd0?dG$00jUiKms%Zz6sa@*ar9s;5on{z%jrd0e=Nt0PxlD zl>qn(zyinvlmc!CtOK+I?gu;s=m!h{UIM%Yco%R6@F^fc!a4v5fQ5it0LuWY0CfQB z*Z;!*j=}$~f&X{bKr8lGC!h=PpMYI}{eUBY-~1o;&IeAX>rVK;`{ZUarmCtUs#c!J zU?PmkL}W5mVT_5`G3=Nq6J`FJVg7agFs!JEOhiRQWU6Yd%2cOny;jv)t7=u%s;XG4 zqN=K@Dpswv)>`X%zrSn=glO?_qq3;bM866^Y@-Vzk@l4xr&i| z>RC)rOn*!YCIgd$DZo@?=3|y(R%2Q)+cEnvM=@tGmoc|6aRt<~n7)|7m^93I%v4M{ zW-ewirU}!G*^1eNIgB}lxrn)ei7BLx#q`D`VTNHcF}avh%q+|z%nHmp%x26k%t6cv z%z4Z;OrVH57Sjte0F#OtjhTok!l-tr1(;=+HJFW<9hm)?W0@ks1XKP6a~1Qim}{7S!)(U9j-eTp7(CQ|qHZ-s zx5#5Y{WQf5#poDg+Yft3e7khQnho83_5NpO&j`C-$|~y}m6;#!X9(-^ds6pY8D)YW zbw9)H>7;Kd`4y9h8HUNiOvO}U=3|y&)?zkeMj7>n>_Rg;Z_Q?^T6UoteWBh4Q0E4F z)$(ggb%)Maqy99A9mGv{}t6+9x z4q;AWE?}->yzeHbK(Mn<_a@zS_g9>-;nrvp_-M9OmuxV3Sl=gPlqqB?K6gi8YTS!x zd(&-2MxUSWc}0;v36`M2!`V2+zBD%7qXiGUce0o2?(;*L1r{To^Zsx&-6RMnD~bp- z#-1u%6P6b$*|b?T9fdwr2vII+8zOpoM71#Z^!E75zwRvyZ+`Xm6pPW8tGaW2@j^$V zQMc&3C8`VWc~!C={qb z?FWjo)Iy)4L4DYK=8M{bPtXOW_OOv?;-z^^t$mm~)iuTz!+g)>UE*WPj{lvW zBflH=mij~;B_C2WqJ77w2~pL`Iljfa zfBI^fMN?u`t*T6;ShG?5IaL|q=w0~;)uKPG|L^)W0q<2uB+49JJ+AJRvk%oLZ!9`m z9NE)}Cl<-9S&^X=M zk8pU}s3~!@X}Cf1`DfmG2is0M-^~U=^Z8}Mc2~dd5sfYgPAjxSBHPw^J8n>Wj*kq|tWTX~i9pYok1%b^9IdwvFc7 zuy$mU!RTC5mC5w5D8_m|fvRdoTRAe+zYq1x?dv^{!uZNs?O(7dzs)Nh9rc=ljqVYX zL!(vJYuc9?ZRj82otoK*IVz{4B=4jMBE6dX#$9))$z@ z&9R~Hk2Gbf)~R(kOa}>#21eu4SXaeCL2=#eVyZT6nn_A0AGeZOSTmyI6sw+sgnWLL z*OjR*Gox&Sz~9~Ny(^l!n}3?(^h4UoZ_$#7l`^*UqNH6KUd6TBKjV{V zHY$iBT6nx~IX*ej_~I#2(H;7xMLcUIQ@=e|^$@yQqr=qN z4xXvr*YNuyHDOpqC|ciIw+-#ta%<$^IF!iKoWA(PfMBvSF5|_ywz%9m*COn-<8yR9 z=xQV7n+e5Ds)T9ll|-r@U#iPCx;C{QM0KdEh}+Qv zj0Pqh zpndTioJ2P^M1D>_|i{v-$3`Bi>8bL%q_i~A&+13dg{Z7PC zFo%IXqx4J_zM<*9##h~9QP20fmp?Dgvoy~BOxY^@dfA@85k18^{1efwWd?(^;CTm$ z;6BG48#2#)%BrHrh$0X8rZ8hp`fkRDBKnSv2ddJm591PMTuq0V^k-GI_p8|brHZqv zYxS;*F`RCkBofpwJ6CCzTS_C((aNRC%9jFt{;Hbr^K8{eZhAWU)z30OeD(B+aTWBM zOQ+`&8R46#M;~z0aTIM$0~VeBj;27pPeq`4i?I0ZMD9k8RqzzdX;s*|ZyND0tc?vX zG&Cxc=y$v4lbFK_$Z+oWPsEPC`@`&L9{=y@kJYz?eTWKU)RQ|!-xsG=_V4`@qdNUTghH{7z(`g?;36Wnh=&t;++ zWu>k%$_8n!2N(r*$=Y%=lv!i`iyqbymc^x8c1%g(XY+POBnPZ&YWX;s%peD$TiIg>)qSkt4d)IlV! zCNG;)6@2#n*<+yg!Xma>g@i=#a+}jV_4yK2##E+JZ4jZ*IXt58C^Oe@rgmrV3Zk^$ zC+Jy=M#53PIb+?e;uUSf^i+tvhBxX-n{dulZS&=xg7-x7vj#RIGmT4YJK3D{$mmsF zRaLOON=I)|%UD%C2Zt{>+GR7`lLWo%KQ%AGU-!8){KhrC8KY#m!}yx2>9ls{3!m1) zIa!JG7Dl>%C8n#xcS^*Q zXc=n1ELx&rjh1}sc)BXha_DTSktxYD zXjXpBpt_1`iZeqfseQ^FmG{!2Pf?#fpA_+)tDVG}{Mj5W;OgU~Vs+KEI?-c%*!9-T zxFGlFFnBLjeWnHF`Gqr?0ym$wn%`R=E#UcW$~Ad)P<^E-VG$k0`0p(AaP)$<_q?@> zNO&Sov}@)s=tk`?vYgeYvhR za2$Ehipr*!)iF^R^^myKQkrU`52EqOubronwj;WO5+!$a$E;yuFpa6hO8Rx?Z~*;` zX838B9M5$;?zrA%iP3X18XIt!gXihGk6+~dC} z&%U=%X?X9zQY8Ez>wrZ__q1ke{Wy!g3>JGCEcP;3>}9an%V4pW!D26i#a;%By$lw6 z87%fPSX#fkDea8rBs}Jv5=%}rZFA&#K8MU!*Llyijp3`@(b!y5Ttap*qxa4lET>0^ zAN1hHI>*hr9v08mSvNBk6)ZOMb*yD7$S>lk7}3u))FPu~yVwkfIEOFBNih{>jXp2a zQ|Y*_;ERvJ=VCtY99Gq7Bs6~&j~kygE@#3E(Y} zF_kke&O5Kvi8S}SPOxNnPPEyX?Od;c=iTSm-FvO=de_O=tHg|N$3M@`|1|AZ@oXKQ z-XHS3wf*+4m)<4*8}IT={W{^w_yG1smNWT6?@#li>G_aWk$NJ$t|**c={L2v@V zySq!P*DjVhtw_&*)42=su{!+7?jAwweiZ}rwRMlsHDsv9sU*$kEaNQZh^Y30Jjy#L znEKFp?u{Z1;98IAH39L?78z?a&1=6~k14NIjqtvKr$iN$x$lLaBk5?9T3IqT9UJ`Q z1PdQN3oDkZ|clWkqr!K#~wR>(k&x$9uepEcs zdoMxIT;Y$qNoS2N0ciJ`J0i#Yr*l{a-52ld0dH12sK>lAhQ!F7<~&c@tUVox$L_bS zCu2T*%n+Z>yE+4ZcancQ7Tcsj`*xzzp*<_D(xM$JZPKG1J8jaW9XtMXY3FeyZNd-9 zzX&n%@vn)N7!2olZ7H15<2W5ZtZhf0CQa|?pF2u?CqKh^A?!goos7TUR~p}#x?V^R zu`mrF#n)L7?46oU-`qJ7D?B=<6L312N~b7XJGrL=s3X>g2RR;wua5A1Z)D~-@{9U~ zZlw2rn{%hTY9q!U$4cvoOdR4)t-?p}AkLN;#DzYi57tlDn9{ZKZkxC{_jNr57S)*^ zev=<3g|*d51^M*jc*L4uXJJGib6iNDYFtim&iTo1eI8PH&9r{(&+%M4ok4wJq@Mh^ z|3;R$r~X^&3`@pfaxpV7b1_RWt1%lfJ23|_CovZ>&gr_0ShHk`u>@~^s6bDgFzXbY zd8BsE4f{B4?lo=tS6GsY8H35i%)rdWEWxbCY{cxu9K@W&45F?m97MmmWDt8v{N+Lm zj*jkxhhrE5(Q{L^PI3C(gD6LX`qWCFTKyNdu1>g-C|Br{AM8`0?M$E1seQ(#_L&gu zqr+0{Q}WhM>31&&_L&i;+Pa$hLUZP?*%48%H{-+^BnwXTABPhuw{)|02Bf&vU>t=z zVuy|lRY&w_o&Vd_d0s;Ys*HtjMV?LdmXk#Fbb%7j5d+I2vIaIO(xwEWfj)uh>nRVJIr|~mmxskZ3 zTwgG!>X;$o{PMzjM%cW=&e&v=FgE?EX}Sn=8V5t^3+~meGoI|Z)-jaoGBUO|2$@h| zz8oHt_QGvenXryZ5Ba;(dpRM>bRpMOK;?VyRluywsV!;F=} zHqpgm>+osT(DexIh0oLt3|+G;%A7;!4%M1>@owMi68WTY#`#S@gl`)SlW_{~6t}hk zbkZY(im%)isrHZXqLm-vq(_7l(W0tiXG2m&K8IG4Va-Y1VfnD%X8=QHCSg38aW6cK zuIDwGVF!2c3Q4<%8#(zrJO^M_LDuS2MOg`{tZ^(XrJw|#e)?&`5gkr50#3eXJVZ~X zG9Rc~mYg%rGzppg*H!oKsg`DShgT%@!kOFPB@y|x=Vvg%=Lh@KoVKFFc%R1v(F^dM z<{$3<4h^?1jMix*&3Sj9Jt(gX4y-i^bI&qy#~N$>(;a?Me5fp#L|*L|95yUEAW>zay?has*I3=g zs^{5mHZ*+-FN|ioDV*6N>D->5dd9WquD!T9GbPT^%@LbgPIS)U!^;P=L)i0t?w}Vq z?(jvnh-t;*rA^QkUYhA4naXK4d!i#@*TS8kRj0brDo(3RGkW6e;T)SkN7wk%Y}Hcc z)sl`?KFhJI)C6R5PQVUopXgZ)dMkgu?nKzjNUa+lk@2cwV#3EF5@T9WSC>C)_8qhe zC(EJCFqR2tb(NV3a@snLw{8`2dxFG)Jev@%cz}%}BQGFcx=C@4@{JG<8&~ewy>Hk6t^V-=wO(u=K;i?A8RWg4-%B5{xZPKekwK zB%~1`yL7d?7AGA>MQ*x<-t_1+4`{+V^}4#|G(T?=)Rnb)FL{I6M^iSPSz`9K8{Z=- z=seb*rdzg*)2{*bRYUDkqmX;vzC`CZLzPj)@91=PlgB;Y(0NgZk-T3w$2)hUWSv2Hv@ALA zLiW5Z+-#fIQSj!>Hpe<^9@i8a$R7WJH6>ERX6O&i<8DH<&Mzu7eXkRw*70FQCaJ5k zG%s)~o(}15n)lHGJuftVw@gaV31Hs~J6b1JbBL+-YiVUoJyS6e!F66?Nq0;TlYmLW zL}dB#cQ$gpr!kPz$nP@dHm1|tmh{3TVuoR|FjFy=nE9Axn2K2}^)xw*Az+igBI}=Z zx6(xBr?duVeM@j6-A>XD2c}vG&%Z|7dtz{Fixb?r`)GSlKKaq?4QXwy-S=`JdmDQ* zRx-YT*@!uaxrkw1inFOm12bX#^UP9s`>?_rsgnjb=muRrGWkUw<-0Dt5)x<6BtP|Z zs+RcF9z_Q}vVrr?PdX6;4QipN% zb*lToS@&z!7pDfFNHG)P9Y(MwiSf#^!eU0MD(SN`-9WmyL$c0RExzmZU|{n;lW^Yp zMPh@1%zfHfvt?dOAvdx$+@@q#Rk9I!d}gM@-7@<;S$?^$+u<*ixcqWQw>*Qpg}E&Bvrc5c$s%g^Jh${7_iQ!SdV z9Y*TL^-NY`=y=L#wvw73<8km`>lMUdBY)Im%!V4fBzOD$XW(lT!Zn)U~ILt*-P|`&wamD`~rjI1Ii&+YGm@{LAyIit zb6#*_Re4?hbTifwdH2V4%e~eu=ijB?z{E6L(hbuWGX#@?nTRRD%)&HcnlKSrYrZMf zl$hnDL?ok`tV5N+eiU!>mO1k~NwZEnyJGL`CmFy${NZ)|Xrss$x_zup$E{h%NH>Bz zycidzBau;4797WBmE>oFNlB^Z|6p=b@)O!0b;q3DQEF}Rbn(>m>awaQIWd0ZD7vEV zQdM^}9UIf@*^j|)6;29QtwsY&YWS&(jJ@GTMyjVL2ID&DV4SWR)!o~Skm=9aRW;>p zhjPPTJ)3vgET3m*OWh0q+`TdDqnO?7lKc6sw1re+Lg^So@}0JCs=or%`=+RrW4ji zKqef%=YAozeb!b`t&>Qj^`sZhC+{(wZkBAFh$bBFvo_%i-)|eXNLl;1uDsW}a{qVe zYhlh~u47_0QfFfNVuoNcFcUE)m{}N8UYN0IC&e{OJmW7gk#zCOi!TFep}`+*mRpya zw)xR3IF17?I3E&@C+{8(F9Uu^7{Yn(4)0I8qZCYYK`?!FSbH*{64oJbX8_AgZ?qOh zTUnU;1$7?L&JyUtY9nFf^28m&^(3p}nZ$2DT%JrmVwl3RxkGrgLqmY>UcW|Vmk*KE zoh#Y4GV;>P)XJuwy?Z#KvP(PR@MQBLVF=5l?fcF5i+*>gGB!fQ7!>U-rIo}8?^WpU z&o9o{H#VY%UY&7C`nB#zS?lqsuwPMm&*xV{VR+`Hm0vnGW%?OroKt5VRV9u4BDb0K z&+8Eg_CKK+r^s#Ri&%;@JvcAO^7QK9hzdptMfi;7li$&wXZjJ`4`%2bp#S^XAHGPf z;VO{O+J*sDb!du6IGhoiKKE`%h~cza)wf9?T@mS!s&$r0 z5-aVi*s4}uHnX^V4s+t=-mZ`0Vivp*pF&o`n1R!39u?~*knrRm{kgh)I%)N0+nRI; zzrWnxgjM_MB<}~uAQ#p%Bp&Lqt0BkhTcq~xRb$b@zYUIXNM6RV8*7g zl})>FoZEwp^oFy?HJm4Wdtqir+l?t3E|CAUMEq5<&4+1 zos;pUi!a}qIT`%RpFK0!FMjYBz7Xs^r8iqBbZj-Dwz}-GDZP6K|J-TI(VLJ(91?3KA`N z(S945MZ3vqWywTb3vxc~rBPU@G18^eImh}w@r6P_b4uVPgLQeleQ z9VJ8yRWV=OcYnXBZ;^eZb#^7IUr6nQD~EI~Yv4nPASbZQGdwL|?r7LqK%kQwraZNZ ztSVO03{PdFk9CQRSJw1(kEznJfee?L?=XKjymrWVEBhlO3E;fdpNb}T zMNJ|`(!%G5ulTm>hg*olb1nYul5XQgDw_Ybj8@F7tkMRmF!)STaEQO|^}W*dVl( zOoZ#U(E+M_lTZ9&tyuN4u1fbg`fQj!QFyJAGy8$f$igTiTgp!4tr{;~K3JoJ2d+ie z$4H&8^X@PDUtUjh-QkOlvSm}#IEs7Ox8`n8jaop(xXg=@!3CdAAv2WdXxT#PAAUx{ z750dlffWtTuq92HDo0V(qh5y&Q4~3SL6W4+@Qit@`zdipzYD|NOf!kBZj3^&dNT*= z%JeQ_i?}xv%nX?rkwp2U6V{sFjhxV36Ra*X3+q`8ugy$2wmO??5-HI?YD3OeQL#py zdO-W(R1OnL^O`M?D8($eh;m}uU6!HhdR!`DcP@9NS(4Do_b4CP(-7s4SC1S2W){y0t1k1c zrPjqoYZaPoE!yo|(w+z5i^(pUDIJRG@c7%+3ktU-nN(!ejj(f4Jwvz4*`k^Cu5K+`IRqkH*Kx_vzEO zuL-~V55W%qJuU-@Us8i4O_I)?JIBVcP_j5?e1F-=F zV#$37f@@AM313?ee5&)OyL?9FQd!+Fsj8kOycxx#razZIV&sHEv(`BHc+$W}`#q0` z_v3^5gL9QIzCIui#ENBEc7T8QLv0~C?&(C&MrD>c6N4Kc|FxAs02xO87rZYRaQ=(F z-~Lsewa32Oedq{jneIKhM2r{`vpSxLf;OxguWBn82WB#Q|PZkn?wIAv?cV{p{=3sg|>yh zAKD)Jo6wHX--dRE{w}mD^n=ju&<{g zR!>t3nA+ri&Qp4Tx}}4}$tR?ve3EmOK1F@~Y3U-Lp}u}ly2(S*T|O&4Sk4b-dTn11tCdwd5k|!ito|M7zlnjxlB}Ja$oF=Mj`GO3S zXJxqLO94InA}N*U@-5jQ-N$FTddwsFE2qpdX!a@oZqt@xOqWn4f zSb>dNCAKP^U)ZfNw{W0Oa8qBSKgOWiGNZVFozgWjqPhlhj~9)pFP9PZ(^+|0Ev(dF z_G6Z$7Z<91)>_O_H#O!54hu`wX<51FxL94!QRnDdS05O`Ehw&0f6&xaqkcIz@X+}& zVyuiG>+RHJeAl;AGtwJzZ%Uu%y?vb39KtzgGTHmZ%B(Nx;hrz#jFis~9cm?7_a|C0 zRM(aa7&|zTrK|(SK9Q98RALg>PbRW5lIth*K4(kvUw6v$re)v1zk-fJRL=%4)X%cY z5_vu=Ln@J07UwD_Qfi&Q_~8yGJ6!xD!$rUN+6Y;2=IJ><8Zq*r%KN|n{T**-{M&y# z`-l6+rHoDflcfI`J$qs9&>z-*SWyusjNHe%DK;6_#k&m+;pkJ zPM!6vI^*OWRxqMwdc96NIXV@+4H)KxDjg=_tIg?^NgCtbI=0K#uQP8^r8!BL#WI5B z2C2AKmsdK9;dR=eswSU&Ifu1K`QF)Np8j^7@MB1b?fgbJfJAnM@q$X`49yF@P?`fJ zc%Z9s8MOX#J&S3IC=lk_%%8b$EvT=haA+`{odO7hnQA`13v1A@!cetwp}Uz|$%IRG zkNKqiyv`9sgzx#|=^B$9_NuV8&n?xL61bjqzA7oHlYpg*3tFIuB+$KKRumc#@gcInFv3>XrNhEZ2V~*7L9hT zq}5c-9|? z5X_%dRaQjOm?SVey2DwD%%WBhYd9~2k0#S1;M4jj>1MH%Du2)?W_mdy(sFiam$T*r zB`E&wb9{O53RPmk%109gRP5>)T-_XE`aHR+PWKw>E)_FUBO_6aq6!{8H6Q+%W$HVE zjwXDaWh_M@h@Pe<&Vwg|rTM7wja(v~;yTIHUGnXDHy(XBRp>@@2HV-frJ2nPY2XK; z9y#H8#x%XH?-2oc!EoQ^WkQBq2|KyMyP-uwk7e_f%~7r$qZ>%yk zxG6M|Bvc(OC>t|_-Nj~nk!r&`4Zz6&MOvLYxe0}5sBd8ghuJ=D5S*dI^0ETzU^)Zl zu?}bEGm9B+HKHvgVjEdFYSMUlexjE4uyq;XNJ4#K6jW;y4WbrsQxQhJQZ@4uHcdm+ zNpMC;s}Q+WEBzEN4^tDC8AS<3NvS#2MCVwvv6@YtLQBKcBhxE2xM;WG;|*r2fW2`P zM?DmeG@D?ust)K^ds!k}bF;9urdB4X4jnRKxINYsK^1_bX^xB^IWNQ$ez*l1>((~m zN-ms<91TL6;wB%so`oNqauluyqi)yMSL>ox4Z9OE)@46$Ek(HO8EWa(AuJiw<&LOY4Vv#JT0Bf<D|(P8l`B??$$_UnxiLv8O@Cpce9<&! z%;1;nnLnlS(B%uH3jX4%j6D%%4Tms&NGBqpbN`F5f%P=jNm6)}d-IzK|17<#E zFXja13MOWIKzd<@V04sI|Asn{lHCEx#!STIVy0pWF!~q2C!k}RGW3T5b9RBb$v=k< z@m|c}pD|jB+4oc4g%R#;gHvEU=6?Nu@x`y>h4BIU3lj)C*mO7c|XkA-|mOQKL_~rdXSEE!mMrtsK#in+{tW zC*cR4I*qUwrZJjboIf)h0IGPbdzvw7ys5GT)FnGDIYBTDzJ8~9e<}x5KN~sdeU(ER zM&&ROqjFFsW-5ny7?s0XjLsMAz;wX8hhfTykqw3}^f#V%gae`aodG`$C&5mz66)FD zuR)!Aco$}mADJ5TJ{Zjf^$uFoI6Z`JTe#28SC?9Jo)xj1jb{`)T`OrGL>5k&j!vt4 z?uJIks&?R`#=8t4+gpZ1yM6%CI=l4 zamMCMRZ-W*p__H6IFW%HPw%_Mm4RE8xSzwm(0Ee}rkXUt@a|9vntq@AdYWFkGc-(W zz;JZsg~Mf{qwRpFbdhSwc$MMkvT8R|r3Q8GU;jh@9eel()s_nX%fLeR+PmWe36&_o zC!>uYH{tn7nUklD9G9IvYGjTK9H?$}LfZ6K^Hkjib$>pGmrSp(s@G}fsOJL*stuiT zRSD@Q_H4TS;e4XjqwM!7yhr=^?)H5MMYP8nPHpAG=T3WpHi6Q04R?5M0^vO8U<>mx z>pC4cFxbcJZ&SBr?uUGP&)j?M1uf`#QdnMD$EgL=oLO{a>U^9y!w*QNp{QmWUn+EN z+ka-(`?P%|)26W!b6Uk5w-dzP9MfxSd*AusPtbLntU+;4m!d~u7AKpLAX5dk@z1zp z4T#fS@UkBL^co$@5dA{Pr~aK*&R5WMMmqZF7lYY_sJFR{Gx`~gvKVTGs`6Qh`c};g z9Q`8Zz7vc={>S?9?o^&4?qGnhZF24^YjY2GvrFgjT>S~ZMq}e^WK7xSC9J2we(e*UceTmR zFLkSFnqO0+x*J+2w-axz4G5WE2JS6&&ImX2zf|@YXaE{u3k~B+xJ4TRxQP4fsQeqc zYYXB0As$)ayPn1MVy>yq&7YnlyWIDDI@fD_*F{`6`>s)0CYyZMWnAy#+VfA_p?$t< zKH%km&%O~n_xykA)-!sN2iosQZSth^J?>>nS_012^E>?b_s0_WSOWh~O29i~?f=QZ ze;nwKCGfEX?nwe(`|g!{rGD4n=`Zh>_lcVDpZ0Owzpjt?F1(xVaCxj_Z>7t2tbBay z9wZQz9{1qxUaiJ|#PnVKD_{P&*Oz>3zl{WjBTug%-{#>x-q5_FWju(xM=-rHSCRwL z@kz!Uq5cj3JY$4I15ygdWA_Te z|F-^Cqd6-5=l6w;{0;I{v(qunKe$ic#rXgH{+!wokm1ZL*qC@sGuPvx-;TQVUu&5? z^OTdS`dgptII;d&V$FNBV<*-sI_uE8{>qX9n%J~XJ<~gWD*nw5@5a9Iz|xqn-v652 zc;BmmMe48G9gb=E4d-UzEq0^rOmtmhrzfTyvx~h7s+T6cll_{N)A3Us-@NZ#4Us-y ziWzXuV%?tl70Y`&ziGdF-)n(JOX9h=3Dfy^oa4n{cv`3KJP*DZ`|bm8#4L@3O2c#v zv+n~-ZZU3hx9|tCrvlpZFPsO)&$LdR@w5AzG4DqE7muChtLXW1&QdENiS4ED=;*j-VrSQV0Xb^?>l%qO_KXzV_ts%=_{{)oN86XV zhHVvgPGIN!UF___&Yu6Ievb}+sTY2nGLJI4KxA|YNtepyFk8y|k`w#G6gU))fmv`0 z%!6dl@*21RE`lpy6KsYpa68-y55Pn4BqVE;UxHWQZDwo&wp1{+QqdLmhJE2+m}1KU zmH{qE<~oDxF)$ZSg}k?d_rA@0-sU|O3%PEDh^b;V+z2;`+l{xA^^gK01uPJ|_J2Am7$!)0&!5**| zOoYiW4Q9ZJFc;2%m2f^>2v@)+xB+g2JK=747#@XZ;dyu+-n2ze>Z|Dld%@l?84iIN za16|aQ(+~nfeT?HY=W!dMz|U7hI`>rcpRRG7vW8K+m_l+>2MT z3t$bL1smZKxEij7o8eZt7w(70;YnK>u-AaS2JAJcy^Gwx3~!^&I$%p(7uXH){5t9qxn&;bHtq#GhoC1~cG9 zmpH^R+uH{1)4!sGBfya;c?+oV?~(yI&X4g10&Fcpr0S+EAqf>U7u+zhwE zy>LG~4o||1@G`tDGACfmoG!2%OohW>U)UcOz!I1Rv*9c_7cPOz;99sIZiU<7et57W zEiu1O^7}Nr46oWUHy|=M26lrzV1Jkhhru+M4JX19I0Mdw^KJR_vm$?fp6g{?uYl{} z2DlyWga_eacp9FCSK)Qs#o#Uu_JF-$B20#9Fau76xo`%og!AD-xB@o84R9me33tQ8 z@F=_vZ`v|1j#>OpuovuY%U6icSBTF%I8T`Y$G}`T6;{F;xDYnNCb$}Igqz`RxECIU z$KiQ+5#EHiZF#Aa$V**dZ`cf+7;X!y3o`#p>;Z?tG?)!1!V)+G&V}>gGPnY+ha2E_xDy_Phv8{>7G8zdX_I4UljC3y*bAn? z3^)%+40pr5@F+YE&%=xGCcJIS!cHO!yTIPCFB}3>;TV_&r@{hQ z182cTxCE|-YvE?N74C)mDU$&^u>6z+mY;zK;2}E@H&g;~!|lLliX`xv8L$To+JTg_ z5=c1@m%`E7%l#f)_u#t6e7MLC^evD;U)=XS22a_6exoJOFB49M zC3Ya~pajy6*n#vZ5=bww1370TkaN)vOui|B+*mu1n+CJs4tUTGOc^hMDO2shmsU#P zOKa@FRGv>AZ3ptYOCYZ=90MoWf&9}F$iHL9>;QcXn;AFf6PA1!dUoMisFIU)s-`$qLdBS-fIi0_32Y$at0>3|I z2mXM(E+Vgs^WhRZ@B#1rfcJi|8SX+JgONun>4Y3UI}tX(1*B6i(y2F`0qaO7!qXRf zeTh%sTXtY%UkQvv4kH)B#jph;uXN;*jy%#&Lh?-x_H%BMPMt}oZm<9%pWG7=IZUZ0 z-SGcQ8%ehyFO}cRZ<^H4#_g}sYN%zKmq{ji$<2>nck@T2EdQ2fbwvrw@NDtC;7xxb@ zAU(*hM`B2aIM@K^kscRG59Itl`Qm-@)yY)SV>s!tn)FylI*>l+6G#Uk9c)Ot{Qey2 z(1Ud71=qs$qyz8$fcJiI7#_6)Z%viJTLq*8@$Nx)Aq;66L>HsO1l@I4)r zz|-+?5hNXlT#~?$D-gL2L2hqum%y8(XU;j&k^7TxlWsQYHwF^#T>Q&DOga*eDWvO{ zR*{a)q~jFQF^_b_|2*WLk391)kdDM-CUPrBZsoWy-vM`%e%RwXDZqD5pkh1e*ok!P zNji2R9mzM1n@BIh@y;>Q>kR2Nob<{fz1ERl8%VE%q}K`3tCaMbMfw~ieX#dF_TJAR zeG*6?!tu++q|Y+aCzkZ-0WU!0`TGN;5Bce0fOP2$8zFN10QVp8o)3`22gt2QN799I z_SqW{IlRza0xtxS!+hk>2uZixTgZd_I0gGt6Ocm^a;QTN^X)(Z*9BaccO~A$uY4g~ z0?AM1$Nk04~@%ts|aGv*{ z=l#DgKprz7@w_0&136qA4Y79-dmj+r4~XwSlTZG6za2;;Txo=BB;grJc;4JczBxen zaNl^#4iv{rpg4j2S3~}5umgY0kiZ`^2_NzM0qOl4()~A^?ZDYd5;!}Ba1JG$={!Hi z^HV%O#B<8W*||KY4Q5*>!yB+K><`)DCxg)dK$~XKrdhW|0s(}i%~)r+3a){;3*at5 z8yldF4V;9hZMpA|$bCn!e4i~g?WRq;Y11Ctw8!>!Nc(;NQWoPZhqS-<)BeUVh7iLT zLJUh+VjAEgxEQX4t6($aTRvtR+yVE&1MnC;0nfn;@EW{f%L6tmJY!*3*d4~h1fCc1 zyp(IkC?3dzD_|2m2oJ-H@G?pdf~*XUhwI@6cm|%cr2}IT9T2N+ItvcqxBDfLKkNIQ*D^mwR?thZ|pClZgBpjVci%z6P=Pr!&b+hGD$mvta z=~HLnd0SF)L{cVkeVOa4wprEsX&a`o!ZiafgDc=^c-EFKq+=J-vCA&F2VR0#Z21iR zpwAS*a##%+X8X)Mcn#jLrR!FauG?*Su(!yAeIfonh`$eRgF9^Lc3!00MOz*sz7G-K z?%3;&z3!u7rY$`diu7o-<#TZ&pX&s3;Z(@|&*}XZxCtJHN8uHC&6b|sMSAvx$gd~z z>sboRA?e+d^#0r!>}A=~D@~+V1|&Uuk)FNwz&y)Sa7uPF2tr62F@$9ww`t^~rBFb^((#4CY#Jw`ry zjC|Ce^y^RhJ)R@-_#}wE$FcYLI@k=iz-^HDK2CfezX&helGsxuF$go@7+VGfLXJ;66xr1{0pAu=f=9o+2Di5ss&h z!;`iQi4hqR2M5CxxB@mo?5+ctOJ!?5fuxE=1afp`NB0@h9S>k$a7dG91mOICU_E_w&mGWW>$v5Mz{nL{$~mQv)AEG zTZShy@{GKOuZJ6K8F7jo1!uU<<$5YS22Vij56Aw9Y@Sbq_%{OoMr?)KZAt6Q$aPnU ze`)xaM*P!=e;WBLjeM3yeA0+d+6j2dmXTSks?CPvlab_;QHw=JEro<*6yX>}I7ShU zj3KPnPlXw944elSz$UmF?t=&5S$N)-=Q^@$qBF$ZbGUnsa6Csio+E!eNB($jGu#S~ z!sGA;yv3M!C&t9Pz~L|*E{7{^c|KO;`Hr@XL5^dP|q2E`p2UO1KI(!xp#=?tuH?0eB3afal-^ zcn#jL<Nqra2wnK_rU}3 z7(4;b!3*#jykSeW&5G_=*cEn%@h|}nhAA)|j)pmK5-ftHunsoBMQ|}(30J{p*aEk~ z9dI8!0FS{F@Ep7VufZF(Ot8_45DUA)?l2xEz`-yDro+)N2Tp=TuoTw82Dk_=hAZJJ z*bH0XHn;=sg9qR-cmke-7vME`!D@P;if*l4+kg<;5$0vrreU^*NP zbKoRc1WREZY=Dd4Vz?5ng3Yi6Zi74EK6n5ggD2oQcmZC6H*EQ$E%L=!*cEn%@h|}n zhAA)|j)pmK5-ftHunsoBMQ|}(30J{p*aEk~9dI8!0FS{F@Ep7VufZF(OtP8vjfGud zcNh;7;9!^n)8S~C1F<}*2$sS+*Z>#7#c(BD1)E_Dq+Ob{9qxhqAocI0qmXuG679;Q zi|{hM0dLtdIYwl19PA3aL+bCz)Zden;9ximra|iI$>SmI<7C>$$)&IyQg2VD-kwZ& zCKH~?D_|2`2bQ}H1GC^HI0cr#8L$pEz=g08E{7}OTDTr=f?MEDxEmgThv0E|5}tz>;8l3t zmZ>5#)rOs57uXX9VSktiQ{YgT0mr}`I0+WO5?BrE;C#3cE``hCYPc4*z)f&F+zI!= z1Mnz34$r`I@G`s#Z|QDUTc*XqPOv-d3H!qSa4<}PX)pthhdGdlOe=upuo}*V^WkE+ z6gI)tuo!Av+F z=EAA46qdtTa4uW~7sC~>39f_9a5LNrcfmdIAUq6Dz*F!%ya=zs8@A*JMDk-`XV?|? zg1zAYm;_VdFgO}!!ig{!7Qs?j182bna1mSvSHLxJ9oz^v!yRxJ+z$`JWAFq#3(vzV z@EW`=QV_7Epd;)Id%#{W0S z0r$fF@CZBxPs6kD61)O$!rQhK#-jbbBkTryz<8Jdli?6J9Hzr8m<^}EJU9bZ!Ui}G zHo_%vC0qs9!wql?+y-~Uz3>n`0#Cxz@B+L9ufv<<%R3LFYE;24+#C&2<(0;^#ioDUbmrEoc14cEdJxCw5DJK;Wf03LidCGq&tqBeHj$Ek7C{@}neM_N^D$x52g^-6Gbbq;Co7Tmq*L6Pca{ ziN|!}QHuOZkzZ+N*cFnVrKD$R5*!SN!*obEOLJfzEP~ar4laO;;BvSUu7k~R3*5$g zuJE2~T$6sKq#tUZq^t%a-!kMogZR!MzB7@_Oyn{Xxy(c^GsnXmh+JkOmzmg`iM{d| z)?CGL-OP0h+zPkDJ#Zg9439$OG84JXya+GD8}Jrf30K+j3i;UY-vmoX&eBNdn0mhBs`6T=XK)oI`McNe_zMn z*U!U?wtTgh$X9#A4RE6^O9|If!nKtAwUqp|jO%4wzqw!J&4acqpCPim(w4XSi@cQx zdHxp9S1c1*u>x*_TOj3N1?Avvevz60Lk|)>lB3paFg|N|<@5PFI zuOrNZMG(1u54mo`-Zt!QBb~O9PT%MG_j&#|D_MNI3Lb|iZTZ`P$lu1mNpK3h&BEM( zEjvlCout>_A-7$~?FSK zzl-~$xu3~>^3y)@(}nF!YwWbG2d|0s;0@b)sFzp|^@i)=2HYLO-4WdJz8~?veWdR` z()UMexn6I}kGqQexI6cW|32dXW8(Q^;<=xA?kAoqLBewgdxx-h@D$f)Z24)7$WP$^Pug;d^!OF&ak`7h>29|Cn(+LZ@SHs$a`upIbzCS`$3|NY zPZT+v3-`l=@EAN{%g>3&&xyy+o8W3lzWzD+`Uvkk!uyVp9!E%z_sEa$^@WXa3HIW# zmjD;TrSKBGg8gjlPlTlJ5z_ZP(&0VQ;k^bp&z7T|(dOM1j)yrA|Bm9{(Hrmt3yf;^TXkFCgKJMuUwa_Y1#zq*WE zt|AxY^K0bu>vT98xlBSXQy}@|EcxWO%SC>>5*~%eZ8=9g&k@gagy$UL`Q0v&-|eyG z_wz-5zYwm5Yi;>pnaBq#Y`K)i)LRDk$tS-jpM0>2`)jzL$^G%%C%t}8dVR2-`y04V zI$RyMPLE9Ao~Mp}``d6gUgcwJmFfSXL9f32)n0 z-~f8+$uD-CSav7dx<5&*`v=35@HF+>GU~Mza34HiTMtkkAD}$O4xpY(f~jyA91nAB ztHTwsI$X1@xNTy^?I0hPkPm0T9dMUzeX?AvPgcW3m~300Ixg0yPTJO|GsXJ!c-!h+ zAXeuRu6Zx>SXSqiT(5%E2c4-89=t%kaEbb$3-v)a*aTPGR<{_jy2WwLdmrMx4-t=t zh{tD%?`Mf`kN#ryNVKib5#G-c-X2r9&V$q|J?IzoxCF1*R?m52^;}?Ey_Sg8Yng35 zvO%mzHriJ2j$-xh3{&7x+v+<}tiHK$6KmSK)Qr>R%&P|5>*6_)W1MzYT+s_T_Qp@;GvNycxFG)&Sl! zfcFeI1dl-EGXVJ{ri+z08cu>!U^%RYbK!i5{Y2~!A{_^jj)UgIh43&u3Qxnc@DjXY zTS>?{2{|Vb?tM5OJ+n=$XLi_D zYJ*s*^K9$$`15)Ep?a`}+7P)jZ(@C6v{+xrep z8E&<$5v5{{D7USV$ay4k9(fL4u&wmLVx_0Rd2oSkjY1xykjE(AKZ^H{!rxK&n?bxY zh?3pAB+Et!&{8QTYrXJ{|vcO@)svG5&8c{%NaOM!soHUq$|G3M>-3#ZC z>jmUE2{}%IA@Q9`d<#>>Dja58jIUUXuUONv zU^YZP(~!@!tMIyQA`0C^Q4 zuL9&$fSd|&SAe@hXTiCUd{IWen1P&UAmS}L*a0k3CF`JFb|f)YB&!rfJ@3+{o3;1PHVo`F4K(6%a%h*f#a zwq7TFUMGDj$#<3HyQ&1SSc_?~*3V+CpH(#mWa+a zt|vd&Pl0*3qnxnUz?!ufE`>YcZpeFQ@!r|UX*P0d7%Eo7aQq`5%_Ser#{F#E&nXvc zPPJ{#!{2%MJDYIKCLFUVkFzO{v#-G$xWoQjwU7UE@PFQ6>>uTt@-T<;!1{Y@ZX)-| zck{@1uN)Wam6KePFXxdj=iL_TrGRa{M0t9N^7Inv@Dl0p5^{eDxz8UU*8C)hT<0U# z`P<+Qh`X=g?khuJs%emO%dPO8)K6^?a@u z!qspsJO?k>)?(}}R(qw`D~H?RPVxo*EWw{8q|Xx4=d0x3uabYiS^!JnEI1buuCEfV zuik{WZEGp%wUqQ)x&k)A^>72+0=L=L8*yU2(Ft~kJt6kr!2TOqFdMFc>uhUTK&)jk zTyNxhGuOy{8FGJv@V!C!mLacY$ZJKaSSyA>?61K7ie}gX&%kq#{JMht`Zn=-oA|ul z8Fq!Ze;fC26R)?4*W1HkIvfvkU>+=j)vyjOfQ#UAxDtPl;O{ZpT1oy|N&Z?%eqTv` zU%3=6hnwIQcnBVWm*5qMJXa#mcSei#PA1$7_e1i*JLH2V;?YDrn#hk$Y9r0Rs1RjHD;5m2&UbC%l zidf&YVQ1JC24OtU^LSpw^(n5;*w%XPujl^ya##&F!7Y&Tv!3$vF4ymJ{Vwr*mw3KQ zJl`dr&BU{rcs6&3Jz)YI08`*lNc@|LfAb_b1(w2c*Z}9j#c(NH1=ry33H&`}Ti+s` zzC}8H>mWP~Z;7=*Y-__3xXiY;bQNn$cdn@yHc&5YI1A51!n=X+e!G)c-|hl4;22m0 zOW^{z2vV-UO}YN|QFt6)hF5Ki&r_?#hCN^}NWIcRz0y(*>mcr0aMyx7T98M}es~bx z7VA3!+xiaq>N`QW6fTDc;2}u7zC*mea{*q0H{dPX+88U=#*VN%>{<6#b543|Rk;djZ0-`x%O z!v9^-9mjQb-Ff~$_i}59A%ujN<-B+;v>A$m0p3$X~7;|ko3dy}Z$JZU#i zUe5{9>$%GH_f`FUU4LKK-&YqoUV__kXA-qt3{l&qBzn#Kc+LEHjX$sP=QZ=;HS^)M zUhLCuhITV?F3v-7X&0CFgV=&c@F?D3C$Ojf>*~MWh)t+Juj|hdejVZ05&j(E&yhAf zf}=Q=L~qOt(HpaHF)l^t-*Em7^RUA_?8wDD6qgQh=_tWcT!xj{ft^Y8W)h+|Q*k=p zkNka;zi*23o8tWDG3-yGqx?L|&!Y=*F`EBJ&Htn4@j?>)TUm(ytsGC`nI!6Dx0BsY z^*hz??8NRQdMggmTjOvJ&PDd*Wuv!huolJhE%AIy9IPpix-vu5m4!=jIksYZ68)Ip zKjwFr`PyZ^b{Y3B-7f9^Sbu-4zdx?WU3eT%;s6ff z2#(^75Os$n>Q2LS%))HU!+b2lVl2aQT!PE63fJI9+^n5W?R6*7PxR*}`tuX_#ZTN9 zKRJMh@Fbp2q8@SS5tp9LSc8}FauU5gJ4A2KLF4zf@q632ylq_G9>$R*>NOvF&4=Da zxC9U3VLXl}ljyy{5WP2)L?Z(s8W~KYkNZOO@$n@3{n`-yeti<1=kIy`zB@HU?@mkN zag8A!*ObKR2SS{FD2W&3gm{6y0Si{5y*~@=1z2D&z+ZKT_^)~$Z+2Xh#E+j3@#7b8 z8104m>+BH!bqS%!QX@s|4k~|Yx6f#aS2u?@rsNPugFZ|ztzs)YUc@i zWuCCd;|Y69o@h6dKChpKg|B& z8zKHt5HI$s*?WCuh+nU=2V|K&Aja>lZakL6U2{X+H7|+H``EmXf6mU&JCgXF<`BPg zFo{pwn{s+99>e}5ezz>d@0KU=dn-cx-l`Ch-+^ zuQsuB^6q#rXVZ12&?#{pZCb9!)|#YQBt`SEJ%EYOl=b(Ioz8 zLWn=o|Bni=P&?zalaBY}4A(cgzFB?aJ*s@vo|@4f^^Ma<#_7sT^=2jUHwr`ijUqH3 zzA+c8aJ@ZOH$%KMEs1MRgt$f=m&T5@Q*+9(@m$K@QhSza#JR@2uN)0=E~Heq(wP_wNpIzj(bBCDQ{_qN3#;Zv@k{aR>{k(cU#8)q&`SYhlxp5c~kCDUJj^gu2<$p8} z|H$wEY!mMz;ygv1r{YOGE#C9Rdx3bDig%fE{*BfszpDI(V;mKSkIa*g^z%xsdfSuu zWBvQsyuLEvc+jzN{8+p{HeMeazcKS|Y%>4MldI;*)oc6=NyxfnU&rMn+_gW1yAEJ0 zwqqCepzj)Y`L1!7?>l$-zH`?w>fBvd@p=-bBq2;m#fdlxeIJ>UWB-irDe01{>AriU zZ@@En&c2vc_QkAD!rYn==GNj-?6UrQruE;mumxLDdFdzR?3c1%I)H;Xieq>kZzkcZ zg&};kC<*hF&r|-G>mGC6V>hkyj;;63!CWlEa_iiOtaBeuLdoh7O4hQk-lOVGUl+pk zYWpq*?YkJVe~yNPX8Eo# z8|UIY-xF5&p0Eo2JNLO7-^EY*E`HkgwkqG-*5C%*`uD3(`Zpc#$2GVPx8qL!P2t~E{+;08DgNpA?OT0^m3aC2X1s>J)AjpK*6%yn zFE045dQtf{<=gQxUU7bc^AnwS{0qm=ZPLFjNqBx~2+uFawYWYByK_U>orfh@nuI<2 zyGMWb0gQdJ<6X)`BUopQrDM>OPRQQ&A5Lp*Sd}o>pDi0 zaAa->N9O6DdHAby^6Q?L$~-TXUB{d9>rL|O&GPF<<=4C9yFGt>-SgMiui|xiX3sZ| zd%m$gHL^Z6`fKs{YxCf*J#YQB=dHzs^2|j^R9PzzTjx1!yyvh9SdJCA9}l4Rx~}tc z1wZ}c{&$nDN14LUz|RET2T!;UR%KX+;`{9?Z@hlFw ze{C=CkAH9Y24=JPzh_E4JfN>@uGn?{U1xcm~7eX(#SR{dh?~UK0P8#J`FCCia_-;L#+!%!+hY8L6Yvx~bH})ps6?R@>=N0{YML%C@ z#3mfZ5$k*ktn(?v{pjDj1LAW)d=8A@XcE33hwy#BpWjczbX<8@g&G&1bK{bNWDYq9U8-HN%%ok2tQbZgE*9gma-69%CQ4Glkmg*5Pn#I zyRZTE?}z$#xHyEvC0L7fiT`J92tP`2C03zv_>pmF6}MJ#Yi+e2XjjNqvCP;;$|nup5YRQ{&&HP z(3OtWxDj{bUi3TD<#(p55059|$J+m~_J3T3Yw$RpOhR|Mby^v?3RmMvJe`D}WQ6dO zOx%c@@glnKd-&1AkDeN=#qGEg-ETeax3^vQw(H)Wf>W^;>rg-5){ovLA@nZ8ZMYr9 zr&oM>Z(5%fTc_pxPo4ki01jHOW!#P#w`0cjm~lO3T#p&opOsm!RgUhTpB=z4yk@;t zvGrOd$ge(r^(pUD{`0Ax1E!(4{#;!97keI9>Uluiej#or^y`Fvo!E-o{QErW-{&#B zjyFAr7_U>t>(~7KHGh9Sj3d@7iQ{Q;{0%>U!_VIg;*fPq1=cMUBKv39|1E!i%ipt! z^-HO!KWFvlthk*Ow|{5v-`P7?Vm(u-^-P)8Gi6~FuCcC3zXtScfc=36>zfu?-?Rh| zVvBW7>d7mF^L`)C`+a=(e(RlPcwRj1d6Cfz+Pk2=3&!Ju@pwNig!j|294pXu@4IeD z`H=FVby$rZ*l8V9p>^-TG=8EbF|hm-KfvJn1Qj_ufygv;61JLRDEE^F`d z2##9+lxzJ{9#-N?9L5prp-QcXD#JRgPr^rOA$*jM`u&l9f7F1Ds6SWq=Sm5d;z4Xl z!pHjevHpErgSF_s`q+IXuM^~T!dPwyV|iGGYmlE~{2Vi$W5)A(uk}}bcmhvZf0beV zRVGeB_s9Qh!B!kb`K3@AqELo)SZ{q+s`XiExDKmPUMZ4Sic755Dn-wEvFE%L^-|PJ zk(Wx5mr7~Hb{xS`>$>Ep68Wjbb7tZ>^HcJ6pOUxxl>FAG(gAHR*WUsj0Zi}vv)gtxAXsY{@>n4qNx;eQ~n)#mU|$Cwrfqd=>|+lbdFp+;n8;&)E61 zcI>b|F2nk`OcW1)mm$hhp7lxjHN25TcNxdKjN@I6*o0l!gZ#LQA5+#_SGOUF?miu& zyU!+3_S6t%Ps7*&P(+WlOn_uedAht+7jKWDtB=UQKvhYN5aF2QBkft}XZrCDE>j^2m=Vm_|MwYUYh zVjb4wIXsWz_!r`sr`e1U&J@>~ z-RM4h(C^BFepepM!fafGOK>yRU>(-uFpeZqVP1&*{e-Acd7<(`b_&^fDBrri0@VIP z+J9&auUY3;Xq{gX8mC#tY1R$v{epFW;`p#QKFp7Y`B7AC-CqgTU@cz6OG)%dL5LnH zME*R&pGO99D2Zm5g=ls;wqu8Nf$Dupy)S9!OWOHT6E<5Pm}-4s8uGW8zr_vMh}ZCj zb%Pbw4KBj7IFLkh#9@v&%;Dc0{>>S{LF);#ttZUEN?eKZ8-FRkQIcU@VJ1$&skjoW zkY6SIDq*LDov$pn&Ts`D#1?GBBY4BQ!(jcPIL;NvN7F;}Xa<@GkD3RMviB%^rTS5- zAEhN&inUmW!#I*eUo|dYH7;M(&#&s|SK0k4yYm`DG_MK8ZJxM2mKCDMvT+$!qVtbA z|CsZSIWO-O$$Ld*&X+kqzeQf7)p{}W+dizweyPZQsi=~@O7<#Cu?z=r&~@uwx50J$ zU3Wkp#Ju>rd9grz7KqP*jUhU)8TaBo?8QFciTQny-#^F=(GT)`PtEi_H7kjJXk342 zT)R7bFY3e|Jcd{BD&FvYDELma8Eeq*^iTXw_h`3AyFJFK$2h&cJw$KsOrqYcA?n?h z#A$0noVG5BKP?aZ>0?R!8Tr=FwE4axKRZsI_LjvVzGZ0=r^-L4j#vMH`iGKu(uNRE z+LXk9Ca?Tw^0;@O3Gv}SLAWOB9D7ZCi_`fgSGs~=SM*j-?lNtw`u=2 z`Q_W>mv7Gv@$Gp@e8v-0Z5YJl1?`(eO@Z0y2M|>yv zav#5s^Sheg8~HJdA9K)mk~@4Sx%Fs>Z|zFr3G90=h$lFn;P{Rf=jG?q7x<30Fo`Gj zhj`+NB+l3t;*9P5;oleeS0HW$;xH`YwwO)cIvd-rQIIwUe)e(?V6wWT-Kg>{paR&fpID5 z(vIu>dk{Y~U;h`FA2ZF5*|-#!<2?MNd@YL8e;Ww#f4h*xi?Tz!$h=s@&qb4yaLbGk zZkZ{cx>7#1DhczwH_i9nWPNC`J~Y&Le*Y);ZGro=z-M|Qz1?@G?Y=u1k8f6m_?za*H{6fka6f)G*Y}}3+=b?K-4x%2 z^r!AHng`F6`yM2o&*<+n`um3SZ%j?%e(m+|OyYM6L;Oxr5|2*voyE9+)D_~7dXo5K z-n-KG-YVaB^L*dU$8}hp#DCu(;=ezU#H-hYcs2i48?V*I z>swnw{H?7?{13w+{)dqyZZ&^e&7Wn)X_@g@W_*?{#~a$2;JSsbbHA=$fva54-nZNb z->OFUsdee`V%IHp-D2k#cVaJ|#zF05X-_|v6<{&{jO*XHKUR;|UM5aO=f9Psy7j>B^C8= zi~en?LVj;CKeu$_1sqP|laoVyG8?yHz4n~nd<@UyMeP}f@65o(C@$Z*gyOhG`4;6{ z{C;n7?7K&NQoK%1N98Bi;bv^WrX=2aFvMGrU^gC5;xi{gd}aVI;uYV8dVCjRw>IB* z$eBsJeO8FK7dtL;jNARbZ8vY~b3@%P#N;i?e-Q2oQMKkWKnjfD7D;{5BD z5dXR(iT}fW`5(q-g#8irM^>Qm9#MZp{XZQG@t^up`+vIXyFYvWCU;ytCB)Un_w*Lu zq3e9lZ}dIiI98nIr~W_R>-)cW?AA};UE(ul5 zzq3R9f9E72EDru~0WQZCxE~MT89blF&rYJrA%0fBo}DWG{H*6^z45N+SN%TRj|cFO z>q=c$hVleqEuO;*iHEu1feV-5GCYiJDDM(=;%PjK=TZGQKlowAPVDx#8q@rl#`Gj4 z@)(Ic#;5N0_ZVkjFUmWNKNiCHejLK#B&3}UA#K3l8BF(g1~ae>%abr+VF(iz<1(y7 z^Kim3JdP)maL1ew?wE_}-=Tgql|R$a?{Vb!IPH>lFKbU;?{;~;+xc@le{%Sf!=Ie_ zxF8AHbs=QeC*hv!A>4CQy;JI)Ny0<3LU?F49>uOC%#tUWB~LQT^|M@`uU@`-o`Ztt zppegAK70B89mx0Zz>GY9A1>ebEO9Io$FdW6%D)%m{ChE8yk?7+aZM(R)08BX=x>Ss zKAP*hU7qv$73){xIB}fTuRkaF7xQnN`peZ{q5cB(7y90dU&VP_eDB@rJJ?>|!S=}~ z_Q)rCo}9Vc`_Nw3?Q`A!B=mORdEoQw11alFTU%6r@`YvpU!Yk!UQ*J;mu zZ8)dBrP^DL{CR;tf9lij@g&@w62eW-(Mh#-Hp>6R@;~FW!~a|M;$du)|MBl-s(&w2 z*-K?F^*EknXPBK4-h`;g~a<@;`(tT;v(+1ct5$N zOux_R_j%=m$~_Oy-v`~_|Em07J&*XiJJBb9cjut^9TdNVZRmaP8{Y4};r;F#Ihczx za3&UGiT5n;HGg|G2`h&DjJf~+jvs%=k0;FEC(Pef+2(By&cV58-mR)Yeyrlhst)W- z!WQw^VxDf@7Q$BVLlvh&RB?u#aqNs|$NSme9`K&VpZWZmzX`XX=cM`SFD&#NR)i&J zeCO{{-rzaysOPjU-?cM**Um)!cw9do_n!86VG^zIez#&XHse7&fv4~q-bkXA8~g-q zLgV^`aeab6Pw>b0>&W-(=m~LnLLB~nVu=2JQWEXZ?hftl(C!ZH?%0aktaD#!oqLsI z^>?Vh!~EZ2{#zFiSr-uPD05tn`nf|tpLhN9pImPq?O1~5*ADaRdF?%~y&aW~S30hD zyvy-<#~08%+F>3&Z#`5LbUr@675+NqCM+SfA;9l9{t^;zk9U1N4qbu{{s6j zEX2iFhxN$M7x=l?eY@9vyH}j|iu2w%I2ZY`mmhmq<67;RcY6}oxldm39K0vZak}Fb zj#uFUJfu8Rd6r{-zrgQ3IgWGDcT6Z?}4z)vHmD-Iv()eK~4mr_nex8iyAf)oa2lcvXG=@8kbVv(%rho_;p!XQTES zwfCa_zo`E&-cT>7zY81GFHyf#J#lChhZkGbYj=K}^W&AX-^l(x?e5d=OV#RcOrn?j zL-g_q=f$B>92&3Ub=S{u{Y=MxPa4Y{>)(s|_o8|)s`tHg>+>_be{_5Q=tb=`Yv;gZ z`Hd;gXE~p({G9Uh%5#{aE+XrC$UNL^J%*Hurp1oq8eQ%NTOB~Pi+xGd zA>JM0-675$;@qLV4()Y_Plx!tsl7L~_vRryoJ5B=c%<5dr|?V?y?Q)Eub#vK9OUm# z{_akq*HT0DS{ge4n)B`A+b+KCmAI0>j$e2DdNUs6XC6QEaWmH7QS9R9a(=Er$8R|9 zSjn#{?8aVxo#5B0Bs!|SquM*#jvd}BE4)`ON}|rC9{ZLjk?*;Y@3~Qzes$^BkEev_ z$5Z8>Cd)rfLH2vt@8Mq$|9aNqdU+}5-**1(88{Qg|84PqTRh$tkKRf0Rg>{L-b|vO zI{vBSpB7>fvj0=|e_DgJ=(?XCmKW)j7x5f@+a(;8XYrhy?m73ibB;X^Pe_%AnJh1` zL0({!JlIKjFz;iNJX%fi9R69)?Vt7Be&@Up-?;!?f2a4xJH1!j*^1}!QW8)0Og(uT zsy|u%$;)wtcDyf6%2Chz)1B?gOO=_ijFXUX7$HIHFLws*8dM~^8lspeR)7ZIhe2DK$#{w)&^N{G=bmzRI zOMFV+RP73;)efmke-Q|y;h)b8Df z<*bg#&0Lk6xhYq-P_AyNoT7KLeC<9U1`lXwrgx~BTjXrif3OWN;$^wHIdXIJlK9K( zL;U4Ua&tLybNBOSkUvBG5aV0K_?ByUgCE8GD8b#hmp@hfS;LzJ7eJmi_JQ53{eoUpyn%c1{k9 z{Q~wMbo`*>!m0e3hS!nZN6g_zHt_2pzYgJxRQzBE(CUqj6tS zoy7lrTZsSr_9R|f9^$1H$~P%D&;I*>@LACk8rRCLoRV8Plf=I@Pkvh}cf#*l_i!z{wKd3}TK?1; z*V+NRfEV#9UQgnuQ$zf88fIb^mSH)rMf39Mjkpx<<$p2^f|BP{d#yCH75D%mA zeWn}T2hX_gwr9%?O~V<;{#ra?zjEELa^0`S z^V7!j0daUh93Jd8A9|Cx$aO_~llW2oKFZ(CV{&5V-IfeFuT0#4n{YR(w?(}z>OITP zXIroYjYGZu)$8B06^<7n`_Hof>`rvujuj!^QH2vwyF0bN^Ai@MIPNr`cCJBocB;Sg z9GdShh{Frw@IpVH@c%zKCOvW*&*McD&(1M>CbavO`|K_KeM_8vULWG0?@r<~{5rE5 z&7HSN}tC`*2kfqFKSmOI(N5xE~K-A0Ef6c%3ot+_87=cmr<2CTzx2cm}<* z#$$3JEBrI3-DD$f#>;pm3D%ATYe&MTYOod$Vv8J;oXhxAawd!9OuSp)z8crcA(hG@ zd1s!`jvaDH1#(D!+@JGM|6EfNc4=>y_IBl<975iN5b`GCbi5zu;ym{3u5Pq59Qe2L%|E23s-XDUTaX2Y=AqO2!UP8HyU(L4$ZGkms+WWQkemxK8;}JY+ z4cba;(5i3?ZpF)Z#acAu`Wxf=8~y!_{+@}YFUO&AIAa{n=+7Db`RycY(y>Yr2poVcG8_jCL_$Isu*wpMKpUc^h*s!g<3Z4$1) zRo1FG{=MVh=V3mYSHCx}&QFt4osPv=g7vt|8n%7buXK?_p;SFnF zGOT^c#C$Bka;!+Asf$B2bt%@MXYi>9u?4*gO!Y1>bqufh8s2`o$Frl zxmSGdy(zUETibKa+Me@CSk)84s$)s0nj(EZ74y-3P&EhVVg)Wj^Q_7|s}lFBjkpcB zVFK&k8k?@@V8yUH_g{?&c->o02d;A-(>Hb z8*meD$DOzz51{+=o9@qV_TvdWj~DO?UQNPk^JTU9vYMUM?5w^YXP|z0z6rj$h1H93 z6|P3}Z}k>5?^c_4s}JBIJc?at9Q`y;ad|>{JtfA-|Y{MQrhG*~`Uc$?GGlYMLlkg7{aS~3$={O5#<9u9z%W(y+#|^j*x8pwC zk8OAak6}Na!}E9=Vs6oP?8cI^K`7aSkrPg}4G&;Rf7<+i@rE#{+l-k77Tb z!1H(kui(`r{LgVA{Lk??8K>a=I0NV4TwI8YaTTt{O}GVj;%+>EhwvzN;R!s27w{rp z#p_8}H$H@Q6L1Pn#Thsg=i)qEj7xDfuEj056?fxaJcNg_3w!Vsp23TF39sYLB>b-l zA^fk2I2EViOq_-Da6T@@<+v8t<5t{;dvPBg#y0H1V|WJ7;U&C`H$zw-Ct>|WoP^VG zI?lq`I3E|_a$JGyaRY9{?YIy3V;dg9W7v=9@H}3|D@k}V4&ljhI0+}?bi5yD;~ZRo z3vmUm!VS0yx8qLSj|cDw9>snl8UcswLs2&$W^?00&Q}BMAfpc&!F2u#S3RmMM z+=4rCHy*%4coe(v1fIeRcoDDS^(1_IdCb$I1^{%99)14aRsiz4Y&!n<4)X<2k;0U#eO`2=kWqw!K+F5KjT99 zKjU#SPQm+e2F}5`xDXfPDqM}5a0~9l-FN^G;Zf|u6L<YFvw3a4YV{y?6)@V;A<|DLjK0@e*Fgn@RY`2_gLBM4XD#a3;>e zc{m@J;&NPz>v1b?!@al<4`Unl;4wUd=kO9<#+xB*j+3x?B2L0-I2~u_p=;4$pSb9f#vo02ks4T!kBO6K=Sy8 zl|<#cLR8*>eRw>HzP>3$U*CeBv%c;*>+7BezwUW({*(~SpNgJ0=X>6qUxjO2*XX*Y zB&xU=qKZpN^mrVi$H$@E^5b&LkJsa_BwCmnqJ?QV4W}pJ?`DSZce8LF&i6i*=6xz1 z#pem}d14E0MbGt5c&>kHdcvi~gm&vs!CUcie**sLuv>OY3RBJ*ENWD zgLuC%(HewFco17qdoO5jZ+ZxOGjJtVp?R>^JouL>_Kr@)by$rZ*lEvbrahxsXnY%u zZzKDS?E97$d`k;2>d%Y%^I{9OVlVb3VW0bLpZjg!W~{*mY()Lpr#~-^vv+hnmZP}7 zv=8^&L#jVb`qPw$`N*Fp{xtRAF?&drzpVUa*S+kzm$mz{c3&39m&I{^iDg8kScmmE zievVY7TQZ%gpJsQ!#H9uX@R|@g~-olel{P+llG8i*h6aEUeWJY^!t^A*n(qtEeQvT zLpV@^;&DJc4xGf()*9&d_x1bx`B;F9aVd6Sr?m!&wFaqJfs61oo=w6b$A=srQtyy@ zKL{cGAi-+fh$A>^FX^HXT9%+Vw}|r(i|ipS#wKh={raJP9WJw%v>bO~gFU2a_K>FI zI;_S49JGg2yjsPpwHXg4;nma-UKRgW#rIY5ef1djqx!z(g*Lw{ZGKnU_|e9Xwhd_B zw$2}(0zQwef)-Y-_Y(G+i*Lcz*Fe{e8c_OQDARrA@Zw( zUme%+W)j}a3gOLcoR168`8S<^a}2K~;iz~W6|bYpk19W^KS%Y)x5ePwV)(aC>_+wf zP5sWa5IWP*`A+9MmtiG}cc*xFUc(zncq=`Gw=z(@x72%U6|TlsY)^u}9ToiTsL)k| zwRjrOCgH~gA^f-yt8pWq#epRF+fJcdKf0B7EAQTodvO2x@Eo4E$CQ6>^Y3l`z0JS3wfnYq-#(0ONl-oXCaC>h?e`kjUgO%^ zk0)>thwMESm!FEuPjfIA)%&S>KOM%ABpfr&$Bgr_7Hmc1f6Vy*Y>_>vOHjXlre8l3 zpPz}(&y4TSjBg+NeeCyTVip?5KI7Q899N)m>oabBN3kmjKUe?f>i_(HoPi}+ip_Ws z)%&@6{VU`xSK&t7EZf_5(${|m+E?IPkH-rk>3~jebIPdG~OSu^8q`5m}}4L zJQV*wi2omq*B^}6AK3c?dzZxPl6YMzK=;X|l~{$1*o5p}V)sM!K2-0+vp8UHY+VQ= z^*D-S_Qo!-xGmVznxNUsaup7%dpf~6=A{b_mVPuE~AvS&?4G*O%blRm?z3}nF1BDR zisNU+F*D7c)^se#3T(#?)c&2?zf(JRYUj>vxE+n}oyPahQ5;L6$>KR#JSVTjD%^|v zunmu(xJ?$f$=C6wy|4G%`#J+R;%4l|UVC1%?Rm|?HMkCyXDPocvDY;fD{&(Wy|Mh%jZvZ{Z!Xaos3iLft@cez5um1O?%UZaYUZne7?_o zzR&sloWE}uHrN9@&K}tDn1$I`i*>jU_v0WA*%O;%Pi!u3$DJrnpA)CgUBpXCG`%21 z(+hDGuExz+gT2^i@2he93*+_|;`0~c^B0ZSgss?)SMaJmu&E)+OT&CDKyl0y$2{%i zX(!J-%rg%^ABX7k8)^cfRZLU6)^qW%kCdw>NeJ^7{+?o}u0h^=9x=qTkk}KHic@i#J*XBv;0#$%>_&(!ak z$MGbZw-1`P4;EoDR^m!Djt?3~>u4hDXrc$l@LCcT7TVidgw7W_UpRn+_O`nIA=f{o z{fD$aEBKU~UCcy1ur-N_GeT6HiPQ0ZJb;I= z6T6e>%Snj7oQlh^5{=K7jn9{da5#zP zK=bmc0vjv?(th|^Blv)5+N-Vy7L ztUI{FI+Bb*pZ>0GK;4`z5xbRSj3lCcll5IVR zbrPR;{AtIxu2+A9`qm-%cPO5C*&fR)>Mv1$8GCcto5$V;_N)iVux=v5x`~I1L;O&Q zbx`HjK`l(;@z%SHw|*f_{WSH{hLB&k_qqPK>#eIuPm*}*sSr;+o5TedLtHSD#O~Ml zfyyL)czlQ-=I@u9Lj0uzN&E%tB)(uB#TSmD>)q#Z!E|rvjohOs{IqNZ=o0G(kj|=hR z6Owqh`0Y+Z>x*`8P2v}}S%*^Zc)MfkR9?{D3kO|a=K6BX#vD|>lbxd>#7C1Pwzf0w zQU309>qYLjKBU0cJe-aC@yAMB={&zaVE>YJE0uPt0wt76X_QVG zlu22XO*xcH`BXrKR7Ay8LZwtjD4TL9 zm+~l|3aF5ZsF+Hql**`_DrgZcp=DG_E2)as&^oH7jkK9+s5Uia{s@iI7+s?qsVV<8 zP(rDcM(LD6nUqD@lta0cNBLAhg;YevR6?axM&(pNi)aZgqe@yyRkViIQ8jI(%~V6R zR7dr+iyEkrny8r$QVX?GJ9SVebyF|((Q!ISr|B#W&>#)bFpbbCjnOr_k(yE-D4|qJ zqjbukOv<8c%As7!qkJl$LMozSDxp#;qjIXCMYM#LQ6;UUDq2J9sG2s?W~!lDs-t?^ zMGe$QP1H;W%_sKfwHr(I9#iiz^&V62G4&o(?=kfrQ}3}BYNb!=c2FmEQ!n+=aXLw- z=`0PYz^Qre5l!<8+cv(^(pzK^mfA z8lh1dqib}-Z$+SlQYnqnDT6X8i?S()aw(7UselTph>EF%N~w&>se%^K5?V%;w34c5 z4XvYU+DMzJhH9yf>S-4>P$M-_GaaNBYNdASpib(hUh1RcbdpZfSsI{08lvIUlm*&a zpsfYkTA-~3+FGEk1=?Dmtp(azpsfYkTA;1Jx{;bv5h$TlN~3hjNKIK-Oa-YakGpPR z36=V9?JO*#a{sNZ$F=piwjS5kDyd+uGaEgxdKwd*5C{m9$JbZrDr*9T%W$He~znOv<89{+mzV=FhhashCQrl**`_ zDrga{q$*lN>!_MG(q^imTB@UZ+C>f2NKMpCpZL&1t<+8()JfgcOMP^lPSR;QO9M1W zLo`eyG)iN1jc({qLaCHS>6Ag4ltnp|OL>$}1yo2yR7@pQN@Y||6|{(!&@x&{RkViI zQ8jI(8mgr_s;6DlK#kO#n(`gT-*NmM$KPq9Ps$Eb3$;=^bxsVyE7?^vMGmhDUb50fC{OI__wW(|()w+xXDNejD3u+HI>Lw%XWg zW2>!!_|V4BwkG0B8@p{oG)(Nbou+}*l-B}|(KWh3XK92^(jbjeuX+h(Q7#oz0Toga zrBgQLQwC*H4&_lQrKP64yDK%Ny@X1sjLNBk7CF~UP1H&)bdXNdNjgsLR8MTZTR`l- z+dz$}DHjG%yYFi6UG2WRk}BzwcD4WR8mc08-(5n>XoSY7lRBt|Hd8gNqm5KcLsZ8` z3$+rzE~wvMM8(8ze-7nRKJl$Tj|z#s{xafMKR@~x5&IX~so8(C)6ZT%Tm5YJ*AQR( zcM+TY-K1{+C-yq2k9vs@{hwUVpMHMz577vX(ijb=ro59%>6Avu$dPDc{PEP3+q83AEge+8PMPb+pLFc}ZFSV5yjmGs z<4-$w{qITtCFrNMK1CE`)t${j}*C^xD_(8|c-_}T-%Gn>! z&+$W!oxiP#x|Op(zKn()JAYd<^`@qra@{F@opSA|<1|1cbR#w8*J+eRdB$cPRntb= zOzd2!p_NocYf@8ww~Q)NQwGM&kL=Wx^QTi&ey`48piIgkZ4GL3Fqb|#r`}+1YRY@g z{jQl>9BXfoy+QT{*&EzU+8_MnTs!IiU?+8x*!@nO-!Dl`c|W0i`sBZrz28XMet$GI fWhjG+iN8a9A38|KX(Tn}Khmj)D#^M3X!-vEZX%IC diff --git a/slsDetectorServers/moenchDetectorServer/slsDetectorFunctionList.c b/slsDetectorServers/moenchDetectorServer/slsDetectorFunctionList.c index 1b9d7b343..b3cb6fe69 100644 --- a/slsDetectorServers/moenchDetectorServer/slsDetectorFunctionList.c +++ b/slsDetectorServers/moenchDetectorServer/slsDetectorFunctionList.c @@ -548,7 +548,7 @@ int resetToDefaultDacs(int hardReset, char *mess) { int getDefaultDac(enum DACINDEX index, enum detectorSettings sett, int *retval) { - if (index < 0 || index >= NDAC) + if (index >= NDAC) return FAIL; *retval = defaultDacValues[index]; return OK; @@ -556,7 +556,7 @@ int getDefaultDac(enum DACINDEX index, enum detectorSettings sett, int setDefaultDac(enum DACINDEX index, enum detectorSettings sett, int value) { char *dac_names[] = {DAC_NAMES}; - if (index < 0 || index >= NDAC) + if (index >= NDAC) return FAIL; LOG(logINFO, ("Setting Default Dac [%d - %s]: %d\n", (int)index, dac_names[index], value)); @@ -913,7 +913,7 @@ enum detectorSettings getSettings() { /* parameters - dac, adc, hv */ /* parameters - dac, adc, hv */ int validateDACIndex(enum DACINDEX ind, char *mess) { - if (ind < 0 || ind >= NDAC) { + if (ind >= NDAC) { sprintf(mess, "Could not set DAC. Invalid index %d\n", ind); LOG(logERROR, (mess)); return FAIL; diff --git a/slsDetectorServers/mythen3DetectorServer/Makefile b/slsDetectorServers/mythen3DetectorServer/Makefile index a08c71cde..4597d429a 100755 --- a/slsDetectorServers/mythen3DetectorServer/Makefile +++ b/slsDetectorServers/mythen3DetectorServer/Makefile @@ -10,7 +10,7 @@ script_dir = ../../etc/ CROSS = nios2-buildroot-linux-gnu- CC = $(CROSS)gcc -CFLAGS += -Wall -std=gnu99 -DMYTHEN3D -DSTOP_SERVER -I$(main_inc) -I$(support_lib) -I$(det_lib) -I$(current_dir) #-DDEBUG1 #-DVERBOSEI #-DVERBOSE +CFLAGS += -O2 -Wall -Wextra -Wno-unused-parameter -Wformat=2 -Wredundant-decls -Werror=return-type -std=gnu99 -DMYTHEN3D -DSTOP_SERVER -I$(main_inc) -I$(support_lib) -I$(det_lib) -I$(current_dir) #-DDEBUG1 #-DVERBOSEI #-DVERBOSE LDLIBS += -lm -lrt -pthread PROGS = mythen3DetectorServer DESTDIR ?= bin diff --git a/slsDetectorServers/mythen3DetectorServer/bin/mythen3DetectorServer_developer b/slsDetectorServers/mythen3DetectorServer/bin/mythen3DetectorServer_developer index e90b1eb187f468b3c40ed9d0db0eaecabdb0d8bc..60da29927b6fa9799744d08c182f8ada1021806b 100755 GIT binary patch literal 262568 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 P_rEy!yWTtE=E?sJ8IC#R literal 322428 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 z≻%VEvKG^Kg7nEsq;^Iw8ta!2F?k4I!w;n+kOzkUBWuSw&xq&S@I&a` zHN z-#?xPzb~C3evfMbmuC2VdK>sXek>XRPt)SqmurG&#rMnz&nLGS&usC$2lf$~e#HDV z9^=*Rt&xk6GAnh7%~`Xgn^$*0H)AQ?j7^v0r4`)>H}!P$!97Sfljzf3 z=+jZOY2<=uZHPw5Ax{i>uKy{=$Hsah@f-MW`7U-cIF>Jr{B5ku@ebL>|MHN|O?~D> zLR$%Kq3_>1vOLmKlx4cIm0R;iN9V=8u_a$@6{z5egx44c|JIX(f= zp23|nP;%#PlW%;R`;3jX5Arah5%4;r`TgHz93AldCj`6{&s~LAf!F0d<-)+rQ+w-* z)qRD_BYb^7{X2B7^sLO0H%5gwj&?`qaINOLgzGz8*Kkd6J;XJ))Eynnbv)Nft}JHh zBP)hVpX`bHo(aF8J>z+waL<&-+CTey_l$V=?AhntGh%+TXP3BVhXv2R?4At-&n|P% z#HV~4-*V45w-E1)&qdLCN%Yss!&(=E z=XG4I{e^LW_(O`_rOoVl-drTkN`CWrN7QBKVn}W%CJQ_XSMaNX;@cFjp0G!t{3c@J z%+7T_EPh+;y7~4>UGX(%DJC{5-+!3Npc>xT>vZl1=+6>#{>A9wT*QtJE<#sF?~ID8 zY%fiuvk!|qMkf|js}o6?b2^9zOwQvRR-b2S%7 zxry;`4PQkb2JVa56I1ys#smBZvG)~UI|aKajyJ9t>+4o59lvi~F_x51zuuQO8vh&d zJB!P{fc}+@&-a`-Wb@nQWuRQjhg@EUzDvoQptirn*#@^ldu#ZAYZF?!P4Z|8{|RGE zZXFG2X>f{`MxmwH(Goegjh5o2S~D3QW4tZfsH4|gXGpKM=Hh6!uFs-bol_ZeJ{CBE zj)^m445g2Q4`@OAs23kj|1!Ro2lq7&?xh3j;jehxVpQ4)9#&I7H~{Ah{yJS_+~47X zJ@CoqfQ~n(bnNSjnTwYmSSbu_i~2KN;JS|i`zc-EoELXT3xB8firuq~r*=mdz9fD3 z2RY@!?=Io}LtNKPQ!f1GvHpFf8%wix@0jL&v+u&^2e+tWWs7&J;}{3KGbm?s?#T|% z!C7P`Q~gv-Q1^e%; zD@SgU2d?tIzFA=tG9vI7VGLa^>ipx2!(Sf;0FL!*AuD>&lTUE4eEucb6+? zar#kL{Cro=&PEQ(=?rJ-U?)XUaoZ^Cq+IBK%E=z1FCn+&lZ5BHePr8GzJ`ueh~oW z$jk=^ebS$R48NefYQFdzRl#ckvkA zwRh%M=r#AFhms!+Uw{9=;ZfnZo(kCI_n#3vemn1&%c-tS{Ep@3`hJ$@XXNAB(}bST zqRhe3nnKJq^0VH;HKWp>=jD{YihNY@QHy9-d6LEi6YhQA58KxsLi#}e{aI3J`*R9s zRn|pug`5g!UeG_)mz?tSL3KPdT8_rm7j!P^@cG}+Cu~jh)Yf%gI6oLqPMg;YM&X#l zGU>Rj4aO_|#>V~rblf}ecW93jc8YS|46+_IIC8_>!pO(x_ZN{*CZpD#I#fhHjeLA= zp@@7;ep|J(9j9PI%m(~3_&-?G8K~eaxBgGf?H~Esa`3VIh>@Q?1wC-i8v1|f6wEH^ zpZfi!!Gtp;N7jDunBo@tBi(WB_yJ}I*VoS;xMXWpdjBA6cn0&__OEAr7Y=}zTMrw# z@L=KKO#1Myd#j`S-&2NWZTy(C@;bBiHXwzk5r3cPja)_9K7Wlfd)qup#N| zkKR5=H$_8U0pio4Ev8W-bFw3Vfo00LHfg*?ArM& ziujqaC7)w{g?bpt*54lVK{PSxXaf62c__s%)pwH#+%;d8Em;@oIevhJikPvld#PZ@xtxmESwU<;)Q+=hRi7AAC3cfmdtq zsd&EfHv!A2@7=)Q;Zd_C``*SJsaC-mb#mUT*{S##Uh&e;T2A%&rJqf0SKcd*!E6NV z8!!74+9+R$Z6la-Ehg8Op1jn_lU;nb3tW1;k@1^6p}oGB(>LlIQ0#gO8AW^} z-#a<=DpxQ5oW#W>nw;9<>ct0QIOndo$kpB0!R_|>jjnF3iR=ve?BeVN!@fi1Pr{G& z|Djhwz((KbO^Ul5-oLd!jlJQ_gJ3N0a_tc_mTX7nQm>80`OY-Y1RvqV^0e!}bdnEo z1}=TcrIGr*Qvr=g_fx#w;sNKQI7YMqEkxsmfv%`Oj>b~@6Kp*#?5v}OzfJvOS_@N* zX+l};0YpAW=Bp8{@y=+Cx|1F5zs8_?)&JWl>vFT`d(L%^k}u%z`5b!OXVLAr5BHS& z!DCeX{F?PDTm1asdX>!`^L@zq{VJP^OYwbjv5ske@$oLcHydT$#HI3w%#*JSeffh9 z?oMA$kP8NPr!N;DWbSMkwZ8f_L6hIqtF`;0cr=&hn~nQL@R|o1r}i&voRS-~Yi-(I zc>bGDjD5xMf9u0XT_5m0CHT{_KFGf(pA>MC9^O{_N4C*Ebup)>+P}!PFMj?|&_29B zYoEE(R{L|>XrH=j+F#?^hmPfw%f|10avDEt8f~@zE9iJS_)}L+`Iil$dRmlFGpx! z`85TH#ArwQD7iw3KibRgdB9IyADq0&`rze_+Fs!LVDopHK6suJ zwsE~{!^z>S4KIg7K8AC1T0D9>e$er;n_d0L71M=0FGcPc9ZT2E(`D|4XD9INW$^r)$UgrnCp&c(%_ufzDUFZ`63U@KuygOz;D4CIhI`__1JvO<+9u*RD=4 z2Yj7Q4(R)O{-f9?Y(;Wq2mJr-@V|Sj_RRP{x~A-rT>gKbYx_Rewqymc%*OLzF#mJ- ze{TD~-$whM|NHj0x%N$#1?_JM+Rx$tx$Qr_jrKkN_w9E*BVAYU^3TIQlz%z=Kezq; z+i2hOf8YLm*S?p3zWq@CDxABN$%KQ-C}IwWqv%* zbA9ph)Q=~Sr{aafvV|O9OzscH=J|u?jW2ffIr*54&B;g8drx#@YePn5WAl75?E4?N zw!9qlefM%uyta3$-^1Nb@0Pr3ci!RSGn{#O<>jGo%gaM}cdopuv*XP+A+ADk9zI^0 zeTx&x7bezg52Ew~V8)r}!%_O*#Zdg&J9766+8V1He`W`|@i+DT*2P&T*h-4!NG|5y z#Tm;-;-jaJx#Ov~6B&PvZ$o3FKiN5AKBordWCN*Q+e0|y;t%frXn{-#=DR$2koAKJ z^3h{&jiWCq-g<@BG4KA}qZ0SM=*ev8rQooI?Vs8Gf8LrNligMMK=8>R%Yr`Uj{RPA zkNwd-_CxPjif_1pZ+Hp5;l=od7vURTh;LZ$kcCBTGh!t+7ayj6WR=tX$W=wovd?3u z$qxTnoW@=}3jX1z_-~im^9?+Qzi8bh;eO3%C4G)RIC-c#F>=Fl{CCTXR`!OY(J6b^ z$oDI|f8@fxe(m=hx&H9Mk+qi`Y|pMIuiOQ5R#Ol5Kkq&@cTl$5$j=6skE|U$+@AgH z&_Q5ZzGgHU(z|O$OGg!ZN;i?;>n8k(tSy%}7%txRj-xb&@~Sk($$Vn%=0L0Wi#dBc zcI!#fiw!pL8TnzwZ$|L%(wC+78+h3`@fBz+zF(|)F9*JZ*1t0SlYZ^`my5^x{0puh zevQk|%@`i$`(|?zyjdIXb!~hWp9XxhuK+E=FDn-dCT_ltP4z?dh`y{2JGUO1rVi0^ z+0~Iy&%kd-*<(Oi=+WAFpOq<8{xXGi?pW&Aaokv%#`b;xGqOke&96Xg-^w?1N2hU} z!BytEkn2*eE4kKl-NChuYvCKaqd~4LChq;rt54R&_I<=X3uF5(bkD-rzR$R4%OwXK zfBl?$7RL5{(LD=e`!03Q!q~olanHiozHho`VQk;G-Lo*Z?@ITqH|WcMq|d}ZXS8ng zSjP7KAf=zuo8i?aHv+$}Uz;@Az)oWA(%VVNKj9~XMpz5cK4RuPekapIM0Zuz4=T`y zi(S;-oG$0nwslVacT*SZnpO|@ntE&vkb2B#MSsHY^ZIhh9_owgnMq$Bf{!n#Y%0!Y zEc4*sbK&1};NN}lZ#_d-DegobFc&pv%NMhESNbk;E&Ff!Cp)Z4P{0)kSkQWAHR3p$Zzo<{!507=O(}*E6-dt z-nvHl1{N?rt@E?~a>2agkwN-Bn9HMrei!Ee?>^w&3%q0CJvV@N2;V%o2Kd-3@C|gE ztbeTcczPhN6L=%ffoHNqI81f56qePLJ~j*jm&1ThZ#jk0ynem6^`l8}+yjo8LrGU@ zBlBY;@e=9Yx7;`a=_&xdy0I?WBw7>eGihHSaq!W&UHmt^VF7ws)D{2M_1F1rGQ2v!jq*U%_BEi1ZSGs=Z_B>* z{xy6?nbFP~?*TtOEeDk?*tIPr9llHkL(7Mf&26@FCVXm6Y zn@+Df=wi`(rdM5jW_PrfYn*EX*S%cPTf3tJxR!H0hwBwwujhIfSEdK`J+o1-TIimI zde#2!S*Ta_yJw+Zb%=Ww>Q#rjXQ5toq+R@sroX=S+t4O4$%>=^)o?ZCj7!Z3uVGD-Lp_8Y;w;+nQ(`D7RrQs+_O+7{5E~IPs@a@ zsZ5Ao-$Et?F;>O-*f#UfH5TO94$!8>A%Xz-t4YS$j7&g zm=@(`w{lDMo1Es4tlOLr|6sha=cJ*^ImjA#U9vspVb)i8ldYwa&wadFMenSz4vl`R zwE@*lJBqiFY=}N1IWq*k9@ekVQzKX|*a&tmg8V7yp{;DcU=M$BE_5>w zx(RH1`hq?^G?*aYd!lGaKH7r^qoH_WbZEnZXoxiq-T?!?N%aL{`CbW*(KV!hk5^Y6 zRU}qqR}?;%nFuzmJ{pO6&wK?`Mm@0Srbfd~0%#J9CUa z>AA+O|H9Sx9~hnJeQ(TeB=lj62)%Psh6q3ta{qT$8*Qty8 zYz*(vT!PklCcMC33dObf#AVNY1AOsY&wJG0Z!kyGa)Z76*KaG&UFH0@={SIoubX!R z_g49y`dmB0f4tR?+2sd5^j*^33zbi>&y}@4>Wlj3&<|`*ga7+oU-4_De$FO3+h@S( zUx3p;2d7-}cgCM3ZvM69u8`LC%-Z|EJ(1b#p}w~KJJ3Hm_kw(V&G_}jjQe7vg~;gr z;y~wQO+odKAFueMG$+02C6oV8cXQ?+sN)|}`@-t@hqMkyx5Tkv`^v8M`si7V?L&<1 zgFNH1v7Jjhd9=!NjX~$CnLbJ`bDOUxxwg-t?Q??upA+=||3=aHmCfso=bFA*sIXVQ z_zvpf(%H&Z|8rga@8S7-g8JVR)GvLOZ}6`a)Q+cn!RQ6Mq+3@f!sn&$yD<<~>7J); zz1X#NHf^09v~_mS*74v19na$-t4lo0>tlc5>UlTyygR7p-9bI#VUn%XwRmy4KkWxL zj<4g-TpjPCj&}uhyep_F)!Y|MYo6zU4zT=5!3hPevEnWjHY1Lh{b&g!NncXZ9hs#%6Svl&_uxUqvPv&z%b_ z^2)q#s*K9oJaKXXT1@B3PCu?DITiwcv-y{sjq91|xNPpmX`k&k{In08n~ub|2c(h_Gbrsof zm~f3(M~8~+Db(*N-D0lSEe@4#k-qc##aypn3`)PyK8tbatErA*`#Pa%&Zd{Xo6T{5 zei`RWC-^_%0V(~l{%!t_OH$rD-j~CB8ISRpuev$o;@C3UVr^SGGx|%^cM*7@4~DOQ zNo9-q6>J|Vw6G`Ie~|GJ$CtJ5{M^?5yJ-Ir*Wb%re=Wu_nB&BusK0TEn01SB1g6YW z?Q=@B4-FkDjU#a9%xw?Ond6C;A@A4FX(Fc1X%ezNz(Hh!e4ANJv?7uR{ zSPu}N%4{r8FZa_nu}&Gj?hoiixqeO8aD4gu4rjmR8)Co4yk6_}S*vXFX!Wic#ZYWw z?hZ0{pN#zGs^{58+dp>gx_!s;m6>kf_8rIUZx)`)2RuC*ke?16-o|}Byx5UxeT#^7Gq@B=FJ4hw@9jDD27Ah_Ubm;*>V?h6ce=T}^*jE& zS>mSGW&5ToztI_9IsUev0-qCr&+)+KsqnVr;BCjk+m3;^Jq6x&G`vmkSa&EA=YqWr zf2)Ge^t?uc-*yMTpM#&Dr@lt(nX=2KO;6edDk60yWV|NLOTXe z?gr1BDSLB3KR2g!+PL4txHks4(HX+mr~bvPPT{D&&Rr&Cj6Zo2I-$_2uwy_MfCS;*GSU>lanvBN#8jK5%;9dw|=|c*j+| z4twDUXz51E{R|mnFqk^8(&#A<7NVHQ`#PK{nywSQ^p&vOZ(qI+YU#wrtSaAp>1$2 z-+9NheVLn7rIt-qsqCUi_*tr)#Ab}^fxL-T8$1?)V2{E)Wg6vp(PG=kOb@;fr3>S;fZp6jIeD`o5tKg#ns>0i zQk;X#QVf4HIzk>vCK(-VPk%S1Bg!?UBW#I0I)a8$I@$pr(uHl&5gqO1+noXLb8Acn z!#-fBy5S@85zB{V^LNqF@SPU10lVR8-SD(7cp4Wme_7ro_DskW3GO9P|^*L_WtMYfUnD*>#5qevU_b^oi@Z1 znTz;_k@J_kc*JnM^NX(TF3NTVb$11ITdtlaYwR_95YUB|q6-z!g_fWTEk+kw1YK!= z!b89ed6=$2c^_@5D`q`L`y5Tzk*wt!Q2+3++1S74`X_w>9U+?=TZ8`nAI4t7H)=W+ zaMikr^d|nd@fE$J0qB+>O-gEMsG)=lhLRpSx-(ND0sv~D7vS=^+Nob*?=p>oZt7S#NWshc@m@ z^$f|M8T&Tt*P?^D0vsZ(kCxv69KyJvAGm(87Mtt}bP#xvbSCwqZ;-rOtC+8RUwR)p zkbLya<4orN1pX}=*IEyE(}!E}0?A_LMkb3lxIP&F3Hq>Ost>vA6!kIW!FZD@{Y&|^ z^(jjEOk*rZ6?q;Z&#Ukku8;>8sUw8ju-3bFqcdYZBG;mL(-l)W`!`>K4wSW-@|D}& zxSalz*&9y(G1$JI`7=}b8usDdpbz(5QHbZFXG|jZq6$3S`4xVf%Dfuc>-Dtn<8gMfI*{ROm zT5dPe$qeF_ABv!jpI(anHno@KjbG&a53bc*mvDWD>l&^Ju7|khUc&hwT*q^*YlcLP06JVf+q z_RB7QhkWnP82_n9yS$U>+P1Z`Gv#{;Jh}MKYu4NMm)7lbIe2Nh&t=l#n*WO1^16=E z&a(Z|GWZny|1|!MdcRD)Rb(VKy4mGl(f+L_u|UB-FXbsT7=-)0!uP*Yp3k~{%fWl` zyjJhWtM6@m-z4Wj^3Uv9zLfnKih-)xPxD`0$X@DMFo>M(*M6EBy!kl38P==VBiYE~ z)#p<``w*Me8`y~T_My=OcwL4JNrZ!4)rn;V{2S1Q@xZq`9!R{T*|yw`Mgkk!Xe6|u z&tXnMV|Eq__rYHgW3~*t8C(>x5siKXAJJ22%b(k%t!{Mb?$nO9wy<3@|H*69wlL(Z z4dJV08y{=ZMquAr8={>UaBYeTl71?1u=UE(xeb?jke3PMddcOHJ8lRb; z;^5y)*HScRoIDc_gkO9AWt;Z}TWg_id-m1znd!?WKfX6HfKCw0Pa@a`G?>}GUu!b{ zK&II^LVHtjeY@8|59sJuyyvI{o6`14>E3Fe)J$d6JHJvRqZWRJ{1jX(xK8DIHP@M3 zV_X+;eT}Qabv@VJTp1t#e~!05lYV>o@gMG4D5I`+&q5jX6Zb5XQ9pCfLK$_Vdlt&5 zjqX_}qc*!|p^UoAJqu;jZ``v`Mm^x3g)-{l^w~Zwqjsb+s`8l@GRkyi);-CMP_N?} z?S9qCnXhptUbFZw+{ITfB zfjns@E6Q5qsgo6!SBZYI*I04Y>H~Tdbo%~6Ox>AIRsUTeW8&_ddh6$g)$L^G{O1gn zzlj`X+_FieryDF~?_dMf^a1$zKCE)+T(c z5BtoIC!5d3IvC*xseutXOPXha_Nl|p3L+Oz_WgkS9{H5)4q&`H?SE6a)$jeR*R4dO zPNvbW#kQHQbA)S;HR9yapgq=W45#X&r>g*`$!>hnrRc!qs}t)-PP%H)&dQSC40})b zP~K@s(Xq~glW!t{#te3h*}>?b%;5*d=P0 zyiNyy1AB~XCD&q@TmTz7D7BwUXQ4bi%{>d{;cMKpP#(U{JqzXG8{D%{9-iTzh4S#N?pY`g-;qAsr{&>$&M}*< zGXE*eGtp!a!)OXK;Q8dwlBj zNuHVB{)sEoees{Nwo|>4ck(@!Ue`h{e2;!SmwuG!2bZruu0ZRb*Zw?2+_tlUICK`C46lTC;_> zSj-H2k4*o7=X1tiS3LQnXTi%-UAg;rZ0#}n+Va}|9u$0^r0a>f>z&vOZVfW^-(CEi zp)6L%^4HT|_m7`tIQiU_HNGkvQ!8J65BS&xK6Zi+u56Fv{3dI%vDPgb*JQ=FwU;R7 zyN8~1b+mHBEu1Y`DV+7PYoqabKU6-y!sVx~k5(?Zy1&?6DXjRDUq?Z zqw&)=^cQ2w%)L4q|A(9VIY+f{`Kx(8K$$+u%>7|Bb`W*WsT3ZXNBu9|)L)!SnT>%^Iqya1hbo<1*7f%a&vkfcH_L%rnNae zFR*Dx(z@)sU%2`ESz-{(M#aYSxi7jul+N)R&dKs4nonIk0~;}!8`O^h?6f#$9k6= zYv6CTu?GI;8eZuAAh*DS4uuB|!GpLm+GO8?=4961cTY_BXtE~n=bp_450`s$;Bq^> z^!8QEZ~P_V$Kf7@mCQ@_1}%)PEDS~$6dK^XJ*U3gsPDF*KDQskXoCG_*4G11PWkvI z%5HMHpW5D(@^QoS;pe6>1CFxiO>bsyX)bAwNe38cHqIl?ZNz_YE~JgqoeOFG^6^kB zT)!r$eSD&Ljvs*MyM|<&tCcLFLpSP%d z4PHy%^|2mP>-P0?;RV2g{@B`&?wSkC?__>37v=|Z;SlCRFFb&@n(_ep*T4f_nf66( zWjw&c^)(I-ZjNVgaC5vVT!Wke_4xwir!yG8*3~ULZCijd>?*S(WY0{R-zZ(vR{s>g zgl=ng0`G^5=-J|3$UgJM$zIv6`jPE^?z{mw$|lenn(l&Qu!d$dh5noIlts)PU+4B! zXd7B>&q6)<)9zWQCtvKIg?jQA+_O+m{*rqZ>d9Yq&q6(U zt$P;g$^Yt}g?jQ8>9c)WPhNMf>B*(!8Wa6zdK_;<1xRVa@izZW%kj19XSEiGSw9^P zt)KGYWPNkvn|n%1t4(MsI_a2No1!m@%KO(nYo-6!;ZpRsVlHPqc8ytFc1(W^=AR} z#5w6~di9mdctNYVa;ED8^dr8M;nnda!>iY^-cbv?jEA{-)pmdBm-<=yJD2aJRsYVJ zLI3`C5B0AOo)LR&r-kDMGwA0>JM3ruc@w}A@Pt9^VD9k)NXjrQy2nYW3X`i_6} z4RA3P?{nH!=)+uPt_!&?<+_qcr#jS*R2L&^-%v;-99^_Gz8? z=jWyIK5v0Go9V1^wkOuP`2+%Gh*Y&slGu(-oHv97_3j z?+GL2k8vjNi^!e#!%~_HektGX-~Z5EAMJ|E-$ceNQ60QnaB6A!iTqx|`=#=oo`f9G zH?z+rznyiG9jqzsr2oim#fzHEx*hzz{}{JMl*)^;;N)y!Vt*sW%=QgMQP|&v`V#6( z$1i{268fur_X|!^{b#S&`O}s+k@55%K2lyJ7#sr(C^Kh}@$r6t%kAj*8Zp+@)N@fS zEc~9S+CAJ3AIsZ1AE1%%O!Pt5IWw?QAv*6`5vEH;RHK|V2JmgDGxF7sL4e_lGfj$qW~vPBs_4Me_N3 z;?pT?)IV}|FD<5LKl40T8}a_Ydir*D2mL6JbEr_1&O$vp8~dyX8_whqd%L8k>fL0Z zM}Avt(la>c;5K}bhv17m7+)k;{knzfH~4UGfX^iG34AC9AD8Qg@ka(9m+QxLn_bH{%~&iHQz2R8@&^X9;gG8ymcq_0Nfz%-7oo`UI# zId%S$I)53|`OBbA*)O6;!Bzaq!MAu5^u2L(BEALM8LV5^SQKc^Nc!6zit% zM90ZZRX2yM{r+evG`z714cGG)`ckBC=Ck=q>Q}lH{3zchxT4R_xA}XcsqBHS!?MY4 zYqMZ;oB1GnRC9G%y1&fuKWzIQ^6;M0SBiJ>sPvqXG;X8GTxcWK*Yl?udhmSWPr+S1 zkJ6mn8Q{*@#>S&emxJG6Pm3>=4?UK7;dnXY^t`-JIM(=|lK zmPXvy_1EOCdUHMj1KVGJ~xQiw&4-vn!dCc#| zc`TcSTz3w4(mh)8-1@Ty!LQesXEd&#yK%8L7k-y)55~1U9anKjKx@VW>uAmKjRd}( z?BX4LsxWW%iVn32`V&n{x8y#p-tTm%(z)u-9@e4A1?_dH@fzNo>QK4-cZT}Yc&I=A zHfQYcho<_|32FZpE2qrvYKrIG%A-E7Ft(^M9wmckD?X{cpH=V-y;eS*>Q91g+xpXj zQf3=Se=2st2XBEdJXX5X{?W{IC+S}B2Aj|SKYQN-AJ1BOL2^xSdsF;Tt5`c zV9T=O7-tEwWUXu~(F;AC1d}RjX=QCAX;tmYk3fq;lrIW|Rw03!HZ4v=z?1-{m{(|t zOB`^&rfotEIEhW1HlaMy62L$R4}bsvnVI|AyKC8`r2Tz%a<%u)^URqu=bSk+a|UY> zeCHVU_qU=e#kZ!RH|4OWMGkCx3=x-X;H+xr6NT6&K<`#bMldqMpTvZoxf3ibxf9Zt&m zy1Y7f7y1-=%-#y&pXeL%Zs1qh1%OLuElX^cz#VlW(3158`Dl(a_(9xxX%Di`2N&1I zK!@gBIqA^67ekS!4COeBToE=mb;n1(bkiO){|a4m8FbAzK-a``+PY>U1gF&Xj(Bi- z#DmiOrgL=GAS1;tfsi0|*BP=fmeUmP7@domRyt-j<{6R+3o?zw<0{6#VK1Cgu zYnNVoLFADG1(C0e7kKs2oO)bfJuUJ`9rB{Q)3tL>2ky_D0`5lv_rWuS`%%Ds@C@J% z$Z^5%-)cC~kHq_gnXjNP$WyVWRAl@-@HUP&ezRXWuaSG`3*lcvzemPZ+Gg4kUtXuy z9sXXI4}M8m>y(dqJj>77SDrIrB45kyM*V^FW%J+NJ`y+h+fO^MVqq+#|3JnFGw0t*doqA$e z-=Y16{1>{;FECz#ck8QY|4Zm&Jmi&^QeFZN(6iM2%6J!j?F;M53{PO%`Iiwl47<(M2j_mw};=ScRTX&pvTK>y*O27J* z*0Uh%;e+#dG5yB@X5lM1he;V*w;#BNFD3d@6545E8$qAor{wQE52$%uHO>cKScE&3 zqa&qQ*FKkbA+IG5n!&KImsTQvX+ubSBf}1>_*+BbZ)4au=Ttrt689*=Q0@ZqvaEU; z_VrR*>J5o+WY}R9e``qmZ4CQnsr?A}adZTH2lG4fP4ekS5yrMlU*nhW!tXxi;dj8< z{1&VSL1sjNYw~vTQqC(Y za5%o8AtWAR2yIdEU_)8?Z)4auOM%0XwvgUH1IqrS;VF8R;UVtME5N;bpvxHrmWxBZ z7W$H=&#z$&dg=2wpid8ODRTn6_ziMzP+5|t>I2}(1aQg8OociU){}|Zo zo(b@)KgxzZAd_A_*hN+xC=h^IBavtJPV5th}S(SovH2{%CpoEl11S>W`MU795Q*4)*|+KTmrJ z{cpaZEb=9sn|khH+z+Ppesf2cvH9&Ow3tTrn|wpr2E-T5r;ra1)^y95U*f+ByUFv~ z=7l;$mOrCq`9nzmkoNDx{aX)t&S%|@y@=20^v~+_`;dO0_PN9K`&4@I`}k?Z;el( z36gz2-`DlRAGFl_Q`Cz`>ZK29q%-x>_jUPyt`oo60xSGhOP-%24<5-wnT>QN&%u1K zeimo*p62;H|Go>(0gH>!2WSW9Adt;vm)Nig9)Gy(2==Yc#~IM#UlvHb$o=g_)?TEO z@Sm#iU_P7qW`Z_C%DfIb!u(+sXUZ%89Qx*ySIHxG$b$R(wWQQn{>pu3kq;Y;NR2U&#_UZ`kplQdEJNfFZx6D z$A9TQ{2}|J8Z=g2PT!+1PhF~L41PGve}r@|>U2NS{q_s=8y@L5>b6M7ev|nZ=>_e~ zNoQXG419ug_JymSbMbJ0CGl-=DtZucc!>Vex!!utB;v+t2MDFv&!DU?{1F~+8UB3W zJyR8+qbxX3??Id`6h82M#U~En-q!hRF{k{-y5r^F#PcoSgnjnetDcQ~U*57FowhW3PqY37XBk7H7d9$Jue{c>AAz+KOC=v*yrUPaHjBMP94V zozFUI#daf25yFo>ZN(~arX1(aS8qCEOn}v zw$H$rDxQV*965>o6SV!34!GAv>HD-5_}cz!*a^J-{&P>;->mk(l|O~HJ`Efk_2A$s z;NU32xt|L*>MR=gg^LRt_M0=Mfz_ZB2N$4$gBPQn@I5ds8u%*O_7w2&H0Fm#0k7bK z_out~pgqEek1r~GKsKmx@M{k~uF&{6rst~Pe%Kug$51}Lv+!Wma}D>m9t-;~_Tb?X z_+WS%eGfdGxc(T%i}Jy+AO00$TQDv#7WNk&unyh}Ukjj#Vi+DPjsXwf4xtCwOMLC$ z6=;8vz+Yzg0Qjs`{tViA+(Qe`pzS!Dp4Il^SElVJZaCtjf!Iah3DczkOhzl7LECXw zK5Hz%mg8$X{5i;2FnwR*Y5Nl0_c*U#{%`A!m;bw`{m-KP@Gp?n{@H={a}DcR@*)|N z%3t7XR2^JnEWQZ!qpS-0D)@KdS=j%JJ6|me_tz@k1zM`3t;Yv9{UT!whw<}@PlH!~ zO7t4Y5ADzTXK%*+-^wQ-VF}9SOG}kp*5gIwj_~!1>K)w>^4Q}3cF_+P6{vjzUjz(a z^yqtERQjG?1Km5VJ1J)AJ1GL|1*bembMKdFv#2yanD)F}Xzj;y2+vVGFXD;(ve2r; zvkXrio-RBCc;11B_9JP_a_p|bw+s8ypM`9G7Hh!JM{&<7e5LcuHhAZ8tg#=b?HlqIcBO}(jl2v$ z;ILJX|31>dzC#<2S>u*Fl_ESVg0-bV84s3q|BBq_Xk?ElU?~JF+U6L8&0gx;J%PJW zsh`3B*GbfaCu{BI6#1jI6TlhD7|BzHXN{=h^E{gvSRXn9oGk&)E(MHL@Ug!bKK2*E z$Nob2*k1r2`!;;+GY)t8ls~oZ_yiWPWM1<$cnjog2ID?bZ7mR-;?85(8nxdHGwI=g?RG_o&B4 zpby+$$vMYk>+0rW{8vUtxHiPKl^L)pPS`ULR`J5RXQN+_z$PKK?5s46Ce2}$=GKsM zZj&_VgKw6WJrWZCDC6O~9(BNO8UhEx81KLllBUt5F>r*WxlPh&I6~qdW&ANcpT{rX zr>MI=2w#N2^MnV_{66UUF8{W{JM$kXE2qwJ^yKk!%rRd6*38Os%rP|H6^}wV+6&ui zw*7Mk!YXjDRP^h`#QTK}A!+FAN75WtX>JWkLq9;AE*?fTmq@A$32Q&t$j`yoZ&4&L>5`7=52jyap)9dkAx-e1)1 z4Z)Y-9q~?kL(&M|nZ~p?B#q!5_2nzgy2l@&NK#&kTimKv|r!|i5I*> zj{~15qdr%G$H6=7CSsR?PFH*m<`TU33h&V)w^ed|{n8nhjERF0m-iG$z;`$<7-stC z*&O}zW8FWr*C>9Z#s%)Y61;@qRr&|<4qigiNdGX6!AnRQ=^xaew|{U?N#6cJyaPuF zZl!;i#=sGhM*4@gDz1Zs#7qA`*OdMdA5rKZ&Z9IxiWIxJuK=I-@tqSIzqCtv@ryfK z^5PfqPP;;IC-`L=)2@&-f?w317r(eyEiZl%@4yj)8^JHr7&t=G2!3gk%ZFdktKiY_ zmmnU0rtwHyofnU|qc1NW5%0hsf+N8r(-`k*E zKtG;wS5hTqqTCnh!86)+UoJfa?b?I*oH_{FB=NcQ542~`BO!Qy6k#a$W87O5)G1~# z?CZsQrQVQu;uG~s{H-DJ#3kz8o0F%)ub|)&zZH1e$y4_$9Z&FR==Hf=c&yTRT%y+< zs5jq+weY&T^5Ajm6nK>QJb0YSgU1i%!Q<{z;8Ei9;Bj|OJi^DL;1R!AJM!T%MtU@O zd_ET*7ic^#3gYpWJa`;G1s)|n4<5(!;PH+;c$_>19wj~x9w&3+@p+9${8r#`=n>;r z_HbYy56|)QjIP)x-chjNz?Yy8V~wfe`|pHJ8xB-CSN5DwFQ+~BJHR{rRbi}i?JTg) zjP)36F87dg|HurC#|Ax455u<^d8ff4d8EM^$1Tf}e#bB0WzF+D>&m!pSNvvO-+#ac zkhSOR4C^EOC@-)-;mqOJFi zm&>^$=J!%Yk(6P-YWr|NN0&yR>jNIOUlw<|fp98*0Q!Q>qXKq`)3WKw9%$HY3Sjqu z4T-iH+UqW{AE%87_EYqMu|aw7e(>09XltQe2X-H^?aa2pzi}Rzwx4-;7rPVUXIrs4!~Z76w%iGpCmwrixK~DMYn^Uk9FkIgJ}nJ;0T#}ac(AQ z3>+b8I6sp#`R2ONZAn`dzs9*~u5I93)-RxUoWEX%nyh2N@mwV~(EDlc#hq7jJRxW4Ru1`lU zJL^to>5%)k~m)YQl@4?v`EvLkO9h5_7dBC)I0A-4A|H})3{VzN-{d3P65B4!~{RRDjH5kO5 zD*sDJ13w4QP1ODw>=pFpFaHU65ckhuou=X^ui*X}lqEESUzY3apE-g0xPONAop=TJ z&*<`AvHdd!zDTw&CGO>$_Wl{PQSg9Yw%6G|gYti?{WC8Be^~GQAF+Q1bU5GK$@iq5 zQ}E3AFFfmp*c&QqlUTEry)}TH-}=lP?m0j349E~?o%Fdl*-wHsVCbK~?yyB^d#r;#5_hAp&$>VBnXq9J&VP5+_%s=<--4hxI->^C3 z#7EuUJ>}nB_k4EV|E9XWx9<7qiwEz){+7w;i~nag)~WS8`1bJ=Pkq*k%>NkX;`dd) zJl7tNPR1vGXK;O=a829^xW)n3R0U{M&ChS&y?WI{*2FhH0k}R|89o2f-OoQDH;uE&{i%J{#Fst;*zT{KC?sru1^*29-}yU(?LPx_2DztU8(-b?chk$0G+}1<!HK&7*Q-QlF9zrgb|ph+ zC*Ja~6{~yT)uXc?1?UWRI74Td8~@CTtog{RLuWq@&>8F!hR!li{1xb*_e#GCboP?~ zonhW!=&VC-CGwe$`)kE*I zVzb_r)%RLopj`Iq3*-B5|2u2qx;vylZq|B?mf@6>lgi#MGJJQYY@Zc*{6WFd&F3lI zLc>A*Xq5osT&429X1%af~r z`b8`9WBRMe1GCG=#`o`>v?g{@$GERD6lS;2cc1tt=p#Sn9_Jh|ySmF%=5puL1Dtv)D)!ZLGfXVJq^Ry}4m_<>1tbr!lYj z9OeSKV0QV%Jgw6rBHq2bK7KL@YcEpSHXd1#ol?)KMYW*6FC#Cq?qjCu4&pgVGpR(#Bg+@)}u z1*1z}yHETa1C;!fh9C=?jjP5v?T)pp8R^*aT<%ZGI?9zU z4T8$ICs)7W)9_XH{%ja)4@R)o zNj^B`ohN2W(LZ-h3Y-ranyj5*TJph3u74UCbmIR`SqGozeMKLwe8|vcZH#Hjx4kqs zwfcGJx!+^C4^+Nv_-k#1Y00;}<6?4k6?Bz39Gmx79`w?u7iJe{<0m$M&^kCm-hE$X zD9mo(?#?`d@wr&hX(-Gt4Nk5872tRs$6XGX-ElIxI*u`#`P2L`yJLEM_4ohWI(WCD z*-)6>zTTaA560^k$met5*`>*;%z?dD#DsZtLJDIW}_O*&RodC!T%Ciap1)ewdZbhdlcB zalRWL;;tP?;wB}I`+aC5a&1G*Hzjd}I?k~dNxt0@SES=$L!zH^oMnWc^OMKt555Wc z;iLJNC%;oM!+NG7VjZg}I&c*C6&^($M*+jpNU^r1<+&e@=aI^3tHYUy`NoebeWPK| zKn45}GTiLnhrLVA3sm4tM+IQ0nE{&`(_wv-b}iXw0DomFOyz|yP_|Rj(U+OTAuoL$ z%KHW5W#w|70%!1|mV`x$5yrC(sJohHBj|?%w!I3ZBOj<`n2oSsnXo%5BV`9Hi9bYH z3%|;+&(U`zY<%#?1Ycv=V_$d4WtKOc)cXrl2JUATJm_zfBYu_8zVZujHnmLK9(fPL zhu}AheyN=Lakk+kZGmEEFB6}Y#LER}qntI-?Z-E5j=cYy;SW85{UxUDy#M8wstf}w z+ar5WnC4V)qCD|uhI$?R5r&h%wSq(7tKbN-_8GiO3TMR1;UA3fI_2WM!t|R5 z2a)3^E!xEiH`?j6Z3KH)ydDtNILfUiO)bXXKmX?`M;b{>LMz z$IuPN!(4`uF3V9b_T|X=U$%qv3%~B-vpi?~;ZwwaGf(`CJauENU%xqtaenf+^d-UtUQe8ZOU4n_TycamERKBue+0kt zItyQgI*Wd{b&|h?jceR{R{Pk=cP@+`F0&sy`S7af+CRNIy7v9+qigTp6kU5)9pbNx zPTqZWbh7chn!@q(csERR@(F~WR~B9S4-2AeH?HKpbkWJVS3h?0E_2HcBcCqR;>FQ@Sk?D?8IY_SqC3`tTKA&4jbS0LyzNbg^@!x^39DtLBDJ> z=AL+@sNmouMGN4QZEmK{Du~rtsAmT5Oh7#-Gx~vI8}BxK5J$g0)8;)svk#nv595Pn zFRVk_eYkrD=^{VIdd+OC%bYWQtbB%bG!<1k9KP zL?mH75ZO9@PtEn?x2(Bl{ECC?#;uyx@wpM|nv);@MD)mHE$Z2eu|52wzZEfp4UHze&e55_b>QWDXbaj;_69FZktC@R2ZHv)sB6FkFN?r{}FHvM#DA zv@V>$JHw)rA7fp6qK6h-XzD_}*6TV4r|*>zWAg zRSfz0nRUP!&gg%7ofUyU!QxNxdr?{OxA;4=toT3IS@UOEC`Yxqyzl`0ik<^qz$zfD z74ki|Y|V96RQjR7IxkXK7hyjD{=Ly7n_{HTBCD=k`e5>=2cw4?%jb7mWoY}mViwZ+ zaX)VG;o_ZsOdXt$WBrjZ2;QNiJqf-Eyx+H%cRvv)xNl@-&AY6{99O{0T;P5oaK9LM z;ayM|YYy%gvpuH1)5bsYN*^RmA3QwQ?SqGL7gb~}=0|g(KLXyFlQdxYc9m(7!OvTDQ&vPpZ10PYTUAb*;_n z&$V}q1GWd<{=})|%T6+;SN9^fhx2%oUoQcL2QOfCV07MShRCx~)8V&j@|ZO;}@ddC#XDL!Cv%%H!m;vcYo@clh}gC|9I zw_X`NG6mi<0p4@t1bAB^#_@tkqVDSG?&j6eefGTQ;p*L}zeV?19r+K|-%0O#h)eQA z;xV$d?h~S$linw9<5&ZXC3PB?d(_w*e-iTPUi9C%+>5sMt|{SP93OQS`syDRgBP5) zrs%+8;B(;w-Wlf9e`qe!NSWk?Qoocdb%M`Mo=+aNmoPG(X(gWDYaf_GA5KK?Id2na z3uDr5uBjTIh)zB`fjZHL2PPmJCr~H)@L8mbv}4}_;rZ*p-@ps!qW^vZd3X-wVJYNc z#3K*iw|af~Y{)5<8*u&(ULG~f&JtN`?4WEtPxF)#6q1Mc4&y~mYjBFo-DS+?;K#ZT)l zQL^kL`flST9)5ZueDjl5kE0JxPnIEH%{<|wcM5$J*4?XQ8R$dvQ5jQ^Wey)SGVJs0 zJM`OUwG0!PhB5!7?%N+ihLw6`SkZwa8ctV^p?=Kyk5Kllc}v}uN|x2lBVTZ3*&*Q5 zE6aYcS7ceU1%4i%!2HMZ;=EkS^WuW{+Btl0+`$#)DC!ryQp@eW2MuZTbBNP<7gE9gjqzks~b zeI|V)^+H|=O*{RTUtTf)J|nN<;B}N&b>MYIUd6%d0Gr6G4Hp)tNu$uSeDZ2RS@9j3 zcJC8;wKQ8^Sp|N1ReXiQo1B%IC$eg?>aOUa+b@BQ`U;}^{%vj~L7&pMT@G2L`fB%a$g~eXNB++~F*1m}#w)KX z$Zz&7zK41=@;fq1WCw5!K97DQ-^g2Htx)+Flzq@=EpL z9>eRTUd{_>%c4#iA}6D3Ke`)qbC>8G(ua_dRR=J>SSRHb$K3(wkd#*#clSibqlX|X zMZcq*1ur~YiZ-lU1=&;^U3-2sx_0jCL4#L_%sM=K6ZDX1bn>4dudG#=6GC1=ejT0z zI=|+MHN|xc=6~&v7ASf3RoqehPRt)$R@Hn(%c}#FSD*`@yqc-_-bGqoRpJ-(9P*(x zGc3rG8P@y~tMbwU^1c}|x1{W&ZR>)U)>Wfkr1@H9@d?maVcml0A;?e62XB77xbo)5 zORI}tBn^VEf`3N1hp=G$822GKbHXQ9tuHTx41|4D%>gm5oP14nr2M^Qb1tT?JF{TU zxfafsSrOnKy3;?R%{&RV2+hotwUE&i#D2f%Y%c~<%X zt89+6XMt7xybCK~b71`lVAXKWDI;tp1%zu(0q3jN6tG={8*(2oD)@l6Jn*3|;3p!! zngV!v&noB|%m0SusdfNnYy4QG0Br-Tp?Utu&0}Ej<#`GCFCIU}G4HhL4|JYw)cvH6 zvho?wM_|9kI6R7Rc$961Zi2m^)JvA2f0m-(-yr;-W#NfL-u>k=JoiKoJuvmq<5g2w zhbh0b#KP|)3owkM4Hz?`-|fbH?N0U`_K{A^f9aj~fcHNG-hT|d|5!zs-CWTgB9`KPsBZPDQ4D1yZT7n!xx`?4A z!V6ur_-CfS0JDX>><`*J=wlA`IC#Anw1R!C>_h8s;EPE1v;q#jpZ4M{m#rMSc+1M6 z#*U7*j;LLgzIaRRkYyqKG6}!7zN59Nb)y?2ajS=#S~s+L0+D`INZ88ku-ae{>$-d> z*0{dgQ;Qq6(y7G_TNM&^SxDIGkg&_0u!hvwV4ppl%Ge{L$>EHh8A#Z@siBdx2L7mR%@g_%gdQF}gi5Y6s(AUuwB^4#h|8 zObRs&rABwv*bVVv1xczmk?6zsK%)01dqZ+`Xh(cB!RoA*)Ue$W-(|0?wO6i<*49Q> zt+X2&JG<;vwX0Sl-Yt71o=)3aNnq(3v_Ce=wFD zP4qcfche|ng3X!kH?Y-(Zb%MqbBbP`HV~5H;+f>uW8Y&^rtC}l)hDsF1FRJ&;zm1xUUUa_1FQhgY`N9 zRs;4LcAAiEp32iQQl)B)A5Tx%%kA`7Z!gBb(7M2d+Brt!&Nz4LlkTeOTV^MAj)0Uw zL{)uDz5R~S$Iji5+=)1JcqTDA95q$+j}6*G@l5XkL9Si9v(%r??n@<9)skp|-9h3| zNj){1yoT1+kEMm4T9Rp<@7mE6Xa?zaE>i@?S7~3TYAXO4+$B5%P=ZmQ6?P^GF33c+ zHTVy?SFKrDy9##!t*oiVv&!mBWQ4YdQhj6S*<>HtW&g;wI5=$|GJ+bCeLX{pH`Zi! z!Uk`R;z{=RriS~I+w4SUpw@ney=^oxVsE-O4hDd)-m#3myw6^U|CaaLE5YD!J(a}{ z#gCiU0Qy6*glvXzA3$8U^{9G zgfT?@YZ|s&Q_EXa52B1j)Na}~oDy8z=PlbAZPZ{qeEE zj2(;j+S}uUW2BmW5zBg!z~CMx{vOode7E6CcNWgAHzSNs9l{HgxH>tMwLi7$;*7nSR(Af6T z^gw(hL2|dud(SZ5lOv;vp41q}0@7Y4@tFaNam4i|k;GzI@;!>Q@u3lU?~M;S`6aEV ze8wTw_RMG!Dx9^wua}^({Lw^uAT`)$S>H_*Suf&w2~VUS4r1|Kf@d+FWq4NOxf0JN zJneX{!_$Xn5KjirJMd^#1)YzPkOm`D;tA4Zi24P{4RQ%YnV~!~gj-{G4v4-r5Z|7F zEJzI7z45Va0~x#{abf{82h*j>mAD$V`Fdr`(!c__i@ca=0(CQw=wRYlu9` z2#m^b*xh)4xz~=Oi&1ke>l;mMv#WbkV{C=pmrTc@B!~nJ)ZdpFjPLSSW!fn4nRtIy zo_21AqC+y(b&)7bPh%>GJVhX=?1vLVb$+*;I75CNeun?6p#< zBX3I#(7~#7U2eZLD(p&j>7y7iK;m=Lw1ajbWN!vG5wWs%o3(PAWo=oc!qY1@kS5t_ z%j`ulaP83~z`PkmxI(31)D1Fbp^UrZgcaHGe)fo_T3-j7CJ4&?>Ad9Qi~%J_ymKJp zQA?LNL1Yi>N7tEN= z9NL=9sIlkfcj1J{cV>+Y^=2^m@P>I(XX2wOJ#^D;S>>QTsGCuCFO&q*Wc}cvQ@-u8 z&B0W>FG1eoDVva_FpW)YPo|)?jgEo4vJ|&hr07zo-C%NV*&Hh<&@C^hryv0v>&=u^ zzc*4C2tmx%20@*w)v_>V#?Y1hQht~20g@yNaBvC;w6G^AfmtwDes$WWh2YDNiSbTecULnEnCh^@h09{jO+vHFG@+ptLCnyU0* zzabrT873V80Sf0pLI_8(2Vl}PoB(4>ZddZg?IT@BSl*${n1;}d06`VsDRVfKIJ7yd z&rIEJsnEzV;m;5Pl!AU|YsZE$B+MMi*i5#mHcI`W`JJ3BhLsO(#$3P@=aHQX3St|D z!Ml8yv)c!+!sSfuffAA`m1slg1*M;ec+3aUnAvsU9UgdFk{#+XPv z^-%&W=prrB7j&D<*l5C9k=~VF(K`qQbH%`pq13SYTf2g3R`w)GKOP!n|9EnvzAm>c zAiHK&zx|bc4G1^*-mIWCLQJVn)wR^MMG~8_wuysDH%)pCed|&H=~9N9P65RaArw7Z zLEqajmWV5cbtTE}qIUfl@KX)_rN+kSr*gCmqXAzKcSyi#v@g9*WLG!t%$LQNM->&U zMGA0g@xr9*=rQ^HRr&LE58pJL+5ropv`2J9(?-#6nlOAIaBbvL8d_&^8x%Dk{}SHR z8z13B3OF5On?VMm)QzMDfr!*F!~A$oQd=_7HMSz6ggr7gGy-9e0`s7vN}EtR6CA(n zCtrS2X%#GwK!bqYJCMW_I0M>)KuK&%DotPXq-mGcFg7}xfHlh*Tga$7QkZf+kNOoMEto%QJF)HXMWZEw~5+-^s| zLIoCG&LG{P5k0d~Qb7@n-9H$|a53Z$Vb+0J68KMJ-!|g$%*xmR!R;0z^`Sj&V;QoO zoMoaNKA^xultmXR8R;|^EP3+v_hZtF_NQSHs>UDAW!TG0L6xHU8EKt0xAe5#)gM82 zqsfFACKStdV3OfrGajZct%P`OKd?2k30A8!r_*JT*}?Q((kNM_)RNBB*l2HphHIPC zpLD4Sp~c!C(w>4~MVf)J(h_Ll8I{Q-k`T${3z19`f^3jSsHm4q18Ep$qns?z5*{2w zqp2M(+tsGYAdl`%4UP@LNQ$09v$Q=>wW&R&C*Ntr0YfmjEJK_wQN4I*i32br?z z@o$ystT=Hnf#PFeED!nRSI?o%PAU_l?9VCW9=0UMK1s?bL3om zYKPJh$W5baa0J8p`%5h&LzLF;Xg$CK`(R`sp4Rq;>pQy|TY4I5ImYxmjYj63MyI|6 zEUAgK(?7tcDz+MOT$QEhp5%)3CG9NU#{4IpgtQoh7{ij02>#11zXCb}Iy+Aqj81{i zP7fseGiedmRtc2m0igq^kSWg5R3)8EgGzI^m;LUxH-9>4x6?`s@k8w$l2KX;Xf%%4 z{8PZv&*hKAaIdiGQ>5MAo5DQPo8Dt9LpRXwfS(Wsmb;zof7N|`$?fQ$QGwa$Y`z$> zC-$cqnEsB}+0{fCon}~{$BsZVjyt!hhQ2Ay5o`3e1ben5#woWfK1uI-Gf3Uxb+Qp| zeK6sTV%V?%e{$75ve;z+^z>A29Fb;xm=GKpG;F}4hTS=W`H)?`vbNT4*>v+#E{vG? zP4U5g6MwlI?Zm%j3^RAwKy(qSE_X_BX@?w$286U!qx!*=kEVD``fA=%0-kDY#x5TV znRl~kf!tlt%+r|da9I}Up^*kvz`)C?8FW67x9IK=52Cvh83vY2R$dWmRwu0!>=3+Q zoV0+)VrC3IUFm-vTK_|0S)M|8YGfoVePXyzg3a=#)>Z@tQ%8qF7Q^%_cm!($oKhba z#xVc2Wlw^EL5Fp8w{ky%H|@3cO}!UkUK>P!k;dVs=RTRNe!C@i_{>FjE2Z*Pnd1gE@?#`>5IiNC3-wb5SR-FZD? zP5YZ-&5d4o4eh5@e>mlftyr6!2NS|tt@X70uoJv?bd6w_*3xQ7LP_#io!Gk6D3}aK zD=l!Cyux?}-2oOfS^nH1N{1{OW|fuG{v;(4A}I^|IL_`lIm10C-Q12sJ=5M2AKf-K z1kE&kLn#!tw5+N-VYG8ZOG}n-UuG{~Zd7xqsODePcD6|9SR@`{Vwkfs_Lcm5m7BP$ z0ct1KcVG#^`X%{}B$HhOy@N?WQDdWkZ7jfOO(r*fqxKf98QrjDV=9y33gW68wp@oj z55qg{hRoI*klT|!__{GM3@xgci=(dM2Hh+H_4TGCCe4oVSJY0WAPYoLT$eA$8faqB zUuG187=chavB}3%kh7xiDPxRf==~PnQlhpjo~TK-fh16Xh3ZNu1LKm}-fax^oBDW1}} z(_*n4$=K3rfj2{Vx$J%={y4NK#H3JTv-&P1m~P#mP%IiRU!F#RTG2QCiSfXyR48l? zYOP@mYB3fjlCYFOhlY&j#*VGK*rLp6%D`@80=6kJI3msJR9nA%i=pnQOk>rB!djVU zVdNc&_re0ei4sD=CP(AgJTj_ugn{iN(QSQW$)RW_%7x(0=1x$p-YKQ)*{o*WBOhp~gXBR}aH-E7K(Eeoh)0PtMShdYw2u zP9(c1a$Zc7x@E8rG`d*;hPCby57~xl%5MA6`= zpuj{{LJw#bu}0K2=w8>Trv@i&_sc;D&AvfUegD`nR9tXMmfhL3v8lBSbvt^ypMsFY zgAmng%9MeLn3{br#S#G;JO;agN5{j?51MB!g?6>M#)XHixQoi3X}cr z?lDZa6FXtr!ve&$Nm&yDb!($tKXweDA<1E|jCh~2`EB3?eFKc?Sf|$9uZ5J7pe-P4A89 zNNi1|sOVz9!NydoZ|g4ZJg}?*j9>g%S{Pa!8vHiGjPFAB_*J;Z9waZ@Mz|tI%K~v( z>`g_4vS0SBzH^59&W4`G>lzz+8roV~>RV%=t)7jIT|KeJuEvJ0wvL{z>)RW3SmSkF zjUBD^%{>@v{Mpc4zme%Xkv?BsS5pfn4?Qhyu}1WvDt|*$M+-JSH}-69?C5N2Yc=7W zjU5PaLp|Y5sIs-YWqo6ZuG1-_3tMz`7?k`T`PAP{E%h54CB$EUSUB5(WiJQD`j~pZ zwxg-5v8SVPV-qYx9f(HRoLRU*3I}LlcQc!)>qdE;HFcUcbZzQr?A+AW9P4RpZS2^1 zy`<}^@965OZ+J_0QzzzFKm^LdOvV?4F!l*%Oo*%R>PCs4ysZQT(9}0Kt8k_TqIx!T z)VDO6v>{<8T~|lb#*OF(12^+}!%VvRSWG}91%Nb&*oMaDW?#O1X`FIEJZ&3$I_q27 zn}hJxhs2qDF|hb9R_FOPjm`Df z_tbAd#~YkDX>-LfUuXCFth$3?CS44@r+`%LVLES^r1KzL0p-H%?F?@m^C=qWX>Qy= z*{JBq^sNe2VH!_5p$b#D@aGL_voB9eV|{0LM`O%ItSZY1N8^Gx)-Z19Xlo&TcW^8d z_WFjdZgjWPe+<**v^2JM=?I0h*!8XTElmwQ9rdjn$*{^NPNTf4Qi06HkmkDWF)U{t1rBPt>nP> z=V__$yvERgNpHfuaG`BICY(4oX}#f!CxSzg3F>+p+PYggPLNLOZtrgHZ0u=ox~`E3 z+0f(p?t!QQL*9&mX~JQo(YPlp9ra+j4Q(AAkU|FLU>MVx4uUXhyVgO!qMuxGk`IK^ z+0xWW*`o)!kfEuoD^Glm{DCo+RlXCSBR{zCCa0|-^*izH9c>%I+Ix83gz$oXfC=>_ z_-wltz2M>#X?S#jhitX&~5mx@9rXHBQVy~$zg#oAJ0*P zR?;@LLPTKDHf(BCB*?UF8@fc+YsSMen;Xe=H#mG7V@FsE!#Wz*x3ytJsAD>ztvAfoTPRehrgXM-cQgpDvf@x5%WXx3Vyvz{!m`7{ znf@)^^^RU;-WiVh3Jjjz?IJBS^|AddD_0!ziL`G8d%ISRai$N3Fxs%1Uh zv33k^sy4c=uyE%0hjZOa!4?)CNROeMl~%&C(y`dEv^t#WV^Hs0s8zYauwc4Xx=e36 zhWXM7!wHn9!vg65O;$Py^QCKVb7YrOuMW#f=V`Yut*718YlIFq)Z-AEi>I(~mhYrR zE1NaE!7!$4ukU~uYiw2;v1(T^jOoChJA|!@=C0BO!Zachk3Ts_#_#8|hr7^@p|8U*`?)>D<%=ZAbOBN*`<5+!PZ&;+Elt zNn2ZmVfyrcNCq-dCyeQuTCavgLU?^^tB5rR&)MNjzqt{-vwc%r7pFKnZ7|G9*U`A4 zu>+`Kb9LJF-5nr)J$2G;3JVMH#vbe#aLULP$9j#-_R9OPFw&gVtLcz=gJHz2g3V}n zst>C(;1~Ku zV-shb8~`nt^l}%_OI%X|}dz8fiK$`1=Ox;Ax5lb_|eX+_Oc zQMxYDjKGC--gg6`sjsu4Ugpw-$Go#_zW2!T8dT`cPR!jD&KcJb>qOm6PCoB9<2N)l zQ>}xVfeCP1hr&;uaMBxu_lBm8-N3t=)3Tgg;p;JZ_4XNI4~C(ibcu}=1p>q7`sOC- zT}m_+E#a(7(W*OlQT?g85^$ z#x~e8HhIdFw1IG@7siKi;kC_}W*Zv`+Yt<7UTKS#8BSY0GQ_J&s!5!JJ1m^#ZDIal+#yRDB!^2}9Fh_vvYh>9Oj_ z^Ja_}geg2}9Y%*4xJ_D)UrhAsJ7nmSpc&)RAVXm9LLqKA%MA->*+%|$wl_l4Rxkv^ znC==(T%id#Jxw??&vZ_o=o=dBd4r z(SzG}o!7TEZ0cxhZF;L}fx$soIP-6+?}&xjMqwbqi~$p8$M9*oP4$bJceCB*UC|W3 zR2t2)vTPNs*TiAWH1@!pV(h*gUos!nqB6|>mMfm+dgFrgH^Q1Pp7}BK9l9~^3~y*_ z?rx!4rD@9hE$wOKSixje^B$pxK$sF6UJ%@V)A|MdaA4FmK)ZEiU#>U}S2L7ES{8g` z1n^~r3!K`1BsLu(c1SkeCetTbaqUeq#-;6e7kiB9W6u9ge*G@>h+Tl(ThVX3=i7}3 zC)DL^ZfowMk+&K4d&9^4VWbSOiJlGJt&}$4%lv!+m9f0;Y6RztO zdz=XaS9A??iiVviL;lF;gt3zy&PA(VAWnpZF^nrbIC&MJYh!pwoTC7T#KDf|Gm3ch zWT$*hG>Rw!Whf=tp%*6)+e5gr4C5i~GK|U@pn)`wF+31%)b${)dy~O|7xU>vH7F6-Qcy2$YNg9BIROLw&bc4#^7$56MMLn?P`T zeZw`4G*ySTUvUkS&)*I=&eskl)D`+n5?!y8KSvs0IW#2X${&c+GQ%m}*mXnNB%Hck zI@Lq3jsY}40}hRa&_E#0soV({%@qPc;oQ+l9coZzvd#J8oN|R8H?(!M)H^odTyZ`; zy6}jl$-v{}4T;Z@zq148(spciNNr80=%Fc3S)pnDn5a-J$2J!%&IdSPR2Jb)|CqN#X ztjv-a?QYW7mcVcx5;MHeLgMFd3p`%e&FJ-_xd|ege ztgj1gJ0>aJzd_m##yc>{0uih{sxP}eLNL5-+R~KOZr31{-S=EbLa#K%6h3@(;qn|M zmNx)_LAshw8n4wZD?bfg0bDzaTdEIpz_jUFkNv~JnG25-@5XU_aN*Y&cU1Ylc+#8C zKob~~^&RbMvKgRXPqIqZ`yrgOG#4DH1=uM;fgHyc>Tu#mc z{oqW*0yvOy-_eMraA$tvlog0`!UY#?O>R>H`12bzgid{VL;A&uC;W^jKQL>XQc(b3 zgdt}-A`&I~=0N5w!3MoUQOd(RH!D_GrI&hq4rMFO9Gbf4jd=R-{0PsF@%#kO2|Pc= z^GQ5+;CU;aViedYE*h~bS5BPBX45oIJ|wUg-PsVY0Co*v*1#ujn6NKX@V#KjgX zM~`fGja|PT$D6r95$AZ~y>h0}ZdvcNc2qVGTK1Tnx=jzJd(4K@9{O%j(Ryz%wt%ue zgKK9uXad_hv0;;Y4%@ijp}t9Mxf|QsV(YJO#Qc=2%h+S6&Xik8>?K7~OQ6K>j=1>D zvEbpO2fizkX&i-Qygt_>C%5^H_+jjFlzoUJNMib0b+DY|z^3MWJ7DGfvYZ&4UTQh7 zzUrz=SK6R*-QV_WC#}hx)#~8a`PL(r3uDGb)-wZ!ca53f<*gcHR z=BaJN*jL?WJB=ig1s-1r(C&1lb|!;E^5Sk&VABVhox_*hKb_)sb?mqGyYbQIyVMzF zCq1{ks@=^1` zr^wE#lf&4&3fk|+rgdEboI>=B${Fz}(kGbq{Y1IW^`xGcNv%;vUy*TNAx; zo{(U~-> zk^Y$MRQb>s95Qi}Gf#VnZl|wVr^)2agYyX<6#DRk9(AeB<86*EgcO)Oe6dWQT5*$N z7e7u)X?{YwaHCWygv%eUnMK;$zZ}mv=a@>vC5`w7b-f&Ic z@>S&ip7x!78Ov8Lv!_!|CyLe%^o&mfR7u_`M6JHvkG4`b|6#X0X`bEUIK2jmR!dNa(5$Uk8VTL9|Rk76h zjul4Vqss@eOPH~Psxacr@WE-44xSx#PawOn5-M-fQlU9-2lh&@|0^|i&Lp~ zwYYaB|6OM9K!Em1&BnUrYu~y&8g!FFGM!`$A`ATw8MaOb(yS*tA4mW6@){U3a9pu1 zxh)R=EU6vlY?wY*<)q0vca4+v+9@9aIg>NpF6_i<_Q`HlgQELgiP`Kei>WX!8aJ1Qqd5g^N>CjG5lxK$`XlQ{4yWszesaWC*Hw5{l~0iKT3WDI1e7 zOj5}Cd323FNBn+cPEm*8BOZ@#-5TxfjrR3L>7!ZxpbxwIaB5Jw+!=z%B}0IVZgVyh ztpo$B8W=$O9Dh)T(a~{mSNtDq9)>g3JK(+FZM2#9U@7H9IJyhI=wt#^1zE~Gx(%mF?oG?~<}Eu2%c(M8IN`i8#dr&f zcIRLvo(MQG(r(b<8XWC)qd0S2CIFFlkKp9$5Ksiaww|`D36P-+U%QP0E#p%0dS5)Q zcp#%E;d}G@aXphQxnHz0Ltj2E9M=#^_huDkhoQblln>*K2^;eFi zQaHhjVdc2vs9jp)Z-ZO7f{m4XVe_^TeW(D`@+wa{x3D}o(?@>AmsGB@mPn83g zt1AlU=!bR0@sH^r&tWND6;T|)Q9`)*6kW!^0v4tmDmm3Ku?q+3jQ*KrmWe1bHGloS z6eOQ~@mdSh&Iv_15OAD!^8mYub?Vf*J_9S0)8~sP%2Hlvlnz|&xB?=#TexE|}=gWsF zkOtc03(DU=1`J{Ifxe+1RA3i9Zh$nNw9Gd*{It5afA0&r=AM|df@G>P8S8HCrw>bew zIuiW}xKgB1a?3`Z2v;M?oIy7<30#W@ZECPokI6t?{8MQAW&{DfniBS*RM?FBNXHLn876D=gW~ z#x|km?w*76e%pf^p=}fx?XZUXzd-F>eX|#zXxhX>9>< z>9Myjt^6db>NLl5u^X72HDbL3&!kdA zm1dbZ*I1=qp?-6yBuDU#Un zr;^H65-0@@8=;F5BXD=>?+fDD)yD$)q;p#xAEzW|`XJS9(<+1uKl?RLS#a5^Jl~Mw zX=Yp|R{)7P;it?Hfe&-X2PX|dfPk-F#*2L@80p2ON)=2&^=75=>l%=2ZmAyKnm1sH z*BD+^#0+j*i8rOpd(wN!4T4|wg-R8G1f9SV7@AcI;@o<&|*(MOEU$ht$VH{OzQk>2I~;B?r?u)A$b*yjoyVP2- zJwCc3Gc>}dW;DKID{d#!n*khArciBJh7=UlavfVng1W4Z`VnAJd6loCV62NjH-_1~ zgHPOyp;g9zwpw!Vwvl=17F~JQ_I?o;omxi76w`Q5*P4upbG?wO2ooMx4!uW|k8c&{ zhuNQk$Y=fjP#1|yAGee~{26NSuN+_^WF zR4!Xd82$C>6);4&;fjZzPN^Yz0f~^er(E*D(<#-(9o$gsUh~39%!vPMqt3}hi4{8* z987;PIpGCWSbeKy^F8qB{2Iq7$)OkJF*~f!jW6x#SLx!0^{M;>#Qi$!H|n>!n-$tU zJ@m=`7wKQMwyu2mK^(yV%bh~X(YMkKK_K;dT^d}P)_Qd_nc~OO$j|=Mwgj+9@${@~ zfy^{@Ady?UvUXK3Rhy7NSt1kFz9yxaAq<*Si@JtZCvfw}aY5xs#^k3=!zF^s>)dFf zA5DUBI zQZxaRvHDGA*f_R1(bnGD*45eFj!9HwYa6yLcQTmoEsZS_Mi;VHBX)jvwUwH^O{&od zZy3aa0W=G?OC&bK9J_(DU&CoOfPQYb>`2vevGOCT=Na$?#7M;?ef4cGfq3- z0(hK+lW$C%7GTv1Q+{EEtV2Q$9A!1fvn8VsT@f zIH3+?*TE`HCO#I-k02G7*c^;XY&P`*1X6{!?b6R|E&vFP)7B|xcMZgz@w@5l`JrJ< zZLT5Z8EnJfUjqu(b033asM~rMj_I;o_zy{#)d%5ecsT$G0M}XK(!%We7;bRFz6eQ@ z)gK{gvic+>jkjMyqTRl6B0;}EqB}Wcr`6aF#gl`Xdw--qos14XrB9vUV0p%FlcP+B z7Mue7<(kO_<}cjOz|~S=v>3i>^QXDx8|pee?0a^;X|m}HMup^N zZ=24hbcj-`H$75|8`&}c!P`pphJ0uH{>=N{*l5YY|q?cdH@t7*hysJ!+V_>3y-Vo0J+suEyLh`l&ZeXb~OUHVxX1=tR191 zN00H{Z$tW`7C_KZAhmvPCEzEJ1>O+Sm|GU-Oy1ZWa69mMfzFjLAAH&Mou%6|r(1QW z7giFmtO(ndxp!wPy(-I|86n_4>@ill=?WU6R&aCA3Y^FA(gCe~w17D#E6h9M;9(B? zvQ~g@R#c_I$M_fgEN)kAMY(p>rf5}5w5rptqN^*<{kQCE+yo?+w{&K7te1BWD(*L? zENRy$E8=Fa>v5MhF#yzEJAOkVxTKo~iZZ5G!34p0tiQpe&E3yBC9m+o>L@2k!L(+R zR!CCI4=;Af(vk-QKF@i`vmT(O07OlB)EQQruIZJ@LyYa1Zy1Agh`t$!KZ_Tk)2wooZ@AXR_AV&A3%2 z$}=C}wMy%@o47d*n>%UbwB7Gy<#O2~`N*@d5Y>lW|h95%QDy>|@P zCF1%6b4yxvOYHI)mvp&xil1R*%gHSV{l8J zvtHr6pdcuj9MH0i%(ieOnpOy2*cmXdkLi{8(B>jx5I%M*_l)GkD-LkrbQD2^+^MQM zmuXQK>h@HpPNfh)b`0megh{gE_jGZ(0gP%;qm;TciU^e9bUjcA`;BjW zBj8|Kx2;?VahG!yt6p{TiMGM{mTL!mt?fx8pUDVQ_{HZh#XzGb$u8zhH4 zAIgX@L@R=~A31MFiS9liS@woDE41&@uTICF=8ik2=Yerdl`sW_?rU!KQO7L6Fll~* zN~}(?^x<-GzutPP@;uuEl0$OdoLY`^FDO7Zpn&AD*EUX3XH}&+T5-nQ*G6~z1NsoV zg(}Q!BxKXi+6K`isRw{_pNh} zj^r~NRy=9g-z5z^1Zxx=omcG%muq^lX^tDjWf*`mvEN`6?=rpBd7H5U&k?f;$GPOC zjmLFJ{by<5%xOStm~xOBI#6J@5$rj%ZD%sO>YHn^emjt|M{Vl3>iuT*PW6>z+2uic z$Bw94y^apSbmT4Z9XHua7GM76H`@y_MIYO_(7yCid+`!OQH|`G)J<~ONp>WbY~b8iRf*vt_nJ|o@R#e_7sOh^ z-DsY6p;-ctKTlU6krYm)KaOdv9Ac+_z-4H4gij9kDbFHHf}TW{U~22kDF;(fv|xO| zln@%?_9U)Z%wW?NbWWHQ#q;A)r+G^WZvqqwae0 z7&_B1N(_0DGnWH7ct8ulLGz$oPpz#iY#1j(4h_kiYl|^BqO!p;%@dUii7Fn`l%oGpJ5B52l(=HMw6Ag7&GBq6WWuwDVdZit9 zov1COE>i%~Yg(1A%#1V*>lxTmeK?YYg*rRnLx_`8nRxlK$bGmllhU}0sh*q=0iDa# zBv86KZmCPeo;F`Odd8@BC*73T``%W2?8=ani2B(aiW?ymT(Msy9G8TAh0c3sev zT2t@_nB4~I7$~$Mj+K(uxm%a&)m;(KHr;{CwYFe9((=(>(8j z0E>6`cex`(EiTH)P{%$xs6w+vkRJ@O;RT`(Mh<*RE|~uG;B(J(w|o1u3;uYhZR$Fl zZe40eRSoX`@9ccR)TkZ2(mzh%)h30z*QY}OAUgl}eFgG1fsW+x7&aDZhXQ73UZn{q ztS^Clh)vunOc@mz2h!gSyRbn&?H~Z285oSoxRPuBb_^zmk{NA=HRtdQEvQ+^sX1F< z%&HP)&ME^CaQfO|;_285<1=hLOFNn+A?9h=OY00|b%fRVM3ek|O3WDEm%vO0X0S(3Uaj|xF{!Hez_3B8P6U20_3Ai@k-UD++j^nLM z`!-a|4&vg1b2`1dnzRd8<-7-`u**3ylo1R{<=}UGDC%X4>E=g~Qox$aJTPF^ZfsSh z7LKAA7`E`G0|yIa6k$&TXrKNp#JJ2)M9X`U=NZf!erbWJ_c)-#A`aJ`6PPX1UM7>c zg2KWg{EO&+GXnpLPw{W&Z~1T5tNhO@xVY#|JIgJr5VY{(`jaQ8@NQjw^5m=wNNs2T zoyEXe44lQlSq%JlV4zGFT6A-VRq&426|~R3*vcTR5>MuuBCCu}@gouZnX@)B8$b6J zexPWoBvOsn4;8#Wa?gyri{Cf%u33>Qi!7`38A*9m{(e*benb8qmcRchf4?q&pOC+g z%ilSwf^%5!6rPEWB5NNV@~ha@dFwq2sqtIZi<+#H_~-rQy#VHE*Y8{O?-E2174ueG z7WbqMysgM0hDH{sy96G4y}D1}&cy%?;hzC&&cQEnP0_}G2(peZj)=@#i_G)zO;lIl zIf~8ke4oVcEc|xiDZ#@!(b|#6KOC`sbMj$}@!X4N51tR>*^B2v zJp1tM$MXd|e~ae;o`ZM};duvD)V zJhSl3##4r89-c}(m*BDSEXGrfXBnPaJgf1n#d9T|Iy^BvoA5N_X~)xr=Q=!Z!*e5^ zK0E_>2JwvG$>7E#B(Q}DLnV!*^TF3JbUnb7|&ij58~N}XFr}V;Q3oT z2k;!ka|q94cpk@d7!Uv5Ix}KTtw9}cRNo(dD`eza^?n5J{5KCcC=dy#Izj&KzPiY|QQp)a75`n-tm0ond{-k-oN{ z#F({>g9ZY&u?NaQW8c;8g=c7|V1Og5Lig=KEJ9wA*N7cuYK`tW{T$qI(w zKp5Uuaxe4#-e2PHjU{hpc+X{c?<;wp?>7>jfs%K#%&o-UpcT0V0L_^BH;5>`o@Kt_ zoMuE6N0!T9hRh#S!-FoEWpcn*nov!E)atuRQ>0=0${b_Bf)xg6B2X%+E8`f3mEL88YYhm})*# z&3S>LuanUCA#~RAJq#sBnN`Er;z$JVWlUR%m$}X##LP#)dFQ_!Q6;Y{d;>m;Bg}IC zA2MWtgv^Pq!rK_aYy8%V%8|C#fw4?M*e4WiyyO2mwRbb7z8sF!9D2b3c z}eSj5*)F~Rw7=mT4 z;>f?_ZyAa8$9SZ9R%DFvYkosiMe%3$m%fg;IZKgs_LrG#&M~~6yF##b0TP_s#Mj9A z2%YnG4w{)uNev5_bX+Q@-aqFSsk{dKWX=Q!c3~v4h(EK6E|#Cjdr)s-SiD2Ckp-!;gxA?&d&Ow*=pSfP!)8h|#9ft){ zkgThb;B{|szj<+-UF&`qy!CaLyI)DBUWaTt_dEFgG5pcrd-xr7;}7!tkKOq1;FbSA zg(MN{kJ0)7pErW)S=3pm7<^F!G87)6Fpek&A5jcGq8NNcG5CmL@JK=iA1M$9A1PD} zUP}yer=ogNMv=?sBN5^AMcI5Fh2-P&RVe3w1D_|HhR^dojL&l*89pD!`+p~&=O8tF zp78kje9`Ifd8MIEkIyshZ^7pY>8bfVQ%#r8Gp)no6*oLXJ}@=JO0LQhc68i&-NNpD#KyK3}Bxd^2hgK3}AmJ8Q&}(<1&Tjt*u(jvi4Q zT{!Oun9R9M3C?>X-VNtvxZ%8fpVx;!1y>ibMTY+r+*`hrVUz;1P_AKFw}USQSeDV9 zKRn|s%i04(y%MS^yW%X%65>6}va(cDQpcSCJuFM9rUd$xV_BnQS>F>S)$kv%EGUC2 z?0~SWD`B~hSmV$uBL!2);LN7YbiRKUSk~Fu^ee)$sMQ#j#rH5R>+EbA;`8im8aSXr z^S^jD9a#=#XU=WpY15ime+=B`R1@n%NTVj!x9}}wV$D)!GMT7%-@}WUSU-t(quw#x zsCRt7=nwIy;9nw~SR2MyaPKUzK2EMx__N@b7i0dczCH#jy`bDAMx=GzI+QWD`1kg7Cncz>+mwd;P2sMJ%Shh6fZaO zrJzLFt{0w*m%|LX5HG*xOBG%S>cW+H*^L)#5m#8bO3I=a*5l(b#y8_-6loS+iLd;f+n@_`-_*o-d^+?Z`SP!Ld6F;B;N@J{&KLdwFKhVn zbG+>3OA)F)iWh6q+YnTV!oJ7C;`k`T8vDW_ywvbz7hZ<>avNU$iZ6HlzxLh+%&M!r z``+iAflR_AA%O&pBpC<4)B$yC0gyAa;FfzkO6g@M{Il~-t<|A{?1js`pNk~E} zt=L2pD;2b;Sh3|*tQe!kiWL)ZF~b!A_( zXRZHUU-w$;UiZ4!z1P_b&llzS3p_I}!t((<+wnx>hm&m`nT@*y&mo2B}jjBCP0 zuuSTgnb*QgnO9NYtGhkCIv4x;dgWE{#BRcWl{rTAi8&(t+Isu?qSW&lje&`|x+rxf zBm2?B-1OMn9iDb4p3aCP+)0Gr*kpGS!Fkt4so&a%YrA6addAe}szkyhvFIx%sR~o8 zOp)1aoA*bP)M>AHGx1V4n$TA~nDAevRPOl|3IB}=|8>DXF`I<~8$X()9Ry>Bz2(KQph=%x4Cs9p4(^-j{zvjpx-5a|4dK<76E zI=>;%`3-^AZwa*iXwoRS?-j;6`Ty9Qjb+mLjaAb5jZM<|jXl!&KLER@oZr|Xo&Qh6 z^Jvm5#N(!-f9or1(5EbtrCLKJl4z)ky5Wxj`m=xC^=Tr!q(A>*mi*G0U(%nALi7J( z$*)%YkFAu7^`Es;D()Y~N@+@c>21_J8uWjZ{(Orj$g77)BznP@+VKt4mY1U@*yle- z(|9?WfSaD}2=Ih0xc%8T@G z4F75;@-Kf0o*8(ak>_SS9c-(wU5IDJC_K%0(x}q4Z@_cCJOw;0@|5xHl;<8ipTu+J z!+6F%%D+}h`zckbeFtFD%kaDxPZ3Wv_QUu#5dLa3)Y^{$-lXu);Q0%AzKrKP@_ZZ5 zMeKg4{UM$k<#`s*+vRxy&lm7SV=rKu+)ie{QDzqceyi}y@La?@$gvaf>>>EC6nqWf zn>?+(9?!qYb1R-}*k@6@6we#vc`crY1J4iTS&wJlI5Hde&-m)etoHkO zHu9+UCwLxH7}r%vZTK8!@bR%WJU-Tj$6IY!!4rZuJRxYq6M{B8A!x%Bf;K!MXu}hN zHawv_)`lkpZFoY^h9|_@@PwcZPYBxZ)nd_!32k^nQX9Tnoi;I{4NpvH!xIzQ@Wg~R zJTajSPfTdToi(ZuJb3fVOy?yp3sJEx%Rm&*ZQNY z)tNSDr_q|6oj;)s+nn9=gf?t*w$E+O)*oGcCa#gyfNhPOHhi^4FHeFtJZVDEh9?AV z_-YM3OQ6$e4S~*|(1tC6?s-BRwglSemO$%|uKri$oY00RCbZ#+32k^{LK~i#(1s^| z0CsoU@Wg~RJTa*aU;WFtqD~v0WUD<;8}494RYmg|pza0O0|-&=&GMVO(yVLQ8f7+C z`At{m^}E}9m60JlJ+2X=c;~LYTjp(E`l>hZ#O>Y6EF#nNc*Pmghc|WS9K70f$A-Ho zwd2$LAIj>_JU+;X9?Ezz;JbixYF?L#&V!`tR7>XBR7-Vg1^4XjqLa``0F@g`gG}bk5`iS=75`oyZ!~Os4Al z)rPF0{G8rByl4Ux=JJSD6K5Lm{AQCRuc#}}<=4$o>I$V_LYSrTO2PHOD0%=*qbeGX zpd0Y2^>gB|#IBIkQ`3n4hu9U8p2LPuyDKF9_AMsUuq!0}ST|3!`|n)}al1m~x4Zu` z(?`&xX7^v_T204xS4igi#}(b|{>$7TzuocK2WA^`gP<{>!}K?Zmgc|1w#))9nh$w2B_PDDk?!O5H53SPk8g+=MIbTenr&j>n?mul6bi4nwfzib6^KrG_dM_!?(G#=#Z^*-2 z@eZw0znb?IL;hF~%fCV6WV>rNt>rgFPN&fD3>6SMp8yj>=NUa_9{ zZjA=>zT&+1nF!kbcivx{2-+2L-rp#K+5LCk=#(CtT_MA+Q7@QXA;YG9-BA2({twr_ ztAFD*)r-uokYU&VLQSRJf5SfU1;WhkzhR$JG_(7!W}0a=?f$D-B(K>Oa{m8npoDYA zQmfzjUUf1NUe9gn%2tpi_|3b5^UtL8+`KC|Kb@9;WHG9F9VXx*9R5-8X)TL48f*Xh3G;Glb1jU6!p^M}QpL2C2r+P#x zbHT7-ij@MMdw!f`7O~IsInW3r2${_?qb8MFG(vIDA4?9?h;_ltIMFRHQ0sO)oe zq!N+0D^pXqyv)>nh-gqV)sKGcR!DpKkU0A^4L2qMN3*JcI9E6;z+ovZ=&lR|D@APr zlHzyu23?Tx4JfLrLNEQ_+Z!+1a+f5UigtLZ;xCQA-*5cA{nnRhfDasjVaRECU4D6L z`iSKWyw$^QAHo1E%qV?)1= z^Zk0&+5I{`*{>6l{d%?SSM{~w1(8c%|Hu70nA}F54~fO&u!@OA%rn$c!SpJgJm=y2 zQcTrvyY*$NQuQC-$1k%+zx7t;jB_1@F5-DMqGAp6UgcNgDq2|*^DgDMXn`+^W=shba7IV}hAHd1`=^yQmh}6%Y5k=>U&b_6pQZn{f~J)>_OizR zZ>U!^pr_PrzFA$+G<9HPJ95TUcDV3CxpIy#RZZ=r`y)dtUi5DJNwDnvMUC@#fGQk( zq$u?8kU4|a<@?ip#X_lUlL5M2SbsN9b2c8Id+g~gXZZ+p-p131wrmhz!|yD&tp#8P zFLal>r|^4rzNV(HZ*@i(n>@9hq871`){kQ{yQ@-{UjfR6)F|oX)W$*#O7gv^E62ea3`2SnW&`#mZ zm(NY5XI;Ft@#FCD;>GtaUbHy#-g|Caym)bD!fn+*SemXI*>rE?qNSM^_ZyGBqkQ{AZaFx20!~$eedurvHh|Rphf}@dKH=Z)=*@xTN}qW$6>C5sU6m z*N@!1V9A!oKguln*`myt`^?bNFX&$yS}zSP)*4pB{=Zm(*CwLO`_9wQ%G`U;ed);~ zA54ycar&)J7Mw49e?G*hInq}PEc66 zvj944<<4q8tlSgJ_;#)7vAA*TJ4d`A+;k=1Z4}m}#eFO8VBxhq_rK2`EWDm@|6|C3 z;bp>Fx&04-s;Iz!!)GDSs)y(}$?Z2%S~~u}|4ih-_7Lucas2*`oWp*biKVNi3e#rv z_H>nupF30AGgY(kxKCEvk7QPU2D7U6cZWv}gsWV?U#7C0ovEskM4%jP&iNhXn9r6d zAHR{u=2Kgp|W zCR7I>zb;2IT4nQhX59hLQK_@1kMpP5)Kud5sBAgPX3KZ$%;`v3nseT=z2&|r%Monr zO6H-;S%PB|B`N*@MM+7RUc$Vn! zBd$GaSj8w-RurzIL`>QJ-KE}qdlm`75dq|$5CW17hyYtHjqIq{!$||?AIS>qbXuTl zN42os-OX_WcynzViyTu~mYB$KRIrSJQ72ELEaxv{?<@9qK|{8^cz2fevL$valISY& zIdRj_t}V?&Nh@1+uBU%3hy8M5*1Ep7t}Gu>?`b!ud}K|t##FU)%vZEv>5AI9)2G|d zqt#B~^p|BEQ@(75bvw*tMy03N7OI`n(cLozD`Wc|Q^;RtY(CmPrK4%lT>jrxC>7Qg ziiPsVn>!0wN4t@TYPh>X%VjszQLPQr^>2p$T^m|1W(n2N_9PV-d#K+UR#^cZdPc04 z<=nGuPe%veho|W}+X}Q=f42@XpCL9>i&+MXYpuTc!_Vn2Zb-Kc7p-Wvg8`yAmp8Da zOu)25Z(HsB@ukqp6bZO+UC?rz@cyGp2RaG}q5GLx4jlx_eYo zPcP?zb(bw)aSU29SGbnv#B>F(HAigP5vG}sCN*P^{z6x?LW3L%(x*34Ra9}6JIKbdDfQJxAj^tdZeue zTZ$Q8)Bm7+trLvtHq7gW|FN{U6^m0Uo}SJ6)W|Bgxx!3HV$U-F4Bz)fD;g{_WV3yG z+^5Hitt#lmkF1fKH1>MT`FXg-gq8?(d6rC`{lw5iDqOfro&l;(g~B}zMoj42Y*Ds} zk?~PI_t2>2k*XDsRLS3J@UxkpS54T7*Ib%knz&QZ>+AzI{or9YJxMom{>c?P<=32% zif*5bv(R{#^WR*x{BPt=nSGDuktRtcB7vNG?sNDO^?5J6a9La~KisrG2##K>$+XqP zxvMgcCgoagvX)cNJ%oJf1NF*fJa;NuE~k}yNOV^+22UI?hphkLxjX!cO^*n|j%B z`Qv;D_j%OgY2Z#rbvxy*;m${RRd>vQgS8+q5;v-e9k5mQP?I0w`T=o1<);Ywpb+oa_i!yWEL!;%7 zRJA=qkJu~FZs}D#(H>~5i`!*0NltL5qLp%<;U3Bm>5Inil>g;am+`d_=YH$mhjY|= z)fVC#(t7qGt~h6!eR_a`pELw+FgeQqEVo81)MmNyK8mAXF5?wfnN8f$%Ew`t_j8lE z9Pvv!dTXOxwKI<)&s=2}oQm50qpf(hbEl%Boac|4 zPF4w^#pat;}9s~p=(c@@$`JEWr4tvJtFugg9`s?EWh>25O9q>0jA$W8C0CQ;^#UVN&OS0aVKVze@v=zMb&&gM zZV2PQxz6z4j)P)g{-O&spDNgGDwX#G<{ZR}nd21QGF)Dcm@W?U>1UC4wQUqRwxG6< za=A~LsQwNjK55g)v1yt^#F+G2LMPdXa%LNEYa@<6u!-=KqhhP0`x@r#O)@{ayh$cmb95CMYKw7&`(?G~(6WXHYv*qMNIV~Yg-lsVX zL!2~B(IQ72`!ISyUrMe0*2bZ7uF${uN&SQ?V!sKkpD=Dc-?ku5{rGY9i^q?v4E{Y5 zQ{EV5Fs1s1%f{Rvjfn-Vs656!+_8aGW+-l_o<7Ar)`j#LHYw5aS8U*4g0h{8_B8jn zil~%1NL&)R~4|aV*gq7-Vlx3srYKc8$%is&osb)DwlCPeILB~zup6C#JJ(S zNKHjK-{Z#+1C5ZGiq^_ekDmjpipre=RwAyIBWV$bCDT7g9t>wW`q)b$`gnQ20o%drt}Ux>HGJiUDlPR@8+MVhi;Y6zsY`kao(rLS&`Bd!fat`2F|`ZPO; zC{|*2mUEK(!U5b7cR2wSgD&nvWwM)lXw;8#am7yg_i?A975j0H8ShFt;_#6!|B4|H z^Zq5F^aR)M^u&#=2p){xV{(b=$$b%t5LaLqWZ8CIultqc+4q5U{H?y#B5(XW?i&iyzCt@kj_QR8iqBMR&ss^fvsC*C)ir>j)j5#x==b`DrH zkCw}^5m#=(yWKop`8dul<876*oBKRU)Hqh}3m>w<%GtJXt8bw(JZdzdtG43Uh%Isy z8D0%(Vv0@@(uzbUG$_L{Q=cKU)`T|uLga4a_UlpkA4SXZYi{|an)z_~4=2LqKamKR ze+$L<^z!d8*sf>gS3P~W{3jCO@~aX)T>evuaQUA}gv3i8M8fXyJZgI#Y|v;*O4haZ}Du;KE@?LfHv2-i4&`C~c>m*3J=xt|=`L(7z@Ay>HJ-E4dj~xrrdU8 zJe2>S!Pqr0CI&hzABc|Qrd*5VkNF5Yi2RcgT0Ynj*gT;A4)Ev!C1BR^-?E2!ZEYi&&n~c4*_LwU_&6Ro&d>!~Li zx$!pP*r}vhMO7KmvTCGbZ3qaZ#xjVKjKD!j5&wu!Fqg=A(s+wPE{6;)xA->bZfqUf}T5^8imJ zW?D>ji@xW1>V->UnxrzWVk=ZJi4~c*pj$O!_VNP(?{S`NH??V1ZN%Q_?5aYmAuBH@ zXS}U)Y%k~KY_LyNM{y;YiMsI!3)Vw&wi$1W91+aZ&^IeYq^?$q(!n_}$#xtavw>Ir zxxi$)x(VkF>$NE?$ErGLBcYslBGwSDuH2Oye@z~*C3}e3NLr>#rHO-utqlo83_u3Uf z7#sP6JQqjBVafC(37|kZw;1oLkaD?Cnb3h(6KR7@BgYcAGDM6?7jd$E!L8Lq9B$Gy z%TZauVkA^&1LfEZTLTfzA@5dC_(CE!nl#JhtTEnPCr;UT+e4ampQefsYr$%1#cRvS zhjLm%n!HcbN!M>R-5(DJJt}h#=dG4i+4NuL89m*^J#cJ;^Qjb z7H)5Iv9aP5igraZ#YSu{iZ5ck&4n~3p8mxtwLUd;`Osu8<6;d#g1`>>oUdyyk4|wT zE9HpYV}=pXLXt2!N*RYG(?4p`FPEbvbbUy<+^6KJPjiBZ)h6O{Ig^ZcWr!FvlZY#u z%v-nMY&YH(IV!6=zq zbmbYGDnnX}98r26C92(}unXJTwgk%K-1U~iQncDPE3FvFSRK;DtU8+<#UYsc>y0Tz{w8k5atlt`cvs3%8QxezHVJm!>5KQq5*s`i zhs6YWV~LAuY#5$6%ZxD>)>E);xz(QPg*@uyX0q~+CIdx0gv(LIV`GVLg|mz$Gl`|_ znOA)&)x2@5w2jmeK?PEn9A)NgBR<~&wvk!HXfz2{$`S2Dm21Kn@;fvyUm@vCb}njG zY&*HeGs#Rs?c7%k6J9LxdkH;Z=CQmSMT|$HqFcQtFGo{l9Olbb`t2tDayho3){t_! zPnj5{PZRNsO(VyqSs5b6qjU?Q+f2k3IV!-)`SlDFp}jUxj-BaO9>V)=^K@k(A|5

    B?C+^~T#O zr-3_Zv=GkO;6QGxZ;OL5MXM&o5nB{rkr~$^O-#{NLfqP655r7L+=LdggV19pZHpAQ zIwPnPs&<^sZl?Nga-)dLd5XJo|3iqdA{k*tETno#@|QLTIf`GILx`{<86o5#&1167 zLC#|9mA0a!Q0Ci75v2ps>2hXqS78W$*-rUdxQDQHW5vsMhNQ8O^kv8lphA@1=-0SS z+ze+q%0!QS4oRy)BVl@;;4_J3y98{J^FeNy_%M!Lvoyo)Yj+tF~KW^f#kh65^+>F0aKq%RQFc#0_n7ltHoik`gDl{Uv#Ml3Sut zVgAzUempeIY*uT3%9?D zJlo5?&xQHtlD~(z)kdQEcV9Ed+Hih%U_4DRrdY1t7*h<_w(-V^I04#tj$Gq0)#lnf z)ni+=h4$NX#J4QEHO3l84AL0$@lh_FBdv?CG8(rx#={Jre4}v)uQ8s^HI}YSWR9$e z9*;2_-MO|@TRJo7+vd8$tvP8#!@hBEEr~xH4u_V|b8>^rg9QW$aO> z@ql|trSL{v-(IO`l-ZDa+_j%@f$)Qg_z#1RCGZyTQwcnf-nS86v>y%J>KF4Dq`MiC=$LW&9%?vF-C;KS=!3@2QNxWp{|bb&&WwIIAd0 z|D+Fw_&W!Qzjt3{{8=9k@%If9|JWxg(iwE zQhmH%uJB~S?Pn&%{})8pgS~v=1DVkRu>XCN%F`EB{co6rUkCQ`IE7)P9qi?I3i(|G zC-Zv~*v}8L$NbrV^v_-u=A$(8(H_E&?zZw7_Aj|M!%UFT(eMkBm#l`M(v+wzH@XN8!7` z2N*w8(cmY*tv^l~epUF_z^5ILS9sVxiBgcjE^!?KEV}YLM!G}<- zI$it=sQB?4tx~T1Yr*xH4-UHU>%m89uX zM;I@zeWWREc_L*_=u&y_0PjQH^6mX@@Zon`(}KeHgSRI7=O4he?+^5U6FdeL&Zqx3 z@Q&3X{}d`x^-;SJP=4ov>%ScG9|eBuV|Evu!ue)k)X1lC>m0qaz~%R)&5A+c%fLsj zOGQt)`s#Du)sw5tn&TpVTv1T`Uxofy58nKlblm@M29Hm)&%400m!zVt@TKzqD{%D^ z=44m?7r=Fi_}>BVxh7@gnd1Kh-1KwOyZA4Fk8TO&k3l7z4Zld!R{TleD$EqJ35edQ zV1L!(xea{uP};nnQT!KP&Opm9m-xbu zC_fBgwGMv({A5FD{{!IJiTZs3d@`Ggh+@*805430XHaQd=ntRY%fK@eSf{>?VbUqP z^5%edGamhTS`9w^laPN0__@RA6fXW|@Q%mQX5JP3ZvnR?%6|{IrZ4c{liucqIK{f4)(0$s)uLbA6moiIpg--)detRm~;=*qM zKXb_H9|~UvE?$v}_Asu6bqdMq_0}FKT!%{ktG3f$RFpStwF z09VoeTOHQfek11~KOFr!J7VTjX>($W((A;B#}WFqE`AI6^hZ+B4u^B#JRj6GEKJD(-vu9*-C|ERr3gF9)Q$u9mi;F{aR_^1ch z?q$rm@KxXgas4li-UvQ6HH@zZ!5i)f^63$9Rf67kfVVOq^!oaO4=oGjeGI(kf^>Ak zmG^mY!xz)hE{DGdeg=6plBKEY^8$F*D^lj=tnkPhBEBpg?RNY+8N4CUp0|Jxe>d>w zQt*~UcmbUIaLDg}ftwzO2OPcI!IM`6`T2fu3-i+!N8jIq{d#RU{P;<5`RR1re*X*} z|32m%7ylXXY?RcZ!@mVTxrjD%<(d> zdmF;|DuMTXHf;=VYOg;Lj{9eHvp$2 zz8`_tV4Cs#avFT<^~hWoUX2N2M}j_`o_Po*Rn{owKLdOc`s!W$CE$h;=z~|-@EmyN z*STHz8^PNW{J0)GDKWnP416RJ{&w)_xW1#J4}$k3==n5wbt3$8;Qfj4Z-Eac@Q=a8 zRn)=B)900*$?brn?>y#V|2+xmXCuIMMBe4XCxZ7r9Oj=Jz)#V5vt0kr2aiX7+-e+P@6mH#dy;2f@c~Oq-vysXcdr>l;J=e;8Z`Kkaw<{XKY7qP{wJ^!OJ-dA|fd z_ue4iU!b1ezI1W=d~+b_8Ro;|F2AwEY41e)%mVM8OPyT!9PqX~z^;Cc;3^g!HLm^E zf=|Z%H7e=_&%7thPY;9lG2b3?`TYok%BC-+rJ@`D`E$ZsnU7{U{BiKCtAac^46Y-x zEUIdsZ-I9_LjSq=zX0c8W>jnwoHoU!%M-{uMYF`8^E*qp`f2%?*{L}DDb$8{~-9-57SYTo8R9Gek#$PyTPl^C)~B) z$G`_ag3NL0kAfe+J8gavC3?RN-jGYh_!r=PuS`cLU3w}Rok-+=G5FA=bgZ9E1UG#p z&_7G@*P_3=^oziIzn6~2yYkn7Hzeds89W?)JLkgh10Og{8#ufJ+`GfB??vy2z_Tge zx6h}+t$!NUS6>G|j{T<9rT?MQC-_$;$;lt1PhJ0=3*P_LFdx-|55OOrUHY5A&m`)< z0$c}k9&_Ps;79kT%sUj(R|ZdNWQ@4*`@zR1hWYO?@DcRg)h_(6!DkZre-V88zQ7;f z2e0`|m=B%>Z{HNw2SZ0f&mCcY90lH+sP8r4SqXeI_?ZWTe3%bD_A%s*>#tSd+KYmG zz60EuNPi!A8}n;}qyNp|H6IQ0-MhehwukZjUhwG|VSV!<@T?D|%rEWKUY`UX|Es`1 z-vA$a5P9P0`3X4pWGbFN(wETQyj1l4f0^*Nm=9e1S>Tx+A^#?D^p$j6-bV165#;am z$A`hyGP-iXD$!1G%hy8skAg=g!oL8X`DNP7#IK2tgJ(|)`hYoQFcF_aJ>u{5NWNbH z9(gnCKgWNUf^(OL`b+_D`-`+W6i@9l7kp|TJnQP$1fHD8UxyiX{;$9fcYO}n1DEKQO zpDzTDc~g+jmxHVRG0^i$@Tm`m`TADyu8#!zR)Xsi`FDU@*MlYRN9{R+Ee-k|Gn?XPOIe15rcaJVSJsN(0 zf-)Vx0DN*jWxDdmf@j@8pb4j*;N1!RZXWo_3p3_h1?umW;D$u}_26g51^(XxZc2nd z2Cn+2RLuXoz}r}#6-{|H(H_N5wBLuoBc1*JqV&bl6X0r$eqP=l0hhOh_0V^~YZB!> z177&fFrJHHhUgXeGXNahEh|1^dFeX!@v0UwI_<)fRv3?rv@LRxp68Y;0&PV?kdR_Pjz}0U|$NJbu z!F9|Ze!P4R+?lBVx4_$v2mbjHc=X3Zd;c1IAhCWQavANJNIx2U0RE#&Mt`^l{Pg#c zH|PuM|C_)qn^^BV`j&u?z9Jpdy8=A^{pd5UeeVDt{Nr?V#-+a>{51XN+grzpp20qG z+?BTnyyxN|-#-N|zAwxNUj}bZ(ED9*)m!KTm;Tq_HLM@^JA5worQ!YXsH0~Rxb}ai zq7yFsTJV{Ke3}P7UBJHJ>bDZShr#Iey-Qe+Z~7*vWXzi)vbPn7o)aFnnQ{YDu5PSQ!o=gEU`_2*>aheP;H;M1=O_L^q!?)TFNuKilU3wH(iSW6d2k(9;)UN|PdQU2rmv@7=@sgyypZ{Qt4sfn z;JsgFzI5%O1AAMs$9aDJF?iCe!+iWa_|WuBbQI-C^bY5hczJC)mcLhlw@{w0i_(`y zb>QABgM7RhJb6{%ukXyHeG~L8A-o#ph9PS5e=WH7T|u8Jf{!Ko>jCh|_XPfV47>?p z`Ls*FPw799ibg|{=shUR;M(NEzXYz&1byM#;5F3uh>QONa4sPqegbZt63WZeB40nl zoaXv>1i1CD1OH9|w={>xoWR{&?^~+RNjcz^4-QF99F^a2QV=;O+ky>>-=LCz+pmU4DN8KAlMa zZt&j3c=#0f)E@nq@vq3AE8Y_Ac%KtEU=6SrIaQG0|e=k()i7$b7zY89B_4}s6Uz>`@&yT=5p!c9l|10q6 zS8~uRSn{xXJpGZdM_dJ7vo5UXzK(pKl&H_E2;ay0c~;7{=Tfjj@vwKA-p9uKoXA;R${0 zXW&hV{D)qRuJ@ZDzmGFcjCw=C&vFZ;6pd1WBc&6;40p) zstC!yM)0=8e4Gb2ynuXl?YSO2@{gI{UH|+Ucye=S&-Z}KiTdpa?@8bT;8{IkzWow- zB=*zeuKdgx^1Bh>@b?rS{r_=?qlwJ_iS`%?J{`{wqoS+8`~D)(a~-(+aqLa5ee1zZ zyw6|l@>>l)HZ8pG>jeAnCu=<339f&4SkFEP-hF*4whz7){Ahxn-QegQtZ!Up zJq=ug{MhX3+W_7dx7VdnGq~!9=nJm=cJT0fgT7n@H~nSM=k5WYyduc|2f;HFFV=5_&_4R z5wD=Uhp^YU_Ps_puJ5R5CU`jZHm`5Z0oR`j`fmz7?@%JYM#2wMKQ9kffse)c@qQ0{ zG!g%gz~TMYsOVwv_+%pu4mO8ui z_28!y^?e<9^URd_fu{0%Be>kh`q%N(L*Rp75Bk@3@L}}NdKbP6%wYvlqs#xJ;3KaK z^Y=mUm=(N#cHu|CCllrW0Q_76p9XJgpbcIA(JM*#DsC>iHW~qb4tvFRgKMI3;M2>o z&pUpZ20ohTkL$rRZ%Ub8!K!|9!IS?s@JlmzHTCoSxCUI4D6b42oxl%(cQg2luKc%w zx7{Ab=X=3*pA7x+G4Lt+b2RZa9~}bcK8cKX>AwkH$oj;OuM^-syf5|jdlp>YoQih2 z_*IkP#{@m2z|VY=@#)&@8t~qYVSRZ6xDNiwx%6|ulhJQHKQ0H?eldiv1s|rc4K98W zyfwj(4}e>L8`|qJ@JZxNttW(y`Uk-$=7#-OkAb7_27B21z^9p?>s|bJ((z*w^zI{k{2zt=KYs^) z?ukI}QSfBugM%);KIynH(H^5qure)!q*&uf%lV*kiL)X=}*3G2mGgrAA!"P;MPQW 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 // open +#include // fopen #include // mmap +#include // usleep /* global variables */ -const uint64_t BFIN_CYCLES_1uSECOND = 20; u_int32_t *csp0base = 0; #define CSP0 0x20200000 @@ -125,6 +126,8 @@ int mapCSP0(void) { #endif LOG(logINFO, ("csp0base mapped from %p to %p\n", csp0base, (csp0base + MEM_SIZE))); + if (initCycleCounter() == FAIL) + return FAIL; LOG(logINFO, ("Status Register: %08x\n", bus_r(STATUS_REG))); } else LOG(logINFO, ("Memory already mapped before\n")); @@ -133,10 +136,62 @@ int mapCSP0(void) { uint32_t *Blackfin_getBaseAddress() { return csp0base; } -// usleep is not viable on blackfin -void usleep_bf(uint64_t i) { - uint64_t j = i * BFIN_CYCLES_1uSECOND; - while (--j) { - asm volatile(""); +/* BF537 core clock; refined from /proc/cpuinfo in initCycleCounter() */ +#define BFIN_CCLK_HZ_DEFAULT 525000000UL +static uint32_t bfinCyclesPerUs = BFIN_CCLK_HZ_DEFAULT / 1000000; + +#ifdef __bfin__ +static inline uint32_t get_cycles(void) { + uint32_t cycles; + __asm__ volatile("%0 = CYCLES;" : "=d"(cycles)); + return cycles; +} +#endif + +int initCycleCounter(void) { +#ifndef __bfin__ + return OK; // virtual build: usleep_bf falls back to usleep +#else + // kernel reports "cpu MHz : 525.000/131.250" (core/system) + FILE *fp = fopen("/proc/cpuinfo", "r"); + if (fp != NULL) { + char line[128]; + double mhz = 0; + while (fgets(line, sizeof(line), fp) != NULL) { + if (sscanf(line, "cpu MHz : %lf", &mhz) == 1 && mhz > 0) { + bfinCyclesPerUs = (uint32_t)mhz; + break; + } + } + fclose(fp); } -} \ No newline at end of file + // CYCLES only counts if the kernel set SYSCFG.CCEN; refuse to run + // otherwise, because usleep_bf would spin forever + uint32_t c0 = get_cycles(); + for (volatile int i = 0; i < 1000; ++i) + ; + if (get_cycles() == c0) { + LOG(logERROR, ("Blackfin cycle counter is not running\n")); + return FAIL; + } + LOG(logINFO, ("Cycle counter running at %u cycles/us\n", bfinCyclesPerUs)); + return OK; +#endif +} + +// usleep is not viable on blackfin (10 ms tick); spin on the core cycle counter +int usleep_bf(uint32_t us) { + // the wait is counted in core cycles in a uint32_t: about 8 s at 525 MHz + if (us > UINT32_MAX / bfinCyclesPerUs) { + return -1; + } +#ifndef __bfin__ + usleep(us); +#else + uint32_t start = get_cycles(); + uint32_t wait = us * bfinCyclesPerUs; + while ((uint32_t)(get_cycles() - start) < wait) + ; +#endif + return 0; +} diff --git a/slsDetectorServers/xilinx_ctbDetectorServer/Makefile b/slsDetectorServers/xilinx_ctbDetectorServer/Makefile index 591b63095..cea87a249 100755 --- a/slsDetectorServers/xilinx_ctbDetectorServer/Makefile +++ b/slsDetectorServers/xilinx_ctbDetectorServer/Makefile @@ -16,7 +16,7 @@ else endif CC = $(CROSS)gcc #TODO: allow these warnings and fix code -CFLAGS += -Wall -std=gnu99 -Wno-format-overflow -Wno-format-truncation -DXILINX_CHIPTESTBOARDD -DARMPROCESSOR -DSTOP_SERVER -I$(main_inc) -I$(support_lib) -I$(det_lib) -I$(current_dir) #-DDEBUG1 #-DVERBOSEI #-DVERBOSE +CFLAGS += -O2 -Wall -Wextra -Wno-unused-parameter -Wformat=2 -Wredundant-decls -Werror=return-type -std=gnu99 -Wno-format-overflow -Wno-format-truncation -DXILINX_CHIPTESTBOARDD -DARMPROCESSOR -DSTOP_SERVER -I$(main_inc) -I$(support_lib) -I$(det_lib) -I$(current_dir) #-DDEBUG1 #-DVERBOSEI #-DVERBOSE #CFLAGS += -Wall -std=gnu99 -DXILINX_CHIPTESTBOARDD -DARMPROCESSOR -DSTOP_SERVER -I$(main_inc) -I$(support_lib) -I$(det_lib) -I$(current_dir) #-DDEBUG1 #-DVERBOSEI #-DVERBOSE LDLIBS += -lm -lrt -pthread PROGS = xilinx_ctbDetectorServer diff --git a/slsDetectorServers/xilinx_ctbDetectorServer/bin/xilinx_ctbDetectorServer_developer b/slsDetectorServers/xilinx_ctbDetectorServer/bin/xilinx_ctbDetectorServer_developer index 2e28eddb433284dc3754b1998587a05232736ee8..7fa4e235d5cbf0ec31b0a1880681b4745eb2e26c 100755 GIT binary patch literal 306376 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

      I~)`&IuljBjOVB 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 S&*fzQt(%)`g@BF&Og4Iq&nm8acZdQ2%L9( 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%0AP=XCRs| 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%0Dc=Cc{54|OPQq0H5b`fxCW3eUG^ca1Msiwv;pma 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 o9ha$kblYP|{;s{1^FN;kXycQeKMfPP(% requiredfwversion) { + if ((uint64_t)sw_fw_apiversion > requiredfwversion) { sprintf(initErrorMessage, "This firmware-software api version (0x%lx) is incompatible " "with the software's minimum required firmware version " @@ -158,7 +158,7 @@ void basictests() { } // check for firmware compatibility - old firmware - if (requiredfwversion > fwversion) { + if (requiredfwversion > (uint64_t)fwversion) { sprintf(initErrorMessage, "This firmware version (0x%lx) is incompatible.\n" "Please update firmware (min. 0x%lx) to be compatible with " diff --git a/slsSupportLib/include/sls/versionAPI.h b/slsSupportLib/include/sls/versionAPI.h index fb05bbf0d..265e08aec 100644 --- a/slsSupportLib/include/sls/versionAPI.h +++ b/slsSupportLib/include/sls/versionAPI.h @@ -3,11 +3,11 @@ /** API versions */ #define APILIB "0.0.0 0x250909" #define APIRECEIVER "0.0.0 0x250822" -#define APICTB "0.0.0 0x260506" -#define APIGOTTHARD2 "0.0.0 0x260427" -#define APIMOENCH "0.0.0 0x260424" -#define APIEIGER "0.0.0 0x260807" -#define APIXILINXCTB "0.0.0 0x260813" -#define APIJUNGFRAU "0.0.0 0x261002" -#define APIMYTHEN3 "0.0.0 0x261022" +#define APICTB "0.0.0 0x261027" +#define APIGOTTHARD2 "0.0.0 0x261027" +#define APIMOENCH "0.0.0 0x261027" +#define APIEIGER "0.0.0 0x261027" +#define APIXILINXCTB "0.0.0 0x261027" +#define APIJUNGFRAU "0.0.0 0x261027" +#define APIMYTHEN3 "0.0.0 0x261027" #define APIMATTERHORN "0.0.0 0x260529" From dc6f2cd058797112232460869f15392d0b5c8af5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Erik=20Fr=C3=B6jdh?= Date: Wed, 28 Oct 2026 11:32:03 +0100 Subject: [PATCH 02/10] dev/ [Xilinx CTB] Fix DAC driver file path in LTC2620 driver (#1641) * [Xilinx CTB] fix DAC driver file path in LTC2620 driver eb525e96b (#1631) silenced -Wformat-nonliteral by formatting the DAC driver file name with "%s%d", but for the Xilinx CTB the names are themselves printf formats (.../ao%d and .../ao%d_pd), which gave .../ao%d0 instead of .../ao0 and made fopen fail on hardware. Use the name as the format again on the XILINX_CHIPTESTBOARDD build, with the warning suppressed only around that one snprintf. The non-Xilinx "%s%d" path is unchanged. * binaries in --------- Co-authored-by: Dhanya Thattil --- .../bin/ctbDetectorServer_developer | Bin 295884 -> 295884 bytes .../bin/gotthard2DetectorServer_developer | Bin 240244 -> 240244 bytes .../bin/jungfrauDetectorServer_developer | Bin 286160 -> 286160 bytes .../bin/moenchDetectorServer_developer | Bin 266136 -> 266136 bytes .../bin/mythen3DetectorServer_developer | Bin 262568 -> 262568 bytes .../slsDetectorServer/src/LTC2620_Driver.c | 14 +++++++++++--- .../bin/xilinx_ctbDetectorServer_developer | Bin 306376 -> 306376 bytes slsSupportLib/include/sls/versionAPI.h | 12 ++++++------ 8 files changed, 17 insertions(+), 9 deletions(-) diff --git a/slsDetectorServers/ctbDetectorServer/bin/ctbDetectorServer_developer b/slsDetectorServers/ctbDetectorServer/bin/ctbDetectorServer_developer index e505763a31f00a5a8a604af6097a794bfeb76841..c3dc5277e2ce10667b24b523e8b717e54162a0d2 100755 GIT binary patch delta 41 xcmX@pE_9|{Xo4p5!{c+NK4g|?bZK>AY;|GU>cXt5!D!K*rNO*COM@jT8UR-=4qgBN delta 41 xcmX@pE_9|{Xo4p5gHt9`A2Lfcy0p45wz@EFbzxT3U^H*f(qP`6rNNRE4FF3p4fg;5 diff --git a/slsDetectorServers/gotthard2DetectorServer/bin/gotthard2DetectorServer_developer b/slsDetectorServers/gotthard2DetectorServer/bin/gotthard2DetectorServer_developer index 848800f00c0691617f0b2cd735ce52976e78bad6..00714c679367d0aa02ca2ddca3d7146cffacc52c 100755 GIT binary patch delta 33 pcmexzh40H1z74DfOgw$f>;~J}4H(t_Fj}LUufkcHw0fj^YwL}B04gola@(u&H@(u*vPK?|U A8vpLUufkcHw0fj^YwL}B04goiZ@(u&H@(u*vPJovX AwEzGB diff --git a/slsDetectorServers/moenchDetectorServer/bin/moenchDetectorServer_developer b/slsDetectorServers/moenchDetectorServer/bin/moenchDetectorServer_developer index 69af8031f9f11335d8543b840cf8413d3f3c6d5b..385d20902156263cb5677d18cd9be359cdfb7d1c 100755 GIT binary patch delta 39 xcmV+?0NDSSpAeXz5RfSY;m4$xVYC7mfkcHw0kuQ|3EBZThfdl8w@%svN;N*64;26a delta 39 vcmbO+Utq?3feD(-4^G)mPu#*J(dg3Z!noCiiSrhtdAr{&rtN;Wn7vE^GlveZ diff --git a/slsDetectorServers/mythen3DetectorServer/bin/mythen3DetectorServer_developer b/slsDetectorServers/mythen3DetectorServer/bin/mythen3DetectorServer_developer index 60da29927b6fa9799744d08c182f8ada1021806b..8f54e637e55259ca3c5d692ac1685d2de772e9f3 100755 GIT binary patch delta 37 tcmZ3{EU=oacuuFvGA$Y|bf7s#~TE|58E0{}P@4)y>5 diff --git a/slsDetectorServers/slsDetectorServer/src/LTC2620_Driver.c b/slsDetectorServers/slsDetectorServer/src/LTC2620_Driver.c index 21db6fed1..6180c5f10 100644 --- a/slsDetectorServers/slsDetectorServer/src/LTC2620_Driver.c +++ b/slsDetectorServers/slsDetectorServer/src/LTC2620_Driver.c @@ -94,13 +94,21 @@ int LTC2620_D_SetDacValue(int dacnum, int val, char *dacname, char *mess) { // fname to write to char fname[MAX_STR_LENGTH]; memset(fname, 0, MAX_STR_LENGTH); - snprintf(fname, sizeof(fname), "%s%d", LTC2620_D_DriverFileName, dacnum); #if defined(XILINX_CHIPTESTBOARDD) + // driver file names are printf formats with the dac number in the middle + // (CURRENT_BOARD_LINKS_FOLDER "/ao%d" and "/ao%d_pd"), so the format + // cannot be a string literal here + const char *fnameFormat = LTC2620_D_DriverFileName; if (val == LTC2620_D_PWR_DOWN_VAL) { - snprintf(fname, sizeof(fname), "%s%d", - LTC2620_D_PowerDownDriverFileName, dacnum); + fnameFormat = LTC2620_D_PowerDownDriverFileName; val = 1; //-100?:Invalid Argument } +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wformat-nonliteral" + snprintf(fname, sizeof(fname), fnameFormat, dacnum); +#pragma GCC diagnostic pop +#else + snprintf(fname, sizeof(fname), "%s%d", LTC2620_D_DriverFileName, dacnum); #endif LOG(logDEBUG1, ("fname %s\n", fname)); diff --git a/slsDetectorServers/xilinx_ctbDetectorServer/bin/xilinx_ctbDetectorServer_developer b/slsDetectorServers/xilinx_ctbDetectorServer/bin/xilinx_ctbDetectorServer_developer index 7fa4e235d5cbf0ec31b0a1880681b4745eb2e26c..c9b913eb01d6e8281e0b592b5cfb2eaffe59a646 100755 GIT binary patch delta 32308 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%0AEp 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 delta 32469 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 diff --git a/slsSupportLib/include/sls/versionAPI.h b/slsSupportLib/include/sls/versionAPI.h index 265e08aec..76e7ea009 100644 --- a/slsSupportLib/include/sls/versionAPI.h +++ b/slsSupportLib/include/sls/versionAPI.h @@ -3,11 +3,11 @@ /** API versions */ #define APILIB "0.0.0 0x250909" #define APIRECEIVER "0.0.0 0x250822" -#define APICTB "0.0.0 0x261027" -#define APIGOTTHARD2 "0.0.0 0x261027" -#define APIMOENCH "0.0.0 0x261027" +#define APICTB "0.0.0 0x261028" +#define APIGOTTHARD2 "0.0.0 0x261028" +#define APIMOENCH "0.0.0 0x261028" #define APIEIGER "0.0.0 0x261027" -#define APIXILINXCTB "0.0.0 0x261027" -#define APIJUNGFRAU "0.0.0 0x261027" -#define APIMYTHEN3 "0.0.0 0x261027" +#define APIXILINXCTB "0.0.0 0x261028" +#define APIJUNGFRAU "0.0.0 0x261028" +#define APIMYTHEN3 "0.0.0 0x261028" #define APIMATTERHORN "0.0.0 0x260529" From 720ea9d66b748bc12549f1b15f63d5158a7b739c Mon Sep 17 00:00:00 2001 From: Dhanya Thattil Date: Wed, 28 Oct 2026 15:08:04 +0100 Subject: [PATCH 03/10] dev/downgrading m3 minimum kernel- #1642 (#1643) * downgrading m3 minimum kernel because the current kernel is for g2 i2c3 driver and many m3 boards with this jan kernel version around (which is correct) * binaries in --- .../bin/mythen3DetectorServer_developer | Bin 262568 -> 262568 bytes .../slsDetectorServer_defs.h | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/slsDetectorServers/mythen3DetectorServer/bin/mythen3DetectorServer_developer b/slsDetectorServers/mythen3DetectorServer/bin/mythen3DetectorServer_developer index 8f54e637e55259ca3c5d692ac1685d2de772e9f3..42517d6f53e065ed25f1b9d1b62b7a08746b6166 100755 GIT binary patch delta 49 zcmZ3{EU= Date: Wed, 28 Oct 2026 15:33:58 +0100 Subject: [PATCH 04/10] receiver: removing idle state check before setting threshold metadata for m3 (#1645) --- slsReceiverSoftware/src/ClientInterface.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/slsReceiverSoftware/src/ClientInterface.cpp b/slsReceiverSoftware/src/ClientInterface.cpp index a88688b77..0e3663633 100644 --- a/slsReceiverSoftware/src/ClientInterface.cpp +++ b/slsReceiverSoftware/src/ClientInterface.cpp @@ -1618,7 +1618,8 @@ int ClientInterface::set_threshold(Interface &socket) { LOG(logDEBUG) << "Threshold: " << arg << " eV"; if (detType != EIGER) functionNotImplemented(); - verifyIdle(socket); + // allow setting threshold metadata on the fly + // without checking for idle state impl()->setThresholdEnergy(arg); return socket.Send(OK); } From e953350b812bf65d074b8f2613de02c9c3c4af75 Mon Sep 17 00:00:00 2001 From: AliceMazzoleni99 Date: Fri, 30 Oct 2026 11:58:51 +0100 Subject: [PATCH 05/10] dev Fix/color bar pyctbgui (#1620) * Histogram of activate image is updated * Revert "Histogram of activate image is updated" This reverts commit 292162738400514dc162bb93ef4b8e009b4c35d1. * added color bar levels and spin boxes for each counter * added color bar levels and spin boxes for each counter * always disconnect histogram levels auto update * disable cmin, cmax spinbpx if counter not checked * dont show counter cmin cmax spin boxes if not in transceiver mode * hide counters as well * added tabs for each color range update * changed color range mode from all to auto * renamed widget in plot.ui * updated code for all new spinboxes * removed print stuff * activated counters not needed * always update colormap regardless if counter is shown or not * disable all spinboxes per default --- pyctbgui/pyctbgui/services/ADC.py | 7 +- pyctbgui/pyctbgui/services/Acquisition.py | 10 +- pyctbgui/pyctbgui/services/Plot.py | 366 +++++++++----- pyctbgui/pyctbgui/services/Signals.py | 2 +- pyctbgui/pyctbgui/services/Transceiver.py | 32 +- pyctbgui/pyctbgui/ui/plot.ui | 561 +++++++++++++++------- pyctbgui/pyctbgui/utils/defines.py | 15 +- 7 files changed, 667 insertions(+), 326 deletions(-) diff --git a/pyctbgui/pyctbgui/services/ADC.py b/pyctbgui/pyctbgui/services/ADC.py index c18e5cf9b..8e7a5c0f6 100644 --- a/pyctbgui/pyctbgui/services/ADC.py +++ b/pyctbgui/pyctbgui/services/ADC.py @@ -179,9 +179,8 @@ class AdcTab(QtWidgets.QWidget): viewBox = self.mainWindow.plotAnalogImage.getView() state = viewBox.getState() try: - self.mainWindow.analog_frame = self._processImageData(data, aSamples, self.mainWindow.nADCEnabled) - self.plotTab.ignoreHistogramSignal = True - self.mainWindow.plotAnalogImage.setImage(self.mainWindow.analog_frame) + self.mainWindow.analog_frame = self._processImageData(data, aSamples, self.mainWindow.nADCEnabled) + self.mainWindow.plotAnalogImage.setImage(self.mainWindow.analog_frame, autoLevels=False) # manually update image levels except Exception: self.logger.exception('Exception Caught') self.mainWindow.statusbar.setStyleSheet("color:red") @@ -193,8 +192,6 @@ class AdcTab(QtWidgets.QWidget): self.mainWindow.statusbar.showMessage(message) print(message) - self.plotTab.setFrameLimits(self.mainWindow.analog_frame) - # keep the zoomed in state (not 1st image) if self.mainWindow.firstAnalogImage: self.mainWindow.firstAnalogImage = False diff --git a/pyctbgui/pyctbgui/services/Acquisition.py b/pyctbgui/pyctbgui/services/Acquisition.py index dcf06707d..e7293a10d 100644 --- a/pyctbgui/pyctbgui/services/Acquisition.py +++ b/pyctbgui/pyctbgui/services/Acquisition.py @@ -133,7 +133,7 @@ class AcquisitionTab(QtWidgets.QWidget): self.view.labelDigital.setDisabled(True) self.view.labelTransceiver.setDisabled(True) self.view.spinBoxTransceiver.setDisabled(True) - self.plotTab.enableallCounterCheckBox(False) + self.plotTab.showallCounterCheckBox(False) case readoutMode.DIGITAL_ONLY: self.view.spinBoxAnalog.setDisabled(True) self.view.labelAnalog.setDisabled(True) @@ -141,7 +141,7 @@ class AcquisitionTab(QtWidgets.QWidget): self.view.labelDigital.setEnabled(True) self.view.labelTransceiver.setDisabled(True) self.view.spinBoxTransceiver.setDisabled(True) - self.plotTab.enableallCounterCheckBox(False) + self.plotTab.showallCounterCheckBox(False) case readoutMode.ANALOG_AND_DIGITAL: self.view.spinBoxAnalog.setEnabled(True) self.view.labelAnalog.setEnabled(True) @@ -149,7 +149,7 @@ class AcquisitionTab(QtWidgets.QWidget): self.view.labelDigital.setEnabled(True) self.view.labelTransceiver.setDisabled(True) self.view.spinBoxTransceiver.setDisabled(True) - self.plotTab.enableallCounterCheckBox(False) + self.plotTab.showallCounterCheckBox(False) case readoutMode.TRANSCEIVER_ONLY: self.view.spinBoxAnalog.setDisabled(True) self.view.labelAnalog.setDisabled(True) @@ -157,7 +157,7 @@ class AcquisitionTab(QtWidgets.QWidget): self.view.labelDigital.setDisabled(True) self.view.labelTransceiver.setEnabled(True) self.view.spinBoxTransceiver.setEnabled(True) - self.plotTab.enableallCounterCheckBox(self.plotTab.view.radioButtonImage.isChecked()) # enable counter checkboxes for matterhorn + self.plotTab.showallCounterCheckBox(self.plotTab.view.radioButtonImage.isChecked()) # enable counter checkboxes for matterhorn case _: self.view.spinBoxAnalog.setDisabled(True) self.view.labelAnalog.setDisabled(True) @@ -165,7 +165,7 @@ class AcquisitionTab(QtWidgets.QWidget): self.view.labelDigital.setEnabled(True) self.view.labelTransceiver.setEnabled(True) self.view.spinBoxTransceiver.setEnabled(True) - self.plotTab.enableallCounterCheckBox(self.plotTab.view.radioButtonImage.isChecked()) # enable counter checkboxes for matterhorn + self.plotTab.showallCounterCheckBox(self.plotTab.view.radioButtonImage.isChecked()) # enable counter checkboxes for matterhorn self.view.comboBoxROMode.currentIndexChanged.connect(self.setReadOut) self.view.spinBoxAnalog.editingFinished.connect(self.setAnalog) diff --git a/pyctbgui/pyctbgui/services/Plot.py b/pyctbgui/pyctbgui/services/Plot.py index de455720a..78a0c471f 100644 --- a/pyctbgui/pyctbgui/services/Plot.py +++ b/pyctbgui/pyctbgui/services/Plot.py @@ -21,8 +21,6 @@ class PlotTab(QtWidgets.QWidget): def __init__(self, parent): super().__init__(parent) pg.setConfigOptions(imageAxisOrder="row-major") - self.frame_min: float = 0.0 - self.frame_max: float = 0.0 uic.loadUi(Path(__file__).parent.parent / 'ui' / "plot.ui", parent) self.view = parent self.mainWindow = None @@ -31,11 +29,27 @@ class PlotTab(QtWidgets.QWidget): self.transceiverTab = None self.acquisitionTab = None self.adcTab = None - self.cmin: float = 0.0 - self.cmax: float = 0.0 - self.colorRangeMode: Defines.colorRange = Defines.colorRange.all - self.ignoreHistogramSignal: bool = False - self.imagePlots: list[PlotWidget] = [] + + self.shownCounterImages: list[bool] = [True] * Defines.max_counters # per default show all 4 counter images + + self.showtransceiverImage : bool = False + self.showdigitalImage : bool = False + self.showanalogImage : bool = False + + # color range variables + self.colorRangeMode: Defines.colorRange = Defines.colorRange.auto + + self.digitalcolorrange : list[float] = [0.0, 0.0] + self.analogcolorrange : list[float] = [0.0, 0.0] + self.transceivercolorrange : list[list[float]] = [[0.0, 0.0] for _ in range(Defines.max_counters)] + + self.digitalcminSpinBoxes : QtWidgets.QSpinBox = None + self.digitalcmaxSpinBoxes : QtWidgets.QSpinBox = None + self.analogcminSpinBoxes : QtWidgets.QSpinBox = None + self.analogcmaxSpinBoxes : QtWidgets.QSpinBox = None + self.transceivercminSpinBoxes : list[QtWidgets.QSpinBox] = None + self.transceivercmaxSpinBoxes : list[QtWidgets.QSpinBox] = None + # list of callback functions to notify tabs when we should hide their legend # follows the observer design pattern self.hideLegendObservers = [] @@ -56,14 +70,16 @@ class PlotTab(QtWidgets.QWidget): self.checkBoxCounters = [self.view.checkBoxCounter0, self.view.checkBoxCounter1, self.view.checkBoxCounter2, self.view.checkBoxCounter3] for checkBox in self.checkBoxCounters: - checkBox.setChecked(False) + checkBox.setChecked(True) # per default enable all checkBox.setEnabled(False) - self.imagePlots = ( - self.mainWindow.plotAnalogImage, - self.mainWindow.plotDigitalImage, - self.transceiverTab.transceiverImageViews, - ) + self.transceivercminSpinBoxes = [self.view.transceivercminSpinBox0, self.view.transceivercminSpinBox1, self.view.transceivercminSpinBox2, self.view.transceivercminSpinBox3] + self.transceivercmaxSpinBoxes = [self.view.transceivercmaxSpinBox0, self.view.transceivercmaxSpinBox1, self.view.transceivercmaxSpinBox2, self.view.transceivercmaxSpinBox3] + self.analogcminSpinBoxes = self.view.analogcminSpinBox + self.analogcmaxSpinBoxes = self.view.analogcmaxSpinBox + self.digitalcminSpinBoxes = self.view.digitalcminSpinBox + self.digitalcmaxSpinBoxes = self.view.digitalcmaxSpinBox + def connect_ui(self): self.view.radioButtonNoPlot.clicked.connect(self.plotOptions) @@ -95,14 +111,24 @@ class PlotTab(QtWidgets.QWidget): self.view.spinBoxPlot.editingFinished.connect(self.setPlotBit) self.view.pushButtonReferesh.clicked.connect(self.acquisitionTab.refresh) # color range widgets - self.view.cminSpinBox.editingFinished.connect(self.setCmin) - self.view.cmaxSpinBox.editingFinished.connect(self.setCmax) - self.view.radioButtonAutomatic.clicked.connect(partial(self.setColorRangeMode, Defines.colorRange.all)) + self.view.radioButtonAutomatic.clicked.connect(partial(self.setColorRangeMode, Defines.colorRange.auto)) self.view.radioButtonFixed.clicked.connect(partial(self.setColorRangeMode, Defines.colorRange.fixed)) self.view.radioButtonCenter.clicked.connect(partial(self.setColorRangeMode, Defines.colorRange.center)) + for index, cminSpinBox in enumerate(self.transceivercminSpinBoxes): + cminSpinBox.editingFinished.connect(partial(self.setCmin, imagetype = Defines.ImageType.TRANSCEIVER, index=index)) + + for index, cmaxSpinBox in enumerate(self.transceivercmaxSpinBoxes): + cmaxSpinBox.editingFinished.connect(partial(self.setCmax, imagetype = Defines.ImageType.TRANSCEIVER, index=index)) + + self.analogcminSpinBoxes.editingFinished.connect(partial(self.setCmin, imagetype = Defines.ImageType.ANALOG, index=0)) + self.analogcmaxSpinBoxes.editingFinished.connect(partial(self.setCmax, imagetype = Defines.ImageType.ANALOG, index=0)) + self.digitalcminSpinBoxes.editingFinished.connect(partial(self.setCmin, imagetype = Defines.ImageType.DIGITAL, index=0)) + self.digitalcmaxSpinBoxes.editingFinished.connect(partial(self.setCmax, imagetype = Defines.ImageType.DIGITAL, index=0)) + for index, checkBox in enumerate(self.checkBoxCounters): - checkBox.stateChanged.connect(partial(self.displayCounter, index)) + checkBox.stateChanged.connect(lambda state, index=index: self.setCounterCheckBox(index, is_checked=(state == QtCore.Qt.Checked))) + # show image Values for analog image nMaxY = lambda : self.mainWindow.nAnalogRows @@ -110,7 +136,9 @@ class PlotTab(QtWidgets.QWidget): frame = lambda : self.mainWindow.analog_frame plot = self.mainWindow.plotAnalogImage plot.scene.sigMouseMoved.connect(partial(self.showPlotValues, plot, nMaxX, nMaxY, frame)) - plot.getHistogramWidget().item.sigLevelChangeFinished.connect(partial(self.handleHistogramChange, plot)) + plot.getImageItem().sigImageChanged.connect(partial(self.updateColorRange, imagetype = Defines.ImageType.ANALOG, plot=plot)) + plot.getHistogramWidget().item.sigLevelChangeFinished.connect(lambda _histItem, plot=plot: self.handleHistogramChange(plot, imagetype=Defines.ImageType.ANALOG)) + # show image Values for digital image nMaxY = lambda : self.mainWindow.nDigitalRows @@ -118,7 +146,9 @@ class PlotTab(QtWidgets.QWidget): frame = lambda : self.mainWindow.digital_frame plot = self.mainWindow.plotDigitalImage plot.scene.sigMouseMoved.connect(partial(self.showPlotValues, plot, nMaxX, nMaxY, frame)) - plot.getHistogramWidget().item.sigLevelChangeFinished.connect(partial(self.handleHistogramChange, plot)) + plot.getImageItem().sigImageChanged.connect(partial(self.updateColorRange, imagetype = Defines.ImageType.DIGITAL, plot=plot)) + plot.getHistogramWidget().item.sigLevelChangeFinished.connect(lambda _histItem, plot=plot: self.handleHistogramChange(plot, imagetype=Defines.ImageType.DIGITAL)) + # show image Values for transceiver image nMaxY = lambda : self.transceiverTab.nTransceiverRows @@ -127,28 +157,39 @@ class PlotTab(QtWidgets.QWidget): for index, image_view in enumerate(self.transceiverTab.transceiverImageViews): frame = lambda image_view=image_view: image_view.getImageItem().image image_view.scene.sigMouseMoved.connect(partial(self.showPlotValues, image_view, nMaxX, nMaxY, frame)) - image_view.getHistogramWidget().item.sigLevelChangeFinished.connect(partial(self.handleHistogramChange, image_view)) + image_view.getImageItem().sigImageChanged.connect(partial(self.updateColorRange, imagetype = Defines.ImageType.TRANSCEIVER, plot=image_view, index=index)) + image_view.getHistogramWidget().item.sigLevelChangeFinished.connect( + lambda _histItem, image_view=image_view, index=index: self.handleHistogramChange(plot = image_view, imagetype=Defines.ImageType.TRANSCEIVER, index=index)) # sigLevelChangeFinished passes the histogram item as the first argument, we need to ignore it and pass the image_view instead + self.view.checkBoxShowLegend.stateChanged.connect(self.toggleLegend) - def displayCounter(self, index : int, state : int): - # toggle the display of the counter i and update the splitter - self.transceiverTab.shownCounters[index] = (state == QtCore.Qt.Checked) + def setCounterCheckBox(self, index : int, is_checked : bool): + """ + slot function for the counter checkboxes, enables/disables the cmin/cmax spinboxes for the counter at index, updates image splitter to show counter image + """ + self.transceivercmaxSpinBoxes[index].setEnabled(is_checked and self.colorRangeMode == Defines.colorRange.fixed) + self.transceivercminSpinBoxes[index].setEnabled(is_checked and self.colorRangeMode == Defines.colorRange.fixed) + self.shownCounterImages[index] = is_checked # TODO: maybe I dont need that self.transceiverTab.update_ImageSplitter() + + def enableCounterCheckBox(self, index : int, enabled : bool): + self.checkBoxCounters[index].setEnabled(enabled) + is_checked = self.checkBoxCounters[index].isChecked() + self.transceivercmaxSpinBoxes[index].setEnabled(enabled and is_checked and self.colorRangeMode == Defines.colorRange.fixed) + self.transceivercminSpinBoxes[index].setEnabled(enabled and is_checked and self.colorRangeMode == Defines.colorRange.fixed) - def setCounterCheckBox(self, index : int, check : bool): - self.checkBoxCounters[index].setChecked(check) - - def enableCounterCheckBox(self, index : int, enabled : bool): - is_transceiver = self.mainWindow.romode.value in [3, 4] - is_image = self.view.radioButtonImage.isChecked() - self.checkBoxCounters[index].setEnabled(enabled and is_transceiver and is_image) - - def enableallCounterCheckBox(self, enabled : bool): + def showallCounterCheckBox(self, enabled : bool): for checkBox in self.checkBoxCounters: - checkBox.setEnabled(enabled) + checkBox.setVisible(enabled) + self.view.labelCounters.setVisible(enabled) + + for cminSpinBox, cmaxSpinBox in zip(self.transceivercminSpinBoxes, self.transceivercmaxSpinBoxes): + cminSpinBox.setEnabled(enabled and self.colorRangeMode == Defines.colorRange.fixed and self.checkBoxCounters[self.transceivercminSpinBoxes.index(cminSpinBox)].isChecked()) + cmaxSpinBox.setEnabled(enabled and self.colorRangeMode == Defines.colorRange.fixed and self.checkBoxCounters[self.transceivercmaxSpinBoxes.index(cmaxSpinBox)].isChecked()) + def refresh(self): self.getZMQHWM() @@ -231,29 +272,81 @@ class PlotTab(QtWidgets.QWidget): for notify_function in self.hideLegendObservers: notify_function() - def setCmin(self, value=None): + def setCmin(self, imagetype : Defines.ImageType, value = None, index = 0, updateColorBar=True): """ - slot for setting cmin from cminSpinBox - also used as a normal function - """ - if value is None: - self.cmin = self.view.cminSpinBox.value() - else: - self.cmin = value - self.updateColorRangeUI() + Set the minimum color range value - def setCmax(self, value=None): + Parameters + ---------- + imagetype : Defines.ImageType + The type of image (DIGITAL, ANALOG, or TRANSCEIVER). + value : float, optional + The value to set for the minimum color range (default is None). + index : int, optional + The index of the counter (default is 0). + updateColorBar : bool, optional + Whether to update the color bar (default is True). """ - slot for setting cmax from cmaxSpinBox - also used as a normal function - """ - if value is None: - self.cmax = self.view.cmaxSpinBox.value() - else: - self.cmax = value - self.updateColorRangeUI() - def setColorRangeMode(self, mode): + if value is None: + if imagetype == Defines.ImageType.DIGITAL: + self.digitalcolorrange[0] = self.digitalcminSpinBoxes.value() + elif imagetype == Defines.ImageType.ANALOG: + self.analogcolorrange[0] = self.analogcminSpinBoxes.value() + else: + self.transceivercolorrange[index][0] = self.transceivercminSpinBoxes[index].value() + else: + if imagetype == Defines.ImageType.DIGITAL: + self.digitalcolorrange[0] = value + self.digitalcminSpinBoxes.setValue(self.digitalcolorrange[0]) + elif imagetype == Defines.ImageType.ANALOG: + self.analogcolorrange[0] = value + self.analogcminSpinBoxes.setValue(self.analogcolorrange[0]) + else: + self.transceivercolorrange[index][0] = value + self.transceivercminSpinBoxes[index].setValue(self.transceivercolorrange[index][0]) + + if updateColorBar: + self.updateColorBar(imagetype = imagetype, index=index) + + def setCmax(self, imagetype : Defines.ImageType, value=None, index = 0, updateColorBar=True): + """ + Set the maximum color range value + + Parameters + ---------- + imagetype : Defines.ImageType + The type of image (DIGITAL, ANALOG, or TRANSCEIVER). + value : float, optional + The value to set for the minimum color range (default is None). + index : int, optional + The index of the counter (default is 0). + updateColorBar : bool, optional + Whether to update the color bar (default is True). + """ + + if value is None: + if imagetype == Defines.ImageType.DIGITAL: + self.digitalcolorrange[1] = self.digitalcmaxSpinBoxes.value() + elif imagetype == Defines.ImageType.ANALOG: + self.analogcolorrange[1] = self.analogcmaxSpinBoxes.value() + else: + self.transceivercolorrange[index][1] = self.transceivercmaxSpinBoxes[index].value() + else: + if imagetype == Defines.ImageType.DIGITAL: + self.digitalcolorrange[1] = value + self.digitalcmaxSpinBoxes.setValue(self.digitalcolorrange[1]) + elif imagetype == Defines.ImageType.ANALOG: + self.analogcolorrange[1] = value + self.analogcmaxSpinBoxes.setValue(self.analogcolorrange[1]) + else: + self.transceivercolorrange[index][1] = value + self.transceivercmaxSpinBoxes[index].setValue(self.transceivercolorrange[index][1]) + + if updateColorBar: + self.updateColorBar(imagetype=imagetype, index=index) + + def setColorRangeMode(self, mode : Defines.colorRange): """ slot for setting the color range mode (all,fixed,3-97%) """ @@ -261,73 +354,123 @@ class PlotTab(QtWidgets.QWidget): # disable or enable cmin/cmax spinboxes enableSpinBoxes = mode == Defines.colorRange.fixed - self.view.cminSpinBox.setEnabled(enableSpinBoxes) - self.view.cmaxSpinBox.setEnabled(enableSpinBoxes) - self.updateColorRange() - self.updateColorRangeUI() - def handleHistogramChange(self, plot): - """ - slot called after changing the color bar - This is called even when pyqtgraph sets the image without any user intervention - the class attribute ignore_histogram_signal is set to False before setting the image - so that we can distinguish between the signal originates from pyqt or from the user - """ - if not self.ignoreHistogramSignal: - self.cmin, self.cmax = plot.getHistogramWidget().item.getLevels() - self.setCmin(self.cmin) - self.setCmax(self.cmax) - self.ignoreHistogramSignal = False - # self.setColorRangeMode(Defines.colorRange.fixed) + for cminSpinBox, cmaxSpinBox, checkBox in zip(self.transceivercminSpinBoxes, self.transceivercmaxSpinBoxes, self.checkBoxCounters): + cminSpinBox.setEnabled(enableSpinBoxes and (checkBox.isChecked() and checkBox.isEnabled() and self.showtransceiverImage)) # if the checkbox is disabled, we still want to enable the spinbox + cmaxSpinBox.setEnabled(enableSpinBoxes and (checkBox.isChecked() and checkBox.isEnabled() and self.showtransceiverImage)) # if the checkbox is disabled, we still want to enable the spinbox - def setFrameLimits(self, frame): - """ - function called from AcquisitionTab::read_zmq to get the maximum and minimum - values of the decoded frame and save them in frame_min/frame_max - """ - self.frame_min = np.min(frame) - self.frame_max = np.max(frame) - self.updateColorRange() + self.analogcminSpinBoxes.setEnabled(enableSpinBoxes and self.showanalogImage) + self.analogcmaxSpinBoxes.setEnabled(enableSpinBoxes and self.showanalogImage) - def updateColorRange(self): + self.digitalcminSpinBoxes.setEnabled(enableSpinBoxes and self.showdigitalImage) + self.digitalcmaxSpinBoxes.setEnabled(enableSpinBoxes and self.showdigitalImage) + + for index in range(Defines.max_counters): + self.updateColorRange(imagetype=Defines.ImageType.TRANSCEIVER, index=index) + + self.updateColorRange(imagetype=Defines.ImageType.ANALOG) + + self.updateColorRange(imagetype=Defines.ImageType.DIGITAL) + + def handleHistogramChange(self, plot, imagetype : Defines.ImageType, index=0): """ + Parameters + ---------- + plot : Plot + The plot object whose histogram has changed. + imagetype : Defines.ImageType + The type of image (DIGITAL, ANALOG, or TRANSCEIVER). + index : int, optional + The index of the counter (default is 0). + """ + cmin, cmax = plot.getHistogramWidget().item.getLevels() + self.setCmin(imagetype=imagetype, value=cmin, index=index, updateColorBar=False) + self.setCmax(imagetype=imagetype, value=cmax, index=index, updateColorBar=False) + + + def updateColorRange(self, imagetype : Defines.ImageType, plot = None, index=0): + """ + Updates the color range of the plot at index based on the current color range mode. for mode: - - all: sets cmin and cmax to the maximums/minimum values of the frame + - auto: sets cmin and cmax to the maximums/minimum values of the frame - 3-97%: limits cmax and cmin so that we ignore 3% from each end of the whole range - fixed: this function does not change cmin and cmax - """ - if self.colorRangeMode == Defines.colorRange.all: - self.cmin = self.frame_min - self.cmax = self.frame_max - elif self.colorRangeMode == Defines.colorRange.center: - self.cmin = self.frame_min + 0.03 * (self.frame_max - self.frame_min) - self.cmax = self.frame_max - 0.03 * (self.frame_max - self.frame_min) - - self.updateColorRangeUI() - - def updateColorRangeUI(self): + Parameters + ---------- + imagetype : Defines.ImageType + The type of image (DIGITAL, ANALOG, or TRANSCEIVER). + plot : Plot, optional + The plot object to update (default is None). + index : int, optional + The index of the counter (default is 0). """ - updates UI views should be called after every change to cmin or cmax - """ - for plot in self.imagePlots: - if isinstance(plot, list): # hacky for now only transceiver image is a PlotSplitter - for p in plot: - p.getHistogramWidget().item.setLevels(min=self.cmin, max=self.cmax) + if imagetype == Defines.ImageType.TRANSCEIVER: # update transceiver + defaultPlot = self.transceiverTab.transceiverImageViews[index] + cmin, cmax = self.transceivercolorrange[index] + elif imagetype == Defines.ImageType.DIGITAL: # update digital + defaultPlot = self.mainWindow.plotDigitalImage + cmin, cmax = self.digitalcolorrange + elif imagetype == Defines.ImageType.ANALOG: # update analog + defaultPlot = self.mainWindow.plotAnalogImage + cmin, cmax = self.analogcolorrange + if plot is None: + plot = defaultPlot + + if self.colorRangeMode == Defines.colorRange.auto: + if plot.getImageItem().image is None or plot.getImageItem().image.size == 0: + return else: - plot.getHistogramWidget().item.setLevels(min=self.cmin, max=self.cmax) - self.view.cminSpinBox.setValue(self.cmin) - self.view.cmaxSpinBox.setValue(self.cmax) + frame_min = np.min(plot.getImageItem().image) + frame_max = np.max(plot.getImageItem().image) + self.setCmin(imagetype=imagetype, value=frame_min, index=index) + self.setCmax(imagetype=imagetype, value=frame_max, index=index) + elif self.colorRangeMode == Defines.colorRange.center: + if plot.getImageItem().image is None or plot.getImageItem().image.size == 0: + return + + else: + frame_min = np.min(plot.getImageItem().image) + frame_max = np.max(plot.getImageItem().image) + self.setCmin(imagetype=imagetype, value=frame_min + 0.03 * (frame_max - frame_min), index=index) + self.setCmax(imagetype=imagetype, value=frame_max - 0.03 * (frame_max - frame_min), index=index) + + elif self.colorRangeMode == Defines.colorRange.fixed: + self.setCmin(imagetype=imagetype, value=cmin, index=index) + self.setCmax(imagetype=imagetype, value=cmax, index=index) + + def updateColorBar(self, imagetype : Defines.ImageType, index = 0): + """ + updates the color bar of the plot at index + """ + + plot = None + cmin, cmax = 0.0, 0.0 + if imagetype == Defines.ImageType.TRANSCEIVER: + plot = self.transceiverTab.transceiverImageViews[index] + cmin, cmax = self.transceivercolorrange[index] + elif imagetype == Defines.ImageType.DIGITAL: # update digital + plot = self.mainWindow.plotDigitalImage + cmin, cmax = self.digitalcolorrange + elif imagetype == Defines.ImageType.ANALOG: # update analog + plot = self.mainWindow.plotAnalogImage + cmin, cmax = self.analogcolorrange + + if plot is not None: + histItem = plot.getHistogramWidget().item + histItem.blockSignals(True) # avoid triggering handleHistogramChange while setting the levels + histItem.setLevels(min=cmin, max=cmax) + histItem.blockSignals(False) + def setColorMap(self): cm = pg.colormap.getFromMatplotlib(self.view.comboBoxColorMap.currentText()) # print(f'color map:{self.comboBoxColorMap.currentText()}') self.mainWindow.plotAnalogImage.setColorMap(cm) self.mainWindow.plotDigitalImage.setColorMap(cm) - for i, showncounter in enumerate(self.transceiverTab.shownCounters): - if showncounter: - self.transceiverTab.transceiverImageViews[i].setColorMap(cm) + for i, showncounter in enumerate(self.shownCounterImages): + self.transceiverTab.transceiverImageViews[i].setColorMap(cm) def getZMQHWM(self): @@ -399,11 +542,11 @@ class PlotTab(QtWidgets.QWidget): self.mainWindow.transceiverPlots[i].hide() def addAllSelectedTransceiverPlots(self): - for i in range(Defines.transceiver.maxcount): + for i in range(Defines.max_counters): self.addSelectedTransceiverPlots(i) def removeAllTransceiverPlots(self): - for i in range(Defines.transceiver.maxcount): + for i in range(Defines.max_counters): self.mainWindow.transceiverPlots[i].hide() def showPlot(self): @@ -417,15 +560,21 @@ class PlotTab(QtWidgets.QWidget): self.view.radioButtonOverlay.setDisabled(True) self.view.radioButtonStripe.setDisabled(True) + self.showtransceiverImage = False + self.showanalogImage = False + self.showdigitalImage = False + if self.mainWindow.romode.value in [0, 2]: if self.view.radioButtonWaveform.isChecked(): self.mainWindow.plotAnalogWaveform.show() elif self.view.radioButtonImage.isChecked(): + self.showanalogImage = True self.mainWindow.plotAnalogImage.show() if self.mainWindow.romode.value in [1, 2, 4]: if self.view.radioButtonWaveform.isChecked(): self.mainWindow.plotDigitalWaveform.show() elif self.view.radioButtonImage.isChecked(): + self.showdigitalImage = True self.mainWindow.plotDigitalImage.show() self.view.labelDigitalWaveformOption.setEnabled(True) self.view.radioButtonOverlay.setEnabled(True) @@ -435,7 +584,8 @@ class PlotTab(QtWidgets.QWidget): if self.view.radioButtonWaveform.isChecked(): self.mainWindow.plotTransceiverWaveform.show() elif self.view.radioButtonImage.isChecked(): - for i, showncounter in enumerate(self.transceiverTab.shownCounters): + self.showtransceiverImage = True + for i, showncounter in enumerate(self.shownCounterImages): self.transceiverTab.transceiverImageViews[i].setVisible(showncounter) self.transceiverTab.transceiverImageSplitter.show() @@ -463,18 +613,18 @@ class PlotTab(QtWidgets.QWidget): 'bottom', "Transceiver Sample [#]") self.view.stackedWidgetPlotType.setCurrentIndex(0) - self.enableallCounterCheckBox(False) # disable counter checkboxes for waveform + self.showallCounterCheckBox(False) # disable counter checkboxes for waveform elif self.view.radioButtonImage.isChecked(): self.view.stackedWidgetPlotType.setCurrentIndex(2) is_transceiver = self.mainWindow.romode.value in [3, 4] - self.enableallCounterCheckBox(is_transceiver) # enable counter checkboxes for matterhorn + self.showallCounterCheckBox(is_transceiver) # enable counter checkboxes for matterhorn self.setDecoder() if self.view.radioButtonNoPlot.isChecked(): self.view.labelPlotOptions.hide() self.view.stackedWidgetPlotType.hide() - self.enableallCounterCheckBox(False) # disable counter checkboxes when no plot is selected + self.showallCounterCheckBox(False) # disable counter checkboxes when no plot is selected # enable plotting else: self.view.labelPlotOptions.show() diff --git a/pyctbgui/pyctbgui/services/Signals.py b/pyctbgui/pyctbgui/services/Signals.py index 9572dc3f6..0a8ec8dab 100644 --- a/pyctbgui/pyctbgui/services/Signals.py +++ b/pyctbgui/pyctbgui/services/Signals.py @@ -193,7 +193,7 @@ class SignalsTab(QtWidgets.QWidget): self.mainWindow.nDigitalRows = 0 self.mainWindow.nDigitalCols = 0 self.mainWindow.digital_frame = np.zeros((self.mainWindow.nDigitalRows, self.mainWindow.nDigitalCols)) - self.mainWindow.plotDigitalImage.setImage(self.mainWindow.digital_frame) + self.mainWindow.plotDigitalImage.setImage(self.mainWindow.digital_frame, autoLevels=False) self.mainWindow.verticalLayoutPlot.addWidget(self.mainWindow.plotDigitalImage, 4) def updateSignalNames(self): diff --git a/pyctbgui/pyctbgui/services/Transceiver.py b/pyctbgui/pyctbgui/services/Transceiver.py index 828decd26..55ce77f76 100644 --- a/pyctbgui/pyctbgui/services/Transceiver.py +++ b/pyctbgui/pyctbgui/services/Transceiver.py @@ -24,18 +24,17 @@ class TransceiverTab(QtWidgets.QWidget): self.plotTab = None self.legend: LegendItem | None = None self.acquisitionTab = None - self.nCounters: int = Defines.transceiver.maxcount + self.nCounters: int = Defines.max_counters self.nTransceiverRows : int = 0 self.nTransceiverCols : int = 0 - self.shownCounters: list[bool] = [True] * Defines.transceiver.maxcount # per default show all 4 counters self.transceiverImageSplitter = QtWidgets.QSplitter(QtCore.Qt.Vertical) self.transceiverImageViews : list = [] # pg image view for each counter - self.firstTransceiverImage : list[bool] = [True] * Defines.transceiver.maxcount # to keep track of first image for each counter to maintain zoom state + self.firstTransceiverImage : list[bool] = [True] * Defines.max_counters # to keep track of first image for each counter to maintain zoom state def setup_ui(self): self.plotTab = self.mainWindow.plotTab self.acquisitionTab = self.mainWindow.acquisitionTab - for i in range(Defines.transceiver.maxcount): + for i in range(Defines.max_counters): self.setTransceiverButtonColor(i, self.plotTab.getRandomColor()) self.initializeAllTransceiverPlots() @@ -46,7 +45,7 @@ class TransceiverTab(QtWidgets.QWidget): self.plotTab.subscribeToggleLegend(self.updateLegend) def connect_ui(self): - for i in range(Defines.transceiver.maxcount): + for i in range(Defines.max_counters): getattr(self.view, f"checkBoxTransceiver{i}").stateChanged.connect(partial(self.setTransceiverEnable, i)) getattr(self.view, f"checkBoxTransceiver{i}Plot").stateChanged.connect(partial(self.setTransceiverEnablePlot, i)) @@ -62,7 +61,7 @@ class TransceiverTab(QtWidgets.QWidget): """ enabledPlots = [] self.legend.clear() - for i in range(Defines.transceiver.maxcount): + for i in range(Defines.max_counters): if getattr(self.view, f'checkBoxTransceiver{i}Plot').isChecked(): plotName = getattr(self.view, f"labelTransceiver{i}").text() enabledPlots.append((self.mainWindow.transceiverPlots[i], plotName)) @@ -111,7 +110,7 @@ class TransceiverTab(QtWidgets.QWidget): trans_array = self._processWaveformData(data, dSamples, self.mainWindow.romode.value, self.mainWindow.nDBitEnabled, self.nTransceiverEnabled) idx = 0 - for i in range(Defines.transceiver.maxcount): + for i in range(Defines.max_counters): checkBoxPlot = getattr(self.view, f"checkBoxTransceiver{i}Plot") checkBoxEn = getattr(self.view, f"checkBoxTransceiver{i}") if checkBoxEn.isChecked() and checkBoxPlot.isChecked(): @@ -156,21 +155,18 @@ class TransceiverTab(QtWidgets.QWidget): try: transceiver_frame = self._processImageData(data, dSamples, self.mainWindow.romode.value, self.mainWindow.nDBitEnabled) - self.plotTab.ignoreHistogramSignal = True for i in range(transceiver_frame.shape[0]): - self.transceiverImageViews[i].setImage(transceiver_frame[i]) + self.transceiverImageViews[i].setImage(transceiver_frame[i], autoLevels=False) #manually update image levels except Exception as e: self.mainWindow.statusbar.setStyleSheet("color:red") self.acquisitionTab.updateCurrentFrame('Invalid Image') self.mainWindow.statusbar.showMessage(str(e)) print("Error: ", str(e)) - self.plotTab.setFrameLimits(transceiver_frame) - # keep the zoomed in state (not 1st image) for idx, image_view in enumerate(self.transceiverImageViews): - if(self.firstTransceiverImage[idx] and self.shownCounters[idx]): + if(self.firstTransceiverImage[idx] and self.plotTab.shownCounterImages[idx]): self.firstTransceiverImage[idx] = False else: image_view.getView().setState(image_states[idx]) @@ -180,16 +176,16 @@ class TransceiverTab(QtWidgets.QWidget): def update_numCounters(self, num_counters): # update the number of counters and adjust the image splitter accordingly self.nCounters = num_counters - for i in range(Defines.transceiver.maxcount): - self.shownCounters[i] = i < self.nCounters - self.plotTab.setCounterCheckBox(i, self.shownCounters[i]) # check the counter checkbox - self.plotTab.enableCounterCheckBox(i, self.shownCounters[i]) # disable counter checkbox + for i in range(Defines.max_counters): + self.plotTab.shownCounterImages[i] = i < self.nCounters + self.plotTab.setCounterCheckBox(i, self.plotTab.shownCounterImages[i]) # check the counter checkbox + self.plotTab.enableCounterCheckBox(i, self.plotTab.shownCounterImages[i]) # disable counter checkbox self.update_ImageSplitter() # update the splitter to show/hide image views based on the number of counters def update_ImageSplitter(self): - for i, showncounter in enumerate(self.shownCounters): + for i, showncounter in enumerate(self.plotTab.shownCounterImages): self.transceiverImageViews[i].setVisible(showncounter) def initializeAllTransceiverPlots(self): @@ -198,7 +194,7 @@ class TransceiverTab(QtWidgets.QWidget): self.mainWindow.verticalLayoutPlot.addWidget(self.mainWindow.plotTransceiverWaveform, 5) self.mainWindow.transceiverPlots = {} waveform = np.zeros(1000) - for i in range(Defines.transceiver.maxcount): + for i in range(Defines.max_counters): pen = pg.mkPen(color=self.getTransceiverButtonColor(i), width=1) legendName = getattr(self.view, f"labelTransceiver{i}").text() self.mainWindow.transceiverPlots[i] = self.mainWindow.plotTransceiverWaveform.plot(waveform, diff --git a/pyctbgui/pyctbgui/ui/plot.ui b/pyctbgui/pyctbgui/ui/plot.ui index 01d2b5ec1..2e0e53d8c 100644 --- a/pyctbgui/pyctbgui/ui/plot.ui +++ b/pyctbgui/pyctbgui/ui/plot.ui @@ -425,7 +425,7 @@ Moench04 - + Moench05 @@ -505,7 +505,7 @@ 10 - 440 + 540 841 400 @@ -1150,7 +1150,7 @@ 10 221 841 - 91 + 191 @@ -1166,197 +1166,390 @@ QFrame::Raised - - 9 - - - 9 - - - - - QFrame::NoFrame - - - QFrame::Plain - - - - - - true - - - - 16777215 - 15 - - - - 3-97% - - - buttonGroup_4 - - - - - - - - 16777215 - 15 - - - - All - - - true - - - buttonGroup_4 - - - - - - - - 16777215 - 15 - - - - Fixed - - - buttonGroup_4 - - - - - - - - - - Qt::Horizontal - - - QSizePolicy::Fixed - - - - 40 - 20 - - - - - - - - 0 - 31 - - - - - 16777215 - 31 - - - - Color Range: - - + + + + + Color Range: + + + + + + + Auto + + + true + + + buttonGroup_4 + + + + + + + 3-97% + + + buttonGroup_4 + + + + + + + Fixed + + + buttonGroup_4 + + + + + + + Qt::Horizontal + + + QSizePolicy::Expanding + + + + 40 + 20 + + + + + - - - - false - - - - 0 - 31 - - - - -1000.000000000000000 - - - 100000.000000000000000 + + + + 2 + + + Digital + + + + + + Color range values: + + + + + + + false + + + min: + + + -1000.000000000000000 + + + 100000.000000000000000 + + + + + + + false + + + max: + + + -1000.000000000000000 + + + 100000.000000000000000 + + + + + + + Qt::Horizontal + + + QSizePolicy::Expanding + + + + 40 + 20 + + + + + + + + + Analog + + + + + + Color range values: + + + + + + + false + + + min: + + + -1000.000000000000000 + + + 100000.000000000000000 + + + + + + + false + + + max: + + + -1000.000000000000000 + + + 100000.000000000000000 + + + + + + + Qt::Horizontal + + + QSizePolicy::Expanding + + + + 40 + 20 + + + + + + + + + Transceiver + + + + + + Color range values: + + + + + + + Counter 0: + + + + + + + false + + + min: + + + -1000.000000000000000 + + + 100000.000000000000000 + + + + + + + false + + + max: + + + -1000.000000000000000 + + + 100000.000000000000000 + + + + + + + Counter 1: + + + + + + + false + + + min: + + + -1000.000000000000000 + + + 100000.000000000000000 + + + + + + + false + + + max: + + + -1000.000000000000000 + + + 100000.000000000000000 + + + + + + + Counter 2: + + + + + + + false + + + min: + + + -1000.000000000000000 + + + 100000.000000000000000 + + + + + + + false + + + max: + + + -1000.000000000000000 + + + 100000.000000000000000 + + + + + + + Counter 3: + + + + + + + false + + + min: + + + -1000.000000000000000 + + + 100000.000000000000000 + + + + + + + false + + + max: + + + -1000.000000000000000 + + + 100000.000000000000000 + + + + + + + Qt::Horizontal + + + QSizePolicy::Expanding + + + + 40 + 20 + + + + + + - - - - - 50 - 31 - - - - max: - - - - - - - false - - - - 0 - 31 - - - - 100000.000000000000000 - - - - - - - - 50 - 31 - - - - min: - - - - - - - Qt::Horizontal - - - QSizePolicy::Fixed - - - - 40 - 20 - - - - 10 - 322 + 422 841 108 @@ -1541,9 +1734,9 @@ + - diff --git a/pyctbgui/pyctbgui/utils/defines.py b/pyctbgui/pyctbgui/utils/defines.py index b4ecfc04e..d51f13287 100644 --- a/pyctbgui/pyctbgui/utils/defines.py +++ b/pyctbgui/pyctbgui/utils/defines.py @@ -12,6 +12,15 @@ class Defines: Acquisition_Tab_Index = 7 Max_Tabs = 9 + + max_counters = 4 # max number of counters + max_counters_tabIndex = 4 + + class ImageType(Enum): + DIGITAL = 0 + ANALOG = 1 + TRANSCEIVER = 2 + class adc: tabIndex = 5 count = 32 @@ -34,10 +43,6 @@ class Defines: tabIndex = 6 loops_count = 6 - class transceiver: - maxcount = 4 - maxtabIndex = 4 - class slowAdc: tabIndex = 2 count = 8 @@ -88,6 +93,6 @@ class Defines: LineStyles = ['-', '--', '-.', ':'] class colorRange(Enum): - all = 0 + auto = 0 center = 1 fixed = 2 From 70aaa1c26af731c182bd2761d2bae577231dad50 Mon Sep 17 00:00:00 2001 From: Dhanya Thattil Date: Tue, 3 Nov 2026 09:39:20 +0100 Subject: [PATCH 06/10] Dev/jf online display gui (#1627) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * created jf online display gui with gating, need to change naming from new_online_ZMQ inside * jf_online_display_gui: single-process Jungfrau online display + event finder Merge the old two-process chain (onlinedisp_zmq + jf_event_finder_*) and the ROI-save writer into one multi-threaded program: Qt5 GUI, ROOT plots, raw ZMQ input, HDF5/JSON output. Renamed from new_online_ZMQ - directory, binary, Makefile target, README/NOTES and the agent notes all carry the new name; the legacy sources are left in place for reference. Pipeline - acq thread (zmq_poll) -> analysis -> worker pool -> ROOT, decoupled by frame and image mailboxes so a slow stage can never stall the receiver; HDF5 writer thread; per-socket ZMQ monitors so an idle-but-alive receiver is not called "stopped". Multi-interface mode stacks N slabs bottom -> top. Gates - storage cell (detSpec3 bits 8-11) and the signal gate in series, so frames from other cells cost no CPU; optional contiguity (N px within a circle) and "ROI only". Cumulative/current counters plus fps and MB/s rates. Pedestal - load/read/save/acquire, Pede/Raw toggle, and live dr * jf_online_display_gui: image plots, palettes, zoom coordination, save-time locking Build - `make` now produces both executables: jf_online_display_gui and jf_online_display_gui_JFSTRX (same sources with -DJFSTRX into their own objects, decoder header declared as a dependency); `make normal` / `make jfstrx` still build one. The strip-xel build zooms four times deeper (kMinViewport = 2 image pixels) and no longer dumps the decoder header on every displayed frame. Display - the image windows are plots: frame, X/Y axes with the tick labels outside, dotted grid, per-pixel outlines from 16 screen px and in-pixel values from 50 px (whole numbers for counts, one decimal otherwise), all clipped to the plot area so a zoom cannot spill over the axes. - the colour bar is replaced by a thin scale panel: solid-bin histogram with the range markers pinned at 1/4 and 3/4 (draggable, applied on release), 18 palettes (viridis/plasma/inferno/magma/cividis/turbo/hot/greys/diverging/ Brewer/Tol) and two lin/log switches (image intensity and histogram bars, log capping values <= 0 at 1e-2). - the gain window has no scale panel at all: four valid values, fixed muted blue/green/yellow/red code, range pinned to 0..3. - "zoom coordination" in the Display panel: any window zooms all of them (default on); off means every window is independent. Saving - the photon-counting threshold follows the gain stage (ADU when it is off, keV when it is on, both remembered), with the unit in --stats and the JSON. - a running save locks the settings that would change the file; the gate threshold and min-pixels stay live but ask first, and the JSON gets gate_settings_modified_during_run plus a note. - counters report frames or maps, the start-up default is no longer added to the previous-destinations list, and the status explains the dropped count. ROI and flow - "Unset ROI" button; the ROI is fed by the Gain for frames and by the virtual photon counting for the maps, always orange, and the arrow into Save always leaves the ROI; the diagram's colours follow the display-vs-save pedestal split while its geometry stays fixed; the signal gate is drawn as a funnel on the line with a control arrow. * jf_online_display_gui: alignment, gate and display fixes from live tests - dual interface: one-frame lookahead pairing, drain to newest, catch-up reads from the lagging socket, manual decimation, [perf]/[align] audit lines - gate: contiguity circle test fixed (+ unit test), hot-pixel mask taken from the photon map and applied to the gate, PH plots and ADC display - display: histogram frozen while dragging and binned over the visible scale, "Current" counters fixed, ROI editor (drag the yellow box), "Edit as new" - build: CMakeLists.txt (both variants, test, feeder), local .gitignore * jf_online_display_gui: photon map cadence counts analysed (gated) frames Rename the spinbox to "write plot every N (gated) images" and drop the false "independent of the ADC image decimation" claim from the tooltip and the publish-site comment: it ticks on frames that survived the gate and the decimation, so rejecting/skipping frames stretches the interval. * jf_online_display_gui: strixel Z scale, plot visibility toggles - the six strixel panels follow the ADC colour range and palette (they have no scale of their own) and show a "Z scale" legend - Display panel: "show gain image" and "show ROOT plots", both off at startup; the ROOT canvases are parked off-screen and restored on demand - silence the per-frame "data struct created" print in the strixel decoder * jf_online_display_gui: "Edit as new" ROI fix, single-interface placement - the ROI dialog's Apply button never closed it (QDialogButtonBox emits accepted() only for AcceptRole, Apply has ApplyRole); the edited rectangle is now also written to the ROI list as a new entry - port specs accept ":top" / ":bottom" (e.g. 30027:top) so a single ZMQ stream lands in the correct half of the module; the stream header carries port, shape and flipRows but no row offset. One log line reports the choice. * jf_online_display_gui: receiver ROI as the union of the interfaces Each interface reports only its own slice, so translate every slice by its row offset and draw the union (a box crossing the boundary used to stop at it). A single stream is drawn exactly as reported. --------- Co-authored-by: Aldo Mozzanica Co-authored-by: Erik Fröjdh --- .../jungfrauLGADStrixelsData_new.h | 12 +- .../jungfrauExecutables/CMakeLists.txt | 7 + .../jungfrauExecutables/Makefile | 23 +- .../jf_online_display_gui/.gitignore | 16 + .../jf_online_display_gui/CMakeLists.txt | 170 + .../jf_online_display_gui/Makefile | 106 + .../jf_online_display_gui/NOTES.md | 950 ++ .../jf_online_display_gui/README.md | 1389 +++ .../jf_online_display_gui/changes.partch | 7842 +++++++++++++++++ .../jf_online_display_gui/online_jf.h | 1103 +++ .../jf_online_display_gui/online_jf_core.cpp | 3545 ++++++++ .../jf_online_display_gui/online_jf_gui.cpp | 5739 ++++++++++++ .../jf_online_display_gui/online_jf_gui.cpp~ | 4482 ++++++++++ .../jf_online_display_gui/online_jf_h5.cpp | 1081 +++ .../jf_online_display_gui/online_jf_root.cpp | 1393 +++ .../test/gate_contig_test.cpp | 184 + .../jf_online_display_gui/test/jf_feeder.cpp | 233 + .../test/panel_map_test.cpp | 65 + .../test/pede_live_test.cpp | 171 + .../jf_online_display_gui/test/xclick.c | 69 + 20 files changed, 28573 insertions(+), 7 deletions(-) mode change 120000 => 100644 slsDetectorCalibration/jungfrauExecutables/Makefile create mode 100644 slsDetectorCalibration/jungfrauExecutables/jf_online_display_gui/.gitignore create mode 100644 slsDetectorCalibration/jungfrauExecutables/jf_online_display_gui/CMakeLists.txt create mode 100644 slsDetectorCalibration/jungfrauExecutables/jf_online_display_gui/Makefile create mode 100644 slsDetectorCalibration/jungfrauExecutables/jf_online_display_gui/NOTES.md create mode 100644 slsDetectorCalibration/jungfrauExecutables/jf_online_display_gui/README.md create mode 100644 slsDetectorCalibration/jungfrauExecutables/jf_online_display_gui/changes.partch create mode 100644 slsDetectorCalibration/jungfrauExecutables/jf_online_display_gui/online_jf.h create mode 100644 slsDetectorCalibration/jungfrauExecutables/jf_online_display_gui/online_jf_core.cpp create mode 100644 slsDetectorCalibration/jungfrauExecutables/jf_online_display_gui/online_jf_gui.cpp create mode 100644 slsDetectorCalibration/jungfrauExecutables/jf_online_display_gui/online_jf_gui.cpp~ create mode 100644 slsDetectorCalibration/jungfrauExecutables/jf_online_display_gui/online_jf_h5.cpp create mode 100644 slsDetectorCalibration/jungfrauExecutables/jf_online_display_gui/online_jf_root.cpp create mode 100644 slsDetectorCalibration/jungfrauExecutables/jf_online_display_gui/test/gate_contig_test.cpp create mode 100644 slsDetectorCalibration/jungfrauExecutables/jf_online_display_gui/test/jf_feeder.cpp create mode 100644 slsDetectorCalibration/jungfrauExecutables/jf_online_display_gui/test/panel_map_test.cpp create mode 100644 slsDetectorCalibration/jungfrauExecutables/jf_online_display_gui/test/pede_live_test.cpp create mode 100644 slsDetectorCalibration/jungfrauExecutables/jf_online_display_gui/test/xclick.c diff --git a/slsDetectorCalibration/dataStructures/jungfrauLGADStrixelsData_new.h b/slsDetectorCalibration/dataStructures/jungfrauLGADStrixelsData_new.h index cbc2d5518..8774159a6 100644 --- a/slsDetectorCalibration/dataStructures/jungfrauLGADStrixelsData_new.h +++ b/slsDetectorCalibration/dataStructures/jungfrauLGADStrixelsData_new.h @@ -296,8 +296,8 @@ class jungfrauLGADStrixelsData : public slsDetectorData { /*nr_strixel*/ 2 * g1_nrows + 2 * g2_nrows + 2 * g3_nrows, g1_ncols * (2 * g1_nrows + 2 * g2_nrows + 2 * g3_nrows) * 2 + sizeof(header)) { - std::cout << "Jungfrau strixels 2X single chip with full module data " - << std::endl; +// std::cout << "Jungfrau strixels 2X single chip with full module data " +// << std::endl; // Fill all strixels with dummy values for (int ix = 0; ix != g1_ncols; ++ix) { @@ -307,9 +307,9 @@ class jungfrauLGADStrixelsData : public slsDetectorData { } } - std::cout << "sizeofheader = " << sizeof(header) << std::endl; - std::cout << "Jungfrau strixels 2X single chip with full module data " - << std::endl; +// std::cout << "sizeofheader = " << sizeof(header) << std::endl; +// std::cout << "Jungfrau strixels 2X single chip with full module data " +// << std::endl; if (xmin < xmax && ymin < ymax) { @@ -331,7 +331,7 @@ class jungfrauLGADStrixelsData : public slsDetectorData { } iframe = 0; - std::cout << "data struct created" << std::endl; + // std::cout << "data struct created" << std::endl; // per frame: too noisy }; /** diff --git a/slsDetectorCalibration/jungfrauExecutables/CMakeLists.txt b/slsDetectorCalibration/jungfrauExecutables/CMakeLists.txt index 6f1fa6fd1..7ea3b4537 100644 --- a/slsDetectorCalibration/jungfrauExecutables/CMakeLists.txt +++ b/slsDetectorCalibration/jungfrauExecutables/CMakeLists.txt @@ -55,6 +55,13 @@ target_compile_definitions(jungfrauRawDataProcessStrxOldAldo PRIVATE JFSTRXOLD A list(APPEND JUNGFRAU_EXECUTABLES jungfrauRawDataProcessStrxOldAldo) +# jf_online_display_gui (Qt5 + ROOT online display / event finder). Off by +# default: it needs Qt5 and ROOT, which the rest of this directory does not. +option(BUILD_JF_ONLINE_DISPLAY_GUI "build jf_online_display_gui" OFF) +if(BUILD_JF_ONLINE_DISPLAY_GUI) + add_subdirectory(jf_online_display_gui) +endif() + # others to be added if needed (might already be there in Makefile.cluster_finder TO BE CHECKED) diff --git a/slsDetectorCalibration/jungfrauExecutables/Makefile b/slsDetectorCalibration/jungfrauExecutables/Makefile deleted file mode 120000 index bde0d5288..000000000 --- a/slsDetectorCalibration/jungfrauExecutables/Makefile +++ /dev/null @@ -1 +0,0 @@ -Makefile.zmqrootdisp \ No newline at end of file diff --git a/slsDetectorCalibration/jungfrauExecutables/Makefile b/slsDetectorCalibration/jungfrauExecutables/Makefile new file mode 100644 index 000000000..1ec21eac7 --- /dev/null +++ b/slsDetectorCalibration/jungfrauExecutables/Makefile @@ -0,0 +1,22 @@ +ROOTSYS=/opt/cern/v6/build + +LIBZMQDIR = $(PWD) +LIBZMQ = -L$(LIBZMQDIR) -lzmq +SHLIB_PATH=/opt/cern/v6/root/lib +CMAKE_PREFIX_PATH=/opt/cern/v6/root +DYLD_LIBRARY_PATH=/opt/cern/v6/root/lib + +QT_CXXFLAGS = $(shell pkg-config --cflags Qt5Core Qt5Gui Qt5Widgets 2>/dev/null) +QT_LIBS = $(shell pkg-config --libs Qt5Core Qt5Gui Qt5Widgets 2>/dev/null) + +INCDIR= -I. -I../dataStructures ../tiffio/src/tiffIO.cpp -I../ -I../interpolations/ -I../../slsSupportLib/include/ -I../../slsReceiverSoftware/include/ -I../../libs/rapidjson/ -I../tiffio/include +LDFLAG= -L/usr/lib64/ -lpthread -lm -lstdc++ -lzmq -pthread -lrt -ltiff -O3 -std=c++17 -Wall -Wl,-rpath-link,$(ROOTSYS)/lib + + +default: onlinedisp_zmq + +onlinedisp_zmq: onlinedisp_zmq.cpp onlinedisp_zmq.h ../dataStructures/jungfrauLGADStrixelsData_new.h + g++ -o onlinedisp_zmq onlinedisp_zmq.cpp $(QT_CXXFLAGS) $(QT_LIBS) -I. -I$(ROOTSYS)/include -Wall -g -lm -L. -lzmq -pthread -lrt -L$(ROOTSYS)/lib -lGui -lCore -lRIO -lNet -lHist -lGraf -lGraf3d -lGpad -lTree -lRint -lPostscript -lMatrix -lPhysics -lMathCore -lThread -m64 -L../../build/bin/ -lSlsSupportStatic ../../build/_deps/libzmq-build/lib/libzmq.a -lstdc++ -lsodium $(LDFLAG) $(INCDIR) + +#-lCint + diff --git a/slsDetectorCalibration/jungfrauExecutables/jf_online_display_gui/.gitignore b/slsDetectorCalibration/jungfrauExecutables/jf_online_display_gui/.gitignore new file mode 100644 index 000000000..f0d94cdf9 --- /dev/null +++ b/slsDetectorCalibration/jungfrauExecutables/jf_online_display_gui/.gitignore @@ -0,0 +1,16 @@ +# build outputs (make and cmake) +cmake-build/ +jf_online_display_gui +jf_online_display_gui_JFSTRX +gate_contig_test +*.o +*.JFSTRX.o +test/jf_feeder +test/xclick +# run artefacts +current_pede.dat +jfroi_*.json +*.json.lock +roi_list.dat +save_dest_list.dat +testPHmapsave/ diff --git a/slsDetectorCalibration/jungfrauExecutables/jf_online_display_gui/CMakeLists.txt b/slsDetectorCalibration/jungfrauExecutables/jf_online_display_gui/CMakeLists.txt new file mode 100644 index 000000000..f7f52f936 --- /dev/null +++ b/slsDetectorCalibration/jungfrauExecutables/jf_online_display_gui/CMakeLists.txt @@ -0,0 +1,170 @@ +# SPDX-License-Identifier: LGPL-3.0-or-other +# Copyright (C) 2021 Contributors to the SLS Detector Package +# +# jf_online_display_gui -- single multithreaded program merging +# jf_event_finder_cli / jf_event_finder_gui (ZMQ gate) +# onlinedisp_zmq (Qt5 + ROOT display) +# +# Standalone build (this directory): +# cmake -S . -B build && cmake --build build -j +# ./build/jf_online_display_gui (normal) +# ./build/jf_online_display_gui_JFSTRX (strip-xel) +# +# The Makefile in this directory builds the same two programs; this file exists +# so the program can be built like the rest of the package. +# +# Targets +# jf_online_display_gui normal geometry +# jf_online_display_gui_JFSTRX same sources with -DJFSTRX (strip-xel) +# gate_contig_test gate unit test (JF_BUILD_TESTS=ON, default) +# jf_feeder ZMQ test feeder (JF_BUILD_TESTS=ON, default) +# +# The two variants must never share object files: the geometry and the struct +# layouts differ, so they are compiled twice (JFSTRX/common object libraries). + +cmake_minimum_required(VERSION 3.16) +project(jf_online_display_gui LANGUAGES CXX) + +set(CMAKE_CXX_STANDARD 17) +set(CMAKE_CXX_STANDARD_REQUIRED ON) +set(CMAKE_CXX_EXTENSIONS OFF) +if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES) + set(CMAKE_BUILD_TYPE Release CACHE STRING "" FORCE) +endif() + +option(JF_BUILD_TESTS "build the gate unit test and the ZMQ feeder" ON) + +# --------------------------------------------------------------------------- +# paths relative to this directory (same layout as the Makefile) +# PKG = ../../.. package root +# CAL = ../.. slsDetectorCalibration +# --------------------------------------------------------------------------- +get_filename_component(PKG "${CMAKE_CURRENT_SOURCE_DIR}/../../.." ABSOLUTE) +get_filename_component(CAL "${CMAKE_CURRENT_SOURCE_DIR}/../.." ABSOLUTE) + +# --------------------------------------------------------------------------- +# dependencies +# --------------------------------------------------------------------------- +find_package(Qt5 5.9 COMPONENTS Widgets Gui Core REQUIRED) +# online_jf.h includes Qt headers, and every translation unit of this program +# sees them (the core/root/h5 objects too), so the include paths are added to the +# flag list rather than left to the link interface. +set(JF_QT_INCLUDES + ${Qt5Widgets_INCLUDE_DIRS} ${Qt5Gui_INCLUDE_DIRS} ${Qt5Core_INCLUDE_DIRS}) +find_package(ROOT REQUIRED COMPONENTS Core RIO Hist Graf Gpad Thread) + +# HDF5: CMake's own module finds both C and C++ (the C++ headers are not in the +# default include path on every distro). +find_package(HDF5 REQUIRED COMPONENTS C CXX) + +# libzmq: prefer the prebuilt static library from the package build tree (that is +# what the Makefile links), then a system library as a fallback. +set(JF_ZMQ_STATIC "${PKG}/build/_deps/libzmq-build/lib/libzmq.a" + CACHE FILEPATH "static libzmq to link") +if(EXISTS "${JF_ZMQ_STATIC}") + set(JF_ZMQ_LIBRARY "${JF_ZMQ_STATIC}") + set(JF_ZMQ_INCLUDE "${PKG}/build/_deps/libzmq-src/include") + find_package(Threads REQUIRED) # the static build needs pthread/sodium + set(JF_ZMQ_EXTRA Threads::Threads sodium) +else() + find_package(PkgConfig REQUIRED) + pkg_check_modules(ZMQ REQUIRED IMPORTED_TARGET libzmq) + set(JF_ZMQ_LIBRARY PkgConfig::ZMQ) + set(JF_ZMQ_INCLUDE "") + set(JF_ZMQ_EXTRA "") +endif() + +# --------------------------------------------------------------------------- +# includes / flags shared by every source of this program +# --------------------------------------------------------------------------- +set(JF_INCLUDES + "${CMAKE_CURRENT_SOURCE_DIR}" + "${CAL}/dataStructures" + "${CAL}/interpolations" + "${CAL}/tiffio/include" + "${PKG}/slsSupportLib/include" + "${PKG}/slsReceiverSoftware/include" + "${PKG}/libs/rapidjson" + "${JF_ZMQ_INCLUDE}" + ${JF_QT_INCLUDES} + ${HDF5_INCLUDE_DIRS} + ${ROOT_INCLUDE_DIRS} +) + +# The strip-xel decoder header is included by the -DJFSTRX build only; listing it +# as a dependency makes both build systems rebuild when it changes. +set(JF_STRIXEL_HDR "${CAL}/dataStructures/jungfrauLGADStrixelsData_new.h") + +set(JF_SOURCES + online_jf_core.cpp + online_jf_root.cpp + online_jf_h5.cpp +) +set(JF_GUI_SOURCE online_jf_gui.cpp) + +# Everything except the definition of JFSTRX: the two object libraries below +# differ only in that definition (and therefore in their compiled geometry). +set(JF_COMMON_WARN -Wall -O3 -pthread) + +foreach(variant IN ITEMS "" "JFSTRX") + if(variant STREQUAL "") + set(objlib jf_common) + set(app jf_online_display_gui) + else() + set(objlib jf_common_jfstrx) + set(app jf_online_display_gui_JFSTRX) + endif() + + add_library(${objlib} OBJECT ${JF_SOURCES}) + target_include_directories(${objlib} PRIVATE ${JF_INCLUDES}) + target_compile_options(${objlib} PRIVATE ${JF_COMMON_WARN}) + if(NOT variant STREQUAL "") + target_compile_definitions(${objlib} PRIVATE ${variant}) + endif() + set_source_files_properties(${JF_SOURCES} PROPERTIES + OBJECT_DEPENDS "${JF_STRIXEL_HDR}") + + add_executable(${app} ${JF_GUI_SOURCE} $) + target_include_directories(${app} PRIVATE ${JF_INCLUDES}) + target_compile_options(${app} PRIVATE ${JF_COMMON_WARN}) + if(NOT variant STREQUAL "") + target_compile_definitions(${app} PRIVATE ${variant}) + endif() + target_link_libraries(${app} PRIVATE + Qt5::Widgets Qt5::Gui Qt5::Core + ${ROOT_LIBRARIES} + ${JF_ZMQ_LIBRARY} + ${JF_ZMQ_EXTRA} + ${HDF5_LIBRARIES} + pthread rt m + ) +endforeach() + +# --------------------------------------------------------------------------- +# tests / helpers +# --------------------------------------------------------------------------- +if(JF_BUILD_TESTS) + enable_testing() + add_test(NAME gate_contig COMMAND gate_contig_test) + # gate decision logic in isolation (no Qt, no ROOT usage at run time) + add_executable(gate_contig_test + test/gate_contig_test.cpp + $) + target_include_directories(gate_contig_test PRIVATE ${JF_INCLUDES}) + target_compile_options(gate_contig_test PRIVATE ${JF_COMMON_WARN}) + target_link_libraries(gate_contig_test PRIVATE + Qt5::Widgets Qt5::Gui Qt5::Core + ${ROOT_LIBRARIES} + ${JF_ZMQ_LIBRARY} + ${JF_ZMQ_EXTRA} + ${HDF5_LIBRARIES} + pthread rt m + ) + + # stand-in slsReceiver: single- or dual-interface ZMQ publisher + add_executable(jf_feeder test/jf_feeder.cpp) + target_include_directories(jf_feeder PRIVATE + "${PKG}/libs/rapidjson" "${JF_ZMQ_INCLUDE}") + target_compile_options(jf_feeder PRIVATE ${JF_COMMON_WARN}) + target_link_libraries(jf_feeder PRIVATE ${JF_ZMQ_LIBRARY} ${JF_ZMQ_EXTRA}) +endif() diff --git a/slsDetectorCalibration/jungfrauExecutables/jf_online_display_gui/Makefile b/slsDetectorCalibration/jungfrauExecutables/jf_online_display_gui/Makefile new file mode 100644 index 000000000..2c575f14b --- /dev/null +++ b/slsDetectorCalibration/jungfrauExecutables/jf_online_display_gui/Makefile @@ -0,0 +1,106 @@ +# =========================================================================== +# jf_online_display_gui -- single multithreaded program merging +# jf_event_finder_cli / jf_event_finder_gui (ZMQ gate) +# onlinedisp_zmq (Qt5 + ROOT display) +# +# Usage: +# make -> ./jf_online_display_gui (normal) +# ./jf_online_display_gui_JFSTRX (strip-xel) +# make normal | make jfstrx single variant (aliases) +# ./jf_online_display_gui [rx_port] [gate_threshold] [min_pixels] [pede_file] +# [--pub PORT] [--contig] [--no-gate] [--pede-frames N] +# +# Deps: system ROOT (root-config), Qt5 (pkg-config), the prebuilt static +# libzmq from the package build tree, and rapidjson headers. +# =========================================================================== +QT_CXXFLAGS = $(shell pkg-config --cflags Qt5Core Qt5Gui Qt5Widgets 2>/dev/null) +QT_LIBS = $(shell pkg-config --libs Qt5Core Qt5Gui Qt5Widgets 2>/dev/null) +ROOT_CFLAGS = $(shell root-config --cflags 2>/dev/null) +ROOT_LIBS = $(shell root-config --libs 2>/dev/null) + +# paths relative to this directory (jf_online_display_gui/) +PKG = ../../.. +CAL = ../.. + +ZMQ_STATIC = $(PKG)/build/_deps/libzmq-build/lib/libzmq.a + +# HDF5 C++ headers are NOT in the default include path on every distro (Debian/ +# Ubuntu put them in /usr/include/hdf5/serial). Discover the include/library +# directories with pkg-config (the .pc may be "hdf5" or "hdf5-serial"), then the +# h5c++ wrapper, and let the user override both explicitly: +# make HDF5_INC=-I/usr/include/hdf5/serial \ +# HDF5_LIB=-L/usr/lib/x86_64-linux-gnu/hdf5/serial +HDF5_PC := $(shell pkg-config --exists hdf5 && echo hdf5 || (pkg-config --exists hdf5-serial && echo hdf5-serial)) +HDF5_INC ?= $(shell pkg-config --cflags $(HDF5_PC) 2>/dev/null) \ + $(shell h5c++ -show 2>/dev/null | tr ' ' '\n' | grep '^-I' | tr '\n' ' ') +HDF5_LIB ?= $(shell pkg-config --libs $(HDF5_PC) 2>/dev/null) \ + $(shell h5c++ -show 2>/dev/null | tr ' ' '\n' | grep '^-L' | tr '\n' ' ') +HDF5_LIBS = $(HDF5_LIB) -lhdf5_cpp -lhdf5 + +INCDIR = -I. \ + $(HDF5_INC) \ + -I$(CAL)/dataStructures \ + -I$(CAL)/interpolations \ + -I$(CAL)/tiffio/include \ + -I$(PKG)/slsSupportLib/include \ + -I$(PKG)/slsReceiverSoftware/include \ + -I$(PKG)/libs/rapidjson \ + -I$(PKG)/build/_deps/libzmq-src/include + +CXX ?= g++ +CXXFLAGS ?= -std=c++17 -O3 -Wall -pthread + +LIBS = $(QT_LIBS) $(ROOT_LIBS) $(ZMQ_STATIC) $(HDF5_LIBS) -lsodium -lpthread -lrt -lm + +OBJS = online_jf_core.o online_jf_root.o online_jf_gui.o online_jf_h5.o +# The strip-xel variant compiles the same sources with -DJFSTRX into its own +# objects: the two builds have different geometry and struct layouts, so they +# must never share object files (mixing them is a hard crash). +JFSTRX_OBJS = online_jf_core.JFSTRX.o online_jf_root.JFSTRX.o \ + online_jf_gui.JFSTRX.o online_jf_h5.JFSTRX.o + +BIN = jf_online_display_gui +BIN_JFSTRX = jf_online_display_gui_JFSTRX + +ALL_CXXFLAGS = $(CXXFLAGS) $(ROOT_CFLAGS) $(QT_CXXFLAGS) $(INCDIR) + +# `make` builds BOTH executables: the normal one and the LGAD strip-xel one +# (the decoder is header-only, no extra library). +all: $(BIN) $(BIN_JFSTRX) + +# the strip-xel decoder header is header-only and lives outside this directory: +# touch it and the variant that uses it must be rebuilt +STRIXEL_HDR = $(CAL)/dataStructures/jungfrauLGADStrixelsData_new.h + +%.JFSTRX.o: %.cpp online_jf.h $(STRIXEL_HDR) + $(CXX) $(ALL_CXXFLAGS) -DJFSTRX -c $< -o $@ + +%.o: %.cpp online_jf.h + $(CXX) $(ALL_CXXFLAGS) -c $< -o $@ + +gate_contig_test: test/gate_contig_test.cpp online_jf_core.o online_jf_root.o online_jf_h5.o + $(CXX) $(ALL_CXXFLAGS) -o $@ $^ $(LIBS) + +$(BIN): $(OBJS) + $(CXX) -o $@ $(OBJS) $(LIBS) + +$(BIN_JFSTRX): $(JFSTRX_OBJS) + $(CXX) -o $@ $(JFSTRX_OBJS) $(LIBS) + +# kept so the old habits still work +normal: $(BIN) +jfstrx: $(BIN_JFSTRX) + +# Synthetic slsReceiver stand-in used to exercise the program without +# hardware (see test/jf_feeder.cpp). +feeder: test/jf_feeder + +test/jf_feeder: test/jf_feeder.cpp + $(CXX) -std=c++17 -O2 -pthread $(INCDIR) -o $@ $< $(ZMQ_STATIC) -lsodium -lpthread -lrt -lm + +clean: + rm -f $(OBJS) $(JFSTRX_OBJS) $(BIN) $(BIN_JFSTRX) test/jf_feeder + +FORCE: + +.PHONY: all clean jfstrx normal feeder diff --git a/slsDetectorCalibration/jungfrauExecutables/jf_online_display_gui/NOTES.md b/slsDetectorCalibration/jungfrauExecutables/jf_online_display_gui/NOTES.md new file mode 100644 index 000000000..483b075a1 --- /dev/null +++ b/slsDetectorCalibration/jungfrauExecutables/jf_online_display_gui/NOTES.md @@ -0,0 +1,950 @@ +# Notes + +Working notes for `jf_online_display_gui`. The README is the reference for how the +program behaves; this file records provenance, verification and things that are +easy to trip over. + +## 2026-09-23 — handoff from another session (verified here) + +An all-night run showed the **display followed the pedestal drift but the saved +HDF5 did not**. Three changes were made by that session and are on disk; I +re-verified them in this workspace on 2026-09-23. + +### What changed + +| file | change | +|---|---| +| `online_jf_h5.cpp` | `RoiSaver::offer()` corrects each frame with the **live** pedestal (`PedestalStore::instance().get()`), not the snapshot taken by the GUI at Start Save. Periodic checkpoint: shrink `/data` + the 14 parameter datasets to exactly `framesWritten` (undoing the `kExtendBlock = 128` over-allocation), `H5Fflush(SCOPE_GLOBAL)`, rewrite the JSON. JSON writer factored into `writeJsonSidecar(bool complete)` writing `.json.part` → `fsync` → `rename` → directory `fsync` (`syncDirOf`). File created as **v110 (SWMR)**: `H5Pset_libver_bounds(LATEST)` + `H5Fcreate`, all objects created up front, then `H5Fstart_swmr_write()` before the first frame. | +| `online_jf.h` | `StartInfo::checkpointMs = 30000` (0 disables) | +| `README.md` | pedestal tracking / saving / file format / JSON / crash-and-mid-run sections, test description, files table | +| `test/pede_live_test.cpp` | standalone check: live pedestal + checkpoint + SWMR live read | + +Consequences of SWMR worth remembering: objects cannot be created after it +starts, so `/pedestal tracking` and `/pedestal tracking frame` are now created +(empty) for **every** save, and the baseline pedestal image is written just after +the SWMR switch. (The 10-minute cadence of that series, and its ROI-shaped +images, are unchanged.) + +### Verification done here + +* `make` — clean, binary current with the sources. +* `test/pede_live_test` (built with the README's line, plus `$(root-config --cflags)` + which that line omits) — **PASS**: + +``` +checkpoint1: periodic json (complete:false)=true live swmr read=true h5 extent=1 px=900.0 +checkpoint2: live swmr read=true h5 extent=2 slice1 px=850.0 +final: complete=true no .part left=true +PASS: live pedestal + periodic clean checkpoint +``` + +The two different pixel values are the point: the first frame was corrected with +pedestal A, the second with pedestal B installed mid-run, so the file follows the +tracked pedestal. Generated artefacts were deleted afterwards. + +### Operational caveats + +* **v110 needs HDF5 ≥ 1.10.** Older analysis installs cannot open these files at + all — this is the one to check before an overnight run. +* **Reading mid-run needs the SWMR read flag**: `h5py.File(path, "r", + libver="latest", swmr=True)` and `dset.refresh()` to see new frames. + `h5dump`/`h5ls` on the live file will not work. A closed file reads normally. +* `Pedestal corrected` is still **off by default** (raw data). Pedestal tracking + only reaches `/data` when it is ticked; in raw mode the only pedestal in the + file is slice 0. +* `/pedestal data` is the pedestal at save start; `/pedestal tracking` + (+ `/pedestal tracking frame`) is the history of what was actually used, one + image per checkpoint interval. +* `checkpointMs` defaults to 30 s and is **not exposed** in the GUI or on the + command line yet. + +### Open / optional + +* `--no-swmr` (or a `StartInfo` fallback) if a downstream reader turns out to be + on HDF5 < 1.10. +* Expose the checkpoint interval (`--checkpoint MS` and/or a GUI field). +* If an external reader does not see new frames after a checkpoint, add explicit + per-dataset `H5Dflush`; `H5Fflush(SCOPE_GLOBAL)` was enough in the test. +* Unrelated: the older `onlinedisp_zmq.cpp` extracts the ROI from + `zHeader.detSpec1`, which is a hack (that field is the bunch id) — the stream + header already carries `zHeader.rx_roi` (`std::array`, filled from the + receiver's per-port ROI). That file was not touched. + +## Workspace health + +* `../_AGENT.txt` was rewritten (2026-09-23, on request): it now points at + `jf_online_display_gui/` as the active work, with the old `onlinedisp_zmq` + + `jf_event_finder_*` set kept in a clearly marked "legacy / superseded" + section. The design rules that both generations share (ROOT-thread rule, + photon map, display cadence, gate semantics, SWMR files) are listed there too. +* `test/_run/` was removed (2026-09-23, on request). For the record, what was + in it was not worth keeping: the `..._084120_...` run had only its sidecar left + (the HDF5 was already gone) and `..._090709_...` had `frames.saved = 0` — an + empty save written before the handoff, with no `complete` field. `test/` now + holds only `jf_feeder[.cpp]` and `pede_live_test.cpp`. +* `jf_online_display_gui/` and the h5/write path are untracked in git; nothing here is + committed. +* `.gitignore` in this directory excludes `*.o`, the `jf_online_display_gui` and + `test/jf_feeder` binaries, and runtime data (`current_pede.dat`, + `roi_list.dat`, `save_dest_list.dat`, `jfroi_*.h5/json`). Note it does *not* + cover `test/pede_live_test` (the test binary), so that one should be deleted + after use. + +## 2026-09-30 — JFSTRX display + startup defaults + +* `-DJFSTRX`: the **ADC and gain windows are now unmapped** (raw 1024x512), so + gate-ROI selection and the hover read-out stay in raw coordinates. The mapped + view is a separate, display-only window, **"ADC Strixel Panels (JFSTRX)"**, + with the six groups arranged like the ROOT canvas (left chip1 g3/g2/g1, right + chip6 g1/g2/g3). +* The six panels use the strixel **pixel aspect** `X = 75*(75/Y)`, `Y = + 25/15/18.75 um` -> 9:1, 25:1, 16:1, via `FastImageView::setPixelAspectX` + (non-uniform x/y scaling; ADC and gain stay square). +* The receiver ROI is parsed from the JSON `rx_roi` array (the old `detSpec1` + hack is gone) and drawn as the **red** rectangle on the raw ADC image. +* Raw geometry is now `kRawWidth`/`kRawHeight` (1024x512); `nx`/`ny` under + JFSTRX are the strixel *display* geometry only. Fixed the assembled-frame + height, the multi-interface slab split, the gate-ROI defaults and the HDF5 + pedestal extraction, which all wrongly used the mapped `nx`/`ny`. +* **Startup defaults changed**: the signal gate is **off** (`--gate` enables it) + and pedestal subtraction is **off** (`--use-pede` enables it; the "No pede" + button starts checked). README examples now pass `--gate` where gating is + expected. +* `test/panel_map_test.cpp` (JFSTRX objects) checks the six-panel fill geometry + against the decoder: all six panels fully covered, only the decoder's 183 + extra right-edge columns dropped (same as the ROOT histograms). +* The strixel ROI-outline experiment (`buildReceiverRoiOutline`) was removed - + ROI on the mapped panels was judged too complex. +* At ~14:40 the on-disk `jf_online_display_gui` was found truncated to 0 bytes + (concurrent build in this directory); `make jfstrx` rebuilt it (14:41). + +## 2026-09-30 (later) — three reported bugs + +1. **Zoom-out stopped early** (`FastImageView::wheelEvent`): it called + `matchViewportToWindow()` on every wheel step, so the image dimension that + reached its limit first froze the other and the whole frame could never be + shown. Outward zoom now only `clampViewport()`s; the window-shape matching + still runs while zooming in and on resize. +2. **ROI PH (A7) empty**: the fill condition used `gate_.roiActive()`, which is + only true while "ROI only" is on, so a merely *selected* ROI left A7 empty. + The ROI snapshot/spectra now use `gate_.roiSet()`; "ROI only" still controls + the gate restriction (unrelated to showing the ROI). +3. **"Reset His" took 30-50 s**: the ROOT thread executed the reset and blocked + on `gHistoMtx`, which the analysis thread holds around every frame - under + the heavy JFSTRX fill it can starve. The reset is now performed by the + analysis thread at the top of its next frame (lock already held), with a + non-blocking `try_lock` fallback on the ROOT thread for the idle case. The + ROOT thread also now wakes immediately (`gCmdCv`) for commands and forced + redraws instead of waiting for the `ROOT update (ms)` tick, so a large + update interval no longer delays a button. + +**Build footgun:** the Makefile does not track flags. After `make jfstrx`, +a plain `make` only rebuilds changed files and then links a mix of JFSTRX and +non-JFSTRX objects (I hit a link error that way). Always `make clean` before +switching between `make` and `make jfstrx`. + +## HDF5 C++ headers (build dependency) + +`#include "H5Cpp.h"` needs the HDF5 **C++ dev** package, not just the runtime: + +| distro | package | where the header lands | +|---|---|---| +| RHEL / Rocky / Alma / Fedora | `hdf5-devel` | `/usr/include/H5Cpp.h` | +| Debian / Ubuntu | `libhdf5-dev` | `/usr/include/hdf5/serial/H5Cpp.h` | +| openSUSE / SLES | `hdf5-devel` | default include dir | +| Arch | `hdf5` | `/usr/include` | +| conda-forge | `hdf5` | `$CONDA_PREFIX/include` | +| macOS (brew) | `hdf5` | `$(brew --prefix hdf5)/include` | + +The Makefile now discovers the include/library dirs via `pkg-config` (`hdf5` or +`hdf5-serial`) and `h5c++ -show`, and both can be overridden, e.g. on Ubuntu: + +``` +make HDF5_INC=-I/usr/include/hdf5/serial \ + HDF5_LIB=-L/usr/lib/x86_64-linux-gnu/hdf5/serial +``` + +## 2026-10-06 — external review (`../../../REVIEW_CLAUDE.md`): triage and what was applied + +A 39-item review by Claude covers this program plus the Qt6 port, the legacy +tools, `test_bench/` and repo hygiene. **Part of it was written against a +different checkout**: items 2, 3, 4 (mostly) and 9 are already fixed in *this* +tree, and the review's own item 37 mentions `build-qt6/` cache paths under +`~/swtests/slsDetectorPackage/...`, which does not exist here. Everything below +was checked against the code in this workspace before touching it. + +### Applied and verified here + +| item | what was wrong | fix | +|---|---|---| +| 4 (rest) | a header with **no data part** would make the data `recv` swallow the next message's header as pixels | require `ZMQ_RCVMORE` after a valid header, else count an error and drop the header (the header-length clamp and the drain-on-reject paths were already present) | +| 8 | the save recorded the **startup** gate settings, so `gate` in the HDF5 attribute and JSON sidecar was wrong after any live edit | read `enabled/threshold/minPixels/contiguous` from `GateEngine` (new getters) instead of `g_cfg`; verified end to end - a save started from the command line records the live values (`threshold 137`, `min_pixels 9`) | +| 11 (part) | the acq thread **busy-spun at 100 % CPU** waiting for a lagging partner: a held slab kept its socket polled and level-triggered `zmq_poll` fired forever | clear `events` for a socket whose slab is held, so it is not polled until it is released | +| 18 | ten shortcuts never fired: `QKeySequence("s") == QKeySequence("S")`, so s/S, b/B, r/R, o/O, p/P were ambiguous and Qt activated neither | upper-case actions are now `Shift+S/B/R/O/P` (verified: `Shift+S` opens Set Ranges, 352 → 366 windows) | +| 19 | the run examples still passed the removed `` argument, so `2000` was parsed as the host | README examples, the header comment and the Makefile comment corrected (the two remaining `` mentions are the *legacy* chain and a historical note, both correct) | +| 22 (part) | `--pede-tracking` left the button unchecked, and `--gate-roi` left `ROI only` unchecked so the first press toggled the wrong way | the tracking button is initialised from `gPedeTracking`, and a restricting `--gate-roi` now checks `ROI only` (through the `m_applyingRoi` guard, so nothing re-captures or warns) | + +### Found while fixing item 22 — a bug of my own + +The tracking button's enable rule lived in the 500 ms `updateFlow()` poll, which +also *unchecked* the button when the gate was off. During start-up that cleared +a `--pede-tracking` button (`ptrack=off`, reproduced headless). The force-off is +now event-driven (in the gate checkbox's own handler); the poll only enables. +After the change: `--pede-tracking` gives `ptrack=on`. + +`test/jf_feeder` had also gone missing from the tree (the Makefile has no target +for the test programs — review item 34); rebuilt by hand for the verification. + +### Already fixed in this tree (nothing to do) + +| item | state | +|---|---| +| 2 (HDF5 never closed) | the file is built with the C++ constructor `H5File(h5Path, …)` so it owns the only reference; the code comments say so explicitly | +| 3 (budget/stop not enforced) | `offer()` returns early on `stopRequested`, and the writer stops at `saved >= maxFrames` | +| 4 (clamps) | `hn > hdr.size()` clamp, `truncated` data check and the drain-on-reject paths are all present | +| 9 (cumulative drop rate) | uses the 1 Hz window (`pedeTrackSignalDropRate(passCur, dropCur, …)`) — fixed earlier the same day | + +### Checked and found *correct* (not defects) + +While verifying item 8 I chased two values in a saved file that looked wrong and +are not: the file recorded `enabled: false` and `no_pede: true` for a run whose +command line had neither `--gate` nor `--use-pede`. Both are the documented +defaults - `online_jf.h:189` (`gateEnabled = false`) with `--gate` to enable, and +`gNoPede{true}` with `--use-pede` to clear. The review's item 22 is the flip +side of this (the widgets were not synced from the config); the config itself is +intentional. Since it is easy to lose an hour to this, both switches are now +spelled out in the README's options section, and a regression run with +`--gate --use-pede` behaves as expected (with a 100 ADU pedestal and a 250 ADU +threshold on 3000/200 ADU frames: `pass=0 drop=148`, i.e. the ROI half is +reduced to 100 and correctly rejected). + +### Deliberately deferred, with reasons + +* **13 — chip/ROI spectra saturate (top physics item).** `TH1I` bin contents + saturate at `INT_MAX` and the `uint32_t` accumulators wrap: ~55 k pixels per + chip per frame land in 1–2 noise bins, so at 500–1300 fps the spectra are + wrong within an hour, and an all-night run at 25 fps is close to the limit too. + The fix is mechanical but wide (37 `TH1I` sites across four files plus the + accumulator and sync signatures) and touches the core data path, so it gets + its own careful pass with a test rather than a rushed edit at the end of a + long session. Plan: accumulators → `uint64_t`, histograms/clones → `TH1D`, + then check that entries, means and the ADU/keV ratio (40.0000) are unchanged. +* **10** (the tracker can overwrite a just-loaded pedestal — re-prime from the + store under the lock, skip a stale install), **12** (per-port `rx_roi` with the + `rowBase` offset), **20** (closing the window should quit — the parentless ADC + /Gain windows keep the process alive), **21** (Delete in the ROI/save-destination + dialogs uses stale indices), **23–30** (races on `g_pheneThreshold`/the ROI, + `renderImage`'s 524 k `setPixel` calls and the 500 ms `roi_list.dat` re-read, + NaN pedestals, rapidjson asserts, the finish/start save race, frame 0, and the + small GUI defects). +* **11 (the rest)** — partial-frame assembly is a feature, not a fix; the README + now documents the real behaviour and calls the promise an open item. +* **Everything outside `jf_online_display_gui`** — the Qt6 port (1, 16, 17, 35, 36), the + legacy tools (5, 6, 7, 14, 15, 31 — the project's own `_AGENT.txt` marks them + superseded), `test_bench` (32), repo hygiene (33, 37, 38 — `git checkout --` + for the symlinks needs repository write access, which is still deferred) and + maintainability (39). These need decisions of their own; none of them were + changed here. + +## 2026-10-14 — virtual photon counting: display side done, save side specified + +Requested: take the photon map out of ROOT, give it its own Qt window filled the +same way but **not cumulative by default** and plotted every N images (default +2000), put those controls plus the photon threshold in a "Virtual photon +counting" panel left of the Display, and add a save mode that writes the +non-cumulative maps every M images (M >= 200) with the first frame number and +timestamp, M and the thresholds recorded. + +### Done (build green, window present, no crashes) + +* Core: `gPmapEvery` (default 2000) and `gPmapCumulative` (default **false**) + atomics; the photon map is published into the image mailbox every + `gPmapEvery` **analysed frames** (independent of the ADC image decimation), + and when not cumulative the accumulator is zeroed right after the publish, so + each image holds the photons counted since the previous one. The counting + itself is unchanged. +* GUI: a **"Virtual photon counting"** panel (left column, under the gates - + the Display panel is in the right column at that height) with the + `cumulative` checkbox, `plot every N images` (1..1000000, default 2000) and + the **photon threshold (ADU)** spin moved out of the Display group. +* GUI: a new top-level window **"Photon Map (virtual photon counting)"** + (1104x552, same colour palette as the ADC image, colour range 0..8 photons + per pixel), refreshed from the mailbox in `processImages()`. +* Fixed while doing it: the panel was built before `photonThrSpin_` existed, so + the grid received a null widget and the spin floated at (0,0) - the same + add-before-create mistake as the Quit button earlier. The panel is now + created after the spin and inserted with `leftCol->insertWidget(2, ...)`. + +### Stage 3, part A — done and verified + +* **The ROOT photon map is gone**: no `his3000` booking, no `disp3000` clone and + no `A5` canvas. All the remaining references are behind `if (his3000)` / + `if (disp3000)` / `if (A5)` guards, so they are simply inert; the two + unguarded dereferences (the clone and the z-range) were the only ones that + needed deleting. Verified: no `Plotting Canvas Photon Map` window appears. +* The **P.Map** range pair now reads and writes the Qt photon window's colour + range (`liveMapRange` -> `m_photonView->colorRange`, and the panel's opening + range), and the ADC zoom also sets the photon window's viewport. +* **Save with no gate ROI works**: the early refusal in `toggleRoiSave` is gone; + `roiSnapshot()` already reports the full frame when no ROI is set. Verified: + with no `--gate-roi`, `/data` came out `(151, 512, 1024)` - the pedestal slice + plus 150 full frames. + +### Stage 3, part B — the photon-map save mode (next) + +Design, so this can be written mechanically: + +1. Save panel: a radio pair (`save frames` / `virtual photon counting`) plus an + `M` spinbox, minimum **200**, default 2000; the spinbox is only meaningful in + the photon mode. +2. Core: `gPmapSaveEvery` (int, default 2000) and `gSaveMode` (0 = frames, + 1 = photon maps) atomics; a **second accumulator** `g_pmapSaveAccum` (NCH + floats) filled in the same worker pass (one extra add per counted photon + pixel, gated by a `FrameJob::pmapSave` flag so there is no atomic read per + pixel); every `gPmapSaveEvery` analysed frames it is copied into a single-slot + mailbox and zeroed - never cumulative. +3. Window provenance: the acq thread owns the saver, so let the acq loop keep the + window bookkeeping while in this mode: on the first gate-passed frame after a + publish record `firstFrame = hdr.frameNumber` and `firstStamp = + hdr.timestamp`, count frames, and when the analysis publishes a map, tag it + with those two values. The map's own frame count goes in too. +4. Writer: a new dataset `/virtual photon counting` (float32, 512x1024, one image + per publish, extendable) plus `/virtual photon counting frame` (uint64) and + `/virtual photon counting timestamp`; JSON gains `save_mode`, + `photon_map_every` (M), `photon_threshold` (ADU) and the window count. + `/data` stays frames-only and is not created in this mode. +5. `--pmap-every N` on the command line would make this testable without the GUI + (the display cadence is otherwise 2000 frames = 80 s at 25 fps). + +### Stage 3, part B — plumbing in place, inert + +Done in the tree and building: + +* `gSaveMode` (0 = frames, 1 = virtual photon counting) and `gPmapSaveEvery` + (default 2000) atomics, plus `pmapSaveReset()`. +* A **second accumulator** `g_pmapSaveAccum` filled in the same worker pass + (`FrameJob::pmapSave`, so no atomic read per pixel), published into a + single-slot `PmapSlot` every `gPmapSaveEvery` analysed frames and zeroed + immediately - never cumulative. +* `Pipeline::offerToSaver()` replaces the two direct `saver_.offer()` calls: in + the frame mode it is the old path, in the photon mode it keeps the window + bookkeeping (first frame number, first timestamp, frame count) in the acq + thread and tags each published map with it. +* `RoiSaver::offerPhotonMap()` declared; its body currently only counts the map + in `pmapPending` and writes nothing - **deliberately inert**: `gSaveMode` is + still 0 everywhere, so no path can select the photon mode yet and the existing + behaviour is unchanged. Nothing can silently produce a frames-only file while + claiming the photon mode. + +Still to write (the design is above): + +1. The writer body: `/virtual photon counting` (float32, 512x1024, extendable, + **created up front** because SWMR forbids creating objects after the start) + plus `/virtual photon counting frame` and `/virtual photon counting timestamp` + (uint64), drained from a `pmapQueue` in the writer loop, and the JSON fields + (`save_mode`, `photon_map_every`, `photon_threshold`, window count). +2. The Save panel controls: the radio pair (`save frames` / + `virtual photon counting`) and the `M` spinbox (minimum 200), filling + `StartInfo::photonMode/photonEvery/photonThreshold` (the fields are already + there) and calling `pmapSaveReset()` when a save starts. +3. `--pmap-every N` and `--pmap-save-every N` (or one `--save-photon` switch) so + the mode can be exercised headlessly; with the display default of 2000 frames + a test needs 80 s at 25 fps otherwise. + +### Stage 3, part B — finished and verified (this session) + +Everything listed as "still to write" above is in the tree, plus the GUI +controls and the headless switches: + +* Writer: `/virtual photon counting` (float32, {nmaps, h, w}, chunked, created + before SWMR starts) + `/virtual photon counting frame` + `/virtual photon + counting timestamp` (U64, one value per map), drained from `Impl::pmapQueue` + in the writer loop; `RoiSaver::offerPhotonMap()` is live and inert unless + `info.photonMode` and a save is running. JSON: `save_mode`, + `photon_map_every`, `photon_threshold`, and a `photon_maps` block with + `saved`, `every`, `threshold_adu`, `cumulative: false`, `pedestal_active`, + `dataset`. In photon mode `frames.saved` reports the **maps**. +* Budget: in photon mode "Number of frames to be saved" budgets the **maps** + (the GUI relabels the row to "Number of photon maps to be saved"), and the + run stops by itself with `stop_reason = "photon-map budget reached"`, leaving + a closed `complete: true` pair. Frame mode is unchanged + (`frame budget reached`). +* Save panel: radio pair + `photon map every N frames` spinbox (minimum 200, + greyed while "save frames" is selected). The radio also re-labels the budget + row. The photon-map mode is allowed with **no gate ROI** (full frame). +* Virtual photon counting panel (left column, under the gates): `cumulative` + (default **off**), `plot every N images` (default 2000), `photon threshold + (ADU)` (moved out of the Display panel). The map lives in its own Qt window + `Photon Map (virtual photon counting)`; it is **not** a ROOT histogram any + more (that was the old `his3000`, removed). +* CLI: `--pmap-every N`, `--pmap-save-every N` (min 200), `--save-photon`, + `--save-budget N`, `--start-save` — the same actions as the GUI controls, so + a save can run headless. + +**Bug found and fixed while verifying (important).** Step 5a of the analysis +loop (the save-map publish) took `gHistoMtx` although the enclosing frame scope +already holds it (`histoLock`, top of the frame). `std::mutex` is not +recursive, so the **analysis thread deadlocked on the first frame** whenever +`gSaveMode == 1` — with `--save-photon`, and even with no save running. The +symptom was a program that kept counting frames (`in=` growing, because the acq +thread does not depend on the analysis thread) while nothing downstream ever +appeared: no photon map, no ROOT update, `save=0/0`. Two `gdb` snapshots +caught it (`analysisLoop` parked in `pthread_mutex_lock` at a call site that +only exists in the photon path). Fix: no second lock (the frame scope holds it) +and the whole save-map path is now gated on `saver_.running()` as well, so +`gSaveMode == 1` without a running save costs nothing and cannot block. + +**Verified end to end** (Xvfb + mwm, `test/jf_feeder`, zero-filled pedestal — +the real `current_pede.dat` is ~2000 ADU, so the synthetic 100/300 ADU frames +would count nothing): + +| check | result | +|---|---| +| `--save-photon --pmap-save-every 200 --start-save`, 40 s | maps at frames 0/201/401/601/801, `[pmap] map N written (200 frames, first frame F)` | +| `/virtual photon counting` | (5, 512, 1024) float32; every map 40 non-zero pixels, sum ~5320 (40 px x 133 counts = 2/3 of 200 frames), identical maps = non-cumulative | +| provenance | `/virtual photon counting frame` `[0 201 401 601 801]` | +| `--save-budget 2` | exactly 2 maps, self-stop `photon-map budget reached`, `complete: true` | +| frame mode `--save-budget 100` | `/data` (101, 512, 1024), 100 frames, `frame budget reached`, no photon datasets | +| GUI path | clicking `virtual photon counting` re-labels the row to *Number of photon maps to be saved*, enables the M spinbox and sets `Status: saving virtual photon counting maps`; `Start/Stop save` then writes maps (first map at the frame the save started, e.g. 431) | +| photon window | `Photon Map (virtual photon counting)` renders the 40-pixel cluster (green, ~133 counts on the 0..256 scale) | +| no pedestal | `--save-photon` with `--no-pede` (or no pedestal file) is **refused**: `[save] refusing virtual photon counting: "No pede" is on, ...`, no HDF5 file is created, and the scripted `--start-save` path is not blocked by a dialog; frame mode with no pedestal still saves | + +The photon-map window draws **zero-count pixels white** (`FastImageView:: +setZeroWhite`, opt-in and used only there), reproducing the ROOT `colz` look +where empty cells show the canvas background; the palette and the colour bar are +untouched, and single photons are still coloured (the special case is `v <= 0`, +not "below the range"). Verified on screen: white map, cluster still green. + +Housekeeping: `test/_scratch/` (XTest driver, screenshots, run logs, HDF5 +outputs, the synthetic pedestal) was removed after the runs; the tree keeps only +`test/jf_feeder[.cpp]`, `test/pede_live_test.cpp`, `test/panel_map_test.cpp`. + +Two things left open for the next session, both decisions rather than bugs: + +1. ~~**Photon counting needs a pedestal.**~~ **Decided by the operator: no + photon-map saving without a pedestal.** Counting still requires `g0` + (unchanged), and a virtual-photon-counting save now *refuses to start* when + no pedestal is active (`No pede`, or nothing loaded): the button drops back, + the status line and stdout say why, no file is created, and the modal warning + is skipped under `--start-save` so scripted runs never wait on a dialog. + Frame saving is unaffected. +2. The map's `first frame number`/`timestamp` come from the acq thread, i.e. + from the first **gate-passed** frame of the window (none is available if the + gate drops the whole window, in which case the previous values persist). The + analysed-frame count in `PmapItem::frames` is exact. + +### ROI in photon mode, greying convention, control names (follow-up) + +* **The gate ROI applies to the saved photon maps too** (operator's choice): + a map is the ROI window of the full-frame counting map, cropped in the same + data coordinates as `/data`. This fixed a real bug: `writePhotonMap` used to + hand `h*w` floats straight to HDF5, i.e. the first `h*w` pixels of the + 1024x512 map, which is the *wrong region* whenever a ROI is set. Verified + against the full-frame map: `/virtual photon counting` for a `0 0 100 50` ROI + is bit-identical to `full[0:50, 0:100]`, with the 16 non-zero pixels exactly + where the feeder's wrapped cluster is (row 1, x 0..15); a frame save with the + same ROI gives `/data` `{nframes, 50, 100}`, so both modes crop alike. +* **Greying is a look, not an enablement** (`greyStage(QGroupBox*, bool, + std::initializer_list keepActive)`): the box, its title and its + other contents dim, while the widget that *switches the stage back on* keeps + normal text - otherwise a bypassed stage looks stuck. Kept readable: + `Pede/Raw toggle` (Pedestal), `Gate enabled` (signal gate), `Pedestal + tracking`, `gain correction on/off` (Gain), and the storage-cell combo. The + `keV PH` checkbox stays disabled+greyed while the gain is off (earlier + request: it keeps its tick for next time). +* **Virtual photon counting box greys without a pedestal** (`greyStage( + pmapGroup_, !pede)`), matching the fact that the counting needs `g0` and the + save refuses to start: one rule, the panel and the file agree. +* Renames: `No pede (raw ADC)` -> **`Pede/Raw toggle`** (state still spelled out + by the label next to it), `Apply gain (g)` -> **`gain correction on/off (g)`**, + plus a read-only **`gain corrected`** indicator beside it (no mouse events, no + focus; it ticks with the flag in `updateFlow()` and dims with the panel). + +* Pedestal tracking panel follow-up: the button is `pedestal tracking on/off` + and the box now greys on **selectability**, not on activity - `greyStage( + pedeTrackGroup_, !gateOn)`, matching the button's own `setEnabled(gateOn)`, + while the value label under it (`off` / `on: N samples, ...`) reports the + activation. Verified in three states: gate off -> box and button greyed; + gate on + tracking off -> box black and label `off`; after clicking the + toggle -> button pressed and label `on: 0 samples, delta 0.0 ADU, 0 updates` + (0 samples is correct with the feeder, which only drops a third of the frames + while the tracker needs >90 %). + +### Photon threshold in keV while the gain correction is on + +Requested: leave the photon-counting threshold in ADU with the gain off, switch +it to keV (default **4 keV**) with the gain on, and remember both values. + +* Core: `g_pheneThresholdKev` (default `PHOTON_THRESHOLD_KEV_DEFAULT` 4.0) next + to `g_pheneThreshold` (150 ADU). The analysis picks by `gain_flag` and hands + the worker `FrameJob::pcGain` / `pcNominalGain`, so the counting value is + `adcpedecorr / (g0[i] or 40)` - the same ADU/keV the keV spectra use - and the + increment follows in the same unit: `(value + thr) / (2 x thr)`. The unit + follows the gain stage itself, not the `keV PH` checkbox (that one only + decides what the spectra display). +* GUI: the threshold row is a `QDoubleSpinBox` (integer ADU, one decimal keV) + whose label switches `(ADU)` <-> `(keV)`; `setApplyGain()` stores the value + that is on screen into its own unit and loads the other one (signals blocked), + so toggling never destroys either. `--apply-gain` added as the CLI mirror of + the Gain button (the gain stage was the only one without one) - needed to test + this headlessly. +* Reported: `--stats` prints `pthr=150ADU` / `pthr=4keV`; the JSON carries + `photon_threshold_unit` and `photon_maps.threshold` + `threshold_unit` + (`threshold_adu` is gone - the key was wrong as soon as the unit could + change). +* Verified with the synthetic feeder, a zero pedestal and a **g0 = 1.0 + ADU/keV** gain map (float64 - the loader wants 6 x 1024x512 doubles; a float32 + file is rejected with the byte count): + - gain off: `pthr=150ADU`, one 200-frame map with **40 non-zero pixels, sum + 5320, max 133** - i.e. only the 300 ADU cluster, unchanged from before; + - `--apply-gain`: `pthr=4keV`, the **same frames** give **524288 non-zero + pixels** (every pixel: keV = ADC/1.0, so even the 100 ADU baseline is + 100 keV > 4 keV) with max 5925 - proof that the counting really divides by + ADU/keV before comparing; + - GUI: starting with `--apply-gain` shows `photon threshold (keV): 4.0`; + clicking the gain off shows `photon threshold (ADU): 150`; clicking it back + on gives a screenshot byte-identical to the first keV one, so both values + survive the round trip. +* Mid-save guard: toggling the gain while a photon-map save runs changes the + unit of the maps written after it, so `setApplyGain()` prints + `[gain] warning: the photon-counting unit is now keV while a photon-map save + is running ...` (and the same for ADU). Verified with a photon save started + by `--start-save` and a gain click: the warning appears once, the save keeps + running and writes its map, the JSON keeps the start-of-save threshold/unit. + +### Window handling, labels and the flow arrows + +* **Quit closes every window.** The ADC / gain / photon-map windows are + separate top-levels and the ROOT canvases live in the ROOT thread, so + `quitApp()` and `closeEvent()` now call `closeSideWindows()` (hide + close + each) and `QApplication::quit()`. Closing only the control window used to + leave the side windows - and the process, because Qt quits on the *last* + window - on screen. Verified on all three paths with the window count taken + from `xwininfo -root -tree`: + - Quit button, dialog confirmed: 6 app windows -> **0**, process gone; + - Quit button with a photon-map save running: the save is flushed + (`[shutdown] flushing the ROI save ...`, JSON `complete: true`), then + **0** windows / no process; + - window-manager close (a `WM_DELETE_WINDOW` ClientMessage, the path that was + broken): confirmed -> **0** windows / no process. +* Gain panel label: the no-map case is now + `no gain map loaded : using defaults` (the "defaults" are the nominal + 40 ADU/keV, used for the keV spectra *and* the keV photon threshold). +* Flow arrows: two new connectors - **Gain -> Virtual photon counting** (the + calibration; its threshold is keV while the gain is on) and **Virtual photon + counting -> Display** (the map has a window of its own) - and the save path is + now **orange**: the Gain -> ROI rail and the ROI -> Save arrow. Blue stays + the analysis/display chain. `FlowStrip::Path` gained a `save` flag and + `makeFlowArrow()` a colour argument (`#4673af` blue, `#de7d14` orange). + Verified on screen in the gain-on/pede-on state: both new arrows land on the + right panels, the rail and the ROI -> Save arrow are orange, the rest blue. +* The `JF_TIMING` `[rect]` diagnostic also prints `quit`, `track` and `pmap` + now, which is how the click-based tests above locate those widgets. + +### Dynamic flow colours (arrows static, colours not) + +Reworked after the operator's feedback: the geometry of the diagram is fixed, +only the colour class of each connector changes. + +* Three classes (`FlowClass` + `flowColor()`): `FlowData` orange `#de7d14`, + `FlowNormal` light blue `#5b9bd5`, `FlowPedestal` lighter blue `#a8c8e8`. +* The **data path follows the save mode**: `FlowStrip::setSaveMode(photonMaps)` + flips the Gain -> ROI rail and the Gain -> counting connector, and + `updateFlow()` (called from the radio handler) flips the two label arrows + ROI -> Save and counting -> Save. So in `save frames` the orange pair is + rail + ROI -> Save, and in `virtual photon counting` it is Gain -> counting + + counting -> Save - exactly two arrows at a time. +* Completeness: every stage now has an incoming and an outgoing connector. + The missing one was **Virtual photon counting -> Save** (a new arrow under the + counting panel, the left-hand twin of ROI -> Save). Display and Save are the + sinks; the storage cell has no incoming connector because the receiver stream + enters there. +* The colour legend is in the flow strip's tooltip and in the README table. +* Verified on screen: frames mode -> rail + ROI -> Save orange, counting arrows + light blue; after clicking `virtual photon counting` (and the label switching + to "Number of photon maps to be saved") -> Gain -> counting and counting -> + Save orange, rail + ROI -> Save light blue. `[save] mode: ...` is logged on + every change. +* Test note: the `JF_TIMING` `[rect]` lines can be ~30 px stale (they are printed + on a layout pass that may run before the panels settle), so a scripted click + should target the widget with a small downward tolerance - found the hard way + when a radio click missed. + +### The gate is a funnel on the line (not a stage) + +Operator's rule: the signal gate does not modify the data, so no connector may +enter or leave its box. Reworked accordingly: + +* The flow is now `Pedestal -> [funnel] -> Gain` (and `[funnel] -> tracking`), + i.e. one junction where the gate acts, drawn as a small trapezoid on the line. + The gate panel's only connector is a short blue **control arrow** into the + funnel's side; with the gate off the funnel and that arrow are drawn pale + (`FlowOff`, #c9c9c9) instead of disappearing. +* Two feeders reach the funnel and both are always drawn: through the **Pedestal** + (`FlowPedestal`) and straight from the **storage cell** (`FlowNormal`), the + raw bypass that avoids the greyed Pedestal box. `setStages(pede, gate, pmap)` + makes the live one coloured and the idle one pale grey - so in raw mode the + data visibly comes from block 1, as the operator asked. +* `FlowStrip::Path` grew `x` (vertical position), `head` (false = merge into the + junction) and `startAtJog` (begin on the vertical, for the funnel -> Gain and + funnel -> tracking branches); `cross()` honours them; `drawFunnel()` paints the + symbol plus its control arrow; `kFunnelX = 24` is where the flow passes the + gate. +* `updateFlow()` calls `setStages(pede, gateOn, gSaveMode == 1)`, so the four + states (pede/raw x gate on/off) are all live: verified with screenshots in all + four combinations - pedestal feeder live + funnel blue (pede+gate), funnel and + control arrow pale (pede+no gate), bypass live and pedestal feeder pale + (raw+gate), and the bypass stays live with the funnel pale (raw+no gate). + +### Flow diagram, final pass (operator's corrections) + +* **Lighter blue is now only the pedestal tracking pair** - the gate block -> + tracking input and the tracking -> Pedestal feedback. The storage cell -> + Pedestal and Pedestal -> funnel connectors are part of the data flow, so they + are orange like the rest of the route. +* **Orange is the whole save route**, entry point to Save panel, and it follows + the mode: frames = storage cell -> Pedestal -> funnel -> Gain -> ROI -> Save, + maps = ... -> Gain -> VPC -> Save. Display-only branches stay light blue, and + in photon mode the Gain -> ROI rail is light blue as well. +* **A route that carries no data is not drawn** (the operator found the pale + grey confusing): the raw bypass exists only in raw mode, the Pedestal path + only while the pedestal is in use, and only the selected mode's Save arrow + (ROI -> Save or VPC -> Save) is shown. The one thing that still greys is the + gate funnel when the gate is off. +* The **tracking input** now leaves the top-right corner of the gate block + (`yIn(sigGroup_, 6)`), not the funnel. +* Verified with screenshots in four states: pede+gate frames (orange: SC -> + Pedestal -> funnel -> Gain -> rail -> ROI -> Save; bypass absent; tracking + pair lighter blue), the same in photon mode (orange through Gain -> counting + and the counting -> Save arrow, rail light blue, ROI -> Save absent), + raw+gate frames (orange storage cell -> funnel -> Gain -> ROI -> Save; the + Pedestal box carries no in/out at all, only the tracking feedback), + and pede+no-gate (funnel and its control arrow pale, everything else + unchanged). + +### The display path and the save path can differ (last refinement) + +The operator pointed out that the orange route must follow the *save* logic, not +the `Pede/Raw` toggle: `flowStageStates()` now computes + +* `displayPede = PedestalStore::loaded() && !gNoPede` (unchanged: the display, + gate, spectra and the map accumulation), +* `savePede = (gSaveMode == 1) || (saveCorrected_ && !gNoPede)` (the maps always + need `g0`; the frames are corrected only with the checkbox), +* and `FlowStrip::setStages(displayPede, savePede, gateOn, photonMaps)` draws: + +| situation | what the diagram shows | +|---|---| +| display pede, `save frames`, `Pedestal corrected` **off** (the default!) | Pedestal feeder **light blue** (display only) + bypass **orange** (the file) - both live, the divergence visible | +| `Pedestal corrected` **on** (or photon maps) | Pedestal feeder **orange**, bypass not drawn | +| `Pede/Raw` = raw (both raw) | Pedestal path not drawn at all, bypass orange | +| photon mode | pedestal route orange through Gain -> counting -> Save; the Gain -> ROI rail is light blue and the ROI -> Save arrow is absent | + +`saveCorrected_` also got a `toggled -> updateFlow()` connection (it had none) so +the diagram follows the checkbox, and a `saveCorrected` entry in the `[rect]` +geometry diagnostics for the click tests. + +Verified with screenshots: `--use-pede --gate` in frames mode showed the blue +storage cell -> Pedestal -> funnel next to the orange storage cell -> funnel -> +Gain -> ROI -> Save (both feeders into one funnel), and clicking `Pedestal +corrected` turned the pedestal route orange and removed the bypass. + +### ROI input arrow + "Unset ROI" button + +* The ROI's incoming connector is now mode-dependent and always orange: + `Gain -> ROI` (the rail) while frames are written, `counting -> ROI` (a new + connector) while the maps are - they are cropped to the ROI on the way out, so + the ROI is only ever on the save path. Only one of the two is drawn at a + time; `setStages()` flips them with `p4_.on = !photonMaps` / `p9_.on = + photonMaps`. +* New **Unset ROI** button in the ROI panel (`unsetRoi()`): releases the "ROI + only" restriction if it is on, then `GateEngine::clearRoi()` (so `roiSet_` and + `roiOn_` are false and the rectangle is the full frame), clears the yellow + overlay, resets the counters and updates the read-outs. The ROI list file is + not touched. +* Verified: with `--gate-roi 100 50 200 100 --gate --stats` the live line showed + `roi=200x100@100,50`; clicking **Unset ROI** logged `[roi] ROI unset: full + frame` and the same line then showed `roi=off`, the panel reading + "no ROI selected | gate: full frame". In `--save-photon` (photon mode) the + screenshot shows the orange connector from the counting panel into the ROI and + no rail from the Gain. + +### Save-time locking, truthful JSON, ROI->Save, and small labels + +Operator requests, all in and verified with a running `--save-photon` run: + +* **The arrow into the Save panel always leaves the ROI** (never the counting + panel): `arrPmapDown_` is gone, `arrRoiDown_` is always drawn and always + orange. The maps reach the file through the ROI, which is also why the ROI's + own input flips between the Gain (frames) and the counting (maps). +* `cumulative` -> **`cumulative (toggle to reset)`**, and the toggle now really + resets (`resetHis()`), so the label is true. +* **`Pedestal corrected` moved under the `save frames` radio** (it is a property + of the saved frames; the maps are always pedestal-subtracted) and is greyed + while the photon-map mode is selected. +* **The save counters no longer read 0 in photon mode**: `RoiSaver::Status` + gained `pmaps` + `photonMode` (Impl::pmapsInFile, fed by the writer loop), so + the GUI status line says "N maps written, M dropped" and `--stats` says + `save=1map/0` instead of `0/0`. +* **Settings are locked while a save runs** (`applySaveLock()`): the whole save + panel except `Start/Stop save` and the status label, the storage-cell filter, + the manual pedestal work, the gain correction (keV PH stays live) and the + ROI select/load/unset buttons. Live on purpose: everything display-only, the + pedestal tracker, the gate **threshold** and **min pixels**. Those two open + `Changing settings during a run, are you sure?`; No puts the old value back + (`pipeline_.gate().threshold()/minPixels()`), Yes applies it and sets + `gGateChangedDuringSave`, which makes `writeJsonSidecar()` add + `gate_settings_modified_during_run: true` and a `gate_settings_note` (the + `gate` block stays the criterion from save start). The lock is applied on + start, released on stop - including the automatic stop (budget/error), which + `updateStatus()` detects through `m_saveWasRunning`. +* Verified on screen during a running photon-map save: save panel greyed except + Start/Stop, SC/pede/gain greyed, Threshold 150.0 and Min pixels 5 live, the + Virtual photon counting panel's two display controls live with the new label, + the photon threshold greyed, `Pedestal corrected` greyed under the frames + radio, and the Save status reading "1 map written, 0 dropped". + +### Layout bug (mine), destination list, "queue full" + +* **The `virtual photon counting` radio was rendered outside the Save box.** When + I moved `Pedestal corrected` under the `save frames` radio I dropped the + `saveForm->addRow(saveModePhoton_);` line, so the radio had no layout slot and + Qt gave it a default geometry (measured: x=9, y=915, 100x30 - i.e. floating at + the left edge above the Save box, which is exactly what showed up as a stray + "Virtual phot..." fragment). Re-added; the `[rect]` diagnostic now reads + `saveFramesRadio 21,996 | saveCorrected 21,1025 | savePhotonRadio 21,1054`, + all 788 px wide inside the box. (`layoutFlow()` also repaints the central + widget after solving now, which is cheap insurance against leftovers in the + pads' wake.) +* **The previous-destinations list is no longer polluted by the default**: the + start-up `--h5-dir`/`--h5-base` pair is captured once (`saveDefaultDir_`, + `saveDefaultBase_`) and a save that uses exactly that pair logs + `[save]

      / is the default destination, not added to the + previous-destinations list` instead of recording it. Verified: the list stayed + at 22 lines over a `--start-save` run with the default destination. My own + test entries (`*_scratch*`, 23 of them) were pruned from + `save_dest_list.dat`; the real `/mnt/sls_det_storage/...` destinations and the + `test/_run`/`testPHmapsave` entries were left alone. +* The dropped counter now reads `(writer behind: queue full)` and the README + explains it: the writer buffers at most 4096 items / 256 MB, so a slower disk + than the stream means the excess is dropped (and still counted by the gate + counters). + +* The drop note was attached unconditionally, so a healthy run read + "0 dropped (queue full)" - a problem that was not there. It now says + `0 dropped (nothing lost)` while nothing is lost and only switches to + `(writer behind: queue full)` when the counter is non-zero. Verified on a + running photon-map save: "1 map written, 0 dropped (nothing lost)". + +* The "Changing settings during a run, are you sure?" popup is now raised only + when **`Gate enabled` is ticked** (`confirmGateChangeDuringRun` returns early + on `!pipeline_.gate().enabled()`): with the gate off (passthrough) the + threshold and min-pixels change nothing about the saved frames, so they go + through silently and no `gate_settings_*` note is written. Verified with a + running save: gate on + clicking a gate spinbox -> dialog shown and declining + logged `[save] gate change refused during the run (Min pixels above threshold + -> 6)`; the same click with `--no-gate` -> no dialog, no log line. + +### Image windows redrawn as plots (frame, axes, pixel grid, scale panel) + +Operator request: replace the side colour bar with a panel and make the images +read as plots. + +* `FastImageView::imageRect()` now reserves axis margins (52 left / 26 bottom / + 6 top-right) instead of the old bar strip; `paintEvent()` draws the frame, + tick labels outside the plot (Y = data rows, row 0 at the bottom), a dotted + grid inside it, and keeps the gate-ROI / receiver-ROI overlays as before. +* `m_sx` (screen pixels per image pixel, from the last paint) drives the pixel + detail: thin outlines from 16 px, in-pixel values from 50 px + (`setIntegerValues(true)` for the photon map -> whole numbers, one decimal for + the real-valued images). The label colour is chosen from the luminance of the + pixel that was actually painted; the loops are capped (<=256 px visible for + the grid, <=64 for the labels) so a deep zoom can never stall the painter. +* The colour bar is off (`m_showBar = false`; `scaleRect()` returns an empty + rect so the old drag code is inert) and each image window now carries a + `ScalePanel` under it: `ScaleHisto` (the image's own 256-bin distribution with + the mapped range highlighted, refreshed at most every 300 ms from + `renderImage()`), a palette chooser wired to `paletteLut()` (kept in sync with + the `b`/`Shift+B`/`c` shortcuts), a lin/log switch, and min/max spin boxes + (also synced from `Set Ranges...`). +* log mode maps `log10(max(v, 1e-2))` against `log10(max(range, 1e-2))`, so + values <= 0 land at 1e-2 = -2 instead of -inf, and the "zero is white" rule + for the photon map still applies first. +* Verified on screen: the framed plot with the X labels (475..505) and Y labels + (97..90, high at the top) outside the frame, the dotted grid, the per-pixel + outlines at ~33 screen px/pixel, and the panel below with the histogram, + `palette: Col (jet)`, `lin`, `min -200.0`, `max 1000.0` (the ADC defaults). + Not yet seen on screen: the in-pixel numbers (they need >50 px/pixel, my + scripted wheel zoom stopped at ~33) and the histogram with a varied image + (a uniform test frame gives a single bin). The old bar's drag-to-stretch on + the scale is gone by design: the range is set with the spin boxes (dragging on + the histogram is a possible follow-up). + +* Scale histogram refined to the operator's spec: fixed 38 px strip (the image + keeps the window stretch, the panel has a fixed height - about a tenth of the + window), one **solid** bar per bin whose width is the bin spacing on screen, + and the two range markers pinned at **1/4 and 3/4** of the width with the value + axis rescaling under them (the drawn window is the selected range widened by + half a range on each side, so dragging a marker moves that end of the range + and the marker snaps back to its fixed spot). The bars are draggable + (`onRangeChanged` -> the panel pushes the new range into the view and the spin + boxes) and the ends are printed next to the markers. A **second lin/log + switch** was added: `image` for the intensity mapping, `histo` for the bar + heights (log10(count+1)); the histogram's value axis always follows the image + switch. Verified on screen: the thin strip with the two orange markers at + 1/4 and 3/4 labelled `702.7` and `1000`, and a drag of the left marker moving + `min` from -200 to 702.7 (the bars were off-window by then, which is the + fixed-marker behaviour). + +### Palette list widened to the matplotlib family + +The scale panel's palette chooser now offers 18 maps instead of 3 (the original +`Col (jet)`, the two ROOT-like greys, then the new ones). The `Palette` enum +keeps `Color/BW1/BW2` first so the `b` / `Shift+B` / `c` shortcuts and +`setPaletteChoice()` keep working, and `paletteName()` (new, in +`online_jf_root.cpp`, deliberately outside the anonymous namespace) feeds the +combo so the names live in one place. + +* New: Turbo, Viridis, Plasma, Inferno, Magma, Cividis, Hot, Grey (linear), + Grey reversed, Coolwarm, BWR, Seismic, RdBu, YlGnBu, Sunset. +* Anchors: the perceptually uniform ones are matplotlib's published anchors and + Turbo is Google's; the diverging/sequential set uses matplotlib's definitions + and the ColorBrewer / Paul Tol anchors (YlGnBu, Sunset) as republished in + `bokeh/palettes.py`, which is where I looked them up - bokeh's licence header + attributes Viridis/Magma/Plasma/Inferno to Nathaniel Smith et al. (CC0), + Turbo to Google (Apache-2.0), the Brewer maps to Cynthia Brewer (Apache-2.0) + and Tol's to Paul Tol (BSD-3). Everything is interpolated by the existing + piecewise-linear `PaletteDef`, whose stop/colour arrays were grown from 5 to + 24 entries to hold the 15-anchor turbo ramp; the LUTs are now one + `g_luts[kNumPalettes][256]` table built by the same `buildLut()` loop, so a new + palette is only an enum entry plus its anchors. +* Verified: the entry list builds and the app runs; selecting `Seismic + (diverging)` in the ADC window turned the image seismic-blue (raw ~100 ADU on + the -200..1000 range lands just below the white midpoint, as expected) with + the panel and histogram following. + +* The **gain window** lost its scale panel entirely (no histogram, no palette / + lin-log / range controls): its image holds four valid numbers - the gain bits + 0..3 - so there is neither a distribution to show nor a scale to choose. It + now uses a fixed `Palette::Gain4` map (0 muted blue, 1 muted green, 2 muted + yellow, 3 muted red, all desaturated on purpose so a large flat map does not + glare) with the range pinned to 0..3, and whole-number in-pixel labels. The + palette is in the enum but deliberately **not** in the chooser loop + (`i <= int(Palette::Sunset)`), so the three image windows keep their own + choices. + +* In-pixel numbers: the font now also has to fit the *width* of the label, not + just the pixel height - five characters for the photon counts, six for the + real-valued images ("XXXXX.y"), at ~0.62 em per digit, still capped at 0.30 em + of the pixel so the "small tidy number" look is kept (range now 7..20 px). + At 50 px/pixel that is 12 px instead of 15, which is what makes five digits + fit; the widest label stays under the pixel edge for every zoom level above + the 50 px threshold. + +### Zoom coordination switch (Display panel) + +Operator request: zooming used to be ADC-master only (the ADC view propagated to +the gain/photon windows and the ROOT plots, never the other way round). Now +`zoomTo(FastImageView *src, ...)` takes the view that asked, and every image view +reports its zoom through the same wiring (`wireZoom()` for ADC, gain and photon), +so **any** window zooms all of them. A new `zoom coordination` checkbox in the +Display panel (default **on**) gates the propagation: when it is off, `zoomTo()` +returns immediately, so each window keeps its own zoom and nothing is pushed to +the others - including the ROOT canvases, which as a consequence no longer follow +the ADC while the box is off (say the word if they should keep following it +regardless). Both transitions are logged (`[zoom] coordination on/off`) and +every coordinated zoom logs its source (`[zoom] coordinated from ADC/gain/photon`). + +Verified: with the default on, five wheel steps over the ADC window produced 10 +`coordinated from ADC` events (two per step: wheel plus the drag path); the +checkbox is present at a sane place in the Display panel +(`[rect] zoomCoord 476,730 333x23`, ticked). The OFF case is a single +`if (!zoomCoord_) return;` on that same path. + +### Makefile: both variants from one `make` + +`make jfstrx` used to rebuild the *same* binary with `-DJFSTRX` (the old +`.buildflags` stamp existed only to force a full rebuild when switching), so the +two variants overwrote each other. Now the objects and the executables are +separate: + +* `online_jf_*.o` + `jf_online_display_gui` (normal), +* `online_jf_*.JFSTRX.o` + `jf_online_display_gui_JFSTRX` (compiled with + `-DJFSTRX`), + +and `all` builds both, so the two can never be mixed by accident (they have +different geometry and struct layouts). `make normal` and `make jfstrx` remain +as aliases, the flag stamp is gone, `clean` removes both sets, and `.gitignore` +covers the second binary and the `.JFSTRX.o` files. + +* Zoomed images were painted over the axes: the scaled image is much larger than + the plot area (only the viewport window is meant to be visible), and the ROI + overlays were drawn in widget coordinates without a clip, so a ROI partly + outside the visible window ran across the tick labels and up to the window + edge. `paintEvent()` now sets `setClipRect(ir)` around the image and around + the two overlays (restoring before the axes so the frame, grid and labels are + drawn on top of a clean widget). Verified by sampling a deep-zoom screenshot: + the margin left of the frame is the widget's black background, not image + colour, while the plot interior still carries the image. + +* The strip-xel decoder (../../dataStructures/jungfrauLGADStrixelsData_new.h) + dumped its header on every construction - "Jungfrau strixels 2X single chip + with full module data" / "sizeofheader = 112" - once per displayed frame in + the JFSTRX build. Those three `std::cout` statements are commented out (the + header is shared, outside this project, so the edit needed the wider sandbox + permission; it is a comment-only change and easy to revert). +* Deepest zoom is now build-dependent (`kMinViewport`): 8 image pixels across in + the plain build as before, **2** in the JFSTRX build, so single strixel pixels + can be inspected (the mapped panels are ~1000 x 1900). The same constant + guards `setViewport()` and `zoomTo()`, so a coordinated zoom propagates down + to the new limit. + +### Dual-interface alignment: drain fast, pair index-aligned, shed on backlog + +Operator report: after the machine had been busy for a while the two interfaces +stopped being aligned and never recovered, with the deltas fluctuating. There +were two causes, one on each side. + +* **Holding a slab is back-pressure.** The old pairing stopped polling an + interface whose slab was waiting for its partner (`events = 0`) and accepted + only *equal* frame numbers. That fills slsReceiver's ZMQ ring, and the + receiver then skips frames **on its own side** - per interface, not per + frame - so the two frame numbers drift apart and, with exact matching, never + meet again. Waiting "until the partner catches up" made it worse. + +What the code does now (`Pipeline::tryAssemble()` in `online_jf_core.cpp`): + +* **Always drain.** Every socket is polled on every turn and drained down to + its newest message (bounded to 32 messages per socket and wake-up, so no + interface is starved). Nothing is ever held, so the receiver's buffer stays + empty - the whole point at 2 kHz. +* **Pair index-aligned or not at all.** When the newest slabs carry different + frame numbers (one interface skipped), the pair is **dropped** (`resync`) and + the next one is tried, so every frame that is displayed or saved is stitched + from a single detector frame. No chasing, no unbounded wait, no half frames. +* **Latch for a permanent offset.** If nothing pairs for 500 ms the offset is + structural (an interface that keeps skipping), so the newest slabs are paired + anyway (`skewedPairs_`, logged) to keep the stream alive; strict pairing + comes back by itself as soon as a pair matches again. +* **Decimation is manual by default**, `--decimate 2|4|8` (1 frame in N, dropped + by detector frame number so both interfaces drop the same ones). The automatic + ladder (1 -> 2 -> 4 -> 8, stepping back up after 5 s clean) only runs with + `--auto-decimate`: frames are queued in the *gate*, so the backlog is + `framesIn - framesPass - framesDrop - framesScDrop` - counting gate rejects as + backlog used to pin the ladder at 1/8 whenever the gate rejected anything. +* **A silent interface is reported, not waited for**, so a dead stream cannot + freeze the pipeline. +* Audit: `--stats` prints `resync` / `behind` / `incomplete` and the + per-second `[align] keep=1/ shed=` line; ladder steps and "dropping the + pair" messages are rate-limited. + +Verified against the live receiver `10.1.1.106 30026+30027` at ~2000 frames/s: +20 s runs alone and with eight CPU hogs (`yes`) both keep `drop=0`, +`in == pass`, `keep=1/1`, `shed=0`, with no unpaired-interface message. The +synthetic feeder with equal keys gives `resync=0`; with a permanent one-frame +offset (`dual ... 1`) the latch keeps ~16 frames/s at 20 fps instead of +stalling. At 2 kHz the interfaces are a frame apart often enough that roughly +one pair in four is dropped by the strict rule - the intended trade (aligned +frames only). A one-frame lookahead per interface (swap two buffers, no copy) +would recover them; it is the obvious follow-up if the saved-frame rate ever +matters. diff --git a/slsDetectorCalibration/jungfrauExecutables/jf_online_display_gui/README.md b/slsDetectorCalibration/jungfrauExecutables/jf_online_display_gui/README.md new file mode 100644 index 000000000..12d6c0c8a --- /dev/null +++ b/slsDetectorCalibration/jungfrauExecutables/jf_online_display_gui/README.md @@ -0,0 +1,1389 @@ +# jf_online_display_gui — online Jungfrau display **+** event finder in one process + +A rewrite that merges the two separate programs + +| old | role | +|---|---| +| `jf_filter.cpp` + `jf_event_finder_cli/gui.cpp` | ZMQ subscriber → pedestal subtract → threshold gate → ZMQ publisher | +| `onlinedisp_zmq.cpp` | Qt5 GUI + ROOT plots, subscribed to the filter's output | + +into a **single multithreaded program**. The intermediate ZMQ hop between the +filter and the display is gone: one subscriber reads `slsReceiver`, the gate +decides pass/drop on every frame, and only passing frames reach the display and +the analysis. + +It also supports slsReceiver's **multi-UDP-interface ("threads") mode**, where +the module is streamed as several ZMQ ports — see +[Multi-interface mode](#multi-interface-mode-two-udp-interfaces). + +The originals in the parent directory are untouched. + +--- + +## Build + +Two equivalent builds exist: **CMake** (same as the rest of the package) and the +self-contained Makefile. Both produce the same two programs from the same +sources. + +```sh +# CMake (out-of-tree, nothing is written into the source directory) +cmake -S . -B cmake-build -DCMAKE_BUILD_TYPE=Release +cmake --build cmake-build -j # both variants + tests +./cmake-build/jf_online_display_gui # normal +./cmake-build/jf_online_display_gui_JFSTRX # LGAD strip-xel variant +./cmake-build/gate_contig_test # gate unit test (ctest also runs it) +./cmake-build/jf_feeder # synthetic slsReceiver +# -DJF_BUILD_TESTS=OFF skips the test and the feeder +# -DJF_ZMQ_STATIC=/path/libzmq.a overrides the ZMQ library +# (Qt5, ROOT and HDF5 are found with find_package; without a usable +# static libzmq the build falls back to the system one via pkg-config) + +# Makefile (identical binaries, in-tree objects) +make # -> ./jf_online_display_gui (Qt5 + ROOT + static libzmq) +make # also builds ./jf_online_display_gui_JFSTRX, the + # LGAD strip-xel variant of the same sources + # (-DJFSTRX; `make normal` / `make jfstrx` build one) +make feeder # -> ./test/jf_feeder (synthetic slsReceiver, testing) +make clean +make jfstrx # optional -DJFSTRX (LGAD strip-xel) build +``` + +Deps: system ROOT (`root-config`), Qt5 (`pkg-config`), HDF5 (`libhdf5_cpp`, +`libhdf5`), rapidjson headers, and the prebuilt `libzmq.a` from +`../../../build/_deps/libzmq-build/lib/`. + +## Run + +```sh +./jf_online_display_gui [rx_port] [gate_threshold] [min_pixels] [pede_file] \ + [--pub PORT] [--contig] [--gate|--no-gate] [--stats] \ + [--use-pede|--no-pede] [--acquire-pede] [--pede-frames N] +``` + +The positional arguments are the union of the two originals: + +| arg | meaning | +|---|---| +| `rx_host` / `rx_port` | slsReceiver stream (default port 30001). `rx_port` may be a `+` list for the multi-interface mode: `30001+30002` | +| `gate_threshold` | event-finder gate threshold, pede-subtracted ADC (default **150**) | +| `min_pixels` | gate: pass when ≥ N pixels are above threshold | +| `pede_file` | pedestal file (default `./current_pede.dat`) | + +Options: `--pub PORT` additionally republishes gated frames (header+data, same +format as the old filter) for third-party subscribers; `--contig` enables the +contiguity proxy; the **gate is off by default** (`--gate` enables it, +`--no-gate` is the default transparent passthrough); **pedestal subtraction is +off by default** (`--no-pede` is the default "raw ADC" mode, `--use-pede` +starts with subtraction enabled); `--stats` prints +the old CLI counter line once per second; `--acquire-pede` averages +`--pede-frames N` frames into a live pedestal as soon as acquisition starts; +`--gate-roi X Y W H` starts with a gate ROI already set (data rows: y = 0 is the +bottom row, the same convention as the ROI list and every plot - see +[One coordinate system](#one-coordinate-system-image-and-root)); +`--sc N` passes only frames from storage cell N (0..15, bits 8-11 of +`detSpec3`; `--sc all` for no cell gating); `--raw-map` shows raw ADC in the +main map instead of photon counts. The **photon-map threshold** (ADU, default +150) is no longer an argument: it is the control in the *Virtual photon +counting* panel, and the `--stats` line reports it with its unit (`pthr=150ADU` +or `pthr=4keV`), together with `kev=off|loaded|nominal`. `--apply-gain` starts +with the gain correction on, so a scripted run can use the keV threshold. + +Saving and the photon-map display can also be pre-set, which is what the +headless checks use: `--pmap-every N` (photon-map display cadence, default +2000), `--pmap-save-every N` (saved-map cadence, minimum 200, default 2000), +`--save-photon` (write the virtual photon counting maps instead of the frames), +`--save-budget N` (stop after N saved frames, or N saved maps in photon mode) +`--start-save` (press the Save button at startup) and `--apply-gain` (press the +Gain button). Each of them does exactly what the corresponding control does, so +a run can be driven from a script. + +```sh +# was: jf_event_finder_gui 30001 30011 ./current_pede.dat +# then: LD_LIBRARY_PATH=/usr/lib64/root ./onlinedisp_zmq 30011 +# now: +./jf_online_display_gui 30001 100 5 ./current_pede.dat +``` + +## Threads + +| thread | owns / does | +|---|---| +| main / Qt | `QApplication::exec`, all widgets, button + shortcut handlers | +| **acq** | `zmq_poll` over every interface, receive, frame pairing/assembly, gate decision + counters + rates, optional republish, live pedestal acquisition, hands the frame to the mailbox | +| **analysis** | pedestal subtraction, ADC/gain images, photon counting, and the **only** thread that touches the source ROOT histograms (per-frame work accumulates into plain arrays; the histograms are synced at the redraw cadence) | +| **ROOT** | canvas painting, `gSystem->ProcessEvents`, the user command queue, paints the display clones | + +Why the gate is not done in the analysis thread: the gate must count **every** +received frame, while the display is allowed to fall behind. A single-slot +"latest frame wins" mailbox decouples them — dropping an old frame there is the +merged equivalent of the ZMQ receive-HWM drops of the old chain, and the gate +counters stay exact. + +All interfaces are read by the **one** acq thread via `zmq_poll`, so pairing +needs no extra synchronisation. + +## Multi-interface mode (two UDP interfaces) + +`slsReceiver` with N UDP interfaces ("threads") publishes **one ZMQ stream per +interface on consecutive ports**, each carrying one Y-slab of the module: + +* `DetectorImpl.cpp` → `portnum = getClientStreamingPort() + (iSocket % numUDPInterfaces)` +* `JungfrauData::UpdateImageSize()` → `nPixelsX = 256*4 = 1024`, + `nPixelsY = (256*2)/numUDPInterfaces` → **256 rows per interface for N=2** +* `GetPortGeometry()` for JUNGFRAU → `portGeometry.y = numUDPInterfaces` + (`numPorts = {1,2}`), i.e. the split is along **Y** + +So for one Jungfrau module split in two, each port streams 1024×256 +(524288 B) and the two stack into 1024×512: + +```sh +# slsReceiver started with 2 interfaces -> ports 30001 (bottom) and 30002 (top) +./jf_online_display_gui 30001+30002 100 5 ./current_pede.dat +``` + +* **Order = image order.** The list is read bottom → top, the first port + occupying the lowest rows. To swap the halves, reverse the list + (`30002+30001`) — no extra flag. +* **Assembly.** Each slab's geometry comes from its own JSON header + (`shape`, `size`), and the slabs are copied into the full 1024×512 frame. + An interface that streams a *full* 1024×512 buffer instead is handled too: + only its own slab is taken out of it. +* **Pairing and alignment.** Every socket is drained continuously - nothing is + ever held back, so the receiver's buffer stays empty - and the newest slab of + each interface is paired. If their frame numbers differ the pair is dropped, + so an assembled frame is always stitched from a single detector frame (see + [Keeping the interfaces aligned](#keeping-the-interfaces-aligned)). If no + pair succeeds for 500 ms the interfaces are permanently offset (one of them + keeps skipping): the newest slabs are then paired anyway to keep the stream + alive, and strict pairing returns as soon as the numbers match again. A dead + interface never stops the others; it is reported, not waited for. +* **Everything downstream is unchanged**: gate, images, photon map, T vs B / + L vs R, ROOT fills and the pedestal layout all operate on the assembled + 1024×512 frame, so the existing `current_pede.dat` stays valid. +* **Status** is per interface in the GUI and in `--stats` + (`stream=connected ports=connected,idle`), each with its own + `zmq_socket_monitor` connection state. +* **Start-up checks** are printed once per interface, which is how you confirm + the orientation on real hardware: + + ``` + [stream] port 30001: 1024x256 (524288 B) -> rows 0..255 of 1024x512 + [stream] port 30002: 1024x256 (524288 B) -> rows 256..511 of 1024x512 + [frames] first assembled frame: port 30001 -> row 0 = 100, port 30002 -> row 256 = 150 + ``` + + If the second line shows the *top* half arriving on the first port, reverse + the port list. +* **`--pub`** republishes the assembled full frame (a synthesised header with + `size=1048576`, `shape=[1024,512]`), so downstream consumers see the same + single-stream format as before. +* **Limits.** This is the single-module display (1024×512). A port count that + does not divide 512 rows evenly (or a slab height that is neither 512/N nor + 512) is refused with an explicit error instead of producing a wrong image. + +## Analysis stage: deferred histogram accumulation + +`TH1::Fill()` was called once per pixel per frame for the chip spectra and +again for the photon map — 0.6-1 M fills/frame, ~4-6 ms, i.e. the whole cost +of the analysis stage (measured: 239 fps without the photon map, 179 fps with). +Filling a histogram that is painted once per `rootUpdateMs` at frame rate is +pure waste, and ROOT histograms are not thread safe anyway (bin array *and* +shared statistics), so calling `Fill()` from several threads is not an option. + +Instead the analysis thread accumulates each frame into plain arrays: + +* `g_pmapAccum[NCH]` — photon map (and the raw-ADC map, `--raw-map`); +* `g_chipAccum[8][NBIN+2]` — chip spectra, including under/overflow; + +and pushes them into `his3000` / `hchip` at the redraw cadence +(`clamp(rootUpdateMs/2, 50, 500)` ms), under `gHistoMtx`: + +* the photon map is written with `SetBinContent` (absolute contents, since the + accumulator is cumulative) — a 524288-bin copy at most 20x/s is free; +* the chip spectra are filled with the **delta** per bin, so ROOT's own + statistics keep working; the bin index is computed directly and was verified + against `TAxis::FindBin` over every bin edge and 20M random values; +* `SetEntries` restores the true entry count, because `Fill(x,w)` increments + `fEntries` once per *call*, not per weight; +* "Reset His" zeroes the accumulators and the histograms together. + +Verified exactly against an analytic prediction (two 1024x256 slabs of ADC 100 +and 150, zero pedestal, threshold 150): every chip bin/entry and every photon-map +bin matched to the last digit. + +Measured on a live receiver streaming ~1500-2000 frames/s: + +| | before | after | +|---|---|---| +| analysis frames/s (chip fills only) | 239 | **538** | +| analysis frames/s (+ photon map) | 179 | **513** | +| photon-map cost | -25% | -5% | + +The display still subsamples (analysis ~500 fps vs stream ~2000 fps), so +`displaydrop` remains the counter to watch — it is now ~68% instead of ~88%. +One cosmetic difference: the chip-spectrum stats box mean/RMS is computed from +bin centres rather than exact ADC values (sub-bin, <0.1% on the mean), while +entries and all bin contents are exact. + +### Where the analysis time goes + +`JF_TIMING=1 ./jf_online_display_gui ...` prints a per-step breakdown when the program +exits. On a live stream (~2000 fps, two interfaces, full pedestal set): + +| step | us/frame | share | +|---|---|---| +| mailbox take + frame memcpy (1 MB) | 36 + 21 | 3 % | +| step 1: ADC/gain image build (524288 px) | 527 | 27 % | +| step 2: pedestal subtraction + photon counting + chip binning (524288 px) | 1294 | 67 % | +| step 3: T vs B / L vs R (1536 ROOT fills) | 16 | 1 % | +| step 4: raw-ADC map (only with `--raw-map`) | 0 | - | +| accumulator sync (amortised) | 10 | 1 % | +| step 5: image publish (every `HDraw_every` frames) | 16 | 1 % | +| **total** | **1920** | 521 fps | + +(One run; a second run on the same shared machine gave 2294 us / 436 fps, so +treat these as +/-25 %. The *shape* is stable: copies ~2 %, step 1 ~30-40 %, +step 2 ~55-65 %.) + +So the bulk memcpys are *not* the limit (1 %). The two per-pixel passes are +94 %, at ~1.0 ns/px (step 1) and ~2.5 ns/px (step 2) — i.e. ~3 and ~7 cycles +per pixel of scalar, branchy work (gain decode, `i%1024` / `i/1024` index +arithmetic, `chipBin`, the accumulator scatter). Memory is not the limit +either: the working set is ~15 MB and the loops use ~5-12 GB/s, while a +single-core memcpy on this machine sustains ~110 GB/s (L3-resident). +A live-acquired pedestal (no g1/g2 streams) only saves ~80 us of step 2, so +halving the pedestal traffic would buy ~4 %. + +## Parallel analysis (worker threads) + +Steps 1 and 2 are pure per-pixel work over disjoint ranges, and after the +accumulator change they touch no ROOT state at all (`adc_image`, `gain_image`, +`hpmapAccum` and `hchptr` are written per pixel; only the chip spectra are a +scatter, handled with small per-worker copies that the controller merges once +per frame). So they can simply run on several threads: + +``` +--analysis-workers N 1 = single threaded, 0/omitted = auto (cores/4, max 8) +``` + +The worker threads are persistent; a frame is handed over with a generation +counter (two condvar handshakes per frame, a few us). Worker 0 is the analysis +thread itself, so nothing changes for `N=1`. Step 3 (T vs B / L vs R), the +histogram sync and the image publish stay on the controller. + +Measured on the live stream (~2000 fps, both interfaces, full gain paths): + +| workers | analysis rate | +|---|---| +| 1 | 407-415 fps | +| 4 | 952-1220 fps | +| **8** | **1340-1376 fps** | +| 12 | 1255-1343 fps (saturated) | + +The results are **bit-identical** to the single-threaded run: verified with the +deterministic two-slab setup for `N = 1, 2, 4, 8` - every chip bin, entry and +photon-map bin matched to the last digit. Integer per-pixel accumulation into +disjoint ranges plus an ordered merge makes the outcome independent of +scheduling. + +Practical effect at ~2000 fps: analysis coverage goes from ~20 % to ~67 %, i.e. +`displaydrop` falls from ~80 % to ~33 %. + +This also leaves the door open for the planned AFC/gain-split histograms: the +per-worker accumulators are L1/L2 resident and simply grow with the number of +gain groups, with no locking added. + +## Keeping the interfaces aligned + +`frameIndex` cannot be used as a shared key: `DataStreamer` computes it as +`frameNumber - firstIndex` and `firstIndex` is per-streamer, so the two +interfaces can legitimately report different `frameIndex` for the same frame. +Pairing therefore uses the **absolute `frameNumber`**. + +Three rules, in order of importance: + +1. **Never hold a slab (no back-pressure).** slsReceiver has its own ring + buffer; if our ZMQ queue fills, the *receiver* skips frames on that + interface - per interface, not per frame - and the two frame numbers are + offset from then on. So every socket is drained to its newest message on + every wake-up and nothing is ever kept back. +2. **Pair index-aligned or drop the pair.** The newest slab of each interface + is paired; if the numbers differ, both are discarded (`resync`) and the next + pair is tried. An assembled frame is therefore always stitched from one + detector frame, and no frame is ever shown or saved half-filled. +3. **Latch when the offset is structural.** After 500 ms without a successful + pair the newest slabs are paired anyway (counted separately and logged) so a + permanently offset interface still streams; the first matching pair returns + the pipeline to strict pairing. + +Decimation is a manual choice: `--decimate 2|4|8` assembles one frame in N, +chosen by the shared frame number so both interfaces drop the same frames. The +automatic ladder (`--auto-decimate`) reacts only to frames actually queued in +the gate (`framesIn - framesPass - framesDrop - framesScDrop`) - counting gate +rejects as backlog used to pin it at 1/8 - and climbs back after 5 s without a +backlog. Everything is audited through `--stats` (`resync`, `behind`, +`incomplete`, `[align] keep=1/N shed=n`) and the rate-limited log messages. + +## Display controls + +| button | key | action | +|---|---|---| +| Start/Pause | `s` | pause/resume processing | +| Faster / Slower | `+` / `-` | main image every N *analysed* (gate-passed) frames, but never slower than one every 250 ms | +| gain correction on/off | `g` | divide by ADU/keV (gain map, else nominal 40) - the `gain corrected` tick next to it is a read-only indicator | +| BW Pal. / BW Pal. 2 | `b` / `Shift+B` | monochrome palettes | +| **Col Pal** | `c` | back to the colour palette | +| Set Ranges | `S` | ADC / photon-map / chip-X ranges | +| Update Rates | | main image cadence + ROOT redraw period | +| Reset His | `r` | clear the photon map and spectra | + +The photon map itself is **not** in the control window any more: it has its own +window, `Photon Map (virtual photon counting)`, whose panel is *Virtual photon +counting* (left column, under the gates): + +| control | action | +|---|---| +| cumulative (toggle to reset) | off by default: each map covers the frames since the previous publish, so the picture shows the *rate* (turn it on for a running total). Toggling it restarts the map from scratch, so the switch doubles as the reset | +| plot every N images | publish cadence of the map, counted in **analysed frames** (default 2000); independent of the ADC image cadence | +| photon threshold | threshold of the photon map; a pixel above it counts `(value + threshold) / (2 x threshold)` photons. It is in **ADU** while the gain correction is off (default 150) and in **keV** while it is on (default 4.0): the counting value is then the pedestal-subtracted ADC divided by the pixel's ADU/keV (gain map, else the nominal 40). Both numbers are kept, and switching the gain swaps which one the row shows, so neither is ever overwritten. Toggling the gain while a photon-map save runs changes the unit of the maps written from that moment on, which the run announces (`[gain] warning: the photon-counting unit is now keV ...`); the JSON keeps the value it recorded at save start | + +The photon window has no ROI and no gate: the ADC image, the gain image and the +photon map are three independent windows. + +**The image windows are plots.** Each one draws the image inside a frame with +X/Y axes, tick labels *outside* the plot area and a light dotted grid inside it +(the Y labels are data rows, row 0 at the bottom, like everywhere else). When +the zoom makes an image pixel at least **16 screen pixels** wide, every pixel is +outlined with a thin line; above **50 screen pixels** the value is written inside +each pixel - whole numbers for the photon map (counts), one decimal for the +real-valued ADC/keV images. The colour bar that used to sit at the right of the +image is replaced by a thin **scale panel** under it (its histogram strip is +~38 px, about a tenth of the window): + +* the **histogram** of the last image, one solid bar per bin - the bar is as wide + as the bin spacing - with the mapped range highlighted; +* the two range **markers are pinned at 1/4 and 3/4** and the value axis + rescales under them (the strip shows the selected range widened by half a + range on each side), so **dragging a marker** moves that end of the range; the + ends are printed next to the markers and in the spin boxes; +* a **palette** chooser with the matplotlib family that is useful for detector + images: the original `Col (jet)` / `BW grey 1` / `BW grey 2` (also on `b` / + `Shift+B` / `c`), `Turbo`, the perceptually uniform `Viridis`, `Plasma`, + `Inferno`, `Magma` and `Cividis` (colour-blind friendly), `Hot`, + `Grey (linear)`, `Grey reversed`, the diverging `Coolwarm`, `BWR`, `Seismic` + and `RdBu` (handy for pedestal-corrected data that goes negative), + `YlGnBu (Brewer)` and `Sunset (Tol)`. Pick one per window; the ROOT plots + follow the `b` / `Shift+B` / `c` keys as before; +* **two lin/log switches** - `image` for the intensity mapping (log maps + log10(value) and caps values <= 0 at 1e-2 so empty pixels stay visible) and + `histo` for the bar heights (log10(count + 1)); the histogram's *value* axis + always follows the image switch; +* `min` / `max` spin boxes for the same pair as `Set Ranges...`. Pixels with **no photons are drawn +white** - the way ROOT's `colz` leaves empty cells on the white canvas - while +every pixel above zero takes the palette colour, so a faint map stays readable +instead of drowning in the palette's lowest colour. The colour bar keeps the +palette itself (dark blue at the bottom), exactly as the ROOT plot's did; the +ADC and gain images still map zero to the palette's first colour. +| Reset Axis | `R` | unzoom everything: the ADC and gain images *and* the ROOT plots | +| ROI only | `i` | capture the ADC zoom as the gate ROI (see below) | +| Save ROI (ROI panel) | `j` | add the active gate ROI to the ROI list | +| Unset ROI (ROI panel) | | forget the current ROI: gate, ROI spectra and the saved data go back to the full frame (the ROI list on disk is untouched) | +| Load ROI... (ROI panel) | `k` | pick a ROI from the list and apply it | +| keV PH (Gain panel) | `e` | show the PH spectra in keV (see below) | +| Start/Stop save | `n` | write gate-passed ROI frames to HDF5 (see below) | +| Acquire/Save/Read/Load Pede | `p` / `O` / `o` / `P` | pedestals | +| Quit | `q` | | + +The `Surf2Z`, `ColZ` and `G1+/G1-/G2+/G2-` buttons (and their keys `u`, `U`, +`C`, `[`, `]`, `{`, `}`) were removed: in the standard build the surf/colz +commands only changed a histogram that is never drawn, and the gain offsets are +constant 0 until the AFC/gain-split work lands. + +The three palette buttons (`BW Pal.`, `BW Pal. 2`, `Col Pal`) sit together in +one row of the Display group. + +**ROI panel** (below the Display). Everything about *which* ROI the gate works +on lives here: + +| control | what it does | +|---|---| +| `Select ROI (ADC zoom)` | makes the region currently zoomed in the ADC image the **current ROI** | +| `Save ROI` (`j`) | adds the current ROI to `./roi_list.dat` | +| `Load ROI...` (`k`) | picks one from that list (the dialog can also delete) and makes it current | + +Selecting and loading only *choose* the ROI - they do not restrict anything. The +read-out underneath shows the current ROI, whether the gate is restricted to it, +and how many are saved. + +Next to the signal gate there is still `ROI only (i)`, which switches the +restriction on: the gate then counts only inside **the current ROI**, whatever it +is at that moment (re-selecting or loading another one while it is on takes +effect immediately). Pressing it with no ROI selected pops a warning and leaves +the button unselected; switching it off goes back to the full frame but keeps the +current ROI. + +**Gain panel.** Holds `gain correction on/off (g)` - a checkable button - the +read-only `gain corrected` tick next to it, and the gain map used for the keV +spectra (see below). The tick only *reports* the state (the button is the only +control); it is greyed together with the panel while the correction is off. + +`gain correction on/off` pushed means *divide every pixel by its ADU/keV*: the +per-pixel +value from the gain map when one is loaded, or the **nominal 40 ADU/keV** for +all pixels otherwise. That is what makes the keV spectra physical - with a +320 ADU pixel, the gain correction gives 8 keV either way, but the map corrects for the +pixel-to-pixel spread (30-55 ADU/keV in the lab file) while the nominal treats +every pixel alike. + +The label under the row says exactly which calibration is in use: the gain-map +file name when one is loaded, `no gain map loaded : using defaults` when the +correction runs on the nominal 40 ADU/keV, and `gain off: PH spectra in ADU` +when the stage is bypassed. + +`keV PH` then chooses what the PH canvases show: the **keV** spectra when it is +ticked *and* the gain correction is on, the **raw pedestal-subtracted ADC** +otherwise. Pressed state, tick and greyed-out states line up with this: with +the correction off the Gain box, the `keV PH` checkbox and the `gain corrected` +tick go grey (the `keV PH` tick is kept for next time) and the plots show ADC. + +The saved data is unaffected: `Save` always writes pedestal-subtracted ADC +(with the Jungfrau gain-bit conversion), never the display's keV choice. + +**Pedestal tracking.** Pedestals drift slowly, so there is a `Pedestal +tracking` panel of its own, directly under `Pedestal`, with a `pedestal +tracking on/off` toggle (also `--pede-tracking`); a small up-arrow shows that +its result goes back into the Pedestal box. The box greys while tracking +cannot be *selected* - i.e. while the signal gate is off - not while tracking is +simply inactive: whether it is on is shown by the value label under the button +(`off`, or `on: N samples, delta D ADU, U updates`). It only makes sense with +the signal gate on - that is the button's enable condition, and turning the gate +off turns the tracking off - because it works from the frames the gate *drops*, +i.e. while the beam is off. The rules: + +| step | default | +|---|---| +| feed the average only while the signal gate drops | > 90 % of the frames reaching it | +| sample of every dropped frame | 0.2 % of its pixels, with the stride phase **rotated** each frame so every pixel is covered within 500 frames | +| per-pixel running average, pooled window | 10 M pixel samples (~19 updates/pixel, weight `NCH/10M` per sample, ~6 min at 25 fps) | +| replace the pedestal in use when the largest pixel difference **inside the gate ROI** exceeds | 5 ADU | +| rate limits | at most once per 10 s, at least once per 10 min | +| pedestal tracking image in the save file | every 10 min, while tracking is on | + +Sampling happens on every dropped frame; the (ROI-wide) distance test is the only +expensive part and runs about once a second. The 5 ADU test looks only at the +**gate ROI** - drift outside it is not worth +acting on - while the average itself is still accumulated over the whole frame. +With no ROI selected the whole frame is used. High-gain / gain-3 pixels are +skipped when feeding the average (they live on a different scale), and the +pedestal is replaced in memory only - the file you +loaded is untouched, and loading a pedestal (or `Acquire Pede`) re-primes the +average from it. The panel read-out shows `samples`, the current `delta` and +the number of `updates`, the `Pedestal:` line in Status gains a `[tracked]` tag, +and `--stats` carries `ptrack=off|on|on-upd`. Each update logs + +``` +[pedetrack] pedestal updated #3: max delta 7.41 ADU in the ROI over 152340 pixel samples (drift > 5 ADU) +``` + +While tracking is on, the save file gets a time series: `/pedestal tracking` +(float32, one 512x1024 image per 10 min, in the ROI shape) with the matching +`/pedestal tracking frame`, so the drift during a run is recoverable. The two +datasets are created (empty) for every save because SWMR mode cannot create +objects after it starts; a baseline image is always written when a save starts, +and further images only while tracking is on. + +In `Pedestal corrected` mode the saved frames follow the tracker too: every +frame is corrected with the pedestal **in use when it was captured**, exactly +like the display and the gate, so a live-tracked pedestal is in the file and +not just in the display. A save that spans several pedestal updates therefore +uses several pedestals, documented by `/pedestal tracking` and +`/pedestal tracking frame`; the single `/pedestal data` image is the pedestal at +save start (the baseline), not a description of every slice. + +**Pede/Raw.** The Pedestal panel has the `Pede/Raw toggle` (equivalently +`--no-pede` / `--use-pede` on the command line), and raw ADC is the **startup +default** - the button starts pressed; `--use-pede` starts with subtraction +enabled instead. Raw mode +ignores the loaded pedestal *everywhere* - +display, photon map, spectra, event finder and the ROI save all work on raw ADC +- and the Pedestal panel, the *Virtual photon counting* box (photon counting +thresholds the pedestal-subtracted ADC, so the map goes empty with it) and the +flow box grey out. The state is recorded in +the saved file's `gate` JSON as `"no_pede"`, and the panel says `pede subtracted` +/ `no pede: raw ADC` next to the button. + +Note what that does to the **signal gate**: with no pedestal in play it compares +the threshold against the raw 14-bit value, `frame[i] & 0x3fff` (and skips the +gain-bit scaling), so the threshold is in raw ADC units - the gate row label +changes from `Threshold (ADC, pede-subtracted)` to +`Threshold (raw ADC - no pede)` to make that visible. The same happens with no +pedestal file loaded at all, since that is the same code path. Measured with a +200 ADU pedestal, a 120 ADU threshold and halves at 3000/200 ADU: 262144 +pixels/frame with the pedestal, 524288 with `--no-pede` (the 200 ADU half stops +being pushed below the threshold) - i.e. the raw half really is counted. (The gain-1/gain-3 +pedestal offsets still have no controls; the panel is the natural home for them +if the gain-split work needs them back.) + +**Display cadence.** The ADC/Gain image windows are refreshed on the frames the +gate passes, decimated by the `Faster (+)` / `Slower (-)` counter (default every +20). The counter alone would freeze the image when the gate passes rarely - at +0.1 Hz and `every=20` that is one image every 200 s - so a frame is also +displayed when the previous one is older than `DISPLAY_FLOOR_MS` (250 ms). +Under that floor every passed frame is shown, and above it the decimation is +untouched: at a 2 Hz pass rate `shown/pass = 1.00`, at 200 Hz `shown/pass = 0.05` +(1/20). The floor only takes over when `pass rate / every` drops below 4 Hz. +`--stats` reports `shown=`, the images actually handed to the view, next to +`pass=` so the ratio is auditable. The spectra, the photon map and the ROOT +repaint timer are unaffected by this: they follow every passed frame. + +**Ranges.** `Set Ranges (S)` sets the axes explicitly instead of letting ROOT +auto-scale them. It shows the ranges that are **in force right now** - read +back from the displayed histograms, not from stored numbers - so it opens on +what you are looking at (including a scale you dragged on the ROOT canvas), and +**nothing is applied unless you edit it**: + +| field | applies to | default | +|---|---|---| +| ADC min / max | the colour scale of the **ADC image** window - the Qt "main plot", also draggable on its colour bar | -200 / 1000 | +| P.Map min / max | the colour scale of the ROOT 2D map (canvas `A5`) | 0 / 256 | +| PH min / max | the shared x window of the spectra (`A4` and the ROI spectrum `A7`) | -200 / 3000 | + +One pair per display, and **each field opens on the scale that display is +using right now** (read back from the widget / the histogram, so it also picks +up a drag on the image colour bar or on the ROOT canvas). Only the values you +actually edit are applied, and each goes to its own display: the ADC pair is a +Qt widget and repaints immediately, the ROOT pair is applied once by the ROOT +thread. Because it is applied once, a scale you then change on the ROOT canvas +is not reset by the next redraw (`TH1::Reset()` does not touch it either). +`Reset Axis (R)` releases the fixed ranges and the ROOT axes auto-scale again; +a double-click on the ADC image colour bar restores its last applied ADC range. + +ROOT snaps a requested window to the nearest bin edges, which is why the +`-200 / 3000` default reads back as `-212 / 3010` on the 500-bin spectrum axis. +`JF_TIMING=1` prints the ranges actually in force on exit. + +**The control window is a flow chart.** The left column is the gate flow (1. +Storage cell, then 2. Signal gate), the right column carries the rest of the +chain (Pedestal, then Gain, then Display - the display shows the result, so it +comes after the processing), the ROI-save panel spans the full width under both, +and Status (left) and Counters (right) sit across the bottom. + +The arrows are **static** - the chain is always drawn the same way - and a +stage that is not in use is **greyed out** (title, text and background), so the +bypass is obvious without anything moving. Greyed means: + +| panel | greyed while | its own switch (kept readable) | +|---|---|---| +| 1. Storage cell | the filter is `ALL` (no cell gating) | the cell combo | +| 2. Signal gate | `Gate enabled` is off (passthrough) | `Gate enabled` | +| Pedestal | no pedestal is loaded, or `Pede/Raw` is on raw | `Pede/Raw toggle` | +| Pedestal tracking | the signal gate is off, so it cannot be selected (inactive-but-selectable stays black; the value label below shows on/off) | `pedestal tracking on/off` | +| Gain | the gain correction is off | `gain correction on/off` | +| Virtual photon counting | no pedestal in play (the map needs `g0`) | - | +| ROI | never (the ROI list is independent of the gate) | - | + +Greying is a **look, not an enablement**: a greyed panel is still clickable, and +the control that switches the stage back on keeps its normal text colour (only +the box, its title and the other contents dim), so a bypassed stage never looks +stuck. The `keV PH` checkbox is the deliberate exception: it is disabled *and* +greyed while the gain is off (its tick is remembered for next time). + +``` +1. Storage cell --+ Pedestal + | ^ | + (down) +--> Pedestal --+ | +--> Pedestal tracking + | | (drops feed the average) + (raw: bypass) | v + +----------> [funnel] <-- 2. Signal gate (the gate CONTROLS + | | the funnel; it does + | | not modify data) + | +--> Gain --+--> Display + | | ^ ^ + | | | | + | Virtual photon counting -----+ (its own window) + | ^ + | +-- calibration: the threshold is keV + | while the gain is on + | + | +----> ROI --> Save +``` + +The gate is drawn as a **funnel on the line**, not as a stage the flow enters and +leaves: nothing goes in or out of the gate box, and a short blue arrow from the +gate panel into the funnel's side shows what does the gating. With the gate off +the funnel and that arrow grey out. Two feeders reach the funnel, and they do +**not** have to agree, because the display and the file can use the pedestal +differently: + +* the **display** chain uses the pedestal when `Pede/Raw` is on "pede subtracted" + and one is loaded (the same condition that greys the Pedestal panel); +* the **saved** data uses it when `virtual photon counting` is the save mode (the + maps always need `g0`) **or** when `save frames` is selected with + `Pedestal corrected` ticked. So in the default `save frames` + raw setting the + file takes the *bypass* straight from the storage cell while a corrected + display still goes through the Pedestal. + +Both feeders can therefore be live at once, and the colour says what each one +carries: + +| colour | meaning | +|---|---| +| **orange** | everything the saved data travels through, entry point to the Save panel: `save frames` = storage cell -> (Pedestal or bypass) -> funnel -> Gain -> ROI -> Save; `virtual photon counting` = ... -> funnel -> Gain -> counting -> Save. The ROI is only there for the file, so its input is always orange too - from the **Gain** when frames are written, from the **counting** when the maps are (they are cropped to it on the way out) - and the arrow into the Save panel always leaves the ROI, never the counting panel | +| **light blue** | the branches that only feed the display: storage cell -> Pedestal and Pedestal -> funnel while the file bypasses them, Gain -> Display, Gain -> counting, counting -> Display, and Gain -> ROI when the maps are the saved product | +| **lighter blue** | the pedestal tracking pair only: the gate block -> tracking input and the tracking -> Pedestal feedback | +| **pale grey** | the gate funnel while the gate is off (the symbol greys instead of vanishing) | + +Nothing is drawn greyed-out any more: a feeder that carries nothing is simply not +there, and the Save arrow of the mode that is *not* selected is not there either. +The tracking input leaves the **top-right corner of the gate block**. (The flow +strip's tooltip repeats the legend.) + +The `Pedestal tracking` panel sits directly under `Pedestal` with a small `^` +arrow back up into it: it is fed by the frames the *signal gate drops* (the `-->` +from the gate) and its result is written back into the Pedestal box above it. + +Those connectors are drawn (orthogonal lines with a filled head) in the narrow +strip between the two columns, which is why the boxes are padded to line up. +The two remaining vertical arrows (Gain -> Display, ROI -> Save) are arrow +glyphs in the layout; the gap between the two gates is plain empty space, since +the path between them goes through the Pedestal and is drawn by the strip. +Each connector turns near the box it enters, so their vertical parts never line +up into one long line down the strip. Nothing +moves or flickers: the geometry is solved once at start-up (and again on +resize) and the bypass is shown only by greying the stage. + +`Quit (q)` sits at the top right, out of the gate and arrow area, the ROI-save +panel spans the full width above the Status/Counters strip, and the boxes are +lined up so the flow is readable: the middle of the storage-cell +box sits on the top edge of the Pedestal, and the Gain starts at the middle of +the signal gate (both measured and padded at start-up, so it survives a +different font or DPI). + +The event finder panel holds two separate gates: + +| panel | what it keeps | cost | +|---|---|---| +| **1. Storage cell (header)** | only frames acquired in the selected storage cell (dropdown `ALL` or `0`..`15`) | a header field - filtered frames touch no pixel at all | +| **2. Signal gate (pixel counting)** | only frames with `min_pixels` pixels above the threshold (and, optionally, clustered inside the gate ROI) | the full-frame scan | + +The storage cell is **bits 8-11 of `detector specific 3`** in the frame header +(0..15, 15 = the default cell), so the signal gate and the analysis only ever +see frames that already survived it - selecting a cell cuts the CPU load to +roughly 1/16 with a uniformly cycling acquisition. Each gate can be off +independently: `ALL` switches the storage-cell gate off, the `Gate enabled` +checkbox switches the signal gate off, and the four combinations are just those +two controls (no gating, cell only, signal only, both). + +`JF_TIMING=1` (or the GUI) reports the cell of the last frame seen +("last frame: SC n"), which is the quickest way to confirm the decoding on a +new setup; `scdrop` counts the frames the cell gate rejected +(`frames passed + frames dropped + frames dropped (SC) = frames in`). +`--sc N` (`N` = 0..15, or `all`) selects the cell at start-up. + +**Gate ROI.** `ROI only (i)` sits next to "Gate enabled" and is a latching +button. Pressing it captures the region currently shown in the ADC image and +restricts the event finder to it: from then on only pixels inside that +rectangle are counted for the gate (threshold, min-pixels and the contiguity +test all use it). The rectangle is a **snapshot** - panning or zooming the ADC +image afterwards does not move it, so you can inspect other areas while the +gate keeps looking at the same place. It is outlined with a thin yellow box on +the ADC image, the captured size/position is shown next to the button, and +`--stats` reports it as `roi=WxH@x,y` (`roi=off` when inactive). Pressing the +button again releases it (full frame). Capturing a new ROI is un-toggle then +toggle. The receiver's own ROI (from the stream header) is a separate **red** +box on the same image - see "One coordinate system" below. + +Saved ROIs live in **one list, backed by one small file** in the program +folder (`./roi_list.dat`, override with `--roi-file PATH`). `Save ROI` adds the +active rectangle (or refreshes its timestamp if it is already there), `Load +ROI...` shows the list - **most recently saved or loaded first** - with the X/Y +coordinates, width, height and when it was last used, and the chosen entry is +applied and moves to the top. The dialog also has a `Delete` button. The list +is capped at 200 entries, dropping the least recently used, so the file stays a +few kB indefinitely, and it is rewritten on every change (a crash cannot lose +it). + +A ROI can also be set before the program is started, which is handy for +scripts and for headless runs: + +``` +./jf_online_display_gui 1000 30001+30002 --gate-roi 446 114 20 11 +``` + +### One coordinate system, image and ROOT + +The operator only ever thinks in **data coordinates**: `x` grows to the right, +`y` grows **upwards**, and **(0,0) is the bottom-left pixel** of the module. +Every part of the program uses them: + +| | convention | +|---|---| +| ADC/gain image | draws data row 0 at the *bottom* of the widget (the image is flipped once when it is turned into a `QImage`) | +| pixel read-out (hover) | reports data coordinates, so the number matches the plots | +| gate ROI, ROI list, `--gate-roi`, HDF5 crop | data coordinates, row 0 at the bottom | +| ROOT photon map / spectra | data coordinates, so y=`0` is at the bottom of the plot | + +The two places where the flip has to be applied are the ADC overlay (data -> +screen) and the zoom that is forwarded to ROOT (screen -> data); both are done +in one place each, so the ADC box, the ROOT box and the gate rectangle are +always the *same* rectangle. A bottom ROI in the ADC image is a bottom box in +ROOT. + +**Receiver ROI (red box).** Independent of the gate ROI, the receiver puts its +own ROI in every stream header as `"rx_roi": [xmin, xmax, ymin, ymax]` in raw +port coordinates. It is drawn as a **red** box on the ADC image, next to the +yellow gate ROI. It is parsed from `rx_roi`; the old `detSpec1` +reinterpretation was a hack (`detSpec1` is the bunch id) and is gone. + +**The ROI has the shape of the ADC window.** The visible region of the ADC +image takes the shape of the window it is shown in, so resizing the window to +be tall makes the region - and therefore the captured ROI - narrow and tall +(the shorter side grows, so nothing you were looking at disappears; the +whole-frame view is left alone so it still captures the full sensor). ROOT then +draws that window with square pixels, so the yellow box has the same shape it +has on the ADC image instead of being stretched across the canvas: the axis +range is widened (never narrowed) around the ROI until it matches the shape of +the pad frame, which also leaves a margin of context around the box. + +### JFSTRX (LGAD strip-xel) build + +`make jfstrx` (adds `-DJFSTRX`) compiles in the strixel decoder +(`jungfrauLGADStrixelsData_new.h`). Two things change: + +* the **ADC and gain windows stay the raw 1024x512 layout**, exactly as in a + normal build, so the gate-ROI selection and the hover read-out keep working in + raw data coordinates, and the receiver's **red `rx_roi` box** is a plain raw + rectangle; +* a separate window, **"ADC Strixel Panels (JFSTRX)"**, opens with the six ADC + groups arranged like the original ROOT ADC canvas: left column chip1 + g3/g2/g1, right column chip6 g1/g2/g3. It is display only (no ROI, no + receiver box) and shows `raw - pede`, the same `dataMap`/`value` mapping the + original `onlinedisp_zmq` filled its ROOT panels with. + +The panels are drawn with the **rectangular pixel aspect of the strixel +groups**: the mapped pixel is `X = 75*(75/Y)` wide and `Y` tall, with +`Y = 25 / 15 / 18.75 um`, i.e. 9:1, 25:1 and 16:1. `FastImageView` therefore +scales x and y independently for these panels (the ADC and gain windows keep +square pixels). + +The six panels are fed from separate group buffers, not from one tall +`335x1922` image (that geometry is larger than `NCH = 524288`, so writing it +into the raw `adc_image`/`gain_image` overflowed them). The ROOT photon map and +the T-vs-B / L-vs-R scatters also keep the raw 1024x512 layout. + +### keV spectra from a gain map (`keV PH` checkbox) + +The PH spectra can be calibrated to **keV**. Press **`Gain map (keV)...`** in +the **Gain** panel to pick the file (or start with `--gainmap PATH`); the file +is + +``` +6 images of 1024x512 doubles, in this order: + g0, g1, g2, hg0, hg1, hg2 (24 MB) +``` + +which is exactly what a `gainMaps__<...>.bin` from the lab holds. In +normal mode **g0** is the per-pixel gain in **ADU/keV** (the module's file has +30-55 ADU/keV, mean ~42, and hg0 is the high-gain map), so + +``` +keV = pedestal-corrected ADC / g0[pixel] +``` + +**Both sets of spectra are always accumulated** - 8 chip spectra plus the +gate-ROI spectrum, in ADU *and* in keV - but only one of them is on screen, +selected by the **`keV PH`** checkbox next to the gain-map button (loading a map +ticks it for you). The keV view needs the **gain stage active** + (`gain correction on/off`, or `g`): while the gain is off the checkbox keeps its tick for next time but is +greyed, and the plots show ADU: + +| `keV PH` | canvases `A4` (chips) and `A7` (ROI) show | +|---|---| +| unticked | the ADU spectra, x axis in ADU (e.g. -200..3000) | +| ticked, map loaded | the keV spectra, x axis in keV (the same window / 40) | +| ticked, no map | the same, using the **nominal 40 ADU/keV**; the panel says `no gain map selected - using nominal values (40 ADU/keV)` | + +With the nominal constant the keV set is the ADU set divided by exactly 40, so +the two histograms have identical bin contents (the `[root] keV entries` line +reports `kev/adu=1.0000`), which is a quick way to check the conversion is +wired up right. Nothing is converted at all while the gain is off (the Gain +panel then says `gain off: PH spectra in ADU`), so switching the gain back on +resumes the keV spectra exactly where the tick left them. + +It is the *same two canvas windows*, redrawn from the other set - so nothing +goes stale, and the pad titles/stat boxes name the histogram in use (`hchip0` +vs `hchip0_keV`, `hroi` vs `hroi_keV`), which is how you can tell which one you +are looking at. + +The keV axes are the ADU axes divided by the nominal **40 ADU/keV**, so a PH +window from `Set Ranges` covers the same physical region in both sets +(`-200..3000 ADU` = `-5..75 keV`), the bin indices are identical, and switching +does not move the window. Both sets are filled from the same pixels with the +same border trim, so their entry counts are identical and the keV mean is the +ADU mean divided by the gain; with a g0 of 40 the ratio is exactly 40. + +Loading a gain map is optional and only the PH spectra are affected: the ADC +image, the photon map and the HDF5 writer keep working in ADU. Without a map +`--stats` reports `gainmap=off`, the checkbox stays disabled and the keV +accumulators are never touched (`gainmap=loaded` and matching entries once it +is there). The two spectrum canvases are painted one per ROOT tick, only the +selected set, so lowering "Chip spectra every N redraws" in *Update Rates* +refreshes them more often. + +### ROI spectrum (canvas `A7`) + +`A7` holds **one** spectrum of the gate-ROI pixels: same binning, same border +trim and the same x-axis as the chip spectra, but summed over the whole +selection instead of split per chip, and drawn with the normal ROOT histogram +rendering (the chip pads use a polyline instead, because painting eight pads +with the default costs ~1.7 s per redraw). `A9` is the same spectrum in keV +once a gain map is loaded, see below. Its entries are therefore directly +comparable with the *sum* of the eight pads of `A4` (equal when the ROI covers +the full frame). When no ROI is set it stays empty - there is nothing selected +- and the window title always names the rectangle it was filled with (or says +that there is no ROI). A ROI that is merely *selected* fills it; `ROI only` is +a separate control and only decides whether the gate is restricted to the ROI. + +**Palettes are shared.** One palette definition per palette feeds both the ROOT +gradient colour table and the 256-entry lookup table of the fast ADC widget, so +the photon map and the ADC image always show the same colours. `b`/`B` switch +both to the monochrome ramps, `c` switches both back to colour; the gain image +keeps its own fixed 0..4 range colouring. + +**Zoom is master/slave.** The ADC image is the master: dragging (live, not only +on release) or wheel-zooming it moves the gain image viewport immediately and +repaints the ROOT photon map (converted to data rows on the way, see above). `Reset Axis` (or double-clicking the image) +undoes it everywhere at once; a degenerate viewport is never pushed to ROOT, so +pressing it before the first frame is harmless. The queued zoom commands are *coalesced*, so a +continuous drag never floods the ROOT thread - only the newest viewport is +drawn. Double-click resets the view (and the photon map with it). Zooming *out* +keeps growing both directions until the whole frame is shown (the +window-shape matching that keeps the captured ROI in the window shape applies +while zooming in and on resize, but it must not stop a zoom-out in the longer +direction). + + + +* ROOT graphics only ever run on the ROOT thread; other threads post `RootCmd` + entries (`ResetAxes`, `Surf`, `Colz`, palettes, zoom, chip range). +* Source histograms are touched only by the analysis thread; the ROOT thread + paints clones whose bins are copied once per redraw. `copyBins()` is + deliberately lock-free (the originals accepted a torn read during a redraw). + **"Reset His" is performed by the analysis thread** at the top of its next + frame, where `gHistoMtx` is already held (with a non-blocking `try_lock` + fallback on the ROOT thread when the stream is idle). The ROOT thread must + never *wait* for `gHistoMtx`: under a heavy stream it could starve, which made + the reset appear to take tens of seconds. Commands and forced redraws wake the + ROOT thread immediately, so they do not wait for the `ROOT update (ms)` tick. +* `T vs B` / `L vs R` stay windowed per redraw. The photon map is no longer a + ROOT histogram (it has its own Qt window, see *Virtual photon counting*); + "Reset His" clears the spectra and the map accumulator alike. +* ADC zoom propagates to the gain view and, through the coalesced command, to + the photon-map window. + +## ROOT canvas responsiveness + +The ROOT thread owns every canvas and also runs the ROOT event loop, so a slow +redraw makes the plots feel dead. `JF_TIMING=1` prints what the thread spends +per redraw: + +``` +[root] loops=15 redraws=14 | per-redraw us: copy=5726 plot2d=345119 + plot1d=216270 | per-loop us: cmd=0 pe=248 +``` + +Two things dominated and are fixed: + +* the chip spectra were drawn with the ROOT default (a marker plus error bars + per bin) - about 2000 X11 operations per pad, 8 pads, which cost **1.7 s** + per redraw and starved `ProcessEvents` for ~2 s at a time. They are now + drawn as one polyline per pad (`Draw("L")`), which is **0.22 s**, and can be + redrawn every N-th redraw (`Update Rates...` -> "Chip spectra every N + redraws", default 4) instead of every second. +* `ProcessEvents` now runs *inside* a redraw (between the 2D canvases and + between chip pads), so the canvases stay interactive even while a redraw is + in progress rather than only between redraws. + +The photon map is a Qt window now, so it costs one `QImage` fill per publish +(no ROOT redraw at all): the ROOT thread no longer pays for it, and the map can +be published on its own cadence without slowing the canvases down. Raise the +ROOT redraw period in `Update Rates...` if the remaining canvases are still too +expensive, and note that over X11 forwarding each canvas repaint is a network +round trip, so the absolute numbers there will be larger. + +A continuous zoom drag no longer queues a repaint per mouse move either: the +axis ranges are updated for every event but the expensive `colz` repaint is +skipped while a newer viewport is already queued. + +## Saving gate-passed ROI frames (HDF5) + +`Save` in the control window writes to one HDF5 file (plus a JSON sidecar) +either the **active gate ROI** of every frame that passes the gate, or the +**virtual photon counting maps**. A gate ROI is *not* required: with no ROI +selected the full frame is saved (the ROI panel says +`no ROI selected | gate: full frame`). **The ROI applies to both modes**: a +saved map is the gate-ROI window of the full-frame map, cropped in the same +data coordinates as `/data` (same `x`/`y`/`w`/`h`), so a ROI of 400x280 gives +`/virtual photon counting` the shape `{nmaps, 280, 400}`; with no ROI the maps +are `{nmaps, 512, 1024}`. That is a write-side crop - the counting itself is +always full-frame. + +* `save frames` / `virtual photon counting` - what the run writes. The mode is + recorded in the JSON (`save_mode`). +* `Number of frames to be saved` - the run stops by itself once that many + frames are in the file (`0` = unlimited, stop with the button). In virtual + photon counting mode the label changes to *Number of photon maps to be saved* + and the same number budgets the **maps**. +* `photon map every N frames` (virtual photon counting only, minimum **200**) - + how many analysed frames go into one saved map. Independent of the display + cadence in the *Virtual photon counting* panel: the display can run every 200 + frames while the file takes one map every 2000, or the other way round. The + maps are never cumulative in the file, and each one stores the frame number + and timestamp of the **first gate-passed frame** of its window, so a map can + be matched to the frames recorded around it. +* **A pedestal is required.** Photon counting thresholds the + *pedestal-subtracted* ADC, so virtual photon counting **refuses to start** + without an active pedestal (`No pede` on, or no pedestal file): the button + drops back and the status line says + `virtual photon counting needs a pedestal (...)`, instead of writing a file + full of zeros. Load or acquire a pedestal and clear `No pede`, or save + frames. (The JSON records `photon_maps.pedestal_active`, `true` for every + map that does get written.) +* `Directory` / `Base name` - where the files go and what they are called; + `...` browses for the directory. The file is + `/__f0_0.h5` (and the JSON the same with + `.json`), so re-using a base never overwrites an earlier run, and the + directory is created if needed. +* `Previous destinations...` - the list of directories and bases used before, + **most recent first**, with `Use` and `Delete`. A destination is recorded + (and moved to the top) every time a save actually starts, **except** when it is + still the start-up default (`--h5-dir`/`--h5-base`, i.e. `./` + `jfroi` with + no options): the default is not a "previous" destination and would only + clutter the list on every run. The list is one + small file in the program folder (`./save_dest_list.dat`), capped at 100 + entries. +* `Pedestal corrected` - sits under the `save frames` radio, because it only + applies to that mode: the photon maps are always pedestal-subtracted. It is + greyed while `virtual photon counting` is selected. Off by default (raw + data). With it on, `/data` + contains pedestal-corrected **float32** values and no pedestal slice, and the + pedestal image goes to the separate `/pedestal data` dataset instead. It + needs a loaded pedestal (the run refuses to start without one). Each frame is + corrected with the pedestal in force when it was captured, so a live-tracked + pedestal is followed (see "Pedestal tracking" above). +* `Start/Stop save (n)` latches; it also releases when the budget is reached, and + the status line shows the file, how many frames were saved and how many were + dropped. Stopping flushes the queue instead of discarding it. +* **Periodic checkpoint** (`checkpointMs`, default 30 s; 0 disables): while a + save runs, the writer shrinks the over-allocated datasets back to the frames + actually written, flushes the HDF5, and rewrites the JSON sidecar atomically + (`.part` -> rename, see below). Every checkpoint boundary therefore leaves a + self-consistent pair on disk, so the run can be checked without stopping it, + and a crash loses at most one interval. + +The status line spells out what the counters mean: +`N frames written, M dropped (nothing lost)` is the healthy case, and +`... M dropped (writer behind: queue full)` means the writer could not take M +frames/maps because its queue was full (at most **4096 items or 256 MB** are +buffered) - i.e. the disk was slower than the incoming stream. The note only +appears when something was actually dropped; the gate counters keep counting +those frames, they are simply not in the file. + +**A running save locks the settings that would change the file.** While the +writer runs, the save panel (except `Start/Stop save`), the storage-cell filter, +the manual pedestal work, the gain correction and the ROI buttons are disabled - +their JSON sidecar describes the settings at save start, so a quiet change +halfway would make it a lie. The *display* controls stay live (palettes, ranges, +update rates, `Reset His/Axis`, `keV PH`, the cumulative switch and the map +cadence), and the pedestal tracker keeps following drift as it should. The +gate's **threshold** and **min pixels** also stay live, but while **`Gate +enabled` is ticked** changing either one asks first (`Changing settings during a +run, are you sure?`); if you decline, the old value is put back, and if you +accept, the change is applied *and* the file's JSON gets +`gate_settings_modified_during_run: true` plus a `gate_settings_note` saying the +`gate` block is the criterion from save start. With the gate off (passthrough) +those two decide nothing about the saved frames, so they change silently and +nothing is added to the JSON. + +**Quitting asks first, and flushes a running save.** `Quit (q)`, closing the +window, or the shortcut all raise a confirmation; if a ROI save is still +running the dialog says how many frames are written and where, and states that +it will be flushed. Only *Yes* quits: the writer drains its queue, closes the +HDF5 file (extending it to exactly the frames written), writes the JSON sidecar +with `stop_reason = "program exit"`, and only then do the threads stop. +**Every window goes with it**: the ADC, gain and photon-map windows are +separate top-levels and the ROOT canvases live in the ROOT thread, so quitting +closes them explicitly - closing only the control window used to leave them (and +the process) behind. `No` +(or `Escape`) leaves everything running untouched. `Ctrl-C`/`SIGTERM` cannot +ask (a signal is not a dialog), so they flush the save and exit; a second +`Ctrl-C` quits immediately. + +Each mode ends by itself when its budget is reached (`stop_reason` +`frame budget reached` / `photon-map budget reached`), leaving a closed, +`complete: true` file and JSON behind - the useful way to run a save +unattended. `--save-budget N` sets the budget without the GUI. + +Saves can be run back to back: a save that ends by itself (frame budget +reached, `Start/Stop save` pressed again, or an I/O error) leaves a finished writer +thread behind, and the next start joins it before spawning a new one. (A +`std::thread` that is still joinable may not be overwritten - doing so calls +`std::terminate`, which is what aborted the program the second time a file was +started.) The acq, analysis, worker and ROOT threads are also wrapped so that +an exception is reported and stops that stage instead of calling +`std::terminate`; the GUI keeps running and shows the message in "Last error". + +### File format (slsReceiver-compatible) + +The layout is the one written by `slsReceiverSoftware/src/HDF5DataFile.cpp`, so +existing receiver readers work unchanged. The file is **v110 format** (SWMR, see +"Crash recovery and mid-run inspection"), so readers need HDF5 >= 1.10: + +``` +/jfroi__f0_0.h5 + /data rank 3, U16LE, {nframes, h, w}, + unlimited, chunk {1, h, w} + /frame number U64, one value per frame + /exp length or sub exposure time U32 + /packets caught U32 + /detector specific 1 U64 + /timestamp U64 + /mod id, /row, /column U16 + /detector specific 2 U16 + /detector specific 3 U32 + /detector specific 4 U16 + /detector type, /detector header version U8 + /packets caught bit mask fixed size string (zero here) + /pedestal data float32, corrected mode only + /pedestal tracking float32, {n, h, w} (empty unless tracked) + /pedestal tracking frame U64, one value per tracked image + /virtual photon counting float32, {nmaps, h, w}, photon mode only + /virtual photon counting frame U64, first frame number of each map + /virtual photon counting timestamp U64, its header timestamp + attribute "version" = 7.0 (as the receiver writes it) + attribute "roi_x/roi_y/roi_w/roi_h", "pedestal_in_frame_0", "gate" +``` + +The parameter datasets are filled from the streamed JSON header (frame number, +exp length, packets caught, detSpec1..4, timestamp, mod id, row, column, +detector type/version), so a reader keys on `/frame number` as usual. The +packets-caught bit mask is not part of the ZMQ header and is written zero. + +Deliberate differences from a receiver file: + +* `/data` is the **ROI crop**, not the whole module; +* the file is **v110 format** and written in SWMR mode, so it can be read while + it is being written and stays valid if the writer crashes (readers need + HDF5 >= 1.10); +* `/pedestal tracking` and `/pedestal tracking frame` are always present (empty + when tracking is off) because SWMR cannot create objects after it starts; +* in **virtual photon counting** mode the frames are not written at all: `/data` + keeps only its slice 0 (the pedestal) and the maps go to + `/virtual photon counting`, with the provenance of each map in + `/virtual photon counting frame` (first frame number of its window) and + `/virtual photon counting timestamp`. The maps are photon counts per pixel, + float32, never cumulative, and cropped to the gate ROI exactly like `/data`; +* `Pedestal corrected` mode changes `/data` to float32 and drops the slice-0 + pedestal, so the layout then is `/data` (n frames), `/pedestal data` + (one image, float32) and the same parameter datasets; +* only **gate-passed** frames are written - each keeps its **original frame + number**, so the gaps in `/frame number` are exactly the frames the gate + rejected; +* in raw mode **slice 0 is the gain-0 pedestal in the same ROI** (frame number + 0, flagged by the `pedestal_in_frame_0` attribute), so a reader can subtract + it directly; with no pedestal loaded the slice is zero; +* in corrected mode the correction is the same one the display and the gate + use (g0: `raw - pede0`, g1: `(pede1 + G1off - raw) * 30`, g3: + `(pede2 + G2off - raw) * 340`), written as float32, so negatives and the + gain-normalised scale survive. The pedestal applied is the one in force when + the frame was captured, so pedestal tracking is followed slice by slice; use + `/pedestal tracking` (with `/pedestal tracking frame`) to know which pedestal + each slice saw. `/pedestal data` is the pedestal at save start; +* `/data` slices are the raw 16-bit words as received (ADC in bits 0-13, gain + in bits 14-15), exactly like the receiver; slice 0 is in ADC units; +* extra self-describing root attributes: `roi_x/roi_y/roi_w/roi_h`, + `pedestal_in_frame_0`, `gate`. + +### JSON sidecar + +Same base name with `.json`: ROI, the gate criteria in force, the data +encoding, start time and duration, stop reason, frames saved / dropped / +budget / first and last frame number, the full gate statistics and rates, the +alignment counters and the per-interface state. + +The save mode is spelled out: `save_mode` (`frames` or +`virtual photon counting`), `photon_map_every`, `photon_threshold` and +`photon_threshold_unit` (`ADU` or `keV`), and - only when it happened - +`gate_settings_modified_during_run` with `gate_settings_note`, and in photon mode a `photon_maps` +block with `saved`, `every`, `threshold`, `threshold_unit`, `cumulative: +false`, `pedestal_active` and the dataset name. In that mode +`frames.saved` counts the **maps** (the frames budget is unused), so a +reader does not have to know which counter applies. + +The sidecar is rewritten at every checkpoint, not only at the end. Each rewrite +fills `..._f0_0.json.part`, fsyncs it and renames it over the `.json`, so +a reader always sees a complete document - the previous one until the rename - +and a crash mid-write leaves only a stale `.part` behind. While the save runs +the document carries `"complete": false`; the final one, written when the writer +stops, carries `"complete": true`. The statistics are refreshed by the writer +thread just before each write, so the final document holds the true end-of-run +values. + +### Crash recovery and mid-run inspection + +The HDF5 is written in **SWMR** mode (Single Writer / Multiple Reader). The file +is created with `libver = latest` (v110 format), all objects are created up +front, and `H5Fstart_swmr_write` is called before the first frame. Every +checkpoint then shrinks the datasets to the frames actually written, flushes, +and rewrites the JSON atomically. + +What that buys: + +* **Open it mid-run.** A reader can open the live file with the SWMR read flag + while the save continues, e.g. `h5py.File(path, "r", libver="latest", + swmr=True)`. HDF5 guarantees a valid, consistent view at every flush; without + SWMR a second open would be refused by the file lock. +* **Crash recovery.** SWMR guarantees the file stays valid even if the writer + dies without closing it, so the last flushed checkpoint is readable. The JSON + sidecar carries the matching `frames.saved` / `last_frame_number`. +* **The JSON is never torn** - it is published with a single `.part` -> rename, + so a reader sees the previous complete document until the new one is ready. + +Trade-offs: + +* v110 files need HDF5 >= 1.10 to read (finished or in progress). Older analysis + installations cannot open them. +* Because SWMR forbids creating objects after it starts, `/pedestal tracking` + and `/pedestal tracking frame` are now created (empty) for every save; the + series is still only filled while tracking is on. +* Tools that do not know about SWMR should read the file after the save has + closed (then it is an ordinary v110 file), or take a copy at a checkpoint + boundary. + +### Throughput + +The acq thread only copies the ROI into a queue (up to 256 MB); a separate +writer thread does the HDF5 I/O. If the gate passes frames faster than the disk +absorbs them, the queue fills and the excess is counted as +`dropped_queue_full` in the JSON and shown in the GUI - the gate counters stay +exact, but those frames are not in the file. + +`--h5-dir DIR` and `--h5-base NAME` set the initial directory and base name +(defaults: the program folder and `jfroi`). + +## Behaviour differences worth knowing + +1. **One pedestal store.** The gate and the display share one immutable + `PedeSet` (shared_ptr swap). File loads and live acquisition publish a new + set, so the old `stop() → loadPedestal() → start()` contract is gone and + loading pedestals never interrupts acquisition. +2. **Gate offsets unified.** The old filter had its own `G1offset/G2offset` + (always 0); the gate now uses the display's live `G1Poffset/G2Poffset`. +3. **Gate threshold vs photon threshold** are separate values in one process + (they only collided as one global named `threshold` because they lived in + two programs). The gate one is an argument or the gate panel and is always + ADU. The photon-map one lives in the *Virtual photon counting* panel and + follows the gain stage: **ADU** while the gain correction is off (default + 150) and **keV** while it is on (default 4.0) - one control, two remembered + values, so the keV spectra and the photon counting can never disagree about + the calibration. +4. **`Acquire Pede` follows the storage-cell filter.** Pedestals depend on the + storage cell, so only frames the SC filter accepts are averaged: with + `--sc 7` (or the drop-down set to 7) a 25-frame acquisition takes frames from + cell 7 only - measured: it completed after 365 incoming frames instead of 25 + - and the log says which cell it used + (`[pede] installed pedestals averaged over 25 frames (storage cell 7)`). + With the filter on `ALL` every cell contributes and the log says + `storage cell ALL - every cell contributed`, which mixes their pedestals: set + the filter when the pedestal is cell-dependent. The *signal* gate is + deliberately not applied here - the frames it drops are exactly the empty + ones a pedestal wants. +5. **Live pedestal acquisition is asynchronous** (`p` / `--acquire-pede`); it + averages the next N frames on the acq thread instead of blocking the GUI + and restarting threads. It fills gain 0 only, so `hasAll` stays false — the + same fallback behaviour as the old `loadpede()`. +5. **Keyboard shortcuts actually work, and upper case needs Shift.** `s`/`Shift+S`, +`b`/`Shift+B`, `r`/`Shift+R`, `o`/`Shift+O` and `p`/`Shift+P` are distinct +(`QKeySequence("s") == QKeySequence("S")` made the plain upper-case forms +ambiguous, so Qt activated neither). The original only *documented* `s`, + `p`, `o`/`O`, `r`/`R`, `+`/`-`, `q`, `u`, `C`, `[`/`]`, `{`/`}`, `g`, `b`, + `B` in the button labels; they are now real `QShortcut`s. +6. **"Load All Pede (P)" is functional** (file chooser); the original printed + *not implemented*. +7. Leaks fixed: the ROI `TBox` is now a single reused box, and the live + pedestal decoder object is freed. +8. `phene == 0` can no longer divide by zero in the photon-counting increment. +9. **The stream state is real.** `jf_filter` treated every 200 ms receive + timeout as "Receiver stopped, waiting for new stream", which fired whenever + the receiver was merely idle. The merged program monitors the ZMQ socket + (`zmq_socket_monitor`) and derives the state from actual connect / + disconnect / handshake events: + + | state | GUI text | `--stats` token | + |---|---|---| + | never connected yet | `waiting for receiver...` | `connecting` | + | peer up, frames arriving | `connected` | `connected` | + | peer up, no frame for > 2 s | `connected (no frames for N s)` | `idle` | + | end-of-acquisition marker seen | `connected (end of acquisition)` | `eoa` | + | peer gone | `disconnected` | `disconnected` | + + stdout lines are emitted only on real transitions: + `Receiver connected` / `Receiver connected but no frames for N s (still alive)` + / `Receiver sent end-of-acquisition, waiting for new stream` / + `Receiver disconnected, waiting to reconnect...`. + If `zmq_socket_monitor` is unavailable the code falls back to frame-arrival + staleness (3 s) instead of failing. + +## Quirks deliberately preserved + +* `factor = 1.84` scaling of the reference rows/columns in the ADC image. +* `fgaind[]` is still never initialised to anything but 0, so the gain + correction path multiplies gain-0 pixels by zero (pre-existing behaviour, + kept as-is). +* `hchptr[]` is still accumulated and never displayed. +* The gate's no-pedestal path still compares raw 14-bit ADC values, while the + display's photon counting and the saved photon maps need a pedestal (`g0`) and + cannot be saved at all in the default `--no-pede` mode: the photon-map save + is refused with an explanation, while the frame save (and the gate's own raw + thresholding) keep working. +* `--no-gate` performs no pixel counting, so `pixelsAbove` stays 0. + +## Testing without hardware + +`test/jf_feeder.cpp` stands in for `slsReceiver`: it publishes the same +`` pairs. Every 3rd frame carries no signal; the +others carry 40 pixels at ADC 300 over a baseline of 100. + +```sh +make feeder +./test/jf_feeder tcp://*:30777 200 20 & +./jf_online_display_gui 400 127.0.0.1 30777 --gate --stats --pede /nonexistent.dat +# gate threshold 200 -> expect pass = 2/3, drop = 1/3, px = pass*40 + +# virtual photon counting save, headless: a zero-filled pedestal makes the +# 40-pixel cluster count (with the real ~2000 ADU pedestal the maps are empty) +/usr/bin/python3.9 -c "import numpy as np; np.zeros(6*1024*512,' "connected but no frames for 2.0 s +# (still alive)" -> frames -> "end-of-acquisition" -> "disconnected" + +# multi-interface check: two 1024x256 slabs on 30777 (bot, value 100) and +# 30778 (top, value 150); gate threshold 120 -> only the top slab counts +./test/jf_feeder dual 30777 200 10 4 100 150 0 & +./jf_online_display_gui 400 127.0.0.1 30777+30778 120 5 --gate --stats --pede /nonexistent.dat +# expected: px = in * 262144, mispaired=0, drop=0 + +# storage-cell gate: the feeder cycles SC = frame % 16 in detSpec3, so a +# selected cell must pass exactly 1/16 of the frames and nothing else +./test/jf_feeder dual 30777 1600 400 1 100 150 0 & +./jf_online_display_gui 1000 127.0.0.1 30777+30778 120 5 --gate --stats \ + --pede /nonexistent.dat --sc 3 +# expected: pass ~= in/16, scdrop ~= 15*in/16, pass + scdrop = in, sc=3 +# (--sc all passes everything; with --no-gate the cell gate still filters) + +# gate-ROI convention + ROI spectra, same feeder (bottom slab dim, top bright): +# a ROI on the TOP half must be the one that passes, and only hchip 4..7 of +# the ROI spectra may be filled; the BOTTOM half must drop everything +JF_TIMING=1 ./jf_online_display_gui 400 127.0.0.1 30777+30778 120 5 --gate --stats \ + --pede /nonexistent.dat --gate-roi 0 256 1024 256 +# expected: px = in * 262144, hroi/hchip = 0.5214 (chips 4..7 of A4) +JF_TIMING=1 ./jf_online_display_gui 400 127.0.0.1 30777+30778 120 5 --gate --stats \ + --pede /nonexistent.dat --gate-roi 0 0 1024 256 +# expected: pass = 0, px = 0 (the dim half is at the bottom) +JF_TIMING=1 ./jf_online_display_gui 400 127.0.0.1 30777+30778 120 5 --gate --stats \ + --pede /nonexistent.dat --gate-roi 0 0 1024 512 +# expected: hroi == the sum of hchip (a full-frame ROI selects every pixel) +``` + +A zero-filled 12 MB file works as a pedestal for these runs (the photon map +and the photon counting need `g0` to be present, so `--pede /nonexistent.dat` +leaves the photon map empty by design). + +Verified end-to-end under `xvfb-run`: gate counts/rates, pixels-above, display +hand-off with zero drops, ROOT redraws, live pedestal acquisition, 12 MB +pedestal file load, optional republish to an external subscriber, +end-of-acquisition handling, connect/idle/disconnect/reconnect reporting, +graceful `SIGINT`/`SIGTERM` shutdown, and for the multi-interface mode: slab +geometry detection, bottom→top placement (and the reversed order), pairing by +frame number, straggler timeout, mispair detection/recovery, a permanently +missing interface running at full rate without freezing, dual-mode republish, +and the live/loaded pedestal paths on the assembled frame. The ROI work was +verified against synthetic frames by counting the pixels per chip (a top-half +ROI gives `hroi/chip = 0.5214`, a bottom-half ROI passes the gate only when the +bottom half is the bright one, a full-frame ROI gives `hroi == sum(hchip)`, and +`hroi/hchip` matches rows x columns exactly), the range defaults were read back +from the live axes (`PH x -212..3010`, `main z 0..256`), the Set Ranges dialog +was driven through XTest (it opens on the live values `ADC -200..1000` / +`P.Map 0..256` / `PH -213..3010`; typing `ADC max = 300` turned the dim half of +the ADC image from blue `(0,150,221)` into yellow-green `(214,253,39)` while +the ROOT map kept its own scale, and `P.Map max = 251` left the ROOT map at +`0..251` across several redraws), and the geometry was checked on +screen under Xvfb: with a 400x1000 ADC window the captured ROI came out +78x224 (narrow and tall), the yellow box was measured at 162x463 px against an +ideal 2.872 aspect (0.5% off), and the bright half of the frame is at the +bottom in the ADC image and in the ROOT photon map alike. + +`test/pede_live_test.cpp` is a standalone check (no hardware, no GUI) with two +claims: a `Pedestal corrected` save follows the live pedestal instead of the +snapshot taken at Start Save (it offers one frame, installs a different +`PedeSet` mid-run, offers a second frame, and expects the two `/data` slices to +carry the two different pedestals), and the periodic checkpoint leaves a clean +pair on disk while the save still runs (the JSON has `"complete": false`, no +`.part` is left, and the **live** HDF5 read back with the SWMR flag has exactly +the frames written, not the over-allocated block). Build and run it against the +already-built objects: + +``` +g++ -std=c++17 -O2 -pthread $(root-config --cflags) \ + $(pkg-config --cflags Qt5Core Qt5Gui Qt5Widgets) \ + -I. -I../../dataStructures -I../../interpolations -I../../tiffio/include \ + -I../../../slsSupportLib/include -I../../../slsReceiverSoftware/include \ + -I../../../libs/rapidjson -I../../../build/_deps/libzmq-src/include \ + test/pede_live_test.cpp online_jf_h5.o online_jf_core.o online_jf_root.o \ + -o test/pede_live_test \ + $(pkg-config --libs Qt5Core Qt5Gui Qt5Widgets) $(root-config --libs) \ + ../../../build/_deps/libzmq-build/lib/libzmq.a -lhdf5_cpp -lhdf5 -lsodium \ + -lpthread -lrt -lm +cd test && LD_LIBRARY_PATH=/usr/lib64/root ./pede_live_test +``` + +`test/panel_map_test.cpp` is a JFSTRX-only check that the six-panel fill +geometry matches the strixel decoder: every booked panel (79x165, 47x320, +59x476 twice) must be fully covered by the decoder map, and only the decoder's +few extra right-edge columns may fall outside. Build it with `-DJFSTRX` against +the JFSTRX objects (same command as above plus `-DJFSTRX`). + +## Files + +| file | contents | +|---|---| +| `online_jf.h` | shared state, `Config`, `PedeSet`/`PedestalStore`, `GateEngine`, mailboxes, `Pipeline`, ROOT declarations | +| `online_jf_core.cpp` | globals, pedestal file I/O, gate math, acq + analysis threads | +| `online_jf_root.cpp` | ROOT objects, command queue, ROOT redraw thread, plotting | +| `online_jf_gui.cpp` | `FastImageView`, merged `MainWindow`, CLI parsing, `main()` | +| `online_jf_h5.cpp` | decimated ROI HDF5 writer (receiver-compatible) + JSON sidecar | +| `test/jf_feeder.cpp` | synthetic slsReceiver / republish subscriber | +| `test/pede_live_test.cpp` | standalone check: live pedestal + periodic clean checkpoint | +| `test/panel_map_test.cpp` | JFSTRX-only check of the six-panel fill geometry | diff --git a/slsDetectorCalibration/jungfrauExecutables/jf_online_display_gui/changes.partch b/slsDetectorCalibration/jungfrauExecutables/jf_online_display_gui/changes.partch new file mode 100644 index 000000000..efb10fa15 --- /dev/null +++ b/slsDetectorCalibration/jungfrauExecutables/jf_online_display_gui/changes.partch @@ -0,0 +1,7842 @@ +diff --git a/bash_autocomplete.sh b/bash_autocomplete.sh +deleted file mode 120000 +index f79749d0d..000000000 +--- a/bash_autocomplete.sh ++++ /dev/null +@@ -1 +0,0 @@ +-slsDetectorSoftware/generator/autocomplete/bash_autocomplete.sh +\ No newline at end of file +diff --git a/bash_autocomplete.sh b/bash_autocomplete.sh +new file mode 100644 +index 000000000..5fe099a7d +--- /dev/null ++++ b/bash_autocomplete.sh +@@ -0,0 +1,3448 @@ ++# GENERATED FILE - DO NOT EDIT ++# ANY CHANGES TO THIS FILE WILL BE OVERWRITTEN ++ ++_sd() { ++ ++ # Taken from https://github.com/scop/bash-completion/blob/15b74b1050333f425877a7cbd99af2998b95c476/bash_completion#L770C12-L770C12 ++ # Reassemble command line words, excluding specified characters from the ++ # list of word completion separators (COMP_WORDBREAKS). ++ # @param $1 chars Characters out of $COMP_WORDBREAKS which should ++ # NOT be considered word breaks. This is useful for things like scp where ++ # we want to return host:path and not only path, so we would pass the ++ # colon (:) as $1 here. ++ # @param $2 words Name of variable to return words to ++ # @param $3 cword Name of variable to return cword to ++ # ++ _comp__reassemble_words() ++{ ++ local exclude="" i j line ref ++ # Exclude word separator characters? ++ if [[ $1 ]]; then ++ # Yes, exclude word separator characters; ++ # Exclude only those characters, which were really included ++ exclude="[${1//[^$COMP_WORDBREAKS]/}]" ++ fi ++ ++ # Default to cword unchanged ++ printf -v "$3" %s "$COMP_CWORD" ++ # Are characters excluded which were former included? ++ if [[ $exclude ]]; then ++ # Yes, list of word completion separators has shrunk; ++ line=$COMP_LINE ++ # Re-assemble words to complete ++ for ((i = 0, j = 0; i < ${#COMP_WORDS[@]}; i++, j++)); do ++ # Is current word not word 0 (the command itself) and is word not ++ # empty and is word made up of just word separator characters to ++ # be excluded and is current word not preceded by whitespace in ++ # original line? ++ while [[ $i -gt 0 && ${COMP_WORDS[i]} == +($exclude) ]]; do ++ # Is word separator not preceded by whitespace in original line ++ # and are we not going to append to word 0 (the command ++ # itself), then append to current word. ++ [[ $line != [[:blank:]]* ]] && ((j >= 2)) && ((j--)) ++ # Append word separator to current or new word ++ ref="$2[$j]" ++ printf -v "$ref" %s "${!ref-}${COMP_WORDS[i]}" ++ # Indicate new cword ++ ((i == COMP_CWORD)) && printf -v "$3" %s "$j" ++ # Remove optional whitespace + word separator from line copy ++ line=${line#*"${COMP_WORDS[i]}"} ++ # Indicate next word if available, else end *both* while and ++ # for loop ++ if ((i < ${#COMP_WORDS[@]} - 1)); then ++ ((i++)) ++ else ++ break 2 ++ fi ++ # Start new word if word separator in original line is ++ # followed by whitespace. ++ [[ $line == [[:blank:]]* ]] && ((j++)) ++ done ++ # Append word to current word ++ ref="$2[$j]" ++ printf -v "$ref" %s "${!ref-}${COMP_WORDS[i]}" ++ # Remove optional whitespace + word from line copy ++ line=${line#*"${COMP_WORDS[i]}"} ++ # Indicate new cword ++ ((i == COMP_CWORD)) && printf -v "$3" %s "$j" ++ done ++ ((i == COMP_CWORD)) && printf -v "$3" %s "$j" ++ else ++ # No, list of word completions separators hasn't changed; ++ for i in "${!COMP_WORDS[@]}"; do ++ printf -v "$2[i]" %s "${COMP_WORDS[i]}" ++ done ++ fi ++} ++ ++ ++ local FCN_RETURN="" ++ local IS_PATH=0 ++ ++ ++local SLS_COMMANDS=" acquire activate adcclk adcenable adcenable10g adcindex adcinvert adclist adcname adcphase adcpipeline adcreg adcvpp apulse asamples autocompdisable badchannels blockingtrigger burstmode burstperiod bursts burstsl bustest cdsgain chipversion clearbit clearbusy clientversion clkdiv clkfreq clkphase collectionmode column compdisabletime confadc config configtransceiver counters currentsource dac dacindex daclist dacname dacvalues datastream dbitclk dbitphase dbitpipeline defaultdac defaultpattern delay delayl detectorserverversion detsize diodelay dpulse dr drlist dsamples execcommand exptime exptime1 exptime2 exptime3 extrastoragecells extsampling extsamplingsrc extsig fformat filtercells filterresistor findex firmwaretest firmwareversion fliprows flowcontrol10g fmaster fname foverwrite fpath framecounter frames framesl frametime free fwrite gaincaps gainmode gappixels gatedelay gatedelay1 gatedelay2 gatedelay3 gates getbit hardwareversion highvoltage hostname im_a im_b im_c im_d im_io imagetest initialchecks inj_ch interpolation interruptsubframe kernelversion lastclient led lock master maxadcphaseshift maxclkphaseshift maxdbitphaseshift measuredperiod measuredsubperiod moduleid nextframenumber nmod numinterfaces overflow packageversion parallel parameters partialreset patfname patioctrl patlimits patloop patloop0 patloop1 patloop2 patmask patnloop patnloop0 patnloop1 patnloop2 patsetbit pattern patternstart patwait patwait0 patwait1 patwait2 patwaittime patwaittime0 patwaittime1 patwaittime2 patword pedestalmode period periodl polarity port powerchip powerindex powerlist powername powervalues programfpga pulse pulsechip pulsenmove pumpprobe quad ratecorr readnrows readout readoutspeed readoutspeedlist rebootcontroller reg resetdacs resetfpga romode row runclk runtime rx_arping rx_clearroi rx_dbitlist rx_dbitoffset rx_dbitreorder rx_discardpolicy rx_fifodepth rx_frameindex rx_framescaught rx_framesperfile rx_hostname rx_jsonaddheader rx_jsonpara rx_lastclient rx_lock rx_missingpackets rx_padding rx_printconfig rx_realudpsocksize rx_roi rx_silent rx_start rx_status rx_stop rx_tcpport rx_threads rx_udpsocksize rx_version rx_zmqfreq rx_zmqhwm rx_zmqip rx_zmqport rx_zmqstartfnum rx_zmqstream samples savepattern scan scanerrmsg selinterface serialnumber setbit settings settingslist settingspath signalindex signallist signalname sleep slowadc slowadcindex slowadclist slowadcname slowadcvalues start status stop stopport storagecell_delay storagecell_start subdeadtime subexptime sync syncclk temp_10ge temp_adc temp_control temp_dcdc temp_event temp_fpga temp_fpgaext temp_fpgafl temp_fpgafr temp_slowadc temp_sodl temp_sodr temp_threshold templist tempvalues tengiga threshold thresholdnotb timing timing_info_decoder timinglist timingsource top transceiverenable trigger triggers triggersl trimbits trimen trimval tsamples txdelay txdelay_frame txdelay_left txdelay_right type udp_cleardst udp_dstip udp_dstip2 udp_dstlist udp_dstmac udp_dstmac2 udp_dstport udp_dstport2 udp_firstdst udp_numdst udp_reconfigure udp_srcip udp_srcip2 udp_srcmac udp_srcmac2 udp_validate update updatedetectorserver updatekernel updatemode user v_a v_b v_c v_chip v_d v_io v_limit vchip_comp_adc vchip_comp_fe vchip_cs vchip_opa_1st vchip_opa_fd vchip_ref_comp_fe versions veto vetoalg vetofile vetophoton vetoref vetostream virtual vm_a vm_b vm_c vm_d vm_io zmqhwm zmqip zmqport " ++__acquire() { ++FCN_RETURN="" ++return 0 ++} ++__activate() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="0 1" ++fi ++fi ++return 0 ++} ++__adcclk() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__adcenable() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__adcenable10g() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__adcindex() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 1 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__adcinvert() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__adclist() { ++FCN_RETURN="" ++return 0 ++} ++__adcname() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 1 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++if [[ "${cword}" == "3" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__adcphase() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 1 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="deg" ++fi ++fi ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++if [[ "${cword}" == "3" ]]; then ++FCN_RETURN="deg" ++fi ++fi ++return 0 ++} ++__adcpipeline() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__adcreg() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 1 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++if [[ "${cword}" == "3" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__adcvpp() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 1 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="0 1" ++fi ++fi ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++if [[ "${cword}" == "3" ]]; then ++FCN_RETURN="mV mv" ++fi ++fi ++return 0 ++} ++__apulse() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="0 1" ++fi ++fi ++return 0 ++} ++__asamples() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__autocompdisable() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="0 1" ++fi ++fi ++return 0 ++} ++__badchannels() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 1 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__blockingtrigger() { ++FCN_RETURN="" ++return 0 ++} ++__burstmode() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="burst_external burst_internal cw_external cw_internal" ++fi ++fi ++return 0 ++} ++__burstperiod() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 1 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="ms ns s us" ++fi ++fi ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++if [[ "${cword}" == "3" ]]; then ++FCN_RETURN="ms ns s us" ++fi ++fi ++return 0 ++} ++__bursts() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__burstsl() { ++FCN_RETURN="" ++return 0 ++} ++__bustest() { ++FCN_RETURN="" ++return 0 ++} ++__cdsgain() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="0 1" ++fi ++fi ++return 0 ++} ++__chipversion() { ++FCN_RETURN="" ++return 0 ++} ++__clearbit() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++if [[ "${cword}" == "3" ]]; then ++FCN_RETURN="" ++fi ++if [[ "${cword}" == "4" ]]; then ++FCN_RETURN="--validate" ++fi ++fi ++return 0 ++} ++__clearbusy() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 1 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++if [[ "${cword}" == "3" ]]; then ++FCN_RETURN="" ++fi ++if [[ "${cword}" == "4" ]]; then ++FCN_RETURN="--validate" ++fi ++fi ++return 0 ++} ++__clientversion() { ++FCN_RETURN="" ++return 0 ++} ++__clkdiv() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 1 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++if [[ "${cword}" == "3" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__clkfreq() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 1 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__clkphase() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 1 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++if [[ "${cword}" == "3" ]]; then ++FCN_RETURN="deg" ++fi ++fi ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++if [[ "${cword}" == "3" ]]; then ++FCN_RETURN="" ++fi ++if [[ "${cword}" == "4" ]]; then ++FCN_RETURN="deg" ++fi ++fi ++return 0 ++} ++__collectionmode() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="electron hole" ++fi ++fi ++return 0 ++} ++__column() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__compdisabletime() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 1 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="ms ns s us" ++fi ++fi ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++if [[ "${cword}" == "3" ]]; then ++FCN_RETURN="ms ns s us" ++fi ++fi ++return 0 ++} ++__confadc() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 1 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++if [[ "${cword}" == "3" ]]; then ++FCN_RETURN="" ++fi ++fi ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++if [[ "${cword}" == "3" ]]; then ++FCN_RETURN="" ++fi ++if [[ "${cword}" == "4" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__config() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 1 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++if [[ "${cword}" == "3" ]]; then ++FCN_RETURN="" ++fi ++if [[ "${cword}" == "4" ]]; then ++FCN_RETURN="" ++fi ++fi ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++IS_PATH=1 ++fi ++fi ++return 0 ++} ++__configtransceiver() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 1 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++IS_PATH=1 ++fi ++fi ++return 0 ++} ++__counters() { ++FCN_RETURN="" ++return 0 ++} ++__currentsource() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="0 1" ++fi ++if [[ "${cword}" == "3" ]]; then ++FCN_RETURN="fix nofix" ++fi ++if [[ "${cword}" == "4" ]]; then ++FCN_RETURN="" ++fi ++if [[ "${cword}" == "5" ]]; then ++FCN_RETURN="low normal" ++fi ++fi ++return 0 ++} ++__dac() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 1 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="`sls_detector_get daclist | sed -e 's/.*\[\(.*\)\].*/\1/' | sed 's/,//g'`" ++fi ++if [[ "${cword}" == "3" ]]; then ++FCN_RETURN="mV mv" ++fi ++fi ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="`sls_detector_get daclist | sed -e 's/.*\[\(.*\)\].*/\1/' | sed 's/,//g'`" ++fi ++if [[ "${cword}" == "3" ]]; then ++FCN_RETURN="" ++fi ++if [[ "${cword}" == "4" ]]; then ++FCN_RETURN="mV mv" ++fi ++fi ++return 0 ++} ++__dacindex() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 1 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__daclist() { ++FCN_RETURN="" ++return 0 ++} ++__dacname() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 1 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="`sls_detector_get daclist | sed -e 's/.*\[\(.*\)\].*/\1/' | sed 's/,//g'`" ++fi ++fi ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="`sls_detector_get daclist | sed -e 's/.*\[\(.*\)\].*/\1/' | sed 's/,//g'`" ++fi ++if [[ "${cword}" == "3" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__dacvalues() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 1 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="mV mv" ++fi ++fi ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="mV mv" ++fi ++fi ++return 0 ++} ++__datastream() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 1 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="bottom left right top" ++fi ++fi ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="bottom left right top" ++fi ++if [[ "${cword}" == "3" ]]; then ++FCN_RETURN="0 1" ++fi ++fi ++return 0 ++} ++__dbitclk() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__dbitphase() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 1 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="deg" ++fi ++fi ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++if [[ "${cword}" == "3" ]]; then ++FCN_RETURN="deg" ++fi ++fi ++return 0 ++} ++__dbitpipeline() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__defaultdac() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 1 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="`sls_detector_get daclist | sed -e 's/.*\[\(.*\)\].*/\1/' | sed 's/,//g'`" ++fi ++if [[ "${cword}" == "3" ]]; then ++FCN_RETURN="`sls_detector_get settingslist | sed -e 's/.*\[\(.*\)\].*/\1/' | sed 's/,//g'`" ++fi ++fi ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="`sls_detector_get daclist | sed -e 's/.*\[\(.*\)\].*/\1/' | sed 's/,//g'`" ++fi ++if [[ "${cword}" == "3" ]]; then ++FCN_RETURN="" ++fi ++if [[ "${cword}" == "4" ]]; then ++FCN_RETURN="`sls_detector_get settingslist | sed -e 's/.*\[\(.*\)\].*/\1/' | sed 's/,//g'`" ++fi ++fi ++return 0 ++} ++__defaultpattern() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 1 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="`sls_detector_get daclist | sed -e 's/.*\[\(.*\)\].*/\1/' | sed 's/,//g'`" ++fi ++if [[ "${cword}" == "3" ]]; then ++FCN_RETURN="" ++fi ++if [[ "${cword}" == "4" ]]; then ++FCN_RETURN="`sls_detector_get settingslist | sed -e 's/.*\[\(.*\)\].*/\1/' | sed 's/,//g'`" ++fi ++fi ++return 0 ++} ++__delay() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 1 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="ms ns s us" ++fi ++fi ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++if [[ "${cword}" == "3" ]]; then ++FCN_RETURN="ms ns s us" ++fi ++fi ++return 0 ++} ++__delayl() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 1 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="ms ns s us" ++fi ++fi ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="ms ns s us" ++fi ++fi ++return 0 ++} ++__detectorserverversion() { ++FCN_RETURN="" ++return 0 ++} ++__detsize() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++if [[ "${cword}" == "3" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__diodelay() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 1 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++if [[ "${cword}" == "3" ]]; then ++FCN_RETURN="" ++fi ++fi ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++if [[ "${cword}" == "3" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__dpulse() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="0 1" ++fi ++fi ++return 0 ++} ++__dr() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__drlist() { ++FCN_RETURN="" ++return 0 ++} ++__dsamples() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__execcommand() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 1 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__exptime() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 1 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="ms ns s us" ++fi ++fi ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++if [[ "${cword}" == "3" ]]; then ++FCN_RETURN="ms ns s us" ++fi ++fi ++return 0 ++} ++__exptime1() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 1 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="ms ns s us" ++fi ++fi ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++if [[ "${cword}" == "3" ]]; then ++FCN_RETURN="ms ns s us" ++fi ++fi ++return 0 ++} ++__exptime2() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 1 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="ms ns s us" ++fi ++fi ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++if [[ "${cword}" == "3" ]]; then ++FCN_RETURN="ms ns s us" ++fi ++fi ++return 0 ++} ++__exptime3() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 1 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="ms ns s us" ++fi ++fi ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++if [[ "${cword}" == "3" ]]; then ++FCN_RETURN="ms ns s us" ++fi ++fi ++return 0 ++} ++__extrastoragecells() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__extsampling() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="0 1" ++fi ++fi ++return 0 ++} ++__extsamplingsrc() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__extsig() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 1 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++if [[ "${cword}" == "3" ]]; then ++FCN_RETURN="inversion_off inversion_on trigger_in_falling_edge trigger_in_rising_edge" ++fi ++fi ++return 0 ++} ++__fformat() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="binary hdf5" ++fi ++fi ++return 0 ++} ++__filtercells() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__filterresistor() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__findex() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__firmwaretest() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 1 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__firmwareversion() { ++FCN_RETURN="" ++return 0 ++} ++__fliprows() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="0 1" ++fi ++fi ++return 0 ++} ++__flowcontrol10g() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="0 1" ++fi ++fi ++return 0 ++} ++__fmaster() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="0 1" ++fi ++fi ++return 0 ++} ++__fname() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__foverwrite() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="0 1" ++fi ++fi ++return 0 ++} ++__fpath() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++IS_PATH=1 ++fi ++fi ++return 0 ++} ++__framecounter() { ++FCN_RETURN="" ++return 0 ++} ++__frames() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__framesl() { ++FCN_RETURN="" ++return 0 ++} ++__frametime() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 1 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="ms ns s us" ++fi ++fi ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="ms ns s us" ++fi ++fi ++return 0 ++} ++__free() { ++FCN_RETURN="" ++return 0 ++} ++__fwrite() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="0 1" ++fi ++fi ++return 0 ++} ++__gaincaps() { ++FCN_RETURN="" ++return 0 ++} ++__gainmode() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="dynamic fixg0 fixg1 fixg2 forceswitchg1 forceswitchg2" ++fi ++fi ++return 0 ++} ++__gappixels() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="0 1" ++fi ++fi ++return 0 ++} ++__gatedelay() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 1 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="ms ns s us" ++fi ++fi ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++if [[ "${cword}" == "3" ]]; then ++FCN_RETURN="ms ns s us" ++fi ++fi ++return 0 ++} ++__gatedelay1() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 1 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="ms ns s us" ++fi ++fi ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++if [[ "${cword}" == "3" ]]; then ++FCN_RETURN="ms ns s us" ++fi ++fi ++return 0 ++} ++__gatedelay2() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 1 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="ms ns s us" ++fi ++fi ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++if [[ "${cword}" == "3" ]]; then ++FCN_RETURN="ms ns s us" ++fi ++fi ++return 0 ++} ++__gatedelay3() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 1 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="ms ns s us" ++fi ++fi ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++if [[ "${cword}" == "3" ]]; then ++FCN_RETURN="ms ns s us" ++fi ++fi ++return 0 ++} ++__gates() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__getbit() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 1 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++if [[ "${cword}" == "3" ]]; then ++FCN_RETURN="" ++fi ++fi ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++if [[ "${cword}" == "3" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__hardwareversion() { ++FCN_RETURN="" ++return 0 ++} ++__highvoltage() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__hostname() { ++FCN_RETURN="" ++return 0 ++} ++__im_a() { ++FCN_RETURN="" ++return 0 ++} ++__im_b() { ++FCN_RETURN="" ++return 0 ++} ++__im_c() { ++FCN_RETURN="" ++return 0 ++} ++__im_d() { ++FCN_RETURN="" ++return 0 ++} ++__im_io() { ++FCN_RETURN="" ++return 0 ++} ++__imagetest() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="0 1" ++fi ++fi ++return 0 ++} ++__initialchecks() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="0 1" ++fi ++fi ++return 0 ++} ++__inj_ch() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++if [[ "${cword}" == "3" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__interpolation() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="0 1" ++fi ++fi ++return 0 ++} ++__interruptsubframe() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="0 1" ++fi ++fi ++return 0 ++} ++__kernelversion() { ++FCN_RETURN="" ++return 0 ++} ++__lastclient() { ++FCN_RETURN="" ++return 0 ++} ++__led() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="0 1" ++fi ++fi ++return 0 ++} ++__lock() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="0 1" ++fi ++fi ++return 0 ++} ++__master() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="0 1" ++fi ++fi ++return 0 ++} ++__maxadcphaseshift() { ++FCN_RETURN="" ++return 0 ++} ++__maxclkphaseshift() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 1 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__maxdbitphaseshift() { ++FCN_RETURN="" ++return 0 ++} ++__measuredperiod() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 1 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="ms ns s us" ++fi ++fi ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="ms ns s us" ++fi ++fi ++return 0 ++} ++__measuredsubperiod() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 1 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="ms ns s us" ++fi ++fi ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="ms ns s us" ++fi ++fi ++return 0 ++} ++__moduleid() { ++FCN_RETURN="" ++return 0 ++} ++__nextframenumber() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__nmod() { ++FCN_RETURN="" ++return 0 ++} ++__numinterfaces() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__overflow() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="0 1" ++fi ++fi ++return 0 ++} ++__packageversion() { ++FCN_RETURN="" ++return 0 ++} ++__parallel() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="0 1" ++fi ++fi ++return 0 ++} ++__parameters() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 1 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="0 1" ++fi ++fi ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++IS_PATH=1 ++fi ++fi ++return 0 ++} ++__partialreset() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="0 1" ++fi ++fi ++return 0 ++} ++__patfname() { ++FCN_RETURN="" ++return 0 ++} ++__patioctrl() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__patlimits() { ++FCN_RETURN="" ++return 0 ++} ++__patloop() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 1 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++if [[ "${cword}" == "3" ]]; then ++FCN_RETURN="" ++fi ++if [[ "${cword}" == "4" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__patloop0() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 1 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++if [[ "${cword}" == "3" ]]; then ++FCN_RETURN="" ++fi ++if [[ "${cword}" == "4" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__patloop1() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 1 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++if [[ "${cword}" == "3" ]]; then ++FCN_RETURN="" ++fi ++if [[ "${cword}" == "4" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__patloop2() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 1 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++if [[ "${cword}" == "3" ]]; then ++FCN_RETURN="" ++fi ++if [[ "${cword}" == "4" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__patmask() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__patnloop() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 1 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++if [[ "${cword}" == "3" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__patnloop0() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 1 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++if [[ "${cword}" == "3" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__patnloop1() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 1 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++if [[ "${cword}" == "3" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__patnloop2() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 1 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++if [[ "${cword}" == "3" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__patsetbit() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__pattern() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 1 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++IS_PATH=1 ++fi ++fi ++return 0 ++} ++__patternstart() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 1 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++IS_PATH=1 ++fi ++fi ++return 0 ++} ++__patwait() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 1 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++if [[ "${cword}" == "3" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__patwait0() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 1 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++if [[ "${cword}" == "3" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__patwait1() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 1 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++if [[ "${cword}" == "3" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__patwait2() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 1 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++if [[ "${cword}" == "3" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__patwaittime() { ++FCN_RETURN="" ++return 0 ++} ++__patwaittime0() { ++FCN_RETURN="" ++return 0 ++} ++__patwaittime1() { ++FCN_RETURN="" ++return 0 ++} ++__patwaittime2() { ++FCN_RETURN="" ++return 0 ++} ++__patword() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 1 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++if [[ "${cword}" == "3" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__pedestalmode() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN=" 0" ++fi ++if [[ "${cword}" == "3" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__period() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 1 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="ms ns s us" ++fi ++fi ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++if [[ "${cword}" == "3" ]]; then ++FCN_RETURN="ms ns s us" ++fi ++fi ++return 0 ++} ++__periodl() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 1 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="ms ns s us" ++fi ++fi ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="ms ns s us" ++fi ++fi ++return 0 ++} ++__polarity() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="neg pos" ++fi ++fi ++return 0 ++} ++__port() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__powerchip() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="0 1" ++fi ++fi ++return 0 ++} ++__powerindex() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 1 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__powerlist() { ++FCN_RETURN="" ++return 0 ++} ++__powername() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 1 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="`sls_detector_get daclist | sed -e 's/.*\[\(.*\)\].*/\1/' | sed 's/,//g'`" ++fi ++fi ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="`sls_detector_get daclist | sed -e 's/.*\[\(.*\)\].*/\1/' | sed 's/,//g'`" ++fi ++if [[ "${cword}" == "3" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__powervalues() { ++FCN_RETURN="" ++return 0 ++} ++__programfpga() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++IS_PATH=1 ++fi ++if [[ "${cword}" == "3" ]]; then ++FCN_RETURN="--force-delete-normal-file" ++fi ++fi ++return 0 ++} ++__pulse() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 1 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++IS_PATH=1 ++fi ++if [[ "${cword}" == "3" ]]; then ++FCN_RETURN="--force-delete-normal-file" ++fi ++fi ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++if [[ "${cword}" == "3" ]]; then ++FCN_RETURN="" ++fi ++if [[ "${cword}" == "4" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__pulsechip() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 1 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++if [[ "${cword}" == "3" ]]; then ++FCN_RETURN="" ++fi ++if [[ "${cword}" == "4" ]]; then ++FCN_RETURN="" ++fi ++fi ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__pulsenmove() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 1 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++if [[ "${cword}" == "3" ]]; then ++FCN_RETURN="" ++fi ++if [[ "${cword}" == "4" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__pumpprobe() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="0 1" ++fi ++fi ++return 0 ++} ++__quad() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="0 1" ++fi ++fi ++return 0 ++} ++__ratecorr() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__readnrows() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__readout() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 1 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__readoutspeed() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="0 1 108 144 2 full_speed half_speed quarter_speed" ++fi ++fi ++return 0 ++} ++__readoutspeedlist() { ++FCN_RETURN="" ++return 0 ++} ++__rebootcontroller() { ++FCN_RETURN="" ++return 0 ++} ++__reg() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 1 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++if [[ "${cword}" == "3" ]]; then ++FCN_RETURN="" ++fi ++if [[ "${cword}" == "4" ]]; then ++FCN_RETURN="--validate" ++fi ++fi ++return 0 ++} ++__resetdacs() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 1 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++if [[ "${cword}" == "3" ]]; then ++FCN_RETURN="" ++fi ++if [[ "${cword}" == "4" ]]; then ++FCN_RETURN="--validate" ++fi ++fi ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="hard" ++fi ++fi ++return 0 ++} ++__resetfpga() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 1 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="hard" ++fi ++fi ++return 0 ++} ++__romode() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="analog analog_digital digital digital_transceiver transceiver" ++fi ++fi ++return 0 ++} ++__row() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__runclk() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__runtime() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 1 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="ms ns s us" ++fi ++fi ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="ms ns s us" ++fi ++fi ++return 0 ++} ++__rx_arping() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="0 1" ++fi ++fi ++return 0 ++} ++__rx_clearroi() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 1 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="0 1" ++fi ++fi ++return 0 ++} ++__rx_dbitlist() { ++FCN_RETURN="" ++return 0 ++} ++__rx_dbitoffset() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__rx_dbitreorder() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="0 1" ++fi ++fi ++return 0 ++} ++__rx_discardpolicy() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="discardempty discardpartial nodiscard" ++fi ++fi ++return 0 ++} ++__rx_fifodepth() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__rx_frameindex() { ++FCN_RETURN="" ++return 0 ++} ++__rx_framescaught() { ++FCN_RETURN="" ++return 0 ++} ++__rx_framesperfile() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__rx_hostname() { ++FCN_RETURN="" ++return 0 ++} ++__rx_jsonaddheader() { ++FCN_RETURN="" ++return 0 ++} ++__rx_jsonpara() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 1 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++if [[ "${cword}" == "3" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__rx_lastclient() { ++FCN_RETURN="" ++return 0 ++} ++__rx_lock() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="0 1" ++fi ++fi ++return 0 ++} ++__rx_missingpackets() { ++FCN_RETURN="" ++return 0 ++} ++__rx_padding() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="0 1" ++fi ++fi ++return 0 ++} ++__rx_printconfig() { ++FCN_RETURN="" ++return 0 ++} ++__rx_realudpsocksize() { ++FCN_RETURN="" ++return 0 ++} ++__rx_roi() { ++FCN_RETURN="" ++return 0 ++} ++__rx_silent() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="0 1" ++fi ++fi ++return 0 ++} ++__rx_start() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 1 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="0 1" ++fi ++fi ++return 0 ++} ++__rx_status() { ++FCN_RETURN="" ++return 0 ++} ++__rx_stop() { ++FCN_RETURN="" ++return 0 ++} ++__rx_tcpport() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__rx_threads() { ++FCN_RETURN="" ++return 0 ++} ++__rx_udpsocksize() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__rx_version() { ++FCN_RETURN="" ++return 0 ++} ++__rx_zmqfreq() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__rx_zmqhwm() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__rx_zmqip() { ++FCN_RETURN="" ++return 0 ++} ++__rx_zmqport() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__rx_zmqstartfnum() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__rx_zmqstream() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="0 1" ++fi ++fi ++return 0 ++} ++__samples() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__savepattern() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 1 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++IS_PATH=1 ++fi ++fi ++return 0 ++} ++__scan() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="`sls_detector_get daclist | sed -e 's/.*\[\(.*\)\].*/\1/' | sed 's/,//g'`" ++fi ++if [[ "${cword}" == "3" ]]; then ++FCN_RETURN="" ++fi ++if [[ "${cword}" == "4" ]]; then ++FCN_RETURN="" ++fi ++if [[ "${cword}" == "5" ]]; then ++FCN_RETURN="" ++fi ++if [[ "${cword}" == "6" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__scanerrmsg() { ++FCN_RETURN="" ++return 0 ++} ++__selinterface() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="0 1" ++fi ++fi ++return 0 ++} ++__serialnumber() { ++FCN_RETURN="" ++return 0 ++} ++__setbit() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++if [[ "${cword}" == "3" ]]; then ++FCN_RETURN="" ++fi ++if [[ "${cword}" == "4" ]]; then ++FCN_RETURN="--validate" ++fi ++fi ++return 0 ++} ++__settings() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="`sls_detector_get settingslist | sed -e 's/.*\[\(.*\)\].*/\1/' | sed 's/,//g'`" ++fi ++fi ++return 0 ++} ++__settingslist() { ++FCN_RETURN="" ++return 0 ++} ++__settingspath() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++IS_PATH=1 ++fi ++fi ++return 0 ++} ++__signalindex() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 1 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__signallist() { ++FCN_RETURN="" ++return 0 ++} ++__signalname() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 1 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++if [[ "${cword}" == "3" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__sleep() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 1 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++if [[ "${cword}" == "3" ]]; then ++FCN_RETURN="" ++fi ++fi ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++if [[ "${cword}" == "3" ]]; then ++FCN_RETURN="ms ns s us" ++fi ++fi ++return 0 ++} ++__slowadc() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 1 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__slowadcindex() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 1 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__slowadclist() { ++FCN_RETURN="" ++return 0 ++} ++__slowadcname() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 1 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="`sls_detector_get daclist | sed -e 's/.*\[\(.*\)\].*/\1/' | sed 's/,//g'`" ++fi ++fi ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="`sls_detector_get daclist | sed -e 's/.*\[\(.*\)\].*/\1/' | sed 's/,//g'`" ++fi ++if [[ "${cword}" == "3" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__slowadcvalues() { ++FCN_RETURN="" ++return 0 ++} ++__start() { ++FCN_RETURN="" ++return 0 ++} ++__status() { ++FCN_RETURN="" ++return 0 ++} ++__stop() { ++FCN_RETURN="" ++return 0 ++} ++__stopport() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__storagecell_delay() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 1 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="ms ns s us" ++fi ++fi ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++if [[ "${cword}" == "3" ]]; then ++FCN_RETURN="ms ns s us" ++fi ++fi ++return 0 ++} ++__storagecell_start() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__subdeadtime() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 1 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="ms ns s us" ++fi ++fi ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++if [[ "${cword}" == "3" ]]; then ++FCN_RETURN="ms ns s us" ++fi ++fi ++return 0 ++} ++__subexptime() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 1 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="ms ns s us" ++fi ++fi ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++if [[ "${cword}" == "3" ]]; then ++FCN_RETURN="ms ns s us" ++fi ++fi ++return 0 ++} ++__sync() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="0 1" ++fi ++fi ++return 0 ++} ++__syncclk() { ++FCN_RETURN="" ++return 0 ++} ++__temp_10ge() { ++FCN_RETURN="" ++return 0 ++} ++__temp_adc() { ++FCN_RETURN="" ++return 0 ++} ++__temp_control() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="0 1" ++fi ++fi ++return 0 ++} ++__temp_dcdc() { ++FCN_RETURN="" ++return 0 ++} ++__temp_event() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__temp_fpga() { ++FCN_RETURN="" ++return 0 ++} ++__temp_fpgaext() { ++FCN_RETURN="" ++return 0 ++} ++__temp_fpgafl() { ++FCN_RETURN="" ++return 0 ++} ++__temp_fpgafr() { ++FCN_RETURN="" ++return 0 ++} ++__temp_slowadc() { ++FCN_RETURN="" ++return 0 ++} ++__temp_sodl() { ++FCN_RETURN="" ++return 0 ++} ++__temp_sodr() { ++FCN_RETURN="" ++return 0 ++} ++__temp_threshold() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__templist() { ++FCN_RETURN="" ++return 0 ++} ++__tempvalues() { ++FCN_RETURN="" ++return 0 ++} ++__tengiga() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="0 1" ++fi ++fi ++return 0 ++} ++__threshold() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++if [[ "${cword}" == "3" ]]; then ++FCN_RETURN="`sls_detector_get settingslist | sed -e 's/.*\[\(.*\)\].*/\1/' | sed 's/,//g'`" ++fi ++if [[ "${cword}" == "4" ]]; then ++FCN_RETURN="" ++fi ++if [[ "${cword}" == "5" ]]; then ++FCN_RETURN="`sls_detector_get settingslist | sed -e 's/.*\[\(.*\)\].*/\1/' | sed 's/,//g'`" ++fi ++fi ++return 0 ++} ++__thresholdnotb() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++if [[ "${cword}" == "3" ]]; then ++FCN_RETURN="`sls_detector_get settingslist | sed -e 's/.*\[\(.*\)\].*/\1/' | sed 's/,//g'`" ++fi ++if [[ "${cword}" == "4" ]]; then ++FCN_RETURN="" ++fi ++if [[ "${cword}" == "5" ]]; then ++FCN_RETURN="`sls_detector_get settingslist | sed -e 's/.*\[\(.*\)\].*/\1/' | sed 's/,//g'`" ++fi ++fi ++return 0 ++} ++__timing() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="`sls_detector_get timinglist | sed -e 's/.*\[\(.*\)\].*/\1/' | sed 's/,//g'`" ++fi ++fi ++return 0 ++} ++__timing_info_decoder() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="shine swissfel" ++fi ++fi ++return 0 ++} ++__timinglist() { ++FCN_RETURN="" ++return 0 ++} ++__timingsource() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="external internal" ++fi ++fi ++return 0 ++} ++__top() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="0 1" ++fi ++fi ++return 0 ++} ++__transceiverenable() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__trigger() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 1 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__triggers() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__triggersl() { ++FCN_RETURN="" ++return 0 ++} ++__trimbits() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 1 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++IS_PATH=1 ++fi ++fi ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++IS_PATH=1 ++fi ++fi ++return 0 ++} ++__trimen() { ++FCN_RETURN="" ++return 0 ++} ++__trimval() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__tsamples() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__txdelay() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__txdelay_frame() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__txdelay_left() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__txdelay_right() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__type() { ++FCN_RETURN="" ++return 0 ++} ++__udp_cleardst() { ++FCN_RETURN="" ++return 0 ++} ++__udp_dstip() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__udp_dstip2() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__udp_dstlist() { ++FCN_RETURN="" ++return 0 ++} ++__udp_dstmac() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__udp_dstmac2() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__udp_dstport() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__udp_dstport2() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__udp_firstdst() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__udp_numdst() { ++FCN_RETURN="" ++return 0 ++} ++__udp_reconfigure() { ++FCN_RETURN="" ++return 0 ++} ++__udp_srcip() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__udp_srcip2() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__udp_srcmac() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__udp_srcmac2() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__udp_validate() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 1 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__update() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++IS_PATH=1 ++fi ++if [[ "${cword}" == "3" ]]; then ++FCN_RETURN="" ++IS_PATH=1 ++fi ++fi ++return 0 ++} ++__updatedetectorserver() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 1 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++IS_PATH=1 ++fi ++if [[ "${cword}" == "3" ]]; then ++FCN_RETURN="" ++IS_PATH=1 ++fi ++fi ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++IS_PATH=1 ++fi ++fi ++return 0 ++} ++__updatekernel() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 1 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++IS_PATH=1 ++fi ++fi ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++IS_PATH=1 ++fi ++fi ++return 0 ++} ++__updatemode() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__user() { ++FCN_RETURN="" ++return 0 ++} ++__v_a() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__v_b() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__v_c() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__v_chip() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__v_d() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__v_io() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__v_limit() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__vchip_comp_adc() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 1 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++if [[ "${cword}" == "3" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__vchip_comp_fe() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 1 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++if [[ "${cword}" == "3" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__vchip_cs() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 1 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++if [[ "${cword}" == "3" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__vchip_opa_1st() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 1 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++if [[ "${cword}" == "3" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__vchip_opa_fd() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 1 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++if [[ "${cword}" == "3" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__vchip_ref_comp_fe() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 1 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++if [[ "${cword}" == "3" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__versions() { ++FCN_RETURN="" ++return 0 ++} ++__veto() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="0 1" ++fi ++fi ++return 0 ++} ++__vetoalg() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 1 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="10gbe lll none" ++fi ++fi ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="hits raw" ++fi ++if [[ "${cword}" == "3" ]]; then ++FCN_RETURN="10gbe lll none" ++fi ++fi ++return 0 ++} ++__vetofile() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++if [[ "${cword}" == "3" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__vetophoton() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 1 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++if [[ "${cword}" == "3" ]]; then ++FCN_RETURN="" ++fi ++fi ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++if [[ "${cword}" == "3" ]]; then ++FCN_RETURN="" ++fi ++if [[ "${cword}" == "4" ]]; then ++FCN_RETURN="" ++fi ++if [[ "${cword}" == "5" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__vetoref() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++if [[ "${cword}" == "3" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__vetostream() { ++FCN_RETURN="" ++return 0 ++} ++__virtual() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++if [[ "${cword}" == "3" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__vm_a() { ++FCN_RETURN="" ++return 0 ++} ++__vm_b() { ++FCN_RETURN="" ++return 0 ++} ++__vm_c() { ++FCN_RETURN="" ++return 0 ++} ++__vm_d() { ++FCN_RETURN="" ++return 0 ++} ++__vm_io() { ++FCN_RETURN="" ++return 0 ++} ++__zmqhwm() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__zmqip() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__zmqport() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++ ++ ++ COMPREPLY=() ++ local OPTIONS_NEW="" ++ ++ # check if bash or zsh ++ # _get_comp_words_by_ref is a bash built-in function, we check if it exists ++ declare -Ff _get_comp_words_by_ref > /dev/null && IS_BASH=1 || IS_BASH=0 ++ ++ ++ # bash interprets the colon character : as a special character and splits the argument in two ++ # different than what zsh does ++ # https://stackoverflow.com/a/3224910 ++ # https://stackoverflow.com/a/12495727 ++ local cur ++ local cword words=() ++ _comp__reassemble_words ":" words cword ++ cur=${words[cword]} ++ ++ # check the action (get or put) ++ case "${words[0]}" in ++ "sls_detector_get" | "g" | "detg") ++ local IS_GET=1 ++ ;; ++ *) ++ local IS_GET=0 ++ ;; ++ esac ++ ++ # if no command is written, autocomplete with the commands ++ if [[ ${cword} -eq 1 ]]; then ++# local SLS_COMMANDS="trimbits exptime" ++ local SLS_COMMANDS_NEW="" ++ ++ case "$cur" in ++ [0-9]*:*) ++ local suggestions=($(compgen -W "${SLS_COMMANDS}" -- "${cur#*:}")) ++ COMPREPLY=( ${suggestions[*]} ) ++ ;; ++ [0-9]*) ++ COMPREPLY=() ++ ;; ++ *) ++ COMPREPLY=( $( compgen -W "$SLS_COMMANDS -h" -- "$cur" ) );; ++ ++ esac ++ return 0 ++ fi ++ ++ if [[ ${cword} -eq 2 ]] && [[ ${words[1]} == "-h" ]]; then ++ COMPREPLY=( $( compgen -W "$SLS_COMMANDS" -- "$cur" ) ) ++ return 0 ++ fi ++ ++ # if a command is written, autocomplete with the options ++ # call the function for the command ++ ++ if [[ "$SLS_COMMANDS" == *"${words[1]##*:}"* ]]; then ++ __"${words[1]##*:}" ++ fi ++ ++ # if IS_PATH is activated, autocomplete with the path ++ if [[ ${IS_PATH} -eq 1 ]]; then ++ COMPREPLY=($(compgen -f -- "${cur}")) ++ return 0 ++ fi ++ ++ # autocomplete with the options ++ COMPREPLY=($(compgen -W "${FCN_RETURN}" -- "${cur}")) ++ ++ ++ ++} ++ ++complete -F _sd -o filenames sls_detector_get ++complete -F _sd -o filenames g ++complete -F _sd -o filenames detg ++ ++complete -F _sd -o filenames sls_detector_put ++complete -F _sd -o filenames p ++complete -F _sd -o filenames detp ++ ++complete -F _sd -o filenames sls_detector ++complete -F _sd -o filenames det +diff --git a/slsDetectorCalibration/jungfrauExecutables/Makefile b/slsDetectorCalibration/jungfrauExecutables/Makefile +deleted file mode 120000 +index bde0d5288..000000000 +--- a/slsDetectorCalibration/jungfrauExecutables/Makefile ++++ /dev/null +@@ -1 +0,0 @@ +-Makefile.zmqrootdisp +\ No newline at end of file +diff --git a/slsDetectorCalibration/jungfrauExecutables/Makefile b/slsDetectorCalibration/jungfrauExecutables/Makefile +new file mode 100644 +index 000000000..1ec21eac7 +--- /dev/null ++++ b/slsDetectorCalibration/jungfrauExecutables/Makefile +@@ -0,0 +1,22 @@ ++ROOTSYS=/opt/cern/v6/build ++ ++LIBZMQDIR = $(PWD) ++LIBZMQ = -L$(LIBZMQDIR) -lzmq ++SHLIB_PATH=/opt/cern/v6/root/lib ++CMAKE_PREFIX_PATH=/opt/cern/v6/root ++DYLD_LIBRARY_PATH=/opt/cern/v6/root/lib ++ ++QT_CXXFLAGS = $(shell pkg-config --cflags Qt5Core Qt5Gui Qt5Widgets 2>/dev/null) ++QT_LIBS = $(shell pkg-config --libs Qt5Core Qt5Gui Qt5Widgets 2>/dev/null) ++ ++INCDIR= -I. -I../dataStructures ../tiffio/src/tiffIO.cpp -I../ -I../interpolations/ -I../../slsSupportLib/include/ -I../../slsReceiverSoftware/include/ -I../../libs/rapidjson/ -I../tiffio/include ++LDFLAG= -L/usr/lib64/ -lpthread -lm -lstdc++ -lzmq -pthread -lrt -ltiff -O3 -std=c++17 -Wall -Wl,-rpath-link,$(ROOTSYS)/lib ++ ++ ++default: onlinedisp_zmq ++ ++onlinedisp_zmq: onlinedisp_zmq.cpp onlinedisp_zmq.h ../dataStructures/jungfrauLGADStrixelsData_new.h ++ g++ -o onlinedisp_zmq onlinedisp_zmq.cpp $(QT_CXXFLAGS) $(QT_LIBS) -I. -I$(ROOTSYS)/include -Wall -g -lm -L. -lzmq -pthread -lrt -L$(ROOTSYS)/lib -lGui -lCore -lRIO -lNet -lHist -lGraf -lGraf3d -lGpad -lTree -lRint -lPostscript -lMatrix -lPhysics -lMathCore -lThread -m64 -L../../build/bin/ -lSlsSupportStatic ../../build/_deps/libzmq-build/lib/libzmq.a -lstdc++ -lsodium $(LDFLAG) $(INCDIR) ++ ++#-lCint ++ +diff --git a/slsDetectorCalibration/jungfrauExecutables/onlinedisp_zmq.cpp b/slsDetectorCalibration/jungfrauExecutables/onlinedisp_zmq.cpp +index 4ddacd260..e1d3c7556 100644 +--- a/slsDetectorCalibration/jungfrauExecutables/onlinedisp_zmq.cpp ++++ b/slsDetectorCalibration/jungfrauExecutables/onlinedisp_zmq.cpp +@@ -7,6 +7,121 @@ sls::zmqHeader zHeader; + #define NPRO 50 + #define NPRI 50 + ++// ── ROOT thread safety ─────────────────────────────────────────────────────── ++// The main thread FILLS the source accumulator histograms on every processed ++// frame. The ROOT redraw thread must never paint those (ROOT is not ++// thread-safe for concurrent Fill vs Paint - crashes in TH1::SetContour). ++// Instead the ROOT thread paints DISPLAY CLONES whose bin content is copied ++// from the sources once per redraw tick (copying while a fill runs only ++// yields a transiently torn pixel, never a crash). ++std::atomic gFramesForRoot{0}; ++std::atomic gResetPending{false}; ++ ++// display clones painted by the ROOT thread (single-owner objects) ++TH2F *disp3000 = nullptr; ++TH2F *disp4500 = nullptr; ++TH2F *dispLvsR = nullptr; ++TH1I *dispChip[8] = {nullptr, nullptr, nullptr, nullptr, ++ nullptr, nullptr, nullptr, nullptr}; ++#ifdef JFSTRX ++TH2F *disp1000 = nullptr; TH2F *disp1001 = nullptr; TH2F *disp1002 = nullptr; ++TH2F *disp1060 = nullptr; TH2F *disp1061 = nullptr; TH2F *disp1062 = nullptr; ++#endif ++ ++// copies bin contents + entry count from a source accumulator to its ++// display clone (same geometry). ROOT-thread only. ++static void copyBins(TH1 *dst, TH1 *src) { ++ if (!dst || !src) return; ++ const int bx = dst->GetNbinsX(); ++ const int by = dst->GetNbinsY(); ++ dst->Reset(); ++ if (by <= 1) { ++ for (int b = 1; b <= bx; b++) ++ dst->SetBinContent(b, src->GetBinContent(b)); ++ } else { ++ for (int y = 1; y <= by; y++) ++ for (int x = 1; x <= bx; x++) ++ dst->SetBinContent(x, y, src->GetBinContent(x, y)); ++ } ++ dst->SetEntries(src->GetEntries()); ++} ++ ++// ── ROOT GUI ownership ─────────────────────────────────────────────────────── ++// ROOT canvas painting + gSystem->ProcessEvents() may ONLY run in the ++// dedicated ROOT thread (thread that drew them crashes otherwise, e.g. in ++// TGaxis/TPaletteAxis). The main thread never touches ROOT graphics; user ++// actions (reset, axes, palette, surf/colz, zoom...) are queued here and ++// executed by the ROOT thread. ++enum class RootCmdType { ++ None, ResetHis, ResetAxes, Surf, Colz, ++ PaletteFalse, PaletteBW1, PaletteBW2, Zoom, SetChipRange ++}; ++struct RootCmd { ++ RootCmdType type = RootCmdType::None; ++ double a = 0, b = 0, c = 0, d = 0; // zoom coords / chip range ++}; ++std::mutex gCmdMtx; ++std::vector gCmds; ++ ++static void pushRootCmd(RootCmd cmd) { ++ std::lock_guard lock(gCmdMtx); ++ gCmds.push_back(cmd); ++} ++ ++// Executes one queued ROOT command. Only ever called from the ROOT thread. ++static void execRootCmd(const RootCmd &cmd) { ++ switch (cmd.type) { ++ case RootCmdType::ResetHis: ++ historeset(); ++ break; ++ case RootCmdType::ResetAxes: ++ axisreset(); ++ break; ++ case RootCmdType::Surf: ++ his1000->SetOption("surf2z"); ++#ifdef JFSTRX ++ disp1000->SetOption("surf2z"); ++#endif ++ Plot2DHistos(); ++ break; ++ case RootCmdType::Colz: ++ his1000->SetOption("colz"); ++#ifdef JFSTRX ++ disp1000->SetOption("colz"); ++#endif ++ if (bw_flag) { bw_flag = false; LoadPaletteFalse(); } ++ Plot2DHistos(); ++ break; ++ case RootCmdType::PaletteFalse: ++ LoadPaletteFalse(); ++ break; ++ case RootCmdType::PaletteBW1: ++ LoadPaletteBW(1.1111f); bw_flag = true; ++ break; ++ case RootCmdType::PaletteBW2: ++ LoadPaletteBW(0.9f); bw_flag = true; ++ break; ++ case RootCmdType::Zoom: ++ if (disp3000) { ++ disp3000->GetXaxis()->SetRangeUser(cmd.a, cmd.c); ++ disp3000->GetYaxis()->SetRangeUser(cmd.b, cmd.d); ++ A5->cd(); disp3000->Draw("colz"); ++ box = new TBox(ROIxmin, ROIymin, ROIxmax, ROIymax); ++ box->SetLineColor(kRed); box->SetFillStyle(0); ++ box->SetLineWidth(2); box->Draw(); ++ A5->Update(); ++ } ++ break; ++ case RootCmdType::SetChipRange: ++ for (int ih = 0; ih < 8; ih++) ++ dispChip[ih]->GetXaxis()->SetRangeUser(cmd.a, cmd.b); ++ Plot1DHistos(); ++ break; ++ default: ++ break; ++ } ++} ++ + //#define JFSTRX + #ifdef JFSTRX + #include "jungfrauLGADStrixelsData_new.h" +@@ -352,7 +467,7 @@ MainWindow::MainWindow(int argc, char* argv[]) + his2000->GetZaxis()->SetRangeUser(0, 4); + + if (dophotonmap) +- his3000 = new TH2F("his3000","photon map", 1024, -0.5, 1024-0.5, 512, -0.5, 512-0.5); ++ his3000 = new TH2F("his3000","photon map (cumulative)", 1024, -0.5, 1024-0.5, 512, -0.5, 512-0.5); + else + his3000 = new TH2F("his3000","raw adc", 1024, -0.5, 1024-0.5, 512, -0.5, 512-0.5); + +@@ -390,6 +505,25 @@ MainWindow::MainWindow(int argc, char* argv[]) + if (A5 == NULL) A5 = new TCanvas("A5","Plotting Canvas Photon Map", 750, 300, 1000, 600); + if (A6 == NULL) A6 = new TCanvas("A6","Plotting Canvas LvsR", 650, 250, 650, 660); + ++ // display clones painted by the ROOT thread (source histograms stay ++ // exclusive to the filling main thread) ++ disp3000 = (TH2F *)his3000->Clone("disp3000"); ++ disp4500 = (TH2F *)his4500->Clone("disp4500"); ++ dispLvsR = (TH2F *)hisLvsR->Clone("dispLvsR"); ++ for (int ih = 0; ih < 8; ih++) { ++ char nm[64]; ++ sprintf(nm, "dispChip%d", ih); ++ dispChip[ih] = (TH1I *)hchip[ih]->Clone(nm); ++ } ++#ifdef JFSTRX ++ disp1000 = (TH2F *)his1000->Clone("disp1000"); ++ disp1001 = (TH2F *)his1001->Clone("disp1001"); ++ disp1002 = (TH2F *)his1002->Clone("disp1002"); ++ disp1060 = (TH2F *)his1060->Clone("disp1060"); ++ disp1061 = (TH2F *)his1061->Clone("disp1061"); ++ disp1062 = (TH2F *)his1062->Clone("disp1062"); ++#endif ++ + printhelp(); + } + +@@ -407,7 +541,8 @@ void MainWindow::setupUI() { + auto *statusLayout = new QVBoxLayout(statusGroup); + frameLabel = new QLabel("Frame: --", statusGroup); + statusLabel = new QLabel("Status: idle", statusGroup); +- drawLabel = new QLabel("Draw every: 20 frames", statusGroup); ++ drawLabel = new QLabel(statusGroup); ++ drawLabel->setText(QString("Main: every %1 frames | ROOT: every %2 ms").arg(HDraw_every).arg(rootUpdateMs)); + statusLayout->addWidget(frameLabel); + statusLayout->addWidget(statusLabel); + statusLayout->addWidget(drawLabel); +@@ -488,12 +623,14 @@ void MainWindow::setupUI() { + HDraw_every = int(HDraw_every * 0.8f); + if (HDraw_every < 1) HDraw_every = 1; + cout << endl << "Drawing every " << HDraw_every << " frames" << endl; +- drawLabel->setText(QString("Draw every: %1 frames").arg(HDraw_every)); ++ updateDrawLabel(); + }); + connect(btnSlower, &QPushButton::clicked, [this]() { +- HDraw_every = int(HDraw_every * 1.25f); ++ int newevery = int(HDraw_every * 1.25f); ++ if (newevery <= HDraw_every) newevery = HDraw_every + 1; // avoid 1->1 ++ HDraw_every = newevery; + cout << endl << "Drawing every " << HDraw_every << " frames" << endl; +- drawLabel->setText(QString("Draw every: %1 frames").arg(HDraw_every)); ++ updateDrawLabel(); + }); + connect(btnGainToggle, &QPushButton::clicked, [this]() { + gain_flag = !gain_flag; +@@ -501,11 +638,11 @@ void MainWindow::setupUI() { + else { cout << "gain corr disab." << endl; statusLabel->setText("Gain: off"); } + }); + connect(btnBWPalette, &QPushButton::clicked, [this]() { +- LoadPaletteBW(1.1111f); bw_flag = true; ++ RootCmd c; c.type = RootCmdType::PaletteBW1; pushRootCmd(c); + statusLabel->setText("Status: BW palette"); + }); + connect(btnBWPalette2, &QPushButton::clicked, [this]() { +- LoadPaletteBW(0.9f); bw_flag = true; ++ RootCmd c; c.type = RootCmdType::PaletteBW2; pushRootCmd(c); + statusLabel->setText("Status: BW palette 2"); + }); + connect(btnSetRanges, &QPushButton::clicked, [this]() { showRangeDialog(); }); +@@ -528,17 +665,18 @@ void MainWindow::setupUI() { + loadallpede(); + statusLabel->setText("Status: all pede loaded"); + }); +- connect(btnResetHis, &QPushButton::clicked, [this]() { historeset(); }); +- connect(btnResetAxis, &QPushButton::clicked, [this]() { axisreset(); }); ++ connect(btnResetHis, &QPushButton::clicked, [this]() { ++ RootCmd c; c.type = RootCmdType::ResetHis; pushRootCmd(c); ++ }); ++ connect(btnResetAxis, &QPushButton::clicked, [this]() { ++ RootCmd c; c.type = RootCmdType::ResetAxes; pushRootCmd(c); ++ }); + connect(btnSurf2Z, &QPushButton::clicked, [this]() { +- his1000->SetOption("surf2z"); +- Plot2DHistos(); ++ RootCmd c; c.type = RootCmdType::Surf; pushRootCmd(c); + statusLabel->setText("Display: surf2z"); + }); + connect(btnColZ, &QPushButton::clicked, [this]() { +- his1000->SetOption("colz"); +- if (bw_flag) { bw_flag = false; LoadPaletteFalse(); } +- Plot2DHistos(); ++ RootCmd c; c.type = RootCmdType::Colz; pushRootCmd(c); + statusLabel->setText("Display: colz"); + }); + connect(btnG1OffsetDown, &QPushButton::clicked, [this]() { +@@ -585,16 +723,11 @@ void MainWindow::setupUI() { + // Master-slave zoom: ADC master → gain slave + ROOT canvases + m_adcView->onZoomChanged = [this](double x1, double y1, double x2, double y2) { + m_gainView->setViewport(x1, y1, x2, y2); +- if (his3000) { +- his3000->GetXaxis()->SetRangeUser(x1, x2); +- his3000->GetYaxis()->SetRangeUser(y1, y2); +- A5->cd(); his3000->Draw("colz"); +- box = new TBox(ROIxmin, ROIymin, ROIxmax, ROIymax); +- box->SetLineColor(kRed); box->SetFillStyle(0); +- box->SetLineWidth(2); box->Draw(); +- A5->Update(); +- } +- gSystem->ProcessEvents(); ++ // ROOT canvas update is executed by the ROOT thread (command queue) ++ RootCmd c; ++ c.type = RootCmdType::Zoom; ++ c.a = x1; c.b = y1; c.c = x2; c.d = y2; ++ pushRootCmd(c); + }; + } + +@@ -614,6 +747,11 @@ void MainWindow::start() { + connect(statusTimer, &QTimer::timeout, this, &MainWindow::updateStatusBar); + statusTimer->start(1000); + ++ // ROOT redraw thread: plots on a configurable period (rootUpdateMs), ++ // only when at least one frame was processed in that period. ++ rootThreadRun.store(true); ++ rootDrawThread = new std::thread(&MainWindow::rootDrawLoop, this); ++ + statusLabel->setText("Status: running"); + } + +@@ -624,10 +762,74 @@ void MainWindow::stop() { + delete workerThread; + workerThread = nullptr; + } ++ rootThreadRun.store(false); ++ if (rootDrawThread && rootDrawThread->joinable()) { ++ rootDrawThread->join(); ++ delete rootDrawThread; ++ rootDrawThread = nullptr; ++ } + if (processTimer) { processTimer->stop(); delete processTimer; processTimer = nullptr; } + if (statusTimer) { statusTimer->stop(); delete statusTimer; statusTimer = nullptr; } + } + ++void MainWindow::rootDrawLoop() { ++ auto next = std::chrono::steady_clock::now(); ++ while (rootThreadRun.load()) { ++ // service loop every ~20 ms: commands + ROOT GUI events, with ++ // periodic plotting on the rootUpdateMs cadence ++ while (rootThreadRun.load() && ++ std::chrono::steady_clock::now() < next) ++ std::this_thread::sleep_for(std::chrono::milliseconds(20)); ++ if (!rootThreadRun.load()) ++ break; ++ ++ // 1) execute any user ROOT commands (from the Qt thread) ++ for (;;) { ++ RootCmd cmd; ++ { ++ std::lock_guard lock(gCmdMtx); ++ if (gCmds.empty()) break; ++ cmd = gCmds.front(); ++ gCmds.erase(gCmds.begin()); ++ } ++ execRootCmd(cmd); ++ } ++ ++ // 2) ROOT GUI event processing lives HERE (single owner thread), ++ // keeping ROOT canvases interactive (zoom etc.) ++ gSystem->ProcessEvents(); ++ ++ // 3) periodic plot ++ auto period = std::chrono::milliseconds(rootUpdateMs); ++ if (period.count() < 50) ++ period = std::chrono::milliseconds(50); ++ next = std::chrono::steady_clock::now() + period; ++ ++ if (gFramesForRoot.exchange(0) == 0) ++ continue; ++ ++ // snapshot the source accumulators into the display clones that the ++ // canvases actually paint (never paint the objects being filled) ++ copyBins(disp3000, his3000); ++ copyBins(disp4500, his4500); ++ copyBins(dispLvsR, hisLvsR); ++ for (int ih = 0; ih < 8; ih++) ++ copyBins(dispChip[ih], hchip[ih]); ++#ifdef JFSTRX ++ copyBins(disp1000, his1000); copyBins(disp1001, his1001); ++ copyBins(disp1002, his1002); copyBins(disp1060, his1060); ++ copyBins(disp1061, his1061); copyBins(disp1062, his1062); ++#endif ++ ++ Plot2DHistos(); ++ Plot1DHistos(); ++ // keep the TvsB/LvsR scatter windows fresh: reset them on the main ++ // thread before the first fill of the next period (the photon map ++ // stays cumulative) ++ gResetPending.store(true); ++ } ++} ++ + void MainWindow::processData() { + if (!threadData.data_ready.load()) return; + +@@ -635,181 +837,172 @@ void MainWindow::processData() { + memcpy(image_data, threadData.image_data_work, NCH*2*sizeof(short)); + threadData.data_ready.store(false); + +- if (goout == 0) { +- gSystem->ProcessEvents(); // keep ROOT canvases interactive while paused +- return; +- } ++ if (goout == 0) ++ return; // ROOT canvases stay interactive via the ROOT thread + +- // Process frame (same logic as original main loop) ++ ++ // Process frame + memcpy(&croi, &zHeader.detSpec1, 8); + ROIxmin = croi.xmin; ROIxmax = croi.xmax; + ROIymin = croi.ymin; ROIymax = croi.ymax; + framesinstream++; +- + show2Ds = ((framesinstream % HDraw_every) == (HDraw_every - 1)); +- fill1Ds = fillPerFrame || show2Ds; +- static int mainDrawCount = 0; +- bool doRootDraw = false; +- if (show2Ds) { +- mainDrawCount++; +- doRootDraw = ((mainDrawCount % rootDrawDivider) == 0); ++ ++ processedf++; ++ gFramesForRoot.fetch_add(1); ++ ++ // ----------------------------------------------------------------- ++ // ROOT histogram FILLING happens on EVERY processed frame. ++ // Only the PLOTTING is periodic (dedicated thread, rootUpdateMs). ++ // Histograms are accumulated without locking; the rare transient ++ // read-during-fill overlap with the ROOT plot thread is acceptable ++ // for a realtime display (no GUI blocking ever). ++ // ----------------------------------------------------------------- ++ ++ // open a fresh accumulation window after each ROOT redraw ++ // Per-second ROOT redraw: keep the scatter correlations (TvsB/LvsR) ++ // windowed to the last second, but the PHOTON MAP (and hchptr, JFSTRX ++ // images) is CUMULATIVE: it accumulates until "Reset His" is pressed. ++ if (gResetPending.exchange(false)) { ++ his4500->Reset(); ++ hisLvsR->Reset(); + } +- bool doFill = fillPerFrame || show2Ds || dophotonmap; + +- if (doRootDraw) { +-#ifdef JFSTRX +- his1000->Reset(); his1001->Reset(); his1002->Reset(); +- his1060->Reset(); his1061->Reset(); his1062->Reset(); +-#endif +- if (!dophotonmap) his3000->Reset(); ++ // 1) per-frame ADC/gain image buffers (fed to fast widgets, TvsB/LvsR) ++ for (i = 0; i < NCH; i++) { ++ adcvalue = image_data[i] & 0x3fff; ++ gain = (image_data[i] & 0xc000) ? ((image_data[i] >> 14) & 0x3) : 0; ++ float disp = float(adcvalue) - fpeded[i]; ++ if ((i % 256 == 0) || (i % 256 == 255)) disp = int(disp / factor); ++ if ((i / 1024 == 255) || (i / 1024 == 256) || (i / 1024 == 767) || (i / 1024 == 768)) ++ disp = int(disp / factor); ++ adc_image[i] = disp; ++ gain_image[i] = gain; + } + +- if (doFill) { +- processedf++; +- for (i = 0; i < NCH; i++) { +- adcvalue = image_data[i] & 0x3fff; +- gain = (image_data[i] & 0xc000) ? ((image_data[i] >> 14) & 0x3) : 0; +- +- if (pede_flag) { +- if (gain_flag) { +- if (gain == 0 || !hasallpede) +- adcpedecorr = (adcvalue & 0x3fff) * fgaind[i] - fpeded[i] * fgaind[i]; +- if (gain == 1 && hasallpede) +- adcpedecorr = (fpedeG1d[i] * fgaind[i] + G1Poffset - adcvalue * fgaind[i]) * 30.0; +- if (gain == 3 && hasallpede) +- adcpedecorr = (fpedeG2d[i] * fgaind[i] + G2Poffset - adcvalue * fgaind[i]) * 340.0; +- } else { +- if (gain == 0 || !hasallpede) +- adcpedecorr = (adcvalue & 0x3fff) - fpeded[i]; +- if (gain == 1 && hasallpede) +- adcpedecorr = (fpedeG1d[i] + G1Poffset - adcvalue) * 30.0; +- if (gain == 3 && hasallpede) +- adcpedecorr = (fpedeG2d[i] + G2Poffset - adcvalue) * 340.0; +- } ++ // 2) photon counting + PH (hchip) fills + photon map, every frame ++ for (i = 0; i < NCH; i++) { ++ adcvalue = image_data[i] & 0x3fff; ++ gain = (image_data[i] & 0xc000) ? ((image_data[i] >> 14) & 0x3) : 0; ++ ++ if (pede_flag) { ++ if (gain_flag) { ++ if (gain == 0 || !hasallpede) ++ adcpedecorr = (adcvalue & 0x3fff) * fgaind[i] - fpeded[i] * fgaind[i]; ++ if (gain == 1 && hasallpede) ++ adcpedecorr = (fpedeG1d[i] * fgaind[i] + G1Poffset - adcvalue * fgaind[i]) * 30.0; ++ if (gain == 3 && hasallpede) ++ adcpedecorr = (fpedeG2d[i] * fgaind[i] + G2Poffset - adcvalue * fgaind[i]) * 340.0; + } else { +- adcpedecorr = float(adcvalue); ++ if (gain == 0 || !hasallpede) ++ adcpedecorr = (adcvalue & 0x3fff) - fpeded[i]; ++ if (gain == 1 && hasallpede) ++ adcpedecorr = (fpedeG1d[i] + G1Poffset - adcvalue) * 30.0; ++ if (gain == 3 && hasallpede) ++ adcpedecorr = (fpedeG2d[i] + G2Poffset - adcvalue) * 340.0; + } ++ } else { ++ adcpedecorr = float(adcvalue); ++ } + +- if (adcpedecorr > threshold && pede_flag) +- hchptr[i] = hchptr[i] + (int)((adcpedecorr + threshold) / phene); ++ if (adcpedecorr > threshold && pede_flag) { ++ int inc = (int)((adcpedecorr + threshold) / phene); ++ hchptr[i] = hchptr[i] + inc; ++ if (dophotonmap) ++ his3000->Fill(float(i % 1024), float(i / 1024), inc); ++ } + +- if (fill1Ds) { +- if ((i % 1024) < 1004 && (i % 1024) > 20 && (i / 1024) > 20) { +- ichip = i / (256 * 256 * 4) * 4 + ((i / 256) % 4); ++ if ((i % 1024) < 1004 && (i % 1024) > 20 && (i / 1024) > 20) { ++ ichip = i / (256 * 256 * 4) * 4 + ((i / 256) % 4); + #ifdef JFSTRX +- int new_ichip = 0; +- if (ichip == 1) { +- if (i <= (1024*(64-2))) new_ichip = 0; +- if (i > (1024*(64+6)) && i <= (1024*(64*2-4))) new_ichip = 1; +- if (i > (1024*(64*2+5))) new_ichip = 2; +- } +- if (ichip == 6) { +- if (i <= (1024*(256+2*64-5))) new_ichip = 7; +- if (i > (1024*(256+2*64+4)) && i <= (1024*(256+64*3-6))) new_ichip = 6; +- if (i > (1024*(256+64*3-4))) new_ichip = 5; +- } +- hchip[new_ichip]->Fill(adcpedecorr, 1); ++ int new_ichip = 0; ++ if (ichip == 1) { ++ if (i <= (1024*(64-2))) new_ichip = 0; ++ if (i > (1024*(64+6)) && i <= (1024*(64*2-4))) new_ichip = 1; ++ if (i > (1024*(64*2+5))) new_ichip = 2; ++ } ++ if (ichip == 6) { ++ if (i <= (1024*(256+2*64-5))) new_ichip = 7; ++ if (i > (1024*(256+2*64+4)) && i <= (1024*(256+64*3-6))) new_ichip = 6; ++ if (i > (1024*(256+64*3-4))) new_ichip = 5; ++ } ++ hchip[new_ichip]->Fill(adcpedecorr, 1); + #else +- hchip[ichip]->Fill(adcpedecorr, 1); ++ hchip[ichip]->Fill(adcpedecorr, 1); + #endif +- adcpedecorrold = adcpedecorr; +- } ++ adcpedecorrold = adcpedecorr; ++ } ++ } ++ ++ // 3) T vs B / L vs R scatter, every frame (from the current frame) ++ for (ipx = 0; ipx < 1024; ipx++) { ++ his4500->Fill(adc_image[ipx + (512-21)*1024], adc_image[ipx + 20*1024]); ++ } ++ for (ipy = 0; ipy < 512; ipy++) { ++ hisLvsR->Fill(adc_image[20 + ipy*1024], adc_image[1024-21 + ipy*1024]); ++ } ++ ++ // 4) raw-ADC photon map accumulation (kept on the display cadence: ++ // one full-frame add per displayed frame is plenty for raw mode) ++ if (!dophotonmap && show2Ds) { ++ for (ipx = 0; ipx < 1024; ipx++) { ++ for (ipy = 0; ipy < 512; ipy++) { ++ his3000->Fill(float(ipx), float(ipy), ++ adc_image[ipx + ipy * 1024]); + } + } ++ } + +- if (show2Ds) { + #ifdef JFSTRX +- jungfrauLGADStrixelsData *decoder = new jungfrauLGADStrixelsData(); +- int group; +- for (ipx = 0; ipx < nx; ipx++) { +- for (ipy = 0; ipy < ny; ipy++) { +- i = int(((decoder->dataMap[ipy][ipx]) - sizeof(header)) / 2); +- group = decoder->groupmap[ipy][ipx]; +- value = (image_data[i] & 0x3fff) - fpeded[i]; +- static const int mc1g1y_start = 0; +- static const int mc1g2y_start = g1_nrows; +- static const int mc1g3y_start = g1_nrows + g2_nrows; +- static const int mc6g3y_start = g1_nrows + g2_nrows + g3_nrows; +- static const int mc6g2y_start = mc6g3y_start + g3_nrows; +- static const int mc6g1y_start = mc6g3y_start + g3_nrows + g2_nrows; +- if (group == 0) { +- if (ipy < 165) his1000->Fill(float(ipx), float(ipy - mc1g1y_start), value); +- if (ipy >= mc6g1y_start) his1060->Fill(float(ipx), float(ipy - mc6g1y_start), value); +- } +- if (group == 1) { +- if (ipy < (165+320)) +- his1001->Fill(float(ipx), float(ipy - mc1g2y_start), value); +- if (ipy >= mc6g2y_start && ipy < mc6g1y_start) { +- his4500->Fill(value, oldvalue, 1.0); +- oldvalue = value; +- his1061->Fill(float(ipx), float(ipy - mc6g2y_start), value); +- } +- } +- if (group == 2) { +- if (ipy < (165+320+476)) +- his1002->Fill(float(ipx), float(ipy - mc1g3y_start), value); +- if (ipy >= mc6g3y_start && ipy < mc6g2y_start) +- his1062->Fill(float(ipx), float(ipy - mc6g3y_start), value); +- } +- gain_image[ipx + ipy * nx] = gain; +- } +- } +- // T vs B / L vs R +- his4500->Reset(); +- for (ipx = 0; ipx < nx; ipx++) { +- his4500->Fill(adc_image[ipx + (ny-21)*nx], adc_image[ipx + 20*nx]); +- } +- hisLvsR->Reset(); ++ if (show2Ds) { ++ jungfrauLGADStrixelsData *decoder = new jungfrauLGADStrixelsData(); ++ int group; ++ for (ipx = 0; ipx < nx; ipx++) { + for (ipy = 0; ipy < ny; ipy++) { +- hisLvsR->Fill(adc_image[20 + ipy*nx], adc_image[nx-21 + ipy*nx]); +- } +- m_adcView->setImage(adc_image, nx, ny); +- m_gainView->setImage(gain_image, nx, ny); +-#else +- for (ipx = 0; ipx < nx; ipx++) { +- for (ipy = 0; ipy < ny; ipy++) { +- i = ipx + ipy * 1024; +- value = (image_data[i] & 0x3fff) - fpeded[i]; +- if ((i % 256 == 0) || (i % 256 == 255)) value = int(value / factor); +- if ((i / 1024 == 255) || (i / 1024 == 256) || (i / 1024 == 767) || (i / 1024 == 768)) +- value = int(value / factor); +- adc_image[ipx + ipy * 1024] = value; +- gain_image[ipx + ipy * 1024] = gain; ++ i = int(((decoder->dataMap[ipy][ipx]) - sizeof(header)) / 2); ++ group = decoder->groupmap[ipy][ipx]; ++ value = (image_data[i] & 0x3fff) - fpeded[i]; ++ static const int mc1g1y_start = 0; ++ static const int mc1g2y_start = g1_nrows; ++ static const int mc1g3y_start = g1_nrows + g2_nrows; ++ static const int mc6g3y_start = g1_nrows + g2_nrows + g3_nrows; ++ static const int mc6g2y_start = mc6g3y_start + g3_nrows; ++ static const int mc6g1y_start = mc6g3y_start + g3_nrows + g2_nrows; ++ if (group == 0) { ++ if (ipy < 165) his1000->Fill(float(ipx), float(ipy - mc1g1y_start), value); ++ if (ipy >= mc6g1y_start) his1060->Fill(float(ipx), float(ipy - mc6g1y_start), value); + } +- } +-#endif +- for (ipx = 0; ipx < 1024; ipx++) { +- for (ipy = 0; ipy < 512; ipy++) { +- i = ipx + ipy * 1024; +- value = (image_data[i] & 0x3fff) - fpeded[i]; +- if (!dophotonmap) his3000->Fill(float(ipx), float(ipy), value); +- if (dophotonmap) his3000->Fill(float(ipx), float(ipy), float(hchptr[i])); ++ if (group == 1) { ++ if (ipy < (165+320)) ++ his1001->Fill(float(ipx), float(ipy - mc1g2y_start), value); ++ if (ipy >= mc6g2y_start && ipy < mc6g1y_start) { ++ his4500->Fill(value, oldvalue, 1.0); ++ oldvalue = value; ++ his1061->Fill(float(ipx), float(ipy - mc6g2y_start), value); ++ } + } ++ if (group == 2) { ++ if (ipy < (165+320+476)) ++ his1002->Fill(float(ipx), float(ipy - mc1g3y_start), value); ++ if (ipy >= mc6g3y_start && ipy < mc6g2y_start) ++ his1062->Fill(float(ipx), float(ipy - mc6g3y_start), value); ++ } ++ gain_image[ipx + ipy * nx] = gain; + } +- // T vs B / L vs R +- his4500->Reset(); +- for (ipx = 0; ipx < 1024; ipx++) { +- his4500->Fill(adc_image[ipx + (512-21)*1024], adc_image[ipx + 20*1024]); +- } +- hisLvsR->Reset(); +- for (ipy = 0; ipy < 512; ipy++) { +- hisLvsR->Fill(adc_image[20 + ipy*1024], adc_image[1024-21 + ipy*1024]); +- } +- m_adcView->setImage(adc_image, nx, ny); +- m_gainView->setImage(gain_image, nx, ny); +- } +- +- if (doRootDraw) { +- for (i = 0; i < NCH; i++) hchptr[i] = 0; +- Plot2DHistos(); +- Plot1DHistos(); + } ++ m_adcView->setImage(adc_image, nx, ny); ++ m_gainView->setImage(gain_image, nx, ny); ++ } ++#else ++ if (show2Ds) { ++ m_adcView->setImage(adc_image, nx, ny); ++ m_gainView->setImage(gain_image, nx, ny); + } ++#endif + +- if ((framesinstream % NPRO) == NPRO - 1) +- gSystem->ProcessEvents(); + } + ++ + void MainWindow::closeEvent(QCloseEvent *event) { + stop(); + event->accept(); +@@ -852,9 +1045,10 @@ void MainWindow::setRanges(int amin, int amax, int pmin, int pmax, int cmin, int + fixranges = true; + cout << "Ranges set: ADC [" << adcmin << "," << adcmax << "] PM [" << pmmin << "," << pmmax + << "] ChipX [" << chipxmin << "," << chipxmax << "]" << endl; +- for (int ih = 0; ih < 8; ih++) { +- hchip[ih]->GetXaxis()->SetRangeUser(chipxmin, chipxmax); +- } ++ RootCmd c; ++ c.type = RootCmdType::SetChipRange; ++ c.a = chipxmin; c.b = chipxmax; ++ pushRootCmd(c); + } + + void MainWindow::showRateDialog() { +@@ -867,26 +1061,19 @@ void MainWindow::showRateDialog() { + mainRateSpin->setValue(HDraw_every); + form->addRow("Main image (frames):", mainRateSpin); + +- auto *rootMulSpin = new QSpinBox(&dialog); +- rootMulSpin->setRange(1, 1000); +- rootMulSpin->setValue(rootDrawDivider); +- form->addRow("ROOT plots (x main draws):", rootMulSpin); +- +- auto *effLabel = new QLabel(QString("= every %1 frames").arg(HDraw_every * rootDrawDivider), &dialog); +- form->addRow("Effective ROOT rate:", effLabel); ++ auto *rootMsSpin = new QSpinBox(&dialog); ++ rootMsSpin->setRange(50, 60000); ++ rootMsSpin->setSingleStep(100); ++ rootMsSpin->setValue(rootUpdateMs); ++ form->addRow("ROOT update (ms):", rootMsSpin); + +- auto *fillChk = new QCheckBox("Fill histograms every received frame", &dialog); +- fillChk->setChecked(fillPerFrame); +- form->addRow(fillChk); ++ auto *effLabel = new QLabel(QString("ROOT redraws every %1 ms when frames arrived").arg(rootUpdateMs), &dialog); ++ effLabel->setWordWrap(true); ++ form->addRow(effLabel); + +- // Update effective label when spin values change +- QObject::connect(mainRateSpin, static_cast(&QSpinBox::valueChanged), +- [mainRateSpin, rootMulSpin, effLabel](int) { +- effLabel->setText(QString("= every %1 frames").arg(mainRateSpin->value() * rootMulSpin->value())); +- }); +- QObject::connect(rootMulSpin, static_cast(&QSpinBox::valueChanged), +- [mainRateSpin, rootMulSpin, effLabel](int) { +- effLabel->setText(QString("= every %1 frames").arg(mainRateSpin->value() * rootMulSpin->value())); ++ QObject::connect(rootMsSpin, static_cast(&QSpinBox::valueChanged), ++ [effLabel](int ms) { ++ effLabel->setText(QString("ROOT redraws every %1 ms when frames arrived").arg(ms)); + }); + + auto *buttons = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel, &dialog); +@@ -896,12 +1083,9 @@ void MainWindow::showRateDialog() { + + if (dialog.exec() == QDialog::Accepted) { + HDraw_every = mainRateSpin->value(); +- rootDrawDivider = rootMulSpin->value(); +- fillPerFrame = fillChk->isChecked(); +- drawLabel->setText(QString("Draw every: %1 ROOT: %2x%1=%3") +- .arg(HDraw_every).arg(rootDrawDivider).arg(HDraw_every * rootDrawDivider)); +- cout << "Rates: main=" << HDraw_every << " rootMul=" << rootDrawDivider +- << " fillPerFrame=" << fillPerFrame << endl; ++ rootUpdateMs = rootMsSpin->value(); ++ updateDrawLabel(); ++ cout << "Rates: main=" << HDraw_every << " rootMs=" << rootUpdateMs << endl; + } + } + +@@ -909,6 +1093,12 @@ void MainWindow::updateStatusBar() { + frameLabel->setText(QString("Frame: %1").arg(framesinstream)); + } + ++void MainWindow::updateDrawLabel() { ++ if (drawLabel) ++ drawLabel->setText(QString("Main: every %1 frames | ROOT: every %2 ms") ++ .arg(HDraw_every).arg(rootUpdateMs)); ++} ++ + + // ── Main ──────────────────────────────────────────────────────────────────── + int main(int argc, char* argv[]) +@@ -956,59 +1146,61 @@ void printhelp(){ + cout<< endl << "s=start/pause| p/n=getnewpede/raw | o/O=read/save pede | n=nopede(raw) | r/R=rst His/Axis | +/- = faster/slower ref. |q=exit | U/C sUrf2/Colz " <Reset(); +- hisLvsR->Reset(); +- his3000->Reset(); +- for (i=0;i<8;i++) { +- hchip[i]->Reset(); +- } +- Plot2DHistos(); +- Plot1DHistos(); +-} +- +-void axisreset(){ +- fixranges=false; ++ void historeset(){ // ROOT-thread only (executed via command queue) ++ his4500->Reset(); ++ hisLvsR->Reset(); ++ his3000->Reset(); ++ for (i=0;i<8;i++) { ++ hchip[i]->Reset(); ++ } ++ // keep display clones consistent ++ copyBins(disp3000, his3000); ++ copyBins(disp4500, his4500); ++ copyBins(dispLvsR, hisLvsR); ++ for (int ih = 0; ih < 8; ih++) ++ copyBins(dispChip[ih], hchip[ih]); ++ Plot2DHistos(); ++ Plot1DHistos(); ++ } ++ ++ void axisreset(){ // ROOT-thread only (executed via command queue) ++ fixranges=false; + #ifdef JFSTRX +- his1000->GetXaxis()->UnZoom(); +- his1000->GetYaxis()->UnZoom(); +- his1000->GetZaxis()->UnZoom(); +- his1001->GetXaxis()->UnZoom(); +- his1001->GetYaxis()->UnZoom(); +- his1001->GetZaxis()->UnZoom(); +- his1002->GetXaxis()->UnZoom(); +- his1002->GetYaxis()->UnZoom(); +- his1002->GetZaxis()->UnZoom(); +- his1060->GetXaxis()->UnZoom(); +- his1060->GetYaxis()->UnZoom(); +- his1060->GetZaxis()->UnZoom(); +- his1061->GetXaxis()->UnZoom(); +- his1061->GetYaxis()->UnZoom(); +- his1061->GetZaxis()->UnZoom(); +- his1062->GetXaxis()->UnZoom(); +- his1062->GetYaxis()->UnZoom(); +- his1062->GetZaxis()->UnZoom(); +-#else +- his1000->GetXaxis()->UnZoom(); +- his1000->GetYaxis()->UnZoom(); +- his1000->GetZaxis()->UnZoom(); ++ disp1000->GetXaxis()->UnZoom(); ++ disp1000->GetYaxis()->UnZoom(); ++ disp1000->GetZaxis()->UnZoom(); ++ disp1001->GetXaxis()->UnZoom(); ++ disp1001->GetYaxis()->UnZoom(); ++ disp1001->GetZaxis()->UnZoom(); ++ disp1002->GetXaxis()->UnZoom(); ++ disp1002->GetYaxis()->UnZoom(); ++ disp1002->GetZaxis()->UnZoom(); ++ disp1060->GetXaxis()->UnZoom(); ++ disp1060->GetYaxis()->UnZoom(); ++ disp1060->GetZaxis()->UnZoom(); ++ disp1061->GetXaxis()->UnZoom(); ++ disp1061->GetYaxis()->UnZoom(); ++ disp1061->GetZaxis()->UnZoom(); ++ disp1062->GetXaxis()->UnZoom(); ++ disp1062->GetYaxis()->UnZoom(); ++ disp1062->GetZaxis()->UnZoom(); + #endif +- his2000->GetXaxis()->UnZoom(); +- his2000->GetYaxis()->UnZoom(); +- his3000->GetZaxis()->UnZoom(); +- for (i=0;i<8;i++) { +- hchip[i]->GetXaxis()->UnZoom(); +- hchip[i]->GetYaxis()->UnZoom(); +- } +- his4500->GetXaxis()->UnZoom(); +- his4500->GetYaxis()->UnZoom(); +- his4500->GetZaxis()->UnZoom(); +- hisLvsR->GetXaxis()->UnZoom(); +- hisLvsR->GetYaxis()->UnZoom(); +- hisLvsR->GetZaxis()->UnZoom(); +- Plot2DHistos(); +- Plot1DHistos(); +-} ++ disp3000->GetXaxis()->UnZoom(); ++ disp3000->GetYaxis()->UnZoom(); ++ disp3000->GetZaxis()->UnZoom(); ++ for (i=0;i<8;i++) { ++ dispChip[i]->GetXaxis()->UnZoom(); ++ dispChip[i]->GetYaxis()->UnZoom(); ++ } ++ disp4500->GetXaxis()->UnZoom(); ++ disp4500->GetYaxis()->UnZoom(); ++ disp4500->GetZaxis()->UnZoom(); ++ dispLvsR->GetXaxis()->UnZoom(); ++ dispLvsR->GetYaxis()->UnZoom(); ++ dispLvsR->GetZaxis()->UnZoom(); ++ Plot2DHistos(); ++ Plot1DHistos(); ++ } + + void LoadPaletteFalse(){ + const Int_t NRGBs = 5; +@@ -1043,43 +1235,43 @@ void LoadPaletteBW(float gammatune){ + } + + void Plot1DHistos(void){ +- if (hchip[0]->GetXaxis()->GetLast()!=oldh0xlast){ +- oldh0xlast=hchip[0]->GetXaxis()->GetLast(); +- oldh0xfirst=hchip[0]->GetXaxis()->GetFirst(); +- for (int ipad=1; ipad<8;ipad++) { +- hchip[ipad]->GetXaxis()->SetRange(oldh0xfirst,oldh0xlast); +- } +- } +- for (int ipad=0; ipad<8;ipad++) { +- A4->cd(ipad+1); +- gStyle->SetOptStat(1); gPad->SetLogy(); +- hchip[ipad%4+(1-int(ipad/4))*4]->Draw(); +- } +- A4->cd(); +- A4->Update(); +-} ++ if (dispChip[0]->GetXaxis()->GetLast()!=oldh0xlast){ ++ oldh0xlast=dispChip[0]->GetXaxis()->GetLast(); ++ oldh0xfirst=dispChip[0]->GetXaxis()->GetFirst(); ++ for (int ipad=1; ipad<8;ipad++) { ++ dispChip[ipad]->GetXaxis()->SetRange(oldh0xfirst,oldh0xlast); ++ } ++ } ++ for (int ipad=0; ipad<8;ipad++) { ++ A4->cd(ipad+1); ++ gStyle->SetOptStat(1); gPad->SetLogy(); ++ dispChip[ipad%4+(1-int(ipad/4))*4]->Draw(); ++ } ++ A4->cd(); ++ A4->Update(); ++ } + + void Plot2DHistos(void){ + gStyle->SetOptStat(0); + if (fixranges) { +- his3000->GetZaxis()->SetRangeUser(float(pmmin),float(pmmax)); ++ disp3000->GetZaxis()->SetRangeUser(float(pmmin),float(pmmax)); + } + #ifdef JFSTRX + p5->cd(); +- his1000->Draw("colz"); ++ disp1000->Draw("colz"); + p3->cd(); +- his1001->Draw("colz"); ++ disp1001->Draw("colz"); + p1->cd(); +- his1002->Draw("colz"); ++ disp1002->Draw("colz"); + p2->cd(); +- his1060->Draw("colz"); ++ disp1060->Draw("colz"); + p4->cd(); +- his1061->Draw("colz"); ++ disp1061->Draw("colz"); + p6->cd(); +- his1062->Draw("colz"); ++ disp1062->Draw("colz"); + #endif + A5->cd(); +- his3000->Draw("colz"); ++ disp3000->Draw("colz"); + box = new TBox(ROIxmin,ROIymin,ROIxmax,ROIymax); + box->SetLineColor(kRed); + box->SetFillStyle(0); +@@ -1090,8 +1282,8 @@ void Plot2DHistos(void){ + if (!A6->GetListOfPrimitives() || !A6->GetListOfPrimitives()->GetSize()) { + A6->Divide(1,2); + } +- A6->cd(1); his4500->Draw("colz"); +- A6->cd(2); hisLvsR->Draw("colz"); ++ A6->cd(1); disp4500->Draw("colz"); ++ A6->cd(2); dispLvsR->Draw("colz"); + A6->Update(); + } + +diff --git a/slsDetectorCalibration/jungfrauExecutables/onlinedisp_zmq.h b/slsDetectorCalibration/jungfrauExecutables/onlinedisp_zmq.h +index 14c593e8b..082f9cdf0 100644 +--- a/slsDetectorCalibration/jungfrauExecutables/onlinedisp_zmq.h ++++ b/slsDetectorCalibration/jungfrauExecutables/onlinedisp_zmq.h +@@ -173,7 +173,6 @@ bool gain_flag; + bool bw_flag; + bool fill2Ds; + bool show2Ds; +-bool fill1Ds; + bool pede_flag; + bool dophotonmap; + +@@ -230,8 +229,7 @@ void readpede(void); + void tryconnect(void) ; + + int HDraw_every; +-int rootDrawDivider = 10; +-bool fillPerFrame = false; ++int rootUpdateMs = 1000; + + + float oldh0xfirst,oldh0xlast; +@@ -317,15 +315,21 @@ private: + void processData(); + void startWorker(); + void stopWorker(); ++ void rootDrawLoop(); + void showRangeDialog(); + void showRateDialog(); + void updateStatusBar(); ++ void updateDrawLabel(); + void setRanges(int adcmin, int adcmax, int pmmin, int pmmax, int cmin = 0, int cmax = 8500); + + // Worker thread + std::thread *workerThread = nullptr; + std::atomic workerRunning{false}; + ++ // ROOT plotting thread (periodic redraw off the Qt thread) ++ std::thread *rootDrawThread = nullptr; ++ std::atomic rootThreadRun{false}; ++ + // Thread-safe data + ThreadData threadData; + +diff --git a/zsh_autocomplete.sh b/zsh_autocomplete.sh +deleted file mode 120000 +index 143520002..000000000 +--- a/zsh_autocomplete.sh ++++ /dev/null +@@ -1 +0,0 @@ +-slsDetectorSoftware/generator/autocomplete/zsh_autocomplete.sh +\ No newline at end of file +diff --git a/zsh_autocomplete.sh b/zsh_autocomplete.sh +new file mode 100644 +index 000000000..64598dd2b +--- /dev/null ++++ b/zsh_autocomplete.sh +@@ -0,0 +1,3358 @@ ++# GENERATED FILE - DO NOT EDIT ++# ANY CHANGES TO THIS FILE WILL BE OVERWRITTEN ++ ++_sd() { ++ ++ ++local SLS_COMMANDS=" acquire activate adcclk adcenable adcenable10g adcindex adcinvert adclist adcname adcphase adcpipeline adcreg adcvpp apulse asamples autocompdisable badchannels blockingtrigger burstmode burstperiod bursts burstsl bustest cdsgain chipversion clearbit clearbusy clientversion clkdiv clkfreq clkphase collectionmode column compdisabletime confadc config configtransceiver counters currentsource dac dacindex daclist dacname dacvalues datastream dbitclk dbitphase dbitpipeline defaultdac defaultpattern delay delayl detectorserverversion detsize diodelay dpulse dr drlist dsamples execcommand exptime exptime1 exptime2 exptime3 extrastoragecells extsampling extsamplingsrc extsig fformat filtercells filterresistor findex firmwaretest firmwareversion fliprows flowcontrol10g fmaster fname foverwrite fpath framecounter frames framesl frametime free fwrite gaincaps gainmode gappixels gatedelay gatedelay1 gatedelay2 gatedelay3 gates getbit hardwareversion highvoltage hostname im_a im_b im_c im_d im_io imagetest initialchecks inj_ch interpolation interruptsubframe kernelversion lastclient led lock master maxadcphaseshift maxclkphaseshift maxdbitphaseshift measuredperiod measuredsubperiod moduleid nextframenumber nmod numinterfaces overflow packageversion parallel parameters partialreset patfname patioctrl patlimits patloop patloop0 patloop1 patloop2 patmask patnloop patnloop0 patnloop1 patnloop2 patsetbit pattern patternstart patwait patwait0 patwait1 patwait2 patwaittime patwaittime0 patwaittime1 patwaittime2 patword pedestalmode period periodl polarity port powerchip powerindex powerlist powername powervalues programfpga pulse pulsechip pulsenmove pumpprobe quad ratecorr readnrows readout readoutspeed readoutspeedlist rebootcontroller reg resetdacs resetfpga romode row runclk runtime rx_arping rx_clearroi rx_dbitlist rx_dbitoffset rx_dbitreorder rx_discardpolicy rx_fifodepth rx_frameindex rx_framescaught rx_framesperfile rx_hostname rx_jsonaddheader rx_jsonpara rx_lastclient rx_lock rx_missingpackets rx_padding rx_printconfig rx_realudpsocksize rx_roi rx_silent rx_start rx_status rx_stop rx_tcpport rx_threads rx_udpsocksize rx_version rx_zmqfreq rx_zmqhwm rx_zmqip rx_zmqport rx_zmqstartfnum rx_zmqstream samples savepattern scan scanerrmsg selinterface serialnumber setbit settings settingslist settingspath signalindex signallist signalname sleep slowadc slowadcindex slowadclist slowadcname slowadcvalues start status stop stopport storagecell_delay storagecell_start subdeadtime subexptime sync syncclk temp_10ge temp_adc temp_control temp_dcdc temp_event temp_fpga temp_fpgaext temp_fpgafl temp_fpgafr temp_slowadc temp_sodl temp_sodr temp_threshold templist tempvalues tengiga threshold thresholdnotb timing timing_info_decoder timinglist timingsource top transceiverenable trigger triggers triggersl trimbits trimen trimval tsamples txdelay txdelay_frame txdelay_left txdelay_right type udp_cleardst udp_dstip udp_dstip2 udp_dstlist udp_dstmac udp_dstmac2 udp_dstport udp_dstport2 udp_firstdst udp_numdst udp_reconfigure udp_srcip udp_srcip2 udp_srcmac udp_srcmac2 udp_validate update updatedetectorserver updatekernel updatemode user v_a v_b v_c v_chip v_d v_io v_limit vchip_comp_adc vchip_comp_fe vchip_cs vchip_opa_1st vchip_opa_fd vchip_ref_comp_fe versions veto vetoalg vetofile vetophoton vetoref vetostream virtual vm_a vm_b vm_c vm_d vm_io zmqhwm zmqip zmqport " ++__acquire() { ++FCN_RETURN="" ++return 0 ++} ++__activate() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="0 1" ++fi ++fi ++return 0 ++} ++__adcclk() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__adcenable() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__adcenable10g() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__adcindex() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 1 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__adcinvert() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__adclist() { ++FCN_RETURN="" ++return 0 ++} ++__adcname() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 1 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++if [[ "${cword}" == "3" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__adcphase() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 1 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="deg" ++fi ++fi ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++if [[ "${cword}" == "3" ]]; then ++FCN_RETURN="deg" ++fi ++fi ++return 0 ++} ++__adcpipeline() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__adcreg() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 1 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++if [[ "${cword}" == "3" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__adcvpp() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 1 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="0 1" ++fi ++fi ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++if [[ "${cword}" == "3" ]]; then ++FCN_RETURN="mV mv" ++fi ++fi ++return 0 ++} ++__apulse() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="0 1" ++fi ++fi ++return 0 ++} ++__asamples() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__autocompdisable() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="0 1" ++fi ++fi ++return 0 ++} ++__badchannels() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 1 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__blockingtrigger() { ++FCN_RETURN="" ++return 0 ++} ++__burstmode() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="burst_external burst_internal cw_external cw_internal" ++fi ++fi ++return 0 ++} ++__burstperiod() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 1 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="ms ns s us" ++fi ++fi ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++if [[ "${cword}" == "3" ]]; then ++FCN_RETURN="ms ns s us" ++fi ++fi ++return 0 ++} ++__bursts() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__burstsl() { ++FCN_RETURN="" ++return 0 ++} ++__bustest() { ++FCN_RETURN="" ++return 0 ++} ++__cdsgain() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="0 1" ++fi ++fi ++return 0 ++} ++__chipversion() { ++FCN_RETURN="" ++return 0 ++} ++__clearbit() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++if [[ "${cword}" == "3" ]]; then ++FCN_RETURN="" ++fi ++if [[ "${cword}" == "4" ]]; then ++FCN_RETURN="--validate" ++fi ++fi ++return 0 ++} ++__clearbusy() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 1 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++if [[ "${cword}" == "3" ]]; then ++FCN_RETURN="" ++fi ++if [[ "${cword}" == "4" ]]; then ++FCN_RETURN="--validate" ++fi ++fi ++return 0 ++} ++__clientversion() { ++FCN_RETURN="" ++return 0 ++} ++__clkdiv() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 1 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++if [[ "${cword}" == "3" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__clkfreq() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 1 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__clkphase() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 1 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++if [[ "${cword}" == "3" ]]; then ++FCN_RETURN="deg" ++fi ++fi ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++if [[ "${cword}" == "3" ]]; then ++FCN_RETURN="" ++fi ++if [[ "${cword}" == "4" ]]; then ++FCN_RETURN="deg" ++fi ++fi ++return 0 ++} ++__collectionmode() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="electron hole" ++fi ++fi ++return 0 ++} ++__column() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__compdisabletime() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 1 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="ms ns s us" ++fi ++fi ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++if [[ "${cword}" == "3" ]]; then ++FCN_RETURN="ms ns s us" ++fi ++fi ++return 0 ++} ++__confadc() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 1 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++if [[ "${cword}" == "3" ]]; then ++FCN_RETURN="" ++fi ++fi ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++if [[ "${cword}" == "3" ]]; then ++FCN_RETURN="" ++fi ++if [[ "${cword}" == "4" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__config() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 1 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++if [[ "${cword}" == "3" ]]; then ++FCN_RETURN="" ++fi ++if [[ "${cword}" == "4" ]]; then ++FCN_RETURN="" ++fi ++fi ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++IS_PATH=1 ++fi ++fi ++return 0 ++} ++__configtransceiver() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 1 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++IS_PATH=1 ++fi ++fi ++return 0 ++} ++__counters() { ++FCN_RETURN="" ++return 0 ++} ++__currentsource() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="0 1" ++fi ++if [[ "${cword}" == "3" ]]; then ++FCN_RETURN="fix nofix" ++fi ++if [[ "${cword}" == "4" ]]; then ++FCN_RETURN="" ++fi ++if [[ "${cword}" == "5" ]]; then ++FCN_RETURN="low normal" ++fi ++fi ++return 0 ++} ++__dac() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 1 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="`sls_detector_get daclist | sed -e 's/.*\[\(.*\)\].*/\1/' | sed 's/,//g'`" ++fi ++if [[ "${cword}" == "3" ]]; then ++FCN_RETURN="mV mv" ++fi ++fi ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="`sls_detector_get daclist | sed -e 's/.*\[\(.*\)\].*/\1/' | sed 's/,//g'`" ++fi ++if [[ "${cword}" == "3" ]]; then ++FCN_RETURN="" ++fi ++if [[ "${cword}" == "4" ]]; then ++FCN_RETURN="mV mv" ++fi ++fi ++return 0 ++} ++__dacindex() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 1 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__daclist() { ++FCN_RETURN="" ++return 0 ++} ++__dacname() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 1 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="`sls_detector_get daclist | sed -e 's/.*\[\(.*\)\].*/\1/' | sed 's/,//g'`" ++fi ++fi ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="`sls_detector_get daclist | sed -e 's/.*\[\(.*\)\].*/\1/' | sed 's/,//g'`" ++fi ++if [[ "${cword}" == "3" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__dacvalues() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 1 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="mV mv" ++fi ++fi ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="mV mv" ++fi ++fi ++return 0 ++} ++__datastream() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 1 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="bottom left right top" ++fi ++fi ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="bottom left right top" ++fi ++if [[ "${cword}" == "3" ]]; then ++FCN_RETURN="0 1" ++fi ++fi ++return 0 ++} ++__dbitclk() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__dbitphase() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 1 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="deg" ++fi ++fi ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++if [[ "${cword}" == "3" ]]; then ++FCN_RETURN="deg" ++fi ++fi ++return 0 ++} ++__dbitpipeline() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__defaultdac() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 1 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="`sls_detector_get daclist | sed -e 's/.*\[\(.*\)\].*/\1/' | sed 's/,//g'`" ++fi ++if [[ "${cword}" == "3" ]]; then ++FCN_RETURN="`sls_detector_get settingslist | sed -e 's/.*\[\(.*\)\].*/\1/' | sed 's/,//g'`" ++fi ++fi ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="`sls_detector_get daclist | sed -e 's/.*\[\(.*\)\].*/\1/' | sed 's/,//g'`" ++fi ++if [[ "${cword}" == "3" ]]; then ++FCN_RETURN="" ++fi ++if [[ "${cword}" == "4" ]]; then ++FCN_RETURN="`sls_detector_get settingslist | sed -e 's/.*\[\(.*\)\].*/\1/' | sed 's/,//g'`" ++fi ++fi ++return 0 ++} ++__defaultpattern() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 1 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="`sls_detector_get daclist | sed -e 's/.*\[\(.*\)\].*/\1/' | sed 's/,//g'`" ++fi ++if [[ "${cword}" == "3" ]]; then ++FCN_RETURN="" ++fi ++if [[ "${cword}" == "4" ]]; then ++FCN_RETURN="`sls_detector_get settingslist | sed -e 's/.*\[\(.*\)\].*/\1/' | sed 's/,//g'`" ++fi ++fi ++return 0 ++} ++__delay() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 1 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="ms ns s us" ++fi ++fi ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++if [[ "${cword}" == "3" ]]; then ++FCN_RETURN="ms ns s us" ++fi ++fi ++return 0 ++} ++__delayl() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 1 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="ms ns s us" ++fi ++fi ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="ms ns s us" ++fi ++fi ++return 0 ++} ++__detectorserverversion() { ++FCN_RETURN="" ++return 0 ++} ++__detsize() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++if [[ "${cword}" == "3" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__diodelay() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 1 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++if [[ "${cword}" == "3" ]]; then ++FCN_RETURN="" ++fi ++fi ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++if [[ "${cword}" == "3" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__dpulse() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="0 1" ++fi ++fi ++return 0 ++} ++__dr() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__drlist() { ++FCN_RETURN="" ++return 0 ++} ++__dsamples() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__execcommand() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 1 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__exptime() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 1 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="ms ns s us" ++fi ++fi ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++if [[ "${cword}" == "3" ]]; then ++FCN_RETURN="ms ns s us" ++fi ++fi ++return 0 ++} ++__exptime1() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 1 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="ms ns s us" ++fi ++fi ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++if [[ "${cword}" == "3" ]]; then ++FCN_RETURN="ms ns s us" ++fi ++fi ++return 0 ++} ++__exptime2() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 1 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="ms ns s us" ++fi ++fi ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++if [[ "${cword}" == "3" ]]; then ++FCN_RETURN="ms ns s us" ++fi ++fi ++return 0 ++} ++__exptime3() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 1 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="ms ns s us" ++fi ++fi ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++if [[ "${cword}" == "3" ]]; then ++FCN_RETURN="ms ns s us" ++fi ++fi ++return 0 ++} ++__extrastoragecells() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__extsampling() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="0 1" ++fi ++fi ++return 0 ++} ++__extsamplingsrc() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__extsig() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 1 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++if [[ "${cword}" == "3" ]]; then ++FCN_RETURN="inversion_off inversion_on trigger_in_falling_edge trigger_in_rising_edge" ++fi ++fi ++return 0 ++} ++__fformat() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="binary hdf5" ++fi ++fi ++return 0 ++} ++__filtercells() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__filterresistor() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__findex() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__firmwaretest() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 1 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__firmwareversion() { ++FCN_RETURN="" ++return 0 ++} ++__fliprows() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="0 1" ++fi ++fi ++return 0 ++} ++__flowcontrol10g() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="0 1" ++fi ++fi ++return 0 ++} ++__fmaster() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="0 1" ++fi ++fi ++return 0 ++} ++__fname() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__foverwrite() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="0 1" ++fi ++fi ++return 0 ++} ++__fpath() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++IS_PATH=1 ++fi ++fi ++return 0 ++} ++__framecounter() { ++FCN_RETURN="" ++return 0 ++} ++__frames() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__framesl() { ++FCN_RETURN="" ++return 0 ++} ++__frametime() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 1 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="ms ns s us" ++fi ++fi ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="ms ns s us" ++fi ++fi ++return 0 ++} ++__free() { ++FCN_RETURN="" ++return 0 ++} ++__fwrite() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="0 1" ++fi ++fi ++return 0 ++} ++__gaincaps() { ++FCN_RETURN="" ++return 0 ++} ++__gainmode() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="dynamic fixg0 fixg1 fixg2 forceswitchg1 forceswitchg2" ++fi ++fi ++return 0 ++} ++__gappixels() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="0 1" ++fi ++fi ++return 0 ++} ++__gatedelay() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 1 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="ms ns s us" ++fi ++fi ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++if [[ "${cword}" == "3" ]]; then ++FCN_RETURN="ms ns s us" ++fi ++fi ++return 0 ++} ++__gatedelay1() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 1 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="ms ns s us" ++fi ++fi ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++if [[ "${cword}" == "3" ]]; then ++FCN_RETURN="ms ns s us" ++fi ++fi ++return 0 ++} ++__gatedelay2() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 1 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="ms ns s us" ++fi ++fi ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++if [[ "${cword}" == "3" ]]; then ++FCN_RETURN="ms ns s us" ++fi ++fi ++return 0 ++} ++__gatedelay3() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 1 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="ms ns s us" ++fi ++fi ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++if [[ "${cword}" == "3" ]]; then ++FCN_RETURN="ms ns s us" ++fi ++fi ++return 0 ++} ++__gates() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__getbit() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 1 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++if [[ "${cword}" == "3" ]]; then ++FCN_RETURN="" ++fi ++fi ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++if [[ "${cword}" == "3" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__hardwareversion() { ++FCN_RETURN="" ++return 0 ++} ++__highvoltage() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__hostname() { ++FCN_RETURN="" ++return 0 ++} ++__im_a() { ++FCN_RETURN="" ++return 0 ++} ++__im_b() { ++FCN_RETURN="" ++return 0 ++} ++__im_c() { ++FCN_RETURN="" ++return 0 ++} ++__im_d() { ++FCN_RETURN="" ++return 0 ++} ++__im_io() { ++FCN_RETURN="" ++return 0 ++} ++__imagetest() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="0 1" ++fi ++fi ++return 0 ++} ++__initialchecks() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="0 1" ++fi ++fi ++return 0 ++} ++__inj_ch() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++if [[ "${cword}" == "3" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__interpolation() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="0 1" ++fi ++fi ++return 0 ++} ++__interruptsubframe() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="0 1" ++fi ++fi ++return 0 ++} ++__kernelversion() { ++FCN_RETURN="" ++return 0 ++} ++__lastclient() { ++FCN_RETURN="" ++return 0 ++} ++__led() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="0 1" ++fi ++fi ++return 0 ++} ++__lock() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="0 1" ++fi ++fi ++return 0 ++} ++__master() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="0 1" ++fi ++fi ++return 0 ++} ++__maxadcphaseshift() { ++FCN_RETURN="" ++return 0 ++} ++__maxclkphaseshift() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 1 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__maxdbitphaseshift() { ++FCN_RETURN="" ++return 0 ++} ++__measuredperiod() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 1 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="ms ns s us" ++fi ++fi ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="ms ns s us" ++fi ++fi ++return 0 ++} ++__measuredsubperiod() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 1 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="ms ns s us" ++fi ++fi ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="ms ns s us" ++fi ++fi ++return 0 ++} ++__moduleid() { ++FCN_RETURN="" ++return 0 ++} ++__nextframenumber() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__nmod() { ++FCN_RETURN="" ++return 0 ++} ++__numinterfaces() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__overflow() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="0 1" ++fi ++fi ++return 0 ++} ++__packageversion() { ++FCN_RETURN="" ++return 0 ++} ++__parallel() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="0 1" ++fi ++fi ++return 0 ++} ++__parameters() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 1 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="0 1" ++fi ++fi ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++IS_PATH=1 ++fi ++fi ++return 0 ++} ++__partialreset() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="0 1" ++fi ++fi ++return 0 ++} ++__patfname() { ++FCN_RETURN="" ++return 0 ++} ++__patioctrl() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__patlimits() { ++FCN_RETURN="" ++return 0 ++} ++__patloop() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 1 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++if [[ "${cword}" == "3" ]]; then ++FCN_RETURN="" ++fi ++if [[ "${cword}" == "4" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__patloop0() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 1 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++if [[ "${cword}" == "3" ]]; then ++FCN_RETURN="" ++fi ++if [[ "${cword}" == "4" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__patloop1() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 1 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++if [[ "${cword}" == "3" ]]; then ++FCN_RETURN="" ++fi ++if [[ "${cword}" == "4" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__patloop2() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 1 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++if [[ "${cword}" == "3" ]]; then ++FCN_RETURN="" ++fi ++if [[ "${cword}" == "4" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__patmask() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__patnloop() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 1 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++if [[ "${cword}" == "3" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__patnloop0() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 1 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++if [[ "${cword}" == "3" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__patnloop1() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 1 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++if [[ "${cword}" == "3" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__patnloop2() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 1 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++if [[ "${cword}" == "3" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__patsetbit() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__pattern() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 1 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++IS_PATH=1 ++fi ++fi ++return 0 ++} ++__patternstart() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 1 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++IS_PATH=1 ++fi ++fi ++return 0 ++} ++__patwait() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 1 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++if [[ "${cword}" == "3" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__patwait0() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 1 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++if [[ "${cword}" == "3" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__patwait1() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 1 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++if [[ "${cword}" == "3" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__patwait2() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 1 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++if [[ "${cword}" == "3" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__patwaittime() { ++FCN_RETURN="" ++return 0 ++} ++__patwaittime0() { ++FCN_RETURN="" ++return 0 ++} ++__patwaittime1() { ++FCN_RETURN="" ++return 0 ++} ++__patwaittime2() { ++FCN_RETURN="" ++return 0 ++} ++__patword() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 1 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++if [[ "${cword}" == "3" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__pedestalmode() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN=" 0" ++fi ++if [[ "${cword}" == "3" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__period() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 1 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="ms ns s us" ++fi ++fi ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++if [[ "${cword}" == "3" ]]; then ++FCN_RETURN="ms ns s us" ++fi ++fi ++return 0 ++} ++__periodl() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 1 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="ms ns s us" ++fi ++fi ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="ms ns s us" ++fi ++fi ++return 0 ++} ++__polarity() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="neg pos" ++fi ++fi ++return 0 ++} ++__port() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__powerchip() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="0 1" ++fi ++fi ++return 0 ++} ++__powerindex() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 1 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__powerlist() { ++FCN_RETURN="" ++return 0 ++} ++__powername() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 1 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="`sls_detector_get daclist | sed -e 's/.*\[\(.*\)\].*/\1/' | sed 's/,//g'`" ++fi ++fi ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="`sls_detector_get daclist | sed -e 's/.*\[\(.*\)\].*/\1/' | sed 's/,//g'`" ++fi ++if [[ "${cword}" == "3" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__powervalues() { ++FCN_RETURN="" ++return 0 ++} ++__programfpga() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++IS_PATH=1 ++fi ++if [[ "${cword}" == "3" ]]; then ++FCN_RETURN="--force-delete-normal-file" ++fi ++fi ++return 0 ++} ++__pulse() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 1 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++IS_PATH=1 ++fi ++if [[ "${cword}" == "3" ]]; then ++FCN_RETURN="--force-delete-normal-file" ++fi ++fi ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++if [[ "${cword}" == "3" ]]; then ++FCN_RETURN="" ++fi ++if [[ "${cword}" == "4" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__pulsechip() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 1 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++if [[ "${cword}" == "3" ]]; then ++FCN_RETURN="" ++fi ++if [[ "${cword}" == "4" ]]; then ++FCN_RETURN="" ++fi ++fi ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__pulsenmove() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 1 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++if [[ "${cword}" == "3" ]]; then ++FCN_RETURN="" ++fi ++if [[ "${cword}" == "4" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__pumpprobe() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="0 1" ++fi ++fi ++return 0 ++} ++__quad() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="0 1" ++fi ++fi ++return 0 ++} ++__ratecorr() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__readnrows() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__readout() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 1 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__readoutspeed() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="0 1 108 144 2 full_speed half_speed quarter_speed" ++fi ++fi ++return 0 ++} ++__readoutspeedlist() { ++FCN_RETURN="" ++return 0 ++} ++__rebootcontroller() { ++FCN_RETURN="" ++return 0 ++} ++__reg() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 1 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++if [[ "${cword}" == "3" ]]; then ++FCN_RETURN="" ++fi ++if [[ "${cword}" == "4" ]]; then ++FCN_RETURN="--validate" ++fi ++fi ++return 0 ++} ++__resetdacs() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 1 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++if [[ "${cword}" == "3" ]]; then ++FCN_RETURN="" ++fi ++if [[ "${cword}" == "4" ]]; then ++FCN_RETURN="--validate" ++fi ++fi ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="hard" ++fi ++fi ++return 0 ++} ++__resetfpga() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 1 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="hard" ++fi ++fi ++return 0 ++} ++__romode() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="analog analog_digital digital digital_transceiver transceiver" ++fi ++fi ++return 0 ++} ++__row() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__runclk() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__runtime() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 1 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="ms ns s us" ++fi ++fi ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="ms ns s us" ++fi ++fi ++return 0 ++} ++__rx_arping() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="0 1" ++fi ++fi ++return 0 ++} ++__rx_clearroi() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 1 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="0 1" ++fi ++fi ++return 0 ++} ++__rx_dbitlist() { ++FCN_RETURN="" ++return 0 ++} ++__rx_dbitoffset() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__rx_dbitreorder() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="0 1" ++fi ++fi ++return 0 ++} ++__rx_discardpolicy() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="discardempty discardpartial nodiscard" ++fi ++fi ++return 0 ++} ++__rx_fifodepth() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__rx_frameindex() { ++FCN_RETURN="" ++return 0 ++} ++__rx_framescaught() { ++FCN_RETURN="" ++return 0 ++} ++__rx_framesperfile() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__rx_hostname() { ++FCN_RETURN="" ++return 0 ++} ++__rx_jsonaddheader() { ++FCN_RETURN="" ++return 0 ++} ++__rx_jsonpara() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 1 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++if [[ "${cword}" == "3" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__rx_lastclient() { ++FCN_RETURN="" ++return 0 ++} ++__rx_lock() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="0 1" ++fi ++fi ++return 0 ++} ++__rx_missingpackets() { ++FCN_RETURN="" ++return 0 ++} ++__rx_padding() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="0 1" ++fi ++fi ++return 0 ++} ++__rx_printconfig() { ++FCN_RETURN="" ++return 0 ++} ++__rx_realudpsocksize() { ++FCN_RETURN="" ++return 0 ++} ++__rx_roi() { ++FCN_RETURN="" ++return 0 ++} ++__rx_silent() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="0 1" ++fi ++fi ++return 0 ++} ++__rx_start() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 1 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="0 1" ++fi ++fi ++return 0 ++} ++__rx_status() { ++FCN_RETURN="" ++return 0 ++} ++__rx_stop() { ++FCN_RETURN="" ++return 0 ++} ++__rx_tcpport() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__rx_threads() { ++FCN_RETURN="" ++return 0 ++} ++__rx_udpsocksize() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__rx_version() { ++FCN_RETURN="" ++return 0 ++} ++__rx_zmqfreq() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__rx_zmqhwm() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__rx_zmqip() { ++FCN_RETURN="" ++return 0 ++} ++__rx_zmqport() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__rx_zmqstartfnum() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__rx_zmqstream() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="0 1" ++fi ++fi ++return 0 ++} ++__samples() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__savepattern() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 1 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++IS_PATH=1 ++fi ++fi ++return 0 ++} ++__scan() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="`sls_detector_get daclist | sed -e 's/.*\[\(.*\)\].*/\1/' | sed 's/,//g'`" ++fi ++if [[ "${cword}" == "3" ]]; then ++FCN_RETURN="" ++fi ++if [[ "${cword}" == "4" ]]; then ++FCN_RETURN="" ++fi ++if [[ "${cword}" == "5" ]]; then ++FCN_RETURN="" ++fi ++if [[ "${cword}" == "6" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__scanerrmsg() { ++FCN_RETURN="" ++return 0 ++} ++__selinterface() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="0 1" ++fi ++fi ++return 0 ++} ++__serialnumber() { ++FCN_RETURN="" ++return 0 ++} ++__setbit() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++if [[ "${cword}" == "3" ]]; then ++FCN_RETURN="" ++fi ++if [[ "${cword}" == "4" ]]; then ++FCN_RETURN="--validate" ++fi ++fi ++return 0 ++} ++__settings() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="`sls_detector_get settingslist | sed -e 's/.*\[\(.*\)\].*/\1/' | sed 's/,//g'`" ++fi ++fi ++return 0 ++} ++__settingslist() { ++FCN_RETURN="" ++return 0 ++} ++__settingspath() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++IS_PATH=1 ++fi ++fi ++return 0 ++} ++__signalindex() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 1 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__signallist() { ++FCN_RETURN="" ++return 0 ++} ++__signalname() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 1 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++if [[ "${cword}" == "3" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__sleep() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 1 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++if [[ "${cword}" == "3" ]]; then ++FCN_RETURN="" ++fi ++fi ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++if [[ "${cword}" == "3" ]]; then ++FCN_RETURN="ms ns s us" ++fi ++fi ++return 0 ++} ++__slowadc() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 1 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__slowadcindex() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 1 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__slowadclist() { ++FCN_RETURN="" ++return 0 ++} ++__slowadcname() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 1 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="`sls_detector_get daclist | sed -e 's/.*\[\(.*\)\].*/\1/' | sed 's/,//g'`" ++fi ++fi ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="`sls_detector_get daclist | sed -e 's/.*\[\(.*\)\].*/\1/' | sed 's/,//g'`" ++fi ++if [[ "${cword}" == "3" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__slowadcvalues() { ++FCN_RETURN="" ++return 0 ++} ++__start() { ++FCN_RETURN="" ++return 0 ++} ++__status() { ++FCN_RETURN="" ++return 0 ++} ++__stop() { ++FCN_RETURN="" ++return 0 ++} ++__stopport() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__storagecell_delay() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 1 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="ms ns s us" ++fi ++fi ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++if [[ "${cword}" == "3" ]]; then ++FCN_RETURN="ms ns s us" ++fi ++fi ++return 0 ++} ++__storagecell_start() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__subdeadtime() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 1 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="ms ns s us" ++fi ++fi ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++if [[ "${cword}" == "3" ]]; then ++FCN_RETURN="ms ns s us" ++fi ++fi ++return 0 ++} ++__subexptime() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 1 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="ms ns s us" ++fi ++fi ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++if [[ "${cword}" == "3" ]]; then ++FCN_RETURN="ms ns s us" ++fi ++fi ++return 0 ++} ++__sync() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="0 1" ++fi ++fi ++return 0 ++} ++__syncclk() { ++FCN_RETURN="" ++return 0 ++} ++__temp_10ge() { ++FCN_RETURN="" ++return 0 ++} ++__temp_adc() { ++FCN_RETURN="" ++return 0 ++} ++__temp_control() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="0 1" ++fi ++fi ++return 0 ++} ++__temp_dcdc() { ++FCN_RETURN="" ++return 0 ++} ++__temp_event() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__temp_fpga() { ++FCN_RETURN="" ++return 0 ++} ++__temp_fpgaext() { ++FCN_RETURN="" ++return 0 ++} ++__temp_fpgafl() { ++FCN_RETURN="" ++return 0 ++} ++__temp_fpgafr() { ++FCN_RETURN="" ++return 0 ++} ++__temp_slowadc() { ++FCN_RETURN="" ++return 0 ++} ++__temp_sodl() { ++FCN_RETURN="" ++return 0 ++} ++__temp_sodr() { ++FCN_RETURN="" ++return 0 ++} ++__temp_threshold() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__templist() { ++FCN_RETURN="" ++return 0 ++} ++__tempvalues() { ++FCN_RETURN="" ++return 0 ++} ++__tengiga() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="0 1" ++fi ++fi ++return 0 ++} ++__threshold() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++if [[ "${cword}" == "3" ]]; then ++FCN_RETURN="`sls_detector_get settingslist | sed -e 's/.*\[\(.*\)\].*/\1/' | sed 's/,//g'`" ++fi ++if [[ "${cword}" == "4" ]]; then ++FCN_RETURN="" ++fi ++if [[ "${cword}" == "5" ]]; then ++FCN_RETURN="`sls_detector_get settingslist | sed -e 's/.*\[\(.*\)\].*/\1/' | sed 's/,//g'`" ++fi ++fi ++return 0 ++} ++__thresholdnotb() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++if [[ "${cword}" == "3" ]]; then ++FCN_RETURN="`sls_detector_get settingslist | sed -e 's/.*\[\(.*\)\].*/\1/' | sed 's/,//g'`" ++fi ++if [[ "${cword}" == "4" ]]; then ++FCN_RETURN="" ++fi ++if [[ "${cword}" == "5" ]]; then ++FCN_RETURN="`sls_detector_get settingslist | sed -e 's/.*\[\(.*\)\].*/\1/' | sed 's/,//g'`" ++fi ++fi ++return 0 ++} ++__timing() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="`sls_detector_get timinglist | sed -e 's/.*\[\(.*\)\].*/\1/' | sed 's/,//g'`" ++fi ++fi ++return 0 ++} ++__timing_info_decoder() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="shine swissfel" ++fi ++fi ++return 0 ++} ++__timinglist() { ++FCN_RETURN="" ++return 0 ++} ++__timingsource() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="external internal" ++fi ++fi ++return 0 ++} ++__top() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="0 1" ++fi ++fi ++return 0 ++} ++__transceiverenable() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__trigger() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 1 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__triggers() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__triggersl() { ++FCN_RETURN="" ++return 0 ++} ++__trimbits() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 1 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++IS_PATH=1 ++fi ++fi ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++IS_PATH=1 ++fi ++fi ++return 0 ++} ++__trimen() { ++FCN_RETURN="" ++return 0 ++} ++__trimval() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__tsamples() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__txdelay() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__txdelay_frame() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__txdelay_left() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__txdelay_right() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__type() { ++FCN_RETURN="" ++return 0 ++} ++__udp_cleardst() { ++FCN_RETURN="" ++return 0 ++} ++__udp_dstip() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__udp_dstip2() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__udp_dstlist() { ++FCN_RETURN="" ++return 0 ++} ++__udp_dstmac() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__udp_dstmac2() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__udp_dstport() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__udp_dstport2() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__udp_firstdst() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__udp_numdst() { ++FCN_RETURN="" ++return 0 ++} ++__udp_reconfigure() { ++FCN_RETURN="" ++return 0 ++} ++__udp_srcip() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__udp_srcip2() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__udp_srcmac() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__udp_srcmac2() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__udp_validate() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 1 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__update() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++IS_PATH=1 ++fi ++if [[ "${cword}" == "3" ]]; then ++FCN_RETURN="" ++IS_PATH=1 ++fi ++fi ++return 0 ++} ++__updatedetectorserver() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 1 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++IS_PATH=1 ++fi ++if [[ "${cword}" == "3" ]]; then ++FCN_RETURN="" ++IS_PATH=1 ++fi ++fi ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++IS_PATH=1 ++fi ++fi ++return 0 ++} ++__updatekernel() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 1 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++IS_PATH=1 ++fi ++fi ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++IS_PATH=1 ++fi ++fi ++return 0 ++} ++__updatemode() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__user() { ++FCN_RETURN="" ++return 0 ++} ++__v_a() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__v_b() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__v_c() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__v_chip() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__v_d() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__v_io() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__v_limit() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__vchip_comp_adc() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 1 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++if [[ "${cword}" == "3" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__vchip_comp_fe() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 1 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++if [[ "${cword}" == "3" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__vchip_cs() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 1 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++if [[ "${cword}" == "3" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__vchip_opa_1st() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 1 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++if [[ "${cword}" == "3" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__vchip_opa_fd() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 1 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++if [[ "${cword}" == "3" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__vchip_ref_comp_fe() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 1 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++if [[ "${cword}" == "3" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__versions() { ++FCN_RETURN="" ++return 0 ++} ++__veto() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="0 1" ++fi ++fi ++return 0 ++} ++__vetoalg() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 1 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="10gbe lll none" ++fi ++fi ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="hits raw" ++fi ++if [[ "${cword}" == "3" ]]; then ++FCN_RETURN="10gbe lll none" ++fi ++fi ++return 0 ++} ++__vetofile() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++if [[ "${cword}" == "3" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__vetophoton() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 1 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++if [[ "${cword}" == "3" ]]; then ++FCN_RETURN="" ++fi ++fi ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++if [[ "${cword}" == "3" ]]; then ++FCN_RETURN="" ++fi ++if [[ "${cword}" == "4" ]]; then ++FCN_RETURN="" ++fi ++if [[ "${cword}" == "5" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__vetoref() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++if [[ "${cword}" == "3" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__vetostream() { ++FCN_RETURN="" ++return 0 ++} ++__virtual() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++if [[ "${cword}" == "3" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__vm_a() { ++FCN_RETURN="" ++return 0 ++} ++__vm_b() { ++FCN_RETURN="" ++return 0 ++} ++__vm_c() { ++FCN_RETURN="" ++return 0 ++} ++__vm_d() { ++FCN_RETURN="" ++return 0 ++} ++__vm_io() { ++FCN_RETURN="" ++return 0 ++} ++__zmqhwm() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__zmqip() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++__zmqport() { ++FCN_RETURN="" ++if [[ ${IS_GET} -eq 0 ]]; then ++if [[ "${cword}" == "2" ]]; then ++FCN_RETURN="" ++fi ++fi ++return 0 ++} ++ ++ ++ local FCN_RETURN="" ++ local IS_PATH=0 ++ COMPREPLY=() ++ local OPTIONS_NEW="" ++ words=("${COMP_WORDS[@]}") ++ cword=$COMP_CWORD ++ ++ local cur=${words[cword]} ++ # check the action (get or put) ++ case "${words[0]}" in ++ "sls_detector_get" | "g" | "detg") ++ local IS_GET=1 ++ ;; ++ *) ++ local IS_GET=0 ++ ;; ++ esac ++ ++ # if no command is written, autocomplete with the commands ++ if [[ ${cword} -eq 1 ]]; then ++ ++ case "$cur" in ++ [0-9]*) ++ for i in $SLS_COMMANDS; do ++ SLS_COMMANDS_NEW="${SLS_COMMANDS_NEW} ${cur%%:*}:$i" ++ done ++ COMPREPLY=( $( compgen -W "${SLS_COMMANDS_NEW}" -- "$cur" ) );; ++ *) ++ COMPREPLY=( $( compgen -W "$SLS_COMMANDS -h" -- "$cur" ) );; ++ esac ++ return 0 ++ fi ++ ++ if [[ ${cword} -eq 2 ]] && [[ ${words[1]} == "-h" ]]; then ++ COMPREPLY=( $( compgen -W "$SLS_COMMANDS" -- "$cur" ) ) ++ return 0 ++ fi ++ ++ # if a command is written, autocomplete with the options ++ # call the function for the command ++ ++ if [[ "$SLS_COMMANDS" == *"${words[1]##*:}"* ]]; then ++ __"${words[1]##*:}" ++ fi ++ ++ # if IS_PATH is activated, autocomplete with the path ++ if [[ ${IS_PATH} -eq 1 ]]; then ++ COMPREPLY=($(compgen -f -- "${cur}")) ++ return 0 ++ fi ++ ++ # autocomplete with the options ++ COMPREPLY=($(compgen -W "${FCN_RETURN}" -- "${cur}")) ++ ++ ++ ++} ++ ++complete -F _sd -o filenames sls_detector_get ++complete -F _sd -o filenames g ++complete -F _sd -o filenames detg ++ ++complete -F _sd -o filenames sls_detector_put ++complete -F _sd -o filenames p ++complete -F _sd -o filenames detp ++ ++complete -F _sd -o filenames sls_detector ++complete -F _sd -o filenames det diff --git a/slsDetectorCalibration/jungfrauExecutables/jf_online_display_gui/online_jf.h b/slsDetectorCalibration/jungfrauExecutables/jf_online_display_gui/online_jf.h new file mode 100644 index 000000000..883427d94 --- /dev/null +++ b/slsDetectorCalibration/jungfrauExecutables/jf_online_display_gui/online_jf.h @@ -0,0 +1,1103 @@ +// SPDX-License-Identifier: LGPL-3.0-or-other +// =========================================================================== +// online_jf.h -- merged online Jungfrau display + event finder +// =========================================================================== +// +// This is a rewrite of TWO separate programs into ONE multithreaded process: +// +// onlinedisp_zmq.cpp Qt5 GUI + ROOT plots, subscribed to the filter +// jf_filter.cpp ZMQ sub -> pedestal subtract -> threshold gate -> pub +// jf_event_finder_gui.cpp Qt control window for that filter +// +// The intermediate ZMQ hop between filter and display is gone. A single +// subscriber reads slsReceiver's stream, the gate decides pass/drop on every +// frame, and only passing frames are handed to the display/analysis stage. +// +// Thread map +// ---------- +// main / Qt thread : QApplication::exec, all widgets, button handlers +// acq thread : zmq_recv(header + data), gate counters, optional ZMQ +// republish, hand passing frames to the frame mailbox +// analysis thread : pedestal subtraction, ADC/gain images, and the ONLY +// thread that FILLS the source ROOT histograms +// ROOT thread : canvas painting + gSystem->ProcessEvents; executes the +// user ROOT command queue, paints display clones +// +// Invariants carried over from the originals +// ------------------------------------------ +// * ROOT graphics (Draw/Update/ProcessEvents) run ONLY on the ROOT thread. +// Every other thread posts RootCmd entries. +// * The source histograms (his*, hchip) are filled ONLY by the analysis +// thread; the ROOT thread paints display clones whose bins are copied +// once per redraw. Never paint an object that is being filled. +// * Pedestals are immutable once published (shared_ptr swap), so loading a +// file or acquiring a live pedestal no longer needs stop()/load()/start(). +// * The gate threshold and the display's photon threshold are DIFFERENT +// quantities (they collided as one global named "threshold" only because +// they used to live in two processes). +// +// Argument compatibility (superset of both originals) +// --------------------------------------------------- +// jf_online_display_gui [rx_port] [gate_threshold] [min_pixels] +// [pede_file] [--pub PORT] [--contig] [--no-gate] +// energy < 0 -> raw ADC map (no photon counting), as onlinedisp_zmq. +#ifndef ONLINE_JF_H +#define ONLINE_JF_H + +#define SLS_DETECTOR_JSON_HEADER_VERSION 0x5 + +/* ------------------------------------------------------------------ std */ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#include // json header inside the zmq stream + +/* ----------------------------------------------------------------- ROOT */ +#include "TCanvas.h" +#include "TH1F.h" +#include "TF1.h" +#include "TH1I.h" +#include "TH2F.h" +#include "TMath.h" +#include "TFile.h" +#include "TStyle.h" +#include "TBox.h" +#include "TSystem.h" +#include "TTimer.h" +#include "TProfile.h" +#include "TColor.h" +#include "TList.h" +#include "TPad.h" +#include + +/* ------------------------------------------------------------------ Qt5 */ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +using namespace std; // legacy style of the original sources +using namespace std::chrono; + +/* ------------------------------------------------------------- geometry */ +#define PI 3.14159265 +#define OFFSET 0 +#define NBIN 500 +#define MIN_POS -500.5 // 400.5 +#define MAX_POS 8499.5 //-100.5 + +// A Jungfrau module frame: 1024 x 512 = 524288 pixels (16 bit). +#define NCH 524288 +// The raw module geometry of one UDP port. This is fixed and independent of +// nx/ny, which under JFSTRX hold the strixel *display* geometry: the data, +// gate, ROI and HDF5 paths always work in these raw coordinates. +constexpr int kRawWidth = 1024; +constexpr int kRawHeight = 512; +static_assert(kRawWidth * kRawHeight == NCH, "raw geometry vs NCH"); +// Legacy pedestal-file array size: 3 arrays of 2*NCH floats each +// (the factor 2 is a leftover of an early half-module layout). +#define JF_PEDE_ARRAY_FLOATS (2 * NCH) +#define PEDEFNAME "current_pede.dat" +#define DEFAULT_RX_PORT 30001 +#define DEFAULT_N_PEDE_FRAMES 50 +// Multi-interface mode: slsReceiver with N UDP interfaces ("threads") +// publishes one ZMQ stream per interface on consecutive ports, each carrying +// one Y-slab of the module: +// JungfrauData::nPixelsX = 256*4 = 1024 +// JungfrauData::nPixelsY = (256*2)/numUDPInterfaces -> 256 for N=2 +// so 30001+30002 delivers two 1024x256 halves that stack into 1024x512. +#define JF_MAX_PORTS 8 + +/* --------------------------------------------------------------- config */ +struct Config { + // The photon map threshold is a GUI control in ADU (default 150); the + // photon multiplicity used when filling the map is derived from it + // (photon peak ~= 2 x threshold), exactly as it used to be derived from + // the argument. + int phene = 300; // photon peak in ADC = 2 x the ADU threshold + bool dophotonmap = true; // false -> his3000 shows raw ADC + bool rawMap = false; // --raw-map: show raw ADC instead of counts + std::string rxHost; // slsReceiver host + // ports, ordered BOTTOM -> TOP in the assembled image. One entry is the + // classic single-interface mode; "30001+30002" selects two interfaces. + std::vector rxPorts{DEFAULT_RX_PORT}; + // Slab placement per interface: 0 = unknown (order of the '+' list), + // 1 = bottom half, 2 = top half. Set by the ":bottom"/":top" suffix of a + // port, which is what makes a single interface placeable: "30027:top". + std::vector rxSlab; + float threshold = 100.0f; // GATE threshold (pede-subtracted ADC) + uint64_t minPixels = 5; // GATE min pixels above threshold + bool contiguous = false; // GATE contiguity proxy + bool hotSuppress = false; // GATE hot pixel suppression + double hotFraction = 0.10; // fraction of frames that makes a pixel hot + bool gateEnabled = false; // default: gate off (passthrough); --gate enables + std::string pedeFile = "./current_pede.dat"; + // calibration for the PH spectra (keV axes); empty = ADU only + std::string gainMapFile; + bool gainMapExplicit = false; + // Gate-ROI list: a single small file in the program folder, rewritten on + // every save/load/delete. See roiList*() below. + std::string roiFile = "./roi_list.dat"; + // directory and file-name base for the HDF5 ROI files + JSON sidecars + std::string h5Dir = "."; + std::string h5Base = "jfroi"; + // list of previously used destinations (directory + base), newest first + std::string saveListFile = "./save_dest_list.dat"; + bool pedeExplicit = false; // user named the file explicitly + int pubPort = 0; // 0 -> no republish of gated frames + int pedeFrames = DEFAULT_N_PEDE_FRAMES; + bool printCounters = false; // print the old CLI counter line on stdout + int decimate = 1; // keep 1 frame in N (1/2/4/8), operator choice + bool autoDecimate = false; // let the ladder follow a real backlog + bool acquirePede = false; // start a live pedestal acquisition at boot + bool startSave = false; // press Save at startup (--start-save) + bool applyGain = false; // gain correction on at startup (--apply-gain) + uint64_t saveBudget = 0; // 0 = keep the GUI default (--save-budget) + // Analysis worker threads for the per-pixel loops. + // 0 = auto (cores/4, clamped to 1..8); 1 = single threaded. + // The loops are pure per-pixel work on disjoint ranges with no ROOT + // access, so they scale across cores; see the README. + int analysisWorkers = 0; + // Receive high-water mark per interface. Bounded on purpose: the program + // consumes ~1.2-1.3 kframes/s, so a deep queue would only buy latency and + // make the catch-up skip expensive. Frames beyond this are dropped by + // ZMQ before they cost us anything. + int rxHwm = 64; + // Optional storage-cell selection at startup (--sc N, 0..15; -1 = all) + int scFilter = -1; + // Optional gate ROI at startup (--gate-roi X Y W H), in DATA coordinates: + // row 0 is the BOTTOM row, same as the ROI list. gateRoiX < 0 = unset. + int gateRoiX = -1, gateRoiY = 0, gateRoiW = 0, gateRoiH = 0; +}; + +extern Config g_cfg; + +/* ------------------------------------------------------ pedestal tracking */ +// The pedestals drift a little, so while the beam is off (the signal gate is +// dropping almost everything) a small fraction of each dropped frame is fed +// into a per-pixel running average, and the pedestal actually used is replaced +// when that average has moved far enough. Defaults: +// * a sample of 0.2 % of the pixels of every dropped frame, +// * per-pixel exponential average with a 10 M *pixel-sample* window +// (10 M / NCH ~ 19 updates per pixel, so the weight per update is +// NCH / 10 M ~ 0.05), +// * only while the signal gate drops more than 90 % of the frames reaching +// it, and while "Gate enabled" is on, +// * the used pedestal is replaced when the largest per-pixel difference +// exceeds 5 ADU - at most once per 10 s, and at least once per 10 min, +// * the HDF5 file gets a pedestal image every 10 min while tracking is on. +#define PEDE_TRACK_FRACTION 0.002 +#define PEDE_TRACK_WINDOW 1.0e7 +#define PEDE_TRACK_MAXDIFF 5.0f +#define PEDE_TRACK_MIN_PERIOD_MS 10000 +#define PEDE_TRACK_MAX_PERIOD_MS 600000 +#define PEDE_TRACK_H5_PERIOD_MS 600000 +#define PEDE_TRACK_DROP_RATE 0.90 + +struct PedeSet; // defined with the pedestal store below + +extern std::atomic gPedeTracking; // "Pedestal tracking" button +extern std::atomic gPedeTracked; // true once the pedestal was replaced + +struct PedeTrackStats { + bool on = false; + bool tracked = false; // the pedestal in use came from the tracker + uint64_t samples = 0; // pixel samples fed into the average + uint64_t updates = 0; // times the used pedestal was replaced + double maxDiff = 0.0; // largest |average - used| in ADU + int64_t sinceUpdateMs = 0; +}; +PedeTrackStats pedeTrackerStats(); +// Fraction of the frames reaching the signal gate that it dropped, over the +// last 1 Hz window (falls back to the held value, then the cumulative one, so +// a quiet window does not read as "no drops"). +double pedeTrackSignalDropRate(uint64_t passCur, uint64_t dropCur, + uint64_t passTotal, uint64_t dropTotal); +// Called by the acq thread for a frame the *signal* gate dropped. Cheap when +// tracking is off or when the drop rate is below the threshold. +// The 5 ADU test looks only at the gate ROI (roiSet == false -> whole frame); +// the average itself is still accumulated over the whole frame. +void pedeTrackerFeed(const short *frame, uint64_t nPixels, const PedeSet *peds, + double signalDropRate, int roiX0, int roiY0, int roiX1, + int roiY1); +// Re-primes the running average from the pedestal now in use (called whenever a +// pedestal is installed, so a fresh file starts from itself). +void pedeTrackerReset(); + +/* ------------------------------------------------------------ gain map */ +// Calibration: the gain-map file holds SIX 1024x512 images of doubles, in the +// order g0, g1, g2, hg0, hg1, hg2. In normal mode g0 holds ADU/keV per +// pixel, so a pedestal-corrected ADC value becomes +// keV = ADU / g0[pixel] +// Only the PH spectra are converted; the ADC image, the photon map and the +// HDF5 writer keep working in ADU. KEV_NOMINAL_ADU gives the keV axes the +// same span as the ADU ones (the operator's PH window divided by 40), so the +// two sets of spectra show the same physical region. +#define JF_GAINMAP_IMAGES 6 +#define KEV_NOMINAL_ADU 40.0 +#define JF_GAINMAP_PIXELS (1024 * 512) +struct GainMap { + std::vector img[JF_GAINMAP_IMAGES]; + GainMap() { + for (int i = 0; i < JF_GAINMAP_IMAGES; i++) + img[i].assign(JF_GAINMAP_PIXELS, 0.0); + } + // the map used for the conversion (normal mode) + const double *g0() const { return img[0].data(); } +}; +class GainMapStore { + public: + static GainMapStore &instance(); + // snapshot; empty shared_ptr means "no calibration, spectra stay in ADU" + std::shared_ptr get() const; + void install(const std::shared_ptr &m, const std::string &path); + bool loaded() const; + std::string path() const; + + private: + mutable std::mutex mtx_; + std::shared_ptr cur_; + std::string path_; +}; +// Reads the 6 x 1024 x 512 doubles and installs them. Returns false + error +// when the file is missing or has the wrong size. +bool gainMapLoadFile(const std::string &path, std::string &error); +// true once a usable map is installed (the keV spectra are filled and drawn) +bool gainMapLoaded(); +// Which of the two PH sets the ROOT thread paints: false = ADU (A4/A7), +// true = keV (A8/A9). Both sets are always accumulated; this only selects +// what is on screen, and it falls back to ADU when no gain map is loaded. +extern std::atomic kevSpectra; + +/* ------------------------------------------------------- display state */ +// defined in online_jf_core.cpp +extern short *hchptr; // cumulative photon counted map +extern float factor; +#define PHOTON_THRESHOLD_DEFAULT 150.0f // ADU, Virtual photon counting control +#define PHOTON_THRESHOLD_KEV_DEFAULT 4.0f // keV, same control with gain on +// Photon map for its own Qt window: how many analysed frames between publishes +// (default 2000), and whether it keeps adding up (off by default, so each image +// shows the photons counted since the previous one). +extern std::atomic gPmapEvery; +extern std::atomic gPmapCumulative; +// Saving mode: 0 = gate-passed frames, 1 = the virtual photon counting maps. +// gPmapSaveEvery is their cadence in analysed frames (minimum 200). +extern std::atomic gSaveMode; +extern std::atomic gPmapSaveEvery; +// ---- hot pixel mask ------------------------------------------------------- +// Pixels whose photon-map value is above a threshold, marked by the operator +// from the GUI. The mask is a shared immutable vector, so the GUI can swap a +// new one in while the acquisition and analysis threads read the current one. +// Masked pixels are dropped from the gate, the PH spectra, the photon map and +// the display replacement happens in the ADC image. +void hotSetMaskFromMap(const float *map, uint64_t n, double threshold); +void hotClearMask(); +uint64_t hotPixelCount(); +// Shared snapshot: load once per frame, then index it (avoids a load per pixel). +std::shared_ptr> hotMaskSnapshot(); +bool hotMaskActive(); // a mask exists and gate suppression is on + +void pmapSaveReset(); + +// One photon map on its way from the analysis (which counts the photons) to the +// acq thread (which owns the saver). +struct PmapSlot { + std::mutex mtx; + std::vector map; // NCH, photons per pixel + uint64_t frames = 0; // analysed frames counted into this map + uint64_t seq = 0; + bool ready = false; +}; +// Set when the operator confirms a gate-criterion change while a run is +// writing: the saved file keeps the criterion it started with, so its JSON has +// to say that it was moved. +extern std::atomic gGateChangedDuringSave; +// Alignment load shedding (multi-interface): keep 1 frame out of g_keepDiv, +// chosen by the frame number so the two interfaces drop the SAME frames. 1 = +// keep everything (the default); 2, 4, 8 = drop 1/2, 3/4, 7/8. +extern std::atomic g_keepDiv; +extern std::atomic g_autoDecimate; // ladder enabled (off: 1/N is manual) +extern float g_pheneThreshold; // photon-map threshold in ADU (GUI, default 150) +// Same control while the gain correction is on: the counting value is then +// adcpedecorr / ADU-per-keV, so the threshold means keV (default 4). Both are +// kept, and switching the gain swaps which one the spinbox shows. +extern float g_pheneThresholdKev; + +extern std::atomic gain_flag; +extern std::atomic dophotonmap; +extern std::atomic goout; // 1 = process, 0 = paused +extern std::atomic HDraw_every; +// While the gate passes frames slowly, "every N frames" would freeze the image, +// so a frame is also displayed when the previous one is older than this. +#define DISPLAY_FLOOR_MS 250 +extern std::atomic gImagesShown; // images handed to the Qt view // main image every N frames +// ROOT redraws of the chip spectra every N-th redraw (they are the most +// expensive canvas; 1 = every redraw) +extern std::atomic chipUpdateEvery; +extern std::atomic rootUpdateMs; // ROOT redraw period +// Gain-1 / gain-3 pedestal offsets used by the correction. The GUI controls +// for them were removed on request, so they are constant 0 for now; they are +// kept because the planned AFC/gain-split work needs per-gain offsets. +extern std::atomic G1Poffset; +extern std::atomic G2Poffset; +// Axis ranges (Set Ranges dialog), one pair per display: +// adcmin/adcmax colour scale of the ADC image (the Qt "main plot") +// pmmin/pmmax colour scale of the ROOT 2D map (canvas A5) +// chipxmin/max shared x window of the spectra (A4 and the ROI spectrum A7) +// The dialog opens on the scale each display is using right now (it can be +// dragged on the image colour bar or on the ROOT canvas) and applies only what +// the operator actually changed. +extern std::atomic adcmin, adcmax, pmmin, pmmax, chipxmin, chipxmax; +extern std::atomic fixranges; // a fixed ROOT range is in force (Reset + // Axis releases it and it auto-scales) +extern std::atomic framesinstream; // frames reaching the display +extern std::atomic gFramesForRoot; // frames since last ROOT redraw + +// analysis-thread accumulators (single owner: the analysis thread) +extern short image_data[JF_PEDE_ARRAY_FLOATS]; +extern float adc_image[NCH]; +extern float gain_image[NCH]; +// legacy gain map: never initialised to anything but 0 in the original +// sources, so the "gain correction" toggle multiplies by zero for gain 0. +extern float fgaind[JF_PEDE_ARRAY_FLOATS]; +extern int nx, ny; + +// The GATE ROI currently shown on screen, in DATA coordinates: x grows to the +// right, y grows upwards, (0,0) is the BOTTOM-LEFT pixel. This is the one and +// only rectangle the operator sees: the yellow box on the ADC image, the box +// on the ROOT photon map and the ROI spectra all read it. Mirrored once per +// analysed frame by the analysis thread from the GateEngine snapshot. +// ROIactive == false means "no ROI set"; the rectangle is then the full frame +// and nothing is drawn. +extern std::atomic ROIxmin, ROIxmax, ROIymin, ROIymax; +extern std::atomic ROIactive; +// The ROI the RECEIVER is configured with, from the "rx_roi" array in the ZMQ +// JSON header ([xmin, xmax, ymin, ymax], raw port coordinates). It is NOT the +// gate ROI and is drawn as a separate RED box on the ADC image; rxRoiValid is +// false until a non-degenerate one has been seen. +extern std::atomic rxRoiXmin, rxRoiXmax, rxRoiYmin, rxRoiYmax; +extern std::atomic rxRoiValid; + +// cross-thread reset / redraw requests +extern std::atomic gSoftResetPending; // windowed TvsB/LvsR reset +extern std::atomic gRedrawRequest; // force a ROOT redraw +extern std::atomic gFrameCountReset; // restart display frame count +// "Reset His": the GUI sets this and the ANALYSIS thread performs the reset at +// the top of its next frame, while it already holds gHistoMtx. The ROOT thread +// must never wait for that lock - under a heavy stream (JFSTRX fills) it can +// starve, which is what made the reset take tens of seconds. +extern std::atomic gResetHisPending; +// "No pede": ignore the loaded pedestal everywhere - the display, the photon +// map, the spectra, the event finder and the ROI save all work on raw ADC. +// Set by the button in the Pedestal panel; drawn as a bypass in the flow. +extern std::atomic gNoPede; +// Protects the source histograms against a Reset() racing the analysis +// thread's per-frame Fill(). copyBins() is deliberately NOT protected: the +// original sources accepted a torn read during a redraw, and taking the lock +// for a 524288-bin copy would stall the analysis thread every redraw. +extern std::mutex gHistoMtx; + +/* ------------------------------------------------------- ROOT objects */ +// defined in online_jf_root.cpp +extern TApplication *rootapp; +extern TCanvas *A2, *A3, *A4, *A5, *A6, *A7; +extern TPad *p1, *p2, *p3, *p4, *p5, *p6; +extern TH1I **hchip; // 8 chip / gain-group spectra +extern TH1I *hroi; // one spectrum over the gate-ROI pixels only +// the same two spectra again in keV (canvases A8/A9); they are filled and +// drawn only when a gain map is loaded +extern TH1I **hchipKev; +extern TH1I *hroiKev; +extern TH1I *hproj, *hchcum; +extern TH2F *his1000, *his1001, *his1002, *his1060, *his1061, *his1062; +extern TH2F *his2000, *his3000, *his4500, *hisLvsR; +extern TBox *box; + +// display clones painted by the ROOT thread (single-owner objects) +extern TH2F *disp3000, *disp4500, *dispLvsR; +extern TH1I *dispChip[8]; +extern TH1I *dispRoi; +extern TH1I *dispChipKev[8]; +extern TH1I *dispRoiKev; +extern TH2F *disp1000, *disp1001, *disp1002, *disp1060, *disp1061, *disp1062; + +// ROOT thread control + command queue +enum class RootCmdType { + None, + ResetHis, + ResetAxes, + // palette changes are applied to the ROOT gradient table AND to the fast + // image widgets, so both show the same colours + PaletteColor, + PaletteBW1, + PaletteBW2, + Zoom, + SetChipRange, + // colour scale of the ROOT 2D map (canvas A5): a, b = min, max + SetMapRange, + // show (a = 1) or hide (a = 0) every ROOT canvas: the operator can start + // with them hidden and bring them back from the Display panel + ShowPlots +}; + +// One palette definition drives both the ROOT colour table and the 256-entry +// lookup table used by the fast ADC/photon image widgets. +// The palettes offered by the image scale panel. Color / BW1 / BW2 are the +// original three (kept first: the b / Shift+B / c shortcuts use those indices); +// the rest are the matplotlib family that is useful for detector images - +// perceptually uniform (viridis, plasma, inferno, magma, cividis), turbo, +// hot, grey, and the diverging maps for pedestal-corrected data that can go +// negative. +enum class Palette { + Color, BW1, BW2, + Turbo, Viridis, Plasma, Inferno, Magma, Cividis, + Hot, Gray, Gray_r, + Coolwarm, Bwr, Seismic, RdBu, YlGnBu, Sunset, + // not in the chooser: the gain map has four valid values (the gain bits + // 0..3) and gets a fixed, calm blue/green/yellow/red code + Gain4 +}; +const char *paletteName(Palette p); // label for the scale panel +void loadRootPalette(Palette p); // ROOT thread only +const QRgb *paletteLut(Palette p); // static table, safe from any thread +struct RootCmd { + RootCmdType type = RootCmdType::None; + double a = 0, b = 0, c = 0, d = 0; // zoom coords / chip range +}; +void pushRootCmd(const RootCmd &cmd); +// like pushRootCmd, but replaces a pending command of the same type instead +// of queueing another one (used for the continuous zoom stream) +void pushRootCmdCoalesced(const RootCmd &cmd); +void requestHistoReset(); // safe "Reset His": analysis thread clears sources +void forceRootRedraw(); +void startRootThread(); +void stopRootThread(); + +/* root plotting helpers (ROOT thread only) */ +void historesetSources(); // takes gHistoMtx itself +void historesetSourcesLocked(); // gHistoMtx already held (analysis thread) +void axisreset(); + +void Plot1DHistos(); +void Plot2DHistos(); +// the same two spectra canvases in keV (A8/A9), no-ops without a gain map +void Plot1DHistosKev(); +void PlotRoiHistosKev(); +// the per-chip spectra of the gate-ROI pixels only (canvas A7); same pad +// layout as Plot1DHistos so the two can be compared pad by pad +void PlotRoiHistos(); +// runs the ROOT GUI event loop once; called inside long redraws so the +// canvases stay interactive even while a redraw is in progress +void serviceRootEvents(); +void drawRoiBox(); +void printhelp(); + +/* ------------------------------------------------------------ pedestal */ +// Immutable pedestal snapshot. g0 = gain 0 (also the fallback for every +// gain when hasAll is false); g1/g2 = gain 1 / gain 3 arrays. +struct PedeSet { + std::vector g0, g1, g2; + bool hasAll = false; // true only when all three arrays came from a file + PedeSet() + : g0(JF_PEDE_ARRAY_FLOATS, 0.0f), g1(JF_PEDE_ARRAY_FLOATS, 0.0f), + g2(JF_PEDE_ARRAY_FLOATS, 0.0f) {} +}; + +class PedestalStore { + public: + static PedestalStore &instance(); + // snapshot; empty shared_ptr means "no pedestals, run on raw values" + std::shared_ptr get() const; + void install(const std::shared_ptr &set); + bool loaded() const; + + private: + mutable std::mutex mtx_; + std::shared_ptr cur_; +}; + +// Reads the 3-array legacy layout into a new set and installs it. +// Returns false + error when the file is missing / has the wrong size. +// ---- gate-ROI list ------------------------------------------------------- +// One entry of the saved gate-ROI list. Half-open rectangle in data +// coordinates (row 0 at the bottom), w/h are the size in pixels. +struct RoiEntry { + int x = 0, y = 0, w = 0, h = 0; + int64_t usedMs = 0; // epoch ms of the last save/load (ordering key) +}; +// Reads the list, sorted most-recently-used first. +std::vector roiListLoad(); +// Adds the rectangle to the list (or refreshes its timestamp if it is already +// there) and writes the file back. Returns false on I/O failure. +bool roiListUpsert(int x, int y, int w, int h); +// Removes the rectangle and writes the file back. +bool roiListRemove(int x, int y, int w, int h); + +// ---- previously used save destinations ----------------------------------- +struct SaveDest { + std::string dir; // output directory + std::string base; // file-name base + int64_t usedMs = 0; +}; +// Same idea as the ROI list: one small file, newest used first. +std::vector saveDestListLoad(); +bool saveDestListUpsert(const std::string &dir, const std::string &base); +bool saveDestListRemove(const std::string &dir, const std::string &base); + +bool pedeLoadFile(const std::string &path, std::string &error); +// Writes the currently installed set in the legacy 3-array layout. +bool pedeSaveFile(const std::string &path, std::string &error); +bool pathExists(const std::string &path); + +/* ---------------------------------------------------------------- gate */ +// Event-finder gate. One instance; the acq thread calls evaluate() for every +// received frame, the Qt thread reads snapshot() and changes parameters. +class GateEngine { + public: + struct Counters { + uint64_t framesIn = 0; + uint64_t framesPass = 0; + uint64_t framesDrop = 0; + uint64_t framesScDrop = 0; // rejected by the storage-cell filter + uint64_t pixelsAbove = 0; + uint64_t framesInCur = 0; + uint64_t framesPassCur = 0; + uint64_t framesDropCur = 0; + uint64_t framesScDropCur = 0; + uint64_t pixelsAboveCur = 0; + int lastSc = -1; // storage cell of the last frame seen (-1 unknown) + int scFilter = -1; // -1 = all storage cells + double rateIn = 0; + double ratePass = 0; + double rateInMBs = 0; + double ratePassMBs = 0; + double dropFrac = 0; + bool connected = false; + bool pedeLoaded = false; + std::string lastError; + }; + + void setEnabled(bool on); + bool enabled() const { return enabled_.load(); } + void setThreshold(float adc); + void setMinPixels(uint64_t n); + void setContiguous(bool on); + // ---- hot pixel suppression ------------------------------------------- + // Pixels that are above the threshold in a large fraction of the frames + // (hot pixels, charged traps) are learned in a table and excluded from the + // gate, both from the count and from the contiguity search. + void setHotSuppress(bool on); + bool hotSuppress() const; + // The mask comes from the photon map: every pixel whose accumulated map + // value is above 'threshold' is marked hot. Masked pixels are excluded + // from the gate count and from the contiguity search; the display replaces + // them (local pedestal average in the raw view, 0 in the corrected view + // and in the photon map) and the PH plots skip them. + uint64_t hotPixels() const; // delegated to the shared mask + // Storage-cell selection: only frames acquired in cell 'sc' (0..15, from + // bits 8-11 of the header's detSpec3) are passed to the display and the + // analysis; -1 = all of them. Checked before the pixel work, so filtered + // frames cost nothing. + void setScFilter(int sc); + int scFilter() const { return scFilter_.load(); } + // Restrict the gate search to a rectangle of the assembled frame, in + // pixel coordinates with row 0 at the BOTTOM (the display's data order). + // Half-open [x0,x1) x [y0,y1); an unusable rectangle clears the ROI. + // This is the "gate ROI" chosen from the ADC zoom, not the receiver ROI + // (detSpec1) that the photon map draws in red. + void setRoi(int x0, int y0, int x1, int y1); + void clearRoi(); + bool roiActive() const { return roiOn_.load(); } + // The ROI rectangle and the decision to gate on it are separate: selecting + // a ROI ("Select ROI" / Load ROI) only stores it, "ROI only" switches the + // restriction on, and the gate then uses whatever is current. + bool roiSet() const { return roiSet_.load(); } + // live settings - used when a file records what the gate is doing + float threshold() const { return threshold_.load(); } + uint64_t minPixels() const { return minPixels_.load(); } + bool contiguous() const { return contiguous_.load(); } + void setRoiOnly(bool on) { roiOn_.store(on && roiSet_.load()); } + void roiSnapshot(int &x0, int &y0, int &x1, int &y1) const; + void resetCounters(); + Counters snapshot() const; + + // ---- acq-thread side ------------------------------------------------ + // Decides whether a frame passes. Returns true when it must be + // forwarded; 'above' receives the number of pixels above threshold + // (only computed when the gate is enabled, else 0). + // 'sc' is the storage cell of this frame (-1 when the header did not + // carry one); it is filtered before anything else is looked at. + // scDropped (optional) tells the caller that the frame was rejected by the + // storage-cell filter rather than by the signal gate + bool evaluate(const short *frame, uint64_t nPixels, int sc, + const PedeSet *peds, int g1off, int g2off, uint64_t &above, + bool *scDropped = nullptr); + void noteReceived(uint64_t bytes, bool broken); + void noteForwarded(uint64_t bytes); + void setConnected(bool on); + void setLastError(const std::string &msg); + + private: + uint64_t countPixelsAbove(const short *frame, uint64_t nPixels, + const PedeSet *peds, int g1off, + int g2off) const; + bool hitsClustered(const short *frame, uint64_t nPixels, + const PedeSet *peds, int g1off, int g2off) const; + + + std::atomic enabled_{true}; + std::atomic contiguous_{false}; + // hot pixel table (written on the acquisition thread only; the atomics are + // for the GUI) + std::atomic hotSuppress_{true}; + // storage-cell filter (-1 = all) and the cell of the last frame seen + std::atomic scFilter_{-1}; + std::atomic lastSc_{-1}; + // gate ROI (see setRoi); read once per frame by the acq thread + std::atomic roiOn_{false}; + std::atomic roiSet_{false}; // a ROI rectangle exists + std::atomic roiX0_{0}, roiY0_{0}, roiX1_{1024}, roiY1_{512}; + std::atomic threshold_{100.0f}; + std::atomic minPixels_{5}; + + struct AtomCounters { + std::atomic framesIn{0}; + std::atomic framesPass{0}; + std::atomic framesDrop{0}; + std::atomic framesScDrop{0}; // storage-cell filter + std::atomic pixelsAbove{0}; + std::atomic bytesIn{0}; + std::atomic bytesOut{0}; + }; + AtomCounters c_, cCur_; + // 1 Hz smoothed rates (written by the acq loop, read by the GUI) + struct RateAtoms { + std::atomic rateIn{0.0}; + std::atomic ratePass{0.0}; + std::atomic rateInMBs{0.0}; + std::atomic ratePassMBs{0.0}; + }; + RateAtoms r_; + std::atomic connected_{false}; + mutable std::mutex errMtx_; + std::string lastError_; + + friend class Pipeline; +}; + +/* ------------------------------------------------------------- mailbox */ +// Single-slot "latest frame wins" mailbox: acq -> analysis. Overwriting the +// slot is the merged equivalent of the ZMQ receive-high-water-mark drops of +// the old chain (the display always works on the freshest frame, and the gate +// counters stay exact because they are updated before the hand-off). +struct FrameMailbox { + std::mutex mtx; + std::condition_variable cv; + std::vector buf; + size_t len = 0; // valid shorts in buf + bool have = false; + uint64_t seq = 0; + uint64_t pushed = 0; + uint64_t dropped = 0; + + void publish(const short *data, size_t nBytes); + // waits up to 100 ms; false when nothing was available + bool waitTake(std::vector &out, size_t &lenOut, uint64_t &seqOut, + const std::atomic &running); +}; + +// Image hand-off: analysis -> Qt timer. The Qt thread copies the buffers +// into the widgets' own storage, so the widgets never read a live buffer. +#ifdef JFSTRX +// Strixel ADC panels, index order: +// 0 = chip1 group1, 1 = chip1 group2, 2 = chip1 group3, +// 3 = chip6 group1, 4 = chip6 group2, 5 = chip6 group3. +// The GUI arranges them like the original ROOT ADC canvas (left column +// chip1 g3/g2/g1, right column chip6 g1/g2/g3). +constexpr int kNumAdcPanels = 6; +constexpr int kAdcPanelW[kNumAdcPanels] = {79, 47, 59, 79, 47, 59}; +constexpr int kAdcPanelH[kNumAdcPanels] = {165, 320, 476, 165, 320, 476}; +#endif + +struct ImageMailbox { + std::mutex mtx; + std::vector adc, gain; // always raw 1024x512 (ROI selection uses it) + // the photon map, published every gPmapEvery frames + std::vector photon; + bool photonReady = false; + uint64_t photonSeq = 0; + bool ready = false; + uint64_t seq = 0; +#ifdef JFSTRX + // mapped strixel ADC groups for the separate six-panel window + std::array, kNumAdcPanels> panels; + bool panelsReady = false; +#endif +}; + +// ---- HDF5 ROI save ------------------------------------------------------- +// Per-frame header values, written into the same parameter datasets as the +// receiver (see online_jf_h5.cpp). +struct SavedFrameHeader { + uint64_t frameNumber = 0; + uint32_t expLength = 0; + uint32_t packetNumber = 0; + uint64_t detSpec1 = 0; + uint64_t timestamp = 0; + uint16_t modId = 0, row = 0, column = 0, detSpec2 = 0, detSpec4 = 0; + uint32_t detSpec3 = 0; + uint8_t detType = 0, version = 0; +}; + +struct GateCriteria { + bool enabled = true; + float threshold = 0.0f; + uint64_t minPixels = 0; + bool contiguous = false; + bool roiActive = false; + bool noPede = false; // pedestal subtraction disabled (raw ADC) + int roiX = 0, roiY = 0, roiW = 0, roiH = 0; +}; + +struct RunStats { + uint64_t resync = 0, behind = 0, unpaired = 0; + uint64_t displayFrames = 0, displayDropped = 0; +}; + +struct StreamInfo { + int port = 0; + std::string state; + uint64_t frames = 0, lastFrame = 0; +}; + +// Decimated ROI writer: one HDF5 file per run (receiver-compatible layout, +// ROI crop, gate-passed frames only, slice 0 = pedestal) plus a JSON sidecar. +// A bounded queue decouples the acq thread from the writer; overflow is +// counted as dropped and reported. +class RoiSaver { + public: + struct StartInfo { + int x = 0, y = 0, w = 0, h = 0; // ROI in data coordinates + uint64_t maxFrames = 0; // 0 = unlimited + std::string dir = "."; // output directory + std::string baseName = "jfroi"; // file-name base (receiver "prefix") + // false: raw 16-bit words in /data with the pedestal image as slice 0 + // true : pedestal-corrected float32 in /data (no slice 0) and the + // pedestal image in the separate "pedestal data" dataset + bool corrected = false; + std::vector pedestal; // w*h gain-0 pedestal (may be empty) + // full pedestal set + gain offsets used for the correction + std::shared_ptr peds; + bool useGain = false; + int g1off = 0, g2off = 0; + // Refresh the on-disk HDF5 (exact extents + flush) and rewrite the JSON + // sidecar atomically every this many ms while the save runs, so a + // snapshot on disk is always clean and a crash loses at most one + // interval. 0 disables the periodic checkpoint (final state at stop). + int checkpointMs = 30000; + // virtual photon counting save: write the maps instead of the frames + bool photonMode = false; + int photonEvery = 2000; // analysed frames per saved map + double photonThreshold = 150.0; // photon threshold, in photonKev units + bool photonKev = false; // true: photonThreshold is keV + GateCriteria gate; // criteria in force at start + GateEngine::Counters gateAtEnd; // fallback values for the JSON + RunStats stats; + std::vector streams; + std::string gateJson; // gate criteria as a JSON object + // Called by the writer thread just before the JSON sidecar is written, + // so the reported statistics are the exact end-of-run ones. + std::function &)> + statsProvider; + }; + struct Status { + bool running = false; + uint64_t saved = 0, dropped = 0; + uint64_t pmaps = 0; // maps written (photon-map mode) + bool photonMode = false; // which of the two counters applies + std::string h5Path, jsonPath, stopReason, lastError; + }; + + RoiSaver(); + ~RoiSaver(); + RoiSaver(const RoiSaver &) = delete; + RoiSaver &operator=(const RoiSaver &) = delete; + + bool start(const StartInfo &info, std::string &error); + // acq thread, for a frame that passed the gate + // Virtual photon counting mode: one map (NCH floats, photons per pixel) + // plus the window it covers. The writer appends it to + // "/virtual photon counting" and records the first frame's number and + // timestamp of the window. + void offerPhotonMap(const std::vector &map, uint64_t frames, + uint64_t firstFrame, uint64_t firstStamp); + void offer(const short *frame, int frameW, int frameH, + const SavedFrameHeader &hdr); + void requestStop(const std::string &reason); + bool running() const; + Status status() const; + // waits for the writer, shrinks the datasets and writes the JSON sidecar + void finish(); + + private: + struct Impl; + std::unique_ptr impl_; +}; + +/* ------------------------------------------------------------- pipeline */ +class Pipeline { + public: + // Stream state derived from ZMQ socket monitoring, NOT from receive + // timeouts. An idle-but-alive receiver is "Idle"/"Connected", never + // "stopped" (the old jf_filter behaviour). + enum class StreamState { + Disconnected, // no peer connected + Connecting, // peer not up yet / reconnecting + Connected, // peer connected, frames arriving + Idle, // peer connected but no frame for a while + EndOfAcq // peer sent the end-of-acquisition marker + }; + + Pipeline(); + ~Pipeline(); + + bool init(std::string &error); // create the ZMQ sockets + void start(); + void stop(); + bool running() const { return running_.load(); } + + GateEngine &gate() { return gate_; } + RoiSaver &saver() { return saver_; } + ImageMailbox &images() { return images_; } + FrameMailbox &frames() { return frames_; } + + bool multiPort() const { return rxPorts_.size() > 1; } + size_t portCount() const { return rxPorts_.size(); } + const std::vector &portList() const { return rxPorts_; } + + bool connected() const; + // overall state (worst of all ports) and per-port state + StreamState streamState(double *sinceSec = nullptr) const; + StreamState streamState(int portIdx, double *sinceSec = nullptr) const; + // short token for --stats: connected|idle|eoa|connecting|disconnected + const char *streamStateName() const; + static const char *streamStateName(StreamState st); + // "connected,idle" for N ports + std::string streamStateSummary() const; + uint64_t portFrames(int portIdx) const; + int portWidth(int portIdx) const; // detected per-port width (0 unknown) + int portHeight(int portIdx) const; // detected per-port height (0 unknown) + // ---- frame-alignment audit (see "Keeping the interfaces aligned") ----- + uint64_t portLastFrame(int portIdx) const; // newest frame number seen + uint64_t resyncDrops() const; // stale slabs discarded to restore alignment + uint64_t behindDrops() const; // frames discarded while catching up + uint64_t incompleteFrames() const; // assembled while an interface was absent + uint64_t flushes() const; // pairs dropped (halves were different frames) + uint64_t skippedPairs() const; // pairs dropped by the load-shedding ladder + uint64_t shedFrames() const; // frames deliberately dropped by the ladder + int decimation() const; // 1 = keep all, 2 = keep half, ... 8 + + uint64_t displayFrames() const; + uint64_t displayDropped() const; + // placement of each interface's slab (see Config::rxSlab) + std::vector rxSlab_; + + // hot pixel mask taken from the current photon map (GUI action) + void setHotMaskFromPmap(double threshold); + uint64_t pmapFrames() const; // frames the photon map has accumulated + uint64_t hotPixels() const { return gate_.hotPixels(); } + double hotThreshold() const { return hotThreshold_.load(); } + + PmapSlot &pmapSave() { return pmapSave_; } + PmapSlot pmapSave_; + std::atomic hotThreshold_{0.0}; // last "Get hot pixels" threshold + // window bookkeeping for the photon-map save (acq thread) + uint64_t pmapWinFirstFrame = 0, pmapWinFirstStamp = 0, pmapWinCount = 0; + // route a gate-passed frame to the saver: the frame itself, or the photon + // map bookkeeping when saving virtual photon counting + void offerToSaver(const short *frame, int w, int h, + const SavedFrameHeader &hdr); + uint64_t imagesShown() const { return gImagesShown.load(); } + + // Ask the acq thread to average the next N frames into a new gain-0 + // pedestal set (the old "Load Pede (p)" blocking loop, made async). + void requestPedeAcquire(int nFrames); + bool pedeAcquireActive() const; + int pedeAcquireProgress() const; // frames accumulated so far + + private: + void acqLoop(); + void analysisLoop(); + void acquirePede(const short *frame); // acq thread, during acquisition + void drainMonitor(int portIdx); // acq thread: consume monitor events + bool readOne(int portIdx); // acq thread: one header+data pair + void readStream(int portIdx); // drain a socket, newest frame wins + void drainTo(int portIdx, uint64_t targetKey); // drop until caught up + bool tryAssemble(bool force); // acq thread: pair + stack the slabs + void refreshStreamState(); // acq thread: status + messages + void refreshStreamState(int portIdx); + + // per-port receive slot: the latest slab waiting to be paired + struct StreamSlot { + std::vector data; + size_t len = 0; // valid shorts + int w = 0, h = 0; // geometry as reported by that stream's header + int rowBase = 0; // first destination row in the assembled frame + uint64_t frameKey = 0; // absolute frame number (pairing key) + SavedFrameHeader hdr; // header fields for the ROI-save datasets + int64_t stampMs = 0; + bool valid = false; + bool logged = false; // first-frame geometry already reported + std::vector prevData; // payload of the previous frame (swap, no copy) + size_t prevLen = 0; + uint64_t prevKey = 0; + bool hasPrev = false; + bool usePrev = false; // assemble this interface from prevData + }; + + // per-port connection tracking (atomics: fixed size, one per port) + struct StreamTrack { + std::atomic peerConnected{false}; + std::atomic everConnected{false}; + std::atomic endOfAcq{false}; + std::atomic lastHeaderMs{0}; + std::atomic connectedSinceMs{0}; + std::atomic frames{0}; + std::atomic lastFrame{0}; + std::atomic errors{0}; + std::atomic w{0}; + std::atomic h{0}; + std::atomic sc{-1}; // storage cell, detSpec3 bits 8-11 + }; + + std::atomic running_{false}; + std::thread *acqThread_ = nullptr; + std::thread *analysisThread_ = nullptr; + + GateEngine gate_; + RoiSaver saver_; + FrameMailbox frames_; + ImageMailbox images_; + + std::vector rxPorts_; + void *zmqCtx_ = nullptr; + std::vector zmqSubs_; // one SUB per interface + std::vector zmqMons_; // one monitor PAIR per interface (may be null) + void *zmqPub_ = nullptr; // optional republish socket + + std::array track_; + std::vector slots_; + std::vector hdrBytes_; // raw header of the last received slab + int hdrLen_ = 0; + std::vector assembled_; // full-frame assembly buffer + // acq-thread only pairing bookkeeping: + // pairWaitStartMs_ : when the current pairing attempt started (0 = none) + // lastProgressMs_ : per interface, when its frame number last advanced + // (a stalled interface must not freeze the display) + // firstDataMs_ : when the first slab ever arrived + // acqStartMs_ : when acquisition started (start-up tolerance) + int64_t pairWaitStartMs_ = 0; + std::array lastProgressMs_{}; + int64_t firstDataMs_ = 0; + int64_t acqStartMs_ = 0; + std::atomic fullW_{0}; + std::atomic fullH_{0}; + // alignment: flushes = "a pair was dropped because its halves carried + // different detector frames", skewedPairs_ = "paired anyway after 500 ms + // without a match (structural offset)". Old text follows: both + // slabs dropped"; decimate_ = keep 1 in N aligned pairs (1, 2, 4, 8) + std::atomic flushes_{0}, skippedPairs_{0}, pairSeq_{0}; + std::atomic skewedPairs_{0}; // paired although the keys differed + int64_t lastAssembledMs_ = 0; // last index-aligned assembly + bool allowSkewedPair_ = false; // latched: keys offset for good + std::atomic shedDrops_{0}; + // acq-thread-only bookkeeping for the ladder + uint64_t shedLastTrouble_ = 0; + int shedCleanSeconds_ = 0; + std::atomic decimate_{1}; + std::atomic lastFlushMs_{0}, lastAlignWarnMs_{0}; + std::atomic resyncDrops_{0}; + std::atomic behindDrops_{0}; + std::atomic incomplete_{0}; + std::atomic lastPairWarnMs_{0}; + + std::atomic monitorActive_{false}; + std::atomic stateShown_{-1}; // overall StreamState last printed + std::array, JF_MAX_PORTS> portStateShown_; + + std::atomic pedeAcqActive_{false}; + std::atomic pedeAcqWant_{0}; + std::atomic pedeAcqDone_{0}; + std::shared_ptr pedeAcq_; +}; + +/* ---------------------------------------------------------------- misc */ +bool parseCommandLine(int argc, char **argv, Config &cfg, bool &help, + std::string &error); +void printUsage(const char *prog); +void initGeometry(); // sets nx/ny (JFSTRX decoder or the 1024x512 default) +#endif // ONLINE_JF_H diff --git a/slsDetectorCalibration/jungfrauExecutables/jf_online_display_gui/online_jf_core.cpp b/slsDetectorCalibration/jungfrauExecutables/jf_online_display_gui/online_jf_core.cpp new file mode 100644 index 000000000..6e8d95d31 --- /dev/null +++ b/slsDetectorCalibration/jungfrauExecutables/jf_online_display_gui/online_jf_core.cpp @@ -0,0 +1,3545 @@ +// SPDX-License-Identifier: LGPL-3.0-or-other +// =========================================================================== +// online_jf_core.cpp -- acquisition + gate + analysis (no ROOT graphics here +// except the histogram FILLING, which is the analysis thread's job). +// +// Merged from: +// jf_filter.cpp (gate, counters, pedestal loading) +// onlinedisp_zmq.cpp receiverWorker()/processData() (images, histos) +// =========================================================================== +#include "online_jf.h" + +#include + +#ifdef JFSTRX +#include "jungfrauLGADStrixelsData_new.h" +#include "sls/sls_detector_defs.h" +#include "slsDetectorData.h" +using header = sls::defs::sls_receiver_header; +#endif + +// --------------------------------------------------------------------------- +// Global state (see online_jf.h for the ownership rules) +// --------------------------------------------------------------------------- +Config g_cfg; + +short *hchptr = nullptr; +float factor = 1.84f; +std::atomic gGateChangedDuringSave{false}; +std::atomic g_keepDiv{1}; // 1 = keep all, 2/4/8 = drop 1/2, 3/4, 7/8 +std::atomic g_autoDecimate{false}; +namespace { +// Acquisition-path profile: where the loop's time goes, printed once a second. +double acqNow() { + return std::chrono::duration( + std::chrono::steady_clock::now().time_since_epoch()).count(); +} +struct AcqProf { + double poll = 0, read = 0, pair = 0; // seconds in each stage + double copy = 0; // of which: the assembly memcpy + double t0 = 0, t1 = 0, t2 = 0; + uint64_t n = 0; // loop iterations + uint64_t msgs = 0; // frames delivered by the receiver +} g_acq; +} // namespace // --auto-decimate enables the ladder +float g_pheneThreshold = 0.0f; +float g_pheneThresholdKev = 0.0f; + +std::atomic gain_flag{false}; +std::atomic dophotonmap{true}; +std::atomic goout{1}; +std::atomic HDraw_every{20}; +std::atomic gImagesShown{0}; +// when the Qt view last got an image (analysis thread only) +int64_t g_lastShownMs = 0; +std::atomic rootUpdateMs{1000}; +// one spectrum canvas is painted per tick, in round-robin; with the keV +// set enabled there are four of them, so the default is one per redraw +std::atomic chipUpdateEvery{1}; +std::atomic G1Poffset{0}; +std::atomic G2Poffset{0}; +// defaults from the operator: single-photon ADC window for the main +// plot (-200..1000), photon counts 0..256, spectra -200..3000 +std::atomic adcmin{-200}, adcmax{1000}, pmmin{0}, pmmax{256}; +std::atomic chipxmin{-200}, chipxmax{3000}; +std::atomic fixranges{true}; +std::atomic framesinstream{0}; +std::atomic gFramesForRoot{0}; + +// analysis-thread accumulators +short image_data[JF_PEDE_ARRAY_FLOATS]; +float adc_image[NCH]; +float gain_image[NCH]; +#ifdef JFSTRX +// Strixel ADC groups for the separate six-panel window. The Qt ADC/gain +// images stay raw 1024x512 (that is what the ROI selection works on), and the +// mapped groups are only used by this display path. +static std::array, kNumAdcPanels> g_adcPanel; +#endif +float fgaind[JF_PEDE_ARRAY_FLOATS]; +int nx = 1024, ny = 512; + +std::atomic ROIxmin{0}, ROIxmax{0}, ROIymin{0}, ROIymax{0}; +std::atomic ROIactive{false}; +std::atomic kevSpectra{false}; // show keV PH instead of ADU PH +std::atomic rxRoiXmin{0}, rxRoiXmax{0}, rxRoiYmin{0}, rxRoiYmax{0}; +std::atomic rxRoiValid{false}; + +std::atomic gSoftResetPending{false}; +std::atomic gRedrawRequest{false}; +std::atomic gResetHisPending{false}; +std::atomic gFrameCountReset{false}; +std::atomic gNoPede{true}; // startup default: raw ADC (--use-pede clears) +std::atomic gPmapEvery{2000}; +std::atomic gSaveMode{0}; +std::atomic gPmapSaveEvery{2000}; +std::atomic gPmapCumulative{false}; +std::atomic gPedeTracking{false}; +std::atomic gPedeTracked{false}; +std::mutex gHistoMtx; + +namespace { +int processedf = 0; // analysis thread only +constexpr size_t kHeaderBytes = 16384; + +// --------------------------------------------------------------------------- +// Deferred histogram accumulation (analysis thread, under gHistoMtx) +// --------------------------------------------------------------------------- +// Calling TH1::Fill() per pixel per frame dominated the analysis stage +// (~0.6-1 M fills/frame -> ~4-6 ms) and ROOT histograms are not thread safe, +// so the per-frame work accumulates into plain arrays here and is pushed into +// the ROOT histograms only at the redraw cadence. The histograms are painted +// once per rootUpdateMs, so syncing faster than that is pure waste. +// TEMPORARY timing instrumentation (JF_TIMING) +bool g_timing = false; +double tTake = 0, tCopy = 0, tStep1 = 0, tStep3 = 0, tStep4 = 0, + tSync = 0, tStep5 = 0; +uint64_t tFrames = 0; +struct TT { // scoped timer; zero overhead when disabled (acc == nullptr) + double *acc; + std::chrono::steady_clock::time_point t0; + explicit TT(double *a) : acc(a) { + if (acc) + t0 = std::chrono::steady_clock::now(); + } + ~TT() { + if (!acc) + return; + *acc += std::chrono::duration( + std::chrono::steady_clock::now() - t0) + .count(); + } +}; + +constexpr int kChipOverflowBins = NBIN + 2; // + underflow + overflow +std::vector g_pmapAccum; // NCH, photon map / raw ADC map +std::vector g_pmapSaveAccum; // NCH, the map being saved +uint64_t g_pmapSaveCount = 0; // analysed frames in that map +uint32_t g_chipAccum[8][kChipOverflowBins]; +uint32_t g_chipSynced[8][kChipOverflowBins]; // already pushed into hchip +uint64_t g_chipSyncedTotal[8]; // entries already pushed +// ONE spectrum over the gate-ROI pixels (canvas A7): same binning, same +// border trim, but no chip split - it is the sum over the selected pixels +uint32_t g_roiAccum[kChipOverflowBins]; +uint32_t g_roiSynced[kChipOverflowBins]; +uint64_t g_roiSyncedTotal = 0; +// the same two sets again in keV (canvases A8/A9); their axes are the ADU +// axes divided by KEV_NOMINAL_ADU, so the bin index is identical and only the +// value that is filled differs +uint32_t g_kevAccum[8][kChipOverflowBins]; +uint32_t g_kevSynced[8][kChipOverflowBins]; +uint64_t g_kevSyncedTotal[8]; +uint32_t g_roiKevAccum[kChipOverflowBins]; +uint32_t g_roiKevSynced[kChipOverflowBins]; +uint64_t g_roiKevSyncedTotal = 0; +double g_pmapFills = 0; +uint64_t g_pmapFrames = 0; // analysed frames in the map (hot-pixel default) +double g_pmapFillsSynced = 0; +int64_t g_lastAccumSyncMs = 0; +bool g_accumReady = false; + +// Bin index exactly as ROOT's TAxis::FindBin computes it for the uniform +// NBIN-bin axis [MIN_POS, MAX_POS] (verified against FindBin over all bin +// edges and 20M random values, 0 mismatches). 0 = underflow, NBIN+1 = over. +inline int chipBin(double x) { + const double inv = static_cast(NBIN) / (MAX_POS - MIN_POS); + if (x < MIN_POS) + return 0; + if (x >= MAX_POS) + return NBIN + 1; + return 1 + static_cast((x - MIN_POS) * inv); +} + +void ensureAccumulators() { + if (g_accumReady) + return; + g_pmapAccum.assign(static_cast(NCH), 0.0f); + memset(g_chipAccum, 0, sizeof(g_chipAccum)); + memset(g_chipSynced, 0, sizeof(g_chipSynced)); + memset(g_chipSyncedTotal, 0, sizeof(g_chipSyncedTotal)); + memset(g_roiAccum, 0, sizeof(g_roiAccum)); + memset(g_roiSynced, 0, sizeof(g_roiSynced)); + g_roiSyncedTotal = 0; + memset(g_kevAccum, 0, sizeof(g_kevAccum)); + memset(g_kevSynced, 0, sizeof(g_kevSynced)); + memset(g_kevSyncedTotal, 0, sizeof(g_kevSyncedTotal)); + memset(g_roiKevAccum, 0, sizeof(g_roiKevAccum)); + memset(g_roiKevSynced, 0, sizeof(g_roiKevSynced)); + g_roiKevSyncedTotal = 0; + g_pmapFills = 0; + g_pmapFillsSynced = 0; + g_pmapFrames = 0; + g_lastAccumSyncMs = 0; + g_accumReady = true; +} + +// Zeroes the accumulators so they match the freshly Reset() ROOT histograms. +// Called under gHistoMtx from historesetSources(). +void resetAccumulators() { + if (!g_accumReady) + return; + std::fill(g_pmapAccum.begin(), g_pmapAccum.end(), 0.0f); + memset(g_chipAccum, 0, sizeof(g_chipAccum)); + memset(g_chipSynced, 0, sizeof(g_chipSynced)); + memset(g_chipSyncedTotal, 0, sizeof(g_chipSyncedTotal)); + memset(g_roiAccum, 0, sizeof(g_roiAccum)); + memset(g_roiSynced, 0, sizeof(g_roiSynced)); + g_roiSyncedTotal = 0; + memset(g_kevAccum, 0, sizeof(g_kevAccum)); + memset(g_kevSynced, 0, sizeof(g_kevSynced)); + memset(g_kevSyncedTotal, 0, sizeof(g_kevSyncedTotal)); + memset(g_roiKevAccum, 0, sizeof(g_roiKevAccum)); + memset(g_roiKevSynced, 0, sizeof(g_roiKevSynced)); + g_roiKevSyncedTotal = 0; + g_pmapFills = 0; + g_pmapFillsSynced = 0; + g_lastAccumSyncMs = 0; // force a sync on the next frame +} + +// Pushes the accumulators into his3000 / hchip. Analysis thread, gHistoMtx +// held. The chip spectra are filled with the DELTA so ROOT's own statistics +// (mean/RMS in the stats box) stay exactly as if Fill() had been called. +// Pushes one 8-chip accumulator into its ROOT histograms. Only changed bins +// are pushed, using Fill(x, delta), so a sync costs O(changed bins) instead of +// O(8*NBIN). fEntries is restored explicitly: ROOT's Fill(x,w) bumps it once +// per *call*, not per weight, so the delta fills would otherwise report the +// number of syncs instead of the number of pixels. +// scale = 1 for the ADU histograms, 1/KEV_NOMINAL_ADU for the keV ones (their +// axes are the ADU axes divided by that constant, same bin count) +void syncOneAccum(TH1I *dst, const uint32_t *accum, uint32_t *synced, + uint64_t &syncedTotal, double scale = 1.0) { + if (!dst) + return; + const double w = (MAX_POS - MIN_POS) / NBIN; + uint64_t total = 0; + for (int b = 0; b < kChipOverflowBins; b++) { + const uint32_t cur = accum[b]; + total += cur; + if (cur == synced[b]) + continue; + const double delta = static_cast(cur - synced[b]); + if (b == 0) + dst->Fill((MIN_POS - 1.0) * scale, delta); + else if (b == NBIN + 1) + dst->Fill((MAX_POS + 1.0) * scale, delta); + else + dst->Fill((MIN_POS + (b - 0.5) * w) * scale, delta); + synced[b] = cur; + } + // every pixel lands in exactly one bin (including under/overflow) + if (total != syncedTotal) { + dst->SetEntries(static_cast(total)); + syncedTotal = total; + } +} + +void syncChipAccum(TH1I **dst, uint32_t accum[8][kChipOverflowBins], + uint32_t synced[8][kChipOverflowBins], + uint64_t syncedTotal[8], double scale = 1.0) { + if (!dst) + return; + for (int ic = 0; ic < 8; ic++) + syncOneAccum(dst[ic], accum[ic], synced[ic], syncedTotal[ic], scale); +} + +void syncAccumulators(int64_t now, bool force = false) { + if (!g_accumReady) + return; + int64_t period = rootUpdateMs.load() / 2; + if (period < 50) + period = 50; + if (period > 500) + period = 500; + if (!force && g_lastAccumSyncMs != 0 && + now - g_lastAccumSyncMs < period) + return; + g_lastAccumSyncMs = now; + + if (his3000 && his3000->GetNbinsX() * his3000->GetNbinsY() == NCH) { + const int nbx = his3000->GetNbinsX(); + for (int iy = 0; iy < his3000->GetNbinsY(); iy++) { + for (int ix = 0; ix < nbx; ix++) { + his3000->SetBinContent(ix + 1, iy + 1, + g_pmapAccum[ix + iy * nbx]); + } + } + if (g_pmapFills != g_pmapFillsSynced) { + his3000->SetEntries(g_pmapFills); + g_pmapFillsSynced = g_pmapFills; + } + } + + if (hchip) + syncChipAccum(hchip, g_chipAccum, g_chipSynced, g_chipSyncedTotal); + if (hroi) + syncOneAccum(hroi, g_roiAccum, g_roiSynced, g_roiSyncedTotal); + if (hchipKev) + syncChipAccum(hchipKev, g_kevAccum, g_kevSynced, g_kevSyncedTotal, + 1.0 / KEV_NOMINAL_ADU); + if (hroiKev) + syncOneAccum(hroiKev, g_roiKevAccum, g_roiKevSynced, + g_roiKevSyncedTotal, 1.0 / KEV_NOMINAL_ADU); +} +// after this long without a header the stream is reported as "idle" +constexpr int64_t kIdleWarnMs = 2000; +// fallback staleness for when socket monitoring is unavailable +constexpr int64_t kNoMonitorStaleMs = 3000; +// how long to wait for the partner slab of the same frame before assembling +// from what is available (keeps a dead interface from freezing the display) +constexpr int64_t kPairTimeoutMs = 100; +// ... but while an interface has never delivered a single frame (start-up, +// or it comes up later) wait much longer, otherwise the first frames are +// assembled from one slab only +constexpr int64_t kInitialPairTimeoutMs = 2000; +// how long after the first data we keep using the long "wait for the partner +// to come up" timeout (covers a second interface that starts late) +constexpr int64_t kSyncWindowMs = 5000; +// how long a given-up interface is ignored before it is retried +constexpr int64_t kRelatchMs = 1000; +// max messages consumed from one socket per catch-up burst +constexpr int kMaxDrainPerCall = 256; +// an interface whose frame number has not advanced for this long is stalled +// (dead, or not in this acquisition) and must not block the display +constexpr int64_t kStallMs = 500; +// how long a mismatch may repeat before the newest slabs are paired anyway +constexpr int64_t kNoPairFallbackMs = 500; + +int64_t nowMs() { + return duration_cast(steady_clock::now().time_since_epoch()) + .count(); +} +} // namespace + +void initGeometry() { +#ifdef JFSTRX + cout << "JFSTRX" << endl; + jungfrauLGADStrixelsData *decoder = new jungfrauLGADStrixelsData(); + decoder->getDetectorSize(nx, ny); + cout << decoder->dataMap[22][22] << endl; + delete decoder; +#else + nx = 1024; + ny = 512; +#endif +} + +void printhelp() { + cout << endl + << "s=start/pause| p/n=getnewpede/raw | o/O=read/save pede | n=nopede(raw)" + " | r/R=rst His/Axis | +/- = faster/slower ref. |q=exit | U/C sUrf2/Colz" + << endl; +} + +// --------------------------------------------------------------------------- +// Pedestal store +// --------------------------------------------------------------------------- +PedestalStore &PedestalStore::instance() { + static PedestalStore store; + return store; +} + +// ---- gain map (calibration for the PH spectra) -------------------------- +GainMapStore &GainMapStore::instance() { + static GainMapStore store; + return store; +} + +std::shared_ptr GainMapStore::get() const { + std::lock_guard lock(mtx_); + return cur_; +} + +void GainMapStore::install(const std::shared_ptr &m, + const std::string &path) { + std::lock_guard lock(mtx_); + cur_ = m; + path_ = path; +} + +bool GainMapStore::loaded() const { + std::lock_guard lock(mtx_); + return cur_ != nullptr; +} + +bool gainMapLoaded() { return GainMapStore::instance().loaded(); } + +std::string GainMapStore::path() const { + std::lock_guard lock(mtx_); + return path_; +} + +// Six 1024x512 images of doubles, in file order g0, g1, g2, hg0, hg1, hg2. +bool gainMapLoadFile(const std::string &path, std::string &error) { + const long long expected = static_cast(JF_GAINMAP_IMAGES) * + JF_GAINMAP_PIXELS * (long long)sizeof(double); + std::ifstream f(path.c_str(), std::ios::binary); + if (!f.is_open()) { + error = "cannot open gain map '" + path + "'"; + return false; + } + f.seekg(0, std::ios::end); + const long long bytes = static_cast(f.tellg()); + f.seekg(0, std::ios::beg); + if (bytes != expected) { + std::ostringstream oss; + oss << "'" << path << "' has " << bytes << " bytes, expected " + << expected << " (" << JF_GAINMAP_IMAGES << " x " << 1024 << "x" + << 512 << " doubles)"; + error = oss.str(); + return false; + } + std::shared_ptr m = std::make_shared(); + for (int i = 0; i < JF_GAINMAP_IMAGES; i++) { + f.read(reinterpret_cast(m->img[i].data()), + static_cast(JF_GAINMAP_PIXELS * + sizeof(double))); + if (!f.good()) { + error = "short read from '" + path + "'"; + return false; + } + } + // sanity: the normal-mode map must be usable + uint64_t bad = 0; + double g0sum = 0, hg0sum = 0; + for (int i = 0; i < JF_GAINMAP_PIXELS; i++) { + if (!(m->img[0][i] > 0.0) || !std::isfinite(m->img[0][i])) + bad++; + g0sum += m->img[0][i]; + hg0sum += m->img[3][i]; + } + GainMapStore::instance().install(m, path); + printf("[gain] loaded %s: g0 ADU/keV mean %.2f (%llu unusable pixels), " + "hg0 mean %.2f\n", + path.c_str(), g0sum / JF_GAINMAP_PIXELS, (unsigned long long)bad, + hg0sum / JF_GAINMAP_PIXELS); + fflush(stdout); + return true; +} + +std::shared_ptr PedestalStore::get() const { + std::lock_guard lock(mtx_); + return cur_; +} + +void PedestalStore::install(const std::shared_ptr &set) { + pedeTrackerReset(); // a fresh pedestal re-primes the running average + std::lock_guard lock(mtx_); + cur_ = set; +} + +bool PedestalStore::loaded() const { + std::lock_guard lock(mtx_); + return static_cast(cur_); +} + +bool pathExists(const std::string &path) { + struct stat st; + return (::stat(path.c_str(), &st) == 0) && S_ISREG(st.st_mode); +} + +// Legacy layout written by onlinedisp_zmq "Save Pede (O)": +// 3 arrays (fpeded, fpedeG1d, fpedeG2d), each 2*NCH floats. +bool pedeLoadFile(const std::string &path, std::string &error) { + const long long expected = + (long long)3 * JF_PEDE_ARRAY_FLOATS * (long long)sizeof(float); + + std::ifstream f(path.c_str(), std::ios::binary); + if (!f.is_open()) { + error = "cannot open pedestal file '" + path + "'"; + return false; + } + f.seekg(0, std::ios::end); + const long long fileBytes = static_cast(f.tellg()); + f.seekg(0, std::ios::beg); + if (fileBytes != expected) { + std::ostringstream oss; + oss << "'" << path << "' has " << fileBytes << " bytes, expected " + << expected << " (3 x " << JF_PEDE_ARRAY_FLOATS << " floats)"; + error = oss.str(); + return false; + } + + std::shared_ptr set = std::make_shared(); + const size_t arrayBytes = + static_cast(JF_PEDE_ARRAY_FLOATS) * sizeof(float); + f.read(reinterpret_cast(set->g0.data()), + static_cast(arrayBytes)); + f.read(reinterpret_cast(set->g1.data()), + static_cast(arrayBytes)); + f.read(reinterpret_cast(set->g2.data()), + static_cast(arrayBytes)); + if (!f.good()) { + error = "short read from '" + path + "'"; + return false; + } + set->hasAll = true; + PedestalStore::instance().install(set); + return true; +} + +// --------------------------------------------------------------------------- +// Gate-ROI list (single file, rewritten on every change, newest first) +// --------------------------------------------------------------------------- +namespace { +constexpr size_t kMaxRoiEntries = 200; // keeps the file at a few kB forever + +bool roiListWrite(const std::vector &v) { + const std::string path = g_cfg.roiFile; + std::ofstream f(path.c_str(), std::ios::trunc); + if (!f.is_open()) + return false; + f << "# gate ROI list: x y w h lastUsedEpochMillis\n"; + for (const RoiEntry &e : v) + f << e.x << ' ' << e.y << ' ' << e.w << ' ' << e.h << ' ' + << e.usedMs << '\n'; + return f.good(); +} +} // namespace + +std::vector roiListLoad() { + std::vector v; + std::ifstream f(g_cfg.roiFile.c_str()); + if (!f.is_open()) + return v; + std::string line; + while (std::getline(f, line)) { + if (line.empty() || line[0] == '#') + continue; + std::istringstream is(line); + RoiEntry e; + if (is >> e.x >> e.y >> e.w >> e.h >> e.usedMs) + v.push_back(e); + } + std::sort(v.begin(), v.end(), [](const RoiEntry &a, const RoiEntry &b) { + return a.usedMs > b.usedMs; // last saved/loaded first + }); + return v; +} + +bool roiListUpsert(int x, int y, int w, int h) { + std::vector v = roiListLoad(); + const int64_t now = duration_cast( + system_clock::now().time_since_epoch()) + .count(); + bool found = false; + for (RoiEntry &e : v) { + if (e.x == x && e.y == y && e.w == w && e.h == h) { + e.usedMs = now; + found = true; + break; + } + } + if (!found) { + RoiEntry e; + e.x = x; e.y = y; e.w = w; e.h = h; + e.usedMs = now; + v.push_back(e); + } + std::sort(v.begin(), v.end(), [](const RoiEntry &a, const RoiEntry &b) { + return a.usedMs > b.usedMs; + }); + if (v.size() > kMaxRoiEntries) + v.resize(kMaxRoiEntries); // drop the least recently used + return roiListWrite(v); +} + +bool roiListRemove(int x, int y, int w, int h) { + std::vector v = roiListLoad(); + const size_t before = v.size(); + v.erase(std::remove_if(v.begin(), v.end(), [&](const RoiEntry &e) { + return e.x == x && e.y == y && e.w == w && e.h == h; + }), + v.end()); + if (v.size() == before) + return true; // nothing to do + return roiListWrite(v); +} + +// --------------------------------------------------------------------------- +// Previously used save destinations (single tab-separated file, newest first) +// --------------------------------------------------------------------------- +namespace { +constexpr size_t kMaxSaveDests = 100; + +int64_t epochMsNow() { + return duration_cast(system_clock::now().time_since_epoch()) + .count(); +} + +bool saveDestListWrite(const std::vector &v) { + std::ofstream f(g_cfg.saveListFile.c_str(), std::ios::trunc); + if (!f.is_open()) + return false; + f << "# save destinations: \t\t\n"; + for (const SaveDest &d : v) + f << d.dir << '\t' << d.base << '\t' << d.usedMs << '\n'; + return f.good(); +} +} // namespace + +std::vector saveDestListLoad() { + std::vector v; + std::ifstream f(g_cfg.saveListFile.c_str()); + if (!f.is_open()) + return v; + std::string line; + while (std::getline(f, line)) { + if (line.empty() || line[0] == '#') + continue; + const size_t t1 = line.find('\t'); + if (t1 == std::string::npos) + continue; + const size_t t2 = line.find('\t', t1 + 1); + if (t2 == std::string::npos) + continue; + SaveDest d; + d.dir = line.substr(0, t1); + d.base = line.substr(t1 + 1, t2 - t1 - 1); + d.usedMs = std::strtoll(line.c_str() + t2 + 1, nullptr, 10); + if (!d.base.empty()) + v.push_back(d); + } + std::sort(v.begin(), v.end(), [](const SaveDest &a, const SaveDest &b) { + return a.usedMs > b.usedMs; // last used first + }); + return v; +} + +bool saveDestListUpsert(const std::string &dir, const std::string &base) { + if (base.empty()) + return false; + std::vector v = saveDestListLoad(); + const int64_t now = epochMsNow(); + bool found = false; + for (SaveDest &d : v) { + if (d.dir == dir && d.base == base) { + d.usedMs = now; + found = true; + break; + } + } + if (!found) { + SaveDest d; + d.dir = dir; + d.base = base; + d.usedMs = now; + v.push_back(d); + } + std::sort(v.begin(), v.end(), [](const SaveDest &a, const SaveDest &b) { + return a.usedMs > b.usedMs; + }); + if (v.size() > kMaxSaveDests) + v.resize(kMaxSaveDests); + return saveDestListWrite(v); +} + +bool saveDestListRemove(const std::string &dir, const std::string &base) { + std::vector v = saveDestListLoad(); + const size_t before = v.size(); + v.erase(std::remove_if(v.begin(), v.end(), + [&](const SaveDest &d) { + return d.dir == dir && d.base == base; + }), + v.end()); + if (v.size() == before) + return true; + return saveDestListWrite(v); +} + +bool pedeSaveFile(const std::string &path, std::string &error) { + std::shared_ptr set = PedestalStore::instance().get(); + if (!set) { + error = "no pedestals loaded"; + return false; + } + const int pfd = ::open(path.c_str(), O_CREAT | O_WRONLY | O_TRUNC, 0666); + if (pfd == -1) { + error = std::string("open ") + path + ": " + std::strerror(errno); + return false; + } + const size_t arrayBytes = + static_cast(JF_PEDE_ARRAY_FLOATS) * sizeof(float); + size_t written = 0; + const float *arrays[3] = {set->g0.data(), set->g1.data(), set->g2.data()}; + for (int a = 0; a < 3; a++) { + const char *p = reinterpret_cast(arrays[a]); + size_t left = arrayBytes; + while (left > 0) { + const ssize_t n = ::write(pfd, p, left); + if (n <= 0) { + error = std::string("write ") + path + ": " + std::strerror(errno); + ::close(pfd); + return false; + } + left -= static_cast(n); + p += n; + written += static_cast(n); + } + } + ::close(pfd); + (void)written; + return true; +} + +// --------------------------------------------------------------------------- +// GateEngine +// --------------------------------------------------------------------------- +// Calls fn(i) for every pixel of the frame, or only for the gate ROI when one +// is set. fn returns false to stop early. Templated so it inlines into the +// pixel loops. +template +static inline void forEachGatePixel(uint64_t nPixels, bool roiOn, int x0, + int y0, int x1, int y1, F &&fn) { + if (!roiOn) { + for (uint64_t i = 0; i < nPixels; i++) { + if (!fn(i)) + return; + } + return; + } + for (int y = y0; y < y1; y++) { + const uint64_t row = static_cast(y) * 1024u; + if (row >= nPixels) + return; + for (int x = x0; x < x1; x++) { + const uint64_t i = row + static_cast(x); + if (i >= nPixels) + return; + if (!fn(i)) + return; + } + } +} + +void GateEngine::setRoi(int x0, int y0, int x1, int y1) { + // clamp to the assembled frame (1024 x 512) and require a usable area + if (x0 < 0) x0 = 0; + if (y0 < 0) y0 = 0; + if (x1 > 1024) x1 = 1024; + if (y1 > 512) y1 = 512; + if (x1 - x0 < 4 || y1 - y0 < 4) { + clearRoi(); + return; + } + roiX0_.store(x0); + roiY0_.store(y0); + roiX1_.store(x1); + roiY1_.store(y1); + roiSet_.store(true); // selected; setRoiOnly() decides whether it is used +} + +void GateEngine::clearRoi() { + roiOn_.store(false); + roiSet_.store(false); + roiX0_.store(0); + roiY0_.store(0); + roiX1_.store(1024); + roiY1_.store(512); +} + +void GateEngine::roiSnapshot(int &x0, int &y0, int &x1, int &y1) const { + x0 = roiX0_.load(); + y0 = roiY0_.load(); + x1 = roiX1_.load(); + y1 = roiY1_.load(); +} + +void GateEngine::setEnabled(bool on) { enabled_.store(on); } + +void GateEngine::setThreshold(float adc) { threshold_.store(adc); } + +void GateEngine::setMinPixels(uint64_t n) { minPixels_.store(n); } + +void GateEngine::setContiguous(bool on) { contiguous_.store(on); } + +// ---- hot pixel mask ------------------------------------------------------ +// The mask is not learned from frames: the operator marks it from the photon +// map ("Get hot pixels"), which integrates over many frames, so a hot pixel +// stands out by orders of magnitude instead of by a fraction of frames. +namespace { +std::shared_ptr> g_hotMask; +std::atomic g_hotCount{0}; +} // namespace + +void hotSetMaskFromMap(const float *map, uint64_t n, double threshold) { + auto m = std::make_shared>( + static_cast(NCH), static_cast(0)); + uint64_t c = 0; + const uint64_t lim = std::min(n, static_cast(NCH)); + for (uint64_t i = 0; map && i < lim; i++) { + if (static_cast(map[i]) > threshold) { + (*m)[static_cast(i)] = 1; + c++; + } + } + std::atomic_store( + &g_hotMask, std::shared_ptr>(std::move(m))); + g_hotCount.store(c); +} +void hotClearMask() { + std::atomic_store(&g_hotMask, + std::shared_ptr>()); + g_hotCount.store(0); +} +uint64_t hotPixelCount() { return g_hotCount.load(); } +std::shared_ptr> hotMaskSnapshot() { + return std::atomic_load(&g_hotMask); +} +bool hotMaskActive() { return g_hotCount.load() > 0; } + +void GateEngine::setHotSuppress(bool on) { hotSuppress_.store(on); } +bool GateEngine::hotSuppress() const { return hotSuppress_.load(); } +uint64_t GateEngine::hotPixels() const { return hotPixelCount(); } + +void GateEngine::setScFilter(int sc) { + if (sc < 0 || sc > 15) + sc = -1; // anything else means "all" + scFilter_.store(sc); +} + +void GateEngine::resetCounters() { + c_.framesIn.store(0); + c_.framesPass.store(0); + c_.framesDrop.store(0); + c_.framesScDrop.store(0); + c_.pixelsAbove.store(0); + c_.bytesIn.store(0); + c_.bytesOut.store(0); + cCur_.framesIn.store(0); + cCur_.framesPass.store(0); + cCur_.framesDrop.store(0); + cCur_.framesScDrop.store(0); + cCur_.pixelsAbove.store(0); + r_.rateIn.store(0.0); + r_.ratePass.store(0.0); + r_.rateInMBs.store(0.0); + r_.ratePassMBs.store(0.0); +} + +void GateEngine::noteReceived(uint64_t bytes, bool broken) { + c_.framesIn.fetch_add(1); + cCur_.framesIn.fetch_add(1); + c_.bytesIn.fetch_add(bytes); + if (broken) { + c_.framesDrop.fetch_add(1); + cCur_.framesDrop.fetch_add(1); + } +} + +void GateEngine::noteForwarded(uint64_t bytes) { + c_.bytesOut.fetch_add(bytes); +} + +void GateEngine::setConnected(bool on) { connected_.store(on); } + +void GateEngine::setLastError(const std::string &msg) { + std::lock_guard lock(errMtx_); + lastError_ = msg; +} + +GateEngine::Counters GateEngine::snapshot() const { + Counters cs; + cs.framesIn = c_.framesIn.load(); + cs.framesPass = c_.framesPass.load(); + cs.framesDrop = c_.framesDrop.load(); + cs.pixelsAbove = c_.pixelsAbove.load(); + cs.framesInCur = cCur_.framesIn.load(); + cs.framesPassCur = cCur_.framesPass.load(); + cs.framesDropCur = cCur_.framesDrop.load(); + cs.pixelsAboveCur = cCur_.pixelsAbove.load(); + cs.rateIn = r_.rateIn.load(); + cs.ratePass = r_.ratePass.load(); + cs.rateInMBs = r_.rateInMBs.load(); + cs.ratePassMBs = r_.ratePassMBs.load(); + cs.dropFrac = (cs.framesIn > 0) + ? static_cast(cs.framesDrop) / + static_cast(cs.framesIn) + : 0.0; + cs.connected = connected_.load(); + cs.pedeLoaded = PedestalStore::instance().loaded() && !gNoPede.load(); + cs.framesScDrop = c_.framesScDrop.load(); + cs.framesScDropCur = cCur_.framesScDrop.load(); + cs.lastSc = lastSc_.load(); + cs.scFilter = scFilter_.load(); + { + std::lock_guard lock(errMtx_); + cs.lastError = lastError_; + } + return cs; +} + +namespace { +// ------------------------------------------------------------ pedestal drift +// Per-pixel running average of the "empty" frames the signal gate drops. All +// of it runs on the acq thread (one call per dropped frame, rate limited), so +// the accumulator needs a mutex only because the GUI/HDF5 read the stats. +struct PedeTracker { + std::mutex mtx; + std::vector acc; // running average, raw ADC units + std::vector used; // the pedestal the average is compared against + uint64_t samples = 0; // pixel samples fed in + uint64_t updates = 0; // times the used pedestal was replaced + double maxDiff = 0.0; // last measured largest |acc - used| + int64_t lastUpdateMs = 0; + int64_t lastDecideMs = 0; // the ROI distance test runs ~1 Hz + uint64_t phase = 0; // sampling phase, rotated every frame +}; +PedeTracker g_ptrack; + +// The average is compared against the pedestal in use; replacing it means +// installing a copy of the current set with g0 = the average, which every +// consumer picks up on its next snapshot. +void pedeTrackInstall(const PedeSet *cur, const std::vector &acc) { + auto set = std::make_shared(); + if (cur) + *set = *cur; // keeps g1/g2/hasAll + set->g0 = acc; + PedestalStore::instance().install(set); + gPedeTracked.store(true); +} +} // namespace + +double pedeTrackSignalDropRate(uint64_t passCur, uint64_t dropCur, + uint64_t passTotal, uint64_t dropTotal) { + // The Cur counters are reset by the 1 Hz rate update, so this is the recent + // behaviour. Using the cumulative ones was the bug: after any beam-on + // stretch the cumulative drop rate stays low, so the tracking never fed + // again even when the beam went off. + static double held = -1.0; + const uint64_t curTot = passCur + dropCur; + if (curTot >= 1) { + held = static_cast(dropCur) / static_cast(curTot); + return held; + } + if (held >= 0.0) + return held; // a window with no frames yet: keep the last value + const uint64_t tot = passTotal + dropTotal; + return tot > 0 ? static_cast(dropTotal) / static_cast(tot) + : 0.0; +} + +PedeTrackStats pedeTrackerStats() { + PedeTrackStats st; + st.on = gPedeTracking.load(); + st.tracked = gPedeTracked.load(); + std::lock_guard lk(g_ptrack.mtx); + st.samples = g_ptrack.samples; + st.updates = g_ptrack.updates; + st.maxDiff = g_ptrack.maxDiff; + st.sinceUpdateMs = g_ptrack.lastUpdateMs + ? (int64_t)nowMs() - g_ptrack.lastUpdateMs + : 0; + return st; +} + +// Called from PedestalStore::install(), i.e. both when the operator loads a +// pedestal and when the tracker itself replaces it. Only the running average +// is dropped (it re-primes from whatever pedestal is now in use); samples and +// updates are cumulative diagnostics and survive. +void pedeTrackerReset() { + std::lock_guard lk(g_ptrack.mtx); + g_ptrack.acc.clear(); + g_ptrack.used.clear(); + g_ptrack.maxDiff = 0.0; + g_ptrack.lastUpdateMs = 0; + gPedeTracked.store(false); +} + +void pedeTrackerFeed(const short *frame, uint64_t nPixels, const PedeSet *peds, + double signalDropRate, int roiX0, int roiY0, int roiX1, + int roiY1) { + if (!gPedeTracking.load() || !frame || !peds) + return; + const int64_t now = (int64_t)nowMs(); + // only while the beam is effectively off: the gate is dropping the frames + if (signalDropRate < PEDE_TRACK_DROP_RATE) + return; + + // A fixed stride of 1/0.2 % would sample the same pixels on every frame, so + // the phase is rotated: after `stride` frames every pixel has been taken + // once. The weight is per sample, so the pooled window stays + // PEDE_TRACK_WINDOW samples. + const uint64_t stride = + std::max(1, (uint64_t)std::lround(1.0 / PEDE_TRACK_FRACTION)); + const float alpha = (float)((double)nPixels / PEDE_TRACK_WINDOW); + + bool doInstall = false; + bool safety = false; + double md = 0.0, usedMean = 0.0; + uint64_t updNo = 0, samNo = 0; + std::vector snapshot; + { + std::lock_guard lk(g_ptrack.mtx); + if (g_ptrack.acc.size() != peds->g0.size()) { + g_ptrack.acc = peds->g0; // re-prime (also after an install) + g_ptrack.used = peds->g0; + g_ptrack.lastUpdateMs = now; + g_ptrack.lastDecideMs = 0; + g_ptrack.phase = 0; + } + const uint64_t start = g_ptrack.phase % stride; + g_ptrack.phase++; + uint64_t fed = 0; + for (uint64_t i = start; i < nPixels; i += stride) { + if (frame[i] & 0xc000) + continue; // high-gain / gain-3 pixels live on another scale + const float raw = static_cast(frame[i] & 0x3fff); + g_ptrack.acc[i] += (raw - g_ptrack.acc[i]) * alpha; + fed++; + } + if (fed == 0) + fed = 1; + g_ptrack.samples += fed; + + // The ROI-wide distance test is the only expensive part (~0.5 ms), so + // it runs about once a second; the sampling above runs on every frame. + if (now - g_ptrack.lastDecideMs >= 1000) { + g_ptrack.lastDecideMs = now; + for (size_t i = 0; i < nPixels && i < g_ptrack.acc.size(); i++) { + const int px = static_cast(i % 1024); + const int py = static_cast(i / 1024); + if (px < roiX0 || px >= roiX1 || py < roiY0 || py >= roiY1) + continue; + const double d = std::fabs((double)g_ptrack.acc[i] - + (double)g_ptrack.used[i]); + if (d > md) + md = d; + } + g_ptrack.maxDiff = md; + for (uint64_t i = 0; i < nPixels && i < g_ptrack.used.size(); i++) + usedMean += g_ptrack.used[i]; + usedMean = nPixels ? usedMean / double(nPixels) : 0.0; + + // at most 0.1 Hz, and at least once every 10 min + const bool rateOk = (now - g_ptrack.lastUpdateMs) >= + PEDE_TRACK_MIN_PERIOD_MS; + const bool overdue = + (now - g_ptrack.lastUpdateMs) >= PEDE_TRACK_MAX_PERIOD_MS; + doInstall = (md > PEDE_TRACK_MAXDIFF && rateOk) || overdue; + safety = overdue && md <= PEDE_TRACK_MAXDIFF; + if (doInstall) { + snapshot = g_ptrack.acc; + updNo = ++g_ptrack.updates; + samNo = g_ptrack.samples; + g_ptrack.lastUpdateMs = now; + } + } + } // lock released: install() below resets the tracker and takes it again + + if (doInstall) { + pedeTrackInstall(peds, snapshot); + double mAcc = 0.0; + for (uint64_t i = 0; i < nPixels; i++) + mAcc += snapshot[i]; + printf("[pedetrack] pedestal updated #%llu: max delta %.2f ADU in the " + "ROI over %llu pixel samples (%s); mean(raw average)=%.2f, " + "mean(pedestal being replaced)=%.2f\n", + (unsigned long long)updNo, md, (unsigned long long)samNo, + safety ? "10 min safety update" : "drift > 5 ADU", + nPixels ? mAcc / double(nPixels) : 0.0, usedMean); + fflush(stdout); + } +} + +// The gate decision for one frame. Called by the acq thread only. +bool GateEngine::evaluate(const short *frame, uint64_t nPixels, int sc, + const PedeSet *peds, int g1off, int g2off, + uint64_t &above, bool *scDropped) { + above = 0; + if (scDropped) + *scDropped = false; + lastSc_.store(sc); + // Storage-cell selection first: it is a pure header check, so frames from + // other cells are dropped before any pixel is touched. + const int wantSc = scFilter_.load(); + if (wantSc >= 0 && sc != wantSc) { + c_.framesScDrop.fetch_add(1); + cCur_.framesScDrop.fetch_add(1); + if (scDropped) + *scDropped = true; + return false; + } + if (!enabled_.load()) { // transparent passthrough + c_.framesPass.fetch_add(1); + cCur_.framesPass.fetch_add(1); + return true; + } + above = countPixelsAbove(frame, nPixels, peds, g1off, g2off); + const bool passCount = (above >= minPixels_.load()); + bool passCluster = true; + if (passCount && contiguous_.load()) + passCluster = hitsClustered(frame, nPixels, peds, g1off, g2off); + + if (passCount && passCluster) { + c_.pixelsAbove.fetch_add(above); + cCur_.pixelsAbove.fetch_add(above); + c_.framesPass.fetch_add(1); + cCur_.framesPass.fetch_add(1); + return true; + } + c_.framesDrop.fetch_add(1); + cCur_.framesDrop.fetch_add(1); + return false; +} + +// Gain-aware pixel counting, identical to the original jf_filter: +// g0: raw - pede0 +// g1: (pede1 + G1off - raw) * 30 +// g3: (pede2 + G2off - raw) * 340 (g==2 unused -> treated as g0) +// When only the gain-0 array is available (live pedestal acquisition) every +// gain falls back to raw - pede0, exactly like the display's own fallback. +uint64_t GateEngine::countPixelsAbove(const short *frame, uint64_t nPixels, + const PedeSet *peds, int g1off, + int g2off) const { + const float thr = threshold_.load(); + const bool roiOn = roiOn_.load(); + const int x0 = roiX0_.load(), y0 = roiY0_.load(); + const int x1 = roiX1_.load(), y1 = roiY1_.load(); + + const float *p0 = peds ? peds->g0.data() : nullptr; + const bool gainAware = peds && peds->hasAll; + const float *p1 = gainAware ? peds->g1.data() : nullptr; + const float *p2 = gainAware ? peds->g2.data() : nullptr; + + const auto hmask = hotSuppress_.load() ? hotMaskSnapshot() : nullptr; + const bool hotOn = hmask && hmask->size() == static_cast(NCH); + uint64_t nAbove = 0; + forEachGatePixel(nPixels, roiOn, x0, y0, x1, y1, [&](uint64_t i) { + if (hotOn && (*hmask)[i]) + return true; // hot pixels never reach the criterion + float v; + if (!p0) { // no pedestals at all: raw 14-bit values + v = static_cast(frame[i] & 0x3fff); + } else if (!gainAware) { + v = static_cast(frame[i] & 0x3fff) - p0[i]; + } else { + const int raw = frame[i] & 0x3fff; + const int g = (frame[i] & 0xc000) ? ((frame[i] >> 14) & 0x3) : 0; + if (g == 0) { + v = static_cast(raw) - p0[i]; + } else if (g == 1) { + v = (p1[i] + static_cast(g1off) - + static_cast(raw)) * 30.0f; + } else if (g == 3) { + v = (p2[i] + static_cast(g2off) - + static_cast(raw)) * 340.0f; + } else { + v = static_cast(raw) - p0[i]; + } + } + if (v > thr) + nAbove++; + return true; + }); + return nAbove; +} + +// Contiguity proxy: "N px within a circle". +// +// Pass when SOME circle of radius (minPixels/2 + 1) contains at least +// minPixels above-threshold pixels. The previous version required EVERY +// above-threshold pixel to lie within that radius of the *centroid*, so two +// well-separated clusters - each of which satisfies the requirement on its own +// - put the centroid between them and the frame was always rejected. That is +// why the option blocked frames it should have passed. +bool GateEngine::hitsClustered(const short *frame, uint64_t nPixels, + const PedeSet *peds, int g1off, + int g2off) const { + const float thr = threshold_.load(); + const uint64_t nReq = std::max(1, minPixels_.load()); + const double radius = static_cast(nReq) / 2.0 + 1.0; + const double r2 = radius * radius; + const bool roiOn = roiOn_.load(); + const int x0 = roiX0_.load(), y0 = roiY0_.load(); + const int x1 = roiX1_.load(), y1 = roiY1_.load(); + + const float *p0 = peds ? peds->g0.data() : nullptr; + const bool gainAware = peds && peds->hasAll; + const float *p1 = gainAware ? peds->g1.data() : nullptr; + const float *p2 = gainAware ? peds->g2.data() : nullptr; + + auto valueAt = [&](uint64_t i) -> float { + if (!p0) + return static_cast(frame[i] & 0x3fff); + const int raw = frame[i] & 0x3fff; + if (!gainAware) + return static_cast(raw) - p0[i]; + const int g = (frame[i] & 0xc000) ? ((frame[i] >> 14) & 0x3) : 0; + if (g == 1) + return (p1[i] + static_cast(g1off) - + static_cast(raw)) * 30.0f; + if (g == 3) + return (p2[i] + static_cast(g2off) - + static_cast(raw)) * 340.0f; + return static_cast(raw) - p0[i]; + }; + + // positions of the above-threshold pixels (reused buffer: this runs per + // frame on the acquisition path, so no allocation in the steady state) + static thread_local std::vector hx, hy; + hx.clear(); + hy.clear(); + const auto hmask = hotSuppress_.load() ? hotMaskSnapshot() : nullptr; + const bool hotOn = hmask && hmask->size() == static_cast(NCH); + forEachGatePixel(nPixels, roiOn, x0, y0, x1, y1, [&](uint64_t i) { + if (hotOn && (*hmask)[i]) + return true; // hot pixels must not form a cluster either + if (valueAt(i) > thr) { + hx.push_back(static_cast(i % kRawWidth)); + hy.push_back(static_cast(i / kRawWidth)); + } + return true; + }); + const size_t n = hx.size(); + if (n < nReq) + return false; + // Enough hits that a cluster is guaranteed in practice; the pairwise scan + // below would only burn acquisition time on such a frame. + if (n > 4096) + return true; + + for (size_t a = 0; a < n; a++) { + size_t cnt = 1; + for (size_t b = 0; b < n && cnt < nReq; b++) { + if (a == b) + continue; + const double dx = static_cast(hx[a]) - hx[b]; + const double dy = static_cast(hy[a]) - hy[b]; + if (dx * dx + dy * dy <= r2) + cnt++; + } + if (cnt >= nReq) + return true; + } + return false; +} + +// --------------------------------------------------------------------------- +// Mailboxes +// --------------------------------------------------------------------------- +void FrameMailbox::publish(const short *data, size_t nBytes) { + const size_t nShorts = nBytes / sizeof(short); + std::lock_guard lock(mtx); + if (have) + dropped++; // the previous frame never made it to the analysis stage + if (buf.size() < nShorts) + buf.resize(nShorts); + if (nShorts) + memcpy(buf.data(), data, nShorts * sizeof(short)); + len = nShorts; + have = true; + pushed++; + seq++; + cv.notify_all(); +} + +bool FrameMailbox::waitTake(std::vector &out, size_t &lenOut, + uint64_t &seqOut, const std::atomic &running) { + std::unique_lock lock(mtx); + cv.wait_for(lock, std::chrono::milliseconds(100), + [&] { return have || !running.load(); }); + if (!have) + return false; + out = buf; + lenOut = len; + seqOut = seq; + have = false; + return true; +} + +// --------------------------------------------------------------------------- +// Pipeline +// --------------------------------------------------------------------------- +namespace { +void startAnalysisWorkers(int n); +void stopAnalysisWorkers(); +} // namespace + +Pipeline::Pipeline() { + // std::atomic default construction leaves the value uninitialised in + // C++17, which would randomly swallow the first status line + for (auto &v : portStateShown_) + v.store(-1); +} + +Pipeline::~Pipeline() { + stop(); + for (void *m : zmqMons_) { + if (m) + zmq_close(m); + } + zmqMons_.clear(); + for (void *sub : zmqSubs_) { + if (sub) + zmq_close(sub); + } + zmqSubs_.clear(); + if (zmqPub_) { + zmq_close(zmqPub_); + zmqPub_ = nullptr; + } + if (zmqCtx_) { + zmq_ctx_shutdown(zmqCtx_); + zmq_ctx_term(zmqCtx_); + zmqCtx_ = nullptr; + } +} + +bool Pipeline::init(std::string &error) { + zmqCtx_ = zmq_ctx_new(); + // One ZMQ I/O thread per interface: a single I/O thread sat at ~90 % + // moving ~2 GB/s for both sockets and was a serialisation point. + { + int nio = 2; + if (const char *e = getenv("JF_ZMQ_IO_THREADS")) + nio = atoi(e); + if (nio > 0) + zmq_ctx_set(zmqCtx_, ZMQ_IO_THREADS, nio); + } + + if (!zmqCtx_) { + error = "zmq_ctx_new failed"; + return false; + } + + int linger = 0, rcvtimeo = 200, sndtimeo = 200; + int hwm = g_cfg.rxHwm > 0 ? g_cfg.rxHwm : 1000; + int rcvbuf = 8 * 1024 * 1024; + + rxPorts_ = g_cfg.rxPorts; + if (rxPorts_.empty()) + rxPorts_.push_back(DEFAULT_RX_PORT); + rxSlab_ = g_cfg.rxSlab; + rxSlab_.resize(rxPorts_.size(), 0); // placement per interface (0 = by order) + if (rxPorts_.size() > JF_MAX_PORTS) { + error = "too many rx ports (max " + std::to_string(JF_MAX_PORTS) + ")"; + return false; + } + slots_.assign(rxPorts_.size(), StreamSlot()); + + // One SUB socket + one socket monitor per interface. The monitors must + // be armed BEFORE connecting: they tell us whether each receiver stream is + // really connected, so an idle-but-alive receiver is never mistaken for a + // stopped one. + for (size_t i = 0; i < rxPorts_.size(); i++) { + void *sub = zmq_socket(zmqCtx_, ZMQ_SUB); + if (!sub) { + error = "zmq_socket(SUB) failed"; + return false; + } + zmq_setsockopt(sub, ZMQ_LINGER, &linger, sizeof(linger)); + zmq_setsockopt(sub, ZMQ_RCVTIMEO, &rcvtimeo, sizeof(rcvtimeo)); + zmq_setsockopt(sub, ZMQ_RCVHWM, &hwm, sizeof(hwm)); + zmq_setsockopt(sub, ZMQ_RCVBUF, &rcvbuf, sizeof(rcvbuf)); + zmq_setsockopt(sub, ZMQ_SUBSCRIBE, "", 0); + + const std::string monAddr = + "inproc://online_jf_monitor_" + std::to_string(i); + void *mon = nullptr; + if (zmq_socket_monitor(sub, monAddr.c_str(), ZMQ_EVENT_ALL) == 0) { + mon = zmq_socket(zmqCtx_, ZMQ_PAIR); + if (!mon || zmq_connect(mon, monAddr.c_str()) != 0) { + if (mon) { + zmq_close(mon); + mon = nullptr; + } + fprintf(stderr, + "[zmq] socket monitor unavailable for port %d, " + "falling back to frame-arrival staleness\n", + rxPorts_[i]); + } + } else { + fprintf(stderr, + "[zmq] zmq_socket_monitor failed for port %d: %s\n", + rxPorts_[i], zmq_strerror(zmq_errno())); + } + + const std::string addr = + "tcp://" + g_cfg.rxHost + ":" + std::to_string(rxPorts_[i]); + if (zmq_connect(sub, addr.c_str()) != 0) { + const std::string why = zmq_strerror(zmq_errno()); + zmq_close(sub); + if (mon) + zmq_close(mon); + error = "zmq_connect(" + addr + ") failed: " + why; + return false; + } + zmqSubs_.push_back(sub); + zmqMons_.push_back(mon); + if (mon) + monitorActive_.store(true); + } + + if (g_cfg.pubPort > 0) { + zmqPub_ = zmq_socket(zmqCtx_, ZMQ_PUB); + if (!zmqPub_) { + error = "zmq_socket(PUB) failed"; + return false; + } + zmq_setsockopt(zmqPub_, ZMQ_LINGER, &linger, sizeof(linger)); + zmq_setsockopt(zmqPub_, ZMQ_SNDTIMEO, &sndtimeo, sizeof(sndtimeo)); + const std::string bindAddr = "tcp://*:" + std::to_string(g_cfg.pubPort); + if (zmq_bind(zmqPub_, bindAddr.c_str()) != 0) { + error = "zmq_bind(" + bindAddr + ") failed: " + + zmq_strerror(zmq_errno()); + return false; + } + } + + gate_.setEnabled(g_cfg.gateEnabled); + gate_.setThreshold(g_cfg.threshold); + gate_.setMinPixels(g_cfg.minPixels); + gate_.setContiguous(g_cfg.contiguous); + gate_.setHotSuppress(g_cfg.hotSuppress); + return true; +} + +void Pipeline::start() { + if (running_.load()) + return; + running_.store(true); + startAnalysisWorkers(g_cfg.analysisWorkers); + acqThread_ = new std::thread(&Pipeline::acqLoop, this); + analysisThread_ = new std::thread(&Pipeline::analysisLoop, this); +} + +void Pipeline::stop() { + running_.store(false); + frames_.cv.notify_all(); + if (acqThread_) { + if (acqThread_->joinable()) + acqThread_->join(); + delete acqThread_; + acqThread_ = nullptr; + } + if (analysisThread_) { + if (analysisThread_->joinable()) + analysisThread_->join(); + delete analysisThread_; + analysisThread_ = nullptr; + } + // only after the analysis thread is done, so no worker is mid-frame + stopAnalysisWorkers(); +} + +bool Pipeline::connected() const { return gate_.connected_.load(); } + +uint64_t Pipeline::portFrames(int portIdx) const { + if (portIdx < 0 || portIdx >= static_cast(rxPorts_.size())) + return 0; + return track_[portIdx].frames.load(); +} + +int Pipeline::portWidth(int portIdx) const { + if (portIdx < 0 || portIdx >= static_cast(rxPorts_.size())) + return 0; + return track_[portIdx].w.load(); +} + +int Pipeline::portHeight(int portIdx) const { + if (portIdx < 0 || portIdx >= static_cast(rxPorts_.size())) + return 0; + return track_[portIdx].h.load(); +} + +uint64_t Pipeline::portLastFrame(int portIdx) const { + if (portIdx < 0 || portIdx >= static_cast(rxPorts_.size())) + return 0; + return track_[portIdx].lastFrame.load(); +} + +uint64_t Pipeline::resyncDrops() const { return resyncDrops_.load(); } + +uint64_t Pipeline::behindDrops() const { return behindDrops_.load(); } + +uint64_t Pipeline::incompleteFrames() const { return incomplete_.load(); } + +uint64_t Pipeline::flushes() const { return flushes_.load(); } + +uint64_t Pipeline::skippedPairs() const { return skippedPairs_.load(); } + +uint64_t Pipeline::shedFrames() const { return shedDrops_.load(); } + +int Pipeline::decimation() const { return decimate_.load(); } + +uint64_t Pipeline::displayFrames() const { return framesinstream.load(); } + +uint64_t Pipeline::displayDropped() const { + std::lock_guard lock(const_cast(frames_).mtx); + return frames_.dropped; +} + +void Pipeline::requestPedeAcquire(int nFrames) { + if (nFrames < 1) + nFrames = 1; + pedeAcqWant_.store(nFrames); + pedeAcqDone_.store(0); + { + std::lock_guard lock(frames_.mtx); + pedeAcq_.reset(); + } + pedeAcqActive_.store(true); + printf("[pede] acquiring from %d frames...\n", nFrames); + fflush(stdout); +} + +bool Pipeline::pedeAcquireActive() const { return pedeAcqActive_.load(); } + +int Pipeline::pedeAcquireProgress() const { return pedeAcqDone_.load(); } + +// acq thread, while a live pedestal acquisition is running +// In "save frames" mode this is the old path. In virtual-photon-counting mode +// the frames are not written: instead the acq thread keeps the window +// bookkeeping (first frame number and timestamp, frame count) and hands each +// published map to the saver tagged with it. +void Pipeline::offerToSaver(const short *frame, int w, int h, + const SavedFrameHeader &hdr) { + if (gSaveMode.load() != 1) { + saver_.offer(frame, w, h, hdr); + return; + } + if (pmapWinCount == 0) { + pmapWinFirstFrame = hdr.frameNumber; + pmapWinFirstStamp = hdr.timestamp; + } + pmapWinCount++; + PmapSlot &slot = pmapSave(); + std::vector map; + uint64_t frames = 0; + { + std::lock_guard lock(slot.mtx); + if (slot.ready) { + map.swap(slot.map); + frames = slot.frames; + slot.ready = false; + } + } + if (map.empty()) + return; + saver_.offerPhotonMap(map, frames, pmapWinFirstFrame, pmapWinFirstStamp); + pmapWinCount = 0; +} + +void Pipeline::setHotMaskFromPmap(double threshold) { + std::vector copy; + { + std::lock_guard lock(gHistoMtx); + copy = g_pmapAccum; // written per pixel by the workers, published here + } + hotSetMaskFromMap(copy.data(), copy.size(), threshold); + hotThreshold_.store(threshold); + gate_.resetCounters(); +} + +uint64_t Pipeline::pmapFrames() const { return g_pmapFrames; } + +void pmapSaveReset() { + std::lock_guard lock(gHistoMtx); + // assign (not fill): this also allocates, so the very first analysed frame + // after the save started is counted instead of being dropped while the + // accumulator is still empty + g_pmapSaveAccum.assign(static_cast(NCH), 0.0f); + g_pmapSaveCount = 0; +} + +void Pipeline::acquirePede(const short *frame) { + if (!pedeAcq_) + pedeAcq_ = std::make_shared(); + const int done = pedeAcqDone_.load(); + float *g0 = pedeAcq_->g0.data(); + for (uint64_t i = 0; i < NCH; i++) { + const float raw = static_cast(frame[i] & 0x3fff); + g0[i] = (g0[i] * static_cast(done) + raw) / + static_cast(done + 1); + } + const int n = done + 1; + pedeAcqDone_.store(n); + if (n < pedeAcqWant_.load()) + return; + + // publish: gain-0 only, so hasAll stays false (same as the old live + // acquisition, which never filled the G1/G2 arrays) + PedestalStore::instance().install(pedeAcq_); + { + std::lock_guard lock(frames_.mtx); + pedeAcq_.reset(); + } + pedeAcqActive_.store(false); + gFrameCountReset.store(true); + printf("[pede] installed pedestals averaged over %d frames (storage cell " + "%s)\n", + n, gate_.scFilter() < 0 + ? "ALL - every cell contributed" + : std::to_string(gate_.scFilter()).c_str()); + fflush(stdout); +} + +// --------------------------------------------------------------------------- +// Connection tracking (per interface) +// --------------------------------------------------------------------------- +// A receive timeout only means "no frame in the last 200 ms"; it says nothing +// about the receiver being alive. The ZMQ socket monitor tells us the truth: +// an idle-but-connected receiver stays "Connected"/"Idle", and "stopped" is +// only reported on a real disconnect or on the end-of-acquisition marker. +void Pipeline::drainMonitor(int portIdx) { + if (portIdx < 0 || portIdx >= static_cast(zmqMons_.size())) + return; + void *mon = zmqMons_[portIdx]; + if (!mon) + return; + StreamTrack &t = track_[portIdx]; + for (int k = 0; k < 64; k++) { // bounded burst per iteration + unsigned char buf[256]; + const int n = zmq_recv(mon, buf, sizeof(buf), ZMQ_DONTWAIT); + if (n < 0) + break; // EAGAIN: no more events + uint16_t event = 0; + if (n >= static_cast(sizeof(uint16_t))) + memcpy(&event, buf, sizeof(uint16_t)); + int more = 0; + size_t moreSize = sizeof(more); + zmq_getsockopt(mon, ZMQ_RCVMORE, &more, &moreSize); + if (more) { // drain the address part + char addr[256]; + zmq_recv(mon, addr, sizeof(addr), ZMQ_DONTWAIT); + } + + switch (event) { + case ZMQ_EVENT_CONNECTED: + case ZMQ_EVENT_HANDSHAKE_SUCCEEDED: + if (!t.peerConnected.exchange(true)) + t.connectedSinceMs.store(nowMs()); + t.everConnected.store(true); + break; + case ZMQ_EVENT_DISCONNECTED: + case ZMQ_EVENT_CLOSED: + case ZMQ_EVENT_HANDSHAKE_FAILED_NO_DETAIL: + case ZMQ_EVENT_HANDSHAKE_FAILED_PROTOCOL: + case ZMQ_EVENT_HANDSHAKE_FAILED_AUTH: + t.peerConnected.store(false); + break; + default: + break; // CONNECT_DELAYED / RETRIED / LISTENING / ... + } + } +} + +Pipeline::StreamState Pipeline::streamState(int portIdx, + double *sinceSec) const { + if (portIdx < 0 || portIdx >= static_cast(rxPorts_.size())) { + if (sinceSec) + *sinceSec = 0.0; + return StreamState::Disconnected; + } + const StreamTrack &t = track_[portIdx]; + const int64_t now = nowMs(); + double since = 0.0; + StreamState st; + + if (zmqMons_[portIdx]) { + if (!t.peerConnected.load()) { + st = t.everConnected.load() ? StreamState::Disconnected + : StreamState::Connecting; + if (t.lastHeaderMs.load() > 0) + since = (now - t.lastHeaderMs.load()) / 1000.0; + } else if (t.endOfAcq.load()) { + st = StreamState::EndOfAcq; + if (t.lastHeaderMs.load() > 0) + since = (now - t.lastHeaderMs.load()) / 1000.0; + } else { + const int64_t lastHdr = t.lastHeaderMs.load(); + if (lastHdr > 0) + since = (now - lastHdr) / 1000.0; + else { + const int64_t sinceConnect = t.connectedSinceMs.load(); + since = (sinceConnect > 0) ? (now - sinceConnect) / 1000.0 : 0.0; + } + st = (since * 1000.0 > kIdleWarnMs) ? StreamState::Idle + : StreamState::Connected; + } + } else { + // no monitor: fall back to frame-arrival staleness + const int64_t lastHdr = t.lastHeaderMs.load(); + if (lastHdr <= 0) { + st = t.everConnected.load() ? StreamState::Disconnected + : StreamState::Connecting; + } else { + since = (now - lastHdr) / 1000.0; + st = (since * 1000.0 > kNoMonitorStaleMs) ? StreamState::Disconnected + : StreamState::Connected; + } + } + if (sinceSec) + *sinceSec = since; + return st; +} + +// Overall state = the worst port: any dead port dominates, then idle. +Pipeline::StreamState Pipeline::streamState(double *sinceSec) const { + StreamState worst = StreamState::Connected; + double worstSince = 0.0; + int rank = 0; // Connected < Idle < EndOfAcq < Connecting < Disconnected + for (size_t i = 0; i < rxPorts_.size(); i++) { + double since = 0.0; + const StreamState st = streamState(static_cast(i), &since); + int r = 0; + switch (st) { + case StreamState::Connected: + r = 0; + break; + case StreamState::Idle: + r = 1; + break; + case StreamState::EndOfAcq: + r = 2; + break; + case StreamState::Connecting: + r = 3; + break; + case StreamState::Disconnected: + r = 4; + break; + } + if (i == 0 || r > rank) { + rank = r; + worst = st; + worstSince = since; + } + } + if (sinceSec) + *sinceSec = worstSince; + return worst; +} + +const char *Pipeline::streamStateName(StreamState st) { + switch (st) { + case StreamState::Disconnected: + return "disconnected"; + case StreamState::Connecting: + return "connecting"; + case StreamState::Connected: + return "connected"; + case StreamState::Idle: + return "idle"; + case StreamState::EndOfAcq: + return "eoa"; + } + return "?"; +} + +const char *Pipeline::streamStateName() const { + return streamStateName(streamState()); +} + +std::string Pipeline::streamStateSummary() const { + std::string out; + for (size_t i = 0; i < rxPorts_.size(); i++) { + if (i) + out += ","; + out += streamStateName(streamState(static_cast(i))); + } + return out; +} + +// acq thread: per-port status line, printed only on a real transition +void Pipeline::refreshStreamState(int portIdx) { + if (portIdx < 0 || portIdx >= static_cast(rxPorts_.size())) + return; + double since = 0.0; + const StreamState st = streamState(portIdx, &since); + const int shown = static_cast(st); + const int prev = portStateShown_[portIdx].exchange(shown); + if (prev == shown) + return; + + const int port = rxPorts_[portIdx]; + switch (st) { + case StreamState::Connected: + if (prev < 0 || prev == static_cast(StreamState::Connecting) || + prev == static_cast(StreamState::Disconnected)) + printf("Receiver connected on port %d\n", port); + break; + case StreamState::Disconnected: + printf("Receiver on port %d disconnected, waiting to reconnect...\n", + port); + break; + case StreamState::Idle: + printf("Receiver on port %d connected but no frames for %.1f s " + "(still alive)\n", + port, since); + break; + case StreamState::EndOfAcq: + printf("Receiver on port %d sent end-of-acquisition, waiting for new " + "stream\n", + port); + break; + case StreamState::Connecting: + break; + } + fflush(stdout); +} + +void Pipeline::refreshStreamState() { + for (size_t i = 0; i < rxPorts_.size(); i++) + refreshStreamState(static_cast(i)); + + const StreamState st = streamState(); + const bool up = (st != StreamState::Disconnected && + st != StreamState::Connecting); + gate_.setConnected(up); + + if (!multiPort()) // single-port wording is handled per port already + return; + const int shown = static_cast(st); + const int prev = stateShown_.exchange(shown); + if (prev == shown) + return; + if (st == StreamState::Disconnected) + printf("Stream lost: not all %zu interfaces are connected\n", + rxPorts_.size()); + else if (st == StreamState::Idle) + printf("Waiting for frames on at least one interface\n"); + fflush(stdout); +} + +// --------------------------------------------------------------------------- +// Reading one interface +// --------------------------------------------------------------------------- +// Reads exactly one header+data pair from an interface into its slot. +// Returns false when there is nothing to read right now. +bool Pipeline::readOne(int portIdx) { + if (portIdx < 0 || portIdx >= static_cast(zmqSubs_.size())) + return false; + StreamTrack &t = track_[portIdx]; + StreamSlot &sl = slots_[portIdx]; + + // Discards the rest of the current multipart message, so a rejected + // header never leaves its data part to be read as the next "header". + auto drainParts = [&]() { + int more = 0; + size_t moreSize = sizeof(more); + zmq_getsockopt(zmqSubs_[portIdx], ZMQ_RCVMORE, &more, &moreSize); + char sink[65536]; + while (more) { + zmq_recv(zmqSubs_[portIdx], sink, sizeof(sink), 0); + zmq_getsockopt(zmqSubs_[portIdx], ZMQ_RCVMORE, &more, &moreSize); + } + }; + + std::vector hdr(kHeaderBytes); + const int hn = + zmq_recv(zmqSubs_[portIdx], hdr.data(), hdr.size(), ZMQ_DONTWAIT); + if (hn <= 0) { + if (hn < 0 && zmq_errno() != EAGAIN) + t.errors.fetch_add(1); + return false; + } + // zmq_recv returns the full message length even when it truncated it + if (static_cast(hn) > hdr.size()) { + t.errors.fetch_add(1); + drainParts(); + return false; + } + + rapidjson::Document d; + if (d.Parse(hdr.data(), static_cast(hn)).HasParseError()) { + drainParts(); + return false; + } + if (!d.HasMember("jsonversion") || !d.HasMember("data")) { + drainParts(); + return false; + } + if (d["jsonversion"].GetUint() != SLS_DETECTOR_JSON_HEADER_VERSION) { + drainParts(); + return false; + } + + // A valid header must be followed by its data part. The parts of a + // multipart message are queued together, so RCVMORE is authoritative here; + // without this check a header alone would make the data recv swallow the + // next message's header as pixels. + { + int moreAfterHdr = 0; + size_t moreAfterHdrSize = sizeof(moreAfterHdr); + zmq_getsockopt(zmqSubs_[portIdx], ZMQ_RCVMORE, &moreAfterHdr, + &moreAfterHdrSize); + if (!moreAfterHdr) { + t.errors.fetch_add(1); + return false; + } + } + + hdrBytes_.assign(hdr.begin(), hdr.begin() + hn); + hdrLen_ = hn; + + const int64_t now = nowMs(); + t.lastHeaderMs.store(now); + // Storage cell: bits 8-11 of "detector specific 3" (0..15, 15 = default). + // Kept per port; the assembled frame uses the first slab's value. + if (d.HasMember("detSpec3")) { + const uint32_t ds3 = d["detSpec3"].GetUint(); + t.sc.store(static_cast((ds3 >> 8) & 0xF)); + } + if (d["data"].GetUint() == 0) { // end-of-acquisition marker + t.endOfAcq.store(true); + refreshStreamState(portIdx); + drainParts(); // none expected (sent without SNDMORE) + return false; + } + t.endOfAcq.store(false); + { + // a data header must be followed by its data part + int more = 0; + size_t moreSize = sizeof(more); + zmq_getsockopt(zmqSubs_[portIdx], ZMQ_RCVMORE, &more, &moreSize); + if (!more) + return false; + } + + // Receiver ROI from the "rx_roi" array the receiver puts in every stream + // header: [xmin, xmax, ymin, ymax] in RAW port coordinates. This is NOT + // the gate ROI: it says which part of the port the receiver itself handled. + // It is drawn as the red box on the ADC image (mapped to the display when + // the strixel mapping is active). The old detSpec1 reinterpretation was a + // hack - detSpec1 is the bunch id - and is gone. + if (d.HasMember("rx_roi") && d["rx_roi"].IsArray() && + d["rx_roi"].Size() >= 4) { + const int xmin = d["rx_roi"][0].GetInt(); + const int xmax = d["rx_roi"][1].GetInt(); + const int ymin = d["rx_roi"][2].GetInt(); + const int ymax = d["rx_roi"][3].GetInt(); + if (xmax > xmin && ymax > ymin) { + // Each interface reports its own slice in RAW port coordinates, so + // a ROI crossing the interface boundary (e.g. y 28..356 on a 2x256 + // module) arrives as 28..255 on the bottom port and 0..100 on the + // top one. Translate each slice into assembled rows and draw the + // union, otherwise the box stopped at the interface boundary. + static std::atomic px0[JF_MAX_PORTS], px1[JF_MAX_PORTS], + py0[JF_MAX_PORTS], py1[JF_MAX_PORTS]; + static std::atomic seen[JF_MAX_PORTS]; + int slabH = 0; + if (d.HasMember("shape") && d["shape"].IsArray() && + d["shape"].Size() >= 2) + slabH = d["shape"][1].GetInt(); + const int nIf = static_cast(rxPorts_.size()); + const int totalH = fullH_.load() > 0 ? fullH_.load() : kRawHeight; + // A single interface already reports the ROI in module rows (the + // receiver owns the whole module), so it is drawn exactly as it + // arrives: never shift it, or the box lands in the dead region. + // With several interfaces each one reports only its own slice, + // which is translated by its row offset and unioned below. + int rowBase = 0; + if (nIf > 1 && slabH > 0 && slabH < totalH && totalH % nIf == 0) + rowBase = portIdx * (totalH / nIf); + px0[portIdx].store(xmin); + px1[portIdx].store(xmax); + py0[portIdx].store(ymin + rowBase); + py1[portIdx].store(ymax + rowBase); + seen[portIdx].store(true); + int ux0 = 1 << 30, ux1 = -1, uy0 = 1 << 30, uy1 = -1; + for (int k = 0; k < nIf; k++) { + if (!seen[k].load()) + continue; + ux0 = std::min(ux0, px0[k].load()); + ux1 = std::max(ux1, px1[k].load()); + uy0 = std::min(uy0, py0[k].load()); + uy1 = std::max(uy1, py1[k].load()); + } + const bool changed = (ux0 != rxRoiXmin.load() || + ux1 != rxRoiXmax.load() || + uy0 != rxRoiYmin.load() || + uy1 != rxRoiYmax.load()); + rxRoiXmin.store(static_cast(ux0)); + rxRoiXmax.store(static_cast(ux1)); + rxRoiYmin.store(static_cast(uy0)); + rxRoiYmax.store(static_cast(uy1)); + rxRoiValid.store(ux1 > ux0 && uy1 > uy0); + if (changed && rxRoiValid.load()) { + printf("[rx] receiver ROI x=%d..%d y=%d..%d (assembled rows, " + "drawn as the red box)\n", + ux0, ux1, uy0, uy1); + fflush(stdout); + } + } else { + rxRoiValid.store(false); + } + } else { + rxRoiValid.store(false); + } + + int w = 0, h = 0; + if (d.HasMember("shape") && d["shape"].IsArray() && + d["shape"].Size() >= 2) { + w = static_cast(d["shape"][0].GetUint()); + h = static_cast(d["shape"][1].GetUint()); + } + size_t needBytes = static_cast(NCH) * 2; + if (d.HasMember("size")) { + const unsigned sz = d["size"].GetUint(); + if (sz > 0) + needBytes = sz; + } else if (w > 0 && h > 0) { + needBytes = static_cast(w) * static_cast(h) * 2; + } + if (needBytes > static_cast(NCH) * 2 * 4) // sanity clamp + needBytes = static_cast(NCH) * 2; + + if (sl.data.size() < needBytes / 2) + sl.data.resize(needBytes / 2); + const int received = zmq_recv(zmqSubs_[portIdx], sl.data.data(), + static_cast(needBytes), 0); + if (received <= 0) { + t.errors.fetch_add(1); + return false; + } + // larger than advertised: zmq truncated it to needBytes but returns the + // full length, which must not become sl.len (it sizes the memcpy later) + const bool truncated = static_cast(received) > needBytes; + int more = 0; + size_t moreSize = sizeof(more); + zmq_getsockopt(zmqSubs_[portIdx], ZMQ_RCVMORE, &more, &moreSize); + if (more) { // payload larger than advertised: drain the remainder + char sink[65536]; + while (more) { + zmq_recv(zmqSubs_[portIdx], sink, sizeof(sink), 0); + zmq_getsockopt(zmqSubs_[portIdx], ZMQ_RCVMORE, &more, &moreSize); + } + } + if (truncated) { + t.errors.fetch_add(1); + return false; + } + + // Overwriting a slab that was never assembled means it is being discarded + // rather than shown late (only happens in the deliberate skip-ahead path). + if (sl.valid) + behindDrops_.fetch_add(1); + + g_acq.msgs++; + sl.len = static_cast(received) / sizeof(short); + sl.w = w; + sl.h = h; + sl.valid = true; + sl.stampMs = now; + sl.frameKey = d.HasMember("frameNumber") + ? d["frameNumber"].GetUint64() + : (d.HasMember("frameIndex") ? d["frameIndex"].GetUint64() + : 0); + // Load shedding, applied here so it costs nothing extra: the message is + // already in the slot buffer, what it saves is everything downstream + // (assembly, gate, analysis, display, save), which is what lets the sockets + // keep draining and slsReceiver's ring buffer stay empty. The frame number + // is shared by both interfaces, so they drop exactly the same frames and + // stay in step. + { + const int keepDiv = g_keepDiv.load(); + if (keepDiv > 1 && + (sl.frameKey % static_cast(keepDiv)) != 0) { + sl.valid = false; // read and forgotten, never assembled + shedDrops_.fetch_add(1); + return false; + } + } + // header fields mirrored into the ROI-save parameter datasets + { + SavedFrameHeader &h = sl.hdr; + h = SavedFrameHeader(); + h.frameNumber = sl.frameKey; + if (d.HasMember("expLength")) + h.expLength = d["expLength"].GetUint(); + if (d.HasMember("packetNumber")) + h.packetNumber = d["packetNumber"].GetUint(); + if (d.HasMember("detSpec1")) + h.detSpec1 = d["detSpec1"].GetUint64(); + if (d.HasMember("timestamp")) + h.timestamp = d["timestamp"].GetUint64(); + if (d.HasMember("modId")) + h.modId = static_cast(d["modId"].GetUint()); + if (d.HasMember("row")) + h.row = static_cast(d["row"].GetUint()); + if (d.HasMember("column")) + h.column = static_cast(d["column"].GetUint()); + if (d.HasMember("detSpec2")) + h.detSpec2 = static_cast(d["detSpec2"].GetUint()); + if (d.HasMember("detSpec3")) + h.detSpec3 = d["detSpec3"].GetUint(); + if (d.HasMember("detSpec4")) + h.detSpec4 = static_cast(d["detSpec4"].GetUint()); + if (d.HasMember("detType")) + h.detType = static_cast(d["detType"].GetUint()); + if (d.HasMember("version")) + h.version = static_cast(d["version"].GetUint()); + } + t.frames.fetch_add(1); + t.lastFrame.store(sl.frameKey); + if (portIdx < JF_MAX_PORTS) + lastProgressMs_[portIdx] = now; // this interface is alive and moving + if (firstDataMs_ == 0) + firstDataMs_ = now; + if (w > 0) { + t.w.store(w); + fullW_.store(w); + } + if (h > 0) + t.h.store(h); + fullH_.store(kRawHeight); // N slabs of kRawHeight/N rows assemble + + if (!sl.logged) { + sl.logged = true; + const int slabRows = + multiPort() ? kRawHeight / static_cast(rxPorts_.size()) + : kRawHeight; + const int rowBase = static_cast(portIdx) * slabRows; + printf("[stream] port %d: %dx%d (%zu B) -> rows %d..%d of %dx%d\n", + rxPorts_[portIdx], w, h, sl.len * sizeof(short), rowBase, + rowBase + (h > 0 ? h : slabRows) - 1, fullW_.load(), + fullH_.load()); + fflush(stdout); + } + refreshStreamState(portIdx); + return true; +} + +// One frame per poll cycle. The acq loop only calls this for an interface +// whose slot is EMPTY (flow control): a slab waiting to be paired is never +// overwritten, which is what lets a persistently lagging interface still be +// paired instead of losing the leader's matching frame. +void Pipeline::readStream(int portIdx) { readOne(portIdx); } + +// Discards a lagging interface's queued frames until it reaches targetKey. +void Pipeline::drainTo(int portIdx, uint64_t targetKey) { + StreamSlot &sl = slots_[portIdx]; + for (int k = 0; k < kMaxDrainPerCall; k++) { + if (sl.valid && sl.frameKey >= targetKey) + return; + if (!readOne(portIdx)) + return; + } +} + +// --------------------------------------------------------------------------- +// Frame assembly (multi-interface) +// --------------------------------------------------------------------------- +// Each interface delivers one Y-slab of the module (1024x256 for a Jungfrau +// split in two). Slabs are stacked in the order the ports were given, the +// first port occupying the LOWEST rows, so "30001+30002" means (bottom, top). +// +// Slabs are paired on the DETECTOR frame number (frameIndex is per-streamer +// and offset by each interface's own first index, so it cannot be a shared +// key). +// +// Alignment policy - an assembled frame is complete and always as fresh as +// the streams allow: +// * every socket is polled and drained at full speed, always - holding a +// slab makes slsReceiver's queue fill and the receiver then skips frames on +// that interface, which is what makes the two streams drift apart; +// * the newest slab of every interface is paired, whatever its frame number: +// after a per-interface skip the numbers stay offset for ever, so matching +// on equal keys would never pair again and holding a slab to let the mate +// "catch up" only shifts the problem into the receiver's buffer. A skewed +// pair costs one frame with a one-frame-old half, counted in 'resync'; +// * a frame number gap is reported, and a persistently silent interface is +// reported once in a while (counted in 'incomplete'); +// * load shedding stays available for a real analysis backlog (see the +// ladder in the acquisition loop): 1/2, 1/4, 7/8 of the frames are dropped +// synchronously, keyed on the shared frame number. +bool Pipeline::tryAssemble(bool force) { + const size_t n = rxPorts_.size(); + if (n == 0) + return false; + + int totalH = fullH_.load(); + int width = fullW_.load(); + if (totalH <= 0 || width <= 0) { + totalH = kRawHeight; + width = kRawWidth; + } + static bool geomWarned = false; + if (totalH % static_cast(n) != 0) { + if (!geomWarned) { + geomWarned = true; + printf("[frames] ERROR: %zu interfaces cannot evenly split %d rows; " + "assembling is disabled (check the rx_port list)\n", + n, totalH); + fflush(stdout); + } + return false; + } + const int slabRows = totalH / static_cast(n); + for (size_t i = 0; i < n; i++) { + const int h = slots_[i].h; + if (slots_[i].valid && h > 0 && h != slabRows && h != totalH && + !geomWarned) { + geomWarned = true; + printf("[frames] ERROR: port %d streams %d rows but this " + "configuration expects %d (or a full %d); assembling is " + "disabled\n", + rxPorts_[i], h, slabRows, totalH); + fflush(stdout); + } + } + + // ---- how many interfaces have a slab ready? -------------------------- + size_t validCount = 0; + uint64_t lo = 0, hi = 0; + for (size_t i = 0; i < n; i++) { + if (!slots_[i].valid) + continue; + if (validCount == 0) + lo = hi = slots_[i].frameKey; + else { + lo = std::min(lo, slots_[i].frameKey); + hi = std::max(hi, slots_[i].frameKey); + } + validCount++; + } + if (validCount == 0) + return false; // nothing pending + + if (validCount < n) { + // An interface has nothing pending. Nothing is held back: the socket + // is drained continuously, so the pending slab is simply replaced by + // the next frame if the partner stays away. Only a genuinely silent + // interface deserves a message. + const int64_t now = nowMs(); + bool stalled = false; + for (size_t i = 0; i < n; i++) { + if (slots_[i].valid) + continue; + const int64_t last = (i < JF_MAX_PORTS) ? lastProgressMs_[i] : 0; + if (last > 0) { + if (now - last > kStallMs) + stalled = true; + } else if (now - acqStartMs_ > kInitialPairTimeoutMs) { + stalled = true; + } + } + if (stalled && now - lastPairWarnMs_.load() > 5000) { + lastPairWarnMs_.store(now); + incomplete_.fetch_add(1); + printf("[frames] an interface has no data: check the interface " + "states\n"); + fflush(stdout); + } + return false; + } + + // ---- all interfaces have a slab -------------------------------------- + // A skip on ONE interface (slsReceiver does that per interface) leaves the + // two frame numbers permanently offset: the interface that skipped keeps + // sending one number further on, for ever. Matching on equal keys would + // therefore never succeed again, and holding the leader until the mate + // "catches up" is worse - it fills that socket, so the receiver skips even + // more. So the two newest slabs are always paired; the frame numbers are + // used to *report* the skew, and a skew costs exactly one slightly + // mismatched frame instead of a stream that never assembles again. + if (lo != hi) { + const uint64_t gap = hi - lo; + const int64_t now3 = nowMs(); + // Hard dropping: the halves are not the same detector frame, so the + // pair is discarded instead of being shown or saved. Both sockets stay + // drained, nothing is held back, and every frame that *is* processed is + // index-aligned - which is what matters once frames are written to disk. + // One-frame lookahead: one interface already moved on, so pair its + // *previous* payload with the other one's current payload. The keys + // then match and no frame is dropped. + bool handled = false; + // One-frame lookahead: the leading interface already consumed `lo`, so + // pair its previous payload with the lagging slab of the same frame. + if (gap == 1) { + bool ok = true; + for (size_t i = 0; i < n; i++) { + slots_[i].usePrev = false; + if (slots_[i].frameKey == lo) + continue; + if (slots_[i].hasPrev && slots_[i].prevKey == lo) + slots_[i].usePrev = true; + else + ok = false; + } + if (!ok) // never leave a half-selected pair behind + for (size_t i = 0; i < n; i++) + slots_[i].usePrev = false; + handled = ok; + } + if (!handled && !allowSkewedPair_ && lastAssembledMs_ != 0 && + now3 - lastAssembledMs_ < kNoPairFallbackMs) { + // Only the OLDER slabs are dropped: the leading slab is kept, so + // the very next frame from the lagging interface carries the same + // frame number and pairs. Discarding both (what we did before) + // threw away a frame and left the two streams just as far apart. + resyncDrops_.fetch_add(1); + for (size_t i = 0; i < n; i++) + if (slots_[i].valid && slots_[i].frameKey < hi) + slots_[i].valid = false; + if (now3 - lastPairWarnMs_.load() > 5000) { + lastPairWarnMs_.store(now3); + printf("[frames] interfaces are %llu frame(s) apart; dropping " + "the pair to keep every frame aligned\n", + static_cast(gap)); + fflush(stdout); + } + return false; + } + if (handled) { + pairWaitStartMs_ = 0; + allowSkewedPair_ = false; + } else { + // Nothing has paired for kNoPairFallbackMs: the two frame numbers are + // offset for good (an interface that keeps skipping). Pair the newest + // slabs anyway so the stream stays live, and report it. + allowSkewedPair_ = true; // stay in this mode until a pair matches again + skewedPairs_.fetch_add(1); + if (now3 - lastPairWarnMs_.load() > 5000) { + lastPairWarnMs_.store(now3); + printf("[frames] interfaces are %llu frame(s) apart and nothing has " + "paired for %lld ms; pairing the newest slabs\n", + static_cast(gap), + static_cast(kNoPairFallbackMs)); + fflush(stdout); + } + } + } + + const double tCopy0 = acqNow(); + // ---- index-aligned: assemble ----------------------------------------- + if (assembled_.size() != static_cast(NCH)) + assembled_.assign(static_cast(NCH), 0); + + for (size_t i = 0; i < n; i++) { + StreamSlot &sl = slots_[i]; + const int rowBase = static_cast(i) * slabRows; + sl.rowBase = rowBase; + + const size_t dstOffset = static_cast(rowBase) * width; + const size_t dstAvail = (dstOffset < assembled_.size()) + ? assembled_.size() - dstOffset + : 0; + const short *srcPtr = + sl.usePrev ? sl.prevData.data() : sl.data.data(); + const size_t srcLen = sl.usePrev ? sl.prevLen : sl.len; + size_t srcOffset = 0; + const size_t rows = static_cast(sl.h > 0 ? sl.h : slabRows); + if (sl.h == totalH && n > 1) // interface streams the whole module + srcOffset = static_cast(rowBase) * width; + size_t count = rows * static_cast(width); + if (srcOffset + count > srcLen) + count = (srcLen > srcOffset) ? srcLen - srcOffset : 0; + if (count > dstAvail) + count = dstAvail; + if (count) + memcpy(assembled_.data() + dstOffset, srcPtr + srcOffset, + count * sizeof(short)); + if (count < dstAvail) + memset(reinterpret_cast(assembled_.data()) + dstOffset + + count * sizeof(short), + 0, (dstAvail - count) * sizeof(short)); + } + + uint64_t bytes = 0; + const uint64_t pairKey = lo; // the frame that was actually assembled + for (size_t i = 0; i < n; i++) { + bytes += slots_[i].len * sizeof(short); + if (slots_[i].usePrev) { + // Contributed its PREVIOUS frame: the newer slab is still the + // leading frame, so keep it pending for the next pairing. + slots_[i].usePrev = false; + slots_[i].hasPrev = false; + } else { + slots_[i].valid = false; + // The frame just assembled becomes the lookahead candidate; the + // swap keeps a free buffer for the next read (no memory traffic). + std::swap(slots_[i].data, slots_[i].prevData); + slots_[i].prevKey = slots_[i].frameKey; + slots_[i].prevLen = slots_[i].len; + slots_[i].hasPrev = true; + } + } + g_acq.copy += acqNow() - tCopy0; // just the per-interface memcpy/memset + pairWaitStartMs_ = 0; + lastAssembledMs_ = nowMs(); + if (lo == hi) + allowSkewedPair_ = false; // realigned, back to strict pairing + + if (bytes == 0) + return false; + + static bool firstAssembledLogged = false; + if (!firstAssembledLogged) { + firstAssembledLogged = true; + printf("[frames] first assembled frame: "); + for (size_t i = 0; i < n; i++) { + const size_t px = + static_cast(static_cast(i) * slabRows) * + static_cast(width); + printf("port %d -> row %d = %d%s", rxPorts_[i], + static_cast(i) * slabRows, + px < assembled_.size() + ? static_cast(assembled_[px] & 0x3fff) + : -1, + (i + 1 < n) ? ", " : "\n"); + } + fflush(stdout); + } + + gate_.noteReceived(bytes, false); + + // "Acquire Pede": the pedestal depends on the storage cell, so only frames + // that the SC filter accepts contribute (SC filter == ALL -> every cell, + // which would mix their pedestals). The signal gate is deliberately not + // applied: its *dropped* frames are the empty ones a pedestal wants. + if (pedeAcqActive_.load() && + (gate_.scFilter() < 0 || gate_.scFilter() == track_[0].sc.load())) + acquirePede(assembled_.data()); + + std::shared_ptr peds = + gNoPede.load() ? nullptr : PedestalStore::instance().get(); + const int g1off = G1Poffset.load(); + const int g2off = G2Poffset.load(); + uint64_t above = 0; + // the storage cell comes from the first (bottom) interface's header; both + // interfaces belong to the same frame, so they report the same cell + bool scDropped = false; + const bool forward = + gate_.evaluate(assembled_.data(), static_cast(NCH), + track_[0].sc.load(), peds.get(), g1off, g2off, above, + &scDropped); + // pedestal tracking: a frame the *signal* gate dropped is "beam off" data + if (!forward && !scDropped && gPedeTracking.load() && gate_.enabled()) { + const GateEngine::Counters gc = gate_.snapshot(); + int rx0 = 0, ry0 = 0, rx1 = 1024, ry1 = 512; + if (gate_.roiSet()) + gate_.roiSnapshot(rx0, ry0, rx1, ry1); + pedeTrackerFeed(assembled_.data(), static_cast(NCH), + peds.get(), + pedeTrackSignalDropRate(gc.framesPassCur, + gc.framesDropCur, + gc.framesPass, gc.framesDrop), + rx0, ry0, rx1, ry1); + } + + if (forward) { + if (saver_.running()) + offerToSaver(assembled_.data(), width, totalH, slots_[0].hdr); + const size_t fullBytes = static_cast(NCH) * 2; + if (zmqPub_) { // assembled full frame with a synthesised header + char hdr[512]; + const int hn = snprintf( + hdr, sizeof(hdr), + "{\"jsonversion\":%u,\"data\":1,\"size\":%zu," + "\"shape\":[%d,%d],\"frameNumber\":%llu}", + static_cast(SLS_DETECTOR_JSON_HEADER_VERSION), + fullBytes, width, totalH, + static_cast(pairKey)); + zmq_send(zmqPub_, hdr, hn, ZMQ_SNDMORE); + zmq_send(zmqPub_, assembled_.data(), + static_cast(fullBytes), 0); + } + frames_.publish(assembled_.data(), fullBytes); + gate_.noteForwarded(static_cast(NCH) * 2); + } + return true; +} + +// --------------------------------------------------------------------------- +// acq thread: poll all interfaces -> pair -> assemble -> gate -> hand off +// --------------------------------------------------------------------------- +void Pipeline::acqLoop() { + acqStartMs_ = nowMs(); + + // 1 Hz rate bookkeeping + auto lastRateTime = steady_clock::now(); + uint64_t prevIn = 0, prevPass = 0, prevInB = 0, prevOutB = 0; + + // poll set: one entry per SUB socket and per monitor socket + std::vector items; + for (size_t i = 0; i < zmqSubs_.size(); i++) { + items.push_back(zmq_pollitem_t{zmqSubs_[i], 0, ZMQ_POLLIN, 0}); + // A null socket with fd 0 would poll STDIN: use fd -1 (ignored) when + // a socket monitor could not be created. + items.push_back(zmqMons_[i] + ? zmq_pollitem_t{zmqMons_[i], 0, ZMQ_POLLIN, 0} + : zmq_pollitem_t{nullptr, -1, 0, 0}); + } + const int nSub = static_cast(zmqSubs_.size()); + + while (running_.load()) { + { + auto now = steady_clock::now(); + const double dt = duration(now - lastRateTime).count(); + if (dt >= 1.0) { + GateEngine::Counters s = gate_.snapshot(); + gate_.r_.rateIn.store(s.framesIn > prevIn + ? (s.framesIn - prevIn) / dt + : 0.0); + gate_.r_.ratePass.store(s.framesPass > prevPass + ? (s.framesPass - prevPass) / dt + : 0.0); + const uint64_t inB = gate_.c_.bytesIn.load(); + const uint64_t outB = gate_.c_.bytesOut.load(); + gate_.r_.rateInMBs.store( + inB > prevInB ? (inB - prevInB) / dt / 1e6 : 0.0); + gate_.r_.ratePassMBs.store( + outB > prevOutB ? (outB - prevOutB) / dt / 1e6 : 0.0); + // ---- alignment load-shedding ladder ---------------------- + // "Trouble" is the interfaces having to drop slabs to stay in + // step (lagging resyncs, overwritten slabs, half frames). While + // it keeps growing, deliberately drop a synchronised fraction of + // the frames (1/2, then 3/4, then 7/8) so the rest of the chain + // keeps up and the sockets stay drained; when it has been clean + // for a few seconds, step back up. + if (multiPort() && g_autoDecimate.load()) { + // A resync or a replaced slab is the normal cost of pairing + // the newest slabs (one frame, never a stall), so it must + // not drive the ladder: only frames that the analysis has + // accepted but not finished do. + // Frames that entered the gate but have not been + // classified yet. Rejects and storage-cell drops are + // finished frames, not a backlog - counting them pinned the + // ladder at 1/8 whenever the gate rejected anything. + const int64_t backlog = + static_cast(s.framesIn) - + static_cast(s.framesPass) - + static_cast(s.framesDrop) - + static_cast(s.framesScDrop); + const uint64_t trouble = + backlog > 50 ? static_cast(backlog) : 0; + const int d = g_keepDiv.load(); + if (trouble != shedLastTrouble_) { + shedLastTrouble_ = trouble; + shedCleanSeconds_ = 0; + if (d < 8) { + g_keepDiv.store(d * 2); + printf("[align] analysis backlog (%llu frame(s)): " + "keeping 1/%d of the frames\n", + static_cast(trouble), + d * 2); + fflush(stdout); + } + } else if (d > 1 && ++shedCleanSeconds_ >= 5) { + shedCleanSeconds_ = 0; + g_keepDiv.store(d / 2); + printf("[align] streams clean: keeping 1/%d of the " + "frames\n", d / 2); + fflush(stdout); + } + } + { + const double tot = g_acq.poll + g_acq.read + g_acq.pair; + const double other = + tot < dt ? dt - tot : 0.0; + const double inv = (dt > 0.0) ? 100.0 / dt : 0.0; + printf("[perf] poll=%.0f%% read=%.0f%% pair=%.0f%% " + "(copy=%.0f%%) other=%.0f%% loops=%llu " + "offered=%.0f/s\n", + g_acq.poll * inv, g_acq.read * inv, + g_acq.pair * inv, g_acq.copy * inv, other * inv, + (unsigned long long)g_acq.n, + (dt > 0.0) ? g_acq.msgs / dt : 0.0); + fflush(stdout); + g_acq.poll = g_acq.read = g_acq.pair = g_acq.copy = 0.0; + g_acq.n = 0; + g_acq.msgs = 0; + } + prevIn = s.framesIn; + prevPass = s.framesPass; + prevInB = inB; + prevOutB = outB; + lastRateTime = now; + } + } + + // Every socket is polled and drained at full speed, always. Holding a + // slab makes the *receiver* keep sending into our queue until it is + // full, and slsReceiver then skips frames on that interface - which is + // precisely how the two streams drift apart. Draining keeps the queues + // shallow and lets the pairing resolve a gap in one frame instead. + for (int i = 0; i < nSub; i++) + items[2 * i].events = ZMQ_POLLIN; + + g_acq.t0 = acqNow(); + const int rc = zmq_poll(items.data(), static_cast(items.size()), + 200 /* ms: also lets us poll running_ */); + if (rc < 0) { + if (zmq_errno() == ETERM) + break; + continue; + } + if (rc == 0) { // idle: NOT "receiver stopped" + refreshStreamState(); + if (multiPort()) + tryAssemble(false); + continue; + } + + g_acq.poll += acqNow() - g_acq.t0; // waiting in zmq_poll + g_acq.t1 = acqNow(); + for (int i = 0; i < nSub; i++) { + if (items[2 * i + 1].revents & ZMQ_POLLIN) + drainMonitor(i); + // Drain the socket down to its newest message. Pairing the two + // newest slabs is what keeps the halves from the same instant, and + // an empty queue is what keeps slsReceiver from skipping on that + // interface. Bounded per wake-up so the other sockets are not + // starved. + if (items[2 * i].revents & ZMQ_POLLIN) { + for (int k = 0; k < 32; k++) { + if (!readOne(i)) + break; + int ev = 0; + size_t evs = sizeof(ev); + if (zmq_getsockopt(zmqSubs_[i], ZMQ_EVENTS, &ev, &evs) != 0 || + !(ev & ZMQ_POLLIN)) + break; + } + } + } + g_acq.read += acqNow() - g_acq.t1; // recv + JSON + slab copies + g_acq.t2 = acqNow(); + refreshStreamState(); + + // Catch the slower interface up instead of discarding the leading + // frames: while the newest slabs disagree, take extra messages from the + // socket whose frame number is lower (about two reads for its one), so + // it reaches the same frame number. Bounded, and it stops as soon as + // that socket has nothing queued - it is then at the live edge, and + // only a frame the receiver skipped can explain the remaining gap. + if (multiPort()) { + for (int round = 0; round < 4; round++) { + size_t vc = 0; + uint64_t lo2 = 0, hi2 = 0; + int behind = -1; + for (int i = 0; i < nSub; i++) { + if (!slots_[i].valid) + continue; + if (vc == 0) { + lo2 = hi2 = slots_[i].frameKey; + behind = i; + } else if (slots_[i].frameKey < lo2) { + lo2 = slots_[i].frameKey; + behind = i; + } else { + hi2 = slots_[i].frameKey; + } + vc++; + } + if (vc < 2 || lo2 == hi2 || behind < 0) + break; + int got = 0; + for (int k = 0; k < 8; k++) { + if (!readOne(behind)) + break; + got++; + // stop the moment it reaches the leader: one message too + // many and it becomes the leader itself, which only flips + // the mismatch around + if (slots_[behind].valid && + slots_[behind].frameKey >= hi2) + break; + int ev = 0; + size_t evs = sizeof(ev); + if (zmq_getsockopt(zmqSubs_[behind], ZMQ_EVENTS, &ev, + &evs) != 0 || + !(ev & ZMQ_POLLIN)) + break; + } + if (!got) + break; + } + } + + if (multiPort()) { + // Pair the slabs; only index-aligned frames are processed. The + // latency is bounded by the small receive queue (--rx-hwm): when + // the stream is faster than this program the excess is discarded + // by ZMQ, not copied and thrown away here. + tryAssemble(false); + g_acq.pair += acqNow() - g_acq.t2; // pairing + assemble copy + g_acq.n++; + } else { + StreamSlot &sl = slots_[0]; + if (!sl.valid) + continue; + if (assembled_.size() != static_cast(NCH)) + assembled_.assign(static_cast(NCH), 0); + const size_t fullBytes = static_cast(NCH) * 2; + const uint64_t bytes = sl.len * sizeof(short); + const size_t copyBytes = std::min(bytes, fullBytes); + // A single interface may carry the top half: "30027:top" puts the + // slab in the upper rows and zeroes the rest of the frame. Without + // a suffix (or for a full-frame stream) it stays at offset 0. + size_t dstOffset = 0; + const int width = fullW_.load() > 0 ? fullW_.load() : kRawWidth; + const int height = fullH_.load() > 0 ? fullH_.load() : kRawHeight; + const int rows = (width > 0) ? static_cast(copyBytes / + (2 * width)) + : 0; + if (rxSlab_.size() > 0 && rxSlab_[0] == 2 && height > 0 && + rows > 0 && rows < height) { + dstOffset = static_cast(height - rows) * width * 2; + } + memset(assembled_.data(), 0, fullBytes); // both halves start clean + if (copyBytes) + memcpy(reinterpret_cast(assembled_.data()) + dstOffset, + sl.data.data(), copyBytes); + { // say once where a single interface lands + static bool told = false; + if (!told && rows > 0) { + told = true; + printf("[frames] single interface %d: %dx%d at rows %d..%d" + " (%s)%s\n", + rxPorts_[0], width, rows, + static_cast(dstOffset / (2 * width)), + static_cast(dstOffset / (2 * width)) + rows, + dstOffset ? "top" : "bottom", + (rows == height) ? " [full frame]" : ""); + fflush(stdout); + } + } + sl.valid = false; + + gate_.noteReceived(bytes, false); + + if (pedeAcqActive_.load() && + (gate_.scFilter() < 0 || gate_.scFilter() == track_[0].sc.load())) + acquirePede(assembled_.data()); + + std::shared_ptr peds = + gNoPede.load() ? nullptr : PedestalStore::instance().get(); + const int g1off = G1Poffset.load(); + const int g2off = G2Poffset.load(); + uint64_t above = 0; + bool scDropped = false; + const bool forward = gate_.evaluate( + assembled_.data(), static_cast(NCH), + track_[0].sc.load(), peds.get(), g1off, g2off, above, + &scDropped); + if (!forward && !scDropped && gPedeTracking.load() && + gate_.enabled()) { + const GateEngine::Counters gc = gate_.snapshot(); + int rx0 = 0, ry0 = 0, rx1 = 1024, ry1 = 512; + if (gate_.roiSet()) + gate_.roiSnapshot(rx0, ry0, rx1, ry1); + pedeTrackerFeed( + assembled_.data(), static_cast(NCH), peds.get(), + pedeTrackSignalDropRate(gc.framesPassCur, gc.framesDropCur, + gc.framesPass, gc.framesDrop), + rx0, ry0, rx1, ry1); + } + + if (forward) { + if (saver_.running()) + offerToSaver(assembled_.data(), fullW_.load(), + fullH_.load(), sl.hdr); + if (zmqPub_) { // verbatim receiver header + payload + if (hdrLen_ > 0) + zmq_send(zmqPub_, hdrBytes_.data(), hdrLen_, + ZMQ_SNDMORE); + zmq_send(zmqPub_, assembled_.data(), + static_cast(std::min(bytes, + fullBytes)), + 0); + } + frames_.publish(assembled_.data(), fullBytes); + gate_.noteForwarded(static_cast(NCH) * 2); + } + } + } +} + +// --------------------------------------------------------------------------- +// Analysis worker pool +// --------------------------------------------------------------------------- +// Steps 1 and 2 are pure per-pixel work on disjoint ranges, and since the +// ROOT histograms are only touched by the deferred sync they are free of ROOT +// state: they can run on several threads with no locking at all. adc_image, +// gain_image, g_pmapAccum and hchptr are written per pixel (disjoint), so only +// the chip spectra - a scatter into 8x502 counters - need per-worker copies +// that the controller merges once per frame (a few thousand adds). +// +// The worker threads are persistent; a frame is handed over with a generation +// counter, so the per-frame cost is two condvar handshakes (~us). +namespace { + +struct FrameJob { + const short *img = nullptr; + const float *g0 = nullptr; + const float *g1 = nullptr; + const float *g2 = nullptr; + bool hasAll = false; + bool useGain = false; + bool doPhotonMap = false; + int G1 = 0, G2 = 0; + int phene = 0; + float pthr = 0.0f; + // gate ROI of this frame (DATA coordinates, half-open, row 0 at the + // bottom): drives the ROI spectra. roiOn == false -> no ROI pixel, the + // ROI spectra stay empty for this frame. + bool pmapSave = false; // also accumulate into the save map + bool roiOn = false; + int roiX0 = 0, roiY0 = 0, roiX1 = 1024, roiY1 = 512; + // photon counting value: adcpedecorr, or adcpedecorr / (ADU per keV) when + // the gain correction is on (the threshold then means keV). The map is + // used when loaded, the nominal 40 ADU/keV otherwise. + const double *pcGain = nullptr; + double pcNominalGain = 0.0; + // calibration (g0 of the gain map, ADU/keV); nullptr -> no keV spectra + const double *gain = nullptr; + // ADU/keV to use when no map is loaded but the keV view is on (nominal + // 40 ADU/keV); 0 -> do not accumulate the keV set at all + double nominalGain = 0.0; +}; + +std::mutex g_poolMtx; +std::condition_variable g_poolWorkCv; +std::condition_variable g_poolDoneCv; +FrameJob g_job; +uint64_t g_poolGen = 0; +int g_poolPending = 0; +bool g_poolStop = false; +int g_nWorkers = 1; +std::vector g_workerThreads; +std::atomic g_workerError{false}; +struct ChipCounts { + uint32_t c[8][kChipOverflowBins]; + uint32_t k[8][kChipOverflowBins]; // same, in keV +}; +struct RoiCounts { + uint32_t c[kChipOverflowBins]; + uint32_t k[kChipOverflowBins]; +}; +std::vector g_workerChip; +std::vector g_workerRoi; // one spectrum over the gate-ROI pixels +std::vector g_workerFills; + +// processes pixel range [i0,i1) of the current job (steps 1 and 2) +void analysisRange(int widx, int i0, int i1, const FrameJob &job) { + const short *img = job.img; + const float *g0 = job.g0, *g1 = job.g1, *g2 = job.g2; + uint32_t(*chip)[kChipOverflowBins] = g_workerChip[widx].c; + uint32_t(*kevChip)[kChipOverflowBins] = g_workerChip[widx].k; + uint32_t *roi = g_workerRoi[widx].c; + uint32_t *roiKev = g_workerRoi[widx].k; + double fills = 0.0; + // hot pixel mask for this frame (one atomic load, not one per pixel) + const auto hmask = hotMaskSnapshot(); + + // ---- step 1: ADC / gain images -------------------------------------- + for (int i = i0; i < i1; i++) { + const int adcvalue = img[i] & 0x3fff; + const int gain = (img[i] & 0xc000) ? ((img[i] >> 14) & 0x3) : 0; + float disp = float(adcvalue) - (g0 ? g0[i] : 0.0f); + if ((i % 256 == 0) || (i % 256 == 255)) + disp = int(disp / factor); + if ((i / 1024 == 255) || (i / 1024 == 256) || (i / 1024 == 767) || + (i / 1024 == 768)) + disp = int(disp / factor); + adc_image[i] = disp; + gain_image[i] = gain; + } + + // ---- step 2: photon counting + PH spectra + photon map --------------- + for (int i = i0; i < i1; i++) { + // Masked pixels contribute nothing to the PH spectra, the chip spectra + // or the photon map - they are not part of the detector signal. + if (hmask && i < hmask->size() && (*hmask)[static_cast(i)]) + continue; + const int adcvalue = img[i] & 0x3fff; + const int gain = (img[i] & 0xc000) ? ((img[i] >> 14) & 0x3) : 0; + float adcpedecorr = 0.0f; + + // Pedestal-subtracted ADC, with the Jungfrau gain-bit conversion for + // pixels flagged as high-gain (g1) or gain-3 (g2). "Apply gain" does + // not touch this: it is what divides the value by ADU/keV for the keV + // spectra (see the kbin block), so the ADU side stays raw ADC. + if (job.g0) { + if (gain == 0 || !job.hasAll) + adcpedecorr = (adcvalue & 0x3fff) - g0[i]; + if (gain == 1 && job.hasAll) + adcpedecorr = (g1[i] + job.G1 - adcvalue) * 30.0; + if (gain == 3 && job.hasAll) + adcpedecorr = (g2[i] + job.G2 - adcvalue) * 340.0; + } else { + adcpedecorr = float(adcvalue); + } + // Photon counting: the threshold (and the multiplicity that follows + // from it) is in ADU, or in keV while the gain correction is on - the + // same ADU/keV the keV spectra use, so the two never disagree. + float pcval = adcpedecorr; + if (job.pcGain) + pcval = adcpedecorr / static_cast(job.pcGain[i]); + else if (job.pcNominalGain > 0.0) + pcval = static_cast(adcpedecorr / job.pcNominalGain); + if (pcval > job.pthr && job.g0) { + int inc = 1; + if (job.phene > 0) + inc = (int)((pcval + job.pthr) / + static_cast(job.phene)); + hchptr[i] = hchptr[i] + inc; + if (job.doPhotonMap) { + g_pmapAccum[i] += static_cast(inc); + fills += 1.0; + if (job.pmapSave && i < g_pmapSaveAccum.size()) + g_pmapSaveAccum[i] += static_cast(inc); + } + } + + // Chip spectra, with the same 20-column / 20-row border exclusion the + // original display used. i is the linear data index, so i%1024 is the + // column and i/1024 the DATA row (row 0 = bottom, see README.md). + const int px = i % 1024; + const int py = i / 1024; + if (px < 1004 && px > 20 && py > 20) { + const int ichip = i / (256 * 256 * 4) * 4 + ((i / 256) % 4); + int schip = ichip; +#ifdef JFSTRX + schip = 0; + if (ichip == 1) { + if (i <= (1024 * (64 - 2))) + schip = 0; + if (i > (1024 * (64 + 6)) && i <= (1024 * (64 * 2 - 4))) + schip = 1; + if (i > (1024 * (64 * 2 + 5))) + schip = 2; + } + if (ichip == 6) { + if (i <= (1024 * (256 + 2 * 64 - 5))) + schip = 7; + if (i > (1024 * (256 + 2 * 64 + 4)) && + i <= (1024 * (256 + 64 * 3 - 6))) + schip = 6; + if (i > (1024 * (256 + 64 * 3 - 4))) + schip = 5; + } +#endif + const int bin = chipBin(adcpedecorr); + chip[schip][bin]++; + // calibration for the keV spectra: the same pixel/trim, but the + // value divided by the pixel's ADU/keV. The keV axes are the ADU + // axes / KEV_NOMINAL_ADU with the same bin count, so multiplying + // by the nominal constant maps keV onto the ADU bin index. + int kbin = -1; + const double gainVal = job.gain ? job.gain[i] : job.nominalGain; + if (gainVal > 0.1) { + const double kev = adcpedecorr / gainVal; + kbin = chipBin(kev * KEV_NOMINAL_ADU); + kevChip[schip][kbin]++; + } + // the ROI spectra are the same thing restricted to the gate ROI, + // and keep the border trim so they are a strict subset of hchip + if (job.roiOn && px >= job.roiX0 && px < job.roiX1 && + py >= job.roiY0 && py < job.roiY1) { + roi[bin]++; + if (kbin >= 0) + roiKev[kbin]++; + } + } + } + g_workerFills[widx] = fills; +} + +void analysisWorkerBody(int widx) { + uint64_t seen = 0; + for (;;) { + int i0 = 0, i1 = 0; + FrameJob job; + { + std::unique_lock lk(g_poolMtx); + g_poolWorkCv.wait(lk, [&] { + return g_poolGen != seen || g_poolStop; + }); + if (g_poolStop) + return; + seen = g_poolGen; + job = g_job; + i0 = widx * (NCH / 1024 / g_nWorkers) * 1024; + i1 = (widx + 1 == g_nWorkers) + ? NCH + : (widx + 1) * (NCH / 1024 / g_nWorkers) * 1024; + } + // An exception must never leave a std::thread's function: that calls + // std::terminate and kills the whole program. Report and carry on. + try { + analysisRange(widx, i0, i1, job); + } catch (const std::exception &e) { + if (!g_workerError.exchange(true)) + fprintf(stderr, "[analysis] worker %d exception: %s\n", widx, + e.what()); + } catch (...) { + if (!g_workerError.exchange(true)) + fprintf(stderr, "[analysis] worker %d unknown exception\n", + widx); + } + { + std::lock_guard lk(g_poolMtx); + if (--g_poolPending == 0) + g_poolDoneCv.notify_one(); + } + } +} + +void startAnalysisWorkers(int n) { + if (n < 1) + n = 1; + if (n > 32) + n = 32; + g_nWorkers = n; + g_workerChip.resize(n); + g_workerRoi.resize(n); + for (int k = 0; k < n; k++) { + memset(&g_workerChip[k], 0, sizeof(ChipCounts)); + memset(&g_workerRoi[k], 0, sizeof(RoiCounts)); + } + g_workerFills.assign(n, 0.0); + g_poolStop = false; + g_poolGen = 0; + for (int k = 1; k < n; k++) // worker 0 is the analysis thread itself + g_workerThreads.emplace_back(analysisWorkerBody, k); +} + +void stopAnalysisWorkers() { + { + std::lock_guard lk(g_poolMtx); + g_poolStop = true; + } + g_poolWorkCv.notify_all(); + for (auto &t : g_workerThreads) { + if (t.joinable()) + t.join(); + } + g_workerThreads.clear(); +} + +// Runs steps 1+2 for a whole frame: worker 0 is the analysis thread, the +// others are woken through the generation counter; the chip spectra of every +// worker are merged (and cleared) once the frame is done. +void runAnalysisFrame(const FrameJob &job) { + if (g_nWorkers <= 1) { + analysisRange(0, 0, NCH, job); + } else { + { + std::lock_guard lk(g_poolMtx); + g_job = job; + g_poolPending = g_nWorkers - 1; + ++g_poolGen; + } + g_poolWorkCv.notify_all(); + const int rows = NCH / 1024; + const int rowsPer = rows / g_nWorkers; + analysisRange(0, 0, rowsPer * 1024, job); + { + std::unique_lock lk(g_poolMtx); + g_poolDoneCv.wait(lk, [] { return g_poolPending == 0; }); + } + } + for (int k = 0; k < g_nWorkers; k++) { + auto *w = g_workerChip[k].c; + auto *wk = g_workerChip[k].k; + auto *r = g_workerRoi[k].c; + auto *rk = g_workerRoi[k].k; + for (int ic = 0; ic < 8; ic++) { + for (int b = 0; b < kChipOverflowBins; b++) { + const uint32_t v = w[ic][b]; + if (v) { + g_chipAccum[ic][b] += v; + w[ic][b] = 0; + } + const uint32_t vk = wk[ic][b]; + if (vk) { + g_kevAccum[ic][b] += vk; + wk[ic][b] = 0; + } + } + } + for (int b = 0; b < kChipOverflowBins; b++) { + const uint32_t vr = r[b]; + if (vr) { + g_roiAccum[b] += vr; + r[b] = 0; + } + const uint32_t vrk = rk[b]; + if (vrk) { + g_roiKevAccum[b] += vrk; + rk[b] = 0; + } + } + g_pmapFills += g_workerFills[k]; + g_pmapFrames++; + g_workerFills[k] = 0.0; + } +} + +} // namespace + +// --------------------------------------------------------------------------- +// analysis thread: pedestals -> images -> ROOT fills +// --------------------------------------------------------------------------- +void Pipeline::analysisLoop() { + std::vector in; + size_t inLen = 0; + uint64_t inSeq = 0; + g_timing = (getenv("JF_TIMING") != nullptr); + const auto tStart = std::chrono::steady_clock::now(); + + while (running_.load()) { + try { // an escaping exception would abort the process + if (g_workerError.exchange(false)) + gate_.setLastError("analysis worker failed - see stderr"); + { + TT tt(g_timing ? &tTake : nullptr); + if (!frames_.waitTake(in, inLen, inSeq, running_)) + continue; + } + if (!running_.load()) + break; + + if (gFrameCountReset.exchange(false)) + framesinstream.store(0); + + { + TT tt(g_timing ? &tCopy : nullptr); + const size_t copyBytes = + std::min(inLen * sizeof(short), sizeof(image_data)); + if (copyBytes) + memcpy(image_data, in.data(), copyBytes); + } + tFrames += g_timing ? 1 : 0; + + if (goout.load() == 0) + continue; // paused: no counters, no fills, no ROOT redraw + + const std::shared_ptr pedsSp = + gNoPede.load() ? nullptr : PedestalStore::instance().get(); + const PedeSet *peds = pedsSp.get(); + const bool havePede = (peds != nullptr); + const bool hasAll = havePede && peds->hasAll; + const float *g0 = havePede ? peds->g0.data() : nullptr; + const float *g1 = hasAll ? peds->g1.data() : nullptr; + const float *g2 = hasAll ? peds->g2.data() : nullptr; + const int G1 = G1Poffset.load(); + const int G2 = G2Poffset.load(); + const bool useGain = gain_flag.load(); + + const uint64_t fsn = framesinstream.fetch_add(1) + 1; + int hde = HDraw_every.load(); + if (hde < 1) + hde = 1; + // "every N analysed frames" (the Faster/Slower knob), plus a floor so a + // slowly gated stream still shows every frame: display anyway when the + // previous image is older than DISPLAY_FLOOR_MS + const int64_t dispNow = nowMs(); + bool show2Ds = ((fsn % static_cast(hde)) == + static_cast(hde - 1)); + if (!show2Ds && dispNow - g_lastShownMs >= DISPLAY_FLOOR_MS) + show2Ds = true; + if (show2Ds) { + g_lastShownMs = dispNow; + gImagesShown.fetch_add(1); + } + + processedf++; + gFramesForRoot.fetch_add(1); + + // Every mutation of the source histograms below (including the + // windowed scatter reset) happens under gHistoMtx. The ROOT thread's + // "Reset His" takes the same lock, so a Reset() can never race the + // per-frame Fill(). The lock is released at the end of this + // iteration (copyBins() on the ROOT side is intentionally lock-free). + std::lock_guard histoLock(gHistoMtx); + ensureAccumulators(); // allocation + zeroing under the same lock + + // open a fresh accumulation window for the scatter plots after each + // ROOT redraw (the photon map itself stays cumulative) + if (gSoftResetPending.exchange(false)) { + his4500->Reset(); + hisLvsR->Reset(); + } + // "Reset His" requested by the GUI: the analysis thread performs it + // here, where the lock is already held, so the ROOT thread never has to + // wait for gHistoMtx (which it can starve under a heavy stream) + if (gResetHisPending.exchange(false)) { + historesetSourcesLocked(); + forceRootRedraw(); // repaint the cleared histograms + wake the ROOT thread + } + + // ---- 1+2) per-frame images, photon counting, spectra, photon map -- + // (pure per-pixel work over disjoint ranges - see runAnalysisFrame) + { + TT tt(g_timing ? &tStep1 : nullptr); + FrameJob job; + job.img = image_data; + job.g0 = g0; + job.g1 = g1; + job.g2 = g2; + job.hasAll = hasAll; + job.useGain = useGain; + job.doPhotonMap = dophotonmap.load(); + // only while a save is actually running: the save map is pure + // overhead otherwise + job.pmapSave = (gSaveMode.load() == 1 && saver_.running()); + job.G1 = G1; + job.G2 = G2; + // photon peak ~= 2 x the ADU threshold (the historic relation + // between the argument and its threshold) + // ADU normally, keV while the gain correction is on (the GUI keeps + // one spinbox per unit and swaps them with the gain button) + const bool gainStage = gain_flag.load(); + const float pthr = gainStage ? g_pheneThresholdKev + : g_pheneThreshold; + job.phene = static_cast(2.0f * pthr + 0.5f); + job.pthr = pthr; + // calibration snapshot (shared_ptr keeps it alive for this frame) + const std::shared_ptr gainSp = + GainMapStore::instance().get(); + // keV spectra exist only while the gain stage is active: with the + // gain off the display is ADU, so nothing is converted (and the + // per-pixel divide is skipped) + const bool kevOn = kevSpectra.load() && gain_flag.load(); + job.gain = (gainSp && kevOn) ? gainSp->g0() : nullptr; + // no map but the operator asked for keV: use the nominal + // 40 ADU/keV ("no gain map selected - using nominal values") + job.nominalGain = (!gainSp && kevOn) ? KEV_NOMINAL_ADU : 0.0; + // the photon counting follows the gain stage itself, not the keV PH + // checkbox (that one only decides what the spectra display) + job.pcGain = (gainSp && gainStage) ? gainSp->g0() : nullptr; + job.pcNominalGain = (!gainSp && gainStage) ? KEV_NOMINAL_ADU : 0.0; + // The gate ROI is read ONCE per frame and published for everything + // that shows it (ADC overlay is set by the GUI from the same + // snapshot, ROOT box + ROI spectra from this job), so image and + // ROOT can never disagree about where the ROI is. The rectangle + // is in DATA rows (row 0 = bottom); a torn/degenerate snapshot + // falls back to "no ROI". + { + int rx0 = 0, ry0 = 0, rx1 = kRawWidth, ry1 = kRawHeight; + // A ROI that exists is enough for the ROI spectra and the box: + // "ROI only" controls whether the GATE is restricted to it, not + // whether the ROI is shown. (roiActive() is only true while + // "ROI only" is on, which left A7 empty for a plain selection.) + bool on = gate_.roiSet(); + if (on) + gate_.roiSnapshot(rx0, ry0, rx1, ry1); + if (rx1 <= rx0 || ry1 <= ry0) { + on = false; + rx0 = 0; + ry0 = 0; + rx1 = kRawWidth; + ry1 = kRawHeight; + } + job.roiOn = on; + job.roiX0 = rx0; + job.roiY0 = ry0; + job.roiX1 = rx1; + job.roiY1 = ry1; + ROIxmin.store(static_cast(rx0)); + ROIxmax.store(static_cast(rx1)); + ROIymin.store(static_cast(ry0)); + ROIymax.store(static_cast(ry1)); + ROIactive.store(on); + } + runAnalysisFrame(job); + } + + // ---- 3) T vs B / L vs R from the current frame ------------------- + { + TT tt(g_timing ? &tStep3 : nullptr); + for (int ipx = 0; ipx < 1024; ipx++) { + his4500->Fill(adc_image[ipx + (512 - 21) * 1024], + adc_image[ipx + 20 * 1024]); + } + for (int ipy = 0; ipy < 512; ipy++) { + hisLvsR->Fill(adc_image[20 + ipy * 1024], + adc_image[1024 - 21 + ipy * 1024]); + } + } + + // ---- 4) raw-ADC map accumulation on the display cadence ---------- + { + TT tt(g_timing ? &tStep4 : nullptr); + if (!dophotonmap.load() && show2Ds) { + for (int ipx = 0; ipx < 1024; ipx++) { + for (int ipy = 0; ipy < 512; ipy++) { + g_pmapAccum[ipx + ipy * 1024] += + adc_image[ipx + ipy * 1024]; + g_pmapFills += 1.0; + } + } + } + } + + // ---- 4b) push the accumulators into the ROOT histograms ---------- + // (at the redraw cadence - the canvases are painted once per + // rootUpdateMs, so nothing is lost by not doing this per frame) + { + TT tt(g_timing ? &tSync : nullptr); + syncAccumulators(nowMs()); + } + +#ifdef JFSTRX + if (show2Ds) { + jungfrauLGADStrixelsData *decoder = new jungfrauLGADStrixelsData(); + const int g1_nrows = 165, g2_nrows = 320, g3_nrows = 476; + // Six-panel output, index 0..2 = chip1 g1/g2/g3, 3..5 = chip6 + // g1/g2/g3, and the mapped-image row at which each panel starts. + static const int panelStartY[kNumAdcPanels] = {0, 165, 485, + 1757, 1437, 961}; + for (int p = 0; p < kNumAdcPanels; p++) { + const size_t n = static_cast(kAdcPanelW[p]) * + static_cast(kAdcPanelH[p]); + if (g_adcPanel[p].size() != n) + g_adcPanel[p].assign(n, 0.0f); + } + for (int ipx = 0; ipx < nx; ipx++) { + for (int ipy = 0; ipy < ny; ipy++) { + const int i = + int(((decoder->dataMap[ipy][ipx]) - sizeof(header)) / 2); + const int group = decoder->groupmap[ipy][ipx]; + const float value = + static_cast(image_data[i] & 0x3fff) - + (g0 ? g0[i] : 0.0f); + static const int mc1g1y_start = 0; + static const int mc1g2y_start = g1_nrows; + static const int mc1g3y_start = g1_nrows + g2_nrows; + static const int mc6g3y_start = + g1_nrows + g2_nrows + g3_nrows; + static const int mc6g2y_start = mc6g3y_start + g3_nrows; + static const int mc6g1y_start = + mc6g3y_start + g3_nrows + g2_nrows; + if (group == 0) { + if (ipy < 165) + his1000->Fill(float(ipx), + float(ipy - mc1g1y_start), value); + if (ipy >= mc6g1y_start) + his1060->Fill(float(ipx), + float(ipy - mc6g1y_start), value); + } + if (group == 1) { + if (ipy < (165 + 320)) + his1001->Fill(float(ipx), + float(ipy - mc1g2y_start), value); + if (ipy >= mc6g2y_start && ipy < mc6g1y_start) { + his1061->Fill(float(ipx), + float(ipy - mc6g2y_start), value); + } + } + if (group == 2) { + if (ipy < (165 + 320 + 476)) + his1002->Fill(float(ipx), + float(ipy - mc1g3y_start), value); + if (ipy >= mc6g3y_start && ipy < mc6g2y_start) + his1062->Fill(float(ipx), + float(ipy - mc6g3y_start), value); + } + // Feed the separate six-panel window with the mapped + // groups. The Qt ADC/gain images stay raw 1024x512. + if (group >= 0 && group <= 2) { + const int base = (ipy >= mc6g3y_start) ? 3 : 0; + const int p = base + group; + const int lx = ipx; + const int ly = ipy - panelStartY[p]; + if (lx >= 0 && lx < kAdcPanelW[p] && ly >= 0 && + ly < kAdcPanelH[p]) { + g_adcPanel[p][static_cast(lx) + + static_cast(ly) * + kAdcPanelW[p]] = value; + } + } + } + } + delete decoder; + } +#endif + + // ---- 5) hand the displayed images to the Qt timer ---------------- + { + TT tt(g_timing ? &tStep5 : nullptr); + if (show2Ds) { + std::lock_guard lock(images_.mtx); + // The ADC/gain windows are ALWAYS the raw 1024x512 layout, so + // the gate-ROI selection stays in raw data coordinates even + // under JFSTRX. + const size_t nPix = static_cast(NCH); + if (images_.adc.size() != nPix) { + images_.adc.assign(nPix, 0.0f); + images_.gain.assign(nPix, 0.0f); + } + memcpy(images_.adc.data(), adc_image, nPix * sizeof(float)); + memcpy(images_.gain.data(), gain_image, nPix * sizeof(float)); +#ifdef JFSTRX + // the mapped groups for the separate six-panel window + for (int p = 0; p < kNumAdcPanels; p++) { + const size_t n = g_adcPanel[p].size(); + if (images_.panels[p].size() != n) + images_.panels[p].resize(n); + if (n) + memcpy(images_.panels[p].data(), g_adcPanel[p].data(), + n * sizeof(float)); + } + images_.panelsReady = true; +#endif + images_.ready = true; + images_.seq = inSeq; + } + } + + // ---- 5a) the map that will be saved ------------------------------ + // Filled in the same worker pass (job.pmapSave), published every + // gPmapSaveEvery analysed frames, never cumulative. + // NOTE: gHistoMtx is already held here (histoLock, top of the frame): + // taking it again deadlocked the analysis thread on the first frame. + if (gSaveMode.load() == 1 && saver_.running()) { + if (g_pmapSaveAccum.size() != static_cast(NCH)) + g_pmapSaveAccum.assign(static_cast(NCH), 0.0f); + if (++g_pmapSaveCount >= + static_cast(std::max(1, gPmapSaveEvery.load()))) { + PmapSlot &slot = pmapSave(); + { + std::lock_guard sl(slot.mtx); + if (slot.map.size() != static_cast(NCH)) + slot.map.assign(static_cast(NCH), 0.0f); + memcpy(slot.map.data(), g_pmapSaveAccum.data(), + static_cast(NCH) * sizeof(float)); + slot.frames = g_pmapSaveCount; + slot.seq++; + slot.ready = true; + } + std::fill(g_pmapSaveAccum.begin(), g_pmapSaveAccum.end(), 0.0f); + g_pmapSaveCount = 0; + } + } + + // ---- 5b) the photon map, on its own cadence ---------------------- + // Every gPmapEvery ANALYSED frames the window gets the map: the photons + // counted since the previous publish when it is not cumulative (the + // default), or the running total when it is. "Analysed" means frames + // that survived the gate and the decimation, so the cadence is not + // independent of them: rejecting or skipping frames stretches the + // wall-clock interval between two maps. + { + const int every = std::max(1, gPmapEvery.load()); + if (static_cast(every) > 0 && + (fsn % static_cast(every)) == 0 && + !g_pmapAccum.empty()) { + std::lock_guard lock(images_.mtx); + if (images_.photon.size() != static_cast(NCH)) + images_.photon.assign(static_cast(NCH), 0.0f); + memcpy(images_.photon.data(), g_pmapAccum.data(), + static_cast(NCH) * sizeof(float)); + images_.photonReady = true; + images_.photonSeq = fsn; + if (!gPmapCumulative.load()) { // fresh image every time + std::fill(g_pmapAccum.begin(), g_pmapAccum.end(), 0.0f); + g_pmapFills = 0; + g_pmapFillsSynced = 0; + } + } + } + } catch (const std::exception &e) { + fprintf(stderr, "[analysis] exception: %s (analysis stopped)\n", + e.what()); + fflush(stderr); + gate_.setLastError(std::string("analysis: ") + e.what()); + break; + } catch (...) { + fprintf(stderr, "[analysis] unknown exception (analysis stopped)\n"); + fflush(stderr); + gate_.setLastError("analysis: unknown exception"); + break; + } + } + + // final flush so the histograms match the accumulators when we stop + { + std::lock_guard lock(gHistoMtx); + syncAccumulators(nowMs(), true); + } + + if (g_timing && tFrames > 0) { + const double n = static_cast(tFrames); + const double wall = std::chrono::duration( + std::chrono::steady_clock::now() - tStart) + .count(); + printf("[timing] frames=%llu wall=%.1fs implied_rate=%.0ffps\n", + static_cast(tFrames), wall, + tFrames / (wall > 0 ? wall : 1)); + printf("[timing] per-frame us: take=%.0f copy=%.0f pixelwork=%.0f " + "step3_scatter=%.0f step4_rawmap=%.0f sync=%.0f " + "step5_publish=%.0f | sum=%.0f\n", + tTake / n, tCopy / n, tStep1 / n, tStep3 / n, tStep4 / n, + tSync / n, tStep5 / n, + (tTake + tCopy + tStep1 + tStep3 + tStep4 + tSync + tStep5) / n); + fflush(stdout); + } +} + +// --------------------------------------------------------------------------- +// "Reset His": reset the source accumulators. The analysis thread is the +// only writer of the source histograms, so a reset from the ROOT thread must +// take gHistoMtx (the analysis thread holds it around every frame's fills). +// --------------------------------------------------------------------------- +void historesetSources() { + std::lock_guard lock(gHistoMtx); + historesetSourcesLocked(); +} + +// gHistoMtx already held (the analysis thread applies a pending "Reset His" +// here, at the top of a frame, so the ROOT thread never waits for the lock). +void historesetSourcesLocked() { + resetAccumulators(); // must match the Reset() below + if (his4500) + his4500->Reset(); + if (hisLvsR) + hisLvsR->Reset(); + if (his3000) + his3000->Reset(); + if (hchip) { + for (int k = 0; k < 8; k++) { + if (hchip[k]) + hchip[k]->Reset(); + } + } + if (hroi) + hroi->Reset(); + if (hchipKev) { + for (int k = 0; k < 8; k++) { + if (hchipKev[k]) + hchipKev[k]->Reset(); + } + } + if (hroiKev) + hroiKev->Reset(); +#ifdef JFSTRX + if (his1000) + his1000->Reset(); + if (his1001) + his1001->Reset(); + if (his1002) + his1002->Reset(); + if (his1060) + his1060->Reset(); + if (his1061) + his1061->Reset(); + if (his1062) + his1062->Reset(); +#endif +} diff --git a/slsDetectorCalibration/jungfrauExecutables/jf_online_display_gui/online_jf_gui.cpp b/slsDetectorCalibration/jungfrauExecutables/jf_online_display_gui/online_jf_gui.cpp new file mode 100644 index 000000000..12abee7a2 --- /dev/null +++ b/slsDetectorCalibration/jungfrauExecutables/jf_online_display_gui/online_jf_gui.cpp @@ -0,0 +1,5739 @@ +// SPDX-License-Identifier: LGPL-3.0-or-other +// =========================================================================== +// online_jf_gui.cpp -- Qt5 GUI, fast image widgets, CLI parsing, main(). +// +// Merged from: +// onlinedisp_zmq.cpp (FastImageView, MainWindow, display controls) +// jf_event_finder_gui.cpp (gate parameters, counters, pedestal loading) +// +// The GUI thread never touches ROOT graphics and never touches a frame +// buffer that an +//other thread is writing: frames come from the analysis +// thread through ImageMailbox and are copied into the widgets' own storage. +// =========================================================================== +#include "online_jf.h" + +#include +#include +#include +#include +#include + +#include + +namespace { + +std::sig_atomic_t g_sigCount = 0; + +void handleSigint(int) { + // Async-signal-safe: only count. The Qt timer performs the shutdown + // (blocking joins are not signal-safe). A second Ctrl-C force-quits. + if (++g_sigCount > 1) + std::_Exit(0); +} + +// --------------------------------------------------------------------------- +// The flow chart is drawn with arrow labels placed in the layout between the +// boxes: 1. storage cell -> Pedestal -> 2. signal gate -> Gain -> ROI save. +// A stage that is switched off is hidden, so the arrows that pointed at it +// disappear and the flow reads as the bypass it is. +// --------------------------------------------------------------------------- +// The strip between the two columns. It draws the connectors that cross from +// one column to the other as proper orthogonal arrows with a filled head, so +// the flow reads as one path instead of a few loose glyphs. +// Flow colours. The geometry of the diagram is fixed; only the class of an +// arrow can change (see FlowStrip::setSaveMode), so a bypassed stage is greyed +// as a panel while the data flow stays readable. +enum FlowClass { + FlowNormal = 0, // analysis / display flow + FlowPedestal, // the pedestal path (incl. the tracking feedback) + FlowData, // the chain that ends in the saved file -> orange + FlowOff // a feeder that is bypassed at the moment -> pale +}; +static QString flowColor(int cls) { + switch (cls) { + case FlowPedestal: + return QString("#a8c8e8"); // lighter blue + case FlowData: + return QString("#de7d14"); // orange + case FlowOff: + return QString("#c9c9c9"); // bypassed: drawn, but not carrying data + case FlowNormal: + default: + return QString("#5b9bd5"); // light blue + } +} + +class FlowStrip : public QWidget { + public: + explicit FlowStrip(QWidget *parent) : QWidget(parent) { + setMinimumWidth(64); + setToolTip( + "Data flow. Orange: everything the saved data travels through -\n" + "frames: storage cell -> Pedestal -> Gain -> ROI -> Save, photon\n" + "maps: ... -> Gain -> counting -> (ROI ->) Save (the maps always\n" + "use the pedestal). The ROI is fed by the Gain for frames and by\n" + "the counting for the maps, always in orange: it only exists for\n" + "the file. Light blue: the branches that only feed the display.\n" + "Lighter blue: the pedestal tracking pair. The display can use the\n" + "pedestal while the file does not (or the other way round), which is\n" + "why both feeders into the gate funnel can be drawn at once."); + // Fixed width for the strip, Preferred (not Expanding) height: an + // Expanding vertical policy made the whole column row as tall as the + // window, which left a large empty band above the save panel. + setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Preferred); + } + // The endpoints are computed by MainWindow::layoutFlow() (main thread, + // layout settled) and handed over as plain coordinates in this widget's + // space, so painting never has to walk the widget tree. + static const int kFunnelX = 24; // where the flow passes the gate + + struct Path { + int yFrom = 0, yTo = 0; + int dir = 1; // +1 left->right, -1 right->left, +2 right rail (Gain->ROI) + bool on = true; + int cls = FlowNormal; + int x = 0; // 0: default jog, else the vertical runs here + bool head = true; // false: the line merges into a junction + bool startAtJog = false; // begin on the vertical, not at an edge + }; + // Everything that depends on the stage states: which feeder carries the + // data (pedestal or the raw bypass), which branch feeds the file, and + // whether the gate funnel is active. Geometry never moves. + // `displayPede`: the display chain uses the pedestal (the Pede/Raw toggle). + // `savePede`: the data being written does (Pedestal corrected, or photon + // maps, which need g0). They can differ - the usual case is a corrected + // display with raw frames going to the file - so the two feeders into the + // funnel can be live at the same time, and their colour says what each one + // carries: orange for the file, light blue for the display. + void setStages(bool displayPede, bool savePede, bool gateOn, + bool photonMaps) { + const bool pedeUsed = displayPede || savePede; + // A route that carries nothing is not drawn at all (grey was more + // confusing than helpful). + p1_.on = pedeUsed; // storage cell -> Pedestal + p2_.on = pedeUsed; // Pedestal -> funnel + p8_.on = !savePede; // storage cell -> funnel: the raw save route + const int pedeCls = savePede ? FlowData : FlowNormal; + p1_.cls = pedeCls; // storage cell -> Pedestal + p2_.cls = pedeCls; // Pedestal -> funnel + p3_.cls = FlowData; // funnel -> Gain: always on the route to the file + p8_.cls = FlowData; // storage cell -> funnel (raw save) + // The ROI only exists for the file, so its input is always orange - and + // it comes from whichever stage produces the saved product: the Gain + // for frames, the counting for the maps. + p4_.cls = FlowData; // Gain -> ROI + p4_.on = !photonMaps; + p9_.cls = FlowData; // counting -> ROI (the maps are ROI-cropped too) + p9_.on = photonMaps; + p6_.cls = photonMaps ? FlowData : FlowNormal; // Gain -> counting + funOn_ = gateOn; + update(); + } + void setPaths(const Path &a, const Path &b, const Path &c, const Path &d, + const Path &e, const Path &f, const Path &g, const Path &h, + const Path &i, int funnelY) { + p1_ = a; + p2_ = b; + p3_ = c; + p4_ = d; + p5_ = e; + p6_ = f; + p7_ = g; + p8_ = h; + p9_ = i; + funY_ = funnelY; + update(); + } + + protected: + void paintEvent(QPaintEvent *) override { + QPainter p(this); + p.setRenderHint(QPainter::Antialiasing, true); + cross(p, p1_); // 1. storage cell -> Pedestal + cross(p, p2_); // Pedestal -> 2. signal gate + cross(p, p3_); // 2. signal gate -> Gain + cross(p, p4_); // Gain -> ROI, down the right-hand rail + cross(p, p5_); // 2. signal gate -> Pedestal tracking (dropped frames) + cross(p, p6_); // Gain -> Virtual photon counting (calibration) + cross(p, p7_); // Virtual photon counting -> Display (the map) + cross(p, p8_); // storage cell -> funnel: the raw (no-pede) bypass + cross(p, p9_); // Virtual photon counting -> ROI (maps) + drawFunnel(p); // the signal gate, drawn as the filter it is + } + + private: + Path p1_, p2_, p3_, p4_, p5_, p6_, p7_, p8_, p9_; + int funY_ = -1; + bool funOn_ = true; + + // The signal gate does not change the data, it only decides which frames + // travel on: it is drawn as a funnel on the line, with a short blue arrow + // from the gate panel into its side (the gate is what "gates"). With the + // gate switched off the symbol greys out instead of disappearing. + void drawFunnel(QPainter &p) { + if (funY_ < 0) + return; + const QColor c(flowColor(funOn_ ? FlowNormal : FlowOff)); + QPen pen(c); + pen.setWidth(2); + p.setPen(pen); + const int hw = 10, hh = 18; + QPolygon f; + f << QPoint(kFunnelX - hw, funY_ - hh / 2) + << QPoint(kFunnelX + hw, funY_ - hh / 2) + << QPoint(kFunnelX + hw / 3, funY_ + hh / 2) + << QPoint(kFunnelX - hw / 3, funY_ + hh / 2); + p.setBrush(Qt::NoBrush); + p.drawPolygon(f); + // the gate controls the funnel: arrow from the panel into its side + const int tipX = kFunnelX - hw / 3 - 1; + const int fromX = kFunnelX - hw - 14; + p.drawLine(fromX, funY_, tipX, funY_); + QPolygon head; + const int s = 6; + head << QPoint(tipX, funY_) << QPoint(tipX - s, funY_ - s) + << QPoint(tipX - s, funY_ + s); + p.setBrush(c); + p.drawPolygon(head); + p.setBrush(Qt::NoBrush); + } + + // dir = +1 : left edge -> right edge (head on the right) + // dir = -1 : right edge -> left edge (head on the left) + void cross(QPainter &p, const Path &l) { + if (!l.on) + return; + const int yFrom = l.yFrom, yTo = l.yTo, dir = l.dir; + const int w = width(); + QPen pen(QColor(flowColor(l.cls))); + pen.setWidth(2); + p.setPen(pen); + // The vertical part of each connector is put near the edge it ends on, + // and never in the middle: otherwise the three connectors line up into + // one long vertical that looks like it crosses the arrows. + const int jog = (l.x > 0) ? l.x : ((dir > 0) ? (w - 14) : 14); + QPolygon pts; + if (dir == 2) { // both ends on the right: a rail beside the panels + pts << QPoint(w, yFrom) << QPoint(w - 10, yFrom) + << QPoint(w - 10, yTo) << QPoint(w - 2, yTo); + p.drawPolyline(pts); + const QPoint tip(w - 1, yTo); + const int s2 = 7; + QPolygon head; + head << tip << QPoint(tip.x() - s2, tip.y() - s2) + << QPoint(tip.x() - s2, tip.y() + s2); + p.setBrush(p.pen().color()); + p.drawPolygon(head); + p.setBrush(Qt::NoBrush); + return; + } + if (dir > 0) { + if (!l.startAtJog) + pts << QPoint(0, yFrom); + pts << QPoint(jog, yFrom) << QPoint(jog, yTo); + if (l.head) + pts << QPoint(w - 8, yTo); + } else { + if (!l.startAtJog) + pts << QPoint(w, yFrom); + pts << QPoint(jog, yFrom) << QPoint(jog, yTo); + if (l.head) + pts << QPoint(8, yTo); + } + p.drawPolyline(pts); + if (!l.head) + return; // merged into the junction (the funnel) + // filled head at the target end + const QPoint tip = (dir > 0) ? QPoint(w - 1, yTo) : QPoint(1, yTo); + QPolygon head; + const int s = 7; + head << tip << QPoint(tip.x() - dir * s, tip.y() - s) + << QPoint(tip.x() - dir * s, tip.y() + s); + p.setBrush(p.pen().color()); + p.drawPolygon(head); + p.setBrush(Qt::NoBrush); + } +}; + +// Greys a stage box (title and contents) without disabling it, so a bypassed +// stage still works the moment it is switched on again. The widgets in +// 'keepActive' keep their normal text colour: they are the stage's own on/off +// control, and a bypassed stage must still look switchable (everything stays +// clickable either way - this is a look, not an enablement). +void greyStage(QGroupBox *g, bool grey, + std::initializer_list keepActive = {}) { + if (!g) + return; + // grey text plus a tinted background, so a bypassed stage is obvious + static const char *kGrey = + "QGroupBox { color: #9a9a9a; background-color: #ececec; }" + "QGroupBox::title { color: #9a9a9a; }" + "QGroupBox QLabel { color: #9a9a9a; }" + "QGroupBox QPushButton { color: #9a9a9a; }" + "QGroupBox QCheckBox { color: #9a9a9a; }"; + // only restyle on a change, so the panel never flickers + const QVariant was = g->property("flowGrey"); + if (!(was.isValid() && was.toBool() == grey)) { + g->setProperty("flowGrey", grey); + g->setStyleSheet(grey ? kGrey : QString()); + } + for (QWidget *w : keepActive) { + if (!w) + continue; + const QVariant wWas = w->property("flowKeep"); + if (wWas.isValid() && wWas.toBool() == grey) + continue; // only restyle on a change, so nothing flickers + w->setProperty("flowKeep", grey); + // a per-widget rule wins over the group's, so the toggle stays readable + w->setStyleSheet(grey ? "color: #000000;" : QString()); + } +} + +QLabel *makeFlowArrow(const QString &glyph, QWidget *parent, + int cls = FlowNormal) { + auto *l = new QLabel(glyph, parent); + l->setAlignment(Qt::AlignCenter); + l->setStyleSheet(QString("color: %1; font-size: 20px; font-weight: bold;") + .arg(flowColor(cls))); + l->setFixedHeight(24); + return l; +} + +// recolours one of those arrows when the save mode changes +void setFlowArrowClass(QLabel *l, int cls) { + if (l) + l->setStyleSheet(QString("color: %1; font-size: 20px; font-weight: " + "bold;") + .arg(flowColor(cls))); +} + +// --------------------------------------------------------------------------- +// FastImageView: the original widget, with its own pixel storage so that the +// analysis thread can never hand it a buffer it is still writing. +// --------------------------------------------------------------------------- +const QRgb *makePalette() { + static QRgb pal[256]; + for (int i = 0; i < 256; i++) { + double v = i / 255.0; + double r, g, b; + if (v < 0.25) { + r = 0; + g = v * 4; + b = 1; + } else if (v < 0.5) { + r = 0; + g = 1; + b = 1 - (v - 0.25) * 4; + } else if (v < 0.75) { + r = (v - 0.5) * 4; + g = 1; + b = 0; + } else { + r = 1; + g = 1 - (v - 0.75) * 4; + b = 0; + } + pal[i] = qRgb(int(r * 255), int(g * 255), int(b * 255)); + } + return pal; +} +const QRgb *kPalette = makePalette(); +const int MARGIN = 5; +const int SCALE_W = 50; +// The image is drawn as a framed plot: axes with tick labels *outside* the +// plot area (left/bottom), a thin frame, grid lines inside. +const int AXIS_L = 52, AXIS_B = 26, AXIS_T = 6, AXIS_R = 6; +// Deepest zoom: the smallest viewport, in image pixels. The strip-xel build +// maps 25/15/18.75 um pixels into panels of ~1000 x 1900, so it is allowed two +// image pixels across (single-pixel inspection); the plain build stops at 8. +#ifdef JFSTRX +const double kMinViewport = 2.0; +#else +const double kMinViewport = 8.0; +#endif + +class FastImageView : public QWidget { + public: + FastImageView(QWidget *parent = nullptr); + + // copies 'data' into widget-owned storage (GUI thread only) + void setImageCopy(const float *data, int nx, int ny); + // replaces the 256-entry colour table (GUI thread only) + void setPaletteLut(const QRgb *lut); + // log intensity mapping: values <= 0 are capped at 1e-2 before the log + void setLogScale(bool on) { + m_logScale = on; + m_dirty = true; + update(); + } + bool logScale() const { return m_logScale; } + // the in-pixel labels: whole numbers for photon counts, one decimal for the + // real-valued images (ADC, keV) + void setIntegerValues(bool on) { + m_integerValues = on; + update(); + } + // histogram of the last image over its own value range (256 bins), for the + // scale panel that replaced the in-view colour bar + const std::vector &histogram() const { return m_hist; } + void histogramRange(double &lo, double &hi) const { + lo = m_histLo; + hi = m_histHi; + } + // called (GUI thread) when a new image or histogram is ready + std::function onImageChanged; + // called when the colour range changes: the strixel panels mirror the ADC + // scale instead of keeping a stale copy of it + std::function onColorRangeChanged; + std::function onPaletteChanged; + // draw pixels with no counts (value <= 0) white instead of the palette's + // lowest colour, the way ROOT's colz draws empty cells on a white canvas. + // Used by the photon map only; the ADC/gain images keep the full palette. + void setZeroWhite(bool on) { + m_zeroWhite = on; + m_dirty = true; + update(); + } + bool hasImage() const { return m_nx > 0 && m_ny > 0; } + void viewport(double &x, double &y, double &w, double &h) const { + x = m_vpX; + y = m_vpY; + w = vpW(); + h = vpH(); + } + int imageWidth() const { return m_nx; } + int imageHeight() const { return m_ny; } + // Thin yellow rectangle drawn over the image, in DATA coordinates (data + // row 0 is displayed at the bottom, so the view flips it here). Used to + // show the gate ROI, which is a snapshot and does not follow the zoom. + void setOverlayRect(double x0, double y0, double x1, double y1, bool on) { + m_ovX0 = x0; + m_ovY0 = y0; + m_ovX1 = x1; + m_ovY1 = y1; + m_ovOn = on; + update(); + } + + // ---- ROI editor ------------------------------------------------------- + // While active the yellow rectangle can be dragged (inside = move, edges + // and corners = resize, outside = draw a new one) instead of being captured + // from the current zoom. onRoiEdited() reports the rectangle in DATA + // coordinates when the mouse button is released. + void beginRoiEdit(bool on) { + m_roiEdit = on; + m_roiGrab = 0; + setCursor(on ? Qt::CrossCursor : Qt::ArrowCursor); + update(); + } + bool roiEditActive() const { return m_roiEdit; } + std::function onRoiEdited; + // widget pixel -> data coordinates (x right, y up, (0,0) bottom-left) + QPointF widgetToData(QPoint wpos) const { + const QPointF i = widgetToImage(wpos); + return QPointF(i.x(), double(m_ny) - i.y()); + } + + // Red receiver-ROI box, in the same DATA coordinates as the gate ROI. + void setReceiverRoiRect(double x0, double y0, double x1, double y1, + bool on) { + m_rxX0 = x0; + m_rxY0 = y0; + m_rxX1 = x1; + m_rxY1 = y1; + m_rxOn = on; + update(); + } + + void setColorRange(double lo, double hi); + // Horizontal size of one image pixel relative to its height (1 = square). + // Used by the strixel panels, whose mapped pixels are 9, 25 and 16 times + // wider than tall (group pitch X = 75*(75/Y), Y = 25/15/18.75 um). + void setPixelAspectX(double a) { + m_pixelAspectX = (a > 0.0) ? a : 1.0; + update(); + } + // the colour scale currently in use (also draggable on the colour bar) + void colorRange(double &lo, double &hi) const { + lo = m_clo; + hi = m_chi; + } + void setViewport(double x1, double y1, double x2, double y2); + void resetView(); + std::function onZoomChanged; + + protected: + void paintEvent(QPaintEvent *event) override; + void mousePressEvent(QMouseEvent *event) override; + void mouseMoveEvent(QMouseEvent *event) override; + void mouseReleaseEvent(QMouseEvent *event) override; + void wheelEvent(QWheelEvent *event) override; + void mouseDoubleClickEvent(QMouseEvent *event) override; + void resizeEvent(QResizeEvent *event) override; + + private: + void renderImage(); + void clampViewport(); + // makes the visible region the same shape as the image area of the widget + void matchViewportToWindow(); + double vpW() const { return (m_vpW < 0) ? m_nx : m_vpW; } + double vpH() const { return (m_vpH < 0) ? m_ny : m_vpH; } + QRect imageRect() const; + QRect scaleRect() const; + double valueAt(const QPoint &pos) const; + QPointF widgetToImage(QPoint wpos) const; + + std::vector m_owned; // widget-owned copy of the last frame + const float *m_data = nullptr; + int m_nx = 0, m_ny = 0; + QImage m_image; + bool m_dirty = true; + QRgb m_palette[256]; + + double m_clo = 0, m_chi = 4000; + double m_defClo = 0, m_defChi = 4000; + bool m_zeroWhite = false; // photon map: no counts -> white + bool m_showBar = false; // the in-view colour bar (replaced by the panel) + bool m_logScale = false; // log intensity mapping (cap <= 0 at 1e-2) + bool m_integerValues = false; // in-pixel labels: ints (counts) or 0.0 + double m_sx = 1.0; // screen pixels per image pixel (last paint) + std::vector m_hist; // histogram of the last image + double m_histLo = 0.0, m_histHi = 1.0; + qint64 m_histMs = 0; + double m_pixelAspectX = 1.0; // >1: pixels wider than tall + double m_vpX = 0, m_vpY = 0; + double m_vpW = -1, m_vpH = -1; + + // gate ROI overlay (data coordinates) + bool m_ovOn = false; + double m_ovX0 = 0, m_ovY0 = 0, m_ovX1 = 0, m_ovY1 = 0; + + // ROI editor state + bool m_roiEdit = false; + int m_roiGrab = 0; // 0 none, 1 move, 2 left, 3 right, 4 bottom, 5 top, + // 6 bl, 7 br, 8 tl, 9 tr, 10 new rectangle + QPointF m_roiPress{0, 0}; // data coordinates at press + double m_roiStart[4] = {0, 0, 0, 0}; // x0,y0,x1,y1 at press + + // receiver ROI overlay (RED), same data coordinates + bool m_rxOn = false; + double m_rxX0 = 0, m_rxY0 = 0, m_rxX1 = 0, m_rxY1 = 0; + + bool m_dragging = false; + QPoint m_lastPos; + double m_dragVpX, m_dragVpY; + mutable QTransform m_widgetToImg; + bool m_dragScale = false; + + public: + // the Z-scale strip inside the image is being dragged: the panel must not + // re-fill its histogram until the button comes back up + bool isScaleDragging() const { return m_dragScale; } + std::function onScaleReleased; + + private: + bool m_dragMax = false; // true = dragging max, false = dragging min + int m_dragScaleY = 0; + double m_dragClo, m_dragChi; +}; + +FastImageView::FastImageView(QWidget *parent) : QWidget(parent) { + setMouseTracking(true); + setFocusPolicy(Qt::StrongFocus); + setMinimumSize(200, 200); + m_chi = 4000; + m_defChi = 4000; + m_clo = 0; + m_defClo = 0; + for (int i = 0; i < 256; i++) + m_palette[i] = kPalette[i]; +} + +void FastImageView::setImageCopy(const float *data, int nx, int ny) { + if (!data || nx <= 0 || ny <= 0) + return; + const size_t n = static_cast(nx) * static_cast(ny); + if (m_owned.size() != n) + m_owned.resize(n); + memcpy(m_owned.data(), data, n * sizeof(float)); + m_data = m_owned.data(); + m_nx = nx; + m_ny = ny; + m_dirty = true; + if (m_vpW < 0) + m_vpW = nx; + if (m_vpH < 0) + m_vpH = ny; + update(); +} + +void FastImageView::setPaletteLut(const QRgb *lut) { + if (onPaletteChanged && lut) + onPaletteChanged(lut); + if (!lut) + return; + for (int i = 0; i < 256; i++) + m_palette[i] = lut[i]; + m_dirty = true; + update(); +} + +void FastImageView::setColorRange(double lo, double hi) { + m_clo = lo; + m_chi = hi; + m_defClo = lo; + m_defChi = hi; + m_histMs = 0; // the bins follow the window: recompute on the next render + m_dirty = true; + if (onColorRangeChanged) + onColorRangeChanged(lo, hi); + update(); +} + +void FastImageView::setViewport(double x1, double y1, double x2, double y2) { + if (x2 - x1 < kMinViewport || y2 - y1 < kMinViewport) + return; + m_vpX = x1; + m_vpY = y1; + m_vpW = x2 - x1; + m_vpH = y2 - y1; + update(); +} + +void FastImageView::resetView() { + if (!hasImage()) + return; // nothing to reset yet (and (0,0,0,0) would collapse the map) + m_vpX = 0; + m_vpY = 0; + m_vpW = m_nx; + m_vpH = m_ny; + if (onZoomChanged) + onZoomChanged(0, 0, m_nx, m_ny); + update(); +} + +QRect FastImageView::imageRect() const { + int x0 = AXIS_L, y0 = AXIS_T; + int x1 = width() - AXIS_R - (m_showBar ? SCALE_W : 0); + int y1 = height() - AXIS_B; + if (x1 - x0 < 10) + x1 = x0 + 10; + if (y1 - y0 < 10) + y1 = y0 + 10; + return QRect(x0, y0, x1 - x0, y1 - y0); +} + +QRect FastImageView::scaleRect() const { + if (!m_showBar) + return QRect(); // the scale panel took its place + QRect ir = imageRect(); + return QRect(ir.right() + 4, ir.top(), SCALE_W - 4, ir.height()); +} + +// keeps the viewport inside the image; used after pan, zoom and resize +void FastImageView::clampViewport() { + if (!hasImage()) + return; + if (m_vpW > m_nx) + m_vpW = m_nx; + if (m_vpH > m_ny) + m_vpH = m_ny; + if (m_vpX < 0) + m_vpX = 0; + if (m_vpX + vpW() > m_nx) + m_vpX = m_nx - vpW(); + if (m_vpY < 0) + m_vpY = 0; + if (m_vpY + vpH() > m_ny) + m_vpY = m_ny - vpH(); +} + +// The ADC window is the tool that selects the gate ROI, so the region it +// shows takes the shape of the window: make the window tall and "ROI only" +// captures a narrow, tall region. The shorter side is grown so that nothing +// the operator was looking at disappears; the whole-frame view is left alone +// (it is letterboxed on purpose) so that it still captures the full sensor. +void FastImageView::matchViewportToWindow() { + if (!hasImage()) + return; + if (m_vpW >= m_nx - 0.5 && m_vpH >= m_ny - 0.5) + return; // whole frame: keep it, whatever the window shape + QRect ir = imageRect(); + if (ir.width() <= 0 || ir.height() <= 0) + return; + // shape the viewport so the physical pixels (m_pixelAspectX) fill the + // window with the same shape, not the square-pixel shape + const double ar = double(ir.width()) / double(ir.height()) / m_pixelAspectX; + double w = vpW(), h = vpH(); + if (w / h > ar) + h = w / ar; // too wide -> grow vertically + else + w = h * ar; // too tall -> grow horizontally + if (w > m_nx) { // grown past the sensor: shrink both, keep the shape + h *= m_nx / w; + w = m_nx; + } + if (h > m_ny) { + w *= m_ny / h; + h = m_ny; + } + const double cx = m_vpX + vpW() / 2, cy = m_vpY + vpH() / 2; + m_vpW = w; + m_vpH = h; + m_vpX = cx - w / 2; + m_vpY = cy - h / 2; + clampViewport(); + if (onZoomChanged) + onZoomChanged(m_vpX, m_vpY, m_vpX + vpW(), m_vpY + vpH()); +} + +void FastImageView::resizeEvent(QResizeEvent *) { + matchViewportToWindow(); + update(); +} + +void FastImageView::renderImage() { if (!m_data || m_nx <= 0 || m_ny <= 0) + return; + if (m_image.size() != QSize(m_nx, m_ny)) + m_image = QImage(m_nx, m_ny, QImage::Format_ARGB32); + // log: values <= 0 are capped at 1e-2 (log10 = -2), so an empty pixel is + // still distinguishable instead of being -inf + const double loD = m_logScale ? std::log10(std::max(m_clo, 1e-2)) : m_clo; + const double hiD = m_logScale ? std::log10(std::max(m_chi, 1e-2)) : m_chi; + const double range = (hiD > loD) ? (hiD - loD) : 1.0; + static const QRgb kWhite = qRgb(255, 255, 255); + double dmin = 0.0, dmax = 1.0; + bool first = true; + for (int p = 0; p < m_nx * m_ny; p++) { + const double v = m_data[p]; + if (std::isfinite(v)) { + if (first) { + dmin = dmax = v; + first = false; + } else { + if (v < dmin) + dmin = v; + if (v > dmax) + dmax = v; + } + } + if (m_zeroWhite && !(v > 0.0)) { + // empty cell: white background, as the ROOT colz plot showed it + m_image.setPixel(p % m_nx, m_ny - 1 - p / m_nx, kWhite); + continue; + } + const double vv = m_logScale ? std::log10(std::max(v, 1e-2)) : v; + int idx = int((vv - loD) / range * 255); + if (idx < 0) + idx = 0; + if (idx > 255) + idx = 255; + m_image.setPixel(p % m_nx, m_ny - 1 - p / m_nx, m_palette[idx]); + } + m_dirty = false; + + // Histogram for the scale panel: walking the whole frame is cheap enough at + // the image cadence, but the panel only needs the shape, so a few times a + // second is plenty. + const qint64 now = QDateTime::currentMSecsSinceEpoch(); + if (m_hist.empty() || now - m_histMs > 300) { + m_histMs = now; + if (first || dmax <= dmin) + dmax = dmin + 1.0; + // Bin over the range the strip actually shows (the colour range plus + // half a range either side), not over the image's whole value range: a + // photon map accumulates to thousands of counts while its scale shows + // 0..12, so full-range binning put the entire visible window inside one + // bin - the "too big bins". Pixels outside the window are skipped + // instead of being piled into the edge bins. + const double caspan = (m_chi > m_clo) ? (m_chi - m_clo) : 0.0; + double hlo = dmin, hhi = dmax; + if (caspan > 0.0 && std::isfinite(m_clo) && std::isfinite(m_chi)) { + hlo = m_clo - 0.5 * caspan; + hhi = m_chi + 0.5 * caspan; + } + if (m_logScale) { + hlo = std::log10(std::max(hlo, 1e-2)); + hhi = std::log10(std::max(hhi, 1e-2)); + if (hhi <= hlo) + hhi = hlo + 1.0; + } + if (!(hhi > hlo)) + hhi = hlo + 1.0; + m_histLo = hlo; + m_histHi = hhi; + m_hist.assign(256, 0); + const double sc = 255.0 / (hhi - hlo); + for (int p = 0; p < m_nx * m_ny; p++) { + const double raw = m_data[p]; + if (!std::isfinite(raw)) + continue; + const double v = m_logScale ? std::log10(std::max(raw, 1e-2)) : raw; + if (v < hlo || v > hhi) + continue; // outside the visible window + int b = int((v - hlo) * sc); + if (b < 0) + b = 0; + if (b > 255) + b = 255; + m_hist[b]++; + } + if (onImageChanged) + onImageChanged(); + } +} + +void FastImageView::paintEvent(QPaintEvent *) { + if (m_dirty) + renderImage(); + QPainter p(this); + p.fillRect(rect(), Qt::black); + if (!m_data || m_nx <= 0 || m_ny <= 0) + return; + + QRect ir = imageRect(); + // Pixel aspect: a value > 1 makes each image pixel that many times wider + // than tall (the strixel groups have rectangular pixels), so the fit is + // computed in physical units and the image is scaled non-uniformly. + double sx = 0.0, sy = 0.0; + if (m_pixelAspectX != 1.0) { + const double fitY = double(ir.height()) / vpH(); + const double fitX = double(ir.width()) / (vpW() * m_pixelAspectX); + sy = (fitY < fitX) ? fitY : fitX; + sx = sy * m_pixelAspectX; + } else { + const double fitX = double(ir.width()) / vpW(); + const double fitY = double(ir.height()) / vpH(); + sx = sy = (fitX < fitY) ? fitX : fitY; + } + + p.save(); + // Zoomed in, the scaled image is larger than the plot area: without this + // clip it spills over the frame and the tick labels. + p.setClipRect(ir); + p.translate(ir.left(), ir.top()); + p.translate((ir.width() - vpW() * sx) * 0.5, + (ir.height() - vpH() * sy) * 0.5); + p.translate(-m_vpX * sx, -m_vpY * sy); + p.scale(sx, sy); + const QTransform imgToWidget = p.combinedTransform(); + m_widgetToImg = imgToWidget.inverted(); + m_sx = sx; // screen pixels per image pixel: drives the pixel grid/labels + p.drawImage(QPoint(0, 0), m_image); + p.restore(); + + // the overlays live in the same plot area: clip them as well + p.save(); + p.setClipRect(ir); + // gate ROI overlay: convert data rows (row 0 = bottom) to display space + if (m_ovOn && m_ovX1 > m_ovX0 && m_ovY1 > m_ovY0) { + const double dx = m_ovX0; + const double dy = double(m_ny) - m_ovY1; + const double dw = m_ovX1 - m_ovX0; + const double dh = m_ovY1 - m_ovY0; + const QRectF r = imgToWidget.mapRect(QRectF(dx, dy, dw, dh)); + QPen pen(Qt::yellow); + pen.setWidth(m_roiEdit ? 2 : 1); + pen.setCosmetic(true); + p.setPen(pen); + p.setBrush(Qt::NoBrush); + p.drawRect(r); + if (m_roiEdit) { // corner and edge handles: what can be grabbed + const double hw = 3.0; // half handle size, in widget pixels + const double xs[3] = {r.left(), r.center().x(), r.right()}; + const double ys[3] = {r.top(), r.center().y(), r.bottom()}; + p.setBrush(QColor(255, 255, 80)); + for (int iy = 0; iy < 3; iy++) { + for (int ix = 0; ix < 3; ix++) { + if (ix == 1 && iy == 1) + continue; // centre handle would only be confusing + p.drawRect(QRectF(xs[ix] - hw, ys[iy] - hw, 2 * hw, + 2 * hw)); + } + } + } + } + + // receiver ROI overlay (RED), from the "rx_roi" field of the stream + // header. The ADC image is the raw layout, so this is a plain rectangle. + if (m_rxOn && m_rxX1 > m_rxX0 && m_rxY1 > m_rxY0) { + QPen pen(Qt::red); + pen.setWidth(1); + pen.setCosmetic(true); + p.setPen(pen); + p.setBrush(Qt::NoBrush); + const double dx = m_rxX0; + const double dy = double(m_ny) - m_rxY1; + const double dw = m_rxX1 - m_rxX0; + const double dh = m_rxY1 - m_rxY0; + p.drawRect(imgToWidget.mapRect(QRectF(dx, dy, dw, dh))); + } + p.restore(); // back to the full widget for the axes + + // ── axes: a frame around the plot, ticks and labels outside, grid inside ── + { + QFont f = p.font(); + f.setPixelSize(10); + p.setFont(f); + // 0..8 grid lines, on 1/2/5 steps + auto step = [](double span) { + static const double cand[] = {1, 2, 5, 10, 20, 50, + 100, 200, 500, 1000, 2000, 5000}; + for (double c : cand) + if (span / c <= 8.0) + return c; + return 10000.0; + }; + const double x0 = m_vpX, x1 = m_vpX + vpW(); + const double y0 = m_vpY, y1 = m_vpY + vpH(); // display rows (top down) + const double sxStep = step(x1 - x0), syStep = step(y1 - y0); + const QPen grid(QColor(95, 95, 95)); + const QPen tick(QColor(215, 215, 215)); + for (double gx = std::ceil(x0 / sxStep) * sxStep; gx <= x1; + gx += sxStep) { + const double wx = imgToWidget.map(QPointF(gx, 0)).x(); + QPen g2 = grid; + g2.setStyle(Qt::DotLine); + p.setPen(g2); + p.drawLine(QPointF(wx, ir.top()), QPointF(wx, ir.bottom())); + p.setPen(tick); + p.drawLine(QPointF(wx, ir.bottom() + 1), QPointF(wx, ir.bottom() + 4)); + p.drawText(QRectF(wx - 26, ir.bottom() + 5, 52, 14), + Qt::AlignHCenter | Qt::AlignTop, + QString::number(gx, 'f', 0)); + } + for (double gy = std::ceil(y0 / syStep) * syStep; gy <= y1; + gy += syStep) { + const double wy = imgToWidget.map(QPointF(0, gy)).y(); + QPen g2 = grid; + g2.setStyle(Qt::DotLine); + p.setPen(g2); + p.drawLine(QPointF(ir.left(), wy), QPointF(ir.right(), wy)); + p.setPen(tick); + p.drawLine(QPointF(ir.left() - 4, wy), QPointF(ir.left() - 1, wy)); + // the label is the DATA row (row 0 at the bottom), as everywhere else + p.drawText(QRectF(ir.left() - 50, wy - 7, 44, 14), + Qt::AlignRight | Qt::AlignVCenter, + QString::number(double(m_ny) - 1.0 - gy, 'f', 0)); + } + p.setPen(QPen(QColor(225, 225, 225))); + p.setBrush(Qt::NoBrush); + p.drawRect(ir.adjusted(0, 0, -1, -1)); + } + + // ── pixel grid and in-pixel values, once a pixel is big enough ────────── + if (m_sx >= 16.0) { + const double x0 = m_vpX, x1 = m_vpX + vpW(); + const double y0 = m_vpY, y1 = m_vpY + vpH(); + // thin outline around every pixel (only when a sane number is visible) + if (vpW() <= 256 && vpH() <= 256) { + QPen px(QColor(55, 55, 55)); + px.setCosmetic(true); + p.setPen(px); + for (double gx = std::floor(x0); gx <= x1 + 1; gx += 1.0) { + const double wx = imgToWidget.map(QPointF(gx, 0)).x(); + p.drawLine(QPointF(wx, ir.top()), QPointF(wx, ir.bottom())); + } + for (double gy = std::floor(y0); gy <= y1 + 1; gy += 1.0) { + const double wy = imgToWidget.map(QPointF(0, gy)).y(); + p.drawLine(QPointF(ir.left(), wy), QPointF(ir.right(), wy)); + } + } + if (m_sx >= 50.0 && vpW() <= 64 && vpH() <= 64) { + QFont f = p.font(); + // The label has to fit *inside* the pixel: six characters for the + // real-valued images ("XXXXX.y"), five for the photon counts, at + // roughly 0.62 em per digit. The 0.30 em cap still gives the + // "small, tidy number" look at deep zoom. + const int maxChars = m_integerValues ? 5 : 6; + const double bySize = m_sx * 0.30; + const double byWidth = m_sx * 0.92 / (0.62 * maxChars); + f.setPixelSize(std::max( + 7, std::min(20, int(std::min(bySize, byWidth))))); + p.setFont(f); + for (int gy = int(std::floor(y0)); gy <= int(y1); gy++) { + for (int gx = int(std::floor(x0)); gx <= int(x1); gx++) { + if (gx < 0 || gy < 0 || gx >= m_nx || gy >= m_ny) + continue; + const double v = m_data[gx + (m_ny - 1 - gy) * m_nx]; + if (!std::isfinite(v)) + continue; + // text colour from the pixel that was actually painted + const QRgb c = m_image.pixel(gx, gy); + const int lum = (qRed(c) * 299 + qGreen(c) * 587 + + qBlue(c) * 114) / + 1000; + p.setPen(lum > 140 ? QColor(15, 15, 15) + : QColor(245, 245, 245)); + const QString txt = + m_integerValues + ? QString::number(qint64(std::llround(v))) + : QString::number(v, 'f', 1); + const QPointF ctr = + imgToWidget.map(QPointF(gx + 0.5, gy + 0.5)); + p.drawText(QRectF(ctr.x() - m_sx * 0.5, + ctr.y() - m_sx * 0.5, m_sx, m_sx), + Qt::AlignCenter, txt); + } + } + } + } + + // in-view colour bar: kept for builds that still ask for it (the scale + // panel replaced it in the windows) + if (!m_showBar) + return; + QRect sr = scaleRect(); + for (int yy = sr.top(); yy <= sr.bottom(); yy++) { + double frac = 1.0 - double(yy - sr.top()) / sr.height(); + int idx = int(frac * 255); + if (idx < 0) + idx = 0; + if (idx > 255) + idx = 255; + p.setPen(m_palette[idx]); + p.drawLine(sr.left(), yy, sr.right(), yy); + } + p.setPen(Qt::white); + p.drawRect(sr.adjusted(-1, -1, 1, 1)); + QFont f = p.font(); + f.setPixelSize(10); + p.setFont(f); + p.drawText(sr.left(), sr.top() + 1, sr.width(), 12, Qt::AlignCenter, + QString::number(m_chi, 'f', 0)); + p.drawText(sr.left(), sr.bottom() - 11, sr.width(), 12, Qt::AlignCenter, + QString::number(m_clo, 'f', 0)); +} + +void FastImageView::mousePressEvent(QMouseEvent *e) { + if (e->button() != Qt::LeftButton) + return; + QPoint ip = e->pos(); + if (m_roiEdit && hasImage()) { + // which part of the yellow rectangle was grabbed? + const QPointF d = widgetToData(ip); + const QPointF d2 = widgetToData(ip + QPoint(8, 0)); + const double tol = std::max(1e-9, std::abs(d2.x() - d.x())); + const bool nearL = std::abs(d.x() - m_ovX0) <= tol; + const bool nearR = std::abs(d.x() - m_ovX1) <= tol; + const bool nearB = std::abs(d.y() - m_ovY0) <= tol; + const bool nearT = std::abs(d.y() - m_ovY1) <= tol; + const bool inX = d.x() >= m_ovX0 - tol && d.x() <= m_ovX1 + tol; + const bool inY = d.y() >= m_ovY0 - tol && d.y() <= m_ovY1 + tol; + m_roiGrab = 0; + if (nearL && nearB) + m_roiGrab = 6; + else if (nearR && nearB) + m_roiGrab = 7; + else if (nearL && nearT) + m_roiGrab = 8; + else if (nearR && nearT) + m_roiGrab = 9; + else if (nearL && inY) + m_roiGrab = 2; + else if (nearR && inY) + m_roiGrab = 3; + else if (nearB && inX) + m_roiGrab = 4; + else if (nearT && inX) + m_roiGrab = 5; + else if (inX && inY) + m_roiGrab = 1; + else + m_roiGrab = 10; // start a new rectangle at the cursor + m_roiPress = d; + m_roiStart[0] = m_ovX0; + m_roiStart[1] = m_ovY0; + m_roiStart[2] = m_ovX1; + m_roiStart[3] = m_ovY1; + if (m_roiGrab == 10) { + m_ovX0 = m_ovX1 = std::max(0.0, std::min(double(m_nx), d.x())); + m_ovY0 = m_ovY1 = std::max(0.0, std::min(double(m_ny), d.y())); + m_ovOn = true; + } + update(); + return; + } + QRect sr = scaleRect(); + if (sr.contains(ip)) { + m_dragScale = true; + m_dragScaleY = ip.y(); + m_dragClo = m_clo; + m_dragChi = m_chi; + m_dragMax = (ip.y() < sr.top() + sr.height() / 2); + setCursor(Qt::SizeVerCursor); + return; + } + m_dragging = true; + m_lastPos = ip; + m_dragVpX = m_vpX; + m_dragVpY = m_vpY; + setCursor(Qt::ClosedHandCursor); +} + +void FastImageView::mouseMoveEvent(QMouseEvent *e) { + if (m_roiEdit && hasImage()) { + const QPointF d = widgetToData(e->pos()); + const double x = std::max(0.0, std::min(double(m_nx), d.x())); + const double y = std::max(0.0, std::min(double(m_ny), d.y())); + constexpr double kMin = 2.0; // a ROI smaller than this is unusable + if (m_roiGrab == 10) { // dragging out a new rectangle + m_ovX0 = std::min(m_roiPress.x(), x); + m_ovX1 = std::max(m_roiPress.x(), x); + m_ovY0 = std::min(m_roiPress.y(), y); + m_ovY1 = std::max(m_roiPress.y(), y); + m_ovOn = true; + } else if (m_roiGrab == 1) { // move the whole rectangle + const double dx = x - m_roiPress.x(); + const double dy = y - m_roiPress.y(); + double x0 = m_roiStart[0] + dx, x1 = m_roiStart[2] + dx; + double y0 = m_roiStart[1] + dy, y1 = m_roiStart[3] + dy; + if (x0 < 0) { x1 -= x0; x0 = 0; } + if (x1 > m_nx) { x0 -= (x1 - m_nx); x1 = m_nx; } + if (y0 < 0) { y1 -= y0; y0 = 0; } + if (y1 > m_ny) { y0 -= (y1 - m_ny); y1 = m_ny; } + m_ovX0 = x0; + m_ovX1 = x1; + m_ovY0 = y0; + m_ovY1 = y1; + } else if (m_roiGrab != 0) { // one edge or one corner + double x0 = m_roiStart[0], y0 = m_roiStart[1]; + double x1 = m_roiStart[2], y1 = m_roiStart[3]; + const bool left = (m_roiGrab == 2 || m_roiGrab == 6 || m_roiGrab == 8); + const bool right = (m_roiGrab == 3 || m_roiGrab == 7 || m_roiGrab == 9); + const bool bottom = (m_roiGrab == 4 || m_roiGrab == 6 || m_roiGrab == 7); + const bool top = (m_roiGrab == 5 || m_roiGrab == 8 || m_roiGrab == 9); + if (left && x <= x1 - kMin) + x0 = x; + if (right && x >= x0 + kMin) + x1 = x; + if (bottom && y <= y1 - kMin) + y0 = y; + if (top && y >= y0 + kMin) + y1 = y; + m_ovX0 = x0; + m_ovY0 = y0; + m_ovX1 = x1; + m_ovY1 = y1; + } + update(); + if (m_roiGrab == 0) { // hovering: show what grabbing here would do + const QPointF dd = widgetToData(e->pos()); + const QPointF dd2 = widgetToData(e->pos() + QPoint(8, 0)); + const double tol = std::max(1e-9, std::abs(dd2.x() - dd.x())); + const bool nearL = std::abs(dd.x() - m_ovX0) <= tol; + const bool nearR = std::abs(dd.x() - m_ovX1) <= tol; + const bool nearB = std::abs(dd.y() - m_ovY0) <= tol; + const bool nearT = std::abs(dd.y() - m_ovY1) <= tol; + const bool inside = dd.x() >= m_ovX0 - tol && + dd.x() <= m_ovX1 + tol && + dd.y() >= m_ovY0 - tol && + dd.y() <= m_ovY1 + tol; + if ((nearL && nearT) || (nearR && nearB)) + setCursor(Qt::SizeFDiagCursor); + else if ((nearL && nearB) || (nearR && nearT)) + setCursor(Qt::SizeBDiagCursor); + else if (nearL || nearR) + setCursor(Qt::SizeHorCursor); + else if (nearT || nearB) + setCursor(Qt::SizeVerCursor); + else + setCursor(inside ? Qt::OpenHandCursor : Qt::CrossCursor); + } + return; + } + if (m_dragScale) { + QRect sr = scaleRect(); + double delta = double(e->y() - m_dragScaleY) / double(sr.height()) * + (m_dragChi - m_dragClo); + if (m_dragMax) { + m_chi = m_dragChi - delta; + if (m_chi < m_clo + 1) + m_chi = m_clo + 1; + } else { + m_clo = m_dragClo - delta; + if (m_clo > m_chi - 1) + m_clo = m_chi - 1; + } + m_dirty = true; + update(); + return; + } + if (!m_dragging) { + QPoint hp = e->pos(); + QRect ir2 = imageRect(); + QRect sr = scaleRect(); + if (sr.contains(hp)) { + setCursor(Qt::SizeVerCursor); + double v = valueAt(hp); + setToolTip(QString("Scale: %1").arg(v, 0, 'f', 0)); + } else if (ir2.contains(hp)) { + setCursor(Qt::OpenHandCursor); + // widgetToImage() is in QImage space (row 0 = TOP); the reported + // pixel and the value are converted to DATA rows so that the + // numbering matches the ROOT plots and the ROI list: (0,0) is the + // bottom-left pixel everywhere. + QPointF ipt = widgetToImage(hp); + const int ix = int(ipt.x()); + const int dy = int(ipt.y()); + const int iy = m_ny - 1 - dy; + if (ix >= 0 && ix < m_nx && iy >= 0 && iy < m_ny) + setToolTip(QString("(x=%1, y=%2) = %3") + .arg(ix) + .arg(iy) + .arg(m_data[ix + iy * m_nx], 0, 'f', 1)); + } else { + setCursor(Qt::ArrowCursor); + setToolTip(QString()); + } + return; + } + QPointF now = widgetToImage(e->pos()); + QPointF then = widgetToImage(m_lastPos); + m_vpX = m_dragVpX - (now.x() - then.x()); + m_vpY = m_dragVpY - (now.y() - then.y()); + clampViewport(); + update(); + // follow live: the gain view and the photon map pan with the ADC view + if (onZoomChanged) + onZoomChanged(m_vpX, m_vpY, m_vpX + vpW(), m_vpY + vpH()); +} + +void FastImageView::mouseReleaseEvent(QMouseEvent *e) { + if (e->button() == Qt::LeftButton && m_roiGrab != 0) { + m_roiGrab = 0; + if (onRoiEdited && m_ovX1 - m_ovX0 >= 2.0 && m_ovY1 - m_ovY0 >= 2.0) + onRoiEdited(int(std::lround(m_ovX0)), int(std::lround(m_ovY0)), + int(std::lround(m_ovX1)), int(std::lround(m_ovY1))); + return; + } + if (e->button() == Qt::LeftButton) { + if (m_dragging && onZoomChanged) + onZoomChanged(m_vpX, m_vpY, m_vpX + vpW(), m_vpY + vpH()); + m_dragging = false; + const bool wasScale = m_dragScale; + m_dragScale = false; + setCursor(Qt::ArrowCursor); + if (wasScale && onScaleReleased) + onScaleReleased(); // one histogram/scale refresh, after the drag + } +} + +void FastImageView::wheelEvent(QWheelEvent *e) { + if (!m_data || m_nx <= 0 || m_ny <= 0) + return; + QPointF imgPt = widgetToImage(e->pos()); + double mx = imgPt.x(), my = imgPt.y(); + + double factor = (e->angleDelta().y() > 0) ? 1.0 / 1.18 : 1.18; + double nw = vpW() * factor, nh = vpH() * factor; + if (nw < kMinViewport) + nw = kMinViewport; + if (nh < kMinViewport) + nh = kMinViewport; + if (nw > m_nx) + nw = m_nx; + if (nh > m_ny) + nh = m_ny; + + double fracX = (mx - m_vpX) / vpW(); + double fracY = (my - m_vpY) / vpH(); + m_vpX = mx - fracX * nw; + m_vpY = my - fracY * nh; + m_vpW = nw; + m_vpH = nh; + if (factor > 1.0) { + // Zooming OUT: do not reshape to the window here. matchViewportToWindow + // grows/shrinks to the window aspect, so the image dimension that hits + // its limit first froze the other one and the whole frame could never + // be shown. Let both grow to the image bounds; the window-shape rule + // still applies while zooming IN and on resize. + clampViewport(); + } else { + // keep the visible region the same shape as the window also while + // zooming, so that the captured ROI has the shape of the window + matchViewportToWindow(); + } + + if (onZoomChanged) + onZoomChanged(m_vpX, m_vpY, m_vpX + vpW(), m_vpY + vpH()); + setToolTip(QString("Zoom: %1%").arg(int(100.0 * m_nx / vpW()))); + update(); +} + +void FastImageView::mouseDoubleClickEvent(QMouseEvent *e) { + QRect sr = scaleRect(); + if (sr.contains(e->pos())) { + m_clo = m_defClo; + m_chi = m_defChi; + m_dirty = true; + update(); + } else { + resetView(); + } +} + +double FastImageView::valueAt(const QPoint &pos) const { + QRect sr = scaleRect(); + if (!sr.contains(pos)) + return m_clo - 1; + double frac = 1.0 - double(pos.y() - sr.top()) / sr.height(); + return m_clo + frac * (m_chi - m_clo); +} + +QPointF FastImageView::widgetToImage(QPoint wpos) const { + return m_widgetToImg.map(QPointF(wpos)); +} + +QLabel *makeValueLabel(const QString &text, QWidget *parent) { + QLabel *label = new QLabel(text, parent); + label->setTextInteractionFlags(Qt::TextSelectableByMouse); + return label; +} + +} // namespace + +// --------------------------------------------------------------------------- +// MainWindow +// --------------------------------------------------------------------------- +// The histogram the scale panel shows: the image's own distribution with the +// currently mapped range drawn over it, so the effect of the two ends is +// visible while they are set. +// The histogram strip of the scale panel. It is deliberately thin (a fixed +// ~38 px) and the two range ends are drawn at FIXED positions - a quarter and +// three quarters of the width - so the *value axis* moves under them: the data +// window shown is the selected range widened by half a range on either side. +// Dragging a marker changes that end of the range; the histogram rescales so +// the marker returns to its fixed spot. The horizontal axis follows the image +// mapping (lin or log), the bar heights have their own lin/log switch. +class ScaleHisto : public QWidget { + public: + explicit ScaleHisto(QWidget *parent = nullptr) : QWidget(parent) { + setFixedHeight(38); + setMouseTracking(true); + setToolTip("Distribution of the last image (its own value range); the\n" + "band between the two markers is the range mapped to the\n" + "palette. Markers sit at 1/4 and 3/4 and the axis rescales\n" + "under them - drag either one to change that end."); + } + // dlo/dhi: value range of the bins; clo/chi: the mapped range + void setData(const std::vector *h, double dlo, double dhi, double clo, + double chi, bool logX, bool logY) { + // Frozen while a marker is being dragged: re-filling the bars from the + // live image mid-drag fed the drag back into the histogram (the bars + // moved, which moved the marker, which moved the bars...). The strip + // is refreshed once, when the button comes back up. + if (dragging_) + return; + h_ = h; + dlo_ = dlo; + dhi_ = dhi; + clo_ = clo; + chi_ = chi; + logX_ = logX; + logY_ = logY; + update(); + } + // dragging a marker reports the new range (GUI thread) + std::function onRangeChanged; + + protected: + void paintEvent(QPaintEvent *) override { + QPainter p(this); + p.fillRect(rect(), QColor(28, 28, 28)); + const int W = width(), H = height(); + // While a marker is dragged the axis stays exactly as it was when the + // drag started: the bars (and the two numbers) must not move with the + // cursor, only the dragged end is previewed as a line. Releasing + // rebuilds the axis from the new range. + const double dclo = dragging_ ? preClo_ : clo_; + const double dchi = dragging_ ? preChi_ : chi_; + // the shown window is the selected range +- half a range + const double span = (dchi > dclo) ? (dchi - dclo) : 1.0; + double wlo = dclo - 0.5 * span, whi = dchi + 0.5 * span; + if (logX_) { // work in log space, capping <= 0 at 1e-2 + wlo = std::log10(std::max(wlo, 1e-2)); + whi = std::log10(std::max(whi, 1e-2)); + if (whi <= wlo) + whi = wlo + 1.0; + } + auto mapv = [&](double v) { + return logX_ ? std::log10(std::max(v, 1e-2)) : v; + }; + auto xof = [&](double v) { + return (mapv(v) - wlo) / (whi - wlo) * W; + }; + // The image keeps arriving while the marker is dragged and its + // histogram is recomputed on every repaint, so the bars themselves were + // still moving under the frozen axis. While dragging, paint from the + // snapshot taken when the button went down. + const std::vector *hv = + (dragging_ && !snap_.empty()) ? &snap_ : h_; + if (hv && !hv->empty() && dhi_ > dlo_) { + int mx = 1; + for (int v : *hv) + if (v > mx) + mx = v; + const double lmx = std::log10(double(mx) + 1.0); + const double binW = (dhi_ - dlo_) / double(hv->size()); + QBrush bar(QColor(120, 190, 255)); + p.setPen(Qt::NoPen); + p.setBrush(bar); + for (size_t i = 0; i < hv->size(); i++) { + if ((*hv)[i] <= 0) + continue; + // solid: the bar is as wide as the bin spacing on screen + const double x0 = xof(dlo_ + double(i) * binW); + const double x1 = xof(dlo_ + double(i + 1) * binW); + const double bh = + logY_ ? (std::log10(double((*hv)[i]) + 1.0) / lmx) + : (double((*hv)[i]) / double(mx)); + const double w = std::max(1.0, x1 - x0); + if (x0 > W || x0 + w < 0) + continue; + p.drawRect(QRectF(x0, H - 3 - bh * (H - 6), w, + std::max(1.0, bh * (H - 6)))); + } + } + // the two markers at their fixed places (they are what the axis follows) + const double xa = 0.25 * W, xb = 0.75 * W; + if (dragging_) { // the dragged end, previewed only + QPen pv(QColor(255, 205, 110, 180)); + pv.setWidth(1); + pv.setStyle(Qt::DashLine); + p.setPen(pv); + const double x = std::max(0.0, std::min(double(W - 1), double(previewX_))); + p.drawLine(QPointF(x, 0), QPointF(x, H)); + } + p.fillRect(QRectF(xa, 0, xb - xa, H), QColor(255, 255, 255, 26)); + QPen mk(QColor(255, 205, 110)); + mk.setWidth(2); + p.setPen(mk); + p.setBrush(Qt::NoBrush); + p.drawLine(QPointF(xa, 0), QPointF(xa, H)); + p.drawLine(QPointF(xb, 0), QPointF(xb, H)); + QFont f = p.font(); + f.setPixelSize(9); + p.setFont(f); + p.setPen(QColor(255, 225, 160)); + p.drawText(QRectF(xa + 3, 1, W - xa - 6, 11), Qt::AlignLeft | Qt::AlignTop, + QString::number(dclo, 'g', 4)); + p.drawText(QRectF(3, 1, xb - 3, 11), Qt::AlignRight | Qt::AlignTop, + QString::number(dchi, 'g', 4)); + } + void mousePressEvent(QMouseEvent *e) override { + const double xa = 0.25 * width(), xb = 0.75 * width(); + const double d = std::abs(e->pos().x() - xa); + const double d2 = std::abs(e->pos().x() - xb); + dragMin_ = d <= d2; + if (std::min(d, d2) > 10) { + dragMin_ = -1; // too far from either marker: ignore + return; + } + // Dragging only moves this strip: re-rendering a megapixel image on + // every mouse move is what made it crawl, so the new range is applied + // when the button comes back up (see mouseReleaseEvent). + dragging_ = true; + if (h_) + snap_ = *h_; // the bars: frozen as well (the image keeps updating) + preClo_ = clo_; // the axis basis: frozen until the button is released + preChi_ = chi_; + previewX_ = e->pos().x(); + mouseMoveEvent(e); + } + void mouseMoveEvent(QMouseEvent *e) override { + if (dragMin_ < 0) + return; + const int W = width(); + // The cursor -> value mapping uses the axis FROZEN at press time. Using + // the live clo_/chi_ here was the positive feedback: the move changed the + // range, the range changed the window, and the same cursor position then + // mapped to a different value, so the marker chased itself. + const double span = (preChi_ > preClo_) ? (preChi_ - preClo_) : 1.0; + double wlo = preClo_ - 0.5 * span, whi = preChi_ + 0.5 * span; + if (logX_) { + wlo = std::log10(std::max(wlo, 1e-2)); + whi = std::log10(std::max(whi, 1e-2)); + if (whi <= wlo) + whi = wlo + 1.0; + } + // the value under the cursor in the window in force right now + const double t = std::max(0.0, std::min(1.0, double(e->pos().x()) / W)); + const double v = + logX_ ? std::pow(10.0, wlo + t * (whi - wlo)) : wlo + t * (whi - wlo); + if (dragMin_) + clo_ = std::min(v, chi_ - 1e-9); + else + chi_ = std::max(v, clo_ + 1e-9); + previewX_ = e->pos().x(); + update(); // only the preview line moves; bars and axis stay frozen + } + void mouseReleaseEvent(QMouseEvent *) override { + if (dragMin_ >= 0 && dragging_) { + dragging_ = false; // unfreeze first, so the refresh is applied + snap_.clear(); // back to the live histogram + if (onRangeChanged) + onRangeChanged(clo_, chi_); // one update, as soon as released + update(); + } + dragMin_ = -1; + } + + private: + const std::vector *h_ = nullptr; + double dlo_ = 0.0, dhi_ = 1.0, clo_ = 0.0, chi_ = 1.0; + bool logX_ = false, logY_ = false; + int dragMin_ = -1; + bool dragging_ = false; // a marker drag in progress: preview only + double preClo_ = 0.0, preChi_ = 1.0; // axis basis captured when the drag began + std::vector snap_; // bins captured at press (frozen bars) + int previewX_ = 0; // cursor x, for the dashed preview line +}; + +// What replaced the colour bar at the side of the image: a small panel with the +// histogram, the palette, a lin/log switch and the two ends of the mapped range. +class ScalePanel : public QWidget { + public: + ScalePanel(FastImageView *view, QWidget *parent = nullptr) + : QWidget(parent), view_(view) { + auto *col = new QVBoxLayout(this); + col->setContentsMargins(4, 2, 4, 4); + col->setSpacing(3); + histo_ = new ScaleHisto(this); + col->addWidget(histo_); + auto *row = new QHBoxLayout(); + row->setSpacing(4); + pal_ = new QComboBox(this); + for (int i = 0; i <= int(Palette::Sunset); i++) + pal_->addItem(paletteName(static_cast(i))); + scale_ = new QComboBox(this); + scale_->addItem("lin"); + scale_->addItem("log"); + scale_->setToolTip("image: log10(value), values <= 0 are capped at\n" + "1e-2 so empty pixels stay visible"); + hscale_ = new QComboBox(this); + hscale_->addItem("lin"); + hscale_->addItem("log"); + hscale_->setToolTip("histogram bars: linear counts, or log10(count+1).\n" + "The histogram's value axis always follows the image\n" + "mapping above."); + lo_ = new QDoubleSpinBox(this); + hi_ = new QDoubleSpinBox(this); + for (QDoubleSpinBox *b : {lo_, hi_}) { + b->setRange(-1e9, 1e9); + b->setDecimals(1); + b->setSingleStep(1.0); + b->setKeyboardTracking(false); + } + row->addWidget(new QLabel("palette:", this)); + row->addWidget(pal_); + row->addWidget(new QLabel("image", this)); + row->addWidget(scale_); + row->addWidget(new QLabel("histo", this)); + row->addWidget(hscale_); + row->addWidget(new QLabel("min", this)); + row->addWidget(lo_); + row->addWidget(new QLabel("max", this)); + row->addWidget(hi_); + row->addStretch(1); + col->addLayout(row); + connect(pal_, QOverload::of(&QComboBox::currentIndexChanged), this, + [this](int) { push(); }); + connect(scale_, QOverload::of(&QComboBox::currentIndexChanged), + this, [this](int i) { + if (suppress_ || !view_) + return; + view_->setLogScale(i == 1); + refresh(); + }); + connect(hscale_, QOverload::of(&QComboBox::currentIndexChanged), + this, [this](int) { refresh(); }); + connect(lo_, QOverload::of(&QDoubleSpinBox::valueChanged), this, + [this](double) { push(); }); + connect(hi_, QOverload::of(&QDoubleSpinBox::valueChanged), this, + [this](double) { push(); }); + if (histo_) + histo_->onRangeChanged = [this](double a, double b) { + if (suppress_ || !view_) + return; + printf("[scale] range %.4g .. %.4g\n", a, b); + fflush(stdout); + view_->setColorRange(a, b); + suppress_++; + if (lo_) + lo_->setValue(a); + if (hi_) + hi_->setValue(b); + suppress_--; + refresh(); + }; + // as thin as asked: the image takes the window, the panel stays small + setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed); + setFixedHeight(38 + 30); + if (view_) { + view_->onImageChanged = [this]() { refresh(); }; + refresh(); + } + } + // pull the view's state into the controls (after Set Ranges, a palette key…) + void syncFromView() { refresh(); } + // 0 = colour, 1 = BW, 2 = BW 2 - used by the b/B/c shortcuts + void setPaletteChoice(int i) { + if (pal_ && i >= 0 && i < pal_->count()) + pal_->setCurrentIndex(i); + } + + private: + void push() { // controls -> view + if (suppress_ || !view_) + return; + const int pi = pal_ ? pal_->currentIndex() : 0; + view_->setPaletteLut(paletteLut(static_cast(pi))); + double a = lo_ ? lo_->value() : 0.0, b = hi_ ? hi_->value() : 1.0; + if (b <= a) { + b = a + 1.0; + suppress_++; + if (hi_) + hi_->setValue(b); + suppress_--; + } + view_->setColorRange(a, b); + refresh(); + } + public: + void refresh() { // view -> controls + if (!view_) + return; + // Dragging the Z scale on the image changes the range on every mouse + // move; re-filling the histogram from the image with that half-applied + // range fed the drag back into the bars. Frozen until release, when + // onScaleReleased() calls this again. + if (view_->isScaleDragging()) + return; + suppress_++; + double a = 0.0, b = 1.0; + view_->colorRange(a, b); + if (lo_) + lo_->setValue(a); + if (hi_) + hi_->setValue(b); + if (scale_) + scale_->setCurrentIndex(view_->logScale() ? 1 : 0); + double lo = 0.0, hi = 1.0; + view_->histogramRange(lo, hi); + if (histo_) + histo_->setData(&view_->histogram(), lo, hi, a, b, + view_->logScale(), + hscale_ && hscale_->currentIndex() == 1); + suppress_--; + } + private: + FastImageView *view_ = nullptr; + ScaleHisto *histo_ = nullptr; + QComboBox *pal_ = nullptr, *scale_ = nullptr, *hscale_ = nullptr; + QDoubleSpinBox *lo_ = nullptr, *hi_ = nullptr; + int suppress_ = 0; +}; + +class MainWindow : public QMainWindow { + public: + MainWindow(); + ~MainWindow() override; + void start(); + void stop(); + protected: + void closeEvent(QCloseEvent *event) override; + + private: + void setupUI(); + void connectShortcuts(); + + // periodic GUI work + void processImages(); // every 30 ms: mailbox -> widgets + void updateReceiverRoiOverlay(); // red rx_roi box on the ADC image + void updateStatus(); // every 500 ms: counters / labels + void checkSignals(); // every 200 ms: Ctrl-C shutdown + + // shared actions (buttons + keyboard shortcuts) + void toggleStartPause(); + void faster(); + void slower(); + void toggleGain(); + void setApplyGain(bool on); + void zoomTo(FastImageView *src, double x1, double y1, double x2, + double y2); + void bwPalette1(); + void bwPalette2(); + void colPal(); + void toggleGateRoi(bool on); + void setRoiEditMode(bool on); // in-image ROI editor + void saveRoi(); + void loadRoiDialog(); + // applies a gate ROI directly (no capture from the ADC view) + // restrict == true (command line) also turns "ROI only" on; picking an + // entry from the list only makes it the current ROI + void applyRoi(int x, int y, int w, int h, const QString &src, + bool restrict = false); + void resetHis(); + void resetAxis(); + void toggleRoiSave(bool on); + void browseSaveDir(); + void saveDestDialog(); + void updateSaveLabel(); + void acquirePede(); + void savePede(); + void readPede(); + void loadAllPede(); + void loadGainMap(); + // lines up the boxes of the flow chart (gates on the left, Pedestal/Gain + // on the right) and repaints the arrows + void layoutFlow(); + void updateFlow(); + void updateGainMapLabel(); + void updateRoiLabel(); + void captureRoi(); // select the ADC zoom as the current ROI + void resizeEvent(QResizeEvent *event) override; + void showEvent(QShowEvent *event) override; + void showRangeDialog(); + void showRateDialog(); + void unsetRoi(); // forget the current ROI (full frame again) + // While a run writes, the settings that would change what lands in the file + // are locked (display-only controls stay live). + void applySaveLock(bool saving); + // Gate criterion changes stay possible during a run, but they ask first and + // leave a note in the JSON of the file being written. + bool confirmGateChangeDuringRun(const QString &what); + void quitApp(); + void closeSideWindows(); // the ADC / gain / photon / panel windows + // what the flow diagram has to show (see FlowStrip::setStages) + void flowStageStates(bool &displayPede, bool &savePede, bool &gateOn, + bool &pmap) const; + // asked before quitting; returns false when the operator cancels + bool confirmQuit(); + + void updateDrawLabel(); + void setRanges(int amin, int amax, int pmin, int pmax, int cmin, int cmax); + // current on-screen ranges (read from the displayed histograms) + void liveAdcImageRange(int &lo, int &hi) const; + void liveMapRange(int &lo, int &hi) const; + void liveChipRange(int &lo, int &hi) const; + + Pipeline pipeline_; + QWidget *leftPad_ = nullptr, *pedePad_ = nullptr, *gainPad_ = nullptr; + // leftPad, pedePad, gainPad, gatePad - kept between solving passes + int flowPads_[4] = {0, 0, 0, 24}; + int flowPass_ = 0; + bool flowQueued_ = false; + QVBoxLayout *midCol_ = nullptr, *leftCol_ = nullptr, *rightCol_ = nullptr; + QWidget *midSpacer_ = nullptr; + FlowStrip *strip_ = nullptr; + QWidget *gatePad_ = nullptr; // alignment gap between the two gates + QLabel *arrGainDown_ = nullptr; + QLabel *arrRoiDown_ = nullptr; + QLabel *arrTrackUp_ = nullptr; + QGroupBox *scGroup_ = nullptr, *sigGroup_ = nullptr; + QGroupBox *displayGroup_ = nullptr, *saveGroup_ = nullptr; + QGroupBox *pedeGroup_ = nullptr, *gainGroup_ = nullptr; + QGroupBox *pmapGroup_ = nullptr; // virtual photon counting (needs a pede) + QCheckBox *gainStateChk_ = nullptr; // read-only "gain corrected" indicator + + QTimer *processTimer = nullptr; + QTimer *statusTimer = nullptr; + QTimer *sigTimer = nullptr; + + QLabel *frameLabel = nullptr; + QLabel *statusLabel = nullptr; + QLabel *drawLabel = nullptr; + QLabel *streamVal_ = nullptr; + QLabel *pedeVal_ = nullptr; + QLabel *errVal_ = nullptr; + QLabel *framesInCumVal_ = nullptr; + QLabel *framesInCurVal_ = nullptr; + QLabel *framesPassCumVal_ = nullptr; + QLabel *framesPassCurVal_ = nullptr; + QLabel *framesDropCumVal_ = nullptr; + QLabel *framesDropCurVal_ = nullptr; + QLabel *pixelsAboveCumVal_ = nullptr; + QLabel *pixelsAboveCurVal_ = nullptr; + QLabel *rateInVal_ = nullptr; + QLabel *ratePassVal_ = nullptr; + QLabel *dropFracVal_ = nullptr; + QLabel *displayDropVal_ = nullptr; + QLabel *alignVal_ = nullptr; + QLabel *gateRoiVal_ = nullptr; + QSpinBox *saveFrames_ = nullptr; + QCheckBox *saveCorrected_ = nullptr; + QRadioButton *saveModeFrames_ = nullptr; + QRadioButton *saveModePhoton_ = nullptr; + QSpinBox *pmapSaveSpin_ = nullptr; + QLabel *saveBudgetLabel_ = nullptr; + QLineEdit *saveDirEdit_ = nullptr; + // the destination as it was at start-up: that pair is the default, and the + // "previous destinations" list must not collect it on every run + QString saveDefaultDir_, saveDefaultBase_; + QLineEdit *saveBaseEdit_ = nullptr; + QPushButton *btnSaveDest_ = nullptr; + QPushButton *btnSaveStart = nullptr; + QLabel *saveVal_ = nullptr; + bool m_saveWasRunning = false; + + QCheckBox *gateChk_ = nullptr; + QLabel *thrLabel_ = nullptr; // says whether the gate threshold is on raw ADC + QCheckBox *contigChk_ = nullptr; + QCheckBox *hotChk_ = nullptr; + QPushButton *btnGetHot_ = nullptr; + std::vector adcScratch_; // ADC image with hot pixels replaced + std::vector photonScratch_; // photon map with hot pixels zeroed + QLabel *hotVal_ = nullptr; + QPushButton *btnResetHot_ = nullptr; + QDoubleSpinBox *thrSpin_ = nullptr; + QSpinBox *minPixSpin_ = nullptr; + QPushButton *btnGateRoi = nullptr; + QComboBox *scCombo_ = nullptr; + QLabel *scLastVal_ = nullptr; + QLabel *scDropCumVal_ = nullptr; + QLabel *scDropCurVal_ = nullptr; + QPushButton *btnSaveRoi = nullptr; + QPushButton *btnLoadRoi = nullptr; + QPushButton *btnSelectRoi_ = nullptr; + QPushButton *btnUnsetRoi_ = nullptr; + QGroupBox *roiGroup_ = nullptr; + QLabel *roiListVal_ = nullptr; + bool m_applyingRoi = false; // guards toggleGateRoi() during applyRoi() + + QPushButton *btnStartPause = nullptr; + QPushButton *btnFaster = nullptr; + QPushButton *btnSlower = nullptr; + QPushButton *btnGainToggle = nullptr; + QPushButton *btnBWPalette = nullptr; + QPushButton *btnBWPalette2 = nullptr; + QPushButton *btnLoadPede = nullptr; + QPushButton *btnSavePede = nullptr; + QPushButton *btnReadPede = nullptr; + QPushButton *btnLoadAllPede = nullptr; + QPushButton *btnGainMap = nullptr; + QCheckBox *kevChk_ = nullptr; + QPushButton *btnNoPede_ = nullptr; + QPushButton *btnPedeTrack_ = nullptr; + QLabel *pedeTrackVal_ = nullptr; + QGroupBox *pedeTrackGroup_ = nullptr; + QLabel *noPedeVal_ = nullptr; + QLabel *gainMapVal_ = nullptr; + QPushButton *btnResetHis = nullptr; + QPushButton *btnResetAxis = nullptr; + QPushButton *btnQuit = nullptr; + QPushButton *btnSetRanges = nullptr; + QPushButton *btnRates = nullptr; + QDoubleSpinBox *photonThrSpin_ = nullptr; // ADU, or keV with gain on + QLabel *photonThrLabel_ = nullptr; + QPushButton *btnColPal = nullptr; + QPushButton *btnResetCounters = nullptr; + + FastImageView *m_adcView = nullptr; + FastImageView *m_gainView = nullptr; + QWidget *m_adcWin = nullptr; + ScalePanel *m_adcScale_ = nullptr; + ScalePanel *m_photonScale_ = nullptr; + QWidget *m_gainWin = nullptr; + QWidget *m_photonWin = nullptr; + FastImageView *m_photonView = nullptr; + QCheckBox *pmapCumulative_ = nullptr; + QCheckBox *zoomCoordChk_ = nullptr; + QPushButton *btnShowGain_ = nullptr; // Display: reveal the Gain window + QPushButton *btnShowPlots_ = nullptr; // Display: reveal the ROOT canvases // Display: link the image zoom levels + bool zoomCoord_ = true; // on = any window zooms them all + QSpinBox *pmapEverySpin_ = nullptr; + uint64_t pmapSeq_ = 0; +#ifdef JFSTRX + // separate strixel window: six group panels, display only (no ROI) + std::array m_adcPanelView{}; + QWidget *m_adcPanelWin = nullptr; + QLabel *m_adcPanelZ = nullptr; // "Z: lo .. hi" legend of the strixel panels +#endif + + // last receiver ROI mirrored onto the ADC image (red box) + bool m_rxRoiShown = false; + int m_rxRoiLast[4] = {-1, -1, -1, -1}; +}; + +MainWindow::MainWindow() : QMainWindow(nullptr) { + setWindowTitle("Online JF Display + Event Finder"); + setMinimumWidth(420); + + setupUI(); + connectShortcuts(); + + goout = 1; + gain_flag = false; + HDraw_every = 20; + // the operator's range defaults (Set Ranges) are in force from the start; + // "Reset Axis" releases them and the axes auto-scale again + fixranges = true; + + initGeometry(); + + hchptr = (short *)malloc(NCH * sizeof(short)); + for (int k = 0; k < NCH; k++) + hchptr[k] = 0; + + cout << "opening the rootapp" << endl; + int argc_copy = 1; + char dummy_name[] = "onlinedisp"; + char *argv_copy[] = {dummy_name, nullptr}; + rootapp = new TApplication("Online JF display", &argc_copy, argv_copy); + + loadRootPalette(Palette::Color); + + char hname[100]; +#ifdef JFSTRX + int nxx = 79; + int nyy = 165; + his1000 = new TH2F("his1000", "2d, chip 1 group 1 (25um) pede corr.", nxx, + -0.5, nxx - 0.5, nyy, -0.5, nyy - 0.5); + his1060 = new TH2F("his1060", "2d, chip 6 group 1 (25um) pede corr.", nxx, + -0.5, nxx - 0.5, nyy, -0.5, nyy - 0.5); + nxx = 47; + nyy = 320; + his1001 = new TH2F("his1001", "2d, chip 1 group 2 (15um) pede corr.", nxx, + -0.5, nxx - 0.5, nyy, -0.5, nyy - 0.5); + his1061 = new TH2F("his1061", "2d, chip 6 group 2 (15um) pede corr.", nxx, + -0.5, nxx - 0.5, nyy, -0.5, nyy - 0.5); + nxx = 59; + nyy = 476; + his1002 = new TH2F("his1002", "2d, chip 1 group 3 (18.75um) pede corr.", nxx, + -0.5, nxx - 0.5, nyy, -0.5, nyy - 0.5); + his1062 = new TH2F("his1062", "2d, chip 6 group 3 (18.75um) pede corr.", nxx, + -0.5, nxx - 0.5, nyy, -0.5, nyy - 0.5); + his1000->SetOption("colz"); + his1001->SetOption("colz"); + his1002->SetOption("colz"); + his1060->SetOption("colz"); + his1061->SetOption("colz"); + his1062->SetOption("colz"); +#else + his1000 = new TH2F("his1000", "2d, ev. pede corrected", nx, -0.5, nx - 0.5, + ny, -0.5, ny - 0.5); + his1000->SetOption("colz"); +#endif + + his2000 = new TH2F("his2000", "2d gain", nx, -0.5, nx - 0.5, ny, -0.5, + ny - 0.5); + his2000->GetZaxis()->SetRangeUser(0, 4); + + // The photon map has no ROOT histogram any more: it is filled in the + // analysis and shown in its own Qt window (see "virtual photon counting"). + + his4500 = new TH2F("his4500", "T vs B", 101, -500, MAX_POS, 101, -500, + MAX_POS); + hisLvsR = new TH2F("hisLvsR", "L vs R", 101, -500, MAX_POS, 101, -500, + MAX_POS); + hchip = new TH1I *[8]; +#ifdef JFSTRX + for (int k = 0; k < 8; k++) { + if (k < 3) + sprintf(hname, "%d_hchip1group%d", k, k + 1); + else if (k > 4) + sprintf(hname, "%d_hchip6group%d", k, k - 4); + else + sprintf(hname, "%d_", k); + hchip[k] = new TH1I(hname, hname, NBIN, MIN_POS, MAX_POS); + } +#else + for (int k = 0; k < 8; k++) { + sprintf(hname, "hchip%d", k); + hchip[k] = new TH1I(hname, hname, NBIN, MIN_POS, MAX_POS); + } +#endif + // ONE spectrum of the gate-ROI pixels (canvas A7): identical binning to + // the chip spectra, summed over the whole selection + hroi = new TH1I("hroi", "hroi", NBIN, MIN_POS, MAX_POS); + // the same two sets again in keV (canvases A8/A9). The axes are the ADU + // axes divided by KEV_NOMINAL_ADU with the same number of bins, so a + // pixel's keV value selects the same bin index as its ADU value and the + // two sets always show the same window. + hchipKev = new TH1I *[8]; + for (int k = 0; k < 8; k++) { + char kn[64]; + sprintf(kn, "hchip%d_keV", k); + hchipKev[k] = new TH1I(kn, kn, NBIN, MIN_POS / KEV_NOMINAL_ADU, + MAX_POS / KEV_NOMINAL_ADU); + } + hroiKev = new TH1I("hroi_keV", "hroi_keV", NBIN, MIN_POS / KEV_NOMINAL_ADU, + MAX_POS / KEV_NOMINAL_ADU); + + cout << "end of histo booking" << endl; +#ifdef JFSTRX + if (A3 == nullptr) { + A3 = new TCanvas("A3", "Plotting Canvas ADC", 150, 360, 1200, 750); + p1 = new TPad("p1", "p1", 0.01, 0.5, 0.49, 1.); + p1->Draw(); + p2 = new TPad("p2", "p2", 0.51, 0.75, 0.99, 0.97); + p2->Draw(); + p3 = new TPad("p3", "p3", 0.01, 0.25, 0.49, 0.47); + p3->Draw(); + p4 = new TPad("p4", "p4", 0.51, 0.53, 0.99, 0.75); + p4->Draw(); + p5 = new TPad("p5", "p5", 0.01, 0.03, 0.49, 0.25); + p5->Draw(); + p6 = new TPad("p6", "p6", 0.51, 0., 0.99, 0.5); + p6->Draw(); + } +#endif + if (A4 == nullptr) + A4 = new TCanvas("A4", "Plotting Canvas PHs", 750, 300, 1000, 800); + A4->Clear(); + A4->Divide(4, 2, 0.005, 0.005); + if (false) // the photon map canvas is gone; keep the pointer unused + A5 = new TCanvas("A5", "Plotting Canvas Photon Map", 750, 300, 1000, + 600); + if (A6 == nullptr) + A6 = new TCanvas("A6", "Plotting Canvas LvsR", 650, 250, 650, 660); + if (A7 == nullptr) + A7 = new TCanvas("A7", "ROI PH", 770, 340, 1000, 700); + A7->Clear(); // one pad: all the gate-ROI pixels in one spectrum + // The keV canvases are NOT created here: a ROOT canvas maps its window in + // the constructor, and these two must stay invisible until a gain map is + // loaded. They are created lazily by the ROOT thread in + // Plot1DHistosKev()/PlotRoiHistosKev() the first time they are needed. + + + // display clones painted by the ROOT thread (sources stay exclusive to + // the analysis thread) + disp4500 = (TH2F *)his4500->Clone("disp4500"); + dispLvsR = (TH2F *)hisLvsR->Clone("dispLvsR"); + for (int ih = 0; ih < 8; ih++) { + char nm[64]; + sprintf(nm, "dispChip%d", ih); + dispChip[ih] = (TH1I *)hchip[ih]->Clone(nm); + } + dispRoi = (TH1I *)hroi->Clone("dispRoi"); + for (int ih = 0; ih < 8; ih++) { + char nm[64]; + sprintf(nm, "dispChipKev%d", ih); + dispChipKev[ih] = (TH1I *)hchipKev[ih]->Clone(nm); + } + dispRoiKev = (TH1I *)hroiKev->Clone("dispRoiKev"); + + // start with the operator's ranges (Set Ranges dialog): the spectra open + // on the PH window, the main plot keeps its value window (fixranges) + for (int ih = 0; ih < 8; ih++) { + if (dispChip[ih]) + dispChip[ih]->GetXaxis()->SetRangeUser(float(chipxmin.load()), + float(chipxmax.load())); + } + if (dispRoi) + dispRoi->GetXaxis()->SetRangeUser(float(chipxmin.load()), + float(chipxmax.load())); + if (dispRoiKev) + dispRoiKev->GetXaxis()->SetRangeUser( + chipxmin.load() / KEV_NOMINAL_ADU, + chipxmax.load() / KEV_NOMINAL_ADU); + for (int ih = 0; ih < 8; ih++) { + if (dispChipKev[ih]) + dispChipKev[ih]->GetXaxis()->SetRangeUser( + chipxmin.load() / KEV_NOMINAL_ADU, + chipxmax.load() / KEV_NOMINAL_ADU); + } + // the photon window opens on the photon-map colour range (the ADC image + // was given the ADC range in setupUI()) + if (m_photonView) + m_photonView->setColorRange(pmmin.load(), pmmax.load()); +#ifdef JFSTRX + disp1000 = (TH2F *)his1000->Clone("disp1000"); + disp1001 = (TH2F *)his1001->Clone("disp1001"); + disp1002 = (TH2F *)his1002->Clone("disp1002"); + disp1060 = (TH2F *)his1060->Clone("disp1060"); + disp1061 = (TH2F *)his1061->Clone("disp1061"); + disp1062 = (TH2F *)his1062->Clone("disp1062"); +#endif + + printhelp(); +} + +MainWindow::~MainWindow() { stop(); } + +// --------------------------------------------------------------------------- +// UI +// --------------------------------------------------------------------------- +void MainWindow::setupUI() { + auto *central = new QWidget(this); + setCentralWidget(central); + auto *rootLayout = new QVBoxLayout(central); + auto *columns = new QHBoxLayout(); + rootLayout->addLayout(columns); + + auto *leftCol = new QVBoxLayout(); + auto *rightCol = new QVBoxLayout(); + // The connectors that cross from one column to the other are drawn by a + // strip placed by hand in the gap (not in the layout: an item here would + // stretch the column row and leave empty space above the save panel). A + // zero-height spacer reserves the width. + midCol_ = new QVBoxLayout(); + leftCol_ = leftCol; + rightCol_ = rightCol; + midSpacer_ = new QWidget(central); + midSpacer_->setFixedWidth(64); + midSpacer_->setFixedHeight(0); + midCol_->addWidget(midSpacer_); + strip_ = new FlowStrip(central); + columns->addLayout(leftCol, 1); + columns->addLayout(midCol_, 0); + columns->addLayout(rightCol, 1); + // bottom row: what the program is doing (Status) and what it has counted. + // It is added to the layout *after* the save panel (see the end of this + // function) so the save ends up above the counters. + auto *bottomRow = new QHBoxLayout(); + + // ── Status ── + auto *statusGroup = new QGroupBox("Status", central); + auto *statusLayout = new QVBoxLayout(statusGroup); + frameLabel = new QLabel("Frame: --", statusGroup); + statusLabel = new QLabel("Status: idle", statusGroup); + drawLabel = new QLabel(statusGroup); + streamVal_ = makeValueLabel("disconnected", statusGroup); + pedeVal_ = makeValueLabel("not loaded", statusGroup); + errVal_ = makeValueLabel(QString(), statusGroup); + errVal_->setWordWrap(true); + displayDropVal_ = makeValueLabel("0", statusGroup); + alignVal_ = makeValueLabel(QString(), statusGroup); + alignVal_->setWordWrap(true); + statusLayout->addWidget(frameLabel); + statusLayout->addWidget(statusLabel); + statusLayout->addWidget(drawLabel); + statusLayout->addWidget(new QLabel("Stream:", statusGroup)); + statusLayout->addWidget(streamVal_); + statusLayout->addWidget(new QLabel("Pedestal:", statusGroup)); + statusLayout->addWidget(pedeVal_); + statusLayout->addWidget(new QLabel("Display drops (analysis too slow):", + statusGroup)); + statusLayout->addWidget(displayDropVal_); + statusLayout->addWidget(new QLabel("Frame alignment:", statusGroup)); + statusLayout->addWidget(alignVal_); + statusLayout->addWidget(errVal_); + bottomRow->addWidget(statusGroup, 1); + + // ── Gate (event finder): two gates, applied in series ── + auto *gateGroup = new QGroupBox("Event finder gate", central); + auto *gateCol = new QVBoxLayout(gateGroup); + + // gate 1: storage cell. This is a header field, so it is checked first + // and frames from other cells cost no CPU at all. + auto *scGroup = new QGroupBox("1. Storage cell (header)", gateGroup); + scGroup_ = scGroup; + auto *scForm = new QFormLayout(scGroup); + scCombo_ = new QComboBox(scGroup); + scCombo_->addItem("ALL"); // index 0 == no storage-cell gating + for (int i = 0; i <= 15; i++) + scCombo_->addItem(QString::number(i)); + scCombo_->setToolTip( + "Pass only frames acquired in this storage cell (bits 8-11 of the\n" + "header's detector specific 3; 0..15, 15 = default). \"ALL\" passes\n" + "every cell. Checked before any pixel is touched, so the signal\n" + "gate only ever sees frames that survive this one."); + scLastVal_ = makeValueLabel("last frame: ?", scGroup); + scForm->addRow("Only storage cell:", scCombo_); + scForm->addRow(scLastVal_); + gateCol->addWidget(scGroup); + // Plain invisible spacer between the two gates: the path from the storage + // cell to the signal gate goes through the Pedestal and is drawn by the + // strip, so a direct arrow here would be wrong. layoutFlow() stretches + // this gap so the signal gate's middle lands on the Gain's top. + gatePad_ = new QWidget(gateGroup); + gatePad_->setFixedHeight(24); + gateCol->addWidget(gatePad_); + + // gate 2: the signal gate (the pixel counting) + auto *sigGroup = new QGroupBox("2. Signal gate (pixel counting)", gateGroup); + sigGroup_ = sigGroup; + auto *gateForm = new QFormLayout(sigGroup); + gateChk_ = new QCheckBox("Gate enabled (off = passthrough)", sigGroup); + gateChk_->setChecked(g_cfg.gateEnabled); + contigChk_ = new QCheckBox("Contiguous (N px within circle, r = N/2+1)", + sigGroup); + contigChk_->setChecked(g_cfg.contiguous); + thrSpin_ = new QDoubleSpinBox(sigGroup); + thrSpin_->setRange(0.0, 1000000.0); + thrSpin_->setDecimals(1); + thrSpin_->setSingleStep(10.0); + thrSpin_->setValue(g_cfg.threshold); + minPixSpin_ = new QSpinBox(sigGroup); + minPixSpin_->setRange(1, 10000000); + minPixSpin_->setValue(static_cast(g_cfg.minPixels)); + btnResetCounters = new QPushButton("Reset counters", gateGroup); + btnGateRoi = new QPushButton("ROI only (i)", sigGroup); + btnGateRoi->setCheckable(true); + btnGateRoi->setToolTip( + "Count only inside the ROI captured from the ADC zoom at the moment\n" + "this is pressed. The ROI is a snapshot: panning or zooming the ADC\n" + "image afterwards does not move it (it stays outlined in yellow)."); + gateRoiVal_ = makeValueLabel("full frame", sigGroup); + { + auto *gateRow = new QHBoxLayout(); + gateRow->addWidget(gateChk_); + gateRow->addWidget(btnGateRoi); + gateForm->addRow(gateRow); + } + gateForm->addRow(contigChk_); + hotChk_ = new QCheckBox("Suppress hot pixels in the gate", sigGroup); + hotChk_->setChecked(g_cfg.hotSuppress); + hotChk_->setToolTip( + "Masked pixels (see Get hot pixels) are excluded from the gate: they\n" + "do not count towards min pixels and cannot form a contiguous cluster."); + hotVal_ = makeValueLabel("hot: 0 px", sigGroup); + btnGetHot_ = new QPushButton("Get hot pixels...", sigGroup); + btnGetHot_->setToolTip( + "Mark hot pixels from the current photon map: every pixel whose map\n" + "value is above the threshold you enter becomes a hot pixel."); + btnResetHot_ = new QPushButton("Clear hot pixels", sigGroup); + { + auto *hotRow = new QHBoxLayout(); + hotRow->addWidget(hotChk_); + hotRow->addWidget(hotVal_); + gateForm->addRow("Hot pixels:", hotRow); + auto *hotBtnRow = new QHBoxLayout(); + hotBtnRow->addWidget(btnGetHot_); + hotBtnRow->addWidget(btnResetHot_); + gateForm->addRow(hotBtnRow); + } + thrLabel_ = new QLabel("Threshold (ADC, pede-subtracted):", sigGroup); + gateForm->addRow(thrLabel_, thrSpin_); + gateForm->addRow("Min pixels above threshold:", minPixSpin_); + gateForm->addRow("Gate ROI:", gateRoiVal_); + gateCol->addWidget(sigGroup); + + auto *seriesHint = new QLabel( + "Applied in series - storage cell first, so frames from other cells " + "never reach the pixel counting (all 0-15, no gating, and both " + "together are all possible).", + gateGroup); + seriesHint->setWordWrap(true); + gateCol->addWidget(seriesHint); + gateCol->addWidget(btnResetCounters); + // 1) Storage cell then 2) Signal gate: the left column *is* the gate flow. + // leftPad_ is sized at run time so that the middle of the storage-cell box + // lands on the top edge of the Pedestal box (see layoutFlow()). + // (Quit is added at the top of the right column, right aligned) + leftPad_ = new QWidget(central); + leftPad_->setFixedHeight(0); + leftCol->addWidget(leftPad_); + leftCol->addWidget(gateGroup); + + // ── Counters ── + auto *counterBox = new QGroupBox("Counters", central); + auto *grid = new QGridLayout(counterBox); + grid->setColumnStretch(1, 1); + grid->setColumnStretch(2, 1); + auto *headCum = new QLabel("Cumulative", counterBox); + auto *headCur = new QLabel("Current", counterBox); + headCum->setStyleSheet("font-weight: bold;"); + headCur->setStyleSheet("font-weight: bold;"); + grid->addWidget(new QLabel(QString(), counterBox), 0, 0); + grid->addWidget(headCum, 0, 1); + grid->addWidget(headCur, 0, 2); + + framesInCumVal_ = makeValueLabel("0", counterBox); + framesInCurVal_ = makeValueLabel("0", counterBox); + grid->addWidget(new QLabel("Frames in", counterBox), 1, 0); + grid->addWidget(framesInCumVal_, 1, 1); + grid->addWidget(framesInCurVal_, 1, 2); + + framesPassCumVal_ = makeValueLabel("0", counterBox); + framesPassCurVal_ = makeValueLabel("0", counterBox); + grid->addWidget(new QLabel("Frames passed", counterBox), 2, 0); + grid->addWidget(framesPassCumVal_, 2, 1); + grid->addWidget(framesPassCurVal_, 2, 2); + + framesDropCumVal_ = makeValueLabel("0", counterBox); + framesDropCurVal_ = makeValueLabel("0", counterBox); + grid->addWidget(new QLabel("Frames dropped", counterBox), 3, 0); + grid->addWidget(framesDropCumVal_, 3, 1); + grid->addWidget(framesDropCurVal_, 3, 2); + + scDropCumVal_ = makeValueLabel("0", counterBox); + scDropCurVal_ = makeValueLabel("0", counterBox); + grid->addWidget(new QLabel("Frames dropped (SC)", counterBox), 4, 0); + grid->addWidget(scDropCumVal_, 4, 1); + grid->addWidget(scDropCurVal_, 4, 2); + + pixelsAboveCumVal_ = makeValueLabel("0", counterBox); + pixelsAboveCurVal_ = makeValueLabel("0", counterBox); + grid->addWidget(new QLabel("Pixels above", counterBox), 5, 0); + grid->addWidget(pixelsAboveCumVal_, 5, 1); + grid->addWidget(pixelsAboveCurVal_, 5, 2); + + rateInVal_ = makeValueLabel("0 fps / 0 MB/s", counterBox); + grid->addWidget(new QLabel("Rate in (fps / MB/s)", counterBox), 6, 0); + grid->addWidget(rateInVal_, 6, 1, 1, 2); + ratePassVal_ = makeValueLabel("0 fps / 0 MB/s", counterBox); + grid->addWidget(new QLabel("Rate pass (fps / MB/s)", counterBox), 7, 0); + grid->addWidget(ratePassVal_, 7, 1, 1, 2); + dropFracVal_ = makeValueLabel("0.000", counterBox); + grid->addWidget(new QLabel("Drop fraction (cum.)", counterBox), 8, 0); + grid->addWidget(dropFracVal_, 8, 1, 1, 2); + bottomRow->addWidget(counterBox, 1); + + // ── Display controls ── + auto *ctrlGroup = new QGroupBox("Display", central); + displayGroup_ = ctrlGroup; + auto *ctrlGrid = new QGridLayout(ctrlGroup); + btnStartPause = new QPushButton("Start/Pause (s)", ctrlGroup); + btnFaster = new QPushButton("Faster (+)", ctrlGroup); + btnSlower = new QPushButton("Slower (-)", ctrlGroup); + btnGainToggle = new QPushButton("gain correction on/off (g)", ctrlGroup); + btnGainToggle->setCheckable(true); + btnGainToggle->setToolTip( + "Divide every pixel by its ADU/keV - the per-pixel value from the gain\n" + "map when one is loaded, the nominal 40 ADU/keV otherwise - to get keV.\n" + "\"keV PH\" then shows the PH spectra in keV; with this off (or keV PH\n" + "unticked) they show the raw pedestal-subtracted ADC."); + btnBWPalette = new QPushButton("BW Pal. (b)", ctrlGroup); + btnBWPalette2 = new QPushButton("BW Pal. 2 (B)", ctrlGroup); + btnSetRanges = new QPushButton("Set Ranges (S)", ctrlGroup); + btnColPal = new QPushButton("Col Pal (c)", ctrlGroup); + btnRates = new QPushButton("Update Rates", ctrlGroup); + btnResetHis = new QPushButton("Reset His (r)", ctrlGroup); + btnResetAxis = new QPushButton("Reset Axis (R)", ctrlGroup); + photonThrSpin_ = new QDoubleSpinBox(central); + photonThrSpin_->setRange(0.0, 100000.0); + photonThrSpin_->setDecimals(0); // ADU: whole numbers + photonThrSpin_->setSingleStep(10.0); + photonThrSpin_->setValue(static_cast(g_pheneThreshold)); + photonThrSpin_->setToolTip( + "Photon-map threshold (pede-subtracted ADC): only pixels above this\n" + "contribute to the map, and the number of photons a pixel counts for is\n" + "(value + threshold) / (2 x threshold). In ADU while the gain\n" + "correction is off, in keV while it is on (the value is then divided by\n" + "the pixel's ADU/keV first); both are remembered separately. It does\n" + "not affect the event-finder gate, which has its own threshold."); + // ── Virtual photon counting ── + // Left of the Display column (the Display lives in the right column at this + // height). The map itself is the same photon counting as before, but shown + // in its own Qt window: a fresh image every N analysed frames, and + // cumulative only if asked. + auto *pmapGroup = new QGroupBox("Virtual photon counting", central); + pmapGroup_ = pmapGroup; + auto *pmapGrid = new QGridLayout(pmapGroup); + pmapCumulative_ = new QCheckBox("cumulative (toggle to reset)", pmapGroup); + pmapCumulative_->setChecked(gPmapCumulative.load()); + pmapCumulative_->setToolTip( + "off: every displayed image shows only the photons counted since the\n" + "previous one; on: the map keeps adding up (the old behaviour)"); + pmapGrid->addWidget(pmapCumulative_, 0, 0, 1, 2); + pmapGrid->addWidget( + new QLabel("write plot every N (gated) images:", pmapGroup), 1, 0); + pmapEverySpin_ = new QSpinBox(pmapGroup); + pmapEverySpin_->setRange(1, 1000000); + pmapEverySpin_->setSingleStep(100); + pmapEverySpin_->setValue(gPmapEvery.load()); + pmapEverySpin_->setToolTip( + "How many analysed frames are accumulated into one photon map image.\n" + "It counts the frames that reach the analysis, i.e. AFTER the gate and\n" + "the frame decimation, so the wall-clock interval between two maps\n" + "grows when frames are rejected or skipped (it is not independent of\n" + "them). Default 2000."); + pmapGrid->addWidget(pmapEverySpin_, 1, 1); + photonThrLabel_ = new QLabel("photon threshold (ADU):", pmapGroup); + pmapGrid->addWidget(photonThrLabel_, 2, 0); + // the photon threshold moves here from the Display panel + pmapGrid->addWidget(photonThrSpin_, 2, 1); + // under the gates, left of the Display column + leftCol->insertWidget(2, pmapGroup); + leftCol->addStretch(1); + + ctrlGrid->addWidget(btnStartPause, 0, 0); + ctrlGrid->addWidget(btnFaster, 0, 1); + ctrlGrid->addWidget(btnSlower, 0, 2); + // the three palette buttons share one row + ctrlGrid->addWidget(btnBWPalette, 1, 0); + ctrlGrid->addWidget(btnBWPalette2, 1, 1); + ctrlGrid->addWidget(btnColPal, 1, 2); + // (btnGainToggle lives in the Gain panel, below) + ctrlGrid->addWidget(btnSetRanges, 2, 0); + ctrlGrid->addWidget(btnRates, 2, 1); + ctrlGrid->addWidget(btnResetHis, 3, 0); + ctrlGrid->addWidget(btnResetAxis, 3, 1); + zoomCoordChk_ = new QCheckBox("zoom coordination", ctrlGroup); + zoomCoordChk_->setChecked(true); // the historic ADC-master behaviour + zoomCoordChk_->setToolTip( + "On: zooming any image window zooms all of them (and the ROOT plots)\n" + "to the same rectangle. Off: every window keeps its own zoom, and\n" + "nothing is propagated."); + ctrlGrid->addWidget(zoomCoordChk_, 4, 0, 1, 3); + // Both start hidden ("disabled by default"): the operator reveals them. + btnShowGain_ = new QPushButton("show gain image", ctrlGroup); + btnShowGain_->setCheckable(true); + btnShowGain_->setChecked(false); + btnShowGain_->setToolTip( + "Show or hide the separate Gain Image window. It is hidden at\n" + "startup; the gain map itself is still used when the gain correction\n" + "is on."); + btnShowPlots_ = new QPushButton("show ROOT plots", ctrlGroup); + btnShowPlots_->setCheckable(true); + btnShowPlots_->setChecked(false); + btnShowPlots_->setToolTip( + "Show or hide the ROOT spectra canvases (PH spectra, ROI PH, L vs R,\n" + "the 2D map). They are hidden at startup; the histograms keep being\n" + "filled, so showing them later shows the accumulated data."); + ctrlGrid->addWidget(btnShowGain_, 5, 0, 1, 2); + ctrlGrid->addWidget(btnShowPlots_, 6, 0, 1, 2); + connect(btnShowGain_, &QPushButton::toggled, this, [this](bool on) { + if (m_gainWin) + m_gainWin->setVisible(on); + printf("[display] gain image %s\n", on ? "shown" : "hidden"); + fflush(stdout); + statusLabel->setText(on ? "Status: gain image shown" + : "Status: gain image hidden"); + }); + connect(btnShowPlots_, &QPushButton::toggled, this, [this](bool on) { + RootCmd c; + c.type = RootCmdType::ShowPlots; + c.a = on ? 1.0 : 0.0; + pushRootCmd(c); + printf("[display] ROOT plots %s\n", on ? "shown" : "hidden"); + fflush(stdout); + statusLabel->setText(on ? "Status: ROOT plots shown" + : "Status: ROOT plots hidden"); + }); + connect(zoomCoordChk_, &QCheckBox::toggled, this, [this](bool on) { + zoomCoord_ = on; + printf("[zoom] coordination %s\n", on ? "on" : "off"); + fflush(stdout); + statusLabel->setText(on ? "Status: zoom coordination on (all linked)" + : "Status: zoom coordination off (independent)"); + }); + + // (the Display panel is added below the Gain panel, see below: it shows + // the result, so it comes after the chain that produces it) + + // ── ROI save (HDF5) ── + auto *saveGroup = new QGroupBox("Save", central); + saveGroup_ = saveGroup; + auto *saveForm = new QFormLayout(saveGroup); + saveFrames_ = new QSpinBox(saveGroup); + saveFrames_->setRange(0, 1000000000); + saveFrames_->setValue(1000); + saveFrames_->setSpecialValueText("unlimited"); + if (g_cfg.saveBudget > 0) // --save-budget: frames, or maps in photon mode + saveFrames_->setValue(static_cast(g_cfg.saveBudget)); + saveFrames_->setToolTip( + "Number of gate-passed frames to write; 0 = unlimited (stop with the\n" + "button). The run also stops by itself when this many frames are in\n" + "the file. In virtual photon counting mode it counts the maps."); + btnSaveStart = new QPushButton("Start/Stop save (n)", saveGroup); + btnSaveStart->setCheckable(true); + btnSaveStart->setToolTip( + "Write the active gate ROI of every gate-passed frame to an HDF5\n" + "file (slsReceiver layout, slice 0 = pedestal) plus a JSON sidecar."); + saveCorrected_ = new QCheckBox("Pedestal corrected", saveGroup); + saveCorrected_->setChecked(false); + saveCorrected_->setToolTip( + "Off (default): /data holds the raw 16-bit words and slice 0 is the\n" + "pedestal image.\n" + "On: /data holds pedestal-corrected float32 values with no pedestal\n" + "slice, and the pedestal image is written to the separate dataset\n" + "/pedestal data. Needs a loaded pedestal."); + saveDirEdit_ = new QLineEdit(QString::fromStdString(g_cfg.h5Dir), saveGroup); + saveDirEdit_->setToolTip("Directory the HDF5 file and JSON sidecar go to."); + auto *dirBtn = new QPushButton("...", saveGroup); + dirBtn->setFixedWidth(32); + auto *dirRow = new QHBoxLayout(); + dirRow->addWidget(saveDirEdit_); + dirRow->addWidget(dirBtn); + saveBaseEdit_ = new QLineEdit(QString::fromStdString(g_cfg.h5Base), saveGroup); + saveDefaultBase_ = saveBaseEdit_->text().trimmed(); // start-up default + saveBaseEdit_->setToolTip( + "File-name base. The file is __f0_0.h5 (and the\n" + "JSON the same with .json), so re-using a base never overwrites."); + btnSaveDest_ = new QPushButton("Previous destinations...", saveGroup); + btnSaveDest_->setToolTip( + "List of destinations used before (directory + base), most recent\n" + "first; pick one to fill the fields, or delete entries."); + saveDefaultDir_ = saveDirEdit_->text().trimmed(); // start-up default + saveVal_ = makeValueLabel("idle", saveGroup); + saveVal_->setWordWrap(true); + saveBudgetLabel_ = + new QLabel("Number of frames to be saved:", saveGroup); + saveForm->addRow(saveBudgetLabel_, saveFrames_); + // what gets written: the gate-passed frames, or the virtual photon + // counting maps (non-cumulative, one every M analysed frames) + saveModeFrames_ = new QRadioButton("save frames", saveGroup); + saveModePhoton_ = new QRadioButton("virtual photon counting", saveGroup); + saveModeFrames_->setChecked(gSaveMode.load() != 1); + saveModePhoton_->setChecked(gSaveMode.load() == 1); + saveForm->addRow(saveModeFrames_); + // the correction is a property of the *frames* being saved: the photon maps + // are always pedestal-subtracted, so the box lives under that radio and is + // greyed while the maps are selected + saveForm->addRow(saveCorrected_); + saveForm->addRow(saveModePhoton_); // (was dropped by the move above) + pmapSaveSpin_ = new QSpinBox(saveGroup); + pmapSaveSpin_->setRange(200, 1000000); // the requested minimum + pmapSaveSpin_->setSingleStep(100); + pmapSaveSpin_->setValue(gPmapSaveEvery.load()); + pmapSaveSpin_->setEnabled(gSaveMode.load() == 1); + pmapSaveSpin_->setToolTip( + "virtual photon counting: one non-cumulative map every this many\n" + "analysed frames (minimum 200), independent of the display cadence"); + saveForm->addRow("photon map every N frames:", pmapSaveSpin_); + saveForm->addRow("Directory:", dirRow); + saveForm->addRow("Base name:", saveBaseEdit_); + saveForm->addRow(btnSaveDest_); + saveForm->addRow(btnSaveStart); + saveForm->addRow("Save status:", saveVal_); + // (the ROI-save panel is added below the Gain panel, see the end of this + // function: the right column reads Display, Pedestal, Gain, Save) + + // ── Pedestal ── + auto *pedeGroup = new QGroupBox("Pedestal", central); + pedeGroup_ = pedeGroup; + auto *pedeGrid = new QGridLayout(pedeGroup); + btnLoadPede = new QPushButton("Acquire Pede (p)", pedeGroup); + btnSavePede = new QPushButton("Save Pede (O)", pedeGroup); + btnReadPede = new QPushButton("Read Pede (o)", pedeGroup); + btnLoadAllPede = new QPushButton("Load Pede File (P)", pedeGroup); + btnGainMap = new QPushButton("Gain map (keV)...", pedeGroup); + kevChk_ = new QCheckBox("keV PH", pedeGroup); + kevChk_->setToolTip( + "Show the PH spectra in keV instead of ADU. With a gain map the " + "pixel's own ADU/keV is used; without one the nominal 40 ADU/keV is " + "used and the panel says so."); + // usable without a map: the nominal 40 ADU/keV is used then + gainMapVal_ = new QLabel("no gain map loaded", pedeGroup); + btnNoPede_ = new QPushButton("Pede/Raw toggle", pedeGroup); + btnNoPede_->setCheckable(true); + btnNoPede_->setChecked(gNoPede.load()); // startup default: raw ADC + btnNoPede_->setToolTip( + "Switch between the loaded pedestal and raw ADC. Pressed = raw ADC:\n" + "the display, the photon map, the spectra, the event finder and the ROI\n" + "save then work on raw 14-bit values, and the Pedestal box is greyed\n" + "(this button stays active, it is how you switch back)."); + noPedeVal_ = new QLabel("pede subtracted", pedeGroup); + pedeGrid->addWidget(btnLoadPede, 0, 0); + pedeGrid->addWidget(btnSavePede, 0, 1); + pedeGrid->addWidget(btnReadPede, 1, 0); + pedeGrid->addWidget(btnLoadAllPede, 1, 1); + // calibration for the keV spectra (the ADC plots stay in ADU) + // (the gain map moved to the Gain panel below) + pedeTrackGroup_ = new QGroupBox("Pedestal tracking", central); + auto *trackCol = new QVBoxLayout(pedeTrackGroup_); + btnPedeTrack_ = + new QPushButton("pedestal tracking on/off", pedeTrackGroup_); + btnPedeTrack_->setCheckable(true); + btnPedeTrack_->setChecked(gPedeTracking.load()); // --pede-tracking + btnPedeTrack_->setToolTip( + "Follow the pedestal drift from the frames the signal gate drops\n" + "(the beam is off then). While the gate drops more than 90 % of the\n" + "frames reaching it, 0.2 % of every dropped frame feeds a per-pixel\n" + "running average over a 10 M sample window; the pedestal in use is\n" + "replaced when the largest difference exceeds 5 ADU, at most once\n" + "every 10 s and at least every 10 min. Needs the signal gate on."); + pedeTrackVal_ = makeValueLabel("off", pedeTrackGroup_); + pedeGrid->addWidget(btnNoPede_, 2, 0); + pedeGrid->addWidget(noPedeVal_, 2, 1); + trackCol->addWidget(btnPedeTrack_); + trackCol->addWidget(pedeTrackVal_); + gainMapVal_->setWordWrap(true); + pedePad_ = new QWidget(central); + pedePad_->setFixedHeight(0); + rightCol->addWidget(pedePad_); + rightCol->addWidget(pedeGroup); + // the tracker reads the frames the signal gate drops and feeds its result + // back into the Pedestal box above it, so the arrow points up + // the tracking feedback goes back into the pedestal, so it is pedestal path + arrTrackUp_ = makeFlowArrow(QString::fromUtf8("\u2191"), central, + FlowPedestal); + rightCol->addWidget(arrTrackUp_, 0, Qt::AlignHCenter); + rightCol->addWidget(pedeTrackGroup_); + gainPad_ = new QWidget(central); + gainPad_->setFixedHeight(0); + rightCol->addWidget(gainPad_); + + auto *gainGroup = new QGroupBox("Gain", central); + gainGroup_ = gainGroup; + auto *gainCol = new QVBoxLayout(gainGroup); + { + auto *gainRow = new QHBoxLayout(); + gainRow->addWidget(btnGainToggle); + // Read-only state indicator (the button is the only control): it shows + // at a glance whether the gain correction is applied - itself if a map + // is loaded, the nominal 40 ADU/keV otherwise. + gainStateChk_ = new QCheckBox("gain corrected", gainGroup); + gainStateChk_->setAttribute(Qt::WA_TransparentForMouseEvents, true); + gainStateChk_->setFocusPolicy(Qt::NoFocus); + gainStateChk_->setToolTip( + "Whether the gain correction is applied (read-only: switch it with\n" + "the button on the left). Ticked = pixels are divided by their\n" + "ADU/keV, so the PH spectra can be shown in keV."); + gainRow->addWidget(gainStateChk_); + gainRow->addStretch(1); + gainCol->addLayout(gainRow); + } + { + auto *gmRow = new QHBoxLayout(); + gmRow->addWidget(new QLabel("Gain map (keV PH):", gainGroup)); + gmRow->addWidget(btnGainMap); + gmRow->addWidget(kevChk_); + gmRow->addStretch(1); + gainCol->addLayout(gmRow); + } + gainCol->addWidget(gainMapVal_); + rightCol->addWidget(gainGroup); + arrGainDown_ = makeFlowArrow(QString::fromUtf8("\u2193"), central); + rightCol->addWidget(arrGainDown_, 0, Qt::AlignHCenter); + rightCol->addWidget(ctrlGroup); + + // ROI panel: selecting / loading / saving ROIs (the gate keeps its own + // "ROI only" capture and its ROI read-out next to the signal gate) + roiGroup_ = new QGroupBox("ROI", central); + { + auto *roiCol = new QVBoxLayout(roiGroup_); + btnSaveRoi = new QPushButton("Save ROI", roiGroup_); + btnLoadRoi = new QPushButton("Load ROI...", roiGroup_); + btnSaveRoi->setToolTip( + "Add the active gate ROI to the list kept in the program folder\n" + "(updates its timestamp if the same rectangle is already there)."); + btnLoadRoi->setToolTip( + "Pick a ROI from the list (most recently saved/loaded first) and\n" + "apply it to the gate. The list dialog can also delete entries."); + btnSelectRoi_ = new QPushButton("Select ROI", roiGroup_); + btnSelectRoi_->setCheckable(true); + btnSelectRoi_->setToolTip( + "Toggle the ROI editor: a yellow rectangle appears in the ADC\n" + "image. Drag inside it to move it, its edges/corners to resize it,\n" + "or drag on empty space to draw a new one. Selecting a ROI only\n" + "stores it: press \"ROI only\" next to the signal gate to restrict\n" + "the gate to it."); + roiCol->addWidget(btnSelectRoi_); + btnUnsetRoi_ = new QPushButton("Unset ROI", roiGroup_); + btnUnsetRoi_->setToolTip( + "Forget the current ROI: the gate and the saved data go back to the\n" + "full frame (the ROI list is not touched - use \"Load ROI...\" for\n" + "that)."); + roiCol->addWidget(btnUnsetRoi_); + auto *row = new QHBoxLayout(); + row->addWidget(btnSaveRoi); + row->addWidget(btnLoadRoi); + roiCol->addLayout(row); + roiListVal_ = makeValueLabel("no ROI in the list", roiGroup_); + roiCol->addWidget(roiListVal_); + } + rightCol->addWidget(roiGroup_); + // ROI -> Save: on the data path while "save frames" is selected (the + // colour follows the save mode, see updateFlow) + arrRoiDown_ = makeFlowArrow(QString::fromUtf8("\u2193"), central, FlowData); + rightCol->addWidget(arrRoiDown_, 0, Qt::AlignHCenter); + + // the save panel spans the whole window, below the flow but above the + // Status/Counters row + rootLayout->addWidget(saveGroup); + rootLayout->addLayout(bottomRow); + + btnQuit = new QPushButton("Quit (q)", central); + // first row of the right column, right aligned: out of the gate/arrow area + rightCol->insertWidget(0, btnQuit, 0, Qt::AlignRight); + // (Quit was added at the top left, above the gates) + rightCol->addStretch(1); + + // ── Signals: gate parameters ── + connect(gateChk_, &QCheckBox::toggled, this, [this](bool on) { + pipeline_.gate().setEnabled(on); + statusLabel->setText(on ? "Status: gate enabled" + : "Status: passthrough (gate off)"); + // the tracking works off the frames the gate drops, so switching the + // gate off turns it off too + if (!on && btnPedeTrack_ && btnPedeTrack_->isChecked()) + btnPedeTrack_->setChecked(false); + }); + connect(thrSpin_, QOverload::of(&QDoubleSpinBox::valueChanged), this, + [this](double v) { + if (!confirmGateChangeDuringRun( + QString("Signal-gate threshold -> %1 ADU").arg(v))) { + const QSignalBlocker b(thrSpin_); + thrSpin_->setValue( + static_cast(pipeline_.gate().threshold())); + return; + } + pipeline_.gate().setThreshold(static_cast(v)); + pipeline_.gate().resetCounters(); + }); + connect(minPixSpin_, QOverload::of(&QSpinBox::valueChanged), this, + [this](int v) { + if (!confirmGateChangeDuringRun( + QString("Min pixels above threshold -> %1").arg(v))) { + const QSignalBlocker b(minPixSpin_); + minPixSpin_->setValue( + static_cast(pipeline_.gate().minPixels())); + return; + } + pipeline_.gate().setMinPixels(static_cast(v)); + pipeline_.gate().resetCounters(); + }); + connect(contigChk_, &QCheckBox::toggled, this, [this](bool on) { + pipeline_.gate().setContiguous(on); + pipeline_.gate().resetCounters(); + }); + connect(hotChk_, &QCheckBox::toggled, this, [this](bool on) { + if (!confirmGateChangeDuringRun( + QString("Hot pixel suppression -> %1").arg(on ? "on" : "off"))) { + const QSignalBlocker b(hotChk_); + hotChk_->setChecked(pipeline_.gate().hotSuppress()); + return; + } + pipeline_.gate().setHotSuppress(on); + pipeline_.gate().resetCounters(); + }); + connect(btnGetHot_, &QPushButton::clicked, this, [this]() { + QDialog dlg(this); + dlg.setWindowTitle("Get hot pixels from the photon map"); + auto *form = new QFormLayout(&dlg); + form->addRow(new QLabel(QString("Photon map filled with %1 frames.") + .arg(static_cast( + pipeline_.pmapFrames())), + &dlg)); + auto *spin = new QDoubleSpinBox(&dlg); + spin->setRange(0.0, 1e9); + spin->setDecimals(1); + spin->setSingleStep(1.0); + // Default: a tenth of the frames the map was accumulated over, i.e. a + // pixel that fires in more than ~10 % of them. + const double def = + static_cast(pipeline_.pmapFrames()) / 10.0; + spin->setValue(def < 1.0 ? 1.0 : def); + form->addRow("Marking pixels above:", spin); + auto *bb = new QDialogButtonBox( + QDialogButtonBox::Ok | QDialogButtonBox::Cancel, &dlg); + form->addRow(bb); + connect(bb, &QDialogButtonBox::accepted, &dlg, &QDialog::accept); + connect(bb, &QDialogButtonBox::rejected, &dlg, &QDialog::reject); + if (dlg.exec() != QDialog::Accepted) + return; + pipeline_.setHotMaskFromPmap(spin->value()); + statusLabel->setText( + QString("Status: %1 hot pixels (photon map > %2)") + .arg(static_cast(pipeline_.hotPixels())) + .arg(spin->value(), 0, 'f', 1)); + }); + connect(btnResetHot_, &QPushButton::clicked, this, [this]() { + hotClearMask(); + pipeline_.gate().resetCounters(); + statusLabel->setText("Status: hot pixel mask cleared"); + }); + connect(btnResetCounters, &QPushButton::clicked, this, + [this]() { pipeline_.gate().resetCounters(); }); + connect(scCombo_, QOverload::of(&QComboBox::currentIndexChanged), + this, [this](int idx) { + // index 0 is "ALL" (no storage-cell gating), 1..16 are SC 0..15 + const int sc = (idx <= 0) ? -1 : idx - 1; + pipeline_.gate().setScFilter(sc); + statusLabel->setText( + sc < 0 ? "Status: all storage cells" + : QString("Status: only storage cell %1").arg(sc)); + }); + connect(btnGateRoi, &QPushButton::toggled, this, + [this](bool on) { toggleGateRoi(on); }); + connect(btnSaveStart, &QPushButton::toggled, this, + [this](bool on) { toggleRoiSave(on); }); + connect(saveModePhoton_, &QRadioButton::toggled, this, [this](bool on) { + gSaveMode = on ? 1 : 0; + pmapSaveSpin_->setEnabled(on); + // in photon mode the same spinbox budgets MAPS, so say so + if (saveBudgetLabel_) + saveBudgetLabel_->setText( + on ? "Number of photon maps to be saved:" + : "Number of frames to be saved:"); + // the correction only applies to the frames mode + if (saveCorrected_) + saveCorrected_->setEnabled(!on && + !pipeline_.saver().status().running); + updateFlow(); // the data-path arrows follow the mode + printf("[save] mode: %s\n", + on ? "virtual photon counting" : "frames"); + fflush(stdout); + statusLabel->setText(on + ? "Status: saving virtual photon counting maps" + : "Status: saving gate-passed frames"); + }); + connect(pmapSaveSpin_, QOverload::of(&QSpinBox::valueChanged), this, + [this](int v) { + if (v < 200) { + pmapSaveSpin_->setValue(200); + return; + } + gPmapSaveEvery = v; + }); + connect(dirBtn, &QPushButton::clicked, this, + [this]() { browseSaveDir(); }); + connect(btnSaveDest_, &QPushButton::clicked, this, + [this]() { saveDestDialog(); }); + connect(btnSelectRoi_, &QPushButton::toggled, this, + [this](bool on) { setRoiEditMode(on); }); + connect(btnUnsetRoi_, &QPushButton::clicked, this, + [this]() { unsetRoi(); }); + connect(btnSaveRoi, &QPushButton::clicked, this, [this]() { saveRoi(); }); + connect(btnLoadRoi, &QPushButton::clicked, this, + [this]() { loadRoiDialog(); }); + + // ── Signals: everything else ── + connect(btnStartPause, &QPushButton::clicked, this, + [this]() { toggleStartPause(); }); + connect(btnFaster, &QPushButton::clicked, this, [this]() { faster(); }); + connect(btnSlower, &QPushButton::clicked, this, [this]() { slower(); }); + connect(btnGainToggle, &QPushButton::toggled, this, + [this](bool on) { setApplyGain(on); }); + connect(btnBWPalette, &QPushButton::clicked, this, + [this]() { bwPalette1(); }); + connect(btnBWPalette2, &QPushButton::clicked, this, + [this]() { bwPalette2(); }); + connect(btnSetRanges, &QPushButton::clicked, this, + [this]() { showRangeDialog(); }); + connect(btnRates, &QPushButton::clicked, this, + [this]() { showRateDialog(); }); + connect(pmapCumulative_, &QCheckBox::toggled, this, [this](bool on) { + gPmapCumulative = on; + // "toggle to reset": either way the map starts from scratch, so the + // switch itself is the reset (no need to reach for Reset His) + resetHis(); + statusLabel->setText(on ? "Status: photon map cumulative (restarted)" + : "Status: photon map per image (restarted)"); + }); + connect(pmapEverySpin_, QOverload::of(&QSpinBox::valueChanged), this, + [this](int v) { + gPmapEvery = v > 0 ? v : 1; + statusLabel->setText( + QString("Status: one photon map every %1 analysed frames") + .arg(v)); + }); + connect(photonThrSpin_, QOverload::of(&QDoubleSpinBox::valueChanged), + this, [this](double v) { + // the photon map is filled by the analysis thread, which reads + // the atomic every frame; the multiplicity follows as 2 x v. + // Which one is being edited depends on the gain stage. + const bool kev = gain_flag.load(); + if (kev) + g_pheneThresholdKev = static_cast(v); + else + g_pheneThreshold = static_cast(v); + statusLabel->setText( + QString("Status: photon-map threshold %1 %2") + .arg(v, 0, 'f', kev ? 1 : 0) + .arg(kev ? "keV" : "ADU")); + }); + // "Pedestal corrected" decides whether the *saved* frames use the pedestal, + // which is what the orange route in the flow diagram shows + connect(saveCorrected_, &QCheckBox::toggled, this, [this](bool on) { + updateFlow(); + statusLabel->setText( + on ? "Status: saved frames pedestal corrected" + : "Status: saved frames raw (pedestal not subtracted)"); + }); + connect(btnResetHis, &QPushButton::clicked, this, + [this]() { resetHis(); }); + connect(btnResetAxis, &QPushButton::clicked, this, + [this]() { resetAxis(); }); + connect(btnColPal, &QPushButton::clicked, this, + [this]() { colPal(); }); + connect(btnLoadPede, &QPushButton::clicked, this, + [this]() { acquirePede(); }); + connect(btnSavePede, &QPushButton::clicked, this, + [this]() { savePede(); }); + connect(btnReadPede, &QPushButton::clicked, this, + [this]() { readPede(); }); + connect(btnLoadAllPede, &QPushButton::clicked, this, + [this]() { loadAllPede(); }); + connect(btnPedeTrack_, &QPushButton::toggled, this, [this](bool on) { + // needs the signal gate: without it "dropped" has no meaning + if (on && gateChk_ && !gateChk_->isChecked()) { + QMessageBox::information( + this, "Pedestal tracking", + "Pedestal tracking follows the frames the signal gate drops, " + "so it needs \"Gate enabled\" on."); + btnPedeTrack_->setChecked(false); + return; + } + gPedeTracking = on; + printf("[pedetrack] %s\n", on ? "on" : "off"); + fflush(stdout); + statusLabel->setText(on ? "Status: pedestal tracking on" + : "Status: pedestal tracking off"); + updateFlow(); + }); + connect(btnNoPede_, &QPushButton::toggled, this, [this](bool on) { + gNoPede = on; + updateFlow(); + statusLabel->setText(on ? "Status: pedestal NOT subtracted (raw ADC)" + : "Status: pedestal subtraction on"); + }); + connect(btnGainMap, &QPushButton::clicked, this, + [this]() { loadGainMap(); }); + connect(kevChk_, &QCheckBox::toggled, this, [this](bool on) { + kevSpectra = on; + forceRootRedraw(); + updateFlow(); // the Gain panel is in use when keV is shown + if (on && !gainMapLoaded()) { + if (gainMapVal_) + gainMapVal_->setText( + "no gain map selected - using nominal values " + "(40 ADU/keV)"); + statusLabel->setText( + "Status: PH spectra in keV (nominal 40 ADU/keV, no gain map)"); + } else { + updateGainMapLabel(); + statusLabel->setText(on ? "Status: PH spectra in keV" + : "Status: PH spectra in ADU"); + } + }); + connect(btnQuit, &QPushButton::clicked, this, [this]() { quitApp(); }); + + // ── Fast image views (separate top-level windows, as in the original) ── + m_adcView = new FastImageView(); + m_adcView->setPaletteLut(paletteLut(Palette::Color)); + if (m_adcScale_) + m_adcScale_->setPaletteChoice(0); // match the ROOT plots + // the ADC (main) image opens on the ADC range of the Set Ranges dialog + m_adcView->setColorRange(adcmin.load(), adcmax.load()); + m_adcWin = new QWidget(nullptr, Qt::Window); + m_adcWin->setWindowTitle("ADC Image"); + m_adcWin->resize(1024 + 80, 512 + 40 + 90); // + the scale panel + auto *adcLay = new QVBoxLayout(m_adcWin); + adcLay->setContentsMargins(0, 0, 0, 0); + adcLay->addWidget(m_adcView, 1); + m_adcScale_ = new ScalePanel(m_adcView, m_adcWin); + m_adcView->onScaleReleased = [this]() { m_adcScale_->refresh(); }; + m_adcView->onRoiEdited = [this](int x0, int y0, int x1, int y1) { + applyRoi(x0, y0, x1 - x0, y1 - y0, "ADC image", false); + }; + adcLay->addWidget(m_adcScale_, 0); + m_adcWin->show(); + + m_gainView = new FastImageView(); + // The gain image has four valid values, so it gets a fixed four-colour code + // (0 blue, 1 green, 2 yellow, 3 red, all desaturated) and no scale panel: + // there is no colour scale to choose and no distribution worth showing. + m_gainView->setPaletteLut(paletteLut(Palette::Gain4)); + m_gainView->setIntegerValues(true); + m_gainView->setColorRange(0, 3); + m_gainWin = new QWidget(nullptr, Qt::Window); + m_gainWin->setWindowTitle("Gain Image"); + m_gainWin->resize(1024 + 80, 512 + 40); // no scale panel here + auto *gainLay = new QVBoxLayout(m_gainWin); + gainLay->setContentsMargins(0, 0, 0, 0); + gainLay->addWidget(m_gainView, 1); + m_gainWin->hide(); // hidden by default: "show gain image" in Display + + m_photonView = new FastImageView(); + m_photonView->setPaletteLut(paletteLut(Palette::Color)); + m_photonView->setZeroWhite(true); // 0 photons = white, like the ROOT plot + m_photonView->setColorRange(0, 8); // photons per pixel over one image + m_photonWin = new QWidget(nullptr, Qt::Window); + m_photonWin->setWindowTitle("Photon Map (virtual photon counting)"); + m_photonWin->resize(1024 + 80, 512 + 40 + 90); + auto *photonLay = new QVBoxLayout(m_photonWin); + photonLay->setContentsMargins(0, 0, 0, 0); + m_photonView->setIntegerValues(true); // photon counts: whole numbers + photonLay->addWidget(m_photonView, 1); + m_photonScale_ = new ScalePanel(m_photonView, m_photonWin); + m_photonView->onScaleReleased = [this]() { m_photonScale_->refresh(); }; + photonLay->addWidget(m_photonScale_, 0); + m_photonWin->show(); + +#ifdef JFSTRX + // ── Separate strixel window: the six ADC groups, arranged like the + // original ROOT ADC canvas (left column chip1 g3/g2/g1, right column + // chip6 g1/g2/g3). Display only: the gate ROI is selected on the raw + // ADC image, which stays unmapped so the coordinates are raw pixels. + m_adcPanelWin = new QWidget(nullptr, Qt::Window); + m_adcPanelWin->setWindowTitle("ADC Strixel Panels (JFSTRX)"); + m_adcPanelWin->resize(900, 900); + auto *panelOuter = new QVBoxLayout(m_adcPanelWin); + panelOuter->setContentsMargins(4, 2, 4, 2); + panelOuter->setSpacing(2); + m_adcPanelZ = new QLabel(m_adcPanelWin); + m_adcPanelZ->setAlignment(Qt::AlignCenter); + m_adcPanelZ->setToolTip( + "The six strixel panels use the ADC image's Z scale (colour range and\n" + "palette): change it in the ADC window's scale panel and they follow."); + panelOuter->addWidget(m_adcPanelZ); + auto *panelRow = new QHBoxLayout(); + panelOuter->addLayout(panelRow, 1); + panelRow->setContentsMargins(2, 2, 2, 2); + auto *panelCol0 = new QVBoxLayout(); + auto *panelCol1 = new QVBoxLayout(); + panelRow->addLayout(panelCol0); + panelRow->addLayout(panelCol1); + QVBoxLayout *panelCol[2] = {panelCol0, panelCol1}; + // panel index order: 0..2 = chip1 g1/g2/g3, 3..5 = chip6 g1/g2/g3 + static const int panelOrder[2][3] = {{2, 1, 0}, {3, 4, 5}}; // top -> bottom + static const int panelStretch[2][3] = {{5, 2, 2}, {2, 2, 5}}; + // mapped-pixel aspect X/Y: X = 75*(75/Y), Y = 25/15/18.75 um + // -> 225/25 = 9, 375/15 = 25, 300/18.75 = 16 + static const double panelAspect[kNumAdcPanels] = {9.0, 25.0, 16.0, + 9.0, 25.0, 16.0}; + static const char *panelTitle[kNumAdcPanels] = { + "chip 1 group 1 (25um)", "chip 1 group 2 (15um)", + "chip 1 group 3 (18.75um)", "chip 6 group 1 (25um)", + "chip 6 group 2 (15um)", "chip 6 group 3 (18.75um)"}; + for (int col = 0; col < 2; col++) { + for (int k = 0; k < 3; k++) { + const int p = panelOrder[col][k]; + auto *cell = new QWidget(); + auto *cv = new QVBoxLayout(cell); + cv->setContentsMargins(0, 0, 0, 0); + cv->setSpacing(0); + auto *lab = new QLabel(panelTitle[p], cell); + lab->setAlignment(Qt::AlignCenter); + cv->addWidget(lab); + auto *v = new FastImageView(); + v->setPaletteLut(paletteLut(Palette::Color)); + v->setColorRange(adcmin.load(), adcmax.load()); + v->setPixelAspectX(panelAspect[p]); + cv->addWidget(v, 1); + panelCol[col]->addWidget(cell, panelStretch[col][k]); + m_adcPanelView[p] = v; + } + } + // The strixel panels have no scale of their own: they follow the ADC + // image's colour range and palette, which is where the Z scale lives. + auto syncPanels = [this]() { + double lo = 0.0, hi = 1.0; + m_adcView->colorRange(lo, hi); + for (auto *v : m_adcPanelView) + if (v) + v->setColorRange(lo, hi); + if (m_adcPanelZ) + m_adcPanelZ->setText( + QString("Z scale: follows the ADC image (Z: %1 .. %2)") + .arg(lo, 0, 'g', 5) + .arg(hi, 0, 'g', 5)); + }; + m_adcView->onColorRangeChanged = [syncPanels](double, double) { + syncPanels(); + }; + // only the ADC view propagates: the panels must not re-emit (that would + // bounce the palette back and forth for ever) + m_adcView->onPaletteChanged = [this](const QRgb *lut) { + for (auto *w : m_adcPanelView) + if (w) + w->setPaletteLut(lut); + }; + syncPanels(); + m_adcPanelWin->show(); +#endif + + // Master-slave zoom: the ADC view is the master; the gain view follows + // immediately (same thread) and the ROOT photon map follows through a + // coalesced command, so only the newest viewport is ever redrawn. + // all three image windows report their zoom; zoomTo() decides what follows + auto wireZoom = [this](FastImageView *v) { + if (!v) + return; + v->onZoomChanged = [this, v](double x1, double y1, double x2, + double y2) { zoomTo(v, x1, y1, x2, y2); }; + }; + wireZoom(m_adcView); + wireZoom(m_gainView); + wireZoom(m_photonView); + + // ── Timers (started by start()) ── + processTimer = new QTimer(this); + connect(processTimer, &QTimer::timeout, this, + [this]() { processImages(); }); + statusTimer = new QTimer(this); + connect(statusTimer, &QTimer::timeout, this, [this]() { updateStatus(); }); + sigTimer = new QTimer(this); + connect(sigTimer, &QTimer::timeout, this, [this]() { checkSignals(); }); + + updateFlow(); + + updateDrawLabel(); +} + +void MainWindow::connectShortcuts() { + auto sc = [this](const char *key, const std::function &fn) { + QShortcut *s = new QShortcut(QKeySequence(QString::fromLatin1(key)), + this); + connect(s, &QShortcut::activated, this, fn); + }; + sc("s", [this]() { toggleStartPause(); }); + sc("+", [this]() { faster(); }); + sc("=", [this]() { faster(); }); + sc("-", [this]() { slower(); }); + sc("g", [this]() { toggleGain(); }); + sc("b", [this]() { bwPalette1(); }); + sc("Shift+B", [this]() { bwPalette2(); }); + sc("c", [this]() { colPal(); }); + sc("i", [this]() { btnGateRoi->setChecked(!btnGateRoi->isChecked()); }); + sc("e", [this]() { + // keV PH (e for energy): keeps its tick while the gain is off, see + // updateFlow. Not "k": that is already Load ROI. + if (kevChk_) + kevChk_->setChecked(!kevChk_->isChecked()); + }); + sc("n", [this]() { btnSaveStart->setChecked(!btnSaveStart->isChecked()); }); + sc("j", [this]() { saveRoi(); }); + sc("k", [this]() { loadRoiDialog(); }); + sc("r", [this]() { resetHis(); }); + sc("Shift+R", [this]() { resetAxis(); }); + sc("p", [this]() { acquirePede(); }); + sc("Shift+O", [this]() { savePede(); }); + sc("o", [this]() { readPede(); }); + sc("Shift+P", [this]() { loadAllPede(); }); + sc("q", [this]() { quitApp(); }); + sc("Shift+S", [this]() { showRangeDialog(); }); +} + +// --------------------------------------------------------------------------- +// lifecycle +// --------------------------------------------------------------------------- +void MainWindow::start() { + // The ROOT canvases are hidden by default ("show ROOT plots" in Display); + // the command is queued here because the ROOT thread runs by now. + { + RootCmd c; + c.type = RootCmdType::ShowPlots; + c.a = 0.0; + pushRootCmd(c); + } + // Pedestals must be installed before the threads start reading frames. + std::string perr; + if (pathExists(g_cfg.pedeFile)) { + if (pedeLoadFile(g_cfg.pedeFile, perr)) { + printf("[pede] loaded %s\n", g_cfg.pedeFile.c_str()); + pedeVal_->setText(QString("loaded (%1)").arg( + QString::fromStdString(g_cfg.pedeFile))); + pipeline_.gate().setLastError(""); + } else { + fprintf(stderr, "[pede] %s\n", perr.c_str()); + pipeline_.gate().setLastError("loadPedestal: " + perr); + } + } else if (g_cfg.pedeExplicit) { + fprintf(stderr, "[pede] file not found: %s\n", g_cfg.pedeFile.c_str()); + pipeline_.gate().setLastError("loadPedestal: file not found: " + + g_cfg.pedeFile); + } else { + printf("[pede] %s not found, running on raw values\n", + g_cfg.pedeFile.c_str()); + } + + if (!g_cfg.gainMapFile.empty()) { + std::string gerr; + if (gainMapLoadFile(g_cfg.gainMapFile, gerr)) { + if (gainMapVal_) + gainMapVal_->setText(QFileInfo(QString::fromStdString( + g_cfg.gainMapFile)) + .fileName()); + if (kevChk_) + kevChk_->setChecked(true); // show what was just calibrated + updateFlow(); + } else { + fprintf(stderr, "[gain] %s\n", gerr.c_str()); + pipeline_.gate().setLastError("gainMap: " + gerr); + } + } + + std::string err; + if (!pipeline_.init(err)) { + fprintf(stderr, "FATAL: %s\n", err.c_str()); + pipeline_.gate().setLastError(err); + statusLabel->setText("Status: socket error"); + QMessageBox::critical(this, "ZMQ", QString::fromStdString(err)); + } else { + pipeline_.start(); + pipeline_.gate().setScFilter(g_cfg.scFilter); + if (scCombo_) + scCombo_->setCurrentIndex(g_cfg.scFilter < 0 ? 0 + : g_cfg.scFilter + 1); + statusLabel->setText("Status: running"); + if (g_cfg.acquirePede) + pipeline_.requestPedeAcquire(g_cfg.pedeFrames); + if (g_cfg.gateRoiX >= 0) { // --gate-roi: same path as the "ROI only" + // button, so the box and the gate agree + applyRoi(g_cfg.gateRoiX, g_cfg.gateRoiY, g_cfg.gateRoiW, + g_cfg.gateRoiH, "command line", /*restrict=*/true); + // reflect the restriction in the button, so the first press turns + // it off instead of toggling the wrong way (m_applyingRoi keeps the + // toggle handler from re-capturing or warning) + if (btnGateRoi && pipeline_.gate().roiActive() && + !btnGateRoi->isChecked()) { + m_applyingRoi = true; + btnGateRoi->setChecked(true); + m_applyingRoi = false; + } + } + } + + startRootThread(); + processTimer->start(30); + statusTimer->start(500); + sigTimer->start(200); + + // --apply-gain: same as pressing the Gain button (it also swaps the photon + // threshold to keV and relabels its row) + if (g_cfg.applyGain) + btnGainToggle->setChecked(true); + + // --start-save: press the Save button for scripted/headless runs. The + // check triggers toggleRoiSave() exactly like the GUI click. + if (g_cfg.startSave) { + printf("[save] --start-save: starting the %s writer\n", + gSaveMode.load() == 1 ? "virtual photon counting" + : "frame"); + fflush(stdout); + btnSaveStart->setChecked(true); + } + + signal(SIGINT, handleSigint); + signal(SIGTERM, handleSigint); +} + +void MainWindow::stop() { + if (processTimer) + processTimer->stop(); + if (statusTimer) + statusTimer->stop(); + if (sigTimer) + sigTimer->stop(); + { + const RoiSaver::Status st = pipeline_.saver().status(); + if (st.running) { + printf("[shutdown] flushing the ROI save (%llu frames, %s)...\n", + (unsigned long long)st.saved, st.h5Path.c_str()); + fflush(stdout); + if (statusLabel) + statusLabel->setText( + "Status: flushing the ROI save before exit..."); + } + } + pipeline_.saver().requestStop("program exit"); + pipeline_.saver().finish(); // drain the queue, close the file, write JSON + pipeline_.stop(); + stopRootThread(); +} + +// Question asked before quitting (both from the Quit button/shortcut and from +// closing the window). A running ROI save is called out explicitly, because +// quitting flushes it: the writer drains its queue, closes the HDF5 file and +// writes the JSON sidecar before the program exits. +bool MainWindow::confirmQuit() { + const RoiSaver::Status st = pipeline_.saver().status(); + QString text = "Quit the online display?"; + if (st.running) { + text += QString("\n\nA ROI save is still running: %1 frames written " + "to\n%2\n\nIt will be stopped and flushed (queued " + "frames written, file closed, JSON sidecar written) " + "before the program exits.") + .arg(static_cast(st.saved)) + .arg(QString::fromStdString(st.h5Path)); + } else if (!st.h5Path.empty()) { + text += QString("\n\nThe last ROI save is closed:\n%1\n(%2 frames)") + .arg(QString::fromStdString(st.h5Path)) + .arg(static_cast(st.saved)); + } + const QMessageBox::StandardButton answer = QMessageBox::question( + this, "Quit", text, QMessageBox::Yes | QMessageBox::No, + QMessageBox::No); + printf("[quit] %s\n", answer == QMessageBox::Yes ? "confirmed" + : "cancelled"); + fflush(stdout); + return answer == QMessageBox::Yes; +} + +// Sizes the two empty pads that turn the panels into a flow chart: +// * the gates start low enough that the middle of "1. Storage cell" sits on +// the top edge of the Pedestal box, and +// * the Gain box starts at the middle of "2. Signal gate". +// The only thing that matters is that the two columns stay top-aligned, which +// they do, so this runs once at start-up and again if the window is resized +// wider/narrower (text wrapping can change the heights). +void MainWindow::layoutFlow() { + if (!centralWidget() || !leftPad_ || !gainPad_ || !scGroup_ || + !sigGroup_ || !pedeGroup_ || !gainGroup_) + return; + static bool inLayout = false; + if (inLayout) + return; // setFixedHeight() re-enters through resizeEvent() + inLayout = true; + flowQueued_ = false; // this call is the queued one, if it was + + // The first call comes before Qt has computed the layout, when every box + // still has a token size; solving from that produced a huge pad and, with + // it, a window minimum that stayed large for the rest of the session. + if (scGroup_->height() < 40 || sigGroup_->height() < 40 || + pedeGroup_->height() < 40 || gainGroup_->height() < 40) { + inLayout = false; + return; + } + + // Iterative, because every change alters what is being measured (boxes + // grow when their labels wrap, and the pads move the boxes). Three knobs: + // leftPad - pushes the gates down until the storage-cell middle is on + // the top edge of the Pedestal + // gatePad - the gap *between* the two gates: stretching it moves the + // signal gate down without touching the storage cell + // gainPad - fine adjustment so the Gain starts at the signal-gate middle + const int arrowMin = 10; // keep the arrows visible + leftPad_->setFixedHeight(flowPads_[0]); + pedePad_->setFixedHeight(flowPads_[1]); + gainPad_->setFixedHeight(flowPads_[2]); + if (gatePad_) + gatePad_->setFixedHeight(flowPads_[3]); + if (QLayout *l = centralWidget()->layout()) + l->activate(); + + { + const int scMid = scGroup_->mapTo(centralWidget(), + QPoint(0, scGroup_->height() / 2)) + .y(); + const int sigMid = sigGroup_->mapTo(centralWidget(), + QPoint(0, sigGroup_->height() / 2)) + .y(); + const int pedeTop = + pedeGroup_->mapTo(centralWidget(), QPoint(0, 0)).y(); + const int gainTop = + gainGroup_->mapTo(centralWidget(), QPoint(0, 0)).y(); + + // storage-cell middle must sit on the Pedestal's top edge: move + // whichever of the two has room (the Pedestal down, or the gates down) + int wantLeft = flowPads_[0], wantPede = flowPads_[1]; + const int errPede = scMid - pedeTop; // >0: the Pedestal is too high + if (errPede > 0) + wantPede += errPede; + else + wantLeft += -errPede; + if (wantLeft < 0) + wantLeft = 0; + if (wantPede < 0) + wantPede = 0; + // The Gain must start at the signal gate's middle. If it sits too + // high, push it down with gainPad; if it sits too low, push the signal + // gate down instead by stretching the arrow between the gates (the + // storage cell above is not affected by that arrow). + const int err = sigMid - gainTop; // >0: the gain is too high + int wantArrow = flowPads_[3]; + int wantGain = flowPads_[2]; + if (err > 0) { + wantGain += err; // the Gain sits above the signal middle + } else if (err < 0) { + wantArrow += -err; // below it: push the signal gate down instead + wantGain = 0; + } + // err == 0: aligned, leave both pads alone (resetting gainPad here was + // what made the solver oscillate between aligned and 50 px off) + if (wantArrow < arrowMin) + wantArrow = arrowMin; + if (wantGain < 0) + wantGain = 0; + + const bool converged = wantLeft == flowPads_[0] && + wantPede == flowPads_[1] && + wantArrow == flowPads_[3] && + wantGain == flowPads_[2]; + flowPads_[0] = wantLeft; + flowPads_[1] = wantPede; + flowPads_[2] = wantGain; + flowPads_[3] = wantArrow; + if (!converged && getenv("JF_TIMING")) + printf("[flow] pass %d: left %d pede %d gain %d gateArrow %d | " + "scMid %d sigMid %d pedeTop %d gainTop %d\n", + flowPass_, wantLeft, wantPede, wantGain, wantArrow, scMid, + sigMid, pedeTop, gainTop); + if (!converged) { + // re-measure on the next event-loop turn: within one call the + // widget positions are not guaranteed to have settled yet, and + // solving from stale numbers compounds the corrections + flowPass_++; + if (flowPass_ < 12 && !flowQueued_) { + flowQueued_ = true; + QTimer::singleShot(0, this, &MainWindow::layoutFlow); + } + } else { + flowPass_ = 0; + } + } + leftPad_->setFixedHeight(flowPads_[0]); + pedePad_->setFixedHeight(flowPads_[1]); + gainPad_->setFixedHeight(flowPads_[2]); + if (gatePad_) + gatePad_->setFixedHeight(flowPads_[3]); + if (QLayout *l = centralWidget()->layout()) + l->activate(); + + // place the strip over the gap between the two columns, spanning from the + // top of the first box to the bottom of the last one + if (strip_ && scGroup_ && sigGroup_ && pedeGroup_ && gainGroup_) { + const int x0 = scGroup_->mapTo(centralWidget(), QPoint(0, 0)).x() + + scGroup_->width() + 1; + const int x1 = + pedeGroup_->mapTo(centralWidget(), QPoint(0, 0)).x() - 1; + int top = scGroup_->mapTo(centralWidget(), QPoint(0, 0)).y(); + int bot = pedeGroup_->mapTo(centralWidget(), QPoint(0, 0)).y() + + pedeGroup_->height(); + const int gainBot = gainGroup_->mapTo(centralWidget(), QPoint(0, 0)).y() + + gainGroup_->height(); + if (gainBot > bot) + bot = gainBot; + if (roiGroup_) { + const int roiBot = + roiGroup_->mapTo(centralWidget(), QPoint(0, 0)).y() + + roiGroup_->height(); + if (roiBot > bot) + bot = roiBot; + } + if (x1 > x0 && bot > top) + strip_->setGeometry(x0, top - 6, x1 - x0, bot - top + 12); + strip_->raise(); + strip_->show(); + } + + // hand the strip its connectors, in its own coordinates + if (strip_ && scGroup_ && sigGroup_ && pedeGroup_ && gainGroup_ && + pmapGroup_ && displayGroup_) { + auto yIn = [&](QWidget *w, int y) { + return w->mapTo(centralWidget(), QPoint(0, 0)).y() + y; + }; + const int stripTop = + strip_->mapTo(centralWidget(), QPoint(0, 0)).y(); + // The signal gate does not change the data, so nothing enters or + // leaves its box: the flow runs from the previous stage to the Gain and + // simply passes the gate, which is drawn as a funnel on that line (the + // gate panel only points at the funnel - see FlowStrip::drawFunnel). + const int funnelY = + yIn(sigGroup_, sigGroup_->height() / 2) - stripTop; + FlowStrip::Path a, b, c; + // 1. storage cell (middle) -> Pedestal (middle): enter from the left + a.yFrom = yIn(scGroup_, scGroup_->height() / 2) - stripTop; + a.yTo = yIn(pedeGroup_, pedeGroup_->height() / 2) - stripTop; + a.dir = +1; + a.cls = FlowPedestal; // into the Pedestal + // Pedestal (bottom) -> the funnel, travelling leftwards (no head: it + // merges into the funnel) + b.yFrom = yIn(pedeGroup_, pedeGroup_->height()) - stripTop; + b.yTo = funnelY; + b.dir = -1; + b.x = FlowStrip::kFunnelX; + b.head = false; + // the funnel -> Gain (top): the flow continues after the gate + c.yFrom = funnelY; + c.yTo = yIn(gainGroup_, 0) - stripTop; + c.dir = +1; + c.x = FlowStrip::kFunnelX; + c.startAtJog = true; + // Gain -> ROI: a rail just left of the right column, so it does not + // have to cross the Display panel. Frames are the ROI-cropped + // product, so this is the frames-mode input of the ROI. + FlowStrip::Path d; + d.yFrom = yIn(gainGroup_, gainGroup_->height() / 2) - stripTop; + d.yTo = roiGroup_ ? (yIn(roiGroup_, roiGroup_->height() / 2) - stripTop) + : 0; + d.dir = 2; + d.on = roiGroup_ != nullptr; + d.cls = FlowData; // corrected when setSaveMode() knows the mode + // the gate block -> Pedestal tracking: the tracker lives off the frames + // the gate *drops*, so it leaves the gate block's top-right corner + FlowStrip::Path e; + e.yFrom = yIn(sigGroup_, 6) - stripTop; + e.yTo = pedeTrackGroup_ + ? (yIn(pedeTrackGroup_, pedeTrackGroup_->height() / 2) - + stripTop) + : 0; + e.dir = +1; + e.on = pedeTrackGroup_ != nullptr; + e.cls = FlowPedestal; // the tracker is the pedestal's own feedback + // Gain -> Virtual photon counting: the calibration reaches the counting + // (its threshold is keV while the gain correction is on). The map is + // built in the left column, so the connector travels leftwards. + FlowStrip::Path f; + f.yFrom = yIn(gainGroup_, gainGroup_->height() - 8) - stripTop; + f.yTo = pmapGroup_ ? (yIn(pmapGroup_, 24) - stripTop) : 0; + f.dir = -1; + f.on = pmapGroup_ != nullptr; + f.cls = FlowNormal; // flipped by setSaveMode() + // Virtual photon counting -> Display: the map is shown (in its own + // window), so this one travels rightwards into the Display. + FlowStrip::Path g; + g.yFrom = pmapGroup_ + ? (yIn(pmapGroup_, pmapGroup_->height() - 8) - stripTop) + : 0; + g.yTo = displayGroup_ + ? (yIn(displayGroup_, displayGroup_->height() / 2) - stripTop) + : 0; + g.dir = +1; + g.on = pmapGroup_ != nullptr && displayGroup_ != nullptr; + // counting -> ROI: with the maps as the saved product this is the + // input of the ROI (they are cropped to it on the way out) + FlowStrip::Path i; + i.yFrom = yIn(pmapGroup_, pmapGroup_->height() - 8) - stripTop; + i.yTo = roiGroup_ ? (yIn(roiGroup_, roiGroup_->height() / 2) - stripTop) + : 0; + i.dir = +1; + i.cls = FlowData; + i.on = roiGroup_ != nullptr; + // raw mode: the storage cell feeds the funnel directly, so the flow + // does not have to pass through the (greyed) Pedestal box. Both + // feeders are always drawn; setStages() decides which one is live. + FlowStrip::Path h; + h.yFrom = yIn(scGroup_, scGroup_->height()) - stripTop; + h.yTo = funnelY; + h.dir = +1; + h.x = FlowStrip::kFunnelX; + h.head = false; // merges into the funnel + strip_->setPaths(a, b, c, d, e, f, g, h, i, funnelY); + bool dp, sp, go, pm; + flowStageStates(dp, sp, go, pm); + strip_->setStages(dp, sp, go, pm); + } + inLayout = false; + + if (getenv("JF_TIMING")) { + printf("[flow] pads: gates %d pede %d gain %d gateArrow %d (passes " + "%d)\n", + flowPads_[0], flowPads_[1], flowPads_[2], flowPads_[3], + flowPass_); + auto rect = [&](QWidget *w) { + return w ? QString("%1,%2 %3x%4") + .arg(w->mapTo(centralWidget(), QPoint(0, 0)).x()) + .arg(w->mapTo(centralWidget(), QPoint(0, 0)).y()) + .arg(w->width()) + .arg(w->height()) + .toStdString() + : std::string("-"); + }; + printf("[rect] sc %s | signal %s | pede %s | track %s | gain %s | " + "roi %s\n", + rect(scGroup_).c_str(), rect(sigGroup_).c_str(), + rect(pedeGroup_).c_str(), rect(pedeTrackGroup_).c_str(), + rect(gainGroup_).c_str(), rect(roiGroup_).c_str()); + printf("[rect] gainToggle %s | keVchk %s | noPede %s | saveStart %s | " + "selectRoi %s | saveRoi %s | quit %s | track %s | pmap %s\n", + rect(btnGainToggle).c_str(), rect(kevChk_).c_str(), + rect(btnNoPede_).c_str(), rect(btnSaveStart).c_str(), + rect(btnSelectRoi_).c_str(), rect(btnSaveRoi).c_str(), + rect(btnQuit).c_str(), rect(btnPedeTrack_).c_str(), + rect(pmapGroup_).c_str()); + printf("[rect] unsetRoi %s | selectRoi %s | thr %s | minPix %s | " + "zoomCoord %s\n", + rect(btnUnsetRoi_).c_str(), rect(btnSelectRoi_).c_str(), + rect(thrSpin_).c_str(), rect(minPixSpin_).c_str(), + rect(zoomCoordChk_).c_str()); + printf("[rect] saveFramesRadio %s | savePhotonRadio %s | " + "saveCorrected %s\n", + rect(saveModeFrames_).c_str(), rect(saveModePhoton_).c_str(), + rect(saveCorrected_).c_str()); + } + // The pads and the alignment moves push the panels around *after* the first + // paint; repaint the column area so the space they leave behind does not + // keep the old pixels (that is what left a piece of the "Virtual photon + // counting" title floating next to the Save box). + if (centralWidget()) + centralWidget()->update(); +} + +// Tells the overlay which boxes are in the chain right now: a stage that is +// switched off is skipped, so the arrow steps over it. +// What the ROI panel shows: the ROI the gate is using and how many are saved. +void MainWindow::updateRoiLabel() { + if (!roiListVal_) + return; + QString act = "no ROI selected"; + if (pipeline_.gate().roiSet()) { + int x0 = 0, y0 = 0, x1 = 0, y1 = 0; + pipeline_.gate().roiSnapshot(x0, y0, x1, y1); + act = QString("active %1x%2 at %3,%4") + .arg(x1 - x0) + .arg(y1 - y0) + .arg(x0) + .arg(y0); + } + roiListVal_->setText(QString("%1 | gate: %2 | %3 saved") + .arg(act) + .arg(pipeline_.gate().roiActive() ? "ROI only" + : "full frame") + .arg(roiListLoad().size())); +} + +// One place that says what the keV conversion is using. +void MainWindow::updateGainMapLabel() { + if (!gainMapVal_) + return; + if (!gain_flag.load()) + gainMapVal_->setText("gain off: PH spectra in ADU"); + else if (gainMapLoaded()) + gainMapVal_->setText(QFileInfo(QString::fromStdString(g_cfg.gainMapFile)) + .fileName()); + else if (kevChk_ && kevChk_->isChecked()) + gainMapVal_->setText( + "no gain map selected - using nominal values (40 ADU/keV)"); + else + gainMapVal_->setText("no gain map loaded : using defaults"); +} + +void MainWindow::updateFlow() { + const bool pede = PedestalStore::instance().loaded() && !gNoPede.load(); + const bool gain = gain_flag.load(); + const bool scAll = !scCombo_ || scCombo_->currentIndex() <= 0; + const bool gateOn = !gateChk_ || gateChk_->isChecked(); + // The arrows are static: the chain is always drawn the same way, and a + // stage that is not in use is greyed out instead, so the bypass is obvious + // without the arrows moving. + // the stage's own switch stays black: Pede/Raw, Gate enabled and the gain + // button are how a bypassed stage is switched back on + greyStage(pedeGroup_, !pede, {btnNoPede_}); + // the Gain panel follows the gain toggle alone; the keV checkbox keeps its + // tick for next time but is greyed while the gain is off, and the plots + // fall back to ADU + greyStage(gainGroup_, !gain, {btnGainToggle}); + if (kevChk_) + kevChk_->setEnabled(gain); + if (gainStateChk_) + gainStateChk_->setChecked(gain); // read-only indicator, no signals + // a gate that is switched off greys out exactly like a bypassed stage + // Greyed when it cannot be *selected* (the tracker needs the signal gate), + // NOT when it is merely inactive: the label under the button says whether + // tracking is on, so the box must not go grey just because it is off. + greyStage(pedeTrackGroup_, !gateOn); + greyStage(scGroup_, scAll, {scCombo_}); // storage-cell filter == ALL + greyStage(sigGroup_, !gateOn, {gateChk_}); // signal gate off == passthrough + // photon counting needs a pedestal (it thresholds the pede-subtracted + // ADC), so the whole virtual-photon-counting box is a bypassed stage when + // the pedestal is out of the chain - the display map goes empty with it + greyStage(pmapGroup_, !pede); + // pedestal tracking only makes sense with the signal gate on: enable the + // button here, but do not flip it (the gate's own handler does that when it + // is switched off, so --pede-tracking survives start-up) + if (btnPedeTrack_) + btnPedeTrack_->setEnabled(gateOn); + if (pedeTrackVal_) { + const PedeTrackStats ts = pedeTrackerStats(); + if (!ts.on) + pedeTrackVal_->setText("off"); + else + pedeTrackVal_->setText( + QString("on: %1 samples, delta %2 ADU, %3 updates") + .arg(static_cast(ts.samples)) + .arg(ts.maxDiff, 0, 'f', 1) + .arg(static_cast(ts.updates))); + } + // the gate threshold is applied to the raw 14-bit value when no pedestal + // is in play, so say so instead of claiming "pede-subtracted" + if (thrLabel_) { + const bool raw = gNoPede.load() || !PedestalStore::instance().loaded(); + thrLabel_->setText(raw ? "Threshold (raw ADC - no pede):" + : "Threshold (ADC, pede-subtracted):"); + } + // The data path (orange) follows the save mode: frames are written from the + // ROI, photon maps from the virtual photon counter. Only the colours + // change - the connectors themselves never move. + { + // only the branch that actually feeds the file is drawn, and it is + // orange - the frames come from the ROI, the maps from the counting + bool pmap = false, savePede = false; + bool dPede, gOn; + flowStageStates(dPede, savePede, gOn, pmap); + // the file is always entered through the ROI: the maps are cropped to + // it on the way out, so this arrow never moves and is always orange + if (arrRoiDown_) { + setFlowArrowClass(arrRoiDown_, FlowData); + arrRoiDown_->setVisible(true); + } + if (strip_) + strip_->setStages(dPede, savePede, gOn, pmap); + } + updateGainMapLabel(); + updateRoiLabel(); + if (noPedeVal_) { + if (gNoPede.load()) + noPedeVal_->setText("no pede: raw ADC"); + else if (PedestalStore::instance().loaded()) + noPedeVal_->setText("pede subtracted"); + else + noPedeVal_->setText("no pedestal loaded"); + } +} + +void MainWindow::showEvent(QShowEvent *event) { + QMainWindow::showEvent(event); + flowPass_ = 0; + layoutFlow(); +} + +void MainWindow::resizeEvent(QResizeEvent *event) { + QMainWindow::resizeEvent(event); + if (!flowQueued_) + flowPass_ = 0; // a fresh solve for the new geometry + layoutFlow(); +} + +void MainWindow::closeEvent(QCloseEvent *event) { + if (!confirmQuit()) { + event->ignore(); // the operator changed their mind + return; + } + stop(); + closeSideWindows(); + event->accept(); + // ...and end the program even if a side window somehow refused to close + QApplication::quit(); +} + +// --------------------------------------------------------------------------- +// periodic GUI work +// --------------------------------------------------------------------------- +void MainWindow::processImages() { + updateReceiverRoiOverlay(); // cheap when the ROI did not change + if (goout.load() == 0) + return; + std::lock_guard lock(pipeline_.images().mtx); + if (!pipeline_.images().ready) + return; + // ADC and gain are always the raw 1024x512 layout (ROI selection on them + // stays in raw data coordinates, also in a JFSTRX build) + // Hot pixels: in the raw view they are replaced by the average pedestal of + // their 3x3 neighbourhood (so they look like background), in the + // pedestal-corrected view by 0 - they carry no signal. + const float *adcSrc = pipeline_.images().adc.data(); + if (pipeline_.gate().hotPixels() > 0) { + const auto hmask = hotMaskSnapshot(); + if (hmask && hmask->size() == static_cast(NCH)) { + if (adcScratch_.size() != static_cast(NCH)) + adcScratch_.assign(static_cast(NCH), 0.0f); + std::memcpy(adcScratch_.data(), adcSrc, NCH * sizeof(float)); + const std::shared_ptr peds = + gNoPede.load() ? PedestalStore::instance().get() : nullptr; + for (size_t i = 0; i < static_cast(NCH); i++) { + if (!(*hmask)[i]) + continue; + float rep = 0.0f; + if (peds && peds->g0.size() >= static_cast(NCH)) { + const int x = static_cast(i % kRawWidth); + const int y = static_cast(i / kRawWidth); + double sum = 0.0; + int cnt = 0; + for (int dy = -1; dy <= 1; dy++) { + for (int dx = -1; dx <= 1; dx++) { + const int xx = x + dx, yy = y + dy; + if (xx < 0 || xx >= kRawWidth || yy < 0 || + yy >= kRawHeight) + continue; + sum += peds->g0[static_cast(yy) * kRawWidth + + xx]; + cnt++; + } + } + rep = cnt ? static_cast(sum / cnt) : 0.0f; + } + adcScratch_[i] = rep; + } + adcSrc = adcScratch_.data(); + } + } + m_adcView->setImageCopy(adcSrc, kRawWidth, kRawHeight); + if (m_photonView && pipeline_.images().photonReady && + pipeline_.images().photonSeq != pmapSeq_ && + !pipeline_.images().photon.empty()) { + pmapSeq_ = pipeline_.images().photonSeq; + const float *pmapSrc = pipeline_.images().photon.data(); + if (pipeline_.gate().hotPixels() > 0) { + const auto hmask = hotMaskSnapshot(); + if (hmask && hmask->size() == static_cast(NCH)) { + if (photonScratch_.size() != static_cast(NCH)) + photonScratch_.assign(static_cast(NCH), 0.0f); + std::memcpy(photonScratch_.data(), pmapSrc, + NCH * sizeof(float)); + for (size_t i = 0; i < static_cast(NCH); i++) + if ((*hmask)[i]) + photonScratch_[i] = 0.0f; + pmapSrc = photonScratch_.data(); + } + } + m_photonView->setImageCopy(pmapSrc, kRawWidth, 512); + m_photonView->update(); + } + m_gainView->setImageCopy(pipeline_.images().gain.data(), kRawWidth, + kRawHeight); +#ifdef JFSTRX + if (pipeline_.images().panelsReady) { + for (int p = 0; p < kNumAdcPanels; p++) { + if (m_adcPanelView[p] && !pipeline_.images().panels[p].empty()) + m_adcPanelView[p]->setImageCopy( + pipeline_.images().panels[p].data(), kAdcPanelW[p], + kAdcPanelH[p]); + } + } +#endif + pipeline_.images().ready = false; +} + +// Mirrors the receiver ROI ("rx_roi" in the stream header) onto the ADC image +// as the RED box, next to the yellow gate ROI. The ADC image is the raw +// 1024x512 layout, so this is always a plain rectangle in raw coordinates. +void MainWindow::updateReceiverRoiOverlay() { + if (!m_adcView) + return; + const int xmin = rxRoiXmin.load(); + const int xmax = rxRoiXmax.load(); + const int ymin = rxRoiYmin.load(); + const int ymax = rxRoiYmax.load(); + if (!rxRoiValid.load() || xmax <= xmin || ymax <= ymin) { + if (m_rxRoiShown) { + m_adcView->setReceiverRoiRect(0, 0, 0, 0, false); + m_rxRoiShown = false; + } + return; + } + if (m_rxRoiShown && xmin == m_rxRoiLast[0] && xmax == m_rxRoiLast[1] && + ymin == m_rxRoiLast[2] && ymax == m_rxRoiLast[3]) + return; + m_adcView->setReceiverRoiRect(xmin, ymin, xmax + 1, ymax + 1, true); + m_rxRoiShown = true; + m_rxRoiLast[0] = xmin; + m_rxRoiLast[1] = xmax; + m_rxRoiLast[2] = ymin; + m_rxRoiLast[3] = ymax; +} + +void MainWindow::updateStatus() { + const GateEngine::Counters s = pipeline_.gate().snapshot(); + const QLocale loc; + + frameLabel->setText( + QString("Frames: display %1 | in stream %2 | gap %3") + .arg(loc.toString(static_cast(pipeline_.displayFrames()))) + .arg(loc.toString(static_cast(s.framesIn))) + .arg(loc.toString(static_cast(s.framesIn - + s.framesPass)))); + + // Stream state comes from ZMQ socket monitoring: an idle-but-alive + // receiver is reported as connected, never as "stopped". + QString streamTxt; + for (size_t k = 0; k < pipeline_.portCount(); k++) { + double since = 0.0; + const Pipeline::StreamState st = + pipeline_.streamState(static_cast(k), &since); + QString one; + switch (st) { + case Pipeline::StreamState::Disconnected: + one = "disconnected"; + break; + case Pipeline::StreamState::Connecting: + one = "waiting..."; + break; + case Pipeline::StreamState::Connected: + one = "connected"; + break; + case Pipeline::StreamState::Idle: + one = QString("connected (no frames for %1 s)").arg(since, 0, 'f', 1); + break; + case Pipeline::StreamState::EndOfAcq: + one = "connected (end of acquisition)"; + break; + } + const int w = pipeline_.portWidth(static_cast(k)); + const int h = pipeline_.portHeight(static_cast(k)); + const QString geo = + (w > 0 && h > 0) ? QString(" [%1x%2]").arg(w).arg(h) : QString(); + if (k) + streamTxt += "\n"; + streamTxt += QString("%1: %2%3 (%4 frames, last #%5)") + .arg(pipeline_.portList()[k]) + .arg(one) + .arg(geo) + .arg(pipeline_.portFrames(static_cast(k))) + .arg(pipeline_.portLastFrame(static_cast(k))); + } + streamVal_->setText(streamTxt); + + // frame-index alignment: delta between the newest frames of each + // interface, plus what had to be discarded to stay aligned + if (pipeline_.portCount() > 1) { + const qlonglong f0 = static_cast( + pipeline_.portLastFrame(0)); + const qlonglong f1 = static_cast( + pipeline_.portLastFrame(1)); + alignVal_->setText( + QString("delta %1 | aligned %2 | resync drops %3 | behind drops " + "%4 | unpaired %5") + .arg(f1 - f0) + .arg(loc.toString(static_cast(s.framesIn))) + .arg(loc.toString( + static_cast(pipeline_.resyncDrops()))) + .arg(loc.toString( + static_cast(pipeline_.behindDrops()))) + .arg(loc.toString( + static_cast(pipeline_.incompleteFrames())))); + alignVal_->setVisible(true); + } else { + alignVal_->setVisible(false); + } + if (s.pedeLoaded) + pedeVal_->setText(QString("loaded (%1)%2") + .arg(QString::fromStdString(g_cfg.pedeFile)) + .arg(gPedeTracked.load() ? " [tracked]" + : "")); + else + pedeVal_->setText("not loaded"); + + displayDropVal_->setText( + loc.toString(static_cast(pipeline_.displayDropped()))); + + const QString err = QString::fromStdString(s.lastError); + errVal_->setText(err.isEmpty() ? QString() : QString("Last error: %1").arg(err)); + + framesInCumVal_->setText(loc.toString(static_cast(s.framesIn))); + // "Current" used to show the cumulative counters (framesInCur was never + // reset), so both columns always agreed. Derive the per-interval delta + // from consecutive snapshots instead. + static uint64_t pIn = 0, pPass = 0, pDrop = 0; + const uint64_t dIn = s.framesIn - pIn; + const uint64_t dPass = s.framesPass - pPass; + const uint64_t dDrop = s.framesDrop - pDrop; + pIn = s.framesIn; + pPass = s.framesPass; + pDrop = s.framesDrop; + framesInCurVal_->setText(loc.toString(static_cast(dIn))); + framesPassCumVal_->setText( + loc.toString(static_cast(s.framesPass))); + framesPassCurVal_->setText(loc.toString(static_cast(dPass))); + framesDropCumVal_->setText( + loc.toString(static_cast(s.framesDrop))); + framesDropCurVal_->setText(loc.toString(static_cast(dDrop))); + updateFlow(); // the pedestal/gain state may have changed since last time + + scDropCumVal_->setText( + loc.toString(static_cast(s.framesScDrop))); + scDropCurVal_->setText( + loc.toString(static_cast(s.framesScDropCur))); + if (scLastVal_) + scLastVal_->setText(s.lastSc < 0 + ? QString("last frame: ? (no SC in header)") + : QString("last frame: SC %1").arg(s.lastSc)); + pixelsAboveCumVal_->setText( + loc.toString(static_cast(s.pixelsAbove))); + pixelsAboveCurVal_->setText( + loc.toString(static_cast(s.pixelsAboveCur))); + rateInVal_->setText(QString("%1 fps / %2 MB/s") + .arg(loc.toString(s.rateIn, 'f', 1)) + .arg(loc.toString(s.rateInMBs, 'f', 1))); + ratePassVal_->setText(QString("%1 fps / %2 MB/s") + .arg(loc.toString(s.ratePass, 'f', 1)) + .arg(loc.toString(s.ratePassMBs, 'f', 1))); + dropFracVal_->setText(loc.toString(s.dropFrac, 'f', 3)); + + if (pipeline_.pedeAcquireActive()) + statusLabel->setText( + QString("Status: acquiring pede... %1 frames") + .arg(pipeline_.pedeAcquireProgress())); + + // ROI save progress + auto-stop detection (budget reached) + if (pipeline_.saver().running()) { + if (m_saveWasRunning != true) { + m_saveWasRunning = true; + if (btnSaveStart) + btnSaveStart->setChecked(true); + } + updateSaveLabel(); + } else if (m_saveWasRunning) { + m_saveWasRunning = false; + if (btnSaveStart) + btnSaveStart->setChecked(false); + applySaveLock(false); // the run ended (user, budget or error) + updateFlow(); + updateSaveLabel(); + const RoiSaver::Status st = pipeline_.saver().status(); + statusLabel->setText(QString("Status: ROI save stopped (%1), %2 saved") + .arg(QString::fromStdString(st.stopReason)) + .arg(st.saved)); + } + + // gate ROI, for the headless line + char roiTxt[64]; + if (pipeline_.gate().roiActive()) { + int rx0, ry0, rx1, ry1; + pipeline_.gate().roiSnapshot(rx0, ry0, rx1, ry1); + snprintf(roiTxt, sizeof(roiTxt), "%dx%d@%d,%d", rx1 - rx0, ry1 - ry0, + rx0, ry0); + } else { + snprintf(roiTxt, sizeof(roiTxt), "off"); + } + + // ROI save state, for the headless line + char saveTxt[96]; + { + const RoiSaver::Status ss = pipeline_.saver().status(); + // the first number is whatever this mode writes: frames or maps + const unsigned long long n = + (unsigned long long)(ss.photonMode ? ss.pmaps : ss.saved); + if (ss.running && ss.photonMode) + snprintf(saveTxt, sizeof(saveTxt), "%llumap/%llu", n, + (unsigned long long)ss.dropped); + else if (ss.running) + snprintf(saveTxt, sizeof(saveTxt), "%llu/%llu", n, + (unsigned long long)ss.dropped); + else if (!ss.h5Path.empty()) + snprintf(saveTxt, sizeof(saveTxt), "done:%llu%s/%llu", n, + ss.photonMode ? "map" : "", + (unsigned long long)ss.dropped); + else + snprintf(saveTxt, sizeof(saveTxt), "off"); + } + + // dual-interface alignment audit: out-of-step flushes and the current + // load-shedding step (keep 1 in N pairs), once per second + if (hotVal_) + hotVal_->setText( + QString("hot: %1 px") + .arg(static_cast(pipeline_.gate().hotPixels()))); + + if (g_cfg.printCounters && pipeline_.portCount() > 1) { + static int atick = 0; + if (++atick >= 2) { + atick = 0; + // Sustained-rate audit: what fraction of the last 120 seconds + // ran within 5 % of the best assembled rate seen, i.e. "2 kHz for + // 99 % of the time" expressed as a number. + static double best = 0.0; + static int good = 0, total = 0; + const double r = s.rateIn; + if (r > best) + best = r; + const bool ok = best > 0.0 && r >= 0.95 * best; + if (ok) + good++; + total++; + if (total > 120) { + total--; + if (!ok) good--; + } + printf("[align] keep=1/%d shed=%llu rate=%.0f/s best=%.0f/s " + "within95=%.0f%% (%d/%d s) hot=%llupx/%lluf\n", + g_keepDiv.load(), + static_cast(pipeline_.shedFrames()), r, + best, total ? 100.0 * good / total : 0.0, good, total, + static_cast( + pipeline_.gate().hotPixels()), + static_cast( + pipeline_.pmapFrames())); + fflush(stdout); + } + } + + // optional headless monitoring: the counter line the old CLI printed + if (g_cfg.printCounters) { + static int tick = 0; + if (++tick >= 2) { // updateStatus() runs every 500 ms + tick = 0; + printf("in=%llu pass=%llu drop=%llu inrate=%.1f passrate=%.1f " + "dropfrac=%.3f px=%llu display=%llu displaydrop=%llu " + "stream=%s resync=%llu behind=%llu incomplete=%llu " + "ports=%s workers=%d roi=%s save=%s gainmap=%s sc=%s " + "scdrop=%llu pthr=%g%s kev=%s ptrack=%s shown=%llu\n", + static_cast(s.framesIn), + static_cast(s.framesPass), + static_cast(s.framesDrop), s.rateIn, + s.ratePass, s.dropFrac, + static_cast(s.pixelsAbove), + static_cast(pipeline_.displayFrames()), + static_cast(pipeline_.displayDropped()), + pipeline_.streamStateName(), + static_cast(pipeline_.resyncDrops()), + static_cast(pipeline_.behindDrops()), + static_cast( + pipeline_.incompleteFrames()), + pipeline_.streamStateSummary().c_str(), + g_cfg.analysisWorkers, roiTxt, saveTxt, + gainMapLoaded() ? "loaded" : "off", + s.scFilter < 0 ? "all" : std::to_string(s.scFilter).c_str(), + static_cast(s.framesScDrop), + static_cast(gain_flag.load() ? g_pheneThresholdKev + : g_pheneThreshold), + gain_flag.load() ? "keV" : "ADU", + (kevSpectra.load() && gain_flag.load()) + ? (gainMapLoaded() ? "loaded" : "nominal") + : "off", + gPedeTracking.load() + ? (pedeTrackerStats().updates > 0 ? "on-upd" : "on") + : "off", + static_cast(pipeline_.imagesShown())); + fflush(stdout); + } + } +} + +void MainWindow::checkSignals() { + if (g_sigCount == 0) + return; + if (g_sigCount > 1) + std::_Exit(0); + printf("[shutdown] signal received, stopping threads\n"); + fflush(stdout); + statusLabel->setText("Status: stopping..."); + stop(); + QApplication::quit(); +} + +// --------------------------------------------------------------------------- +// actions +// --------------------------------------------------------------------------- +void MainWindow::toggleStartPause() { + if (goout.load() == 0) { + goout = 1; + statusLabel->setText("Status: running"); + } else { + goout = 0; + statusLabel->setText("Status: paused"); + } +} + +void MainWindow::faster() { + int v = int(HDraw_every.load() * 0.8f); + if (v < 1) + v = 1; + HDraw_every = v; + cout << endl << "Drawing every " << HDraw_every.load() << " frames" << endl; + updateDrawLabel(); +} + +void MainWindow::slower() { + int cur = HDraw_every.load(); + int v = int(cur * 1.25f); + if (v <= cur) + v = cur + 1; // avoid 1->1 + HDraw_every = v; + cout << endl << "Drawing every " << HDraw_every.load() << " frames" << endl; + updateDrawLabel(); +} + +// "Apply gain": divide the pixels by their ADU/keV (map if loaded, otherwise +// the nominal 40) so the keV spectra are physically meaningful. The plots show +// keV only while this is pushed and "keV PH" is ticked. +void MainWindow::toggleGain() { + if (btnGainToggle) + btnGainToggle->setChecked(!btnGainToggle->isChecked()); +} + +void MainWindow::setApplyGain(bool on) { + // The photon-counting threshold is in ADU with the gain off and in keV with + // it on: keep the value that is on screen in its own unit and show the + // other one, so toggling the gain never destroys either number. + if (photonThrSpin_) { + const double shown = photonThrSpin_->value(); + if (on) + g_pheneThreshold = static_cast(shown); // it was ADU + else + g_pheneThresholdKev = static_cast(shown); // it was keV + const QSignalBlocker block(photonThrSpin_); // no handler round trip + photonThrSpin_->setDecimals(on ? 1 : 0); + photonThrSpin_->setSingleStep(on ? 0.5 : 10.0); + photonThrSpin_->setValue(static_cast( + on ? g_pheneThresholdKev : g_pheneThreshold)); + if (photonThrLabel_) + photonThrLabel_->setText(on ? "photon threshold (keV):" + : "photon threshold (ADU):"); + } + gain_flag = on; + // Toggling the gain mid-save changes the unit of the photon counting, so + // the maps written from here on use the other one while the JSON keeps the + // value it recorded at save start. Say it out loud instead of leaving a + // file with two incompatible scales. + if (gSaveMode.load() == 1 && pipeline_.saver().status().running) { + printf("[gain] warning: the photon-counting unit is now %s while a " + "photon-map save is running - maps written from here on use the " + "new unit, the JSON keeps the one from save start\n", + on ? "keV" : "ADU"); + fflush(stdout); + } + updateFlow(); // the arrows bypass the Gain box when it is off + printf("[gain] apply gain %s (ADU/keV: %s)\n", on ? "ON" : "off", + on ? (gainMapLoaded() ? "from the gain map" : "nominal 40") : "-"); + fflush(stdout); + statusLabel->setText(on ? (gainMapLoaded() + ? "Status: apply gain on (per-pixel map)" + : "Status: apply gain on (nominal 40 ADU/keV)") + : "Status: apply gain off (raw ADC)"); +} + +void MainWindow::bwPalette1() { + RootCmd c; + c.type = RootCmdType::PaletteBW1; + pushRootCmd(c); + m_adcView->setPaletteLut(paletteLut(Palette::BW1)); // same colours as ROOT + if (m_adcScale_) + m_adcScale_->setPaletteChoice(1); + statusLabel->setText("Status: BW palette"); +} + +void MainWindow::bwPalette2() { + RootCmd c; + c.type = RootCmdType::PaletteBW2; + pushRootCmd(c); + m_adcView->setPaletteLut(paletteLut(Palette::BW2)); + if (m_adcScale_) + m_adcScale_->setPaletteChoice(2); + statusLabel->setText("Status: BW palette 2"); +} + +void MainWindow::colPal() { + RootCmd c; + c.type = RootCmdType::PaletteColor; + pushRootCmd(c); + m_adcView->setPaletteLut(paletteLut(Palette::Color)); + statusLabel->setText("Status: colour palette"); +} + +// The ADC widget works in DISPLAY coordinates (row 0 = top of the widget), +// while every ROOT plot and the gate use DATA coordinates (row 0 = bottom, +// (0,0) = bottom-left). This is the single place where the two meet: the +// gain view follows in display coordinates, the ROOT photon map gets the +// range converted to data rows AND framed on pixel edges (the histogram has +// one bin per pixel centred on the integer coordinate, so showing display rows +// [y1,y2) means the data range [ny-y2-0.5, ny-y1-0.5]). +// A window was zoomed. With "zoom coordination" ticked (the default) every +// other window and the ROOT plots follow the rectangle; unticked, each window +// is on its own and nothing is propagated. +void MainWindow::zoomTo(FastImageView *src, double x1, double y1, double x2, + double y2) { + if (x2 - x1 < kMinViewport || y2 - y1 < kMinViewport) + return; // never push a degenerate range to the ROOT canvases + if (!zoomCoord_) + return; + printf("[zoom] coordinated from %s\n", + src == m_adcView ? "ADC" + : src == m_gainView ? "gain" + : src == m_photonView ? "photon" + : "?"); + fflush(stdout); + for (FastImageView *v : {m_adcView, m_gainView, m_photonView}) + if (v && v != src) + v->setViewport(x1, y1, x2, y2); + const double ny = + (m_adcView && m_adcView->imageHeight() > 0) + ? static_cast(m_adcView->imageHeight()) + : 512.0; + RootCmd c; + c.type = RootCmdType::Zoom; + c.a = x1 - 0.5; + c.b = ny - y2 - 0.5; + c.c = x2 - 0.5; + c.d = ny - y1 - 0.5; + pushRootCmdCoalesced(c); +} + +// The gate ROI is captured from the ADC viewport when the button is pressed +// and then stays fixed, so the operator can keep panning/zooming the image. +// The viewport is in DISPLAY coordinates (row 0 at the top) while the gate +// works in DATA rows (row 0 at the bottom), hence the vertical flip. +void MainWindow::toggleGateRoi(bool on) { + if (on && m_applyingRoi) + return; // ROI was set directly by applyRoi(); do not re-capture + + if (!on) { // stop restricting, but keep the current ROI + pipeline_.gate().setRoiOnly(false); + pipeline_.gate().resetCounters(); + printf("[roi] gate over the full frame (current ROI kept)\n"); + fflush(stdout); + statusLabel->setText( + "Status: gate over the full frame (ROI kept as the current one)"); + updateRoiLabel(); + return; + } + if (!pipeline_.gate().roiSet()) { + QMessageBox::warning( + this, "ROI only", + "No ROI selected.\n\nUse \"Select ROI (ADC zoom)\" in the ROI " + "panel (zoom the ADC image first), or pick one with " + "\"Load ROI...\", then press ROI only again."); + btnGateRoi->setChecked(false); // leave it unselected + return; + } + pipeline_.gate().setRoiOnly(true); + pipeline_.gate().resetCounters(); + int x0 = 0, y0 = 0, x1 = 0, y1 = 0; + pipeline_.gate().roiSnapshot(x0, y0, x1, y1); + printf("[roi] gate restricted to the current ROI x=%d..%d y=%d..%d\n", x0, + x1, y0, y1); + fflush(stdout); + statusLabel->setText(QString("Status: gate restricted to the current ROI " + "%1x%2 at %3,%4") + .arg(x1 - x0) + .arg(y1 - y0) + .arg(x0) + .arg(y0)); + updateRoiLabel(); +} + +// Toggles the in-image ROI editor. It is seeded from the current ROI when +// there is one, otherwise from the ADC zoom (the old behaviour) so that the +// rectangle always starts somewhere sensible. Selection only: restricting the +// gate stays the "ROI only" button's business. +void MainWindow::setRoiEditMode(bool on) { + if (!m_adcView) + return; + if (!on) { + m_adcView->beginRoiEdit(false); + statusLabel->setText("Status: ROI editor closed"); + return; + } + const int imgW = m_adcView->imageWidth() > 0 ? m_adcView->imageWidth() + : kRawWidth; + const int imgH = m_adcView->imageHeight() > 0 ? m_adcView->imageHeight() + : kRawHeight; + int x0 = 0, y0 = 0, x1 = imgW, y1 = imgH; + if (pipeline_.gate().roiSet()) { + pipeline_.gate().roiSnapshot(x0, y0, x1, y1); + } else if (m_adcView->hasImage()) { + double vx = 0, vy = 0, vw = 0, vh = 0; + m_adcView->viewport(vx, vy, vw, vh); + x0 = static_cast(std::floor(vx)); + x1 = static_cast(std::ceil(vx + vw)); + y0 = imgH - static_cast(std::ceil(vy + vh)); + y1 = imgH - static_cast(std::floor(vy)); + x0 = std::max(0, std::min(imgW - 2, x0)); + y0 = std::max(0, std::min(imgH - 2, y0)); + x1 = std::max(x0 + 2, std::min(imgW, x1)); + y1 = std::max(y0 + 2, std::min(imgH, y1)); + } + m_adcView->setOverlayRect(x0, y0, x1, y1, true); + m_adcView->beginRoiEdit(true); + m_adcView->setFocus(); + statusLabel->setText( + "Status: ROI editor - drag the yellow rectangle to move it, its edges " + "or corners to resize, empty space to draw a new one; press \"Select " + "ROI\" again when done"); +} + +// Selects the ADC zoom as the current ROI. Selection only: whether the gate +// is restricted to it is the "ROI only" button's business. +void MainWindow::captureRoi() { + if (!m_adcView || !m_adcView->hasImage()) { + QMessageBox::information( + this, "Select ROI", + "No image yet - wait for frames and zoom the ADC image first."); + return; + } + double vx = 0, vy = 0, vw = 0, vh = 0; + m_adcView->viewport(vx, vy, vw, vh); + const int imgW = m_adcView->imageWidth(); + const int imgH = m_adcView->imageHeight(); + + int x0 = static_cast(std::floor(vx)); + int x1 = static_cast(std::ceil(vx + vw)); + const int dy0 = static_cast(std::floor(vy)); + const int dy1 = static_cast(std::ceil(vy + vh)); + // display row d <-> data row (imgH - 1 - d) + int y0 = imgH - dy1; + int y1 = imgH - dy0; + if (x0 < 0) x0 = 0; + if (y0 < 0) y0 = 0; + if (x1 > imgW) x1 = imgW; + if (y1 > imgH) y1 = imgH; + + pipeline_.gate().setRoi(x0, y0, x1, y1); + if (!pipeline_.gate().roiSet()) { // too small to be useful + QMessageBox::information(this, "Select ROI", + "The selected region is too small."); + return; + } + if (m_adcView) + m_adcView->setOverlayRect(x0, y0, x1, y1, true); + if (gateRoiVal_) + gateRoiVal_->setText(QString("%1x%2 at %3,%4 (data rows)") + .arg(x1 - x0) + .arg(y1 - y0) + .arg(x0) + .arg(y0)); + printf("[roi] current ROI x=%d..%d y=%d..%d (%dx%d px, data rows, row 0 = " + "bottom) selected from the ADC zoom\n", + x0, x1, y0, y1, x1 - x0, y1 - y0); + fflush(stdout); + updateRoiLabel(); + statusLabel->setText( + QString("Status: ROI %1x%2 at %3,%4 is the current ROI%5") + .arg(x1 - x0) + .arg(y1 - y0) + .arg(x0) + .arg(y0) + .arg(pipeline_.gate().roiActive() + ? " (gate restricted to it)" + : " - press \"ROI only\" to restrict the gate")); +} + +// Adds the active gate ROI to the list file in the program folder. +void MainWindow::saveRoi() { + if (!pipeline_.gate().roiSet()) { + QMessageBox::information( + this, "Save ROI", + "No ROI selected.\n\nZoom the ADC image and press " + "\"Select ROI (ADC zoom)\" first (or load one from the list)."); + return; + } + int x0, y0, x1, y1; + pipeline_.gate().roiSnapshot(x0, y0, x1, y1); + const int w = x1 - x0, h = y1 - y0; + if (!roiListUpsert(x0, y0, w, h)) { + QMessageBox::warning(this, "Save ROI", + QString("Could not write %1") + .arg(QString::fromStdString(g_cfg.roiFile))); + return; + } + const size_t n = roiListLoad().size(); + updateRoiLabel(); + statusLabel->setText(QString("Status: ROI %1x%2 at %3,%4 saved (%5 in list)") + .arg(w).arg(h).arg(x0).arg(y0).arg(n)); +} +// Applies a ROI to the gate without capturing the ADC viewport, and makes +// sure the "ROI only" button reflects that the gate is restricted. +void MainWindow::applyRoi(int x, int y, int w, int h, const QString &src, + bool restrict) { + pipeline_.gate().setRoi(x, y, x + w, y + h); + if (!pipeline_.gate().roiSet()) { + QMessageBox::information(this, "Load ROI", + "That entry is too small to use."); + return; + } + // -1 = keep the current restriction, 0/1 = force it off/on + if (restrict) + pipeline_.gate().setRoiOnly(true); + pipeline_.gate().resetCounters(); + if (m_adcView) + m_adcView->setOverlayRect(x, y, x + w, y + h, true); + printf("[roi] current ROI x=%d..%d y=%d..%d (%dx%d px, data rows, row 0 = " + "bottom) applied from %s\n", + x, x + w, y, y + h, w, h, src.toLocal8Bit().constData()); + fflush(stdout); + if (gateRoiVal_) + gateRoiVal_->setText(QString("%1x%2 at %3,%4 (data rows)") + .arg(w).arg(h).arg(x).arg(y)); + updateRoiLabel(); + statusLabel->setText( + QString("Status: ROI %1x%2 at %3,%4 is the current ROI (from %5)%6") + .arg(w).arg(h).arg(x).arg(y).arg(src) + .arg(pipeline_.gate().roiActive() + ? " - gate restricted to it" + : " - press \"ROI only\" to restrict the gate")); +} + +// List of saved ROIs, most recently saved/loaded first. +void MainWindow::loadRoiDialog() { + std::vector list = roiListLoad(); + const bool listEmpty = list.empty(); + + QDialog dialog(this); + dialog.setWindowTitle("Load gate ROI"); + dialog.resize(520, 320); + auto *lay = new QVBoxLayout(&dialog); + auto *table = new QTableWidget(static_cast(list.size()), 5, &dialog); + table->setHorizontalHeaderLabels( + QStringList() << "X" << "Y" << "width" << "height" << "last used"); + table->verticalHeader()->setVisible(false); + table->setSelectionBehavior(QAbstractItemView::SelectRows); + table->setSelectionMode(QAbstractItemView::SingleSelection); + table->setEditTriggers(QAbstractItemView::NoEditTriggers); + const QLocale loc; + for (size_t i = 0; i < list.size(); i++) { + const RoiEntry &e = list[i]; + const QString when = QDateTime::fromMSecsSinceEpoch(e.usedMs) + .toString("yyyy-MM-dd HH:mm:ss"); + const QString cells[5] = { + loc.toString(e.x), loc.toString(e.y), loc.toString(e.w), + loc.toString(e.h), when}; + for (int c = 0; c < 5; c++) + table->setItem(static_cast(i), c, + new QTableWidgetItem(cells[c])); + } + table->resizeColumnsToContents(); + table->selectRow(0); // newest first, pre-selected + lay->addWidget(table); + // the same convention as the ADC image and every ROOT plot + auto *hint = new QLabel( + listEmpty + ? QString("The list is empty. Use \"Edit as new...\" to type a " + "ROI, or \"Save ROI\" in the ROI panel to add the current " + "one (entries are kept in %1).") + .arg(QString::fromStdString(g_cfg.roiFile)) + : QString("X/Y are data coordinates: x grows to the right, y grows " + "upwards and (0,0) is the bottom-left pixel."), + &dialog); + hint->setWordWrap(true); + lay->addWidget(hint); + + auto *btns = new QDialogButtonBox(&dialog); + auto *applyBtn = btns->addButton("Apply", QDialogButtonBox::AcceptRole); + auto *delBtn = btns->addButton("Delete", QDialogButtonBox::DestructiveRole); + auto *editBtn = + btns->addButton("Edit as new...", QDialogButtonBox::ActionRole); + editBtn->setToolTip( + "Type the four numbers of a ROI (prefilled from the selected entry, or\n" + "from the current ROI), press Apply: the rectangle becomes the current\n" + "ROI and is added to the list as a new entry."); + btns->addButton(QDialogButtonBox::Cancel); + if (listEmpty) { // nothing to apply or delete, but editing still works + applyBtn->setEnabled(false); + delBtn->setEnabled(false); + } + lay->addWidget(btns); + connect(btns, &QDialogButtonBox::accepted, &dialog, &QDialog::accept); + connect(btns, &QDialogButtonBox::rejected, &dialog, &QDialog::reject); + connect(table, &QTableWidget::itemDoubleClicked, &dialog, + [&dialog](QTableWidgetItem *) { dialog.accept(); }); + + bool editedChosen = false; // the numbers dialog applied the ROI itself + connect(editBtn, &QPushButton::clicked, &dialog, [&]() { + const int imgW = (m_adcView && m_adcView->imageWidth() > 0) + ? m_adcView->imageWidth() + : kRawWidth; + const int imgH = (m_adcView && m_adcView->imageHeight() > 0) + ? m_adcView->imageHeight() + : kRawHeight; + int x = 0, y = 0, w = imgW, h = imgH; + const int r = table->currentRow(); + if (r >= 0 && r < static_cast(list.size())) { + x = list[r].x; + y = list[r].y; + w = list[r].w; + h = list[r].h; + } else if (pipeline_.gate().roiSet()) { + int a = 0, b = 0, c = 0, d = 0; + pipeline_.gate().roiSnapshot(a, b, c, d); + x = a; + y = b; + w = c - a; + h = d - b; + } + QDialog ed(&dialog); + ed.setWindowTitle("Edit ROI (applied as a new ROI)"); + auto *form = new QFormLayout(&ed); + auto mk = [&](int v, int lo, int hi) { + auto *sb = new QSpinBox(&ed); + sb->setRange(lo, hi); + sb->setValue(std::max(lo, std::min(hi, v))); + return sb; + }; + auto *sx = mk(x, 0, imgW - 1); + auto *sy = mk(y, 0, imgH - 1); + auto *sw = mk(w, 1, imgW); + auto *sh = mk(h, 1, imgH); + form->addRow("X (data, from the left):", sx); + form->addRow("Y (data, from the bottom):", sy); + form->addRow("Width:", sw); + form->addRow("Height:", sh); + auto *eb = new QDialogButtonBox(&ed); + // A QDialogButtonBox only emits accepted() for AcceptRole buttons, so an + // Apply (ApplyRole) button must be wired to accept() explicitly - + // otherwise clicking it did nothing at all. + auto *applyEd = eb->addButton("Apply", QDialogButtonBox::ApplyRole); + eb->addButton(QDialogButtonBox::Cancel); + form->addRow(eb); + connect(applyEd, &QPushButton::clicked, &ed, &QDialog::accept); + connect(eb, &QDialogButtonBox::rejected, &ed, &QDialog::reject); + // keep the rectangle inside the image while the numbers are typed + connect(sx, QOverload::of(&QSpinBox::valueChanged), &ed, + [=](int v) { sw->setMaximum(std::max(1, imgW - v)); }); + connect(sy, QOverload::of(&QSpinBox::valueChanged), &ed, + [=](int v) { sh->setMaximum(std::max(1, imgH - v)); }); + sw->setMaximum(std::max(1, imgW - sx->value())); + sh->setMaximum(std::max(1, imgH - sy->value())); + if (ed.exec() != QDialog::Accepted) + return; + const int nx = sx->value(), ny = sy->value(); + const int nw = std::min(sw->value(), imgW - nx); + const int nh = std::min(sh->value(), imgH - ny); + if (nw < 2 || nh < 2) { + QMessageBox::information(this, "Edit ROI", + "That rectangle is too small to use."); + return; + } + applyRoi(nx, ny, nw, nh, "edited numbers", false); + // it is a NEW entry: store it in the list (this also refreshes the + // timestamp, so it comes back first next time) + if (!roiListUpsert(nx, ny, nw, nh)) + QMessageBox::warning( + this, "Edit ROI", + QString("The ROI was applied but could not be written to %1") + .arg(QString::fromStdString(g_cfg.roiFile))); + updateRoiLabel(); + editedChosen = true; + dialog.accept(); + }); + bool deleted = false; + connect(delBtn, &QPushButton::clicked, &dialog, [&]() { + const int r = table->currentRow(); + if (r < 0 || r >= static_cast(list.size())) + return; + const RoiEntry &e = list[r]; + if (!roiListRemove(e.x, e.y, e.w, e.h)) { + QMessageBox::warning(this, "Load ROI", + QString("Could not write %1") + .arg(QString::fromStdString( + g_cfg.roiFile))); + return; + } + deleted = true; + table->removeRow(r); // keep the dialog open for further edits + }); + + if (dialog.exec() != QDialog::Accepted) { + if (deleted) + statusLabel->setText("Status: ROI entry deleted"); + return; + } + if (editedChosen) + return; // already applied by the "Edit as new..." dialog + const int row = table->currentRow(); + if (row < 0 || row >= static_cast(list.size())) + return; + const RoiEntry e = list[row]; + // refresh the timestamp so it comes back first next time + roiListUpsert(e.x, e.y, e.w, e.h); + applyRoi(e.x, e.y, e.w, e.h, "list"); +} + +void MainWindow::resetHis() { + requestHistoReset(); + statusLabel->setText("Status: histograms reset"); +} + +void MainWindow::resetAxis() { + RootCmd c; + c.type = RootCmdType::ResetAxes; + pushRootCmd(c); + // The ADC view is the master of the zoom, so unzooming only the ROOT + // clones would leave the images (and, through the next drag, the photon + // map) still zoomed: reset the widget viewports as well. + if (m_adcView) + m_adcView->resetView(); // propagates to the gain view + photon map + statusLabel->setText("Status: axes reset"); +} + +// Starts/stops writing the gate-passed ROI frames to HDF5. +void MainWindow::toggleRoiSave(bool on) { + RoiSaver &sv = pipeline_.saver(); + if (!on) { + if (sv.running()) { + sv.requestStop("user"); + statusLabel->setText("Status: finishing ROI save (flushing)..."); + applySaveLock(false); // the run is over, settings are free again + updateFlow(); + updateSaveLabel(); + } + return; + } + if (sv.running()) { + btnSaveStart->setChecked(false); + return; + } + // No gate ROI is fine: roiSnapshot() then reports the full frame, so the + // save writes the whole image instead of refusing to start. + + RoiSaver::StartInfo info; + int x0, y0, x1, y1; + pipeline_.gate().roiSnapshot(x0, y0, x1, y1); + info.x = x0; + info.y = y0; + info.w = x1 - x0; + info.h = y1 - y0; + info.maxFrames = static_cast(saveFrames_->value()); + info.photonMode = saveModePhoton_ && saveModePhoton_->isChecked(); + info.photonEvery = pmapSaveSpin_ ? pmapSaveSpin_->value() : 2000; + info.photonThreshold = gain_flag.load() ? g_pheneThresholdKev + : g_pheneThreshold; + info.photonKev = gain_flag.load(); + gGateChangedDuringSave.store(false); // fresh run, fresh note + pmapSaveReset(); // start the first saved map from scratch + info.dir = saveDirEdit_->text().trimmed().toStdString(); + if (info.dir.empty()) + info.dir = "."; + info.baseName = saveBaseEdit_->text().trimmed().toStdString(); + if (info.baseName.empty()) + info.baseName = "jfroi"; + + // pedestal in the same ROI (gain 0): slice 0 in raw mode, the + // "/pedestal data" dataset in corrected mode + std::shared_ptr peds = PedestalStore::instance().get(); + info.corrected = saveCorrected_->isChecked() && !gNoPede.load(); + if (info.corrected && !peds) { + QMessageBox::information( + this, "ROI save", + "Pedestal-corrected saving needs a pedestal.\n\nRead or acquire " + "one first, or switch the option off to save raw data."); + btnSaveStart->setChecked(false); + return; + } + // the correction itself needs the full-frame pedestal set + info.peds = peds; + // Virtual photon counting thresholds the PEDESTAL-SUBTRACTED ADC, so a map + // without a pedestal would be empty: refuse the save instead of writing + // empty maps (same policy as "Pedestal corrected" above). + if (info.photonMode && (!peds || gNoPede.load())) { + const char *why = peds ? "\"No pede\" is on" : "no pedestal is loaded"; + printf("[save] refusing virtual photon counting: %s, and the photon " + "map thresholds the pedestal-subtracted ADC\n", why); + fflush(stdout); + statusLabel->setText( + QString("Status: virtual photon counting needs a pedestal (%1)") + .arg(QString::fromLatin1(why))); + // a scripted start (--start-save) must not wait on a modal dialog + if (!g_cfg.startSave) { + QMessageBox::warning( + this, "Virtual photon counting", + QString("Virtual photon counting thresholds the " + "pedestal-subtracted ADC, but %1.\n\nLoad or acquire " + "a pedestal and clear \"No pede\" first (or save " + "frames instead).") + .arg(QString::fromLatin1(why))); + } + btnSaveStart->setChecked(false); + updateSaveLabel(); + return; + } + info.useGain = gain_flag.load(); + info.g1off = G1Poffset.load(); + info.g2off = G2Poffset.load(); + if (peds) { + // the ROI is in raw data coordinates (the ADC image is unmapped), and + // g0 is the raw 1024x512 pedestal even in a JFSTRX build + info.pedestal.resize(static_cast(info.w) * info.h, 0.0f); + for (int y = 0; y < info.h; y++) { + const int sy = info.y + y; + for (int x = 0; x < info.w; x++) { + const int sx = info.x + x; + if (sy >= 0 && sy < kRawHeight && sx >= 0 && sx < kRawWidth) + info.pedestal[static_cast(y) * info.w + x] = + peds->g0[static_cast(sy) * kRawWidth + sx]; + } + } + } + + // gate criteria in force at the start + const GateEngine::Counters g0 = pipeline_.gate().snapshot(); + // read from the engine: the operator can change these while running, and + // g_cfg keeps the startup snapshot + info.gate.enabled = pipeline_.gate().enabled(); + info.gate.threshold = pipeline_.gate().threshold(); + info.gate.minPixels = pipeline_.gate().minPixels(); + info.gate.contiguous = pipeline_.gate().contiguous(); + info.gate.roiActive = true; + info.gate.noPede = gNoPede.load(); + info.gate.roiX = x0; + info.gate.roiY = y0; + info.gate.roiW = info.w; + info.gate.roiH = info.h; + info.gateAtEnd = g0; + { + char buf[256]; + snprintf(buf, sizeof(buf), + "{\"enabled\":%s,\"threshold\":%.3f,\"min_pixels\":%llu," + "\"contiguous\":%s,\"storage_cell\":%d,\"no_pede\":%s," + "\"hot_suppress\":%s,\"hot_threshold\":%.2f," + "\"hot_pixels\":%llu}", + g_cfg.gateEnabled ? "true" : "false", + static_cast(g_cfg.threshold), + static_cast(g_cfg.minPixels), + g_cfg.contiguous ? "true" : "false", + pipeline_.gate().scFilter(), + gNoPede.load() ? "true" : "false", + pipeline_.gate().hotSuppress() ? "true" : "false", + pipeline_.hotThreshold(), + static_cast(pipeline_.gate().hotPixels())); + info.gateJson = buf; + } + // exact end-of-run statistics, refreshed by the writer when it finishes + info.statsProvider = [this](GateEngine::Counters &g, RunStats &st, + std::vector &ports) { + g = pipeline_.gate().snapshot(); + st.resync = pipeline_.resyncDrops(); + st.behind = pipeline_.behindDrops(); + st.unpaired = pipeline_.incompleteFrames(); + st.displayFrames = pipeline_.displayFrames(); + st.displayDropped = pipeline_.displayDropped(); + ports.clear(); + for (size_t i = 0; i < pipeline_.portCount(); i++) { + StreamInfo si; + si.port = pipeline_.portList()[i]; + si.state = pipeline_.streamStateName( + pipeline_.streamState(static_cast(i))); + si.frames = pipeline_.portFrames(static_cast(i)); + si.lastFrame = pipeline_.portLastFrame(static_cast(i)); + ports.push_back(si); + } + }; + + std::string err; + if (!sv.start(info, err)) { + QMessageBox::warning(this, "ROI save", + QString("Could not start: %1") + .arg(QString::fromStdString(err))); + btnSaveStart->setChecked(false); + return; + } + // remember the destination, unless it is still the start-up default: that + // one is not a "previous" destination and would only clutter the list + if (info.dir == saveDefaultDir_.toStdString() && + info.baseName == saveDefaultBase_.toStdString()) { + printf("[save] %s/%s is the default destination, not added to the " + "previous-destinations list\n", + info.dir.c_str(), info.baseName.c_str()); + fflush(stdout); + } else { + saveDestListUpsert(info.dir, info.baseName); + } + // keep the CLI defaults in sync so later runs start from the last choice + g_cfg.h5Dir = info.dir; + g_cfg.h5Base = info.baseName; + const RoiSaver::Status st = sv.status(); + statusLabel->setText(QString("Status: saving to %1") + .arg(QString::fromStdString(st.h5Path))); + applySaveLock(true); // nothing that changes the file from here on + updateSaveLabel(); +} + +void MainWindow::browseSaveDir() { + const QString dir = QFileDialog::getExistingDirectory( + this, "Directory for the ROI save", + saveDirEdit_->text().isEmpty() ? QDir::currentPath() + : saveDirEdit_->text()); + if (!dir.isEmpty()) + saveDirEdit_->setText(dir); +} + +// List of destinations used before, most recent first. +void MainWindow::saveDestDialog() { + std::vector list = saveDestListLoad(); + if (list.empty()) { + QMessageBox::information( + this, "Previous destinations", + QString("No destination has been used yet.\n\nThey are recorded " + "when a save starts; the list lives in %1.") + .arg(QString::fromStdString(g_cfg.saveListFile))); + return; + } + + QDialog dialog(this); + dialog.setWindowTitle("Previous save destinations"); + dialog.resize(560, 300); + auto *lay = new QVBoxLayout(&dialog); + auto *table = new QTableWidget(static_cast(list.size()), 3, &dialog); + table->setHorizontalHeaderLabels( + QStringList() << "directory" << "base name" << "last used"); + table->verticalHeader()->setVisible(false); + table->setSelectionBehavior(QAbstractItemView::SelectRows); + table->setSelectionMode(QAbstractItemView::SingleSelection); + table->setEditTriggers(QAbstractItemView::NoEditTriggers); + const QLocale loc; + for (size_t i = 0; i < list.size(); i++) { + const QString when = QDateTime::fromMSecsSinceEpoch(list[i].usedMs) + .toString("yyyy-MM-dd HH:mm:ss"); + table->setItem(static_cast(i), 0, + new QTableWidgetItem( + QString::fromStdString(list[i].dir))); + table->setItem(static_cast(i), 1, + new QTableWidgetItem( + QString::fromStdString(list[i].base))); + table->setItem(static_cast(i), 2, new QTableWidgetItem(when)); + } + table->resizeColumnsToContents(); + table->selectRow(0); + lay->addWidget(table); + + auto *btns = new QDialogButtonBox(&dialog); + btns->addButton("Use", QDialogButtonBox::AcceptRole); + auto *delBtn = btns->addButton("Delete", QDialogButtonBox::DestructiveRole); + btns->addButton(QDialogButtonBox::Cancel); + lay->addWidget(btns); + connect(btns, &QDialogButtonBox::accepted, &dialog, &QDialog::accept); + connect(btns, &QDialogButtonBox::rejected, &dialog, &QDialog::reject); + connect(table, &QTableWidget::itemDoubleClicked, &dialog, + [&dialog](QTableWidgetItem *) { dialog.accept(); }); + bool deleted = false; + connect(delBtn, &QPushButton::clicked, &dialog, [&]() { + const int r = table->currentRow(); + if (r < 0 || r >= static_cast(list.size())) + return; + saveDestListRemove(list[r].dir, list[r].base); + deleted = true; + table->removeRow(r); + }); + + if (dialog.exec() != QDialog::Accepted) { + if (deleted) + statusLabel->setText("Status: destination removed from the list"); + return; + } + const int row = table->currentRow(); + if (row < 0 || row >= static_cast(list.size())) + return; + saveDirEdit_->setText(QString::fromStdString(list[row].dir)); + saveBaseEdit_->setText(QString::fromStdString(list[row].base)); + statusLabel->setText( + QString("Status: destination set to %1 / %2") + .arg(QString::fromStdString(list[row].dir)) + .arg(QString::fromStdString(list[row].base))); +} + +void MainWindow::updateSaveLabel() { + if (!saveVal_) + return; + const RoiSaver::Status st = pipeline_.saver().status(); + // in photon-map mode the frames counter never moves, so report the maps + const qulonglong n = st.photonMode ? st.pmaps : st.saved; + const QString what = st.photonMode ? (n == 1 ? "map" : "maps") + : (n == 1 ? "frame" : "frames"); + // only mention the queue when something was actually dropped: "0 dropped + // (queue full)" claimed a problem that is not there + const QString dropNote = st.dropped + ? QString(" (writer behind: queue full)") + : QString(" (nothing lost)"); + if (st.running) { + saveVal_->setText(QString("%1\n%2 %3 written, %4 dropped%5") + .arg(QString::fromStdString(st.h5Path)) + .arg(n) + .arg(what) + .arg(st.dropped) + .arg(dropNote)); + } else if (st.h5Path.empty()) { + saveVal_->setText("idle"); + } else { + saveVal_->setText( + QString("%1\n%2 %3 written, %4 dropped - stopped (%5)") + .arg(QString::fromStdString(st.h5Path)) + .arg(n) + .arg(what) + .arg(st.dropped) + .arg(QString::fromStdString(st.stopReason))); + } +} + +void MainWindow::acquirePede() { + if (!pipeline_.running()) { + QMessageBox::information(this, "Acquire pedestal", + "The acquisition pipeline is not running."); + return; + } + if (pipeline_.pedeAcquireActive()) + return; + pipeline_.requestPedeAcquire(g_cfg.pedeFrames); + statusLabel->setText("Status: acquiring pede..."); +} + +void MainWindow::savePede() { + std::string werr; + if (pedeSaveFile(g_cfg.pedeFile, werr)) { + printf("[pede] saved %s\n", g_cfg.pedeFile.c_str()); + statusLabel->setText(QString("Status: pede saved to %1") + .arg(QString::fromStdString(g_cfg.pedeFile))); + } else { + fprintf(stderr, "[pede] save failed: %s\n", werr.c_str()); + pipeline_.gate().setLastError("savePedestal: " + werr); + QMessageBox::warning(this, "Save Pedestal", + QString::fromStdString(werr)); + } +} + +void MainWindow::readPede() { + std::string perr; + if (pedeLoadFile(g_cfg.pedeFile, perr)) { + printf("[pede] read %s\n", g_cfg.pedeFile.c_str()); + pipeline_.gate().setLastError(""); + statusLabel->setText("Status: pede read"); + } else { + fprintf(stderr, "[pede] read failed: %s\n", perr.c_str()); + pipeline_.gate().setLastError("loadPedestal: " + perr); + QMessageBox::warning(this, "Read Pedestal", + QString::fromStdString(perr)); + } +} + +void MainWindow::loadAllPede() { + // The original only printed "not implemented". It is genuinely useful in + // the merged program (it is the only way to load a full G0/G1/G2 set from + // an arbitrary path), so it opens a file chooser now. + const QString path = QFileDialog::getOpenFileName( + this, "Load pedestal file", QDir::currentPath(), + "Pedestal files (*.dat *.txt);;All files (*)"); + if (path.isEmpty()) + return; + std::string perr; + if (pedeLoadFile(path.toStdString(), perr)) { + cout << "[pede] loaded " << path.toStdString() << endl; + pipeline_.gate().setLastError(""); + statusLabel->setText(QString("Status: pede loaded from %1").arg(path)); + } else { + fprintf(stderr, "[pede] load failed: %s\n", perr.c_str()); + pipeline_.gate().setLastError("loadPedestal: " + perr); + QMessageBox::warning(this, "Load Pedestal", + QString::fromStdString(perr)); + } +} + +// The live value range of the main plot: what its colour scale is using right +// now, whatever set it (the defaults, this dialog, or a drag on the ROOT +// canvas). Read from the displayed histogram, so the dialog always opens on +// the values the operator is actually looking at. +// The ADC image (the "main plot") keeps its own colour scale, which the +// operator can also drag on the colour bar: read what the widget is using. +void MainWindow::liveAdcImageRange(int &lo, int &hi) const { + if (m_adcView) { + double a = 0, b = 0; + m_adcView->colorRange(a, b); + lo = static_cast(std::floor(a)); + hi = static_cast(std::ceil(b)); + if (lo != hi) + return; + } + lo = adcmin.load(); + hi = adcmax.load(); +} + +// The ROOT 2D map (canvas A5) keeps its colour scale in min/max. +void MainWindow::liveMapRange(int &lo, int &hi) const { + if (m_photonView) { + double a = 0, b = 0; + m_photonView->colorRange(a, b); + lo = static_cast(a); + hi = static_cast(b); + if (lo != hi) + return; + } + lo = pmmin.load(); + hi = pmmax.load(); +} + +// Same for the shared x window of the spectra. +void MainWindow::liveChipRange(int &lo, int &hi) const { + if (dispChip[0] && dispChip[0]->GetXaxis()) { + TAxis *ax = dispChip[0]->GetXaxis(); + lo = static_cast(std::floor(ax->GetBinLowEdge(ax->GetFirst()))); + hi = static_cast(std::ceil(ax->GetBinUpEdge(ax->GetLast()))); + if (lo != hi) + return; + } + lo = chipxmin.load(); + hi = chipxmax.load(); +} + +// Calibration popup: pick (or change) the gain-map file used for the keV +// spectra. Everything else keeps working in ADU. +void MainWindow::loadGainMap() { + const QString start = + g_cfg.gainMapFile.empty() ? QDir::homePath() + : QString::fromStdString(g_cfg.gainMapFile); + const QString path = QFileDialog::getOpenFileName( + this, "Select gain map (g0,g1,g2,hg0,hg1,hg2 - 1024x512 doubles)", start, + "Gain maps (*.bin *.dat *.raw);;All files (*)"); + if (path.isEmpty()) + return; + std::string err; + if (!gainMapLoadFile(path.toStdString(), err)) { + fprintf(stderr, "[gain] %s\n", err.c_str()); + QMessageBox::warning(this, "Gain map", QString::fromStdString(err)); + return; + } + g_cfg.gainMapFile = path.toStdString(); + const QString base = QFileInfo(path).fileName(); + if (kevChk_) + kevChk_->setChecked(true); // show what was just calibrated + updateFlow(); + statusLabel->setText( + QString("Status: gain map %1 loaded - PH spectra also in keV") + .arg(base)); +} + +void MainWindow::showRangeDialog() { + QDialog dialog(this); + dialog.setWindowTitle("Set Ranges"); + auto *form = new QFormLayout(&dialog); + + int imgLo = 0, imgHi = 0, mapLo = 0, mapHi = 0, chipLo = 0, chipHi = 0; + liveAdcImageRange(imgLo, imgHi); + liveMapRange(mapLo, mapHi); + liveChipRange(chipLo, chipHi); + + auto *adcMinEdit = new QSpinBox(&dialog); + adcMinEdit->setRange(-100000, 100000); + adcMinEdit->setValue(imgLo); + auto *adcMaxEdit = new QSpinBox(&dialog); + adcMaxEdit->setRange(-100000, 100000); + adcMaxEdit->setValue(imgHi); + auto *pmMinEdit = new QSpinBox(&dialog); + pmMinEdit->setRange(-100000, 100000); + pmMinEdit->setValue(mapLo); + auto *pmMaxEdit = new QSpinBox(&dialog); + pmMaxEdit->setRange(-100000, 100000); + pmMaxEdit->setValue(mapHi); + auto *chMinEdit = new QSpinBox(&dialog); + chMinEdit->setRange(-100000, 100000); + chMinEdit->setValue(chipLo); + auto *chMaxEdit = new QSpinBox(&dialog); + chMaxEdit->setRange(-100000, 100000); + chMaxEdit->setValue(chipHi); + + form->addRow("ADC min (ADC image):", adcMinEdit); + form->addRow("ADC max (ADC image):", adcMaxEdit); + form->addRow("P.Map min (ROOT map):", pmMinEdit); + form->addRow("P.Map max (ROOT map):", pmMaxEdit); + form->addRow("PH min (spectra):", chMinEdit); + form->addRow("PH max (spectra):", chMaxEdit); + auto *hint = new QLabel( + "Each field opens on the scale that display is using now; nothing " + "changes unless you edit it.", + &dialog); + hint->setWordWrap(true); + form->addRow(hint); + + auto *buttons = new QDialogButtonBox( + QDialogButtonBox::Ok | QDialogButtonBox::Cancel, &dialog); + form->addRow(buttons); + connect(buttons, &QDialogButtonBox::accepted, &dialog, &QDialog::accept); + connect(buttons, &QDialogButtonBox::rejected, &dialog, &QDialog::reject); + + if (dialog.exec() == QDialog::Accepted) { + setRanges(adcMinEdit->value(), adcMaxEdit->value(), pmMinEdit->value(), + pmMaxEdit->value(), chMinEdit->value(), chMaxEdit->value()); + } +} + +void MainWindow::setRanges(int amin, int amax, int pmin, int pmax, int cmin, + int cmax) { + int imgLo = 0, imgHi = 0, mapLo = 0, mapHi = 0, chipLo = 0, chipHi = 0; + liveAdcImageRange(imgLo, imgHi); + liveMapRange(mapLo, mapHi); + liveChipRange(chipLo, chipHi); + + // the ADC pair is the colour scale of the ADC (main) image - a Qt widget, + // so it is applied straight away - and the P.Map pair the ROOT 2D map, + // which must be changed on the ROOT thread + adcmin = amin; + adcmax = amax; + pmmin = pmin; + pmmax = pmax; + chipxmin = cmin; + chipxmax = cmax; + if ((amin != imgLo || amax != imgHi) && m_adcView) { + m_adcView->setColorRange(amin, amax); + if (m_adcScale_) + m_adcScale_->syncFromView(); + cout << "Ranges set: ADC image [" << amin << "," << amax << "]" + << endl; + } + if (pmin != mapLo || pmax != mapHi) { + fixranges = true; + RootCmd c; + c.type = RootCmdType::SetMapRange; + c.a = pmin; + c.b = pmax; + pushRootCmd(c); + cout << "Ranges set: ROOT map z [" << pmin << "," << pmax << "]" + << endl; + } + if (cmin != chipLo || cmax != chipHi) { + RootCmd c; + c.type = RootCmdType::SetChipRange; + c.a = cmin; + c.b = cmax; + pushRootCmd(c); + cout << "Ranges set: PH x [" << cmin << "," << cmax << "]" << endl; + } + forceRootRedraw(); +} + +void MainWindow::showRateDialog() { + QDialog dialog(this); + dialog.setWindowTitle("Update Rates"); + auto *form = new QFormLayout(&dialog); + + auto *mainRateSpin = new QSpinBox(&dialog); + mainRateSpin->setRange(1, 10000); + mainRateSpin->setValue(HDraw_every.load()); + form->addRow("Main image (frames):", mainRateSpin); + + auto *rootMsSpin = new QSpinBox(&dialog); + rootMsSpin->setRange(50, 60000); + rootMsSpin->setSingleStep(100); + rootMsSpin->setValue(rootUpdateMs.load()); + form->addRow("ROOT update (ms):", rootMsSpin); + + auto *chipSpin = new QSpinBox(&dialog); + chipSpin->setRange(1, 100); + chipSpin->setValue(chipUpdateEvery.load()); + chipSpin->setToolTip( + "Redraw the chip-spectrum canvas (A4) every N-th ROOT redraw. It is\n" + "the most expensive canvas, so a larger N keeps the other canvases\n" + "responsive."); + form->addRow("Chip spectra every N redraws:", chipSpin); + + auto *effLabel = new QLabel( + QString("ROOT redraws every %1 ms when frames arrived") + .arg(rootUpdateMs.load()), + &dialog); + effLabel->setWordWrap(true); + form->addRow(effLabel); + connect(rootMsSpin, QOverload::of(&QSpinBox::valueChanged), + [effLabel](int ms) { + effLabel->setText( + QString("ROOT redraws every %1 ms when frames arrived") + .arg(ms)); + }); + + auto *buttons = new QDialogButtonBox( + QDialogButtonBox::Ok | QDialogButtonBox::Cancel, &dialog); + form->addRow(buttons); + connect(buttons, &QDialogButtonBox::accepted, &dialog, &QDialog::accept); + connect(buttons, &QDialogButtonBox::rejected, &dialog, &QDialog::reject); + + if (dialog.exec() == QDialog::Accepted) { + HDraw_every = mainRateSpin->value(); + rootUpdateMs = rootMsSpin->value(); + chipUpdateEvery = chipSpin->value(); + updateDrawLabel(); + cout << "Rates: main=" << HDraw_every.load() + << " rootMs=" << rootUpdateMs.load() << endl; + } +} + +void MainWindow::updateDrawLabel() { + if (drawLabel) + drawLabel->setText(QString("Main: every %1 frames | ROOT: every %2 ms") + .arg(HDraw_every.load()) + .arg(rootUpdateMs.load())); +} + +// The ADC / gain / photon (and, under JFSTRX, the strixel) windows are separate +// top-level widgets, and the ROOT canvases live in the ROOT thread: closing the +// control window used to leave them on screen, and with them the process alive +// (Qt only quits on the *last* window). Close them all, then leave the loop. +// The display chain and the saved data do not have to agree about the +// pedestal: the display follows the Pede/Raw toggle, while the file is +// corrected only when "Pedestal corrected" is ticked - and the photon maps +// always need the pedestal (their save is refused without it). +void MainWindow::flowStageStates(bool &displayPede, bool &savePede, bool &gateOn, + bool &pmap) const { + displayPede = PedestalStore::instance().loaded() && !gNoPede.load(); + pmap = (gSaveMode.load() == 1); + savePede = pmap || ((saveCorrected_ && saveCorrected_->isChecked()) && + !gNoPede.load()); + gateOn = !gateChk_ || gateChk_->isChecked(); +} + +void MainWindow::closeSideWindows() { + QWidget *wins[] = {m_adcWin, m_gainWin, m_photonWin, +#ifdef JFSTRX + m_adcPanelWin, +#endif + nullptr}; + for (QWidget *w : wins) { + if (!w) + continue; + w->hide(); + w->close(); + } +} + +// While a save is running everything that would change what lands in the file is +// locked: its JSON describes the settings at save start, so a quiet change +// halfway would leave a file nobody can interpret. Display-only controls (and +// the pedestal tracker, which is meant to follow drift during a run) stay live; +// the gate threshold and min-pixels stay live but ask first. +void MainWindow::applySaveLock(bool saving) { + auto lockGroup = [&](QGroupBox *g, std::initializer_list keep) { + if (!g) + return; + for (QObject *c : g->children()) { + auto *w = qobject_cast(c); + if (!w) + continue; + bool kept = false; + for (QWidget *k : keep) + if (k == w) + kept = true; + w->setEnabled(!saving || kept); + } + }; + lockGroup(saveGroup_, {btnSaveStart, saveVal_}); // Start/Stop must stay live + lockGroup(pedeGroup_, {}); // manual pede work changes the saved data + lockGroup(gainGroup_, {kevChk_, gainStateChk_}); // keV PH is display only + lockGroup(scGroup_, {}); // the cell filter changes which frames pass + lockGroup(sigGroup_, {thrSpin_, minPixSpin_}); // the two that ask first + lockGroup(pmapGroup_, {pmapCumulative_, pmapEverySpin_}); // display-only pair + if (btnResetCounters) + btnResetCounters->setEnabled(!saving); + for (QWidget *w : {btnSelectRoi_, btnUnsetRoi_, btnLoadRoi}) + if (w) + w->setEnabled(!saving); // they move the ROI, i.e. the saved crop + // the photon threshold scales the counts that are written in photon-map + // mode, so it is locked there and stays live while frames are saved + if (photonThrSpin_) + photonThrSpin_->setEnabled(!(saving && gSaveMode.load() == 1)); + if (saveCorrected_) // only meaningful for the frames mode + saveCorrected_->setEnabled(!(gSaveMode.load() == 1) && !saving); +} + +bool MainWindow::confirmGateChangeDuringRun(const QString &what) { + if (!pipeline_.saver().status().running) + return true; + // With the gate off (passthrough) the threshold and min-pixels decide + // nothing about the saved frames, so there is nothing to confirm. + if (!pipeline_.gate().enabled()) + return true; + const QMessageBox::StandardButton a = QMessageBox::question( + this, "Gate setting", + QString("Changing settings during a run, are you sure?\n\n%1\n\nThe " + "file being written keeps the gate criterion it started with; a " + "note is added to its JSON sidecar.") + .arg(what), + QMessageBox::Yes | QMessageBox::No, QMessageBox::No); + if (a != QMessageBox::Yes) { + printf("[save] gate change refused during the run (%s)\n", + what.toLocal8Bit().constData()); + fflush(stdout); + return false; + } + gGateChangedDuringSave.store(true); + printf("[save] gate setting changed during the run: %s (noted in the JSON)\n", + what.toLocal8Bit().constData()); + fflush(stdout); + return true; +} + +// "Unset ROI": drop the current rectangle, so the gate, the ROI spectra and the +// saved data are back to the full frame. The ROI list on disk is untouched. +void MainWindow::unsetRoi() { + if (!pipeline_.gate().roiSet()) { + statusLabel->setText("Status: no ROI set (already the full frame)"); + return; + } + // release the restriction first, so its own message stays truthful + if (btnGateRoi && btnGateRoi->isChecked()) + btnGateRoi->setChecked(false); + pipeline_.gate().clearRoi(); + pipeline_.gate().resetCounters(); + if (btnSelectRoi_ && btnSelectRoi_->isChecked()) + btnSelectRoi_->setChecked(false); // leaves the editor + if (m_adcView) + m_adcView->setOverlayRect(0, 0, 0, 0, false); + if (gateRoiVal_) + gateRoiVal_->setText("full frame"); + printf("[roi] ROI unset: full frame\n"); + fflush(stdout); + updateRoiLabel(); + statusLabel->setText("Status: ROI unset (full frame)"); +} + +void MainWindow::quitApp() { + if (!confirmQuit()) + return; + stop(); + closeSideWindows(); + QApplication::quit(); +} + +// --------------------------------------------------------------------------- +// command line +// --------------------------------------------------------------------------- +void printUsage(const char *prog) { + printf("Usage: %s [rx_port] [gate_threshold] [min_pixels]\n" + " [pede_file] [--pub PORT] [--contig] [--no-gate]\n" + " a port may carry its slab placement:\n" + " 30026+30027 order of the list = bottom, top\n" + " 30027:top one interface, upper half\n" + " 30026:bottom one interface, lower half\n" + " [--pede-frames N]\n" + "\n" + " rx_host slsReceiver host\n" + " rx_port slsReceiver zmq port, or a '+' list for the\n" + " multi-interface (N UDP interfaces) mode, ordered\n" + " bottom -> top: 30001+30002 = (bot,top)\n" + " (default %d)\n" + " gate_threshold event-finder gate threshold, pede-subtracted ADC\n" + " (default %d)\n" + " min_pixels gate: pass when >= N pixels are above threshold\n" + " (default 5)\n" + " pede_file pedestal file (default %s)\n" + "\n" + " The photon-map threshold (ADU, default %d) is a control in the\n" + " Display panel, not an argument; --raw-map shows raw ADC there\n" + " instead of photon counts.\n" + "\n" + " --pub PORT additionally republish gated frames on PORT\n" + " --contig enable the contiguity proxy (r = N/2+1)\n" + " --hot-suppress learn and suppress hot pixels in the gate\n" + " --hot-frac P a pixel is hot above P % of the frames\n" + " (default 10)\n" + " --gate enable the gate (it is OFF by default)\n" + " --no-gate disable the gate (same as the default)\n" + " --raw-map show raw ADC in the main map instead of\n" + " photon counts (threshold unused then)\n" + " --save-budget N stop after N saved frames, or N saved photon\n" + " maps in virtual photon counting mode\n" + " --apply-gain start with the gain correction on (the photon\n" + " threshold then means keV, default 4 keV)\n" + " --start-save start saving at startup (same as pressing\n" + " the Save button); combine with --save-photon\n" + " --save-photon write the virtual photon counting maps instead\n" + " of the frames (see the Save panel)\n" + " --pmap-every N display cadence of the photon map (default 2000)\n" + " --pmap-save-every N\n" + " saved map cadence, minimum 200 (default 2000)\n" + " --pede-tracking follow the pedestal drift from the frames the\n" + " signal gate drops (see the Pedestal panel)\n" + " --no-pede ignore the pedestal everywhere (same as the\n" + " No pede button); this is the STARTUP DEFAULT,\n" + " so the gate threshold applies to raw 14-bit ADC\n" + " --use-pede start with pedestal subtraction enabled\n" + " --stats print the counter line on stdout every second\n" + " --decimate N process 1 frame in N (N = 2, 4 or 8); the frames\n" + " are dropped by detector frame number, so both\n" + " interfaces drop the same ones\n" + " --auto-decimate let the pipeline decimate on a real analysis\n" + " backlog (off by default: --decimate is manual)\n" + " --acquire-pede average --pede-frames frames into a live\n" + " pedestal as soon as acquisition starts\n" + " --pede-frames N frames averaged by \"Acquire Pede\" (default %d)\n" + " --analysis-workers N\n" + " threads for the per-pixel analysis loops\n" + " (default: auto = cores/4, capped at 8; 1 =\n" + " single threaded). Scales across cores with no\n" + " extra memory and bit-identical results.\n" + " --h5-dir DIR directory for ROI-save HDF5 + JSON (default .)\n" + " --h5-base NAME file-name base, file is __f0_0.h5\n" + " (default jfroi)\n" + " --gainmap PATH gain-map file (6 x 1024x512 doubles: g0 g1 g2\n" + " hg0 hg1 hg2). g0 is ADU/keV and is used to\n" + " fill a second set of PH spectra in keV; the ADC\n" + " image, the photon map and the HDF5 writer stay\n" + " in ADU. Can also be loaded from the GUI.\n" + " --roi-file PATH gate-ROI list file (default ./roi_list.dat)\n" + " --sc N pass only frames from storage cell N (0..15,\n" + " bits 8-11 of detSpec3; 'all' = no SC gating).\n" + " Checked before the signal gate, so other cells\n" + " cost no CPU. The GUI has the same selector.\n" + " --gate-roi X Y W H\n" + " start with a gate ROI (data rows: x to the\n" + " right, y upwards, (0,0) = bottom-left; same\n" + " convention as the ROI list and the ROOT plots)\n" + " --rx-hwm N receive high-water mark per interface (default\n" + " %d); smaller = lower latency, more drops\n" + "\n" + "Run chain: slsReceiver -> %s (no external event finder, no\n" + "intermediate zmq hop: the gate and the display share one process)\n", + prog, DEFAULT_RX_PORT, + static_cast(PHOTON_THRESHOLD_DEFAULT), PEDEFNAME, + static_cast(PHOTON_THRESHOLD_DEFAULT), DEFAULT_N_PEDE_FRAMES, + 1000, prog); +} + +bool parseCommandLine(int argc, char **argv, Config &cfg, bool &help, + std::string &error) { + help = false; + std::vector pos; + for (int i = 1; i < argc; i++) { + const std::string a = argv[i]; + if (a == "-h" || a == "--help") { + help = true; + return true; + } else if (a == "--pub") { + if (i + 1 >= argc) { + error = "--pub needs a port"; + return false; + } + cfg.pubPort = std::atoi(argv[++i]); + } else if (a == "--contig") { + cfg.contiguous = true; + } else if (a == "--hot-suppress") { + cfg.hotSuppress = true; + } else if (a == "--hot-frac") { + cfg.hotFraction = std::atof(argv[++i]) / 100.0; + } else if (a == "--pmap-every") { + if (i + 1 >= argc) { + error = "--pmap-every needs a count"; + return false; + } + const int v = std::atoi(argv[++i]); + gPmapEvery = v > 0 ? v : 1; + } else if (a == "--pmap-save-every") { + if (i + 1 >= argc) { + error = "--pmap-save-every needs a count (>= 200)"; + return false; + } + const int v = std::atoi(argv[++i]); + gPmapSaveEvery = v < 200 ? 200 : v; + } else if (a == "--save-photon") { + gSaveMode = 1; // same as the Save panel's radio button + } else if (a == "--start-save") { + cfg.startSave = true; // start saving as soon as we are up + } else if (a == "--apply-gain") { + // the gain stage is the only one without a CLI mirror; needed for + // scripted keV runs (and it makes the keV photon threshold testable) + cfg.applyGain = true; + } else if (a == "--save-budget") { + if (i + 1 >= argc) { + error = "--save-budget needs a count"; + return false; + } + cfg.saveBudget = static_cast(std::atoll(argv[++i])); + } else if (a == "--pede-tracking") { + gPedeTracking = true; // same as the Pedestal panel button + } else if (a == "--no-pede") { + // same as the "Pede/Raw toggle" button: no pedestal subtraction + // anywhere, so the gate threshold applies to the raw 14-bit value + gNoPede = true; + } else if (a == "--use-pede") { + // re-enable pedestal subtraction (the startup default is --no-pede) + gNoPede = false; + } else if (a == "--raw-map") { + cfg.rawMap = true; // his3000 shows raw ADC instead of counts + } else if (a == "--no-gate") { + cfg.gateEnabled = false; + } else if (a == "--gate") { + cfg.gateEnabled = true; // the gate is off by default + } else if (a == "--decimate") { + const int v = std::atoi(argv[++i]); + cfg.decimate = (v == 2 || v == 4 || v == 8) ? v : 1; + g_keepDiv.store(cfg.decimate); // frames are dropped from now on + } else if (a == "--auto-decimate") { + cfg.autoDecimate = true; + g_autoDecimate.store(true); + } else if (a == "--stats") { + cfg.printCounters = true; + } else if (a == "--acquire-pede") { + cfg.acquirePede = true; + } else if (a == "--h5-base") { + if (i + 1 >= argc) { + error = "--h5-base needs a name"; + return false; + } + cfg.h5Base = argv[++i]; + } else if (a == "--h5-dir") { + if (i + 1 >= argc) { + error = "--h5-dir needs a path"; + return false; + } + cfg.h5Dir = argv[++i]; + } else if (a == "--gainmap") { + if (i + 1 >= argc) { + error = "--gainmap needs a file"; + return false; + } + cfg.gainMapFile = argv[++i]; + cfg.gainMapExplicit = true; + } else if (a == "--roi-file") { + if (i + 1 >= argc) { + error = "--roi-file needs a path"; + return false; + } + cfg.roiFile = argv[++i]; + } else if (a == "--sc") { + if (i + 1 >= argc) { + error = "--sc needs a value (0..15, or all)"; + return false; + } + const std::string v = argv[++i]; + if (v == "all" || v == "ALL") { + cfg.scFilter = -1; + } else { + const int n = std::atoi(v.c_str()); + if (n < 0 || n > 15) { + error = "--sc must be 0..15 or all"; + return false; + } + cfg.scFilter = n; + } + } else if (a == "--gate-roi") { + // X Y W H in data rows (row 0 = bottom), same as the ROI list + if (i + 4 >= argc) { + error = "--gate-roi needs X Y W H"; + return false; + } + cfg.gateRoiX = std::atoi(argv[++i]); + cfg.gateRoiY = std::atoi(argv[++i]); + cfg.gateRoiW = std::atoi(argv[++i]); + cfg.gateRoiH = std::atoi(argv[++i]); + if (cfg.gateRoiW < 1 || cfg.gateRoiH < 1) { + error = "--gate-roi needs a positive width and height"; + return false; + } + } else if (a == "--analysis-workers") { + if (i + 1 >= argc) { + error = "--analysis-workers needs a count"; + return false; + } + const int n = std::atoi(argv[++i]); + if (n < 1 || n > 32) { + error = "--analysis-workers must be 1..32"; + return false; + } + cfg.analysisWorkers = n; + } else if (a == "--rx-hwm") { + if (i + 1 >= argc) { + error = "--rx-hwm needs a value"; + return false; + } + const int n = std::atoi(argv[++i]); + if (n < 1) { + error = "--rx-hwm must be >= 1"; + return false; + } + cfg.rxHwm = n; + } else if (a == "--pede-frames") { + if (i + 1 >= argc) { + error = "--pede-frames needs a count"; + return false; + } + const int n = std::atoi(argv[++i]); + if (n < 1) { + error = "--pede-frames must be >= 1"; + return false; + } + cfg.pedeFrames = n; + } else if (a == "--pede") { + if (i + 1 >= argc) { + error = "--pede needs a file"; + return false; + } + cfg.pedeFile = argv[++i]; + cfg.pedeExplicit = true; + } else if (!a.empty() && a[0] == '-' && a.size() > 1 && + !isdigit(static_cast(a[1]))) { + error = "unknown option: " + a; + return false; + } else { + pos.push_back(a); + } + } + + if (pos.empty()) { + error = "need at least "; + return false; + } + cfg.rxHost = pos[0]; + // the photon-map threshold is a Display control (ADU, default 150); the + // raw-ADC map is still available with --raw-map + cfg.dophotonmap = !cfg.rawMap; + cfg.threshold = static_cast(cfg.phene / 2); // default gate threshold + if (pos.size() >= 2) { + // "30001" (single interface) or "30001+30002" (multi-interface, + // ordered BOTTOM -> TOP in the assembled image) + cfg.rxPorts.clear(); + std::string spec = pos[1]; + size_t start = 0; + while (start <= spec.size()) { + const size_t plus = spec.find('+', start); + const std::string tok = + spec.substr(start, (plus == std::string::npos) + ? std::string::npos + : plus - start); + if (tok.empty()) { + error = "bad rx_port list '" + spec + "'"; + return false; + } + // "30027:top" / "30026:bottom" place a single interface's slab + // inside the module without needing its partner. + std::string num = tok; + int slab = 0; + const size_t colon = tok.find(':'); + if (colon != std::string::npos) { + num = tok.substr(0, colon); + const std::string where = tok.substr(colon + 1); + if (where == "top") + slab = 2; + else if (where == "bottom") + slab = 1; + else { + error = "bad placement '" + where + "' in '" + spec + + "' (use :top or :bottom)"; + return false; + } + } + const int port = std::atoi(num.c_str()); + if (port <= 0 || port > 65535) { + error = "bad rx_port '" + tok + "' in '" + spec + "'"; + return false; + } + cfg.rxPorts.push_back(port); + cfg.rxSlab.push_back(slab); + if (plus == std::string::npos) + break; + start = plus + 1; + } + if (cfg.rxPorts.empty() || + cfg.rxPorts.size() > static_cast(JF_MAX_PORTS)) { + error = "rx_port list must have 1.." + + std::to_string(JF_MAX_PORTS) + " entries"; + return false; + } + } + if (pos.size() >= 3) + cfg.threshold = static_cast(std::atof(pos[2].c_str())); + if (pos.size() >= 4) + cfg.minPixels = std::strtoull(pos[3].c_str(), nullptr, 10); + if (pos.size() >= 5) { + cfg.pedeFile = pos[4]; + cfg.pedeExplicit = true; + } + if (cfg.rxHost.empty()) { + error = "rx_host is empty"; + return false; + } + if (cfg.analysisWorkers == 0) { // auto + unsigned hw = std::thread::hardware_concurrency(); + if (hw == 0) + hw = 4; + cfg.analysisWorkers = + static_cast(std::min(8u, std::max(1u, hw / 4))); + } + return true; +} + +// --------------------------------------------------------------------------- +int main(int argc, char *argv[]) { + Config cfg; + bool help = false; + std::string err; + if (!parseCommandLine(argc, argv, cfg, help, err)) { + if (!err.empty()) + fprintf(stderr, "error: %s\n", err.c_str()); + printUsage(argv[0]); + return help ? 0 : 2; + } + if (help) { + printUsage(argv[0]); + return 0; + } + + QApplication app(argc, argv); + g_cfg = cfg; + g_pheneThreshold = PHOTON_THRESHOLD_DEFAULT; // photon counting, ADU + g_pheneThresholdKev = PHOTON_THRESHOLD_KEV_DEFAULT; // same, keV (gain on) + cfg.phene = static_cast(2 * PHOTON_THRESHOLD_DEFAULT); + dophotonmap.store(cfg.dophotonmap); + + printf("=== Online JF display + event finder (single process) ===\n"); + { + std::string ports; + for (size_t k = 0; k < cfg.rxPorts.size(); k++) { + if (k) + ports += "+"; + ports += std::to_string(cfg.rxPorts[k]); + } + printf("input : %s:%s (subscriber)%s\n", cfg.rxHost.c_str(), + ports.c_str(), + cfg.rxPorts.size() > 1 + ? " [multi-interface: slabs stacked bottom -> top]" + : ""); + } + printf("photon map: threshold %.0f ADU, %.1f keV while the gain correction " + "is on (Virtual photon counting panel)%s\n", + static_cast(g_pheneThreshold), + static_cast(PHOTON_THRESHOLD_KEV_DEFAULT), + cfg.dophotonmap ? "" : " [raw ADC map]"); + printf("gate : %s, threshold %.1f, min_pixels %llu%s\n", + cfg.gateEnabled ? "enabled" : "PASSTHROUGH", cfg.threshold, + static_cast(cfg.minPixels), + cfg.contiguous ? ", contiguous" : ""); + printf("pede : %s\n", cfg.pedeFile.c_str()); + printf("threads: analysis workers %d\n", cfg.analysisWorkers); + if (cfg.pubPort > 0) + printf("pub : gated frames republished on port %d\n", cfg.pubPort); + + MainWindow window; + window.show(); + window.start(); + return app.exec(); +} diff --git a/slsDetectorCalibration/jungfrauExecutables/jf_online_display_gui/online_jf_gui.cpp~ b/slsDetectorCalibration/jungfrauExecutables/jf_online_display_gui/online_jf_gui.cpp~ new file mode 100644 index 000000000..8dbdd26c5 --- /dev/null +++ b/slsDetectorCalibration/jungfrauExecutables/jf_online_display_gui/online_jf_gui.cpp~ @@ -0,0 +1,4482 @@ +// SPDX-License-Identifier: LGPL-3.0-or-other +// =========================================================================== +// online_jf_gui.cpp -- Qt5 GUI, fast image widgets, CLI parsing, main(). +// +// Merged from: +// onlinedisp_zmq.cpp (FastImageView, MainWindow, display controls) +// jf_event_finder_gui.cpp (gate parameters, counters, pedestal loading) +// +// The GUI thread never touches ROOT graphics and never touches a frame +// buffer that another thread is writing: frames come from the analysis +// thread through ImageMailbox and are copied into the widgets' own storage. +// =========================================================================== +#include "online_jf.h" + +#include +#include + +#include + +namespace { + +std::sig_atomic_t g_sigCount = 0; + +void handleSigint(int) { + // Async-signal-safe: only count. The Qt timer performs the shutdown + // (blocking joins are not signal-safe). A second Ctrl-C force-quits. + if (++g_sigCount > 1) + std::_Exit(0); +} + +// --------------------------------------------------------------------------- +// The flow chart is drawn with arrow labels placed in the layout between the +// boxes: 1. storage cell -> Pedestal -> 2. signal gate -> Gain -> ROI save. +// A stage that is switched off is hidden, so the arrows that pointed at it +// disappear and the flow reads as the bypass it is. +// --------------------------------------------------------------------------- +// The strip between the two columns. It draws the connectors that cross from +// one column to the other as proper orthogonal arrows with a filled head, so +// the flow reads as one path instead of a few loose glyphs. +// Flow colours. The geometry of the diagram is fixed; only the class of an +// arrow can change (see FlowStrip::setSaveMode), so a bypassed stage is greyed +// as a panel while the data flow stays readable. +enum FlowClass { + FlowNormal = 0, // analysis / display flow + FlowPedestal, // the pedestal path (incl. the tracking feedback) + FlowData, // the chain that ends in the saved file -> orange + FlowOff // a feeder that is bypassed at the moment -> pale +}; +static QString flowColor(int cls) { + switch (cls) { + case FlowPedestal: + return QString("#a8c8e8"); // lighter blue + case FlowData: + return QString("#de7d14"); // orange + case FlowOff: + return QString("#c9c9c9"); // bypassed: drawn, but not carrying data + case FlowNormal: + default: + return QString("#5b9bd5"); // light blue + } +} + +class FlowStrip : public QWidget { + public: + explicit FlowStrip(QWidget *parent) : QWidget(parent) { + setMinimumWidth(64); + setToolTip( + "Data flow. Orange: everything the saved data travels through -\n" + "frames: storage cell -> Pedestal -> Gain -> ROI -> Save, photon\n" + "maps: ... -> Gain -> counting -> (ROI ->) Save (the maps always\n" + "use the pedestal). The ROI is fed by the Gain for frames and by\n" + "the counting for the maps, always in orange: it only exists for\n" + "the file. Light blue: the branches that only feed the display.\n" + "Lighter blue: the pedestal tracking pair. The display can use the\n" + "pedestal while the file does not (or the other way round), which is\n" + "why both feeders into the gate funnel can be drawn at once."); + // Fixed width for the strip, Preferred (not Expanding) height: an + // Expanding vertical policy made the whole column row as tall as the + // window, which left a large empty band above the save panel. + setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Preferred); + } + // The endpoints are computed by MainWindow::layoutFlow() (main thread, + // layout settled) and handed over as plain coordinates in this widget's + // space, so painting never has to walk the widget tree. + static const int kFunnelX = 24; // where the flow passes the gate + + struct Path { + int yFrom = 0, yTo = 0; + int dir = 1; // +1 left->right, -1 right->left, +2 right rail (Gain->ROI) + bool on = true; + int cls = FlowNormal; + int x = 0; // 0: default jog, else the vertical runs here + bool head = true; // false: the line merges into a junction + bool startAtJog = false; // begin on the vertical, not at an edge + }; + // Everything that depends on the stage states: which feeder carries the + // data (pedestal or the raw bypass), which branch feeds the file, and + // whether the gate funnel is active. Geometry never moves. + // `displayPede`: the display chain uses the pedestal (the Pede/Raw toggle). + // `savePede`: the data being written does (Pedestal corrected, or photon + // maps, which need g0). They can differ - the usual case is a corrected + // display with raw frames going to the file - so the two feeders into the + // funnel can be live at the same time, and their colour says what each one + // carries: orange for the file, light blue for the display. + void setStages(bool displayPede, bool savePede, bool gateOn, + bool photonMaps) { + const bool pedeUsed = displayPede || savePede; + // A route that carries nothing is not drawn at all (grey was more + // confusing than helpful). + p1_.on = pedeUsed; // storage cell -> Pedestal + p2_.on = pedeUsed; // Pedestal -> funnel + p8_.on = !savePede; // storage cell -> funnel: the raw save route + const int pedeCls = savePede ? FlowData : FlowNormal; + p1_.cls = pedeCls; // storage cell -> Pedestal + p2_.cls = pedeCls; // Pedestal -> funnel + p3_.cls = FlowData; // funnel -> Gain: always on the route to the file + p8_.cls = FlowData; // storage cell -> funnel (raw save) + // The ROI only exists for the file, so its input is always orange - and + // it comes from whichever stage produces the saved product: the Gain + // for frames, the counting for the maps. + p4_.cls = FlowData; // Gain -> ROI + p4_.on = !photonMaps; + p9_.cls = FlowData; // counting -> ROI (the maps are ROI-cropped too) + p9_.on = photonMaps; + p6_.cls = photonMaps ? FlowData : FlowNormal; // Gain -> counting + funOn_ = gateOn; + update(); + } + void setPaths(const Path &a, const Path &b, const Path &c, const Path &d, + const Path &e, const Path &f, const Path &g, const Path &h, + const Path &i, int funnelY) { + p1_ = a; + p2_ = b; + p3_ = c; + p4_ = d; + p5_ = e; + p6_ = f; + p7_ = g; + p8_ = h; + p9_ = i; + funY_ = funnelY; + update(); + } + + protected: + void paintEvent(QPaintEvent *) override { + QPainter p(this); + p.setRenderHint(QPainter::Antialiasing, true); + cross(p, p1_); // 1. storage cell -> Pedestal + cross(p, p2_); // Pedestal -> 2. signal gate + cross(p, p3_); // 2. signal gate -> Gain + cross(p, p4_); // Gain -> ROI, down the right-hand rail + cross(p, p5_); // 2. signal gate -> Pedestal tracking (dropped frames) + cross(p, p6_); // Gain -> Virtual photon counting (calibration) + cross(p, p7_); // Virtual photon counting -> Display (the map) + cross(p, p8_); // storage cell -> funnel: the raw (no-pede) bypass + cross(p, p9_); // Virtual photon counting -> ROI (maps) + drawFunnel(p); // the signal gate, drawn as the filter it is + } + + private: + Path p1_, p2_, p3_, p4_, p5_, p6_, p7_, p8_, p9_; + int funY_ = -1; + bool funOn_ = true; + + // The signal gate does not change the data, it only decides which frames + // travel on: it is drawn as a funnel on the line, with a short blue arrow + // from the gate panel into its side (the gate is what "gates"). With the + // gate switched off the symbol greys out instead of disappearing. + void drawFunnel(QPainter &p) { + if (funY_ < 0) + return; + const QColor c(flowColor(funOn_ ? FlowNormal : FlowOff)); + QPen pen(c); + pen.setWidth(2); + p.setPen(pen); + const int hw = 10, hh = 18; + QPolygon f; + f << QPoint(kFunnelX - hw, funY_ - hh / 2) + << QPoint(kFunnelX + hw, funY_ - hh / 2) + << QPoint(kFunnelX + hw / 3, funY_ + hh / 2) + << QPoint(kFunnelX - hw / 3, funY_ + hh / 2); + p.setBrush(Qt::NoBrush); + p.drawPolygon(f); + // the gate controls the funnel: arrow from the panel into its side + const int tipX = kFunnelX - hw / 3 - 1; + const int fromX = kFunnelX - hw - 14; + p.drawLine(fromX, funY_, tipX, funY_); + QPolygon head; + const int s = 6; + head << QPoint(tipX, funY_) << QPoint(tipX - s, funY_ - s) + << QPoint(tipX - s, funY_ + s); + p.setBrush(c); + p.drawPolygon(head); + p.setBrush(Qt::NoBrush); + } + + // dir = +1 : left edge -> right edge (head on the right) + // dir = -1 : right edge -> left edge (head on the left) + void cross(QPainter &p, const Path &l) { + if (!l.on) + return; + const int yFrom = l.yFrom, yTo = l.yTo, dir = l.dir; + const int w = width(); + QPen pen(QColor(flowColor(l.cls))); + pen.setWidth(2); + p.setPen(pen); + // The vertical part of each connector is put near the edge it ends on, + // and never in the middle: otherwise the three connectors line up into + // one long vertical that looks like it crosses the arrows. + const int jog = (l.x > 0) ? l.x : ((dir > 0) ? (w - 14) : 14); + QPolygon pts; + if (dir == 2) { // both ends on the right: a rail beside the panels + pts << QPoint(w, yFrom) << QPoint(w - 10, yFrom) + << QPoint(w - 10, yTo) << QPoint(w - 2, yTo); + p.drawPolyline(pts); + const QPoint tip(w - 1, yTo); + const int s2 = 7; + QPolygon head; + head << tip << QPoint(tip.x() - s2, tip.y() - s2) + << QPoint(tip.x() - s2, tip.y() + s2); + p.setBrush(p.pen().color()); + p.drawPolygon(head); + p.setBrush(Qt::NoBrush); + return; + } + if (dir > 0) { + if (!l.startAtJog) + pts << QPoint(0, yFrom); + pts << QPoint(jog, yFrom) << QPoint(jog, yTo); + if (l.head) + pts << QPoint(w - 8, yTo); + } else { + if (!l.startAtJog) + pts << QPoint(w, yFrom); + pts << QPoint(jog, yFrom) << QPoint(jog, yTo); + if (l.head) + pts << QPoint(8, yTo); + } + p.drawPolyline(pts); + if (!l.head) + return; // merged into the junction (the funnel) + // filled head at the target end + const QPoint tip = (dir > 0) ? QPoint(w - 1, yTo) : QPoint(1, yTo); + QPolygon head; + const int s = 7; + head << tip << QPoint(tip.x() - dir * s, tip.y() - s) + << QPoint(tip.x() - dir * s, tip.y() + s); + p.setBrush(p.pen().color()); + p.drawPolygon(head); + p.setBrush(Qt::NoBrush); + } +}; + +// Greys a stage box (title and contents) without disabling it, so a bypassed +// stage still works the moment it is switched on again. The widgets in +// 'keepActive' keep their normal text colour: they are the stage's own on/off +// control, and a bypassed stage must still look switchable (everything stays +// clickable either way - this is a look, not an enablement). +void greyStage(QGroupBox *g, bool grey, + std::initializer_list keepActive = {}) { + if (!g) + return; + // grey text plus a tinted background, so a bypassed stage is obvious + static const char *kGrey = + "QGroupBox { color: #9a9a9a; background-color: #ececec; }" + "QGroupBox::title { color: #9a9a9a; }" + "QGroupBox QLabel { color: #9a9a9a; }" + "QGroupBox QPushButton { color: #9a9a9a; }" + "QGroupBox QCheckBox { color: #9a9a9a; }"; + // only restyle on a change, so the panel never flickers + const QVariant was = g->property("flowGrey"); + if (!(was.isValid() && was.toBool() == grey)) { + g->setProperty("flowGrey", grey); + g->setStyleSheet(grey ? kGrey : QString()); + } + for (QWidget *w : keepActive) { + if (!w) + continue; + const QVariant wWas = w->property("flowKeep"); + if (wWas.isValid() && wWas.toBool() == grey) + continue; // only restyle on a change, so nothing flickers + w->setProperty("flowKeep", grey); + // a per-widget rule wins over the group's, so the toggle stays readable + w->setStyleSheet(grey ? "color: #000000;" : QString()); + } +} + +QLabel *makeFlowArrow(const QString &glyph, QWidget *parent, + int cls = FlowNormal) { + auto *l = new QLabel(glyph, parent); + l->setAlignment(Qt::AlignCenter); + l->setStyleSheet(QString("color: %1; font-size: 20px; font-weight: bold;") + .arg(flowColor(cls))); + l->setFixedHeight(24); + return l; +} + +// recolours one of those arrows when the save mode changes +void setFlowArrowClass(QLabel *l, int cls) { + if (l) + l->setStyleSheet(QString("color: %1; font-size: 20px; font-weight: " + "bold;") + .arg(flowColor(cls))); +} + +// --------------------------------------------------------------------------- +// FastImageView: the original widget, with its own pixel storage so that the +// analysis thread can never hand it a buffer it is still writing. +// --------------------------------------------------------------------------- +const QRgb *makePalette() { + static QRgb pal[256]; + for (int i = 0; i < 256; i++) { + double v = i / 255.0; + double r, g, b; + if (v < 0.25) { + r = 0; + g = v * 4; + b = 1; + } else if (v < 0.5) { + r = 0; + g = 1; + b = 1 - (v - 0.25) * 4; + } else if (v < 0.75) { + r = (v - 0.5) * 4; + g = 1; + b = 0; + } else { + r = 1; + g = 1 - (v - 0.75) * 4; + b = 0; + } + pal[i] = qRgb(int(r * 255), int(g * 255), int(b * 255)); + } + return pal; +} +const QRgb *kPalette = makePalette(); +const int MARGIN = 5; +const int SCALE_W = 50; + +class FastImageView : public QWidget { + public: + FastImageView(QWidget *parent = nullptr); + + // copies 'data' into widget-owned storage (GUI thread only) + void setImageCopy(const float *data, int nx, int ny); + // replaces the 256-entry colour table (GUI thread only) + void setPaletteLut(const QRgb *lut); + // draw pixels with no counts (value <= 0) white instead of the palette's + // lowest colour, the way ROOT's colz draws empty cells on a white canvas. + // Used by the photon map only; the ADC/gain images keep the full palette. + void setZeroWhite(bool on) { + m_zeroWhite = on; + m_dirty = true; + update(); + } + bool hasImage() const { return m_nx > 0 && m_ny > 0; } + void viewport(double &x, double &y, double &w, double &h) const { + x = m_vpX; + y = m_vpY; + w = vpW(); + h = vpH(); + } + int imageWidth() const { return m_nx; } + int imageHeight() const { return m_ny; } + // Thin yellow rectangle drawn over the image, in DATA coordinates (data + // row 0 is displayed at the bottom, so the view flips it here). Used to + // show the gate ROI, which is a snapshot and does not follow the zoom. + void setOverlayRect(double x0, double y0, double x1, double y1, bool on) { + m_ovX0 = x0; + m_ovY0 = y0; + m_ovX1 = x1; + m_ovY1 = y1; + m_ovOn = on; + update(); + } + + // Red receiver-ROI box, in the same DATA coordinates as the gate ROI. + void setReceiverRoiRect(double x0, double y0, double x1, double y1, + bool on) { + m_rxX0 = x0; + m_rxY0 = y0; + m_rxX1 = x1; + m_rxY1 = y1; + m_rxOn = on; + update(); + } + + void setColorRange(double lo, double hi); + // Horizontal size of one image pixel relative to its height (1 = square). + // Used by the strixel panels, whose mapped pixels are 9, 25 and 16 times + // wider than tall (group pitch X = 75*(75/Y), Y = 25/15/18.75 um). + void setPixelAspectX(double a) { + m_pixelAspectX = (a > 0.0) ? a : 1.0; + update(); + } + // the colour scale currently in use (also draggable on the colour bar) + void colorRange(double &lo, double &hi) const { + lo = m_clo; + hi = m_chi; + } + void setViewport(double x1, double y1, double x2, double y2); + void resetView(); + std::function onZoomChanged; + + protected: + void paintEvent(QPaintEvent *event) override; + void mousePressEvent(QMouseEvent *event) override; + void mouseMoveEvent(QMouseEvent *event) override; + void mouseReleaseEvent(QMouseEvent *event) override; + void wheelEvent(QWheelEvent *event) override; + void mouseDoubleClickEvent(QMouseEvent *event) override; + void resizeEvent(QResizeEvent *event) override; + + private: + void renderImage(); + void clampViewport(); + // makes the visible region the same shape as the image area of the widget + void matchViewportToWindow(); + double vpW() const { return (m_vpW < 0) ? m_nx : m_vpW; } + double vpH() const { return (m_vpH < 0) ? m_ny : m_vpH; } + QRect imageRect() const; + QRect scaleRect() const; + double valueAt(const QPoint &pos) const; + QPointF widgetToImage(QPoint wpos) const; + + std::vector m_owned; // widget-owned copy of the last frame + const float *m_data = nullptr; + int m_nx = 0, m_ny = 0; + QImage m_image; + bool m_dirty = true; + QRgb m_palette[256]; + + double m_clo = 0, m_chi = 4000; + double m_defClo = 0, m_defChi = 4000; + bool m_zeroWhite = false; // photon map: no counts -> white + double m_pixelAspectX = 1.0; // >1: pixels wider than tall + double m_vpX = 0, m_vpY = 0; + double m_vpW = -1, m_vpH = -1; + + // gate ROI overlay (data coordinates) + bool m_ovOn = false; + double m_ovX0 = 0, m_ovY0 = 0, m_ovX1 = 0, m_ovY1 = 0; + + // receiver ROI overlay (RED), same data coordinates + bool m_rxOn = false; + double m_rxX0 = 0, m_rxY0 = 0, m_rxX1 = 0, m_rxY1 = 0; + + bool m_dragging = false; + QPoint m_lastPos; + double m_dragVpX, m_dragVpY; + mutable QTransform m_widgetToImg; + bool m_dragScale = false; + bool m_dragMax = false; // true = dragging max, false = dragging min + int m_dragScaleY = 0; + double m_dragClo, m_dragChi; +}; + +FastImageView::FastImageView(QWidget *parent) : QWidget(parent) { + setMouseTracking(true); + setFocusPolicy(Qt::StrongFocus); + setMinimumSize(200, 200); + m_chi = 4000; + m_defChi = 4000; + m_clo = 0; + m_defClo = 0; + for (int i = 0; i < 256; i++) + m_palette[i] = kPalette[i]; +} + +void FastImageView::setImageCopy(const float *data, int nx, int ny) { + if (!data || nx <= 0 || ny <= 0) + return; + const size_t n = static_cast(nx) * static_cast(ny); + if (m_owned.size() != n) + m_owned.resize(n); + memcpy(m_owned.data(), data, n * sizeof(float)); + m_data = m_owned.data(); + m_nx = nx; + m_ny = ny; + m_dirty = true; + if (m_vpW < 0) + m_vpW = nx; + if (m_vpH < 0) + m_vpH = ny; + update(); +} + +void FastImageView::setPaletteLut(const QRgb *lut) { + if (!lut) + return; + for (int i = 0; i < 256; i++) + m_palette[i] = lut[i]; + m_dirty = true; + update(); +} + +void FastImageView::setColorRange(double lo, double hi) { + m_clo = lo; + m_chi = hi; + m_defClo = lo; + m_defChi = hi; + m_dirty = true; + update(); +} + +void FastImageView::setViewport(double x1, double y1, double x2, double y2) { + if (x2 - x1 < 2 || y2 - y1 < 2) + return; + m_vpX = x1; + m_vpY = y1; + m_vpW = x2 - x1; + m_vpH = y2 - y1; + update(); +} + +void FastImageView::resetView() { + if (!hasImage()) + return; // nothing to reset yet (and (0,0,0,0) would collapse the map) + m_vpX = 0; + m_vpY = 0; + m_vpW = m_nx; + m_vpH = m_ny; + if (onZoomChanged) + onZoomChanged(0, 0, m_nx, m_ny); + update(); +} + +QRect FastImageView::imageRect() const { + int imgW = width() - 2 * MARGIN - SCALE_W; + int imgH = height() - 2 * MARGIN; + if (imgW < 10) + imgW = 10; + if (imgH < 10) + imgH = 10; + return QRect(MARGIN, MARGIN, imgW, imgH); +} + +QRect FastImageView::scaleRect() const { + QRect ir = imageRect(); + return QRect(ir.right() + 4, ir.top(), SCALE_W - 4, ir.height()); +} + +// keeps the viewport inside the image; used after pan, zoom and resize +void FastImageView::clampViewport() { + if (!hasImage()) + return; + if (m_vpW > m_nx) + m_vpW = m_nx; + if (m_vpH > m_ny) + m_vpH = m_ny; + if (m_vpX < 0) + m_vpX = 0; + if (m_vpX + vpW() > m_nx) + m_vpX = m_nx - vpW(); + if (m_vpY < 0) + m_vpY = 0; + if (m_vpY + vpH() > m_ny) + m_vpY = m_ny - vpH(); +} + +// The ADC window is the tool that selects the gate ROI, so the region it +// shows takes the shape of the window: make the window tall and "ROI only" +// captures a narrow, tall region. The shorter side is grown so that nothing +// the operator was looking at disappears; the whole-frame view is left alone +// (it is letterboxed on purpose) so that it still captures the full sensor. +void FastImageView::matchViewportToWindow() { + if (!hasImage()) + return; + if (m_vpW >= m_nx - 0.5 && m_vpH >= m_ny - 0.5) + return; // whole frame: keep it, whatever the window shape + QRect ir = imageRect(); + if (ir.width() <= 0 || ir.height() <= 0) + return; + // shape the viewport so the physical pixels (m_pixelAspectX) fill the + // window with the same shape, not the square-pixel shape + const double ar = double(ir.width()) / double(ir.height()) / m_pixelAspectX; + double w = vpW(), h = vpH(); + if (w / h > ar) + h = w / ar; // too wide -> grow vertically + else + w = h * ar; // too tall -> grow horizontally + if (w > m_nx) { // grown past the sensor: shrink both, keep the shape + h *= m_nx / w; + w = m_nx; + } + if (h > m_ny) { + w *= m_ny / h; + h = m_ny; + } + const double cx = m_vpX + vpW() / 2, cy = m_vpY + vpH() / 2; + m_vpW = w; + m_vpH = h; + m_vpX = cx - w / 2; + m_vpY = cy - h / 2; + clampViewport(); + if (onZoomChanged) + onZoomChanged(m_vpX, m_vpY, m_vpX + vpW(), m_vpY + vpH()); +} + +void FastImageView::resizeEvent(QResizeEvent *) { + matchViewportToWindow(); + update(); +} + +void FastImageView::renderImage() { if (!m_data || m_nx <= 0 || m_ny <= 0) + return; + if (m_image.size() != QSize(m_nx, m_ny)) + m_image = QImage(m_nx, m_ny, QImage::Format_ARGB32); + double range = (m_chi > m_clo) ? (m_chi - m_clo) : 1.0; + static const QRgb kWhite = qRgb(255, 255, 255); + for (int p = 0; p < m_nx * m_ny; p++) { + double v = m_data[p]; + if (m_zeroWhite && !(v > 0.0)) { + // empty cell: white background, as the ROOT colz plot showed it + m_image.setPixel(p % m_nx, m_ny - 1 - p / m_nx, kWhite); + continue; + } + int idx = int((v - m_clo) / range * 255); + if (idx < 0) + idx = 0; + if (idx > 255) + idx = 255; + int x = p % m_nx, y = p / m_nx; + m_image.setPixel(x, m_ny - 1 - y, m_palette[idx]); + } + m_dirty = false; +} + +void FastImageView::paintEvent(QPaintEvent *) { + if (m_dirty) + renderImage(); + QPainter p(this); + p.fillRect(rect(), Qt::black); + if (!m_data || m_nx <= 0 || m_ny <= 0) + return; + + QRect ir = imageRect(); + // Pixel aspect: a value > 1 makes each image pixel that many times wider + // than tall (the strixel groups have rectangular pixels), so the fit is + // computed in physical units and the image is scaled non-uniformly. + double sx = 0.0, sy = 0.0; + if (m_pixelAspectX != 1.0) { + const double fitY = double(ir.height()) / vpH(); + const double fitX = double(ir.width()) / (vpW() * m_pixelAspectX); + sy = (fitY < fitX) ? fitY : fitX; + sx = sy * m_pixelAspectX; + } else { + const double fitX = double(ir.width()) / vpW(); + const double fitY = double(ir.height()) / vpH(); + sx = sy = (fitX < fitY) ? fitX : fitY; + } + + p.save(); + p.translate(ir.left(), ir.top()); + p.translate((ir.width() - vpW() * sx) * 0.5, + (ir.height() - vpH() * sy) * 0.5); + p.translate(-m_vpX * sx, -m_vpY * sy); + p.scale(sx, sy); + const QTransform imgToWidget = p.combinedTransform(); + m_widgetToImg = imgToWidget.inverted(); + p.drawImage(QPoint(0, 0), m_image); + p.restore(); + + // gate ROI overlay: convert data rows (row 0 = bottom) to display space + if (m_ovOn && m_ovX1 > m_ovX0 && m_ovY1 > m_ovY0) { + const double dx = m_ovX0; + const double dy = double(m_ny) - m_ovY1; + const double dw = m_ovX1 - m_ovX0; + const double dh = m_ovY1 - m_ovY0; + const QRectF r = imgToWidget.mapRect(QRectF(dx, dy, dw, dh)); + QPen pen(Qt::yellow); + pen.setWidth(1); + pen.setCosmetic(true); + p.setPen(pen); + p.setBrush(Qt::NoBrush); + p.drawRect(r); + } + + // receiver ROI overlay (RED), from the "rx_roi" field of the stream + // header. The ADC image is the raw layout, so this is a plain rectangle. + if (m_rxOn && m_rxX1 > m_rxX0 && m_rxY1 > m_rxY0) { + QPen pen(Qt::red); + pen.setWidth(1); + pen.setCosmetic(true); + p.setPen(pen); + p.setBrush(Qt::NoBrush); + const double dx = m_rxX0; + const double dy = double(m_ny) - m_rxY1; + const double dw = m_rxX1 - m_rxX0; + const double dh = m_rxY1 - m_rxY0; + p.drawRect(imgToWidget.mapRect(QRectF(dx, dy, dw, dh))); + } + + // Color scale + QRect sr = scaleRect(); + for (int yy = sr.top(); yy <= sr.bottom(); yy++) { + double frac = 1.0 - double(yy - sr.top()) / sr.height(); + int idx = int(frac * 255); + if (idx < 0) + idx = 0; + if (idx > 255) + idx = 255; + p.setPen(m_palette[idx]); + p.drawLine(sr.left(), yy, sr.right(), yy); + } + p.setPen(Qt::white); + p.drawRect(sr.adjusted(-1, -1, 1, 1)); + QFont f = p.font(); + f.setPixelSize(10); + p.setFont(f); + p.drawText(sr.left(), sr.top() + 1, sr.width(), 12, Qt::AlignCenter, + QString::number(m_chi, 'f', 0)); + p.drawText(sr.left(), sr.bottom() - 11, sr.width(), 12, Qt::AlignCenter, + QString::number(m_clo, 'f', 0)); +} + +void FastImageView::mousePressEvent(QMouseEvent *e) { + if (e->button() != Qt::LeftButton) + return; + QPoint ip = e->pos(); + QRect sr = scaleRect(); + if (sr.contains(ip)) { + m_dragScale = true; + m_dragScaleY = ip.y(); + m_dragClo = m_clo; + m_dragChi = m_chi; + m_dragMax = (ip.y() < sr.top() + sr.height() / 2); + setCursor(Qt::SizeVerCursor); + return; + } + m_dragging = true; + m_lastPos = ip; + m_dragVpX = m_vpX; + m_dragVpY = m_vpY; + setCursor(Qt::ClosedHandCursor); +} + +void FastImageView::mouseMoveEvent(QMouseEvent *e) { + if (m_dragScale) { + QRect sr = scaleRect(); + double delta = double(e->y() - m_dragScaleY) / double(sr.height()) * + (m_dragChi - m_dragClo); + if (m_dragMax) { + m_chi = m_dragChi - delta; + if (m_chi < m_clo + 1) + m_chi = m_clo + 1; + } else { + m_clo = m_dragClo - delta; + if (m_clo > m_chi - 1) + m_clo = m_chi - 1; + } + m_dirty = true; + update(); + return; + } + if (!m_dragging) { + QPoint hp = e->pos(); + QRect ir2 = imageRect(); + QRect sr = scaleRect(); + if (sr.contains(hp)) { + setCursor(Qt::SizeVerCursor); + double v = valueAt(hp); + setToolTip(QString("Scale: %1").arg(v, 0, 'f', 0)); + } else if (ir2.contains(hp)) { + setCursor(Qt::OpenHandCursor); + // widgetToImage() is in QImage space (row 0 = TOP); the reported + // pixel and the value are converted to DATA rows so that the + // numbering matches the ROOT plots and the ROI list: (0,0) is the + // bottom-left pixel everywhere. + QPointF ipt = widgetToImage(hp); + const int ix = int(ipt.x()); + const int dy = int(ipt.y()); + const int iy = m_ny - 1 - dy; + if (ix >= 0 && ix < m_nx && iy >= 0 && iy < m_ny) + setToolTip(QString("(x=%1, y=%2) = %3") + .arg(ix) + .arg(iy) + .arg(m_data[ix + iy * m_nx], 0, 'f', 1)); + } else { + setCursor(Qt::ArrowCursor); + setToolTip(QString()); + } + return; + } + QPointF now = widgetToImage(e->pos()); + QPointF then = widgetToImage(m_lastPos); + m_vpX = m_dragVpX - (now.x() - then.x()); + m_vpY = m_dragVpY - (now.y() - then.y()); + clampViewport(); + update(); + // follow live: the gain view and the photon map pan with the ADC view + if (onZoomChanged) + onZoomChanged(m_vpX, m_vpY, m_vpX + vpW(), m_vpY + vpH()); +} + +void FastImageView::mouseReleaseEvent(QMouseEvent *e) { + if (e->button() == Qt::LeftButton) { + if (m_dragging && onZoomChanged) + onZoomChanged(m_vpX, m_vpY, m_vpX + vpW(), m_vpY + vpH()); + m_dragging = false; + m_dragScale = false; + setCursor(Qt::ArrowCursor); + } +} + +void FastImageView::wheelEvent(QWheelEvent *e) { + if (!m_data || m_nx <= 0 || m_ny <= 0) + return; + QPointF imgPt = widgetToImage(e->pos()); + double mx = imgPt.x(), my = imgPt.y(); + + double factor = (e->angleDelta().y() > 0) ? 1.0 / 1.18 : 1.18; + double nw = vpW() * factor, nh = vpH() * factor; + if (nw < 8) + nw = 8; + if (nh < 8) + nh = 8; + if (nw > m_nx) + nw = m_nx; + if (nh > m_ny) + nh = m_ny; + + double fracX = (mx - m_vpX) / vpW(); + double fracY = (my - m_vpY) / vpH(); + m_vpX = mx - fracX * nw; + m_vpY = my - fracY * nh; + m_vpW = nw; + m_vpH = nh; + if (factor > 1.0) { + // Zooming OUT: do not reshape to the window here. matchViewportToWindow + // grows/shrinks to the window aspect, so the image dimension that hits + // its limit first froze the other one and the whole frame could never + // be shown. Let both grow to the image bounds; the window-shape rule + // still applies while zooming IN and on resize. + clampViewport(); + } else { + // keep the visible region the same shape as the window also while + // zooming, so that the captured ROI has the shape of the window + matchViewportToWindow(); + } + + if (onZoomChanged) + onZoomChanged(m_vpX, m_vpY, m_vpX + vpW(), m_vpY + vpH()); + setToolTip(QString("Zoom: %1%").arg(int(100.0 * m_nx / vpW()))); + update(); +} + +void FastImageView::mouseDoubleClickEvent(QMouseEvent *e) { + QRect sr = scaleRect(); + if (sr.contains(e->pos())) { + m_clo = m_defClo; + m_chi = m_defChi; + m_dirty = true; + update(); + } else { + resetView(); + } +} + +double FastImageView::valueAt(const QPoint &pos) const { + QRect sr = scaleRect(); + if (!sr.contains(pos)) + return m_clo - 1; + double frac = 1.0 - double(pos.y() - sr.top()) / sr.height(); + return m_clo + frac * (m_chi - m_clo); +} + +QPointF FastImageView::widgetToImage(QPoint wpos) const { + return m_widgetToImg.map(QPointF(wpos)); +} + +QLabel *makeValueLabel(const QString &text, QWidget *parent) { + QLabel *label = new QLabel(text, parent); + label->setTextInteractionFlags(Qt::TextSelectableByMouse); + return label; +} + +} // namespace + +// --------------------------------------------------------------------------- +// MainWindow +// --------------------------------------------------------------------------- +class MainWindow : public QMainWindow { + public: + MainWindow(); + ~MainWindow() override; + void start(); + void stop(); + protected: + void closeEvent(QCloseEvent *event) override; + + private: + void setupUI(); + void connectShortcuts(); + + // periodic GUI work + void processImages(); // every 30 ms: mailbox -> widgets + void updateReceiverRoiOverlay(); // red rx_roi box on the ADC image + void updateStatus(); // every 500 ms: counters / labels + void checkSignals(); // every 200 ms: Ctrl-C shutdown + + // shared actions (buttons + keyboard shortcuts) + void toggleStartPause(); + void faster(); + void slower(); + void toggleGain(); + void setApplyGain(bool on); + void zoomTo(double x1, double y1, double x2, double y2); + void bwPalette1(); + void bwPalette2(); + void colPal(); + void toggleGateRoi(bool on); + void saveRoi(); + void loadRoiDialog(); + // applies a gate ROI directly (no capture from the ADC view) + // restrict == true (command line) also turns "ROI only" on; picking an + // entry from the list only makes it the current ROI + void applyRoi(int x, int y, int w, int h, const QString &src, + bool restrict = false); + void resetHis(); + void resetAxis(); + void toggleRoiSave(bool on); + void browseSaveDir(); + void saveDestDialog(); + void updateSaveLabel(); + void acquirePede(); + void savePede(); + void readPede(); + void loadAllPede(); + void loadGainMap(); + // lines up the boxes of the flow chart (gates on the left, Pedestal/Gain + // on the right) and repaints the arrows + void layoutFlow(); + void updateFlow(); + void updateGainMapLabel(); + void updateRoiLabel(); + void captureRoi(); // select the ADC zoom as the current ROI + void resizeEvent(QResizeEvent *event) override; + void showEvent(QShowEvent *event) override; + void showRangeDialog(); + void showRateDialog(); + void unsetRoi(); // forget the current ROI (full frame again) + // While a run writes, the settings that would change what lands in the file + // are locked (display-only controls stay live). + void applySaveLock(bool saving); + // Gate criterion changes stay possible during a run, but they ask first and + // leave a note in the JSON of the file being written. + bool confirmGateChangeDuringRun(const QString &what); + void quitApp(); + void closeSideWindows(); // the ADC / gain / photon / panel windows + // what the flow diagram has to show (see FlowStrip::setStages) + void flowStageStates(bool &displayPede, bool &savePede, bool &gateOn, + bool &pmap) const; + // asked before quitting; returns false when the operator cancels + bool confirmQuit(); + + void updateDrawLabel(); + void setRanges(int amin, int amax, int pmin, int pmax, int cmin, int cmax); + // current on-screen ranges (read from the displayed histograms) + void liveAdcImageRange(int &lo, int &hi) const; + void liveMapRange(int &lo, int &hi) const; + void liveChipRange(int &lo, int &hi) const; + + Pipeline pipeline_; + QWidget *leftPad_ = nullptr, *pedePad_ = nullptr, *gainPad_ = nullptr; + // leftPad, pedePad, gainPad, gatePad - kept between solving passes + int flowPads_[4] = {0, 0, 0, 24}; + int flowPass_ = 0; + bool flowQueued_ = false; + QVBoxLayout *midCol_ = nullptr, *leftCol_ = nullptr, *rightCol_ = nullptr; + QWidget *midSpacer_ = nullptr; + FlowStrip *strip_ = nullptr; + QWidget *gatePad_ = nullptr; // alignment gap between the two gates + QLabel *arrGainDown_ = nullptr; + QLabel *arrRoiDown_ = nullptr; + QLabel *arrTrackUp_ = nullptr; + QGroupBox *scGroup_ = nullptr, *sigGroup_ = nullptr; + QGroupBox *displayGroup_ = nullptr, *saveGroup_ = nullptr; + QGroupBox *pedeGroup_ = nullptr, *gainGroup_ = nullptr; + QGroupBox *pmapGroup_ = nullptr; // virtual photon counting (needs a pede) + QCheckBox *gainStateChk_ = nullptr; // read-only "gain corrected" indicator + + QTimer *processTimer = nullptr; + QTimer *statusTimer = nullptr; + QTimer *sigTimer = nullptr; + + QLabel *frameLabel = nullptr; + QLabel *statusLabel = nullptr; + QLabel *drawLabel = nullptr; + QLabel *streamVal_ = nullptr; + QLabel *pedeVal_ = nullptr; + QLabel *errVal_ = nullptr; + QLabel *framesInCumVal_ = nullptr; + QLabel *framesInCurVal_ = nullptr; + QLabel *framesPassCumVal_ = nullptr; + QLabel *framesPassCurVal_ = nullptr; + QLabel *framesDropCumVal_ = nullptr; + QLabel *framesDropCurVal_ = nullptr; + QLabel *pixelsAboveCumVal_ = nullptr; + QLabel *pixelsAboveCurVal_ = nullptr; + QLabel *rateInVal_ = nullptr; + QLabel *ratePassVal_ = nullptr; + QLabel *dropFracVal_ = nullptr; + QLabel *displayDropVal_ = nullptr; + QLabel *alignVal_ = nullptr; + QLabel *gateRoiVal_ = nullptr; + QSpinBox *saveFrames_ = nullptr; + QCheckBox *saveCorrected_ = nullptr; + QRadioButton *saveModeFrames_ = nullptr; + QRadioButton *saveModePhoton_ = nullptr; + QSpinBox *pmapSaveSpin_ = nullptr; + QLabel *saveBudgetLabel_ = nullptr; + QLineEdit *saveDirEdit_ = nullptr; + // the destination as it was at start-up: that pair is the default, and the + // "previous destinations" list must not collect it on every run + QString saveDefaultDir_, saveDefaultBase_; + QLineEdit *saveBaseEdit_ = nullptr; + QPushButton *btnSaveDest_ = nullptr; + QPushButton *btnSaveStart = nullptr; + QLabel *saveVal_ = nullptr; + bool m_saveWasRunning = false; + + QCheckBox *gateChk_ = nullptr; + QLabel *thrLabel_ = nullptr; // says whether the gate threshold is on raw ADC + QCheckBox *contigChk_ = nullptr; + QDoubleSpinBox *thrSpin_ = nullptr; + QSpinBox *minPixSpin_ = nullptr; + QPushButton *btnGateRoi = nullptr; + QComboBox *scCombo_ = nullptr; + QLabel *scLastVal_ = nullptr; + QLabel *scDropCumVal_ = nullptr; + QLabel *scDropCurVal_ = nullptr; + QPushButton *btnSaveRoi = nullptr; + QPushButton *btnLoadRoi = nullptr; + QPushButton *btnSelectRoi_ = nullptr; + QPushButton *btnUnsetRoi_ = nullptr; + QGroupBox *roiGroup_ = nullptr; + QLabel *roiListVal_ = nullptr; + bool m_applyingRoi = false; // guards toggleGateRoi() during applyRoi() + + QPushButton *btnStartPause = nullptr; + QPushButton *btnFaster = nullptr; + QPushButton *btnSlower = nullptr; + QPushButton *btnGainToggle = nullptr; + QPushButton *btnBWPalette = nullptr; + QPushButton *btnBWPalette2 = nullptr; + QPushButton *btnLoadPede = nullptr; + QPushButton *btnSavePede = nullptr; + QPushButton *btnReadPede = nullptr; + QPushButton *btnLoadAllPede = nullptr; + QPushButton *btnGainMap = nullptr; + QCheckBox *kevChk_ = nullptr; + QPushButton *btnNoPede_ = nullptr; + QPushButton *btnPedeTrack_ = nullptr; + QLabel *pedeTrackVal_ = nullptr; + QGroupBox *pedeTrackGroup_ = nullptr; + QLabel *noPedeVal_ = nullptr; + QLabel *gainMapVal_ = nullptr; + QPushButton *btnResetHis = nullptr; + QPushButton *btnResetAxis = nullptr; + QPushButton *btnQuit = nullptr; + QPushButton *btnSetRanges = nullptr; + QPushButton *btnRates = nullptr; + QDoubleSpinBox *photonThrSpin_ = nullptr; // ADU, or keV with gain on + QLabel *photonThrLabel_ = nullptr; + QPushButton *btnColPal = nullptr; + QPushButton *btnResetCounters = nullptr; + + FastImageView *m_adcView = nullptr; + FastImageView *m_gainView = nullptr; + QWidget *m_adcWin = nullptr; + QWidget *m_gainWin = nullptr; + QWidget *m_photonWin = nullptr; + FastImageView *m_photonView = nullptr; + QCheckBox *pmapCumulative_ = nullptr; + QSpinBox *pmapEverySpin_ = nullptr; + uint64_t pmapSeq_ = 0; +#ifdef JFSTRX + // separate strixel window: six group panels, display only (no ROI) + std::array m_adcPanelView{}; + QWidget *m_adcPanelWin = nullptr; +#endif + + // last receiver ROI mirrored onto the ADC image (red box) + bool m_rxRoiShown = false; + int m_rxRoiLast[4] = {-1, -1, -1, -1}; +}; + +MainWindow::MainWindow() : QMainWindow(nullptr) { + setWindowTitle("Online JF Display + Event Finder"); + setMinimumWidth(420); + + setupUI(); + connectShortcuts(); + + goout = 1; + gain_flag = false; + HDraw_every = 20; + // the operator's range defaults (Set Ranges) are in force from the start; + // "Reset Axis" releases them and the axes auto-scale again + fixranges = true; + + initGeometry(); + + hchptr = (short *)malloc(NCH * sizeof(short)); + for (int k = 0; k < NCH; k++) + hchptr[k] = 0; + + cout << "opening the rootapp" << endl; + int argc_copy = 1; + char dummy_name[] = "onlinedisp"; + char *argv_copy[] = {dummy_name, nullptr}; + rootapp = new TApplication("Online JF display", &argc_copy, argv_copy); + + loadRootPalette(Palette::Color); + + char hname[100]; +#ifdef JFSTRX + int nxx = 79; + int nyy = 165; + his1000 = new TH2F("his1000", "2d, chip 1 group 1 (25um) pede corr.", nxx, + -0.5, nxx - 0.5, nyy, -0.5, nyy - 0.5); + his1060 = new TH2F("his1060", "2d, chip 6 group 1 (25um) pede corr.", nxx, + -0.5, nxx - 0.5, nyy, -0.5, nyy - 0.5); + nxx = 47; + nyy = 320; + his1001 = new TH2F("his1001", "2d, chip 1 group 2 (15um) pede corr.", nxx, + -0.5, nxx - 0.5, nyy, -0.5, nyy - 0.5); + his1061 = new TH2F("his1061", "2d, chip 6 group 2 (15um) pede corr.", nxx, + -0.5, nxx - 0.5, nyy, -0.5, nyy - 0.5); + nxx = 59; + nyy = 476; + his1002 = new TH2F("his1002", "2d, chip 1 group 3 (18.75um) pede corr.", nxx, + -0.5, nxx - 0.5, nyy, -0.5, nyy - 0.5); + his1062 = new TH2F("his1062", "2d, chip 6 group 3 (18.75um) pede corr.", nxx, + -0.5, nxx - 0.5, nyy, -0.5, nyy - 0.5); + his1000->SetOption("colz"); + his1001->SetOption("colz"); + his1002->SetOption("colz"); + his1060->SetOption("colz"); + his1061->SetOption("colz"); + his1062->SetOption("colz"); +#else + his1000 = new TH2F("his1000", "2d, ev. pede corrected", nx, -0.5, nx - 0.5, + ny, -0.5, ny - 0.5); + his1000->SetOption("colz"); +#endif + + his2000 = new TH2F("his2000", "2d gain", nx, -0.5, nx - 0.5, ny, -0.5, + ny - 0.5); + his2000->GetZaxis()->SetRangeUser(0, 4); + + // The photon map has no ROOT histogram any more: it is filled in the + // analysis and shown in its own Qt window (see "virtual photon counting"). + + his4500 = new TH2F("his4500", "T vs B", 101, -500, MAX_POS, 101, -500, + MAX_POS); + hisLvsR = new TH2F("hisLvsR", "L vs R", 101, -500, MAX_POS, 101, -500, + MAX_POS); + hchip = new TH1I *[8]; +#ifdef JFSTRX + for (int k = 0; k < 8; k++) { + if (k < 3) + sprintf(hname, "%d_hchip1group%d", k, k + 1); + else if (k > 4) + sprintf(hname, "%d_hchip6group%d", k, k - 4); + else + sprintf(hname, "%d_", k); + hchip[k] = new TH1I(hname, hname, NBIN, MIN_POS, MAX_POS); + } +#else + for (int k = 0; k < 8; k++) { + sprintf(hname, "hchip%d", k); + hchip[k] = new TH1I(hname, hname, NBIN, MIN_POS, MAX_POS); + } +#endif + // ONE spectrum of the gate-ROI pixels (canvas A7): identical binning to + // the chip spectra, summed over the whole selection + hroi = new TH1I("hroi", "hroi", NBIN, MIN_POS, MAX_POS); + // the same two sets again in keV (canvases A8/A9). The axes are the ADU + // axes divided by KEV_NOMINAL_ADU with the same number of bins, so a + // pixel's keV value selects the same bin index as its ADU value and the + // two sets always show the same window. + hchipKev = new TH1I *[8]; + for (int k = 0; k < 8; k++) { + char kn[64]; + sprintf(kn, "hchip%d_keV", k); + hchipKev[k] = new TH1I(kn, kn, NBIN, MIN_POS / KEV_NOMINAL_ADU, + MAX_POS / KEV_NOMINAL_ADU); + } + hroiKev = new TH1I("hroi_keV", "hroi_keV", NBIN, MIN_POS / KEV_NOMINAL_ADU, + MAX_POS / KEV_NOMINAL_ADU); + + cout << "end of histo booking" << endl; +#ifdef JFSTRX + if (A3 == nullptr) { + A3 = new TCanvas("A3", "Plotting Canvas ADC", 150, 360, 1200, 750); + p1 = new TPad("p1", "p1", 0.01, 0.5, 0.49, 1.); + p1->Draw(); + p2 = new TPad("p2", "p2", 0.51, 0.75, 0.99, 0.97); + p2->Draw(); + p3 = new TPad("p3", "p3", 0.01, 0.25, 0.49, 0.47); + p3->Draw(); + p4 = new TPad("p4", "p4", 0.51, 0.53, 0.99, 0.75); + p4->Draw(); + p5 = new TPad("p5", "p5", 0.01, 0.03, 0.49, 0.25); + p5->Draw(); + p6 = new TPad("p6", "p6", 0.51, 0., 0.99, 0.5); + p6->Draw(); + } +#endif + if (A4 == nullptr) + A4 = new TCanvas("A4", "Plotting Canvas PHs", 750, 300, 1000, 800); + A4->Clear(); + A4->Divide(4, 2, 0.005, 0.005); + if (false) // the photon map canvas is gone; keep the pointer unused + A5 = new TCanvas("A5", "Plotting Canvas Photon Map", 750, 300, 1000, + 600); + if (A6 == nullptr) + A6 = new TCanvas("A6", "Plotting Canvas LvsR", 650, 250, 650, 660); + if (A7 == nullptr) + A7 = new TCanvas("A7", "ROI PH", 770, 340, 1000, 700); + A7->Clear(); // one pad: all the gate-ROI pixels in one spectrum + // The keV canvases are NOT created here: a ROOT canvas maps its window in + // the constructor, and these two must stay invisible until a gain map is + // loaded. They are created lazily by the ROOT thread in + // Plot1DHistosKev()/PlotRoiHistosKev() the first time they are needed. + + + // display clones painted by the ROOT thread (sources stay exclusive to + // the analysis thread) + disp4500 = (TH2F *)his4500->Clone("disp4500"); + dispLvsR = (TH2F *)hisLvsR->Clone("dispLvsR"); + for (int ih = 0; ih < 8; ih++) { + char nm[64]; + sprintf(nm, "dispChip%d", ih); + dispChip[ih] = (TH1I *)hchip[ih]->Clone(nm); + } + dispRoi = (TH1I *)hroi->Clone("dispRoi"); + for (int ih = 0; ih < 8; ih++) { + char nm[64]; + sprintf(nm, "dispChipKev%d", ih); + dispChipKev[ih] = (TH1I *)hchipKev[ih]->Clone(nm); + } + dispRoiKev = (TH1I *)hroiKev->Clone("dispRoiKev"); + + // start with the operator's ranges (Set Ranges dialog): the spectra open + // on the PH window, the main plot keeps its value window (fixranges) + for (int ih = 0; ih < 8; ih++) { + if (dispChip[ih]) + dispChip[ih]->GetXaxis()->SetRangeUser(float(chipxmin.load()), + float(chipxmax.load())); + } + if (dispRoi) + dispRoi->GetXaxis()->SetRangeUser(float(chipxmin.load()), + float(chipxmax.load())); + if (dispRoiKev) + dispRoiKev->GetXaxis()->SetRangeUser( + chipxmin.load() / KEV_NOMINAL_ADU, + chipxmax.load() / KEV_NOMINAL_ADU); + for (int ih = 0; ih < 8; ih++) { + if (dispChipKev[ih]) + dispChipKev[ih]->GetXaxis()->SetRangeUser( + chipxmin.load() / KEV_NOMINAL_ADU, + chipxmax.load() / KEV_NOMINAL_ADU); + } + // the photon window opens on the photon-map colour range (the ADC image + // was given the ADC range in setupUI()) + if (m_photonView) + m_photonView->setColorRange(pmmin.load(), pmmax.load()); +#ifdef JFSTRX + disp1000 = (TH2F *)his1000->Clone("disp1000"); + disp1001 = (TH2F *)his1001->Clone("disp1001"); + disp1002 = (TH2F *)his1002->Clone("disp1002"); + disp1060 = (TH2F *)his1060->Clone("disp1060"); + disp1061 = (TH2F *)his1061->Clone("disp1061"); + disp1062 = (TH2F *)his1062->Clone("disp1062"); +#endif + + printhelp(); +} + +MainWindow::~MainWindow() { stop(); } + +// --------------------------------------------------------------------------- +// UI +// --------------------------------------------------------------------------- +void MainWindow::setupUI() { + auto *central = new QWidget(this); + setCentralWidget(central); + auto *rootLayout = new QVBoxLayout(central); + auto *columns = new QHBoxLayout(); + rootLayout->addLayout(columns); + + auto *leftCol = new QVBoxLayout(); + auto *rightCol = new QVBoxLayout(); + // The connectors that cross from one column to the other are drawn by a + // strip placed by hand in the gap (not in the layout: an item here would + // stretch the column row and leave empty space above the save panel). A + // zero-height spacer reserves the width. + midCol_ = new QVBoxLayout(); + leftCol_ = leftCol; + rightCol_ = rightCol; + midSpacer_ = new QWidget(central); + midSpacer_->setFixedWidth(64); + midSpacer_->setFixedHeight(0); + midCol_->addWidget(midSpacer_); + strip_ = new FlowStrip(central); + columns->addLayout(leftCol, 1); + columns->addLayout(midCol_, 0); + columns->addLayout(rightCol, 1); + // bottom row: what the program is doing (Status) and what it has counted. + // It is added to the layout *after* the save panel (see the end of this + // function) so the save ends up above the counters. + auto *bottomRow = new QHBoxLayout(); + + // ── Status ── + auto *statusGroup = new QGroupBox("Status", central); + auto *statusLayout = new QVBoxLayout(statusGroup); + frameLabel = new QLabel("Frame: --", statusGroup); + statusLabel = new QLabel("Status: idle", statusGroup); + drawLabel = new QLabel(statusGroup); + streamVal_ = makeValueLabel("disconnected", statusGroup); + pedeVal_ = makeValueLabel("not loaded", statusGroup); + errVal_ = makeValueLabel(QString(), statusGroup); + errVal_->setWordWrap(true); + displayDropVal_ = makeValueLabel("0", statusGroup); + alignVal_ = makeValueLabel(QString(), statusGroup); + alignVal_->setWordWrap(true); + statusLayout->addWidget(frameLabel); + statusLayout->addWidget(statusLabel); + statusLayout->addWidget(drawLabel); + statusLayout->addWidget(new QLabel("Stream:", statusGroup)); + statusLayout->addWidget(streamVal_); + statusLayout->addWidget(new QLabel("Pedestal:", statusGroup)); + statusLayout->addWidget(pedeVal_); + statusLayout->addWidget(new QLabel("Display drops (analysis too slow):", + statusGroup)); + statusLayout->addWidget(displayDropVal_); + statusLayout->addWidget(new QLabel("Frame alignment:", statusGroup)); + statusLayout->addWidget(alignVal_); + statusLayout->addWidget(errVal_); + bottomRow->addWidget(statusGroup, 1); + + // ── Gate (event finder): two gates, applied in series ── + auto *gateGroup = new QGroupBox("Event finder gate", central); + auto *gateCol = new QVBoxLayout(gateGroup); + + // gate 1: storage cell. This is a header field, so it is checked first + // and frames from other cells cost no CPU at all. + auto *scGroup = new QGroupBox("1. Storage cell (header)", gateGroup); + scGroup_ = scGroup; + auto *scForm = new QFormLayout(scGroup); + scCombo_ = new QComboBox(scGroup); + scCombo_->addItem("ALL"); // index 0 == no storage-cell gating + for (int i = 0; i <= 15; i++) + scCombo_->addItem(QString::number(i)); + scCombo_->setToolTip( + "Pass only frames acquired in this storage cell (bits 8-11 of the\n" + "header's detector specific 3; 0..15, 15 = default). \"ALL\" passes\n" + "every cell. Checked before any pixel is touched, so the signal\n" + "gate only ever sees frames that survive this one."); + scLastVal_ = makeValueLabel("last frame: ?", scGroup); + scForm->addRow("Only storage cell:", scCombo_); + scForm->addRow(scLastVal_); + gateCol->addWidget(scGroup); + // Plain invisible spacer between the two gates: the path from the storage + // cell to the signal gate goes through the Pedestal and is drawn by the + // strip, so a direct arrow here would be wrong. layoutFlow() stretches + // this gap so the signal gate's middle lands on the Gain's top. + gatePad_ = new QWidget(gateGroup); + gatePad_->setFixedHeight(24); + gateCol->addWidget(gatePad_); + + // gate 2: the signal gate (the pixel counting) + auto *sigGroup = new QGroupBox("2. Signal gate (pixel counting)", gateGroup); + sigGroup_ = sigGroup; + auto *gateForm = new QFormLayout(sigGroup); + gateChk_ = new QCheckBox("Gate enabled (off = passthrough)", sigGroup); + gateChk_->setChecked(g_cfg.gateEnabled); + contigChk_ = new QCheckBox("Contiguous (N px within circle, r = N/2+1)", + sigGroup); + contigChk_->setChecked(g_cfg.contiguous); + thrSpin_ = new QDoubleSpinBox(sigGroup); + thrSpin_->setRange(0.0, 1000000.0); + thrSpin_->setDecimals(1); + thrSpin_->setSingleStep(10.0); + thrSpin_->setValue(g_cfg.threshold); + minPixSpin_ = new QSpinBox(sigGroup); + minPixSpin_->setRange(1, 10000000); + minPixSpin_->setValue(static_cast(g_cfg.minPixels)); + btnResetCounters = new QPushButton("Reset counters", gateGroup); + btnGateRoi = new QPushButton("ROI only (i)", sigGroup); + btnGateRoi->setCheckable(true); + btnGateRoi->setToolTip( + "Count only inside the ROI captured from the ADC zoom at the moment\n" + "this is pressed. The ROI is a snapshot: panning or zooming the ADC\n" + "image afterwards does not move it (it stays outlined in yellow)."); + gateRoiVal_ = makeValueLabel("full frame", sigGroup); + { + auto *gateRow = new QHBoxLayout(); + gateRow->addWidget(gateChk_); + gateRow->addWidget(btnGateRoi); + gateForm->addRow(gateRow); + } + gateForm->addRow(contigChk_); + thrLabel_ = new QLabel("Threshold (ADC, pede-subtracted):", sigGroup); + gateForm->addRow(thrLabel_, thrSpin_); + gateForm->addRow("Min pixels above threshold:", minPixSpin_); + gateForm->addRow("Gate ROI:", gateRoiVal_); + gateCol->addWidget(sigGroup); + + auto *seriesHint = new QLabel( + "Applied in series - storage cell first, so frames from other cells " + "never reach the pixel counting (all 0-15, no gating, and both " + "together are all possible).", + gateGroup); + seriesHint->setWordWrap(true); + gateCol->addWidget(seriesHint); + gateCol->addWidget(btnResetCounters); + // 1) Storage cell then 2) Signal gate: the left column *is* the gate flow. + // leftPad_ is sized at run time so that the middle of the storage-cell box + // lands on the top edge of the Pedestal box (see layoutFlow()). + // (Quit is added at the top of the right column, right aligned) + leftPad_ = new QWidget(central); + leftPad_->setFixedHeight(0); + leftCol->addWidget(leftPad_); + leftCol->addWidget(gateGroup); + + // ── Counters ── + auto *counterBox = new QGroupBox("Counters", central); + auto *grid = new QGridLayout(counterBox); + grid->setColumnStretch(1, 1); + grid->setColumnStretch(2, 1); + auto *headCum = new QLabel("Cumulative", counterBox); + auto *headCur = new QLabel("Current", counterBox); + headCum->setStyleSheet("font-weight: bold;"); + headCur->setStyleSheet("font-weight: bold;"); + grid->addWidget(new QLabel(QString(), counterBox), 0, 0); + grid->addWidget(headCum, 0, 1); + grid->addWidget(headCur, 0, 2); + + framesInCumVal_ = makeValueLabel("0", counterBox); + framesInCurVal_ = makeValueLabel("0", counterBox); + grid->addWidget(new QLabel("Frames in", counterBox), 1, 0); + grid->addWidget(framesInCumVal_, 1, 1); + grid->addWidget(framesInCurVal_, 1, 2); + + framesPassCumVal_ = makeValueLabel("0", counterBox); + framesPassCurVal_ = makeValueLabel("0", counterBox); + grid->addWidget(new QLabel("Frames passed", counterBox), 2, 0); + grid->addWidget(framesPassCumVal_, 2, 1); + grid->addWidget(framesPassCurVal_, 2, 2); + + framesDropCumVal_ = makeValueLabel("0", counterBox); + framesDropCurVal_ = makeValueLabel("0", counterBox); + grid->addWidget(new QLabel("Frames dropped", counterBox), 3, 0); + grid->addWidget(framesDropCumVal_, 3, 1); + grid->addWidget(framesDropCurVal_, 3, 2); + + scDropCumVal_ = makeValueLabel("0", counterBox); + scDropCurVal_ = makeValueLabel("0", counterBox); + grid->addWidget(new QLabel("Frames dropped (SC)", counterBox), 4, 0); + grid->addWidget(scDropCumVal_, 4, 1); + grid->addWidget(scDropCurVal_, 4, 2); + + pixelsAboveCumVal_ = makeValueLabel("0", counterBox); + pixelsAboveCurVal_ = makeValueLabel("0", counterBox); + grid->addWidget(new QLabel("Pixels above", counterBox), 5, 0); + grid->addWidget(pixelsAboveCumVal_, 5, 1); + grid->addWidget(pixelsAboveCurVal_, 5, 2); + + rateInVal_ = makeValueLabel("0 fps / 0 MB/s", counterBox); + grid->addWidget(new QLabel("Rate in (fps / MB/s)", counterBox), 6, 0); + grid->addWidget(rateInVal_, 6, 1, 1, 2); + ratePassVal_ = makeValueLabel("0 fps / 0 MB/s", counterBox); + grid->addWidget(new QLabel("Rate pass (fps / MB/s)", counterBox), 7, 0); + grid->addWidget(ratePassVal_, 7, 1, 1, 2); + dropFracVal_ = makeValueLabel("0.000", counterBox); + grid->addWidget(new QLabel("Drop fraction (cum.)", counterBox), 8, 0); + grid->addWidget(dropFracVal_, 8, 1, 1, 2); + bottomRow->addWidget(counterBox, 1); + + // ── Display controls ── + auto *ctrlGroup = new QGroupBox("Display", central); + displayGroup_ = ctrlGroup; + auto *ctrlGrid = new QGridLayout(ctrlGroup); + btnStartPause = new QPushButton("Start/Pause (s)", ctrlGroup); + btnFaster = new QPushButton("Faster (+)", ctrlGroup); + btnSlower = new QPushButton("Slower (-)", ctrlGroup); + btnGainToggle = new QPushButton("gain correction on/off (g)", ctrlGroup); + btnGainToggle->setCheckable(true); + btnGainToggle->setToolTip( + "Divide every pixel by its ADU/keV - the per-pixel value from the gain\n" + "map when one is loaded, the nominal 40 ADU/keV otherwise - to get keV.\n" + "\"keV PH\" then shows the PH spectra in keV; with this off (or keV PH\n" + "unticked) they show the raw pedestal-subtracted ADC."); + btnBWPalette = new QPushButton("BW Pal. (b)", ctrlGroup); + btnBWPalette2 = new QPushButton("BW Pal. 2 (B)", ctrlGroup); + btnSetRanges = new QPushButton("Set Ranges (S)", ctrlGroup); + btnColPal = new QPushButton("Col Pal (c)", ctrlGroup); + btnRates = new QPushButton("Update Rates", ctrlGroup); + btnResetHis = new QPushButton("Reset His (r)", ctrlGroup); + btnResetAxis = new QPushButton("Reset Axis (R)", ctrlGroup); + photonThrSpin_ = new QDoubleSpinBox(central); + photonThrSpin_->setRange(0.0, 100000.0); + photonThrSpin_->setDecimals(0); // ADU: whole numbers + photonThrSpin_->setSingleStep(10.0); + photonThrSpin_->setValue(static_cast(g_pheneThreshold)); + photonThrSpin_->setToolTip( + "Photon-map threshold (pede-subtracted ADC): only pixels above this\n" + "contribute to the map, and the number of photons a pixel counts for is\n" + "(value + threshold) / (2 x threshold). In ADU while the gain\n" + "correction is off, in keV while it is on (the value is then divided by\n" + "the pixel's ADU/keV first); both are remembered separately. It does\n" + "not affect the event-finder gate, which has its own threshold."); + // ── Virtual photon counting ── + // Left of the Display column (the Display lives in the right column at this + // height). The map itself is the same photon counting as before, but shown + // in its own Qt window: a fresh image every N analysed frames, and + // cumulative only if asked. + auto *pmapGroup = new QGroupBox("Virtual photon counting", central); + pmapGroup_ = pmapGroup; + auto *pmapGrid = new QGridLayout(pmapGroup); + pmapCumulative_ = new QCheckBox("cumulative (toggle to reset)", pmapGroup); + pmapCumulative_->setChecked(gPmapCumulative.load()); + pmapCumulative_->setToolTip( + "off: every displayed image shows only the photons counted since the\n" + "previous one; on: the map keeps adding up (the old behaviour)"); + pmapGrid->addWidget(pmapCumulative_, 0, 0, 1, 2); + pmapGrid->addWidget(new QLabel("plot every N images:", pmapGroup), 1, 0); + pmapEverySpin_ = new QSpinBox(pmapGroup); + pmapEverySpin_->setRange(1, 1000000); + pmapEverySpin_->setSingleStep(100); + pmapEverySpin_->setValue(gPmapEvery.load()); + pmapEverySpin_->setToolTip( + "how many analysed frames go into one image of the photon map\n" + "(default 2000; independent of the ADC image decimation)"); + pmapGrid->addWidget(pmapEverySpin_, 1, 1); + photonThrLabel_ = new QLabel("photon threshold (ADU):", pmapGroup); + pmapGrid->addWidget(photonThrLabel_, 2, 0); + // the photon threshold moves here from the Display panel + pmapGrid->addWidget(photonThrSpin_, 2, 1); + // under the gates, left of the Display column + leftCol->insertWidget(2, pmapGroup); + leftCol->addStretch(1); + + ctrlGrid->addWidget(btnStartPause, 0, 0); + ctrlGrid->addWidget(btnFaster, 0, 1); + ctrlGrid->addWidget(btnSlower, 0, 2); + // the three palette buttons share one row + ctrlGrid->addWidget(btnBWPalette, 1, 0); + ctrlGrid->addWidget(btnBWPalette2, 1, 1); + ctrlGrid->addWidget(btnColPal, 1, 2); + // (btnGainToggle lives in the Gain panel, below) + ctrlGrid->addWidget(btnSetRanges, 2, 0); + ctrlGrid->addWidget(btnRates, 2, 1); + ctrlGrid->addWidget(btnResetHis, 3, 0); + ctrlGrid->addWidget(btnResetAxis, 3, 1); + + // (the Display panel is added below the Gain panel, see below: it shows + // the result, so it comes after the chain that produces it) + + // ── ROI save (HDF5) ── + auto *saveGroup = new QGroupBox("Save", central); + saveGroup_ = saveGroup; + auto *saveForm = new QFormLayout(saveGroup); + saveFrames_ = new QSpinBox(saveGroup); + saveFrames_->setRange(0, 1000000000); + saveFrames_->setValue(1000); + saveFrames_->setSpecialValueText("unlimited"); + if (g_cfg.saveBudget > 0) // --save-budget: frames, or maps in photon mode + saveFrames_->setValue(static_cast(g_cfg.saveBudget)); + saveFrames_->setToolTip( + "Number of gate-passed frames to write; 0 = unlimited (stop with the\n" + "button). The run also stops by itself when this many frames are in\n" + "the file. In virtual photon counting mode it counts the maps."); + btnSaveStart = new QPushButton("Start/Stop save (n)", saveGroup); + btnSaveStart->setCheckable(true); + btnSaveStart->setToolTip( + "Write the active gate ROI of every gate-passed frame to an HDF5\n" + "file (slsReceiver layout, slice 0 = pedestal) plus a JSON sidecar."); + saveCorrected_ = new QCheckBox("Pedestal corrected", saveGroup); + saveCorrected_->setChecked(false); + saveCorrected_->setToolTip( + "Off (default): /data holds the raw 16-bit words and slice 0 is the\n" + "pedestal image.\n" + "On: /data holds pedestal-corrected float32 values with no pedestal\n" + "slice, and the pedestal image is written to the separate dataset\n" + "/pedestal data. Needs a loaded pedestal."); + saveDirEdit_ = new QLineEdit(QString::fromStdString(g_cfg.h5Dir), saveGroup); + saveDirEdit_->setToolTip("Directory the HDF5 file and JSON sidecar go to."); + auto *dirBtn = new QPushButton("...", saveGroup); + dirBtn->setFixedWidth(32); + auto *dirRow = new QHBoxLayout(); + dirRow->addWidget(saveDirEdit_); + dirRow->addWidget(dirBtn); + saveBaseEdit_ = new QLineEdit(QString::fromStdString(g_cfg.h5Base), saveGroup); + saveDefaultBase_ = saveBaseEdit_->text().trimmed(); // start-up default + saveBaseEdit_->setToolTip( + "File-name base. The file is __f0_0.h5 (and the\n" + "JSON the same with .json), so re-using a base never overwrites."); + btnSaveDest_ = new QPushButton("Previous destinations...", saveGroup); + btnSaveDest_->setToolTip( + "List of destinations used before (directory + base), most recent\n" + "first; pick one to fill the fields, or delete entries."); + saveDefaultDir_ = saveDirEdit_->text().trimmed(); // start-up default + saveVal_ = makeValueLabel("idle", saveGroup); + saveVal_->setWordWrap(true); + saveBudgetLabel_ = + new QLabel("Number of frames to be saved:", saveGroup); + saveForm->addRow(saveBudgetLabel_, saveFrames_); + // what gets written: the gate-passed frames, or the virtual photon + // counting maps (non-cumulative, one every M analysed frames) + saveModeFrames_ = new QRadioButton("save frames", saveGroup); + saveModePhoton_ = new QRadioButton("virtual photon counting", saveGroup); + saveModeFrames_->setChecked(gSaveMode.load() != 1); + saveModePhoton_->setChecked(gSaveMode.load() == 1); + saveForm->addRow(saveModeFrames_); + // the correction is a property of the *frames* being saved: the photon maps + // are always pedestal-subtracted, so the box lives under that radio and is + // greyed while the maps are selected + saveForm->addRow(saveCorrected_); + saveForm->addRow(saveModePhoton_); // (was dropped by the move above) + pmapSaveSpin_ = new QSpinBox(saveGroup); + pmapSaveSpin_->setRange(200, 1000000); // the requested minimum + pmapSaveSpin_->setSingleStep(100); + pmapSaveSpin_->setValue(gPmapSaveEvery.load()); + pmapSaveSpin_->setEnabled(gSaveMode.load() == 1); + pmapSaveSpin_->setToolTip( + "virtual photon counting: one non-cumulative map every this many\n" + "analysed frames (minimum 200), independent of the display cadence"); + saveForm->addRow("photon map every N frames:", pmapSaveSpin_); + saveForm->addRow("Directory:", dirRow); + saveForm->addRow("Base name:", saveBaseEdit_); + saveForm->addRow(btnSaveDest_); + saveForm->addRow(btnSaveStart); + saveForm->addRow("Save status:", saveVal_); + // (the ROI-save panel is added below the Gain panel, see the end of this + // function: the right column reads Display, Pedestal, Gain, Save) + + // ── Pedestal ── + auto *pedeGroup = new QGroupBox("Pedestal", central); + pedeGroup_ = pedeGroup; + auto *pedeGrid = new QGridLayout(pedeGroup); + btnLoadPede = new QPushButton("Acquire Pede (p)", pedeGroup); + btnSavePede = new QPushButton("Save Pede (O)", pedeGroup); + btnReadPede = new QPushButton("Read Pede (o)", pedeGroup); + btnLoadAllPede = new QPushButton("Load Pede File (P)", pedeGroup); + btnGainMap = new QPushButton("Gain map (keV)...", pedeGroup); + kevChk_ = new QCheckBox("keV PH", pedeGroup); + kevChk_->setToolTip( + "Show the PH spectra in keV instead of ADU. With a gain map the " + "pixel's own ADU/keV is used; without one the nominal 40 ADU/keV is " + "used and the panel says so."); + // usable without a map: the nominal 40 ADU/keV is used then + gainMapVal_ = new QLabel("no gain map loaded", pedeGroup); + btnNoPede_ = new QPushButton("Pede/Raw toggle", pedeGroup); + btnNoPede_->setCheckable(true); + btnNoPede_->setChecked(gNoPede.load()); // startup default: raw ADC + btnNoPede_->setToolTip( + "Switch between the loaded pedestal and raw ADC. Pressed = raw ADC:\n" + "the display, the photon map, the spectra, the event finder and the ROI\n" + "save then work on raw 14-bit values, and the Pedestal box is greyed\n" + "(this button stays active, it is how you switch back)."); + noPedeVal_ = new QLabel("pede subtracted", pedeGroup); + pedeGrid->addWidget(btnLoadPede, 0, 0); + pedeGrid->addWidget(btnSavePede, 0, 1); + pedeGrid->addWidget(btnReadPede, 1, 0); + pedeGrid->addWidget(btnLoadAllPede, 1, 1); + // calibration for the keV spectra (the ADC plots stay in ADU) + // (the gain map moved to the Gain panel below) + pedeTrackGroup_ = new QGroupBox("Pedestal tracking", central); + auto *trackCol = new QVBoxLayout(pedeTrackGroup_); + btnPedeTrack_ = + new QPushButton("pedestal tracking on/off", pedeTrackGroup_); + btnPedeTrack_->setCheckable(true); + btnPedeTrack_->setChecked(gPedeTracking.load()); // --pede-tracking + btnPedeTrack_->setToolTip( + "Follow the pedestal drift from the frames the signal gate drops\n" + "(the beam is off then). While the gate drops more than 90 % of the\n" + "frames reaching it, 0.2 % of every dropped frame feeds a per-pixel\n" + "running average over a 10 M sample window; the pedestal in use is\n" + "replaced when the largest difference exceeds 5 ADU, at most once\n" + "every 10 s and at least every 10 min. Needs the signal gate on."); + pedeTrackVal_ = makeValueLabel("off", pedeTrackGroup_); + pedeGrid->addWidget(btnNoPede_, 2, 0); + pedeGrid->addWidget(noPedeVal_, 2, 1); + trackCol->addWidget(btnPedeTrack_); + trackCol->addWidget(pedeTrackVal_); + gainMapVal_->setWordWrap(true); + pedePad_ = new QWidget(central); + pedePad_->setFixedHeight(0); + rightCol->addWidget(pedePad_); + rightCol->addWidget(pedeGroup); + // the tracker reads the frames the signal gate drops and feeds its result + // back into the Pedestal box above it, so the arrow points up + // the tracking feedback goes back into the pedestal, so it is pedestal path + arrTrackUp_ = makeFlowArrow(QString::fromUtf8("\u2191"), central, + FlowPedestal); + rightCol->addWidget(arrTrackUp_, 0, Qt::AlignHCenter); + rightCol->addWidget(pedeTrackGroup_); + gainPad_ = new QWidget(central); + gainPad_->setFixedHeight(0); + rightCol->addWidget(gainPad_); + + auto *gainGroup = new QGroupBox("Gain", central); + gainGroup_ = gainGroup; + auto *gainCol = new QVBoxLayout(gainGroup); + { + auto *gainRow = new QHBoxLayout(); + gainRow->addWidget(btnGainToggle); + // Read-only state indicator (the button is the only control): it shows + // at a glance whether the gain correction is applied - itself if a map + // is loaded, the nominal 40 ADU/keV otherwise. + gainStateChk_ = new QCheckBox("gain corrected", gainGroup); + gainStateChk_->setAttribute(Qt::WA_TransparentForMouseEvents, true); + gainStateChk_->setFocusPolicy(Qt::NoFocus); + gainStateChk_->setToolTip( + "Whether the gain correction is applied (read-only: switch it with\n" + "the button on the left). Ticked = pixels are divided by their\n" + "ADU/keV, so the PH spectra can be shown in keV."); + gainRow->addWidget(gainStateChk_); + gainRow->addStretch(1); + gainCol->addLayout(gainRow); + } + { + auto *gmRow = new QHBoxLayout(); + gmRow->addWidget(new QLabel("Gain map (keV PH):", gainGroup)); + gmRow->addWidget(btnGainMap); + gmRow->addWidget(kevChk_); + gmRow->addStretch(1); + gainCol->addLayout(gmRow); + } + gainCol->addWidget(gainMapVal_); + rightCol->addWidget(gainGroup); + arrGainDown_ = makeFlowArrow(QString::fromUtf8("\u2193"), central); + rightCol->addWidget(arrGainDown_, 0, Qt::AlignHCenter); + rightCol->addWidget(ctrlGroup); + + // ROI panel: selecting / loading / saving ROIs (the gate keeps its own + // "ROI only" capture and its ROI read-out next to the signal gate) + roiGroup_ = new QGroupBox("ROI", central); + { + auto *roiCol = new QVBoxLayout(roiGroup_); + btnSaveRoi = new QPushButton("Save ROI", roiGroup_); + btnLoadRoi = new QPushButton("Load ROI...", roiGroup_); + btnSaveRoi->setToolTip( + "Add the active gate ROI to the list kept in the program folder\n" + "(updates its timestamp if the same rectangle is already there)."); + btnLoadRoi->setToolTip( + "Pick a ROI from the list (most recently saved/loaded first) and\n" + "apply it to the gate. The list dialog can also delete entries."); + btnSelectRoi_ = new QPushButton("Select ROI (ADC zoom)", roiGroup_); + btnSelectRoi_->setToolTip( + "Make the region currently zoomed in the ADC image the current\n" + "ROI. This only selects it: press \"ROI only\" next to the signal\n" + "gate to actually restrict the gate to it."); + roiCol->addWidget(btnSelectRoi_); + btnUnsetRoi_ = new QPushButton("Unset ROI", roiGroup_); + btnUnsetRoi_->setToolTip( + "Forget the current ROI: the gate and the saved data go back to the\n" + "full frame (the ROI list is not touched - use \"Load ROI...\" for\n" + "that)."); + roiCol->addWidget(btnUnsetRoi_); + auto *row = new QHBoxLayout(); + row->addWidget(btnSaveRoi); + row->addWidget(btnLoadRoi); + roiCol->addLayout(row); + roiListVal_ = makeValueLabel("no ROI in the list", roiGroup_); + roiCol->addWidget(roiListVal_); + } + rightCol->addWidget(roiGroup_); + // ROI -> Save: on the data path while "save frames" is selected (the + // colour follows the save mode, see updateFlow) + arrRoiDown_ = makeFlowArrow(QString::fromUtf8("\u2193"), central, FlowData); + rightCol->addWidget(arrRoiDown_, 0, Qt::AlignHCenter); + + // the save panel spans the whole window, below the flow but above the + // Status/Counters row + rootLayout->addWidget(saveGroup); + rootLayout->addLayout(bottomRow); + + btnQuit = new QPushButton("Quit (q)", central); + // first row of the right column, right aligned: out of the gate/arrow area + rightCol->insertWidget(0, btnQuit, 0, Qt::AlignRight); + // (Quit was added at the top left, above the gates) + rightCol->addStretch(1); + + // ── Signals: gate parameters ── + connect(gateChk_, &QCheckBox::toggled, this, [this](bool on) { + pipeline_.gate().setEnabled(on); + statusLabel->setText(on ? "Status: gate enabled" + : "Status: passthrough (gate off)"); + // the tracking works off the frames the gate drops, so switching the + // gate off turns it off too + if (!on && btnPedeTrack_ && btnPedeTrack_->isChecked()) + btnPedeTrack_->setChecked(false); + }); + connect(thrSpin_, QOverload::of(&QDoubleSpinBox::valueChanged), this, + [this](double v) { + if (!confirmGateChangeDuringRun( + QString("Signal-gate threshold -> %1 ADU").arg(v))) { + const QSignalBlocker b(thrSpin_); + thrSpin_->setValue( + static_cast(pipeline_.gate().threshold())); + return; + } + pipeline_.gate().setThreshold(static_cast(v)); + pipeline_.gate().resetCounters(); + }); + connect(minPixSpin_, QOverload::of(&QSpinBox::valueChanged), this, + [this](int v) { + if (!confirmGateChangeDuringRun( + QString("Min pixels above threshold -> %1").arg(v))) { + const QSignalBlocker b(minPixSpin_); + minPixSpin_->setValue( + static_cast(pipeline_.gate().minPixels())); + return; + } + pipeline_.gate().setMinPixels(static_cast(v)); + pipeline_.gate().resetCounters(); + }); + connect(contigChk_, &QCheckBox::toggled, this, [this](bool on) { + pipeline_.gate().setContiguous(on); + pipeline_.gate().resetCounters(); + }); + connect(btnResetCounters, &QPushButton::clicked, this, + [this]() { pipeline_.gate().resetCounters(); }); + connect(scCombo_, QOverload::of(&QComboBox::currentIndexChanged), + this, [this](int idx) { + // index 0 is "ALL" (no storage-cell gating), 1..16 are SC 0..15 + const int sc = (idx <= 0) ? -1 : idx - 1; + pipeline_.gate().setScFilter(sc); + statusLabel->setText( + sc < 0 ? "Status: all storage cells" + : QString("Status: only storage cell %1").arg(sc)); + }); + connect(btnGateRoi, &QPushButton::toggled, this, + [this](bool on) { toggleGateRoi(on); }); + connect(btnSaveStart, &QPushButton::toggled, this, + [this](bool on) { toggleRoiSave(on); }); + connect(saveModePhoton_, &QRadioButton::toggled, this, [this](bool on) { + gSaveMode = on ? 1 : 0; + pmapSaveSpin_->setEnabled(on); + // in photon mode the same spinbox budgets MAPS, so say so + if (saveBudgetLabel_) + saveBudgetLabel_->setText( + on ? "Number of photon maps to be saved:" + : "Number of frames to be saved:"); + // the correction only applies to the frames mode + if (saveCorrected_) + saveCorrected_->setEnabled(!on && + !pipeline_.saver().status().running); + updateFlow(); // the data-path arrows follow the mode + printf("[save] mode: %s\n", + on ? "virtual photon counting" : "frames"); + fflush(stdout); + statusLabel->setText(on + ? "Status: saving virtual photon counting maps" + : "Status: saving gate-passed frames"); + }); + connect(pmapSaveSpin_, QOverload::of(&QSpinBox::valueChanged), this, + [this](int v) { + if (v < 200) { + pmapSaveSpin_->setValue(200); + return; + } + gPmapSaveEvery = v; + }); + connect(dirBtn, &QPushButton::clicked, this, + [this]() { browseSaveDir(); }); + connect(btnSaveDest_, &QPushButton::clicked, this, + [this]() { saveDestDialog(); }); + connect(btnSelectRoi_, &QPushButton::clicked, this, + [this]() { captureRoi(); }); + connect(btnUnsetRoi_, &QPushButton::clicked, this, + [this]() { unsetRoi(); }); + connect(btnSaveRoi, &QPushButton::clicked, this, [this]() { saveRoi(); }); + connect(btnLoadRoi, &QPushButton::clicked, this, + [this]() { loadRoiDialog(); }); + + // ── Signals: everything else ── + connect(btnStartPause, &QPushButton::clicked, this, + [this]() { toggleStartPause(); }); + connect(btnFaster, &QPushButton::clicked, this, [this]() { faster(); }); + connect(btnSlower, &QPushButton::clicked, this, [this]() { slower(); }); + connect(btnGainToggle, &QPushButton::toggled, this, + [this](bool on) { setApplyGain(on); }); + connect(btnBWPalette, &QPushButton::clicked, this, + [this]() { bwPalette1(); }); + connect(btnBWPalette2, &QPushButton::clicked, this, + [this]() { bwPalette2(); }); + connect(btnSetRanges, &QPushButton::clicked, this, + [this]() { showRangeDialog(); }); + connect(btnRates, &QPushButton::clicked, this, + [this]() { showRateDialog(); }); + connect(pmapCumulative_, &QCheckBox::toggled, this, [this](bool on) { + gPmapCumulative = on; + // "toggle to reset": either way the map starts from scratch, so the + // switch itself is the reset (no need to reach for Reset His) + resetHis(); + statusLabel->setText(on ? "Status: photon map cumulative (restarted)" + : "Status: photon map per image (restarted)"); + }); + connect(pmapEverySpin_, QOverload::of(&QSpinBox::valueChanged), this, + [this](int v) { + gPmapEvery = v > 0 ? v : 1; + statusLabel->setText( + QString("Status: photon map every %1 frames").arg(v)); + }); + connect(photonThrSpin_, QOverload::of(&QDoubleSpinBox::valueChanged), + this, [this](double v) { + // the photon map is filled by the analysis thread, which reads + // the atomic every frame; the multiplicity follows as 2 x v. + // Which one is being edited depends on the gain stage. + const bool kev = gain_flag.load(); + if (kev) + g_pheneThresholdKev = static_cast(v); + else + g_pheneThreshold = static_cast(v); + statusLabel->setText( + QString("Status: photon-map threshold %1 %2") + .arg(v, 0, 'f', kev ? 1 : 0) + .arg(kev ? "keV" : "ADU")); + }); + // "Pedestal corrected" decides whether the *saved* frames use the pedestal, + // which is what the orange route in the flow diagram shows + connect(saveCorrected_, &QCheckBox::toggled, this, [this](bool on) { + updateFlow(); + statusLabel->setText( + on ? "Status: saved frames pedestal corrected" + : "Status: saved frames raw (pedestal not subtracted)"); + }); + connect(btnResetHis, &QPushButton::clicked, this, + [this]() { resetHis(); }); + connect(btnResetAxis, &QPushButton::clicked, this, + [this]() { resetAxis(); }); + connect(btnColPal, &QPushButton::clicked, this, + [this]() { colPal(); }); + connect(btnLoadPede, &QPushButton::clicked, this, + [this]() { acquirePede(); }); + connect(btnSavePede, &QPushButton::clicked, this, + [this]() { savePede(); }); + connect(btnReadPede, &QPushButton::clicked, this, + [this]() { readPede(); }); + connect(btnLoadAllPede, &QPushButton::clicked, this, + [this]() { loadAllPede(); }); + connect(btnPedeTrack_, &QPushButton::toggled, this, [this](bool on) { + // needs the signal gate: without it "dropped" has no meaning + if (on && gateChk_ && !gateChk_->isChecked()) { + QMessageBox::information( + this, "Pedestal tracking", + "Pedestal tracking follows the frames the signal gate drops, " + "so it needs \"Gate enabled\" on."); + btnPedeTrack_->setChecked(false); + return; + } + gPedeTracking = on; + printf("[pedetrack] %s\n", on ? "on" : "off"); + fflush(stdout); + statusLabel->setText(on ? "Status: pedestal tracking on" + : "Status: pedestal tracking off"); + updateFlow(); + }); + connect(btnNoPede_, &QPushButton::toggled, this, [this](bool on) { + gNoPede = on; + updateFlow(); + statusLabel->setText(on ? "Status: pedestal NOT subtracted (raw ADC)" + : "Status: pedestal subtraction on"); + }); + connect(btnGainMap, &QPushButton::clicked, this, + [this]() { loadGainMap(); }); + connect(kevChk_, &QCheckBox::toggled, this, [this](bool on) { + kevSpectra = on; + forceRootRedraw(); + updateFlow(); // the Gain panel is in use when keV is shown + if (on && !gainMapLoaded()) { + if (gainMapVal_) + gainMapVal_->setText( + "no gain map selected - using nominal values " + "(40 ADU/keV)"); + statusLabel->setText( + "Status: PH spectra in keV (nominal 40 ADU/keV, no gain map)"); + } else { + updateGainMapLabel(); + statusLabel->setText(on ? "Status: PH spectra in keV" + : "Status: PH spectra in ADU"); + } + }); + connect(btnQuit, &QPushButton::clicked, this, [this]() { quitApp(); }); + + // ── Fast image views (separate top-level windows, as in the original) ── + m_adcView = new FastImageView(); + m_adcView->setPaletteLut(paletteLut(Palette::Color)); // match the ROOT plots + // the ADC (main) image opens on the ADC range of the Set Ranges dialog + m_adcView->setColorRange(adcmin.load(), adcmax.load()); + m_adcWin = new QWidget(nullptr, Qt::Window); + m_adcWin->setWindowTitle("ADC Image"); + m_adcWin->resize(1024 + 80, 512 + 40); + auto *adcLay = new QVBoxLayout(m_adcWin); + adcLay->setContentsMargins(0, 0, 0, 0); + adcLay->addWidget(m_adcView); + m_adcWin->show(); + + m_gainView = new FastImageView(); + m_gainView->setColorRange(0, 4); + m_gainWin = new QWidget(nullptr, Qt::Window); + m_gainWin->setWindowTitle("Gain Image"); + m_gainWin->resize(1024 + 80, 512 + 40); + auto *gainLay = new QVBoxLayout(m_gainWin); + gainLay->setContentsMargins(0, 0, 0, 0); + gainLay->addWidget(m_gainView); + m_gainWin->show(); + + m_photonView = new FastImageView(); + m_photonView->setPaletteLut(paletteLut(Palette::Color)); + m_photonView->setZeroWhite(true); // 0 photons = white, like the ROOT plot + m_photonView->setColorRange(0, 8); // photons per pixel over one image + m_photonWin = new QWidget(nullptr, Qt::Window); + m_photonWin->setWindowTitle("Photon Map (virtual photon counting)"); + m_photonWin->resize(1024 + 80, 512 + 40); + auto *photonLay = new QVBoxLayout(m_photonWin); + photonLay->setContentsMargins(0, 0, 0, 0); + photonLay->addWidget(m_photonView); + m_photonWin->show(); + +#ifdef JFSTRX + // ── Separate strixel window: the six ADC groups, arranged like the + // original ROOT ADC canvas (left column chip1 g3/g2/g1, right column + // chip6 g1/g2/g3). Display only: the gate ROI is selected on the raw + // ADC image, which stays unmapped so the coordinates are raw pixels. + m_adcPanelWin = new QWidget(nullptr, Qt::Window); + m_adcPanelWin->setWindowTitle("ADC Strixel Panels (JFSTRX)"); + m_adcPanelWin->resize(900, 900); + auto *panelRow = new QHBoxLayout(m_adcPanelWin); + panelRow->setContentsMargins(2, 2, 2, 2); + auto *panelCol0 = new QVBoxLayout(); + auto *panelCol1 = new QVBoxLayout(); + panelRow->addLayout(panelCol0); + panelRow->addLayout(panelCol1); + QVBoxLayout *panelCol[2] = {panelCol0, panelCol1}; + // panel index order: 0..2 = chip1 g1/g2/g3, 3..5 = chip6 g1/g2/g3 + static const int panelOrder[2][3] = {{2, 1, 0}, {3, 4, 5}}; // top -> bottom + static const int panelStretch[2][3] = {{5, 2, 2}, {2, 2, 5}}; + // mapped-pixel aspect X/Y: X = 75*(75/Y), Y = 25/15/18.75 um + // -> 225/25 = 9, 375/15 = 25, 300/18.75 = 16 + static const double panelAspect[kNumAdcPanels] = {9.0, 25.0, 16.0, + 9.0, 25.0, 16.0}; + static const char *panelTitle[kNumAdcPanels] = { + "chip 1 group 1 (25um)", "chip 1 group 2 (15um)", + "chip 1 group 3 (18.75um)", "chip 6 group 1 (25um)", + "chip 6 group 2 (15um)", "chip 6 group 3 (18.75um)"}; + for (int col = 0; col < 2; col++) { + for (int k = 0; k < 3; k++) { + const int p = panelOrder[col][k]; + auto *cell = new QWidget(); + auto *cv = new QVBoxLayout(cell); + cv->setContentsMargins(0, 0, 0, 0); + cv->setSpacing(0); + auto *lab = new QLabel(panelTitle[p], cell); + lab->setAlignment(Qt::AlignCenter); + cv->addWidget(lab); + auto *v = new FastImageView(); + v->setPaletteLut(paletteLut(Palette::Color)); + v->setColorRange(adcmin.load(), adcmax.load()); + v->setPixelAspectX(panelAspect[p]); + cv->addWidget(v, 1); + panelCol[col]->addWidget(cell, panelStretch[col][k]); + m_adcPanelView[p] = v; + } + } + m_adcPanelWin->show(); +#endif + + // Master-slave zoom: the ADC view is the master; the gain view follows + // immediately (same thread) and the ROOT photon map follows through a + // coalesced command, so only the newest viewport is ever redrawn. + m_adcView->onZoomChanged = [this](double x1, double y1, double x2, + double y2) { zoomTo(x1, y1, x2, y2); }; + + // ── Timers (started by start()) ── + processTimer = new QTimer(this); + connect(processTimer, &QTimer::timeout, this, + [this]() { processImages(); }); + statusTimer = new QTimer(this); + connect(statusTimer, &QTimer::timeout, this, [this]() { updateStatus(); }); + sigTimer = new QTimer(this); + connect(sigTimer, &QTimer::timeout, this, [this]() { checkSignals(); }); + + updateFlow(); + + updateDrawLabel(); +} + +void MainWindow::connectShortcuts() { + auto sc = [this](const char *key, const std::function &fn) { + QShortcut *s = new QShortcut(QKeySequence(QString::fromLatin1(key)), + this); + connect(s, &QShortcut::activated, this, fn); + }; + sc("s", [this]() { toggleStartPause(); }); + sc("+", [this]() { faster(); }); + sc("=", [this]() { faster(); }); + sc("-", [this]() { slower(); }); + sc("g", [this]() { toggleGain(); }); + sc("b", [this]() { bwPalette1(); }); + sc("Shift+B", [this]() { bwPalette2(); }); + sc("c", [this]() { colPal(); }); + sc("i", [this]() { btnGateRoi->setChecked(!btnGateRoi->isChecked()); }); + sc("e", [this]() { + // keV PH (e for energy): keeps its tick while the gain is off, see + // updateFlow. Not "k": that is already Load ROI. + if (kevChk_) + kevChk_->setChecked(!kevChk_->isChecked()); + }); + sc("n", [this]() { btnSaveStart->setChecked(!btnSaveStart->isChecked()); }); + sc("j", [this]() { saveRoi(); }); + sc("k", [this]() { loadRoiDialog(); }); + sc("r", [this]() { resetHis(); }); + sc("Shift+R", [this]() { resetAxis(); }); + sc("p", [this]() { acquirePede(); }); + sc("Shift+O", [this]() { savePede(); }); + sc("o", [this]() { readPede(); }); + sc("Shift+P", [this]() { loadAllPede(); }); + sc("q", [this]() { quitApp(); }); + sc("Shift+S", [this]() { showRangeDialog(); }); +} + +// --------------------------------------------------------------------------- +// lifecycle +// --------------------------------------------------------------------------- +void MainWindow::start() { + // Pedestals must be installed before the threads start reading frames. + std::string perr; + if (pathExists(g_cfg.pedeFile)) { + if (pedeLoadFile(g_cfg.pedeFile, perr)) { + printf("[pede] loaded %s\n", g_cfg.pedeFile.c_str()); + pedeVal_->setText(QString("loaded (%1)").arg( + QString::fromStdString(g_cfg.pedeFile))); + pipeline_.gate().setLastError(""); + } else { + fprintf(stderr, "[pede] %s\n", perr.c_str()); + pipeline_.gate().setLastError("loadPedestal: " + perr); + } + } else if (g_cfg.pedeExplicit) { + fprintf(stderr, "[pede] file not found: %s\n", g_cfg.pedeFile.c_str()); + pipeline_.gate().setLastError("loadPedestal: file not found: " + + g_cfg.pedeFile); + } else { + printf("[pede] %s not found, running on raw values\n", + g_cfg.pedeFile.c_str()); + } + + if (!g_cfg.gainMapFile.empty()) { + std::string gerr; + if (gainMapLoadFile(g_cfg.gainMapFile, gerr)) { + if (gainMapVal_) + gainMapVal_->setText(QFileInfo(QString::fromStdString( + g_cfg.gainMapFile)) + .fileName()); + if (kevChk_) + kevChk_->setChecked(true); // show what was just calibrated + updateFlow(); + } else { + fprintf(stderr, "[gain] %s\n", gerr.c_str()); + pipeline_.gate().setLastError("gainMap: " + gerr); + } + } + + std::string err; + if (!pipeline_.init(err)) { + fprintf(stderr, "FATAL: %s\n", err.c_str()); + pipeline_.gate().setLastError(err); + statusLabel->setText("Status: socket error"); + QMessageBox::critical(this, "ZMQ", QString::fromStdString(err)); + } else { + pipeline_.start(); + pipeline_.gate().setScFilter(g_cfg.scFilter); + if (scCombo_) + scCombo_->setCurrentIndex(g_cfg.scFilter < 0 ? 0 + : g_cfg.scFilter + 1); + statusLabel->setText("Status: running"); + if (g_cfg.acquirePede) + pipeline_.requestPedeAcquire(g_cfg.pedeFrames); + if (g_cfg.gateRoiX >= 0) { // --gate-roi: same path as the "ROI only" + // button, so the box and the gate agree + applyRoi(g_cfg.gateRoiX, g_cfg.gateRoiY, g_cfg.gateRoiW, + g_cfg.gateRoiH, "command line", /*restrict=*/true); + // reflect the restriction in the button, so the first press turns + // it off instead of toggling the wrong way (m_applyingRoi keeps the + // toggle handler from re-capturing or warning) + if (btnGateRoi && pipeline_.gate().roiActive() && + !btnGateRoi->isChecked()) { + m_applyingRoi = true; + btnGateRoi->setChecked(true); + m_applyingRoi = false; + } + } + } + + startRootThread(); + processTimer->start(30); + statusTimer->start(500); + sigTimer->start(200); + + // --apply-gain: same as pressing the Gain button (it also swaps the photon + // threshold to keV and relabels its row) + if (g_cfg.applyGain) + btnGainToggle->setChecked(true); + + // --start-save: press the Save button for scripted/headless runs. The + // check triggers toggleRoiSave() exactly like the GUI click. + if (g_cfg.startSave) { + printf("[save] --start-save: starting the %s writer\n", + gSaveMode.load() == 1 ? "virtual photon counting" + : "frame"); + fflush(stdout); + btnSaveStart->setChecked(true); + } + + signal(SIGINT, handleSigint); + signal(SIGTERM, handleSigint); +} + +void MainWindow::stop() { + if (processTimer) + processTimer->stop(); + if (statusTimer) + statusTimer->stop(); + if (sigTimer) + sigTimer->stop(); + { + const RoiSaver::Status st = pipeline_.saver().status(); + if (st.running) { + printf("[shutdown] flushing the ROI save (%llu frames, %s)...\n", + (unsigned long long)st.saved, st.h5Path.c_str()); + fflush(stdout); + if (statusLabel) + statusLabel->setText( + "Status: flushing the ROI save before exit..."); + } + } + pipeline_.saver().requestStop("program exit"); + pipeline_.saver().finish(); // drain the queue, close the file, write JSON + pipeline_.stop(); + stopRootThread(); +} + +// Question asked before quitting (both from the Quit button/shortcut and from +// closing the window). A running ROI save is called out explicitly, because +// quitting flushes it: the writer drains its queue, closes the HDF5 file and +// writes the JSON sidecar before the program exits. +bool MainWindow::confirmQuit() { + const RoiSaver::Status st = pipeline_.saver().status(); + QString text = "Quit the online display?"; + if (st.running) { + text += QString("\n\nA ROI save is still running: %1 frames written " + "to\n%2\n\nIt will be stopped and flushed (queued " + "frames written, file closed, JSON sidecar written) " + "before the program exits.") + .arg(static_cast(st.saved)) + .arg(QString::fromStdString(st.h5Path)); + } else if (!st.h5Path.empty()) { + text += QString("\n\nThe last ROI save is closed:\n%1\n(%2 frames)") + .arg(QString::fromStdString(st.h5Path)) + .arg(static_cast(st.saved)); + } + const QMessageBox::StandardButton answer = QMessageBox::question( + this, "Quit", text, QMessageBox::Yes | QMessageBox::No, + QMessageBox::No); + printf("[quit] %s\n", answer == QMessageBox::Yes ? "confirmed" + : "cancelled"); + fflush(stdout); + return answer == QMessageBox::Yes; +} + +// Sizes the two empty pads that turn the panels into a flow chart: +// * the gates start low enough that the middle of "1. Storage cell" sits on +// the top edge of the Pedestal box, and +// * the Gain box starts at the middle of "2. Signal gate". +// The only thing that matters is that the two columns stay top-aligned, which +// they do, so this runs once at start-up and again if the window is resized +// wider/narrower (text wrapping can change the heights). +void MainWindow::layoutFlow() { + if (!centralWidget() || !leftPad_ || !gainPad_ || !scGroup_ || + !sigGroup_ || !pedeGroup_ || !gainGroup_) + return; + static bool inLayout = false; + if (inLayout) + return; // setFixedHeight() re-enters through resizeEvent() + inLayout = true; + flowQueued_ = false; // this call is the queued one, if it was + + // The first call comes before Qt has computed the layout, when every box + // still has a token size; solving from that produced a huge pad and, with + // it, a window minimum that stayed large for the rest of the session. + if (scGroup_->height() < 40 || sigGroup_->height() < 40 || + pedeGroup_->height() < 40 || gainGroup_->height() < 40) { + inLayout = false; + return; + } + + // Iterative, because every change alters what is being measured (boxes + // grow when their labels wrap, and the pads move the boxes). Three knobs: + // leftPad - pushes the gates down until the storage-cell middle is on + // the top edge of the Pedestal + // gatePad - the gap *between* the two gates: stretching it moves the + // signal gate down without touching the storage cell + // gainPad - fine adjustment so the Gain starts at the signal-gate middle + const int arrowMin = 10; // keep the arrows visible + leftPad_->setFixedHeight(flowPads_[0]); + pedePad_->setFixedHeight(flowPads_[1]); + gainPad_->setFixedHeight(flowPads_[2]); + if (gatePad_) + gatePad_->setFixedHeight(flowPads_[3]); + if (QLayout *l = centralWidget()->layout()) + l->activate(); + + { + const int scMid = scGroup_->mapTo(centralWidget(), + QPoint(0, scGroup_->height() / 2)) + .y(); + const int sigMid = sigGroup_->mapTo(centralWidget(), + QPoint(0, sigGroup_->height() / 2)) + .y(); + const int pedeTop = + pedeGroup_->mapTo(centralWidget(), QPoint(0, 0)).y(); + const int gainTop = + gainGroup_->mapTo(centralWidget(), QPoint(0, 0)).y(); + + // storage-cell middle must sit on the Pedestal's top edge: move + // whichever of the two has room (the Pedestal down, or the gates down) + int wantLeft = flowPads_[0], wantPede = flowPads_[1]; + const int errPede = scMid - pedeTop; // >0: the Pedestal is too high + if (errPede > 0) + wantPede += errPede; + else + wantLeft += -errPede; + if (wantLeft < 0) + wantLeft = 0; + if (wantPede < 0) + wantPede = 0; + // The Gain must start at the signal gate's middle. If it sits too + // high, push it down with gainPad; if it sits too low, push the signal + // gate down instead by stretching the arrow between the gates (the + // storage cell above is not affected by that arrow). + const int err = sigMid - gainTop; // >0: the gain is too high + int wantArrow = flowPads_[3]; + int wantGain = flowPads_[2]; + if (err > 0) { + wantGain += err; // the Gain sits above the signal middle + } else if (err < 0) { + wantArrow += -err; // below it: push the signal gate down instead + wantGain = 0; + } + // err == 0: aligned, leave both pads alone (resetting gainPad here was + // what made the solver oscillate between aligned and 50 px off) + if (wantArrow < arrowMin) + wantArrow = arrowMin; + if (wantGain < 0) + wantGain = 0; + + const bool converged = wantLeft == flowPads_[0] && + wantPede == flowPads_[1] && + wantArrow == flowPads_[3] && + wantGain == flowPads_[2]; + flowPads_[0] = wantLeft; + flowPads_[1] = wantPede; + flowPads_[2] = wantGain; + flowPads_[3] = wantArrow; + if (!converged && getenv("JF_TIMING")) + printf("[flow] pass %d: left %d pede %d gain %d gateArrow %d | " + "scMid %d sigMid %d pedeTop %d gainTop %d\n", + flowPass_, wantLeft, wantPede, wantGain, wantArrow, scMid, + sigMid, pedeTop, gainTop); + if (!converged) { + // re-measure on the next event-loop turn: within one call the + // widget positions are not guaranteed to have settled yet, and + // solving from stale numbers compounds the corrections + flowPass_++; + if (flowPass_ < 12 && !flowQueued_) { + flowQueued_ = true; + QTimer::singleShot(0, this, &MainWindow::layoutFlow); + } + } else { + flowPass_ = 0; + } + } + leftPad_->setFixedHeight(flowPads_[0]); + pedePad_->setFixedHeight(flowPads_[1]); + gainPad_->setFixedHeight(flowPads_[2]); + if (gatePad_) + gatePad_->setFixedHeight(flowPads_[3]); + if (QLayout *l = centralWidget()->layout()) + l->activate(); + + // place the strip over the gap between the two columns, spanning from the + // top of the first box to the bottom of the last one + if (strip_ && scGroup_ && sigGroup_ && pedeGroup_ && gainGroup_) { + const int x0 = scGroup_->mapTo(centralWidget(), QPoint(0, 0)).x() + + scGroup_->width() + 1; + const int x1 = + pedeGroup_->mapTo(centralWidget(), QPoint(0, 0)).x() - 1; + int top = scGroup_->mapTo(centralWidget(), QPoint(0, 0)).y(); + int bot = pedeGroup_->mapTo(centralWidget(), QPoint(0, 0)).y() + + pedeGroup_->height(); + const int gainBot = gainGroup_->mapTo(centralWidget(), QPoint(0, 0)).y() + + gainGroup_->height(); + if (gainBot > bot) + bot = gainBot; + if (roiGroup_) { + const int roiBot = + roiGroup_->mapTo(centralWidget(), QPoint(0, 0)).y() + + roiGroup_->height(); + if (roiBot > bot) + bot = roiBot; + } + if (x1 > x0 && bot > top) + strip_->setGeometry(x0, top - 6, x1 - x0, bot - top + 12); + strip_->raise(); + strip_->show(); + } + + // hand the strip its connectors, in its own coordinates + if (strip_ && scGroup_ && sigGroup_ && pedeGroup_ && gainGroup_ && + pmapGroup_ && displayGroup_) { + auto yIn = [&](QWidget *w, int y) { + return w->mapTo(centralWidget(), QPoint(0, 0)).y() + y; + }; + const int stripTop = + strip_->mapTo(centralWidget(), QPoint(0, 0)).y(); + // The signal gate does not change the data, so nothing enters or + // leaves its box: the flow runs from the previous stage to the Gain and + // simply passes the gate, which is drawn as a funnel on that line (the + // gate panel only points at the funnel - see FlowStrip::drawFunnel). + const int funnelY = + yIn(sigGroup_, sigGroup_->height() / 2) - stripTop; + FlowStrip::Path a, b, c; + // 1. storage cell (middle) -> Pedestal (middle): enter from the left + a.yFrom = yIn(scGroup_, scGroup_->height() / 2) - stripTop; + a.yTo = yIn(pedeGroup_, pedeGroup_->height() / 2) - stripTop; + a.dir = +1; + a.cls = FlowPedestal; // into the Pedestal + // Pedestal (bottom) -> the funnel, travelling leftwards (no head: it + // merges into the funnel) + b.yFrom = yIn(pedeGroup_, pedeGroup_->height()) - stripTop; + b.yTo = funnelY; + b.dir = -1; + b.x = FlowStrip::kFunnelX; + b.head = false; + // the funnel -> Gain (top): the flow continues after the gate + c.yFrom = funnelY; + c.yTo = yIn(gainGroup_, 0) - stripTop; + c.dir = +1; + c.x = FlowStrip::kFunnelX; + c.startAtJog = true; + // Gain -> ROI: a rail just left of the right column, so it does not + // have to cross the Display panel. Frames are the ROI-cropped + // product, so this is the frames-mode input of the ROI. + FlowStrip::Path d; + d.yFrom = yIn(gainGroup_, gainGroup_->height() / 2) - stripTop; + d.yTo = roiGroup_ ? (yIn(roiGroup_, roiGroup_->height() / 2) - stripTop) + : 0; + d.dir = 2; + d.on = roiGroup_ != nullptr; + d.cls = FlowData; // corrected when setSaveMode() knows the mode + // the gate block -> Pedestal tracking: the tracker lives off the frames + // the gate *drops*, so it leaves the gate block's top-right corner + FlowStrip::Path e; + e.yFrom = yIn(sigGroup_, 6) - stripTop; + e.yTo = pedeTrackGroup_ + ? (yIn(pedeTrackGroup_, pedeTrackGroup_->height() / 2) - + stripTop) + : 0; + e.dir = +1; + e.on = pedeTrackGroup_ != nullptr; + e.cls = FlowPedestal; // the tracker is the pedestal's own feedback + // Gain -> Virtual photon counting: the calibration reaches the counting + // (its threshold is keV while the gain correction is on). The map is + // built in the left column, so the connector travels leftwards. + FlowStrip::Path f; + f.yFrom = yIn(gainGroup_, gainGroup_->height() - 8) - stripTop; + f.yTo = pmapGroup_ ? (yIn(pmapGroup_, 24) - stripTop) : 0; + f.dir = -1; + f.on = pmapGroup_ != nullptr; + f.cls = FlowNormal; // flipped by setSaveMode() + // Virtual photon counting -> Display: the map is shown (in its own + // window), so this one travels rightwards into the Display. + FlowStrip::Path g; + g.yFrom = pmapGroup_ + ? (yIn(pmapGroup_, pmapGroup_->height() - 8) - stripTop) + : 0; + g.yTo = displayGroup_ + ? (yIn(displayGroup_, displayGroup_->height() / 2) - stripTop) + : 0; + g.dir = +1; + g.on = pmapGroup_ != nullptr && displayGroup_ != nullptr; + // counting -> ROI: with the maps as the saved product this is the + // input of the ROI (they are cropped to it on the way out) + FlowStrip::Path i; + i.yFrom = yIn(pmapGroup_, pmapGroup_->height() - 8) - stripTop; + i.yTo = roiGroup_ ? (yIn(roiGroup_, roiGroup_->height() / 2) - stripTop) + : 0; + i.dir = +1; + i.cls = FlowData; + i.on = roiGroup_ != nullptr; + // raw mode: the storage cell feeds the funnel directly, so the flow + // does not have to pass through the (greyed) Pedestal box. Both + // feeders are always drawn; setStages() decides which one is live. + FlowStrip::Path h; + h.yFrom = yIn(scGroup_, scGroup_->height()) - stripTop; + h.yTo = funnelY; + h.dir = +1; + h.x = FlowStrip::kFunnelX; + h.head = false; // merges into the funnel + strip_->setPaths(a, b, c, d, e, f, g, h, i, funnelY); + bool dp, sp, go, pm; + flowStageStates(dp, sp, go, pm); + strip_->setStages(dp, sp, go, pm); + } + inLayout = false; + + if (getenv("JF_TIMING")) { + printf("[flow] pads: gates %d pede %d gain %d gateArrow %d (passes " + "%d)\n", + flowPads_[0], flowPads_[1], flowPads_[2], flowPads_[3], + flowPass_); + auto rect = [&](QWidget *w) { + return w ? QString("%1,%2 %3x%4") + .arg(w->mapTo(centralWidget(), QPoint(0, 0)).x()) + .arg(w->mapTo(centralWidget(), QPoint(0, 0)).y()) + .arg(w->width()) + .arg(w->height()) + .toStdString() + : std::string("-"); + }; + printf("[rect] sc %s | signal %s | pede %s | track %s | gain %s | " + "roi %s\n", + rect(scGroup_).c_str(), rect(sigGroup_).c_str(), + rect(pedeGroup_).c_str(), rect(pedeTrackGroup_).c_str(), + rect(gainGroup_).c_str(), rect(roiGroup_).c_str()); + printf("[rect] gainToggle %s | keVchk %s | noPede %s | saveStart %s | " + "selectRoi %s | saveRoi %s | quit %s | track %s | pmap %s\n", + rect(btnGainToggle).c_str(), rect(kevChk_).c_str(), + rect(btnNoPede_).c_str(), rect(btnSaveStart).c_str(), + rect(btnSelectRoi_).c_str(), rect(btnSaveRoi).c_str(), + rect(btnQuit).c_str(), rect(btnPedeTrack_).c_str(), + rect(pmapGroup_).c_str()); + printf("[rect] unsetRoi %s | selectRoi %s | thr %s | minPix %s\n", + rect(btnUnsetRoi_).c_str(), rect(btnSelectRoi_).c_str(), + rect(thrSpin_).c_str(), rect(minPixSpin_).c_str()); + printf("[rect] saveFramesRadio %s | savePhotonRadio %s | " + "saveCorrected %s\n", + rect(saveModeFrames_).c_str(), rect(saveModePhoton_).c_str(), + rect(saveCorrected_).c_str()); + } + // The pads and the alignment moves push the panels around *after* the first + // paint; repaint the column area so the space they leave behind does not + // keep the old pixels (that is what left a piece of the "Virtual photon + // counting" title floating next to the Save box). + if (centralWidget()) + centralWidget()->update(); +} + +// Tells the overlay which boxes are in the chain right now: a stage that is +// switched off is skipped, so the arrow steps over it. +// What the ROI panel shows: the ROI the gate is using and how many are saved. +void MainWindow::updateRoiLabel() { + if (!roiListVal_) + return; + QString act = "no ROI selected"; + if (pipeline_.gate().roiSet()) { + int x0 = 0, y0 = 0, x1 = 0, y1 = 0; + pipeline_.gate().roiSnapshot(x0, y0, x1, y1); + act = QString("active %1x%2 at %3,%4") + .arg(x1 - x0) + .arg(y1 - y0) + .arg(x0) + .arg(y0); + } + roiListVal_->setText(QString("%1 | gate: %2 | %3 saved") + .arg(act) + .arg(pipeline_.gate().roiActive() ? "ROI only" + : "full frame") + .arg(roiListLoad().size())); +} + +// One place that says what the keV conversion is using. +void MainWindow::updateGainMapLabel() { + if (!gainMapVal_) + return; + if (!gain_flag.load()) + gainMapVal_->setText("gain off: PH spectra in ADU"); + else if (gainMapLoaded()) + gainMapVal_->setText(QFileInfo(QString::fromStdString(g_cfg.gainMapFile)) + .fileName()); + else if (kevChk_ && kevChk_->isChecked()) + gainMapVal_->setText( + "no gain map selected - using nominal values (40 ADU/keV)"); + else + gainMapVal_->setText("no gain map loaded : using defaults"); +} + +void MainWindow::updateFlow() { + const bool pede = PedestalStore::instance().loaded() && !gNoPede.load(); + const bool gain = gain_flag.load(); + const bool scAll = !scCombo_ || scCombo_->currentIndex() <= 0; + const bool gateOn = !gateChk_ || gateChk_->isChecked(); + // The arrows are static: the chain is always drawn the same way, and a + // stage that is not in use is greyed out instead, so the bypass is obvious + // without the arrows moving. + // the stage's own switch stays black: Pede/Raw, Gate enabled and the gain + // button are how a bypassed stage is switched back on + greyStage(pedeGroup_, !pede, {btnNoPede_}); + // the Gain panel follows the gain toggle alone; the keV checkbox keeps its + // tick for next time but is greyed while the gain is off, and the plots + // fall back to ADU + greyStage(gainGroup_, !gain, {btnGainToggle}); + if (kevChk_) + kevChk_->setEnabled(gain); + if (gainStateChk_) + gainStateChk_->setChecked(gain); // read-only indicator, no signals + // a gate that is switched off greys out exactly like a bypassed stage + // Greyed when it cannot be *selected* (the tracker needs the signal gate), + // NOT when it is merely inactive: the label under the button says whether + // tracking is on, so the box must not go grey just because it is off. + greyStage(pedeTrackGroup_, !gateOn); + greyStage(scGroup_, scAll, {scCombo_}); // storage-cell filter == ALL + greyStage(sigGroup_, !gateOn, {gateChk_}); // signal gate off == passthrough + // photon counting needs a pedestal (it thresholds the pede-subtracted + // ADC), so the whole virtual-photon-counting box is a bypassed stage when + // the pedestal is out of the chain - the display map goes empty with it + greyStage(pmapGroup_, !pede); + // pedestal tracking only makes sense with the signal gate on: enable the + // button here, but do not flip it (the gate's own handler does that when it + // is switched off, so --pede-tracking survives start-up) + if (btnPedeTrack_) + btnPedeTrack_->setEnabled(gateOn); + if (pedeTrackVal_) { + const PedeTrackStats ts = pedeTrackerStats(); + if (!ts.on) + pedeTrackVal_->setText("off"); + else + pedeTrackVal_->setText( + QString("on: %1 samples, delta %2 ADU, %3 updates") + .arg(static_cast(ts.samples)) + .arg(ts.maxDiff, 0, 'f', 1) + .arg(static_cast(ts.updates))); + } + // the gate threshold is applied to the raw 14-bit value when no pedestal + // is in play, so say so instead of claiming "pede-subtracted" + if (thrLabel_) { + const bool raw = gNoPede.load() || !PedestalStore::instance().loaded(); + thrLabel_->setText(raw ? "Threshold (raw ADC - no pede):" + : "Threshold (ADC, pede-subtracted):"); + } + // The data path (orange) follows the save mode: frames are written from the + // ROI, photon maps from the virtual photon counter. Only the colours + // change - the connectors themselves never move. + { + // only the branch that actually feeds the file is drawn, and it is + // orange - the frames come from the ROI, the maps from the counting + bool pmap = false, savePede = false; + bool dPede, gOn; + flowStageStates(dPede, savePede, gOn, pmap); + // the file is always entered through the ROI: the maps are cropped to + // it on the way out, so this arrow never moves and is always orange + if (arrRoiDown_) { + setFlowArrowClass(arrRoiDown_, FlowData); + arrRoiDown_->setVisible(true); + } + if (strip_) + strip_->setStages(dPede, savePede, gOn, pmap); + } + updateGainMapLabel(); + updateRoiLabel(); + if (noPedeVal_) { + if (gNoPede.load()) + noPedeVal_->setText("no pede: raw ADC"); + else if (PedestalStore::instance().loaded()) + noPedeVal_->setText("pede subtracted"); + else + noPedeVal_->setText("no pedestal loaded"); + } +} + +void MainWindow::showEvent(QShowEvent *event) { + QMainWindow::showEvent(event); + flowPass_ = 0; + layoutFlow(); +} + +void MainWindow::resizeEvent(QResizeEvent *event) { + QMainWindow::resizeEvent(event); + if (!flowQueued_) + flowPass_ = 0; // a fresh solve for the new geometry + layoutFlow(); +} + +void MainWindow::closeEvent(QCloseEvent *event) { + if (!confirmQuit()) { + event->ignore(); // the operator changed their mind + return; + } + stop(); + closeSideWindows(); + event->accept(); + // ...and end the program even if a side window somehow refused to close + QApplication::quit(); +} + +// --------------------------------------------------------------------------- +// periodic GUI work +// --------------------------------------------------------------------------- +void MainWindow::processImages() { + updateReceiverRoiOverlay(); // cheap when the ROI did not change + if (goout.load() == 0) + return; + std::lock_guard lock(pipeline_.images().mtx); + if (!pipeline_.images().ready) + return; + // ADC and gain are always the raw 1024x512 layout (ROI selection on them + // stays in raw data coordinates, also in a JFSTRX build) + m_adcView->setImageCopy(pipeline_.images().adc.data(), kRawWidth, + kRawHeight); + if (m_photonView && pipeline_.images().photonReady && + pipeline_.images().photonSeq != pmapSeq_ && + !pipeline_.images().photon.empty()) { + pmapSeq_ = pipeline_.images().photonSeq; + m_photonView->setImageCopy(pipeline_.images().photon.data(), kRawWidth, + 512); + m_photonView->update(); + } + m_gainView->setImageCopy(pipeline_.images().gain.data(), kRawWidth, + kRawHeight); +#ifdef JFSTRX + if (pipeline_.images().panelsReady) { + for (int p = 0; p < kNumAdcPanels; p++) { + if (m_adcPanelView[p] && !pipeline_.images().panels[p].empty()) + m_adcPanelView[p]->setImageCopy( + pipeline_.images().panels[p].data(), kAdcPanelW[p], + kAdcPanelH[p]); + } + } +#endif + pipeline_.images().ready = false; +} + +// Mirrors the receiver ROI ("rx_roi" in the stream header) onto the ADC image +// as the RED box, next to the yellow gate ROI. The ADC image is the raw +// 1024x512 layout, so this is always a plain rectangle in raw coordinates. +void MainWindow::updateReceiverRoiOverlay() { + if (!m_adcView) + return; + const int xmin = rxRoiXmin.load(); + const int xmax = rxRoiXmax.load(); + const int ymin = rxRoiYmin.load(); + const int ymax = rxRoiYmax.load(); + if (!rxRoiValid.load() || xmax <= xmin || ymax <= ymin) { + if (m_rxRoiShown) { + m_adcView->setReceiverRoiRect(0, 0, 0, 0, false); + m_rxRoiShown = false; + } + return; + } + if (m_rxRoiShown && xmin == m_rxRoiLast[0] && xmax == m_rxRoiLast[1] && + ymin == m_rxRoiLast[2] && ymax == m_rxRoiLast[3]) + return; + m_adcView->setReceiverRoiRect(xmin, ymin, xmax + 1, ymax + 1, true); + m_rxRoiShown = true; + m_rxRoiLast[0] = xmin; + m_rxRoiLast[1] = xmax; + m_rxRoiLast[2] = ymin; + m_rxRoiLast[3] = ymax; +} + +void MainWindow::updateStatus() { + const GateEngine::Counters s = pipeline_.gate().snapshot(); + const QLocale loc; + + frameLabel->setText( + QString("Frames: display %1 | in stream %2 | gap %3") + .arg(loc.toString(static_cast(pipeline_.displayFrames()))) + .arg(loc.toString(static_cast(s.framesIn))) + .arg(loc.toString(static_cast(s.framesIn - + s.framesPass)))); + + // Stream state comes from ZMQ socket monitoring: an idle-but-alive + // receiver is reported as connected, never as "stopped". + QString streamTxt; + for (size_t k = 0; k < pipeline_.portCount(); k++) { + double since = 0.0; + const Pipeline::StreamState st = + pipeline_.streamState(static_cast(k), &since); + QString one; + switch (st) { + case Pipeline::StreamState::Disconnected: + one = "disconnected"; + break; + case Pipeline::StreamState::Connecting: + one = "waiting..."; + break; + case Pipeline::StreamState::Connected: + one = "connected"; + break; + case Pipeline::StreamState::Idle: + one = QString("connected (no frames for %1 s)").arg(since, 0, 'f', 1); + break; + case Pipeline::StreamState::EndOfAcq: + one = "connected (end of acquisition)"; + break; + } + const int w = pipeline_.portWidth(static_cast(k)); + const int h = pipeline_.portHeight(static_cast(k)); + const QString geo = + (w > 0 && h > 0) ? QString(" [%1x%2]").arg(w).arg(h) : QString(); + if (k) + streamTxt += "\n"; + streamTxt += QString("%1: %2%3 (%4 frames, last #%5)") + .arg(pipeline_.portList()[k]) + .arg(one) + .arg(geo) + .arg(pipeline_.portFrames(static_cast(k))) + .arg(pipeline_.portLastFrame(static_cast(k))); + } + streamVal_->setText(streamTxt); + + // frame-index alignment: delta between the newest frames of each + // interface, plus what had to be discarded to stay aligned + if (pipeline_.portCount() > 1) { + const qlonglong f0 = static_cast( + pipeline_.portLastFrame(0)); + const qlonglong f1 = static_cast( + pipeline_.portLastFrame(1)); + alignVal_->setText( + QString("delta %1 | aligned %2 | resync drops %3 | behind drops " + "%4 | unpaired %5") + .arg(f1 - f0) + .arg(loc.toString(static_cast(s.framesIn))) + .arg(loc.toString( + static_cast(pipeline_.resyncDrops()))) + .arg(loc.toString( + static_cast(pipeline_.behindDrops()))) + .arg(loc.toString( + static_cast(pipeline_.incompleteFrames())))); + alignVal_->setVisible(true); + } else { + alignVal_->setVisible(false); + } + if (s.pedeLoaded) + pedeVal_->setText(QString("loaded (%1)%2") + .arg(QString::fromStdString(g_cfg.pedeFile)) + .arg(gPedeTracked.load() ? " [tracked]" + : "")); + else + pedeVal_->setText("not loaded"); + + displayDropVal_->setText( + loc.toString(static_cast(pipeline_.displayDropped()))); + + const QString err = QString::fromStdString(s.lastError); + errVal_->setText(err.isEmpty() ? QString() : QString("Last error: %1").arg(err)); + + framesInCumVal_->setText(loc.toString(static_cast(s.framesIn))); + framesInCurVal_->setText(loc.toString(static_cast(s.framesInCur))); + framesPassCumVal_->setText( + loc.toString(static_cast(s.framesPass))); + framesPassCurVal_->setText( + loc.toString(static_cast(s.framesPassCur))); + framesDropCumVal_->setText( + loc.toString(static_cast(s.framesDrop))); + framesDropCurVal_->setText( + loc.toString(static_cast(s.framesDropCur))); + updateFlow(); // the pedestal/gain state may have changed since last time + + scDropCumVal_->setText( + loc.toString(static_cast(s.framesScDrop))); + scDropCurVal_->setText( + loc.toString(static_cast(s.framesScDropCur))); + if (scLastVal_) + scLastVal_->setText(s.lastSc < 0 + ? QString("last frame: ? (no SC in header)") + : QString("last frame: SC %1").arg(s.lastSc)); + pixelsAboveCumVal_->setText( + loc.toString(static_cast(s.pixelsAbove))); + pixelsAboveCurVal_->setText( + loc.toString(static_cast(s.pixelsAboveCur))); + rateInVal_->setText(QString("%1 fps / %2 MB/s") + .arg(loc.toString(s.rateIn, 'f', 1)) + .arg(loc.toString(s.rateInMBs, 'f', 1))); + ratePassVal_->setText(QString("%1 fps / %2 MB/s") + .arg(loc.toString(s.ratePass, 'f', 1)) + .arg(loc.toString(s.ratePassMBs, 'f', 1))); + dropFracVal_->setText(loc.toString(s.dropFrac, 'f', 3)); + + if (pipeline_.pedeAcquireActive()) + statusLabel->setText( + QString("Status: acquiring pede... %1 frames") + .arg(pipeline_.pedeAcquireProgress())); + + // ROI save progress + auto-stop detection (budget reached) + if (pipeline_.saver().running()) { + if (m_saveWasRunning != true) { + m_saveWasRunning = true; + if (btnSaveStart) + btnSaveStart->setChecked(true); + } + updateSaveLabel(); + } else if (m_saveWasRunning) { + m_saveWasRunning = false; + if (btnSaveStart) + btnSaveStart->setChecked(false); + applySaveLock(false); // the run ended (user, budget or error) + updateFlow(); + updateSaveLabel(); + const RoiSaver::Status st = pipeline_.saver().status(); + statusLabel->setText(QString("Status: ROI save stopped (%1), %2 saved") + .arg(QString::fromStdString(st.stopReason)) + .arg(st.saved)); + } + + // gate ROI, for the headless line + char roiTxt[64]; + if (pipeline_.gate().roiActive()) { + int rx0, ry0, rx1, ry1; + pipeline_.gate().roiSnapshot(rx0, ry0, rx1, ry1); + snprintf(roiTxt, sizeof(roiTxt), "%dx%d@%d,%d", rx1 - rx0, ry1 - ry0, + rx0, ry0); + } else { + snprintf(roiTxt, sizeof(roiTxt), "off"); + } + + // ROI save state, for the headless line + char saveTxt[96]; + { + const RoiSaver::Status ss = pipeline_.saver().status(); + // the first number is whatever this mode writes: frames or maps + const unsigned long long n = + (unsigned long long)(ss.photonMode ? ss.pmaps : ss.saved); + if (ss.running && ss.photonMode) + snprintf(saveTxt, sizeof(saveTxt), "%llumap/%llu", n, + (unsigned long long)ss.dropped); + else if (ss.running) + snprintf(saveTxt, sizeof(saveTxt), "%llu/%llu", n, + (unsigned long long)ss.dropped); + else if (!ss.h5Path.empty()) + snprintf(saveTxt, sizeof(saveTxt), "done:%llu%s/%llu", n, + ss.photonMode ? "map" : "", + (unsigned long long)ss.dropped); + else + snprintf(saveTxt, sizeof(saveTxt), "off"); + } + + // optional headless monitoring: the counter line the old CLI printed + if (g_cfg.printCounters) { + static int tick = 0; + if (++tick >= 2) { // updateStatus() runs every 500 ms + tick = 0; + printf("in=%llu pass=%llu drop=%llu inrate=%.1f passrate=%.1f " + "dropfrac=%.3f px=%llu display=%llu displaydrop=%llu " + "stream=%s resync=%llu behind=%llu incomplete=%llu " + "ports=%s workers=%d roi=%s save=%s gainmap=%s sc=%s " + "scdrop=%llu pthr=%g%s kev=%s ptrack=%s shown=%llu\n", + static_cast(s.framesIn), + static_cast(s.framesPass), + static_cast(s.framesDrop), s.rateIn, + s.ratePass, s.dropFrac, + static_cast(s.pixelsAbove), + static_cast(pipeline_.displayFrames()), + static_cast(pipeline_.displayDropped()), + pipeline_.streamStateName(), + static_cast(pipeline_.resyncDrops()), + static_cast(pipeline_.behindDrops()), + static_cast( + pipeline_.incompleteFrames()), + pipeline_.streamStateSummary().c_str(), + g_cfg.analysisWorkers, roiTxt, saveTxt, + gainMapLoaded() ? "loaded" : "off", + s.scFilter < 0 ? "all" : std::to_string(s.scFilter).c_str(), + static_cast(s.framesScDrop), + static_cast(gain_flag.load() ? g_pheneThresholdKev + : g_pheneThreshold), + gain_flag.load() ? "keV" : "ADU", + (kevSpectra.load() && gain_flag.load()) + ? (gainMapLoaded() ? "loaded" : "nominal") + : "off", + gPedeTracking.load() + ? (pedeTrackerStats().updates > 0 ? "on-upd" : "on") + : "off", + static_cast(pipeline_.imagesShown())); + fflush(stdout); + } + } +} + +void MainWindow::checkSignals() { + if (g_sigCount == 0) + return; + if (g_sigCount > 1) + std::_Exit(0); + printf("[shutdown] signal received, stopping threads\n"); + fflush(stdout); + statusLabel->setText("Status: stopping..."); + stop(); + QApplication::quit(); +} + +// --------------------------------------------------------------------------- +// actions +// --------------------------------------------------------------------------- +void MainWindow::toggleStartPause() { + if (goout.load() == 0) { + goout = 1; + statusLabel->setText("Status: running"); + } else { + goout = 0; + statusLabel->setText("Status: paused"); + } +} + +void MainWindow::faster() { + int v = int(HDraw_every.load() * 0.8f); + if (v < 1) + v = 1; + HDraw_every = v; + cout << endl << "Drawing every " << HDraw_every.load() << " frames" << endl; + updateDrawLabel(); +} + +void MainWindow::slower() { + int cur = HDraw_every.load(); + int v = int(cur * 1.25f); + if (v <= cur) + v = cur + 1; // avoid 1->1 + HDraw_every = v; + cout << endl << "Drawing every " << HDraw_every.load() << " frames" << endl; + updateDrawLabel(); +} + +// "Apply gain": divide the pixels by their ADU/keV (map if loaded, otherwise +// the nominal 40) so the keV spectra are physically meaningful. The plots show +// keV only while this is pushed and "keV PH" is ticked. +void MainWindow::toggleGain() { + if (btnGainToggle) + btnGainToggle->setChecked(!btnGainToggle->isChecked()); +} + +void MainWindow::setApplyGain(bool on) { + // The photon-counting threshold is in ADU with the gain off and in keV with + // it on: keep the value that is on screen in its own unit and show the + // other one, so toggling the gain never destroys either number. + if (photonThrSpin_) { + const double shown = photonThrSpin_->value(); + if (on) + g_pheneThreshold = static_cast(shown); // it was ADU + else + g_pheneThresholdKev = static_cast(shown); // it was keV + const QSignalBlocker block(photonThrSpin_); // no handler round trip + photonThrSpin_->setDecimals(on ? 1 : 0); + photonThrSpin_->setSingleStep(on ? 0.5 : 10.0); + photonThrSpin_->setValue(static_cast( + on ? g_pheneThresholdKev : g_pheneThreshold)); + if (photonThrLabel_) + photonThrLabel_->setText(on ? "photon threshold (keV):" + : "photon threshold (ADU):"); + } + gain_flag = on; + // Toggling the gain mid-save changes the unit of the photon counting, so + // the maps written from here on use the other one while the JSON keeps the + // value it recorded at save start. Say it out loud instead of leaving a + // file with two incompatible scales. + if (gSaveMode.load() == 1 && pipeline_.saver().status().running) { + printf("[gain] warning: the photon-counting unit is now %s while a " + "photon-map save is running - maps written from here on use the " + "new unit, the JSON keeps the one from save start\n", + on ? "keV" : "ADU"); + fflush(stdout); + } + updateFlow(); // the arrows bypass the Gain box when it is off + printf("[gain] apply gain %s (ADU/keV: %s)\n", on ? "ON" : "off", + on ? (gainMapLoaded() ? "from the gain map" : "nominal 40") : "-"); + fflush(stdout); + statusLabel->setText(on ? (gainMapLoaded() + ? "Status: apply gain on (per-pixel map)" + : "Status: apply gain on (nominal 40 ADU/keV)") + : "Status: apply gain off (raw ADC)"); +} + +void MainWindow::bwPalette1() { + RootCmd c; + c.type = RootCmdType::PaletteBW1; + pushRootCmd(c); + m_adcView->setPaletteLut(paletteLut(Palette::BW1)); // same colours as ROOT + statusLabel->setText("Status: BW palette"); +} + +void MainWindow::bwPalette2() { + RootCmd c; + c.type = RootCmdType::PaletteBW2; + pushRootCmd(c); + m_adcView->setPaletteLut(paletteLut(Palette::BW2)); + statusLabel->setText("Status: BW palette 2"); +} + +void MainWindow::colPal() { + RootCmd c; + c.type = RootCmdType::PaletteColor; + pushRootCmd(c); + m_adcView->setPaletteLut(paletteLut(Palette::Color)); + statusLabel->setText("Status: colour palette"); +} + +// The ADC widget works in DISPLAY coordinates (row 0 = top of the widget), +// while every ROOT plot and the gate use DATA coordinates (row 0 = bottom, +// (0,0) = bottom-left). This is the single place where the two meet: the +// gain view follows in display coordinates, the ROOT photon map gets the +// range converted to data rows AND framed on pixel edges (the histogram has +// one bin per pixel centred on the integer coordinate, so showing display rows +// [y1,y2) means the data range [ny-y2-0.5, ny-y1-0.5]). +void MainWindow::zoomTo(double x1, double y1, double x2, double y2) { + if (x2 - x1 < 2 || y2 - y1 < 2) + return; // never push a degenerate range to the ROOT canvases + if (m_gainView) + m_gainView->setViewport(x1, y1, x2, y2); + if (m_photonView) + m_photonView->setViewport(x1, y1, x2, y2); + const double ny = + (m_adcView && m_adcView->imageHeight() > 0) + ? static_cast(m_adcView->imageHeight()) + : 512.0; + RootCmd c; + c.type = RootCmdType::Zoom; + c.a = x1 - 0.5; + c.b = ny - y2 - 0.5; + c.c = x2 - 0.5; + c.d = ny - y1 - 0.5; + pushRootCmdCoalesced(c); +} + +// The gate ROI is captured from the ADC viewport when the button is pressed +// and then stays fixed, so the operator can keep panning/zooming the image. +// The viewport is in DISPLAY coordinates (row 0 at the top) while the gate +// works in DATA rows (row 0 at the bottom), hence the vertical flip. +void MainWindow::toggleGateRoi(bool on) { + if (on && m_applyingRoi) + return; // ROI was set directly by applyRoi(); do not re-capture + + if (!on) { // stop restricting, but keep the current ROI + pipeline_.gate().setRoiOnly(false); + pipeline_.gate().resetCounters(); + printf("[roi] gate over the full frame (current ROI kept)\n"); + fflush(stdout); + statusLabel->setText( + "Status: gate over the full frame (ROI kept as the current one)"); + updateRoiLabel(); + return; + } + if (!pipeline_.gate().roiSet()) { + QMessageBox::warning( + this, "ROI only", + "No ROI selected.\n\nUse \"Select ROI (ADC zoom)\" in the ROI " + "panel (zoom the ADC image first), or pick one with " + "\"Load ROI...\", then press ROI only again."); + btnGateRoi->setChecked(false); // leave it unselected + return; + } + pipeline_.gate().setRoiOnly(true); + pipeline_.gate().resetCounters(); + int x0 = 0, y0 = 0, x1 = 0, y1 = 0; + pipeline_.gate().roiSnapshot(x0, y0, x1, y1); + printf("[roi] gate restricted to the current ROI x=%d..%d y=%d..%d\n", x0, + x1, y0, y1); + fflush(stdout); + statusLabel->setText(QString("Status: gate restricted to the current ROI " + "%1x%2 at %3,%4") + .arg(x1 - x0) + .arg(y1 - y0) + .arg(x0) + .arg(y0)); + updateRoiLabel(); +} + +// Selects the ADC zoom as the current ROI. Selection only: whether the gate +// is restricted to it is the "ROI only" button's business. +void MainWindow::captureRoi() { + if (!m_adcView || !m_adcView->hasImage()) { + QMessageBox::information( + this, "Select ROI", + "No image yet - wait for frames and zoom the ADC image first."); + return; + } + double vx = 0, vy = 0, vw = 0, vh = 0; + m_adcView->viewport(vx, vy, vw, vh); + const int imgW = m_adcView->imageWidth(); + const int imgH = m_adcView->imageHeight(); + + int x0 = static_cast(std::floor(vx)); + int x1 = static_cast(std::ceil(vx + vw)); + const int dy0 = static_cast(std::floor(vy)); + const int dy1 = static_cast(std::ceil(vy + vh)); + // display row d <-> data row (imgH - 1 - d) + int y0 = imgH - dy1; + int y1 = imgH - dy0; + if (x0 < 0) x0 = 0; + if (y0 < 0) y0 = 0; + if (x1 > imgW) x1 = imgW; + if (y1 > imgH) y1 = imgH; + + pipeline_.gate().setRoi(x0, y0, x1, y1); + if (!pipeline_.gate().roiSet()) { // too small to be useful + QMessageBox::information(this, "Select ROI", + "The selected region is too small."); + return; + } + if (m_adcView) + m_adcView->setOverlayRect(x0, y0, x1, y1, true); + if (gateRoiVal_) + gateRoiVal_->setText(QString("%1x%2 at %3,%4 (data rows)") + .arg(x1 - x0) + .arg(y1 - y0) + .arg(x0) + .arg(y0)); + printf("[roi] current ROI x=%d..%d y=%d..%d (%dx%d px, data rows, row 0 = " + "bottom) selected from the ADC zoom\n", + x0, x1, y0, y1, x1 - x0, y1 - y0); + fflush(stdout); + updateRoiLabel(); + statusLabel->setText( + QString("Status: ROI %1x%2 at %3,%4 is the current ROI%5") + .arg(x1 - x0) + .arg(y1 - y0) + .arg(x0) + .arg(y0) + .arg(pipeline_.gate().roiActive() + ? " (gate restricted to it)" + : " - press \"ROI only\" to restrict the gate")); +} + +// Adds the active gate ROI to the list file in the program folder. +void MainWindow::saveRoi() { + if (!pipeline_.gate().roiSet()) { + QMessageBox::information( + this, "Save ROI", + "No ROI selected.\n\nZoom the ADC image and press " + "\"Select ROI (ADC zoom)\" first (or load one from the list)."); + return; + } + int x0, y0, x1, y1; + pipeline_.gate().roiSnapshot(x0, y0, x1, y1); + const int w = x1 - x0, h = y1 - y0; + if (!roiListUpsert(x0, y0, w, h)) { + QMessageBox::warning(this, "Save ROI", + QString("Could not write %1") + .arg(QString::fromStdString(g_cfg.roiFile))); + return; + } + const size_t n = roiListLoad().size(); + updateRoiLabel(); + statusLabel->setText(QString("Status: ROI %1x%2 at %3,%4 saved (%5 in list)") + .arg(w).arg(h).arg(x0).arg(y0).arg(n)); +} +// Applies a ROI to the gate without capturing the ADC viewport, and makes +// sure the "ROI only" button reflects that the gate is restricted. +void MainWindow::applyRoi(int x, int y, int w, int h, const QString &src, + bool restrict) { + pipeline_.gate().setRoi(x, y, x + w, y + h); + if (!pipeline_.gate().roiSet()) { + QMessageBox::information(this, "Load ROI", + "That entry is too small to use."); + return; + } + // -1 = keep the current restriction, 0/1 = force it off/on + if (restrict) + pipeline_.gate().setRoiOnly(true); + pipeline_.gate().resetCounters(); + if (m_adcView) + m_adcView->setOverlayRect(x, y, x + w, y + h, true); + printf("[roi] current ROI x=%d..%d y=%d..%d (%dx%d px, data rows, row 0 = " + "bottom) applied from %s\n", + x, x + w, y, y + h, w, h, src.toLocal8Bit().constData()); + fflush(stdout); + if (gateRoiVal_) + gateRoiVal_->setText(QString("%1x%2 at %3,%4 (data rows)") + .arg(w).arg(h).arg(x).arg(y)); + updateRoiLabel(); + statusLabel->setText( + QString("Status: ROI %1x%2 at %3,%4 is the current ROI (from %5)%6") + .arg(w).arg(h).arg(x).arg(y).arg(src) + .arg(pipeline_.gate().roiActive() + ? " - gate restricted to it" + : " - press \"ROI only\" to restrict the gate")); +} + +// List of saved ROIs, most recently saved/loaded first. +void MainWindow::loadRoiDialog() { + std::vector list = roiListLoad(); + if (list.empty()) { + QMessageBox::information( + this, "Load ROI", + QString("The ROI list is empty.\n\nPress \"Save ROI\" with a " + "gate ROI active; entries are kept in %1.") + .arg(QString::fromStdString(g_cfg.roiFile))); + return; + } + + QDialog dialog(this); + dialog.setWindowTitle("Load gate ROI"); + dialog.resize(520, 320); + auto *lay = new QVBoxLayout(&dialog); + auto *table = new QTableWidget(static_cast(list.size()), 5, &dialog); + table->setHorizontalHeaderLabels( + QStringList() << "X" << "Y" << "width" << "height" << "last used"); + table->verticalHeader()->setVisible(false); + table->setSelectionBehavior(QAbstractItemView::SelectRows); + table->setSelectionMode(QAbstractItemView::SingleSelection); + table->setEditTriggers(QAbstractItemView::NoEditTriggers); + const QLocale loc; + for (size_t i = 0; i < list.size(); i++) { + const RoiEntry &e = list[i]; + const QString when = QDateTime::fromMSecsSinceEpoch(e.usedMs) + .toString("yyyy-MM-dd HH:mm:ss"); + const QString cells[5] = { + loc.toString(e.x), loc.toString(e.y), loc.toString(e.w), + loc.toString(e.h), when}; + for (int c = 0; c < 5; c++) + table->setItem(static_cast(i), c, + new QTableWidgetItem(cells[c])); + } + table->resizeColumnsToContents(); + table->selectRow(0); // newest first, pre-selected + lay->addWidget(table); + // the same convention as the ADC image and every ROOT plot + auto *hint = new QLabel( + "X/Y are data coordinates: x grows to the right, y grows upwards and " + "(0,0) is the bottom-left pixel.", + &dialog); + hint->setWordWrap(true); + lay->addWidget(hint); + + auto *btns = new QDialogButtonBox(&dialog); + btns->addButton("Apply", QDialogButtonBox::AcceptRole); + auto *delBtn = btns->addButton("Delete", QDialogButtonBox::DestructiveRole); + btns->addButton(QDialogButtonBox::Cancel); + lay->addWidget(btns); + connect(btns, &QDialogButtonBox::accepted, &dialog, &QDialog::accept); + connect(btns, &QDialogButtonBox::rejected, &dialog, &QDialog::reject); + connect(table, &QTableWidget::itemDoubleClicked, &dialog, + [&dialog](QTableWidgetItem *) { dialog.accept(); }); + + bool deleted = false; + connect(delBtn, &QPushButton::clicked, &dialog, [&]() { + const int r = table->currentRow(); + if (r < 0 || r >= static_cast(list.size())) + return; + const RoiEntry &e = list[r]; + if (!roiListRemove(e.x, e.y, e.w, e.h)) { + QMessageBox::warning(this, "Load ROI", + QString("Could not write %1") + .arg(QString::fromStdString( + g_cfg.roiFile))); + return; + } + deleted = true; + table->removeRow(r); // keep the dialog open for further edits + }); + + if (dialog.exec() != QDialog::Accepted) { + if (deleted) + statusLabel->setText("Status: ROI entry deleted"); + return; + } + const int row = table->currentRow(); + if (row < 0 || row >= static_cast(list.size())) + return; + const RoiEntry e = list[row]; + // refresh the timestamp so it comes back first next time + roiListUpsert(e.x, e.y, e.w, e.h); + applyRoi(e.x, e.y, e.w, e.h, "list"); +} + +void MainWindow::resetHis() { + requestHistoReset(); + statusLabel->setText("Status: histograms reset"); +} + +void MainWindow::resetAxis() { + RootCmd c; + c.type = RootCmdType::ResetAxes; + pushRootCmd(c); + // The ADC view is the master of the zoom, so unzooming only the ROOT + // clones would leave the images (and, through the next drag, the photon + // map) still zoomed: reset the widget viewports as well. + if (m_adcView) + m_adcView->resetView(); // propagates to the gain view + photon map + statusLabel->setText("Status: axes reset"); +} + +// Starts/stops writing the gate-passed ROI frames to HDF5. +void MainWindow::toggleRoiSave(bool on) { + RoiSaver &sv = pipeline_.saver(); + if (!on) { + if (sv.running()) { + sv.requestStop("user"); + statusLabel->setText("Status: finishing ROI save (flushing)..."); + applySaveLock(false); // the run is over, settings are free again + updateFlow(); + updateSaveLabel(); + } + return; + } + if (sv.running()) { + btnSaveStart->setChecked(false); + return; + } + // No gate ROI is fine: roiSnapshot() then reports the full frame, so the + // save writes the whole image instead of refusing to start. + + RoiSaver::StartInfo info; + int x0, y0, x1, y1; + pipeline_.gate().roiSnapshot(x0, y0, x1, y1); + info.x = x0; + info.y = y0; + info.w = x1 - x0; + info.h = y1 - y0; + info.maxFrames = static_cast(saveFrames_->value()); + info.photonMode = saveModePhoton_ && saveModePhoton_->isChecked(); + info.photonEvery = pmapSaveSpin_ ? pmapSaveSpin_->value() : 2000; + info.photonThreshold = gain_flag.load() ? g_pheneThresholdKev + : g_pheneThreshold; + info.photonKev = gain_flag.load(); + gGateChangedDuringSave.store(false); // fresh run, fresh note + pmapSaveReset(); // start the first saved map from scratch + info.dir = saveDirEdit_->text().trimmed().toStdString(); + if (info.dir.empty()) + info.dir = "."; + info.baseName = saveBaseEdit_->text().trimmed().toStdString(); + if (info.baseName.empty()) + info.baseName = "jfroi"; + + // pedestal in the same ROI (gain 0): slice 0 in raw mode, the + // "/pedestal data" dataset in corrected mode + std::shared_ptr peds = PedestalStore::instance().get(); + info.corrected = saveCorrected_->isChecked() && !gNoPede.load(); + if (info.corrected && !peds) { + QMessageBox::information( + this, "ROI save", + "Pedestal-corrected saving needs a pedestal.\n\nRead or acquire " + "one first, or switch the option off to save raw data."); + btnSaveStart->setChecked(false); + return; + } + // the correction itself needs the full-frame pedestal set + info.peds = peds; + // Virtual photon counting thresholds the PEDESTAL-SUBTRACTED ADC, so a map + // without a pedestal would be empty: refuse the save instead of writing + // empty maps (same policy as "Pedestal corrected" above). + if (info.photonMode && (!peds || gNoPede.load())) { + const char *why = peds ? "\"No pede\" is on" : "no pedestal is loaded"; + printf("[save] refusing virtual photon counting: %s, and the photon " + "map thresholds the pedestal-subtracted ADC\n", why); + fflush(stdout); + statusLabel->setText( + QString("Status: virtual photon counting needs a pedestal (%1)") + .arg(QString::fromLatin1(why))); + // a scripted start (--start-save) must not wait on a modal dialog + if (!g_cfg.startSave) { + QMessageBox::warning( + this, "Virtual photon counting", + QString("Virtual photon counting thresholds the " + "pedestal-subtracted ADC, but %1.\n\nLoad or acquire " + "a pedestal and clear \"No pede\" first (or save " + "frames instead).") + .arg(QString::fromLatin1(why))); + } + btnSaveStart->setChecked(false); + updateSaveLabel(); + return; + } + info.useGain = gain_flag.load(); + info.g1off = G1Poffset.load(); + info.g2off = G2Poffset.load(); + if (peds) { + // the ROI is in raw data coordinates (the ADC image is unmapped), and + // g0 is the raw 1024x512 pedestal even in a JFSTRX build + info.pedestal.resize(static_cast(info.w) * info.h, 0.0f); + for (int y = 0; y < info.h; y++) { + const int sy = info.y + y; + for (int x = 0; x < info.w; x++) { + const int sx = info.x + x; + if (sy >= 0 && sy < kRawHeight && sx >= 0 && sx < kRawWidth) + info.pedestal[static_cast(y) * info.w + x] = + peds->g0[static_cast(sy) * kRawWidth + sx]; + } + } + } + + // gate criteria in force at the start + const GateEngine::Counters g0 = pipeline_.gate().snapshot(); + // read from the engine: the operator can change these while running, and + // g_cfg keeps the startup snapshot + info.gate.enabled = pipeline_.gate().enabled(); + info.gate.threshold = pipeline_.gate().threshold(); + info.gate.minPixels = pipeline_.gate().minPixels(); + info.gate.contiguous = pipeline_.gate().contiguous(); + info.gate.roiActive = true; + info.gate.noPede = gNoPede.load(); + info.gate.roiX = x0; + info.gate.roiY = y0; + info.gate.roiW = info.w; + info.gate.roiH = info.h; + info.gateAtEnd = g0; + { + char buf[256]; + snprintf(buf, sizeof(buf), + "{\"enabled\":%s,\"threshold\":%.3f,\"min_pixels\":%llu," + "\"contiguous\":%s,\"storage_cell\":%d,\"no_pede\":%s}", + g_cfg.gateEnabled ? "true" : "false", + static_cast(g_cfg.threshold), + static_cast(g_cfg.minPixels), + g_cfg.contiguous ? "true" : "false", + pipeline_.gate().scFilter(), + gNoPede.load() ? "true" : "false"); + info.gateJson = buf; + } + // exact end-of-run statistics, refreshed by the writer when it finishes + info.statsProvider = [this](GateEngine::Counters &g, RunStats &st, + std::vector &ports) { + g = pipeline_.gate().snapshot(); + st.resync = pipeline_.resyncDrops(); + st.behind = pipeline_.behindDrops(); + st.unpaired = pipeline_.incompleteFrames(); + st.displayFrames = pipeline_.displayFrames(); + st.displayDropped = pipeline_.displayDropped(); + ports.clear(); + for (size_t i = 0; i < pipeline_.portCount(); i++) { + StreamInfo si; + si.port = pipeline_.portList()[i]; + si.state = pipeline_.streamStateName( + pipeline_.streamState(static_cast(i))); + si.frames = pipeline_.portFrames(static_cast(i)); + si.lastFrame = pipeline_.portLastFrame(static_cast(i)); + ports.push_back(si); + } + }; + + std::string err; + if (!sv.start(info, err)) { + QMessageBox::warning(this, "ROI save", + QString("Could not start: %1") + .arg(QString::fromStdString(err))); + btnSaveStart->setChecked(false); + return; + } + // remember the destination, unless it is still the start-up default: that + // one is not a "previous" destination and would only clutter the list + if (info.dir == saveDefaultDir_.toStdString() && + info.baseName == saveDefaultBase_.toStdString()) { + printf("[save] %s/%s is the default destination, not added to the " + "previous-destinations list\n", + info.dir.c_str(), info.baseName.c_str()); + fflush(stdout); + } else { + saveDestListUpsert(info.dir, info.baseName); + } + // keep the CLI defaults in sync so later runs start from the last choice + g_cfg.h5Dir = info.dir; + g_cfg.h5Base = info.baseName; + const RoiSaver::Status st = sv.status(); + statusLabel->setText(QString("Status: saving to %1") + .arg(QString::fromStdString(st.h5Path))); + applySaveLock(true); // nothing that changes the file from here on + updateSaveLabel(); +} + +void MainWindow::browseSaveDir() { + const QString dir = QFileDialog::getExistingDirectory( + this, "Directory for the ROI save", + saveDirEdit_->text().isEmpty() ? QDir::currentPath() + : saveDirEdit_->text()); + if (!dir.isEmpty()) + saveDirEdit_->setText(dir); +} + +// List of destinations used before, most recent first. +void MainWindow::saveDestDialog() { + std::vector list = saveDestListLoad(); + if (list.empty()) { + QMessageBox::information( + this, "Previous destinations", + QString("No destination has been used yet.\n\nThey are recorded " + "when a save starts; the list lives in %1.") + .arg(QString::fromStdString(g_cfg.saveListFile))); + return; + } + + QDialog dialog(this); + dialog.setWindowTitle("Previous save destinations"); + dialog.resize(560, 300); + auto *lay = new QVBoxLayout(&dialog); + auto *table = new QTableWidget(static_cast(list.size()), 3, &dialog); + table->setHorizontalHeaderLabels( + QStringList() << "directory" << "base name" << "last used"); + table->verticalHeader()->setVisible(false); + table->setSelectionBehavior(QAbstractItemView::SelectRows); + table->setSelectionMode(QAbstractItemView::SingleSelection); + table->setEditTriggers(QAbstractItemView::NoEditTriggers); + const QLocale loc; + for (size_t i = 0; i < list.size(); i++) { + const QString when = QDateTime::fromMSecsSinceEpoch(list[i].usedMs) + .toString("yyyy-MM-dd HH:mm:ss"); + table->setItem(static_cast(i), 0, + new QTableWidgetItem( + QString::fromStdString(list[i].dir))); + table->setItem(static_cast(i), 1, + new QTableWidgetItem( + QString::fromStdString(list[i].base))); + table->setItem(static_cast(i), 2, new QTableWidgetItem(when)); + } + table->resizeColumnsToContents(); + table->selectRow(0); + lay->addWidget(table); + + auto *btns = new QDialogButtonBox(&dialog); + btns->addButton("Use", QDialogButtonBox::AcceptRole); + auto *delBtn = btns->addButton("Delete", QDialogButtonBox::DestructiveRole); + btns->addButton(QDialogButtonBox::Cancel); + lay->addWidget(btns); + connect(btns, &QDialogButtonBox::accepted, &dialog, &QDialog::accept); + connect(btns, &QDialogButtonBox::rejected, &dialog, &QDialog::reject); + connect(table, &QTableWidget::itemDoubleClicked, &dialog, + [&dialog](QTableWidgetItem *) { dialog.accept(); }); + bool deleted = false; + connect(delBtn, &QPushButton::clicked, &dialog, [&]() { + const int r = table->currentRow(); + if (r < 0 || r >= static_cast(list.size())) + return; + saveDestListRemove(list[r].dir, list[r].base); + deleted = true; + table->removeRow(r); + }); + + if (dialog.exec() != QDialog::Accepted) { + if (deleted) + statusLabel->setText("Status: destination removed from the list"); + return; + } + const int row = table->currentRow(); + if (row < 0 || row >= static_cast(list.size())) + return; + saveDirEdit_->setText(QString::fromStdString(list[row].dir)); + saveBaseEdit_->setText(QString::fromStdString(list[row].base)); + statusLabel->setText( + QString("Status: destination set to %1 / %2") + .arg(QString::fromStdString(list[row].dir)) + .arg(QString::fromStdString(list[row].base))); +} + +void MainWindow::updateSaveLabel() { + if (!saveVal_) + return; + const RoiSaver::Status st = pipeline_.saver().status(); + // in photon-map mode the frames counter never moves, so report the maps + const qulonglong n = st.photonMode ? st.pmaps : st.saved; + const QString what = st.photonMode ? (n == 1 ? "map" : "maps") + : (n == 1 ? "frame" : "frames"); + // only mention the queue when something was actually dropped: "0 dropped + // (queue full)" claimed a problem that is not there + const QString dropNote = st.dropped + ? QString(" (writer behind: queue full)") + : QString(" (nothing lost)"); + if (st.running) { + saveVal_->setText(QString("%1\n%2 %3 written, %4 dropped%5") + .arg(QString::fromStdString(st.h5Path)) + .arg(n) + .arg(what) + .arg(st.dropped) + .arg(dropNote)); + } else if (st.h5Path.empty()) { + saveVal_->setText("idle"); + } else { + saveVal_->setText( + QString("%1\n%2 %3 written, %4 dropped - stopped (%5)") + .arg(QString::fromStdString(st.h5Path)) + .arg(n) + .arg(what) + .arg(st.dropped) + .arg(QString::fromStdString(st.stopReason))); + } +} + +void MainWindow::acquirePede() { + if (!pipeline_.running()) { + QMessageBox::information(this, "Acquire pedestal", + "The acquisition pipeline is not running."); + return; + } + if (pipeline_.pedeAcquireActive()) + return; + pipeline_.requestPedeAcquire(g_cfg.pedeFrames); + statusLabel->setText("Status: acquiring pede..."); +} + +void MainWindow::savePede() { + std::string werr; + if (pedeSaveFile(g_cfg.pedeFile, werr)) { + printf("[pede] saved %s\n", g_cfg.pedeFile.c_str()); + statusLabel->setText(QString("Status: pede saved to %1") + .arg(QString::fromStdString(g_cfg.pedeFile))); + } else { + fprintf(stderr, "[pede] save failed: %s\n", werr.c_str()); + pipeline_.gate().setLastError("savePedestal: " + werr); + QMessageBox::warning(this, "Save Pedestal", + QString::fromStdString(werr)); + } +} + +void MainWindow::readPede() { + std::string perr; + if (pedeLoadFile(g_cfg.pedeFile, perr)) { + printf("[pede] read %s\n", g_cfg.pedeFile.c_str()); + pipeline_.gate().setLastError(""); + statusLabel->setText("Status: pede read"); + } else { + fprintf(stderr, "[pede] read failed: %s\n", perr.c_str()); + pipeline_.gate().setLastError("loadPedestal: " + perr); + QMessageBox::warning(this, "Read Pedestal", + QString::fromStdString(perr)); + } +} + +void MainWindow::loadAllPede() { + // The original only printed "not implemented". It is genuinely useful in + // the merged program (it is the only way to load a full G0/G1/G2 set from + // an arbitrary path), so it opens a file chooser now. + const QString path = QFileDialog::getOpenFileName( + this, "Load pedestal file", QDir::currentPath(), + "Pedestal files (*.dat *.txt);;All files (*)"); + if (path.isEmpty()) + return; + std::string perr; + if (pedeLoadFile(path.toStdString(), perr)) { + cout << "[pede] loaded " << path.toStdString() << endl; + pipeline_.gate().setLastError(""); + statusLabel->setText(QString("Status: pede loaded from %1").arg(path)); + } else { + fprintf(stderr, "[pede] load failed: %s\n", perr.c_str()); + pipeline_.gate().setLastError("loadPedestal: " + perr); + QMessageBox::warning(this, "Load Pedestal", + QString::fromStdString(perr)); + } +} + +// The live value range of the main plot: what its colour scale is using right +// now, whatever set it (the defaults, this dialog, or a drag on the ROOT +// canvas). Read from the displayed histogram, so the dialog always opens on +// the values the operator is actually looking at. +// The ADC image (the "main plot") keeps its own colour scale, which the +// operator can also drag on the colour bar: read what the widget is using. +void MainWindow::liveAdcImageRange(int &lo, int &hi) const { + if (m_adcView) { + double a = 0, b = 0; + m_adcView->colorRange(a, b); + lo = static_cast(std::floor(a)); + hi = static_cast(std::ceil(b)); + if (lo != hi) + return; + } + lo = adcmin.load(); + hi = adcmax.load(); +} + +// The ROOT 2D map (canvas A5) keeps its colour scale in min/max. +void MainWindow::liveMapRange(int &lo, int &hi) const { + if (m_photonView) { + double a = 0, b = 0; + m_photonView->colorRange(a, b); + lo = static_cast(a); + hi = static_cast(b); + if (lo != hi) + return; + } + lo = pmmin.load(); + hi = pmmax.load(); +} + +// Same for the shared x window of the spectra. +void MainWindow::liveChipRange(int &lo, int &hi) const { + if (dispChip[0] && dispChip[0]->GetXaxis()) { + TAxis *ax = dispChip[0]->GetXaxis(); + lo = static_cast(std::floor(ax->GetBinLowEdge(ax->GetFirst()))); + hi = static_cast(std::ceil(ax->GetBinUpEdge(ax->GetLast()))); + if (lo != hi) + return; + } + lo = chipxmin.load(); + hi = chipxmax.load(); +} + +// Calibration popup: pick (or change) the gain-map file used for the keV +// spectra. Everything else keeps working in ADU. +void MainWindow::loadGainMap() { + const QString start = + g_cfg.gainMapFile.empty() ? QDir::homePath() + : QString::fromStdString(g_cfg.gainMapFile); + const QString path = QFileDialog::getOpenFileName( + this, "Select gain map (g0,g1,g2,hg0,hg1,hg2 - 1024x512 doubles)", start, + "Gain maps (*.bin *.dat *.raw);;All files (*)"); + if (path.isEmpty()) + return; + std::string err; + if (!gainMapLoadFile(path.toStdString(), err)) { + fprintf(stderr, "[gain] %s\n", err.c_str()); + QMessageBox::warning(this, "Gain map", QString::fromStdString(err)); + return; + } + g_cfg.gainMapFile = path.toStdString(); + const QString base = QFileInfo(path).fileName(); + if (kevChk_) + kevChk_->setChecked(true); // show what was just calibrated + updateFlow(); + statusLabel->setText( + QString("Status: gain map %1 loaded - PH spectra also in keV") + .arg(base)); +} + +void MainWindow::showRangeDialog() { + QDialog dialog(this); + dialog.setWindowTitle("Set Ranges"); + auto *form = new QFormLayout(&dialog); + + int imgLo = 0, imgHi = 0, mapLo = 0, mapHi = 0, chipLo = 0, chipHi = 0; + liveAdcImageRange(imgLo, imgHi); + liveMapRange(mapLo, mapHi); + liveChipRange(chipLo, chipHi); + + auto *adcMinEdit = new QSpinBox(&dialog); + adcMinEdit->setRange(-100000, 100000); + adcMinEdit->setValue(imgLo); + auto *adcMaxEdit = new QSpinBox(&dialog); + adcMaxEdit->setRange(-100000, 100000); + adcMaxEdit->setValue(imgHi); + auto *pmMinEdit = new QSpinBox(&dialog); + pmMinEdit->setRange(-100000, 100000); + pmMinEdit->setValue(mapLo); + auto *pmMaxEdit = new QSpinBox(&dialog); + pmMaxEdit->setRange(-100000, 100000); + pmMaxEdit->setValue(mapHi); + auto *chMinEdit = new QSpinBox(&dialog); + chMinEdit->setRange(-100000, 100000); + chMinEdit->setValue(chipLo); + auto *chMaxEdit = new QSpinBox(&dialog); + chMaxEdit->setRange(-100000, 100000); + chMaxEdit->setValue(chipHi); + + form->addRow("ADC min (ADC image):", adcMinEdit); + form->addRow("ADC max (ADC image):", adcMaxEdit); + form->addRow("P.Map min (ROOT map):", pmMinEdit); + form->addRow("P.Map max (ROOT map):", pmMaxEdit); + form->addRow("PH min (spectra):", chMinEdit); + form->addRow("PH max (spectra):", chMaxEdit); + auto *hint = new QLabel( + "Each field opens on the scale that display is using now; nothing " + "changes unless you edit it.", + &dialog); + hint->setWordWrap(true); + form->addRow(hint); + + auto *buttons = new QDialogButtonBox( + QDialogButtonBox::Ok | QDialogButtonBox::Cancel, &dialog); + form->addRow(buttons); + connect(buttons, &QDialogButtonBox::accepted, &dialog, &QDialog::accept); + connect(buttons, &QDialogButtonBox::rejected, &dialog, &QDialog::reject); + + if (dialog.exec() == QDialog::Accepted) { + setRanges(adcMinEdit->value(), adcMaxEdit->value(), pmMinEdit->value(), + pmMaxEdit->value(), chMinEdit->value(), chMaxEdit->value()); + } +} + +void MainWindow::setRanges(int amin, int amax, int pmin, int pmax, int cmin, + int cmax) { + int imgLo = 0, imgHi = 0, mapLo = 0, mapHi = 0, chipLo = 0, chipHi = 0; + liveAdcImageRange(imgLo, imgHi); + liveMapRange(mapLo, mapHi); + liveChipRange(chipLo, chipHi); + + // the ADC pair is the colour scale of the ADC (main) image - a Qt widget, + // so it is applied straight away - and the P.Map pair the ROOT 2D map, + // which must be changed on the ROOT thread + adcmin = amin; + adcmax = amax; + pmmin = pmin; + pmmax = pmax; + chipxmin = cmin; + chipxmax = cmax; + if ((amin != imgLo || amax != imgHi) && m_adcView) { + m_adcView->setColorRange(amin, amax); + cout << "Ranges set: ADC image [" << amin << "," << amax << "]" + << endl; + } + if (pmin != mapLo || pmax != mapHi) { + fixranges = true; + RootCmd c; + c.type = RootCmdType::SetMapRange; + c.a = pmin; + c.b = pmax; + pushRootCmd(c); + cout << "Ranges set: ROOT map z [" << pmin << "," << pmax << "]" + << endl; + } + if (cmin != chipLo || cmax != chipHi) { + RootCmd c; + c.type = RootCmdType::SetChipRange; + c.a = cmin; + c.b = cmax; + pushRootCmd(c); + cout << "Ranges set: PH x [" << cmin << "," << cmax << "]" << endl; + } + forceRootRedraw(); +} + +void MainWindow::showRateDialog() { + QDialog dialog(this); + dialog.setWindowTitle("Update Rates"); + auto *form = new QFormLayout(&dialog); + + auto *mainRateSpin = new QSpinBox(&dialog); + mainRateSpin->setRange(1, 10000); + mainRateSpin->setValue(HDraw_every.load()); + form->addRow("Main image (frames):", mainRateSpin); + + auto *rootMsSpin = new QSpinBox(&dialog); + rootMsSpin->setRange(50, 60000); + rootMsSpin->setSingleStep(100); + rootMsSpin->setValue(rootUpdateMs.load()); + form->addRow("ROOT update (ms):", rootMsSpin); + + auto *chipSpin = new QSpinBox(&dialog); + chipSpin->setRange(1, 100); + chipSpin->setValue(chipUpdateEvery.load()); + chipSpin->setToolTip( + "Redraw the chip-spectrum canvas (A4) every N-th ROOT redraw. It is\n" + "the most expensive canvas, so a larger N keeps the other canvases\n" + "responsive."); + form->addRow("Chip spectra every N redraws:", chipSpin); + + auto *effLabel = new QLabel( + QString("ROOT redraws every %1 ms when frames arrived") + .arg(rootUpdateMs.load()), + &dialog); + effLabel->setWordWrap(true); + form->addRow(effLabel); + connect(rootMsSpin, QOverload::of(&QSpinBox::valueChanged), + [effLabel](int ms) { + effLabel->setText( + QString("ROOT redraws every %1 ms when frames arrived") + .arg(ms)); + }); + + auto *buttons = new QDialogButtonBox( + QDialogButtonBox::Ok | QDialogButtonBox::Cancel, &dialog); + form->addRow(buttons); + connect(buttons, &QDialogButtonBox::accepted, &dialog, &QDialog::accept); + connect(buttons, &QDialogButtonBox::rejected, &dialog, &QDialog::reject); + + if (dialog.exec() == QDialog::Accepted) { + HDraw_every = mainRateSpin->value(); + rootUpdateMs = rootMsSpin->value(); + chipUpdateEvery = chipSpin->value(); + updateDrawLabel(); + cout << "Rates: main=" << HDraw_every.load() + << " rootMs=" << rootUpdateMs.load() << endl; + } +} + +void MainWindow::updateDrawLabel() { + if (drawLabel) + drawLabel->setText(QString("Main: every %1 frames | ROOT: every %2 ms") + .arg(HDraw_every.load()) + .arg(rootUpdateMs.load())); +} + +// The ADC / gain / photon (and, under JFSTRX, the strixel) windows are separate +// top-level widgets, and the ROOT canvases live in the ROOT thread: closing the +// control window used to leave them on screen, and with them the process alive +// (Qt only quits on the *last* window). Close them all, then leave the loop. +// The display chain and the saved data do not have to agree about the +// pedestal: the display follows the Pede/Raw toggle, while the file is +// corrected only when "Pedestal corrected" is ticked - and the photon maps +// always need the pedestal (their save is refused without it). +void MainWindow::flowStageStates(bool &displayPede, bool &savePede, bool &gateOn, + bool &pmap) const { + displayPede = PedestalStore::instance().loaded() && !gNoPede.load(); + pmap = (gSaveMode.load() == 1); + savePede = pmap || ((saveCorrected_ && saveCorrected_->isChecked()) && + !gNoPede.load()); + gateOn = !gateChk_ || gateChk_->isChecked(); +} + +void MainWindow::closeSideWindows() { + QWidget *wins[] = {m_adcWin, m_gainWin, m_photonWin, +#ifdef JFSTRX + m_adcPanelWin, +#endif + nullptr}; + for (QWidget *w : wins) { + if (!w) + continue; + w->hide(); + w->close(); + } +} + +// While a save is running everything that would change what lands in the file is +// locked: its JSON describes the settings at save start, so a quiet change +// halfway would leave a file nobody can interpret. Display-only controls (and +// the pedestal tracker, which is meant to follow drift during a run) stay live; +// the gate threshold and min-pixels stay live but ask first. +void MainWindow::applySaveLock(bool saving) { + auto lockGroup = [&](QGroupBox *g, std::initializer_list keep) { + if (!g) + return; + for (QObject *c : g->children()) { + auto *w = qobject_cast(c); + if (!w) + continue; + bool kept = false; + for (QWidget *k : keep) + if (k == w) + kept = true; + w->setEnabled(!saving || kept); + } + }; + lockGroup(saveGroup_, {btnSaveStart, saveVal_}); // Start/Stop must stay live + lockGroup(pedeGroup_, {}); // manual pede work changes the saved data + lockGroup(gainGroup_, {kevChk_, gainStateChk_}); // keV PH is display only + lockGroup(scGroup_, {}); // the cell filter changes which frames pass + lockGroup(sigGroup_, {thrSpin_, minPixSpin_}); // the two that ask first + lockGroup(pmapGroup_, {pmapCumulative_, pmapEverySpin_}); // display-only pair + if (btnResetCounters) + btnResetCounters->setEnabled(!saving); + for (QWidget *w : {btnSelectRoi_, btnUnsetRoi_, btnLoadRoi}) + if (w) + w->setEnabled(!saving); // they move the ROI, i.e. the saved crop + // the photon threshold scales the counts that are written in photon-map + // mode, so it is locked there and stays live while frames are saved + if (photonThrSpin_) + photonThrSpin_->setEnabled(!(saving && gSaveMode.load() == 1)); + if (saveCorrected_) // only meaningful for the frames mode + saveCorrected_->setEnabled(!(gSaveMode.load() == 1) && !saving); +} + +bool MainWindow::confirmGateChangeDuringRun(const QString &what) { + if (!pipeline_.saver().status().running) + return true; + // With the gate off (passthrough) the threshold and min-pixels decide + // nothing about the saved frames, so there is nothing to confirm. + if (!pipeline_.gate().enabled()) + return true; + const QMessageBox::StandardButton a = QMessageBox::question( + this, "Gate setting", + QString("Changing settings during a run, are you sure?\n\n%1\n\nThe " + "file being written keeps the gate criterion it started with; a " + "note is added to its JSON sidecar.") + .arg(what), + QMessageBox::Yes | QMessageBox::No, QMessageBox::No); + if (a != QMessageBox::Yes) { + printf("[save] gate change refused during the run (%s)\n", + what.toLocal8Bit().constData()); + fflush(stdout); + return false; + } + gGateChangedDuringSave.store(true); + printf("[save] gate setting changed during the run: %s (noted in the JSON)\n", + what.toLocal8Bit().constData()); + fflush(stdout); + return true; +} + +// "Unset ROI": drop the current rectangle, so the gate, the ROI spectra and the +// saved data are back to the full frame. The ROI list on disk is untouched. +void MainWindow::unsetRoi() { + if (!pipeline_.gate().roiSet()) { + statusLabel->setText("Status: no ROI set (already the full frame)"); + return; + } + // release the restriction first, so its own message stays truthful + if (btnGateRoi && btnGateRoi->isChecked()) + btnGateRoi->setChecked(false); + pipeline_.gate().clearRoi(); + pipeline_.gate().resetCounters(); + if (m_adcView) + m_adcView->setOverlayRect(0, 0, 0, 0, false); + if (gateRoiVal_) + gateRoiVal_->setText("full frame"); + printf("[roi] ROI unset: full frame\n"); + fflush(stdout); + updateRoiLabel(); + statusLabel->setText("Status: ROI unset (full frame)"); +} + +void MainWindow::quitApp() { + if (!confirmQuit()) + return; + stop(); + closeSideWindows(); + QApplication::quit(); +} + +// --------------------------------------------------------------------------- +// command line +// --------------------------------------------------------------------------- +void printUsage(const char *prog) { + printf("Usage: %s [rx_port] [gate_threshold] [min_pixels]\n" + " [pede_file] [--pub PORT] [--contig] [--no-gate]\n" + " [--pede-frames N]\n" + "\n" + " rx_host slsReceiver host\n" + " rx_port slsReceiver zmq port, or a '+' list for the\n" + " multi-interface (N UDP interfaces) mode, ordered\n" + " bottom -> top: 30001+30002 = (bot,top)\n" + " (default %d)\n" + " gate_threshold event-finder gate threshold, pede-subtracted ADC\n" + " (default %d)\n" + " min_pixels gate: pass when >= N pixels are above threshold\n" + " (default 5)\n" + " pede_file pedestal file (default %s)\n" + "\n" + " The photon-map threshold (ADU, default %d) is a control in the\n" + " Display panel, not an argument; --raw-map shows raw ADC there\n" + " instead of photon counts.\n" + "\n" + " --pub PORT additionally republish gated frames on PORT\n" + " --contig enable the contiguity proxy (r = N/2+1)\n" + " --gate enable the gate (it is OFF by default)\n" + " --no-gate disable the gate (same as the default)\n" + " --raw-map show raw ADC in the main map instead of\n" + " photon counts (threshold unused then)\n" + " --save-budget N stop after N saved frames, or N saved photon\n" + " maps in virtual photon counting mode\n" + " --apply-gain start with the gain correction on (the photon\n" + " threshold then means keV, default 4 keV)\n" + " --start-save start saving at startup (same as pressing\n" + " the Save button); combine with --save-photon\n" + " --save-photon write the virtual photon counting maps instead\n" + " of the frames (see the Save panel)\n" + " --pmap-every N display cadence of the photon map (default 2000)\n" + " --pmap-save-every N\n" + " saved map cadence, minimum 200 (default 2000)\n" + " --pede-tracking follow the pedestal drift from the frames the\n" + " signal gate drops (see the Pedestal panel)\n" + " --no-pede ignore the pedestal everywhere (same as the\n" + " No pede button); this is the STARTUP DEFAULT,\n" + " so the gate threshold applies to raw 14-bit ADC\n" + " --use-pede start with pedestal subtraction enabled\n" + " --stats print the counter line on stdout every second\n" + " --acquire-pede average --pede-frames frames into a live\n" + " pedestal as soon as acquisition starts\n" + " --pede-frames N frames averaged by \"Acquire Pede\" (default %d)\n" + " --analysis-workers N\n" + " threads for the per-pixel analysis loops\n" + " (default: auto = cores/4, capped at 8; 1 =\n" + " single threaded). Scales across cores with no\n" + " extra memory and bit-identical results.\n" + " --h5-dir DIR directory for ROI-save HDF5 + JSON (default .)\n" + " --h5-base NAME file-name base, file is __f0_0.h5\n" + " (default jfroi)\n" + " --gainmap PATH gain-map file (6 x 1024x512 doubles: g0 g1 g2\n" + " hg0 hg1 hg2). g0 is ADU/keV and is used to\n" + " fill a second set of PH spectra in keV; the ADC\n" + " image, the photon map and the HDF5 writer stay\n" + " in ADU. Can also be loaded from the GUI.\n" + " --roi-file PATH gate-ROI list file (default ./roi_list.dat)\n" + " --sc N pass only frames from storage cell N (0..15,\n" + " bits 8-11 of detSpec3; 'all' = no SC gating).\n" + " Checked before the signal gate, so other cells\n" + " cost no CPU. The GUI has the same selector.\n" + " --gate-roi X Y W H\n" + " start with a gate ROI (data rows: x to the\n" + " right, y upwards, (0,0) = bottom-left; same\n" + " convention as the ROI list and the ROOT plots)\n" + " --rx-hwm N receive high-water mark per interface (default\n" + " %d); smaller = lower latency, more drops\n" + "\n" + "Run chain: slsReceiver -> %s (no external event finder, no\n" + "intermediate zmq hop: the gate and the display share one process)\n", + prog, DEFAULT_RX_PORT, + static_cast(PHOTON_THRESHOLD_DEFAULT), PEDEFNAME, + static_cast(PHOTON_THRESHOLD_DEFAULT), DEFAULT_N_PEDE_FRAMES, + 1000, prog); +} + +bool parseCommandLine(int argc, char **argv, Config &cfg, bool &help, + std::string &error) { + help = false; + std::vector pos; + for (int i = 1; i < argc; i++) { + const std::string a = argv[i]; + if (a == "-h" || a == "--help") { + help = true; + return true; + } else if (a == "--pub") { + if (i + 1 >= argc) { + error = "--pub needs a port"; + return false; + } + cfg.pubPort = std::atoi(argv[++i]); + } else if (a == "--contig") { + cfg.contiguous = true; + } else if (a == "--pmap-every") { + if (i + 1 >= argc) { + error = "--pmap-every needs a count"; + return false; + } + const int v = std::atoi(argv[++i]); + gPmapEvery = v > 0 ? v : 1; + } else if (a == "--pmap-save-every") { + if (i + 1 >= argc) { + error = "--pmap-save-every needs a count (>= 200)"; + return false; + } + const int v = std::atoi(argv[++i]); + gPmapSaveEvery = v < 200 ? 200 : v; + } else if (a == "--save-photon") { + gSaveMode = 1; // same as the Save panel's radio button + } else if (a == "--start-save") { + cfg.startSave = true; // start saving as soon as we are up + } else if (a == "--apply-gain") { + // the gain stage is the only one without a CLI mirror; needed for + // scripted keV runs (and it makes the keV photon threshold testable) + cfg.applyGain = true; + } else if (a == "--save-budget") { + if (i + 1 >= argc) { + error = "--save-budget needs a count"; + return false; + } + cfg.saveBudget = static_cast(std::atoll(argv[++i])); + } else if (a == "--pede-tracking") { + gPedeTracking = true; // same as the Pedestal panel button + } else if (a == "--no-pede") { + // same as the "Pede/Raw toggle" button: no pedestal subtraction + // anywhere, so the gate threshold applies to the raw 14-bit value + gNoPede = true; + } else if (a == "--use-pede") { + // re-enable pedestal subtraction (the startup default is --no-pede) + gNoPede = false; + } else if (a == "--raw-map") { + cfg.rawMap = true; // his3000 shows raw ADC instead of counts + } else if (a == "--no-gate") { + cfg.gateEnabled = false; + } else if (a == "--gate") { + cfg.gateEnabled = true; // the gate is off by default + } else if (a == "--stats") { + cfg.printCounters = true; + } else if (a == "--acquire-pede") { + cfg.acquirePede = true; + } else if (a == "--h5-base") { + if (i + 1 >= argc) { + error = "--h5-base needs a name"; + return false; + } + cfg.h5Base = argv[++i]; + } else if (a == "--h5-dir") { + if (i + 1 >= argc) { + error = "--h5-dir needs a path"; + return false; + } + cfg.h5Dir = argv[++i]; + } else if (a == "--gainmap") { + if (i + 1 >= argc) { + error = "--gainmap needs a file"; + return false; + } + cfg.gainMapFile = argv[++i]; + cfg.gainMapExplicit = true; + } else if (a == "--roi-file") { + if (i + 1 >= argc) { + error = "--roi-file needs a path"; + return false; + } + cfg.roiFile = argv[++i]; + } else if (a == "--sc") { + if (i + 1 >= argc) { + error = "--sc needs a value (0..15, or all)"; + return false; + } + const std::string v = argv[++i]; + if (v == "all" || v == "ALL") { + cfg.scFilter = -1; + } else { + const int n = std::atoi(v.c_str()); + if (n < 0 || n > 15) { + error = "--sc must be 0..15 or all"; + return false; + } + cfg.scFilter = n; + } + } else if (a == "--gate-roi") { + // X Y W H in data rows (row 0 = bottom), same as the ROI list + if (i + 4 >= argc) { + error = "--gate-roi needs X Y W H"; + return false; + } + cfg.gateRoiX = std::atoi(argv[++i]); + cfg.gateRoiY = std::atoi(argv[++i]); + cfg.gateRoiW = std::atoi(argv[++i]); + cfg.gateRoiH = std::atoi(argv[++i]); + if (cfg.gateRoiW < 1 || cfg.gateRoiH < 1) { + error = "--gate-roi needs a positive width and height"; + return false; + } + } else if (a == "--analysis-workers") { + if (i + 1 >= argc) { + error = "--analysis-workers needs a count"; + return false; + } + const int n = std::atoi(argv[++i]); + if (n < 1 || n > 32) { + error = "--analysis-workers must be 1..32"; + return false; + } + cfg.analysisWorkers = n; + } else if (a == "--rx-hwm") { + if (i + 1 >= argc) { + error = "--rx-hwm needs a value"; + return false; + } + const int n = std::atoi(argv[++i]); + if (n < 1) { + error = "--rx-hwm must be >= 1"; + return false; + } + cfg.rxHwm = n; + } else if (a == "--pede-frames") { + if (i + 1 >= argc) { + error = "--pede-frames needs a count"; + return false; + } + const int n = std::atoi(argv[++i]); + if (n < 1) { + error = "--pede-frames must be >= 1"; + return false; + } + cfg.pedeFrames = n; + } else if (a == "--pede") { + if (i + 1 >= argc) { + error = "--pede needs a file"; + return false; + } + cfg.pedeFile = argv[++i]; + cfg.pedeExplicit = true; + } else if (!a.empty() && a[0] == '-' && a.size() > 1 && + !isdigit(static_cast(a[1]))) { + error = "unknown option: " + a; + return false; + } else { + pos.push_back(a); + } + } + + if (pos.empty()) { + error = "need at least "; + return false; + } + cfg.rxHost = pos[0]; + // the photon-map threshold is a Display control (ADU, default 150); the + // raw-ADC map is still available with --raw-map + cfg.dophotonmap = !cfg.rawMap; + cfg.threshold = static_cast(cfg.phene / 2); // default gate threshold + if (pos.size() >= 2) { + // "30001" (single interface) or "30001+30002" (multi-interface, + // ordered BOTTOM -> TOP in the assembled image) + cfg.rxPorts.clear(); + std::string spec = pos[1]; + size_t start = 0; + while (start <= spec.size()) { + const size_t plus = spec.find('+', start); + const std::string tok = + spec.substr(start, (plus == std::string::npos) + ? std::string::npos + : plus - start); + if (tok.empty()) { + error = "bad rx_port list '" + spec + "'"; + return false; + } + const int port = std::atoi(tok.c_str()); + if (port <= 0 || port > 65535) { + error = "bad rx_port '" + tok + "' in '" + spec + "'"; + return false; + } + cfg.rxPorts.push_back(port); + if (plus == std::string::npos) + break; + start = plus + 1; + } + if (cfg.rxPorts.empty() || + cfg.rxPorts.size() > static_cast(JF_MAX_PORTS)) { + error = "rx_port list must have 1.." + + std::to_string(JF_MAX_PORTS) + " entries"; + return false; + } + } + if (pos.size() >= 3) + cfg.threshold = static_cast(std::atof(pos[2].c_str())); + if (pos.size() >= 4) + cfg.minPixels = std::strtoull(pos[3].c_str(), nullptr, 10); + if (pos.size() >= 5) { + cfg.pedeFile = pos[4]; + cfg.pedeExplicit = true; + } + if (cfg.rxHost.empty()) { + error = "rx_host is empty"; + return false; + } + if (cfg.analysisWorkers == 0) { // auto + unsigned hw = std::thread::hardware_concurrency(); + if (hw == 0) + hw = 4; + cfg.analysisWorkers = + static_cast(std::min(8u, std::max(1u, hw / 4))); + } + return true; +} + +// --------------------------------------------------------------------------- +int main(int argc, char *argv[]) { + Config cfg; + bool help = false; + std::string err; + if (!parseCommandLine(argc, argv, cfg, help, err)) { + if (!err.empty()) + fprintf(stderr, "error: %s\n", err.c_str()); + printUsage(argv[0]); + return help ? 0 : 2; + } + if (help) { + printUsage(argv[0]); + return 0; + } + + QApplication app(argc, argv); + g_cfg = cfg; + g_pheneThreshold = PHOTON_THRESHOLD_DEFAULT; // photon counting, ADU + g_pheneThresholdKev = PHOTON_THRESHOLD_KEV_DEFAULT; // same, keV (gain on) + cfg.phene = static_cast(2 * PHOTON_THRESHOLD_DEFAULT); + dophotonmap.store(cfg.dophotonmap); + + printf("=== Online JF display + event finder (single process) ===\n"); + { + std::string ports; + for (size_t k = 0; k < cfg.rxPorts.size(); k++) { + if (k) + ports += "+"; + ports += std::to_string(cfg.rxPorts[k]); + } + printf("input : %s:%s (subscriber)%s\n", cfg.rxHost.c_str(), + ports.c_str(), + cfg.rxPorts.size() > 1 + ? " [multi-interface: slabs stacked bottom -> top]" + : ""); + } + printf("photon map: threshold %.0f ADU, %.1f keV while the gain correction " + "is on (Virtual photon counting panel)%s\n", + static_cast(g_pheneThreshold), + static_cast(PHOTON_THRESHOLD_KEV_DEFAULT), + cfg.dophotonmap ? "" : " [raw ADC map]"); + printf("gate : %s, threshold %.1f, min_pixels %llu%s\n", + cfg.gateEnabled ? "enabled" : "PASSTHROUGH", cfg.threshold, + static_cast(cfg.minPixels), + cfg.contiguous ? ", contiguous" : ""); + printf("pede : %s\n", cfg.pedeFile.c_str()); + printf("threads: analysis workers %d\n", cfg.analysisWorkers); + if (cfg.pubPort > 0) + printf("pub : gated frames republished on port %d\n", cfg.pubPort); + + MainWindow window; + window.show(); + window.start(); + return app.exec(); +} diff --git a/slsDetectorCalibration/jungfrauExecutables/jf_online_display_gui/online_jf_h5.cpp b/slsDetectorCalibration/jungfrauExecutables/jf_online_display_gui/online_jf_h5.cpp new file mode 100644 index 000000000..40ed52bc9 --- /dev/null +++ b/slsDetectorCalibration/jungfrauExecutables/jf_online_display_gui/online_jf_h5.cpp @@ -0,0 +1,1081 @@ +// SPDX-License-Identifier: LGPL-3.0-or-other +// =========================================================================== +// online_jf_h5.cpp -- decimated gate-passed ROI frames to HDF5 +// +// The file layout mirrors slsReceiverSoftware/src/HDF5DataFile.cpp so that +// existing readers of receiver files work unchanged: +// +// /_f0_0.h5 +// attribute "version" = HDF5 writer version (double) +// /data rank 3, U16LE, dims {nframes, h, w}, +// max {UNLIMITED, h, w}, chunk {1, h, w} +// /frame number rank 1, U64, one value per frame +// /exp length or sub exposure time U32 +// /packets caught U32 +// /detector specific 1 U64 +// /timestamp U64 +// /mod id U16 +// /row U16 +// /column U16 +// /detector specific 2 U16 +// /detector specific 3 U32 +// /detector specific 4 U16 +// /detector type U8 +// /detector header version U8 +// /packets caught bit mask fixed size string (all zero here) +// +// Differences from a receiver file, by design: +// * /data holds the ROI crop of the module, not the whole module; +// * only frames that passed the gate are written, but each keeps its +// ORIGINAL frame number in /frame number (so it is obvious which +// acquisition frame each slice came from); +// * raw mode (default): slice 0 of every dataset is the PEDESTAL in the +// same ROI (frame number 0, marked by "pedestal_in_frame_0"); +// * corrected mode (option): /data holds pedestal-corrected float32 values +// and has NO pedestal slice; the pedestal image lives in the separate +// "/pedestal data" dataset instead (that image is the pedestal at save +// start; each frame is corrected with the pedestal in use when it was +// captured, so live drift tracking is followed like the display, and the +// "/pedestal tracking" series is the authoritative history); +// * /data slices are the raw 16-bit words as received (ADC in bits 0-13, +// gain in bits 14-15), exactly like the receiver; slice 0 is the gain-0 +// pedestal in ADC units; +// * a few extra root attributes describe the ROI and the gate. +// +// A bounded queue decouples the acq thread (which must never block on I/O) +// from the writer thread; frames that do not fit are counted as dropped and +// reported in the JSON sidecar and in the GUI. +// =========================================================================== +#include "online_jf.h" + +#include "H5Cpp.h" +#include "sls/sls_detector_defs.h" + +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +namespace { + +// same value the receiver writes into the "version" attribute +const double kHdf5WriterVersion = 7.0; +// queue budget between the acq thread and the writer thread +constexpr size_t kQueueBudgetBytes = 256u * 1024u * 1024u; +constexpr size_t kQueueMaxItems = 4096; +// frames added per dataset extension (metadata operations are expensive) +constexpr hsize_t kExtendBlock = 128; + +bool makeDir(const std::string &dir) { + if (dir.empty() || dir == ".") + return true; + struct stat st; + if (stat(dir.c_str(), &st) == 0) + return S_ISDIR(st.st_mode); + return mkdir(dir.c_str(), 0777) == 0; +} + +std::string timestampName() { + const std::time_t t = std::time(nullptr); + struct tm tmv; + localtime_r(&t, &tmv); + char buf[32]; + strftime(buf, sizeof(buf), "%Y%m%d_%H%M%S", &tmv); + return std::string(buf); +} + +std::string jsonEscape(const std::string &s) { + std::string out; + for (char c : s) { + switch (c) { + case '"': + out += "\\\""; + break; + case '\\': + out += "\\\\"; + break; + case '\n': + out += "\\n"; + break; + case '\r': + out += "\\r"; + break; + case '\t': + out += "\\t"; + break; + default: + if (static_cast(c) < 0x20) { + char b[8]; + snprintf(b, sizeof(b), "\\u%04x", c); + out += b; + } else { + out += c; + } + } + } + return out; +} + +std::string isoNow() { + const std::time_t t = std::time(nullptr); + struct tm tmv; + localtime_r(&t, &tmv); + char buf[32]; + strftime(buf, sizeof(buf), "%Y-%m-%dT%H:%M:%S", &tmv); + return std::string(buf); +} + +// fsync the directory holding a file so a rename() survives a crash. Best +// effort: a failure just means the rename may not be durable, never fatal. +void syncDirOf(const std::string &path) { + const size_t slash = path.find_last_of('/'); + const std::string dir = + (slash == std::string::npos) ? std::string(".") : path.substr(0, slash); + const int dfd = ::open(dir.c_str(), O_RDONLY | O_DIRECTORY); + if (dfd >= 0) { + ::fsync(dfd); + ::close(dfd); + } +} + +} // namespace + +// --------------------------------------------------------------------------- +// RoiSaver +// --------------------------------------------------------------------------- +struct RoiSaver::Impl { + // ---- configuration of the running save ------------------------------- + StartInfo info; + std::string h5Path, jsonPath; + size_t roiPixels = 0; // w*h + + // ---- queue (acq thread -> writer thread) ----------------------------- + struct Item { + std::vector pixels; // roiPixels: raw words or corrected values + SavedFrameHeader hdr; + }; + // one virtual-photon-counting map on its way to the file + struct PmapItem { + std::vector map; // roiPixels, photons per pixel + uint64_t frames = 0; // analysed frames counted into it + uint64_t firstFrame = 0, firstStamp = 0; // provenance of the window + }; + std::mutex qMtx; + std::condition_variable qCv; + std::deque queue; + std::vector freeList; // recycled buffers + size_t queuedBytes = 0; + + // ---- writer ---------------------------------------------------------- + std::thread thread; + std::atomic stopRequested{false}; + uint64_t pmapPending = 0; // photon maps offered + std::atomic pmapsInFile{0}; // maps actually written + std::deque pmapQueue; + std::atomic running{false}; + std::atomic saved{0}; + std::atomic dropped{0}; + std::atomic firstFrame{0}; + std::atomic lastFrame{0}; + + mutable std::mutex sMtx; + std::string stopReason, lastError; + + void setStop(const std::string &r) { + std::lock_guard lk(sMtx); + if (stopReason.empty()) + stopReason = r; + } + void setError(const std::string &e) { + std::lock_guard lk(sMtx); + lastError = e; + } + + void writerLoop(); +}; + +RoiSaver::RoiSaver() : impl_(new Impl) {} + +RoiSaver::~RoiSaver() { + requestStop("destructor"); + if (impl_ && impl_->thread.joinable()) + impl_->thread.join(); +} + +bool RoiSaver::start(const StartInfo &info, std::string &error) { + if (impl_->running.load()) { + error = "a save is already running"; + return false; + } + // A save that ended on its own - frame budget reached, "user" stop, or an + // I/O error - leaves a JOINABLE std::thread behind, because only the + // destructor and finish() joined it. Assigning a new std::thread to a + // joinable one calls std::terminate, which is what killed the program the + // second time a file was started ("terminate called without an active + // exception"). running == false means the writer loop is done (it is the + // last thing it does), so reap it here and the saver is restartable. + if (impl_->thread.joinable()) + impl_->thread.join(); + if (info.w < 4 || info.h < 4 || info.w > 1024 || info.h > 512) { + error = "invalid ROI size"; + return false; + } + if (!makeDir(info.dir)) { + error = "cannot create directory '" + info.dir + "'"; + return false; + } + // receiver-style name: __f0_0.h5, with the timestamp so + // re-using a base never overwrites an earlier run + std::string base = info.baseName.empty() ? std::string("jfroi") + : info.baseName; + for (char &c : base) { // keep it a file name + if (c == '/' || c == '\t' || c == '\n' || c == '\r') + c = '_'; + } + const std::string stem = info.dir + "/" + base + "_" + timestampName() + + "_f0_0"; + impl_->info = info; + impl_->h5Path = stem + ".h5"; + impl_->jsonPath = stem + ".json"; + impl_->roiPixels = static_cast(info.w) * static_cast(info.h); + impl_->queuedBytes = 0; + { + std::lock_guard lk(impl_->qMtx); + impl_->queue.clear(); + impl_->freeList.clear(); + } + impl_->saved.store(0); + impl_->dropped.store(0); + impl_->firstFrame.store(0); + impl_->lastFrame.store(0); + impl_->stopRequested.store(false); + { + std::lock_guard lk(impl_->sMtx); + impl_->stopReason.clear(); + impl_->lastError.clear(); + } + impl_->running.store(true); + impl_->thread = std::thread(&RoiSaver::Impl::writerLoop, impl_.get()); + return true; +} + +// Virtual photon counting: the map is queued like a frame and written by the +// writer thread. Not reachable yet: gSaveMode is still 0 everywhere, the Save +// panel control and the dataset writer come next (see NOTES.md). +void RoiSaver::offerPhotonMap(const std::vector &map, uint64_t frames, + uint64_t firstFrame, uint64_t firstStamp) { + if (!impl_->running.load() || !impl_->info.photonMode || map.empty()) + return; + Impl::PmapItem it; + it.map = map; + it.frames = frames; + it.firstFrame = firstFrame; + it.firstStamp = firstStamp; + { + std::lock_guard lk(impl_->qMtx); + impl_->pmapPending++; + impl_->pmapQueue.push_back(std::move(it)); + } + impl_->qCv.notify_one(); +} + +void RoiSaver::offer(const short *frame, int frameW, int frameH, + const SavedFrameHeader &hdr) { + // nothing new is queued once a stop (user, budget, error) was requested: + // otherwise a gate faster than the disk keeps the queue non-empty and the + // writer, which drains before it exits, never stops + if (!impl_->running.load() || !impl_->info.w || + impl_->stopRequested.load()) + return; + Impl::Item item; + { + std::lock_guard lk(impl_->qMtx); + if (!impl_->freeList.empty()) { + item = std::move(impl_->freeList.back()); + impl_->freeList.pop_back(); + } else { + item.pixels.resize(impl_->roiPixels); + } + if (impl_->queue.size() >= kQueueMaxItems || + impl_->queuedBytes + impl_->roiPixels * sizeof(float) > + kQueueBudgetBytes) { + // keep the buffer for reuse and count the loss + impl_->dropped.fetch_add(1); + impl_->freeList.push_back(std::move(item)); + return; + } + } + // copy the ROI out of the assembled frame (strided by the frame width), + // either as the raw 16-bit word or pedestal-corrected exactly like the + // display and the gate do it + const int w = impl_->info.w, h = impl_->info.h; + const int cx0 = std::max(0, impl_->info.x); + const int cy0 = std::max(0, impl_->info.y); + const int cx1 = std::min(frameW, impl_->info.x + w); + const int cy1 = std::min(frameH, impl_->info.y + h); + const int span = (cx1 > cx0) ? (cx1 - cx0) : 0; + std::fill(item.pixels.begin(), item.pixels.end(), 0.0f); + // Use the pedestal actually in force for THIS frame, exactly as the display + // and the gate do. The drift tracker (and a manual Read/Load/Acquire Pede) + // swaps in a new immutable PedeSet while a save runs, so the snapshot the + // GUI took at Start Save would silently keep correcting with a stale + // pedestal for the whole night. The shared_ptr keeps this frame's snapshot + // alive for the copy below. With "No pede" on, corrected mode falls back + // to raw words in the float dataset, mirroring the display's raw path. + std::shared_ptr livePeds; + if (impl_->info.corrected) + livePeds = gNoPede.load() ? nullptr : PedestalStore::instance().get(); + const PedeSet *peds = livePeds.get(); + const bool hasAll = peds && peds->hasAll; + const float *g0 = peds ? peds->g0.data() : nullptr; + const float *g1 = hasAll ? peds->g1.data() : nullptr; + const float *g2 = hasAll ? peds->g2.data() : nullptr; + const int G1 = impl_->info.g1off, G2 = impl_->info.g2off; + + for (int sy = cy0; sy < cy1; sy++) { + const short *src = frame + static_cast(sy) * frameW + cx0; + float *dst = item.pixels.data() + + static_cast(sy - impl_->info.y) * w + + (cx0 - impl_->info.x); + if (!peds) { // raw 16-bit word (including the gain bits) + for (int k = 0; k < span; k++) + dst[k] = static_cast( + static_cast(src[k])); + continue; + } + for (int k = 0; k < span; k++) { + const size_t fi = + static_cast(sy) * frameW + cx0 + k; // full-frame index + const int raw = src[k] & 0x3fff; + const int g = (src[k] & 0xc000) ? ((src[k] >> 14) & 0x3) : 0; + // pedestal-subtracted ADC with the gain-bit conversion, exactly as + // the analysis loop computes it ("Apply gain" is a display choice, + // not part of the saved values) + float v; + if (g == 1 && hasAll) + v = (g1[fi] + G1 - raw) * 30.0f; + else if (g == 3 && hasAll) + v = (g2[fi] + G2 - raw) * 340.0f; + else + v = static_cast(raw) - g0[fi]; + dst[k] = v; + } + } + item.hdr = hdr; + { + std::lock_guard lk(impl_->qMtx); + if (impl_->stopRequested.load()) { // stop arrived during the copy + impl_->freeList.push_back(std::move(item)); + return; + } + impl_->queuedBytes += item.pixels.size() * sizeof(float); + impl_->queue.push_back(std::move(item)); + } + impl_->qCv.notify_one(); +} + +void RoiSaver::requestStop(const std::string &reason) { + impl_->setStop(reason); + impl_->stopRequested.store(true); + impl_->qCv.notify_all(); +} + +bool RoiSaver::running() const { return impl_->running.load(); } + +RoiSaver::Status RoiSaver::status() const { + Status s; + s.running = impl_->running.load(); + s.saved = impl_->saved.load(); + s.dropped = impl_->dropped.load(); + s.pmaps = impl_->pmapsInFile.load(); + s.photonMode = impl_->info.photonMode; + s.h5Path = impl_->h5Path; + s.jsonPath = impl_->jsonPath; + { + std::lock_guard lk(impl_->sMtx); + s.stopReason = impl_->stopReason; + s.lastError = impl_->lastError; + } + return s; +} + +void RoiSaver::finish() { + if (impl_->thread.joinable()) + impl_->thread.join(); + impl_->running.store(false); +} + +// --------------------------------------------------------------------------- +// Writer thread: creates the file, writes slice 0 (pedestal) and every queued +// gate-passed frame, then the JSON sidecar. +// --------------------------------------------------------------------------- +void RoiSaver::Impl::writerLoop() { + using namespace H5; + const int w = info.w, h = info.h; + const uint64_t maxFrames = info.maxFrames; + const size_t bitsetBytes = sizeof(sls::defs::bitset_storage); + + std::unique_ptr file; + std::unique_ptr data; + std::vector> para; + std::unique_ptr dataSpace, paraSpace; + std::vector paraNames; + hsize_t framesAllocated = 0; + uint64_t framesWritten = 0; + // in "virtual photon counting" the budget counts maps, not frames + uint64_t pmapsWritten = 0; + auto wallStart = std::chrono::steady_clock::now(); + const std::string startedAt = isoNow(); + + // Rewrite the JSON sidecar in one atomic step: fill .json.part, + // fsync it, rename it over .json. A reader therefore always sees a + // complete JSON (the previous one until the rename), and a crash during the + // write leaves only a stale .part behind. Called periodically and once at + // the end; writer thread only. + auto writeJsonSidecar = [&](bool complete) { + // refresh the live statistics just before reporting them + if (info.statsProvider) { + try { + info.statsProvider(info.gateAtEnd, info.stats, info.streams); + } catch (...) { + } + } + std::string stopR, errR; + { + std::lock_guard lk(sMtx); + stopR = stopReason; + errR = lastError; + } + const double wall = + std::chrono::duration(std::chrono::steady_clock::now() - + wallStart) + .count(); + const std::string partPath = jsonPath + ".part"; + FILE *f = fopen(partPath.c_str(), "w"); + if (!f) + return; + const StartInfo &in = info; + fprintf(f, "{\n"); + fprintf(f, " \"complete\": %s,\n", complete ? "true" : "false"); + fprintf(f, " \"hdf5_format\": \"v110 (SWMR)\",\n"); + fprintf(f, " \"save_mode\": \"%s\",\n", + in.photonMode ? "virtual photon counting" : "frames"); + fprintf(f, " \"photon_map_every\": %d,\n", in.photonEvery); + fprintf(f, " \"photon_threshold\": %.3f,\n", in.photonThreshold); + fprintf(f, " \"photon_threshold_unit\": \"%s\",\n", + in.photonKev ? "keV" : "ADU"); + fprintf(f, " \"file\": \"%s\",\n", jsonEscape(h5Path).c_str()); + fprintf(f, " \"started\": \"%s\",\n", startedAt.c_str()); + fprintf(f, " \"duration_s\": %.3f,\n", wall); + fprintf(f, " \"format\": \"slsReceiver HDF5DataFile (writer " + "version %.1f), ROI crop, gate-passed frames only\",\n", + kHdf5WriterVersion); + fprintf(f, " \"roi\": {\"x\": %d, \"y\": %d, \"w\": %d, " + "\"h\": %d, \"coords\": \"data rows, row 0 at bottom\"},\n", + in.x, in.y, in.w, in.h); + fprintf(f, " \"frame_0_is_pedestal\": %s,\n", + in.corrected ? "false" : "true"); + fprintf(f, " \"pedestal_available\": %s,\n", + in.pedestal.size() == roiPixels ? "true" : "false"); + fprintf(f, " \"pedestal_corrected\": %s,\n", + in.corrected ? "true" : "false"); + fprintf(f, " \"data_dtype\": \"%s\",\n", + in.corrected ? "float32" : "uint16"); + if (in.corrected) + fprintf(f, " \"data_encoding\": \"pedestal corrected, " + "gain normalised (g0: raw-pede, g1: x30, g3: x340), " + "float32; pedestal image in /pedestal data\",\n"); + else + fprintf(f, " \"data_encoding\": \"raw 16-bit word: bits 0-13 " + "= ADC, bits 14-15 = gain; slice 0 = gain-0 pedestal " + "in ADC units\",\n"); + fprintf(f, " \"gate\": {\"enabled\": %s, \"threshold\": %.3f, " + "\"min_pixels\": %llu, \"contiguous\": %s, " + "\"no_pede\": %s},\n", + in.gate.enabled ? "true" : "false", + static_cast(in.gate.threshold), + static_cast(in.gate.minPixels), + in.gate.contiguous ? "true" : "false", + in.gate.noPede ? "true" : "false"); + fprintf(f, " \"gate_roi\": {\"active\": %s, \"x\": %d, \"y\": %d, " + "\"w\": %d, \"h\": %d},\n", + in.gate.roiActive ? "true" : "false", in.gate.roiX, + in.gate.roiY, in.gate.roiW, in.gate.roiH); + if (gGateChangedDuringSave.load()) + fprintf(f, " \"gate_settings_modified_during_run\": true,\n" + " \"gate_settings_note\": \"the signal-gate threshold " + "and/or min-pixels were changed while this file was being " + "written; the \\\"gate\\\" block above is the criterion " + "in force at save start\",\n"); + fprintf(f, " \"stop_reason\": \"%s\",\n", + jsonEscape(stopR).c_str()); + fprintf(f, " \"error\": \"%s\",\n", jsonEscape(errR).c_str()); + fprintf(f, " \"frames\": {\"saved\": %llu, \"dropped_queue_full\": " + "%llu, \"budget\": %llu, \"first_frame_number\": %llu, " + "\"last_frame_number\": %llu},\n", + static_cast( + in.photonMode ? pmapsWritten : saved.load()), + static_cast(dropped.load()), + static_cast(maxFrames), + static_cast(firstFrame.load()), + static_cast(lastFrame.load())); + if (in.photonMode) + fprintf(f, " \"photon_maps\": {\"saved\": %llu, \"every\": %d, " + "\"threshold\": %.3f, \"threshold_unit\": \"%s\", " + "\"cumulative\": false, \"pedestal_active\": %s, " + "\"dataset\": \"/virtual photon counting\"},\n", + static_cast(pmapsWritten), + in.photonEvery, in.photonThreshold, + in.photonKev ? "keV" : "ADU", + in.peds ? "true" : "false"); + const GateEngine::Counters g = in.gateAtEnd; + fprintf(f, " \"gate_statistics\": {\"frames_in\": %llu, " + "\"frames_passed\": %llu, \"frames_dropped\": %llu, " + "\"pixels_above\": %llu, \"drop_fraction\": %.6f, " + "\"rate_in_fps\": %.3f, \"rate_pass_fps\": %.3f, " + "\"rate_in_MBps\": %.3f, \"rate_pass_MBps\": %.3f},\n", + static_cast(g.framesIn), + static_cast(g.framesPass), + static_cast(g.framesDrop), + static_cast(g.pixelsAbove), g.dropFrac, + g.rateIn, g.ratePass, g.rateInMBs, g.ratePassMBs); + fprintf(f, " \"alignment\": {\"resync_drops\": %llu, " + "\"behind_drops\": %llu, \"unpaired\": %llu, " + "\"display_frames\": %llu, \"display_dropped\": %llu},\n", + static_cast(in.stats.resync), + static_cast(in.stats.behind), + static_cast(in.stats.unpaired), + static_cast(in.stats.displayFrames), + static_cast(in.stats.displayDropped)); + fprintf(f, " \"streams\": ["); + for (size_t i = 0; i < in.streams.size(); i++) { + fprintf(f, "%s{\"port\": %d, \"state\": \"%s\", \"frames\": " + "%llu, \"last_frame\": %llu}", + i ? ", " : "", in.streams[i].port, + jsonEscape(in.streams[i].state).c_str(), + static_cast(in.streams[i].frames), + static_cast(in.streams[i].lastFrame)); + } + fprintf(f, "]\n}\n"); + // make the .part content durable, then publish it with one rename + fflush(f); + ::fsync(::fileno(f)); + fclose(f); + if (::rename(partPath.c_str(), jsonPath.c_str()) == 0) + syncDirOf(jsonPath); + }; + + // Periodic clean checkpoint: shrink the over-allocated datasets back to the + // frames actually written, flush the HDF5 to disk and refresh the JSON. + // At every checkpoint boundary the pair on disk is self-consistent, so a + // copy/open then sees exactly the committed frames and a crash loses at + // most one interval. Writer thread only. + auto h5Checkpoint = [&]() { + if (!file) + return; + if (framesWritten > 0 && framesWritten != framesAllocated) { + hsize_t nd[3] = {framesWritten, hsize_t(h), hsize_t(w)}; + data->extend(nd); + for (auto &p : para) { + hsize_t np[1] = {framesWritten}; + p->extend(np); + } + framesAllocated = framesWritten; + dataSpace.reset(new DataSpace(data->getSpace())); + paraSpace.reset(new DataSpace(para[0]->getSpace())); + } + H5Fflush(file->getId(), H5F_SCOPE_GLOBAL); + writeJsonSidecar(false); + }; + + try { + Exception::dontPrint(); + + // ---- file + version attribute (as the receiver writes it) -------- + // Create in the latest (v110) file format: SWMR requires it, and it is + // what makes the file guaranteed readable while it is being written and + // after a writer crash. Readers need HDF5 >= 1.10. + // Built with the C++ constructor so H5File owns the only reference: + // wrapping a raw H5Fcreate id (H5File(fid)) adds a second one, and + // close() then left the file open until the process exited. + { + FileAccPropList fapl; + fapl.setLibverBounds(H5F_LIBVER_LATEST, H5F_LIBVER_LATEST); + file.reset(new H5File(h5Path, H5F_ACC_TRUNC, + FileCreatPropList::DEFAULT, fapl)); + } + { + DataSpace scalar(H5S_SCALAR); + Attribute a = + file->createAttribute("version", PredType::NATIVE_DOUBLE, + scalar); + double v = kHdf5WriterVersion; + a.write(PredType::NATIVE_DOUBLE, &v); + } + // ---- extra self-describing attributes (ignored by receiver readers) + { + DataSpace scalar(H5S_SCALAR); + Attribute ax = file->createAttribute("roi_x", PredType::NATIVE_UINT32, + scalar); + uint32_t v = static_cast(info.x); + ax.write(PredType::NATIVE_UINT32, &v); + Attribute ay = file->createAttribute("roi_y", PredType::NATIVE_UINT32, + scalar); + v = static_cast(info.y); + ay.write(PredType::NATIVE_UINT32, &v); + Attribute aw = file->createAttribute("roi_w", PredType::NATIVE_UINT32, + scalar); + v = static_cast(w); + aw.write(PredType::NATIVE_UINT32, &v); + Attribute ah = file->createAttribute("roi_h", PredType::NATIVE_UINT32, + scalar); + v = static_cast(h); + ah.write(PredType::NATIVE_UINT32, &v); + Attribute ap = file->createAttribute( + "pedestal_in_frame_0", PredType::NATIVE_UINT8, scalar); + uint8_t one = info.corrected ? 0 : 1; + ap.write(PredType::NATIVE_UINT8, &one); + Attribute ac = file->createAttribute( + "pedestal_corrected", PredType::NATIVE_UINT8, scalar); + uint8_t corr = info.corrected ? 1 : 0; + ac.write(PredType::NATIVE_UINT8, &corr); + StrType st(PredType::C_S1, H5T_VARIABLE); + Attribute ag = file->createAttribute( + "gate", st, scalar); + std::string g = info.gateJson; + const char *gp = g.c_str(); + ag.write(st, &gp); + } + + // ---- /data ------------------------------------------------------- + paraNames = {"frame number", + "exp length or sub exposure time", + "packets caught", + "detector specific 1", + "timestamp", + "mod id", + "row", + "column", + "detector specific 2", + "detector specific 3", + "detector specific 4", + "detector type", + "detector header version", + "packets caught bit mask"}; + + // raw mode starts with one slice (the pedestal), corrected mode with + // none: /data then contains exactly the gate-passed frames + const hsize_t n0 = info.corrected ? 0 : 1; + const DataType dataType = info.corrected ? DataType(PredType::IEEE_F32LE) + : DataType(PredType::STD_U16LE); + hsize_t dims[3] = {n0, hsize_t(h), hsize_t(w)}; + hsize_t dimsMax[3] = {H5S_UNLIMITED, hsize_t(h), hsize_t(w)}; + hsize_t chunk[3] = {1, hsize_t(h), hsize_t(w)}; + DataSpace ds(3, dims, dimsMax); + DSetCreatPropList plist; + plist.setChunk(3, chunk); + data.reset(new DataSet( + file->createDataSet("/data", dataType, ds, plist))); + framesAllocated = n0; + + // corrected mode: the pedestal image as its own single-image dataset + std::unique_ptr pedSet; + if (info.corrected) { + hsize_t pd[3] = {1, hsize_t(h), hsize_t(w)}; + hsize_t pdMax[3] = {1, hsize_t(h), hsize_t(w)}; + DataSpace pds3(3, pd, pdMax); + DSetCreatPropList ppl; + ppl.setChunk(3, chunk); + pedSet.reset(new DataSet(file->createDataSet( + "/pedestal data", PredType::IEEE_F32LE, pds3, ppl))); + std::vector pv(roiPixels, 0.0f); + if (info.pedestal.size() == roiPixels) + pv = info.pedestal; + const hsize_t pc[3] = {1, hsize_t(h), hsize_t(w)}; + DataSpace mspace(3, pc); // writes the whole 1-image dataset + pedSet->write(pv.data(), PredType::IEEE_F32LE, mspace); + mspace.close(); + } + + // ---- virtual photon counting: one map per publish ---------------- + // Created before SWMR starts, like every other object. + std::unique_ptr pmapSet, pmapFrameSet, pmapStampSet; + hsize_t pmapWritten = 0; + if (info.photonMode) { + hsize_t md[3] = {0, hsize_t(h), hsize_t(w)}; + hsize_t mdMax[3] = {H5S_UNLIMITED, hsize_t(h), hsize_t(w)}; + DataSpace mds(3, md, mdMax); + DSetCreatPropList mpl; + mpl.setChunk(3, chunk); + pmapSet.reset(new DataSet(file->createDataSet( + "/virtual photon counting", PredType::IEEE_F32LE, mds, mpl))); + const char *names[2] = {"/virtual photon counting frame", + "/virtual photon counting timestamp"}; + std::unique_ptr *sets[2] = {&pmapFrameSet, &pmapStampSet}; + for (int k = 0; k < 2; k++) { + hsize_t d1[1] = {0}; + hsize_t d1Max[1] = {H5S_UNLIMITED}; + hsize_t c1[1] = {1}; + DataSpace s1(1, d1, d1Max); + DSetCreatPropList p1; + p1.setChunk(1, c1); + sets[k]->reset(new DataSet( + file->createDataSet(names[k], PredType::STD_U64LE, s1, p1))); + } + } + auto writePhotonMap = [&](const Impl::PmapItem &it) { + if (!pmapSet) + return; + // the map is accumulated full-frame (1024x512 data layout); the + // saved map is the gate ROI, cropped exactly like /data (same + // x/y/w/h, same data rows) + const int cx0 = std::max(0, info.x); + const int cy0 = std::max(0, info.y); + const int cx1 = std::min(kRawWidth, info.x + w); + const int cy1 = std::min(kRawHeight, info.y + h); + const int cw = (cx1 > cx0) ? (cx1 - cx0) : 0; + std::vector crop(static_cast(w) * h, 0.0f); + for (int y = 0; cy0 + y < cy1; y++) + memcpy(&crop[static_cast(y) * w], + &it.map[static_cast(cy0 + y) * kRawWidth + cx0], + static_cast(cw) * sizeof(float)); + hsize_t nd[3] = {pmapWritten + 1, hsize_t(h), hsize_t(w)}; + pmapSet->extend(nd); + const hsize_t count[3] = {1, hsize_t(h), hsize_t(w)}; + const hsize_t start[3] = {pmapWritten, 0, 0}; + DataSpace ds3 = pmapSet->getSpace(); + ds3.selectHyperslab(H5S_SELECT_SET, count, start); + const hsize_t memDims[2] = {hsize_t(h), hsize_t(w)}; + DataSpace mem(2, memDims); + pmapSet->write(crop.data(), PredType::IEEE_F32LE, mem, ds3); + mem.close(); + ds3.close(); + const uint64_t prov[2] = {it.firstFrame, it.firstStamp}; + std::unique_ptr *sets[2] = {&pmapFrameSet, &pmapStampSet}; + for (int k = 0; k < 2; k++) { + hsize_t fnd[1] = {pmapWritten + 1}; + (*sets[k])->extend(fnd); + hsize_t fc[1] = {1}; + hsize_t fs[1] = {pmapWritten}; + DataSpace fds = (*sets[k])->getSpace(); + fds.selectHyperslab(H5S_SELECT_SET, fc, fs); + const hsize_t fm[1] = {1}; + DataSpace fms(1, fm); + (*sets[k])->write(&prov[k], PredType::STD_U64LE, fms, fds); + fms.close(); + fds.close(); + } + pmapWritten++; + pmapsInFile.store(pmapWritten); // Impl member, no shadowing + printf("[pmap] map %llu written (%llu frames, first frame %llu)\n", + (unsigned long long)pmapWritten, + (unsigned long long)it.frames, + (unsigned long long)it.firstFrame); + fflush(stdout); + }; + + // ---- pedestal tracking: one image per PEDE_TRACK_H5_PERIOD_MS ---- + // Created up front (empty) because SWMR mode cannot create objects after + // it starts. The series is still written only while tracking is on + // (plus one baseline at the start), so a run without tracking carries + // two extra empty datasets. + std::unique_ptr trackSet, trackFrameSet; + { + hsize_t td[3] = {0, hsize_t(h), hsize_t(w)}; + hsize_t tdMax[3] = {H5S_UNLIMITED, hsize_t(h), hsize_t(w)}; + DataSpace tds(3, td, tdMax); + DSetCreatPropList tpl; + tpl.setChunk(3, chunk); + trackSet.reset(new DataSet(file->createDataSet( + "/pedestal tracking", PredType::IEEE_F32LE, tds, tpl))); + hsize_t fd[1] = {0}; + hsize_t fdMax[1] = {H5S_UNLIMITED}; + hsize_t fchunk[1] = {1}; + DataSpace fds(1, fd, fdMax); + DSetCreatPropList fpl; + fpl.setChunk(1, fchunk); + trackFrameSet.reset(new DataSet(file->createDataSet( + "/pedestal tracking frame", PredType::STD_U64LE, fds, fpl))); + } + hsize_t trackWritten = 0; + int64_t lastTrackMs = 0; + auto writeTrackedPedestal = [&](uint64_t frameNo, bool force) { + if (!gPedeTracking.load() && !force) + return; + const int64_t now = + std::chrono::duration_cast( + std::chrono::steady_clock::now().time_since_epoch()) + .count(); + if (trackWritten > 0 && !force && + now - lastTrackMs < PEDE_TRACK_H5_PERIOD_MS) + return; + std::shared_ptr ps = PedestalStore::instance().get(); + if (!ps) + return; + std::vector img(static_cast(h) * w, 0.0f); + for (int ry = 0; ry < h; ry++) + for (int rx = 0; rx < w; rx++) { + const size_t fi = static_cast(info.y + ry) * 1024 + + info.x + rx; + if (fi < ps->g0.size()) + img[static_cast(ry) * w + rx] = ps->g0[fi]; + } + { + hsize_t nd[3] = {trackWritten + 1, hsize_t(h), hsize_t(w)}; + trackSet->extend(nd); + hsize_t count[3] = {1, hsize_t(h), hsize_t(w)}; + hsize_t start[3] = {trackWritten, 0, 0}; + DataSpace ds3 = trackSet->getSpace(); + ds3.selectHyperslab(H5S_SELECT_SET, count, start); + const hsize_t memDims[2] = {hsize_t(h), hsize_t(w)}; + DataSpace mem(2, memDims); + trackSet->write(img.data(), PredType::IEEE_F32LE, mem, ds3); + mem.close(); + ds3.close(); + hsize_t fnd[1] = {trackWritten + 1}; + trackFrameSet->extend(fnd); + hsize_t fcount[1] = {1}; + hsize_t fstart[1] = {trackWritten}; + DataSpace fds = trackFrameSet->getSpace(); + fds.selectHyperslab(H5S_SELECT_SET, fcount, fstart); + const hsize_t fmem[1] = {1}; + DataSpace fms(1, fmem); + trackFrameSet->write(&frameNo, PredType::STD_U64LE, fms, fds); + fms.close(); + fds.close(); + } + trackWritten++; + lastTrackMs = now; + printf("[pedetrack] pedestal image %llu written to %s (frame %llu)\n", + (unsigned long long)trackWritten, h5Path.c_str(), + (unsigned long long)frameNo); + fflush(stdout); + }; + + // ---- parameter datasets (same names/types as the receiver) -------- + hsize_t pdims[1] = {n0}; + hsize_t pdimsMax[1] = {H5S_UNLIMITED}; + hsize_t pchunk[1] = {1}; + DataSpace pds(1, pdims, pdimsMax); + DSetCreatPropList pplist; + pplist.setChunk(1, pchunk); + StrType strType(PredType::C_S1, bitsetBytes); + const DataType types[14] = { + PredType::STD_U64LE, PredType::STD_U32LE, PredType::STD_U32LE, + PredType::STD_U64LE, PredType::STD_U64LE, PredType::STD_U16LE, + PredType::STD_U16LE, PredType::STD_U16LE, PredType::STD_U16LE, + PredType::STD_U32LE, PredType::STD_U16LE, PredType::STD_U8LE, + PredType::STD_U8LE, strType}; + for (int i = 0; i < 14; i++) + para.emplace_back(new DataSet(file->createDataSet( + "/" + paraNames[i], types[i], pds, pplist))); + dataSpace.reset(new DataSpace(data->getSpace())); + paraSpace.reset(new DataSpace(para[0]->getSpace())); + + // ---- switch to SWMR ---------------------------------------------- + // Every object now exists (attributes, /data, /pedestal data, + // /pedestal tracking, the parameter datasets); SWMR forbids creating + // new ones afterwards. From here on the H5Fflush at each checkpoint + // publishes a consistent view to concurrent SWMR readers, and the file + // stays valid even if this process dies without closing it. + if (H5Fstart_swmr_write(file->getId()) < 0) + throw std::runtime_error("H5Fstart_swmr_write failed for " + h5Path); + writeTrackedPedestal(0, /*force=*/true); // baseline at the start + + // ---- write one frame (image + parameters) ------------------------ + auto writeFrame = [&](const SavedFrameHeader &hd, + const void *pixels) { + writeTrackedPedestal(hd.frameNumber, /*force=*/false); + if (framesWritten + 1 > framesAllocated) { + hsize_t nd[3] = {framesAllocated + kExtendBlock, hsize_t(h), + hsize_t(w)}; + data->extend(nd); + for (auto &p : para) { + hsize_t np[1] = {nd[0]}; + p->extend(np); + } + framesAllocated = nd[0]; + dataSpace.reset(new DataSpace(data->getSpace())); + paraSpace.reset(new DataSpace(para[0]->getSpace())); + } + const hsize_t count[3] = {1, hsize_t(h), hsize_t(w)}; + const hsize_t start[3] = {framesWritten, 0, 0}; + const hsize_t memDims[2] = {hsize_t(h), hsize_t(w)}; + dataSpace->selectHyperslab(H5S_SELECT_SET, count, start); + DataSpace mem(2, memDims); + data->write(pixels, dataType, mem, *dataSpace); + mem.close(); + + const hsize_t pcount[1] = {1}; + const hsize_t pstart[1] = {framesWritten}; + paraSpace->selectHyperslab(H5S_SELECT_SET, pcount, pstart); + DataSpace pscalar(H5S_SCALAR); + unsigned char empty[sizeof(sls::defs::bitset_storage)]; + memset(empty, 0, sizeof(empty)); + para[0]->write(&hd.frameNumber, types[0], pscalar, *paraSpace); + para[1]->write(&hd.expLength, types[1], pscalar, *paraSpace); + para[2]->write(&hd.packetNumber, types[2], pscalar, *paraSpace); + para[3]->write(&hd.detSpec1, types[3], pscalar, *paraSpace); + para[4]->write(&hd.timestamp, types[4], pscalar, *paraSpace); + para[5]->write(&hd.modId, types[5], pscalar, *paraSpace); + para[6]->write(&hd.row, types[6], pscalar, *paraSpace); + para[7]->write(&hd.column, types[7], pscalar, *paraSpace); + para[8]->write(&hd.detSpec2, types[8], pscalar, *paraSpace); + para[9]->write(&hd.detSpec3, types[9], pscalar, *paraSpace); + para[10]->write(&hd.detSpec4, types[10], pscalar, *paraSpace); + para[11]->write(&hd.detType, types[11], pscalar, *paraSpace); + para[12]->write(&hd.version, types[12], pscalar, *paraSpace); + para[13]->write(empty, types[13], pscalar, *paraSpace); + pscalar.close(); + framesWritten++; + }; + + // ---- raw mode: slice 0 = the pedestal in the same ROI ------------- + if (!info.corrected) { + std::vector ped(roiPixels, 0); + if (info.pedestal.size() == roiPixels) { + for (size_t i = 0; i < roiPixels; i++) { + const float v = info.pedestal[i]; + ped[i] = (v <= 0.0f) + ? 0 + : (v >= 65535.0f + ? 65535 + : static_cast(v + 0.5f)); + } + } + SavedFrameHeader hd; // frame number 0 marks the pedestal slice + writeFrame(hd, ped.data()); + } + + // ---- drain the queue --------------------------------------------- + const int checkpointMs = info.checkpointMs; + auto steadyMs = []() { + return std::chrono::duration_cast( + std::chrono::steady_clock::now().time_since_epoch()) + .count(); + }; + int64_t lastCheckpointMs = steadyMs(); + for (;;) { + Impl::Item item; + bool have = false; + { + std::unique_lock lk(qMtx); + qCv.wait_for(lk, std::chrono::milliseconds(100), [&] { + return !queue.empty() || stopRequested.load(); + }); + if (!queue.empty()) { + item = std::move(queue.front()); + queue.pop_front(); + queuedBytes -= item.pixels.size() * sizeof(float); + have = true; + } + } + // periodic clean checkpoint (HDF5 exact+flushed, JSON renamed) + if (checkpointMs > 0) { + const int64_t nowMs = steadyMs(); + if (nowMs - lastCheckpointMs >= checkpointMs) { + h5Checkpoint(); + lastCheckpointMs = nowMs; + } + } + for (;;) { // virtual photon counting maps + Impl::PmapItem it; + { + std::lock_guard lk(qMtx); + if (pmapQueue.empty()) + break; + it = std::move(pmapQueue.front()); + pmapQueue.pop_front(); + } + writePhotonMap(it); + pmapsWritten++; + if (maxFrames > 0 && pmapsWritten >= maxFrames) { + setStop("photon-map budget reached"); + stopRequested.store(true); + break; + } + } + if (stopRequested.load()) + break; + if (!have) { + // idle tick: the tracked pedestal is written every + // PEDE_TRACK_H5_PERIOD_MS of wall clock while the save runs, + // even if no frame passes the gate + writeTrackedPedestal(lastFrame.load(), /*force=*/false); + } + if (have) { + if (info.corrected) { + writeFrame(item.hdr, item.pixels.data()); + } else { + static std::vector raw; + raw.resize(item.pixels.size()); + for (size_t k = 0; k < item.pixels.size(); k++) { + const float v = item.pixels[k]; + raw[k] = (v <= 0.0f) + ? 0 + : (v >= 65535.0f + ? 65535 + : static_cast(v + 0.5f)); + } + writeFrame(item.hdr, raw.data()); + } + if (firstFrame.load() == 0) + firstFrame.store(item.hdr.frameNumber); + lastFrame.store(item.hdr.frameNumber); + const uint64_t n = saved.fetch_add(1) + 1; + { + std::lock_guard lk(qMtx); + freeList.push_back(std::move(item)); + } + if (maxFrames > 0 && n >= maxFrames) { + setStop("frame budget reached"); + stopRequested.store(true); + break; // frames still queued are beyond the budget + } + continue; + } + if (stopRequested.load()) + break; + } + + // ---- shrink to what we actually wrote, then close ----------------- + { + const hsize_t finalFrames = framesWritten ? framesWritten : 1; + hsize_t nd[3] = {finalFrames, hsize_t(h), hsize_t(w)}; + data->extend(nd); + for (auto &p : para) { + hsize_t np[1] = {finalFrames}; + p->extend(np); + } + } + dataSpace.reset(); + paraSpace.reset(); + data.reset(); + para.clear(); + pedSet.reset(); + trackSet.reset(); + trackFrameSet.reset(); + file->close(); + file.reset(); + } catch (const H5::Exception &e) { + setError(std::string("HDF5: ") + e.getDetailMsg()); + setStop("error"); + stopRequested.store(true); + } catch (const std::exception &e) { + setError(std::string("save failed: ") + e.what()); + setStop("error"); + stopRequested.store(true); + } + + // ---- final JSON sidecar (atomic .json.part -> rename) -------- + // Periodic snapshots have already refreshed it during the run. + writeJsonSidecar(true); + running.store(false); +} diff --git a/slsDetectorCalibration/jungfrauExecutables/jf_online_display_gui/online_jf_root.cpp b/slsDetectorCalibration/jungfrauExecutables/jf_online_display_gui/online_jf_root.cpp new file mode 100644 index 000000000..50c5d5341 --- /dev/null +++ b/slsDetectorCalibration/jungfrauExecutables/jf_online_display_gui/online_jf_root.cpp @@ -0,0 +1,1393 @@ +// SPDX-License-Identifier: LGPL-3.0-or-other +// =========================================================================== +// online_jf_root.cpp -- ROOT canvases, the ROOT redraw thread and the +// command queue. +// +// ROOT is not thread safe: canvas painting and gSystem->ProcessEvents() may +// only run on ONE thread. That thread is the only one allowed to touch the +// display clones; the source histograms are filled by the analysis thread. +// +// Split out of onlinedisp_zmq.cpp (Plot1D/2DHistos, historeset, axisreset, +// palettes, the ROOT half of MainWindow::rootDrawLoop). +// =========================================================================== +#include "online_jf.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include + + +// --------------------------------------------------------------------------- +// ROOT objects +// --------------------------------------------------------------------------- +TApplication *rootapp = nullptr; +TCanvas *A2 = nullptr, *A3 = nullptr, *A4 = nullptr, *A5 = nullptr, + *A6 = nullptr, *A7 = nullptr; +TPad *p1 = nullptr, *p2 = nullptr, *p3 = nullptr, *p4 = nullptr, *p5 = nullptr, + *p6 = nullptr; +TH1I **hchip = nullptr; +TH1I *hroi = nullptr; // one spectrum over the gate-ROI pixels only +// the same spectra in keV (canvases A8/A9); filled only when a gain map is +// loaded, and drawn only then too +TH1I **hchipKev = nullptr; +TH1I *hroiKev = nullptr; +TH1I *hproj = nullptr, *hchcum = nullptr; +TH2F *his1000 = nullptr, *his1001 = nullptr, *his1002 = nullptr; +TH2F *his1060 = nullptr, *his1061 = nullptr, *his1062 = nullptr; +TH2F *his2000 = nullptr, *his3000 = nullptr, *his4500 = nullptr, + *hisLvsR = nullptr; +TBox *box = nullptr; + +// display clones painted by the ROOT thread +TH2F *disp3000 = nullptr; +TH2F *disp4500 = nullptr; +TH2F *dispLvsR = nullptr; +TH1I *dispChip[8] = {nullptr, nullptr, nullptr, nullptr, + nullptr, nullptr, nullptr, nullptr}; +TH1I *dispRoi = nullptr; +TH1I *dispChipKev[8] = {nullptr, nullptr, nullptr, nullptr, + nullptr, nullptr, nullptr, nullptr}; +TH1I *dispRoiKev = nullptr; +// photon-map helpers (defined further down, ROOT thread only) +void plotPhotonMap(); +void zoomPhotonMap(double x0, double x1, double y0, double y1); +void setSpectrumTitles(bool kev); + +#ifdef JFSTRX +TH2F *disp1000 = nullptr, *disp1001 = nullptr, *disp1002 = nullptr; +TH2F *disp1060 = nullptr, *disp1061 = nullptr, *disp1062 = nullptr; +#endif + +namespace { +// TEMP instrumentation: where the ROOT thread spends its time +double g_rtCopy = 0, g_rtPlot2 = 0, g_rtPlot1 = 0, g_rtPlotRoi = 0, + g_rtPlotKev = 0, g_rtPlotRoiKev = 0, g_rtPe = 0, g_rtCmd = 0; +uint64_t g_rtRedraws = 0, g_rtLoops = 0; +uint64_t g_rtNPlot1 = 0, g_rtNPlotRoi = 0, g_rtNPlotKev = 0, + g_rtNPlotRoiKev = 0; +bool g_rootTiming() { return getenv("JF_TIMING") != nullptr; } + +std::mutex gCmdMtx; +std::condition_variable gCmdCv; // wakes the ROOT thread for a prompt command +std::vector gCmds; + +std::thread *gRootThread = nullptr; +std::atomic gRootRun{false}; + +// copies bin contents + entry count from a source accumulator to its display +// clone (same geometry). ROOT-thread only. +void copyBins(TH1 *dst, TH1 *src) { + if (!dst || !src) + return; + const int bx = dst->GetNbinsX(); + const int by = dst->GetNbinsY(); + dst->Reset(); + if (by <= 1) { + for (int b = 1; b <= bx; b++) + dst->SetBinContent(b, src->GetBinContent(b)); + } else { + for (int y = 1; y <= by; y++) + for (int x = 1; x <= bx; x++) + dst->SetBinContent(x, y, src->GetBinContent(x, y)); + } + dst->SetEntries(src->GetEntries()); +} + +void rootLoop(); +} // namespace + +// --------------------------------------------------------------------------- +// Command queue (any thread -> ROOT thread) +// --------------------------------------------------------------------------- +void pushRootCmd(const RootCmd &cmd) { + { + std::lock_guard lock(gCmdMtx); + gCmds.push_back(cmd); + } + gCmdCv.notify_one(); // service it now, not at the next scheduled redraw +} + +void pushRootCmdCoalesced(const RootCmd &cmd) { + { + std::lock_guard lock(gCmdMtx); + for (auto &c : gCmds) { + if (c.type == cmd.type) { + c = cmd; // keep only the newest viewport + gCmdCv.notify_one(); + return; + } + } + gCmds.push_back(cmd); + } + gCmdCv.notify_one(); +} + +void requestHistoReset() { + // Wakes the ROOT thread. execRootCmd() applies the reset if the analysis + // thread is between frames, otherwise it leaves the flag for the analysis + // thread to apply at the top of its next frame. The ROOT thread must never + // BLOCK on gHistoMtx: under a heavy stream it can starve, which is what + // made the reset appear to take tens of seconds. + RootCmd c; + c.type = RootCmdType::ResetHis; + pushRootCmd(c); +} + +void forceRootRedraw() { + gRedrawRequest.store(true); + gCmdCv.notify_one(); +} + +void startRootThread() { + if (gRootThread) + return; + gRootRun.store(true); + gRootThread = new std::thread(rootLoop); +} + +void stopRootThread() { + gRootRun.store(false); + // only the first call prints (a signal stop and the normal shutdown can + // both come through here; the second one has nothing left to join) + if (gRootThread && g_rootTiming()) { + printf("[root] loops=%llu redraws=%llu | per-redraw us: copy=%.0f " + "plot2d=%.0f plot1d=%.0f plotroi=%.0f plotkev=%.0f " + "plotrokev=%.0f | per-loop us: cmd=%.0f pe=%.0f\n", + (unsigned long long)g_rtLoops, + (unsigned long long)g_rtRedraws, + g_rtRedraws ? g_rtCopy / g_rtRedraws : 0.0, + g_rtRedraws ? g_rtPlot2 / g_rtRedraws : 0.0, + g_rtRedraws ? g_rtPlot1 / g_rtRedraws : 0.0, + g_rtRedraws ? g_rtPlotRoi / g_rtRedraws : 0.0, + g_rtRedraws ? g_rtPlotKev / g_rtRedraws : 0.0, + g_rtRedraws ? g_rtPlotRoiKev / g_rtRedraws : 0.0, + g_rtLoops ? g_rtCmd / g_rtLoops : 0.0, + g_rtLoops ? g_rtPe / g_rtLoops : 0.0); + printf("[root] spectrum paints: chipsADU=%llu roiADU=%llu " + "chipsKeV=%llu roiKeV=%llu | per paint us: %.0f %.0f %.0f %.0f\n", + (unsigned long long)g_rtNPlot1, (unsigned long long)g_rtNPlotRoi, + (unsigned long long)g_rtNPlotKev, + (unsigned long long)g_rtNPlotRoiKev, + g_rtNPlot1 ? g_rtPlot1 / g_rtNPlot1 : 0.0, + g_rtNPlotRoi ? g_rtPlotRoi / g_rtNPlotRoi : 0.0, + g_rtNPlotKev ? g_rtPlotKev / g_rtNPlotKev : 0.0, + g_rtNPlotRoiKev ? g_rtPlotRoiKev / g_rtNPlotRoiKev : 0.0); + // spectrum totals (the ROI ones must be a subset of the chip ones); + // read under the histogram lock, the analysis thread may still be + // alive when this thread is stopped + { + std::lock_guard lock(gHistoMtx); + char chipTxt[8 * 20] = ""; + double chipTot = 0; + for (int k = 0; k < 8; k++) { + char one[24]; + const double c = hchip && hchip[k] ? hchip[k]->GetEntries() : 0; + chipTot += c; + snprintf(one, sizeof(one), "%.0f ", c); + strncat(chipTxt, one, sizeof(chipTxt) - strlen(chipTxt) - 1); + } + const double roiTot = hroi ? hroi->GetEntries() : 0; + double kevTot = 0; + if (hchipKev) { + for (int k = 0; k < 8; k++) + if (hchipKev[k]) + kevTot += hchipKev[k]->GetEntries(); + } + const double roiKevTot = hroiKev ? hroiKev->GetEntries() : 0; + printf("[root] spectra entries: hchip=[%s] total=%.0f | hroi=%.0f " + "(roi/chip=%.4f)\n", + chipTxt, chipTot, roiTot, + chipTot > 0 ? roiTot / chipTot : 0.0); + printf("[root] keV entries: hchipKev=%.0f hroiKev=%.0f " + "(kev/adu=%.4f, gainmap=%s)\n", + kevTot, roiKevTot, + chipTot > 0 ? kevTot / chipTot : 0.0, + gainMapLoaded() ? "loaded" + : ((kevSpectra.load() && gain_flag.load()) + ? "nominal" + : "none")); + // the conversion is right when keV_mean == ADU_mean / (ADU per + // keV): with a g0 of 40 that ratio is exactly 40 + if (hroiKev && roiKevTot > 0) { + const TAxis *kx = hroiKev->GetXaxis(); + const int kmax = hroiKev->GetMaximumBin(); + printf("[root] hroi_keV axis %.4f..%.4f nbins %d window " + "bins %d..%d | maxbin %d (%.4f) content %.0f | " + "mean %.4f | under %0.f over %.0f\n", + kx->GetXmin(), kx->GetXmax(), kx->GetNbins(), + kx->GetFirst(), kx->GetLast(), kmax, + kx->GetBinCenter(kmax), hroiKev->GetBinContent(kmax), + hroiKev->GetMean(), hroiKev->GetBinContent(0), + hroiKev->GetBinContent(kx->GetNbins() + 1)); + } + if (hroiKev && roiTot > 0 && roiKevTot > 0) { + const double aduMean = hroi->GetMean(); + const double kevMean = hroiKev->GetMean(); + printf("[root] mean of the ROI spectra: ADU %.4f -> keV %.4f " + "(ADU/keV = %.4f)\n", + aduMean, kevMean, + kevMean != 0 ? aduMean / kevMean : 0.0); + } + // the axis windows actually in force + auto lo = [](TAxis *a) { return a->GetBinLowEdge(a->GetFirst()); }; + auto hi = [](TAxis *a) { return a->GetBinUpEdge(a->GetLast()); }; + if (dispChip[0]) + printf("[root] ranges: PH x %.0f..%.0f", + lo(dispChip[0]->GetXaxis()), hi(dispChip[0]->GetXaxis())); + if (dispRoi) + printf(" | ROI x %.0f..%.0f", lo(dispRoi->GetXaxis()), + hi(dispRoi->GetXaxis())); + printf(" | PH set %s", + (kevSpectra.load() && gain_flag.load()) ? "keV" : "ADU"); + if (disp3000) // the colour scale lives in min/max, not in a range + printf(" | main z %.0f..%.0f (%s)", disp3000->GetMinimum(), + disp3000->GetMaximum(), + dophotonmap.load() ? "photon counts" : "raw ADC"); + printf("\n"); + } + fflush(stdout); + } + if (gRootThread) { + if (gRootThread->joinable()) + gRootThread->join(); + delete gRootThread; + gRootThread = nullptr; + } +} + +// --------------------------------------------------------------------------- +// Command execution (ROOT thread only) +// --------------------------------------------------------------------------- +namespace { + +void execRootCmd(const RootCmd &cmd) { + switch (cmd.type) { + case RootCmdType::ResetHis: + gResetHisPending.store(true); + gRedrawRequest.store(true); + // If the analysis thread is between frames it does not hold gHistoMtx, + // so apply the reset here (makes a reset while idle/paused immediate). + // Otherwise leave the flag; the analysis thread performs it at the top + // of its next frame, where the lock is already held. try_lock never + // blocks, so the ROOT thread can never starve on gHistoMtx. + if (gHistoMtx.try_lock()) { + if (gResetHisPending.exchange(false)) + historesetSourcesLocked(); + gHistoMtx.unlock(); + } + break; + case RootCmdType::ResetAxes: + axisreset(); + break; + case RootCmdType::PaletteColor: + loadRootPalette(Palette::Color); + Plot2DHistos(); + Plot1DHistos(); + break; + case RootCmdType::PaletteBW1: + loadRootPalette(Palette::BW1); + Plot2DHistos(); + Plot1DHistos(); + break; + case RootCmdType::PaletteBW2: + loadRootPalette(Palette::BW2); + Plot2DHistos(); + Plot1DHistos(); + break; + case RootCmdType::Zoom: + if (disp3000 && A5) { + // a drag produces a stream of viewports; only repaint the last one + // (the ranges are applied below, so nothing is lost by skipping) + { + bool newer = false; + std::lock_guard lock(gCmdMtx); + for (const RootCmd &c : gCmds) { + if (c.type == RootCmdType::Zoom) { + newer = true; + break; + } + } + if (newer) + break; + } + zoomPhotonMap(cmd.a, cmd.c, cmd.b, cmd.d); + } + break; + case RootCmdType::ShowPlots: { + // TCanvas has no Hide() and unmapping its widget does not hide the + // TRootCanvas frame, so the frames are parked off-screen instead and + // their geometry is restored when they are shown again. The canvases, + // their histograms and their contents stay alive either way. + static std::map> parked; + TIter next(gROOT->GetListOfCanvases()); + while (TObject *o = next()) { + TCanvas *c = static_cast(o); + if (!c || !c->GetCanvasImp()) + continue; + if (cmd.a > 0.5) { + auto it = parked.find(c); + if (it != parked.end()) { + c->GetCanvasImp()->SetWindowPosition(it->second.first, + it->second.second); + parked.erase(it); + } + c->Modified(); + c->Update(); + } else { + Int_t x = 0, y = 0; + UInt_t w = 0, h = 0; + c->GetCanvasImp()->GetWindowGeometry(x, y, w, h); + if (x > -1000) // only remember a real on-screen position + parked[c] = std::make_pair(x, y); + c->GetCanvasImp()->SetWindowPosition(-4000, -4000); + } + } + break; + } + case RootCmdType::SetMapRange: + // colour scale of the ROOT 2D map: applied once, on the ROOT thread, + // so a scale the operator drags on the canvas is NOT reset by the + // periodic redraw (TH1::Reset() does not touch it either) + if (disp3000) { + disp3000->GetZaxis()->SetRangeUser(cmd.a, cmd.b); + Plot2DHistos(); + } + break; + case RootCmdType::SetChipRange: + for (int ih = 0; ih < 8; ih++) { + if (dispChip[ih]) + dispChip[ih]->GetXaxis()->SetRangeUser(cmd.a, cmd.b); + // the ROI and keV spectra share A4's x window; the keV axis is + // the ADU axis / 40, so the same bin indices are selected + if (dispRoi) + dispRoi->GetXaxis()->SetRangeUser(cmd.a, cmd.b); + if (dispRoiKev) + dispRoiKev->GetXaxis()->SetRangeUser(cmd.a / KEV_NOMINAL_ADU, + cmd.b / KEV_NOMINAL_ADU); + for (int ik = 0; ik < 8; ik++) { + if (dispChipKev[ik]) + dispChipKev[ik]->GetXaxis()->SetRangeUser( + cmd.a / KEV_NOMINAL_ADU, cmd.b / KEV_NOMINAL_ADU); + } + } + Plot1DHistos(); + break; + default: + break; + } +} + +// --------------------------------------------------------------------------- +// ROOT redraw loop: the single owner of ROOT graphics +// --------------------------------------------------------------------------- +void rootLoop() { + auto next = steady_clock::now(); + while (gRootRun.load()) { + try { // an escaping exception would abort the process + // Wait for the scheduled redraw, but wake immediately for a queued + // command or a forced redraw: with ROOT update set to tens of seconds + // a button must not wait for the next tick. + { + std::unique_lock lk(gCmdMtx); + gCmdCv.wait_until(lk, next, [&] { + return !gCmds.empty() || gRedrawRequest.load() || + !gRootRun.load(); + }); + } + if (!gRootRun.load()) + break; + + g_rtLoops++; + const auto tLoop0 = steady_clock::now(); + // 1) execute queued user commands (posted by the Qt thread) + for (;;) { + RootCmd cmd; + { + std::lock_guard lock(gCmdMtx); + if (gCmds.empty()) + break; + cmd = gCmds.front(); + gCmds.erase(gCmds.begin()); + } + execRootCmd(cmd); + } + + g_rtCmd += duration(steady_clock::now() - tLoop0) + .count(); + // 2) ROOT GUI event processing lives HERE (single owner thread), + // keeping the canvases interactive (zoom etc.) + { + const auto t0 = steady_clock::now(); + gSystem->ProcessEvents(); + g_rtPe += duration(steady_clock::now() - t0) + .count(); + } + + // 3) periodic plot + int ms = rootUpdateMs.load(); + if (ms < 50) + ms = 50; + next = steady_clock::now() + std::chrono::milliseconds(ms); + + const bool forced = gRedrawRequest.exchange(false); + if (gFramesForRoot.exchange(0) == 0 && !forced) + continue; + + // snapshot the source accumulators into the display clones that the + // canvases paint (never paint the objects being filled) + { + const auto t0 = steady_clock::now(); + copyBins(disp3000, his3000); + copyBins(disp4500, his4500); + copyBins(dispLvsR, hisLvsR); + for (int ih = 0; ih < 8; ih++) + copyBins(dispChip[ih], hchip ? hchip[ih] : nullptr); + copyBins(dispRoi, hroi); + for (int ih = 0; ih < 8; ih++) + copyBins(dispChipKev[ih], hchipKev ? hchipKev[ih] : nullptr); + copyBins(dispRoiKev, hroiKev); + g_rtCopy += duration(steady_clock::now() - t0) + .count(); + } +#ifdef JFSTRX + copyBins(disp1000, his1000); + copyBins(disp1001, his1001); + copyBins(disp1002, his1002); + copyBins(disp1060, his1060); + copyBins(disp1061, his1061); + copyBins(disp1062, his1062); +#endif + + { + const auto t0 = steady_clock::now(); + Plot2DHistos(); + g_rtPlot2 += duration(steady_clock::now() - t0) + .count(); + } + serviceRootEvents(); // the 2D canvases are painted: service input now + + // The spectrum canvases are the most expensive ones, so they run at a + // slower cadence than the images, one per tick in round-robin: a + // single redraw never pays for both. Only ONE set is on screen - the + // ADU pair or the keV pair, selected by the "keV PH" checkbox. + int every = chipUpdateEvery.load(); + if (every < 1) + every = 1; + static int chipTick = 0; + static int rot = 0; + if ((chipTick++ % every) == 0) { + // the keV view follows the gain stage; no map -> nominal 40 ADU/keV + const bool kev = kevSpectra.load() && gain_flag.load(); + setSpectrumTitles(kev); + const auto t0 = steady_clock::now(); + if (kev) { + if ((rot % 2) == 0) + Plot1DHistosKev(); + else + PlotRoiHistosKev(); + } else { + if ((rot % 2) == 0) + Plot1DHistos(); + else + PlotRoiHistos(); + } + const double us = + duration(steady_clock::now() - t0).count(); + if (kev && (rot % 2) == 0) { + g_rtPlotKev += us; + g_rtNPlotKev++; + } else if (kev) { + g_rtPlotRoiKev += us; + g_rtNPlotRoiKev++; + } else if ((rot % 2) == 0) { + g_rtPlot1 += us; + g_rtNPlot1++; + } else { + g_rtPlotRoi += us; + g_rtNPlotRoi++; + } + rot++; + serviceRootEvents(); + } + g_rtRedraws++; + // keep the TvsB/LvsR scatter windows fresh: the analysis thread + // resets them before the first fill of the next period (the photon + // map stays cumulative) + gSoftResetPending.store(true); + } catch (const std::exception &e) { + fprintf(stderr, "[root] exception: %s (ROOT drawing stopped)\n", + e.what()); + fflush(stderr); + break; + } catch (...) { + fprintf(stderr, "[root] unknown exception (ROOT drawing stopped)\n"); + fflush(stderr); + break; + } + } +} + +} // namespace + +// --------------------------------------------------------------------------- +// Plotting helpers (ROOT thread only, except where noted) +// --------------------------------------------------------------------------- +void serviceRootEvents() { + if (gSystem) + gSystem->ProcessEvents(); +} + +// --------------------------------------------------------------------------- +// Palettes: a single definition per palette feeds both ROOT (gradient colour +// table) and the fast image widgets (256-entry RGB lookup table), so the +// photon map and the ADC image always look the same. +// --------------------------------------------------------------------------- +namespace { + +struct PaletteDef { + // piecewise-linear colour stops (used when nstops > 0) + int nstops = 0; + double stops[24] = {0, 0, 0, 0, 0}; + double r[24] = {0, 0, 0, 0, 0}; + double g[24] = {0, 0, 0, 0, 0}; + double b[24] = {0, 0, 0, 0, 0}; + // gray ramp exponent (used when nstops == 0) + double gamma = 1.0; +}; + +const PaletteDef &paletteDef(Palette p) { + // "False" colour table, as used by the original display + static const PaletteDef color = [] { + PaletteDef d; + d.nstops = 5; + d.stops[0] = 0.00; d.stops[1] = 0.34; d.stops[2] = 0.61; + d.stops[3] = 0.84; d.stops[4] = 1.00; + d.r[0] = 0.00; d.r[1] = 0.00; d.r[2] = 0.87; d.r[3] = 1.00; + d.r[4] = 0.51; + d.g[0] = 0.00; d.g[1] = 0.81; d.g[2] = 1.00; d.g[3] = 0.20; + d.g[4] = 0.00; + d.b[0] = 0.51; d.b[1] = 1.00; d.b[2] = 0.12; d.b[3] = 0.00; + d.b[4] = 0.00; + return d; + }(); + static const PaletteDef bw1 = [] { + PaletteDef d; + d.gamma = 1.1111; // same exponent the original 'b' button used + return d; + }(); + static const PaletteDef bw2 = [] { + PaletteDef d; + d.gamma = 0.9; // same exponent the original 'B' button used + return d; + }(); + static const PaletteDef turbo = [] { + PaletteDef d; + d.nstops = 15; + d.stops[0] = 0.0000; + d.stops[1] = 0.0714; + d.stops[2] = 0.1429; + d.stops[3] = 0.2143; + d.stops[4] = 0.2857; + d.stops[5] = 0.3571; + d.stops[6] = 0.4286; + d.stops[7] = 0.5000; + d.stops[8] = 0.5714; + d.stops[9] = 0.6429; + d.stops[10] = 0.7143; + d.stops[11] = 0.7857; + d.stops[12] = 0.8571; + d.stops[13] = 0.9286; + d.stops[14] = 1.0000; + d.r[0] = 0.1882; d.r[1] = 0.2549; d.r[2] = 0.2745; d.r[3] = 0.2235; + d.r[4] = 0.1059; d.r[5] = 0.1412; d.r[6] = 0.3804; d.r[7] = 0.6431; + d.r[8] = 0.8196; d.r[9] = 0.9529; d.r[10] = 0.9961; d.r[11] = 0.9529; + d.r[12] = 0.8510; d.r[13] = 0.6941; d.r[14] = 0.4784; + d.g[0] = 0.0706; d.g[1] = 0.2706; d.g[2] = 0.4588; d.g[3] = 0.6353; + d.g[4] = 0.8118; d.g[5] = 0.9255; d.g[6] = 0.9882; d.g[7] = 0.9882; + d.g[8] = 0.9098; d.g[9] = 0.7765; d.g[10] = 0.6078; d.g[11] = 0.3882; + d.g[12] = 0.2196; d.g[13] = 0.0980; d.g[14] = 0.0157; + d.b[0] = 0.2314; d.b[1] = 0.6706; d.b[2] = 0.9294; d.b[3] = 0.9882; + d.b[4] = 0.8314; d.b[5] = 0.6510; d.b[6] = 0.4235; d.b[7] = 0.2314; + d.b[8] = 0.2039; d.b[9] = 0.2275; d.b[10] = 0.1765; d.b[11] = 0.0824; + d.b[12] = 0.0235; d.b[13] = 0.0039; d.b[14] = 0.0078; + return d; + }(); + static const PaletteDef viridis = [] { + PaletteDef d; + d.nstops = 10; + d.stops[0] = 0.0000; + d.stops[1] = 0.1111; + d.stops[2] = 0.2222; + d.stops[3] = 0.3333; + d.stops[4] = 0.4444; + d.stops[5] = 0.5556; + d.stops[6] = 0.6667; + d.stops[7] = 0.7778; + d.stops[8] = 0.8889; + d.stops[9] = 1.0000; + d.r[0] = 0.2667; d.r[1] = 0.2824; d.r[2] = 0.2431; d.r[3] = 0.1922; + d.r[4] = 0.1490; d.r[5] = 0.1216; d.r[6] = 0.2078; d.r[7] = 0.4314; + d.r[8] = 0.7098; d.r[9] = 0.9922; + d.g[0] = 0.0039; d.g[1] = 0.1569; d.g[2] = 0.2863; d.g[3] = 0.4078; + d.g[4] = 0.5098; d.g[5] = 0.6196; d.g[6] = 0.7176; d.g[7] = 0.8078; + d.g[8] = 0.8706; d.g[9] = 0.9059; + d.b[0] = 0.3294; d.b[1] = 0.4706; d.b[2] = 0.5373; d.b[3] = 0.5569; + d.b[4] = 0.5569; d.b[5] = 0.5373; d.b[6] = 0.4745; d.b[7] = 0.3451; + d.b[8] = 0.1686; d.b[9] = 0.1451; + return d; + }(); + static const PaletteDef plasma = [] { + PaletteDef d; + d.nstops = 10; + d.stops[0] = 0.0000; + d.stops[1] = 0.1111; + d.stops[2] = 0.2222; + d.stops[3] = 0.3333; + d.stops[4] = 0.4444; + d.stops[5] = 0.5556; + d.stops[6] = 0.6667; + d.stops[7] = 0.7778; + d.stops[8] = 0.8889; + d.stops[9] = 1.0000; + d.r[0] = 0.0510; d.r[1] = 0.2745; d.r[2] = 0.4471; d.r[3] = 0.6118; + d.r[4] = 0.7412; d.r[5] = 0.8471; d.r[6] = 0.9294; d.r[7] = 0.9843; + d.r[8] = 0.9922; d.r[9] = 0.9412; + d.g[0] = 0.0314; d.g[1] = 0.0118; d.g[2] = 0.0039; d.g[3] = 0.0902; + d.g[4] = 0.2157; d.g[5] = 0.3412; d.g[6] = 0.4745; d.g[7] = 0.6235; + d.g[8] = 0.7922; d.g[9] = 0.9765; + d.b[0] = 0.5294; d.b[1] = 0.6235; d.b[2] = 0.6588; d.b[3] = 0.6196; + d.b[4] = 0.5255; d.b[5] = 0.4196; d.b[6] = 0.3255; d.b[7] = 0.2275; + d.b[8] = 0.1490; d.b[9] = 0.1294; + return d; + }(); + static const PaletteDef inferno = [] { + PaletteDef d; + d.nstops = 10; + d.stops[0] = 0.0000; + d.stops[1] = 0.1111; + d.stops[2] = 0.2222; + d.stops[3] = 0.3333; + d.stops[4] = 0.4444; + d.stops[5] = 0.5556; + d.stops[6] = 0.6667; + d.stops[7] = 0.7778; + d.stops[8] = 0.8889; + d.stops[9] = 1.0000; + d.r[0] = 0.0000; d.r[1] = 0.1059; d.r[2] = 0.2902; d.r[3] = 0.4706; + d.r[4] = 0.6471; d.r[5] = 0.8118; d.r[6] = 0.9294; d.r[7] = 0.9843; + d.r[8] = 0.9686; d.r[9] = 0.9882; + d.g[0] = 0.0000; d.g[1] = 0.0471; d.g[2] = 0.0471; d.g[3] = 0.1098; + d.g[4] = 0.1725; d.g[5] = 0.2667; d.g[6] = 0.4118; d.g[7] = 0.6078; + d.g[8] = 0.8196; d.g[9] = 1.0000; + d.b[0] = 0.0157; d.b[1] = 0.2549; d.b[2] = 0.4196; d.b[3] = 0.4275; + d.b[4] = 0.3765; d.b[5] = 0.2745; d.b[6] = 0.1451; d.b[7] = 0.0235; + d.b[8] = 0.2392; d.b[9] = 0.6431; + return d; + }(); + static const PaletteDef magma = [] { + PaletteDef d; + d.nstops = 10; + d.stops[0] = 0.0000; + d.stops[1] = 0.1111; + d.stops[2] = 0.2222; + d.stops[3] = 0.3333; + d.stops[4] = 0.4444; + d.stops[5] = 0.5556; + d.stops[6] = 0.6667; + d.stops[7] = 0.7778; + d.stops[8] = 0.8889; + d.stops[9] = 1.0000; + d.r[0] = 0.0000; d.r[1] = 0.0941; d.r[2] = 0.2667; d.r[3] = 0.4471; + d.r[4] = 0.6196; d.r[5] = 0.8039; d.r[6] = 0.9451; d.r[7] = 0.9922; + d.r[8] = 0.9961; d.r[9] = 0.9882; + d.g[0] = 0.0000; d.g[1] = 0.0588; d.g[2] = 0.0588; d.g[3] = 0.1216; + d.g[4] = 0.1843; d.g[5] = 0.2510; d.g[6] = 0.3765; d.g[7] = 0.5882; + d.g[8] = 0.7922; d.g[9] = 0.9922; + d.b[0] = 0.0157; d.b[1] = 0.2392; d.b[2] = 0.4627; d.b[3] = 0.5059; + d.b[4] = 0.4980; d.b[5] = 0.4431; d.b[6] = 0.3647; d.b[7] = 0.4078; + d.b[8] = 0.5529; d.b[9] = 0.7490; + return d; + }(); + static const PaletteDef cividis = [] { + PaletteDef d; + d.nstops = 10; + d.stops[0] = 0.0000; + d.stops[1] = 0.1111; + d.stops[2] = 0.2222; + d.stops[3] = 0.3333; + d.stops[4] = 0.4444; + d.stops[5] = 0.5556; + d.stops[6] = 0.6667; + d.stops[7] = 0.7778; + d.stops[8] = 0.8889; + d.stops[9] = 1.0000; + d.r[0] = 0.0000; d.r[1] = 0.0706; d.r[2] = 0.2314; d.r[3] = 0.3412; + d.r[4] = 0.4392; d.r[5] = 0.5412; d.r[6] = 0.6471; d.r[7] = 0.7647; + d.r[8] = 0.8824; d.r[9] = 0.9961; + d.g[0] = 0.1333; d.g[1] = 0.2078; d.g[2] = 0.2863; d.g[3] = 0.3647; + d.g[4] = 0.4431; d.g[5] = 0.5255; d.g[6] = 0.6118; d.g[7] = 0.7020; + d.g[8] = 0.8000; d.g[9] = 0.9098; + d.b[0] = 0.3059; d.b[1] = 0.4392; d.b[2] = 0.4235; d.b[3] = 0.4275; + d.b[4] = 0.4510; d.b[5] = 0.4706; d.b[6] = 0.4549; d.b[7] = 0.4118; + d.b[8] = 0.3333; d.b[9] = 0.2196; + return d; + }(); + static const PaletteDef hot = [] { + PaletteDef d; + d.nstops = 4; + d.stops[0] = 0.0000; + d.stops[1] = 0.3650; + d.stops[2] = 0.7460; + d.stops[3] = 1.0000; + d.r[0] = 0.0000; d.r[1] = 1.0000; d.r[2] = 1.0000; d.r[3] = 1.0000; + d.g[0] = 0.0000; d.g[1] = 0.0000; d.g[2] = 1.0000; d.g[3] = 1.0000; + d.b[0] = 0.0000; d.b[1] = 0.0000; d.b[2] = 0.0000; d.b[3] = 1.0000; + return d; + }(); + static const PaletteDef gray = [] { + PaletteDef d; + d.nstops = 2; + d.stops[0] = 0.0000; + d.stops[1] = 1.0000; + d.r[0] = 0.0000; d.r[1] = 1.0000; + d.g[0] = 0.0000; d.g[1] = 1.0000; + d.b[0] = 0.0000; d.b[1] = 1.0000; + return d; + }(); + static const PaletteDef gray_r = [] { + PaletteDef d; + d.nstops = 2; + d.stops[0] = 0.0000; + d.stops[1] = 1.0000; + d.r[0] = 1.0000; d.r[1] = 0.0000; + d.g[0] = 1.0000; d.g[1] = 0.0000; + d.b[0] = 1.0000; d.b[1] = 0.0000; + return d; + }(); + static const PaletteDef coolwarm = [] { + PaletteDef d; + d.nstops = 3; + d.stops[0] = 0.0000; + d.stops[1] = 0.5000; + d.stops[2] = 1.0000; + d.r[0] = 0.2314; d.r[1] = 0.8667; d.r[2] = 0.7059; + d.g[0] = 0.2980; d.g[1] = 0.8667; d.g[2] = 0.0157; + d.b[0] = 0.7529; d.b[1] = 0.8667; d.b[2] = 0.1490; + return d; + }(); + static const PaletteDef bwr = [] { + PaletteDef d; + d.nstops = 3; + d.stops[0] = 0.0000; + d.stops[1] = 0.5000; + d.stops[2] = 1.0000; + d.r[0] = 0.0000; d.r[1] = 1.0000; d.r[2] = 1.0000; + d.g[0] = 0.0000; d.g[1] = 1.0000; d.g[2] = 0.0000; + d.b[0] = 1.0000; d.b[1] = 1.0000; d.b[2] = 0.0000; + return d; + }(); + static const PaletteDef seismic = [] { + PaletteDef d; + d.nstops = 5; + d.stops[0] = 0.0000; + d.stops[1] = 0.2500; + d.stops[2] = 0.5000; + d.stops[3] = 0.7500; + d.stops[4] = 1.0000; + d.r[0] = 0.0000; d.r[1] = 0.0000; d.r[2] = 1.0000; d.r[3] = 1.0000; + d.r[4] = 0.5020; + d.g[0] = 0.0000; d.g[1] = 0.0000; d.g[2] = 1.0000; d.g[3] = 0.0000; + d.g[4] = 0.0000; + d.b[0] = 0.3020; d.b[1] = 1.0000; d.b[2] = 1.0000; d.b[3] = 0.0000; + d.b[4] = 0.0000; + return d; + }(); + static const PaletteDef rdbu = [] { + PaletteDef d; + d.nstops = 9; + d.stops[0] = 0.0000; + d.stops[1] = 0.1250; + d.stops[2] = 0.2500; + d.stops[3] = 0.3750; + d.stops[4] = 0.5000; + d.stops[5] = 0.6250; + d.stops[6] = 0.7500; + d.stops[7] = 0.8750; + d.stops[8] = 1.0000; + d.r[0] = 0.6980; d.r[1] = 0.8392; d.r[2] = 0.9569; d.r[3] = 0.9922; + d.r[4] = 0.9686; d.r[5] = 0.8196; d.r[6] = 0.5725; d.r[7] = 0.2627; + d.r[8] = 0.1294; + d.g[0] = 0.0941; d.g[1] = 0.3765; d.g[2] = 0.6471; d.g[3] = 0.8588; + d.g[4] = 0.9686; d.g[5] = 0.8980; d.g[6] = 0.7725; d.g[7] = 0.5765; + d.g[8] = 0.4000; + d.b[0] = 0.1686; d.b[1] = 0.3020; d.b[2] = 0.5098; d.b[3] = 0.7804; + d.b[4] = 0.9686; d.b[5] = 0.9412; d.b[6] = 0.8706; d.b[7] = 0.7647; + d.b[8] = 0.6745; + return d; + }(); + static const PaletteDef ylgnbu = [] { + PaletteDef d; + d.nstops = 9; + d.stops[0] = 0.0000; + d.stops[1] = 0.1250; + d.stops[2] = 0.2500; + d.stops[3] = 0.3750; + d.stops[4] = 0.5000; + d.stops[5] = 0.6250; + d.stops[6] = 0.7500; + d.stops[7] = 0.8750; + d.stops[8] = 1.0000; + d.r[0] = 0.0314; d.r[1] = 0.1451; d.r[2] = 0.1333; d.r[3] = 0.1137; + d.r[4] = 0.2549; d.r[5] = 0.4980; d.r[6] = 0.7804; d.r[7] = 0.9294; + d.r[8] = 1.0000; + d.g[0] = 0.1137; d.g[1] = 0.2039; d.g[2] = 0.3686; d.g[3] = 0.5686; + d.g[4] = 0.7137; d.g[5] = 0.8039; d.g[6] = 0.9137; d.g[7] = 0.9725; + d.g[8] = 1.0000; + d.b[0] = 0.3451; d.b[1] = 0.5804; d.b[2] = 0.6588; d.b[3] = 0.7529; + d.b[4] = 0.7686; d.b[5] = 0.7333; d.b[6] = 0.7059; d.b[7] = 0.6941; + d.b[8] = 0.8510; + return d; + }(); + static const PaletteDef sunset = [] { + PaletteDef d; + d.nstops = 11; + d.stops[0] = 0.0000; + d.stops[1] = 0.1000; + d.stops[2] = 0.2000; + d.stops[3] = 0.3000; + d.stops[4] = 0.4000; + d.stops[5] = 0.5000; + d.stops[6] = 0.6000; + d.stops[7] = 0.7000; + d.stops[8] = 0.8000; + d.stops[9] = 0.9000; + d.stops[10] = 1.0000; + d.r[0] = 0.2118; d.r[1] = 0.2902; d.r[2] = 0.4314; d.r[3] = 0.5961; + d.r[4] = 0.7608; d.r[5] = 0.9176; d.r[6] = 0.9961; d.r[7] = 0.9922; + d.r[8] = 0.9647; d.r[9] = 0.8667; d.r[10] = 0.6471; + d.g[0] = 0.2941; d.g[1] = 0.4824; d.g[2] = 0.6510; d.g[3] = 0.7922; + d.g[4] = 0.8941; d.g[5] = 0.9255; d.g[6] = 0.8549; d.g[7] = 0.7020; + d.g[8] = 0.4941; d.g[9] = 0.2392; d.g[10] = 0.0000; + d.b[0] = 0.6039; d.b[1] = 0.7176; d.b[2] = 0.8039; d.b[3] = 0.8824; + d.b[4] = 0.9373; d.b[5] = 0.8000; d.b[6] = 0.5451; d.b[7] = 0.4000; + d.b[8] = 0.2941; d.b[9] = 0.1765; d.b[10] = 0.1490; + return d; + }(); + + // The gain image holds one of four numbers (the Jungfrau gain bits). These + // are deliberately desaturated so a large flat map does not glare. + static const PaletteDef gain4 = [] { + PaletteDef d; + d.nstops = 4; + d.stops[0] = 0.0000; d.stops[1] = 0.3333; d.stops[2] = 0.6667; + d.stops[3] = 1.0000; + d.r[0] = 0.3725; d.r[1] = 0.4353; d.r[2] = 0.7961; d.r[3] = 0.6902; + d.g[0] = 0.5020; d.g[1] = 0.6275; d.g[2] = 0.7412; d.g[3] = 0.4157; + d.b[0] = 0.6588; d.b[1] = 0.4353; d.b[2] = 0.4157; d.b[3] = 0.3882; + return d; + }(); + + switch (p) { + case Palette::BW1: + return bw1; + case Palette::BW2: + return bw2; + case Palette::Turbo: + return turbo; + case Palette::Viridis: + return viridis; + case Palette::Plasma: + return plasma; + case Palette::Inferno: + return inferno; + case Palette::Magma: + return magma; + case Palette::Cividis: + return cividis; + case Palette::Hot: + return hot; + case Palette::Gray: + return gray; + case Palette::Gray_r: + return gray_r; + case Palette::Coolwarm: + return coolwarm; + case Palette::Bwr: + return bwr; + case Palette::Seismic: + return seismic; + case Palette::RdBu: + return rdbu; + case Palette::YlGnBu: + return ylgnbu; + case Palette::Sunset: + return sunset; + case Palette::Gain4: + return gain4; + case Palette::Color: + default: + return color; + } +} + + +// 256-entry lookup table sampled from exactly the same definition +void buildLut(const PaletteDef &d, QRgb *out) { + for (int i = 0; i < 256; i++) { + const double v = i / 255.0; + double rr, gg, bb; + if (d.nstops <= 0) { + const double c = std::pow(v, d.gamma); + rr = gg = bb = c; + } else { + int k = 0; + while (k < d.nstops - 2 && v > d.stops[k + 1]) + k++; + const double span = d.stops[k + 1] - d.stops[k]; + const double t = (span > 0) ? (v - d.stops[k]) / span : 0.0; + const double tc = (t < 0) ? 0.0 : (t > 1 ? 1.0 : t); + rr = d.r[k] + (d.r[k + 1] - d.r[k]) * tc; + gg = d.g[k] + (d.g[k + 1] - d.g[k]) * tc; + bb = d.b[k] + (d.b[k + 1] - d.b[k]) * tc; + } + out[i] = qRgb(static_cast(rr * 255.0 + 0.5), + static_cast(gg * 255.0 + 0.5), + static_cast(bb * 255.0 + 0.5)); + } +} + +// one 256-entry table per palette, all built the same way from paletteDef() +constexpr int kNumPalettes = int(Palette::Gain4) + 1; +QRgb g_luts[kNumPalettes][256]; +struct LutInit { + LutInit() { + for (int i = 0; i < kNumPalettes; i++) + buildLut(paletteDef(static_cast(i)), g_luts[i]); + } +} g_lutInit; + +} // namespace + +// Labels for the scale panel's palette chooser (same order as the enum). +const char *paletteName(Palette p) { + switch (p) { + case Palette::Gain4: + return "gain 0..3 (fixed)"; + case Palette::Color: + return "Col (jet)"; + case Palette::BW1: + return "BW grey 1"; + case Palette::BW2: + return "BW grey 2"; + case Palette::Turbo: + return "Turbo"; + case Palette::Viridis: + return "Viridis"; + case Palette::Plasma: + return "Plasma"; + case Palette::Inferno: + return "Inferno"; + case Palette::Magma: + return "Magma"; + case Palette::Cividis: + return "Cividis (colorblind)"; + case Palette::Hot: + return "Hot"; + case Palette::Gray: + return "Grey (linear)"; + case Palette::Gray_r: + return "Grey reversed"; + case Palette::Coolwarm: + return "Coolwarm (diverging)"; + case Palette::Bwr: + return "BWR (diverging)"; + case Palette::Seismic: + return "Seismic (diverging)"; + case Palette::RdBu: + return "RdBu (diverging)"; + case Palette::YlGnBu: + return "YlGnBu (Brewer)"; + case Palette::Sunset: + return "Sunset (Tol)"; + } + return "?"; +} + +const QRgb *paletteLut(Palette p) { + const int i = int(p); + if (i < 0 || i >= kNumPalettes) + return g_luts[int(Palette::Color)]; + return g_luts[i]; +} + +// ROOT-thread only: rebuild the ROOT gradient colour table +void loadRootPalette(Palette p) { + const PaletteDef &d = paletteDef(p); + const Int_t NCont = 90; + Double_t stops[99], red[99], green[99], blue[99]; + Int_t n; + if (d.nstops <= 0) { + n = 99; + for (int i = 0; i < n; i++) { + const double s = static_cast(i) / (n - 1); + stops[i] = s; + const double c = std::pow(s, d.gamma); + red[i] = green[i] = blue[i] = c; + } + } else { + n = d.nstops; + for (int i = 0; i < n; i++) { + stops[i] = d.stops[i]; + red[i] = d.r[i]; + green[i] = d.g[i]; + blue[i] = d.b[i]; + } + } + TColor::CreateGradientColorTable(n, stops, red, green, blue, NCont); + gStyle->SetNumberContours(NCont); +} + +// The 8 chip spectra live in a 4x2 pad grid whose TOP row is the TOP half of +// the detector (chips 4..7 = data rows 256..511). Both spectrum canvases must +// use the same mapping so they can be compared pad by pad. +int chipPadToHist(int ipad) { return ipad % 4 + (1 - int(ipad / 4)) * 4; } + +// shares the x axis of every spectrum of one canvas with its first pad (the +// operator zooms one pad and all of them follow, as in the original display). +// Each canvas keeps its own state so the two cannot interact. +struct ChipXSync { + int first = -1, last = -1; + bool have = false; +}; +ChipXSync g_aduXSync, g_kevXSync; +void syncChipXRange(TH1I **h, ChipXSync &st) { + if (!h || !h[0]) + return; + if (!st.have || h[0]->GetXaxis()->GetLast() != st.last) { + st.first = h[0]->GetXaxis()->GetFirst(); + st.last = h[0]->GetXaxis()->GetLast(); + st.have = true; + for (int ipad = 1; ipad < 8; ipad++) { + if (h[ipad]) + h[ipad]->GetXaxis()->SetRange(st.first, st.last); + } + } +} + +// the ROI spectrum is read against the chip spectra, so it always mirrors the +// x range of the chip canvas (and only A4's: the two sync states must not +// interact) +void mirrorChipXRangeToRoi() { + if (!dispChip[0]) + return; + const int first = dispChip[0]->GetXaxis()->GetFirst(); + const int last = dispChip[0]->GetXaxis()->GetLast(); + // the keV canvases share the same window: their axes are the ADU axes + // divided by KEV_NOMINAL_ADU, so the bin indices are identical + TH1I *dst[10] = {dispRoi, dispRoiKev, dispChipKev[0], + dispChipKev[1], dispChipKev[2], dispChipKev[3], + dispChipKev[4], dispChipKev[5], dispChipKev[6], + dispChipKev[7]}; + for (TH1I *h : dst) { + if (!h) + continue; + if (h->GetXaxis()->GetFirst() != first || + h->GetXaxis()->GetLast() != last) + h->GetXaxis()->SetRange(first, last); + } +} + +// paints one 4x2 canvas of 8 chip spectra (canvas A4 in ADU, A8 in keV) +void plotChipCanvas(TH1I **h, TCanvas *c, ChipXSync &st) { + if (!h || !h[0] || !c) + return; + syncChipXRange(h, st); // all pads follow the first one + gStyle->SetOptStat(1); + for (int ipad = 0; ipad < 8; ipad++) { + c->cd(ipad + 1); + if (gPad && !gPad->GetLogy()) + gPad->SetLogy(); + // "L" draws one polyline through the bin contents. The default + // (markers + error bars) is ~2000 X11 operations per pad, which costs + // hundreds of ms per redraw and starves the event loop. + h[chipPadToHist(ipad)]->Draw("L"); + if (ipad == 3) + serviceRootEvents(); // keep the canvases interactive mid-redraw + } + c->cd(); + c->Update(); +} + +// paints the canvas holding the single ROI spectrum (A7 in ADU, A9 in keV). +// The window title carries the ROI rectangle it was filled with. +void plotRoiCanvas(TH1I *h, TCanvas *c, const char *what) { + if (!h || !c) + return; + static int lx0 = -1, ly0 = -1, lx1 = -1, ly1 = -1; + static bool lastOn = false, have = false, titled = false; + const bool on = ROIactive.load(); + const int x0 = ROIxmin.load(), y0 = ROIymin.load(); + const int x1 = ROIxmax.load(), y1 = ROIymax.load(); + if (!have || !titled || on != lastOn || x0 != lx0 || y0 != ly0 || + x1 != lx1 || y1 != ly1) { + have = true; + titled = true; + lastOn = on; + lx0 = x0; + ly0 = y0; + lx1 = x1; + ly1 = y1; + char t[160]; + if (on) + snprintf(t, sizeof(t), + "%s - gate ROI x %d..%d, y %d..%d (%dx%d px, data rows, " + "row 0 = bottom)", + what, x0, x1, y0, y1, x1 - x0, y1 - y0); + else + snprintf(t, sizeof(t), "%s - no gate ROI (use \"ROI only\")", + what); + c->SetTitle(t); // TCanvas::SetTitle also renames the window + } + gStyle->SetOptStat(1); + c->cd(); + if (gPad && !gPad->GetLogy()) + gPad->SetLogy(); + h->Draw(); // normal histogram rendering (markers + error bars) + c->cd(); + c->Update(); +} + +// the operator's PH window is shared by every spectrum canvas +void Plot1DHistos(void) { + mirrorChipXRangeToRoi(); + plotChipCanvas(dispChip, A4, g_aduXSync); +} + +// title of the shared canvases, so it is obvious which set is on screen +void setSpectrumTitles(bool kev) { + static int shown = -1; + if (shown == (kev ? 1 : 0)) + return; + shown = kev ? 1 : 0; + if (A4) + A4->SetTitle(kev ? "PH spectra [keV]" : "PH spectra [ADU]"); + if (A7) + A7->SetTitle(kev ? "ROI PH [keV]" : "ROI PH [ADU]"); +} + +// ONE spectrum of the gate-ROI pixels (canvas A7): same binning and same +// border trim as the chip spectra, but summed over the whole selection, so it +// answers "what do the pixels I selected look like?" and can be compared with +// the sum of the eight pads of A4. +void PlotRoiHistos(void) { + if (!dispRoi || !A7) + return; + plotRoiCanvas(dispRoi, A7, "ROI PH"); +} + +// the same two canvases in keV, filled and drawn only when a gain map is +// loaded (canvases A8/A9) +// the same canvas, filled from the keV histograms instead of the ADU ones +void Plot1DHistosKev(void) { + if (!kevSpectra.load() || !gain_flag.load()) + return; + // the ROI canvas mirrors the chips, exactly as in the ADU set + if (dispChipKev[0] && dispRoiKev) { + const int f = dispChipKev[0]->GetXaxis()->GetFirst(); + const int l = dispChipKev[0]->GetXaxis()->GetLast(); + if (dispRoiKev->GetXaxis()->GetFirst() != f || + dispRoiKev->GetXaxis()->GetLast() != l) + dispRoiKev->GetXaxis()->SetRange(f, l); + } + plotChipCanvas(dispChipKev, A4, g_kevXSync); +} + +void PlotRoiHistosKev(void) { + if (!kevSpectra.load() || !gain_flag.load()) + return; + plotRoiCanvas(dispRoiKev, A7, "ROI PH [keV]"); +} + +// ROOT maps an explicit axis range onto its pad frame, so a range whose shape +// differs from the frame is stretched: a narrow/tall ROI came out 5x wider than +// tall. Widen the shorter side of the range to the frame's shape - centred on +// the ROI and shifted (never resized) to stay on the sensor - so the region +// keeps the shape of the ADC window, the ROI box keeps its shape and the +// pixels stay square. The extra margin around the ROI is visible, so the box +// can be seen sitting inside the plot. +void zoomPhotonMap(double x0, double x1, double y0, double y1) { + if (!A5 || !disp3000) + return; + double dx = x1 - x0, dy = y1 - y0; + if (dx <= 0 || dy <= 0) + return; + double W = A5->GetWw(), H = A5->GetWh(); + if (W < 10 || H < 10) { // not mapped yet: use the booked size + W = 1000; + H = 600; + } + // frame area in pixels (the z palette lives in the right margin) + const double fw = + 1.0 - gStyle->GetPadLeftMargin() - gStyle->GetPadRightMargin(); + const double fh = + 1.0 - gStyle->GetPadBottomMargin() - gStyle->GetPadTopMargin(); + const double fx = W * fw, fy = H * fh; + if (fx / dx > fy / dy) + dx = dy * fx / fy; // x is magnified more: widen it + else + dy = dx * fy / fx; + // centre on the requested window, then shift it inside the sensors range + const double cx = 0.5 * (x0 + x1), cy = 0.5 * (y0 + y1); + const double ax0 = disp3000->GetXaxis()->GetXmin(); + const double ax1 = disp3000->GetXaxis()->GetXmax(); + const double ay0 = disp3000->GetYaxis()->GetXmin(); + const double ay1 = disp3000->GetYaxis()->GetXmax(); + double nx = cx - dx / 2.0, ny = cy - dy / 2.0; + if (nx < ax0) + nx = ax0; + if (nx + dx > ax1) + nx = ax1 - dx; + if (nx < ax0) + nx = ax0; // wider than the sensor: ROOT clamps the selection + if (ny < ay0) + ny = ay0; + if (ny + dy > ay1) + ny = ay1 - dy; + if (ny < ay0) + ny = ay0; + disp3000->GetXaxis()->SetRangeUser(nx, nx + dx); + disp3000->GetYaxis()->SetRangeUser(ny, ny + dy); +} + +// redraws the photon map (used by Plot2DHistos and by the zoom command) +void plotPhotonMap() { + if (!A5 || !disp3000) + return; + A5->cd(); + disp3000->Draw("colz"); + drawRoiBox(); + A5->Update(); +} + +void drawRoiBox() { + if (box) { + if (gPad && gPad->GetListOfPrimitives()) + gPad->GetListOfPrimitives()->Remove(box); + delete box; + box = nullptr; + } + if (!ROIactive.load()) + return; // no ROI: nothing to outline + const double x1 = ROIxmin.load(); + const double x2 = ROIxmax.load(); + const double y1 = ROIymin.load(); + const double y2 = ROIymax.load(); + if (x2 <= x1 || y2 <= y1) + return; + box = new TBox(x1, y1, x2, y2); + box->SetLineColor(kYellow); // same colour as the ADC overlay + box->SetFillStyle(0); + box->SetLineWidth(2); + box->Draw(); +} + +void Plot2DHistos(void) { + gStyle->SetOptStat(0); +#ifdef JFSTRX + if (p5 && disp1000) { + p5->cd(); + disp1000->Draw("colz"); + } + if (p3 && disp1001) { + p3->cd(); + disp1001->Draw("colz"); + } + if (p1 && disp1002) { + p1->cd(); + disp1002->Draw("colz"); + } + if (p2 && disp1060) { + p2->cd(); + disp1060->Draw("colz"); + } + if (p4 && disp1061) { + p4->cd(); + disp1061->Draw("colz"); + } + if (p6 && disp1062) { + p6->cd(); + disp1062->Draw("colz"); + } +#endif + if (A5 && disp3000) + plotPhotonMap(); + serviceRootEvents(); // the photon map is painted: service input + if (A6 && disp4500 && dispLvsR) { + A6->cd(); + if (!A6->GetListOfPrimitives() || + !A6->GetListOfPrimitives()->GetSize()) { + A6->Divide(1, 2); + } + A6->cd(1); + disp4500->Draw("colz"); + A6->cd(2); + dispLvsR->Draw("colz"); + A6->Update(); + } +} + +void axisreset() { // ROOT-thread only (executed via the command queue) + fixranges.store(false); +#ifdef JFSTRX + TH2F *jf[6] = {disp1000, disp1001, disp1002, disp1060, disp1061, disp1062}; + for (int k = 0; k < 6; k++) { + if (!jf[k]) + continue; + jf[k]->GetXaxis()->UnZoom(); + jf[k]->GetYaxis()->UnZoom(); + jf[k]->GetZaxis()->UnZoom(); + } +#endif + if (disp3000) { + disp3000->GetXaxis()->UnZoom(); + disp3000->GetYaxis()->UnZoom(); + disp3000->GetZaxis()->UnZoom(); + } + for (int i = 0; i < 8; i++) { + if (dispChip[i]) { + dispChip[i]->GetXaxis()->UnZoom(); + dispChip[i]->GetYaxis()->UnZoom(); + } + } + if (dispRoi) { + dispRoi->GetXaxis()->UnZoom(); + dispRoi->GetYaxis()->UnZoom(); + } + if (dispRoiKev) { + dispRoiKev->GetXaxis()->UnZoom(); + dispRoiKev->GetYaxis()->UnZoom(); + } + for (int i = 0; i < 8; i++) { + if (dispChipKev[i]) { + dispChipKev[i]->GetXaxis()->UnZoom(); + dispChipKev[i]->GetYaxis()->UnZoom(); + } + } + if (disp4500) { + disp4500->GetXaxis()->UnZoom(); + disp4500->GetYaxis()->UnZoom(); + disp4500->GetZaxis()->UnZoom(); + } + if (dispLvsR) { + dispLvsR->GetXaxis()->UnZoom(); + dispLvsR->GetYaxis()->UnZoom(); + dispLvsR->GetZaxis()->UnZoom(); + } + Plot2DHistos(); + Plot1DHistos(); +} diff --git a/slsDetectorCalibration/jungfrauExecutables/jf_online_display_gui/test/gate_contig_test.cpp b/slsDetectorCalibration/jungfrauExecutables/jf_online_display_gui/test/gate_contig_test.cpp new file mode 100644 index 000000000..34558948b --- /dev/null +++ b/slsDetectorCalibration/jungfrauExecutables/jf_online_display_gui/test/gate_contig_test.cpp @@ -0,0 +1,184 @@ +// Unit test for the gate's contiguity proxy ("Contiguous (N px within circle, +// r = N/2+1)"). +// +// The rule must be: pass when SOME circle of radius r contains at least N +// above-threshold pixels. It used to require every above-threshold pixel to be +// within r of the centroid, which rejected perfectly valid events (two +// separated clusters) - the bug this test pins down. +// +// Build: make gate_contig_test Run: ./test/gate_contig_test +#include "online_jf.h" + +#include +#include +#include +#include + +namespace { + +int gFail = 0; + +void expect(const char *what, bool got, bool want) { + const bool ok = (got == want); + if (!ok) + gFail++; + std::printf("%-58s %s (got %s, want %s)\n", what, ok ? "ok " : "FAIL", + got ? "pass" : "drop", want ? "pass" : "drop"); +} + +struct Frame { + std::vector px = std::vector(NCH, 0); + + void hit(int x, int y, short v = 2000) { + px[static_cast(y) * kRawWidth + x] = v; + } + void clear() { std::fill(px.begin(), px.end(), 0); } +}; + +// Runs the real GateEngine over the frame, raw ADC values, no pedestals. +bool passes(GateEngine &g, Frame &f) { + uint64_t above = 0; + bool scDropped = false; + return g.evaluate(f.px.data(), NCH, 0, nullptr, 0, 0, above, &scDropped); +} + +} // namespace + +int main() { + GateEngine g; + g.setEnabled(true); + g.setThreshold(1000.0f); // the frame's hits are 2000 -> above threshold + g.setMinPixels(5); + g.setContiguous(true); + + Frame f; + + // 1. one tight cluster of exactly N hits: must pass + f.clear(); + for (int i = 0; i < 5; i++) + f.hit(100 + i, 100); + expect("5 hits in a row (spread 4 px <= 2r)", passes(g, f), true); + + // 2. a compact blob: must pass + f.clear(); + f.hit(300, 200); + f.hit(301, 200); + f.hit(302, 200); + f.hit(301, 201); + f.hit(301, 199); + expect("5 hits in a compact cross", passes(g, f), true); + + // 3. N hits far apart, no cluster: must be rejected + f.clear(); + for (int i = 0; i < 5; i++) + f.hit(100 + 100 * i, 300); + expect("5 isolated hits 100 px apart", passes(g, f), false); + + // 4. fewer than N hits, however tight: must be rejected + f.clear(); + for (int i = 0; i < 4; i++) + f.hit(500 + i, 400); + expect("4 hits (below min pixels)", passes(g, f), false); + + // 5. THE REPORTED BUG: two separated clusters, each with N hits. + // The centroid falls between them, which used to reject the frame. + f.clear(); + for (int i = 0; i < 5; i++) + f.hit(100 + i, 50); // cluster A + for (int i = 0; i < 5; i++) + f.hit(700 + i, 450); // cluster B + expect("two clusters of 5, 700 px apart (must pass)", passes(g, f), true); + + // 6. two groups of 4: no circle holds 5 -> reject + f.clear(); + for (int i = 0; i < 4; i++) + f.hit(100 + i, 60); + for (int i = 0; i < 4; i++) + f.hit(600 + i, 440); + expect("two clusters of 4 (no circle holds 5)", passes(g, f), false); + + // 7. a spread-out event with one dense core: pass + f.clear(); + for (int i = 0; i < 5; i++) + f.hit(400 + i, 300); + f.hit(800, 100); + f.hit(900, 200); + expect("dense core plus 2 stragglers", passes(g, f), true); + + // 8. N follows min_pixels: 3 hits pass when min_pixels is 3 + g.setMinPixels(3); + f.clear(); + for (int i = 0; i < 3; i++) + f.hit(200 + i, 200); + expect("3 hits with min_pixels = 3", passes(g, f), true); + f.clear(); + for (int i = 0; i < 2; i++) + f.hit(200 + i, 200); + expect("2 hits with min_pixels = 3", passes(g, f), false); + + // 9. contiguity off: the plain count decides (2 hits < 3 -> reject) + g.setContiguous(false); + f.clear(); + f.hit(10, 10); + f.hit(900, 400); + expect("contiguity off, 2 hits with min_pixels = 3", passes(g, f), false); + f.clear(); + for (int i = 0; i < 3; i++) + f.hit(10 + i, 10); + expect("contiguity off, 3 hits with min_pixels = 3", passes(g, f), true); + + // ---- hot pixel mask taken from a photon map --------------------------- + { + GateEngine h; + h.setEnabled(true); + h.setThreshold(1000.0f); + h.setMinPixels(5); + h.setContiguous(false); + h.setHotSuppress(true); + + // The map has two very bright pixels: those are the hot ones. + std::vector map(NCH, 0.0f); + map[10 * kRawWidth + 10] = 400.0f; + map[10 * kRawWidth + 11] = 900.0f; + hotSetMaskFromMap(map.data(), map.size(), 100.0); + std::printf("mask from map > 100: %llu px (want 2)\n", + static_cast(hotPixelCount())); + if (hotPixelCount() != 2) + gFail++; + + Frame f3; + // 5 hits, two of them on the masked pixels -> only 3 count -> drop + f3.clear(); + for (int i = 0; i < 5; i++) + f3.hit(10 + i, 10); + expect("5 hits, 2 on hot pixels (min 5)", passes(h, f3), false); + + // a real cluster away from the mask still passes + f3.clear(); + for (int i = 0; i < 5; i++) + f3.hit(300 + i, 300); + expect("real cluster of 5 with the mask active", passes(h, f3), true); + + // cleared mask: the hot pixels count again + hotClearMask(); + expect("after hotClearMask, 5 hits count", passes(h, f3), true); + f3.clear(); + for (int i = 0; i < 5; i++) + f3.hit(10 + i, 10); + expect("after hotClearMask, the 5 hits pass", passes(h, f3), true); + + // suppression off: the mask is ignored by the gate + hotSetMaskFromMap(map.data(), map.size(), 100.0); + h.setHotSuppress(false); + f3.clear(); + for (int i = 0; i < 5; i++) + f3.hit(10 + i, 10); + expect("suppression off, masked pixels count again", passes(h, f3), + true); + hotClearMask(); + } + + std::printf("\n%s (%d failure(s))\n", gFail ? "FAILED" : "all tests passed", + gFail); + return gFail ? 1 : 0; +} diff --git a/slsDetectorCalibration/jungfrauExecutables/jf_online_display_gui/test/jf_feeder.cpp b/slsDetectorCalibration/jungfrauExecutables/jf_online_display_gui/test/jf_feeder.cpp new file mode 100644 index 000000000..e430209cd --- /dev/null +++ b/slsDetectorCalibration/jungfrauExecutables/jf_online_display_gui/test/jf_feeder.cpp @@ -0,0 +1,233 @@ +// SPDX-License-Identifier: LGPL-3.0-or-other +// =========================================================================== +// test/jf_feeder.cpp -- synthetic slsReceiver stand-in. +// +// Publishes the same ZMQ message pair that +// slsReceiver sends, so jf_online_display_gui can be exercised without hardware. +// +// Every 3rd frame carries NO signal; the other frames carry a 40-pixel +// cluster at ADC 300 on a baseline of 100. With +// ./jf_online_display_gui 400 127.0.0.1 30777 --stats --pede /nonexistent +// the gate threshold is 200, so exactly 2/3 of the frames must pass. +// +// make feeder +// ./test/jf_feeder tcp://*:30777 200 20 & +// ./jf_online_display_gui 400 127.0.0.1 30777 --stats --pede /nonexistent +// +// Subscriber mode (counts the frames republished by --pub): +// ./test/jf_feeder sub tcp://127.0.0.1:30778 8 +// +// 4th positional arg = initial silent period in seconds (idle-receiver test). +// =========================================================================== +#include + +#include +#include +#include +#include +#include +#include +#include + +namespace { + +int runSubscriber(const char *addr, int seconds) { + void *ctx = zmq_ctx_new(); + void *sub = zmq_socket(ctx, ZMQ_SUB); + int rcvtimeo = 200; + zmq_setsockopt(sub, ZMQ_RCVTIMEO, &rcvtimeo, sizeof(rcvtimeo)); + zmq_setsockopt(sub, ZMQ_SUBSCRIBE, "", 0); + if (zmq_connect(sub, addr) != 0) { + fprintf(stderr, "connect %s failed: %s\n", addr, + zmq_strerror(zmq_errno())); + return 1; + } + printf("subscriber: connected to %s for %d s\n", addr, seconds); + fflush(stdout); + + std::vector data(2 * 1024 * 1024); + char hdr[16384]; + int frames = 0, endMarkers = 0; + int dumped = 0; + const auto deadline = + std::chrono::steady_clock::now() + std::chrono::seconds(seconds); + while (std::chrono::steady_clock::now() < deadline) { + const int hn = zmq_recv(sub, hdr, sizeof(hdr) - 1, 0); + if (hn < 0) + continue; + hdr[hn] = '\0'; + const bool isData = (strstr(hdr, "\"data\":1") != nullptr); + if (isData) + frames++; + else if (strstr(hdr, "\"data\":0") != nullptr) + endMarkers++; + int more = 0; + size_t moreSize = sizeof(more); + zmq_getsockopt(sub, ZMQ_RCVMORE, &more, &moreSize); + int dn = -1; + if (more) + dn = zmq_recv(sub, data.data(), data.size(), 0); + if (dumped < 3) { + dumped++; + char head[400]; + snprintf(head, sizeof(head), "%.399s", hdr); + printf("subscriber: hdr_len=%d data_len=%d more=%d head=%s\n", hn, + dn, more, head); + fflush(stdout); + } + } + printf("subscriber: received %d data frames, %d end markers\n", frames, + endMarkers); + fflush(stdout); + zmq_close(sub); + zmq_ctx_term(ctx); + return frames > 0 ? 0 : 1; +} + +// Dual-interface stand-in: two PUB sockets on base and base+1, each sending +// one 1024x256 Y-slab of the same frame (the slsReceiver multi-UDP-interface +// layout). The bottom slab is filled with botVal, the top slab with topVal, +// so the assembled image can be verified from the gate counters. +// ./test/jf_feeder dual [delaySec] [botVal] +// [topVal] [topLagFrames] +int runDual(const char *baseStr, int nframes, int fps, int delayMs, int botVal, + int topVal, int topLag) { + const int base = atoi(baseStr); + const int W = 1024, H = 256; + const int bytes = W * H * 2; + + void *ctx = zmq_ctx_new(); + void *bot = zmq_socket(ctx, ZMQ_PUB); + void *top = zmq_socket(ctx, ZMQ_PUB); + int hwm = 1000; + zmq_setsockopt(bot, ZMQ_SNDHWM, &hwm, sizeof(hwm)); + zmq_setsockopt(top, ZMQ_SNDHWM, &hwm, sizeof(hwm)); + const std::string a0 = "tcp://*:" + std::to_string(base); + const std::string a1 = "tcp://*:" + std::to_string(base + 1); + if (zmq_bind(bot, a0.c_str()) != 0 || zmq_bind(top, a1.c_str()) != 0) { + fprintf(stderr, "dual bind failed: %s\n", zmq_strerror(zmq_errno())); + return 1; + } + printf("feeder: dual mode on %s and %s, %d frames at %d fps " + "(bot=%d top=%d topLag=%d)\n", + a0.c_str(), a1.c_str(), nframes, fps, botVal, topVal, topLag); + fflush(stdout); + + std::vector slab(W * H); + std::this_thread::sleep_for(std::chrono::milliseconds(delayMs)); + + auto sendSlab = [&](void *sock, int value, int frameNo) { + for (size_t i = 0; i < slab.size(); i++) + slab[i] = static_cast(value); + char hdr[512]; + // detSpec3 bits 8-11 carry the storage cell; cycle 0..15 so the SC + // filter can be exercised end to end + const unsigned detSpec3 = ((unsigned)(frameNo % 16) & 0xF) << 8; + const int hn = snprintf( + hdr, sizeof(hdr), + "{\"jsonversion\":5,\"data\":1,\"size\":%d," + "\"shape\":[%d,%d],\"frameNumber\":%d,\"frameIndex\":%d," + "\"detSpec1\":0,\"detSpec3\":%u}", + bytes, W, H, frameNo, frameNo, detSpec3); + zmq_send(sock, hdr, hn, ZMQ_SNDMORE); + zmq_send(sock, slab.data(), bytes, 0); + }; + + for (int f = 0; f < nframes; f++) { + sendSlab(bot, botVal, f); + const int topFrame = (f - topLag >= 0) ? f - topLag : f; + sendSlab(top, topVal, topFrame); + std::this_thread::sleep_for( + std::chrono::milliseconds(1000 / (fps > 0 ? fps : 1))); + } + const char *endhdr = "{\"jsonversion\":5,\"data\":0}"; + zmq_send(bot, endhdr, strlen(endhdr), 0); + zmq_send(top, endhdr, strlen(endhdr), 0); + printf("feeder: dual done\n"); + fflush(stdout); + zmq_close(bot); + zmq_close(top); + zmq_ctx_term(ctx); + return 0; +} + +} // namespace + +int main(int argc, char **argv) { + if (argc > 1 && std::string(argv[1]) == "sub") { + const char *addr = (argc > 2) ? argv[2] : "tcp://127.0.0.1:30778"; + const int seconds = (argc > 3) ? atoi(argv[3]) : 8; + return runSubscriber(addr, seconds); + } + if (argc > 1 && std::string(argv[1]) == "dual") { + return runDual(argc > 2 ? argv[2] : "30777", argc > 3 ? atoi(argv[3]) : 60, + argc > 4 ? atoi(argv[4]) : 25, + argc > 5 ? atoi(argv[5]) * 1000 : 800, + argc > 6 ? atoi(argv[6]) : 100, + argc > 7 ? atoi(argv[7]) : 150, + argc > 8 ? atoi(argv[8]) : 0); + } + + const char *addr = (argc > 1) ? argv[1] : "tcp://*:30777"; + const int nframes = (argc > 2) ? atoi(argv[2]) : 200; + const int fps = (argc > 3) ? atoi(argv[3]) : 20; + // optional 4th arg: stay bound and connected but SILENT for N seconds + // first (checks that an idle-but-alive receiver is not called "stopped") + const int delayMs = (argc > 4) ? atoi(argv[4]) * 1000 : 800; + const int NCH = 524288; + + void *ctx = zmq_ctx_new(); + void *pub = zmq_socket(ctx, ZMQ_PUB); + int hwm = 1000; + zmq_setsockopt(pub, ZMQ_SNDHWM, &hwm, sizeof(hwm)); + if (zmq_bind(pub, addr) != 0) { + fprintf(stderr, "bind %s failed: %s\n", addr, + zmq_strerror(zmq_errno())); + return 1; + } + printf("feeder: bound %s, sending %d frames at %d fps\n", addr, nframes, + fps); + fflush(stdout); + + std::vector frame(NCH); + std::this_thread::sleep_for(std::chrono::milliseconds(delayMs)); + + // detSpec1 packs the receiver ROI as 4 x uint16: xmin|xmax|ymin|ymax + const unsigned long long detSpec1 = ((unsigned long long)10u << 48) | + ((unsigned long long)400u << 32) | + ((unsigned long long)20u << 16) | 300u; + + for (int f = 0; f < nframes; f++) { + const bool signal = (f % 3) != 0; + for (int i = 0; i < NCH; i++) + frame[i] = 100; // baseline, gain 0 + if (signal) + for (int k = 0; k < 40; k++) + frame[1000 + k] = 300; // 40 px above the 200 threshold + + char hdr[512]; + const int hn = snprintf( + hdr, sizeof(hdr), + "{\"jsonversion\":5,\"data\":1,\"size\":%d,\"detSpec1\":%llu," + "\"frameIndex\":%d,\"bitmode\":1,\"fileIndex\":0," + "\"detshape\":[1,1],\"shape\":[1024,512],\"acqIndex\":%d," + "\"frameNumber\":%d,\"expLength\":0,\"packetNumber\":0," + "\"timestamp\":0,\"modId\":0,\"row\":0,\"column\":0,\"detSpec2\":0," + "\"detSpec3\":%u,\"detSpec4\":0,\"detType\":0,\"version\":0," + "\"flipRows\":0,\"quad\":0,\"completeImage\":1}", + NCH * 2, detSpec1, f, f, f, + ((unsigned)(f % 16) & 0xF) << 8); + zmq_send(pub, hdr, hn, ZMQ_SNDMORE); + zmq_send(pub, frame.data(), NCH * 2, 0); + std::this_thread::sleep_for( + std::chrono::milliseconds(1000 / (fps > 0 ? fps : 1))); + } + + const char *endhdr = "{\"jsonversion\":5,\"data\":0}"; + zmq_send(pub, endhdr, strlen(endhdr), 0); + printf("feeder: done\n"); + fflush(stdout); + zmq_close(pub); + zmq_ctx_term(ctx); + return 0; +} diff --git a/slsDetectorCalibration/jungfrauExecutables/jf_online_display_gui/test/panel_map_test.cpp b/slsDetectorCalibration/jungfrauExecutables/jf_online_display_gui/test/panel_map_test.cpp new file mode 100644 index 000000000..ec35fc488 --- /dev/null +++ b/slsDetectorCalibration/jungfrauExecutables/jf_online_display_gui/test/panel_map_test.cpp @@ -0,0 +1,65 @@ +// Standalone JFSTRX check that the six-panel fill geometry is consistent with +// the strixel decoder: every real (non-dummy) mapped pixel must land inside a +// valid panel at an in-range local coordinate, and each panel must be fully +// covered by the decoder map (so no panel stays empty / has holes). +#include "online_jf.h" + +#include "jungfrauLGADStrixelsData_new.h" +#include "sls/sls_detector_defs.h" +#include "slsDetectorData.h" + +#include + +using header = sls::defs::sls_receiver_header; + +int main() { + initGeometry(); + jungfrauLGADStrixelsData *dec = new jungfrauLGADStrixelsData(); + const int g1_nrows = 165, g2_nrows = 320, g3_nrows = 476; + const int mc6g3_start = g1_nrows + g2_nrows + g3_nrows; + static const int panelStartY[kNumAdcPanels] = {0, 165, 485, + 1757, 1437, 961}; + long perPanel[kNumAdcPanels] = {0}; + long real = 0; + long dropped = 0; // real pixels outside the booked panel rectangles + bool ok = true; + for (int ipx = 0; ipx < nx; ++ipx) { + for (int ipy = 0; ipy < ny; ++ipy) { + if (dec->dataMap[ipy][ipx] == int(sizeof(header))) + continue; // dummy strixel + ++real; + const int group = dec->groupmap[ipy][ipx]; + if (group < 0 || group > 2) { + ok = false; + continue; + } + const int base = (ipy >= mc6g3_start) ? 3 : 0; + const int p = base + group; + const int lx = ipx; + const int ly = ipy - panelStartY[p]; + if (lx < 0 || lx >= kAdcPanelW[p] || ly < 0 || ly >= kAdcPanelH[p]) { + // the decoder maps a couple of extra right-edge columns for + // chip1 g2/g3 that the ROOT histograms (and these panels) do + // not book; dropping them matches the original display + ++dropped; + continue; + } + ++perPanel[p]; + } + } + delete dec; + + std::printf("mapped %d x %d, real pixels %ld, dropped edge pixels %ld\n", + nx, ny, real, dropped); + for (int p = 0; p < kNumAdcPanels; ++p) { + const long need = long(kAdcPanelW[p]) * kAdcPanelH[p]; + std::printf("panel %d: %dx%d filled %ld/%ld%s\n", p, kAdcPanelW[p], + kAdcPanelH[p], perPanel[p], need, + perPanel[p] == need ? "" : " <-- NOT FULL"); + if (perPanel[p] != need) + ok = false; + } + std::printf("%s\n", ok ? "PASS: six-panel geometry" + : "FAIL: six-panel geometry"); + return ok ? 0 : 1; +} diff --git a/slsDetectorCalibration/jungfrauExecutables/jf_online_display_gui/test/pede_live_test.cpp b/slsDetectorCalibration/jungfrauExecutables/jf_online_display_gui/test/pede_live_test.cpp new file mode 100644 index 000000000..1ce04cf0f --- /dev/null +++ b/slsDetectorCalibration/jungfrauExecutables/jf_online_display_gui/test/pede_live_test.cpp @@ -0,0 +1,171 @@ +// Standalone check for the ROI writer (no hardware, no GUI): +// +// 1. a Pedestal corrected save follows the LIVE pedestal, not the snapshot +// taken at Start Save (one frame before, one after a mid-run swap); +// 2. the periodic checkpoint leaves a CLEAN pair on disk while the save is +// still running: the JSON sidecar is published atomically (.part -> +// rename) and the HDF5 is shrunk to exactly the frames written, so a +// copy taken at a checkpoint boundary is self-consistent. +// +// Not part of the build; compile by hand, see README "Testing without +// hardware". +#include "online_jf.h" + +#include "H5Cpp.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +using namespace H5; + +static bool fileExists(const std::string &p) { + std::ifstream f(p); + return f.good(); +} + +static std::string readFile(const std::string &p) { + std::ifstream f(p, std::ios::binary); + std::ostringstream ss; + ss << f.rdbuf(); + return ss.str(); +} + +// Read the /data frame count and the first pixel of one slice from the LIVE +// file with the SWMR read flag - exactly what an external checker does while +// the save runs. +static bool readSlice(const std::string &path, hsize_t slice, hsize_t &frames, + float &px) { + hid_t f = H5Fopen(path.c_str(), H5F_ACC_RDONLY | H5F_ACC_SWMR_READ, + H5P_DEFAULT); + if (f < 0) + return false; + hid_t d = H5Dopen2(f, "/data", H5P_DEFAULT); + if (d < 0) { + H5Fclose(f); + return false; + } + hid_t s = H5Dget_space(d); + hsize_t dims[3] = {0, 0, 0}; + H5Sget_simple_extent_dims(s, dims, nullptr); + frames = dims[0]; + bool ok = false; + if (dims[0] > slice) { + hsize_t off[3] = {slice, 0, 0}; + hsize_t cnt[3] = {1, 1, 1}; + H5Sselect_hyperslab(s, H5S_SELECT_SET, off, nullptr, cnt, nullptr); + hid_t m = H5Screate_simple(3, cnt, nullptr); + ok = H5Dread(d, H5T_NATIVE_FLOAT, m, s, H5P_DEFAULT, &px) >= 0; + H5Sclose(m); + } + H5Sclose(s); + H5Dclose(d); + H5Fclose(f); + return ok; +} + +// wait until the periodic JSON says at least `saved` frames are committed +static std::string waitJson(const std::string &jsonPath, uint64_t saved) { + const std::string needle = "\"saved\": " + std::to_string(saved); + for (int i = 0; i < 100; i++) { + if (fileExists(jsonPath)) { + const std::string t = readFile(jsonPath); + if (t.find(needle) != std::string::npos) + return t; + } + std::this_thread::sleep_for(std::chrono::milliseconds(50)); + } + return {}; +} + +int main() { + const int W = 1024, H = 4; + const hsize_t h = 4, w = 8; + + RoiSaver saver; + RoiSaver::StartInfo info; + info.x = 0; + info.y = 0; + info.w = static_cast(w); + info.h = static_cast(h); + info.dir = "."; + info.baseName = "pede_live_test"; + info.corrected = true; + info.checkpointMs = 300; // fast checkpoints for the test + + auto setA = std::make_shared(); + std::fill(setA->g0.begin(), setA->g0.end(), 100.0f); + PedestalStore::instance().install(setA); + info.peds = setA; // the snapshot the GUI would have taken at Start Save + + std::string err; + if (!saver.start(info, err)) { + std::printf("FAIL start: %s\n", err.c_str()); + return 1; + } + const std::string h5 = saver.status().h5Path; + const std::string js = saver.status().jsonPath; + + std::vector frame(static_cast(W) * H, 1000); + SavedFrameHeader h1; + h1.frameNumber = 1; + saver.offer(frame.data(), W, H, h1); + + // --- checkpoint 1: exactly one frame, corrected with pedestal A ------- + const std::string j1 = waitJson(js, 1); + if (j1.empty()) { + std::printf("FAIL: no periodic JSON with 1 frame\n"); + return 2; + } + const bool liveMid = j1.find("\"complete\": false") != std::string::npos; + hsize_t n1 = 0; + float p1 = -1.0f; + const bool live1 = readSlice(h5, 0, n1, p1); // live file, SWMR read + std::printf("checkpoint1: periodic json (complete:false)=%s live swmr " + "read=%s h5 extent=%llu px=%.1f (expect true, true, 1, 900)\n", + liveMid ? "true" : "false", live1 ? "true" : "false", + (unsigned long long)n1, p1); + + // --- the tracker swaps the pedestal mid-run --------------------------- + auto setB = std::make_shared(); + std::fill(setB->g0.begin(), setB->g0.end(), 150.0f); + PedestalStore::instance().install(setB); + SavedFrameHeader h2; + h2.frameNumber = 2; + saver.offer(frame.data(), W, H, h2); + + const std::string j2 = waitJson(js, 2); + if (j2.empty()) { + std::printf("FAIL: no periodic JSON with 2 frames\n"); + return 3; + } + hsize_t n2 = 0; + float p2 = -1.0f; + const bool live2 = readSlice(h5, 1, n2, p2); // live file, SWMR read + std::printf("checkpoint2: live swmr read=%s h5 extent=%llu slice1 px=%.1f " + "(expect true, 2, 850)\n", + live2 ? "true" : "false", (unsigned long long)n2, p2); + + const bool noPart = !fileExists(js + ".part"); + + saver.requestStop("test"); + saver.finish(); + const std::string jf = readFile(js); + const bool finalComplete = + jf.find("\"complete\": true") != std::string::npos; + + const bool ok = liveMid && live1 && (n1 == 1) && (p1 == 900.0f) && live2 && + (n2 == 2) && (p2 == 850.0f) && noPart && finalComplete; + std::printf("final: complete=%s no .part left=%s\n", + finalComplete ? "true" : "false", noPart ? "true" : "false"); + std::printf("%s\n", + ok ? "PASS: live pedestal + periodic clean checkpoint" + : "FAIL"); + return ok ? 0 : 4; +} diff --git a/slsDetectorCalibration/jungfrauExecutables/jf_online_display_gui/test/xclick.c b/slsDetectorCalibration/jungfrauExecutables/jf_online_display_gui/test/xclick.c new file mode 100644 index 000000000..62c4053f3 --- /dev/null +++ b/slsDetectorCalibration/jungfrauExecutables/jf_online_display_gui/test/xclick.c @@ -0,0 +1,69 @@ +// Minimal XTest driver: xclick click | key +#include +#include +#include +#include +#include +extern int XTestFakeMotionEvent(Display *, int, int, int, unsigned long); +extern int XTestFakeButtonEvent(Display *, unsigned int, int, unsigned long); +extern int XTestFakeKeyEvent(Display *, unsigned int, int, unsigned long); +int main(int argc, char **argv) { + Display *d = XOpenDisplay(argc > 1 ? argv[1] : NULL); + if (!d) { fprintf(stderr, "no display\n"); return 1; } + if (argc > 3 && strcmp(argv[2], "click") == 0) { + int x = atoi(argv[3]), y = atoi(argv[4]); + XTestFakeMotionEvent(d, -1, x, y, 0); + XTestFakeButtonEvent(d, 1, True, 0); + XTestFakeButtonEvent(d, 1, False, 0); + } else if (argc > 3 && strcmp(argv[2], "press") == 0) { + XTestFakeMotionEvent(d, -1, atoi(argv[3]), atoi(argv[4]), 0); + XTestFakeButtonEvent(d, 1, True, 0); + } else if (argc > 3 && strcmp(argv[2], "move") == 0) { + XTestFakeMotionEvent(d, -1, atoi(argv[3]), atoi(argv[4]), 0); + } else if (argc > 2 && strcmp(argv[2], "release") == 0) { + XTestFakeButtonEvent(d, 1, False, 0); + } else if (argc > 2 && strcmp(argv[2], "raise") == 0) { + const char *want = argc > 3 ? argv[3] : ""; + Window root = DefaultRootWindow(d), r2, par, *kids = NULL; + unsigned n = 0; + if (XQueryTree(d, root, &r2, &par, &kids, &n)) { + for (unsigned i = 0; i < n; i++) { + char *nm = NULL; + if (XFetchName(d, kids[i], &nm) && nm) { + if (strstr(nm, want)) { + XRaiseWindow(d, kids[i]); + XSetInputFocus(d, kids[i], RevertToParent, CurrentTime); + printf("raised: %s\n", nm); + } + XFree(nm); + } + } + if (kids) XFree(kids); + } + } else if (argc > 4 && strcmp(argv[2], "movewin") == 0) { + const char *want = argv[3]; + Window root = DefaultRootWindow(d), r2, par, *kids = NULL; + unsigned n = 0; + if (XQueryTree(d, root, &r2, &par, &kids, &n)) { + for (unsigned i = 0; i < n; i++) { + char *nm = NULL; + if (XFetchName(d, kids[i], &nm) && nm) { + if (strstr(nm, want)) { + XMoveWindow(d, kids[i], atoi(argv[4]), atoi(argv[5])); + printf("moved: %s\n", nm); + } + XFree(nm); + } + } + if (kids) XFree(kids); + } + } else if (argc > 2 && strcmp(argv[2], "key") == 0) { + KeySym ks = XStringToKeysym(argc > 3 ? argv[3] : "Return"); + KeyCode kc = XKeysymToKeycode(d, ks); + XTestFakeKeyEvent(d, kc, True, 0); + XTestFakeKeyEvent(d, kc, False, 0); + } + XFlush(d); + XCloseDisplay(d); + return 0; +} From 63138c9f04e98b194d3d70caaf673dc71869e097 Mon Sep 17 00:00:00 2001 From: Martin Mueller <72937414+mmarti04@users.noreply.github.com> Date: Tue, 3 Nov 2026 10:09:37 +0100 Subject: [PATCH 07/10] remove search bar from documentation landing page, a version has to be selected first. (#1652) Co-authored-by: Martin Mueller Co-authored-by: AliceMazzoleni99 --- docs/main_index/index.html | 9 --------- docs/main_index/index.html.j2 | 9 --------- 2 files changed, 18 deletions(-) diff --git a/docs/main_index/index.html b/docs/main_index/index.html index 65ad490b7..f5a9b88d7 100644 --- a/docs/main_index/index.html +++ b/docs/main_index/index.html @@ -16,8 +16,6 @@ - - @@ -32,13 +30,6 @@ slsDetectorPackage -
      -
      - - - -
      -

9yD+m@PL5_067|} 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 NDAC) + if (index >= NDAC) return FAIL; *retval = defaultDacValues[index]; return OK; @@ -900,7 +900,7 @@ int setDefaultDac(enum DACINDEX index, enum detectorSettings sett, int value) { if (sett != UNDEFINED) { return FAIL; } - if (index < 0 || index >= NDAC) + if (index >= NDAC) return FAIL; char *dac_names[] = {DAC_NAMES}; @@ -1428,7 +1428,7 @@ int setThresholdEnergy(int ev) { /* parameters - dac, adc, hv */ int validateDACIndex(enum DACINDEX ind, char *mess) { // including E_VTHRESHOLD - if (ind < 0 || ind >= NDAC + 1) { + if (ind >= NDAC + 1) { sprintf(mess, "Could not set DAC. Invalid index %d\n", ind); LOG(logERROR, (mess)); return FAIL; diff --git a/slsDetectorServers/gotthard2DetectorServer/Makefile b/slsDetectorServers/gotthard2DetectorServer/Makefile index 47659ccbe..a5fdbae8b 100755 --- a/slsDetectorServers/gotthard2DetectorServer/Makefile +++ b/slsDetectorServers/gotthard2DetectorServer/Makefile @@ -9,7 +9,7 @@ script_dir = ../../etc/ CROSS = nios2-buildroot-linux-gnu- CC = $(CROSS)gcc -CFLAGS += -Wall -std=gnu99 -DGOTTHARD2D -DSTOP_SERVER -I$(main_inc) -I$(support_lib) -I$(current_dir) #-DDEBUG1 #-DVERBOSEI #-DVERBOSE +CFLAGS += -O2 -Wall -Wextra -Wno-unused-parameter -Wformat=2 -Wredundant-decls -Werror=return-type -std=gnu99 -DGOTTHARD2D -DSTOP_SERVER -I$(main_inc) -I$(support_lib) -I$(current_dir) #-DDEBUG1 #-DVERBOSEI #-DVERBOSE LDLIBS += -lm -lrt -pthread PROGS = gotthard2DetectorServer DESTDIR ?= bin diff --git a/slsDetectorServers/gotthard2DetectorServer/bin/gotthard2DetectorServer_developer b/slsDetectorServers/gotthard2DetectorServer/bin/gotthard2DetectorServer_developer index 2ce7ab6da4d2e0c41e229ebdd02b4a3c054d435b..848800f00c0691617f0b2cd735ce52976e78bad6 100755 GIT binary patch literal 240244 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