// SPDX-License-Identifier: LGPL-3.0-or-other // Copyright (C) 2021 Contributors to the SLS Detector Package #ifndef SLSDETECTORDATA_H #define SLSDETECTORDATA_H #include #include template class slsDetectorData { protected: const int nx; /**< Number of pixels in the x direction */ const int ny; /**< Number of pixels in the y direction */ int dataSize; /** 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; if (dMap == NULL) { for (int iy = 0; iy < ny; iy++) { for (int ix = 0; ix < nx; ix++) { dataMap[iy][ix] = (iy * nx + ix) * sizeof(dataType); } } } else { // cout << "set dmap "<< dataMap << " " << dMap << endl; for (int iy = 0; iy < ny; iy++) { // cout << iy << endl; for (int 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*/ } } } /* //commented this part because it causes out-of-bound issues if nx or ny are larger than dataMap bounds (single-chip readout of strixel with groups of different pitches) VH 2023-02-24 for (int iy = 0; iy < ny; iy++) { for (int 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; // 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++) { int ix, iy; 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