eiger bug fix: quad gap pixels

This commit is contained in:
maliakal_d 2019-08-14 17:49:09 +02:00
parent 8e2b89d488
commit ba0c6ff286
8 changed files with 72 additions and 32 deletions

View File

@ -90,8 +90,11 @@ void qDrawPlot::SetupPlots() {
break; break;
case slsDetectorDefs::EIGER: case slsDetectorDefs::EIGER:
if (myDet->getQuad()) { if (myDet->getQuad()) {
nPixelsX = (myDet->getTotalNumberOfChannelsInclGapPixels(slsDetectorDefs::X) / 2) - 1; nPixelsX /= 2;
nPixelsY = myDet->getTotalNumberOfChannelsInclGapPixels(slsDetectorDefs::Y) * 2; nPixelsY *= 2;
if (nPixelsX != nPixelsY) {
--nPixelsX;
}
} }
break; break;
default: default:

View File

@ -2213,9 +2213,10 @@ class multiSlsDetector : public virtual slsDetectorDefs {
* @param image pointer to image without gap pixels * @param image pointer to image without gap pixels
* @param gpImage poiner to image with gap pixels, if NULL, allocated * @param gpImage poiner to image with gap pixels, if NULL, allocated
* inside function * inside function
* quadEnable quad enabled
* @returns number of data bytes of image with gap pixels * @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 * Create Receiving Data Sockets

View File

@ -2839,6 +2839,7 @@ void multiSlsDetector::readFrameFromReceiver() {
int nDetPixelsX = 0; int nDetPixelsX = 0;
int nDetPixelsY = 0; int nDetPixelsY = 0;
bool gappixelsenable = false; bool gappixelsenable = false;
bool quadEnable = false;
bool eiger = false; bool eiger = false;
bool numInterfaces = getNumberofUDPInterfaces(); // cannot pick up from zmq bool numInterfaces = getNumberofUDPInterfaces(); // cannot pick up from zmq
@ -2932,10 +2933,9 @@ void multiSlsDetector::readFrameFromReceiver() {
? true ? true
: false; // to be changed to EIGER when firmware : false; // to be changed to EIGER when firmware
// updates its header data // updates its header data
// gap pixels enable
gappixelsenable = gappixelsenable =
(doc["gappixels"].GetUint() == 0) ? false : true; (doc["gappixels"].GetUint() == 0) ? false : true;
quadEnable = (doc["quad"].GetUint() == 0) ? false : true;
FILE_LOG(logDEBUG1) FILE_LOG(logDEBUG1)
<< "One Time Header Info:" << "One Time Header Info:"
"\n\tsize: " "\n\tsize: "
@ -2945,7 +2945,8 @@ void multiSlsDetector::readFrameFromReceiver() {
<< "\n\tnPixelsX: " << nPixelsX << "\n\tnPixelsX: " << nPixelsX
<< "\n\tnPixelsY: " << nPixelsY << "\n\tnX: " << nX << "\n\tnPixelsY: " << nPixelsY << "\n\tnX: " << nX
<< "\n\tnY: " << nY << "\n\teiger: " << eiger << "\n\tnY: " << nY << "\n\teiger: " << eiger
<< "\n\tgappixelsenable: " << gappixelsenable; << "\n\tgappixelsenable: " << gappixelsenable
<< "\n\tquadEnable: " << quadEnable;
} }
// each time, parse rest of header // each time, parse rest of header
currentFileName = doc["fname"].GetString(); 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 // send data to callback
if (data) { if (data) {
setCurrentProgress(currentAcquisitionIndex + 1); setCurrentProgress(currentAcquisitionIndex + 1);
// 4bit gap pixels // 4bit gap pixels
if (dynamicRange == 4 && gappixelsenable) { 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( thisData = new detectorData(
getCurrentProgress(), currentFileName.c_str(), nDetPixelsX, getCurrentProgress(), currentFileName.c_str(), nDetPixelsX,
nDetPixelsY, multigappixels, n, dynamicRange, nDetPixelsY, multigappixels, n, dynamicRange,
@ -3073,14 +3092,23 @@ void multiSlsDetector::readFrameFromReceiver() {
delete[] multigappixels; delete[] multigappixels;
} }
int multiSlsDetector::processImageWithGapPixels(char *image, char *&gpImage) { int multiSlsDetector::processImageWithGapPixels(char *image, char *&gpImage, bool quadEnable) {
// eiger 4 bit mode // eiger 4 bit mode
int nxb = multi_shm()->numberOfDetector[X] * (512 + 3); int nxb = multi_shm()->numberOfDetector[X] * (512 + 3); //(divided by 2 already)
int nyb = multi_shm()->numberOfDetector[Y] * (256 + 1); int nyb = multi_shm()->numberOfDetector[Y] * (256 + 1);
int gapdatabytes = nxb * nyb; int nchipInRow = 4;
int nxchip = multi_shm()->numberOfDetector[X] * 4; int nxchip = multi_shm()->numberOfDetector[X] * 4;
int nychip = multi_shm()->numberOfDetector[Y] * 1; 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 // allocate
if (gpImage == nullptr) { if (gpImage == nullptr) {
@ -3097,14 +3125,14 @@ int multiSlsDetector::processImageWithGapPixels(char *image, char *&gpImage) {
// copying line by line // copying line by line
src = image; src = image;
dst = gpImage; 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; for (int ichipy = 0; ichipy < b1chipy;
++ichipy) { // for each row in a chip ++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); memcpy(dst, src, b1chipx);
src += b1chipx; src += b1chipx;
dst += b1chipx; dst += b1chipx;
if (((col + 1) % 4) != 0) { if (((col + 1) % nchipInRow) != 0) { // skip gap pixels
++dst; ++dst;
} }
} }
@ -3118,12 +3146,12 @@ int multiSlsDetector::processImageWithGapPixels(char *image, char *&gpImage) {
uint8_t temp, g1, g2; uint8_t temp, g1, g2;
int mod; int mod;
dst = gpImage; 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; for (int ichipy = 0; ichipy < b1chipy;
++ichipy) { // for each row in a chip ++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; dst += b1chipx;
mod = (col + 1) % 4; mod = (col + 1) % nchipInRow; // get gap pixels
// copy gap pixel(chip 0, 1, 2) // copy gap pixel(chip 0, 1, 2)
if (mod != 0) { if (mod != 0) {
// neighbouring gap pixels to left // neighbouring gap pixels to left
@ -3155,7 +3183,7 @@ int multiSlsDetector::processImageWithGapPixels(char *image, char *&gpImage) {
uint8_t temp, g1, g2; uint8_t temp, g1, g2;
char *dst_prevline = nullptr; char *dst_prevline = nullptr;
dst = gpImage; 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); dst += (b1chipy * nxb);
// horizontal copying of gap pixels from neighboring past line // horizontal copying of gap pixels from neighboring past line
// (bottom parts) // (bottom parts)

View File

@ -657,6 +657,7 @@ bool slsDetector::getQuad() {
sendToDetector(F_GET_QUAD, nullptr, retval); sendToDetector(F_GET_QUAD, nullptr, retval);
FILE_LOG(logDEBUG1) << "Quad Type :" << retval; FILE_LOG(logDEBUG1) << "Quad Type :" << retval;
return (retval == 0 ? false : true); return (retval == 0 ? false : true);
} }
void slsDetector::setQuad(const bool enable) { void slsDetector::setQuad(const bool enable) {
@ -1798,6 +1799,7 @@ std::string slsDetector::setReceiverHostname(const std::string &receiverIP) {
enableGapPixels(shm()->gappixels); enableGapPixels(shm()->gappixels);
enableTenGigabitEthernet(shm()->tenGigaEnable); enableTenGigabitEthernet(shm()->tenGigaEnable);
setReadOutFlags(GET_READOUT_FLAGS); setReadOutFlags(GET_READOUT_FLAGS);
setQuad(getQuad());
break; break;
case CHIPTESTBOARD: case CHIPTESTBOARD:
@ -1807,6 +1809,7 @@ std::string slsDetector::setReceiverHostname(const std::string &receiverIP) {
setReadOutFlags(GET_READOUT_FLAGS); setReadOutFlags(GET_READOUT_FLAGS);
setADCEnableMask(shm()->adcEnableMask); setADCEnableMask(shm()->adcEnableMask);
setReceiverDbitOffset(shm()->rxDbitOffset); setReceiverDbitOffset(shm()->rxDbitOffset);
setReceiverDbitList(shm()->rxDbitList);
break; break;
case MOENCH: case MOENCH:
@ -1824,10 +1827,6 @@ std::string slsDetector::setReceiverHostname(const std::string &receiverIP) {
break; break;
} }
if (shm()->myDetectorType == CHIPTESTBOARD) {
setReceiverDbitList(shm()->rxDbitList);
}
setReceiverSilentMode(static_cast<int>(shm()->rxSilentMode)); setReceiverSilentMode(static_cast<int>(shm()->rxSilentMode));
// data streaming // data streaming
setReceiverStreamingFrequency(shm()->rxReadFreq); setReceiverStreamingFrequency(shm()->rxReadFreq);

View File

@ -31,9 +31,10 @@ class DataStreamer : private virtual slsDetectorDefs, public ThreadObject {
* @param ajh additional json header * @param ajh additional json header
* @param nd pointer to number of detectors in each dimension * @param nd pointer to number of detectors in each dimension
* @param gpEnable pointer to gap pixels enable * @param gpEnable pointer to gap pixels enable
* @param qe pointer to quad Enable
*/ */
DataStreamer(int ind, Fifo* f, uint32_t* dr, ROI* r, 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 * Destructor
@ -226,5 +227,8 @@ class DataStreamer : private virtual slsDetectorDefs, public ThreadObject {
/** Gap Pixels Enable */ /** Gap Pixels Enable */
bool* gapPixelsEnable; bool* gapPixelsEnable;
/** Quad Enable */
bool* quadEnable;
}; };

View File

@ -17,7 +17,7 @@ const std::string DataStreamer::TypeName = "DataStreamer";
DataStreamer::DataStreamer(int ind, Fifo* f, uint32_t* dr, ROI* r, 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), ThreadObject(ind),
runningFlag(0), runningFlag(0),
generalData(nullptr), generalData(nullptr),
@ -34,7 +34,8 @@ DataStreamer::DataStreamer(int ind, Fifo* f, uint32_t* dr, ROI* r,
firstAcquisitionIndex(0), firstAcquisitionIndex(0),
firstMeasurementIndex(0), firstMeasurementIndex(0),
completeBuffer(nullptr), completeBuffer(nullptr),
gapPixelsEnable(gpEnable) gapPixelsEnable(gpEnable),
quadEnable(qe)
{ {
numDet[0] = nd[0]; numDet[0] = nd[0];
numDet[1] = nd[1]; 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.modId, header.row, header.column, header.reserved,
header.debug, header.roundRNumber, header.debug, header.roundRNumber,
header.detType, header.version, header.detType, header.version,
*gapPixelsEnable ? 1 : 0, flippedDataX, *gapPixelsEnable ? 1 : 0, flippedDataX, *quadEnable,
additionJsonHeader additionJsonHeader
); );
} }

View File

@ -793,7 +793,7 @@ int slsReceiverImplementation::setNumberofUDPInterfaces(const int n) {
} }
dataStreamer.push_back(sls::make_unique<DataStreamer>( dataStreamer.push_back(sls::make_unique<DataStreamer>(
i, fifo[i].get(), &dynamicRange, &roi, &fileIndex, i, fifo[i].get(), &dynamicRange, &roi, &fileIndex,
fd, additionalJsonHeader, (int*)nd, &gapPixelsEnable)); fd, additionalJsonHeader, (int*)nd, &gapPixelsEnable, &quadEnable));
dataStreamer[i]->SetGeneralData(generalData); dataStreamer[i]->SetGeneralData(generalData);
dataStreamer[i]->CreateZmqSockets( dataStreamer[i]->CreateZmqSockets(
&numThreads, streamingPort, streamingSrcIP); &numThreads, streamingPort, streamingSrcIP);
@ -945,7 +945,7 @@ int slsReceiverImplementation::setDataStreamEnable(const bool enable) {
} }
dataStreamer.push_back(sls::make_unique<DataStreamer>( dataStreamer.push_back(sls::make_unique<DataStreamer>(
i, fifo[i].get(), &dynamicRange, &roi, &fileIndex, i, fifo[i].get(), &dynamicRange, &roi, &fileIndex,
fd, additionalJsonHeader, (int*)nd, &gapPixelsEnable)); fd, additionalJsonHeader, (int*)nd, &gapPixelsEnable, &quadEnable));
dataStreamer[i]->SetGeneralData(generalData); dataStreamer[i]->SetGeneralData(generalData);
dataStreamer[i]->CreateZmqSockets( dataStreamer[i]->CreateZmqSockets(
&numThreads, streamingPort, streamingSrcIP); &numThreads, streamingPort, streamingSrcIP);
@ -1370,7 +1370,7 @@ void slsReceiverImplementation::stopReceiver() {
dataProcessor[0]->EndofAcquisition(anycaught, maxIndexCaught); dataProcessor[0]->EndofAcquisition(anycaught, maxIndexCaught);
} }
// wait for the processes (DataStreamer) to be done // wait for the processes (dataStreamer) to be done
running = true; running = true;
while (running) { while (running) {
running = false; running = false;

View File

@ -265,6 +265,7 @@ public:
* @param version detector header version * @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 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 flippedDataX if it is flipped across x axis
* @param quadEnable if quad is enabled
* @param additionalJsonHeader additional json header * @param additionalJsonHeader additional json header
* @returns 0 if error, else 1 * @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, uint16_t modId = 0, uint16_t row = 0, uint16_t column = 0, uint16_t reserved = 0,
uint32_t debug = 0, uint16_t roundRNumber = 0, uint32_t debug = 0, uint16_t roundRNumber = 0,
uint8_t detType = 0, uint8_t version = 0, int gapPixelsEnable = 0, int flippedDataX = 0, uint8_t detType = 0, uint8_t version = 0, int gapPixelsEnable = 0, int flippedDataX = 0,
uint32_t quadEnable = 0,
char* additionalJsonHeader = 0) { char* additionalJsonHeader = 0) {
@ -310,7 +312,8 @@ public:
//additional stuff //additional stuff
"\"gappixels\":%u, " "\"gappixels\":%u, "
"\"flippedDataX\":%u" "\"flippedDataX\":%u, "
"\"quad\":%u"
;//"}\n"; ;//"}\n";
char buf[MAX_STR_LENGTH] = ""; char buf[MAX_STR_LENGTH] = "";
@ -324,7 +327,8 @@ public:
//additional stuff //additional stuff
gapPixelsEnable, gapPixelsEnable,
flippedDataX flippedDataX,
quadEnable
); );
if (additionalJsonHeader && strlen(additionalJsonHeader)) { if (additionalJsonHeader && strlen(additionalJsonHeader)) {