#ifndef ETA_INTERPOLATION_CLEVER_ADAPTIVEBINS_H #define ETA_INTERPOLATION_CLEVER_ADAPTIVEBINS_H #include #include "tiffIO.h" //#include "etaInterpolationBase.h" #include "etaInterpolationAdaptiveBins.h" //#define HSIZE 1 class etaInterpolationCleverAdaptiveBins : public etaInterpolationAdaptiveBins { private: // double *gradientX, *gradientY, *gradientXY; virtual void iterate(float *newhhx, float *newhhy) { double bsize=1./nSubPixels; /* double hy[nSubPixels*HSIZE][nbeta]; //profile y */ /* double hx[nSubPixels*HSIZE][nbeta]; //profile x */ // double hix[nSubPixels*HSIZE][nbeta]; //integral of projection x // double hiy[nSubPixels*HSIZE][nbeta]; //integral of projection y int ipy, ipx, ippx, ippy; // double tot_eta_x[nSubPixels*HSIZE]; //double tot_eta_y[nSubPixels*HSIZE]; double mean=0; double maxflat=0, minflat=0, maxgradX=0, mingradX=0, maxgradY=0, mingradY=0, maxgr=0, mingr=0; int ix_maxflat, iy_maxflat, ix_minflat, iy_minflat, ix_maxgrX, iy_maxgrX, ix_mingrX, iy_mingrX,ix_maxgrY, iy_maxgrY, ix_mingrY, iy_mingrY, ix_mingr, iy_mingr, ix_maxgr, iy_maxgr; int maskMin[nSubPixels*nSubPixels], maskMax[nSubPixels*nSubPixels]; //for (int ipy=0; ipymean+3.*sqrt(mean)) maskMax[ipx+nSubPixels*ipy]=1; else maskMax[ipx+nSubPixels*ipy]=0; if (ipx>0 && ipy>0) { if (flat[ipx+nSubPixels*ipy]flat[ipx-1+nSubPixels*(ipy-1)]) maskMin[ipx+nSubPixels*ipy]=0; } if (ipx>0 && ipyflat[ipx-1+nSubPixels*(ipy+1)]) maskMin[ipx+nSubPixels*ipy]=0; } if (ipy>0 && ipxflat[ipx+1+nSubPixels*(ipy-1)]) maskMin[ipx+nSubPixels*ipy]=0; } if (ipyflat[ipx+1+nSubPixels*(ipy+1)]) maskMin[ipx+nSubPixels*ipy]=0; } if (ipyflat[ipx+nSubPixels*(ipy+1)]) maskMin[ipx+nSubPixels*ipy]=0; } if (ipxflat[ipx+1+nSubPixels*(ipy)]) maskMin[ipx+nSubPixels*ipy]=0; } if (ipy>0 ) { if (flat[ipx+nSubPixels*ipy]flat[ipx+nSubPixels*(ipy-1)]) maskMin[ipx+nSubPixels*ipy]=0; } if (ipx>0 ) { if (flat[ipx+nSubPixels*ipy]flat[ipx-1+nSubPixels*(ipy)]) maskMin[ipx+nSubPixels*ipy]=0; } // if (maskMin[ipx+nSubPixels*ipy]) cout << ipx << " " << ipy << " is a local minimum " << flat[ipx+nSubPixels*ipy] << endl; // if (maskMax[ipx+nSubPixels*ipy]) cout << ipx << " " << ipy << " is a local maximum "<< flat[ipx+nSubPixels*ipy] << endl; } } int is_a_border=0; //initialize the new partition to the previous one // int ibx_p, iby_p, ibx_n, iby_n; int ibbx, ibby; memcpy(newhhx,hhx,nbeta*nbeta*sizeof(float)); memcpy(newhhy,hhy,nbeta*nbeta*sizeof(float)); for (int ibx=0; ibxnbeta-1) ibbx=nbeta-1; for (int iy=-1; iy<2; iy++) { ibby=iby+iy; if (ibby<0) ibby=0; if (ibby>nbeta-1) ibby=nbeta-1; ipy=hhy[ibbx+ibby*nbeta]*nSubPixels; ipx=hhx[ibbx+ibby*nbeta]*nSubPixels; if (ipx!=ippx || ipy!=ippy) { is_a_border=1; if (maskMin[ippx+nSubPixels*ippy]) { //increase the region newhhx[ibbx+ibby*nbeta]=((double)ippx+0.5)/((double)nSubPixels); newhhy[ibbx+ibby*nbeta]=((double)ippy+0.5)/((double)nSubPixels); } if (maskMax[ippx+nSubPixels*ippy]) { //reduce the region newhhx[ibx+iby*nbeta]=((double)ipx+0.5)/((double)nSubPixels); newhhy[ibx+iby*nbeta]=((double)ipy+0.5)/((double)nSubPixels); } // cout << ippx << " " << ippy << " " << ibx << " " << iby << " * " << ipx << " " << ipy << " " << ibbx << " " << ibby << endl; } } } } } } //Check that the resulting histograms are monotonic and they don't have holes! for (int ibx=0; ibxipx) newhhx[ibx+1+iby*nbeta]=newhhx[ibx+iby*nbeta]; else if (ipx >ippx+1) newhhx[ibx+1+iby*nbeta]=((double)(ippx+1+0.5))/((double)nSubPixels); if ( ippy>ipy) newhhy[ibx+(iby+1)*nbeta]=newhhy[ibx+iby*nbeta]; else if (ipy >ippy+1) newhhy[ibx+(iby+1)*nbeta]=((double)(ippy+1+0.5))/((double)nSubPixels); } } } public: etaInterpolationCleverAdaptiveBins(int nx=400, int ny=400, int ns=25, int nb=-1, double emin=1, double emax=0) : etaInterpolationAdaptiveBins(nx,ny,ns, nb, emin,emax){ }; etaInterpolationCleverAdaptiveBins(etaInterpolationCleverAdaptiveBins *orig): etaInterpolationAdaptiveBins(orig){}; virtual etaInterpolationCleverAdaptiveBins* Clone()=0; /* return new etaInterpolationCleverAdaptiveBins(this); */ /* }; */ }; class eta2InterpolationCleverAdaptiveBins : public virtual eta2InterpolationBase, public virtual etaInterpolationCleverAdaptiveBins { public: eta2InterpolationCleverAdaptiveBins(int nx=400, int ny=400, int ns=25, int nb=-1, double emin=1, double emax=0) : etaInterpolationBase(nx,ny,ns, nb, emin,emax),eta2InterpolationBase(nx,ny,ns, nb, emin,emax),etaInterpolationCleverAdaptiveBins(nx,ny,ns, nb, emin,emax){ }; eta2InterpolationCleverAdaptiveBins(eta2InterpolationCleverAdaptiveBins *orig): etaInterpolationBase(orig), etaInterpolationCleverAdaptiveBins(orig) {}; virtual eta2InterpolationCleverAdaptiveBins* Clone() { return new eta2InterpolationCleverAdaptiveBins(this);}; // virtual int *getInterpolatedImage(){return eta2InterpolationBase::getInterpolatedImage();}; /* virtual int *getInterpolatedImage(){ */ /* int ipx, ipy; */ /* cout << "ff" << endl; */ /* calcDiff(1, hhx, hhy); //get flat */ /* double avg=0; */ /* for (ipx=0; ipx0) */ /* hintcorr[ibx+iby*nSubPixels*nPixelsX]=hint[ibx+iby*nSubPixels*nPixelsX]*(avg/flat[ipx+ipy*nSubPixels]); */ /* else */ /* hintcorr[ibx+iby*nSubPixels*nPixelsX]=hint[ibx+iby*nSubPixels*nPixelsX]; */ /* } */ /* } */ /* return hintcorr; */ /* }; */ }; class eta3InterpolationCleverAdaptiveBins : public virtual eta3InterpolationBase, public virtual etaInterpolationCleverAdaptiveBins { public: eta3InterpolationCleverAdaptiveBins(int nx=400, int ny=400, int ns=25, int nb=-1, double emin=1, double emax=0) : etaInterpolationBase(nx,ny,ns, nb, emin,emax),eta3InterpolationBase(nx,ny,ns, nb, emin,emax), etaInterpolationCleverAdaptiveBins(nx,ny,ns, nb, emin,emax){ }; eta3InterpolationCleverAdaptiveBins(eta3InterpolationCleverAdaptiveBins *orig): etaInterpolationBase(orig), etaInterpolationCleverAdaptiveBins(orig) {}; virtual eta3InterpolationCleverAdaptiveBins* Clone() { return new eta3InterpolationCleverAdaptiveBins(this);}; }; #endif