Changeset 1092 in Sophya for trunk/SophyaLib


Ignore:
Timestamp:
Jul 26, 2000, 3:15:52 PM (25 years ago)
Author:
ansari
Message:

Histos/Hprof/Histo2D en r_8 cmv 26/7/00

Location:
trunk/SophyaLib
Files:
11 edited

Legend:

Unmodified
Added
Removed
  • trunk/SophyaLib/HiStats/hbook.h

    r763 r1092  
    99#endif
    1010
    11 void hbandx_(int_4 *,float *,float *,float *);
    12 void hbandy_(int_4 *,float *,float *,float *);
     11void hbandx_(int_4 *,r_4 *,r_4 *,r_4 *);
     12void hbandy_(int_4 *,r_4 *,r_4 *,r_4 *);
    1313
    1414void hbarx_(int_4 *);
    1515void hbary_(int_4 *);
    1616
    17 void hbfun1_(int_4 *,char *,int_4 *,float *,float *,float fun(float *),int_4);
    18 void hbfun2_(int_4 *,char *,int_4 *,float *,float *,int_4 *,float *,float *
    19             ,float fun(float *,float *),int_4);
     17void hbfun1_(int_4 *,char *,int_4 *,r_4 *,r_4 *,r_4 fun(r_4 *),int_4);
     18void hbfun2_(int_4 *,char *,int_4 *,r_4 *,r_4 *,int_4 *,r_4 *,r_4 *
     19            ,r_4 fun(r_4 *,r_4 *),int_4);
    2020void hbigbi_(int_4 *,int_4 *);
    21 void hbook1_(int_4 *,char *,int_4 *,float *,float *,float *,int_4);
    22 void hbook2_(int_4 *,char *,int_4 *,float *,float *
    23             ,int_4 *,float *,float *,float *,int_4);
    24 void hbpro_(int_4 *,float *);
    25 void hbprof_(int_4 *,char *,int_4 *,float *,float *
    26             ,float *,float *,char *,int_4,int_4);
    27 void hbprox_(int_4 *,float *);
    28 void hbproy_(int_4 *,float *);
    29 void hbslix_(int_4 *,int_4 *,float *);
    30 void hbsliy_(int_4 *,int_4 *,float *);
     21void hbook1_(int_4 *,char *,int_4 *,r_4 *,r_4 *,r_4 *,int_4);
     22void hbook2_(int_4 *,char *,int_4 *,r_4 *,r_4 *
     23            ,int_4 *,r_4 *,r_4 *,r_4 *,int_4);
     24void hbpro_(int_4 *,r_4 *);
     25void hbprof_(int_4 *,char *,int_4 *,r_4 *,r_4 *
     26            ,r_4 *,r_4 *,char *,int_4,int_4);
     27void hbprox_(int_4 *,r_4 *);
     28void hbproy_(int_4 *,r_4 *);
     29void hbslix_(int_4 *,int_4 *,r_4 *);
     30void hbsliy_(int_4 *,int_4 *,r_4 *);
    3131void hcdir_(char *,char *,int_4,int_4);
    3232void hdelet_(int_4 *);
    33 void hfill_(int_4 *,float *,float *,float *);
    34 void hfithn_(int_4 *,char *,char *,int_4 *,float *
    35             ,float *,float *,float *,float *,float *,int_4,int_4);
    36 void hfn_(int_4 *,float *);
    37 void hfunc_(int_4 *,float fun(float *));
    38 void hgive_(int_4 *,char *,int_4 *,float *,float *
    39                           ,int_4 *,float *,float *,int_4 *,int_4 *);
    40 void hgn_(int_4 *,int_4 *,int_4 *,float *,int_4 *);
    41 void hgnf_(int_4 *,int_4 *,float *,int_4 *);
     33void hfill_(int_4 *,r_4 *,r_4 *,r_4 *);
     34void hfithn_(int_4 *,char *,char *,int_4 *,r_4 *
     35            ,r_4 *,r_4 *,r_4 *,r_4 *,r_4 *,int_4,int_4);
     36void hfn_(int_4 *,r_4 *);
     37void hfunc_(int_4 *,r_4 fun(r_4 *));
     38void hgive_(int_4 *,char *,int_4 *,r_4 *,r_4 *
     39                          ,int_4 *,r_4 *,r_4 *,int_4 *,int_4 *);
     40void hgn_(int_4 *,int_4 *,int_4 *,r_4 *,int_4 *);
     41void hgnf_(int_4 *,int_4 *,r_4 *,int_4 *);
    4242void hgnpar_(int_4 *,char *,int_4);
    43 float hi_(int_4 *,int_4 *);
     43r_4 hi_(int_4 *,int_4 *);
    4444void hidopt_(int_4 *,char *,int_4);
    45 float hie_(int_4 *,int_4 *);
    46 float hif_(int_4 *,int_4 *);
    47 float hij_(int_4 *,int_4 *,int_4 *);
    48 void hijxy_(int_4 *,int_4 *,int_4 *,float *,float *);
    49 void hix_(int_4 *,int_4 *,float *);
     45r_4 hie_(int_4 *,int_4 *);
     46r_4 hif_(int_4 *,int_4 *);
     47r_4 hij_(int_4 *,int_4 *,int_4 *);
     48void hijxy_(int_4 *,int_4 *,int_4 *,r_4 *,r_4 *);
     49void hix_(int_4 *,int_4 *,r_4 *);
    5050void hldir_(char *,char *,int_4,int_4);
    5151void hmdir_(char *,char *,int_4,int_4);
    52 float hmax_(int_4 *);
    53 void hmaxim_(int_4 *,float *);
    54 float hmin_(int_4 *);
    55 void hminim_(int_4 *,float *);
    56 void hnorma_(int_4 *,float *);
     52r_4 hmax_(int_4 *);
     53void hmaxim_(int_4 *,r_4 *);
     54r_4 hmin_(int_4 *);
     55void hminim_(int_4 *,r_4 *);
     56void hnorma_(int_4 *,r_4 *);
    5757void hnoent_(int_4 *,int_4 *);
    58 void hpak_(int_4 *,float *);
    59 void hpake_(int_4 *,float *);
     58void hpak_(int_4 *,r_4 *);
     59void hpake_(int_4 *,r_4 *);
    6060void hprint_(int_4 *);
    6161void hrend_(char *,int_4);
    6262void hrin_(int_4 *,int_4 *,int_4 *);
    63 float hrndm1_(int_4 *);
    64 void hrndm2_(int_4 *,float *,float *);
     63r_4 hrndm1_(int_4 *);
     64void hrndm2_(int_4 *,r_4 *,r_4 *);
    6565void hropen_(int_4 *,char *,char *,char *,int_4 *,int_4 *,int_4,int_4,int_4);
    6666void hrout_(int_4 *,int_4 *,char *,int_4);
    67 void hscale_(int_4 *,float *);
    68 float hstati_(int_4 *,int_4 *,char *,int_4 *,int_4);
    69 float hsum_(int_4 *);
    70 void hunpak_(int_4 *,float *,char *,int_4 *,int_4);
    71 void hunpke_(int_4 *,float *,char *,int_4 *,int_4);
    72 float hx_(int_4 *,float *);
    73 float hxe_(int_4 *,float *);
    74 float hxi_(int_4 *,float *,int_4 *);
    75 float hxyij_(int_4 *,float *,float *,int_4 *,int_4 *);
    76 float hxy_(int_4 *,float *,float *);
     67void hscale_(int_4 *,r_4 *);
     68r_4 hstati_(int_4 *,int_4 *,char *,int_4 *,int_4);
     69r_4 hsum_(int_4 *);
     70void hunpak_(int_4 *,r_4 *,char *,int_4 *,int_4);
     71void hunpke_(int_4 *,r_4 *,char *,int_4 *,int_4);
     72r_4 hx_(int_4 *,r_4 *);
     73r_4 hxe_(int_4 *,r_4 *);
     74r_4 hxi_(int_4 *,r_4 *,int_4 *);
     75r_4 hxyij_(int_4 *,r_4 *,r_4 *,int_4 *,int_4 *);
     76r_4 hxy_(int_4 *,r_4 *,r_4 *);
    7777
    7878#ifdef __cplusplus
  • trunk/SophyaLib/HiStats/hisprof.cc

    r1089 r1092  
    3131  SetErrOpt(1) permet de demander de calculer l'erreur sur la moyenne.
    3232*/
    33 HProf::HProf(float xMin, float xMax, int nBin, float yMin, float yMax)
     33HProf::HProf(r_8 xMin, r_8 xMax, int_4 nBin, r_8 yMin, r_8 yMax)
    3434: Histo(xMin,xMax,nBin)
    35 , SumY(new double[nBin]), SumY2(new double[nBin]), SumW(new double[nBin])
     35, SumY( (nBin>0) ? new r_8[nBin] : NULL)
     36, SumY2((nBin>0) ? new r_8[nBin] : NULL)
     37, SumW( (nBin>0) ? new r_8[nBin] : NULL)
    3638, Ok(false), YMin(yMin), YMax(yMax), Opt(0)
    3739{
     
    4345/********* Methode *********/
    4446/*!
     47  Constructeur.
     48*/
     49HProf::HProf(r_4 xMin, r_4 xMax, int_4 nBin, r_4 yMin, r_4 yMax)
     50: Histo((r_8)xMin,(r_8)xMax,nBin)
     51, SumY( (nBin>0) ? new r_8[nBin] : NULL)
     52, SumY2((nBin>0) ? new r_8[nBin] : NULL)
     53, SumW( (nBin>0) ? new r_8[nBin] : NULL)
     54, Ok(false), YMin((r_8)yMin), YMax((r_8)yMax), Opt(0)
     55{
     56  Histo::Errors();
     57  Zero();
     58  END_CONSTRUCTOR
     59}
     60
     61/********* Methode *********/
     62/*!
    4563  Constructeur par copie.
    4664*/
    4765HProf::HProf(const HProf& H)
    4866: Histo(H)
    49 , SumY((H.bins>0)  ? new double[H.bins] : NULL)
    50 , SumY2((H.bins>0) ? new double[H.bins] : NULL)
    51 , SumW((H.bins>0)  ? new double[H.bins] : NULL)
     67, SumY((H.mBins>0)  ? new r_8[H.mBins] : NULL)
     68, SumY2((H.mBins>0) ? new r_8[H.mBins] : NULL)
     69, SumW((H.mBins>0)  ? new r_8[H.mBins] : NULL)
    5270, Ok(H.Ok), YMin(H.YMin), YMax(H.YMax), Opt(H.Opt)
    5371{
    54   if(bins>0) {
    55     memcpy(SumY,  H.SumY,  bins*sizeof(double));
    56     memcpy(SumY2, H.SumY2, bins*sizeof(double));
    57     memcpy(SumW,  H.SumW,  bins*sizeof(double));
     72  if(mBins>0) {
     73    memcpy(SumY,  H.SumY,  mBins*sizeof(r_8));
     74    memcpy(SumY2, H.SumY2, mBins*sizeof(r_8));
     75    memcpy(SumW,  H.SumW,  mBins*sizeof(r_8));
    5876  }
    5977  UpdateHisto();
     
    88106void HProf::Zero()
    89107{
    90   memset(SumY,  0, bins*sizeof(double));
    91   memset(SumY2, 0, bins*sizeof(double));
    92   memset(SumW,  0, bins*sizeof(double));
     108  memset(SumY,  0, mBins*sizeof(r_8));
     109  memset(SumY2, 0, mBins*sizeof(r_8));
     110  memset(SumW,  0, mBins*sizeof(r_8));
    93111  Ok = false;
    94112  Histo::Zero();
     
    112130void HProf::SetErrOpt(bool spread)
    113131{
    114 int opt = (spread) ? 0 : 1;
     132uint_2 opt = (spread) ? 0 : 1;
    115133if(opt!=Opt) {Opt=opt; Ok=false;}
    116134}
     
    130148void HProf::updatehisto() const
    131149{
    132 float m,e2;
    133 if(bins>0) for(int i=0;i<bins;i++) {
     150r_8 m,e2;
     151if(mBins>0) for(int_4 i=0;i<mBins;i++) {
    134152  if(SumW[i]<=0.) {
    135153    m = e2 = 0.;
     
    139157    if(Opt) e2 /= SumW[i];
    140158  }
    141   data[i] = m;
    142   err2[i] = e2;
     159  mData[i] = m;
     160  mErr2[i] = e2;
    143161}
    144162Ok = true;
     
    153171  Addition au contenu de l'histo pour abscisse x de la valeur y et poids w
    154172*/
    155 void HProf::Add(float x, float y, float w)
     173void HProf::Add(r_8 x, r_8 y, r_8 w)
    156174{
    157175  if(YMax>YMin && (y<YMin || YMax<y)) return;
    158   int numBin = FindBin(x);
    159   if (numBin<0) under += w;
    160   else if (numBin>=bins) over += w;
     176  int_4 numBin = FindBin(x);
     177  if (numBin<0) mUnder += w;
     178  else if (numBin>=mBins) mOver += w;
    161179  else {
    162180    Ok = false;
     
    173191  Addition au contenu de l'histo bin numBin de la valeur y poids w
    174192*/
    175 void HProf::AddBin(int numBin, float y, float w)
     193void HProf::AddBin(int_4 numBin, r_8 y, r_8 w)
    176194{
    177195  if(YMax>YMin && (y<YMin || YMax<y)) return;
    178   if (numBin<0) under += w;
    179   else if (numBin>=bins) over += w;
     196  if (numBin<0) mUnder += w;
     197  else if (numBin>=mBins) mOver += w;
    180198  else {
    181199    Ok = false;
     
    195213{
    196214if(this == &h) return *this;
    197 if( h.bins > bins ) Delete();
     215if( h.mBins > mBins ) Delete();
    198216Histo *hthis = (Histo *) this;
    199217*hthis = (Histo) h;
    200 if(!SumY)  SumY  = new double[bins];
    201 if(!SumY2) SumY2 = new double[bins];
    202 if(!SumW)  SumW  = new double[bins];
    203 memcpy(SumY,  h.SumY,  bins*sizeof(double));
    204 memcpy(SumY2, h.SumY2, bins*sizeof(double));
    205 memcpy(SumW,  h.SumW,  bins*sizeof(double));
     218if(!SumY)  SumY  = new r_8[mBins];
     219if(!SumY2) SumY2 = new r_8[mBins];
     220if(!SumW)  SumW  = new r_8[mBins];
     221memcpy(SumY,  h.SumY,  mBins*sizeof(r_8));
     222memcpy(SumY2, h.SumY2, mBins*sizeof(r_8));
     223memcpy(SumW,  h.SumW,  mBins*sizeof(r_8));
    206224Ok = h.Ok;
    207225YMin = h.YMin;
     
    222240HProf& HProf::operator += (const HProf& a)
    223241{
    224 if(bins!=a.bins) THROW(sizeMismatchErr);
     242if(mBins!=a.mBins) THROW(sizeMismatchErr);
    225243Histo *hthis = (Histo *) this;
    226244*hthis += (Histo) a;
    227 if(bins>0) for(int i=0;i<bins;i++) {
     245if(mBins>0) for(int_4 i=0;i<mBins;i++) {
    228246  SumY[i]  += a.SumY[i];
    229247  SumY2[i] += a.SumY2[i];
     
    239257  Pour rebinner l'histogramme de profile sur nbinew bins
    240258*/
    241 void HProf::HRebin(int nbinew)
    242 {
    243   if( bins <= 0 ) return; // createur par default
     259void HProf::HRebin(int_4 nbinew)
     260{
     261  if( mBins <= 0 ) return; // createur par default
    244262  if( nbinew <= 0 ) return;
    245263
     
    248266
    249267  // Rebin de la partie Histo
    250   int binold = bins;
     268  int_4 binold = mBins;
    251269  Histo::HRebin(nbinew);
    252270
    253271  // Le nombre de bins est il plus grand ??
    254   if( bins > binold ) {
    255     delete [] SumY;  SumY  = new double[nbinew]; memset(SumY, 0,bins*sizeof(double));
    256     delete [] SumY2; SumY2 = new double[nbinew]; memset(SumY2,0,bins*sizeof(double));
    257     delete [] SumW;  SumW  = new double[nbinew]; memset(SumW, 0,bins*sizeof(double));
     272  if( mBins > binold ) {
     273    delete [] SumY;  SumY  = new r_8[nbinew]; memset(SumY, 0,mBins*sizeof(r_8));
     274    delete [] SumY2; SumY2 = new r_8[nbinew]; memset(SumY2,0,mBins*sizeof(r_8));
     275    delete [] SumW;  SumW  = new r_8[nbinew]; memset(SumW, 0,mBins*sizeof(r_8));
    258276  }
    259277
    260278  // Remplissage des parties propres au HPprof
    261   for(int i=0;i<bins;i++) {
    262     float xmi = BinLowEdge(i);
    263     float xma = BinHighEdge(i);
    264     int imi =  H.FindBin(xmi);
     279  for(int_4 i=0;i<mBins;i++) {
     280    r_8 xmi = BinLowEdge(i);
     281    r_8 xma = BinHighEdge(i);
     282    int_4 imi =  H.FindBin(xmi);
    265283    if( imi < 0 ) imi = 0;
    266     int ima =  H.FindBin(xma);
    267     if( ima >= H.bins ) ima = H.bins-1;
    268     double wY = 0., wY2 = 0., wW = 0.;
     284    int_4 ima =  H.FindBin(xma);
     285    if( ima >= H.mBins ) ima = H.mBins-1;
     286    r_8 wY = 0., wY2 = 0., wW = 0.;
    269287    if( ima == imi ) {
    270288      wY  = H.SumY[imi]  * binWidth/H.binWidth;
     
    278296      wW  += H.SumW[imi]  * (H.BinHighEdge(imi)-xmi)/H.binWidth;
    279297      wW  += H.SumW[ima]  * (xma -H.BinLowEdge(ima))/H.binWidth;
    280       if(ima>imi+1) for(int ii=imi+1;ii<ima;ii++)
     298      if(ima>imi+1) for(int_4 ii=imi+1;ii<ima;ii++)
    281299        {wY += H.SumY[ii]; wY2 += H.SumY2[ii]; wW += H.SumW[ii];}
    282300    }
     
    305323
    306324// Lecture des valeurs
    307 is.Get(dobj->bins);
     325is.Get(dobj->mBins);
    308326is.Get(dobj->YMin);
    309327is.Get(dobj->YMax);
     
    313331// Lecture des donnees propres a l'histogramme de profil.
    314332is.GetLine(strg,255);
    315 dobj->SumY  = new double[dobj->bins];
    316 dobj->SumY2 = new double[dobj->bins];
    317 dobj->SumW  = new double[dobj->bins];
    318 is.Get(dobj->SumY,  dobj->bins);
    319 is.Get(dobj->SumY2, dobj->bins);
    320 is.Get(dobj->SumW,  dobj->bins);
     333dobj->SumY  = new r_8[dobj->mBins];
     334dobj->SumY2 = new r_8[dobj->mBins];
     335dobj->SumW  = new r_8[dobj->mBins];
     336is.Get(dobj->SumY,  dobj->mBins);
     337is.Get(dobj->SumY2, dobj->mBins);
     338is.Get(dobj->SumW,  dobj->mBins);
    321339
    322340// Lecture de l'histogramme
     
    337355
    338356// Ecriture des valeurs
    339 os.Put(dobj->bins);
     357os.Put(dobj->mBins);
    340358os.Put(dobj->YMin);
    341359os.Put(dobj->YMax);
     
    345363sprintf(strg,"HProf: SumY SumY2 SumW");
    346364os.PutLine(strg);
    347 os.Put(dobj->SumY,  dobj->bins);
    348 os.Put(dobj->SumY2, dobj->bins);
    349 os.Put(dobj->SumW,  dobj->bins);
     365os.Put(dobj->SumY,  dobj->mBins);
     366os.Put(dobj->SumY2, dobj->mBins);
     367os.Put(dobj->SumW,  dobj->mBins);
    350368
    351369// Ecriture de l'histogramme
  • trunk/SophyaLib/HiStats/hisprof.h

    r1089 r1092  
    1717  // CREATOR / DESTRUCTOR
    1818  HProf();
    19   HProf(float xMin, float xMax, int nBin=100, float yMin=1., float yMax=-1.);
     19  HProf(r_8 xMin, r_8 xMax, int_4 nBin=100, r_8 yMin=1., r_8 yMax=-1.);
     20  HProf(r_4 xMin, r_4 xMax, int_4 nBin=100, r_4 yMin=1., r_4 yMax=-1.);
    2021  HProf(const HProf& H);
    2122  virtual ~HProf();
     
    2728  void SetErrOpt(bool spread = true);
    2829  void Zero();
    29   void Add(float x, float y, float w = 1.);
    30   void AddBin(int numBin, float y, float w = 1.);
     30  void Add(r_8 x, r_8 y, r_8 w = 1.);
     31  void AddBin(int_4 numBin, r_8 y, r_8 w = 1.);
    3132 
    3233  // Acces a l information
     
    4445              {UpdateHisto(); Histo::GetError(v);}
    4546  //! Retourne le contenu du bin i
    46   inline float operator()(int i) const
    47                {UpdateHisto(); return data[i];}
     47  inline r_8 operator()(int_4 i) const
     48               {UpdateHisto(); return mData[i];}
    4849  //! Retourne le carre de la dispersion/erreur du bin i
    49   inline double Error2(int i) const
    50                 {UpdateHisto(); return (float) err2[i];}
     50  inline r_8 Error2(int_4 i) const
     51                {UpdateHisto(); return mErr2[i];}
    5152  //! Retourne la dispersion/erreur du bin i
    52   inline float Error(int i) const
     53  inline r_8 Error(int_4 i) const
    5354               {UpdateHisto();
    54                 return (err2[i]>0.) ? (float) sqrt(err2[i]) : 0.f;}
     55                return (mErr2[i]>0.) ? sqrt(mErr2[i]) : 0.;}
    5556
    5657  // Operators
     
    5960
    6061  // Info, statistique et calculs sur les histogrammes
    61   virtual void HRebin(int nbinew);
     62  virtual void HRebin(int_4 nbinew);
    6263
    6364  // Fit
    6465  //! Fit du profile par ``gfit''.
    65   inline int Fit(GeneralFit& gfit)
     66  inline int_4 Fit(GeneralFit& gfit)
    6667         {UpdateHisto(); return Histo::Fit(gfit,0);}
    6768  //! Retourne l'Histogramme des residus par ``gfit''.
     
    7475  // Print
    7576  //! Print, voir detail dans Histo::Print
    76   inline void Print(int dyn=100,float hmin=1.,float hmax=-1.
    77                    ,int pflag=0,int il=1,int ih=-1)
     77  inline void Print(int_4 dyn=100,r_8 hmin=1.,r_8 hmax=-1.
     78                   ,int_4 pflag=0,int_4 il=1,int_4 ih=-1)
    7879         {UpdateHisto(); Histo::Print(dyn,hmin,hmax,pflag,il,ih);}
    7980  //! PrintF, voir detail dans Histo::PrintF
    80   inline void PrintF(FILE * fp,int dyn=100,float hmin=1.,float hmax=-1.
    81                     ,int pflag=0,int il=1,int ih=-1)
     81  inline void PrintF(FILE * fp,int_4 dyn=100,r_8 hmin=1.,r_8 hmax=-1.
     82                    ,int_4 pflag=0,int_4 il=1,int_4 ih=-1)
    8283         {UpdateHisto(); Histo::PrintF(fp,dyn,hmin,hmax,pflag,il,ih);}
    8384
     
    8687  void updatehisto() const;
    8788
    88   double*        SumY;  //!< somme
    89   double*        SumY2; //!< somme des carres
    90   double*        SumW;  //!< somme des poids
    91   mutable bool   Ok;    //!< true if update fait
    92   float          YMin;  //!< limite minimum Y pour somme
    93   float          YMax;  //!< limite maximum Y pour somme
    94   uint_2         Opt;   //!< options pour les erreurs
     89  r_8*         SumY;  //!< somme
     90  r_8*         SumY2; //!< somme des carres
     91  r_8*         SumW;  //!< somme des poids
     92  mutable bool Ok;    //!< true if update fait
     93  r_8          YMin;  //!< limite minimum Y pour somme
     94  r_8          YMax;  //!< limite maximum Y pour somme
     95  uint_2       Opt;   //!< options pour les erreurs
    9596};
    9697
  • trunk/SophyaLib/HiStats/histos.cc

    r1064 r1092  
    11//
    2 // $Id: histos.cc,v 1.9 2000-07-11 18:57:25 ansari Exp $
     2// $Id: histos.cc,v 1.10 2000-07-26 13:15:15 ansari Exp $
    33//
    44
     
    2222/*! Constructeur par defaut */
    2323Histo::Histo()
    24 : data(NULL), err2(NULL),
    25   under(0), over(0), nHist(0), nEntries(0),
    26   bins(0), min(0), max(0),
     24: mData(NULL), mErr2(NULL),
     25  mUnder(0), mOver(0), nHist(0), nEntries(0),
     26  mBins(0), mMin(0), mMax(0),
    2727  binWidth(0)
    2828{
     
    3232/********* Methode *********/
    3333/*! Constructeur d'un histo de nBin bins allant de xMin a xMax */
    34 Histo::Histo(float xMin, float xMax, int nBin)
    35 : data(new float[nBin]), err2(NULL),
    36   under(0), over(0), nHist(0), nEntries(0),
    37   bins(nBin), min(xMin), max(xMax),
    38   binWidth((max - min)/nBin)
     34Histo::Histo(r_8 xMin, r_8 xMax, int_4 nBin)
     35: mData((nBin>0) ? new r_8[nBin] : NULL),
     36  mErr2(NULL),
     37  mUnder(0), mOver(0), nHist(0), nEntries(0),
     38  mBins(nBin), mMin(xMin), mMax(xMax),
     39  binWidth((nBin>0) ? (mMax-mMin)/nBin : 0)
    3940{
    4041  Zero();
     
    4344
    4445/********* Methode *********/
     46/*! Constructeur d'un histo de nBin bins allant de xMin a xMax */
     47Histo::Histo(r_4 xMin, r_4 xMax, int_4 nBin)
     48: mData((nBin>0) ? new r_8[nBin] : NULL),
     49  mErr2(NULL),
     50  mUnder(0), mOver(0), nHist(0), nEntries(0),
     51  mBins(nBin), mMin((r_8)xMin), mMax((r_8)xMax),
     52  binWidth((nBin>0) ? (mMax-mMin)/nBin : 0)
     53{
     54  Zero();
     55  END_CONSTRUCTOR
     56}
     57
     58/********* Methode *********/
    4559/*! Constructeur par copie */
    4660Histo::Histo(const Histo& H)
    47 : data((H.bins>0)? new float[H.bins] : NULL),
    48   err2(NULL),
    49   under(H.under), over(H.over), nHist(H.nHist), nEntries(H.nEntries),
    50   bins(H.bins), min(H.min), max(H.max),
     61: mData((H.mBins>0)? new r_8[H.mBins] : NULL),
     62  mErr2(NULL),
     63  mUnder(H.mUnder), mOver(H.mOver), nHist(H.nHist), nEntries(H.nEntries),
     64  mBins(H.mBins), mMin(H.mMin), mMax(H.mMax),
    5165  binWidth(H.binWidth)
    5266{
    53   if(bins>0) {
    54     memcpy(data, H.data, bins*sizeof(float));
    55     if( H.err2 != NULL ) {
    56       err2 = new double[bins];
    57       memcpy(err2, H.err2, bins*sizeof(double));
     67  if(mBins>0) {
     68    memcpy(mData, H.mData, mBins*sizeof(r_8));
     69    if( H.mErr2 != NULL ) {
     70      mErr2 = new r_8[mBins];
     71      memcpy(mErr2, H.mErr2, mBins*sizeof(r_8));
    5872    }
    5973  }
     
    6579void Histo::Delete()
    6680{
    67   if( data != NULL ) { delete[] data; data = NULL;}
    68   if( err2 != NULL ) { delete[] err2; err2 = NULL;}
    69   under = over = min = max = binWidth= 0.;
     81  if( mData != NULL ) { delete[] mData; mData = NULL;}
     82  if( mErr2 != NULL ) { delete[] mErr2; mErr2 = NULL;}
     83  mUnder = mOver = mMin = mMax = binWidth= 0.;
    7084  nHist = 0.;
    71   nEntries = bins = 0;
     85  nEntries = mBins = 0;
    7286}
    7387
     
    8599void Histo::Zero()
    86100{
    87   if(bins<=0) return;
    88   memset(data, 0, bins*sizeof(float));
    89   under = over = 0;
     101  if(mBins<=0) return;
     102  memset(mData, 0, mBins*sizeof(r_8));
     103  mUnder = mOver = 0;
    90104  nHist = 0;
    91105  nEntries = 0;
    92   if( err2 != NULL ) memset(err2, 0, bins*sizeof(double));
     106  if( mErr2 != NULL ) memset(mErr2, 0, mBins*sizeof(r_8));
    93107}
    94108
     
    99113void Histo::Errors()
    100114{
    101  if(bins<=0) return;
    102  if(err2==NULL) err2 = new double[bins];
    103  memset(err2, 0, bins*sizeof(double));
     115 if(mBins<=0) return;
     116 if(mErr2==NULL) mErr2 = new r_8[mBins];
     117 memset(mErr2, 0, mBins*sizeof(r_8));
    104118}
    105119
     
    111125{
    112126  if(this == &h) return *this;
    113   if( h.bins <= 0 ) {Delete(); return *this;}
    114   if( h.bins > bins ) Delete();
    115   if(!h.err2 && err2 ) { delete [] err2; err2=NULL;}
    116   if(!data) data = new float[h.bins];
    117   if(h.err2 && !err2 ) err2 = new double[h.bins];
    118 
    119   under = h.under;
    120   over = h.over;
     127  if( h.mBins <= 0 ) {Delete(); return *this;}
     128  if( h.mBins > mBins ) Delete();
     129  if(!h.mErr2 && mErr2 ) { delete [] mErr2; mErr2=NULL;}
     130  if(!mData) mData = new r_8[h.mBins];
     131  if(h.mErr2 && !mErr2 ) mErr2 = new r_8[h.mBins];
     132
     133  mUnder = h.mUnder;
     134  mOver = h.mOver;
    121135  nHist = h.nHist;
    122136  nEntries = h.nEntries;
    123   bins = h.bins;
    124   min = h.min;
    125   max = h.max;
     137  mBins = h.mBins;
     138  mMin = h.mMin;
     139  mMax = h.mMax;
    126140  binWidth = h.binWidth;
    127141 
    128   memcpy(data, h.data, bins*sizeof(float));
    129   if(err2) memcpy(err2, h.err2, bins*sizeof(double));
     142  memcpy(mData, h.mData, mBins*sizeof(r_8));
     143  if(mErr2) memcpy(mErr2, h.mErr2, mBins*sizeof(r_8));
    130144
    131145  return *this;
     
    136150  Operateur de multiplication par une constante
    137151*/
    138 Histo& Histo::operator *= (double b)
    139 {
    140 double b2 = b*b;
    141 for(int i=0;i<bins;i++) {
    142   data[i] *= b;
    143   if(err2) err2[i] *= b2;
    144 }
    145 under *= b;
    146 over *= b;
     152Histo& Histo::operator *= (r_8 b)
     153{
     154r_8 b2 = b*b;
     155for(int_4 i=0;i<mBins;i++) {
     156  mData[i] *= b;
     157  if(mErr2) mErr2[i] *= b2;
     158}
     159mUnder *= b;
     160mOver *= b;
    147161nHist *= b;
    148162
     
    153167  Operateur de division par une constante
    154168*/
    155 Histo& Histo::operator /= (double b)
     169Histo& Histo::operator /= (r_8 b)
    156170{
    157171if (b==0.) THROW(inconsistentErr);
    158 double b2 = b*b;
    159 for(int i=0;i<bins;i++) {
    160   data[i] /= b;
    161   if(err2) err2[i] /= b2;
    162 }
    163 under /= b;
    164 over /= b;
     172r_8 b2 = b*b;
     173for(int_4 i=0;i<mBins;i++) {
     174  mData[i] /= b;
     175  if(mErr2) mErr2[i] /= b2;
     176}
     177mUnder /= b;
     178mOver /= b;
    165179nHist /= b;
    166180
     
    171185  Operateur d'addition d'une constante
    172186*/
    173 Histo& Histo::operator += (double b)
    174 {
    175 for(int i=0;i<bins;i++) data[i] += b;
    176 under += b;
    177 over += b;
    178 nHist += bins*b;
     187Histo& Histo::operator += (r_8 b)
     188{
     189for(int_4 i=0;i<mBins;i++) mData[i] += b;
     190mUnder += b;
     191mOver += b;
     192nHist += mBins*b;
    179193
    180194return *this;
     
    184198  Operateur de soustraction d'une constante
    185199*/
    186 Histo& Histo::operator -= (double b)
    187 {
    188 for(int i=0;i<bins;i++) data[i] -= b;
    189 under -= b;
    190 over -= b;
    191 nHist -= bins*b;
     200Histo& Histo::operator -= (r_8 b)
     201{
     202for(int_4 i=0;i<mBins;i++) mData[i] -= b;
     203mUnder -= b;
     204mOver -= b;
     205nHist -= mBins*b;
    192206
    193207return *this;
     
    200214Histo& Histo::operator += (const Histo& a)
    201215{
    202 if(bins!=a.bins) THROW(sizeMismatchErr);
    203 for(int i=0;i<bins;i++) {
    204   data[i] += a(i);
    205   if(err2 && a.err2) err2[i] += a.Error2(i);
    206 }
    207 under += a.under;
    208 over += a.over;
     216if(mBins!=a.mBins) THROW(sizeMismatchErr);
     217for(int_4 i=0;i<mBins;i++) {
     218  mData[i] += a(i);
     219  if(mErr2 && a.mErr2) mErr2[i] += a.Error2(i);
     220}
     221mUnder += a.mUnder;
     222mOver += a.mOver;
    209223nHist += a.nHist;
    210224nEntries += a.nEntries;
     
    218232Histo& Histo::operator -= (const Histo& a)
    219233{
    220 if(bins!=a.bins) THROW(sizeMismatchErr);
    221 for(int i=0;i<bins;i++) {
    222   data[i] -= a(i);
    223   if(err2 && a.err2) err2[i] += a.Error2(i);
    224 }
    225 under -= a.under;
    226 over -= a.over;
     234if(mBins!=a.mBins) THROW(sizeMismatchErr);
     235for(int_4 i=0;i<mBins;i++) {
     236  mData[i] -= a(i);
     237  if(mErr2 && a.mErr2) mErr2[i] += a.Error2(i);
     238}
     239mUnder -= a.mUnder;
     240mOver -= a.mOver;
    227241nHist -= a.nHist;
    228242nEntries += a.nEntries;
     
    236250Histo& Histo::operator *= (const Histo& a)
    237251{
    238 if(bins!=a.bins) THROW(sizeMismatchErr);
     252if(mBins!=a.mBins) THROW(sizeMismatchErr);
    239253nHist = 0.;
    240 for(int i=0;i<bins;i++) {
    241   if(err2 && a.err2)
    242       err2[i] = a(i)*a(i)*err2[i] + data[i]*data[i]*a.Error2(i);
    243   data[i] *= a(i);
    244   nHist += data[i];
    245 }
    246 under *= a.under;
    247 over *= a.over;
     254for(int_4 i=0;i<mBins;i++) {
     255  if(mErr2 && a.mErr2)
     256      mErr2[i] = a(i)*a(i)*mErr2[i] + mData[i]*mData[i]*a.Error2(i);
     257  mData[i] *= a(i);
     258  nHist += mData[i];
     259}
     260mUnder *= a.mUnder;
     261mOver *= a.mOver;
    248262nEntries += a.nEntries;
    249263
     
    256270Histo& Histo::operator /= (const Histo& a)
    257271{
    258 if(bins!=a.bins) THROW(sizeMismatchErr);
     272if(mBins!=a.mBins) THROW(sizeMismatchErr);
    259273nHist = 0.;
    260 for(int i=0;i<bins;i++) {
     274for(int_4 i=0;i<mBins;i++) {
    261275  if(a(i)==0.) {
    262     data[i]=0.;
    263     if(err2) err2[i]=0.;
     276    mData[i]=0.;
     277    if(mErr2) mErr2[i]=0.;
    264278    continue;
    265279  }
    266   if(err2 && a.err2)
    267       err2[i] = (err2[i] + data[i]/a(i)*data[i]/a(i)*a.Error2(i))
     280  if(mErr2 && a.mErr2)
     281      mErr2[i] = (mErr2[i] + mData[i]/a(i)*mData[i]/a(i)*a.Error2(i))
    268282                /(a(i)*a(i));
    269   data[i] /= a(i);
    270   nHist += data[i];
    271 }
    272 if(a.under!=0.) under /= a.under; else under = 0.;
    273 if(a.over!=0.)  over  /= a.over;  else over  = 0.;
     283  mData[i] /= a(i);
     284  nHist += mData[i];
     285}
     286if(a.mUnder!=0.) mUnder /= a.mUnder; else mUnder = 0.;
     287if(a.mOver!=0.)  mOver  /= a.mOver;  else mOver  = 0.;
    274288nEntries += a.nEntries;
    275289
     
    283297void Histo::GetAbsc(TVector<r_8> &v)
    284298{
    285 v.Realloc(bins);
    286 for(int i=0;i<bins;i++) v(i) = BinLowEdge(i);
     299v.Realloc(mBins);
     300for(int_4 i=0;i<mBins;i++) v(i) = BinLowEdge(i);
    287301return;
    288302}
     
    293307void Histo::GetValue(TVector<r_8> &v)
    294308{
    295 v.Realloc(bins);
    296 for(int i=0;i<bins;i++) v(i) = data[i];
     309v.Realloc(mBins);
     310for(int_4 i=0;i<mBins;i++) v(i) = mData[i];
    297311return;
    298312}
     
    303317void Histo::GetError2(TVector<r_8> &v)
    304318{
    305 v.Realloc(bins);
    306 if(!err2) {for(int i=0;i<bins;i++) v(i) = 0.; return;}
    307 for(int i=0;i<bins;i++) v(i) = err2[i];
     319v.Realloc(mBins);
     320if(!mErr2) {for(int_4 i=0;i<mBins;i++) v(i) = 0.; return;}
     321for(int_4 i=0;i<mBins;i++) v(i) = mErr2[i];
    308322return;
    309323}
     
    314328void Histo::GetError(TVector<r_8> &v)
    315329{
    316 v.Realloc(bins);
    317 if(!err2) {for(int i=0;i<bins;i++) v(i) = 0.; return;}
    318 for(int i=0;i<bins;i++) v(i) = Error(i);
     330v.Realloc(mBins);
     331if(!mErr2) {for(int_4 i=0;i<mBins;i++) v(i) = 0.; return;}
     332for(int_4 i=0;i<mBins;i++) v(i) = Error(i);
    319333return;
    320334}
     
    324338  Remplissage du contenu de l'histo avec les valeurs d'un vecteur
    325339*/
    326 void Histo::PutValue(TVector<r_8> &v, int ierr)
    327 {
    328 //if(v.NElts()<(uint_4) bins) THROW(sizeMismatchErr);
    329 uint_4 n = (v.NElts()<(uint_4) bins) ? v.NElts(): (uint_4) bins;
    330 if(n>0) for(int i=0;i<n;i++) {
    331   data[i] = v(i);
    332   if(err2&&ierr) err2[i] = fabs(v(i));
     340void Histo::PutValue(TVector<r_8> &v, int_4 ierr)
     341{
     342//if(v.NElts()<(uint_4) mBins) THROW(sizeMismatchErr);
     343uint_4 n = (v.NElts()<(uint_4) mBins) ? v.NElts(): (uint_4) mBins;
     344if(n>0) for(uint_4 i=0;i<n;i++) {
     345  mData[i] = v(i);
     346  if(mErr2&&ierr) mErr2[i] = fabs(v(i));
    333347}
    334348return;
     
    338352  Addition du contenu de l'histo avec les valeurs d'un vecteur
    339353*/
    340 void Histo::PutValueAdd(TVector<r_8> &v, int ierr)
    341 {
    342 //if(v.NElts()<(uint_4) bins) THROW(sizeMismatchErr);
    343 uint_4 n = (v.NElts()<(uint_4) bins) ? v.NElts(): (uint_4) bins;
    344 if(n>0) for(int i=0;i<n;i++) {
    345   data[i] += v(i);
    346   if(err2 && ierr) err2[i] += fabs(v(i));
     354void Histo::PutValueAdd(TVector<r_8> &v, int_4 ierr)
     355{
     356//if(v.NElts()<(uint_4) mBins) THROW(sizeMismatchErr);
     357uint_4 n = (v.NElts()<(uint_4) mBins) ? v.NElts(): (uint_4) mBins;
     358if(n>0) for(uint_4 i=0;i<n;i++) {
     359  mData[i] += v(i);
     360  if(mErr2 && ierr) mErr2[i] += fabs(v(i));
    347361}
    348362return;
     
    354368void Histo::PutError2(TVector<r_8> &v)
    355369{
    356 //if(v.NElts()<(uint_4) bins) THROW(sizeMismatchErr);
    357 uint_4 n = (v.NElts()<(uint_4) bins) ? v.NElts(): (uint_4) bins;
     370//if(v.NElts()<(uint_4) mBins) THROW(sizeMismatchErr);
     371uint_4 n = (v.NElts()<(uint_4) mBins) ? v.NElts(): (uint_4) mBins;
    358372if(n>0) {
    359   if(!err2) Errors();
    360   for(int i=0;i<n;i++) err2[i] = v(i);
     373  if(!mErr2) Errors();
     374  for(uint_4 i=0;i<n;i++) mErr2[i] = v(i);
    361375}
    362376return;
     
    368382void Histo::PutError2Add(TVector<r_8> &v)
    369383{
    370 //if(v.NElts()<(uint_4) bins) THROW(sizeMismatchErr);
    371 uint_4 n = (v.NElts()<(uint_4) bins) ? v.NElts(): (uint_4) bins;
     384//if(v.NElts()<(uint_4) mBins) THROW(sizeMismatchErr);
     385uint_4 n = (v.NElts()<(uint_4) mBins) ? v.NElts(): (uint_4) mBins;
    372386if(n>0) {
    373   if(!err2) Errors();
    374   for(int i=0;i<n;i++) if(v(i)>0.) err2[i] += v(i);
     387  if(!mErr2) Errors();
     388  for(uint_4 i=0;i<n;i++) if(v(i)>0.) mErr2[i] += v(i);
    375389}
    376390return;
     
    382396void Histo::PutError(TVector<r_8> &v)
    383397{
    384 //if(v.NElts()<(uint_4) bins) THROW(sizeMismatchErr);
    385 uint_4 n = (v.NElts()<(uint_4) bins) ? v.NElts(): (uint_4) bins;
     398//if(v.NElts()<(uint_4) mBins) THROW(sizeMismatchErr);
     399uint_4 n = (v.NElts()<(uint_4) mBins) ? v.NElts(): (uint_4) mBins;
    386400if(n>0) {
    387   if(!err2) Errors();
    388   for(int i=0;i<n;i++)
    389     if(v(i)>0.) err2[i]=v(i)*v(i); else err2[i]=-v(i)*v(i);
     401  if(!mErr2) Errors();
     402  for(uint_4 i=0;i<n;i++)
     403    if(v(i)>0.) mErr2[i]=v(i)*v(i); else mErr2[i]=-v(i)*v(i);
    390404}
    391405return;
     
    396410  Addition du contenu de l'histo pour abscisse x poids w
    397411*/
    398 void Histo::Add(float x, float w)
    399 {
    400   int numBin = FindBin(x);
    401   if (numBin<0) under += w;
    402   else if (numBin>=bins) over += w;
     412void Histo::Add(r_8 x, r_8 w)
     413{
     414  int_4 numBin = FindBin(x);
     415  if (numBin<0) mUnder += w;
     416  else if (numBin>=mBins) mOver += w;
    403417  else {
    404     data[numBin] += w;
    405     if(err2!=NULL) err2[numBin] += w*w;
     418    mData[numBin] += w;
     419    if(mErr2!=NULL) mErr2[numBin] += w*w;
    406420    nHist += w;
    407421    nEntries++;
     
    413427  Addition du contenu de l'histo bin numBin poids w
    414428*/
    415 void Histo::AddBin(int numBin, float w)
    416 {
    417   if (numBin<0) under += w;
    418   else if (numBin>=bins) over += w;
     429void Histo::AddBin(int_4 numBin, r_8 w)
     430{
     431  if (numBin<0) mUnder += w;
     432  else if (numBin>=mBins) mOver += w;
    419433  else {
    420     data[numBin] += w;
    421     if(err2!=NULL) err2[numBin] += w*w;
     434    mData[numBin] += w;
     435    if(mErr2!=NULL) mErr2[numBin] += w*w;
    422436    nHist += w;
    423437    nEntries++;
     
    429443  Remplissage du contenu de l'histo pour abscisse x poids w
    430444*/
    431 void Histo::SetBin(float x, float w)
    432 {
    433   int numBin = FindBin(x);
     445void Histo::SetBin(r_8 x, r_8 w)
     446{
     447  int_4 numBin = FindBin(x);
    434448  SetBin(numBin,w);
    435449}
     
    439453  Remplissage du contenu de l'histo pour numBin poids w
    440454*/
    441 void Histo::SetBin(int numBin, float w)
    442 {
    443   if (numBin<0) under = w;
    444   else if (numBin>=bins) over = w;
     455void Histo::SetBin(int_4 numBin, r_8 w)
     456{
     457  if (numBin<0) mUnder = w;
     458  else if (numBin>=mBins) mOver = w;
    445459  else {
    446     nHist -= data[numBin];
    447     data[numBin] = w;
     460    nHist -= mData[numBin];
     461    mData[numBin] = w;
    448462    nHist += w;
    449463  }
     
    454468  Remplissage des erreurs au carre pour abscisse x
    455469*/
    456 void Histo::SetErr2(float x, double e2)
    457 {
    458   int numBin = FindBin(x);
     470void Histo::SetErr2(r_8 x, r_8 e2)
     471{
     472  int_4 numBin = FindBin(x);
    459473  SetErr2(numBin,e2);
    460474}
     
    464478  Remplissage des erreurs au carre pour numBin poids
    465479*/
    466 void Histo::SetErr2(int numBin, double e2)
    467 {
    468   if( err2==NULL) return;
    469   if ( numBin<0 || numBin>=bins ) return;
    470   err2[numBin] = e2;
     480void Histo::SetErr2(int_4 numBin, r_8 e2)
     481{
     482  if( mErr2==NULL) return;
     483  if ( numBin<0 || numBin>=mBins ) return;
     484  mErr2[numBin] = e2;
    471485}
    472486
     
    475489  Remplissage des erreurs pour abscisse x
    476490*/
    477 void Histo::SetErr(float x, float e)
    478 {
    479 SetErr2(x, (double) e*e);
     491void Histo::SetErr(r_8 x, r_8 e)
     492{
     493SetErr2(x, e*e);
    480494}
    481495
     
    484498  Remplissage des erreurs pour numBin
    485499*/
    486 void Histo::SetErr(int numBin, float e)
    487 {
    488 SetErr2(numBin, (double) e*e);
     500void Histo::SetErr(int_4 numBin, r_8 e)
     501{
     502SetErr2(numBin, e*e);
    489503}
    490504
     
    493507  Numero du bin ayant le contenu maximum
    494508*/
    495 int Histo::IMax() const
    496 {
    497   int imx=0;
    498   if(bins==1) return imx;
    499   float mx=data[0];
    500   for (int i=1; i<bins; i++)
    501     if (data[i]>mx) {imx = i; mx=data[i];}
     509int_4 Histo::IMax() const
     510{
     511  int_4 imx=0;
     512  if(mBins==1) return imx;
     513  r_8 mx=mData[0];
     514  for (int_4 i=1; i<mBins; i++)
     515    if (mData[i]>mx) {imx = i; mx=mData[i];}
    502516  return imx;
    503517}
     
    507521  Numero du bin ayant le contenu minimum
    508522*/
    509 int Histo::IMin() const
    510 {
    511   int imx=0;
    512   if(bins==1) return imx;
    513   float mx=data[0];
    514   for (int i=1; i<bins; i++)
    515     if (data[i]<mx) {imx = i; mx=data[i];}
     523int_4 Histo::IMin() const
     524{
     525  int_4 imx=0;
     526  if(mBins==1) return imx;
     527  r_8 mx=mData[0];
     528  for (int_4 i=1; i<mBins; i++)
     529    if (mData[i]<mx) {imx = i; mx=mData[i];}
    516530  return imx;
    517531}
     
    521535  Valeur le contenu maximum
    522536*/
    523 float Histo::VMax() const
    524 {
    525   float mx=data[0];
    526   if(bins==1) return mx;
    527   for (int i=1;i<bins;i++) if(data[i]>mx) mx=data[i];
     537r_8 Histo::VMax() const
     538{
     539  r_8 mx=mData[0];
     540  if(mBins==1) return mx;
     541  for (int_4 i=1;i<mBins;i++) if(mData[i]>mx) mx=mData[i];
    528542  return mx;
    529543}
     
    533547  Valeur le contenu minimum
    534548*/
    535 float Histo::VMin() const
    536 {
    537   float mx=data[0];
    538   if(bins==1) return mx;
    539   for (int i=1;i<bins;i++) if(data[i]<mx) mx=data[i];
     549r_8 Histo::VMin() const
     550{
     551  r_8 mx=mData[0];
     552  if(mBins==1) return mx;
     553  for (int_4 i=1;i<mBins;i++) if(mData[i]<mx) mx=mData[i];
    540554  return mx;
    541555}
     
    545559  Valeur moyenne
    546560*/
    547 float Histo::Mean() const
    548 {
    549   double n = 0;
    550   double sx = 0;
    551   for (int i=0; i<bins; i++) {
    552     double v = (data[i]>=0.) ? data[i] : -data[i];
     561r_8 Histo::Mean() const
     562{
     563  r_8 n = 0;
     564  r_8 sx = 0;
     565  for (int_4 i=0; i<mBins; i++) {
     566    r_8 v = (mData[i]>=0.) ? mData[i] : -mData[i];
    553567    n += v;
    554568    sx += BinCenter(i)*v;
    555569  }
    556   if(n>0.) return sx/n; else return min;
     570  if(n>0.) return sx/n; else return mMin;
    557571}
    558572
     
    561575  Valeur du sigma
    562576*/
    563 float Histo::Sigma() const
    564 {
    565   double n = 0;
    566   double sx = 0;
    567   double sx2= 0;
    568   for (int i=0; i<bins; i++) {
    569     double v = (data[i]>=0.) ? data[i] : -data[i];
     577r_8 Histo::Sigma() const
     578{
     579  r_8 n = 0;
     580  r_8 sx = 0;
     581  r_8 sx2= 0;
     582  for (int_4 i=0; i<mBins; i++) {
     583    r_8 v = (mData[i]>=0.) ? mData[i] : -mData[i];
    570584    n += v;
    571585    sx += BinCenter(i)*v;
     
    583597  Valeur de la moyenne calculee entre les bin il et ih
    584598*/
    585 float Histo::MeanLH(int il,int ih) const
    586 {
    587   if( ih < il ) { il = 0; ih = bins-1; }
     599r_8 Histo::MeanLH(int_4 il,int_4 ih) const
     600{
     601  if( ih < il ) { il = 0; ih = mBins-1; }
    588602  if( il < 0 ) il = 0;
    589   if( ih >= bins ) ih = bins-1;
    590   double n = 0;
    591   double sx = 0;
    592   for (int i=il; i<=ih; i++) {
    593     double v = (data[i]>=0.) ? data[i] : -data[i];
     603  if( ih >= mBins ) ih = mBins-1;
     604  r_8 n = 0;
     605  r_8 sx = 0;
     606  for (int_4 i=il; i<=ih; i++) {
     607    r_8 v = (mData[i]>=0.) ? mData[i] : -mData[i];
    594608    n += v;
    595609    sx += BinCenter(i)*v;
     
    602616  Valeur de la moyenne calculee entre les bin il et ih
    603617*/
    604 float Histo::SigmaLH(int il,int ih) const
    605 {
    606   if( ih < il ) { il = 0; ih = bins - 1; }
     618r_8 Histo::SigmaLH(int_4 il,int_4 ih) const
     619{
     620  if( ih < il ) { il = 0; ih = mBins - 1; }
    607621  if( il < 0 ) il = 0;
    608   if( ih >= bins ) ih = bins - 1;
    609   double n = 0;
    610   double sx = 0;
    611   double sx2= 0;
    612   for (int i=il; i<=ih; i++) {
    613     double v = (data[i]>=0.) ? data[i] : -data[i];
     622  if( ih >= mBins ) ih = mBins - 1;
     623  r_8 n = 0;
     624  r_8 sx = 0;
     625  r_8 sx2= 0;
     626  for (int_4 i=il; i<=ih; i++) {
     627    r_8 v = (mData[i]>=0.) ? mData[i] : -mData[i];
    614628    n += v;
    615629    sx += BinCenter(i)*v;
     
    626640  Valeur de la moyenne calculee entre x0-dx et x0+dx
    627641*/
    628 float Histo::Mean(float x0, float dx) const
    629 {
    630   double sdata = 0;
    631   double sx = 0;
    632   int iMin = FindBin(x0-dx);
     642r_8 Histo::Mean(r_8 x0, r_8 dx) const
     643{
     644  r_8 sdata = 0;
     645  r_8 sx = 0;
     646  int_4 iMin = FindBin(x0-dx);
    633647  if (iMin<0) iMin = 0;
    634   int iMax = FindBin(x0+dx);
    635   if (iMax>bins) iMax=bins;
    636   for (int i=iMin; i<iMax; i++) {
    637     double v = (data[i]>=0.) ? data[i] : -data[i];
     648  int_4 iMax = FindBin(x0+dx);
     649  if (iMax>mBins) iMax=mBins;
     650  for (int_4 i=iMin; i<iMax; i++) {
     651    r_8 v = (mData[i]>=0.) ? mData[i] : -mData[i];
    638652    sx += BinCenter(i)*v;
    639653    sdata += v;
    640654  }
    641   if(sdata>0.) return sx/sdata; else return min;
     655  if(sdata>0.) return sx/sdata; else return mMin;
    642656}
    643657
     
    646660  Valeur du sigma calcule entre x0-dx et x0+dx
    647661*/
    648 float Histo::Sigma(float x0, float dx) const
    649 {
    650   double sx = 0;
    651   double sx2= 0;
    652   double sdata = 0;
    653   int iMin = FindBin(x0-dx);
     662r_8 Histo::Sigma(r_8 x0, r_8 dx) const
     663{
     664  r_8 sx = 0;
     665  r_8 sx2= 0;
     666  r_8 sdata = 0;
     667  int_4 iMin = FindBin(x0-dx);
    654668  if (iMin<0) iMin = 0;
    655   int iMax = FindBin(x0+dx);
    656   if (iMax>bins) iMax=bins;
    657   for (int i=iMin; i<iMax; i++) {
    658     double v = (data[i]>=0.) ? data[i] : -data[i];
     669  int_4 iMax = FindBin(x0+dx);
     670  if (iMax>mBins) iMax=mBins;
     671  for (int_4 i=iMin; i<iMax; i++) {
     672    r_8 v = (mData[i]>=0.) ? mData[i] : -mData[i];
    659673    sx += BinCenter(i)*v;
    660674    sx2+= BinCenter(i)*BinCenter(i)*v;
     
    669683  Valeur de la moyenne et du sigma nettoyes
    670684*/
    671 float Histo::CleanedMean(float& sigma) const
     685r_8 Histo::CleanedMean(r_8& sigma) const
    672686{
    673687  if (!nHist) return 0;
    674688  // on fait ca de facon bete, on pourra raffiner apres...
    675   float x0 = Mean();
    676   float s  = Sigma()+binWidth;
     689  r_8 x0 = Mean();
     690  r_8 s  = Sigma()+binWidth;
    677691 
    678   for (int i=0; i<3; i++) {
    679     float xx0 = Mean(x0,5*s);
     692  for (int_4 i=0; i<3; i++) {
     693    r_8 xx0 = Mean(x0,5*s);
    680694    s  = Sigma(x0,5*s)+binWidth;
    681695    x0 = xx0;
     
    689703  Valeur de la moyenne nettoyee
    690704*/
    691 float Histo::CleanedMean() const
     705r_8 Histo::CleanedMean() const
    692706{
    693707  if (!nHist) return 0;
    694   float s=0;
     708  r_8 s=0;
    695709  return CleanedMean(s);
    696710}
     
    700714  Retourne le nombre de bins non-nul
    701715*/
    702 int Histo::BinNonNul() const
    703 {
    704 int non=0;
    705 for (int i=0;i<bins;i++) if( data[i] != 0. ) non++;
     716int_4 Histo::BinNonNul() const
     717{
     718int_4 non=0;
     719for (int_4 i=0;i<mBins;i++) if( mData[i] != 0. ) non++;
    706720return non;
    707721}
     
    711725  Retourne le nombre de bins ayant une erreur non-nulle
    712726*/
    713 int Histo::ErrNonNul() const
    714 {
    715 if(err2==NULL) return -1;
    716 int non=0;
    717 for (int i=0;i<bins;i++) if( err2[i] != 0. ) non++;
     727int_4 Histo::ErrNonNul() const
     728{
     729if(mErr2==NULL) return -1;
     730int_4 non=0;
     731for (int_4 i=0;i<mBins;i++) if( mErr2[i] != 0. ) non++;
    718732return non;
    719733}
     
    724738  entre le bin 0 et ce bin (y compris le contenu de ce bin).
    725739*/
    726 int Histo::BinPercent(float per) const
    727 {
    728 double n = nHist*per;
    729 double s = 0.;
    730 int i;
    731 for(i=0; i<bins; i++ ) {
    732   s += data[i];
     740int_4 Histo::BinPercent(r_8 per) const
     741{
     742r_8 n = nHist*per;
     743r_8 s = 0.;
     744int_4 i;
     745for(i=0; i<mBins; i++ ) {
     746  s += mData[i];
    733747  if( s >= n ) break;
    734748}
    735 if( i == bins ) i = bins-1;
     749if( i == mBins ) i = mBins-1;
    736750return i;
    737751}
     
    747761       imax = bin tel que nombre d'entrees entre I et imax = N2 * per
    748762     Return: <0 si echec
    749              min(I-imin,imax-I) si ok
     763             mMin(I-imin,imax-I) si ok
    750764  \endverbatim
    751765*/
    752 int Histo::BinPercent(float x,float per,int& imin,int& imax)
     766int_4 Histo::BinPercent(r_8 x,r_8 per,int& imin,int& imax)
    753767{
    754768imin = imax = -1;
    755769if( per <= 0. ) return -1;
    756770
    757 int I = FindBin(x);
    758 if( I<0 || I>=bins ) return -2;
    759 
    760 double N1 = 0.; for(int i=0; i<=I;   i++) N1 += data[i]; N1 *= per;
    761 double N2 = 0.; {for(int i=I; i<bins; i++) N2 += data[i]; N2 *= per;}
    762 
    763 double n = 0.;
    764 for(imin=I; imin>=0; imin--)   { n += data[imin]; if(n>=N1) break; }
     771int_4 I = FindBin(x);
     772if( I<0 || I>=mBins ) return -2;
     773
     774r_8 N1 = 0.; for(int_4 i=0; i<=I;   i++) N1 += mData[i]; N1 *= per;
     775r_8 N2 = 0.; {for(int_4 i=I; i<mBins; i++) N2 += mData[i]; N2 *= per;}
     776
     777r_8 n = 0.;
     778for(imin=I; imin>=0; imin--)   { n += mData[imin]; if(n>=N1) break; }
    765779if( imin<0 ) imin = 0;
    766780// cout<<"I="<<I<<" imin="<<imin<<" n="<<n<<" N1="<<N1<<endl;
    767781
    768782n = 0.;
    769 for(imax=I; imax<bins; imax++) { n += data[imax]; if(n>=N2) break; }
    770 if( imax>=bins ) imax = bins-1;
     783for(imax=I; imax<mBins; imax++) { n += mData[imax]; if(n>=N2) break; }
     784if( imax>=mBins ) imax = mBins-1;
    771785// cout<<"I="<<I<<" imax="<<imax<<" n="<<n<<" N2="<<N2<<endl;
    772786
     
    778792  Idem precedent mais renvoie xmin et xmax
    779793*/
    780 int Histo::BinPercent(float x,float per,float& xmin,float& xmax)
     794int_4 Histo::BinPercent(r_8 x,r_8 per,r_8& xmin,r_8& xmax)
    781795{
    782796xmin = xmax = 0.;
    783 int imin,imax;
    784 int rc = BinPercent(x,per,imin,imax);
     797int_4 imin,imax;
     798int_4 rc = BinPercent(x,per,imin,imax);
    785799if( rc >= 0 ) { xmin = BinLowEdge(imin); xmax = BinHighEdge(imax); }
    786800return rc;
     
    792806  si norm <= 0 : pas de normalisation, integration seule
    793807*/
    794 void Histo::HInteg(float norm)
    795 {
    796 if( bins <= 0 ) return; // createur par default
    797 if(bins>1)
    798   for(int i=1; i<bins; i++) {
    799     data[i] += data[i-1];
    800     if(err2!=NULL) err2[i] += err2[i-1];
     808void Histo::HInteg(r_8 norm)
     809{
     810if( mBins <= 0 ) return; // createur par default
     811if(mBins>1)
     812  for(int_4 i=1; i<mBins; i++) {
     813    mData[i] += mData[i-1];
     814    if(mErr2!=NULL) mErr2[i] += mErr2[i-1];
    801815  }
    802816if( norm <= 0. ) return;
    803 norm /= data[bins-1];
    804 for(int i=0; i<bins; i++) {
    805   data[i] *= norm;
    806   if(err2!=NULL) err2[i] *= norm*norm;
     817norm /= mData[mBins-1];
     818for(int_4 i=0; i<mBins; i++) {
     819  mData[i] *= norm;
     820  if(mErr2!=NULL) mErr2[i] *= norm*norm;
    807821}
    808822}
     
    814828void Histo::HDeriv()
    815829{
    816 if( bins <= 0 ) return; // createur par default
    817 if( bins <= 1 ) return;
    818 float *temp = new float[bins];
    819 memcpy(temp, data, bins*sizeof(float));
    820 if(bins>=3) for(int i=1; i<bins-1; i++)
    821               temp[i] = (data[i+1]-data[i-1])/(2.*binWidth);
    822 temp[0] = (data[1]-data[0])/binWidth;
    823 temp[bins-1] = (data[bins-1]-data[bins-2])/binWidth;
    824 memcpy(data, temp, bins*sizeof(float));
     830if( mBins <= 0 ) return; // createur par default
     831if( mBins <= 1 ) return;
     832r_8 *temp = new r_8[mBins];
     833memcpy(temp, mData, mBins*sizeof(r_8));
     834if(mBins>=3) for(int_4 i=1; i<mBins-1; i++)
     835              temp[i] = (mData[i+1]-mData[i-1])/(2.*binWidth);
     836temp[0] = (mData[1]-mData[0])/binWidth;
     837temp[mBins-1] = (mData[mBins-1]-mData[mBins-2])/binWidth;
     838memcpy(mData, temp, mBins*sizeof(r_8));
    825839delete [] temp;
    826840}
     
    830844  Pour rebinner l'histogramme sur nbinew bins
    831845*/
    832 void Histo::HRebin(int nbinew)
    833 {
    834   if( bins <= 0 ) return; // createur par default
     846void Histo::HRebin(int_4 nbinew)
     847{
     848  if( mBins <= 0 ) return; // createur par default
    835849  if( nbinew <= 0 ) return;
    836850
     
    839853
    840854  // Le nombre de bins est il plus grand ??
    841   if( nbinew > bins ) {
    842     delete [] data; data = NULL;
    843     data = new float[nbinew];
    844     if( err2 != NULL ) {
    845       delete [] err2; err2 = NULL;
    846       err2 = new double[nbinew];
     855  if( nbinew > mBins ) {
     856    delete [] mData; mData = NULL;
     857    mData = new r_8[nbinew];
     858    if( mErr2 != NULL ) {
     859      delete [] mErr2; mErr2 = NULL;
     860      mErr2 = new r_8[nbinew];
    847861    }
    848862  }
    849863
    850864  // remise en forme de this
    851   bins = nbinew;
     865  mBins = nbinew;
    852866  this->Zero();
    853   binWidth = (max-min)/bins;
     867  binWidth = (mMax-mMin)/mBins;
    854868  // On recopie les parametres qui n'ont pas changes
    855   under = H.under;
    856   over  = H.over;
     869  mUnder = H.mUnder;
     870  mOver  = H.mOver;
    857871
    858872
    859873  // Remplissage
    860   for(int i=0;i<bins;i++) {
    861     float xmi = BinLowEdge(i);
    862     float xma = BinHighEdge(i);
    863     int imi =  H.FindBin(xmi);
     874  for(int_4 i=0;i<mBins;i++) {
     875    r_8 xmi = BinLowEdge(i);
     876    r_8 xma = BinHighEdge(i);
     877    int_4 imi =  H.FindBin(xmi);
    864878    if( imi < 0 ) imi = 0;
    865     int ima =  H.FindBin(xma);
    866     if( ima >= H.bins ) ima = H.bins-1;
    867     double w = 0.;
     879    int_4 ima =  H.FindBin(xma);
     880    if( ima >= H.mBins ) ima = H.mBins-1;
     881    r_8 w = 0.;
    868882    if( ima == imi ) {
    869883      w = H(imi) * binWidth/H.binWidth;
     
    872886      w += H(ima) * (xma -H.BinLowEdge(ima))/H.binWidth;
    873887      if( ima > imi+1 )
    874           for(int ii=imi+1;ii<ima;ii++) w += H(ii);
     888          for(int_4 ii=imi+1;ii<ima;ii++) w += H(ii);
    875889    }
    876     AddBin(i,(float) w);
     890    AddBin(i, w);
    877891  }
    878892
     
    887901  consecutifs, le bin le plus a droite est pris.
    888902*/
    889 int Histo::MaxiLocal(float& maxi,int& imax,float& maxn,int& imaxn)
    890 {
    891 int nml = 0;
     903int_4 Histo::MaxiLocal(r_8& maxi,int& imax,r_8& maxn,int& imaxn)
     904{
     905int_4 nml = 0;
    892906imax = imaxn = -1;
    893 maxi = maxn = -1.f;
     907maxi = maxn = -1.;
    894908
    895909bool up = true;
    896910bool down = false;
    897 for(int i=0;i<bins;i++) {
    898   if( !up ) if( data[i] > data[i-1] ) up = true;
     911for(int_4 i=0;i<mBins;i++) {
     912  if( !up ) if( mData[i] > mData[i-1] ) up = true;
    899913  if( up && !down ) {
    900     if( i == bins-1 ) down=true;
    901       else if( data[i] > data[i+1] ) down=true;
     914    if( i == mBins-1 ) down=true;
     915      else if( mData[i] > mData[i+1] ) down=true;
    902916  }
    903917
     
    906920    up = down = false;
    907921    if( imax < 0 ) {
    908       imax = i; maxi = data[i];
    909     } else if( data[i] >= maxi ) {
     922      imax = i; maxi = mData[i];
     923    } else if( mData[i] >= maxi ) {
    910924      imaxn = imax; maxn = maxi;
    911       imax = i; maxi = data[i];
     925      imax = i; maxi = mData[i];
    912926    } else {
    913       if( imaxn < 0 || data[i] >= maxn ) { imaxn = i; maxn = data[i]; }
     927      if( imaxn < 0 || mData[i] >= maxn ) { imaxn = i; maxn = mData[i]; }
    914928    }
    915929  }
     
    925939  L'histo est suppose etre remplit de valeurs positives
    926940*/
    927 float Histo::FitMax(int degree, float frac, int debug) const
     941r_8 Histo::FitMax(int_4 degree, r_8 frac, int_4 debug) const
    928942{
    929943  if (degree < 2 || degree > 3) degree = 3;
     
    935949  if (NEntries() < 1) THROW(inconsistentErr);
    936950
    937   int iMax = IMax();
    938   float hmax = (*this)(iMax);
    939   float xCenter = BinCenter(iMax);
     951  int_4 iMax = IMax();
     952  r_8 hmax = (*this)(iMax);
     953  r_8 xCenter = BinCenter(iMax);
    940954
    941955  if(debug>1)
     
    944958  /* find limits at frac*hmax */
    945959
    946   float limit = frac*hmax;
    947 
    948   volatile int iLow = iMax;
     960  r_8 limit = frac*hmax;
     961
     962  volatile int_4 iLow = iMax;
    949963  while (iLow>0 && (*this)(iLow)>limit) iLow--;
    950964
    951   volatile int iHigh = iMax;
     965  volatile int_4 iHigh = iMax;
    952966  while (iHigh<NBins()-1 && (*this)(iHigh)>limit) iHigh++;
    953967
    954   int nLowHigh;
     968  int_4 nLowHigh;
    955969  for(;;) {
    956970    nLowHigh = 0;
    957     for (int i=iLow; i<=iHigh; i++) if((*this)(i)>0) {
    958       if(!err2) nLowHigh++;
     971    for (int_4 i=iLow; i<=iHigh; i++) if((*this)(i)>0) {
     972      if(!mErr2) nLowHigh++;
    959973        else if(Error2(i)>0.) nLowHigh++;
    960974    }
     
    977991  TVector<r_8> e2Fit(nLowHigh);
    978992  TVector<r_8> errcoef(1);
    979   int ii = 0;
    980   for (int j=iLow; j<=iHigh; j++) {
     993  int_4 ii = 0;
     994  for (int_4 j=iLow; j<=iHigh; j++) {
    981995    if ((*this)(j)>0) {
    982       if(!err2) {
     996      if(!mErr2) {
    983997        xFit(ii) = BinCenter(j)-xCenter;
    984998        yFit(ii) = (*this)(j);
     
    9941008  }
    9951009  if(debug>4) {
    996     int k;
     1010    int_4 k;
    9971011    for(k=0;k<nLowHigh;k++) cout<<" "<<xFit(k);  cout<<endl;
    9981012    for(k=0;k<nLowHigh;k++) cout<<" "<<yFit(k);  cout<<endl;
     
    10091023  } ENDTRY
    10101024
    1011   int DPolDeg = pol.Degre();
    1012   float fd = 0.;
     1025  int_4 DPolDeg = pol.Degre();
     1026  r_8 fd = 0.;
    10131027
    10141028  if (DPolDeg == 0) {
     
    10261040  } else if (DPolDeg == 1) {
    10271041    // on est dans le cas d'un fit de parabole
    1028     double r=0;
     1042    r_8 r=0;
    10291043    if (pol.Root1(r)==0) THROW(inconsistentErr);
    10301044    fd = r + xCenter;
    10311045  } else if (DPolDeg == 2) {
    10321046    // on est dans le cas d'un fit de cubique
    1033     double r1=0;
    1034     double r2=0;
     1047    r_8 r1=0;
     1048    r_8 r2=0;
    10351049    if (pol.Root2(r1,r2) == 0) THROW(inconsistentErr);
    10361050    pol.Derivate();
     
    10411055  }
    10421056
    1043   if(fd>max) fd = max;
    1044   if(fd<min) fd = min;
     1057  if(fd>mMax) fd = mMax;
     1058  if(fd<mMin) fd = mMin;
    10451059
    10461060  if (debug>1)
     
    10601074  L'histo est suppose etre remplit de valeurs positives
    10611075*/
    1062 float Histo::FindWidth(float frac, int debug) const
    1063 {
    1064   float xmax = BinCenter( IMax() );
     1076r_8 Histo::FindWidth(r_8 frac, int_4 debug) const
     1077{
     1078  r_8 xmax = BinCenter( IMax() );
    10651079  return FindWidth(xmax,frac,debug);
    10661080}
     
    10711085  L'histo est suppose etre remplit de valeurs positives
    10721086*/
    1073 float Histo::FindWidth(float xmax,float frac, int debug) const
     1087r_8 Histo::FindWidth(r_8 xmax,r_8 frac, int_4 debug) const
    10741088{
    10751089  if (frac <= 0 || frac >= 1.) frac = 0.5;
     
    10851099  if (NBins() < 3) THROW(inconsistentErr);
    10861100
    1087   int iMax = FindBin(xmax);
     1101  int_4 iMax = FindBin(xmax);
    10881102  if (iMax<0 || iMax>=NBins()) THROW(inconsistentErr);
    1089   float hmax = data[iMax];
    1090   float limit = frac*hmax;
     1103  r_8 hmax = mData[iMax];
     1104  r_8 limit = frac*hmax;
    10911105  if (debug > 1)
    10921106    cout << "  Max histo[" << iMax << "] = " << hmax
    10931107         << ", limite " << limit << endl;
    10941108
    1095   int iLow = iMax;
    1096   while (iLow>=0 && data[iLow]>limit) iLow--;
     1109  int_4 iLow = iMax;
     1110  while (iLow>=0 && mData[iLow]>limit) iLow--;
    10971111  if( iLow < 0 ) iLow = 0;
    10981112
    1099   int iHigh = iMax;
    1100   while (iHigh<NBins() && data[iHigh]>limit) iHigh++;
     1113  int_4 iHigh = iMax;
     1114  while (iHigh<NBins() && mData[iHigh]>limit) iHigh++;
    11011115  if( iHigh >=NBins() ) iHigh = NBins()-1;
    11021116
    1103   float xlow   = BinCenter(iLow);
    1104   float ylow   = data[iLow];
    1105 
    1106   float xlow1=xlow, ylow1=ylow;
     1117  r_8 xlow   = BinCenter(iLow);
     1118  r_8 ylow   = mData[iLow];
     1119
     1120  r_8 xlow1=xlow, ylow1=ylow;
    11071121  if(iLow+1<NBins()) {
    11081122    xlow1  = BinCenter(iLow+1);
    1109     ylow1  = data[iLow+1];
    1110   }
    1111 
    1112   float xhigh  = BinCenter(iHigh);
    1113   float yhigh  = data[iHigh];
    1114 
    1115   float xhigh1=xhigh, yhigh1=yhigh;
     1123    ylow1  = mData[iLow+1];
     1124  }
     1125
     1126  r_8 xhigh  = BinCenter(iHigh);
     1127  r_8 yhigh  = mData[iHigh];
     1128
     1129  r_8 xhigh1=xhigh, yhigh1=yhigh;
    11161130  if(iHigh-1>=0) {
    11171131    xhigh1 = BinCenter(iHigh-1);
    1118     yhigh1 = data[iHigh-1];
    1119   }
    1120 
    1121   float xlpred,xhpred,wd;
     1132    yhigh1 = mData[iHigh-1];
     1133  }
     1134
     1135  r_8 xlpred,xhpred,wd;
    11221136
    11231137  if(ylow1>ylow) {
     
    11481162  Cf suivant mais im est le bin du maximum de l'histo
    11491163*/
    1150 int Histo::EstimeMax(float& xm,int SzPav)
    1151 {
    1152 int im = IMax();
     1164int_4 Histo::EstimeMax(r_8& xm,int_4 SzPav)
     1165{
     1166int_4 im = IMax();
    11531167return EstimeMax(im,xm,SzPav);
    11541168}
     
    11661180  \endverbatim
    11671181*/
    1168 int Histo::EstimeMax(int& im,float& xm,int SzPav)
     1182int_4 Histo::EstimeMax(int& im,r_8& xm,int_4 SzPav)
    11691183{
    11701184xm = 0;
    11711185if( SzPav <= 0 ) return -1;
    1172 if( im < 0 || im >= bins ) return -1;
     1186if( im < 0 || im >= mBins ) return -1;
    11731187
    11741188if( SzPav%2 == 0 ) SzPav++;
    11751189SzPav = (SzPav-1)/2;
    11761190
    1177 int rc = 0;
    1178 double dxm = 0, wx = 0;
    1179 for(int i=im-SzPav;i<=im+SzPav;i++) {
    1180   if( i<0 || i>= bins ) {rc=1; continue;}
     1191int_4 rc = 0;
     1192r_8 dxm = 0, wx = 0;
     1193for(int_4 i=im-SzPav;i<=im+SzPav;i++) {
     1194  if( i<0 || i>= mBins ) {rc=1; continue;}
    11811195  dxm += BinCenter(i) * (*this)(i);
    11821196  wx  += (*this)(i);
     
    11981212  et a droite (widthD)
    11991213*/
    1200 void Histo::EstimeWidthS(float frac,float& widthG,float& widthD)
    1201 {
    1202 int i;
     1214void Histo::EstimeWidthS(r_8 frac,r_8& widthG,r_8& widthD)
     1215{
     1216int_4 i;
    12031217widthG = widthD = -1.;
    1204 if( bins<=1 || frac<=0. || frac>=1. ) return;
    1205 
    1206 int imax = 0;
    1207 float maxi = data[0];
    1208 for(i=1;i<bins;i++) if(data[i]>maxi) {imax=i; maxi=data[i];}
    1209 float xmax = BinCenter(imax);
    1210 float maxf = maxi * frac;
     1218if( mBins<=1 || frac<=0. || frac>=1. ) return;
     1219
     1220int_4 imax = 0;
     1221r_8 maxi = mData[0];
     1222for(i=1;i<mBins;i++) if(mData[i]>maxi) {imax=i; maxi=mData[i];}
     1223r_8 xmax = BinCenter(imax);
     1224r_8 maxf = maxi * frac;
    12111225
    12121226// recherche du sigma a gauche
    12131227widthG = 0.;
    1214 for(i=imax;i>=0;i--) if( data[i] <= maxf ) break;
     1228for(i=imax;i>=0;i--) if( mData[i] <= maxf ) break;
    12151229if(i<0) i=0;
    12161230if(i<imax) {
    1217   if( data[i+1] != data[i] ) {
     1231  if( mData[i+1] != mData[i] ) {
    12181232    widthG = BinCenter(i) + binWidth
    1219            * (maxf-data[i])/(data[i+1]-data[i]);
     1233           * (maxf-mData[i])/(mData[i+1]-mData[i]);
    12201234    widthG = xmax - widthG;
    12211235  } else widthG = xmax - BinCenter(i);
     
    12241238// recherche du sigma a droite
    12251239widthD = 0.;
    1226 for(i=imax;i<bins;i++) if( data[i] <= maxf ) break;
    1227 if(i>=bins) i=bins-1;
     1240for(i=imax;i<mBins;i++) if( mData[i] <= maxf ) break;
     1241if(i>=mBins) i=mBins-1;
    12281242if(i>imax) {
    1229   if( data[i] != data[i-1] ) {
     1243  if( mData[i] != mData[i-1] ) {
    12301244    widthD = BinCenter(i) - binWidth
    1231            * (maxf-data[i])/(data[i-1]-data[i]);
     1245           * (maxf-mData[i])/(mData[i-1]-mData[i]);
    12321246    widthD -= xmax;
    12331247  } else widthD = BinCenter(i) - xmax;
     
    12571271  \endverbatim
    12581272*/
    1259 int  Histo::Fit(GeneralFit& gfit,unsigned short typ_err)
     1273int_4  Histo::Fit(GeneralFit& gfit,unsigned short typ_err)
    12601274{
    12611275if(NBins()<=0) return -1000;
     
    12641278GeneralFitData mydata(1,NBins());
    12651279
    1266 for(int i=0;i<NBins();i++) {
    1267   double x = (double) BinCenter(i);
    1268   double f = (double) (*this)(i);
    1269   double saf = sqrt(fabs((double) f)); if(saf<1.) saf=1.;
    1270   double e=0.;
     1280for(int_4 i=0;i<NBins();i++) {
     1281  r_8 x = BinCenter(i);
     1282  r_8 f = (*this)(i);
     1283  r_8 saf = sqrt(fabs( f)); if(saf<1.) saf=1.;
     1284  r_8 e=0.;
    12711285  if(typ_err==0)      {if(HasErrors()) e=Error(i); else e=1.;}
    12721286  else if(typ_err==1) {if(HasErrors()) e=Error(i); else e=saf;}
     
    12951309TVector<r_8> par = gfit.GetParm();
    12961310Histo h(*this);
    1297 for(int i=0;i<NBins();i++) {
    1298   double x = (double) BinCenter(i);
    1299   h(i) -= (float) f->Value(&x,par.Data());
     1311for(int_4 i=0;i<NBins();i++) {
     1312  r_8 x = BinCenter(i);
     1313  h(i) -= f->Value(&x,par.Data());
    13001314}
    13011315return h;
     
    13141328TVector<r_8> par = gfit.GetParm();
    13151329Histo h(*this);
    1316 for(int i=0;i<NBins();i++) {
    1317   double x = (double) BinCenter(i);
    1318   h(i) = (float) f->Value(&x,par.Data());
     1330for(int_4 i=0;i<NBins();i++) {
     1331  r_8 x = BinCenter(i);
     1332  h(i) = f->Value(&x,par.Data());
    13191333}
    13201334return h;
     
    13341348          sinon : hmin hmax
    13351349      pflag < 0 : on imprime les informations (nbin,min,...) sans l'histogramme
    1336             = 0 : on imprime  "BinCenter(i) data[i]"  (note "... ...")
     1350            = 0 : on imprime  "BinCenter(i) mData[i]"  (note "... ...")
    13371351            bit 0 on : (v=1): numero_bin "... ..."
    13381352            bit 1 on : (v=2): "... ..." erreur
    13391353  \endverbatim
    13401354*/
    1341 void Histo::PrintF(FILE * fp, int hdyn,float hmin, float hmax,int pflag,
    1342               int il, int ih)
     1355void Histo::PrintF(FILE * fp, int_4 hdyn,r_8 hmin, r_8 hmax,int_4 pflag,
     1356              int_4 il, int_4 ih)
    13431357{
    13441358 
    1345  if( il > ih ) { il = 0; ih = bins-1; }
     1359 if( il > ih ) { il = 0; ih = mBins-1; }
    13461360 if( il < 0 ) il = 0;
    1347  if( ih >= bins ) ih = bins-1;
    1348 
    1349  double dhmin = (double) hmin;
    1350  double dhmax = (double) hmax;
    1351  double hb,hbmn,hbmx;
     1361 if( ih >= mBins ) ih = mBins-1;
     1362
     1363 r_8 dhmin = hmin;
     1364 r_8 dhmax = hmax;
     1365 r_8 hb,hbmn,hbmx;
    13521366
    13531367 if(hdyn==0) hdyn = 100;
     
    13551369 cout << "~Histo::Print  "
    13561370      << " nHist=" << nHist << "  nEntries=" << nEntries
    1357       << "  under=" << under << "  over=" << over << endl;
    1358  cout << "       bins=" << bins
    1359       << "  min=" << min << "  max=" << max
     1371      << "  mUnder=" << mUnder << "  mOver=" << mOver << endl;
     1372 cout << "       mBins=" << mBins
     1373      << "  min=" << mMin << "  mMax=" << mMax
    13601374      << "  binWidth=" << binWidth << endl;
    13611375 cout << "       mean=" << Mean() << " r.m.s=" << Sigma()
     
    13641378 if(hdyn<0 || pflag<0 ) return;
    13651379
    1366  if(dhmax<=dhmin) { if(hmin != 0.) dhmin = (double) VMin(); else dhmin=0.;
    1367                   dhmax = (double) VMax(); }
     1380 if(dhmax<=dhmin) { if(hmin != 0.) dhmin = VMin(); else dhmin=0.;
     1381                  dhmax = VMax(); }
    13681382 if(dhmin>dhmax) return;
    13691383 if(dhmin==dhmax) {dhmin -= 1.; dhmax += 1.;}
    1370  double wb = (dhmax-dhmin) / (double) hdyn;
     1384 r_8 wb = (dhmax-dhmin) / hdyn;
    13711385
    13721386 // determination de la position de la valeur zero
    1373  int i0 = (int)(-dhmin/wb);
     1387 int_4 i0 = (int_4)(-dhmin/wb);
    13741388
    13751389 // si le zero est dans la dynamique,
     
    13891403       dhmax -= hbmx;
    13901404     }
    1391      wb = (dhmax-dhmin) / (double) hdyn;
    1392      i0 = (int)(-dhmin/wb);
     1405     wb = (dhmax-dhmin) / hdyn;
     1406     i0 = (int_4)(-dhmin/wb);
    13931407   }
    13941408 }
     
    14011415
    14021416 // premiere ligne
    1403  {for(int i=0;i<hdyn;i++) s[i] = '=';}
     1417 {for(int_4 i=0;i<hdyn;i++) s[i] = '=';}
    14041418 if( 0 <= i0 && i0 < hdyn ) s[i0] = '0';
    14051419 if(pflag&1) fprintf( fp, "====");
    14061420 fprintf( fp, "======================");
    1407  if(pflag&2 && err2!=NULL) fprintf( fp, "===========");
     1421 if(pflag&2 && mErr2!=NULL) fprintf( fp, "===========");
    14081422 fprintf( fp, "==%s\n",s);
    14091423
    14101424 // histogramme
    1411  {for(int i=il;i<=ih;i++) {
    1412    for(int k=0;k<hdyn;k++) s[k] = ' ';
     1425 {for(int_4 i=il;i<=ih;i++) {
     1426   for(int_4 k=0;k<hdyn;k++) s[k] = ' ';
    14131427   hb = (*this)(i);
    14141428
    14151429   //choix du bin (hdyn bin entre [dhmin,dhmax[
    1416    int ii = (int)( (hb-dhmin)/wb );
     1430   int_4 ii = (int_4)( (hb-dhmin)/wb );
    14171431   if(ii<0) ii = 0; else if(ii>=hdyn) ii = hdyn-1;
    14181432
     
    14241438   if(i0<0) {
    14251439     // courbe entierement positive
    1426      for(int k=0;k<=ii;k++) s[k] = 'X';
     1440     for(int_4 k=0;k<=ii;k++) s[k] = 'X';
    14271441   } else if(i0>=hdyn) {
    14281442     // courbe entierement negative
    1429      for(int k=hdyn-1;k>=ii;k--) s[k] = 'X';
     1443     for(int_4 k=hdyn-1;k>=ii;k--) s[k] = 'X';
    14301444   } else {
    14311445     // courbe positive et negative
    14321446     s[i0] = '|';
    1433      if(ii>i0)        for(int k=i0+1;k<=ii;k++) s[k] = 'X';
    1434        else if(ii<i0) for(int k=ii;k<i0;k++)    s[k] = 'X';
     1447     if(ii>i0)        for(int_4 k=i0+1;k<=ii;k++) s[k] = 'X';
     1448       else if(ii<i0) for(int_4 k=ii;k<i0;k++)    s[k] = 'X';
    14351449          else s[ii] = 'X';
    14361450   }
    14371451
    14381452   // valeur a mettre dans le bin le plus haut/bas
    1439    int ib;
    1440    if(hb>0.) ib = (int)( 10.*(hb-hbmn)/(hbmx-hbmn) );
    1441      else if(hb<0.) ib = (int)( 10.*(hbmx-hb)/(hbmx-hbmn) );
     1453   int_4 ib;
     1454   if(hb>0.) ib = (int_4)( 10.*(hb-hbmn)/(hbmx-hbmn) );
     1455     else if(hb<0.) ib = (int_4)( 10.*(hbmx-hb)/(hbmx-hbmn) );
    14421456       else ib = -1;
    14431457   if(ib==-1) s[ii] = '|';
    14441458     else if(ib==0) s[ii] = '.';
    1445        else if(ib>0 && ib<10) s[ii] = (char)((int) '0' + ib);
     1459       else if(ib>0 && ib<10) s[ii] = (char)((int_4) '0' + ib);
    14461460
    14471461   // traitement des saturations +/-
     
    14511465   if(pflag&1) fprintf( fp, "%3d ",i);
    14521466   fprintf( fp, "%10.4g %10.4g ",BinCenter(i),hb);
    1453    if(pflag&2 && err2!=NULL) fprintf( fp, "%10.4g ",Error(i));
     1467   if(pflag&2 && mErr2!=NULL) fprintf( fp, "%10.4g ",Error(i));
    14541468   fprintf( fp, "= %s\n",s);
    14551469 }}
    14561470
    14571471 // derniere ligne
    1458  for(int i=0;i<hdyn;i++) s[i] = '=';
     1472 for(int_4 i=0;i<hdyn;i++) s[i] = '=';
    14591473 if( 0 <= i0 && i0 < hdyn ) s[i0] = '0';
    14601474 if(pflag&1) fprintf( fp, "====");
    14611475 fprintf( fp, "======================");
    1462  if(pflag&2 && err2!=NULL) fprintf( fp, "===========");
     1476 if(pflag&2 && mErr2!=NULL) fprintf( fp, "===========");
    14631477 fprintf( fp, "==%s\n",s);
    14641478
    14651479 // valeur basse des bins (sur ["ndig-1" digits + signe] =  ndig char (>=3))
    1466  const int ndig = 7;
     1480 const int_4 ndig = 7;
    14671481 char sn[2*ndig+10];
    14681482 hb = ( fabs(dhmin) > fabs(dhmax) ) ? fabs(dhmin) : fabs(dhmax);
    1469  int n;
    1470  if( hb > 0. ) n = (int)(log10(hb*1.00000001)); else n = 1;
    1471  double scaledig = pow(10.,(double) ndig-2);
    1472  double expo = scaledig/pow(10.,(double) n);
     1483 int_4 n;
     1484 if( hb > 0. ) n = (int_4)(log10(hb*1.00000001)); else n = 1;
     1485 r_8 scaledig = pow(10.,(r_8) ndig-2);
     1486 r_8 expo = scaledig/pow(10.,(r_8) n);
    14731487 // cout <<"n="<<n<<" hb="<<hb<<" scaledig="<<scaledig<<" expo="<<expo<<endl;
    1474  for(int k=0;k<ndig;k++) {
    1475    for(int i=0;i<hdyn;i++) s[i] = ' ';
    1476    {for(int i=0;i<hdyn;i++) {
    1477      n = (int)( (dhmin + i*wb)*expo );
    1478      for(int j=0;j<2*ndig+10;j++) sn[j] = ' ';
     1488 for(int_4 k=0;k<ndig;k++) {
     1489   for(int_4 i=0;i<hdyn;i++) s[i] = ' ';
     1490   {for(int_4 i=0;i<hdyn;i++) {
     1491     n = (int_4)( (dhmin + i*wb)*expo );
     1492     for(int_4 j=0;j<2*ndig+10;j++) sn[j] = ' ';
    14791493     sprintf(sn,"%d%c",n,'\0');
    14801494     strip(sn,'B',' ');
    14811495     // cout <<"n="<<n<<" sn=("<<sn<<")  l="<<strlen(sn)<<" k="<<k;
    1482      if( (int) strlen(sn) > k ) s[i] = sn[k];
     1496     if( (int_4) strlen(sn) > k ) s[i] = sn[k];
    14831497     // cout <<"  s=("<<s<<")"<<endl;
    14841498   }}
    14851499   if(pflag&1) fprintf( fp, "    ");
    14861500   fprintf( fp, "                      ");
    1487    if(pflag&2 && err2!=NULL) fprintf( fp, "           ");
     1501   if(pflag&2 && mErr2!=NULL) fprintf( fp, "           ");
    14881502   fprintf( fp, "  %s\n",s);
    14891503 }
     
    14971511  Impression de l'histogramme sur stdout
    14981512*/
    1499 void Histo::Print(int hdyn,float hmin, float hmax,int pflag,
    1500              int il, int ih)
     1513void Histo::Print(int_4 hdyn,r_8 hmin, r_8 hmax,int_4 pflag,
     1514             int_4 il, int_4 ih)
    15011515{
    15021516 Histo::PrintF(stdout, hdyn, hmin, hmax, pflag, il, ih);
     
    15231537
    15241538// Lecture des valeurs
    1525 is.Get(dobj->bins);
     1539is.Get(dobj->mBins);
    15261540is.Get(dobj->nEntries);
    15271541int_4 errok;
     
    15291543
    15301544is.Get(dobj->binWidth);
    1531 is.Get(dobj->min);
    1532 is.Get(dobj->max);
    1533 is.Get(dobj->under);
    1534 is.Get(dobj->over);
     1545is.Get(dobj->mMin);
     1546is.Get(dobj->mMax);
     1547is.Get(dobj->mUnder);
     1548is.Get(dobj->mOver);
    15351549
    15361550is.Get(dobj->nHist);
    15371551
    15381552// Lecture des donnees Histo 1D
    1539 dobj->data = new float[dobj->bins];
     1553dobj->mData = new r_8[dobj->mBins];
    15401554is.GetLine(strg, 255);
    1541 is.Get(dobj->data, dobj->bins);
     1555is.Get(dobj->mData, dobj->mBins);
    15421556
    15431557// Lecture des erreurs
    15441558if(errok) {
    15451559  is.GetLine(strg, 255);
    1546   dobj->err2 = new double[dobj->bins];
    1547   is.Get(dobj->err2, dobj->bins);
     1560  dobj->mErr2 = new r_8[dobj->mBins];
     1561  is.Get(dobj->mErr2, dobj->mBins);
    15481562}
    15491563
     
    15571571
    15581572// Que faut-il ecrire?
    1559 int_4 errok = (dobj->err2) ? 1 : 0;
     1573int_4 errok = (dobj->mErr2) ? 1 : 0;
    15601574
    15611575// Ecriture entete pour identifier facilement
    1562 sprintf(strg,"bins=%6d  NEnt=%15d  errok=%1d",dobj->bins,dobj->nEntries,errok);
     1576sprintf(strg,"mBins=%6d  NEnt=%15d  errok=%1d",dobj->mBins,dobj->nEntries,errok);
    15631577os.PutLine(strg);
    1564 sprintf(strg,"binw=%g  min=%g max=%g",dobj->binWidth,dobj->min,dobj->max);
     1578sprintf(strg,"binw=%g  mMin=%g mMax=%g",dobj->binWidth,dobj->mMin,dobj->mMax);
    15651579os.PutLine(strg);
    1566 sprintf(strg, "under=%g over=%g nHist=%g",dobj->under,dobj->over,dobj->nHist);
     1580sprintf(strg, "mUnder=%g mOver=%g nHist=%g",dobj->mUnder,dobj->mOver,dobj->nHist);
    15671581os.PutLine(strg);
    15681582
    15691583// Ecriture des valeurs
    1570 os.Put(dobj->bins);
     1584os.Put(dobj->mBins);
    15711585os.Put(dobj->nEntries);
    15721586os.Put(errok);
    15731587
    15741588os.Put(dobj->binWidth);
    1575 os.Put(dobj->min);
    1576 os.Put(dobj->max);
    1577 os.Put(dobj->under);
    1578 os.Put(dobj->over);
     1589os.Put(dobj->mMin);
     1590os.Put(dobj->mMax);
     1591os.Put(dobj->mUnder);
     1592os.Put(dobj->mOver);
    15791593
    15801594os.Put(dobj->nHist);
    15811595
    15821596// Ecriture des donnees Histo 1D
    1583 sprintf(strg,"Histo: Tableau des donnees %d",dobj->bins);
     1597sprintf(strg,"Histo: Tableau des donnees %d",dobj->mBins);
    15841598os.PutLine(strg);
    1585 os.Put(dobj->data, dobj->bins);
     1599os.Put(dobj->mData, dobj->mBins);
    15861600
    15871601// Ecriture des erreurs
    15881602if(errok) {
    1589   sprintf(strg,"Histo: Tableau des erreurs %d",dobj->bins);
     1603  sprintf(strg,"Histo: Tableau des erreurs %d",dobj->mBins);
    15901604  os.PutLine(strg);
    1591   os.Put(dobj->err2, dobj->bins);
     1605  os.Put(dobj->mErr2, dobj->mBins);
    15921606}
    15931607
  • trunk/SophyaLib/HiStats/histos.h

    r1089 r1092  
    11// This may look like C code, but it is really -*- C++ -*-
    22//
    3 // $Id: histos.h,v 1.10 2000-07-25 10:20:43 ansari Exp $
     3// $Id: histos.h,v 1.11 2000-07-26 13:15:15 ansari Exp $
    44//
    55
     
    2626  // CREATOR / DESTRUCTOR
    2727  Histo();
    28   Histo(float xMin, float xMax, int nBin=100);
     28  Histo(r_8 xMin, r_8 xMax, int_4 nBin=100);
     29  Histo(r_4 xMin, r_4 xMax, int_4 nBin=100);
    2930  Histo(const Histo& H);
    3031  virtual ~Histo();
     
    3536  // UPDATING or SETTING
    3637  void Zero();
    37   void Add(float x, float w = 1.);
    38   void AddBin(int numBin, float w = 1.);
    39   void SetBin(float x, float w = 1.);
    40   void SetBin(int numBin, float w = 1.);
    41   void SetErr2(float x, double e2);
    42   void SetErr2(int numBin, double e2);
    43   void SetErr(float x, float e);
    44   void SetErr(int numBin, float e);
     38  void Add(r_8 x, r_8 w = 1.);
     39  void AddBin(int_4 numBin, r_8 w = 1.);
     40  void SetBin(r_8 x, r_8 w = 1.);
     41  void SetBin(int_4 numBin, r_8 w = 1.);
     42  void SetErr2(r_8 x, r_8 e2);
     43  void SetErr2(int_4 numBin, r_8 e2);
     44  void SetErr(r_8 x, r_8 e);
     45  void SetErr(int_4 numBin, r_8 e);
    4546  virtual inline void UpdateHisto() const { return;}
    4647
    4748  // Operators
    4849  Histo& operator = (const Histo& h);
    49   Histo& operator *= (double b);
    50   Histo& operator /= (double b);
    51   Histo& operator += (double b);
    52   Histo& operator -= (double b);
     50  Histo& operator *= (r_8 b);
     51  Histo& operator /= (r_8 b);
     52  Histo& operator += (r_8 b);
     53  Histo& operator -= (r_8 b);
    5354  Histo& operator += (const Histo& a);
    5455  Histo& operator -= (const Histo& a);
     
    6162  void GetError2(TVector<r_8>& v);
    6263  void GetError(TVector<r_8>& v);
    63   void PutValue(TVector<r_8>& v, int ierr=0);
    64   void PutValueAdd(TVector<r_8> &v, int ierr=0);
     64  void PutValue(TVector<r_8>& v, int_4 ierr=0);
     65  void PutValueAdd(TVector<r_8> &v, int_4 ierr=0);
    6566  void PutError2(TVector<r_8>& v);
    6667  void PutError2Add(TVector<r_8>& v);
     
    6970  // INLINES
    7071  //! Retourne l'abscisse minimum
    71   inline float XMin() const {return min;}
     72  inline r_8 XMin() const {return mMin;}
    7273  //! Retourne l'abscisse maximum
    73   inline float XMax() const {return max;}
     74  inline r_8 XMax() const {return mMax;}
    7475  //! Retourne le nombre de bins
    75   inline int_4 NBins() const {return bins;}
     76  inline int_4 NBins() const {return mBins;}
    7677  //! Retourne la largeur du bin
    77   inline float BinWidth() const {return binWidth;}
     78  inline r_8 BinWidth() const {return binWidth;}
    7879  //! Retourne le pointeur sur le tableaux des contenus
    79   inline float* Bins() const {return data;}
     80  inline r_8* Bins() const {return mData;}
    8081  //! Retourne le contenu du bin i
    81   inline float operator()(int i) const  {return data[i];}
     82  inline r_8 operator()(int_4 i) const  {return mData[i];}
    8283  //! Remplit le contenu du bin i
    83   inline float& operator()(int i) {return data[i];}
     84  inline r_8& operator()(int_4 i) {return mData[i];}
    8485  //! retourne "true" si il y a des erreurs stoquees
    8586  inline bool HasErrors()
    86          {if(err2) return true; else return false;}
     87         {if(mErr2) return true; else return false;}
    8788  //! Retourne l'erreur du bin i
    88   inline float Error(int i) const
    89          {if(err2) {if(err2[i]>0.) return sqrt(err2[i]); else return 0.;}
     89  inline r_8 Error(int_4 i) const
     90         {if(mErr2) {if(mErr2[i]>0.) return sqrt(mErr2[i]); else return 0.;}
    9091                    else return 0.;}
    9192  //! Retourne l'erreur au carre du bin i
    92   inline double Error2(int i) const
    93          {if(err2) return err2[i]; else return 0.;}
     93  inline r_8 Error2(int_4 i) const
     94         {if(mErr2) return mErr2[i]; else return 0.;}
    9495  //! Remplit l'erreur au carre du bin i
    95   inline double& Error2(int i) {return err2[i];}
     96  inline r_8& Error2(int_4 i) {return mErr2[i];}
    9697  //! Retourne la somme ponderee
    97   inline float NData() const            {return (float) nHist;}
     98  inline r_8 NData() const            {return nHist;}
    9899  //! Retourne le nombre d'entrees
    99   inline float NEntries() const         {return nEntries;}
     100  inline r_8 NEntries() const         {return nEntries;}
    100101  //! Retourne le nombre d'overflow
    101   inline float NOver() const            {return over;}
     102  inline r_8 NOver() const            {return mOver;}
    102103  //! Retourne le nombre d'underflow
    103   inline float NUnder() const           {return under;}
     104  inline r_8 NUnder() const           {return mUnder;}
    104105
    105106  //! Retourne l'abscisse du bord inferieur du bin i
    106   inline float BinLowEdge(int i)  const {return min + i*binWidth;}
     107  inline r_8 BinLowEdge(int_4 i)  const {return mMin + i*binWidth;}
    107108  //! Retourne l'abscisse du centre du bin i
    108   inline float BinCenter(int i)   const {return min + (i+0.5)*binWidth;}
     109  inline r_8 BinCenter(int_4 i)   const {return mMin + (i+0.5)*binWidth;}
    109110  //! Retourne l'abscisse du bord superieur du bin i
    110   inline float BinHighEdge(int i) const {return min + (i+1)*binWidth;}
     111  inline r_8 BinHighEdge(int_4 i) const {return mMin + (i+1)*binWidth;}
    111112  //! Retourne le numero du bin contenant l'abscisse x
    112   inline int_4 FindBin(float x) const   
    113          {return (int_4) floorf((x - min) / binWidth);}
     113  inline int_4 FindBin(r_8 x) const   
     114         {return (int_4) floor((x - mMin) / binWidth);}
    114115
    115116  // Info, statistique et calculs sur les histogrammes
    116   int       BinNonNul() const;
    117   int       ErrNonNul() const;
    118   int       IMax() const;
    119   int       IMin() const;
    120   float     VMax() const;
    121   float     VMin() const;
    122   float     Mean() const;
    123   float     Sigma() const;
    124   float     MeanLH(int il,int ih) const;
    125   float     SigmaLH(int il,int ih) const;
    126   float     Mean(float x0, float dx) const;
    127   float     Sigma(float x0, float dx) const;
    128   float     CleanedMean() const;
    129   float     CleanedMean(float& sigma) const;
    130   int       BinPercent(float per) const;
    131   int       BinPercent(float x,float per,int& imin,int& imax);
    132   int       BinPercent(float x,float per,float& xmin,float& xmax);
    133   void      HInteg(float norm = 0.);
     117  int_4     BinNonNul() const;
     118  int_4     ErrNonNul() const;
     119  int_4     IMax() const;
     120  int_4     IMin() const;
     121  r_8       VMax() const;
     122  r_8       VMin() const;
     123  r_8       Mean() const;
     124  r_8       Sigma() const;
     125  r_8       MeanLH(int_4 il,int_4 ih) const;
     126  r_8       SigmaLH(int_4 il,int_4 ih) const;
     127  r_8       Mean(r_8 x0, r_8 dx) const;
     128  r_8       Sigma(r_8 x0, r_8 dx) const;
     129  r_8       CleanedMean() const;
     130  r_8       CleanedMean(r_8& sigma) const;
     131  int_4     BinPercent(r_8 per) const;
     132  int_4     BinPercent(r_8 x,r_8 per,int_4& imin,int_4& imax);
     133  int_4     BinPercent(r_8 x,r_8 per,r_8& xmin,r_8& xmax);
     134  void      HInteg(r_8 norm = 0.);
    134135  void      HDeriv();
    135   virtual void HRebin(int nbinew);
    136 
    137   int       MaxiLocal(float& maxi,int& imax,float& maxn,int& imaxn);
    138   float     FitMax(int degree=2, float frac=0.5f, int debug=0) const;
    139   float     FindWidth(float xmax,float frac=0.5f, int debug=0) const;
    140   float     FindWidth(float frac=0.5f, int debug=0) const;
    141   int       EstimeMax(float& xm,int SzPav = 3);
    142   int       EstimeMax(int& im,float& xm,int SzPav = 3);
    143   void      EstimeWidthS(float frac,float& widthG,float& widthD);
     136  virtual void HRebin(int_4 nbinew);
     137
     138  int_4     MaxiLocal(r_8& maxi,int_4& imax,r_8& maxn,int_4& imaxn);
     139  r_8       FitMax(int_4 degree=2, r_8 frac=0.5f, int_4 debug=0) const;
     140  r_8       FindWidth(r_8 xmax,r_8 frac=0.5f, int_4 debug=0) const;
     141  r_8       FindWidth(r_8 frac=0.5f, int_4 debug=0) const;
     142  int_4     EstimeMax(r_8& xm,int_4 SzPav = 3);
     143  int_4     EstimeMax(int_4& im,r_8& xm,int_4 SzPav = 3);
     144  void      EstimeWidthS(r_8 frac,r_8& widthG,r_8& widthD);
    144145
    145146  // Fit
    146   int    Fit(GeneralFit& gfit,unsigned short typ_err=0);
     147  int_4  Fit(GeneralFit& gfit,unsigned short typ_err=0);
    147148  Histo  FitResidus(GeneralFit& gfit);
    148149  Histo  FitFunction(GeneralFit& gfit);
    149150
    150151  // Print et Display ASCII
    151   void PrintF(FILE * fp, int dyn = 100, float hmin = 1., float hmax = -1.,
    152                       int pflag = 0, int il = 1, int ih = -1);
    153   void Print(int dyn = 100, float hmin = 1., float hmax = -1.,
    154                      int pflag = 0, int il = 1, int ih = -1);
     152  void PrintF(FILE * fp, int_4 dyn = 100, r_8 hmin = 1., r_8 hmax = -1.,
     153                      int_4 pflag = 0, int_4 il = 1, int_4 ih = -1);
     154  void Print(int_4 dyn = 100, r_8 hmin = 1., r_8 hmax = -1.,
     155                     int_4 pflag = 0, int_4 il = 1, int_4 ih = -1);
    155156
    156157protected:
    157158  void Delete();
    158159
    159   float*    data;     //!< donnees
    160   double*   err2;          //!< erreurs carrees
    161   float     under;    //!< underflow
    162   float     over;     //!< overflow
    163   double    nHist;    //!< somme ponderee des entrees
    164   int_4     nEntries; //!< nombre d'entrees
    165   int_4     bins;     //!< nombre de bins
    166   float     min;      //!< abscisse minimum
    167   float     max;      //!< abscisse maximum
    168   float     binWidth; //!< largeur du bin
     160  r_8*   mData;    //!< donnees
     161  r_8*   mErr2;    //!< erreurs carrees
     162  r_8    mUnder;   //!< underflow
     163  r_8    mOver;    //!< overflow
     164  r_8    nHist;    //!< somme ponderee des entrees
     165  int_4  nEntries; //!< nombre d'entrees
     166  int_4  mBins;    //!< nombre de bins
     167  r_8    mMin;     //!< abscisse minimum
     168  r_8    mMax;     //!< abscisse maximum
     169  r_8    binWidth; //!< largeur du bin
    169170};
    170171
     
    182183// ObjFileIO<Histo>
    183184
    184 /*! \ingroup HiStats \fn operator*(const Histo&,double)
     185/*! \ingroup HiStats \fn operator*(const Histo&,r_8)
    185186  \brief Operateur H2 = H1 * b */
    186 inline Histo operator * (const Histo& a, double b)
     187inline Histo operator * (const Histo& a, r_8 b)
    187188{
    188189  Histo result(a);
     
    190191}
    191192
    192 /*! \ingroup HiStats \fn operator*(double,const Histo&)
     193/*! \ingroup HiStats \fn operator*(r_8,const Histo&)
    193194  \brief Operateur H2 = b * H1 */
    194 inline Histo operator * (double b, const Histo& a)
     195inline Histo operator * (r_8 b, const Histo& a)
    195196{
    196197  Histo result(a);
     
    198199}
    199200
    200 /*! \ingroup HiStats \fn operator/(const Histo&,double)
     201/*! \ingroup HiStats \fn operator/(const Histo&,r_8)
    201202  \brief Operateur H2 = H1 / b */
    202 inline Histo operator / (const Histo& a, double b)
     203inline Histo operator / (const Histo& a, r_8 b)
    203204{
    204205  Histo result(a);
     
    206207}
    207208
    208 /*! \ingroup HiStats \fn operator+(const Histo&,double)
     209/*! \ingroup HiStats \fn operator+(const Histo&,r_8)
    209210  \brief Operateur H2 = H1 + b */
    210 inline Histo operator + (const Histo& a, double b)
     211inline Histo operator + (const Histo& a, r_8 b)
    211212{
    212213  Histo result(a);
     
    214215}
    215216
    216 /*! \ingroup HiStats \fn operator+(double,const Histo&)
     217/*! \ingroup HiStats \fn operator+(r_8,const Histo&)
    217218  \brief Operateur H2 = b + H1 */
    218 inline Histo operator + (double b, const Histo& a)
     219inline Histo operator + (r_8 b, const Histo& a)
    219220{
    220221  Histo result(a);
     
    222223}
    223224
    224 /*! \ingroup HiStats \fn operator-(const Histo&,double)
     225/*! \ingroup HiStats \fn operator-(const Histo&,r_8)
    225226  \brief Operateur H2 = H1 - b */
    226 inline Histo operator - (const Histo& a, double b)
     227inline Histo operator - (const Histo& a, r_8 b)
    227228{
    228229  Histo result(a);
     
    230231}
    231232
    232 /*! \ingroup HiStats \fn operator-(double,const Histo&)
     233/*! \ingroup HiStats \fn operator-(r_8,const Histo&)
    233234  \brief Operateur H2 = b - H1 */
    234 inline Histo operator - (double b, const Histo& a)
     235inline Histo operator - (r_8 b, const Histo& a)
    235236{
    236237  Histo result(a);
  • trunk/SophyaLib/HiStats/histos2.cc

    r1064 r1092  
    4343  entre xMin,xMax et yMin,yMax.
    4444*/
    45 Histo2D::Histo2D(float xMin, float xMax, int nxBin
    46                 ,float yMin, float yMax, int nyBin)
    47       : data(new float[nxBin*nyBin]), err2(NULL)
     45Histo2D::Histo2D(r_8 xMin,r_8 xMax,int_4 nxBin,r_8 yMin,r_8 yMax,int_4 nyBin)
     46      : mData(new r_8[nxBin*nyBin]), mErr2(NULL)
    4847      , nHist(0), nEntries(0)
    49       , nx(nxBin), ny(nyBin), nxy(nxBin*nyBin)
    50       , xmin(xMin), xmax(xMax), ymin(yMin), ymax(yMax)
    51       , wbinx((xMax - xMin)/nxBin), wbiny((yMax - yMin)/nyBin)
    52       , hprojx(NULL), hprojy(NULL)
     48      , mNx(nxBin), mNy(nyBin), mNxy(nxBin*nyBin)
     49      , mXmin(xMin), mXmax(xMax), mYmin(yMin), mYmax(yMax)
     50      , mWBinx((xMax - xMin)/nxBin), mWBiny((yMax - yMin)/nyBin)
     51      , mHprojx(NULL), mHprojy(NULL)
    5352{
    5453ASSERT(nxBin>0 && nyBin>0 && xMin<xMax && yMin<yMax);
    55 for(int i=0;i<3;i++) for(int j=0;j<3;j++) over[i][j]=0.;
     54for(int_4 i=0;i<3;i++) for(int_4 j=0;j<3;j++) mOver[i][j]=0.;
    5655Zero();
    57 b_s.H = NULL;
     56mB_s.H = NULL;
    5857END_CONSTRUCTOR
    5958}
    6059
    6160/*!
     61  Createur d'un histogramme 2D ayant nxBin,nyBin bins
     62  entre xMin,xMax et yMin,yMax.
     63*/
     64Histo2D::Histo2D(r_4 xMin,r_4 xMax,int_4 nxBin,r_4 yMin,r_4 yMax,int_4 nyBin)
     65      : mData(new r_8[nxBin*nyBin]), mErr2(NULL)
     66      , nHist(0), nEntries(0)
     67      , mNx(nxBin), mNy(nyBin), mNxy(nxBin*nyBin)
     68      , mXmin((r_8)xMin), mXmax((r_8)xMax), mYmin((r_8)yMin), mYmax((r_8)yMax)
     69      , mWBinx((xMax - xMin)/nxBin), mWBiny((yMax - yMin)/nyBin)
     70      , mHprojx(NULL), mHprojy(NULL)
     71{
     72ASSERT(nxBin>0 && nyBin>0 && xMin<xMax && yMin<yMax);
     73for(int_4 i=0;i<3;i++) for(int_4 j=0;j<3;j++) mOver[i][j]=0.;
     74Zero();
     75mB_s.H = NULL;
     76END_CONSTRUCTOR
     77}
     78
     79/*!
    6280  Constructeur par copie.
    6381*/
    6482Histo2D::Histo2D(const Histo2D& h)
    6583{
    66 int i,j;
    67 data = new float[h.nxy];
    68 memcpy(data, h.data, h.nxy*sizeof(float));
    69 
    70 err2 = NULL;
    71 if(h.err2) {
    72   err2 = new double[h.nxy];
    73   memcpy(err2, h.err2, h.nxy*sizeof(double));
     84int_4 i,j;
     85mData = new r_8[h.mNxy];
     86memcpy(mData, h.mData, h.mNxy*sizeof(r_8));
     87
     88mErr2 = NULL;
     89if(h.mErr2) {
     90  mErr2 = new r_8[h.mNxy];
     91  memcpy(mErr2, h.mErr2, h.mNxy*sizeof(r_8));
    7492}
    7593
    7694nHist = h.nHist; nEntries = h.nEntries;
    77 for(i=0;i<3;i++) for(j=0;j<3;j++) over[i][j]=h.over[i][j];
    78 nx = h.nx;  ny = h.ny;  nxy = h.nxy;
    79 xmin = h.xmin; xmax = h.xmax; ymin = h.ymin; ymax = h.ymax;
    80 wbinx = h.wbinx; wbiny = h.wbiny;
    81 b_s.H = NULL;
    82 
    83 hprojx = hprojy = NULL;
    84 if(h.hprojx) {
     95for(i=0;i<3;i++) for(j=0;j<3;j++) mOver[i][j]=h.mOver[i][j];
     96mNx = h.mNx;  mNy = h.mNy;  mNxy = h.mNxy;
     97mXmin = h.mXmin; mXmax = h.mXmax; mYmin = h.mYmin; mYmax = h.mYmax;
     98mWBinx = h.mWBinx; mWBiny = h.mWBiny;
     99mB_s.H = NULL;
     100
     101mHprojx = mHprojy = NULL;
     102if(h.mHprojx) {
    85103  SetProjX();
    86   *hprojx = *(h.hprojx);
    87 }
    88 if(h.hprojy) {
     104  *mHprojx = *(h.mHprojx);
     105}
     106if(h.mHprojy) {
    89107  SetProjY();
    90   *hprojy = *(h.hprojy);
    91 }
    92 
    93 int nb;
    94 float min,max;
     108  *mHprojy = *(h.mHprojy);
     109}
     110
     111int_4 nb;
     112r_8 min,max;
    95113nb = h.NSliX();
    96114if(nb>0) {
     
    130148*/
    131149Histo2D::Histo2D()
    132       : data(NULL), err2(NULL)
     150      : mData(NULL), mErr2(NULL)
    133151      , nHist(0), nEntries(0)
    134       , nx(0), ny(0), nxy(0)
    135       , xmin(0), xmax(0), ymin(0), ymax(0)
    136       , wbinx(0), wbiny(0)
    137       , hprojx(NULL), hprojy(NULL)
    138 {
    139 for(int i=0;i<3;i++) for(int j=0;j<3;j++) over[i][j]=0.;
    140 b_s.H = NULL;
     152      , mNx(0), mNy(0), mNxy(0)
     153      , mXmin(0), mXmax(0), mYmin(0), mYmax(0)
     154      , mWBinx(0), mWBiny(0)
     155      , mHprojx(NULL), mHprojy(NULL)
     156{
     157for(int_4 i=0;i<3;i++) for(int_4 j=0;j<3;j++) mOver[i][j]=0.;
     158mB_s.H = NULL;
    141159END_CONSTRUCTOR
    142160}
     
    148166void Histo2D::Delete()
    149167{
    150   if( data != NULL ) { delete[] data; data = NULL;}
    151 
    152   if( err2 != NULL ) { delete[] err2; err2 = NULL;}
     168  if( mData != NULL ) { delete[] mData; mData = NULL;}
     169
     170  if( mErr2 != NULL ) { delete[] mErr2; mErr2 = NULL;}
    153171
    154172  DelProj();
     
    162180  nHist = 0;
    163181  nEntries = 0;
    164   nx = 0; ny = 0; nxy = 0;
    165   xmin = 0; xmax = 0; ymin = 0; ymax = 0;
    166   wbinx = 0; wbiny = 0;
    167   for(int i=0;i<3;i++) for(int j=0;j<3;j++) over[i][j]=0.;
    168   b_s.H = NULL;
     182  mNx = 0; mNy = 0; mNxy = 0;
     183  mXmin = 0; mXmax = 0; mYmin = 0; mYmax = 0;
     184  mWBinx = 0; mWBiny = 0;
     185  for(int_4 i=0;i<3;i++) for(int_4 j=0;j<3;j++) mOver[i][j]=0.;
     186  mB_s.H = NULL;
    169187}
    170188
     
    184202{
    185203  nHist = nEntries = 0;
    186   for(int i=0;i<3;i++) for(int j=0;j<3;j++) over[i][j]=0.;
    187   memset(data, 0, nxy*sizeof(float));
    188   memset(over, 0, 9*sizeof(float));
    189 
    190   if( err2 != NULL ) memset(err2, 0, nxy*sizeof(double));
     204  for(int_4 i=0;i<3;i++) for(int_4 j=0;j<3;j++) mOver[i][j]=0.;
     205  memset(mData, 0, mNxy*sizeof(r_8));
     206  memset(mOver, 0, 9*sizeof(r_8));
     207
     208  if( mErr2 != NULL ) memset(mErr2, 0, mNxy*sizeof(r_8));
    191209
    192210  ZeroProj();
     
    205223void Histo2D::Errors()
    206224{
    207  if( nxy > 0 ) {
    208    if(err2==NULL) err2 = new double[nxy];
    209    memset(err2, 0, nxy*sizeof(double));
     225 if( mNxy > 0 ) {
     226   if(mErr2==NULL) mErr2 = new r_8[mNxy];
     227   memset(mErr2, 0, mNxy*sizeof(r_8));
    210228 }
    211229}
     
    217235Histo2D& Histo2D::operator = (const Histo2D& h)
    218236{
    219   int i,j,nb;
    220   float min,max;
     237  int_4 i,j,nb;
     238  r_8 min,max;
    221239
    222240  if(this == &h) return *this;
    223   if( h.nxy > nxy ) Delete();
    224   if(!data) data = new float[h.nxy];
    225   if( !h.err2 && err2 ) { delete [] err2; err2=NULL;}
    226   if( h.err2 && !err2 ) err2 = new double[h.nxy];
    227 
    228   for(i=0;i<3;i++) for(j=0;j<3;j++) over[i][j] = h.over[i][j];
     241  if( h.mNxy > mNxy ) Delete();
     242  if(!mData) mData = new r_8[h.mNxy];
     243  if( !h.mErr2 && mErr2 ) { delete [] mErr2; mErr2=NULL;}
     244  if( h.mErr2 && !mErr2 ) mErr2 = new r_8[h.mNxy];
     245
     246  for(i=0;i<3;i++) for(j=0;j<3;j++) mOver[i][j] = h.mOver[i][j];
    229247  nHist = h.nHist;
    230248  nEntries = h.nEntries;
    231   nx = h.nx;  ny = h.ny;  nxy = h.nxy;
    232   xmin = h.xmin; xmax = h.xmax; wbinx = h.wbinx;
    233   ymin = h.ymin; ymax = h.ymax; wbiny = h.wbiny;
     249  mNx = h.mNx;  mNy = h.mNy;  mNxy = h.mNxy;
     250  mXmin = h.mXmin; mXmax = h.mXmax; mWBinx = h.mWBinx;
     251  mYmin = h.mYmin; mYmax = h.mYmax; mWBiny = h.mWBiny;
    234252 
    235   memcpy(data, h.data, nxy*sizeof(float));
    236   if(err2) memcpy(err2, h.err2, nxy*sizeof(double));
     253  memcpy(mData, h.mData, mNxy*sizeof(r_8));
     254  if(mErr2) memcpy(mErr2, h.mErr2, mNxy*sizeof(r_8));
    237255
    238256  DelProjX();
    239   if(h.hprojx) {
     257  if(h.mHprojx) {
    240258    SetProjX();
    241     *hprojx = *(h.hprojx);
     259    *mHprojx = *(h.mHprojx);
    242260  }
    243261  DelProjY();
    244   if(h.hprojy) {
     262  if(h.mHprojy) {
    245263    SetProjY();
    246     *hprojy = *(h.hprojy);
     264    *mHprojy = *(h.mHprojy);
    247265  }
    248266
     
    288306  Operateur H *= b
    289307*/
    290 Histo2D& Histo2D::operator *= (double b)
    291 {
    292 int i,j;
    293 double b2 = b*b;
    294 for(i=0;i<nxy;i++) {
    295   data[i] *= b;
    296   if(err2) err2[i] *= b2;
    297 }
    298 for(i=0;i<3;i++) for(j=0;j<3;j++) over[i][j] *= b;
     308Histo2D& Histo2D::operator *= (r_8 b)
     309{
     310int_4 i,j;
     311r_8 b2 = b*b;
     312for(i=0;i<mNxy;i++) {
     313  mData[i] *= b;
     314  if(mErr2) mErr2[i] *= b2;
     315}
     316for(i=0;i<3;i++) for(j=0;j<3;j++) mOver[i][j] *= b;
    299317nHist *= b;
    300318
    301 if(hprojx) *hprojx *= b;
    302 if(hprojy) *hprojy *= b;
     319if(mHprojx) *mHprojx *= b;
     320if(mHprojy) *mHprojy *= b;
    303321if(NSliX()>0) for(i=0; i<NSliX();i++) *HSliX(i) *= b;
    304322if(NSliY()>0) for(i=0; i<NSliY();i++) *HSliY(i) *= b;
     
    312330  Operateur H /= b
    313331*/
    314 Histo2D& Histo2D::operator /= (double b)
    315 {
    316 int i,j;
     332Histo2D& Histo2D::operator /= (r_8 b)
     333{
     334int_4 i,j;
    317335if (b==0.) THROW(inconsistentErr);
    318 double b2 = b*b;
    319 for(i=0;i<nxy;i++) {
    320   data[i] /= b;
    321   if(err2) err2[i] /= b2;
    322 }
    323 for(i=0;i<3;i++) for(j=0;j<3;j++) over[i][j] /= b;
     336r_8 b2 = b*b;
     337for(i=0;i<mNxy;i++) {
     338  mData[i] /= b;
     339  if(mErr2) mErr2[i] /= b2;
     340}
     341for(i=0;i<3;i++) for(j=0;j<3;j++) mOver[i][j] /= b;
    324342nHist /= b;
    325343
    326 if(hprojx) *hprojx /= b;
    327 if(hprojy) *hprojy /= b;
     344if(mHprojx) *mHprojx /= b;
     345if(mHprojy) *mHprojy /= b;
    328346if(NSliX()>0) for(i=0; i<NSliX();i++) *HSliX(i) /= b;
    329347if(NSliY()>0) for(i=0; i<NSliY();i++) *HSliY(i) /= b;
     
    337355  Operateur H += b
    338356*/
    339 Histo2D& Histo2D::operator += (double b)
    340 {
    341 int i,j;
    342 float min,max;
    343 for(i=0;i<nxy;i++) data[i] += b;
    344 for(i=0;i<3;i++) for(j=0;j<3;j++) over[i][j] += b;
    345 nHist += nxy*b;
    346 
    347 if(hprojx) *hprojx += b*ny;
    348 if(hprojy) *hprojy += b*nx;
    349 if(NSliX()>0) for(i=0; i<NSliX();i++) *HSliX(i) += b*ny/NSliX();
    350 if(NSliY()>0) for(i=0; i<NSliY();i++) *HSliY(i) += b*nx/NSliY();
     357Histo2D& Histo2D::operator += (r_8 b)
     358{
     359int_4 i,j;
     360r_8 min,max;
     361for(i=0;i<mNxy;i++) mData[i] += b;
     362for(i=0;i<3;i++) for(j=0;j<3;j++) mOver[i][j] += b;
     363nHist += mNxy*b;
     364
     365if(mHprojx) *mHprojx += b*mNy;
     366if(mHprojy) *mHprojy += b*mNx;
     367if(NSliX()>0) for(i=0; i<NSliX();i++) *HSliX(i) += b*mNy/NSliX();
     368if(NSliY()>0) for(i=0; i<NSliY();i++) *HSliY(i) += b*mNx/NSliY();
    351369if(NBandX()>0) for(i=0; i<NBandX();i++) {
    352370  GetBandX(i,min,max);
    353   *HBandX(i) += b*(max-min)/(ymax-ymin)*ny;
     371  *HBandX(i) += b*(max-min)/(mYmax-mYmin)*mNy;
    354372}
    355373if(NBandY()>0) for(i=0; i<NBandY();i++) {
    356374  GetBandY(i,min,max);
    357   *HBandY(i) += b*(max-min)/(xmax-xmin)*nx;
     375  *HBandY(i) += b*(max-min)/(mXmax-mXmin)*mNx;
    358376}
    359377
     
    364382  Operateur H -= b
    365383*/
    366 Histo2D& Histo2D::operator -= (double b)
    367 {
    368 int i,j;
    369 float min,max;
    370 for(i=0;i<nxy;i++) data[i] -= b;
    371 for(i=0;i<3;i++) for(j=0;j<3;j++) over[i][j] -= b;
    372 nHist -= nxy*b;
    373 
    374 if(hprojx) *hprojx -= b*ny;
    375 if(hprojy) *hprojy -= b*nx;
    376 if(NSliX()>0) for(i=0; i<NSliX();i++) *HSliX(i) -= b*ny/NSliX();
    377 if(NSliY()>0) for(i=0; i<NSliY();i++) *HSliY(i) -= b*nx/NSliY();
     384Histo2D& Histo2D::operator -= (r_8 b)
     385{
     386int_4 i,j;
     387r_8 min,max;
     388for(i=0;i<mNxy;i++) mData[i] -= b;
     389for(i=0;i<3;i++) for(j=0;j<3;j++) mOver[i][j] -= b;
     390nHist -= mNxy*b;
     391
     392if(mHprojx) *mHprojx -= b*mNy;
     393if(mHprojy) *mHprojy -= b*mNx;
     394if(NSliX()>0) for(i=0; i<NSliX();i++) *HSliX(i) -= b*mNy/NSliX();
     395if(NSliY()>0) for(i=0; i<NSliY();i++) *HSliY(i) -= b*mNx/NSliY();
    378396if(NBandX()>0) for(i=0; i<NBandX();i++) {
    379397  GetBandX(i,min,max);
    380   *HBandX(i) -= b*(max-min)/(ymax-ymin)*ny;
     398  *HBandX(i) -= b*(max-min)/(mYmax-mYmin)*mNy;
    381399}
    382400if(NBandY()>0) for(i=0; i<NBandY();i++) {
    383401  GetBandY(i,min,max);
    384   *HBandY(i) -= b*(max-min)/(xmax-xmin)*nx;
     402  *HBandY(i) -= b*(max-min)/(mXmax-mXmin)*mNx;
    385403}
    386404
     
    394412Histo2D& Histo2D::operator += (const Histo2D& a)
    395413{
    396 int i,j;
    397 if(nx!=a.nx || ny!=a.ny) THROW(sizeMismatchErr);
    398 for(i=0;i<nxy;i++) {
    399   data[i] += a.data[i];
    400   if(err2 && a.err2) err2[i] += a.err2[i];
    401 }
    402 for(i=0;i<3;i++) for(j=0;j<3;j++) over[i][j] += a.over[i][j];
     414int_4 i,j;
     415if(mNx!=a.mNx || mNy!=a.mNy) THROW(sizeMismatchErr);
     416for(i=0;i<mNxy;i++) {
     417  mData[i] += a.mData[i];
     418  if(mErr2 && a.mErr2) mErr2[i] += a.mErr2[i];
     419}
     420for(i=0;i<3;i++) for(j=0;j<3;j++) mOver[i][j] += a.mOver[i][j];
    403421nHist += a.nHist;
    404422nEntries += a.nEntries;
    405423
    406 if(hprojx && a.hprojx) *hprojx += *(a.hprojx);
    407 if(hprojy && a.hprojy) *hprojy += *(a.hprojy);
     424if(mHprojx && a.mHprojx) *mHprojx += *(a.mHprojx);
     425if(mHprojy && a.mHprojy) *mHprojy += *(a.mHprojy);
    408426ZeroSliX();  ZeroSliY();
    409427ZeroBandX(); ZeroBandY();
     
    417435Histo2D& Histo2D::operator -= (const Histo2D& a)
    418436{
    419 int i,j;
    420 if(nx!=a.nx || ny!=a.ny) THROW(sizeMismatchErr);
    421 for(i=0;i<nxy;i++) {
    422   data[i] -= a.data[i];
    423   if(err2 && a.err2) err2[i] += a.err2[i];
    424 }
    425 for(i=0;i<3;i++) for(j=0;j<3;j++) over[i][j] += a.over[i][j];
     437int_4 i,j;
     438if(mNx!=a.mNx || mNy!=a.mNy) THROW(sizeMismatchErr);
     439for(i=0;i<mNxy;i++) {
     440  mData[i] -= a.mData[i];
     441  if(mErr2 && a.mErr2) mErr2[i] += a.mErr2[i];
     442}
     443for(i=0;i<3;i++) for(j=0;j<3;j++) mOver[i][j] += a.mOver[i][j];
    426444nHist -= a.nHist;
    427445nEntries += a.nEntries;
    428446
    429 if(hprojx && a.hprojx) *hprojx -= *(a.hprojx);
    430 if(hprojy && a.hprojy) *hprojy -= *(a.hprojy);
     447if(mHprojx && a.mHprojx) *mHprojx -= *(a.mHprojx);
     448if(mHprojy && a.mHprojy) *mHprojy -= *(a.mHprojy);
    431449ZeroSliX();  ZeroSliY();
    432450ZeroBandX(); ZeroBandY();
     
    440458Histo2D& Histo2D::operator *= (const Histo2D& a)
    441459{
    442 int i,j;
    443 if(nx!=a.nx || ny!=a.ny) THROW(sizeMismatchErr);
     460int_4 i,j;
     461if(mNx!=a.mNx || mNy!=a.mNy) THROW(sizeMismatchErr);
    444462nHist = 0.;
    445 for(i=0;i<nxy;i++) {
    446   if(err2 && a.err2)
    447       err2[i] = a.data[i]*a.data[i]*err2[i] + data[i]*data[i]*a.err2[i];
    448   data[i] *= a.data[i];
    449   nHist += data[i];
    450 }
    451 for(i=0;i<3;i++) for(j=0;j<3;j++) over[i][j] *= a.over[i][j];
     463for(i=0;i<mNxy;i++) {
     464  if(mErr2 && a.mErr2)
     465      mErr2[i] = a.mData[i]*a.mData[i]*mErr2[i] + mData[i]*mData[i]*a.mErr2[i];
     466  mData[i] *= a.mData[i];
     467  nHist += mData[i];
     468}
     469for(i=0;i<3;i++) for(j=0;j<3;j++) mOver[i][j] *= a.mOver[i][j];
    452470nEntries += a.nEntries;
    453471
    454 if(hprojx && a.hprojx) *hprojx *= *(a.hprojx);
    455 if(hprojy && a.hprojy) *hprojy *= *(a.hprojy);
     472if(mHprojx && a.mHprojx) *mHprojx *= *(a.mHprojx);
     473if(mHprojy && a.mHprojy) *mHprojy *= *(a.mHprojy);
    456474ZeroSliX();  ZeroSliY();
    457475ZeroBandX(); ZeroBandY();
     
    465483Histo2D& Histo2D::operator /= (const Histo2D& a)
    466484{
    467 int i,j;
    468 if(nx!=a.nx || ny!=a.ny) THROW(sizeMismatchErr);
     485int_4 i,j;
     486if(mNx!=a.mNx || mNy!=a.mNy) THROW(sizeMismatchErr);
    469487nHist = 0.;
    470 for(i=0;i<nxy;i++) {
    471   if(a.data[i]==0.) {
    472     data[i]=0.;
    473     if(err2) err2[i]=0.;
     488for(i=0;i<mNxy;i++) {
     489  if(a.mData[i]==0.) {
     490    mData[i]=0.;
     491    if(mErr2) mErr2[i]=0.;
    474492    continue;
    475493  }
    476   if(err2 && a.err2)
    477       err2[i] = (err2[i] + data[i]/a.data[i]*data[i]/a.data[i]*a.err2[i])
    478                 /(a.data[i]*a.data[i]);
    479   data[i] /= a.data[i];
    480   nHist += data[i];
     494  if(mErr2 && a.mErr2)
     495      mErr2[i] = (mErr2[i] + mData[i]/a.mData[i]*mData[i]/a.mData[i]*a.mErr2[i])
     496                /(a.mData[i]*a.mData[i]);
     497  mData[i] /= a.mData[i];
     498  nHist += mData[i];
    481499}
    482500for(i=0;i<3;i++) for(j=0;j<3;j++)
    483   if(a.over[i][j]!=0.) over[i][j] *= a.over[i][j]; else over[i][j] = 0.;
     501  if(a.mOver[i][j]!=0.) mOver[i][j] *= a.mOver[i][j]; else mOver[i][j] = 0.;
    484502nEntries += a.nEntries;
    485503
    486 if(hprojx && a.hprojx) *hprojx /= *(a.hprojx);
    487 if(hprojy && a.hprojy) *hprojy /= *(a.hprojy);
     504if(mHprojx && a.mHprojx) *mHprojx /= *(a.mHprojx);
     505if(mHprojy && a.mHprojy) *mHprojy /= *(a.mHprojy);
    488506ZeroSliX();  ZeroSliY();
    489507ZeroBandX(); ZeroBandY();
     
    498516void Histo2D::GetXCoor(TVector<r_8> &v)
    499517{
    500 float x,y;
    501 v.Realloc(nx);
    502 for(int i=0;i<nx;i++) {BinLowEdge(i,0,x,y); v(i) = x;}
     518r_8 x,y;
     519v.Realloc(mNx);
     520for(int_4 i=0;i<mNx;i++) {BinLowEdge(i,0,x,y); v(i) = x;}
    503521return;
    504522}
     
    509527void Histo2D::GetYCoor(TVector<r_8> &v)
    510528{
    511 float x,y;
    512 v.Realloc(ny);
    513 for(int i=0;i<ny;i++) {BinLowEdge(0,i,x,y); v(i) = y;}
     529r_8 x,y;
     530v.Realloc(mNy);
     531for(int_4 i=0;i<mNy;i++) {BinLowEdge(0,i,x,y); v(i) = y;}
    514532return;
    515533}
     
    520538void Histo2D::GetValue(TMatrix<r_8> &v)
    521539{
    522 v.Realloc(nx,ny);
    523 for(int i=0;i<nx;i++)
    524   for(int j=0;j<ny;j++) v(i,j) = (*this)(i,j);
     540v.Realloc(mNx,mNy);
     541for(int_4 i=0;i<mNx;i++)
     542  for(int_4 j=0;j<mNy;j++) v(i,j) = (*this)(i,j);
    525543return;
    526544}
     
    531549void Histo2D::GetError2(TMatrix<r_8> &v)
    532550{
    533 int i,j;
    534 v.Realloc(nx,ny);
    535 if(!err2)
    536   {for(i=0;i<nx;i++) for(j=0;j<ny;j++) v(i,j) = 0.; return;}
    537 for(i=0;i<nx;i++) for(j=0;j<ny;j++) v(i,j) = Error2(i,j);
     551int_4 i,j;
     552v.Realloc(mNx,mNy);
     553if(!mErr2)
     554  {for(i=0;i<mNx;i++) for(j=0;j<mNy;j++) v(i,j) = 0.; return;}
     555for(i=0;i<mNx;i++) for(j=0;j<mNy;j++) v(i,j) = Error2(i,j);
    538556return;
    539557}
     
    544562void Histo2D::GetError(TMatrix<r_8> &v)
    545563{
    546 int i,j;
    547 v.Realloc(nx,ny);
    548 if(!err2)
    549   {for(i=0;i<nx;i++) for(j=0;j<ny;j++) v(i,j) = 0.; return;}
    550 for(i=0;i<nx;i++) for(j=0;j<ny;j++) v(i,j) = Error(i,j);
     564int_4 i,j;
     565v.Realloc(mNx,mNy);
     566if(!mErr2)
     567  {for(i=0;i<mNx;i++) for(j=0;j<mNy;j++) v(i,j) = 0.; return;}
     568for(i=0;i<mNx;i++) for(j=0;j<mNy;j++) v(i,j) = Error(i,j);
    551569return;
    552570}
     
    556574  Remplissage du contenu de l'histo avec les valeurs d'un tableau.
    557575*/
    558 void Histo2D::PutValue(TMatrix<r_8> &v, int ierr)
    559 {
    560 int i,j;
    561 //if(v.NRows()!=(uint_4)nx || v.NCol()!=(uint_4)ny) THROW(sizeMismatchErr);
    562 uint_4 nnx = (v.NRows()<(uint_4)nx)? v.NRows(): (uint_4)nx;
    563 uint_4 nny = (v.NCol() <(uint_4)ny)? v.NCol() : (uint_4)ny;
    564 if(nnx>0 && nny>0) for(i=0;i<nnx;i++) for(j=0;j<nny;j++) {
     576void Histo2D::PutValue(TMatrix<r_8> &v, int_4 ierr)
     577{
     578//if(v.NRows()!=(uint_4)mNx || v.NCol()!=(uint_4)mNy) THROW(sizeMismatchErr);
     579uint_4 nnx = (v.NRows()<(uint_4)mNx)? v.NRows(): (uint_4)mNx;
     580uint_4 nny = (v.NCol() <(uint_4)mNy)? v.NCol() : (uint_4)mNy;
     581if(nnx>0 && nny>0) for(uint_4 i=0;i<nnx;i++) for(uint_4 j=0;j<nny;j++) {
    565582  (*this)(i,j) = v(i,j);
    566   if(err2 && ierr) Error2(i,j) = fabs(v(i,j));
     583  if(mErr2 && ierr) Error2(i,j) = fabs(v(i,j));
    567584}
    568585return;
     
    572589  Addition du contenu de l'histo avec les valeurs d'un tableau.
    573590*/
    574 void Histo2D::PutValueAdd(TMatrix<r_8> &v, int ierr)
    575 {
    576 int i,j;
    577 //if(v.NRows()!=(uint_4)nx || v.NCol()!=(uint_4)ny) THROW(sizeMismatchErr);
    578 uint_4 nnx = (v.NRows()<(uint_4)nx)? v.NRows(): (uint_4)nx;
    579 uint_4 nny = (v.NCol() <(uint_4)ny)? v.NCol() : (uint_4)ny;
    580 if(nnx>0 && nny>0) for(i=0;i<nnx;i++) for(j=0;j<nny;j++) {
     591void Histo2D::PutValueAdd(TMatrix<r_8> &v, int_4 ierr)
     592{
     593//if(v.NRows()!=(uint_4)mNx || v.NCol()!=(uint_4)mNy) THROW(sizeMismatchErr);
     594uint_4 nnx = (v.NRows()<(uint_4)mNx)? v.NRows(): (uint_4)mNx;
     595uint_4 nny = (v.NCol() <(uint_4)mNy)? v.NCol() : (uint_4)mNy;
     596if(nnx>0 && nny>0) for(uint_4 i=0;i<nnx;i++) for(uint_4 j=0;j<nny;j++) {
    581597  (*this)(i,j) += v(i,j);
    582   if(err2 && ierr) Error2(i,j) += fabs(v(i,j));
     598  if(mErr2 && ierr) Error2(i,j) += fabs(v(i,j));
    583599}
    584600return;
     
    591607void Histo2D::PutError2(TMatrix<r_8> &v)
    592608{
    593 int i,j;
    594 //if(v.NRows()!=(uint_4)nx || v.NCol()!=(uint_4)ny) THROW(sizeMismatchErr);
    595 uint_4 nnx = (v.NRows()<(uint_4)nx)? v.NRows(): (uint_4)nx;
    596 uint_4 nny = (v.NCol() <(uint_4)ny)? v.NCol() : (uint_4)ny;
     609//if(v.NRows()!=(uint_4)mNx || v.NCol()!=(uint_4)mNy) THROW(sizeMismatchErr);
     610uint_4 nnx = (v.NRows()<(uint_4)mNx)? v.NRows(): (uint_4)mNx;
     611uint_4 nny = (v.NCol() <(uint_4)mNy)? v.NCol() : (uint_4)mNy;
    597612if(nnx>0 && nny>0) {
    598   if(!err2) Errors();
    599   for(i=0;i<nnx;i++) for(j=0;j<nny;j++) Error2(i,j) = v(i,j);
     613  if(!mErr2) Errors();
     614  for(uint_4 i=0;i<nnx;i++) for(uint_4 j=0;j<nny;j++) Error2(i,j) = v(i,j);
    600615}
    601616return;
     
    608623void Histo2D::PutError2Add(TMatrix<r_8> &v)
    609624{
    610 int i,j;
    611 //if(v.NRows()!=(uint_4)nx || v.NCol()!=(uint_4)ny) THROW(sizeMismatchErr);
    612 uint_4 nnx = (v.NRows()<(uint_4)nx)? v.NRows(): (uint_4)nx;
    613 uint_4 nny = (v.NCol() <(uint_4)ny)? v.NCol() : (uint_4)ny;
     625//if(v.NRows()!=(uint_4)mNx || v.NCol()!=(uint_4)mNy) THROW(sizeMismatchErr);
     626uint_4 nnx = (v.NRows()<(uint_4)mNx)? v.NRows(): (uint_4)mNx;
     627uint_4 nny = (v.NCol() <(uint_4)mNy)? v.NCol() : (uint_4)mNy;
    614628if(nnx>0 && nny>0) {
    615   if(!err2) Errors();
    616   for(i=0;i<nnx;i++) for(j=0;j<nny;j++)
     629  if(!mErr2) Errors();
     630  for(uint_4 i=0;i<nnx;i++) for(uint_4 j=0;j<nny;j++)
    617631          if(v(i,j)>0.) Error2(i,j) += v(i,j);
    618632}
     
    625639void Histo2D::PutError(TMatrix<r_8> &v)
    626640{
    627 int i,j;
    628 //if(v.NRows()!=(uint_4)nx || v.NCol()!=(uint_4)ny) THROW(sizeMismatchErr);
    629 uint_4 nnx = (v.NRows()<(uint_4)nx)? v.NRows(): (uint_4)nx;
    630 uint_4 nny = (v.NCol() <(uint_4)ny)? v.NCol() : (uint_4)ny;
     641//if(v.NRows()!=(uint_4)mNx || v.NCol()!=(uint_4)mNy) THROW(sizeMismatchErr);
     642uint_4 nnx = (v.NRows()<(uint_4)mNx)? v.NRows(): (uint_4)mNx;
     643uint_4 nny = (v.NCol() <(uint_4)mNy)? v.NCol() : (uint_4)mNy;
    631644if(nnx>0 && nny>0) {
    632   if(!err2) Errors();
    633   for(i=0;i<nnx;i++) for(j=0;j<nny;j++)
     645  if(!mErr2) Errors();
     646  for(uint_4 i=0;i<nnx;i++) for(uint_4 j=0;j<nny;j++)
    634647    if(v(i,j)>0.) Error2(i,j)=v(i,j)*v(i,j); else Error2(i,j)= -v(i,j)*v(i,j);
    635648}
     
    642655  Addition du contenu de l'histo pour x,y poids w.
    643656*/
    644 void Histo2D::Add(float x, float y, float w)
     657void Histo2D::Add(r_8 x, r_8 y, r_8 w)
    645658{
    646659list<bande_slice>::iterator it;
    647 int i,j;
     660int_4 i,j;
    648661FindBin(x,y,i,j);
    649662
    650 if( hprojx != NULL ) hprojx->Add(x,w);
    651 if( hprojy != NULL ) hprojy->Add(y,w);
    652 
    653 if(lbandx.size()>0)
    654   for( it = lbandx.begin(); it != lbandx.end(); it++)
     663if( mHprojx != NULL ) mHprojx->Add(x,w);
     664if( mHprojy != NULL ) mHprojy->Add(y,w);
     665
     666if(mLBandx.size()>0)
     667  for( it = mLBandx.begin(); it != mLBandx.end(); it++)
    655668    if( (*it).min <= y && y < (*it).max ) (*it).H->Add(x,w);
    656669
    657 if(lbandy.size()>0)
    658   for( it = lbandy.begin(); it != lbandy.end(); it++)
     670if(mLBandy.size()>0)
     671  for( it = mLBandy.begin(); it != mLBandy.end(); it++)
    659672    if( (*it).min <= x && x < (*it).max ) (*it).H->Add(y,w);
    660673
    661 if(lslix.size()>0)
    662   for( it = lslix.begin(); it != lslix.end(); it++)
     674if(mLSlix.size()>0)
     675  for( it = mLSlix.begin(); it != mLSlix.end(); it++)
    663676    if( (*it).min <= y && y < (*it).max ) (*it).H->Add(x,w);
    664677
    665 if(lsliy.size()>0)
    666   for( it = lsliy.begin(); it != lsliy.end(); it++)
     678if(mLSliy.size()>0)
     679  for( it = mLSliy.begin(); it != mLSliy.end(); it++)
    667680    if( (*it).min <= x && x < (*it).max ) (*it).H->Add(y,w);
    668681
    669 if( i<0 || i>=nx || j<0 || j>=ny ) {
    670   if(i<0) i=0; else if(i>=nx) i=2; else i=1;
    671   if(j<0) j=0; else if(j>=ny) j=2; else j=1;
    672   over[i][j] += w;
    673   over[1][1] += w;
     682if( i<0 || i>=mNx || j<0 || j>=mNy ) {
     683  if(i<0) i=0; else if(i>=mNx) i=2; else i=1;
     684  if(j<0) j=0; else if(j>=mNy) j=2; else j=1;
     685  mOver[i][j] += w;
     686  mOver[1][1] += w;
    674687  return;
    675688}
    676689
    677 data[j*nx+i] += w;
    678 if(err2!=NULL) err2[j*nx+i] += w*w;
     690mData[j*mNx+i] += w;
     691if(mErr2!=NULL) mErr2[j*mNx+i] += w*w;
    679692nHist += w;
    680693nEntries++;
     
    685698  Recherche du bin du maximum dans le pave [il,ih][jl,jh].
    686699*/
    687 void Histo2D::IJMax(int& imax,int& jmax,int il,int ih,int jl,int jh)
    688 {
    689 if( il > ih ) { il = 0; ih = nx-1; }
    690 if( jl > jh ) { jl = 0; jh = ny-1; }
     700void Histo2D::IJMax(int_4& imax,int_4& jmax,int_4 il,int_4 ih,int_4 jl,int_4 jh)
     701{
     702if( il > ih ) { il = 0; ih = mNx-1; }
     703if( jl > jh ) { jl = 0; jh = mNy-1; }
    691704if( il < 0 ) il = 0;
    692705if( jl < 0 ) jl = 0;
    693 if( ih >= nx ) ih = nx-1;
    694 if( jh >= ny ) jh = ny-1;
     706if( ih >= mNx ) ih = mNx-1;
     707if( jh >= mNy ) jh = mNy-1;
    695708
    696709imax = jmax = 0;
    697 if(nxy==1) return;
    698 
    699 float mx=(*this)(il,jl);
    700 for (int i=il; i<=ih; i++)
    701    for (int j=jl; j<=jh; j++)
     710if(mNxy==1) return;
     711
     712r_8 mx=(*this)(il,jl);
     713for (int_4 i=il; i<=ih; i++)
     714   for (int_4 j=jl; j<=jh; j++)
    702715      if ((*this)(i,j)>mx) {imax = i; jmax = j; mx=(*this)(i,j);}
    703716}
     
    706719  Recherche du bin du minimum dans le pave [il,ih][jl,jh].
    707720*/
    708 void Histo2D::IJMin(int& imax,int& jmax,int il,int ih,int jl,int jh)
    709 {
    710 if( il > ih ) { il = 0; ih = nx-1; }
    711 if( jl > jh ) { jl = 0; jh = ny-1; }
     721void Histo2D::IJMin(int_4& imax,int_4& jmax,int_4 il,int_4 ih,int_4 jl,int_4 jh)
     722{
     723if( il > ih ) { il = 0; ih = mNx-1; }
     724if( jl > jh ) { jl = 0; jh = mNy-1; }
    712725if( il < 0 ) il = 0;
    713726if( jl < 0 ) jl = 0;
    714 if( ih >= nx ) ih = nx-1;
    715 if( jh >= ny ) jh = ny-1;
     727if( ih >= mNx ) ih = mNx-1;
     728if( jh >= mNy ) jh = mNy-1;
    716729
    717730imax = jmax = 0;
    718 if(nxy==1) return;
    719 
    720 float mx=(*this)(il,jl);
    721 for (int i=il; i<=ih; i++)
    722    for (int j=jl; j<=jh; j++)
     731if(mNxy==1) return;
     732
     733r_8 mx=(*this)(il,jl);
     734for (int_4 i=il; i<=ih; i++)
     735   for (int_4 j=jl; j<=jh; j++)
    723736      if ((*this)(i,j)<mx) {imax = i; jmax = j; mx=(*this)(i,j);}
    724737}
     
    728741  Recherche du maximum dans le pave [il,ih][jl,jh].
    729742*/
    730 float Histo2D::VMax(int il,int ih,int jl,int jh) const
    731 {
    732 if( il > ih ) { il = 0; ih = nx-1; }
    733 if( jl > jh ) { jl = 0; jh = ny-1; }
     743r_8 Histo2D::VMax(int_4 il,int_4 ih,int_4 jl,int_4 jh) const
     744{
     745if( il > ih ) { il = 0; ih = mNx-1; }
     746if( jl > jh ) { jl = 0; jh = mNy-1; }
    734747if( il < 0 ) il = 0;
    735748if( jl < 0 ) jl = 0;
    736 if( ih >= nx ) ih = nx-1;
    737 if( jh >= ny ) jh = ny-1;
    738 
    739 float mx=(*this)(il,jl);
    740 if(nxy==1) return mx;
    741 for (int i=il; i<=ih; i++)
    742    for (int j=jl; j<=jh; j++)
     749if( ih >= mNx ) ih = mNx-1;
     750if( jh >= mNy ) jh = mNy-1;
     751
     752r_8 mx=(*this)(il,jl);
     753if(mNxy==1) return mx;
     754for (int_4 i=il; i<=ih; i++)
     755   for (int_4 j=jl; j<=jh; j++)
    743756      if ((*this)(i,j)>mx) mx=(*this)(i,j);
    744757return mx;
     
    748761  Recherche du minimum dans le pave [il,ih][jl,jh].
    749762*/
    750 float Histo2D::VMin(int il,int ih,int jl,int jh) const
    751 {
    752 if( il > ih ) { il = 0; ih = nx-1; }
    753 if( jl > jh ) { jl = 0; jh = ny-1; }
     763r_8 Histo2D::VMin(int_4 il,int_4 ih,int_4 jl,int_4 jh) const
     764{
     765if( il > ih ) { il = 0; ih = mNx-1; }
     766if( jl > jh ) { jl = 0; jh = mNy-1; }
    754767if( il < 0 ) il = 0;
    755768if( jl < 0 ) jl = 0;
    756 if( ih >= nx ) ih = nx-1;
    757 if( jh >= ny ) jh = ny-1;
    758 
    759 float mx=(*this)(il,jl);
    760 if(nxy==1) return mx;
    761 for (int i=il; i<=ih; i++)
    762    for (int j=jl; j<=jh; j++)
     769if( ih >= mNx ) ih = mNx-1;
     770if( jh >= mNy ) jh = mNy-1;
     771
     772r_8 mx=(*this)(il,jl);
     773if(mNxy==1) return mx;
     774for (int_4 i=il; i<=ih; i++)
     775   for (int_4 j=jl; j<=jh; j++)
    763776      if ((*this)(i,j)<mx) mx=(*this)(i,j);
    764777return mx;
     
    769782  Renvoie les under.overflow dans les 8 quadrants.
    770783  \verbatim
    771      over[3][3]:        20 | 21 | 22
     784     mOver[3][3]:       20 | 21 | 22
    772785                           |    |
    773786                       --------------
     
    780793  \endverbatim
    781794*/
    782 float Histo2D::NOver(int i,int j) const
    783 {
    784 if( i < 0 || i>=3 || j < 0 || j>=3 ) return over[1][1];
    785 return over[i][j];
     795r_8 Histo2D::NOver(int_4 i,int_4 j) const
     796{
     797if( i < 0 || i>=3 || j < 0 || j>=3 ) return mOver[1][1];
     798return mOver[i][j];
    786799}
    787800
     
    791804  Retourne le nombre de bins non-nuls.
    792805*/
    793 int Histo2D::BinNonNul() const
    794 {
    795 int non=0;
    796 for (int i=0;i<nxy;i++) if( data[i] != 0. ) non++;
     806int_4 Histo2D::BinNonNul() const
     807{
     808int_4 non=0;
     809for (int_4 i=0;i<mNxy;i++) if( mData[i] != 0. ) non++;
    797810return non;
    798811}
     
    801814  Retourne le nombre de bins avec erreurs non-nulles.
    802815*/
    803 int Histo2D::ErrNonNul() const
    804 {
    805 if(err2==NULL) return -1;
    806 int non=0;
    807 for (int i=0;i<nxy;i++) if( err2[i] != 0. ) non++;
     816int_4 Histo2D::ErrNonNul() const
     817{
     818if(mErr2==NULL) return -1;
     819int_4 non=0;
     820for (int_4 i=0;i<mNxy;i++) if( mErr2[i] != 0. ) non++;
    808821return non;
    809822}
     
    813826  Idem EstimeMax(int...) mais retourne x,y.
    814827*/
    815 int Histo2D::EstimeMax(float& xm,float& ym,int SzPav
    816                       ,int il,int ih,int jl,int jh)
    817 {
    818 int im,jm;
     828int_4 Histo2D::EstimeMax(r_8& xm,r_8& ym,int_4 SzPav
     829                      ,int_4 il,int_4 ih,int_4 jl,int_4 jh)
     830{
     831int_4 im,jm;
    819832IJMax(im,jm,il,ih,jl,jh);
    820833return EstimeMax(im,jm,xm,ym,SzPav);
     
    833846  \endverbatim
    834847*/
    835 int Histo2D::EstimeMax(int im,int jm,float& xm,float& ym,int SzPav)
     848int_4 Histo2D::EstimeMax(int_4 im,int_4 jm,r_8& xm,r_8& ym,int_4 SzPav)
    836849{
    837850xm = ym = 0;
    838851if( SzPav <= 0 ) return -1;
    839 if( im < 0 || im >= nx ) return -1;
    840 if( jm < 0 || jm >= ny ) return -1;
     852if( im < 0 || im >= mNx ) return -1;
     853if( jm < 0 || jm >= mNy ) return -1;
    841854
    842855if( SzPav%2 == 0 ) SzPav++;
    843856SzPav = (SzPav-1)/2;
    844857
    845 int rc = 0;
    846 double dxm = 0, dym = 0, wx = 0;
    847 for(int i=im-SzPav;i<=im+SzPav;i++) {
    848   if( i<0 || i>= nx ) {rc=1; continue;}
    849   for(int j=jm-SzPav;j<=jm+SzPav;j++) {
    850     if( j<0 || j>= ny ) {rc=1; continue;}
    851     float x,y;
     858int_4 rc = 0;
     859r_8 dxm = 0, dym = 0, wx = 0;
     860for(int_4 i=im-SzPav;i<=im+SzPav;i++) {
     861  if( i<0 || i>= mNx ) {rc=1; continue;}
     862  for(int_4 j=jm-SzPav;j<=jm+SzPav;j++) {
     863    if( j<0 || j>= mNy ) {rc=1; continue;}
     864    r_8 x,y;
    852865    BinCenter(i,j,x,y);
    853866    dxm += x * (*this)(i,j);
     
    888901  \endverbatim
    889902*/
    890 int Histo2D::FindMax(int& im,int& jm,int SzPav,float Dz
    891                     ,int il,int ih,int jl,int jh)
    892 {
    893 if( il > ih ) { il = 0; ih = nx-1; }
    894 if( jl > jh ) { jl = 0; jh = ny-1; }
     903int_4 Histo2D::FindMax(int_4& im,int_4& jm,int_4 SzPav,r_8 Dz
     904                    ,int_4 il,int_4 ih,int_4 jl,int_4 jh)
     905{
     906if( il > ih ) { il = 0; ih = mNx-1; }
     907if( jl > jh ) { jl = 0; jh = mNy-1; }
    895908if( il < 0 ) il = 0;
    896909if( jl < 0 ) jl = 0;
    897 if( ih >= nx ) ih = nx-1;
    898 if( jh >= ny ) jh = ny-1;
     910if( ih >= mNx ) ih = mNx-1;
     911if( jh >= mNy ) jh = mNy-1;
    899912if( SzPav < 0 ) SzPav = 0;
    900913  else { if( SzPav%2 == 0 ) SzPav++; SzPav = (SzPav-1)/2;}
    901914if( Dz < 0 ) Dz = 0.;
    902 float max = VMax(il,ih,jl,jh) - Dz;
    903 int nmax = 0;
    904 float sumx = -MAXFLOAT;
    905 for(int i=il;i<=ih;i++) for(int j=jl;j<=jh;j++) {
     915r_8 max = VMax(il,ih,jl,jh) - Dz;
     916int_4 nmax = 0;
     917r_8 sumx = -1.e20;
     918for(int_4 i=il;i<=ih;i++) for(int_4 j=jl;j<=jh;j++) {
    906919  if( (*this)(i,j) < max) continue;
    907920  nmax++;
    908   float sum = 0.;
    909   for(int ii=i-SzPav;ii<=i+SzPav;ii++) {
    910     if( ii<0 || ii >= nx ) continue;
    911     for(int jj=j-SzPav;jj<=j+SzPav;jj++) {
    912       if( jj<0 || jj >= ny ) continue;
     921  r_8 sum = 0.;
     922  for(int_4 ii=i-SzPav;ii<=i+SzPav;ii++) {
     923    if( ii<0 || ii >= mNx ) continue;
     924    for(int_4 jj=j-SzPav;jj<=j+SzPav;jj++) {
     925      if( jj<0 || jj >= mNy ) continue;
    913926      sum += (*this)(ii,jj);
    914927    }
    915928  }
    916   if( sum > sumx ) { im = i; jm = j; sumx = sum;}
     929  if(nmax==1 || sum>sumx) {im=i; jm=j; sumx=sum;}
    917930}
    918931if( nmax <= 0 ) { IJMax(im,jm,il,ih,jl,jh); return 1;}
     
    943956  \endverbatim
    944957*/
    945 int  Histo2D::Fit(GeneralFit& gfit,unsigned short typ_err)
     958int_4  Histo2D::Fit(GeneralFit& gfit,unsigned short typ_err)
    946959{
    947960if(NBinX()*NBinY()<=0) return -1000;
     
    950963GeneralFitData mydata(2,NBinX()*NBinY());
    951964
    952 for(int i=0;i<NBinX();i++) for(int j=0;j<NBinY();j++) {
    953   float x,y;
     965for(int_4 i=0;i<NBinX();i++) for(int_4 j=0;j<NBinY();j++) {
     966  r_8 x,y;
    954967  BinCenter(i,j,x,y);
    955   double f = (double) (*this)(i,j);
    956   double saf = sqrt(fabs(f)); if(saf<1.) saf=1.;
    957   double e=0.;
     968  r_8 f = (*this)(i,j);
     969  r_8 saf = sqrt(fabs(f)); if(saf<1.) saf=1.;
     970  r_8 e=0.;
    958971  if(typ_err==0)      {if(HasErrors()) e=Error(i,j); else e=1.;}
    959972  else if(typ_err==1) {if(HasErrors()) e=Error(i,j); else e=saf;}
     
    962975  else if(typ_err==4) e=(f==0.)?0.:1.;
    963976  else if(typ_err==5) e=(f==0.)?0.:saf;
    964   mydata.AddData2((double) x,(double) y,f,e);
     977  mydata.AddData2(x,y,f,e);
    965978}
    966979
     
    982995TVector<r_8> par = gfit.GetParm();
    983996Histo2D h2(*this);
    984 for(int i=0;i<NBinX();i++) for(int j=0;j<NBinY();j++) {
    985   float xc,yc;
     997for(int_4 i=0;i<NBinX();i++) for(int_4 j=0;j<NBinY();j++) {
     998  r_8 xc,yc;
    986999  BinCenter(i,j,xc,yc);
    987   double x[2] = {(double)xc,(double)yc};
    988   h2(i,j) -= (float) f->Value(x,par.Data());
     1000  r_8 x[2] = {xc,yc};
     1001  h2(i,j) -= f->Value(x,par.Data());
    9891002}
    9901003return h2;
     
    10031016TVector<r_8> par = gfit.GetParm();
    10041017Histo2D h2(*this);
    1005 for(int i=0;i<NBinX();i++) for(int j=0;j<NBinY();j++) {
    1006   float xc,yc;
     1018for(int_4 i=0;i<NBinX();i++) for(int_4 j=0;j<NBinY();j++) {
     1019  r_8 xc,yc;
    10071020  BinCenter(i,j,xc,yc);
    1008   double x[2] = {(double)xc,(double)yc};
    1009   h2(i,j) = (float) f->Value(x,par.Data());
     1021  r_8 x[2] = {xc,yc};
     1022  h2(i,j) = f->Value(x,par.Data());
    10101023}
    10111024return h2;
     
    10201033printf("~Histo::Print    nHist=%g nEntries=%d",nHist,nEntries);
    10211034if(HasErrors()) printf("  Errors=1\n"); else printf("  Errors=0\n");
    1022 printf("over: [ %g %g %g // %g %g %g  // %g %g %g ]\n"
    1023       ,over[2][0],over[2][1],over[2][2]
    1024       ,over[1][0],over[1][1],over[1][2]
    1025       ,over[0][0],over[0][1],over[0][2]);
    1026 printf("  nx=%d xmin=%g xmax=%g binx=%g  ",nx,xmin,xmax,wbinx);
    1027 printf("  ny=%d ymin=%g ymax=%g biny=%g\n",ny,ymin,ymax,wbiny);
     1035printf("mOver: [ %g %g %g // %g %g %g  // %g %g %g ]\n"
     1036      ,mOver[2][0],mOver[2][1],mOver[2][2]
     1037      ,mOver[1][0],mOver[1][1],mOver[1][2]
     1038      ,mOver[0][0],mOver[0][1],mOver[0][2]);
     1039printf("  nx=%d xmin=%g xmax=%g binx=%g  ",mNx,mXmin,mXmax,mWBinx);
     1040printf("  ny=%d ymin=%g ymax=%g biny=%g\n",mNy,mYmin,mYmax,mWBiny);
    10281041}
    10291042
     
    10381051  \endverbatim
    10391052*/
    1040 void Histo2D::Print(float min,float max
    1041                    ,int il,int ih,int jl,int jh)
    1042 {
    1043 int ns = 35;
     1053void Histo2D::Print(r_8 min,r_8 max
     1054                   ,int_4 il,int_4 ih,int_4 jl,int_4 jh)
     1055{
     1056int_4 ns = 35;
    10441057const char *s =    "+23456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    10451058
    1046 if( il > ih ) { il = 0; ih = nx-1; }
    1047 if( jl > jh ) { jl = 0; jh = ny-1; }
     1059if( il > ih ) { il = 0; ih = mNx-1; }
     1060if( jl > jh ) { jl = 0; jh = mNy-1; }
    10481061if( il < 0 ) il = 0;
    10491062if( jl < 0 ) jl = 0;
    1050 if( ih >= nx ) ih = nx-1;
    1051 if( jh >= ny ) jh = ny-1;
     1063if( ih >= mNx ) ih = mNx-1;
     1064if( jh >= mNy ) jh = mNy-1;
    10521065
    10531066PrintStatus();
    10541067
    1055 if( il != 0 || ih != nx-1 || jl != 0 || jh != ny-1 ) {
    1056   float xl,xh,yl,yh;
     1068if( il != 0 || ih != mNx-1 || jl != 0 || jh != mNy-1 ) {
     1069  r_8 xl,xh,yl,yh;
    10571070  BinLowEdge(il,jl,xl,yl);
    10581071  BinHighEdge(ih,jh,xh,yh);
     
    10721085// imprime numero de bin en colonne
    10731086printf("\n");
    1074 if( nx-1 >= 100 ) {
     1087if( mNx-1 >= 100 ) {
    10751088  printf("     ");
    1076   for(int i=il;i<=ih;i++) printf("%1d",(int) (i%1000)/100);
     1089  for(int_4 i=il;i<=ih;i++) printf("%1d",(int_4) (i%1000)/100);
    10771090  printf("\n");
    10781091}
    1079 if( nx-1 >= 10 ) {
     1092if( mNx-1 >= 10 ) {
    10801093  printf("     ");
    1081   for(int i=il;i<=ih;i++) printf("%1d",(int) (i%100)/10);
     1094  for(int_4 i=il;i<=ih;i++) printf("%1d",(int_4) (i%100)/10);
    10821095  printf("\n");
    10831096}
    10841097printf("     ");
    1085 for(int i=il;i<=ih;i++) printf("%1d",i%10);
     1098for(int_4 i=il;i<=ih;i++) printf("%1d",i%10);
    10861099printf("\n");
    1087 printf("     "); {for(int i=il;i<=ih;i++) printf("-"); printf("\n");}
     1100printf("     "); {for(int_4 i=il;i<=ih;i++) printf("-"); printf("\n");}
    10881101
    10891102// imprime histogramme
    1090 for(int j=jh;j>=jl;j--) {
     1103for(int_4 j=jh;j>=jl;j--) {
    10911104  printf("%3d: ",j);
    1092   for(int i=il;i<=ih;i++) {
    1093     int h;
    1094     if( 1<=max-min && max-min<=35 ) h = (int)( (*this)(i,j) - min ) - 1;
    1095       else h = (int)( ((*this)(i,j)-min)/(max-min) * ns ) - 1;
     1105  for(int_4 i=il;i<=ih;i++) {
     1106    int_4 h;
     1107    if( 1<=max-min && max-min<=35 ) h = (int_4)( (*this)(i,j) - min ) - 1;
     1108      else h = (int_4)( ((*this)(i,j)-min)/(max-min) * ns ) - 1;
    10961109    char c;
    10971110    if(h<0 && (*this)(i,j)>min) c = '.';
     
    11051118
    11061119// imprime numero de bin en colonne
    1107 printf("     "); {for(int i=il;i<=ih;i++) printf("-"); printf("\n");}
    1108 if( nx-1 >= 100 ) {
     1120printf("     "); {for(int_4 i=il;i<=ih;i++) printf("-"); printf("\n");}
     1121if( mNx-1 >= 100 ) {
    11091122  printf("     ");
    1110   for(int i=il;i<=ih;i++) printf("%1d",(int) (i%1000)/100);
     1123  for(int_4 i=il;i<=ih;i++) printf("%1d",(int_4) (i%1000)/100);
    11111124  printf("\n");
    11121125}
    1113 if( nx-1 >= 10 ) {
     1126if( mNx-1 >= 10 ) {
    11141127  printf("     ");
    1115   for(int i=il;i<=ih;i++) printf("%1d",(int) (i%100)/10);
     1128  for(int_4 i=il;i<=ih;i++) printf("%1d",(int_4) (i%100)/10);
    11161129  printf("\n");
    11171130}
    11181131printf("     ");
    1119 {for(int i=il;i<=ih;i++) printf("%1d",i%10);}
     1132{for(int_4 i=il;i<=ih;i++) printf("%1d",i%10);}
    11201133printf("\n");
    11211134
     
    11301143void Histo2D::SetProjX()
    11311144{
    1132 if( hprojx != NULL ) DelProjX();
    1133 hprojx = new Histo(xmin,xmax,nx);
    1134 if( err2 != NULL && hprojx != NULL ) hprojx->Errors();
     1145if( mHprojx != NULL ) DelProjX();
     1146mHprojx = new Histo(mXmin,mXmax,mNx);
     1147if( mErr2 != NULL && mHprojx != NULL ) mHprojx->Errors();
    11351148}
    11361149
     
    11401153void Histo2D::SetProjY()
    11411154{
    1142 if( hprojy != NULL ) DelProjY();
    1143 hprojy = new Histo(ymin,ymax,ny);
    1144 if( err2 != NULL && hprojy != NULL  ) hprojy->Errors();
     1155if( mHprojy != NULL ) DelProjY();
     1156mHprojy = new Histo(mYmin,mYmax,mNy);
     1157if( mErr2 != NULL && mHprojy != NULL  ) mHprojy->Errors();
    11451158}
    11461159
     
    11591172void Histo2D::ShowProj()
    11601173{
    1161 if( hprojx != NULL ) cout << ">>>> Projection X set : "<< hprojx <<endl;
     1174if( mHprojx != NULL ) cout << ">>>> Projection X set : "<< mHprojx <<endl;
    11621175  else cout << ">>>> NO Projection X set"<<endl;
    1163 if( hprojy != NULL ) cout << ">>>> Projection Y set : "<< hprojy <<endl;
     1176if( mHprojy != NULL ) cout << ">>>> Projection Y set : "<< mHprojy <<endl;
    11641177  else cout << ">>>> NO Projection Y set"<<endl;
    11651178}
     
    11701183void Histo2D::DelProjX()
    11711184{
    1172 if( hprojx == NULL ) return;
    1173 delete hprojx;
    1174 hprojx = NULL;
     1185if( mHprojx == NULL ) return;
     1186delete mHprojx;
     1187mHprojx = NULL;
    11751188}
    11761189
     
    11801193void Histo2D::DelProjY()
    11811194{
    1182 if( hprojy == NULL ) return;
    1183 delete hprojy;
    1184 hprojy = NULL;
     1195if( mHprojy == NULL ) return;
     1196delete mHprojy;
     1197mHprojy = NULL;
    11851198}
    11861199
     
    11991212void Histo2D::ZeroProjX()
    12001213{
    1201 if( hprojx == NULL ) return;
    1202 hprojx->Zero();
     1214if( mHprojx == NULL ) return;
     1215mHprojx->Zero();
    12031216}
    12041217
     
    12081221void Histo2D::ZeroProjY()
    12091222{
    1210 if( hprojy == NULL ) return;
    1211 hprojy->Zero();
     1223if( mHprojy == NULL ) return;
     1224mHprojy->Zero();
    12121225}
    12131226
     
    12271240  Pour creer une bande en X entre ybmin et ybmax.
    12281241*/
    1229 int Histo2D::SetBandX(float ybmin,float ybmax)
    1230 {
    1231 b_s.num = lbandx.size();
    1232 b_s.min = ybmin;
    1233 b_s.max = ybmax;
    1234 b_s.H = new Histo(xmin,xmax,nx);
    1235 lbandx.push_back(b_s);
    1236 b_s.H = NULL;
    1237 return lbandx.size()-1;
     1242int_4 Histo2D::SetBandX(r_8 ybmin,r_8 ybmax)
     1243{
     1244mB_s.num = mLBandx.size();
     1245mB_s.min = ybmin;
     1246mB_s.max = ybmax;
     1247mB_s.H = new Histo(mXmin,mXmax,mNx);
     1248mLBandx.push_back(mB_s);
     1249mB_s.H = NULL;
     1250return mLBandx.size()-1;
    12381251}
    12391252
     
    12411254  Pour creer une bande en Y entre xbmin et xbmax.
    12421255*/
    1243 int Histo2D::SetBandY(float xbmin,float xbmax)
    1244 {
    1245 b_s.num = lbandy.size();
    1246 b_s.min = xbmin;
    1247 b_s.max = xbmax;
    1248 b_s.H = new Histo(ymin,ymax,ny);
    1249 lbandy.push_back(b_s);
    1250 b_s.H = NULL;
    1251 return lbandy.size()-1;
     1256int_4 Histo2D::SetBandY(r_8 xbmin,r_8 xbmax)
     1257{
     1258mB_s.num = mLBandy.size();
     1259mB_s.min = xbmin;
     1260mB_s.max = xbmax;
     1261mB_s.H = new Histo(mYmin,mYmax,mNy);
     1262mLBandy.push_back(mB_s);
     1263mB_s.H = NULL;
     1264return mLBandy.size()-1;
    12521265}
    12531266
     
    12571270void Histo2D::DelBandX()
    12581271{
    1259 if( lbandx.size() <= 0 ) return;
    1260 for(list<bande_slice>::iterator i = lbandx.begin(); i != lbandx.end(); i++)
     1272if( mLBandx.size() <= 0 ) return;
     1273for(list<bande_slice>::iterator i = mLBandx.begin(); i != mLBandx.end(); i++)
    12611274       if( (*i).H != NULL ) {delete (*i).H; (*i).H=NULL;}
    1262 lbandx.erase(lbandx.begin(),lbandx.end());
     1275mLBandx.erase(mLBandx.begin(),mLBandx.end());
    12631276}
    12641277
     
    12681281void Histo2D::DelBandY()
    12691282{
    1270 if( lbandy.size() <= 0 ) return;
    1271 for(list<bande_slice>::iterator i = lbandy.begin(); i != lbandy.end(); i++)
     1283if( mLBandy.size() <= 0 ) return;
     1284for(list<bande_slice>::iterator i = mLBandy.begin(); i != mLBandy.end(); i++)
    12721285       if( (*i).H != NULL ) {delete (*i).H; (*i).H=NULL;}
    1273 lbandy.erase(lbandy.begin(),lbandy.end());
     1286mLBandy.erase(mLBandy.begin(),mLBandy.end());
    12741287}
    12751288
     
    12791292void Histo2D::ZeroBandX()
    12801293{
    1281 if( lbandx.size() <= 0 ) return;
     1294if( mLBandx.size() <= 0 ) return;
    12821295list<bande_slice>::iterator i;
    1283 for(i = lbandx.begin(); i != lbandx.end(); i++)
     1296for(i = mLBandx.begin(); i != mLBandx.end(); i++)
    12841297              (*i).H->Zero();
    12851298}
     
    12901303void Histo2D::ZeroBandY()
    12911304{
    1292 if( lbandy.size() <= 0 ) return;
     1305if( mLBandy.size() <= 0 ) return;
    12931306list<bande_slice>::iterator i;
    1294 for(i = lbandy.begin(); i != lbandy.end(); i++)
     1307for(i = mLBandy.begin(); i != mLBandy.end(); i++)
    12951308              (*i).H->Zero();
    12961309}
     
    12991312  Retourne un pointeur sur la bande numero `n' selon X.
    13001313*/
    1301 Histo* Histo2D::HBandX(int n) const
    1302 {
    1303 if( lbandx.size() <= 0 || n < 0 || n >= (int) lbandx.size() ) return NULL;
    1304 for(list<bande_slice>::const_iterator i = lbandx.begin(); i != lbandx.end(); i++)
     1314Histo* Histo2D::HBandX(int_4 n) const
     1315{
     1316if( mLBandx.size() <= 0 || n < 0 || n >= (int_4) mLBandx.size() ) return NULL;
     1317for(list<bande_slice>::const_iterator i = mLBandx.begin(); i != mLBandx.end(); i++)
    13051318              if( (*i).num == n ) return (*i).H;
    13061319return NULL;
     
    13101323  Retourne un pointeur sur la bande numero `n' selon Y.
    13111324*/
    1312 Histo* Histo2D::HBandY(int n) const
    1313 {
    1314 if( lbandy.size() <= 0 || n < 0 || n >= (int) lbandy.size() ) return NULL;
    1315 for(list<bande_slice>::const_iterator i = lbandy.begin(); i != lbandy.end(); i++)
     1325Histo* Histo2D::HBandY(int_4 n) const
     1326{
     1327if( mLBandy.size() <= 0 || n < 0 || n >= (int_4) mLBandy.size() ) return NULL;
     1328for(list<bande_slice>::const_iterator i = mLBandy.begin(); i != mLBandy.end(); i++)
    13161329              if( (*i).num == n ) return (*i).H;
    13171330return NULL;
     
    13211334  Retourne les limites de la bande numero `n' selon X.
    13221335*/
    1323 void Histo2D::GetBandX(int n,float& ybmin,float& ybmax) const
     1336void Histo2D::GetBandX(int_4 n,r_8& ybmin,r_8& ybmax) const
    13241337{
    13251338ybmin = 0.; ybmax = 0.;
    1326 if( lbandx.size() <= 0 || n < 0 || n >= (int) lbandx.size() ) return;
    1327 for(list<bande_slice>::const_iterator i = lbandx.begin(); i != lbandx.end(); i++)
     1339if( mLBandx.size() <= 0 || n < 0 || n >= (int_4) mLBandx.size() ) return;
     1340for(list<bande_slice>::const_iterator i = mLBandx.begin(); i != mLBandx.end(); i++)
    13281341  if( (*i).num == n ) { ybmin = (*i).min; ybmax = (*i).max; return;}
    13291342return;
     
    13331346  Retourne les limites de la bande numero `n' selon Y.
    13341347*/
    1335 void Histo2D::GetBandY(int n,float& xbmin,float& xbmax) const
     1348void Histo2D::GetBandY(int_4 n,r_8& xbmin,r_8& xbmax) const
    13361349{
    13371350xbmin = 0.; xbmax = 0.;
    1338 if( lbandy.size() <= 0 || n < 0 || n >= (int) lbandy.size() ) return;
    1339 for(list<bande_slice>::const_iterator i = lbandy.begin(); i != lbandy.end(); i++)
     1351if( mLBandy.size() <= 0 || n < 0 || n >= (int_4) mLBandy.size() ) return;
     1352for(list<bande_slice>::const_iterator i = mLBandy.begin(); i != mLBandy.end(); i++)
    13401353  if( (*i).num == n ) { xbmin = (*i).min; xbmax = (*i).max; return;}
    13411354return;
     
    13451358  Informations sur les bandes.
    13461359*/
    1347 void Histo2D::ShowBand(int lp)
    1348 {
    1349   cout << ">>>> Nombre de bande X : " << lbandx.size() << endl;
    1350 if( lp>0 && lbandx.size()>0 ) {
     1360void Histo2D::ShowBand(int_4 lp)
     1361{
     1362  cout << ">>>> Nombre de bande X : " << mLBandx.size() << endl;
     1363if( lp>0 && mLBandx.size()>0 ) {
    13511364  list<bande_slice>::iterator i;
    1352   for(i = lbandx.begin(); i != lbandx.end(); i++) {
     1365  for(i = mLBandx.begin(); i != mLBandx.end(); i++) {
    13531366    cout<<"  "<<(*i).num<<" de ymin="<<(*i).min<<" a ymax="<<(*i).max;
    13541367    if(lp>1) cout << "   H=" << (*i).H;
     
    13571370}
    13581371
    1359 cout << ">>>> Nombre de bande Y : " << lbandy.size() << endl;
    1360 if( lp>0 && lbandy.size()>0 ) {
     1372cout << ">>>> Nombre de bande Y : " << mLBandy.size() << endl;
     1373if( lp>0 && mLBandy.size()>0 ) {
    13611374  list<bande_slice>::iterator i;
    1362   for(i = lbandy.begin(); i != lbandy.end(); i++) {
     1375  for(i = mLBandy.begin(); i != mLBandy.end(); i++) {
    13631376    cout<<"  "<<(*i).num<<" de xmin="<<(*i).min<<" a xmax="<<(*i).max;
    13641377    if(lp>1) cout << "   H=" << (*i).H;
     
    13741387  Pour creer `nsli' bandes equidistantes selon X.
    13751388*/
    1376 int Histo2D::SetSliX(int nsli)
     1389int_4 Histo2D::SetSliX(int_4 nsli)
    13771390{
    13781391if( nsli <= 0 ) return -1;
    1379 if( nsli >  ny ) nsli = ny;
    1380 if( lslix.size() > 0 ) DelSliX();
    1381 float w = (ymax-ymin)/nsli;
    1382 
    1383 for(int i=0; i<nsli; i++ ) {
    1384   b_s.num = i;
    1385   b_s.min = ymin + i*w;
    1386   b_s.max = b_s.min + w;
    1387   b_s.H = new Histo(xmin,xmax,nx);
    1388   lslix.push_back(b_s);
    1389   b_s.H = NULL;
    1390 }
    1391 return (int) lslix.size();
     1392if( nsli >  mNy ) nsli = mNy;
     1393if( mLSlix.size() > 0 ) DelSliX();
     1394r_8 w = (mYmax-mYmin)/nsli;
     1395
     1396for(int_4 i=0; i<nsli; i++ ) {
     1397  mB_s.num = i;
     1398  mB_s.min = mYmin + i*w;
     1399  mB_s.max = mB_s.min + w;
     1400  mB_s.H = new Histo(mXmin,mXmax,mNx);
     1401  mLSlix.push_back(mB_s);
     1402  mB_s.H = NULL;
     1403}
     1404return (int_4) mLSlix.size();
    13921405}
    13931406
     
    13951408  Pour creer `nsli' bandes equidistantes selon Y.
    13961409*/
    1397 int Histo2D::SetSliY(int nsli)
     1410int_4 Histo2D::SetSliY(int_4 nsli)
    13981411{
    13991412if( nsli <= 0 ) return -1;
    1400 if( nsli >  nx ) nsli = nx;
    1401 if( lsliy.size() > 0 ) DelSliY();
    1402 float w = (xmax-xmin)/nsli;
    1403 
    1404 for(int i=0; i<nsli; i++ ) {
    1405   b_s.num = i;
    1406   b_s.min = xmin + i*w;
    1407   b_s.max = b_s.min + w;
    1408   b_s.H = new Histo(ymin,ymax,ny);
    1409   lsliy.push_back(b_s);
    1410   b_s.H = NULL;
    1411 }
    1412 return (int) lsliy.size();
     1413if( nsli >  mNx ) nsli = mNx;
     1414if( mLSliy.size() > 0 ) DelSliY();
     1415r_8 w = (mXmax-mXmin)/nsli;
     1416
     1417for(int_4 i=0; i<nsli; i++ ) {
     1418  mB_s.num = i;
     1419  mB_s.min = mXmin + i*w;
     1420  mB_s.max = mB_s.min + w;
     1421  mB_s.H = new Histo(mYmin,mYmax,mNy);
     1422  mLSliy.push_back(mB_s);
     1423  mB_s.H = NULL;
     1424}
     1425return (int_4) mLSliy.size();
    14131426}
    14141427
     
    14181431void Histo2D::DelSliX()
    14191432{
    1420 if( lslix.size() <= 0 ) return;
    1421 for(list<bande_slice>::iterator i = lslix.begin(); i != lslix.end(); i++)
     1433if( mLSlix.size() <= 0 ) return;
     1434for(list<bande_slice>::iterator i = mLSlix.begin(); i != mLSlix.end(); i++)
    14221435       if( (*i).H != NULL ) {delete (*i).H; (*i).H=NULL;}
    1423 lslix.erase(lslix.begin(),lslix.end());
     1436mLSlix.erase(mLSlix.begin(),mLSlix.end());
    14241437}
    14251438
     
    14291442void Histo2D::DelSliY()
    14301443{
    1431 if( lsliy.size() <= 0 ) return;
    1432 for(list<bande_slice>::iterator i = lsliy.begin(); i != lsliy.end(); i++)
     1444if( mLSliy.size() <= 0 ) return;
     1445for(list<bande_slice>::iterator i = mLSliy.begin(); i != mLSliy.end(); i++)
    14331446       if( (*i).H != NULL ) {delete (*i).H; (*i).H=NULL;}
    1434 lsliy.erase(lsliy.begin(),lsliy.end());
     1447mLSliy.erase(mLSliy.begin(),mLSliy.end());
    14351448}
    14361449
     
    14401453void Histo2D::ZeroSliX()
    14411454{
    1442 if( lslix.size() <= 0 ) return;
     1455if( mLSlix.size() <= 0 ) return;
    14431456list<bande_slice>::iterator i;
    1444 for(i = lslix.begin(); i != lslix.end(); i++)
     1457for(i = mLSlix.begin(); i != mLSlix.end(); i++)
    14451458              (*i).H->Zero();
    14461459}
     
    14511464void Histo2D::ZeroSliY()
    14521465{
    1453 if( lsliy.size() <= 0 ) return;
     1466if( mLSliy.size() <= 0 ) return;
    14541467list<bande_slice>::iterator i;
    1455 for(i = lsliy.begin(); i != lsliy.end(); i++)
     1468for(i = mLSliy.begin(); i != mLSliy.end(); i++)
    14561469              (*i).H->Zero();
    14571470}
     
    14611474  selon X.
    14621475*/
    1463 Histo* Histo2D::HSliX(int n) const
    1464 {
    1465 if( lslix.size() <= 0 || n < 0 || n >= (int) lslix.size() ) return NULL;
    1466 for(list<bande_slice>::const_iterator i = lslix.begin(); i != lslix.end(); i++)
     1476Histo* Histo2D::HSliX(int_4 n) const
     1477{
     1478if( mLSlix.size() <= 0 || n < 0 || n >= (int_4) mLSlix.size() ) return NULL;
     1479for(list<bande_slice>::const_iterator i = mLSlix.begin(); i != mLSlix.end(); i++)
    14671480              if( (*i).num == n ) return (*i).H;
    14681481return NULL;
     
    14731486  selon Y.
    14741487*/
    1475 Histo* Histo2D::HSliY(int n) const
    1476 {
    1477 if( lsliy.size() <= 0 || n < 0 || n >= (int) lsliy.size() ) return NULL;
    1478 for(list<bande_slice>::const_iterator i = lsliy.begin(); i != lsliy.end(); i++)
     1488Histo* Histo2D::HSliY(int_4 n) const
     1489{
     1490if( mLSliy.size() <= 0 || n < 0 || n >= (int_4) mLSliy.size() ) return NULL;
     1491for(list<bande_slice>::const_iterator i = mLSliy.begin(); i != mLSliy.end(); i++)
    14791492              if( (*i).num == n ) return (*i).H;
    14801493return NULL;
     
    14841497  Informations sur les bandes equidistantes.
    14851498*/
    1486 void Histo2D::ShowSli(int lp)
     1499void Histo2D::ShowSli(int_4 lp)
    14871500{
    14881501list<bande_slice>::iterator i;
    1489 cout << ">>>> Nombre de slice X : " << lslix.size() << endl;
    1490 if( lp>0 && lslix.size() > 0 )
    1491   for(i = lslix.begin(); i != lslix.end(); i++) {
     1502cout << ">>>> Nombre de slice X : " << mLSlix.size() << endl;
     1503if( lp>0 && mLSlix.size() > 0 )
     1504  for(i = mLSlix.begin(); i != mLSlix.end(); i++) {
    14921505    cout<<"  "<<(*i).num<<" de ymin="<<(*i).min<<" a ymax="<<(*i).max;
    14931506    if(lp>1) cout << "   H=" << (*i).H;
     
    14951508  }
    14961509
    1497 cout << ">>>> Nombre de slice Y : " << lsliy.size() << endl;
    1498 if( lp>0 && lsliy.size()>0 )
    1499   for(i = lsliy.begin(); i != lsliy.end(); i++) {
     1510cout << ">>>> Nombre de slice Y : " << mLSliy.size() << endl;
     1511if( lp>0 && mLSliy.size()>0 )
     1512  for(i = mLSliy.begin(); i != mLSliy.end(); i++) {
    15001513    cout<<"  "<<(*i).num<<" de xmin="<<(*i).min<<" a xmax="<<(*i).max;
    15011514    if(lp>1) cout << "   H=" << (*i).H;
     
    15181531  else         dobj->Delete();
    15191532
    1520 float min,max;
     1533r_8 min,max;
    15211534int_4 errok, projx, projy, nslix, nsliy, nbanx, nbany;
    15221535
     
    15301543
    15311544// Lecture variables de definitions
    1532 is.Get(dobj->nx);
    1533 is.Get(dobj->ny);
    1534 is.Get(dobj->nxy);
     1545is.Get(dobj->mNx);
     1546is.Get(dobj->mNy);
     1547is.Get(dobj->mNxy);
    15351548is.Get(errok);
    15361549is.Get(dobj->nEntries);
    15371550is.Get(dobj->nHist);
    15381551
    1539 is.Get(dobj->xmin);
    1540 is.Get(dobj->xmax);
    1541 is.Get(dobj->ymin);
    1542 is.Get(dobj->ymax);
    1543 is.Get(dobj->wbinx);
    1544 is.Get(dobj->wbiny);
    1545 
    1546 is.Get(&(dobj->over[0][0]),9);
     1552is.Get(dobj->mXmin);
     1553is.Get(dobj->mXmax);
     1554is.Get(dobj->mYmin);
     1555is.Get(dobj->mYmax);
     1556is.Get(dobj->mWBinx);
     1557is.Get(dobj->mWBiny);
     1558
     1559is.Get(&(dobj->mOver[0][0]),9);
    15471560
    15481561is.Get(projx);
     
    15541567
    15551568// Lecture histo2D
    1556 dobj->data = new float[dobj->nxy];
     1569dobj->mData = new r_8[dobj->mNxy];
    15571570is.GetLine(strg, 255);
    1558 {for(int j=0;j<dobj->ny;j++) is.Get(dobj->data+j*dobj->nx,dobj->nx);}
     1571{for(int_4 j=0;j<dobj->mNy;j++) is.Get(dobj->mData+j*dobj->mNx,dobj->mNx);}
    15591572
    15601573// Lecture erreurs
    15611574if(errok) {
    15621575  is.GetLine(strg, 255);
    1563   dobj->err2 = new double[dobj->nxy];
    1564   for(int j=0;j<dobj->ny;j++) is.Get(dobj->err2+j*dobj->nx,dobj->nx);
     1576  dobj->mErr2 = new r_8[dobj->mNxy];
     1577  for(int_4 j=0;j<dobj->mNy;j++) is.Get(dobj->mErr2+j*dobj->mNx,dobj->mNx);
    15651578}
    15661579
     
    15691582  is.GetLine(strg, 255);
    15701583  dobj->SetProjX();
    1571   ObjFileIO<Histo> fio_h(dobj->hprojx);
     1584  ObjFileIO<Histo> fio_h(dobj->mHprojx);
    15721585  fio_h.Read(is);
    15731586}
     
    15751588  is.GetLine(strg, 255);
    15761589  dobj->SetProjY();
    1577   ObjFileIO<Histo> fio_h(dobj->hprojy);
     1590  ObjFileIO<Histo> fio_h(dobj->mHprojy);
    15781591  fio_h.Read(is);
    15791592}
     
    15841597  dobj->SetSliX(nslix);
    15851598  ASSERT (nslix==dobj->NSliX());
    1586   for(int j=0;j<dobj->NSliX();j++)
     1599  for(int_4 j=0;j<dobj->NSliX();j++)
    15871600    {ObjFileIO<Histo> fio_h(dobj->HSliX(j)); fio_h.Read(is);}
    15881601}
     
    15911604  dobj->SetSliY(nsliy);
    15921605  ASSERT (nsliy==dobj->NSliY());
    1593   for(int j=0;j<dobj->NSliY();j++)
     1606  for(int_4 j=0;j<dobj->NSliY();j++)
    15941607    {ObjFileIO<Histo> fio_h(dobj->HSliY(j)); fio_h.Read(is);}
    15951608}
     
    15981611if( nbanx>0 ) {
    15991612  is.GetLine(strg, 255);
    1600   {for(int j=0; j<nbanx; j++) {
     1613  {for(int_4 j=0; j<nbanx; j++) {
    16011614    is.Get(min); is.Get(max);
    16021615    dobj->SetBandX(min,max);
    16031616  }}
    16041617  ASSERT (nbanx==dobj->NBandX());
    1605   {for(int j=0; j<dobj->NBandX(); j++) {
     1618  {for(int_4 j=0; j<dobj->NBandX(); j++) {
    16061619    ObjFileIO<Histo> fio_h(dobj->HBandX(j));
    16071620    fio_h.Read(is);
     
    16101623if( nbany>0 ) {
    16111624  is.GetLine(strg, 255);
    1612   {for(int j=0; j<nbany; j++) {
     1625  {for(int_4 j=0; j<nbany; j++) {
    16131626    is.Get(min); is.Get(max);
    16141627    dobj->SetBandY(min,max);
    16151628  }}
    16161629  ASSERT (nbany==dobj->NBandY());
    1617   {for(int j=0; j<dobj->NBandY(); j++) {
     1630  {for(int_4 j=0; j<dobj->NBandY(); j++) {
    16181631    ObjFileIO<Histo> fio_h(dobj->HBandY(j));
    16191632    fio_h.Read(is);
     
    16301643
    16311644// Que faut-il ecrire?
    1632 int_4 errok = (dobj->err2) ? 1 : 0;
    1633 int_4 projx = (dobj->hprojx) ? 1 : 0;
    1634 int_4 projy = (dobj->hprojy) ? 1 : 0;
     1645int_4 errok = (dobj->mErr2) ? 1 : 0;
     1646int_4 projx = (dobj->mHprojx) ? 1 : 0;
     1647int_4 projy = (dobj->mHprojy) ? 1 : 0;
    16351648int_4 nslix = dobj->NSliX();
    16361649int_4 nsliy = dobj->NSliY();
     
    16401653// Ecriture entete pour identifier facilement
    16411654sprintf(strg,"nx=%d  ny=%d  nxy=%d errok=%1d"
    1642        ,dobj->nx,dobj->ny,dobj->nxy,errok);
     1655       ,dobj->mNx,dobj->mNy,dobj->mNxy,errok);
    16431656os.PutLine(strg);
    16441657sprintf(strg,"nHist=%g nEntries=%d",dobj->nHist,dobj->nEntries);
    16451658os.PutLine(strg);
    1646 sprintf(strg,"wbinx=%g wbiny=%g",dobj->wbinx,dobj->wbiny);
     1659sprintf(strg,"wbinx=%g wbiny=%g",dobj->mWBinx,dobj->mWBiny);
    16471660os.PutLine(strg);
    16481661sprintf(strg,"xmin=%g xmax=%g ymin=%g ymax=%g"
    1649        ,dobj->xmin,dobj->xmax,dobj->ymin,dobj->ymax);
     1662       ,dobj->mXmin,dobj->mXmax,dobj->mYmin,dobj->mYmax);
    16501663os.PutLine(strg);
    16511664sprintf(strg,"projx/y=%d %d nbandx/y=%d %d nbslix/y=%d %d"
    16521665       ,projx,projy,nbanx,nbany,nslix,nsliy);
    16531666os.PutLine(strg);
    1654 sprintf(strg,"over %g %g %g %g %g %g %g %g %g"
    1655        ,dobj->over[0][0],dobj->over[0][1],dobj->over[0][2]
    1656        ,dobj->over[1][0],dobj->over[1][1],dobj->over[1][2]
    1657        ,dobj->over[2][0],dobj->over[2][1],dobj->over[2][2]);
     1667sprintf(strg,"mOver %g %g %g %g %g %g %g %g %g"
     1668       ,dobj->mOver[0][0],dobj->mOver[0][1],dobj->mOver[0][2]
     1669       ,dobj->mOver[1][0],dobj->mOver[1][1],dobj->mOver[1][2]
     1670       ,dobj->mOver[2][0],dobj->mOver[2][1],dobj->mOver[2][2]);
    16581671os.PutLine(strg);
    16591672
    16601673// Ecriture variables de definitions
    1661 os.Put(dobj->nx);
    1662 os.Put(dobj->ny);
    1663 os.Put(dobj->nxy);
     1674os.Put(dobj->mNx);
     1675os.Put(dobj->mNy);
     1676os.Put(dobj->mNxy);
    16641677os.Put(errok);
    16651678os.Put(dobj->nEntries);
    16661679os.Put(dobj->nHist);
    16671680
    1668 os.Put(dobj->xmin);
    1669 os.Put(dobj->xmax);
    1670 os.Put(dobj->ymin);
    1671 os.Put(dobj->ymax);
    1672 os.Put(dobj->wbinx);
    1673 os.Put(dobj->wbiny);
    1674 
    1675 os.Put(&(dobj->over[0][0]),9);
     1681os.Put(dobj->mXmin);
     1682os.Put(dobj->mXmax);
     1683os.Put(dobj->mYmin);
     1684os.Put(dobj->mYmax);
     1685os.Put(dobj->mWBinx);
     1686os.Put(dobj->mWBiny);
     1687
     1688os.Put(&(dobj->mOver[0][0]),9);
    16761689
    16771690os.Put(projx);
     
    16841697// Ecriture histo2D
    16851698sprintf(strg,"Histo2D: Tableau des donnees %d = %d * %d"
    1686        ,dobj->nxy,dobj->nx,dobj->ny);
     1699       ,dobj->mNxy,dobj->mNx,dobj->mNy);
    16871700os.PutLine(strg);
    1688 {for(int j=0;j<dobj->ny;j++) os.Put(dobj->data+j*dobj->nx,dobj->nx);}
     1701{for(int_4 j=0;j<dobj->mNy;j++) os.Put(dobj->mData+j*dobj->mNx,dobj->mNx);}
    16891702
    16901703// Ecriture erreurs
    16911704if(errok) {
    16921705  sprintf(strg,"Histo2D: Tableau des erreurs %d = %d * %d"
    1693          ,dobj->nxy,dobj->nx,dobj->ny);
     1706         ,dobj->mNxy,dobj->mNx,dobj->mNy);
    16941707  os.PutLine(strg);
    1695   for(int j=0;j<dobj->ny;j++) os.Put(dobj->err2+j*dobj->nx,dobj->nx);
     1708  for(int_4 j=0;j<dobj->mNy;j++) os.Put(dobj->mErr2+j*dobj->mNx,dobj->mNx);
    16961709}
    16971710
     
    17001713  sprintf(strg,"Histo2D: Projection X");
    17011714  os.PutLine(strg);
    1702   ObjFileIO<Histo> fio_h(dobj->hprojx); fio_h.Write(os);
     1715  ObjFileIO<Histo> fio_h(dobj->mHprojx); fio_h.Write(os);
    17031716}
    17041717if(projy) {
    17051718  sprintf(strg,"Histo2D: Projection Y");
    17061719  os.PutLine(strg);
    1707   ObjFileIO<Histo> fio_h(dobj->hprojy); fio_h.Write(os);
     1720  ObjFileIO<Histo> fio_h(dobj->mHprojy); fio_h.Write(os);
    17081721}
    17091722
     
    17121725  sprintf(strg,"Histo2D: Slices X %d",nslix);
    17131726  os.PutLine(strg);
    1714   for(int j=0;j<nslix;j++) {
     1727  for(int_4 j=0;j<nslix;j++) {
    17151728    Histo* h = dobj->HSliX(j);
    17161729    ObjFileIO<Histo> fio_h(h); fio_h.Write(os);
     
    17201733  sprintf(strg,"Histo2D: Slices Y %d",nsliy);
    17211734  os.PutLine(strg);
    1722   for(int j=0;j<nsliy;j++) {
     1735  for(int_4 j=0;j<nsliy;j++) {
    17231736    Histo* h = dobj->HSliY(j);
    17241737    ObjFileIO<Histo> fio_h(h); fio_h.Write(os);
     
    17311744  os.PutLine(strg);
    17321745  list<Histo2D::bande_slice>::const_iterator it;
    1733   for(it = dobj->lbandx.begin(); it != dobj->lbandx.end(); it++) {
    1734     float min = (*it).min; float max = (*it).max;
     1746  for(it = dobj->mLBandx.begin(); it != dobj->mLBandx.end(); it++) {
     1747    r_8 min = (*it).min; r_8 max = (*it).max;
    17351748    os.Put(min); os.Put(max);
    17361749  }
    1737   for(it = dobj->lbandx.begin(); it != dobj->lbandx.end(); it++) {
     1750  for(it = dobj->mLBandx.begin(); it != dobj->mLBandx.end(); it++) {
    17381751    Histo* h = (*it).H;
    17391752    ObjFileIO<Histo> fio_h(h); fio_h.Write(os);
     
    17441757  os.PutLine(strg);
    17451758  list<Histo2D::bande_slice>::const_iterator it;
    1746   for(it = dobj->lbandy.begin(); it != dobj->lbandy.end(); it++) {
    1747     float min = (*it).min; float max = (*it).max;
     1759  for(it = dobj->mLBandy.begin(); it != dobj->mLBandy.end(); it++) {
     1760    r_8 min = (*it).min; r_8 max = (*it).max;
    17481761    os.Put(min); os.Put(max);
    17491762  }
    1750   for(it = dobj->lbandy.begin(); it != dobj->lbandy.end(); it++) {
     1763  for(it = dobj->mLBandy.begin(); it != dobj->mLBandy.end(); it++) {
    17511764    Histo* h = (*it).H;
    17521765    ObjFileIO<Histo> fio_h(h); fio_h.Write(os);
  • trunk/SophyaLib/HiStats/histos2.h

    r1053 r1092  
    2828
    2929  // CREATOR / DESTRUCTOR
    30   Histo2D(float xMin, float xMax, int nxBin
    31          ,float yMin, float yMax, int nyBin);
     30  Histo2D(r_8 xMin,r_8 xMax,int_4 nxBin,r_8 yMin,r_8 yMax,int_4 nyBin);
     31  Histo2D(r_4 xMin,r_4 xMax,int_4 nxBin,r_4 yMin,r_4 yMax,int_4 nyBin);
    3232  Histo2D(const Histo2D& h);
    3333  Histo2D();
    34   virtual  ~Histo2D();
     34  virtual ~Histo2D();
    3535
    3636  // OPTIONS
    37   void   Errors(); 
     37  void Errors(); 
    3838 
    3939  // UPDATING
    40   void   Zero();
    41   void   Add(float x, float y, float w = 1.);
     40  void Zero();
     41  void Add(r_8 x, r_8 y, r_8 w = 1.);
    4242
    4343  // Operators
    4444  Histo2D& operator = (const Histo2D& h);
    45   Histo2D& operator *= (double b);
    46   Histo2D& operator /= (double b);
    47   Histo2D& operator += (double b);
    48   Histo2D& operator -= (double b);
     45  Histo2D& operator *= (r_8 b);
     46  Histo2D& operator /= (r_8 b);
     47  Histo2D& operator += (r_8 b);
     48  Histo2D& operator -= (r_8 b);
    4949  Histo2D& operator += (const Histo2D& a);
    5050  Histo2D& operator -= (const Histo2D& a);
     
    5858  void GetError2(TMatrix<r_8>& v);
    5959  void GetError(TMatrix<r_8>& v);
    60   void PutValue(TMatrix<r_8>& v, int ierr=0);
    61   void PutValueAdd(TMatrix<r_8>& v, int ierr=0);
     60  void PutValue(TMatrix<r_8>& v, int_4 ierr=0);
     61  void PutValueAdd(TMatrix<r_8>& v, int_4 ierr=0);
    6262  void PutError2(TMatrix<r_8>& v);
    6363  void PutError2Add(TMatrix<r_8>& v);
     
    6666  // INLINES
    6767  //! Retourne l'abscisse minimum.
    68   inline float   XMin() const {return xmin;}
     68  inline r_8 XMin() const {return mXmin;}
    6969  //! Retourne l'abscisse maximum.
    70   inline float   XMax() const {return xmax;}
     70  inline r_8 XMax() const {return mXmax;}
    7171  //! Retourne l'ordonnee minimum.
    72   inline float   YMin() const {return ymin;}
     72  inline r_8 YMin() const {return mYmin;}
    7373  //! Retourne l'ordonnee maximum.
    74   inline float   YMax() const {return ymax;}
     74  inline r_8 YMax() const {return mYmax;}
    7575  //! Retourne le nombre de bins selon X.
    76   inline int_4   NBinX() const {return nx;}
     76  inline int_4 NBinX() const {return mNx;}
    7777  //! Retourne le nombre de bins selon Y.
    78   inline int_4   NBinY() const {return ny;}
     78  inline int_4 NBinY() const {return mNy;}
    7979  //! Retourne la largeur du bin selon X.
    80   inline float   WBinX() const {return wbinx;}
     80  inline r_8 WBinX() const {return mWBinx;}
    8181  //! Retourne la largeur du bin selon Y.
    82   inline float   WBinY() const {return wbiny;}
     82  inline r_8 WBinY() const {return mWBiny;}
    8383  //! Retourne le pointeur sur le tableaux des contenus.
    84   inline float*  Bins() const  {return data;}
     84  inline r_8* Bins() const  {return mData;}
    8585  //! Retourne le contenu du bin i,j.
    86   inline float   operator()(int i,int j) const {return data[j*nx+i];}
     86  inline r_8 operator()(int_4 i,int_4 j) const {return mData[j*mNx+i];}
    8787  //! Remplit le contenu du bin i,j.
    88   inline float&  operator()(int i,int j)       {return data[j*nx+i];}
     88  inline r_8& operator()(int_4 i,int_4 j)      {return mData[j*mNx+i];}
    8989  //! retourne "true" si il y a des erreurs stoquees
    90   inline bool    HasErrors() { if(err2) return true; else return false;}
     90  inline bool HasErrors() { if(mErr2) return true; else return false;}
    9191  //! Retourne l'erreur du bin i,j.
    92   inline float   Error(int i,int j)  const
    93                    {if(err2)
    94                       {if(err2[j*nx+i]>0.) return sqrt(err2[j*nx+i]); else return 0.;}
    95                     else return 0.;}
     92  inline r_8 Error(int_4 i,int_4 j)  const
     93    {if(mErr2)
     94       {if(mErr2[j*mNx+i]>0.) return sqrt(mErr2[j*mNx+i]); else return 0.;}
     95     else return 0.;}
    9696  //! Remplit l'erreur au carre du bin i,j.
    97   inline double  Error2(int i,int j) const
    98                    {if(err2) return err2[j*nx+i]; else return 0.;}
     97  inline r_8 Error2(int_4 i,int_4 j) const
     98             {if(mErr2) return mErr2[j*mNx+i]; else return 0.;}
    9999  //! Remplit l'erreur au carre du bin i,j.
    100   inline double& Error2(int i,int j) {return err2[j*nx+i];}
     100  inline r_8& Error2(int_4 i,int_4 j) {return mErr2[j*mNx+i];}
    101101  //! Retourne la somme ponderee.
    102   inline float   NData() const    {return (float) nHist;}
     102  inline r_8 NData() const    {return nHist;}
    103103  //! Retourne le nombre d'entrees.
    104   inline int_4   NEntries() const {return nEntries;}
     104  inline int_4 NEntries() const {return nEntries;}
    105105  //! Retourne l'abscisse et l'ordonnee du coin inferieur du bin i,j.
    106   inline void BinLowEdge(int i,int j,float& x,float& y)
    107                  {x = xmin + i*wbinx; y = ymin + j*wbiny;}
     106  inline void BinLowEdge(int_4 i,int_4 j,r_8& x,r_8& y)
     107              {x = mXmin + i*mWBinx; y = mYmin + j*mWBiny;}
     108  //! Retourne l'abscisse et l'ordonnee du coin inferieur du bin i,j.
     109  inline void BinLowEdge(int_4 i,int_4 j,r_4& xf,r_4& yf)
     110              {r_8 x,y; BinLowEdge(i,j,x,y); xf=x; yf=y;}
    108111  //! Retourne l'abscisse et l'ordonnee du centre du bin i,j.
    109   inline void BinCenter(int i,int j,float& x,float& y)
    110                  {x = xmin + (i+0.5)*wbinx; y = ymin + (j+0.5)*wbiny;}
     112  inline void BinCenter(int_4 i,int_4 j,r_8& x,r_8& y)
     113              {x = mXmin + (i+0.5)*mWBinx; y = mYmin + (j+0.5)*mWBiny;}
     114  //! Retourne l'abscisse et l'ordonnee du centre du bin i,j.
     115  inline void BinCenter(int_4 i,int_4 j,r_4& xf,r_4& yf)
     116              {r_8 x,y; BinCenter(i,j,x,y); xf=x; yf=y;}
    111117  //! Retourne l'abscisse et l'ordonnee du coin superieur du bin i,j.
    112   inline void BinHighEdge(int i,int j,float& x,float& y)
    113                  {x = xmin + (i+1)*wbinx; y = ymin + (j+1)*wbiny;}
     118  inline void BinHighEdge(int_4 i,int_4 j,r_8& x,r_8& y)
     119              {x = mXmin + (i+1)*mWBinx; y = mYmin + (j+1)*mWBiny;}
     120  //! Retourne l'abscisse et l'ordonnee du coin superieur du bin i,j.
     121  inline void BinHighEdge(int_4 i,int_4 j,r_4& xf,r_4& yf)
     122              {r_8 x,y; BinHighEdge(i,j,x,y); xf=x; yf=y;}
    114123  //! Retourne les numeros du bin contenant l'abscisse et l'ordonnee x,y.
    115   inline void FindBin(float x,float y,int& i,int& j)
    116     { i = (int) floorf((x - xmin)/wbinx); j = (int) floorf((y - ymin)/wbiny);}
     124  inline void FindBin(r_8 x,r_8 y,int_4& i,int_4& j)
     125    {i=(int_4) floor((x-mXmin)/mWBinx); j=(int_4) floor((y-mYmin)/mWBiny);}
    117126
    118127  // Info, statistique et calculs sur les histogrammes
    119   float   NOver(int i=-1,int j=-1) const;
    120   int    BinNonNul() const;
    121   int    ErrNonNul() const;
    122   void    IJMax(int& imax,int& jmax,int il=1,int ih= -1,int jl=1,int jh= -1);
    123   void    IJMin(int& imax,int& jmax,int il=1,int ih= -1,int jl=1,int jh= -1);
    124   float   VMax(int il=1,int ih= -1,int jl=1,int jh= -1) const;
    125   float   VMin(int il=1,int ih= -1,int jl=1,int jh= -1) const;
    126   int     EstimeMax(float& xm,float& ym,int SzPav = 3
    127                    ,int il=1,int ih= -1,int jl=1,int jh= -1);
    128   int     EstimeMax(int im,int jm,float& xm,float& ym,int SzPav = 3);
    129   int     FindMax(int& im,int& jm,int SzPav = 3,float Dz = 0.
    130                  ,int il=1,int ih= -1,int jl=1,int jh= -1);
     128  r_8   NOver(int_4 i=-1,int_4 j=-1) const;
     129  int_4 BinNonNul() const;
     130  int_4 ErrNonNul() const;
     131  void IJMax(int_4& imax,int_4& jmax,int_4 il=1,int_4 ih= -1,int_4 jl=1,int_4 jh= -1);
     132  void IJMin(int_4& imax,int_4& jmax,int_4 il=1,int_4 ih= -1,int_4 jl=1,int_4 jh= -1);
     133  r_8 VMax(int_4 il=1,int_4 ih= -1,int_4 jl=1,int_4 jh= -1) const;
     134  r_8 VMin(int_4 il=1,int_4 ih= -1,int_4 jl=1,int_4 jh= -1) const;
     135  int_4 EstimeMax(r_8& xm,r_8& ym,int_4 SzPav = 3
     136                 ,int_4 il=1,int_4 ih= -1,int_4 jl=1,int_4 jh= -1);
     137  int_4 EstimeMax(int_4 im,int_4 jm,r_8& xm,r_8& ym,int_4 SzPav = 3);
     138  int_4 FindMax(int_4& im,int_4& jm,int_4 SzPav = 3,r_8 Dz = 0.
     139               ,int_4 il=1,int_4 ih= -1,int_4 jl=1,int_4 jh= -1);
    131140
    132141  // Fit
    133   int      Fit(GeneralFit& gfit,unsigned short typ_err=0);
    134   Histo2D  FitResidus(GeneralFit& gfit);
    135   Histo2D  FitFunction(GeneralFit& gfit);
     142  int_4   Fit(GeneralFit& gfit,unsigned short typ_err=0);
     143  Histo2D FitResidus(GeneralFit& gfit);
     144  Histo2D FitFunction(GeneralFit& gfit);
    136145
    137146  // Print et Display ASCII
    138   void    PrintStatus();
    139   void    Print(float min=1.,float max=-1.
    140                ,int il=1,int ih= -1,int jl=1,int jh= -1);
     147  void PrintStatus();
     148  void Print(r_8 min=1.,r_8 max=-1.
     149               ,int_4 il=1,int_4 ih= -1,int_4 jl=1,int_4 jh= -1);
    141150
    142151  // PROJECTIONS
    143   void           SetProjX();
    144   void           SetProjY();
    145   void           SetProj();
    146   void           DelProjX();
    147   void           DelProjY();
    148   void           DelProj();
    149   void           ZeroProjX();
    150   void           ZeroProjY();
    151   void           ZeroProj();
     152  void SetProjX();
     153  void SetProjY();
     154  void SetProj();
     155  void DelProjX();
     156  void DelProjY();
     157  void DelProj();
     158  void ZeroProjX();
     159  void ZeroProjY();
     160  void ZeroProj();
    152161  //! Retourne le pointeur sur l'histo 1D de la projection selon X.
    153   inline Histo*  HProjX() const {return hprojx;}
     162  inline Histo* HProjX() const {return mHprojx;}
    154163  //! Retourne le pointeur sur l'histo 1D de la projection selon Y.
    155   inline Histo*  HProjY() const {return hprojy;}
    156   void           ShowProj();
     164  inline Histo* HProjY() const {return mHprojy;}
     165  void ShowProj();
    157166
    158167  // BANDES
    159168  //! Retourne le nombre de bandes selon X
    160   inline int     NBandX() const {return lbandx.size();}
     169  inline int_4 NBandX() const {return mLBandx.size();}
    161170  //! Retourne le nombre de bandes selon Y
    162   inline int     NBandY() const {return lbandy.size();}
    163   int            SetBandX(float ybmin,float ybmax);
    164   int            SetBandY(float xbmin,float xbmax);
    165   void           DelBandX();
    166   void           DelBandY();
    167   void           ZeroBandX();
    168   void           ZeroBandY();
    169   Histo*         HBandX(int n) const;
    170   Histo*         HBandY(int n) const;
    171   void           GetBandX(int n,float& ybmin,float& ybmax) const;
    172   void           GetBandY(int n,float& xbmin,float& xbmax) const;
    173   void           ShowBand(int lp = 0);
     171  inline int_4 NBandY() const {return mLBandy.size();}
     172  int_4 SetBandX(r_8 ybmin,r_8 ybmax);
     173  int_4 SetBandY(r_8 xbmin,r_8 xbmax);
     174  void DelBandX();
     175  void DelBandY();
     176  void ZeroBandX();
     177  void ZeroBandY();
     178  Histo* HBandX(int_4 n) const;
     179  Histo* HBandY(int_4 n) const;
     180  void GetBandX(int_4 n,r_8& ybmin,r_8& ybmax) const;
     181  void GetBandY(int_4 n,r_8& xbmin,r_8& xbmax) const;
     182  void ShowBand(int_4 lp = 0);
    174183
    175184  // SLICES
    176185  //! Retourne le nombre de slices selon X
    177   inline int     NSliX() const {return lslix.size();}
     186  inline int_4 NSliX() const {return mLSlix.size();}
    178187  //! Retourne le nombre de slices selon Y
    179   inline int     NSliY() const {return lsliy.size();}
    180   int            SetSliX(int nsli);
    181   int            SetSliY(int nsli);
    182   void           DelSliX();
    183   void           DelSliY();
    184   void           ZeroSliX();
    185   void           ZeroSliY();
    186   Histo*         HSliX(int n) const;
    187   Histo*         HSliY(int n) const;
    188   void           ShowSli(int lp = 0);
     188  inline int_4 NSliY() const {return mLSliy.size();}
     189  int_4 SetSliX(int_4 nsli);
     190  int_4 SetSliY(int_4 nsli);
     191  void DelSliX();
     192  void DelSliY();
     193  void ZeroSliX();
     194  void ZeroSliY();
     195  Histo* HSliX(int_4 n) const;
     196  Histo* HSliY(int_4 n) const;
     197  void ShowSli(int_4 lp = 0);
    189198
    190199#ifndef __DECCXX
     
    193202  //! structure de definition des bandes
    194203  struct bande_slice {
    195     int num;   //!< nombre de bandes
    196     float min; //!< limite minimum pour remplir la bande
    197     float max; //!< limite maximum pour remplir la bande
    198     Histo* H;  //!< pointer sur l Histo 1D de la bande
     204    int_4 num;   //!< nombre de bandes
     205    r_8 min;    //!< limite minimum pour remplir la bande
     206    r_8 max;    //!< limite maximum pour remplir la bande
     207    Histo* H;    //!< pointer sur l Histo 1D de la bande
    199208    STRUCTCOMP(bande_slice)
    200209  };
     
    205214  void Delete();
    206215
    207   float*         data; //!< donnees
    208   double*        err2; //!< erreurs carrees
    209 
    210   float          over[3][3]; //!< overflow table
    211   double         nHist;      //!< somme ponderee des entrees
    212   int_4          nEntries;   //!< nombre d'entrees
    213 
    214   int_4          nx;    //!< nombre de bins en X
    215   int_4          ny;    //!< nombre de bins en Y
    216   int_4          nxy;   //!< nombre de bins total
    217   float          xmin;  //!< abscisse minimum
    218   float          xmax;  //!< abscisse maximum
    219   float          ymin;  //!< ordonnee minimum
    220   float          ymax;  //!< ordonnee maximum
    221   float          wbinx; //!< largeur du bin en X
    222   float          wbiny; //!< largeur du bin en Y
    223 
    224   bande_slice    b_s;
    225 
    226   Histo*         hprojx; //!< pointer sur Histo des proj X
    227   Histo*         hprojy; //!< pointer sur Histo des proj Y
    228 
    229   list<bande_slice>  lbandx; //!< liste des bandes selon X
    230   list<bande_slice>  lbandy; //!< liste des bandes selon Y
     216  r_8*        mData; //!< donnees
     217  r_8*        mErr2; //!< erreurs carrees
     218
     219  r_8         mOver[3][3]; //!< overflow table
     220  r_8         nHist;       //!< somme ponderee des entrees
     221  int_4       nEntries;    //!< nombre d'entrees
     222
     223  int_4       mNx;    //!< nombre de bins en X
     224  int_4       mNy;    //!< nombre de bins en Y
     225  int_4       mNxy;   //!< nombre de bins total
     226  r_8         mXmin;  //!< abscisse minimum
     227  r_8         mXmax;  //!< abscisse maximum
     228  r_8         mYmin;  //!< ordonnee minimum
     229  r_8         mYmax;  //!< ordonnee maximum
     230  r_8         mWBinx; //!< largeur du bin en X
     231  r_8         mWBiny; //!< largeur du bin en Y
     232
     233  bande_slice mB_s;
     234
     235  Histo*      mHprojx; //!< pointer sur Histo des proj X
     236  Histo*      mHprojy; //!< pointer sur Histo des proj Y
     237
     238  list<bande_slice>  mLBandx; //!< liste des bandes selon X
     239  list<bande_slice>  mLBandy; //!< liste des bandes selon Y
    231240 
    232   list<bande_slice>  lslix; //!< liste des slices selon X
    233   list<bande_slice>  lsliy; //!< liste des slices selon Y
     241  list<bande_slice>  mLSlix; //!< liste des slices selon X
     242  list<bande_slice>  mLSliy; //!< liste des slices selon Y
    234243
    235244};
     
    250259// ObjFileIO<Histo2D>
    251260
    252 /*! \ingroup HiStats \fn operator*(const Histo2D&,double)
     261/*! \ingroup HiStats \fn operator*(const Histo2D&,r_8)
    253262  \brief Operateur H2 = H1 * b */
    254 inline Histo2D operator * (const Histo2D& a, double b)
     263inline Histo2D operator * (const Histo2D& a, r_8 b)
    255264{
    256265  Histo2D result(a);
     
    258267}
    259268
    260 /*! \ingroup HiStats \fn operator*(double,const Histo2D&)
     269/*! \ingroup HiStats \fn operator*(r_8,const Histo2D&)
    261270  \brief Operateur H2 = b * H1 */
    262 inline Histo2D operator * (double b, const Histo2D& a)
     271inline Histo2D operator * (r_8 b, const Histo2D& a)
    263272{
    264273  Histo2D result(a);
     
    266275}
    267276
    268 /*! \ingroup HiStats \fn operator/(const Histo2D&,double)
     277/*! \ingroup HiStats \fn operator/(const Histo2D&,r_8)
    269278  \brief Operateur H2 = H1 / b */
    270 inline Histo2D operator / (const Histo2D& a, double b)
     279inline Histo2D operator / (const Histo2D& a, r_8 b)
    271280{
    272281  Histo2D result(a);
     
    274283}
    275284
    276 /*! \ingroup HiStats \fn operator+(const Histo2D&,double)
     285/*! \ingroup HiStats \fn operator+(const Histo2D&,r_8)
    277286  \brief Operateur H2 = H1 + b */
    278 inline Histo2D operator + (const Histo2D& a, double b)
     287inline Histo2D operator + (const Histo2D& a, r_8 b)
    279288{
    280289  Histo2D result(a);
     
    282291}
    283292
    284 /*! \ingroup HiStats \fn operator+(double,const Histo2D&)
     293/*! \ingroup HiStats \fn operator+(r_8,const Histo2D&)
    285294  \brief Operateur H2 = b + H1 */
    286 inline Histo2D operator + (double b, const Histo2D& a)
     295inline Histo2D operator + (r_8 b, const Histo2D& a)
    287296{
    288297  Histo2D result(a);
     
    290299}
    291300
    292 /*! \ingroup HiStats \fn operator-(const Histo2D&,double)
     301/*! \ingroup HiStats \fn operator-(const Histo2D&,r_8)
    293302  \brief Operateur H2 = H1 - b */
    294 inline Histo2D operator - (const Histo2D& a, double b)
     303inline Histo2D operator - (const Histo2D& a, r_8 b)
    295304{
    296305  Histo2D result(a);
     
    298307}
    299308
    300 /*! \ingroup HiStats \fn operator-(double,const Histo2D&)
     309/*! \ingroup HiStats \fn operator-(r_8,const Histo2D&)
    301310  \brief Operateur H2 = b - H1 */
    302 inline Histo2D operator - (double b, const Histo2D& a)
     311inline Histo2D operator - (r_8 b, const Histo2D& a)
    303312{
    304313  Histo2D result(a);
  • trunk/SophyaLib/HiStats/ntuple.cc

    r1046 r1092  
    324324for(i=0; i<mNVar; i++) {
    325325  GetMinMax(i, min, max);
    326   sprintf(buff, "%3d  %16s  %10lg  %10lg \n", i, mNames+i*LENNAME1, min, max);
     326  sprintf(buff, "%3d  %16s  %10g  %10g \n", i, mNames+i*LENNAME1, min, max);
    327327  os << (string)buff ;
    328328  }
  • trunk/SophyaLib/NTools/cimage.cc

    r490 r1092  
    55// LAL (Orsay) / IN2P3-CNRS  DAPNIA/SPP (Saclay) / CEA
    66
    7 // $Id: cimage.cc,v 1.5 1999-10-21 15:25:42 ansari Exp $       
     7// $Id: cimage.cc,v 1.6 2000-07-26 13:15:29 ansari Exp $       
    88
    99
     
    723723// redimensionnement de l'histo pour avoir une bonne signification stat.
    724724for(;;) {
    725   float max1,max2;
    726   int imax1,imax2;
     725  r_8 max1,max2;
     726  int_4 imax1,imax2;
    727727  rc = H.MaxiLocal(max1,imax1,max2,imax2);
    728728  float rap = 1.;
     
    742742
    743743TRY {
    744   xbmax = H.FitMax(2,0.5f,deb-2);
     744  xbmax = H.FitMax(2,0.5,deb-2);
    745745  if(deb>1) cout<<"H.FitMax = "<<xbmax<<endl;
    746746} CATCHALL {
     
    750750
    751751TRY {
    752   float sdroit = -2.;
    753   H.EstimeWidthS(0.5f,sgbmax,sdroit);
    754   if(sgbmax<=0.) sgbmax = H.FindWidth(0.5f,deb-2);
    755   sgbmax /= 2.36;
     752  r_8 sdroit = -2., dum=sgbmax;
     753  H.EstimeWidthS(0.5,dum,sdroit);
     754  if(dum<=0.) dum = H.FindWidth(0.5,deb-2);
     755  dum /= 2.36;
     756  sgbmax = dum;
    756757  if(deb>1) cout<<"H.FindWidth = "<<sgbmax<<" (droit="<<sdroit<<")"<<endl;
    757758} CATCHALL {
  • trunk/SophyaLib/NTools/perandom.cc

    r244 r1092  
    1515
    1616//++
    17 FunRan::FunRan(FunRan::Func f, float xMin, float xMax, int nBin)
     17FunRan::FunRan(FunRan::Func f, r_8 xMin, r_8 xMax, int_4 nBin)
    1818//
    1919//      Createur.
     
    2222{
    2323  (*this)(0) = f(BinLowEdge(0));
    24   for(int i=1; i<nBin; i++)
     24  for(int_4 i=1; i<nBin; i++)
    2525    (*this)(i) = (*this)(i-1) + f(BinLowEdge(i));
    2626   
    27   for(int j=0; j<nBin; j++)
     27  for(int_4 j=0; j<nBin; j++)
    2828    (*this)(j) /= (*this)(nBin-1);
    2929  END_CONSTRUCTOR
     
    3131
    3232//++
    33 FunRan::FunRan(double *tab, int nBin)
    34 //
    35 //      Createur.
    36 //--
    37 : Histo(0, (float)(nBin), nBin)
     33FunRan::FunRan(r_8 *tab, int_4 nBin)
     34//
     35//      Createur.
     36//--
     37: Histo(0, (r_8)(nBin), nBin)
    3838{
    3939  (*this)(0) = tab[0];
    40   for(int i=1; i<nBin; i++)
     40  for(int_4 i=1; i<nBin; i++)
    4141    (*this)(i) = (*this)(i-1) + tab[i];
    4242
     
    4646  }
    4747
    48   for(int j=0; j<nBin; j++)
     48  for(int_4 j=0; j<nBin; j++)
    4949    (*this)(j) /= (*this)(nBin-1);
    5050  END_CONSTRUCTOR
    5151}
    5252
    53 FunRan::FunRan(double *tab, int nBin, float xMin, float xMax)
     53FunRan::FunRan(r_8 *tab, int_4 nBin, r_8 xMin, r_8 xMax)
    5454: Histo(xMin, xMax, nBin)
    5555{
    5656  (*this)(0) = tab[0];
    57   for(int i=1; i<nBin; i++)
     57  for(int_4 i=1; i<nBin; i++)
    5858    (*this)(i) = (*this)(i-1) + tab[i];
    5959
     
    6363  }
    6464
    65   for(int j=0; j<nBin; j++)
     65  for(int_4 j=0; j<nBin; j++)
    6666    (*this)(j) /= (*this)(nBin-1);
    6767  END_CONSTRUCTOR
     
    6969
    7070//++
    71 int FunRan::BinRandom()
     71int_4 FunRan::BinRandom()
    7272//
    7373//      Tirage avec retour du numero de bin.
    7474//--
    7575{
    76   double z=drand01();
     76  r_8 z=drand01();
    7777  if (z <= 0) return 0;
    78   if (z >= 1) return bins-1;
     78  if (z >= 1) return mBins-1;
    7979 
    8080  // recherche du premier bin plus grand que z
    81   int iBin = 0;
    82   for (; iBin<bins; iBin++)
     81  int_4 iBin = 0;
     82  for (; iBin<mBins; iBin++)
    8383    if (z < (*this)(iBin)) break;
    8484
     
    8787
    8888//++
    89 double FunRan::Random()
     89r_8 FunRan::Random()
    9090//
    9191//      Tirage avec retour abscisse du bin interpole.
    9292//--
    9393{
    94   double z=drand01();
    95   if (z <= 0) return min;
    96   if (z >= 1) return max;
     94  r_8 z=drand01();
     95  if (z <= 0) return mMin;
     96  if (z >= 1) return mMax;
    9797  // cas z <= tab[0]
    9898  if (z <= (*this)(0)) {
    99     double t = min + binWidth/(*this)(0) * z;
     99    r_8 t = mMin + binWidth/(*this)(0) * z;
    100100    return t;
    101101  }
    102102
    103103  // recherche du premier bin plus grand que z
    104   int iBin = 0;
    105   for (; iBin<bins; iBin++)
     104  int_4 iBin = 0;
     105  for (; iBin<mBins; iBin++)
    106106    if (z < (*this)(iBin)) break;
    107107
    108108  // interpolation pour trouver la valeur du tirage aleatoire
    109   double t1 = (*this)(iBin-1);
    110   double x1 = BinLowEdge(iBin-1);
    111   double t2 = (*this)(iBin);
    112   double x2 = x1 + binWidth;
    113   double t = x1 + (x2-x1) / (t2-t1) * (z-t1);
    114   if (t < min) t = min;
    115   if (t > max) t = max;
     109  r_8 t1 = (*this)(iBin-1);
     110  r_8 x1 = BinLowEdge(iBin-1);
     111  r_8 t2 = (*this)(iBin);
     112  r_8 x2 = x1 + binWidth;
     113  r_8 t = x1 + (x2-x1) / (t2-t1) * (z-t1);
     114  if (t < mMin) t = mMin;
     115  if (t > mMax) t = mMax;
    116116  return(t);
    117117}
     
    129129
    130130//++
    131 FunRan2D::FunRan2D(double *tab, int nBinX, int nBinY)
     131FunRan2D::FunRan2D(r_8 *tab, int_4 nBinX, int_4 nBinY)
    132132//
    133133//      Createur.
     
    135135{
    136136  // Tirage en X, somme sur les Y.
    137    double* tabX = new double[nBinX];
    138    for (int i=0; i<nBinX; i++) {
     137   r_8* tabX = new r_8[nBinX];
     138   for (int_4 i=0; i<nBinX; i++) {
    139139     tabX[i] = 0;
    140      for (int j=0; j<nBinY; j++) {
     140     for (int_4 j=0; j<nBinY; j++) {
    141141       tabX[i] += tab[i*nBinY +j];
    142142     }
     
    147147   ranY = new(FunRan*[nBinX]);
    148148   
    149    for (int k=0; k<nBinX; k++)
     149   for (int_4 k=0; k<nBinX; k++)
    150150      ranY[k] = new FunRan(tab + nBinY*k, nBinY);
    151151   
     
    155155
    156156//++
    157 FunRan2D::FunRan2D(double **tab, int nBinX, int nBinY)
     157FunRan2D::FunRan2D(r_8 **tab, int_4 nBinX, int_4 nBinY)
    158158//
    159159//      Createur.
     
    161161{
    162162  // Tirage en X, somme sur les Y.
    163    double* tabX = new double[nBinX];
    164    for (int i=0; i<nBinX; i++) {
     163   r_8* tabX = new r_8[nBinX];
     164   for (int_4 i=0; i<nBinX; i++) {
    165165     tabX[i] = 0;
    166      for (int j=0; j<nBinY; j++) {
     166     for (int_4 j=0; j<nBinY; j++) {
    167167       tabX[i] += tab[i][j];
    168168     }
     
    172172   ranY = new(FunRan*[nBinX]);
    173173   
    174    for (int k=0; k<nBinX; k++)
     174   for (int_4 k=0; k<nBinX; k++)
    175175    if (tabX[k] != 0)
    176176      ranY[k] = new FunRan(tab[k], nBinY);
     
    184184FunRan2D::~FunRan2D()
    185185{
    186   for (int i=nx-1; i>=0; i--)
     186  for (int_4 i=nx-1; i>=0; i--)
    187187    delete ranY[i];
    188188   
     
    193193
    194194//++
    195 void FunRan2D::BinRandom(int& x, int& y)
     195void FunRan2D::BinRandom(int_4& x, int_4& y)
    196196//
    197197//      Tirage avec retour du numeros de bin.
     
    204204
    205205//++
    206 void FunRan2D::Random(double& x, double& y)
     206void FunRan2D::Random(r_8& x, r_8& y)
    207207//
    208208//      Tirage avec retour abscisse et ordonnee
     
    211211{
    212212  x = ranX->Random();
    213   int i = int(ceil(x));
     213  int_4 i = int_4(ceil(x));
    214214  //  FAILNIL(ranY[i]);  Ne compile pas $CHECK$ Reza 22/04/99
    215215  y = ranY[i]->Random();
  • trunk/SophyaLib/NTools/perandom.h

    r244 r1092  
    1313class FunRan : public Histo {
    1414public:
    15   typedef double (*Func)(double);
    16   FunRan(Func f, float xMin=0.0, float xMax=1.0, int nBin=100);
    17   FunRan(double *tab, int nBin);
    18   FunRan(double *tab, int nBin, float xMin, float xMax);
    19   void IFunRan(double *tab, int nBin);
    20   double Random(void);
    21   int BinRandom(void);
     15  typedef r_8 (*Func)(r_8);
     16  FunRan(Func f, r_8 xMin=0.0, r_8 xMax=1.0, int_4 nBin=100);
     17  FunRan(r_8 *tab, int_4 nBin);
     18  FunRan(r_8 *tab, int_4 nBin, r_8 xMin, r_8 xMax);
     19  void IFunRan(r_8 *tab, int_4 nBin);
     20  r_8 Random(void);
     21  int_4 BinRandom(void);
    2222};
    2323
    2424class FunRan2D EXC_AWARE {
    2525public:
    26 //  typedef double (*Func)(double, double);
    27 //  FunRan2D(Func f, float xMin=0.0, float xMax=1.0, int nBinX=100,
    28 //                   float yMin=0.0, float yMax=1.0, int nBinY=100);
    29   FunRan2D(double *tab, int nBinX, int nBinY);
    30   FunRan2D(double **tab, int nBinX, int nBinY);
     26//  typedef r_8 (*Func)(r_8, r_8);
     27//  FunRan2D(Func f, r_8 xMin=0.0, r_8 xMax=1.0, int_4 nBinX=100,
     28//                   r_8 yMin=0.0, r_8 yMax=1.0, int_4 nBinY=100);
     29  FunRan2D(r_8 *tab, int_4 nBinX, int_4 nBinY);
     30  FunRan2D(r_8 **tab, int_4 nBinX, int_4 nBinY);
    3131  ~FunRan2D();
    32   void Random(double& x, double& y);
    33   void BinRandom(int& x, int& y);
     32  void Random(r_8& x, r_8& y);
     33  void BinRandom(int_4& x, int_4& y);
    3434private:
    3535  FunRan* ranX;
    3636  FunRan** ranY;
    37   int nx;
     37  int_4 nx;
    3838};
    3939
Note: See TracChangeset for help on using the changeset viewer.