#ifndef ETA_INTERPOLATION_BASE_H #define ETA_INTERPOLATION_BASE_H #ifdef MYROOT1 #include #include #include #include #endif #include "slsInterpolation.h" #include "tiffIO.h" class etaInterpolationBase : public slsInterpolation { public: etaInterpolationBase(int nx=400, int ny=400, int ns=25, int nb=-1, double emin=1, double emax=0) : slsInterpolation(nx,ny,ns), hhx(NULL), hhy(NULL), heta(NULL),nbeta(nb),etamin(emin), etamax(emax) { if (nb<=0) nbeta=nSubPixels*10; if (etamin>=etamax) { etamin=-1; etamax=2; } etastep=(etamax-etamin)/nbeta; #ifdef MYROOT1 heta=new TH2D("heta","heta",nbeta,etamin,etamax,nbeta,etamin,etamax); hhx=new TH2D("hhx","hhx",nbeta,etamin,etamax,nbeta,etamin,etamax); hhy=new TH2D("hhy","hhy",nbeta,etamin,etamax,nbeta,etamin,etamax); #endif #ifndef MYROOT1 heta=new int[nbeta*nbeta]; hhx=new float[nbeta*nbeta]; hhy=new float[nbeta*nbeta]; #endif }; etaInterpolationBase(etaInterpolationBase *orig): slsInterpolation(orig){ nbeta=orig->nbeta; etamin=orig->etamin; etamax=orig->etamax; etastep=(etamax-etamin)/nbeta; #ifdef MYROOT1 heta=(TH2D*)(orig->heta)->Clone("heta"); hhx=(TH2D*)(orig->hhx)->Clone("hhx"); hhy=(TH2D*)(orig->hhy)->Clone("hhy"); #endif #ifndef MYROOT1 heta=new int[nbeta*nbeta]; memcpy(heta,orig->heta,nbeta*nbeta*sizeof(int)); hhx=new float[nbeta*nbeta]; memcpy(hhx,orig->hhx,nbeta*nbeta*sizeof(float)); hhy=new float[nbeta*nbeta]; memcpy(hhy,orig->hhy,nbeta*nbeta*sizeof(float)); #endif }; virtual etaInterpolationBase* Clone() { return new etaInterpolationBase(this); }; #ifdef MYROOT1 TH2D *setEta(TH2D *h, int nb=-1, double emin=1, double emax=0) { if (h) { heta=h; nbeta=heta->GetNbinsX(); etamin=heta->GetXaxis()->GetXmin(); etamax=heta->GetXaxis()->GetXmax(); etastep=(etamax-etamin)/nbeta; } return heta; }; TH2D *setFlatField(TH2D *h, int nb=-1, double emin=1, double emax=0) { return setEta(h, nb, emin, emax); }; TH2D *getFlatField(){return setEta(NULL);}; #endif #ifndef MYROOT1 int *setEta(int *h, int nb=-1, double emin=1, double emax=0) { if (h) {heta=h; nbeta=nb; if (nb<=0) nbeta=nSubPixels*10; etamin=emin; etamax=emax; if (etamin>=etamax) { etamin=-1; etamax=2; } etastep=(etamax-etamin)/nbeta; } return heta; }; int *setFlatField(int *h, int nb=-1, double emin=1, double emax=0) { return setEta(h, nb, emin, emax); }; int *getFlatField(){return setEta(NULL);}; int *getFlatField(int &nb, double &emin, double &emax){ nb=nbeta; //cout << "igff* ff has " << nb << " bins " << endl; emin=etamin; emax=etamax; return getFlatField(); }; void *writeFlatField(const char * imgname) { float *gm=NULL; gm=new float[nbeta*nbeta]; for (int ix=0; ix=1) etamax=emax; if (emin<=0) etamin=emin; if (etamin>=etamax) { etamin=-1; etamax=2; } etastep=(etamax-etamin)/nbeta; uint32 nnx; uint32 nny; float *gm=ReadFromTiff(imgname, nnx, nny); if (nnx!=nny) { cout << "different number of bins in x " << nnx << " and y " << nny<< " !"<< endl; cout << "Aborting read"<< endl; return 0; } nbeta=nnx; if (gm) { if (heta) { delete [] heta; delete [] hhx; delete [] hhy; } heta=new int[nbeta*nbeta]; hhx=new float[nbeta*nbeta]; hhy=new float[nbeta*nbeta]; for (int ix=0; ixScale((double)nSubPixels); return hhx; }; TH2D *gethhy() { hhy->Scale((double)nSubPixels); return hhy; }; #endif #ifndef MYROOT1 float *gethhx() { // hhx->Scale((double)nSubPixels); return hhx; }; float *gethhy() { // hhy->Scale((double)nSubPixels); return hhy; }; #endif ////////////////////////////////////////////////////////////////////////////// //////////// /*It return position hit for the event in input */ ////////////// virtual void getInterpolatedPosition(int x, int y, double *data, double &int_x, double &int_y) { double sDum[2][2]; double tot, totquad; double etax,etay; int corner; corner=calcQuad(data, tot, totquad, sDum); if (nSubPixels>2) calcEta(totquad, sDum, etax, etay); getInterpolatedPosition(x,y,etax,etay,corner,int_x,int_y); return; }; virtual void getInterpolatedPosition(int x, int y, double totquad,int quad,double *cl,double &int_x, double &int_y) { double cc[2][2]; double *cluster[3]; int xoff, yoff; cluster[0]=cl; cluster[1]=cl+3; cluster[2]=cl+6; switch (quad) { case BOTTOM_LEFT: xoff=0; yoff=0; break; case BOTTOM_RIGHT: xoff=1; yoff=0; break; case TOP_LEFT: xoff=0; yoff=1; break; case TOP_RIGHT: xoff=1; yoff=1; break; default: ; } double etax, etay; if (nSubPixels>2) { cc[0][0]=cluster[yoff][xoff]; cc[1][0]=cluster[yoff+1][xoff]; cc[0][1]=cluster[yoff][xoff+1]; cc[1][1]=cluster[yoff+1][xoff+1]; calcEta(totquad,cc,etax,etay); } return getInterpolatedPosition(x,y,etax, etay,quad,int_x,int_y); } virtual void getInterpolatedPosition(int x, int y, double etax, double etay, int corner, double &int_x, double &int_y) { double xpos_eta=0,ypos_eta=0; double dX,dY; int ex,ey; switch (corner) { case TOP_LEFT: dX=-1.; dY=0; break; case TOP_RIGHT: ; dX=0; dY=0; break; case BOTTOM_LEFT: dX=-1.; dY=-1.; break; case BOTTOM_RIGHT: dX=0; dY=-1.; break; default: cout << "bad quadrant" << endl; dX=0.; dY=0.; } if (nSubPixels>2) { #ifdef MYROOT1 xpos_eta=(hhx->GetBinContent(hhx->GetXaxis()->FindBin(etax),hhy->GetYaxis()->FindBin(etay)))/((double)nSubPixels); ypos_eta=(hhy->GetBinContent(hhx->GetXaxis()->FindBin(etax),hhy->GetYaxis()->FindBin(etay)))/((double)nSubPixels); #endif #ifndef MYROOT1 ex=(etax-etamin)/etastep; ey=(etay-etamin)/etastep; if (ex<0) { ex=0; cout << "x*"<< ex << endl; } if (ex>=nbeta) { ex=nbeta-1; cout << "x?"<< ex << endl; } if (ey<0) { ey=0; cout << "y*"<< ey << endl; } if (ey>=nbeta) { ey=nbeta-1; cout << "y?"<< ey << endl; } xpos_eta=(((double)hhx[(ey*nbeta+ex)]))+dX ;///((double)nSubPixels); ypos_eta=(((double)hhy[(ey*nbeta+ex)]))+dY ;///((double)nSubPixels); //else //return 0; #endif } else { xpos_eta=0.5*dX+0.25; ypos_eta=0.5*dY+0.25; } int_x=((double)x) + xpos_eta+0.5; int_y=((double)y) + ypos_eta+0.5; } ///////////////////////////////////////////////////////////////////////////////////////////////// virtual void getPositionETA3(int x, int y, double *data, double &int_x, double &int_y) { double sDum[2][2]; double tot, totquad; double eta3x,eta3y; double ex,ey; calcQuad(data, tot, totquad, sDum); calcEta3(data,eta3x, eta3y,tot); double xpos_eta,ypos_eta; #ifdef MYROOT1 xpos_eta=((hhx->GetBinContent(hhx->GetXaxis()->FindBin(eta3x),hhy->GetYaxis()->FindBin(eta3y))))/((double)nSubPixels); ypos_eta=((hhy->GetBinContent(hhx->GetXaxis()->FindBin(eta3x),hhy->GetYaxis()->FindBin(eta3y))))/((double)nSubPixels); #endif #ifndef MYROOT1 ex=(eta3x-etamin)/etastep; ey=(eta3y-etamin)/etastep; if (ex<0) ex=0; if (ex>=nbeta) ex=nbeta-1; if (ey<0) ey=0; if (ey>=nbeta) ey=nbeta-1; xpos_eta=(((double)hhx[(int)(ey*nbeta+ex)]))/((double)nSubPixels); ypos_eta=(((double)hhy[(int)(ey*nbeta+ex)]))/((double)nSubPixels); #endif int_x=((double)x) + xpos_eta; int_y=((double)y) + ypos_eta; return; }; virtual int addToFlatField(double totquad,int quad,double *cl,double &etax, double &etay) { double cc[2][2]; double *cluster[3]; int xoff, yoff; cluster[0]=cl; cluster[1]=cl+3; cluster[2]=cl+6; switch (quad) { case BOTTOM_LEFT: xoff=0; yoff=0; break; case BOTTOM_RIGHT: xoff=1; yoff=0; break; case TOP_LEFT: xoff=0; yoff=1; break; case TOP_RIGHT: xoff=1; yoff=1; break; default: ; } cc[0][0]=cluster[yoff][xoff]; cc[1][0]=cluster[yoff+1][xoff]; cc[0][1]=cluster[yoff][xoff+1]; cc[1][1]=cluster[yoff+1][xoff+1]; /* cout << cl[0] << " " << cl[1] << " " << cl[2] << endl; */ /* cout << cl[3] << " " << cl[4] << " " << cl[5] << endl; */ /* cout << cl[6] << " " << cl[7] << " " << cl[8] << endl; */ /* cout <<"******"<Fill(etax,etay); #endif #ifndef MYROOT1 ex=(etax-etamin)/etastep; ey=(etay-etamin)/etastep; // cout << etax << " " << ex << " " << etay << " " << ey << " " << ey*nbeta+ex << endl; if (ey=0 && ey>=0) heta[ey*nbeta+ex]++; // cout << "*"<< etax << " " << etay << endl; /* cout << etax << " " << etay << " " << ex << " " << ey << " " << ey*nbeta+ex << endl; */ /* cout <<"********"<< endl << endl ; */ #endif return 0; }; protected: #ifdef MYROOT1 TH2D *heta; TH2D *hhx; TH2D *hhy; #endif #ifndef MYROOT1 int *heta; float *hhx; float *hhy; #endif int nbeta; double etamin, etamax, etastep; }; #endif