mirror of
https://github.com/slsdetectorgroup/slsDetectorPackage.git
synced 2025-04-22 22:40:02 +02:00
eiger bug fix: quad gap pixels
This commit is contained in:
parent
8e2b89d488
commit
ba0c6ff286
@ -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:
|
||||||
|
@ -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
|
||||||
|
@ -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)
|
||||||
|
@ -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);
|
||||||
|
@ -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;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -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
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
|
@ -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)) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user