1318 lines
48 KiB
C++
Executable File

#pragma once
/************************************************
* @file sls_detector_defs.h
* @short contains all the constants, enum definitions and enum-string
*conversions
***********************************************/
/**
*@short contains all the constants, enum definitions and enum-string
*conversions
*/
#ifdef __CINT__
#define MYROOT
#define __cplusplus
#endif
#include <stdint.h>
#ifdef __cplusplus
#include "sls_detector_exceptions.h"
#include <algorithm>
#include <bitset>
#include <string>
#endif
#include "ansi.h"
#define BIT32_MASK 0xFFFFFFFF
#define MAX_RX_DBIT 64
/** default ports */
#define DEFAULT_PORTNO 1952
#define DEFAULT_UDP_PORTNO 50001
#define DEFAULT_GUI_PORTNO 65001
#define DEFAULT_ZMQ_CL_PORTNO 30001
#define DEFAULT_ZMQ_RX_PORTNO 30001
#define SLS_DETECTOR_HEADER_VERSION 0x2
#define SLS_DETECTOR_JSON_HEADER_VERSION 0x3
// ctb/ moench 1g udp (read from fifo)
#define UDP_PACKET_DATA_BYTES (1344)
/** maximum rois */
#define MAX_ROIS 100
/** maximum trim en */
#define MAX_TRIMEN 100
/** maximum unit size of program sent to detector */
#define MAX_FPGAPROGRAMSIZE (2 * 1024 * 1024)
/** get flag form most functions */
#define GET_FLAG -1
#define DEFAULT_DET_MAC "00:aa:bb:cc:dd:ee"
#define DEFAULT_DET_IP "129.129.202.45"
#define DEFAULT_DET_MAC2 "00:aa:bb:cc:dd:ff"
#define DEFAULT_DET_IP2 "129.129.202.46"
/** default maximum string length */
#define MAX_STR_LENGTH 1000
#define MAX_FRAMES_PER_FILE 20000
#define SHORT_MAX_FRAMES_PER_FILE 100000
#define MOENCH_MAX_FRAMES_PER_FILE 100000
#define EIGER_MAX_FRAMES_PER_FILE 10000
#define JFRAU_MAX_FRAMES_PER_FILE 10000
#define CTB_MAX_FRAMES_PER_FILE 20000
#define DEFAULT_STREAMING_TIMER_IN_MS 200
// typedef char mystring[MAX_STR_LENGTH];
#ifdef __cplusplus
class slsDetectorDefs {
public:
slsDetectorDefs(){};
#endif
/**
Type of the detector
*/
enum detectorType {
GET_DETECTOR_TYPE = -1, /**< the detector will return its type */
GENERIC, /**< generic sls detector */
EIGER, /**< eiger */
GOTTHARD, /**< gotthard */
JUNGFRAU, /**< jungfrau */
CHIPTESTBOARD, /**< CTB */
MOENCH /**< moench */
};
/**
return values
*/
enum {
OK, /**< function succeeded */
FAIL, /**< function failed */
FORCE_UPDATE
};
/**
indexes for the acquisition timers
*/
enum timerIndex {
FRAME_NUMBER, /**< number of real time frames: total number of
acquisitions is number or frames*number of cycles */
ACQUISITION_TIME, /**< exposure time */
FRAME_PERIOD, /**< period between exposures */
DELAY_AFTER_TRIGGER, /**< delay between trigger and start of exposure or
readout (in triggered mode) */
GATES_NUMBER, /**< number of gates per frame (in gated mode) */
CYCLES_NUMBER, /**< number of cycles: total number of acquisitions is
number or frames*number of cycles */
ACTUAL_TIME, /**< Actual time of the detector's internal timer */
MEASUREMENT_TIME, /**< Time of the measurement from the detector (fifo)
*/
PROGRESS, /**< fraction of measurement elapsed - only get! */
MEASUREMENTS_NUMBER,
FRAMES_FROM_START,
FRAMES_FROM_START_PG,
ANALOG_SAMPLES,
DIGITAL_SAMPLES,
SUBFRAME_ACQUISITION_TIME, /**< subframe exposure time */
STORAGE_CELL_NUMBER, /**<number of storage cells */
SUBFRAME_DEADTIME, /**< subframe deadtime */
MEASURED_PERIOD, /**< measured period */
MEASURED_SUBPERIOD, /**< measured subperiod */
STORAGE_CELL_DELAY, /**< storage cell delay */
MAX_TIMERS
};
/**
staus mask
*/
enum runStatus {
IDLE, /**< detector ready to start acquisition - no data in memory */
ERROR, /**< error i.e. normally fifo full */
WAITING, /**< waiting for trigger or gate signal */
RUN_FINISHED, /**< acquisition not running but data in memory */
TRANSMITTING, /**< acquisition running and data in memory */
RUNNING, /**< acquisition running, no data in memory */
STOPPED /**< acquisition stopped externally */
};
/**
@short structure for a Detector Packet or Image Header
@li frameNumber is the frame number
@li expLength is the subframe number (32 bit eiger) or real time
exposure time in 100ns (others)
@li packetNumber is the packet number
@li bunchId is the bunch id from beamline
@li timestamp is the time stamp with 10 MHz clock
@li modId is the unique module id (unique even for left, right, top,
bottom)
@li row is the row index in the complete detector system
@li column is the column index in the complete detector system
@li reserved is reserved
@li debug is for debugging purposes
@li roundRNumber is the round robin set number
@li detType is the detector type see :: detectorType
@li version is the version number of this structure format
*/
typedef struct {
uint64_t frameNumber; /**< is the frame number */
uint32_t expLength; /**< is the subframe number (32 bit eiger) or real
time exposure time in 100ns (others) */
uint32_t packetNumber; /**< is the packet number */
uint64_t bunchId; /**< is the bunch id from beamline */
uint64_t timestamp; /**< is the time stamp with 10 MHz clock */
uint16_t modId; /**< is the unique module id (unique even for left,
right, top, bottom) */
uint16_t row; /**< is the row index in the complete detector system */
uint16_t
column; /**< is the column index in the complete detector system */
uint16_t reserved; /**< is reserved */
uint32_t debug; /**< is for debugging purposes */
uint16_t roundRNumber; /**< is the round robin set number */
uint8_t detType; /**< is the detector type see :: detectorType */
uint8_t version; /**< is the version number of this structure format */
} sls_detector_header;
#ifdef __cplusplus
#define MAX_NUM_PACKETS 512
typedef std::bitset<MAX_NUM_PACKETS> sls_bitset;
typedef struct {
sls_detector_header detHeader; /**< is the detector header */
sls_bitset packetsMask; /**< is the packets caught bit mask */
} sls_receiver_header;
typedef uint8_t bitset_storage[MAX_NUM_PACKETS / 8];
#endif
/**
* frameDiscardPolicy
*/
enum frameDiscardPolicy {
GET_FRAME_DISCARD_POLICY = -1, /**< to get the missing packet mode */
NO_DISCARD, /**< pad incomplete packets with -1, default mode */
DISCARD_EMPTY_FRAMES, /**< discard incomplete frames, fastest mode, save
space, not suitable for multiple modules */
DISCARD_PARTIAL_FRAMES, /**< ignore missing packets, must check with
packetsMask for data integrity, fast mode and
suitable for multiple modules */
NUM_DISCARD_POLICIES
};
/**
format
*/
enum fileFormat {
GET_FILE_FORMAT = -1, /**< the receiver will return its file format */
BINARY, /**< binary format */
HDF5, /**< hdf5 format */
NUM_FILE_FORMATS
};
/**
@short structure for a region of interest
xmin,xmax,ymin,ymax define the limits of the region
*/
typedef struct {
int xmin; /**< is the roi xmin (in channel number) */
int xmax; /**< is the roi xmax (in channel number)*/
int ymin; /**< is the roi ymin (in channel number)*/
int ymax; /**< is the roi ymax (in channel number)*/
} ROI;
/**
network parameters
*/
enum networkParameter {
DETECTOR_MAC, /**< detector MAC */
DETECTOR_IP, /**< detector IP */
RECEIVER_HOSTNAME, /**< receiver IP/hostname */
RECEIVER_UDP_IP, /**< receiever UDP IP */
RECEIVER_UDP_PORT, /**< receiever UDP Port */
RECEIVER_UDP_MAC, /**< receiever UDP MAC */
RECEIVER_UDP_PORT2, /**< receiever UDP Port of second half module for
eiger */
DETECTOR_TXN_DELAY_LEFT, /**< transmission delay on the (left) port for
next frame */
DETECTOR_TXN_DELAY_RIGHT, /**< transmission delay on the right port for
next frame */
DETECTOR_TXN_DELAY_FRAME, /**< transmission delay of a whole frame for
all the ports */
FLOW_CONTROL_10G, /**< flow control for 10GbE */
FLOW_CONTROL_WR_PTR, /**< memory write pointer for flow control */
FLOW_CONTROL_RD_PTR, /**< memory read pointer for flow control */
RECEIVER_STREAMING_PORT, /**< receiever streaming TCP(ZMQ) port */
CLIENT_STREAMING_PORT, /**< client streaming TCP(ZMQ) port */
RECEIVER_STREAMING_SRC_IP, /**< receiever streaming TCP(ZMQ) ip */
CLIENT_STREAMING_SRC_IP, /**< client streaming TCP(ZMQ) ip */
ADDITIONAL_JSON_HEADER, /**< additional json header (ZMQ) */
RECEIVER_UDP_SCKT_BUF_SIZE, /**< UDP socket buffer size */
RECEIVER_REAL_UDP_SCKT_BUF_SIZE /**< real UDP socket buffer size */
};
/**
type of action performed (for text client)
*/
enum { GET_ACTION, PUT_ACTION, READOUT_ACTION, HELP_ACTION };
/** online flags enum \sa setOnline*/
enum {
GET_ONLINE_FLAG = -1, /**< returns wether the detector is in online or
offline state */
OFFLINE_FLAG = 0, /**< detector in offline state (i.e. no communication
to the detector - using only local structure - no
data acquisition possible!) */
ONLINE_FLAG = 1 /**< detector in online state (i.e. communication to the
detector updating the local structure) */
};
/**
flags to get (or set) the size of the detector
*/
enum numberOf {
MAXMODX, /**<maximum number of module in X direction */
MAXMODY, /**<maximum number of module in Y direction */
NMODX, /**<installed number of module in X direction */
NMODY, /**<installed number of module in Y direction */
NCHANSX, /**<number of channels in X direction */
NCHANSY, /**<number of channels in Y direction */
NCHIPSX, /**<number of chips in X direction */
NCHIPSY /**<number of chips in Y direction */
};
/**
dimension indexes
*/
enum dimension {
X = 0, /**< X dimension */
Y = 1 /**< Y dimension */
};
/**
enable/disable flags
*/
enum {
DISABLED, /**<flag disabled */
ENABLED /**<flag enabled */
};
/**
use of the external signals
*/
enum externalSignalFlag {
GET_EXTERNAL_SIGNAL_FLAG = -1, /**<return flag for signal */
SIGNAL_OFF, /**<signal unused - tristate*/
GATE_IN_ACTIVE_HIGH, /**<input gate active high*/
GATE_IN_ACTIVE_LOW, /**<input gate active low */
TRIGGER_IN_RISING_EDGE, /**<input exposure trigger on rising edge */
TRIGGER_IN_FALLING_EDGE, /**<input exposure trigger on falling edge */
RO_TRIGGER_IN_RISING_EDGE, /**<input raedout trigger on rising edge */
RO_TRIGGER_IN_FALLING_EDGE, /**<input readout trigger on falling edge */
GATE_OUT_ACTIVE_HIGH, /**<output active high when detector is exposing*/
GATE_OUT_ACTIVE_LOW, /**<output active low when detector is exposing*/
TRIGGER_OUT_RISING_EDGE, /**<output trigger rising edge at start of
exposure */
TRIGGER_OUT_FALLING_EDGE, /**<output trigger falling edge at start of
exposure */
RO_TRIGGER_OUT_RISING_EDGE, /**<output trigger rising edge at start of
readout */
RO_TRIGGER_OUT_FALLING_EDGE, /**<output trigger falling edge at start of
readout */
OUTPUT_LOW, /**< output always low */
OUTPUT_HIGH, /**< output always high */
MASTER_SLAVE_SYNCHRONIZATION /**< reserved for master/slave
synchronization in multi detector
systems */
};
/**
communication mode using external signals
*/
enum externalCommunicationMode {
GET_EXTERNAL_COMMUNICATION_MODE =
-1, /**<return flag for communication mode */
AUTO_TIMING, /**< internal timing */
TRIGGER_EXPOSURE, /**< trigger mode i.e. exposure is triggered */
GATED, /**< gated */
BURST_TRIGGER /**< trigger a burst of frames */
};
/**
detector IDs/versions
*/
enum idMode {
DETECTOR_SERIAL_NUMBER, /**<return detector system serial number */
DETECTOR_FIRMWARE_VERSION, /**<return detector system firmware version
*/
DETECTOR_SOFTWARE_VERSION, /**<return detector system software version
*/
THIS_SOFTWARE_VERSION, /**<return this software version */
RECEIVER_VERSION, /**<return receiver software version */
SOFTWARE_FIRMWARE_API_VERSION, /** return software firmware API version
**/
CLIENT_SOFTWARE_API_VERSION, /** return detector software and client api
version */
CLIENT_RECEIVER_API_VERSION /** return client and receiver api version
*/
};
/**
detector digital test modes
*/
enum digitalTestMode {
DETECTOR_FIRMWARE_TEST, /**< test detector system firmware */
DETECTOR_BUS_TEST, /**< test detector system CPU-FPGA bus */
DIGITAL_BIT_TEST /**< gotthard digital bit test */
};
/**
detector dacs indexes
*/
enum dacIndex {
THRESHOLD, /**< comparator threshold level */
CALIBRATION_PULSE, /**< calibration input pulse height */
TRIMBIT_SIZE, /**< voltage to determine the trimbits LSB */
PREAMP, /**< preamp feedback */
SHAPER1, /**< shaper1 feedback */
SHAPER2, /**< shaper2 feedback */
TEMPERATURE_ADC, /**< temperature sensor (adc) */
TEMPERATURE_FPGA, /**< temperature sensor (fpga) */
HUMIDITY, /**< humidity sensor (adc) */
DETECTOR_BIAS, /**< detector bias */
VA_POT, /**< power supply va */
VDD_POT, /**< chiptest board power supply vdd */
VSH_POT, /**< chiptest board power supply vsh */
VIO_POT, /**< chiptest board power supply va */
G_VREF_DS, /**< gotthard */
G_VCASCN_PB, /**< gotthard */
G_VCASCP_PB, /**< gotthard */
G_VOUT_CM, /**< gotthard */
G_VCASC_OUT, /**< gotthard */
G_VIN_CM, /**< gotthard */
G_VREF_COMP, /**< gotthard */
G_IB_TESTC, /**< gotthard */
E_SvP, /**< eiger */
E_SvN, /**< eiger */
E_Vtr, /**< eiger */
E_Vrf, /**< eiger */
E_Vrs, /**< eiger */
E_Vtgstv, /**< eiger */
E_Vcmp_ll, /**< eiger */
E_Vcmp_lr, /**< eiger */
E_cal, /**< eiger */
E_Vcmp_rl, /**< eiger */
E_Vcmp_rr, /**< eiger */
E_rxb_rb, /**< eiger */
E_rxb_lb, /**< eiger */
E_Vcp, /**< eiger */
E_Vcn, /**< eiger */
E_Vis, /**< eiger */
IO_DELAY, /**< eiger io delay */
ADC_VPP, /**< adc vpp for jctb */
HIGH_VOLTAGE, /**< high voltage */
TEMPERATURE_FPGAEXT, /**< temperature sensor (close to fpga) */
TEMPERATURE_10GE, /**< temperature sensor (close to 10GE) */
TEMPERATURE_DCDC, /**< temperature sensor (close to DCDC) */
TEMPERATURE_SODL, /**< temperature sensor (close to SODL) */
TEMPERATURE_SODR, /**< temperature sensor (close to SODR) */
TEMPERATURE_FPGA2, /**< temperature sensor (fpga2 (eiger:febl) */
TEMPERATURE_FPGA3, /**< temperature sensor (fpga3 (eiger:febr) */
M_vIpre, /**< mythen 3 >*/
M_vIbias, /**< mythen 3 >*/
M_vIinSh, /**< mythen 3 >*/
M_VdcSh, /**< mythen 3 >*/
M_Vth2, /**< mythen 3 >*/
M_VPL, /**< mythen 3 >*/
M_Vth3, /**< mythen 3 >*/
M_casSh, /**< mythen 3 >*/
M_cas, /**< mythen 3 >*/
M_vIbiasSh, /**< mythen 3 >*/
M_vIcin, /**< mythen 3 >*/
M_vIpreOut, /**< mythen 3 >*/
V_POWER_A = 100, /**new chiptest board */
V_POWER_B = 101, /**new chiptest board */
V_POWER_C = 102, /**new chiptest board */
V_POWER_D = 103, /**new chiptest board */
V_POWER_IO = 104, /**new chiptest board */
V_POWER_CHIP = 105, /**new chiptest board */
I_POWER_A = 106, /**new chiptest board */
I_POWER_B = 107, /**new chiptest board */
I_POWER_C = 108, /**new chiptest board */
I_POWER_D = 109, /**new chiptest board */
I_POWER_IO = 110, /**new chiptest board */
V_LIMIT = 111, /**new chiptest board */
SLOW_ADC0 = 1000,
SLOW_ADC1,
SLOW_ADC2,
SLOW_ADC3,
SLOW_ADC4,
SLOW_ADC5,
SLOW_ADC6,
SLOW_ADC7,
SLOW_ADC_TEMP
};
/**
detector settings indexes
*/
enum detectorSettings {
GET_SETTINGS = -1, /**< return current detector settings */
STANDARD, /**< standard settings */
FAST, /**< fast settings */
HIGHGAIN, /**< highgain settings */
DYNAMICGAIN, /**< dynamic gain settings */
LOWGAIN, /**< low gain settings */
MEDIUMGAIN, /**< medium gain settings */
VERYHIGHGAIN, /**< very high gain settings */
LOWNOISE, /**< low noise settings */
DYNAMICHG0, /**< dynamic high gain 0 */
FIXGAIN1, /**< fix gain 1 */
FIXGAIN2, /**< fix gain 2 */
FORCESWITCHG1, /**< force switch gain 1 */
FORCESWITCHG2, /**< force switch gain 2 */
VERYLOWGAIN, /**< very low gain settings */
UNDEFINED = 200, /**< undefined or custom settings */
UNINITIALIZED /**< uninitialiazed (status at startup) */
};
#define TRIMBITMASK 0x3f
/**
important speed parameters
*/
enum speedVariable {
CLOCK_DIVIDER, /**< readout clock divider */
ADC_CLOCK, /**< adc clock divider */
ADC_PHASE, /**< adc clock phase */
ADC_PIPELINE, /**< adc pipeline */
DBIT_CLOCK, /**< adc clock divider */
DBIT_PHASE, /**< adc clock phase */
DBIT_PIPELINE, /**< adc pipeline */
MAX_ADC_PHASE_SHIFT, /** max adc phase shift */
MAX_DBIT_PHASE_SHIFT, /** max adc phase shift */
SYNC_CLOCK,
};
/**
readout flags
*/
enum readOutFlags {
GET_READOUT_FLAGS = -1, /**< return readout flags */
NORMAL_READOUT = 0, /**< no flag */
STORE_IN_RAM = 0x1, /**< data are stored in ram and sent only after end
of acquisition for faster frame rate */
READ_HITS = 0x2, /**< return only the number of the channel which
counted ate least one */
ZERO_COMPRESSION = 0x4, /**< returned data are 0-compressed */
PUMP_PROBE_MODE = 0x8, /**<pump-probe mode */
BACKGROUND_CORRECTIONS = 0x1000, /**<background corrections */
TOT_MODE = 0x2000, /**< pump-probe mode */
CONTINOUS_RO = 0x4000, /**< pump-probe mode */
PARALLEL = 0x10000, /**< eiger parallel mode */
NONPARALLEL = 0x20000, /**< eiger serial mode */
SAFE = 0x40000 /**< eiger safe mode */,
DIGITAL_ONLY = 0x80000, /** chiptest board read only digital bits (not
adc values)*/
ANALOG_AND_DIGITAL = 0x100000, /** chiptest board read adc values and
digital bits digital bits */
DUT_CLK = 0x200000, /** chiptest board fifo clock comes from device
under test */
SHOW_OVERFLOW = 0x400000, /** eiger 32 bit mode, show saturated for
overflow of single subframes */
NOOVERFLOW = 0x800000 /** eiger 32 bit mode, do not show saturated for
overflow of single subframes */
};
/** port type */
enum portType {
CONTROL_PORT, /**< control port */
STOP_PORT, /**<stop port */
DATA_PORT /**< receiver tcp port with client*/
};
/** hierarchy in multi-detector structure, if any */
enum masterFlags {
GET_MASTER = -1, /**< return master flag */
NO_MASTER, /**< no master/slave hierarchy defined */
IS_MASTER, /**<is master */
IS_SLAVE /**< is slave */
};
enum imageType {
DARK_IMAGE, /**< dark image */
GAIN_IMAGE /**< gain image */
};
/**
* frame mode for processor
*/
enum frameModeType {
GET_FRAME_MODE = -1,
PEDESTAL, /** < pedestal */
NEW_PEDESTAL, /** < new pedestal */
FLATFIELD, /** < flatfield */
NEW_FLATFIELD /** < new flatfield */
};
/**
* detector mode for processor
*/
enum detectorModeType {
GET_DETECTOR_MODE = -1,
COUNTING, /** < counting */
INTERPOLATING, /** < interpolating */
ANALOG /** < analog */
};
#ifdef __cplusplus
/** returns string from enabled/disabled
\param b true or false
\returns string enabled, disabled
*/
static std::string stringEnable(bool b) {
if (b)
return std::string("enabled");
else
return std::string("disabled");
};
/** returns detector type string from detector type index
\param t string can be EIGER, GOTTHARD, JUNGFRAU, CHIPTESTBOARD
\returns Eiger, Gotthard, Jungfrau, JungfrauCTB, Unknown
*/
static std::string detectorTypeToString(detectorType t) {
switch (t) {
case EIGER:
return std::string("Eiger");
case GOTTHARD:
return std::string("Gotthard");
case JUNGFRAU:
return std::string("Jungfrau");
case CHIPTESTBOARD:
return std::string("JungfrauCTB");
case MOENCH:
return std::string("Moench");
default:
return std::string("Unknown");
}
};
/** returns detector type index from detector type string
\param type can be Eiger, Gotthard, Jungfrau, JungfrauCTB
\returns EIGER, GOTTHARD, JUNGFRAU, CHIPTESTBOARD, GENERIC
*/
static detectorType detectorTypeToEnum(const std::string &type) {
if (type == "Eiger")
return EIGER;
if (type == "Gotthard")
return GOTTHARD;
if (type == "Jungfrau")
return JUNGFRAU;
if (type == "JungfrauCTB")
return CHIPTESTBOARD;
if (type == "Moench")
return MOENCH;
return GENERIC;
};
/** returns string from run status index
\param s can be ERROR, WAITING, RUNNING, TRANSMITTING, RUN_FINISHED,
STOPPED \returns string error, waiting, running, data, finished, stopped,
idle
*/
static std::string runStatusType(runStatus s) {
switch (s) {
case ERROR:
return std::string("error");
case WAITING:
return std::string("waiting");
case RUNNING:
return std::string("running");
case TRANSMITTING:
return std::string("data");
case RUN_FINISHED:
return std::string("finished");
case STOPPED:
return std::string("stopped");
default:
return std::string("idle");
}
};
/** returns string from file format index
\param s can be BINARY, ASCII, HDF5
\returns string binary, ascii, hdf5
*/
static std::string getFileFormatType(fileFormat f) {
switch (f) {
case HDF5:
return std::string("hdf5");
case BINARY:
return std::string("binary");
default:
return std::string("unknown");
}
};
/**
* Returns string of frame discard policy index
* @param f can be NO_DISCARD, DISCARD_EMPTY_FRAMES, DISCARD_PARTIAL_FRAMES
* @returns No Discard, Discard Empty Frames, Discard Partial Frames,
* unknown
*/
static std::string getFrameDiscardPolicyType(frameDiscardPolicy f) {
switch (f) {
case NO_DISCARD:
return std::string("No Discard");
case DISCARD_EMPTY_FRAMES:
return std::string("Discard Empty Frames");
case DISCARD_PARTIAL_FRAMES:
return std::string("Discard Partial Frames");
default:
return std::string("unknown");
}
};
/** returns std::string from external signal type index
\param f can be SIGNAL_OFF, GATE_IN_ACTIVE_HIGH, GATE_IN_ACTIVE_LOW,
TRIGGER_IN_RISING_EDGE, TRIGGER_IN_FALLING_EDGE,
RO_TRIGGER_IN_RISING_EDGE, RO_TRIGGER_IN_FALLING_EDGE,
GATE_OUT_ACTIVE_HIGH, GATE_OUT_ACTIVE_LOW, =TRIGGER_OUT_RISING_EDGE,
TRIGGER_OUT_FALLING_EDGE, RO_TRIGGER_OUT_RISING_EDGE,
RO_TRIGGER_OUT_FALLING_EDGE, OUTPUT_LOW, OUTPUT_HIGH,
MASTER_SLAVE_SYNCHRONIZATION, GET_EXTERNAL_SIGNAL_FLAG \returns
std::string off, gate_in_active_high, gate_in_active_low,
trigger_in_rising_edge, trigger_in_falling_edge,
ro_trigger_in_rising_edge, ro_trigger_in_falling_edge,
gate_out_active_high, gate_out_active_low, trigger_out_rising_edge,
trigger_out_falling_edge, ro_trigger_out_rising_edge,
ro_trigger_out_falling_edge, gnd, vcc, sync, unknown
*/
static std::string externalSignalType(externalSignalFlag f) {
switch (f) {
case SIGNAL_OFF:
return std::string("off");
case GATE_IN_ACTIVE_HIGH:
return std::string("gate_in_active_high");
case GATE_IN_ACTIVE_LOW:
return std::string("gate_in_active_low");
case TRIGGER_IN_RISING_EDGE:
return std::string("trigger_in_rising_edge");
case TRIGGER_IN_FALLING_EDGE:
return std::string("trigger_in_falling_edge");
case RO_TRIGGER_IN_RISING_EDGE:
return std::string("ro_trigger_in_rising_edge");
case RO_TRIGGER_IN_FALLING_EDGE:
return std::string("ro_trigger_in_falling_edge");
case GATE_OUT_ACTIVE_HIGH:
return std::string("gate_out_active_high");
case GATE_OUT_ACTIVE_LOW:
return std::string("gate_out_active_low");
case TRIGGER_OUT_RISING_EDGE:
return std::string("trigger_out_rising_edge");
case TRIGGER_OUT_FALLING_EDGE:
return std::string("trigger_out_falling_edge");
case RO_TRIGGER_OUT_RISING_EDGE:
return std::string("ro_trigger_out_rising_edge");
case RO_TRIGGER_OUT_FALLING_EDGE:
return std::string("ro_trigger_out_falling_edge");
case MASTER_SLAVE_SYNCHRONIZATION:
return std::string("sync");
case OUTPUT_LOW:
return std::string("gnd");
case OUTPUT_HIGH:
return std::string("vcc");
default:
return std::string("unknown");
}
};
/** returns external signal type index from std::string
\param sval off, gate_in_active_high, gate_in_active_low,
trigger_in_rising_edge, trigger_in_falling_edge,
ro_trigger_in_rising_edge, ro_trigger_in_falling_edge,
gate_out_active_high, gate_out_active_low, trigger_out_rising_edge,
trigger_out_falling_edge, ro_trigger_out_rising_edge,
ro_trigger_out_falling_edge, gnd, vcc, sync, unknown \returns can be
SIGNAL_OFF, GATE_IN_ACTIVE_HIGH, GATE_IN_ACTIVE_LOW,
TRIGGER_IN_RISING_EDGE, TRIGGER_IN_FALLING_EDGE,
RO_TRIGGER_IN_RISING_EDGE, RO_TRIGGER_IN_FALLING_EDGE,
GATE_OUT_ACTIVE_HIGH, GATE_OUT_ACTIVE_LOW, TRIGGER_OUT_RISING_EDGE,
TRIGGER_OUT_FALLING_EDGE, RO_TRIGGER_OUT_RISING_EDGE,
RO_TRIGGER_OUT_FALLING_EDGE, OUTPUT_LOW, OUTPUT_HIGH,
MASTER_SLAVE_SYNCHRONIZATION, GET_EXTERNAL_SIGNAL_FLAG (if unknown)
*/
static externalSignalFlag externalSignalType(std::string sval) {
if (sval == "off")
return SIGNAL_OFF;
if (sval == "gate_in_active_high")
return GATE_IN_ACTIVE_HIGH;
if (sval == "gate_in_active_low")
return GATE_IN_ACTIVE_LOW;
if (sval == "trigger_in_rising_edge")
return TRIGGER_IN_RISING_EDGE;
if (sval == "trigger_in_falling_edge")
return TRIGGER_IN_FALLING_EDGE;
if (sval == "ro_trigger_in_rising_edge")
return RO_TRIGGER_IN_RISING_EDGE;
if (sval == "ro_trigger_in_falling_edge")
return RO_TRIGGER_IN_FALLING_EDGE;
if (sval == "gate_out_active_high")
return GATE_OUT_ACTIVE_HIGH;
if (sval == "gate_out_active_low")
return GATE_OUT_ACTIVE_LOW;
if (sval == "trigger_out_rising_edge")
return TRIGGER_OUT_RISING_EDGE;
if (sval == "trigger_out_falling_edge")
return TRIGGER_OUT_FALLING_EDGE;
if (sval == "ro_trigger_out_rising_edge")
return RO_TRIGGER_OUT_RISING_EDGE;
if (sval == "ro_trigger_out_falling_edge")
return RO_TRIGGER_OUT_FALLING_EDGE;
if (sval == "sync")
return MASTER_SLAVE_SYNCHRONIZATION;
if (sval == "gnd")
return OUTPUT_LOW;
if (sval == "vcc")
return OUTPUT_HIGH;
return GET_EXTERNAL_SIGNAL_FLAG;
};
/** returns detector settings std::string from index
\param s can be STANDARD, FAST, HIGHGAIN, DYNAMICGAIN, LOWGAIN,
MEDIUMGAIN, VERYHIGHGAIN, LOWNOISE, DYNAMICHG0, FIXGAIN1, FIXGAIN2,
FORCESWITCHG1, FORCESWITCHG2, GET_SETTINGS \returns standard, fast,
highgain, dynamicgain, lowgain, mediumgain, veryhighgain, lownoise,
dynamichg0, fixgain1, fixgain2, forceswitchg1, forceswitchg2,
verylowgain, undefined
*/
static std::string getDetectorSettings(detectorSettings s) {
switch (s) {
case STANDARD:
return std::string("standard");
case FAST:
return std::string("fast");
case HIGHGAIN:
return std::string("highgain");
case DYNAMICGAIN:
return std::string("dynamicgain");
case LOWGAIN:
return std::string("lowgain");
case MEDIUMGAIN:
return std::string("mediumgain");
case VERYHIGHGAIN:
return std::string("veryhighgain");
case LOWNOISE:
return std::string("lownoise");
case DYNAMICHG0:
return std::string("dynamichg0");
case FIXGAIN1:
return std::string("fixgain1");
case FIXGAIN2:
return std::string("fixgain2");
case FORCESWITCHG1:
return std::string("forceswitchg1");
case FORCESWITCHG2:
return std::string("forceswitchg2");
case VERYLOWGAIN:
return std::string("verylowgain");
case UNINITIALIZED:
return std::string("uninitialized");
default:
return std::string("undefined");
}
};
/** returns detector settings std::string from index
\param s can be standard, fast, highgain, dynamicgain, lowgain,
mediumgain, veryhighgain, lownoise, dynamichg0, fixgain1, fixgain2,
forceswitchg1, forceswitchg2, undefined \returns setting index
STANDARD, FAST, HIGHGAIN, DYNAMICGAIN, LOWGAIN, MEDIUMGAIN,
VERYHIGHGAIN,LOWNOISE, DYNAMICHG0, FIXGAIN1, FIXGAIN2, FORCESWITCHG1,
FORCESWITCHG2, VERYLOWGAIN, GET_SETTINGS
*/
static detectorSettings getDetectorSettings(std::string s) {
if (s == "standard")
return STANDARD;
if (s == "fast")
return FAST;
if (s == "highgain")
return HIGHGAIN;
if (s == "dynamicgain")
return DYNAMICGAIN;
if (s == "lowgain")
return LOWGAIN;
if (s == "mediumgain")
return MEDIUMGAIN;
if (s == "veryhighgain")
return VERYHIGHGAIN;
if (s == "lownoise")
return LOWNOISE;
if (s == "dynamichg0")
return DYNAMICHG0;
if (s == "fixgain1")
return FIXGAIN1;
if (s == "fixgain2")
return FIXGAIN2;
if (s == "forceswitchg1")
return FORCESWITCHG1;
if (s == "forceswitchg2")
return FORCESWITCHG2;
if (s == "verylowgain")
return VERYLOWGAIN;
return GET_SETTINGS;
};
/**
returns external communication mode std::string from index
\param f can be AUTO_TIMING, TRIGGER_EXPOSURE, GATED, BURST_TRIGGER,
GET_EXTERNAL_COMMUNICATION_MODE \returns auto, trigger, gating,
burst_trigger, unknown
*/
static std::string externalCommunicationType(externalCommunicationMode f) {
switch (f) {
case AUTO_TIMING:
return std::string("auto");
case TRIGGER_EXPOSURE:
return std::string("trigger");
case GATED:
return std::string("gating");
case BURST_TRIGGER:
return std::string("burst_trigger");
default:
return std::string("unknown");
}
};
/**
returns external communication mode index from std::string
\param sval can be auto, trigger, gating, burst_trigger
\returns AUTO_TIMING, TRIGGER_EXPOSURE, GATED, BURST_TRIGGER,
GET_EXTERNAL_COMMUNICATION_MODE
*/
static externalCommunicationMode
externalCommunicationType(std::string sval) {
if (sval == "auto")
return AUTO_TIMING;
if (sval == "trigger")
return TRIGGER_EXPOSURE;
if (sval == "gating")
return GATED;
if (sval == "burst_trigger")
return BURST_TRIGGER;
return GET_EXTERNAL_COMMUNICATION_MODE;
};
/** returns std::string from file format index
\param s can be RAW, HDF5
\returns std::string raw, hdf5
*/
static std::string fileFormats(fileFormat f) {
switch (f) {
case BINARY:
return std::string("binary");
case HDF5:
return std::string("hdf5");
default:
return std::string("unknown");
}
};
/** returns std::string from timer index
\param s can be FRAME_NUMBER,ACQUISITION_TIME,FRAME_PERIOD,
DELAY_AFTER_TRIGGER,GATES_NUMBER, CYCLES_NUMBER,
ACTUAL_TIME,MEASUREMENT_TIME,
PROGRESS,MEASUREMENTS_NUMBER,FRAMES_FROM_START,FRAMES_FROM_START_PG,ANALOG_SAMPLES,DIGITAL_SAMPLES,SUBFRAME_ACQUISITION_TIME,STORAGE_CELL_NUMBER,
SUBFRAME_DEADTIME \returns std::string
frame_number,acquisition_time,frame_period,
delay_after_trigger,gates_number, cycles_number,
actual_time,measurement_time,
progress,measurements_number,frames_from_start,frames_from_start_pg,analog_samples, digital_samples,subframe_acquisition_time,storage_cell_number,
SUBFRAME_DEADTIME
*/
static std::string getTimerType(timerIndex t) {
switch (t) {
case FRAME_NUMBER:
return std::string("frame_number");
case ACQUISITION_TIME:
return std::string("acquisition_time");
case FRAME_PERIOD:
return std::string("frame_period");
case DELAY_AFTER_TRIGGER:
return std::string("delay_after_trigger");
case GATES_NUMBER:
return std::string("gates_number");
case CYCLES_NUMBER:
return std::string("cycles_number");
case ACTUAL_TIME:
return std::string("actual_time");
case MEASUREMENT_TIME:
return std::string("measurement_time");
case PROGRESS:
return std::string("progress");
case MEASUREMENTS_NUMBER:
return std::string("measurements_number");
case FRAMES_FROM_START:
return std::string("frames_from_start");
case FRAMES_FROM_START_PG:
return std::string("frames_from_start_pg");
case ANALOG_SAMPLES:
return std::string("analog_samples");
case DIGITAL_SAMPLES:
return std::string("digital_samples");
case SUBFRAME_ACQUISITION_TIME:
return std::string("subframe_acquisition_time");
case SUBFRAME_DEADTIME:
return std::string("subframe_deadtime");
case STORAGE_CELL_NUMBER:
return std::string("storage_cell_number");
default:
return std::string("unknown");
}
};
/**
@short returns adc index from std::string
\param s can be temp_fpga, temp_fpgaext, temp_10ge, temp_dcdc, temp_sodl,
temp_sodr, temp_fpgafl, temp_fpgafr \returns TEMPERATURE_FPGA,
TEMPERATURE_FPGAEXT, TEMPERATURE_10GE, TEMPERATURE_DCDC,
TEMPERATURE_SODL, TEMPERATURE_SODR, TEMPERATURE_FPGA2, TEMPERATURE_FPGA3,
-1 when unknown mode
*/
static int getADCIndex(std::string s) {
if (s == "temp_fpga")
return TEMPERATURE_FPGA;
if (s == "temp_fpgaext")
return TEMPERATURE_FPGAEXT;
if (s == "temp_10ge")
return TEMPERATURE_10GE;
if (s == "temp_dcdc")
return TEMPERATURE_DCDC;
if (s == "temp_sodl")
return TEMPERATURE_SODL;
if (s == "temp_sodr")
return TEMPERATURE_SODR;
if (s == "temp_fpgafl")
return TEMPERATURE_FPGA2;
if (s == "temp_fpgafr")
return TEMPERATURE_FPGA3;
return -1;
};
/**
@short returns dac index from std::string
\param s can be vcmp_ll, vcmp_lr, vcmp_rl, vcmp_rr, vthreshold, vrf, vrs,
vtr, vcall, vcp \returns E_Vcmp_ll, E_Vcmp_lr, E_Vcmp_rl, E_Vcmp_rr,
THRESHOLD, E_Vrf, E_Vrs, E_Vtr, E_cal, E_Vcp , -1 when unknown mode
*/
static int getDACIndex(std::string s) {
if (s == "vcmp_ll")
return E_Vcmp_ll;
if (s == "vcmp_lr")
return E_Vcmp_lr;
if (s == "vcmp_rl")
return E_Vcmp_rl;
if (s == "vcmp_rr")
return E_Vcmp_rr;
if (s == "vthreshold")
return THRESHOLD;
if (s == "vrf")
return E_Vrf;
if (s == "vrs")
return E_Vrs;
if (s == "vtr")
return E_Vtr;
if (s == "vcall")
return E_cal;
if (s == "vcp")
return E_Vcp;
return -1;
};
/**
@short returns receiver frame discard policy from std::string
\param s can be nodiscard, discardempty, discardpartial
\returns NO_DISCARD, DISCARD_EMPTY_FRAMES, DISCARD_PARTIAL_FRAMES,
GET_FRAME_DISCARD_POLICY when unknown mode
*/
static frameDiscardPolicy getReceiverFrameDiscardPolicy(std::string s) {
if (s == "nodiscard")
return NO_DISCARD;
if (s == "discardempty")
return DISCARD_EMPTY_FRAMES;
if (s == "discardpartial")
return DISCARD_PARTIAL_FRAMES;
return GET_FRAME_DISCARD_POLICY;
};
/** returns std::string from frame discard policy
\param f can be NO_DISCARD, DISCARD_EMPTY_FRAMES, DISCARD_PARTIAL_FRAMES
\returns std::string nodiscard, discardempty, discardpartial, unknown
*/
static std::string getReceiverFrameDiscardPolicy(frameDiscardPolicy f) {
switch (f) {
case NO_DISCARD:
return std::string("nodiscard");
case DISCARD_EMPTY_FRAMES:
return std::string("discardempty");
case DISCARD_PARTIAL_FRAMES:
return std::string("discardpartial");
default:
return std::string("unknown");
}
};
/**
* returns frameModeType as enum
* @param s pedestal, newpedestal, flatfield, newflatfield
* @returns PEDESTAL, NEW_PEDESTAL, FLATFIELD, NEW_FLATFIELD, GET_FRAME_MODE
* (if unknown)
*/
static frameModeType getFrameModeType(std::string s) {
for (auto &c : s)
c = std::tolower(c);
if (s == "pedestal")
return PEDESTAL;
if (s == "newpedestal")
return NEW_PEDESTAL;
if (s == "flatfield")
return FLATFIELD;
if (s == "newflatfield")
return NEW_FLATFIELD;
return GET_FRAME_MODE;
}
/**
* returns frameModeType as string
* @param f PEDESTAL, NEW_PEDESTAL, FLATFIELD, NEW_FLATFIELD
* @return string pedestal, newpedestal, flatfield, newflatfield, unknown
*/
static std::string getFrameModeType(frameModeType f) {
switch (f) {
case PEDESTAL:
return std::string("pedestal");
case NEW_PEDESTAL:
return std::string("newPedestal");
case FLATFIELD:
return std::string("flatfield");
case NEW_FLATFIELD:
return std::string("newFlatfield");
default:
return std::string("unknown");
}
}
/**
* returns detectorModeType as enum
* @param s counting, interpolating, analog
* @returns COUNTING, INTERPOLATING, ANALOG, GET_DETECTOR_MODE (if unknown)
*/
static detectorModeType getDetectorModeType(std::string s) {
for (auto &c : s)
c = std::tolower(c);
if (s == "counting")
return COUNTING;
if (s == "interpolating")
return INTERPOLATING;
if (s == "analog")
return ANALOG;
return GET_DETECTOR_MODE;
}
/**
* returns frameModeType as string
* @param f COUNTING, INTERPOLATING, ANALOG
* @return string counting, interpolating, analog, unknown
*/
static std::string getDetectorModeType(detectorModeType f) {
switch (f) {
case COUNTING:
return std::string("counting");
case INTERPOLATING:
return std::string("interpolating");
case ANALOG:
return std::string("analog");
default:
return std::string("unknown");
}
}
#endif
#ifdef __cplusplus
protected:
#endif
#ifndef MYROOT
#include "sls_detector_funcs.h"
#endif
#ifdef __cplusplus
};
#endif
;
#ifdef __cplusplus
struct detParameters {
int nChanX{0};
int nChanY{0};
int nChipX{0};
int nChipY{0};
int nDacs{0};
int dynamicRange{0};
int nGappixelsX{0};
int nGappixelsY{0};
detParameters() {}
detParameters(slsDetectorDefs::detectorType type) {
switch (type) {
case slsDetectorDefs::detectorType::GOTTHARD:
nChanX = 128;
nChanY = 1;
nChipX = 10;
nChipY = 1;
nDacs = 8;
dynamicRange = 16;
nGappixelsX = 0;
nGappixelsY = 0;
break;
case slsDetectorDefs::detectorType::JUNGFRAU:
nChanX = 256;
nChanY = 256;
nChipX = 4;
nChipY = 2;
nDacs = 8;
dynamicRange = 16;
nGappixelsX = 0;
nGappixelsY = 0;
break;
case slsDetectorDefs::detectorType::CHIPTESTBOARD:
nChanX = 36;
nChanY = 1;
nChipX = 1;
nChipY = 1;
nDacs = 24;
dynamicRange = 16;
nGappixelsX = 0;
nGappixelsY = 0;
break;
case slsDetectorDefs::detectorType::MOENCH:
nChanX = 32;
nChanY = 1;
nChipX = 1;
nChipY = 1;
nDacs = 8;
dynamicRange = 16;
nGappixelsX = 0;
nGappixelsY = 0;
break;
case slsDetectorDefs::detectorType::EIGER:
nChanX = 256;
nChanY = 256;
nChipX = 4;
nChipY = 1;
nDacs = 16;
dynamicRange = 16;
nGappixelsX = 6;
nGappixelsY = 1;
break;
default:
throw sls::RuntimeError(
"Unknown detector type! " +
slsDetectorDefs::detectorTypeToString(type));
}
}
};
#endif
/**
@short structure for a detector module
should not be used by unexperienced users
\see :: moduleRegisterBit ::chipRegisterBit :channelRegisterBit
@li reg is the module register (e.g. dynamic range? see moduleRegisterBit)
@li dacs is the pointer to the array of dac values (in V)
@li adcs is the pointer to the array of adc values (in V)
@li chipregs is the pointer to the array of chip registers
@li chanregs is the pointer to the array of channel registers
@li gain is the module gain
@li offset is the module offset
*/
#ifdef __cplusplus
struct sls_detector_module {
#else
typedef struct {
#endif
int serialnumber; /**< is the module serial number */
int nchan; /**< is the number of channels on the module*/
int nchip; /**< is the number of chips on the module */
int ndac; /**< is the number of dacs on the module */
int reg; /**< is the module register settings (gain level) */
int iodelay; /**< iodelay */
int tau; /**< tau */
int eV; /**< threshold energy */
int *dacs; /**< is the pointer to the array of the dac values (in V) */
int *chanregs; /**< is the pointer to the array of the channel registers */
#ifdef __cplusplus
sls_detector_module()
: serialnumber(0), nchan(0), nchip(0), ndac(0), reg(0), iodelay(0),
tau(0), eV(0), dacs(nullptr), chanregs(nullptr) {}
sls_detector_module(slsDetectorDefs::detectorType type)
: sls_detector_module() {
detParameters parameters{type};
int nch = parameters.nChanX * parameters.nChanY;
int nc = parameters.nChipX * parameters.nChipY;
ndac = parameters.nDacs;
nchip = nc;
nchan = nch * nc;
dacs = new int[ndac];
chanregs = new int[nchan];
}
sls_detector_module(const sls_detector_module &other)
: dacs(nullptr), chanregs(nullptr) {
*this = other;
}
sls_detector_module &operator=(const sls_detector_module &other) {
delete[] dacs;
delete[] chanregs;
serialnumber = other.serialnumber;
nchan = other.nchan;
nchip = other.nchip;
ndac = other.ndac;
reg = other.reg;
iodelay = other.iodelay;
tau = other.tau;
eV = other.eV;
dacs = new int[ndac];
std::copy(other.dacs, other.dacs + ndac, dacs);
chanregs = new int[nchan];
std::copy(other.chanregs, other.chanregs + nchan, chanregs);
return *this;
}
~sls_detector_module() {
delete[] dacs;
delete[] chanregs;
}
};
#else
} sls_detector_module;
#endif