diff --git a/slsDetectorCalibration/gotthardModuleData.h b/slsDetectorCalibration/gotthardModuleData.h new file mode 100644 index 000000000..297f95989 --- /dev/null +++ b/slsDetectorCalibration/gotthardModuleData.h @@ -0,0 +1,165 @@ +#ifndef GOTTHARDMODULEDATA_H +#define GOTTHARDMODULEDATA_H +#include "slsReceiverData.h" + + + +#define X_PIXELS 1280 +#define Y_PIXELS 1 +#define NPACKETS 2 +#define BUFFERSIZE 1286 +#define NUMPACKETS 2 +#define NUMSHORTPACKETS 1 +#define FRAMEMASK 0xFFFFFFFE +#define PACKETMASK 1 +#define FRAMEOFFSET 0x1 +#define SHORT_FRAMEMASK 0xFFFFFFFF +#define SHORT_PACKETMASK 0 +#define SHORT_FRAMEOFFSET 0 + + +class gotthardModuleData : public slsReceiverData { +public: + + + + + /** + Implements the slsReceiverData structure for the gotthard read out by a module i.e. using the slsReceiver + (1x1280 pixels, 2 packets 1286 large etc.) + \param c crosstalk parameter for the output buffer + + */ + + + gotthardModuleData(double c=0, bool s=-1): slsReceiverData(X_PIXELS, Y_PIXELS, NPACKETS, BUFFERSIZE), xtalk(c),shortFrame(s) { + + + if(shortFrame == -1) + shortFrame = 0; + else + shortFrame = 1; + + uint16_t **dMask; + int **dMap; + int ix, iy; + int initial_offset = 2; + int offset = initial_offset; + + + dMask=new uint16_t*[Y_PIXELS]; + dMap=new int*[Y_PIXELS]; + for (int i = 0; i < Y_PIXELS; i++) { + dMap[i] = new int[X_PIXELS]; + dMask[i] = new uint16_t[X_PIXELS]; + } + + + for(ix=0; ix::getValue(data, ix, iy); + else + return slsDetectorData::getValue(data, ix, iy)-xtalk*slsDetectorData::getValue(data, ix-1, iy); + }; + + + + /** sets the output buffer crosstalk correction parameter + \param c output buffer crosstalk correction parameter to be set + \returns current value for the output buffer crosstalk correction parameter + + */ + double setXTalk(double c) {xtalk=c; return xtalk;} + + + /** gets the output buffer crosstalk parameter + \returns current value for the output buffer crosstalk correction parameter + */ + double getXTalk() {return xtalk;} + + + + + + + +private: + + double xtalk; /** { */ - moench02ModuleData(double c=0): slsReceiverData(160, 160, 40, 1286), + moench02ModuleData(double c=0): slsReceiverData(160, 160, 40, 1286), xtalk(c) { @@ -65,10 +65,11 @@ class moench02ModuleData : public slsReceiverData { setDataMap(dMap); setDataMask(dMask); + setFrameIndexMask(0xffffff00); + setPacketIndexMask(0xff); + setFrameIndexOffset(8); - - }; diff --git a/slsDetectorCalibration/slsDetectorData.h b/slsDetectorCalibration/slsDetectorData.h index 0d4067e13..ffa239373 100644 --- a/slsDetectorCalibration/slsDetectorData.h +++ b/slsDetectorCalibration/slsDetectorData.h @@ -82,7 +82,7 @@ class slsDetectorData { for (int ix=0; ix { \param dROI Array of size nx*ny. The elements are 1s if the channel is good or in the ROI, 0 is bad or out of the ROI. NULL (default) means all 1s. */ - slsReceiverData(int npx, int npy, int np, int psize, int **dMap=NULL, dataType **dMask=NULL, int **dROI=NULL): slsDetectorData(npx, npy, np*psize, dMap, dMask, dROI), nPackets(np), packetSize(psize) {}; + slsReceiverData(int npx, int npy, int np, int psize, int **dMap=NULL, dataType **dMask=NULL, int **dROI=NULL): slsDetectorData(npx, npy, np*psize, dMap, dMask, dROI), nPackets(np), packetSize(psize),frameIndexMask(0),packetIndexMask(0),frameIndexOffset(0) {}; - - /** + /** + + Sets frame index mask for the given dataset. Virtual func: works for slsDetectorReceiver packets, but can be overloaded. + \param m frame index mask + + */ + + virtual void setFrameIndexMask(uint32_t m) {frameIndexMask = m;}; + + /** + + Sets the packet index mask for the given dataset. Virtual func: works for slsDetectorReceiver packets, but can be overloaded. + \param m packet index mask + + */ + + virtual void setPacketIndexMask(uint32_t m) {packetIndexMask = m;}; + + /** + + Sets the frame index offset for the given dataset. Virtual func: works for slsDetectorReceiver packets, but can be overloaded. + \param o frame index offset + */ + + virtual void setFrameIndexOffset(int o) {frameIndexOffset = o;}; + + /** Returns the frame number for the given dataset. Virtual func: works for slsDetectorReceiver data (also for each packet), but can be overloaded. \param buff pointer to the dataset \returns frame number - */ + */ - virtual int getFrameNumber(char *buff){return ((*(int*)buff)&(0xffffff00))>>8;}; + virtual int getFrameNumber(char *buff){return ((*(int*)buff)&(frameIndexMask))>>frameIndexOffset;};/*{return ((*(int*)buff)&(0xffffff00))>>8;};*/ - /** + /** Returns the packet number for the given dataset. Virtual func: works for slsDetectorReceiver packets, but can be overloaded. \param buff pointer to the dataset @@ -45,7 +70,7 @@ class slsReceiverData : public slsDetectorData { */ - virtual int getPacketNumber(char *buff) {return (*(int*)buff)&0xff;}; + virtual int getPacketNumber(char *buff) {return (*(int*)buff)&packetIndexMask;};/*{return (*(int*)buff)&0xff;};*/ @@ -61,52 +86,52 @@ class slsReceiverData : public slsDetectorData { */ virtual char *findNextFrame(char *data, int &ndata, int dsize) { - char *retval=NULL, *p=data; - int dd=0; - int fn, fnum=-1, np=0, pnum=-1; - while (dd<=(dsize-packetSize)) { - pnum=getPacketNumber(p); - fn=getFrameNumber(p); + char *retval=NULL, *p=data; + int dd=0; + int fn, fnum=-1, np=0, pnum=-1; + while (dd<=(dsize-packetSize)) { + pnum=getPacketNumber(p); + fn=getFrameNumber(p); - if (pnum<1 || pnum>nPackets) { - cout << "Bad packet number " << pnum << " frame "<< fn << endl; - retval=NULL; - np=0; - } else if (pnum==1) { - fnum=fn; - retval=p; - if (np>0) - /*cout << "*Incomplete frame number " << fnum << endl;*/ - np=0; - } else if (fn!=fnum) { - if (fnum!=-1) { - /* cout << " **Incomplete frame number " << fnum << " pnum " << pnum << " " << getFrameNumber(p) << endl;*/ - retval=NULL; - } - np=0; - } - p+=packetSize; - dd+=packetSize; - np++; - // cout << pnum << " " << fn << " " << np << " " << dd << " " << dsize << endl; - if (np==nPackets) - if (pnum==nPackets) { - // cout << "Frame found!" << endl; - break; - } else { - cout << "Too many packets for this frame! "<< fnum << " " << pnum << endl; - retval=NULL; - } - } - if (np0) - cout << "Too few packets for this frame! "<< fnum << " " << pnum << endl; - } - - ndata=np*packetSize; - // cout << "return " << ndata << endl; - return retval; + if (pnum<1 || pnum>nPackets) { + cout << "Bad packet number " << pnum << " frame "<< fn << endl; + retval=NULL; + np=0; + } else if (pnum==1) { + fnum=fn; + retval=p; + if (np>0) + /*cout << "*Incomplete frame number " << fnum << endl;*/ + np=0; + } else if (fn!=fnum) { + if (fnum!=-1) { + /* cout << " **Incomplete frame number " << fnum << " pnum " << pnum << " " << getFrameNumber(p) << endl;*/ + retval=NULL; + } + np=0; + } + p+=packetSize; + dd+=packetSize; + np++; + // cout << pnum << " " << fn << " " << np << " " << dd << " " << dsize << endl; + if (np==nPackets) + if (pnum==nPackets) { + // cout << "Frame found!" << endl; + break; + } else { + cout << "Too many packets for this frame! "<< fnum << " " << pnum << endl; + retval=NULL; + } + } + if (np0) + cout << "Too few packets for this frame! "<< fnum << " " << pnum << endl; + } + + ndata=np*packetSize; + // cout << "return " << ndata << endl; + return retval; }; /** @@ -165,6 +190,9 @@ class slsReceiverData : public slsDetectorData { private: const int nPackets; /**