diff --git a/slsDetectorGui/src/qDrawPlot.cpp b/slsDetectorGui/src/qDrawPlot.cpp index 2784f9e0a..b242c8711 100755 --- a/slsDetectorGui/src/qDrawPlot.cpp +++ b/slsDetectorGui/src/qDrawPlot.cpp @@ -90,8 +90,11 @@ void qDrawPlot::SetupPlots() { break; case slsDetectorDefs::EIGER: if (myDet->getQuad()) { - nPixelsX = (myDet->getTotalNumberOfChannelsInclGapPixels(slsDetectorDefs::X) / 2) - 1; - nPixelsY = myDet->getTotalNumberOfChannelsInclGapPixels(slsDetectorDefs::Y) * 2; + nPixelsX /= 2; + nPixelsY *= 2; + if (nPixelsX != nPixelsY) { + --nPixelsX; + } } break; default: diff --git a/slsDetectorSoftware/include/multiSlsDetector.h b/slsDetectorSoftware/include/multiSlsDetector.h index c55266144..367013933 100755 --- a/slsDetectorSoftware/include/multiSlsDetector.h +++ b/slsDetectorSoftware/include/multiSlsDetector.h @@ -2213,9 +2213,10 @@ class multiSlsDetector : public virtual slsDetectorDefs { * @param image pointer to image without gap pixels * @param gpImage poiner to image with gap pixels, if NULL, allocated * inside function + * quadEnable quad enabled * @returns number of data bytes of image with gap pixels */ - int processImageWithGapPixels(char *image, char *&gpImage); + int processImageWithGapPixels(char *image, char *&gpImage, bool quadEnable); /** * Create Receiving Data Sockets diff --git a/slsDetectorSoftware/src/multiSlsDetector.cpp b/slsDetectorSoftware/src/multiSlsDetector.cpp index 1dd184d87..c3251b052 100755 --- a/slsDetectorSoftware/src/multiSlsDetector.cpp +++ b/slsDetectorSoftware/src/multiSlsDetector.cpp @@ -2839,6 +2839,7 @@ void multiSlsDetector::readFrameFromReceiver() { int nDetPixelsX = 0; int nDetPixelsY = 0; bool gappixelsenable = false; + bool quadEnable = false; bool eiger = false; bool numInterfaces = getNumberofUDPInterfaces(); // cannot pick up from zmq @@ -2932,10 +2933,9 @@ void multiSlsDetector::readFrameFromReceiver() { ? true : false; // to be changed to EIGER when firmware // updates its header data - // gap pixels enable gappixelsenable = (doc["gappixels"].GetUint() == 0) ? false : true; - + quadEnable = (doc["quad"].GetUint() == 0) ? false : true; FILE_LOG(logDEBUG1) << "One Time Header Info:" "\n\tsize: " @@ -2945,7 +2945,8 @@ void multiSlsDetector::readFrameFromReceiver() { << "\n\tnPixelsX: " << nPixelsX << "\n\tnPixelsY: " << nPixelsY << "\n\tnX: " << nX << "\n\tnY: " << nY << "\n\teiger: " << eiger - << "\n\tgappixelsenable: " << gappixelsenable; + << "\n\tgappixelsenable: " << gappixelsenable + << "\n\tquadEnable: " << quadEnable; } // each time, parse rest of header currentFileName = doc["fname"].GetString(); @@ -3011,13 +3012,31 @@ void multiSlsDetector::readFrameFromReceiver() { } } } + FILE_LOG(logINFOBLUE) + << "Call Back Info:" + << "\n\t nDetPixelsX: " << nDetPixelsX + << "\n\t nDetPixelsY: " << nDetPixelsY + << "\n\t databytes: " << multisize + << "\n\t dynamicRange: " << dynamicRange; // send data to callback if (data) { setCurrentProgress(currentAcquisitionIndex + 1); // 4bit gap pixels if (dynamicRange == 4 && gappixelsenable) { - int n = processImageWithGapPixels(multiframe, multigappixels); + if (quadEnable) { + nDetPixelsX += 2; + nDetPixelsY += 2; + } else { + nDetPixelsX = nX * (nPixelsX + 3); + nDetPixelsY = nY * (nPixelsY + 1); + } + int n = processImageWithGapPixels(multiframe, multigappixels, quadEnable); + FILE_LOG(logINFORED) + << "Call Back Info Recalculated:" + << "\n\t nDetPixelsX: " << nDetPixelsX + << "\n\t nDetPixelsY: " << nDetPixelsY + << "\n\t databytes: " << n; thisData = new detectorData( getCurrentProgress(), currentFileName.c_str(), nDetPixelsX, nDetPixelsY, multigappixels, n, dynamicRange, @@ -3073,14 +3092,23 @@ void multiSlsDetector::readFrameFromReceiver() { delete[] multigappixels; } -int multiSlsDetector::processImageWithGapPixels(char *image, char *&gpImage) { - // eiger 4 bit mode - int nxb = multi_shm()->numberOfDetector[X] * (512 + 3); +int multiSlsDetector::processImageWithGapPixels(char *image, char *&gpImage, bool quadEnable) { + // eiger 4 bit mode + int nxb = multi_shm()->numberOfDetector[X] * (512 + 3); //(divided by 2 already) int nyb = multi_shm()->numberOfDetector[Y] * (256 + 1); - int gapdatabytes = nxb * nyb; - + int nchipInRow = 4; int nxchip = multi_shm()->numberOfDetector[X] * 4; int nychip = multi_shm()->numberOfDetector[Y] * 1; + if (quadEnable) { + nxb = multi_shm()->numberOfDetector[X] * (256 + 1); //(divided by 2 already) + nyb = multi_shm()->numberOfDetector[Y] * (512 + 2); + nxchip /= 2; + nychip *= 2; + nchipInRow /= 2; + } + int gapdatabytes = nxb * nyb; + + // allocate if (gpImage == nullptr) { @@ -3097,14 +3125,14 @@ int multiSlsDetector::processImageWithGapPixels(char *image, char *&gpImage) { // copying line by line src = image; dst = gpImage; - for (int row = 0; row < nychip; ++row) { // for each chip in a row + for (int row = 0; row < nychip; ++row) { // for each chip row for (int ichipy = 0; ichipy < b1chipy; ++ichipy) { // for each row in a chip - for (int col = 0; col < nxchip; ++col) { + for (int col = 0; col < nxchip; ++col) {// for each chip in a row memcpy(dst, src, b1chipx); src += b1chipx; dst += b1chipx; - if (((col + 1) % 4) != 0) { + if (((col + 1) % nchipInRow) != 0) { // skip gap pixels ++dst; } } @@ -3118,12 +3146,12 @@ int multiSlsDetector::processImageWithGapPixels(char *image, char *&gpImage) { uint8_t temp, g1, g2; int mod; dst = gpImage; - for (int row = 0; row < nychip; ++row) { // for each chip in a row + for (int row = 0; row < nychip; ++row) { // for each chip row for (int ichipy = 0; ichipy < b1chipy; ++ichipy) { // for each row in a chip - for (int col = 0; col < nxchip; ++col) { + for (int col = 0; col < nxchip; ++col) {// for each chip in a row dst += b1chipx; - mod = (col + 1) % 4; + mod = (col + 1) % nchipInRow; // get gap pixels // copy gap pixel(chip 0, 1, 2) if (mod != 0) { // neighbouring gap pixels to left @@ -3155,7 +3183,7 @@ int multiSlsDetector::processImageWithGapPixels(char *image, char *&gpImage) { uint8_t temp, g1, g2; char *dst_prevline = nullptr; dst = gpImage; - for (int row = 0; row < nychip; ++row) { // for each chip in a row + for (int row = 0; row < nychip; ++row) { // for each chip row dst += (b1chipy * nxb); // horizontal copying of gap pixels from neighboring past line // (bottom parts) diff --git a/slsDetectorSoftware/src/slsDetector.cpp b/slsDetectorSoftware/src/slsDetector.cpp index c2fc2416f..faa8eb011 100755 --- a/slsDetectorSoftware/src/slsDetector.cpp +++ b/slsDetectorSoftware/src/slsDetector.cpp @@ -657,6 +657,7 @@ bool slsDetector::getQuad() { sendToDetector(F_GET_QUAD, nullptr, retval); FILE_LOG(logDEBUG1) << "Quad Type :" << retval; return (retval == 0 ? false : true); + } void slsDetector::setQuad(const bool enable) { @@ -1798,6 +1799,7 @@ std::string slsDetector::setReceiverHostname(const std::string &receiverIP) { enableGapPixels(shm()->gappixels); enableTenGigabitEthernet(shm()->tenGigaEnable); setReadOutFlags(GET_READOUT_FLAGS); + setQuad(getQuad()); break; case CHIPTESTBOARD: @@ -1807,6 +1809,7 @@ std::string slsDetector::setReceiverHostname(const std::string &receiverIP) { setReadOutFlags(GET_READOUT_FLAGS); setADCEnableMask(shm()->adcEnableMask); setReceiverDbitOffset(shm()->rxDbitOffset); + setReceiverDbitList(shm()->rxDbitList); break; case MOENCH: @@ -1824,10 +1827,6 @@ std::string slsDetector::setReceiverHostname(const std::string &receiverIP) { break; } - if (shm()->myDetectorType == CHIPTESTBOARD) { - setReceiverDbitList(shm()->rxDbitList); - } - setReceiverSilentMode(static_cast(shm()->rxSilentMode)); // data streaming setReceiverStreamingFrequency(shm()->rxReadFreq); diff --git a/slsReceiverSoftware/include/DataStreamer.h b/slsReceiverSoftware/include/DataStreamer.h index 152d006c0..567cf364a 100755 --- a/slsReceiverSoftware/include/DataStreamer.h +++ b/slsReceiverSoftware/include/DataStreamer.h @@ -31,9 +31,10 @@ class DataStreamer : private virtual slsDetectorDefs, public ThreadObject { * @param ajh additional json header * @param nd pointer to number of detectors in each dimension * @param gpEnable pointer to gap pixels enable + * @param qe pointer to quad Enable */ DataStreamer(int ind, Fifo* f, uint32_t* dr, ROI* r, - uint64_t* fi, int fd, char* ajh, int* nd, bool* gpEnable); + uint64_t* fi, int fd, char* ajh, int* nd, bool* gpEnable, bool* qe); /** * Destructor @@ -226,5 +227,8 @@ class DataStreamer : private virtual slsDetectorDefs, public ThreadObject { /** Gap Pixels Enable */ bool* gapPixelsEnable; + /** Quad Enable */ + bool* quadEnable; + }; diff --git a/slsReceiverSoftware/src/DataStreamer.cpp b/slsReceiverSoftware/src/DataStreamer.cpp index 3d5db32b9..2f16b7078 100755 --- a/slsReceiverSoftware/src/DataStreamer.cpp +++ b/slsReceiverSoftware/src/DataStreamer.cpp @@ -17,7 +17,7 @@ const std::string DataStreamer::TypeName = "DataStreamer"; DataStreamer::DataStreamer(int ind, Fifo* f, uint32_t* dr, ROI* r, - uint64_t* fi, int fd, char* ajh, int* nd, bool* gpEnable) : + uint64_t* fi, int fd, char* ajh, int* nd, bool* gpEnable, bool* qe) : ThreadObject(ind), runningFlag(0), generalData(nullptr), @@ -34,7 +34,8 @@ DataStreamer::DataStreamer(int ind, Fifo* f, uint32_t* dr, ROI* r, firstAcquisitionIndex(0), firstMeasurementIndex(0), completeBuffer(nullptr), - gapPixelsEnable(gpEnable) + gapPixelsEnable(gpEnable), + quadEnable(qe) { numDet[0] = nd[0]; numDet[1] = nd[1]; @@ -263,7 +264,7 @@ int DataStreamer::SendHeader(sls_receiver_header* rheader, uint32_t size, uint32 header.modId, header.row, header.column, header.reserved, header.debug, header.roundRNumber, header.detType, header.version, - *gapPixelsEnable ? 1 : 0, flippedDataX, + *gapPixelsEnable ? 1 : 0, flippedDataX, *quadEnable, additionJsonHeader ); } diff --git a/slsReceiverSoftware/src/slsReceiverImplementation.cpp b/slsReceiverSoftware/src/slsReceiverImplementation.cpp index 28b3f100e..a77b40da8 100755 --- a/slsReceiverSoftware/src/slsReceiverImplementation.cpp +++ b/slsReceiverSoftware/src/slsReceiverImplementation.cpp @@ -793,7 +793,7 @@ int slsReceiverImplementation::setNumberofUDPInterfaces(const int n) { } dataStreamer.push_back(sls::make_unique( i, fifo[i].get(), &dynamicRange, &roi, &fileIndex, - fd, additionalJsonHeader, (int*)nd, &gapPixelsEnable)); + fd, additionalJsonHeader, (int*)nd, &gapPixelsEnable, &quadEnable)); dataStreamer[i]->SetGeneralData(generalData); dataStreamer[i]->CreateZmqSockets( &numThreads, streamingPort, streamingSrcIP); @@ -945,7 +945,7 @@ int slsReceiverImplementation::setDataStreamEnable(const bool enable) { } dataStreamer.push_back(sls::make_unique( i, fifo[i].get(), &dynamicRange, &roi, &fileIndex, - fd, additionalJsonHeader, (int*)nd, &gapPixelsEnable)); + fd, additionalJsonHeader, (int*)nd, &gapPixelsEnable, &quadEnable)); dataStreamer[i]->SetGeneralData(generalData); dataStreamer[i]->CreateZmqSockets( &numThreads, streamingPort, streamingSrcIP); @@ -1370,7 +1370,7 @@ void slsReceiverImplementation::stopReceiver() { dataProcessor[0]->EndofAcquisition(anycaught, maxIndexCaught); } - // wait for the processes (DataStreamer) to be done + // wait for the processes (dataStreamer) to be done running = true; while (running) { running = false; diff --git a/slsSupportLib/include/ZmqSocket.h b/slsSupportLib/include/ZmqSocket.h index 033205914..9506a1804 100755 --- a/slsSupportLib/include/ZmqSocket.h +++ b/slsSupportLib/include/ZmqSocket.h @@ -265,6 +265,7 @@ public: * @param version detector header version * @param gapPixelsEnable gap pixels enable (exception: if gap pixels enable for 4 bit mode, data is not yet gap pixel enabled in receiver) * @param flippedDataX if it is flipped across x axis + * @param quadEnable if quad is enabled * @param additionalJsonHeader additional json header * @returns 0 if error, else 1 */ @@ -276,6 +277,7 @@ public: uint16_t modId = 0, uint16_t row = 0, uint16_t column = 0, uint16_t reserved = 0, uint32_t debug = 0, uint16_t roundRNumber = 0, uint8_t detType = 0, uint8_t version = 0, int gapPixelsEnable = 0, int flippedDataX = 0, + uint32_t quadEnable = 0, char* additionalJsonHeader = 0) { @@ -310,7 +312,8 @@ public: //additional stuff "\"gappixels\":%u, " - "\"flippedDataX\":%u" + "\"flippedDataX\":%u, " + "\"quad\":%u" ;//"}\n"; char buf[MAX_STR_LENGTH] = ""; @@ -324,7 +327,8 @@ public: //additional stuff gapPixelsEnable, - flippedDataX + flippedDataX, + quadEnable ); if (additionalJsonHeader && strlen(additionalJsonHeader)) {