// SPDX-License-Identifier: LGPL-3.0-or-other // Copyright (C) 2021 Contributors to the SLS Detector Package #include #include #include #include #include #include #include #include #include #include //#include #include #include #include #include #include using namespace std; #ifndef ETAVPS #define ETAVPS typedef struct { int itN; double *xPos; double *yPos; double *binCont; } itLog; class EtaVEL : public TObject { public: EtaVEL(int numberOfPixels = 25, double minn = 0., double maxx = 1., int nnx = 160, int nny = 160) : nPixels(numberOfPixels), min(minn), max(maxx), converged(0), nx(nnx), ny(nny), chi_sq(0) { // acc = 0.02; ds = 0.005; init(); } void init() { double pOffset = (max - min) / (double)nPixels; xPPos = new double[(nPixels + 1) * (nPixels + 1) + 1]; yPPos = new double[(nPixels + 1) * (nPixels + 1) + 1]; binCont = new double[nPixels * nPixels + 1]; totCont = 0.; edgeL = new double[2 * nPixels * (nPixels + 1) + 1]; for (int ii = 0; ii < 2 * nPixels * (nPixels + 1) + 1; ii++) { edgeL[ii] = 1.0; // cout << "ii " << ii << endl; } for (int x = 0; x < nPixels + 1; x++) { for (int y = 0; y < nPixels + 1; y++) { xPPos[getCorner(x, y)] = min + (double)x * pOffset; yPPos[getCorner(x, y)] = min + (double)y * pOffset; if (x < nPixels && y < nPixels) binCont[getBin(x, y)] = 0; } } // edgeL[1] = 3.0; updatePixelCorner(); it = 0; log = new itLog[nIterations]; } void fill(double x, double y, double amount = 1.) { totCont += amount; int bin = findBin(x, y); if (bin < 0) { // cout << "can not find bin x: " << x << " y: " << y << endl; totCont -= amount; } binCont[bin] += amount; } int getBin(int x, int y) { if (x < 0 || x >= nPixels || y < 0 || y >= nPixels) { // cout << "getBin: out of bounds : x " << x << " y " << y << endl; return 0; } return y * nPixels + x + 1; } int getXBin(int bin) { return (bin - 1) % nPixels; } int getYBin(int bin) { return (bin - 1) / nPixels; } int getCorner(int x, int y) { return y * (nPixels + 1) + x + 1; } int getEdgeX(int x, int row) { int ret = row * nPixels + x + 1; // cout << "| edge X x " << x << " row " << row << ": "<< ret << " | "; return ret; } int getEdgeY(int col, int y) { int ret = nPixels * (nPixels + 1) + col * nPixels + y + 1; // cout << "| edge Y col " << col << " y " << y << ": "<< ret << " | "; return ret; } int getIt() { return it; }; int getNPixels() { return nPixels; } double *getXPPos() { return xPPos; } double *getYPPos() { return yPPos; } void updatePixelCorner(); double *getPixelCorners(int x, int y); int findBin(double xx, double yy); void createLogEntry(); void updatePixelPos(); double *getSizeMap(); double *getChangeMap(); TH2D *getContent(int it = -1, int changeType = 0); TMultiGraph *plotPixelBorder(int plotCenters = 0); TMultiGraph *plotLog(int stepSize = 1, int maxIt = -1); void printGrid(); TH1D *getCounts(); void serialize(ostream &o); void deserialize(istream &is); int converged; double getChiSq() { return chi_sq; }; private: itLog *log; int it; const static int nIterations = 10000; int nx, ny; int nPixels; double *xPPos; double *yPPos; double *binCont; double totCont; double *edgeL; // double acc; double ds; double min, max; double chi_sq; ClassDefNV(EtaVEL, 1); #pragma link C++ class EtaVEL - ; }; #endif