| 1 | //  Simple specific histo-like classes 
 | 
|---|
| 2 | //  R. Ansari - Avril-Mai 2010 
 | 
|---|
| 3 | 
 | 
|---|
| 4 | #include "qhist.h"
 | 
|---|
| 5 | 
 | 
|---|
| 6 | // -----------------------------------
 | 
|---|
| 7 | // -- Classe ressemblant a un histo 2D 
 | 
|---|
| 8 | // -----------------------------------
 | 
|---|
| 9 | 
 | 
|---|
| 10 | /* --Methode-- */
 | 
|---|
| 11 | QHis1D::QHis1D()
 | 
|---|
| 12 |   : nx_(0),xmin_(0.),xmax_(0.),
 | 
|---|
| 13 |     nhis_(0), nunder_(0), nover_(0),
 | 
|---|
| 14 |     swunder_(0.), swover_(0.)
 | 
|---|
| 15 | {
 | 
|---|
| 16 | }
 | 
|---|
| 17 | 
 | 
|---|
| 18 | /* --Methode-- */
 | 
|---|
| 19 | QHis1D::QHis1D(QHis1D const& a)
 | 
|---|
| 20 |   : nx_(a.nx_),xmin_(a.xmin_),xmax_(a.xmax_), aw_(a.aw_), 
 | 
|---|
| 21 |     nhis_(a.nhis_), nunder_(a.nunder_), nover_(a.nover_),
 | 
|---|
| 22 |     swunder_(a.swunder_), swover_(a.swover_)
 | 
|---|
| 23 | {
 | 
|---|
| 24 | }
 | 
|---|
| 25 | 
 | 
|---|
| 26 | /* --Methode-- */
 | 
|---|
| 27 | QHis1D::QHis1D(r_8 xMin,r_8 xMax,int_4 nxb)
 | 
|---|
| 28 |   : nx_(0),xmin_(0.),xmax_(0.),
 | 
|---|
| 29 |     nhis_(0), nunder_(0), nover_(0),
 | 
|---|
| 30 |     swunder_(0.), swover_(0.)
 | 
|---|
| 31 | {
 | 
|---|
| 32 |   Define(xMin, xMax, nxb);
 | 
|---|
| 33 | }
 | 
|---|
| 34 | 
 | 
|---|
| 35 | /* --Methode-- */
 | 
|---|
| 36 | void QHis1D::Define(r_8 xMin,r_8 xMax,int_4 nxb)
 | 
|---|
| 37 | {
 | 
|---|
| 38 |   nx_=nxb; 
 | 
|---|
| 39 |   xmin_=xMin;  xmax_=xMax;  
 | 
|---|
| 40 |   dxb_=(xmax_-xmin_)/(double)nx_;
 | 
|---|
| 41 |   sa_size_t sz[5];  sz[0]=nx_; 
 | 
|---|
| 42 |   aw_.ReSize(1,sz);
 | 
|---|
| 43 |   nhis_=nunder_=nover_=0;
 | 
|---|
| 44 |   swunder_=swover_=0.;
 | 
|---|
| 45 |   return;
 | 
|---|
| 46 | }
 | 
|---|
| 47 | 
 | 
|---|
| 48 | /* --Methode-- */
 | 
|---|
| 49 | sa_size_t QHis1D::Add(r_8 x, r_8 w)
 | 
|---|
| 50 | {
 | 
|---|
| 51 |   sa_size_t ix = (sa_size_t)((x-xmin_)/dxb_);
 | 
|---|
| 52 |   if (ix<0) {
 | 
|---|
| 53 |     nunder_++;  swunder_+=w;
 | 
|---|
| 54 |     return 0.;
 | 
|---|
| 55 |   }
 | 
|---|
| 56 |   if (ix>=nx_) {
 | 
|---|
| 57 |     nover_++;  swover_+=w;
 | 
|---|
| 58 |     return 0.;
 | 
|---|
| 59 |   }
 | 
|---|
| 60 |   nhis_++;
 | 
|---|
| 61 |   aw_(ix) += w;
 | 
|---|
| 62 |   return nhis_;
 | 
|---|
| 63 | }
 | 
|---|
| 64 | 
 | 
|---|
| 65 | Histo QHis1D::Convert()
 | 
|---|
| 66 | {
 | 
|---|
| 67 |   Histo h(xmin_,xmax_,nx_);
 | 
|---|
| 68 |   for(sa_size_t i=0; i<nx_; i++)  h(i) = aw_(i);
 | 
|---|
| 69 |   cout << "QHis1D::Convert()/Info: Nx" << nx_ << " NUnder=" << nunder_ << " NHis=" << nhis_ 
 | 
|---|
| 70 |        << " NOver=" << nover_ << "\n" 
 | 
|---|
| 71 |        << " SumWUnder=" << swunder_ << " SumW=" << aw_.Sum() << " SumWOver=" << swover_ << endl;
 | 
|---|
| 72 |   return h;
 | 
|---|
| 73 | }
 | 
|---|
| 74 | 
 | 
|---|
| 75 | // -----------------------------------
 | 
|---|
| 76 | // -- Classe ressemblant a un histo 2D 
 | 
|---|
| 77 | // -----------------------------------
 | 
|---|
| 78 | QHis2D::QHis2D()
 | 
|---|
| 79 |   : nx(0),ny(0),xmin(0),xmax(0),ymin(0),ymax(0),sumw0(0.)
 | 
|---|
| 80 | {
 | 
|---|
| 81 |   ixb0 = jyb0 = 0;
 | 
|---|
| 82 | }
 | 
|---|
| 83 | QHis2D::QHis2D(r_8 xMin,r_8 xMax,int_4 nxb,r_8 yMin,r_8 yMax,int_4 nyb)
 | 
|---|
| 84 |   : nx(0),ny(0),xmin(0),xmax(0),ymin(0),ymax(0),sumw0(0.)
 | 
|---|
| 85 | {
 | 
|---|
| 86 |   Define(xMin, xMax, nxb, yMin, yMax, nyb);
 | 
|---|
| 87 | }
 | 
|---|
| 88 | void QHis2D::Define(r_8 xMin,r_8 xMax,int_4 nxb,r_8 yMin,r_8 yMax,int_4 nyb)
 | 
|---|
| 89 | {
 | 
|---|
| 90 |   nx=nxb; ny=nyb;
 | 
|---|
| 91 |   xmin=xMin;  xmax=xMax;  
 | 
|---|
| 92 |   ymin=yMin;  ymax=yMax;  
 | 
|---|
| 93 |   dxb=(xmax-xmin)/(double)nx;
 | 
|---|
| 94 |   dyb=(ymax-ymin)/(double)ny;
 | 
|---|
| 95 |   sa_size_t sz[5];  sz[0]=nx;  sz[1]=ny;
 | 
|---|
| 96 |   aw.ReSize(2,sz);
 | 
|---|
| 97 |   SetZeroBin();
 | 
|---|
| 98 |   sumw0=0.;
 | 
|---|
| 99 |   return;
 | 
|---|
| 100 | }
 | 
|---|
| 101 | double QHis2D::Add(r_8 x, r_8 y, r_8 w, bool fgfh)
 | 
|---|
| 102 | {
 | 
|---|
| 103 |   sa_size_t ix = (sa_size_t)((x-xmin)/dxb);
 | 
|---|
| 104 |   sa_size_t jy = (sa_size_t)((y-ymin)/dyb);
 | 
|---|
| 105 |   if ((ix<0)||(ix>=nx)||(jy<0)||(jy>=ny))  return 0.;
 | 
|---|
| 106 |   double rw = ((ix==ixb0)&&(jy==jyb0)) ? w : 0.;
 | 
|---|
| 107 |   sumw0 += rw; 
 | 
|---|
| 108 |   if (fgfh) aw(ix,jy) += w;
 | 
|---|
| 109 |   return rw;
 | 
|---|
| 110 | }
 | 
|---|
| 111 | void QHis2D::SetZeroBin(r_8 x, r_8 y)
 | 
|---|
| 112 | {
 | 
|---|
| 113 |   ixb0 = (sa_size_t)((x-xmin)/dxb);
 | 
|---|
| 114 |   jyb0 = (sa_size_t)((y-ymin)/dyb);
 | 
|---|
| 115 | }
 | 
|---|
| 116 | Histo2D QHis2D::Convert()
 | 
|---|
| 117 | {
 | 
|---|
| 118 |   int_4 imn,jmn,imx,jmx;
 | 
|---|
| 119 |   r_8 min = aw(0,0);
 | 
|---|
| 120 |   r_8 max = aw(0,0);
 | 
|---|
| 121 |   imn=jmn=imx=jmx=0;
 | 
|---|
| 122 |   Histo2D h2(xmin,xmax,nx,ymin,ymax,ny);
 | 
|---|
| 123 |   for(int_4 j=0; j<ny; j++) 
 | 
|---|
| 124 |     for(int_4 i=0; i<nx; i++) {
 | 
|---|
| 125 |       h2(i,j) = aw(i,j);
 | 
|---|
| 126 |       if (aw(i,j)>max) {
 | 
|---|
| 127 |         imx=i;  jmx=j;  max=aw(i,j);
 | 
|---|
| 128 |       }
 | 
|---|
| 129 |       if (aw(i,j)<min) {
 | 
|---|
| 130 |         imn=i;  jmn=j;  min=aw(i,j);
 | 
|---|
| 131 |       }
 | 
|---|
| 132 |     }
 | 
|---|
| 133 |   cout << "QHis2D::Convert()/Info: Nx,Ny=" << nx << "," << ny << " SumW=" << sumw0 
 | 
|---|
| 134 |        << "\n ... Max:" << imx << "," << jmx << " ->" << max 
 | 
|---|
| 135 |        << " @" << imx*dxb+xmin << "," << jmx*dyb+ymin
 | 
|---|
| 136 |        << "\n ...Min:" << imn << "," << jmn << " ->" << min 
 | 
|---|
| 137 |        << " @" << imn*dxb+xmin << "," << jmn*dyb+ymin << endl;
 | 
|---|
| 138 |   return h2;
 | 
|---|
| 139 | }
 | 
|---|