diff --git a/examples/gotthard2_veto_file.txt b/examples/gotthard2_veto_file.txt new file mode 100644 index 000000000..6d02e7e40 --- /dev/null +++ b/examples/gotthard2_veto_file.txt @@ -0,0 +1,129 @@ +#Gain index ADU value (12 bit) +1 3655 +1 3655 +1 3655 +1 3655 +1 3655 +1 3655 +1 3655 +1 3655 +1 3655 +1 3655 +1 3655 +1 3655 +1 3655 +1 3655 +1 3655 +1 3655 +1 3655 +1 3655 +1 3655 +1 3655 +1 3655 +1 3655 +1 3655 +1 3655 +1 3655 +1 3655 +1 3655 +1 3655 +1 3655 +1 3655 +1 3655 +1 3655 +1 3655 +1 3655 +1 3655 +1 3655 +1 3655 +1 3655 +1 3655 +1 3655 +1 3655 +1 3655 +1 3655 +1 3655 +1 3655 +1 3655 +1 3655 +1 3655 +1 3655 +1 3655 +1 3655 +1 3655 +1 3655 +1 3655 +1 3655 +1 3655 +1 3655 +1 3655 +1 3655 +1 3655 +1 3655 +1 3655 +1 3655 +1 3655 +1 3655 +1 3655 +1 3655 +1 3655 +1 3655 +1 3655 +1 3655 +1 3655 +1 3655 +1 3655 +1 3655 +1 3655 +1 3655 +1 3655 +1 3655 +1 3655 +1 3655 +1 3655 +1 3655 +1 3655 +1 3655 +1 3655 +1 3655 +1 3655 +1 3655 +1 3655 +1 3655 +1 3655 +1 3655 +1 3655 +1 3655 +1 3655 +1 3655 +1 3655 +1 3655 +1 3655 +1 3655 +1 3655 +1 3655 +1 3655 +1 3655 +1 3655 +1 3655 +1 3655 +1 3655 +1 3655 +1 3655 +1 3655 +1 3655 +1 3655 +1 3655 +1 3655 +1 3655 +1 3655 +1 3655 +1 3655 +1 3655 +1 3655 +1 3655 +1 3655 +1 3655 +1 3655 +1 3655 +1 3655 diff --git a/examples/gotthard2_veto_photon.txt b/examples/gotthard2_veto_photon.txt index b75b2002b..acfa6ace4 100644 --- a/examples/gotthard2_veto_photon.txt +++ b/examples/gotthard2_veto_photon.txt @@ -1,132 +1,129 @@ -#G1 Energy #G2 Energy -300 7000 - -#G0 pedestal G1 pedestal G2 pedestal G0 gain G1 gain G2 gain (for every channel) ADU -100 100 100 10 1 0.1 -100 100 100 10 1 0.1 -100 100 100 10 1 0.1 -100 100 100 10 1 0.1 -100 100 100 10 1 0.1 -100 100 100 10 1 0.1 -100 100 100 10 1 0.1 -100 100 100 10 1 0.1 -100 100 100 10 1 0.1 -100 100 100 10 1 0.1 -100 100 100 10 1 0.1 -100 100 100 10 1 0.1 -100 100 100 10 1 0.1 -100 100 100 10 1 0.1 -100 100 100 10 1 0.1 -100 100 100 10 1 0.1 -100 100 100 10 1 0.1 -100 100 100 10 1 0.1 -100 100 100 10 1 0.1 -100 100 100 10 1 0.1 -100 100 100 10 1 0.1 -100 100 100 10 1 0.1 -100 100 100 10 1 0.1 -100 100 100 10 1 0.1 -100 100 100 10 1 0.1 -100 100 100 10 1 0.1 -100 100 100 10 1 0.1 -100 100 100 10 1 0.1 -100 100 100 10 1 0.1 -100 100 100 10 1 0.1 -100 100 100 10 1 0.1 -100 100 100 10 1 0.1 -100 100 100 10 1 0.1 -100 100 100 10 1 0.1 -100 100 100 10 1 0.1 -100 100 100 10 1 0.1 -100 100 100 10 1 0.1 -100 100 100 10 1 0.1 -100 100 100 10 1 0.1 -100 100 100 10 1 0.1 -100 100 100 10 1 0.1 -100 100 100 10 1 0.1 -100 100 100 10 1 0.1 -100 100 100 10 1 0.1 -100 100 100 10 1 0.1 -100 100 100 10 1 0.1 -100 100 100 10 1 0.1 -100 100 100 10 1 0.1 -100 100 100 10 1 0.1 -100 100 100 10 1 0.1 -100 100 100 10 1 0.1 -100 100 100 10 1 0.1 -100 100 100 10 1 0.1 -100 100 100 10 1 0.1 -100 100 100 10 1 0.1 -100 100 100 10 1 0.1 -100 100 100 10 1 0.1 -100 100 100 10 1 0.1 -100 100 100 10 1 0.1 -100 100 100 10 1 0.1 -100 100 100 10 1 0.1 -100 100 100 10 1 0.1 -100 100 100 10 1 0.1 -100 100 100 10 1 0.1 -100 100 100 10 1 0.1 -100 100 100 10 1 0.1 -100 100 100 10 1 0.1 -100 100 100 10 1 0.1 -100 100 100 10 1 0.1 -100 100 100 10 1 0.1 -100 100 100 10 1 0.1 -100 100 100 10 1 0.1 -100 100 100 10 1 0.1 -100 100 100 10 1 0.1 -100 100 100 10 1 0.1 -100 100 100 10 1 0.1 -100 100 100 10 1 0.1 -100 100 100 10 1 0.1 -100 100 100 10 1 0.1 -100 100 100 10 1 0.1 -100 100 100 10 1 0.1 -100 100 100 10 1 0.1 -100 100 100 10 1 0.1 -100 100 100 10 1 0.1 -100 100 100 10 1 0.1 -100 100 100 10 1 0.1 -100 100 100 10 1 0.1 -100 100 100 10 1 0.1 -100 100 100 10 1 0.1 -100 100 100 10 1 0.1 -100 100 100 10 1 0.1 -100 100 100 10 1 0.1 -100 100 100 10 1 0.1 -100 100 100 10 1 0.1 -100 100 100 10 1 0.1 -100 100 100 10 1 0.1 -100 100 100 10 1 0.1 -100 100 100 10 1 0.1 -100 100 100 10 1 0.1 -100 100 100 10 1 0.1 -100 100 100 10 1 0.1 -100 100 100 10 1 0.1 -100 100 100 10 1 0.1 -100 100 100 10 1 0.1 -100 100 100 10 1 0.1 -100 100 100 10 1 0.1 -100 100 100 10 1 0.1 -100 100 100 10 1 0.1 -100 100 100 10 1 0.1 -100 100 100 10 1 0.1 -100 100 100 10 1 0.1 -100 100 100 10 1 0.1 -100 100 100 10 1 0.1 -100 100 100 10 1 0.1 -100 100 100 10 1 0.1 -100 100 100 10 1 0.1 -100 100 100 10 1 0.1 -100 100 100 10 1 0.1 -100 100 100 10 1 0.1 -100 100 100 10 1 0.1 -100 100 100 10 1 0.1 -100 100 100 10 1 0.1 -100 100 100 10 1 0.1 -100 100 100 10 1 0.1 -100 100 100 10 1 0.1 -100 100 100 10 1 0.1 -100 100 100 10 1 0.1 -100 100 100 10 1 0.1 +#G0 pedestal G1 pedestal G2 pedestal G0 gain G1 gain G2 gain #G1 Energy #G2 Energy +100 100 100 10 1 0.1 300 7000 +100 100 100 10 1 0.1 300 7000 +100 100 100 10 1 0.1 300 7000 +100 100 100 10 1 0.1 300 7000 +100 100 100 10 1 0.1 300 7000 +100 100 100 10 1 0.1 300 7000 +100 100 100 10 1 0.1 300 7000 +100 100 100 10 1 0.1 300 7000 +100 100 100 10 1 0.1 300 7000 +100 100 100 10 1 0.1 300 7000 +100 100 100 10 1 0.1 300 7000 +100 100 100 10 1 0.1 300 7000 +100 100 100 10 1 0.1 300 7000 +100 100 100 10 1 0.1 300 7000 +100 100 100 10 1 0.1 300 7000 +100 100 100 10 1 0.1 300 7000 +100 100 100 10 1 0.1 300 7000 +100 100 100 10 1 0.1 300 7000 +100 100 100 10 1 0.1 300 7000 +100 100 100 10 1 0.1 300 7000 +100 100 100 10 1 0.1 300 7000 +100 100 100 10 1 0.1 300 7000 +100 100 100 10 1 0.1 300 7000 +100 100 100 10 1 0.1 300 7000 +100 100 100 10 1 0.1 300 7000 +100 100 100 10 1 0.1 300 7000 +100 100 100 10 1 0.1 300 7000 +100 100 100 10 1 0.1 300 7000 +100 100 100 10 1 0.1 300 7000 +100 100 100 10 1 0.1 300 7000 +100 100 100 10 1 0.1 300 7000 +100 100 100 10 1 0.1 300 7000 +100 100 100 10 1 0.1 300 7000 +100 100 100 10 1 0.1 300 7000 +100 100 100 10 1 0.1 300 7000 +100 100 100 10 1 0.1 300 7000 +100 100 100 10 1 0.1 300 7000 +100 100 100 10 1 0.1 300 7000 +100 100 100 10 1 0.1 300 7000 +100 100 100 10 1 0.1 300 7000 +100 100 100 10 1 0.1 300 7000 +100 100 100 10 1 0.1 300 7000 +100 100 100 10 1 0.1 300 7000 +100 100 100 10 1 0.1 300 7000 +100 100 100 10 1 0.1 300 7000 +100 100 100 10 1 0.1 300 7000 +100 100 100 10 1 0.1 300 7000 +100 100 100 10 1 0.1 300 7000 +100 100 100 10 1 0.1 300 7000 +100 100 100 10 1 0.1 300 7000 +100 100 100 10 1 0.1 300 7000 +100 100 100 10 1 0.1 300 7000 +100 100 100 10 1 0.1 300 7000 +100 100 100 10 1 0.1 300 7000 +100 100 100 10 1 0.1 300 7000 +100 100 100 10 1 0.1 300 7000 +100 100 100 10 1 0.1 300 7000 +100 100 100 10 1 0.1 300 7000 +100 100 100 10 1 0.1 300 7000 +100 100 100 10 1 0.1 300 7000 +100 100 100 10 1 0.1 300 7000 +100 100 100 10 1 0.1 300 7000 +100 100 100 10 1 0.1 300 7000 +100 100 100 10 1 0.1 300 7000 +100 100 100 10 1 0.1 300 7000 +100 100 100 10 1 0.1 300 7000 +100 100 100 10 1 0.1 300 7000 +100 100 100 10 1 0.1 300 7000 +100 100 100 10 1 0.1 300 7000 +100 100 100 10 1 0.1 300 7000 +100 100 100 10 1 0.1 300 7000 +100 100 100 10 1 0.1 300 7000 +100 100 100 10 1 0.1 300 7000 +100 100 100 10 1 0.1 300 7000 +100 100 100 10 1 0.1 300 7000 +100 100 100 10 1 0.1 300 7000 +100 100 100 10 1 0.1 300 7000 +100 100 100 10 1 0.1 300 7000 +100 100 100 10 1 0.1 300 7000 +100 100 100 10 1 0.1 300 7000 +100 100 100 10 1 0.1 300 7000 +100 100 100 10 1 0.1 300 7000 +100 100 100 10 1 0.1 300 7000 +100 100 100 10 1 0.1 300 7000 +100 100 100 10 1 0.1 300 7000 +100 100 100 10 1 0.1 300 7000 +100 100 100 10 1 0.1 300 7000 +100 100 100 10 1 0.1 300 7000 +100 100 100 10 1 0.1 300 7000 +100 100 100 10 1 0.1 300 7000 +100 100 100 10 1 0.1 300 7000 +100 100 100 10 1 0.1 300 7000 +100 100 100 10 1 0.1 300 7000 +100 100 100 10 1 0.1 300 7000 +100 100 100 10 1 0.1 300 7000 +100 100 100 10 1 0.1 300 7000 +100 100 100 10 1 0.1 300 7000 +100 100 100 10 1 0.1 300 7000 +100 100 100 10 1 0.1 300 7000 +100 100 100 10 1 0.1 300 7000 +100 100 100 10 1 0.1 300 7000 +100 100 100 10 1 0.1 300 7000 +100 100 100 10 1 0.1 300 7000 +100 100 100 10 1 0.1 300 7000 +100 100 100 10 1 0.1 300 7000 +100 100 100 10 1 0.1 300 7000 +100 100 100 10 1 0.1 300 7000 +100 100 100 10 1 0.1 300 7000 +100 100 100 10 1 0.1 300 7000 +100 100 100 10 1 0.1 300 7000 +100 100 100 10 1 0.1 300 7000 +100 100 100 10 1 0.1 300 7000 +100 100 100 10 1 0.1 300 7000 +100 100 100 10 1 0.1 300 7000 +100 100 100 10 1 0.1 300 7000 +100 100 100 10 1 0.1 300 7000 +100 100 100 10 1 0.1 300 7000 +100 100 100 10 1 0.1 300 7000 +100 100 100 10 1 0.1 300 7000 +100 100 100 10 1 0.1 300 7000 +100 100 100 10 1 0.1 300 7000 +100 100 100 10 1 0.1 300 7000 +100 100 100 10 1 0.1 300 7000 +100 100 100 10 1 0.1 300 7000 +100 100 100 10 1 0.1 300 7000 +100 100 100 10 1 0.1 300 7000 +100 100 100 10 1 0.1 300 7000 +100 100 100 10 1 0.1 300 7000 diff --git a/slsDetectorServers/ctbDetectorServer/bin/ctbDetectorServer_developer b/slsDetectorServers/ctbDetectorServer/bin/ctbDetectorServer_developer index 191a400d7..97eca3195 100755 Binary files a/slsDetectorServers/ctbDetectorServer/bin/ctbDetectorServer_developer and b/slsDetectorServers/ctbDetectorServer/bin/ctbDetectorServer_developer differ diff --git a/slsDetectorServers/eigerDetectorServer/bin/eigerDetectorServer_developer b/slsDetectorServers/eigerDetectorServer/bin/eigerDetectorServer_developer index d90f8d32a..6fdf65f13 100755 Binary files a/slsDetectorServers/eigerDetectorServer/bin/eigerDetectorServer_developer and b/slsDetectorServers/eigerDetectorServer/bin/eigerDetectorServer_developer differ diff --git a/slsDetectorServers/gotthard2DetectorServer/bin/gotthard2DetectorServer_developer b/slsDetectorServers/gotthard2DetectorServer/bin/gotthard2DetectorServer_developer index 67a125f58..a137905e7 100755 Binary files a/slsDetectorServers/gotthard2DetectorServer/bin/gotthard2DetectorServer_developer and b/slsDetectorServers/gotthard2DetectorServer/bin/gotthard2DetectorServer_developer differ diff --git a/slsDetectorServers/gotthard2DetectorServer/slsDetectorFunctionList.c b/slsDetectorServers/gotthard2DetectorServer/slsDetectorFunctionList.c index 4ebbea6d1..847793600 100644 --- a/slsDetectorServers/gotthard2DetectorServer/slsDetectorFunctionList.c +++ b/slsDetectorServers/gotthard2DetectorServer/slsDetectorFunctionList.c @@ -50,6 +50,7 @@ int onChipdacValues[ONCHIP_NDAC][NCHIP] = {}; int injectedChannelsOffset = 0; int injectedChannelsIncrement = 0; int vetoReference[NCHIP][NCHAN]; +int vetoGainIndices[NCHIP][NCHAN]; uint8_t adcConfiguration[NCHIP][NADC]; int burstMode = BURST_INTERNAL; int64_t numTriggersReg = 1; @@ -373,25 +374,16 @@ void setupDetector() { burstPeriodReg = 0; filter = 0; cdsGain = 0; - for (int i = 0; i < NUM_CLOCKS; ++i) { - clkPhase[i] = 0; - } - for (int i = 0; i < NDAC; ++i) { - dacValues[i] = 0; - } + memset(clkPhase, 0, sizeof(clkPhase)); + memset(dacValues, 0, sizeof(dacValues)); for (int i = 0; i < ONCHIP_NDAC; ++i) { for (int j = 0; j < NCHIP; ++j) { onChipdacValues[i][j] = -1; } } - for (int i = 0; i < NCHIP; ++i) { - for (int j = 0; j < NCHAN; ++j) { - vetoReference[i][j] = 0; - } - for (int j = 0; j < NADC; ++j) { - adcConfiguration[i][j] = 0; - } - } + memset(vetoReference, 0, sizeof(vetoReference)); + memset(vetoGainIndices, 0, sizeof(vetoGainIndices)); + memset(adcConfiguration, 0, sizeof(adcConfiguration)); #ifdef VIRTUAL sharedMemory_setStatus(IDLE); #endif @@ -1786,49 +1778,21 @@ void getInjectedChannels(int *offset, int *increment) { int setVetoReference(int gainIndex, int value) { LOG(logINFO, ("Setting veto reference [chip:-1, G%d, value:0x%x]\n", gainIndex, value)); - int vals[NCHAN]; - memset(vals, 0, sizeof(vals)); + int values[NCHAN]; + int gainIndices[NCHAN]; for (int ich = 0; ich < NCHAN; ++ich) { - vals[ich] = value; + values[ich] = value; + gainIndices[ich] = gainIndex; } - return setVetoPhoton(-1, gainIndex, vals); + return configureASICVetoReference(-1, gainIndices, values); } -int setVetoPhoton(int chipIndex, int gainIndex, int *values) { - LOG(logINFO, - ("Setting veto photon [chip:%d, G%d]\n", chipIndex, gainIndex)); - - // add gain bits - int gainValue = 0; - switch (gainIndex) { - case 0: - gainValue = ASIC_G0_VAL; - break; - case 1: - gainValue = ASIC_G1_VAL; - break; - case 2: - gainValue = ASIC_G2_VAL; - break; - default: - LOG(logERROR, ("Unknown gain index %d\n", gainIndex)); - return FAIL; - } - LOG(logDEBUG2, ("Adding gain bits\n")); - for (int i = 0; i < NCHAN; ++i) { - values[i] |= gainValue; - LOG(logDEBUG2, ("Value %d: 0x%x\n", i, values[i])); - } - - return configureASICVetoReference(chipIndex, values); +int setVetoPhoton(int chipIndex, int *gainIndices, int *values) { + return configureASICVetoReference(chipIndex, gainIndices, values); } -int configureASICVetoReference(int chipIndex, int *values) { - const int lenDataBitsPerchannel = ASIC_GAIN_MAX_BITS + ADU_MAX_BITS; // 14 - const int lenBits = lenDataBitsPerchannel * NCHAN; // 1792 - const int padding = 4; // due to address (4) to make it byte aligned - const int lenTotalBits = padding + lenBits + ASIC_ADDR_MAX_BITS; // 1800 - const int len = lenTotalBits / 8; // 225 +int configureASICVetoReference(int chipIndex, int *gainIndices, int *values) { + LOG(logINFO, ("Setting veto photon/file/reference [chip:%d]\n", chipIndex)); // reversing the values sent to the chip int revValues[NCHAN] = {}; @@ -1836,6 +1800,34 @@ int configureASICVetoReference(int chipIndex, int *values) { revValues[i] = values[NCHAN - 1 - i]; } + // correct gain bits and integrate into revValues + for (int i = 0; i < NCHAN; ++i) { + int gainValue = 0; + switch (gainIndices[i]) { + case 0: + gainValue = ASIC_G0_VAL; + break; + case 1: + gainValue = ASIC_G1_VAL; + break; + case 2: + gainValue = ASIC_G2_VAL; + break; + default: + LOG(logERROR, + ("Unknown gain index %d for channel %d\n", gainIndices[i], i)); + return FAIL; + } + revValues[i] |= gainValue; + LOG(logDEBUG2, ("Values[%d]: 0x%x\n", i, revValues[i])); + } + + const int lenDataBitsPerchannel = ASIC_GAIN_MAX_BITS + ADU_MAX_BITS; // 14 + const int lenBits = lenDataBitsPerchannel * NCHAN; // 1792 + const int padding = 4; // due to address (4) to make it byte aligned + const int lenTotalBits = padding + lenBits + ASIC_ADDR_MAX_BITS; // 1800 + const int len = lenTotalBits / 8; // 225 + // assign each bit into 4 + 1792 into byte array uint8_t commandBytes[lenTotalBits]; memset(commandBytes, 0, sizeof(commandBytes)); @@ -1873,6 +1865,7 @@ int configureASICVetoReference(int chipIndex, int *values) { for (int ichan = 0; ichan < NCHAN; ++ichan) { for (int ichip = 0; ichip < NCHIP; ++ichip) { vetoReference[ichip][ichan] = values[ichan]; + vetoGainIndices[ichip][ichan] = gainIndices[ichan]; } } } @@ -1880,17 +1873,19 @@ int configureASICVetoReference(int chipIndex, int *values) { // specific chip else { for (int ichan = 0; ichan < NCHAN; ++ichan) { - vetoReference[chipIndex][chipIndex] = values[ichan]; - ; + vetoReference[chipIndex][ichan] = values[ichan]; + vetoGainIndices[chipIndex][ichan] = gainIndices[ichan]; } } return OK; } -int getVetoPhoton(int chipIndex, int *retvals) { +int getVetoPhoton(int chipIndex, int *retvals, int *gainRetvals) { if (chipIndex == -1) { + // if chipindex is -1, check that all values and gain indices are same for (int i = 0; i < NCHAN; ++i) { int val = vetoReference[0][i]; + int gval = vetoGainIndices[0][i]; for (int j = 1; j < NCHIP; ++j) { if (vetoReference[j][i] != val) { LOG(logERROR, @@ -1900,6 +1895,14 @@ int getVetoPhoton(int chipIndex, int *retvals) { chipIndex, j, i, vetoReference[j][i], i, val)); return FAIL; } + if (vetoGainIndices[j][i] != gval) { + LOG(logERROR, + ("Get vet photon fail for chipIndex:%d. Different " + "gain indices between [nchip:%d, nchan:%d, gain " + "index:%d] and [nchip:0, nchan:%d, gain index:%d]\n", + chipIndex, j, i, vetoGainIndices[j][i], i, gval)); + return FAIL; + } } } chipIndex = 0; @@ -1907,35 +1910,12 @@ int getVetoPhoton(int chipIndex, int *retvals) { memcpy((char *)retvals, ((char *)vetoReference) + NCHAN * chipIndex * sizeof(int), sizeof(int) * NCHAN); + memcpy((char *)gainRetvals, + ((char *)vetoGainIndices) + NCHAN * chipIndex * sizeof(int), + sizeof(int) * NCHAN); return OK; } -int setVetoFile(int chipIndex, int *gainIndices, int *values) { - LOG(logINFO, ("Setting veto file [chip:%d]\n", chipIndex)); - - // correct gain bits and integrate into values - for (int i = 0; i < NCHAN; ++i) { - switch (gainIndices[i]) { - case 0: - gainIndices[i] = ASIC_G0_VAL; - break; - case 1: - gainIndices[i] = ASIC_G1_VAL; - break; - case 2: - gainIndices[i] = ASIC_G2_VAL; - break; - default: - LOG(logERROR, - ("Unknown gain index %d for channel %d\n", gainIndices[i], i)); - return FAIL; - } - values[i] |= gainIndices[i]; - LOG(logDEBUG2, ("Values[%d]: 0x%x\n", i, values[i])); - } - return configureASICVetoReference(chipIndex, values); -} - int setADCConfiguration(int chipIndex, int adcIndex, int value) { LOG(logINFO, ("Configuring ADC [chipIndex:%d, adcIndex:%d, value:0x%x]\n", chipIndex, adcIndex, value)); diff --git a/slsDetectorServers/gotthardDetectorServer/bin/gotthardDetectorServer_developer b/slsDetectorServers/gotthardDetectorServer/bin/gotthardDetectorServer_developer index 0e39bf69c..ad450f1b7 100755 Binary files a/slsDetectorServers/gotthardDetectorServer/bin/gotthardDetectorServer_developer and b/slsDetectorServers/gotthardDetectorServer/bin/gotthardDetectorServer_developer differ diff --git a/slsDetectorServers/jungfrauDetectorServer/bin/jungfrauDetectorServer_developer b/slsDetectorServers/jungfrauDetectorServer/bin/jungfrauDetectorServer_developer index 4a2f8c5a7..3a5765d5e 100755 Binary files a/slsDetectorServers/jungfrauDetectorServer/bin/jungfrauDetectorServer_developer and b/slsDetectorServers/jungfrauDetectorServer/bin/jungfrauDetectorServer_developer differ diff --git a/slsDetectorServers/moenchDetectorServer/bin/moenchDetectorServer_developer b/slsDetectorServers/moenchDetectorServer/bin/moenchDetectorServer_developer index 9e6828a5f..e2e5f6918 100755 Binary files a/slsDetectorServers/moenchDetectorServer/bin/moenchDetectorServer_developer and b/slsDetectorServers/moenchDetectorServer/bin/moenchDetectorServer_developer differ diff --git a/slsDetectorServers/mythen3DetectorServer/bin/mythen3DetectorServer_developer b/slsDetectorServers/mythen3DetectorServer/bin/mythen3DetectorServer_developer index ce42d4731..d840f9de0 100755 Binary files a/slsDetectorServers/mythen3DetectorServer/bin/mythen3DetectorServer_developer and b/slsDetectorServers/mythen3DetectorServer/bin/mythen3DetectorServer_developer differ diff --git a/slsDetectorServers/slsDetectorServer/include/slsDetectorFunctionList.h b/slsDetectorServers/slsDetectorServer/include/slsDetectorFunctionList.h index c9953263b..e38c5f486 100644 --- a/slsDetectorServers/slsDetectorServer/include/slsDetectorFunctionList.h +++ b/slsDetectorServers/slsDetectorServer/include/slsDetectorFunctionList.h @@ -504,10 +504,9 @@ int getClockDivider(enum CLKINDEX ind); int setInjectChannel(int offset, int increment); void getInjectedChannels(int *offset, int *increment); int setVetoReference(int gainIndex, int value); -int setVetoPhoton(int chipIndex, int gainIndex, int *values); -int configureASICVetoReference(int chipIndex, int *values); -int getVetoPhoton(int chipIndex, int *retvals); -int setVetoFile(int chipIndex, int *gainIndices, int *values); +int setVetoPhoton(int chipIndex, int *gainIndices, int *values); +int configureASICVetoReference(int chipIndex, int *gainIndices, int *values); +int getVetoPhoton(int chipIndex, int *retvals, int *gainRetvals); int setADCConfiguration(int chipIndex, int adcIndex, int value); int getADCConfiguration(int chipIndex, int adcIndex); int setBurstModeinFPGA(enum burstMode value); diff --git a/slsDetectorServers/slsDetectorServer/include/slsDetectorServer_funcs.h b/slsDetectorServers/slsDetectorServer/include/slsDetectorServer_funcs.h index 98ce7e87e..15b0fe1a0 100644 --- a/slsDetectorServers/slsDetectorServer/include/slsDetectorServer_funcs.h +++ b/slsDetectorServers/slsDetectorServer/include/slsDetectorServer_funcs.h @@ -233,7 +233,6 @@ int get_cds_gain(int); int set_cds_gain(int); int get_filter(int); int set_filter(int); -int set_veto_file(int); int get_adc_config(int); int set_adc_config(int); int get_bad_channels(int); diff --git a/slsDetectorServers/slsDetectorServer/src/slsDetectorServer_funcs.c b/slsDetectorServers/slsDetectorServer/src/slsDetectorServer_funcs.c index b160b9f8b..69e647f2a 100644 --- a/slsDetectorServers/slsDetectorServer/src/slsDetectorServer_funcs.c +++ b/slsDetectorServers/slsDetectorServer/src/slsDetectorServer_funcs.c @@ -350,7 +350,6 @@ void function_table() { flist[F_SET_CDS_GAIN] = &set_cds_gain; flist[F_GET_FILTER] = &get_filter; flist[F_SET_FILTER] = &set_filter; - flist[F_SET_VETO_FILE] = &set_veto_file; flist[F_GET_ADC_CONFIGURATION] = &get_adc_config; flist[F_SET_ADC_CONFIGURATION] = &set_adc_config; flist[F_GET_BAD_CHANNELS] = &get_bad_channels; @@ -6329,44 +6328,52 @@ int get_inject_channel(int file_des) { int set_veto_photon(int file_des) { ret = OK; memset(mess, 0, sizeof(mess)); - int args[3] = {-1, -1, -1}; + int args[2] = {-1, -1}; if (receiveData(file_des, args, sizeof(args), INT32) < 0) return printSocketReadError(); - int values[args[2]]; - memset(values, 0, sizeof(values)); + const int chipIndex = args[0]; + const int numChannels = args[1]; + + int gainIndices[numChannels]; + if (receiveData(file_des, gainIndices, sizeof(gainIndices), INT32) < 0) + return printSocketReadError(); + + int values[numChannels]; if (receiveData(file_des, values, sizeof(values), INT32) < 0) return printSocketReadError(); - LOG(logINFO, ("Setting Veto Photon: [chipIndex:%d, G%d, nch:%d]\n", args[0], - args[1], args[2])); + + LOG(logINFO, ("Setting Veto Photon: [chipIndex:%d, nch:%d]\n", chipIndex, + numChannels)); #ifndef GOTTHARD2D functionNotImplemented(); #else // only set if (Server_VerifyLock() == OK) { - int chipIndex = args[0]; - int gainIndex = args[1]; - int numChannels = args[2]; - if (chipIndex < -1 || chipIndex >= NCHIP) { - ret = FAIL; - sprintf(mess, "Could not set veto photon. Invalid chip index %d\n", - chipIndex); - LOG(logERROR, (mess)); - } else if (gainIndex < 0 || gainIndex > 2) { - ret = FAIL; - sprintf(mess, "Could not set veto photon. Invalid gain index %d\n", - gainIndex); - LOG(logERROR, (mess)); - } else if (numChannels != NCHAN) { + if (numChannels != NCHAN) { ret = FAIL; sprintf(mess, "Could not set veto photon. Invalid number of channels %d. " "Expected %d\n", numChannels, NCHAN); LOG(logERROR, (mess)); + } else if (chipIndex < -1 || chipIndex >= NCHIP) { + ret = FAIL; + sprintf(mess, "Could not set veto photon. Invalid chip index %d\n", + chipIndex); + LOG(logERROR, (mess)); } else { for (int i = 0; i < NCHAN; ++i) { + if (gainIndices[i] < 0 || gainIndices[i] > 2) { + ret = FAIL; + sprintf(mess, + "Could not set veto photon. Invalid gain index %d " + "for channel %d.\n", + gainIndices[i], i); + LOG(logERROR, (mess)); + break; + } if (values[i] > ADU_MAX_VAL) { ret = FAIL; sprintf(mess, @@ -6378,7 +6385,7 @@ int set_veto_photon(int file_des) { } } if (ret == OK) { - ret = setVetoPhoton(chipIndex, gainIndex, values); + ret = setVetoPhoton(chipIndex, gainIndices, values); if (ret == FAIL) { sprintf(mess, "Could not set veto photon for chip index %d\n", @@ -6398,6 +6405,8 @@ int get_veto_photon(int file_des) { int arg = -1; int retvals[NCHAN]; memset(retvals, 0, sizeof(retvals)); + int gainRetvals[NCHAN]; + memset(gainRetvals, 0, sizeof(gainRetvals)); if (receiveData(file_des, &arg, sizeof(arg), INT32) < 0) return printSocketReadError(); @@ -6414,14 +6423,16 @@ int get_veto_photon(int file_des) { chipIndex); LOG(logERROR, (mess)); } else { - ret = getVetoPhoton(chipIndex, retvals); + ret = getVetoPhoton(chipIndex, retvals, gainRetvals); if (ret == FAIL) { - strcpy(mess, "Could not get veto photon for chipIndex -1. Not the " - "same for all chips.\n"); + strcpy(mess, + "Could not get veto photon for chipIndex -1. Not the " + "same for all chips. Select specific chip index instead.\n"); LOG(logERROR, (mess)); } else { for (int i = 0; i < NCHAN; ++i) { - LOG(logDEBUG1, ("%d:0x%x\n", i, retvals[i])); + LOG(logDEBUG1, + ("%d:[%d, %d]\n", i, retvals[i], gainRetvals[i])); } } } @@ -6430,6 +6441,7 @@ int get_veto_photon(int file_des) { if (ret != FAIL) { int nch = NCHAN; sendData(file_des, &nch, sizeof(nch), INT32); + sendData(file_des, gainRetvals, sizeof(gainRetvals), INT32); sendData(file_des, retvals, sizeof(retvals), INT32); } return ret; @@ -7763,78 +7775,6 @@ int set_filter(int file_des) { return Server_SendResult(file_des, INT32, NULL, 0); } -int set_veto_file(int file_des) { - ret = OK; - memset(mess, 0, sizeof(mess)); - int args[2] = {-1, -1}; - - if (receiveData(file_des, args, sizeof(args), INT32) < 0) - return printSocketReadError(); - int chipIndex = args[0]; - int nch = args[1]; - int gainIndices[nch]; - memset(gainIndices, 0, sizeof(gainIndices)); - int values[nch]; - memset(values, 0, sizeof(values)); - if (receiveData(file_des, gainIndices, sizeof(gainIndices), INT32) < 0) - return printSocketReadError(); - if (receiveData(file_des, values, sizeof(values), INT32) < 0) - return printSocketReadError(); - LOG(logINFO, - ("Setting Veto file: [chipIndex:%d, nch:%d]\n", chipIndex, nch)); - -#ifndef GOTTHARD2D - functionNotImplemented(); -#else - // only set - if (Server_VerifyLock() == OK) { - if (chipIndex < -1 || chipIndex >= NCHIP) { - ret = FAIL; - sprintf(mess, "Could not set veto file. Invalid chip index %d\n", - chipIndex); - LOG(logERROR, (mess)); - } else if (nch != NCHAN) { - ret = FAIL; - sprintf(mess, - "Could not set veto file. Invalid number of channels %d. " - "Expected %d\n", - nch, NCHAN); - LOG(logERROR, (mess)); - } else { - for (int i = 0; i < NCHAN; ++i) { - if (values[i] < 0 || values[i] > ADU_MAX_VAL) { - ret = FAIL; - sprintf(mess, - "Could not set veto file. Invalid ADU value 0x%x " - "for channel %d, must be 12 bit.\n", - values[i], i); - LOG(logERROR, (mess)); - break; - } - if (gainIndices[i] < 0 || gainIndices[i] > 2) { - ret = FAIL; - sprintf(mess, - "Could not set veto file. Invalid gain index %d " - "for channel %d\n", - gainIndices[i], i); - LOG(logERROR, (mess)); - break; - } - } - if (ret == OK) { - ret = setVetoFile(chipIndex, gainIndices, values); - if (ret == FAIL) { - sprintf(mess, "Could not set veto file for chip index %d\n", - chipIndex); - LOG(logERROR, (mess)); - } - } - } - } -#endif - return Server_SendResult(file_des, INT32, NULL, 0); -} - int get_adc_config(int file_des) { ret = OK; memset(mess, 0, sizeof(mess)); diff --git a/slsDetectorSoftware/include/Detector.h b/slsDetectorSoftware/include/Detector.h index 894c12237..40d116e1d 100644 --- a/slsDetectorSoftware/include/Detector.h +++ b/slsDetectorSoftware/include/Detector.h @@ -980,9 +980,9 @@ class Detector { void setInjectChannel(const int offsetChannel, const int incrementChannel, Positions pos = {}); - /** [Gotthard2] adu values for each channel */ - Result> getVetoPhoton(const int chipIndex, - Positions pos = {}); + /** [Gotthard2] gain indices and adu values for each channel */ + void getVetoPhoton(const int chipIndex, const std::string &fname, + Positions pos = {}); /** [Gotthard2] energy in keV */ void setVetoPhoton(const int chipIndex, const int numPhotons, @@ -993,7 +993,7 @@ class Detector { void setVetoReference(const int gainIndex, const int value, Positions pos = {}); - /** [Gotthard2] */ + /** [Gotthard2] gain indices and adu values for each channel */ void setVetoFile(const int chipIndex, const std::string &fname, Positions pos = {}); diff --git a/slsDetectorSoftware/src/CmdProxy.cpp b/slsDetectorSoftware/src/CmdProxy.cpp index 63d26b103..984f240a0 100644 --- a/slsDetectorSoftware/src/CmdProxy.cpp +++ b/slsDetectorSoftware/src/CmdProxy.cpp @@ -1625,17 +1625,19 @@ std::string CmdProxy::VetoPhoton(int action) { std::ostringstream os; os << cmd << ' '; if (action == defs::HELP_ACTION) { - os << "[n_chip] [#photons] [energy in keV] [reference " + os << "[ichip] [#photons] [energy in keV] [reference " "file]\n\t[Gotthard2] Set veto reference for 128 channels for " - "chip n_chip according to referenc file and #photons and energy " - "in keV." + "chip ichip according to reference file and #photons and energy " + "in keV.\n" + << "[ichip] [output file]\n\t Get gain indices and veto reference " + "for 128 channels for chip ichip, saved to file." << '\n'; } else if (action == defs::GET_ACTION) { - if (args.size() != 1) { - WrongNumberOfParameters(1); + if (args.size() != 2) { + WrongNumberOfParameters(2); } - auto t = det->getVetoPhoton(StringTo(args[0]), {det_id}); - os << args[0] << ' ' << OutStringHex(t) << '\n'; + det->getVetoPhoton(StringTo(args[0]), args[1], {det_id}); + os << "saved to file " << args[1] << '\n'; } else if (action == defs::PUT_ACTION) { if (args.size() != 4) { WrongNumberOfParameters(4); @@ -1653,7 +1655,7 @@ std::string CmdProxy::VetoReference(int action) { std::ostringstream os; os << cmd << ' '; if (action == defs::HELP_ACTION) { - os << "[gain index] [12 bit value in hex] \n\t[Gotthard2] Set veto " + os << "[gain index] [12 bit value] \n\t[Gotthard2] Set veto " "reference for all 128 channels for all chips." << '\n'; } else if (action == defs::GET_ACTION) { @@ -1677,7 +1679,7 @@ std::string CmdProxy::VetoFile(int action) { if (action == defs::HELP_ACTION) { os << "[chip index 0-10, -1 for all] [file name] \n\t[Gotthard2] Set " "veto reference for each 128 channels for specific chip. The " - "file should have 128 rows of gain index and 12 bit value in hex" + "file should have 128 rows of gain index and 12 bit value in dec" << '\n'; } else if (action == defs::GET_ACTION) { throw sls::RuntimeError( diff --git a/slsDetectorSoftware/src/Detector.cpp b/slsDetectorSoftware/src/Detector.cpp index 21deb7394..10d7d7592 100644 --- a/slsDetectorSoftware/src/Detector.cpp +++ b/slsDetectorSoftware/src/Detector.cpp @@ -1290,9 +1290,9 @@ void Detector::setInjectChannel(const int offsetChannel, incrementChannel); } -Result> Detector::getVetoPhoton(const int chipIndex, - Positions pos) { - return pimpl->Parallel(&Module::getVetoPhoton, pos, chipIndex); +void Detector::getVetoPhoton(const int chipIndex, const std::string &fname, + Positions pos) { + pimpl->Parallel(&Module::getVetoPhoton, pos, chipIndex, fname); } void Detector::setVetoPhoton(const int chipIndex, const int numPhotons, diff --git a/slsDetectorSoftware/src/Module.cpp b/slsDetectorSoftware/src/Module.cpp index a282fd41f..8918eb2e2 100644 --- a/slsDetectorSoftware/src/Module.cpp +++ b/slsDetectorSoftware/src/Module.cpp @@ -187,7 +187,7 @@ void Module::setAllTrimbits(int val) { sendToDetector(F_SET_ALL_TRIMBITS, val); } -int64_t Module::getNumberOfFrames() const{ +int64_t Module::getNumberOfFrames() const { return sendToDetector(F_GET_NUM_FRAMES); } @@ -198,7 +198,7 @@ void Module::setNumberOfFrames(int64_t value) { } } -int64_t Module::getNumberOfTriggers() const{ +int64_t Module::getNumberOfTriggers() const { return sendToDetector(F_GET_NUM_TRIGGERS); } @@ -209,7 +209,7 @@ void Module::setNumberOfTriggers(int64_t value) { } } -int64_t Module::getExptime(int gateIndex) const{ +int64_t Module::getExptime(int gateIndex) const { return sendToDetector(F_GET_EXPTIME, gateIndex); } @@ -228,7 +228,9 @@ void Module::setExptime(int gateIndex, int64_t value) { } } -int64_t Module::getPeriod() const { return sendToDetector(F_GET_PERIOD); } +int64_t Module::getPeriod() const { + return sendToDetector(F_GET_PERIOD); +} void Module::setPeriod(int64_t value) { sendToDetector(F_SET_PERIOD, value, nullptr); @@ -321,7 +323,7 @@ void Module::setClockPhase(int clkIndex, int value, bool inDegrees) { sendToDetector(F_SET_CLOCK_PHASE, args, nullptr); } -int Module::getMaxClockPhaseShift(int clkIndex) const{ +int Module::getMaxClockPhaseShift(int clkIndex) const { return sendToDetector(F_GET_MAX_CLOCK_PHASE_SHIFT, clkIndex); } @@ -498,11 +500,11 @@ std::string Module::getScanErrorMessage() const { // Network Configuration (Detector<->Receiver) -int Module::getNumberofUDPInterfacesFromShm() const{ +int Module::getNumberofUDPInterfacesFromShm() const { return shm()->numUDPInterfaces; } -int Module::getNumberofUDPInterfaces() const{ +int Module::getNumberofUDPInterfaces() const { shm()->numUDPInterfaces = sendToDetector(F_GET_NUM_INTERFACES); return shm()->numUDPInterfaces; } @@ -534,7 +536,7 @@ void Module::setSourceUDPIP(const IpAddr ip) { sendToDetector(F_SET_SOURCE_UDP_IP, ip, nullptr); } -sls::IpAddr Module::getSourceUDPIP2() const{ +sls::IpAddr Module::getSourceUDPIP2() const { return sendToDetector(F_GET_SOURCE_UDP_IP2); } @@ -638,7 +640,7 @@ void Module::setDestinationUDPPort(const int port) { } } -int Module::getDestinationUDPPort2() const{ +int Module::getDestinationUDPPort2() const { return sendToDetector(F_GET_DEST_UDP_PORT2); } @@ -831,7 +833,8 @@ void Module::setReceiverSilentMode(bool enable) { nullptr); } -slsDetectorDefs::frameDiscardPolicy Module::getReceiverFramesDiscardPolicy() const { +slsDetectorDefs::frameDiscardPolicy +Module::getReceiverFramesDiscardPolicy() const { return static_cast( sendToReceiver(F_GET_RECEIVER_DISCARD_POLICY)); } @@ -880,7 +883,7 @@ std::array Module::getReceiverThreadIds() const { // File -slsDetectorDefs::fileFormat Module::getFileFormat() const{ +slsDetectorDefs::fileFormat Module::getFileFormat() const { return static_cast( sendToReceiver(F_GET_RECEIVER_FILE_FORMAT)); } @@ -1103,7 +1106,9 @@ void Module::setThresholdEnergy(int e_eV, detectorSettings isettings, } } -std::string Module::getSettingsDir() const { return std::string(shm()->settingsDir); } +std::string Module::getSettingsDir() const { + return std::string(shm()->settingsDir); +} std::string Module::setSettingsDir(const std::string &dir) { sls::strcpy_safe(shm()->settingsDir, dir.c_str()); @@ -1173,7 +1178,9 @@ void Module::setRateCorrection(int64_t t) { sendToDetector(F_SET_RATE_CORRECT, t, nullptr); } -int Module::getReadNLines() const { return sendToDetector(F_GET_READ_N_LINES); } +int Module::getReadNLines() const { + return sendToDetector(F_GET_READ_N_LINES); +} void Module::setReadNLines(const int value) { sendToDetector(F_SET_READ_N_LINES, value, nullptr); @@ -1231,7 +1238,8 @@ void Module::setDeactivatedRxrPaddingMode(bool padding) { } bool Module::getCounterBit() const { - return (!static_cast(sendToDetector(F_SET_COUNTER_BIT, GET_FLAG))); + return ( + !static_cast(sendToDetector(F_SET_COUNTER_BIT, GET_FLAG))); } void Module::setCounterBit(bool cb) { @@ -1294,8 +1302,9 @@ void Module::resetTemperatureEvent() { sendToDetectorStop(F_TEMP_EVENT, 0); } -bool Module::getAutoComparatorDisableMode() const{ - return static_cast(sendToDetector(F_AUTO_COMP_DISABLE, GET_FLAG)); +bool Module::getAutoComparatorDisableMode() const { + return static_cast( + sendToDetector(F_AUTO_COMP_DISABLE, GET_FLAG)); } void Module::setAutoComparatorDisableMode(bool val) { @@ -1380,7 +1389,39 @@ void Module::setInjectChannel(const int offsetChannel, sendToDetector(F_SET_INJECT_CHANNEL, args, nullptr); } -std::vector Module::getVetoPhoton(const int chipIndex) const { +void Module::sendVetoPhoton(const int chipIndex, const std::vector& gainIndices, + const std::vector& values) { + const int nch = gainIndices.size(); + if (gainIndices.size() != values.size()) { + throw RuntimeError("Number of Gain Indices and values do not match! " + "Gain Indices size: " + + std::to_string(gainIndices.size()) + + ", values size: " + std::to_string(values.size())); + } + LOG(logDEBUG1) << "Sending veto photon/file to detector [chip:" << chipIndex + << ", nch:" << nch << "]"; + int fnum = F_SET_VETO_PHOTON; + int ret = FAIL; + int args[]{chipIndex, nch}; + auto client = DetectorSocket(shm()->hostname, shm()->controlPort); + client.Send(&fnum, sizeof(fnum)); + client.Send(args, sizeof(args)); + client.Send(gainIndices.data(), sizeof(decltype(gainIndices[0])) * nch); + client.Send(values.data(), sizeof(decltype(values[0])) * nch); + client.Send(gainIndices.data(), sizeof(int) * nch); + client.Send(values.data(), sizeof(int) * nch); + client.Receive(&ret, sizeof(ret)); + if (ret == FAIL) { + char mess[MAX_STR_LENGTH]{}; + client.Receive(mess, MAX_STR_LENGTH); + throw RuntimeError("Detector " + std::to_string(moduleId) + + " returned error: " + std::string(mess)); + } +} + +void Module::getVetoPhoton(const int chipIndex, + const std::string &fname) const { + LOG(logDEBUG1) << "Getting veto photon [" << chipIndex << "]\n"; int fnum = F_GET_VETO_PHOTON; int ret = FAIL; auto client = DetectorSocket(shm()->hostname, shm()->controlPort); @@ -1393,16 +1434,29 @@ std::vector Module::getVetoPhoton(const int chipIndex) const { throw RuntimeError("Detector " + std::to_string(moduleId) + " returned error: " + std::string(mess)); } + int nch = -1; client.Receive(&nch, sizeof(nch)); + if (nch != shm()->nChan.x) { + throw RuntimeError("Could not get veto photon. Expected " + + std::to_string(shm()->nChan.x) + " channels, got " + + std::to_string(nch)); + } + std::vector gainIndices(nch); + std::vector values(nch); + client.Receive(gainIndices.data(), nch * sizeof(int)); + client.Receive(values.data(), nch * sizeof(int)); - int adus[nch]; - memset(adus, 0, sizeof(adus)); - client.Receive(adus, sizeof(adus)); - std::vector retvals(adus, adus + nch); - LOG(logDEBUG1) << "Getting veto photon [" << chipIndex << "]: " << nch - << " channels\n"; - return retvals; + // save to file + std::ofstream outfile; + outfile.open(fname.c_str(), std::ios_base::out); + if (!outfile.is_open()) { + throw RuntimeError("Could not create file to save veto photon"); + } + for (int i = 0; i < nch; ++i) { + outfile << gainIndices[i] << ' ' << values[i] << '\n'; + } + LOG(logDEBUG1) << nch << " veto photon saved to file"; } void Module::setVetoPhoton(const int chipIndex, const int numPhotons, @@ -1429,14 +1483,11 @@ void Module::setVetoPhoton(const int chipIndex, const int numPhotons, throw RuntimeError("Could not set veto photon. Could not open file: " + fname); } + LOG(logDEBUG1) << "Setting veto photon. Reading Gain values from file"; int totalEnergy = numPhotons * energy; - int ch = shm()->nChan.x; - int gainIndex = 2; - int nRead = 0; - int value[ch]; - memset(value, 0, sizeof(value)); - bool firstLine = true; + std::vector gainIndices; + std::vector values; while (infile.good()) { std::string line; @@ -1448,65 +1499,41 @@ void Module::setVetoPhoton(const int chipIndex, const int numPhotons, continue; } std::istringstream ss(line); - // first line: caluclate gain index from gain thresholds from file - if (firstLine) { - int g0 = -1, g1 = -1; - ss >> g0 >> g1; - if (ss.fail()) { - throw RuntimeError( - "Could not set veto photon. Invalid gain thresholds"); - } - // set gain index and gain bit values - if (totalEnergy < g0) { - gainIndex = 0; - } else if (totalEnergy < g1) { - gainIndex = 1; - } - LOG(logINFO) << "Setting veto photon. Reading Gain " << gainIndex - << " values"; - firstLine = false; + + // read pedestal, gain values, gain thresholds + double gainPedestal[3] = {-1, -1, -1}; + double gainValue[3] = {-1, -1, -1}; + int gainThreshold[2] = {-1, -1}; + ss >> gainPedestal[0] >> gainPedestal[1] >> gainPedestal[2] >> + gainValue[0] >> gainValue[1] >> gainValue[2] >> gainThreshold[0] >> + gainThreshold[1]; + if (ss.fail()) { + throw RuntimeError("Could not set veto photon. Invalid pedestals, " + "gain values or gain thresholds for channel " + + std::to_string(gainIndices.size())); } - // read pedestal and gain values - else { - double p[3] = {-1, -1, -1}, g[3] = {-1, -1, -1}; - ss >> p[0] >> p[1] >> p[2] >> g[0] >> g[1] >> g[2]; - if (ss.fail()) { - throw RuntimeError("Could not set veto photon. Invalid " - "pedestal or gain values for channel " + - std::to_string(nRead)); - } - value[nRead] = - p[gainIndex] + - (g[gainIndex] * - totalEnergy); // ADU value = pedestal + gain * total energy - ++nRead; - if (nRead >= ch) { - break; - } + + // caluclate gain index from gain thresholds and threhsold energy + int gainIndex = 2; + if (totalEnergy < gainThreshold[0]) { + gainIndex = 0; + } else if (totalEnergy < gainThreshold[1]) { + gainIndex = 1; } + gainIndices.push_back(gainIndex); + // calculate ADU value + values.push_back(gainPedestal[gainIndex] + + (gainValue[gainIndex] * totalEnergy)); } - if (nRead != ch) { - throw RuntimeError("Could not set veto photon. Insufficient pedestal " - "pr gain values: " + - std::to_string(nRead)); + // check size + if ((int)gainIndices.size() != shm()->nChan.x) { + throw RuntimeError("Could not set veto photon. Invalid number of " + "entries in file. Expected " + + std::to_string(shm()->nChan.x) + ", read " + + std::to_string(gainIndices.size())); } - int fnum = F_SET_VETO_PHOTON; - int ret = FAIL; - int args[]{chipIndex, gainIndex, ch}; - LOG(logDEBUG) << "Sending veto photon value to detector [chip:" << chipIndex - << ", G" << gainIndex << "]: " << args; - auto client = DetectorSocket(shm()->hostname, shm()->controlPort); - client.Send(&fnum, sizeof(fnum)); - client.Send(args, sizeof(args)); - client.Send(value, sizeof(value)); - client.Receive(&ret, sizeof(ret)); - if (ret == FAIL) { - char mess[MAX_STR_LENGTH]{}; - client.Receive(mess, MAX_STR_LENGTH); - throw RuntimeError("Detector " + std::to_string(moduleId) + - " returned error: " + std::string(mess)); - } + sendVetoPhoton(chipIndex, gainIndices, values); } void Module::setVetoReference(const int gainIndex, const int value) { @@ -1536,12 +1563,8 @@ void Module::setVetoFile(const int chipIndex, const std::string &fname) { " for reading"); } - int ch = shm()->nChan.x; - int nRead = 0; - int gainIndices[ch]; - memset(gainIndices, 0, sizeof(gainIndices)); - int values[ch]; - memset(values, 0, sizeof(values)); + std::vector gainIndices; + std::vector values; for (std::string line; std::getline(input_file, line);) { if (line.find('#') != std::string::npos) { @@ -1552,46 +1575,37 @@ void Module::setVetoFile(const int chipIndex, const std::string &fname) { // convert command and string to a vector std::istringstream iss(line); std::string val; - iss >> gainIndices[nRead] >> val; + int gainIndex = -1; + int value = -1; + iss >> gainIndex >> val; if (iss.fail()) { throw RuntimeError("Could not set veto file. Invalid gain " "or reference value for channel " + - std::to_string(nRead)); + std::to_string(gainIndices.size())); } try { - values[nRead] = StringTo(val); + value = StringTo(val); } catch (...) { throw RuntimeError("Could not set veto file. Invalid value " + val + " for channel " + - std::to_string(nRead)); - } - ++nRead; - if (nRead >= ch) { - break; + std::to_string(gainIndices.size())); } + gainIndices.push_back(gainIndex); + values.push_back(value); } } - - int fnum = F_SET_VETO_FILE; - int ret = FAIL; - int args[]{chipIndex, ch}; - LOG(logDEBUG) << "Sending veto file value to detector [chip:" << chipIndex - << "]: " << args; - auto client = DetectorSocket(shm()->hostname, shm()->controlPort); - client.Send(&fnum, sizeof(fnum)); - client.Send(args, sizeof(args)); - client.Send(gainIndices, sizeof(gainIndices)); - client.Send(values, sizeof(values)); - client.Receive(&ret, sizeof(ret)); - if (ret == FAIL) { - char mess[MAX_STR_LENGTH]{}; - client.Receive(mess, MAX_STR_LENGTH); - throw RuntimeError("Detector " + std::to_string(moduleId) + - " returned error: " + std::string(mess)); + // check size + if ((int)gainIndices.size() != shm()->nChan.x) { + throw RuntimeError("Could not set veto file. Invalid number of " + "entries in file. Expected " + + std::to_string(shm()->nChan.x) + ", read " + + std::to_string(gainIndices.size())); } + + sendVetoPhoton(chipIndex, gainIndices, values); } -slsDetectorDefs::burstMode Module::getBurstMode() const{ +slsDetectorDefs::burstMode Module::getBurstMode() const { auto r = sendToDetector(F_GET_BURST_MODE); return static_cast(r); } @@ -1681,7 +1695,7 @@ void Module::getBadChannels(const std::string &fname) const { std::ofstream outfile; outfile.open(fname.c_str(), std::ios_base::out); if (!outfile.is_open()) { - throw RuntimeError("Could not create file to save pattern"); + throw RuntimeError("Could not create file to save bad channels"); } for (int i = 0; i < nch; ++i) { outfile << badchannels[i] << '\n'; @@ -1750,7 +1764,9 @@ void Module::setCounterMask(uint32_t countermask) { } } -int Module::getNumberOfGates() const { return sendToDetector(F_GET_NUM_GATES); } +int Module::getNumberOfGates() const { + return sendToDetector(F_GET_NUM_GATES); +} void Module::setNumberOfGates(int value) { sendToDetector(F_SET_NUM_GATES, value, nullptr); @@ -1885,7 +1901,7 @@ int Module::setExternalSamplingSource(int value) { return sendToDetector(F_EXTERNAL_SAMPLING_SOURCE, value); } -bool Module::getExternalSampling() const{ +bool Module::getExternalSampling() const { return sendToDetector(F_EXTERNAL_SAMPLING, GET_FLAG); } diff --git a/slsDetectorSoftware/src/Module.h b/slsDetectorSoftware/src/Module.h index a6bc3ee75..fecb590cd 100644 --- a/slsDetectorSoftware/src/Module.h +++ b/slsDetectorSoftware/src/Module.h @@ -371,7 +371,9 @@ class Module : public virtual slsDetectorDefs { void setBurstPeriod(int64_t value); std::array getInjectChannel() const; void setInjectChannel(const int offsetChannel, const int incrementChannel); - std::vector getVetoPhoton(const int chipIndex) const; + void sendVetoPhoton(const int chipIndex, const std::vector& gainIndices, + const std::vector& values); + void getVetoPhoton(const int chipIndex, const std::string &fname) const; void setVetoPhoton(const int chipIndex, const int numPhotons, const int energy, const std::string &fname); void setVetoReference(const int gainIndex, const int value); @@ -519,7 +521,7 @@ class Module : public virtual slsDetectorDefs { private: void checkArgs(const void *args, size_t args_size, void *retval, - size_t retval_size) const; + size_t retval_size) const; /** * Send function parameters to detector (control server) diff --git a/slsDetectorSoftware/tests/test-CmdProxy-gotthard2.cpp b/slsDetectorSoftware/tests/test-CmdProxy-gotthard2.cpp index 1d237a6c7..4dabe8ac6 100644 --- a/slsDetectorSoftware/tests/test-CmdProxy-gotthard2.cpp +++ b/slsDetectorSoftware/tests/test-CmdProxy-gotthard2.cpp @@ -316,7 +316,9 @@ TEST_CASE("vetophoton", "[.cmd][.new]") { if (det_type == defs::GOTTHARD2) { REQUIRE_THROWS(proxy.Call("vetophoton", {}, -1, GET)); - REQUIRE_NOTHROW(proxy.Call("vetophoton", {"-1"}, -1, GET)); + REQUIRE_THROWS(proxy.Call("vetophoton", {"-1"}, -1, GET)); + REQUIRE_NOTHROW( + proxy.Call("vetophoton", {"-1", "/tmp/bla.txt"}, -1, GET)); REQUIRE_THROWS(proxy.Call("vetophoton", {"12", "1", "39950"}, -1, PUT)); // invalid chip index REQUIRE_THROWS(proxy.Call("vetophoton", {"-1", "0"}, -1, @@ -324,7 +326,8 @@ TEST_CASE("vetophoton", "[.cmd][.new]") { REQUIRE_THROWS(proxy.Call("vetophoton", {"-1", "1", "39950"}, -1, PUT)); // invald file } else { - REQUIRE_THROWS(proxy.Call("vetophoton", {"-1"}, -1, GET)); + REQUIRE_THROWS( + proxy.Call("vetophoton", {"-1", "/tmp/bla.txt"}, -1, GET)); } } diff --git a/slsSupportLib/include/sls_detector_funcs.h b/slsSupportLib/include/sls_detector_funcs.h index 8bd4ff538..a739b0ac2 100755 --- a/slsSupportLib/include/sls_detector_funcs.h +++ b/slsSupportLib/include/sls_detector_funcs.h @@ -207,7 +207,6 @@ enum detFuncs { F_SET_CDS_GAIN, F_GET_FILTER, F_SET_FILTER, - F_SET_VETO_FILE, F_GET_ADC_CONFIGURATION, F_SET_ADC_CONFIGURATION, F_GET_BAD_CHANNELS, @@ -519,7 +518,6 @@ const char* getFunctionNameFromEnum(enum detFuncs func) { case F_SET_CDS_GAIN: return "F_SET_CDS_GAIN"; case F_GET_FILTER: return "F_GET_FILTER"; case F_SET_FILTER: return "F_SET_FILTER"; - case F_SET_VETO_FILE: return "F_SET_VETO_FILE"; case F_SET_ADC_CONFIGURATION: return "F_SET_ADC_CONFIGURATION"; case F_GET_ADC_CONFIGURATION: return "F_GET_ADC_CONFIGURATION"; case F_GET_BAD_CHANNELS: return "F_GET_BAD_CHANNELS"; diff --git a/slsSupportLib/include/versionAPI.h b/slsSupportLib/include/versionAPI.h index 99d3ba631..dba8d9df5 100644 --- a/slsSupportLib/include/versionAPI.h +++ b/slsSupportLib/include/versionAPI.h @@ -3,10 +3,10 @@ #define APILIB 0x200409 #define APIRECEIVER 0x200409 #define APIGUI 0x200409 -#define APICTB 0x200723 -#define APIGOTTHARD 0x200723 -#define APIMYTHEN3 0x200723 -#define APIMOENCH 0x200722 -#define APIEIGER 0x200723 -#define APIJUNGFRAU 0x200728 -#define APIGOTTHARD2 0x200728 +#define APIEIGER 0x200729 +#define APICTB 0x200729 +#define APIGOTTHARD 0x200729 +#define APIGOTTHARD2 0x200729 +#define APIJUNGFRAU 0x200729 +#define APIMYTHEN3 0x200729 +#define APIMOENCH 0x200729