Changeset 1092 in Sophya for trunk/SophyaLib/HiStats/histos.cc


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

File:
1 edited

Legend:

Unmodified
Added
Removed
  • 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
Note: See TracChangeset for help on using the changeset viewer.