mirror of
https://github.com/slsdetectorgroup/slsDetectorPackage.git
synced 2025-06-07 18:40:42 +02:00
commit
379d08dd03
@ -21,6 +21,9 @@ This document describes the differences between v6.1.0 and v6.0.0.
|
|||||||
|
|
||||||
- Fixed minor warnings (will fix commandline print of excess packets for missing packets)
|
- Fixed minor warnings (will fix commandline print of excess packets for missing packets)
|
||||||
- ctb slow adcs and any other adcs (other than temp) goes to the control Server
|
- ctb slow adcs and any other adcs (other than temp) goes to the control Server
|
||||||
|
- number of udp interfaces is 2 for Eiger (CHANGE IN API??)
|
||||||
|
- added module id for virtual servers into the udp header
|
||||||
|
- refactoring (rxr)
|
||||||
- fixed patsetbit and patsetmask for moench
|
- fixed patsetbit and patsetmask for moench
|
||||||
- changed default vref of adc9257 to 2V for moench (from 1.33V)
|
- changed default vref of adc9257 to 2V for moench (from 1.33V)
|
||||||
|
|
||||||
|
Binary file not shown.
@ -1492,6 +1492,8 @@ enum timingMode getTiming() {
|
|||||||
|
|
||||||
/* configure mac */
|
/* configure mac */
|
||||||
|
|
||||||
|
int getNumberofUDPInterfaces() { return 1; }
|
||||||
|
|
||||||
void calcChecksum(udp_header *udp) {
|
void calcChecksum(udp_header *udp) {
|
||||||
int count = IP_HEADER_SIZE;
|
int count = IP_HEADER_SIZE;
|
||||||
long int sum = 0;
|
long int sum = 0;
|
||||||
|
Binary file not shown.
@ -88,6 +88,7 @@ int eiger_virtual_read_n_rows = 256;
|
|||||||
int eiger_virtual_interrupt_subframe = 0;
|
int eiger_virtual_interrupt_subframe = 0;
|
||||||
int eiger_virtual_left_datastream = 1;
|
int eiger_virtual_left_datastream = 1;
|
||||||
int eiger_virtual_right_datastream = 1;
|
int eiger_virtual_right_datastream = 1;
|
||||||
|
int eiger_virtual_module_id = 0;
|
||||||
#endif
|
#endif
|
||||||
int defaultDacValues[NDAC] = DEFAULT_DAC_VALS;
|
int defaultDacValues[NDAC] = DEFAULT_DAC_VALS;
|
||||||
|
|
||||||
@ -304,10 +305,9 @@ u_int32_t getDetectorIP() {
|
|||||||
void initControlServer() {
|
void initControlServer() {
|
||||||
LOG(logINFOBLUE, ("Configuring Control server\n"));
|
LOG(logINFOBLUE, ("Configuring Control server\n"));
|
||||||
if (!updateFlag && initError == OK) {
|
if (!updateFlag && initError == OK) {
|
||||||
#ifndef VIRTUAL
|
|
||||||
int modid = getModuleIdInFile(&initError, initErrorMessage, ID_FILE);
|
int modid = getModuleIdInFile(&initError, initErrorMessage, ID_FILE);
|
||||||
#else
|
#ifdef VIRTUAL
|
||||||
getModuleIdInFile(&initError, initErrorMessage, ID_FILE);
|
eiger_virtual_module_id = modid;
|
||||||
#endif
|
#endif
|
||||||
if (initError == FAIL) {
|
if (initError == FAIL) {
|
||||||
return;
|
return;
|
||||||
@ -1500,6 +1500,7 @@ enum timingMode getTiming() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* configure mac */
|
/* configure mac */
|
||||||
|
int getNumberofUDPInterfaces() { return 2; }
|
||||||
|
|
||||||
int getNumberofDestinations(int *retval) {
|
int getNumberofDestinations(int *retval) {
|
||||||
#ifdef VIRTUAL
|
#ifdef VIRTUAL
|
||||||
@ -2407,6 +2408,7 @@ void *start_timer(void *arg) {
|
|||||||
header->version = SLS_DETECTOR_HEADER_VERSION;
|
header->version = SLS_DETECTOR_HEADER_VERSION;
|
||||||
header->frameNumber = frameNr + iframes;
|
header->frameNumber = frameNr + iframes;
|
||||||
header->packetNumber = i;
|
header->packetNumber = i;
|
||||||
|
header->modId = eiger_virtual_module_id;
|
||||||
header->row = row;
|
header->row = row;
|
||||||
header->column = colLeft;
|
header->column = colLeft;
|
||||||
|
|
||||||
@ -2417,6 +2419,7 @@ void *start_timer(void *arg) {
|
|||||||
header->version = SLS_DETECTOR_HEADER_VERSION;
|
header->version = SLS_DETECTOR_HEADER_VERSION;
|
||||||
header->frameNumber = frameNr + iframes;
|
header->frameNumber = frameNr + iframes;
|
||||||
header->packetNumber = i;
|
header->packetNumber = i;
|
||||||
|
header->modId = eiger_virtual_module_id;
|
||||||
header->row = row;
|
header->row = row;
|
||||||
header->column = colRight;
|
header->column = colRight;
|
||||||
if (eiger_virtual_quad_mode) {
|
if (eiger_virtual_quad_mode) {
|
||||||
|
Binary file not shown.
@ -41,6 +41,7 @@ char initErrorMessage[MAX_STR_LENGTH];
|
|||||||
#ifdef VIRTUAL
|
#ifdef VIRTUAL
|
||||||
pthread_t pthread_virtual_tid;
|
pthread_t pthread_virtual_tid;
|
||||||
int64_t virtual_currentFrameNumber = 2;
|
int64_t virtual_currentFrameNumber = 2;
|
||||||
|
int virtual_moduleid = 0;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
enum detectorSettings thisSettings = UNINITIALIZED;
|
enum detectorSettings thisSettings = UNINITIALIZED;
|
||||||
@ -101,8 +102,9 @@ void basictests() {
|
|||||||
}
|
}
|
||||||
// does check only if flag is 0 (by default), set by command line
|
// does check only if flag is 0 (by default), set by command line
|
||||||
if ((!debugflag) && (!updateFlag) &&
|
if ((!debugflag) && (!updateFlag) &&
|
||||||
((validateKernelVersion(KERNEL_DATE_VRSN) == FAIL) || (checkType() == FAIL) ||
|
((validateKernelVersion(KERNEL_DATE_VRSN) == FAIL) ||
|
||||||
(testFpga() == FAIL) || (testBus() == FAIL))) {
|
(checkType() == FAIL) || (testFpga() == FAIL) ||
|
||||||
|
(testBus() == FAIL))) {
|
||||||
sprintf(initErrorMessage,
|
sprintf(initErrorMessage,
|
||||||
"Could not pass basic tests of FPGA and bus. Dangerous to "
|
"Could not pass basic tests of FPGA and bus. Dangerous to "
|
||||||
"continue. (Firmware version:0x%llx) \n",
|
"continue. (Firmware version:0x%llx) \n",
|
||||||
@ -480,6 +482,9 @@ void setupDetector() {
|
|||||||
|
|
||||||
// set module id in register
|
// set module id in register
|
||||||
int modid = getModuleIdInFile(&initError, initErrorMessage, ID_FILE);
|
int modid = getModuleIdInFile(&initError, initErrorMessage, ID_FILE);
|
||||||
|
#ifdef VIRTUAL
|
||||||
|
virtual_moduleid = modid;
|
||||||
|
#endif
|
||||||
if (initError == FAIL) {
|
if (initError == FAIL) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -2083,40 +2088,56 @@ int setReadoutSpeed(int val) {
|
|||||||
case G2_108MHZ:
|
case G2_108MHZ:
|
||||||
LOG(logINFOBLUE, ("Setting readout speed to 108 MHz\n"));
|
LOG(logINFOBLUE, ("Setting readout speed to 108 MHz\n"));
|
||||||
if (setClockDivider(READOUT_C0, SPEED_108_CLKDIV_0) == FAIL) {
|
if (setClockDivider(READOUT_C0, SPEED_108_CLKDIV_0) == FAIL) {
|
||||||
LOG(logERROR, ("Could not set readout speed to 108 MHz. Failed to set readout clk 0 to %d\n", SPEED_108_CLKDIV_0));
|
LOG(logERROR, ("Could not set readout speed to 108 MHz. Failed to "
|
||||||
|
"set readout clk 0 to %d\n",
|
||||||
|
SPEED_108_CLKDIV_0));
|
||||||
return FAIL;
|
return FAIL;
|
||||||
}
|
}
|
||||||
if (setClockDivider(READOUT_C1, SPEED_108_CLKDIV_1) == FAIL) {
|
if (setClockDivider(READOUT_C1, SPEED_108_CLKDIV_1) == FAIL) {
|
||||||
LOG(logERROR, ("Could not set readout speed to 108 MHz. Failed to set readout clk 1 to %d\n", SPEED_108_CLKDIV_1));
|
LOG(logERROR, ("Could not set readout speed to 108 MHz. Failed to "
|
||||||
|
"set readout clk 1 to %d\n",
|
||||||
|
SPEED_108_CLKDIV_1));
|
||||||
return FAIL;
|
return FAIL;
|
||||||
}
|
}
|
||||||
if (setPhase(READOUT_C1, SPEED_108_CLKPHASE_DEG_1, 1) == FAIL) {
|
if (setPhase(READOUT_C1, SPEED_108_CLKPHASE_DEG_1, 1) == FAIL) {
|
||||||
LOG(logERROR, ("Could not set readout speed to 108 MHz. Failed to set clk phase 1 %d deg\n", SPEED_108_CLKPHASE_DEG_1));
|
LOG(logERROR, ("Could not set readout speed to 108 MHz. Failed to "
|
||||||
|
"set clk phase 1 %d deg\n",
|
||||||
|
SPEED_108_CLKPHASE_DEG_1));
|
||||||
return FAIL;
|
return FAIL;
|
||||||
}
|
}
|
||||||
setDBITPipeline(SPEED_144_DBIT_PIPELINE);
|
setDBITPipeline(SPEED_144_DBIT_PIPELINE);
|
||||||
if (getDBITPipeline() != SPEED_144_DBIT_PIPELINE) {
|
if (getDBITPipeline() != SPEED_144_DBIT_PIPELINE) {
|
||||||
LOG(logERROR, ("Could not set readout speed to 108 MHz. Failed to set dbitpipeline to %d \n", SPEED_144_DBIT_PIPELINE));
|
LOG(logERROR, ("Could not set readout speed to 108 MHz. Failed to "
|
||||||
|
"set dbitpipeline to %d \n",
|
||||||
|
SPEED_144_DBIT_PIPELINE));
|
||||||
return FAIL;
|
return FAIL;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case G2_144MHZ:
|
case G2_144MHZ:
|
||||||
LOG(logINFOBLUE, ("Setting readout speed to 144 MHz\n"));
|
LOG(logINFOBLUE, ("Setting readout speed to 144 MHz\n"));
|
||||||
if (setClockDivider(READOUT_C0, SPEED_144_CLKDIV_0) == FAIL) {
|
if (setClockDivider(READOUT_C0, SPEED_144_CLKDIV_0) == FAIL) {
|
||||||
LOG(logERROR, ("Could not set readout speed to 144 MHz. Failed to set readout clk 0 to %d\n", SPEED_144_CLKDIV_0));
|
LOG(logERROR, ("Could not set readout speed to 144 MHz. Failed to "
|
||||||
|
"set readout clk 0 to %d\n",
|
||||||
|
SPEED_144_CLKDIV_0));
|
||||||
return FAIL;
|
return FAIL;
|
||||||
}
|
}
|
||||||
if (setClockDivider(READOUT_C1, SPEED_144_CLKDIV_1) == FAIL) {
|
if (setClockDivider(READOUT_C1, SPEED_144_CLKDIV_1) == FAIL) {
|
||||||
LOG(logERROR, ("Could not set readout speed to 144 MHz. Failed to set readout clk 1 to %d\n", SPEED_144_CLKDIV_1));
|
LOG(logERROR, ("Could not set readout speed to 144 MHz. Failed to "
|
||||||
|
"set readout clk 1 to %d\n",
|
||||||
|
SPEED_144_CLKDIV_1));
|
||||||
return FAIL;
|
return FAIL;
|
||||||
}
|
}
|
||||||
if (setPhase(READOUT_C1, SPEED_144_CLKPHASE_DEG_1, 1) == FAIL) {
|
if (setPhase(READOUT_C1, SPEED_144_CLKPHASE_DEG_1, 1) == FAIL) {
|
||||||
LOG(logERROR, ("Could not set readout speed to 144 MHz. Failed to set clk phase 1 %d deg\n", SPEED_144_CLKPHASE_DEG_1));
|
LOG(logERROR, ("Could not set readout speed to 144 MHz. Failed to "
|
||||||
|
"set clk phase 1 %d deg\n",
|
||||||
|
SPEED_144_CLKPHASE_DEG_1));
|
||||||
return FAIL;
|
return FAIL;
|
||||||
}
|
}
|
||||||
setDBITPipeline(SPEED_144_DBIT_PIPELINE);
|
setDBITPipeline(SPEED_144_DBIT_PIPELINE);
|
||||||
if (getDBITPipeline() != SPEED_144_DBIT_PIPELINE) {
|
if (getDBITPipeline() != SPEED_144_DBIT_PIPELINE) {
|
||||||
LOG(logERROR, ("Could not set readout speed to 144 MHz. Failed to set dbitpipeline to %d \n", SPEED_144_DBIT_PIPELINE));
|
LOG(logERROR, ("Could not set readout speed to 144 MHz. Failed to "
|
||||||
|
"set dbitpipeline to %d \n",
|
||||||
|
SPEED_144_DBIT_PIPELINE));
|
||||||
return FAIL;
|
return FAIL;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@ -3005,7 +3026,7 @@ void *start_timer(void *arg) {
|
|||||||
header->version = SLS_DETECTOR_HEADER_VERSION - 1;
|
header->version = SLS_DETECTOR_HEADER_VERSION - 1;
|
||||||
header->frameNumber = virtual_currentFrameNumber;
|
header->frameNumber = virtual_currentFrameNumber;
|
||||||
header->packetNumber = 0;
|
header->packetNumber = 0;
|
||||||
header->modId = 0;
|
header->modId = virtual_moduleid;
|
||||||
header->row = detPos[X];
|
header->row = detPos[X];
|
||||||
header->column = detPos[Y];
|
header->column = detPos[Y];
|
||||||
// fill data
|
// fill data
|
||||||
|
Binary file not shown.
@ -1299,6 +1299,8 @@ int getExtSignal(int signalIndex) {
|
|||||||
|
|
||||||
/* configure mac */
|
/* configure mac */
|
||||||
|
|
||||||
|
int getNumberofUDPInterfaces() { return 1; }
|
||||||
|
|
||||||
void calcChecksum(mac_conf *mac, int sourceip, int destip) {
|
void calcChecksum(mac_conf *mac, int sourceip, int destip) {
|
||||||
mac->ip.ip_ver = 0x4;
|
mac->ip.ip_ver = 0x4;
|
||||||
mac->ip.ip_ihl = 0x5;
|
mac->ip.ip_ihl = 0x5;
|
||||||
|
Binary file not shown.
Binary file not shown.
@ -1157,6 +1157,8 @@ enum timingMode getTiming() {
|
|||||||
|
|
||||||
/* configure mac */
|
/* configure mac */
|
||||||
|
|
||||||
|
int getNumberofUDPInterfaces() { return 1; }
|
||||||
|
|
||||||
void calcChecksum(udp_header *udp) {
|
void calcChecksum(udp_header *udp) {
|
||||||
int count = IP_HEADER_SIZE;
|
int count = IP_HEADER_SIZE;
|
||||||
long int sum = 0;
|
long int sum = 0;
|
||||||
|
Binary file not shown.
@ -42,6 +42,7 @@ char initErrorMessage[MAX_STR_LENGTH];
|
|||||||
#ifdef VIRTUAL
|
#ifdef VIRTUAL
|
||||||
pthread_t pthread_virtual_tid;
|
pthread_t pthread_virtual_tid;
|
||||||
int64_t virtual_currentFrameNumber = 2;
|
int64_t virtual_currentFrameNumber = 2;
|
||||||
|
int virtual_moduleid = 0;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
enum detectorSettings thisSettings = UNINITIALIZED;
|
enum detectorSettings thisSettings = UNINITIALIZED;
|
||||||
@ -448,6 +449,9 @@ void setupDetector() {
|
|||||||
|
|
||||||
// set module id in register
|
// set module id in register
|
||||||
int modid = getModuleIdInFile(&initError, initErrorMessage, ID_FILE);
|
int modid = getModuleIdInFile(&initError, initErrorMessage, ID_FILE);
|
||||||
|
#ifdef VIRTUAL
|
||||||
|
virtual_moduleid = modid;
|
||||||
|
#endif
|
||||||
if (initError == FAIL) {
|
if (initError == FAIL) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -1719,6 +1723,8 @@ int getExtSignal(int signalIndex) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int getNumberofUDPInterfaces() { return 1; }
|
||||||
|
|
||||||
int configureMAC() {
|
int configureMAC() {
|
||||||
|
|
||||||
uint32_t srcip = udpDetails[0].srcip;
|
uint32_t srcip = udpDetails[0].srcip;
|
||||||
@ -2280,7 +2286,7 @@ void *start_timer(void *arg) {
|
|||||||
header->version = SLS_DETECTOR_HEADER_VERSION - 1;
|
header->version = SLS_DETECTOR_HEADER_VERSION - 1;
|
||||||
header->frameNumber = virtual_currentFrameNumber;
|
header->frameNumber = virtual_currentFrameNumber;
|
||||||
header->packetNumber = i;
|
header->packetNumber = i;
|
||||||
header->modId = 0;
|
header->modId = virtual_moduleid;
|
||||||
header->row = detPos[X];
|
header->row = detPos[X];
|
||||||
header->column = detPos[Y];
|
header->column = detPos[Y];
|
||||||
|
|
||||||
|
@ -387,8 +387,8 @@ void calcChecksum(mac_conf *mac, int sourceip, int destip);
|
|||||||
#endif
|
#endif
|
||||||
#if defined(JUNGFRAUD) || defined(GOTTHARD2D)
|
#if defined(JUNGFRAUD) || defined(GOTTHARD2D)
|
||||||
void setNumberofUDPInterfaces(int val);
|
void setNumberofUDPInterfaces(int val);
|
||||||
int getNumberofUDPInterfaces();
|
|
||||||
#endif
|
#endif
|
||||||
|
int getNumberofUDPInterfaces();
|
||||||
|
|
||||||
#if defined(JUNGFRAUD) || defined(EIGERD)
|
#if defined(JUNGFRAUD) || defined(EIGERD)
|
||||||
int getNumberofDestinations(int *retval);
|
int getNumberofDestinations(int *retval);
|
||||||
|
@ -4725,19 +4725,22 @@ void calculate_and_set_position() {
|
|||||||
LOG(logERROR, (mess));
|
LOG(logERROR, (mess));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
int maxy = maxydet;
|
|
||||||
// position does not change for gotthard2 (2 interfaces)
|
// calculating new position
|
||||||
#ifdef JUNGFRAUD
|
int modulePorts[2] = {1, 1};
|
||||||
maxy *= getNumberofUDPInterfaces();
|
// position does change for eiger and jungfrau (2 interfaces)
|
||||||
|
#if defined(EIGERD)
|
||||||
|
modulePorts[1] = getNumberofUDPInterfaces(); // horz
|
||||||
|
#elif defined(JUNGFRAUD)
|
||||||
|
modulePorts[0] = getNumberofUDPInterfaces(); // vert
|
||||||
#endif
|
#endif
|
||||||
|
int maxy = maxydet * modulePorts[0];
|
||||||
int pos[2] = {0, 0};
|
int pos[2] = {0, 0};
|
||||||
// row
|
// row
|
||||||
pos[0] = (detectorId % maxy);
|
pos[0] = (detectorId % maxy);
|
||||||
// col for horiz. udp ports
|
// col for horiz. udp ports
|
||||||
pos[1] = (detectorId / maxy);
|
pos[1] = (detectorId / maxy) * modulePorts[1];
|
||||||
#ifdef EIGERD
|
|
||||||
pos[1] *= 2;
|
|
||||||
#endif
|
|
||||||
LOG(logDEBUG, ("Setting Positions (%d,%d)\n", pos[0], pos[1]));
|
LOG(logDEBUG, ("Setting Positions (%d,%d)\n", pos[0], pos[1]));
|
||||||
if (setDetectorPosition(pos) == FAIL) {
|
if (setDetectorPosition(pos) == FAIL) {
|
||||||
ret = FAIL;
|
ret = FAIL;
|
||||||
@ -5320,7 +5323,16 @@ int set_num_interfaces(int file_des) {
|
|||||||
LOG(logINFO, ("Setting number of interfaces: %d\n", arg));
|
LOG(logINFO, ("Setting number of interfaces: %d\n", arg));
|
||||||
|
|
||||||
#if !defined(JUNGFRAUD) && !defined(GOTTHARD2D)
|
#if !defined(JUNGFRAUD) && !defined(GOTTHARD2D)
|
||||||
functionNotImplemented();
|
// fixed number of udp interfaces
|
||||||
|
int num_interfaces = getNumberofUDPInterfaces();
|
||||||
|
if (arg != num_interfaces) {
|
||||||
|
ret = FAIL;
|
||||||
|
sprintf(mess,
|
||||||
|
"Could not set number of interfaces. Invalid value: %d. Must "
|
||||||
|
"be %d\n",
|
||||||
|
arg, num_interfaces);
|
||||||
|
LOG(logERROR, (mess));
|
||||||
|
}
|
||||||
#else
|
#else
|
||||||
// only set
|
// only set
|
||||||
if (Server_VerifyLock() == OK) {
|
if (Server_VerifyLock() == OK) {
|
||||||
@ -5380,12 +5392,9 @@ int get_num_interfaces(int file_des) {
|
|||||||
int retval = -1;
|
int retval = -1;
|
||||||
LOG(logDEBUG1, ("Getting number of udp interfaces\n"));
|
LOG(logDEBUG1, ("Getting number of udp interfaces\n"));
|
||||||
|
|
||||||
#if !defined(JUNGFRAUD) && !defined(GOTTHARD2D)
|
|
||||||
retval = 1;
|
|
||||||
#else
|
|
||||||
// get only
|
// get only
|
||||||
retval = getNumberofUDPInterfaces();
|
retval = getNumberofUDPInterfaces();
|
||||||
#endif
|
|
||||||
LOG(logDEBUG1, ("Number of udp interfaces retval: %u\n", retval));
|
LOG(logDEBUG1, ("Number of udp interfaces retval: %u\n", retval));
|
||||||
return Server_SendResult(file_des, INT32, &retval, sizeof(retval));
|
return Server_SendResult(file_des, INT32, &retval, sizeof(retval));
|
||||||
}
|
}
|
||||||
@ -6883,11 +6892,7 @@ int get_receiver_parameters(int file_des) {
|
|||||||
|
|
||||||
// sending real detector parameters
|
// sending real detector parameters
|
||||||
// udp interfaces
|
// udp interfaces
|
||||||
#if defined(JUNGFRAUD) || defined(GOTTHARD2D)
|
|
||||||
i32 = getNumberofUDPInterfaces();
|
i32 = getNumberofUDPInterfaces();
|
||||||
#else
|
|
||||||
i32 = 1;
|
|
||||||
#endif
|
|
||||||
n += sendData(file_des, &i32, sizeof(i32), INT32);
|
n += sendData(file_des, &i32, sizeof(i32), INT32);
|
||||||
if (n < 0)
|
if (n < 0)
|
||||||
return printSocketReadError();
|
return printSocketReadError();
|
||||||
|
@ -2306,20 +2306,8 @@ Result<uint64_t> Detector::getRxCurrentFrameIndex(Positions pos) const {
|
|||||||
}
|
}
|
||||||
|
|
||||||
std::vector<int> Detector::getPortNumbers(int start_port) {
|
std::vector<int> Detector::getPortNumbers(int start_port) {
|
||||||
int num_sockets_per_detector = 1;
|
int num_sockets_per_detector = pimpl->getNumberofUDPInterfaces({}).tsquash(
|
||||||
switch (getDetectorType().squash()) {
|
"Number of UDP Interfaces is not consistent among modules");
|
||||||
case defs::EIGER:
|
|
||||||
num_sockets_per_detector *= 2;
|
|
||||||
break;
|
|
||||||
case defs::JUNGFRAU:
|
|
||||||
case defs::GOTTHARD2:
|
|
||||||
if (pimpl->getNumberofUDPInterfaces({}).squash() == 2) {
|
|
||||||
num_sockets_per_detector *= 2;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
std::vector<int> res;
|
std::vector<int> res;
|
||||||
res.reserve(size());
|
res.reserve(size());
|
||||||
for (int idet = 0; idet < size(); ++idet) {
|
for (int idet = 0; idet < size(); ++idet) {
|
||||||
|
@ -245,6 +245,15 @@ void DetectorImpl::setHostname(const std::vector<std::string> &name) {
|
|||||||
addModule(hostname);
|
addModule(hostname);
|
||||||
}
|
}
|
||||||
updateDetectorSize();
|
updateDetectorSize();
|
||||||
|
|
||||||
|
// update zmq port (especially for eiger)
|
||||||
|
int numInterfaces = modules[0]->getNumberofUDPInterfaces();
|
||||||
|
if (numInterfaces == 2) {
|
||||||
|
for (size_t i = 0; i < modules.size(); ++i) {
|
||||||
|
modules[i]->setClientStreamingPort(DEFAULT_ZMQ_CL_PORTNO +
|
||||||
|
i * numInterfaces);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void DetectorImpl::addModule(const std::string &hostname) {
|
void DetectorImpl::addModule(const std::string &hostname) {
|
||||||
@ -402,27 +411,21 @@ int DetectorImpl::createReceivingDataSockets() {
|
|||||||
}
|
}
|
||||||
LOG(logINFO) << "Going to create data sockets";
|
LOG(logINFO) << "Going to create data sockets";
|
||||||
|
|
||||||
size_t numSockets = modules.size();
|
size_t numUDPInterfaces =
|
||||||
size_t numSocketsPerModule = 1;
|
Parallel(&Module::getNumberofUDPInterfacesFromShm, {}).squash(1);
|
||||||
if (shm()->detType == EIGER) {
|
// gotthard2 second interface is only for veto debugging (not in gui)
|
||||||
numSocketsPerModule = 2;
|
if (shm()->detType == GOTTHARD2) {
|
||||||
|
numUDPInterfaces = 1;
|
||||||
}
|
}
|
||||||
// gotthard2 second interface is only for veto debugging
|
size_t numSockets = modules.size() * numUDPInterfaces;
|
||||||
else if (shm()->detType != GOTTHARD2) {
|
|
||||||
if (Parallel(&Module::getNumberofUDPInterfacesFromShm, {}).squash() ==
|
|
||||||
2) {
|
|
||||||
numSocketsPerModule = 2;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
numSockets *= numSocketsPerModule;
|
|
||||||
|
|
||||||
for (size_t iSocket = 0; iSocket < numSockets; ++iSocket) {
|
for (size_t iSocket = 0; iSocket < numSockets; ++iSocket) {
|
||||||
uint32_t portnum =
|
uint32_t portnum =
|
||||||
(modules[iSocket / numSocketsPerModule]->getClientStreamingPort());
|
(modules[iSocket / numUDPInterfaces]->getClientStreamingPort());
|
||||||
portnum += (iSocket % numSocketsPerModule);
|
portnum += (iSocket % numUDPInterfaces);
|
||||||
try {
|
try {
|
||||||
zmqSocket.push_back(sls::make_unique<ZmqSocket>(
|
zmqSocket.push_back(
|
||||||
modules[iSocket / numSocketsPerModule]
|
sls::make_unique<ZmqSocket>(modules[iSocket / numUDPInterfaces]
|
||||||
->getClientStreamingIP()
|
->getClientStreamingIP()
|
||||||
.str()
|
.str()
|
||||||
.c_str(),
|
.c_str(),
|
||||||
@ -460,13 +463,9 @@ void DetectorImpl::readFrameFromReceiver() {
|
|||||||
int nDetPixelsX = 0;
|
int nDetPixelsX = 0;
|
||||||
int nDetPixelsY = 0;
|
int nDetPixelsY = 0;
|
||||||
bool quadEnable = false;
|
bool quadEnable = false;
|
||||||
|
// to flip image
|
||||||
bool eiger = false;
|
bool eiger = false;
|
||||||
bool numInterfaces = 1;
|
|
||||||
// gotthard2 second interface is veto debugging
|
|
||||||
if (shm()->detType != GOTTHARD2) {
|
|
||||||
numInterfaces = Parallel(&Module::getNumberofUDPInterfacesFromShm, {})
|
|
||||||
.squash(); // cannot pick up from zmq
|
|
||||||
}
|
|
||||||
std::vector<bool> runningList(zmqSocket.size());
|
std::vector<bool> runningList(zmqSocket.size());
|
||||||
std::vector<bool> connectList(zmqSocket.size());
|
std::vector<bool> connectList(zmqSocket.size());
|
||||||
numZmqRunning = 0;
|
numZmqRunning = 0;
|
||||||
@ -542,10 +541,9 @@ void DetectorImpl::readFrameFromReceiver() {
|
|||||||
// shape
|
// shape
|
||||||
nPixelsX = zHeader.npixelsx;
|
nPixelsX = zHeader.npixelsx;
|
||||||
nPixelsY = zHeader.npixelsy;
|
nPixelsY = zHeader.npixelsy;
|
||||||
// module shape
|
// module shape (port)
|
||||||
nX = zHeader.ndetx;
|
nX = zHeader.ndetx;
|
||||||
nY = zHeader.ndety;
|
nY = zHeader.ndety;
|
||||||
nY *= numInterfaces;
|
|
||||||
nDetPixelsX = nX * nPixelsX;
|
nDetPixelsX = nX * nPixelsX;
|
||||||
nDetPixelsY = nY * nPixelsY;
|
nDetPixelsY = nY * nPixelsY;
|
||||||
// det type
|
// det type
|
||||||
|
@ -3130,8 +3130,8 @@ void Module::initializeModuleStructure(detectorType type) {
|
|||||||
sls::strcpy_safe(shm()->rxHostname, "none");
|
sls::strcpy_safe(shm()->rxHostname, "none");
|
||||||
shm()->rxTCPPort = DEFAULT_PORTNO + 2;
|
shm()->rxTCPPort = DEFAULT_PORTNO + 2;
|
||||||
shm()->useReceiverFlag = false;
|
shm()->useReceiverFlag = false;
|
||||||
shm()->zmqport = DEFAULT_ZMQ_CL_PORTNO +
|
shm()->zmqport =
|
||||||
(moduleIndex * ((shm()->detType == EIGER) ? 2 : 1));
|
DEFAULT_ZMQ_CL_PORTNO + moduleIndex * shm()->numUDPInterfaces;
|
||||||
shm()->zmqip = IpAddr{};
|
shm()->zmqip = IpAddr{};
|
||||||
shm()->numUDPInterfaces = 1;
|
shm()->numUDPInterfaces = 1;
|
||||||
shm()->stoppedFlag = false;
|
shm()->stoppedFlag = false;
|
||||||
|
@ -317,10 +317,7 @@ int ClientInterface::setup_receiver(Interface &socket) {
|
|||||||
|
|
||||||
// basic setup
|
// basic setup
|
||||||
setDetectorType(arg.detType);
|
setDetectorType(arg.detType);
|
||||||
{
|
impl()->setDetectorSize(arg.numberOfModule);
|
||||||
int msize[2] = {arg.numberOfModule.x, arg.numberOfModule.y};
|
|
||||||
impl()->setDetectorSize(msize);
|
|
||||||
}
|
|
||||||
impl()->setModulePositionId(arg.moduleIndex);
|
impl()->setModulePositionId(arg.moduleIndex);
|
||||||
impl()->setDetectorHostname(arg.hostname);
|
impl()->setDetectorHostname(arg.hostname);
|
||||||
|
|
||||||
|
@ -17,11 +17,12 @@
|
|||||||
const std::string DataStreamer::TypeName = "DataStreamer";
|
const std::string DataStreamer::TypeName = "DataStreamer";
|
||||||
|
|
||||||
DataStreamer::DataStreamer(int ind, Fifo *f, uint32_t *dr, ROI *r, uint64_t *fi,
|
DataStreamer::DataStreamer(int ind, Fifo *f, uint32_t *dr, ROI *r, uint64_t *fi,
|
||||||
bool fr, int *nm, bool *qe, uint64_t *tot)
|
bool fr, slsDetectorDefs::xy nm, bool *qe,
|
||||||
|
uint64_t *tot)
|
||||||
: ThreadObject(ind, TypeName), fifo(f), dynamicRange(dr), roi(r),
|
: ThreadObject(ind, TypeName), fifo(f), dynamicRange(dr), roi(r),
|
||||||
fileIndex(fi), flipRows(fr), quadEnable(qe), totalNumFrames(tot) {
|
fileIndex(fi), flipRows(fr), quadEnable(qe), totalNumFrames(tot) {
|
||||||
numMods[0] = nm[0];
|
numMods.x = nm.x;
|
||||||
numMods[1] = nm[1];
|
numMods.y = nm.y;
|
||||||
|
|
||||||
LOG(logDEBUG) << "DataStreamer " << ind << " created";
|
LOG(logDEBUG) << "DataStreamer " << ind << " created";
|
||||||
}
|
}
|
||||||
@ -62,9 +63,9 @@ void DataStreamer::RecordFirstIndex(uint64_t fnum, char *buf) {
|
|||||||
|
|
||||||
void DataStreamer::SetGeneralData(GeneralData *g) { generalData = g; }
|
void DataStreamer::SetGeneralData(GeneralData *g) { generalData = g; }
|
||||||
|
|
||||||
void DataStreamer::SetNumberofModules(int *nm) {
|
void DataStreamer::SetNumberofModules(xy nm) {
|
||||||
numMods[0] = nm[0];
|
numMods.x = nm.x;
|
||||||
numMods[1] = nm[1];
|
numMods.y = nm.y;
|
||||||
}
|
}
|
||||||
|
|
||||||
void DataStreamer::SetFlipRows(bool fd) { flipRows = fd; }
|
void DataStreamer::SetFlipRows(bool fd) { flipRows = fd; }
|
||||||
@ -219,8 +220,8 @@ int DataStreamer::SendHeader(sls_receiver_header *rheader, uint32_t size,
|
|||||||
|
|
||||||
zHeader.dynamicRange = *dynamicRange;
|
zHeader.dynamicRange = *dynamicRange;
|
||||||
zHeader.fileIndex = *fileIndex;
|
zHeader.fileIndex = *fileIndex;
|
||||||
zHeader.ndetx = numMods[0];
|
zHeader.ndetx = numMods.x;
|
||||||
zHeader.ndety = numMods[1];
|
zHeader.ndety = numMods.y;
|
||||||
zHeader.npixelsx = nx;
|
zHeader.npixelsx = nx;
|
||||||
zHeader.npixelsy = ny;
|
zHeader.npixelsy = ny;
|
||||||
zHeader.imageSize = size;
|
zHeader.imageSize = size;
|
||||||
|
@ -33,12 +33,12 @@ class DataStreamer : private virtual slsDetectorDefs, public ThreadObject {
|
|||||||
* @param r roi
|
* @param r roi
|
||||||
* @param fi pointer to file index
|
* @param fi pointer to file index
|
||||||
* @param fr flip rows
|
* @param fr flip rows
|
||||||
* @param nm pointer to number of modules in each dimension
|
* @param nm number of modules in each dimension
|
||||||
* @param qe pointer to quad Enable
|
* @param qe pointer to quad Enable
|
||||||
* @param tot pointer to total number of frames
|
* @param tot pointer to total number of frames
|
||||||
*/
|
*/
|
||||||
DataStreamer(int ind, Fifo *f, uint32_t *dr, ROI *r, uint64_t *fi, bool fr,
|
DataStreamer(int ind, Fifo *f, uint32_t *dr, ROI *r, uint64_t *fi, bool fr,
|
||||||
int *nm, bool *qe, uint64_t *tot);
|
xy nm, bool *qe, uint64_t *tot);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Destructor
|
* Destructor
|
||||||
@ -65,9 +65,9 @@ class DataStreamer : private virtual slsDetectorDefs, public ThreadObject {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Set number of detectors
|
* Set number of detectors
|
||||||
* @param nm number of modules in both dimensions
|
* @param nm number of modules/ports in both dimensions
|
||||||
*/
|
*/
|
||||||
void SetNumberofModules(int *nm);
|
void SetNumberofModules(xy nm);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Set Flipped rows
|
* Set Flipped rows
|
||||||
@ -196,7 +196,7 @@ class DataStreamer : private virtual slsDetectorDefs, public ThreadObject {
|
|||||||
char *completeBuffer{nullptr};
|
char *completeBuffer{nullptr};
|
||||||
|
|
||||||
/** Number of Modules in X and Y dimension */
|
/** Number of Modules in X and Y dimension */
|
||||||
int numMods[2];
|
xy numMods{1, 1};
|
||||||
|
|
||||||
/** Quad Enable */
|
/** Quad Enable */
|
||||||
bool *quadEnable;
|
bool *quadEnable;
|
||||||
|
@ -38,7 +38,7 @@ class GeneralData {
|
|||||||
/** Header size of data saved into fifo buffer at a time*/
|
/** Header size of data saved into fifo buffer at a time*/
|
||||||
uint32_t fifoBufferHeaderSize{0};
|
uint32_t fifoBufferHeaderSize{0};
|
||||||
uint32_t defaultFifoDepth{0};
|
uint32_t defaultFifoDepth{0};
|
||||||
uint32_t threadsPerReceiver{1};
|
uint32_t numUDPInterfaces{1};
|
||||||
uint32_t headerPacketSize{0};
|
uint32_t headerPacketSize{0};
|
||||||
/** Streaming (for ROI - mainly short Gotthard) */
|
/** Streaming (for ROI - mainly short Gotthard) */
|
||||||
uint32_t nPixelsXComplete{0};
|
uint32_t nPixelsXComplete{0};
|
||||||
@ -54,10 +54,27 @@ class GeneralData {
|
|||||||
uint32_t vetoImageSize{0};
|
uint32_t vetoImageSize{0};
|
||||||
uint32_t vetoHsize{0};
|
uint32_t vetoHsize{0};
|
||||||
uint32_t maxRowsPerReadout{0};
|
uint32_t maxRowsPerReadout{0};
|
||||||
|
uint32_t dynamicRange{16};
|
||||||
|
bool tengigaEnable{false};
|
||||||
|
uint32_t nAnalogSamples{0};
|
||||||
|
uint32_t nDigitalSamples{0};
|
||||||
|
slsDetectorDefs::readoutMode readoutType{slsDetectorDefs::ANALOG_ONLY};
|
||||||
|
uint32_t adcEnableMaskOneGiga{BIT32_MASK};
|
||||||
|
uint32_t adcEnableMaskTenGiga{BIT32_MASK};
|
||||||
|
slsDetectorDefs::ROI roi{};
|
||||||
|
|
||||||
GeneralData(){};
|
GeneralData(){};
|
||||||
virtual ~GeneralData(){};
|
virtual ~GeneralData(){};
|
||||||
|
|
||||||
|
// Returns the pixel depth in byte, 4 bits being 0.5 byte
|
||||||
|
float GetPixelDepth() { return float(dynamicRange) / 8; }
|
||||||
|
|
||||||
|
void ThrowGenericError(std::string msg) const {
|
||||||
|
throw sls::RuntimeError(
|
||||||
|
msg + std::string("SetROI is a generic function that should be "
|
||||||
|
"overloaded by a derived class"));
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get Header Infomation (frame number, packet number)
|
* Get Header Infomation (frame number, packet number)
|
||||||
* @param index thread index for debugging purposes
|
* @param index thread index for debugging purposes
|
||||||
@ -78,94 +95,61 @@ class GeneralData {
|
|||||||
bunchId = -1;
|
bunchId = -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Set ROI
|
|
||||||
* @param i ROI
|
|
||||||
*/
|
|
||||||
virtual void SetROI(slsDetectorDefs::ROI i) {
|
virtual void SetROI(slsDetectorDefs::ROI i) {
|
||||||
LOG(logERROR) << "SetROI is a generic function that should be "
|
ThrowGenericError("SetROI");
|
||||||
"overloaded by a derived class";
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**@returns adc configured */
|
||||||
* Get Adc configured
|
|
||||||
* @param index thread index for debugging purposes
|
|
||||||
* @param i
|
|
||||||
* @returns adc configured
|
|
||||||
*/
|
|
||||||
virtual int GetAdcConfigured(int index, slsDetectorDefs::ROI i) const {
|
virtual int GetAdcConfigured(int index, slsDetectorDefs::ROI i) const {
|
||||||
LOG(logERROR) << "GetAdcConfigured is a generic function that should "
|
ThrowGenericError("GetAdcConfigured");
|
||||||
"be overloaded by a derived class";
|
|
||||||
return 0;
|
return 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
virtual void SetDynamicRange(int dr) {
|
||||||
* Setting dynamic range changes member variables
|
ThrowGenericError("SetDynamicRange");
|
||||||
* @param dr dynamic range
|
|
||||||
* @param tgEnable true if 10GbE is enabled, else false
|
|
||||||
*/
|
|
||||||
virtual void SetDynamicRange(int dr, bool tgEnable) {
|
|
||||||
LOG(logERROR) << "SetDynamicRange is a generic function that should be "
|
|
||||||
"overloaded by a derived class";
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
virtual void SetTenGigaEnable(bool tgEnable) {
|
||||||
* Setting ten giga enable changes member variables
|
ThrowGenericError("SetTenGigaEnable");
|
||||||
* @param tgEnable true if 10GbE is enabled, else false
|
|
||||||
* @param dr dynamic range
|
|
||||||
*/
|
|
||||||
virtual void SetTenGigaEnable(bool tgEnable, int dr) {
|
|
||||||
LOG(logERROR) << "SetTenGigaEnable is a generic function that should "
|
|
||||||
"be overloaded by a derived class";
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
|
||||||
* Set odd starting packet (gotthard)
|
|
||||||
* @param index thread index for debugging purposes
|
|
||||||
* @param packetData pointer to data
|
|
||||||
* @returns true or false for odd starting packet number
|
|
||||||
*/
|
|
||||||
virtual bool SetOddStartingPacket(int index, char *packetData) {
|
virtual bool SetOddStartingPacket(int index, char *packetData) {
|
||||||
LOG(logERROR) << "SetOddStartingPacket is a generic function that "
|
ThrowGenericError("SetOddStartingPacket");
|
||||||
"should be overloaded by a derived class";
|
|
||||||
return false;
|
return false;
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
virtual void SetNumberofInterfaces(const int n) {
|
||||||
* Set databytes (ctb, moench)
|
ThrowGenericError("SetNumberofInterfaces");
|
||||||
* @param a adc enable mask
|
};
|
||||||
* @param as analog number of samples
|
|
||||||
* @param ds digital number of samples
|
virtual void SetNumberofCounters(const int n) {
|
||||||
* @param t tengiga enable
|
ThrowGenericError("SetNumberofCounters");
|
||||||
* @param f readout flags
|
};
|
||||||
* @returns analog data bytes
|
|
||||||
*/
|
virtual int GetNumberOfAnalogDatabytes() {
|
||||||
virtual int setImageSize(uint32_t a, uint32_t as, uint32_t ds, bool t,
|
ThrowGenericError("GetNumberOfAnalogDatabytes");
|
||||||
slsDetectorDefs::readoutMode f) {
|
|
||||||
LOG(logERROR) << "setImageSize is a generic function that should be "
|
|
||||||
"overloaded by a derived class";
|
|
||||||
return 0;
|
return 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
virtual void SetNumberOfAnalogSamples(int n) {
|
||||||
* set number of interfaces (jungfrau)
|
ThrowGenericError("SetNumberOfAnalogSamples");
|
||||||
* @param n number of interfaces
|
};
|
||||||
*/
|
|
||||||
virtual void SetNumberofInterfaces(const int n) {
|
|
||||||
LOG(logERROR) << "SetNumberofInterfaces is a generic function that "
|
|
||||||
"should be overloaded by a derived class";
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
virtual void SetNumberOfDigitalSamples(int n) {
|
||||||
* set number of counters (mythen3)
|
ThrowGenericError("SetNumberOfDigitalSamples");
|
||||||
* @param n number of counters
|
};
|
||||||
* @param dr dynamic range
|
|
||||||
* @param tgEnable ten giga enable
|
virtual void SetOneGigaAdcEnableMask(int n) {
|
||||||
*/
|
ThrowGenericError("SetOneGigaAdcEnableMask");
|
||||||
virtual void SetNumberofCounters(const int n, const int dr, bool tgEnable) {
|
};
|
||||||
LOG(logERROR) << "SetNumberofCounters is a generic function that "
|
|
||||||
"should be overloaded by a derived class";
|
virtual void SetTenGigaAdcEnableMask(int n) {
|
||||||
}
|
ThrowGenericError("SetTenGigaAdcEnableMask");
|
||||||
|
};
|
||||||
|
|
||||||
|
virtual void SetReadoutMode(slsDetectorDefs::readoutMode r) {
|
||||||
|
ThrowGenericError("SetReadoutMode");
|
||||||
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
class GotthardData : public GeneralData {
|
class GotthardData : public GeneralData {
|
||||||
@ -175,23 +159,14 @@ class GotthardData : public GeneralData {
|
|||||||
const int nChipsPerAdc = 2;
|
const int nChipsPerAdc = 2;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
/** Constructor */
|
|
||||||
GotthardData() {
|
GotthardData() {
|
||||||
myDetectorType = slsDetectorDefs::GOTTHARD;
|
myDetectorType = slsDetectorDefs::GOTTHARD;
|
||||||
nPixelsX = 1280;
|
|
||||||
nPixelsY = 1;
|
nPixelsY = 1;
|
||||||
headerSizeinPacket = 4;
|
headerSizeinPacket = 6;
|
||||||
dataSize = 1280;
|
|
||||||
packetSize = GOTTHARD_PACKET_SIZE;
|
|
||||||
packetsPerFrame = 2;
|
|
||||||
imageSize = dataSize * packetsPerFrame;
|
|
||||||
frameIndexMask = 0xFFFFFFFE;
|
|
||||||
frameIndexOffset = 1;
|
|
||||||
packetIndexMask = 1;
|
|
||||||
maxFramesPerFile = MAX_FRAMES_PER_FILE;
|
maxFramesPerFile = MAX_FRAMES_PER_FILE;
|
||||||
fifoBufferHeaderSize =
|
fifoBufferHeaderSize =
|
||||||
FIFO_HEADER_NUMBYTES + sizeof(slsDetectorDefs::sls_receiver_header);
|
FIFO_HEADER_NUMBYTES + sizeof(slsDetectorDefs::sls_receiver_header);
|
||||||
defaultFifoDepth = 50000;
|
UpdateImageSize();
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -219,56 +194,7 @@ class GotthardData : public GeneralData {
|
|||||||
bunchId = -1;
|
bunchId = -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/** @returns adc configured */
|
||||||
* Set ROI
|
|
||||||
* @param i ROI
|
|
||||||
*/
|
|
||||||
void SetROI(slsDetectorDefs::ROI i) {
|
|
||||||
// all adcs
|
|
||||||
if (i.xmin == -1) {
|
|
||||||
nPixelsX = 1280;
|
|
||||||
dataSize = 1280;
|
|
||||||
packetSize = GOTTHARD_PACKET_SIZE;
|
|
||||||
packetsPerFrame = 2;
|
|
||||||
imageSize = dataSize * packetsPerFrame;
|
|
||||||
frameIndexMask = 0xFFFFFFFE;
|
|
||||||
frameIndexOffset = 1;
|
|
||||||
packetIndexMask = 1;
|
|
||||||
maxFramesPerFile = MAX_FRAMES_PER_FILE;
|
|
||||||
fifoBufferHeaderSize = FIFO_HEADER_NUMBYTES +
|
|
||||||
sizeof(slsDetectorDefs::sls_receiver_header);
|
|
||||||
defaultFifoDepth = 50000;
|
|
||||||
nPixelsXComplete = 0;
|
|
||||||
nPixelsYComplete = 0;
|
|
||||||
imageSizeComplete = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
// single adc
|
|
||||||
else {
|
|
||||||
nPixelsX = 256;
|
|
||||||
dataSize = 512;
|
|
||||||
packetSize = 518;
|
|
||||||
packetsPerFrame = 1;
|
|
||||||
imageSize = dataSize * packetsPerFrame;
|
|
||||||
frameIndexMask = 0xFFFFFFFF;
|
|
||||||
frameIndexOffset = 0;
|
|
||||||
packetIndexMask = 0;
|
|
||||||
maxFramesPerFile = SHORT_MAX_FRAMES_PER_FILE;
|
|
||||||
fifoBufferHeaderSize = FIFO_HEADER_NUMBYTES +
|
|
||||||
sizeof(slsDetectorDefs::sls_receiver_header);
|
|
||||||
defaultFifoDepth = 75000;
|
|
||||||
nPixelsXComplete = 1280;
|
|
||||||
nPixelsYComplete = 1;
|
|
||||||
imageSizeComplete = 1280 * 2;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get Adc configured
|
|
||||||
* @param index thread index for debugging purposes
|
|
||||||
* @param i ROI
|
|
||||||
* @returns adc configured
|
|
||||||
*/
|
|
||||||
int GetAdcConfigured(int index, slsDetectorDefs::ROI i) const {
|
int GetAdcConfigured(int index, slsDetectorDefs::ROI i) const {
|
||||||
int adc = -1;
|
int adc = -1;
|
||||||
// single adc
|
// single adc
|
||||||
@ -320,99 +246,114 @@ class GotthardData : public GeneralData {
|
|||||||
}
|
}
|
||||||
return oddStartingPacket;
|
return oddStartingPacket;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
void SetROI(slsDetectorDefs::ROI i) {
|
||||||
|
roi = i;
|
||||||
|
UpdateImageSize();
|
||||||
|
};
|
||||||
|
|
||||||
|
private:
|
||||||
|
void UpdateImageSize() {
|
||||||
|
|
||||||
|
// all adcs
|
||||||
|
if (roi.xmin == -1) {
|
||||||
|
nPixelsX = 1280;
|
||||||
|
dataSize = 1280;
|
||||||
|
packetsPerFrame = 2;
|
||||||
|
frameIndexMask = 0xFFFFFFFE;
|
||||||
|
frameIndexOffset = 1;
|
||||||
|
packetIndexMask = 1;
|
||||||
|
maxFramesPerFile = MAX_FRAMES_PER_FILE;
|
||||||
|
nPixelsXComplete = 0;
|
||||||
|
nPixelsYComplete = 0;
|
||||||
|
imageSizeComplete = 0;
|
||||||
|
defaultFifoDepth = 50000;
|
||||||
|
} else {
|
||||||
|
nPixelsX = 256;
|
||||||
|
dataSize = 512;
|
||||||
|
packetsPerFrame = 1;
|
||||||
|
frameIndexMask = 0xFFFFFFFF;
|
||||||
|
frameIndexOffset = 0;
|
||||||
|
packetIndexMask = 0;
|
||||||
|
maxFramesPerFile = SHORT_MAX_FRAMES_PER_FILE;
|
||||||
|
nPixelsXComplete = 1280;
|
||||||
|
nPixelsYComplete = 1;
|
||||||
|
imageSizeComplete = 1280 * 2;
|
||||||
|
defaultFifoDepth = 75000;
|
||||||
|
}
|
||||||
|
imageSize = int(nPixelsX * nPixelsY * GetPixelDepth());
|
||||||
|
packetSize = headerSizeinPacket + dataSize;
|
||||||
|
packetsPerFrame = imageSize / dataSize;
|
||||||
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
class EigerData : public GeneralData {
|
class EigerData : public GeneralData {
|
||||||
|
|
||||||
public:
|
public:
|
||||||
/** Constructor */
|
|
||||||
EigerData() {
|
EigerData() {
|
||||||
myDetectorType = slsDetectorDefs::EIGER;
|
myDetectorType = slsDetectorDefs::EIGER;
|
||||||
nPixelsX = (256 * 2);
|
|
||||||
nPixelsY = 256;
|
|
||||||
headerSizeinPacket = sizeof(slsDetectorDefs::sls_detector_header);
|
headerSizeinPacket = sizeof(slsDetectorDefs::sls_detector_header);
|
||||||
dataSize = 1024;
|
|
||||||
packetSize = headerSizeinPacket + dataSize;
|
|
||||||
packetsPerFrame = 256;
|
|
||||||
imageSize = dataSize * packetsPerFrame;
|
|
||||||
maxFramesPerFile = EIGER_MAX_FRAMES_PER_FILE;
|
maxFramesPerFile = EIGER_MAX_FRAMES_PER_FILE;
|
||||||
fifoBufferHeaderSize =
|
fifoBufferHeaderSize =
|
||||||
FIFO_HEADER_NUMBYTES + sizeof(slsDetectorDefs::sls_receiver_header);
|
FIFO_HEADER_NUMBYTES + sizeof(slsDetectorDefs::sls_receiver_header);
|
||||||
defaultFifoDepth = 1000;
|
numUDPInterfaces = 2;
|
||||||
threadsPerReceiver = 2;
|
|
||||||
headerPacketSize = 40;
|
headerPacketSize = 40;
|
||||||
standardheader = true;
|
standardheader = true;
|
||||||
maxRowsPerReadout = 256;
|
maxRowsPerReadout = 256;
|
||||||
|
UpdateImageSize();
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
void SetDynamicRange(int dr) {
|
||||||
* Setting dynamic range changes member variables
|
dynamicRange = dr;
|
||||||
* @param dr dynamic range
|
UpdateImageSize();
|
||||||
* @param tgEnable true if 10GbE is enabled, else false
|
|
||||||
*/
|
|
||||||
void SetDynamicRange(int dr, bool tgEnable) {
|
|
||||||
packetsPerFrame = (tgEnable ? 4 : 16) * dr;
|
|
||||||
imageSize = dataSize * packetsPerFrame;
|
|
||||||
defaultFifoDepth = (dr == 32 ? 100 : 1000);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
void SetTenGigaEnable(bool tgEnable) {
|
||||||
* Setting ten giga enable changes member variables
|
tengigaEnable = tgEnable;
|
||||||
* @param tgEnable true if 10GbE is enabled, else false
|
UpdateImageSize();
|
||||||
* @param dr dynamic range
|
};
|
||||||
*/
|
|
||||||
void SetTenGigaEnable(bool tgEnable, int dr) {
|
private:
|
||||||
dataSize = (tgEnable ? 4096 : 1024);
|
void UpdateImageSize() {
|
||||||
|
nPixelsX = (256 * 4) / numUDPInterfaces;
|
||||||
|
nPixelsY = 256;
|
||||||
|
dataSize = (tengigaEnable ? 4096 : 1024);
|
||||||
packetSize = headerSizeinPacket + dataSize;
|
packetSize = headerSizeinPacket + dataSize;
|
||||||
packetsPerFrame = (tgEnable ? 4 : 16) * dr;
|
imageSize = int(nPixelsX * nPixelsY * GetPixelDepth());
|
||||||
imageSize = dataSize * packetsPerFrame;
|
packetsPerFrame = imageSize / dataSize;
|
||||||
|
defaultFifoDepth = (dynamicRange == 32 ? 100 : 1000);
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
class JungfrauData : public GeneralData {
|
class JungfrauData : public GeneralData {
|
||||||
|
|
||||||
public:
|
public:
|
||||||
/** Constructor */
|
|
||||||
JungfrauData() {
|
JungfrauData() {
|
||||||
myDetectorType = slsDetectorDefs::JUNGFRAU;
|
myDetectorType = slsDetectorDefs::JUNGFRAU;
|
||||||
nPixelsX = (256 * 4);
|
|
||||||
nPixelsY = 512;
|
|
||||||
headerSizeinPacket = sizeof(slsDetectorDefs::sls_detector_header);
|
headerSizeinPacket = sizeof(slsDetectorDefs::sls_detector_header);
|
||||||
dataSize = 8192;
|
dataSize = 8192;
|
||||||
packetSize = headerSizeinPacket + dataSize;
|
packetSize = headerSizeinPacket + dataSize;
|
||||||
packetsPerFrame = 128;
|
|
||||||
imageSize = dataSize * packetsPerFrame;
|
|
||||||
maxFramesPerFile = JFRAU_MAX_FRAMES_PER_FILE;
|
maxFramesPerFile = JFRAU_MAX_FRAMES_PER_FILE;
|
||||||
fifoBufferHeaderSize =
|
fifoBufferHeaderSize =
|
||||||
FIFO_HEADER_NUMBYTES + sizeof(slsDetectorDefs::sls_receiver_header);
|
FIFO_HEADER_NUMBYTES + sizeof(slsDetectorDefs::sls_receiver_header);
|
||||||
defaultFifoDepth = 2500;
|
defaultFifoDepth = 2500;
|
||||||
standardheader = true;
|
standardheader = true;
|
||||||
defaultUdpSocketBufferSize = (1000 * 1024 * 1024);
|
|
||||||
maxRowsPerReadout = 512;
|
maxRowsPerReadout = 512;
|
||||||
|
UpdateImageSize();
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
|
||||||
* set number of interfaces (jungfrau)
|
|
||||||
* @param n number of interfaces
|
|
||||||
*/
|
|
||||||
void SetNumberofInterfaces(const int n) {
|
void SetNumberofInterfaces(const int n) {
|
||||||
// 2 interfaces
|
numUDPInterfaces = n;
|
||||||
if (n == 2) {
|
UpdateImageSize();
|
||||||
nPixelsY = 256;
|
};
|
||||||
packetsPerFrame = 64;
|
|
||||||
imageSize = dataSize * packetsPerFrame;
|
|
||||||
threadsPerReceiver = 2;
|
|
||||||
defaultUdpSocketBufferSize = (500 * 1024 * 1024);
|
|
||||||
|
|
||||||
}
|
private:
|
||||||
// 1 interface
|
void UpdateImageSize() {
|
||||||
else {
|
nPixelsX = (256 * 4);
|
||||||
nPixelsY = 512;
|
nPixelsY = (256 * 2) / numUDPInterfaces;
|
||||||
packetsPerFrame = 128;
|
imageSize = int(nPixelsX * nPixelsY * GetPixelDepth());
|
||||||
imageSize = dataSize * packetsPerFrame;
|
packetsPerFrame = imageSize / dataSize;
|
||||||
threadsPerReceiver = 1;
|
defaultUdpSocketBufferSize = (1000 * 1024 * 1024) / numUDPInterfaces;
|
||||||
defaultUdpSocketBufferSize = (1000 * 1024 * 1024);
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -422,39 +363,46 @@ class Mythen3Data : public GeneralData {
|
|||||||
const int NCHAN = 1280;
|
const int NCHAN = 1280;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
/** Constructor */
|
|
||||||
Mythen3Data() {
|
Mythen3Data() {
|
||||||
myDetectorType = slsDetectorDefs::MYTHEN3;
|
myDetectorType = slsDetectorDefs::MYTHEN3;
|
||||||
ncounters = 3;
|
ncounters = 3;
|
||||||
nPixelsX = (NCHAN * ncounters); // max 1280 channels x 3 counters
|
|
||||||
nPixelsY = 1;
|
nPixelsY = 1;
|
||||||
headerSizeinPacket = sizeof(slsDetectorDefs::sls_detector_header);
|
headerSizeinPacket = sizeof(slsDetectorDefs::sls_detector_header);
|
||||||
dataSize = 7680;
|
|
||||||
packetSize = headerSizeinPacket + dataSize;
|
|
||||||
packetsPerFrame = 2;
|
|
||||||
imageSize = dataSize * packetsPerFrame;
|
|
||||||
maxFramesPerFile = MYTHEN3_MAX_FRAMES_PER_FILE;
|
maxFramesPerFile = MYTHEN3_MAX_FRAMES_PER_FILE;
|
||||||
fifoBufferHeaderSize =
|
fifoBufferHeaderSize =
|
||||||
FIFO_HEADER_NUMBYTES + sizeof(slsDetectorDefs::sls_receiver_header);
|
FIFO_HEADER_NUMBYTES + sizeof(slsDetectorDefs::sls_receiver_header);
|
||||||
defaultFifoDepth = 50000;
|
defaultFifoDepth = 50000;
|
||||||
standardheader = true;
|
standardheader = true;
|
||||||
defaultUdpSocketBufferSize = (1000 * 1024 * 1024);
|
defaultUdpSocketBufferSize = (1000 * 1024 * 1024);
|
||||||
|
dynamicRange = 32;
|
||||||
|
tengigaEnable = true;
|
||||||
|
UpdateImageSize();
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
void SetDynamicRange(int dr) {
|
||||||
* set number of counters (mythen3)
|
dynamicRange = dr;
|
||||||
* @param n number of counters
|
UpdateImageSize();
|
||||||
* @param dr dynamic range
|
};
|
||||||
* @param tgEnable ten giga enable
|
|
||||||
*/
|
void SetTenGigaEnable(bool tg) {
|
||||||
virtual void SetNumberofCounters(const int n, const int dr, bool tgEnable) {
|
tengigaEnable = tg;
|
||||||
|
UpdateImageSize();
|
||||||
|
};
|
||||||
|
|
||||||
|
virtual void SetNumberofCounters(const int n) {
|
||||||
ncounters = n;
|
ncounters = n;
|
||||||
nPixelsX = NCHAN * ncounters;
|
UpdateImageSize();
|
||||||
|
};
|
||||||
|
|
||||||
|
private:
|
||||||
|
void UpdateImageSize() {
|
||||||
|
nPixelsX = (NCHAN * ncounters); // max 1280 channels x 3 counters
|
||||||
LOG(logINFO) << "nPixelsX: " << nPixelsX;
|
LOG(logINFO) << "nPixelsX: " << nPixelsX;
|
||||||
imageSize = nPixelsX * nPixelsY * ((double)dr / 8.00);
|
imageSize = nPixelsX * nPixelsY * GetPixelDepth();
|
||||||
|
|
||||||
// 10g
|
// 10g
|
||||||
if (tgEnable) {
|
if (tengigaEnable) {
|
||||||
if (dr == 32 && n > 1) {
|
if (dynamicRange == 32 && ncounters > 1) {
|
||||||
packetsPerFrame = 2;
|
packetsPerFrame = 2;
|
||||||
} else {
|
} else {
|
||||||
packetsPerFrame = 1;
|
packetsPerFrame = 1;
|
||||||
@ -463,7 +411,7 @@ class Mythen3Data : public GeneralData {
|
|||||||
}
|
}
|
||||||
// 1g
|
// 1g
|
||||||
else {
|
else {
|
||||||
if (n == 3) {
|
if (ncounters == 3) {
|
||||||
dataSize = 768;
|
dataSize = 768;
|
||||||
} else {
|
} else {
|
||||||
dataSize = 1280;
|
dataSize = 1280;
|
||||||
@ -479,41 +427,25 @@ class Mythen3Data : public GeneralData {
|
|||||||
|
|
||||||
class Gotthard2Data : public GeneralData {
|
class Gotthard2Data : public GeneralData {
|
||||||
public:
|
public:
|
||||||
/** Constructor */
|
|
||||||
Gotthard2Data() {
|
Gotthard2Data() {
|
||||||
myDetectorType = slsDetectorDefs::GOTTHARD2;
|
myDetectorType = slsDetectorDefs::GOTTHARD2;
|
||||||
nPixelsX = 128 * 10;
|
nPixelsX = 128 * 10;
|
||||||
nPixelsY = 1;
|
nPixelsY = 1;
|
||||||
headerSizeinPacket = sizeof(slsDetectorDefs::sls_detector_header);
|
headerSizeinPacket = sizeof(slsDetectorDefs::sls_detector_header);
|
||||||
dataSize = 2560; // 1280 channels * 2 bytes
|
dataSize = 2560; // 1280 channels * 2 bytes
|
||||||
packetSize = headerSizeinPacket + dataSize;
|
|
||||||
packetsPerFrame = 1;
|
|
||||||
imageSize = dataSize * packetsPerFrame;
|
|
||||||
maxFramesPerFile = GOTTHARD2_MAX_FRAMES_PER_FILE;
|
maxFramesPerFile = GOTTHARD2_MAX_FRAMES_PER_FILE;
|
||||||
fifoBufferHeaderSize =
|
fifoBufferHeaderSize =
|
||||||
FIFO_HEADER_NUMBYTES + sizeof(slsDetectorDefs::sls_receiver_header);
|
FIFO_HEADER_NUMBYTES + sizeof(slsDetectorDefs::sls_receiver_header);
|
||||||
defaultFifoDepth = 50000;
|
defaultFifoDepth = 50000;
|
||||||
standardheader = true;
|
standardheader = true;
|
||||||
defaultUdpSocketBufferSize = (1000 * 1024 * 1024);
|
|
||||||
vetoDataSize = 160;
|
vetoDataSize = 160;
|
||||||
vetoImageSize = vetoDataSize * packetsPerFrame;
|
|
||||||
vetoHsize = 16;
|
vetoHsize = 16;
|
||||||
vetoPacketSize = vetoHsize + vetoDataSize;
|
UpdateImageSize();
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
|
||||||
* set number of interfaces
|
|
||||||
* @param n number of interfaces
|
|
||||||
*/
|
|
||||||
void SetNumberofInterfaces(const int n) {
|
void SetNumberofInterfaces(const int n) {
|
||||||
// 2 interfaces (+veto)
|
numUDPInterfaces = n;
|
||||||
if (n == 2) {
|
UpdateImageSize();
|
||||||
threadsPerReceiver = 2;
|
|
||||||
}
|
|
||||||
// 1 interface (data only)
|
|
||||||
else {
|
|
||||||
threadsPerReceiver = 1;
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -532,134 +464,158 @@ class Gotthard2Data : public GeneralData {
|
|||||||
bunchId = *reinterpret_cast<uint64_t *>(packetData + 8);
|
bunchId = *reinterpret_cast<uint64_t *>(packetData + 8);
|
||||||
packetNumber = 0;
|
packetNumber = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
private:
|
||||||
|
void UpdateImageSize() {
|
||||||
|
packetSize = headerSizeinPacket + dataSize;
|
||||||
|
imageSize = int(nPixelsX * nPixelsY * GetPixelDepth());
|
||||||
|
packetsPerFrame = imageSize / dataSize;
|
||||||
|
vetoPacketSize = vetoHsize + vetoDataSize;
|
||||||
|
vetoImageSize = vetoDataSize * packetsPerFrame;
|
||||||
|
defaultUdpSocketBufferSize = (1000 * 1024 * 1024) / numUDPInterfaces;
|
||||||
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
class ChipTestBoardData : public GeneralData {
|
class ChipTestBoardData : public GeneralData {
|
||||||
private:
|
private:
|
||||||
/** Number of digital channels */
|
|
||||||
const int NCHAN_DIGITAL = 64;
|
const int NCHAN_DIGITAL = 64;
|
||||||
/** Number of bytes per analog channel */
|
|
||||||
const int NUM_BYTES_PER_ANALOG_CHANNEL = 2;
|
const int NUM_BYTES_PER_ANALOG_CHANNEL = 2;
|
||||||
|
int nAnalogBytes = 0;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
/** Constructor */
|
/** Constructor */
|
||||||
ChipTestBoardData() {
|
ChipTestBoardData() {
|
||||||
myDetectorType = slsDetectorDefs::CHIPTESTBOARD;
|
myDetectorType = slsDetectorDefs::CHIPTESTBOARD;
|
||||||
nPixelsX = 36; // total number of channels
|
|
||||||
nPixelsY = 1; // number of samples
|
nPixelsY = 1; // number of samples
|
||||||
headerSizeinPacket = sizeof(slsDetectorDefs::sls_detector_header);
|
headerSizeinPacket = sizeof(slsDetectorDefs::sls_detector_header);
|
||||||
dataSize = UDP_PACKET_DATA_BYTES;
|
|
||||||
packetSize = headerSizeinPacket + dataSize;
|
|
||||||
// packetsPerFrame = 1;
|
|
||||||
imageSize = nPixelsX * nPixelsY * 2;
|
|
||||||
frameIndexMask = 0xFFFFFF; // 10g
|
frameIndexMask = 0xFFFFFF; // 10g
|
||||||
frameIndexOffset = 8; // 10g
|
frameIndexOffset = 8; // 10g
|
||||||
packetIndexMask = 0xFF; // 10g
|
packetIndexMask = 0xFF; // 10g
|
||||||
packetsPerFrame =
|
|
||||||
ceil((double)imageSize / (double)UDP_PACKET_DATA_BYTES);
|
|
||||||
maxFramesPerFile = CTB_MAX_FRAMES_PER_FILE;
|
maxFramesPerFile = CTB_MAX_FRAMES_PER_FILE;
|
||||||
fifoBufferHeaderSize =
|
fifoBufferHeaderSize =
|
||||||
FIFO_HEADER_NUMBYTES + sizeof(slsDetectorDefs::sls_receiver_header);
|
FIFO_HEADER_NUMBYTES + sizeof(slsDetectorDefs::sls_receiver_header);
|
||||||
defaultFifoDepth = 2500;
|
defaultFifoDepth = 2500;
|
||||||
standardheader = true;
|
standardheader = true;
|
||||||
|
UpdateImageSize();
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
public:
|
||||||
* Set databytes
|
int GetNumberOfAnalogDatabytes() { return nAnalogBytes; };
|
||||||
* @param a adc enable mask
|
|
||||||
* @param as analog number of samples
|
void SetNumberOfAnalogSamples(int n) {
|
||||||
* @param ds digital number of samples
|
nAnalogSamples = n;
|
||||||
* @param t tengiga enable
|
UpdateImageSize();
|
||||||
* @param f readout flags
|
};
|
||||||
* @returns analog data bytes
|
|
||||||
*/
|
void SetNumberOfDigitalSamples(int n) {
|
||||||
int setImageSize(uint32_t a, uint32_t as, uint32_t ds, bool t,
|
nDigitalSamples = n;
|
||||||
slsDetectorDefs::readoutMode f) {
|
UpdateImageSize();
|
||||||
int nachans = 0, ndchans = 0;
|
};
|
||||||
int adatabytes = 0, ddatabytes = 0;
|
|
||||||
|
void SetOneGigaAdcEnableMask(int n) {
|
||||||
|
adcEnableMaskOneGiga = n;
|
||||||
|
UpdateImageSize();
|
||||||
|
};
|
||||||
|
|
||||||
|
void SetTenGigaAdcEnableMask(int n) {
|
||||||
|
adcEnableMaskTenGiga = n;
|
||||||
|
UpdateImageSize();
|
||||||
|
};
|
||||||
|
|
||||||
|
void SetReadoutMode(slsDetectorDefs::readoutMode r) {
|
||||||
|
readoutType = r;
|
||||||
|
UpdateImageSize();
|
||||||
|
};
|
||||||
|
|
||||||
|
void SetTenGigaEnable(bool tg) {
|
||||||
|
tengigaEnable = tg;
|
||||||
|
UpdateImageSize();
|
||||||
|
};
|
||||||
|
|
||||||
|
private:
|
||||||
|
void UpdateImageSize() {
|
||||||
|
nAnalogBytes = 0;
|
||||||
|
int nDigitalBytes = 0;
|
||||||
|
int nAnalogChans = 0, nDigitalChans = 0;
|
||||||
|
|
||||||
// analog channels (normal, analog/digital readout)
|
// analog channels (normal, analog/digital readout)
|
||||||
if (f == slsDetectorDefs::ANALOG_ONLY ||
|
if (readoutType == slsDetectorDefs::ANALOG_ONLY ||
|
||||||
f == slsDetectorDefs::ANALOG_AND_DIGITAL) {
|
readoutType == slsDetectorDefs::ANALOG_AND_DIGITAL) {
|
||||||
nachans = __builtin_popcount(a);
|
uint32_t adcEnableMask =
|
||||||
|
(tengigaEnable ? adcEnableMaskTenGiga : adcEnableMaskOneGiga);
|
||||||
|
nAnalogChans = __builtin_popcount(adcEnableMask);
|
||||||
|
|
||||||
adatabytes = nachans * NUM_BYTES_PER_ANALOG_CHANNEL * as;
|
nAnalogBytes =
|
||||||
LOG(logDEBUG1) << " Number of Analog Channels:" << nachans
|
nAnalogChans * NUM_BYTES_PER_ANALOG_CHANNEL * nAnalogSamples;
|
||||||
<< " Databytes: " << adatabytes;
|
LOG(logDEBUG1) << " Number of Analog Channels:" << nAnalogChans
|
||||||
|
<< " Databytes: " << nAnalogBytes;
|
||||||
}
|
}
|
||||||
// digital channels
|
// digital channels
|
||||||
if (f == slsDetectorDefs::DIGITAL_ONLY ||
|
if (readoutType == slsDetectorDefs::DIGITAL_ONLY ||
|
||||||
f == slsDetectorDefs::ANALOG_AND_DIGITAL) {
|
readoutType == slsDetectorDefs::ANALOG_AND_DIGITAL) {
|
||||||
ndchans = NCHAN_DIGITAL;
|
nDigitalChans = NCHAN_DIGITAL;
|
||||||
ddatabytes = (sizeof(uint64_t) * ds);
|
nDigitalBytes = (sizeof(uint64_t) * nDigitalSamples);
|
||||||
LOG(logDEBUG1) << "Number of Digital Channels:" << ndchans
|
LOG(logDEBUG1) << "Number of Digital Channels:" << nDigitalChans
|
||||||
<< " Databytes: " << ddatabytes;
|
<< " Databytes: " << nDigitalBytes;
|
||||||
}
|
|
||||||
LOG(logDEBUG1) << "Total Number of Channels:" << nachans + ndchans
|
|
||||||
<< " Databytes: " << adatabytes + ddatabytes;
|
|
||||||
|
|
||||||
nPixelsX = nachans + ndchans;
|
|
||||||
nPixelsY = 1;
|
|
||||||
|
|
||||||
// 10G
|
|
||||||
if (t) {
|
|
||||||
dataSize = 8144;
|
|
||||||
}
|
|
||||||
// 1g udp (via fifo readout)
|
|
||||||
else {
|
|
||||||
dataSize = UDP_PACKET_DATA_BYTES;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
nPixelsX = nAnalogChans + nDigitalChans;
|
||||||
|
dataSize = tengigaEnable ? 8144 : UDP_PACKET_DATA_BYTES;
|
||||||
packetSize = headerSizeinPacket + dataSize;
|
packetSize = headerSizeinPacket + dataSize;
|
||||||
imageSize = adatabytes + ddatabytes;
|
imageSize = nAnalogBytes + nDigitalBytes;
|
||||||
packetsPerFrame = ceil((double)imageSize / (double)dataSize);
|
packetsPerFrame = ceil((double)imageSize / (double)dataSize);
|
||||||
|
|
||||||
return adatabytes;
|
LOG(logDEBUG1) << "Total Number of Channels:" << nPixelsX
|
||||||
}
|
<< " Databytes: " << imageSize;
|
||||||
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
class MoenchData : public GeneralData {
|
class MoenchData : public GeneralData {
|
||||||
|
|
||||||
private:
|
private:
|
||||||
/** Number of bytes per analog channel */
|
|
||||||
const int NUM_BYTES_PER_ANALOG_CHANNEL = 2;
|
const int NUM_BYTES_PER_ANALOG_CHANNEL = 2;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
/** Constructor */
|
|
||||||
MoenchData() {
|
MoenchData() {
|
||||||
myDetectorType = slsDetectorDefs::MOENCH;
|
myDetectorType = slsDetectorDefs::MOENCH;
|
||||||
nPixelsX = 32; // total number of channels
|
|
||||||
nPixelsY = 1; // number of samples
|
|
||||||
headerSizeinPacket = sizeof(slsDetectorDefs::sls_detector_header);
|
headerSizeinPacket = sizeof(slsDetectorDefs::sls_detector_header);
|
||||||
dataSize = UDP_PACKET_DATA_BYTES;
|
|
||||||
packetSize = headerSizeinPacket + dataSize;
|
|
||||||
// packetsPerFrame = 1;
|
|
||||||
imageSize = nPixelsX * nPixelsY * 2;
|
|
||||||
packetsPerFrame =
|
|
||||||
ceil((double)imageSize / (double)UDP_PACKET_DATA_BYTES);
|
|
||||||
frameIndexMask = 0xFFFFFF;
|
frameIndexMask = 0xFFFFFF;
|
||||||
maxFramesPerFile = MOENCH_MAX_FRAMES_PER_FILE;
|
maxFramesPerFile = MOENCH_MAX_FRAMES_PER_FILE;
|
||||||
fifoBufferHeaderSize =
|
fifoBufferHeaderSize =
|
||||||
FIFO_HEADER_NUMBYTES + sizeof(slsDetectorDefs::sls_receiver_header);
|
FIFO_HEADER_NUMBYTES + sizeof(slsDetectorDefs::sls_receiver_header);
|
||||||
defaultFifoDepth = 2500;
|
defaultFifoDepth = 2500;
|
||||||
standardheader = true;
|
standardheader = true;
|
||||||
|
UpdateImageSize();
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
void SetNumberOfAnalogSamples(int n) {
|
||||||
* Set databytes
|
nAnalogSamples = n;
|
||||||
* @param a adc enable mask
|
UpdateImageSize();
|
||||||
* @param as analog number of samples
|
};
|
||||||
* @param ds digital number of samples
|
|
||||||
* @param t tengiga enable
|
void SetOneGigaAdcEnableMask(int n) {
|
||||||
* @param f readout flags
|
adcEnableMaskOneGiga = n;
|
||||||
* @returns analog data bytes
|
UpdateImageSize();
|
||||||
*/
|
};
|
||||||
int setImageSize(uint32_t a, uint32_t as, uint32_t ds, bool t,
|
|
||||||
slsDetectorDefs::readoutMode f) {
|
void SetTenGigaAdcEnableMask(int n) {
|
||||||
|
adcEnableMaskTenGiga = n;
|
||||||
|
UpdateImageSize();
|
||||||
|
};
|
||||||
|
|
||||||
|
void SetTenGigaEnable(bool tg) {
|
||||||
|
tengigaEnable = tg;
|
||||||
|
UpdateImageSize();
|
||||||
|
};
|
||||||
|
|
||||||
|
private:
|
||||||
|
void UpdateImageSize() {
|
||||||
|
uint32_t adcEnableMask =
|
||||||
|
(tengigaEnable ? adcEnableMaskTenGiga : adcEnableMaskOneGiga);
|
||||||
|
|
||||||
// count number of channels in x, each adc has 25 channels each
|
// count number of channels in x, each adc has 25 channels each
|
||||||
int nchanTop = __builtin_popcount(a & 0xF0F0F0F0) * 25;
|
int nchanTop = __builtin_popcount(adcEnableMask & 0xF0F0F0F0) * 25;
|
||||||
int nchanBot = __builtin_popcount(a & 0x0F0F0F0F) * 25;
|
int nchanBot = __builtin_popcount(adcEnableMask & 0x0F0F0F0F) * 25;
|
||||||
nPixelsX = nchanTop > 0 ? nchanTop : nchanBot;
|
nPixelsX = nchanTop > 0 ? nchanTop : nchanBot;
|
||||||
|
|
||||||
// if both top and bottom adcs enabled, rows = 2
|
// if both top and bottom adcs enabled, rows = 2
|
||||||
@ -667,25 +623,15 @@ class MoenchData : public GeneralData {
|
|||||||
if (nchanTop > 0 && nchanBot > 0) {
|
if (nchanTop > 0 && nchanBot > 0) {
|
||||||
nrows = 2;
|
nrows = 2;
|
||||||
}
|
}
|
||||||
nPixelsY = as / 25 * nrows;
|
nPixelsY = nAnalogSamples / 25 * nrows;
|
||||||
LOG(logINFO) << "Number of Pixels: [" << nPixelsX << ", " << nPixelsY
|
LOG(logINFO) << "Number of Pixels: [" << nPixelsX << ", " << nPixelsY
|
||||||
<< "]";
|
<< "]";
|
||||||
|
|
||||||
// 10G
|
dataSize = tengigaEnable ? 8144 : UDP_PACKET_DATA_BYTES;
|
||||||
if (t) {
|
|
||||||
dataSize = 8144;
|
|
||||||
}
|
|
||||||
// 1g udp (via fifo readout)
|
|
||||||
else {
|
|
||||||
dataSize = UDP_PACKET_DATA_BYTES;
|
|
||||||
}
|
|
||||||
|
|
||||||
imageSize = nPixelsX * nPixelsY * NUM_BYTES_PER_ANALOG_CHANNEL;
|
|
||||||
packetSize = headerSizeinPacket + dataSize;
|
packetSize = headerSizeinPacket + dataSize;
|
||||||
|
imageSize = nPixelsX * nPixelsY * NUM_BYTES_PER_ANALOG_CHANNEL;
|
||||||
packetsPerFrame = ceil((double)imageSize / (double)dataSize);
|
packetsPerFrame = ceil((double)imageSize / (double)dataSize);
|
||||||
|
|
||||||
LOG(logDEBUG) << "Databytes: " << imageSize;
|
LOG(logDEBUG) << "Databytes: " << imageSize;
|
||||||
|
};
|
||||||
return imageSize;
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
@ -64,7 +64,7 @@ void Implementation::SetThreadPriorities() {
|
|||||||
|
|
||||||
void Implementation::SetupFifoStructure() {
|
void Implementation::SetupFifoStructure() {
|
||||||
fifo.clear();
|
fifo.clear();
|
||||||
for (int i = 0; i < numThreads; ++i) {
|
for (int i = 0; i < numUDPInterfaces; ++i) {
|
||||||
uint32_t datasize = generalData->imageSize;
|
uint32_t datasize = generalData->imageSize;
|
||||||
// veto data size
|
// veto data size
|
||||||
if (detType == GOTTHARD2 && i != 0) {
|
if (detType == GOTTHARD2 && i != 0) {
|
||||||
@ -97,7 +97,7 @@ void Implementation::SetupFifoStructure() {
|
|||||||
(double)(1024 * 1024)
|
(double)(1024 * 1024)
|
||||||
<< " MB";
|
<< " MB";
|
||||||
}
|
}
|
||||||
LOG(logINFO) << numThreads << " Fifo structure(s) reconstructed";
|
LOG(logINFO) << numUDPInterfaces << " Fifo structure(s) reconstructed";
|
||||||
}
|
}
|
||||||
|
|
||||||
/**************************************************
|
/**************************************************
|
||||||
@ -152,7 +152,7 @@ void Implementation::setDetectorType(const detectorType d) {
|
|||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
numThreads = generalData->threadsPerReceiver;
|
numUDPInterfaces = generalData->numUDPInterfaces;
|
||||||
fifoDepth = generalData->defaultFifoDepth;
|
fifoDepth = generalData->defaultFifoDepth;
|
||||||
udpSocketBufferSize = generalData->defaultUdpSocketBufferSize;
|
udpSocketBufferSize = generalData->defaultUdpSocketBufferSize;
|
||||||
framesPerFile = generalData->maxFramesPerFile;
|
framesPerFile = generalData->maxFramesPerFile;
|
||||||
@ -161,7 +161,7 @@ void Implementation::setDetectorType(const detectorType d) {
|
|||||||
SetupFifoStructure();
|
SetupFifoStructure();
|
||||||
|
|
||||||
// create threads
|
// create threads
|
||||||
for (int i = 0; i < numThreads; ++i) {
|
for (int i = 0; i < numUDPInterfaces; ++i) {
|
||||||
|
|
||||||
try {
|
try {
|
||||||
auto fifo_ptr = fifo[i].get();
|
auto fifo_ptr = fifo[i].get();
|
||||||
@ -170,6 +170,10 @@ void Implementation::setDetectorType(const detectorType d) {
|
|||||||
&udpSocketBufferSize, &actualUDPSocketBufferSize,
|
&udpSocketBufferSize, &actualUDPSocketBufferSize,
|
||||||
&framesPerFile, &frameDiscardMode, &activated,
|
&framesPerFile, &frameDiscardMode, &activated,
|
||||||
&detectorDataStream[i], &silentMode));
|
&detectorDataStream[i], &silentMode));
|
||||||
|
int ctbAnalogDataBytes = 0;
|
||||||
|
if (detType == CHIPTESTBOARD) {
|
||||||
|
ctbAnalogDataBytes = generalData->GetNumberOfAnalogDatabytes();
|
||||||
|
}
|
||||||
dataProcessor.push_back(sls::make_unique<DataProcessor>(
|
dataProcessor.push_back(sls::make_unique<DataProcessor>(
|
||||||
i, detType, fifo_ptr, &activated, &dataStreamEnable,
|
i, detType, fifo_ptr, &activated, &dataStreamEnable,
|
||||||
&streamingFrequency, &streamingTimerInMs, &streamingStartFnum,
|
&streamingFrequency, &streamingTimerInMs, &streamingStartFnum,
|
||||||
@ -194,35 +198,35 @@ void Implementation::setDetectorType(const detectorType d) {
|
|||||||
LOG(logDEBUG) << " Detector type set to " << sls::ToString(d);
|
LOG(logDEBUG) << " Detector type set to " << sls::ToString(d);
|
||||||
}
|
}
|
||||||
|
|
||||||
int *Implementation::getDetectorSize() const { return (int *)numMods; }
|
slsDetectorDefs::xy Implementation::getDetectorSize() const {
|
||||||
|
return numModules;
|
||||||
|
}
|
||||||
|
|
||||||
|
slsDetectorDefs::xy Implementation::GetPortGeometry() {
|
||||||
|
xy portGeometry{1, 1};
|
||||||
|
if (detType == EIGER)
|
||||||
|
portGeometry.x = numUDPInterfaces;
|
||||||
|
else // (jungfrau and gotthard2)
|
||||||
|
portGeometry.y = numUDPInterfaces;
|
||||||
|
return portGeometry;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Implementation::setDetectorSize(const slsDetectorDefs::xy size) {
|
||||||
|
xy portGeometry = GetPortGeometry();
|
||||||
|
|
||||||
void Implementation::setDetectorSize(const int *size) {
|
|
||||||
std::string log_message = "Detector Size (ports): (";
|
std::string log_message = "Detector Size (ports): (";
|
||||||
for (int i = 0; i < MAX_DIMENSIONS; ++i) {
|
numModules.x = portGeometry.x * size.x;
|
||||||
// x dir (colums) each udp port
|
numModules.y = portGeometry.y * size.y;
|
||||||
if (detType == EIGER && i == X)
|
xy nm{numModules.x, numModules.y};
|
||||||
numMods[i] = size[i] * 2;
|
|
||||||
// y dir (rows) each udp port
|
|
||||||
else if (numUDPInterfaces == 2 && i == Y)
|
|
||||||
numMods[i] = size[i] * 2;
|
|
||||||
else
|
|
||||||
numMods[i] = size[i];
|
|
||||||
log_message += std::to_string(numMods[i]);
|
|
||||||
if (i < MAX_DIMENSIONS - 1)
|
|
||||||
log_message += ", ";
|
|
||||||
}
|
|
||||||
log_message += ")";
|
|
||||||
|
|
||||||
int nm[2] = {numMods[0], numMods[1]};
|
|
||||||
if (quadEnable) {
|
if (quadEnable) {
|
||||||
nm[0] = 1;
|
nm.x = 1;
|
||||||
nm[1] = 2;
|
nm.y = 2;
|
||||||
}
|
}
|
||||||
for (const auto &it : dataStreamer) {
|
for (const auto &it : dataStreamer) {
|
||||||
it->SetNumberofModules(nm);
|
it->SetNumberofModules(nm);
|
||||||
}
|
}
|
||||||
|
|
||||||
LOG(logINFO) << log_message;
|
LOG(logINFO) << "Detector Size (ports): " << sls::ToString(numModules);
|
||||||
}
|
}
|
||||||
|
|
||||||
int Implementation::getModulePositionId() const { return modulePos; }
|
int Implementation::getModulePositionId() const { return modulePos; }
|
||||||
@ -232,19 +236,18 @@ void Implementation::setModulePositionId(const int id) {
|
|||||||
LOG(logINFO) << "Module Position Id:" << modulePos;
|
LOG(logINFO) << "Module Position Id:" << modulePos;
|
||||||
|
|
||||||
// update zmq port
|
// update zmq port
|
||||||
streamingPort =
|
xy portGeometry = GetPortGeometry();
|
||||||
DEFAULT_ZMQ_RX_PORTNO + (modulePos * (detType == EIGER ? 2 : 1));
|
streamingPort = DEFAULT_ZMQ_RX_PORTNO + modulePos * portGeometry.x;
|
||||||
|
|
||||||
for (const auto &it : dataProcessor)
|
for (const auto &it : dataProcessor)
|
||||||
it->SetupFileWriter(fileWriteEnable, masterFileWriteEnable,
|
it->SetupFileWriter(fileWriteEnable, masterFileWriteEnable,
|
||||||
fileFormatType, modulePos, &hdf5Lib);
|
fileFormatType, modulePos, &hdf5Lib);
|
||||||
assert(numMods[1] != 0);
|
assert(numModules.y != 0);
|
||||||
for (unsigned int i = 0; i < listener.size(); ++i) {
|
for (unsigned int i = 0; i < listener.size(); ++i) {
|
||||||
uint16_t row = 0, col = 0;
|
uint16_t row = 0, col = 0;
|
||||||
row =
|
row = (modulePos % numModules.y) * portGeometry.y;
|
||||||
(modulePos % numMods[1]) * ((numUDPInterfaces == 2) ? 2 : 1); // row
|
col = (modulePos / numModules.y) * portGeometry.x + i;
|
||||||
col = (modulePos / numMods[1]) * ((detType == EIGER) ? 2 : 1) +
|
|
||||||
i; // col for horiz. udp ports
|
|
||||||
listener[i]->SetHardCodedPosition(row, col);
|
listener[i]->SetHardCodedPosition(row, col);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -308,7 +311,7 @@ std::array<pid_t, NUM_RX_THREAD_IDS> Implementation::getThreadIds() const {
|
|||||||
} else {
|
} else {
|
||||||
retval[id++] = 0;
|
retval[id++] = 0;
|
||||||
}
|
}
|
||||||
if (numThreads == 2) {
|
if (numUDPInterfaces == 2) {
|
||||||
retval[id++] = listener[1]->GetThreadId();
|
retval[id++] = listener[1]->GetThreadId();
|
||||||
retval[id++] = dataProcessor[1]->GetThreadId();
|
retval[id++] = dataProcessor[1]->GetThreadId();
|
||||||
if (dataStreamEnable) {
|
if (dataStreamEnable) {
|
||||||
@ -474,8 +477,8 @@ double Implementation::getProgress() const {
|
|||||||
}
|
}
|
||||||
|
|
||||||
std::vector<int64_t> Implementation::getNumMissingPackets() const {
|
std::vector<int64_t> Implementation::getNumMissingPackets() const {
|
||||||
std::vector<int64_t> mp(numThreads);
|
std::vector<int64_t> mp(numUDPInterfaces);
|
||||||
for (int i = 0; i < numThreads; ++i) {
|
for (int i = 0; i < numUDPInterfaces; ++i) {
|
||||||
int np = generalData->packetsPerFrame;
|
int np = generalData->packetsPerFrame;
|
||||||
uint64_t totnp = np;
|
uint64_t totnp = np;
|
||||||
// ReadNRows
|
// ReadNRows
|
||||||
@ -562,11 +565,12 @@ void Implementation::stopReceiver() {
|
|||||||
if (modulePos == 0) {
|
if (modulePos == 0) {
|
||||||
// more than 1 file, create virtual file
|
// more than 1 file, create virtual file
|
||||||
if (dataProcessor[0]->GetFilesInAcquisition() > 1 ||
|
if (dataProcessor[0]->GetFilesInAcquisition() > 1 ||
|
||||||
(numMods[X] * numMods[Y]) > 1) {
|
(numModules.x * numModules.y) > 1) {
|
||||||
dataProcessor[0]->CreateVirtualFile(
|
dataProcessor[0]->CreateVirtualFile(
|
||||||
filePath, fileName, fileIndex, overwriteEnable, silentMode,
|
filePath, fileName, fileIndex, overwriteEnable, silentMode,
|
||||||
modulePos, numThreads, framesPerFile, numberOfTotalFrames,
|
modulePos, numUDPInterfaces, framesPerFile,
|
||||||
dynamicRange, numMods[X], numMods[Y], &hdf5Lib);
|
numberOfTotalFrames, dynamicRange, numModules.x,
|
||||||
|
numModules.y, &hdf5Lib);
|
||||||
}
|
}
|
||||||
// link file in master
|
// link file in master
|
||||||
dataProcessor[0]->LinkDataInMasterFile(silentMode);
|
dataProcessor[0]->LinkDataInMasterFile(silentMode);
|
||||||
@ -598,7 +602,7 @@ void Implementation::stopReceiver() {
|
|||||||
auto mp = getNumMissingPackets();
|
auto mp = getNumMissingPackets();
|
||||||
// print summary
|
// print summary
|
||||||
uint64_t tot = 0;
|
uint64_t tot = 0;
|
||||||
for (int i = 0; i < numThreads; i++) {
|
for (int i = 0; i < numUDPInterfaces; i++) {
|
||||||
int nf = dataProcessor[i]->GetNumCompleteFramesCaught();
|
int nf = dataProcessor[i]->GetNumCompleteFramesCaught();
|
||||||
tot += nf;
|
tot += nf;
|
||||||
std::string mpMessage = std::to_string(mp[i]);
|
std::string mpMessage = std::to_string(mp[i]);
|
||||||
@ -629,7 +633,7 @@ void Implementation::stopReceiver() {
|
|||||||
// callback
|
// callback
|
||||||
if (acquisitionFinishedCallBack) {
|
if (acquisitionFinishedCallBack) {
|
||||||
try {
|
try {
|
||||||
acquisitionFinishedCallBack((tot / numThreads),
|
acquisitionFinishedCallBack((tot / numUDPInterfaces),
|
||||||
pAcquisitionFinished);
|
pAcquisitionFinished);
|
||||||
} catch (const std::exception &e) {
|
} catch (const std::exception &e) {
|
||||||
// change status
|
// change status
|
||||||
@ -810,7 +814,7 @@ void Implementation::SetupWriter() {
|
|||||||
for (unsigned int i = 0; i < dataProcessor.size(); ++i) {
|
for (unsigned int i = 0; i < dataProcessor.size(); ++i) {
|
||||||
dataProcessor[i]->CreateFirstFiles(
|
dataProcessor[i]->CreateFirstFiles(
|
||||||
masterAttributes.get(), filePath, fileName, fileIndex,
|
masterAttributes.get(), filePath, fileName, fileIndex,
|
||||||
overwriteEnable, silentMode, modulePos, numThreads,
|
overwriteEnable, silentMode, modulePos, numUDPInterfaces,
|
||||||
udpPortNum[i], framesPerFile, numberOfTotalFrames, dynamicRange,
|
udpPortNum[i], framesPerFile, numberOfTotalFrames, dynamicRange,
|
||||||
detectorDataStream[i]);
|
detectorDataStream[i]);
|
||||||
}
|
}
|
||||||
@ -849,16 +853,19 @@ int Implementation::getNumberofUDPInterfaces() const {
|
|||||||
return numUDPInterfaces;
|
return numUDPInterfaces;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// not Eiger
|
||||||
void Implementation::setNumberofUDPInterfaces(const int n) {
|
void Implementation::setNumberofUDPInterfaces(const int n) {
|
||||||
|
if (detType == EIGER) {
|
||||||
|
throw sls::RuntimeError(
|
||||||
|
"Cannot set number of UDP interfaces for Eiger");
|
||||||
|
}
|
||||||
|
|
||||||
if (numUDPInterfaces != n) {
|
if (numUDPInterfaces != n) {
|
||||||
|
|
||||||
// reduce number of detectors in y dir (rows) if it had 2 interfaces
|
// reduce number of detectors to size with 1 interface
|
||||||
// before
|
xy portGeometry = GetPortGeometry();
|
||||||
if (numUDPInterfaces == 2)
|
numModules.x /= portGeometry.x;
|
||||||
numMods[Y] /= 2;
|
numModules.y /= portGeometry.y;
|
||||||
|
|
||||||
numUDPInterfaces = n;
|
|
||||||
|
|
||||||
// clear all threads and fifos
|
// clear all threads and fifos
|
||||||
listener.clear();
|
listener.clear();
|
||||||
@ -868,14 +875,14 @@ void Implementation::setNumberofUDPInterfaces(const int n) {
|
|||||||
|
|
||||||
// set local variables
|
// set local variables
|
||||||
generalData->SetNumberofInterfaces(n);
|
generalData->SetNumberofInterfaces(n);
|
||||||
numThreads = generalData->threadsPerReceiver;
|
numUDPInterfaces = n;
|
||||||
udpSocketBufferSize = generalData->defaultUdpSocketBufferSize;
|
|
||||||
|
|
||||||
// fifo
|
// fifo
|
||||||
|
udpSocketBufferSize = generalData->defaultUdpSocketBufferSize;
|
||||||
SetupFifoStructure();
|
SetupFifoStructure();
|
||||||
|
|
||||||
// create threads
|
// create threads
|
||||||
for (int i = 0; i < numThreads; ++i) {
|
for (int i = 0; i < numUDPInterfaces; ++i) {
|
||||||
// listener and dataprocessor threads
|
// listener and dataprocessor threads
|
||||||
try {
|
try {
|
||||||
auto fifo_ptr = fifo[i].get();
|
auto fifo_ptr = fifo[i].get();
|
||||||
@ -886,6 +893,11 @@ void Implementation::setNumberofUDPInterfaces(const int n) {
|
|||||||
&detectorDataStream[i], &silentMode));
|
&detectorDataStream[i], &silentMode));
|
||||||
listener[i]->SetGeneralData(generalData);
|
listener[i]->SetGeneralData(generalData);
|
||||||
|
|
||||||
|
int ctbAnalogDataBytes = 0;
|
||||||
|
if (detType == CHIPTESTBOARD) {
|
||||||
|
ctbAnalogDataBytes =
|
||||||
|
generalData->GetNumberOfAnalogDatabytes();
|
||||||
|
}
|
||||||
dataProcessor.push_back(sls::make_unique<DataProcessor>(
|
dataProcessor.push_back(sls::make_unique<DataProcessor>(
|
||||||
i, detType, fifo_ptr, &activated, &dataStreamEnable,
|
i, detType, fifo_ptr, &activated, &dataStreamEnable,
|
||||||
&streamingFrequency, &streamingTimerInMs,
|
&streamingFrequency, &streamingTimerInMs,
|
||||||
@ -903,18 +915,18 @@ void Implementation::setNumberofUDPInterfaces(const int n) {
|
|||||||
if (dataStreamEnable) {
|
if (dataStreamEnable) {
|
||||||
try {
|
try {
|
||||||
bool flip = flipRows;
|
bool flip = flipRows;
|
||||||
int nm[2] = {numMods[0], numMods[1]};
|
xy nm{numModules.x, numModules.y};
|
||||||
if (quadEnable) {
|
if (quadEnable) {
|
||||||
flip = (i == 1 ? true : false);
|
flip = (i == 1 ? true : false);
|
||||||
nm[0] = 1;
|
nm.x = 1;
|
||||||
nm[1] = 2;
|
nm.y = 2;
|
||||||
}
|
}
|
||||||
dataStreamer.push_back(sls::make_unique<DataStreamer>(
|
dataStreamer.push_back(sls::make_unique<DataStreamer>(
|
||||||
i, fifo[i].get(), &dynamicRange, &roi, &fileIndex, flip,
|
i, fifo[i].get(), &dynamicRange, &roi, &fileIndex, flip,
|
||||||
(int *)nm, &quadEnable, &numberOfTotalFrames));
|
nm, &quadEnable, &numberOfTotalFrames));
|
||||||
dataStreamer[i]->SetGeneralData(generalData);
|
dataStreamer[i]->SetGeneralData(generalData);
|
||||||
dataStreamer[i]->CreateZmqSockets(
|
dataStreamer[i]->CreateZmqSockets(
|
||||||
&numThreads, streamingPort, streamingSrcIP,
|
&numUDPInterfaces, streamingPort, streamingSrcIP,
|
||||||
streamingHwm);
|
streamingHwm);
|
||||||
dataStreamer[i]->SetAdditionalJsonHeader(
|
dataStreamer[i]->SetAdditionalJsonHeader(
|
||||||
additionalJsonHeader);
|
additionalJsonHeader);
|
||||||
@ -934,7 +946,7 @@ void Implementation::setNumberofUDPInterfaces(const int n) {
|
|||||||
SetThreadPriorities();
|
SetThreadPriorities();
|
||||||
|
|
||||||
// update (from 1 to 2 interface) & also for printout
|
// update (from 1 to 2 interface) & also for printout
|
||||||
setDetectorSize(numMods);
|
setDetectorSize(numModules);
|
||||||
// update row and column in dataprocessor
|
// update row and column in dataprocessor
|
||||||
setModulePositionId(modulePos);
|
setModulePositionId(modulePos);
|
||||||
|
|
||||||
@ -994,7 +1006,8 @@ void Implementation::setUDPSocketBufferSize(const int s) {
|
|||||||
// testing default setup at startup, argument is 0 to use default values
|
// testing default setup at startup, argument is 0 to use default values
|
||||||
int size = (s == 0) ? udpSocketBufferSize : s;
|
int size = (s == 0) ? udpSocketBufferSize : s;
|
||||||
size_t listSize = listener.size();
|
size_t listSize = listener.size();
|
||||||
if (detType == JUNGFRAU && (int)listSize != numUDPInterfaces) {
|
if ((detType == JUNGFRAU || detType == GOTTHARD2) &&
|
||||||
|
(int)listSize != numUDPInterfaces) {
|
||||||
throw sls::RuntimeError(
|
throw sls::RuntimeError(
|
||||||
"Number of Interfaces " + std::to_string(numUDPInterfaces) +
|
"Number of Interfaces " + std::to_string(numUDPInterfaces) +
|
||||||
" do not match listener size " + std::to_string(listSize));
|
" do not match listener size " + std::to_string(listSize));
|
||||||
@ -1029,21 +1042,21 @@ void Implementation::setDataStreamEnable(const bool enable) {
|
|||||||
dataStreamer.clear();
|
dataStreamer.clear();
|
||||||
|
|
||||||
if (enable) {
|
if (enable) {
|
||||||
for (int i = 0; i < numThreads; ++i) {
|
for (int i = 0; i < numUDPInterfaces; ++i) {
|
||||||
try {
|
try {
|
||||||
bool flip = flipRows;
|
bool flip = flipRows;
|
||||||
int nm[2] = {numMods[0], numMods[1]};
|
xy nm{numModules.x, numModules.y};
|
||||||
if (quadEnable) {
|
if (quadEnable) {
|
||||||
flip = (i == 1 ? true : false);
|
flip = (i == 1 ? true : false);
|
||||||
nm[0] = 1;
|
nm.x = 1;
|
||||||
nm[1] = 2;
|
nm.y = 2;
|
||||||
}
|
}
|
||||||
dataStreamer.push_back(sls::make_unique<DataStreamer>(
|
dataStreamer.push_back(sls::make_unique<DataStreamer>(
|
||||||
i, fifo[i].get(), &dynamicRange, &roi, &fileIndex, flip,
|
i, fifo[i].get(), &dynamicRange, &roi, &fileIndex, flip,
|
||||||
(int *)nm, &quadEnable, &numberOfTotalFrames));
|
nm, &quadEnable, &numberOfTotalFrames));
|
||||||
dataStreamer[i]->SetGeneralData(generalData);
|
dataStreamer[i]->SetGeneralData(generalData);
|
||||||
dataStreamer[i]->CreateZmqSockets(
|
dataStreamer[i]->CreateZmqSockets(
|
||||||
&numThreads, streamingPort, streamingSrcIP,
|
&numUDPInterfaces, streamingPort, streamingSrcIP,
|
||||||
streamingHwm);
|
streamingHwm);
|
||||||
dataStreamer[i]->SetAdditionalJsonHeader(
|
dataStreamer[i]->SetAdditionalJsonHeader(
|
||||||
additionalJsonHeader);
|
additionalJsonHeader);
|
||||||
@ -1348,11 +1361,7 @@ void Implementation::setNumberofAnalogSamples(const uint32_t i) {
|
|||||||
if (numberOfAnalogSamples != i) {
|
if (numberOfAnalogSamples != i) {
|
||||||
numberOfAnalogSamples = i;
|
numberOfAnalogSamples = i;
|
||||||
|
|
||||||
ctbAnalogDataBytes = generalData->setImageSize(
|
generalData->SetNumberOfAnalogSamples(i);
|
||||||
tengigaEnable ? adcEnableMaskTenGiga : adcEnableMaskOneGiga,
|
|
||||||
numberOfAnalogSamples, numberOfDigitalSamples, tengigaEnable,
|
|
||||||
readoutType);
|
|
||||||
|
|
||||||
SetupFifoStructure();
|
SetupFifoStructure();
|
||||||
}
|
}
|
||||||
LOG(logINFO) << "Number of Analog Samples: " << numberOfAnalogSamples;
|
LOG(logINFO) << "Number of Analog Samples: " << numberOfAnalogSamples;
|
||||||
@ -1367,11 +1376,7 @@ void Implementation::setNumberofDigitalSamples(const uint32_t i) {
|
|||||||
if (numberOfDigitalSamples != i) {
|
if (numberOfDigitalSamples != i) {
|
||||||
numberOfDigitalSamples = i;
|
numberOfDigitalSamples = i;
|
||||||
|
|
||||||
ctbAnalogDataBytes = generalData->setImageSize(
|
generalData->SetNumberOfDigitalSamples(i);
|
||||||
tengigaEnable ? adcEnableMaskTenGiga : adcEnableMaskOneGiga,
|
|
||||||
numberOfAnalogSamples, numberOfDigitalSamples, tengigaEnable,
|
|
||||||
readoutType);
|
|
||||||
|
|
||||||
SetupFifoStructure();
|
SetupFifoStructure();
|
||||||
}
|
}
|
||||||
LOG(logINFO) << "Number of Digital Samples: " << numberOfDigitalSamples;
|
LOG(logINFO) << "Number of Digital Samples: " << numberOfDigitalSamples;
|
||||||
@ -1389,8 +1394,7 @@ void Implementation::setCounterMask(const uint32_t i) {
|
|||||||
". Expected 1-3.");
|
". Expected 1-3.");
|
||||||
}
|
}
|
||||||
counterMask = i;
|
counterMask = i;
|
||||||
generalData->SetNumberofCounters(ncounters, dynamicRange,
|
generalData->SetNumberofCounters(ncounters);
|
||||||
tengigaEnable);
|
|
||||||
SetupFifoStructure();
|
SetupFifoStructure();
|
||||||
}
|
}
|
||||||
LOG(logINFO) << "Counter mask: " << sls::ToStringHex(counterMask);
|
LOG(logINFO) << "Counter mask: " << sls::ToStringHex(counterMask);
|
||||||
@ -1405,14 +1409,7 @@ void Implementation::setDynamicRange(const uint32_t i) {
|
|||||||
dynamicRange = i;
|
dynamicRange = i;
|
||||||
|
|
||||||
if (detType == EIGER || detType == MYTHEN3) {
|
if (detType == EIGER || detType == MYTHEN3) {
|
||||||
|
generalData->SetDynamicRange(i);
|
||||||
if (detType == EIGER) {
|
|
||||||
generalData->SetDynamicRange(i, tengigaEnable);
|
|
||||||
} else {
|
|
||||||
int ncounters = __builtin_popcount(counterMask);
|
|
||||||
generalData->SetNumberofCounters(ncounters, i, tengigaEnable);
|
|
||||||
}
|
|
||||||
|
|
||||||
fifoDepth = generalData->defaultFifoDepth;
|
fifoDepth = generalData->defaultFifoDepth;
|
||||||
SetupFifoStructure();
|
SetupFifoStructure();
|
||||||
}
|
}
|
||||||
@ -1442,25 +1439,8 @@ bool Implementation::getTenGigaEnable() const { return tengigaEnable; }
|
|||||||
void Implementation::setTenGigaEnable(const bool b) {
|
void Implementation::setTenGigaEnable(const bool b) {
|
||||||
if (tengigaEnable != b) {
|
if (tengigaEnable != b) {
|
||||||
tengigaEnable = b;
|
tengigaEnable = b;
|
||||||
int ncounters = __builtin_popcount(counterMask);
|
|
||||||
// side effects
|
generalData->SetTenGigaEnable(b);
|
||||||
switch (detType) {
|
|
||||||
case EIGER:
|
|
||||||
generalData->SetTenGigaEnable(b, dynamicRange);
|
|
||||||
break;
|
|
||||||
case MYTHEN3:
|
|
||||||
generalData->SetNumberofCounters(ncounters, dynamicRange, b);
|
|
||||||
break;
|
|
||||||
case MOENCH:
|
|
||||||
case CHIPTESTBOARD:
|
|
||||||
ctbAnalogDataBytes = generalData->setImageSize(
|
|
||||||
tengigaEnable ? adcEnableMaskTenGiga : adcEnableMaskOneGiga,
|
|
||||||
numberOfAnalogSamples, numberOfDigitalSamples, tengigaEnable,
|
|
||||||
readoutType);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
SetupFifoStructure();
|
SetupFifoStructure();
|
||||||
}
|
}
|
||||||
LOG(logINFO) << "Ten Giga: " << (tengigaEnable ? "enabled" : "disabled");
|
LOG(logINFO) << "Ten Giga: " << (tengigaEnable ? "enabled" : "disabled");
|
||||||
@ -1494,14 +1474,15 @@ void Implementation::setQuad(const bool b) {
|
|||||||
quadEnable = b;
|
quadEnable = b;
|
||||||
|
|
||||||
if (!quadEnable) {
|
if (!quadEnable) {
|
||||||
|
xy nm{numModules.x, numModules.y};
|
||||||
for (const auto &it : dataStreamer) {
|
for (const auto &it : dataStreamer) {
|
||||||
it->SetNumberofModules(numMods);
|
it->SetNumberofModules(nm);
|
||||||
it->SetFlipRows(flipRows);
|
it->SetFlipRows(flipRows);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
int size[2] = {1, 2};
|
xy nm{1, 2};
|
||||||
for (const auto &it : dataStreamer) {
|
for (const auto &it : dataStreamer) {
|
||||||
it->SetNumberofModules(size);
|
it->SetNumberofModules(nm);
|
||||||
}
|
}
|
||||||
if (dataStreamer.size() == 2) {
|
if (dataStreamer.size() == 2) {
|
||||||
dataStreamer[0]->SetFlipRows(false);
|
dataStreamer[0]->SetFlipRows(false);
|
||||||
@ -1563,11 +1544,7 @@ void Implementation::setReadoutMode(const readoutMode f) {
|
|||||||
if (readoutType != f) {
|
if (readoutType != f) {
|
||||||
readoutType = f;
|
readoutType = f;
|
||||||
|
|
||||||
// side effects
|
generalData->SetReadoutMode(f);
|
||||||
ctbAnalogDataBytes = generalData->setImageSize(
|
|
||||||
tengigaEnable ? adcEnableMaskTenGiga : adcEnableMaskOneGiga,
|
|
||||||
numberOfAnalogSamples, numberOfDigitalSamples, tengigaEnable,
|
|
||||||
readoutType);
|
|
||||||
SetupFifoStructure();
|
SetupFifoStructure();
|
||||||
}
|
}
|
||||||
LOG(logINFO) << "Readout Mode: " << sls::ToString(f);
|
LOG(logINFO) << "Readout Mode: " << sls::ToString(f);
|
||||||
@ -1581,11 +1558,8 @@ uint32_t Implementation::getADCEnableMask() const {
|
|||||||
void Implementation::setADCEnableMask(uint32_t mask) {
|
void Implementation::setADCEnableMask(uint32_t mask) {
|
||||||
if (adcEnableMaskOneGiga != mask) {
|
if (adcEnableMaskOneGiga != mask) {
|
||||||
adcEnableMaskOneGiga = mask;
|
adcEnableMaskOneGiga = mask;
|
||||||
ctbAnalogDataBytes = generalData->setImageSize(
|
|
||||||
tengigaEnable ? adcEnableMaskTenGiga : adcEnableMaskOneGiga,
|
|
||||||
numberOfAnalogSamples, numberOfDigitalSamples, tengigaEnable,
|
|
||||||
readoutType);
|
|
||||||
|
|
||||||
|
generalData->SetOneGigaAdcEnableMask(mask);
|
||||||
SetupFifoStructure();
|
SetupFifoStructure();
|
||||||
}
|
}
|
||||||
LOG(logINFO) << "ADC Enable Mask for 1Gb mode: 0x" << std::hex
|
LOG(logINFO) << "ADC Enable Mask for 1Gb mode: 0x" << std::hex
|
||||||
@ -1601,11 +1575,7 @@ void Implementation::setTenGigaADCEnableMask(uint32_t mask) {
|
|||||||
if (adcEnableMaskTenGiga != mask) {
|
if (adcEnableMaskTenGiga != mask) {
|
||||||
adcEnableMaskTenGiga = mask;
|
adcEnableMaskTenGiga = mask;
|
||||||
|
|
||||||
ctbAnalogDataBytes = generalData->setImageSize(
|
generalData->SetTenGigaAdcEnableMask(mask);
|
||||||
tengigaEnable ? adcEnableMaskTenGiga : adcEnableMaskOneGiga,
|
|
||||||
numberOfAnalogSamples, numberOfDigitalSamples, tengigaEnable,
|
|
||||||
readoutType);
|
|
||||||
|
|
||||||
SetupFifoStructure();
|
SetupFifoStructure();
|
||||||
}
|
}
|
||||||
LOG(logINFO) << "ADC Enable Mask for 10Gb mode: 0x" << std::hex
|
LOG(logINFO) << "ADC Enable Mask for 10Gb mode: 0x" << std::hex
|
||||||
|
@ -33,8 +33,8 @@ class Implementation : private virtual slsDetectorDefs {
|
|||||||
* ************************************************/
|
* ************************************************/
|
||||||
|
|
||||||
void setDetectorType(const detectorType d);
|
void setDetectorType(const detectorType d);
|
||||||
int *getDetectorSize() const;
|
xy getDetectorSize() const;
|
||||||
void setDetectorSize(const int *size);
|
void setDetectorSize(const xy size);
|
||||||
int getModulePositionId() const;
|
int getModulePositionId() const;
|
||||||
void setModulePositionId(const int id);
|
void setModulePositionId(const int id);
|
||||||
std::string getDetectorHostname() const;
|
std::string getDetectorHostname() const;
|
||||||
@ -266,6 +266,7 @@ class Implementation : private virtual slsDetectorDefs {
|
|||||||
void SetThreadPriorities();
|
void SetThreadPriorities();
|
||||||
void SetupFifoStructure();
|
void SetupFifoStructure();
|
||||||
|
|
||||||
|
xy GetPortGeometry();
|
||||||
void ResetParametersforNewAcquisition();
|
void ResetParametersforNewAcquisition();
|
||||||
void CreateUDPSockets();
|
void CreateUDPSockets();
|
||||||
void SetupWriter();
|
void SetupWriter();
|
||||||
@ -278,9 +279,8 @@ class Implementation : private virtual slsDetectorDefs {
|
|||||||
* ************************************************/
|
* ************************************************/
|
||||||
|
|
||||||
// config parameters
|
// config parameters
|
||||||
int numThreads{1};
|
|
||||||
detectorType detType{GENERIC};
|
detectorType detType{GENERIC};
|
||||||
int numMods[MAX_DIMENSIONS] = {0, 0};
|
xy numModules{1, 1};
|
||||||
int modulePos{0};
|
int modulePos{0};
|
||||||
std::string detHostname;
|
std::string detHostname;
|
||||||
bool silentMode{false};
|
bool silentMode{false};
|
||||||
@ -361,7 +361,6 @@ class Implementation : private virtual slsDetectorDefs {
|
|||||||
uint32_t adcEnableMaskTenGiga{BIT32_MASK};
|
uint32_t adcEnableMaskTenGiga{BIT32_MASK};
|
||||||
std::vector<int> ctbDbitList;
|
std::vector<int> ctbDbitList;
|
||||||
int ctbDbitOffset{0};
|
int ctbDbitOffset{0};
|
||||||
int ctbAnalogDataBytes{0};
|
|
||||||
|
|
||||||
// callbacks
|
// callbacks
|
||||||
int (*startAcquisitionCallBack)(std::string, std::string, uint64_t,
|
int (*startAcquisitionCallBack)(std::string, std::string, uint64_t,
|
||||||
|
@ -5,11 +5,11 @@
|
|||||||
#define APILIB 0x211125
|
#define APILIB 0x211125
|
||||||
#define APIRECEIVER 0x211124
|
#define APIRECEIVER 0x211124
|
||||||
#define APIGUI 0x211124
|
#define APIGUI 0x211124
|
||||||
|
|
||||||
|
#define APIEIGER 0x220124
|
||||||
#define APICTB 0x220124
|
#define APICTB 0x220124
|
||||||
#define APIGOTTHARD 0x220124
|
#define APIGOTTHARD 0x220124
|
||||||
#define APIGOTTHARD2 0x220124
|
#define APIGOTTHARD2 0x220124
|
||||||
#define APIJUNGFRAU 0x220124
|
#define APIJUNGFRAU 0x220124
|
||||||
#define APIMYTHEN3 0x220124
|
#define APIMYTHEN3 0x220124
|
||||||
#define APIMOENCH 0x220124
|
#define APIMOENCH 0x220124
|
||||||
|
|
||||||
#define APIEIGER 0x220124
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user