From 328279d3158770559d8cf9d52482d68c635ad4d7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Erik=20Fr=C3=B6jdh?= Date: Mon, 31 Jan 2022 11:55:12 +0100 Subject: [PATCH] Moenchstuff (#358) * using standard header in moench03T1Receiver * restructure slsDetectorData added override to moench03T1ReceiverDataNew * removed unused function --- .../moench03T1ReceiverDataNew.h | 153 +---- .../dataStructures/slsDetectorData.h | 579 +++++++++--------- 2 files changed, 299 insertions(+), 433 deletions(-) diff --git a/slsDetectorCalibration/dataStructures/moench03T1ReceiverDataNew.h b/slsDetectorCalibration/dataStructures/moench03T1ReceiverDataNew.h index 3d23cf3cf..b4716e5fc 100644 --- a/slsDetectorCalibration/dataStructures/moench03T1ReceiverDataNew.h +++ b/slsDetectorCalibration/dataStructures/moench03T1ReceiverDataNew.h @@ -2,49 +2,9 @@ // Copyright (C) 2021 Contributors to the SLS Detector Package #ifndef MOENCH03T1RECDATANEW_H #define MOENCH03T1RECDATANEW_H +#include "sls/sls_detector_defs.h" #include "slsDetectorData.h" -//#define VERSION_V2 -/** - @short structure for a Detector Packet or Image Header - @li frameNumber is the frame number - @li expLength is the subframe number (32 bit eiger) or real time exposure - time in 100ns (others) - @li packetNumber is the packet number - @li bunchId is the bunch id from beamline - @li timestamp is the time stamp with 10 MHz clock - @li modId is the unique module id (unique even for left, right, top, bottom) - @li xCoord is the x coordinate in the complete detector system - @li yCoord is the y coordinate in the complete detector system - @li zCoord is the z coordinate in the complete detector system - @li debug is for debugging purposes - @li roundRNumber is the round robin set number - @li detType is the detector type see :: detectorType - @li version is the version number of this structure format -*/ -typedef struct { - uint64_t frameNumber; /**< is the frame number */ - uint32_t expLength; /**< is the subframe number (32 bit eiger) or real time - exposure time in 100ns (others) */ - uint32_t packetNumber; /**< is the packet number */ - uint64_t bunchId; /**< is the bunch id from beamline */ - uint64_t timestamp; /**< is the time stamp with 10 MHz clock */ - uint16_t modId; /**< is the unique module id (unique even for left, right, - top, bottom) */ - uint16_t xCoord; /**< is the x coordinate in the complete detector system */ - uint16_t yCoord; /**< is the y coordinate in the complete detector system */ - uint16_t zCoord; /**< is the z coordinate in the complete detector system */ - uint32_t debug; /**< is for debugging purposes */ - uint16_t roundRNumber; /**< is the round robin set number */ - uint8_t detType; /**< is the detector type see :: detectorType */ - uint8_t version; /**< is the version number of this structure format */ -#ifndef VERSION_V1 - uint64_t - packetCaught[8]; /**< is the version number of this structure format */ -#endif - -} sls_detector_header; - class moench03T1ReceiverDataNew : public slsDetectorData { private: @@ -56,6 +16,9 @@ class moench03T1ReceiverDataNew : public slsDetectorData { double ghost[200][25]; + // Single point of definition if we need to customize + using header = sls::defs::sls_receiver_header; + public: /** Implements the slsReceiverData structure for the moench02 prototype read @@ -64,8 +27,7 @@ class moench03T1ReceiverDataNew : public slsDetectorData { */ moench03T1ReceiverDataNew(int ns = 5000) - : slsDetectorData(400, 400, - ns * 2 * 32 + sizeof(sls_detector_header)), + : slsDetectorData(400, 400, ns * 2 * 32 + sizeof(header)), nSamples(ns) { int nadc = 32; @@ -100,7 +62,7 @@ class moench03T1ReceiverDataNew : public slsDetectorData { } else { row = 200 + i / sc_width; } - dataMap[row][col] = sizeof(sls_detector_header) + + dataMap[row][col] = sizeof(header) + (nadc * i + iadc) * 2; //+16*(ip+1); #ifdef HIGHZ dataMask[row][col] = 0x3fff; // invert data @@ -108,7 +70,7 @@ class moench03T1ReceiverDataNew : public slsDetectorData { if (dataMap[row][col] < 0 || dataMap[row][col] >= nSamples * 2 * 32) std::cout << "Error: pointer " << dataMap[row][col] - << " out of range " << std::endl; + << " out of range " << std::endl; } } } @@ -122,11 +84,11 @@ class moench03T1ReceiverDataNew : public slsDetectorData { int ipacket; uint ibyte; int ii = 0; - for (ibyte = 0; ibyte < sizeof(sls_detector_header) / 2; ibyte++) { + for (ibyte = 0; ibyte < sizeof(header) / 2; ibyte++) { xmap[ibyte] = -1; ymap[ibyte] = -1; } - int off = sizeof(sls_detector_header) / 2; + int off = sizeof(header) / 2; for (ipacket = 0; ipacket < npackets; ipacket++) { for (ibyte = 0; ibyte < 8192 / 2; ibyte++) { i = ipacket * 8208 / 2 + ibyte; @@ -161,20 +123,7 @@ class moench03T1ReceiverDataNew : public slsDetectorData { required as double */ - virtual double getValue(char *data, int ix, int iy = 0) { - /* cout << " x "<< ix << " y"<< iy << " val " << getChannel(data, ix, - * iy)<< endl;*/ - /* double val=0, vout=getChannel(data, ix, iy); */ - /* int x1=ix%25; */ - /* for (int ix=0; ix<16; ix++) { */ - /* for (int ii=0; ii<2; ii++) { */ - /* val+=getChannel(data,x1+25*ix,iy); */ - /* val+=getChannel(data,x1+25*ix,399-iy); */ - /* } */ - /* } */ - /* vout+=0.0008*val-6224; */ - /* return vout; //(double)getChannel(data, ix, iy); - */ + double getValue(char *data, int ix, int iy = 0) override { uint16_t val = getChannel(data, ix, iy) & 0x3fff; return val; }; @@ -225,17 +174,9 @@ class moench03T1ReceiverDataNew : public slsDetectorData { */ - /* class jfrau_packet_header_t { */ - /* public: */ - /* unsigned char reserved[4]; */ - /* unsigned char packetNumber[1]; */ - /* unsigned char frameNumber[3]; */ - /* unsigned char bunchid[8]; */ - /* }; */ - int getFrameNumber(char *buff) { - return ((sls_detector_header *)buff)->frameNumber; - }; //*((int*)(buff+5))&0xffffff;}; + return ((header *)buff)->detHeader.frameNumber; + } /** @@ -247,67 +188,21 @@ class moench03T1ReceiverDataNew : public slsDetectorData { */ int getPacketNumber(char *buff) { - return ((sls_detector_header *)buff)->packetNumber; - } //((*(((int*)(buff+4))))&0xff)+1;}; + return ((header *)buff)->detHeader.packetNumber; + } - /* /\** */ - - /* Loops over a memory slot until a complete frame is found (i.e. all - * packets 0 to nPackets, same frame number). purely virtual func */ - /* \param data pointer to the memory to be analyzed */ - /* \param ndata reference to the amount of data found for the frame, in - * case the frame is incomplete at the end of the memory slot */ - /* \param dsize size of the memory slot to be analyzed */ - /* \returns pointer to the beginning of the last good frame (might be - * incomplete if ndata smaller than dataSize), or NULL if no frame is found - */ - - /* *\/ */ - /* virtual char *findNextFrame(char *data, int &ndata, int - * dsize){ndata=dsize; setDataSize(dsize); return data;}; */ - - /* /\** */ - - /* Loops over a file stream until a complete frame is found (i.e. all - * packets 0 to nPackets, same frame number). Can be overloaded for - * different kind of detectors! */ - /* \param filebin input file stream (binary) */ - /* \returns pointer to the begin of the last good frame, NULL if no - * frame is found or last frame is incomplete */ - - /* *\/ */ - /* virtual char *readNextFrame(ifstream &filebin){ */ - /* // int afifo_length=0; */ - /* uint16_t *afifo_cont; */ - /* int ib=0; */ - /* if (filebin.is_open()) { */ - /* afifo_cont=new uint16_t[dataSize/2]; */ - /* while (filebin.read(((char*)afifo_cont)+ib,2)) { */ - /* ib+=2; */ - /* if (ib==dataSize) break; */ - /* } */ - /* if (ib>0) { */ - /* iframe++; */ - /* // cout << ib << "-" << endl; */ - /* return (char*)afifo_cont; */ - /* } else { */ - /* delete [] afifo_cont; */ - /* return NULL; */ - /* } */ - /* } */ - /* return NULL; */ - /* }; */ - - virtual char *readNextFrame(std::ifstream &filebin) { + char *readNextFrame(std::ifstream &filebin) override { int ff = -1, np = -1; return readNextFrame(filebin, ff, np); - }; + } + // not present in base class virtual char *readNextFrame(std::ifstream &filebin, int &ff) { int np = -1; return readNextFrame(filebin, ff, np); }; + // not present in base class virtual char *readNextFrame(std::ifstream &filebin, int &ff, int &np) { char *data = new char[dataSize]; char *d = readNextFrame(filebin, ff, np, data); @@ -318,14 +213,10 @@ class moench03T1ReceiverDataNew : public slsDetectorData { return data; } + // not present in base class virtual char *readNextFrame(std::ifstream &filebin, int &ff, int &np, char *data) { - np = 0; - - // cout << dataSize << endl; - - if (filebin.is_open()) { if (filebin.read(data, dataSize)) { ff = getFrameNumber(data); @@ -333,8 +224,8 @@ class moench03T1ReceiverDataNew : public slsDetectorData { return data; } } - return NULL; - }; + return nullptr; + } /** @@ -348,7 +239,7 @@ class moench03T1ReceiverDataNew : public slsDetectorData { found */ - virtual char *findNextFrame(char *data, int &ndata, int dsize) { + char *findNextFrame(char *data, int &ndata, int dsize) override { if (dsize < dataSize) ndata = dsize; else diff --git a/slsDetectorCalibration/dataStructures/slsDetectorData.h b/slsDetectorCalibration/dataStructures/slsDetectorData.h index e2946b5f4..f7b3f1a5b 100644 --- a/slsDetectorCalibration/dataStructures/slsDetectorData.h +++ b/slsDetectorCalibration/dataStructures/slsDetectorData.h @@ -26,13 +26,11 @@ template class slsDetectorData { public: /** - - - General slsDetectors data structure. Works for data acquired using the + General slsDetectors data structure. Works for data acquired using the slsDetectorReceiver. Can be generalized to other detectors (many virtual funcs). - Constructor (no error checking if datasize and offsets are compatible!) + Constructor (no error checking if datasize and offsets are compatible!) \param npx number of pixels in the x direction \param npy number of pixels in the y direction (1 for strips) \param dsize size of the data @@ -42,309 +40,26 @@ template class slsDetectorData { is inversion is required) \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. - */ slsDetectorData(int npx, int npy, int dsize, int **dMap = NULL, - dataType **dMask = NULL, int **dROI = NULL) - : nx(npx), ny(npy), dataSize(dsize), orderedData(NULL), isOrdered(0) { + dataType **dMask = NULL, int **dROI = NULL); - int el = dsize / sizeof(dataType); - xmap = new int[el]; - ymap = new int[el]; - - orderedData = new dataType *[ny]; - dataMap = new int *[ny]; - dataMask = new dataType *[ny]; - dataROIMask = new int *[ny]; - for (int i = 0; i < ny; i++) { - dataMap[i] = new int[nx]; - orderedData[i] = new dataType[nx]; - dataMask[i] = new dataType[nx]; - dataROIMask[i] = new int[nx]; - for (int j = 0; j < nx; j++) - dataROIMask[i][j] = 1; - } - - for (int ip = 0; ip < el; ip++) { - xmap[ip] = -1; - ymap[ip] = -1; - } - - setDataMap(dMap); - setDataMask(dMask); - setDataROIMask(dROI); - } - - virtual ~slsDetectorData() { - for (int i = 0; i < ny; i++) { - delete[] dataMap[i]; - delete[] dataMask[i]; - delete[] dataROIMask[i]; - delete[] orderedData[i]; - } - delete[] dataMap; - delete[] dataMask; - delete[] dataROIMask; - delete[] orderedData; - delete[] xmap; - delete[] ymap; - }; + virtual ~slsDetectorData(); + // Virtual functions virtual int getPointer(int ix, int iy) { return dataMap[iy][ix]; }; - /** - defines the data map (as offset) - no error checking if datasize and - offsets are compatible! \param dMap array of size nx*ny storing the - pointers to the data in the dataset (as offset). If NULL (default),the - data are arranged as if read out row by row - (dataMap[iy][ix]=(iy*nx+ix)*sizeof(dataType);) - */ - void setDataMap(int **dMap = NULL) { - - int ip = 0; - int ix, iy; - if (dMap == NULL) { - for (iy = 0; iy < ny; iy++) { - for (ix = 0; ix < nx; ix++) { - dataMap[iy][ix] = (iy * nx + ix) * sizeof(dataType); - } - } - } else { - // cout << "set dmap "<< dataMap << " " << dMap << endl; - for (iy = 0; iy < ny; iy++) { - // cout << iy << endl; - for (ix = 0; ix < nx; ix++) { - dataMap[iy][ix] = dMap[iy][ix]; - // cout << ix << " " << iy << endl; - /*ip=dataMap[ix][iy]/sizeof(dataType); - xmap[ip]=ix; - ymap[ip]=iy;Annaa*/ - } - } - } - for (iy = 0; iy < ny; iy++) { - for (ix = 0; ix < nx; ix++) { - ip = dataMap[iy][ix] / sizeof(dataType); - xmap[ip] = ix; - ymap[ip] = iy; - } - } - - // cout << "nx:" <= 0 && ix < nx && iy >= 0 && iy < ny) - dataROIMask[iy][ix] = i; - return isGood(ix, iy); - }; - /** - Define bad channel or roi mask for a single channel - \param ix channel x coordinate - \param iy channel y coordinate (1 for strips) - \returns 1 if pixel is good, 0 if it's bad, -1 if pixel is out of range - */ - int isGood(int ix, int iy) { - if (ix >= 0 && ix < nx && iy >= 0 && iy < ny) - return dataROIMask[iy][ix]; - else - return -1; - }; - - /** - Returns detector size in x,y - \param npx reference to number of channels in x - \param npy reference to number of channels in y (will be 1 for strips) - \returns total number of channels - */ - int getDetectorSize(int &npx, int &npy) { - npx = nx; - npy = ny; - return nx * ny; - }; - - /** Returns the size of the data frame */ - int getDataSize() { return dataSize; }; - - /** changes the size of the data frame */ - int setDataSize(int d) { - dataSize = d; - return dataSize; - }; - - virtual void getPixel(int ip, int &x, int &y) { - x = xmap[ip]; - y = ymap[ip]; - }; - - virtual dataType **getData(char *ptr, int dsize = -1) { - int el = dsize / sizeof(dataType); - // dataType **data; - int ix, iy; - // data=new dataType*[ny]; - // for(int i = 0; i < ny; i++) { - // data[i]=new dataType[nx]; - // } - isOrdered = 0; - if (dsize <= 0 || dsize > dataSize) - dsize = dataSize; - - for (int ip = 0; ip < (el); ip++) { - getPixel(ip, ix, iy); - if (ix >= 0 && ix < nx && iy >= 0 && iy < ny) { - // data[iy][ix]=getChannel(ptr,ix,iy); - orderedData[iy][ix] = *(ptr + ip); // getChannel(ptr,ix,iy); - } - } - isOrdered = 1; - return orderedData; - } - - void newFrame() { isOrdered = 0; }; - - virtual double **getImage(char *ptr, int dsize = -1) { - - double **data; - int ix, iy; - data = new double *[ny]; - for (int i = 0; i < ny; i++) { - data[i] = new double[nx]; - } - int el = dsize / sizeof(dataType); - if (dsize <= 0 || dsize > dataSize) - dsize = dataSize; - for (int ip = 0; ip < el; ip++) { - getPixel(ip, ix, iy); - if (ix >= 0 && ix < nx && iy >= 0 && iy < ny) { - data[iy][ix] = getValue(ptr, ix, iy); - } - } - return data; - }; - - /** - Returns the value of the selected channel for the given dataset. Virtual - function, can be overloaded. \param data pointer to the dataset - (including headers etc) \param ix pixel number in the x direction \param - iy pixel number in the y direction \returns data for the selected - channel, with inversion if required - - */ - virtual dataType getChannel(char *data, int ix, int iy = 0) { - dataType m = 0, d = 0; - if (ix >= 0 && ix < nx && iy >= 0 && iy < ny && dataMap[iy][ix] >= 0 && - dataMap[iy][ix] < dataSize) { - // cout << ix << " " << iy << " " ; - // cout << dataMap[ix][iy] << " " << (void*)data << " " << - // dataSize<< endl; - m = dataMask[iy][ix]; - if (isOrdered == 0) - d = *((dataType *)(data + getPointer(ix, iy))); - else - d = orderedData[iy][ix]; - } - return d ^ m; - }; - + virtual void getPixel(int ip, int &x, int &y); + virtual dataType **getData(char *ptr, int dsize = -1); + virtual double **getImage(char *ptr, int dsize = -1); + virtual dataType getChannel(char *data, int ix, int iy = 0); virtual int getGain(char *data, int ix, int iy = 0) { return 0; }; - - /** - - Returns the value of the selected channel for the given dataset. Virtual - function, can be overloaded. \param data pointer to the dataset - (including headers etc) \param ix pixel number in the x direction \param - iy pixel number in the y direction \returns data for the selected - channel, with inversion if required or -1 if its a missing packet - - */ - - virtual int getChannelwithMissingPackets(char *data, int ix, int iy) { - return 0; - }; - - /** - Returns the value of the selected channel for the given dataset as - double. \param data pointer to the dataset (including headers etc) \param - ix pixel number in the x direction \param iy pixel number in the y - direction \returns data for the selected channel, with inversion if - required as double - - */ virtual double getValue(char *data, int ix, int iy = 0) { - /* cout << " x "<< ix << " y"<< iy << " val " << getChannel(data, ix, - * iy)<< endl;*/ return (double)getChannel(data, ix, iy); }; - /** - Returns the frame number for the given dataset. Purely virtual func. - \param buff pointer to the dataset - \returns frame number - - */ virtual int getFrameNumber(char *buff) = 0; - + /** - - Returns the packet number for the given dataset. purely virtual func - \param buff pointer to the dataset - \returns packet number number - - - virtual int getPacketNumber(char *buff)=0; - - */ - - /** - Loops over a memory slot until a complete frame is found (i.e. all packets 0 to nPackets, same frame number). purely virtual func \param data pointer to the memory to be analyzed \param ndata reference to the @@ -357,16 +72,276 @@ template class slsDetectorData { */ virtual char *findNextFrame(char *data, int &ndata, int dsize) = 0; - /** + //Returns a pointer to the next complete frame, if none found nullptr + //data needs to be deallocated by caller + virtual char *readNextFrame(std::ifstream &filebin) = 0; - Loops over a file stream until a complete frame is found (i.e. all packets - 0 to nPackets, same frame number). Can be overloaded for different kind of - detectors! \param filebin input file stream (binary) \returns pointer to - the begin of the last good frame, NULL if no frame is found or last frame - is incomplete + + + + + //END Virtual functions + + /** + defines the data map (as offset) - no error checking if datasize and + offsets are compatible! \param dMap array of size nx*ny storing the + pointers to the data in the dataset (as offset). If NULL (default),the + data are arranged as if read out row by row + (dataMap[iy][ix]=(iy*nx+ix)*sizeof(dataType);) + */ + void setDataMap(int **dMap = NULL); + + /** + defines the data mask i.e. the polarity of the data + \param dMask Array of size nx*ny storing the polarity of the data in the + dataset (should be 0 if no inversion is required, 0xffffffff is inversion + is required) */ - virtual char *readNextFrame(std::ifstream &filebin) = 0; + void setDataMask(dataType **dMask = NULL); + /** + defines the region of interest and/or the bad channels mask + \param dROI Array of size nx*ny. The ements are 1s if the channel is + good or in the ROI, 0 is bad or out of the ROI. NULL (default) means all + 1s. + + */ + void setDataROIMask(int **dROI = NULL); + + /** + Define bad channel or roi mask for a single channel + \param ix channel x coordinate + \param iy channel y coordinate (1 for strips) + \param i 1 if pixel is good (or in the roi), 0 if bad + \returns 1 if pixel is good, 0 if it's bad, -1 if pixel is out of range + */ + int setGood(int ix, int iy, int i = 1); + + // returns 1 if pixel is good, 0 if it's bad, -1 if pixel is out of range + int isGood(int ix, int iy); + + // returns total number of channels, outparam npx and npy x,y dimensions + int getDetectorSize(int &npx, int &npy); + + /** Returns the size of the data frame */ + int getDataSize() { return dataSize; }; + + /** changes the size of the data frame */ + int setDataSize(int d) { + dataSize = d; + return dataSize; + }; + + void newFrame() { isOrdered = 0; }; + + /** + Returns the value of the selected channel for the given dataset. Virtual + function, can be overloaded. \param data pointer to the dataset + (including headers etc) \param ix pixel number in the x direction \param + iy pixel number in the y direction \returns data for the selected + channel, with inversion if required + + */ + +}; + +template +slsDetectorData::slsDetectorData(int npx, int npy, int dsize, + int **dMap, dataType **dMask, + int **dROI) + : nx(npx), ny(npy), dataSize(dsize), orderedData(NULL), isOrdered(0) { + + int el = dsize / sizeof(dataType); + xmap = new int[el]; + ymap = new int[el]; + + orderedData = new dataType *[ny]; + dataMap = new int *[ny]; + dataMask = new dataType *[ny]; + dataROIMask = new int *[ny]; + for (int i = 0; i < ny; i++) { + dataMap[i] = new int[nx]; + orderedData[i] = new dataType[nx]; + dataMask[i] = new dataType[nx]; + dataROIMask[i] = new int[nx]; + for (int j = 0; j < nx; j++) + dataROIMask[i][j] = 1; + } + + for (int ip = 0; ip < el; ip++) { + xmap[ip] = -1; + ymap[ip] = -1; + } + + setDataMap(dMap); + setDataMask(dMask); + setDataROIMask(dROI); +} + +template slsDetectorData::~slsDetectorData() { + for (int i = 0; i < ny; i++) { + delete[] dataMap[i]; + delete[] dataMask[i]; + delete[] dataROIMask[i]; + delete[] orderedData[i]; + } + delete[] dataMap; + delete[] dataMask; + delete[] dataROIMask; + delete[] orderedData; + delete[] xmap; + delete[] ymap; +} + +template +void slsDetectorData::setDataMap(int **dMap) { + + int ip = 0; + int ix, iy; + if (dMap == NULL) { + for (iy = 0; iy < ny; iy++) { + for (ix = 0; ix < nx; ix++) { + dataMap[iy][ix] = (iy * nx + ix) * sizeof(dataType); + } + } + } else { + // cout << "set dmap "<< dataMap << " " << dMap << endl; + for (iy = 0; iy < ny; iy++) { + // cout << iy << endl; + for (ix = 0; ix < nx; ix++) { + dataMap[iy][ix] = dMap[iy][ix]; + // cout << ix << " " << iy << endl; + /*ip=dataMap[ix][iy]/sizeof(dataType); + xmap[ip]=ix; + ymap[ip]=iy;Annaa*/ + } + } + } + for (iy = 0; iy < ny; iy++) { + for (ix = 0; ix < nx; ix++) { + ip = dataMap[iy][ix] / sizeof(dataType); + xmap[ip] = ix; + ymap[ip] = iy; + } + } + + // cout << "nx:" < +void slsDetectorData::setDataMask(dataType **dMask) { + + if (dMask != NULL) { + + for (int iy = 0; iy < ny; iy++) + for (int ix = 0; ix < nx; ix++) + dataMask[iy][ix] = dMask[iy][ix]; + } else { + for (int iy = 0; iy < ny; iy++) + for (int ix = 0; ix < nx; ix++) + dataMask[iy][ix] = 0; + } +} + +template +void slsDetectorData::setDataROIMask(int **dROI) { + if (dROI != NULL) { + + for (int iy = 0; iy < ny; iy++) + for (int ix = 0; ix < nx; ix++) + dataROIMask[iy][ix] = dROI[iy][ix]; + } else { + + for (int iy = 0; iy < ny; iy++) + for (int ix = 0; ix < nx; ix++) + dataROIMask[iy][ix] = 1; + } +} + +template +int slsDetectorData::setGood(int ix, int iy, int i) { + if (ix >= 0 && ix < nx && iy >= 0 && iy < ny) + dataROIMask[iy][ix] = i; + return isGood(ix, iy); +} + +template +int slsDetectorData::isGood(int ix, int iy) { + if (ix >= 0 && ix < nx && iy >= 0 && iy < ny) + return dataROIMask[iy][ix]; + else + return -1; +}; + +template +int slsDetectorData::getDetectorSize(int &npx, int &npy) { + npx = nx; + npy = ny; + return nx * ny; +} + +template +void slsDetectorData::getPixel(int ip, int &x, int &y) { + x = xmap[ip]; + y = ymap[ip]; +} + +template +dataType **slsDetectorData::getData(char *ptr, int dsize) { + int el = dsize / sizeof(dataType); + // dataType **data; + int ix, iy; + // data=new dataType*[ny]; + // for(int i = 0; i < ny; i++) { + // data[i]=new dataType[nx]; + // } + isOrdered = 0; + if (dsize <= 0 || dsize > dataSize) + dsize = dataSize; + + for (int ip = 0; ip < (el); ip++) { + getPixel(ip, ix, iy); + if (ix >= 0 && ix < nx && iy >= 0 && iy < ny) { + // data[iy][ix]=getChannel(ptr,ix,iy); + orderedData[iy][ix] = *(ptr + ip); // getChannel(ptr,ix,iy); + } + } + isOrdered = 1; + return orderedData; +} + +template +double **slsDetectorData::getImage(char *ptr, int dsize) { + + double **data; + int ix, iy; + data = new double *[ny]; + for (int i = 0; i < ny; i++) { + data[i] = new double[nx]; + } + int el = dsize / sizeof(dataType); + if (dsize <= 0 || dsize > dataSize) + dsize = dataSize; + for (int ip = 0; ip < el; ip++) { + getPixel(ip, ix, iy); + if (ix >= 0 && ix < nx && iy >= 0 && iy < ny) { + data[iy][ix] = getValue(ptr, ix, iy); + } + } + return data; +} +template +dataType slsDetectorData::getChannel(char *data, int ix, int iy) { + dataType m = 0, d = 0; + if (ix >= 0 && ix < nx && iy >= 0 && iy < ny && dataMap[iy][ix] >= 0 && + dataMap[iy][ix] < dataSize) { + m = dataMask[iy][ix]; + if (isOrdered == 0) + d = *((dataType *)(data + getPointer(ix, iy))); + else + d = orderedData[iy][ix]; + } + return d ^ m; }; #endif