#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