eiger bug fix: 4 bit mode gap pixels, also added quad to shm

This commit is contained in:
maliakal_d 2019-08-14 15:31:18 +02:00
parent 2a88bc6a1e
commit 633c646239
13 changed files with 96 additions and 43 deletions

View File

@ -129,8 +129,8 @@ void qDrawPlot::SetupWidgetWindow(){
break; break;
case slsDetectorDefs::EIGER: case slsDetectorDefs::EIGER:
if (myDet->setQuad()) { if (myDet->setQuad()) {
nPixelsX = (myDet->getTotalNumberOfChannelsInclGapPixels(slsDetectorDefs::X) / 2); nPixelsX /= 2;
nPixelsY = myDet->getTotalNumberOfChannelsInclGapPixels(slsDetectorDefs::Y) * 2; nPixelsY *= 2;
if (nPixelsX != nPixelsY) { if (nPixelsX != nPixelsY) {
--nPixelsX; --nPixelsX;
} }
@ -606,8 +606,8 @@ void qDrawPlot::SetScanArgument(int scanArg){
break; break;
case slsDetectorDefs::EIGER: case slsDetectorDefs::EIGER:
if (myDet->setQuad()) { if (myDet->setQuad()) {
nPixelsX = (myDet->getTotalNumberOfChannelsInclGapPixels(slsDetectorDefs::X) / 2); nPixelsX /= 2;
nPixelsY = myDet->getTotalNumberOfChannelsInclGapPixels(slsDetectorDefs::Y) * 2; nPixelsY *= 2;
if (nPixelsX != nPixelsY) { if (nPixelsX != nPixelsY) {
--nPixelsX; --nPixelsX;
} }

View File

@ -1,9 +1,9 @@
Path: slsDetectorsPackage/slsDetectorSoftware/eigerDetectorServer Path: slsDetectorsPackage/slsDetectorSoftware/eigerDetectorServer
URL: origin git@github.com:slsdetectorgroup/slsDetectorPackage.git URL: origin git@github.com:slsdetectorgroup/slsDetectorPackage.git
Repository Root: origin git@github.com:slsdetectorgroup/slsDetectorPackage.git Repository Root: origin git@github.com:slsdetectorgroup/slsDetectorPackage.git
Repsitory UUID: c5f22757037a3aab60f5d91514d10d59440a29f6 Repsitory UUID: 2a88bc6a1eac9777390af1d1fb9aa02960ebfe2d
Revision: 358 Revision: 359
Branch: 4.1.0-rc Branch: 4.1.0-rc
Last Changed Author: Dhanya_Thattil Last Changed Author: Dhanya_Thattil
Last Changed Rev: 4126 Last Changed Rev: 4130
Last Changed Date: 2019-08-06 17:19:23.000000001 +0200 ./FebRegisterDefs.h Last Changed Date: 2019-08-14 09:25:41.000000001 +0200 ./xparameters.h

View File

@ -1,6 +1,6 @@
#define GITURL "git@github.com:slsdetectorgroup/slsDetectorPackage.git" #define GITURL "git@github.com:slsdetectorgroup/slsDetectorPackage.git"
#define GITREPUUID "c5f22757037a3aab60f5d91514d10d59440a29f6" #define GITREPUUID "2a88bc6a1eac9777390af1d1fb9aa02960ebfe2d"
#define GITAUTH "Dhanya_Thattil" #define GITAUTH "Dhanya_Thattil"
#define GITREV 0x4126 #define GITREV 0x4130
#define GITDATE 0x20190806 #define GITDATE 0x20190814
#define GITBRANCH "4.1.0-rc" #define GITBRANCH "4.1.0-rc"

View File

@ -4988,6 +4988,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 runningList[zmqSocket.size()], connectList[zmqSocket.size()]; bool runningList[zmqSocket.size()], connectList[zmqSocket.size()];
int numRunning = 0; int numRunning = 0;
@ -5072,6 +5073,7 @@ void multiSlsDetector::readFrameFromReceiver() {
eiger = (doc["detType"].GetUint() == (int)EIGER) ? true : false; eiger = (doc["detType"].GetUint() == (int)EIGER) ? true : false;
// gap pixels enable // gap pixels enable
gappixelsenable = (doc["gappixels"].GetUint() == 0) ? false : true; gappixelsenable = (doc["gappixels"].GetUint() == 0) ? false : true;
quadEnable = (doc["quad"].GetUint() == 0) ? false : true;
#ifdef VERBOSE #ifdef VERBOSE
cprintf(BLUE, "(Debug) One Time Header Info:\n" cprintf(BLUE, "(Debug) One Time Header Info:\n"
@ -5084,9 +5086,10 @@ void multiSlsDetector::readFrameFromReceiver() {
"nX: %u\n" "nX: %u\n"
"nY: %u\n" "nY: %u\n"
"eiger: %d\n" "eiger: %d\n"
"gappixelsenable: %d\n", "gappixelsenable: %d\n"
"quadEnable: %d\n",
size, multisize, dynamicRange, bytesPerPixel, size, multisize, dynamicRange, bytesPerPixel,
nPixelsX, nPixelsY, nX, nY, eiger, gappixelsenable); nPixelsX, nPixelsY, nX, nY, eiger, gappixelsenable, quadEnable);
#endif #endif
} }
// each time, parse rest of header // each time, parse rest of header
@ -5154,12 +5157,24 @@ void multiSlsDetector::readFrameFromReceiver() {
} }
} }
} }
#ifdef VERBOSE
cprintf(BLUE,"nPixelsX:%d, nPixelsY:%d nx:%d ny:%d quadEnable:%d\n", nDetPixelsX, nDetPixelsY, nX, nY, quadEnable);
#endif
//send data to callback //send data to callback
if (data) { if (data) {
// 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);
}
#ifdef VERBOSE
cprintf(RED,"Corrected nPixelsX:%d, nPixelsY:%d quadEnable:%d\n", nDetPixelsX, nDetPixelsY, quadEnable);
#endif
int n = processImageWithGapPixels(multiframe, multigappixels, quadEnable);
thisData = new detectorData(NULL, NULL, NULL, getCurrentProgress(), thisData = new detectorData(NULL, NULL, NULL, getCurrentProgress(),
currentFileName.c_str(), nDetPixelsX, nDetPixelsY, currentFileName.c_str(), nDetPixelsX, nDetPixelsY,
multigappixels, n, dynamicRange, currentFileIndex); multigappixels, n, dynamicRange, currentFileIndex);
@ -5211,14 +5226,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 (divided by 2 already)
int nxb = thisMultiDetector->numberOfDetector[X] * (512 + 3); int nxb = thisMultiDetector->numberOfDetector[X] * (512 + 3);
int nyb = thisMultiDetector->numberOfDetector[Y] * (256 + 1); int nyb = thisMultiDetector->numberOfDetector[Y] * (256 + 1);
int gapdatabytes = nxb * nyb; int nchipInRow = 4;
int nxchip = thisMultiDetector->numberOfDetector[X] * 4; int nxchip = thisMultiDetector->numberOfDetector[X] * 4;
int nychip = thisMultiDetector->numberOfDetector[Y] * 1; int nychip = thisMultiDetector->numberOfDetector[Y] * 1;
if (quadEnable) {
nxb = thisMultiDetector->numberOfDetector[X] * (256 + 1);
nyb = thisMultiDetector->numberOfDetector[Y] * (512 + 2);
nxchip /= 2;
nychip *= 2;
nchipInRow /= 2;
}
int gapdatabytes = nxb * nyb;
// allocate // allocate
if (gpImage == NULL) if (gpImage == NULL)
@ -5234,13 +5258,13 @@ 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; ++ichipy) { //for each row in a chip 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); memcpy(dst, src, b1chipx);
src += b1chipx; src += b1chipx;
dst += b1chipx; dst += b1chipx;
if ((col + 1) % 4) if ((col + 1) % nchipInRow) // 1, 2, and 3rd chip, skip gap pixels
++dst; ++dst;
} }
} }
@ -5253,11 +5277,11 @@ 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; ++ichipy) { //for each row in a chip 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; dst += b1chipx;
mod = (col + 1) % 4; mod = (col + 1) % nchipInRow; // 1, 2, and 3rd chip, get gap pixels
// copy gap pixel(chip 0, 1, 2) // copy gap pixel(chip 0, 1, 2)
if (mod) { if (mod) {
// neighbouring gap pixels to left // neighbouring gap pixels to left
@ -5288,8 +5312,8 @@ int multiSlsDetector::processImageWithGapPixels(char* image, char*& gpImage) {
{ {
uint8_t temp, g1, g2; uint8_t temp, g1, g2;
char* dst_prevline = 0; char* dst_prevline = 0;
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 (bottom parts) // horizontal copying of gap pixels from neighboring past line (bottom parts)
if (row < nychip - 1) { if (row < nychip - 1) {

View File

@ -1926,9 +1926,10 @@ private:
* add gap pixels to the image (only for Eiger in 4 bit mode) * add gap pixels to the image (only for Eiger in 4 bit mode)
* @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 inside function * @param gpImage poiner to image with gap pixels, if NULL, allocated inside function
* @param 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);
/** Multi detector Id */ /** Multi detector Id */

View File

@ -752,6 +752,7 @@ void slsDetector::initializeDetectorStructure(detectorType type) {
thisDetector->activated = true; thisDetector->activated = true;
thisDetector->receiver_deactivatedPaddingEnable = true; thisDetector->receiver_deactivatedPaddingEnable = true;
thisDetector->receiver_silentMode = false; thisDetector->receiver_silentMode = false;
thisDetector->quadEnable = false;
// get the detector parameters based on type // get the detector parameters based on type
detParameterList detlist; detParameterList detlist;
@ -2367,6 +2368,12 @@ int slsDetector::updateDetectorNoWait() {
getTotalNumberOfChannels(); getTotalNumberOfChannels();
} }
if(thisDetector->myDetectorType == EIGER){
n += controlSocket->ReceiveDataOnly( &nm,sizeof(int32_t));
thisDetector->quadEnable = nm;
}
if (!n) if (!n)
printf("n: %d\n", n); printf("n: %d\n", n);
@ -5306,6 +5313,9 @@ string slsDetector::setReceiver(string receiverIP) {
if(thisDetector->myDetectorType == GOTTHARD) if(thisDetector->myDetectorType == GOTTHARD)
sendROI(-1, NULL); sendROI(-1, NULL);
if (thisDetector->myDetectorType == EIGER) {
setQuad(-1);
}
} }
} }
@ -9778,6 +9788,7 @@ int slsDetector::setQuad(int val) {
setErrorMask((getErrorMask())|(SOME_ERROR)); setErrorMask((getErrorMask())|(SOME_ERROR));
} }
controlSocket->ReceiveDataOnly(&retval,sizeof(retval)); controlSocket->ReceiveDataOnly(&retval,sizeof(retval));
thisDetector->quadEnable = retval;
disconnectControl(); disconnectControl();
if (ret==FORCE_UPDATE) if (ret==FORCE_UPDATE)
updateDetector(); updateDetector();
@ -9790,11 +9801,11 @@ int slsDetector::setQuad(int val) {
if (ret != FAIL) { if (ret != FAIL) {
ret = FAIL; ret = FAIL;
if(thisDetector->receiverOnlineFlag==ONLINE_FLAG){ if(thisDetector->receiverOnlineFlag==ONLINE_FLAG){
if(val ==-1) {
val = thisDetector->quadEnable;
}
#ifdef VERBOSE #ifdef VERBOSE
if(val ==-1) std::cout<< "Setting Receiver Quad Mode to " << val << endl;
std::cout<< "Getting Receiver Quad mode" << endl;
else
std::cout<< "Setting Receiver Quad Mode to " << val << endl;
#endif #endif
if (connectData() == OK){ if (connectData() == OK){
ret=thisReceiver->sendInt(fnum2,retval,val); ret=thisReceiver->sendInt(fnum2,retval,val);

View File

@ -19,7 +19,7 @@ class multiSlsDetector;
class SharedMemory; class SharedMemory;
class receiverInterface; class receiverInterface;
#define SLS_SHMVERSION 0x180629 #define SLS_SHMVERSION 0x180630
#define NMODMAXX 24 #define NMODMAXX 24
#define NMODMAXY 24 #define NMODMAXY 24
#define NCHIPSMAX 10 #define NCHIPSMAX 10
@ -384,6 +384,9 @@ private:
/** silent receiver */ /** silent receiver */
bool receiver_silentMode; bool receiver_silentMode;
/** quad enable */
bool quadEnable;
} sharedSlsDetector; } sharedSlsDetector;

View File

@ -3734,6 +3734,14 @@ int send_update(int file_des) {
if (n < 0) return printSocketReadError(); if (n < 0) return printSocketReadError();
#ifdef EIGERD
#ifdef SLS_DETECTOR_FUNCTION_LIST
nm=getQuad();
#endif
n = sendData(file_des,&nm,sizeof(int32_t),INT32);
if (n < 0) return printSocketReadError();
#endif
if (lockStatus==0) { if (lockStatus==0) {
strcpy(lastClientIP,thisClientIP); strcpy(lastClientIP,thisClientIP);
} }

View File

@ -32,9 +32,10 @@ class DataStreamer : private virtual slsReceiverDefs, public ThreadObject {
* @param sm pointer to silent mode * @param sm pointer to silent mode
* @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, std::vector<ROI>* r, DataStreamer(int ind, Fifo*& f, uint32_t* dr, std::vector<ROI>* r,
uint64_t* fi, int fd, char* ajh, bool* sm, int* nd, bool* gpEnable); uint64_t* fi, int fd, char* ajh, bool* sm, int* nd, bool* gpEnable, bool* qe);
/** /**
* Destructor * Destructor
@ -227,5 +228,7 @@ class DataStreamer : private virtual slsReceiverDefs, public ThreadObject {
/** Gap Pixels Enable */ /** Gap Pixels Enable */
bool* gapPixelsEnable; bool* gapPixelsEnable;
/** quad enable */
bool* quadEnable;
}; };

View File

@ -274,7 +274,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, uint32_t gapPixelsEnable = 0, uint32_t flippedDataX = 0, uint8_t detType = 0, uint8_t version = 0, uint32_t gapPixelsEnable = 0, uint32_t flippedDataX = 0,
char* additionalJsonHeader = 0) { uint32_t quadEnable = 0, char* additionalJsonHeader = 0) {
char buf[MAX_STR_LENGTH] = ""; char buf[MAX_STR_LENGTH] = "";
@ -308,7 +308,8 @@ public:
//additional stuff //additional stuff
"\"gappixels\":%u, " "\"gappixels\":%u, "
"\"flippedDataX\":%u" "\"flippedDataX\":%u, "
"\"quad\":%u"
;//"}\n"; ;//"}\n";
int length = sprintf(buf, jsonHeaderFormat, int length = sprintf(buf, jsonHeaderFormat,
@ -321,7 +322,8 @@ public:
//additional stuff //additional stuff
gapPixelsEnable, gapPixelsEnable,
flippedDataX flippedDataX,
quadEnable
); );
if (additionalJsonHeader && strlen(additionalJsonHeader)) { if (additionalJsonHeader && strlen(additionalJsonHeader)) {
length = sprintf(buf, "%s, %s}\n", buf, additionalJsonHeader); length = sprintf(buf, "%s, %s}\n", buf, additionalJsonHeader);

View File

@ -16,7 +16,7 @@ const std::string DataStreamer::TypeName = "DataStreamer";
DataStreamer::DataStreamer(int ind, Fifo*& f, uint32_t* dr, std::vector<ROI>* r, DataStreamer::DataStreamer(int ind, Fifo*& f, uint32_t* dr, std::vector<ROI>* r,
uint64_t* fi, int fd, char* ajh, bool* sm, int* nd, bool* gpEnable) : uint64_t* fi, int fd, char* ajh, bool* sm, int* nd, bool* gpEnable, bool* qe) :
ThreadObject(ind), ThreadObject(ind),
runningFlag(0), runningFlag(0),
generalData(0), generalData(0),
@ -33,7 +33,8 @@ DataStreamer::DataStreamer(int ind, Fifo*& f, uint32_t* dr, std::vector<ROI>* r,
firstAcquisitionIndex(0), firstAcquisitionIndex(0),
firstMeasurementIndex(0), firstMeasurementIndex(0),
completeBuffer(0), completeBuffer(0),
gapPixelsEnable(gpEnable) gapPixelsEnable(gpEnable),
quadEnable(qe)
{ {
numDet[0] = nd[0]; numDet[0] = nd[0];
numDet[1] = nd[1]; numDet[1] = nd[1];
@ -279,7 +280,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

@ -338,7 +338,7 @@ int UDPStandardImplementation::setDataStreamEnable(const bool enable) {
nd[1] = 2; nd[1] = 2;
} }
DataStreamer* s = new DataStreamer(i, fifo[i], &dynamicRange, DataStreamer* s = new DataStreamer(i, fifo[i], &dynamicRange,
&roi, &fileIndex, fd, additionalJsonHeader, &silentMode, (int*)nd, &gapPixelsEnable); &roi, &fileIndex, fd, additionalJsonHeader, &silentMode, (int*)nd, &gapPixelsEnable, &quadEnable);
dataStreamer.push_back(s); dataStreamer.push_back(s);
dataStreamer[i]->SetGeneralData(generalData); dataStreamer[i]->SetGeneralData(generalData);
dataStreamer[i]->CreateZmqSockets(&numThreads, streamingPort, streamingSrcIP); dataStreamer[i]->CreateZmqSockets(&numThreads, streamingPort, streamingSrcIP);