Changeset 3123 in Sophya for trunk/SophyaLib/HiStats/histerr.cc


Ignore:
Timestamp:
Jan 10, 2007, 12:53:57 PM (19 years ago)
Author:
cmv
Message:

modif HistoErr Histo2DErr cmv 10/01/07

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/SophyaLib/HiStats/histerr.cc

    r3057 r3123  
    44#include <stdio.h>
    55#include <math.h>
    6 #include "histinit.h"
     6#include "perrors.h"
     7#include "fioarr.h"
    78#include "histerr.h"
    8 #include "perrors.h"
    99
    1010/*!
     
    1717/*! Constructeur par defaut */
    1818HistoErr::HistoErr(void)
    19 : Histo(), mNData(NULL), mCorrel(0)
    20 {
    21 }
    22 
    23 /********* Methode *********/
    24 /*! Constructeur d'un histo de nBin bins allant de xMin a xMax */
    25 HistoErr::HistoErr(r_8 xMin, r_8 xMax, int_4 nBin)
    26 : Histo(), mNData(NULL)
    27 {
    28   CreateOrResize(xMin,xMax,nBin);
     19: xmin_(1.), xmax_(-1.), nx_(0), dx_(0.)
     20, mCorrel(0)
     21{
     22}
     23
     24/********* Methode *********/
     25/*! Constructeur d'un histo */
     26HistoErr::HistoErr(r_8 xmin,r_8 xmax,int_4 nx)
     27: mCorrel(0)
     28{
     29  CreateOrResize(xmin,xmax,nx);
    2930}
    3031
     
    3233/*! Constructeur par copie */
    3334HistoErr::HistoErr(const HistoErr& H)
    34 : Histo(H), mNData((H.mBins>0)? new r_8[H.mBins] : NULL), mCorrel(H.mCorrel)
    35 {
    36  if(mNData>0) memcpy(mNData,H.mNData,mBins*sizeof(r_8));
     35: mCorrel(H.mCorrel)
     36{
     37 if(H.nx_<=0) return;
     38 CreateOrResize(H.xmin_,H.xmax_,H.nx_);
     39 data_  = H.data_;
     40 err2_  = H.err2_;
     41 ndata_ = H.ndata_;
    3742}
    3843
     
    4146HistoErr::~HistoErr(void)
    4247{
    43  Delete();
     48 mCorrel = 0;
    4449}
    4550
    4651/********* Methode *********/
    4752/*! Gestion de l'allocation */
    48 void HistoErr::CreateOrResize(r_8 xMin, r_8 xMax, int_4 nBin)
    49 {
    50   //cout<<"HistoErr::CreateOrResize()"<<endl;
    51   bool samelen = (nBin==mBins)? true: false;
    52   Histo::CreateOrResize(xMin,xMax,nBin);
    53   Histo::Errors();
    54   if(mNData!=NULL && !samelen) {delete [] mNData; mNData=NULL;}
    55   if(nBin>0 && mNData==NULL) mNData = new r_8[nBin];
    56   if(mNData) memset(mNData,0,nBin*sizeof(r_8));
     53void HistoErr::CreateOrResize(r_8 xmin,r_8 xmax,int_4 nx)
     54{
     55  xmin_ = xmin; xmax_ = xmax; nx_ = nx; dx_=0.;
     56  if(nx_>0) {
     57    data_.ReSize(nx_);  data_ = 0.;
     58    err2_.ReSize(nx_);  err2_ = 0.;
     59    ndata_.ReSize(nx_); ndata_ = 0.;
     60    dx_ = (xmax_-xmin_)/nx_;
     61  }
    5762  mCorrel = 0;
    5863}
    5964
    6065/********* Methode *********/
    61 /*! Delete des tableaux */
    62 void HistoErr::Delete(void)
    63 {
    64   //cout<<"HistoErr::Delete()"<<endl;
    65   Histo::Delete();
    66   if(mNData) {delete [] mNData; mNData=NULL;}
    67   mCorrel = 0;
    68 }
    69 
    70 /********* Methode *********/
    7166/*!
    7267  Remise a zero
     
    7469void HistoErr::Zero(void)
    7570{
    76   Histo::Zero();
    77   if(mNData) memset(mNData,0,mBins*sizeof(r_8));
    78   mCorrel = 0;
    79 }
    80 
    81 /********* Methode *********/
    82 /*!
    83  Remplissage du contenu de l'histo pour le bin numBin poids w et l'erreur e
    84 */
    85 void HistoErr::SetBin(int_4 numBin, r_8 w, r_8 e, r_8 nb)
    86 {
    87 Histo::SetBin(numBin,w);
    88 Histo::SetErr2(numBin,e*e);
    89 SetNentB(numBin,nb);
    90 return;
    91 }
    92 
    93 /********* Methode *********/
    94 /*!
    95  Remplissage nombre d'entrees pour le bin numBin
    96 */
    97 void HistoErr::SetNentB(int_4 numBin, r_8 nb)
    98 {
    99  if(numBin>=0 && numBin<mBins) mNData[numBin] = nb;
    100 return;
    101 }
    102 
    103 /*!
    104   Remplissage d'un tableau avec les nombres d'entrees dans le bin de l'histo
    105 */
    106 void HistoErr::GetNBin(TVector<r_8>& v) const
    107 {
    108 v.Realloc(mBins);
    109 for(int_4 i=0;i<mBins;i++) v(i) = mNData[i];
    110 return;
    111 }
    112 
    113 /********* Methode *********/
    114 /*!
    115   Remplissage du nombre d'entrees dans les bins de l'histo avec les valeurs d'un vecteur
    116 */
    117 void HistoErr::PutNBin(TVector<r_8> &v)
    118 {
    119 int_4 n = (v.NElts()<mBins) ? v.NElts(): mBins;
    120 if(n>0) for(int_4 i=0;i<n;i++) mNData[i] = v(i);
    121 return;
     71 if(nx_<=0) return;
     72 data_ = 0.;
     73 err2_ = 0.;
     74 ndata_ = 0.;
     75}
     76
     77/********* Methode *********/
     78/*!
     79 Recompute XMin (and XMax so that
     80 the CENTER of the first bin is exactly XMin and
     81 the CENTER of the last bin is exactly XMax.
     82 Remember that otherwise
     83 XMin is the beginning of the first bin
     84 and XMax is the end of the last bin
     85*/
     86void HistoErr::ReCenterBin(void)
     87{
     88 if(nx_<=1) return;
     89 double dx = (xmax_-xmin_)/(nx_-1);
     90 xmin_ -= dx/2.;
     91 xmax_ += dx/2.;
     92 dx_ = (xmax_-xmin_)/nx_;
    12293}
    12394
     
    132103void HistoErr::ToCorrel(void)
    133104{
    134  if(mBins<1) return;
     105 if(nx_<1) return;
    135106 mCorrel++;
    136  for(int_4 i=0;i<mBins;i++) {
    137    if(mNData[i]<1.) continue;
    138    mData[i] /= mNData[i];
    139    mErr2[i] /= mNData[i];
     107 for(int_4 i=0;i<nx_;i++) {
     108   if(ndata_(i)<1.) continue;
     109   data_(i) /= ndata_(i);
     110   err2_(i) /= ndata_(i);
    140111 }
    141112 return;
     
    148119void HistoErr::FromCorrel(void)
    149120{
    150  if(mBins<1) return;
     121 if(nx_<1) return;
    151122 mCorrel--;
    152  for(int_4 i=0;i<mBins;i++) {
    153    if(mNData[i]<1.) continue;
    154    mData[i] *= mNData[i];
    155    mErr2[i] *= mNData[i];
     123 for(int_4 i=0;i<nx_;i++) {
     124   if(ndata_(i)<1.) continue;
     125   data_(i) *= ndata_(i);
     126   err2_(i) *= ndata_(i);
    156127 }
    157128 return;
     
    164135void HistoErr::FillFrHErr(HistoErr& hfrom)
    165136{
    166  if(mBins<=0) return;
    167  if(hfrom.mBins<=0) return;
     137 if(nx_<=0) return;
     138 if(hfrom.nx_<=0) return;
    168139
    169140 Zero();
    170141
    171  for(int_4 i=0;i<hfrom.mBins;i++) {
    172    int numBin = FindBin(hfrom.BinCenter(i));
    173    if(numBin<0) mUnder += hfrom.mData[i];
    174    else if(numBin>=mBins) mOver += hfrom.mData[i];
    175    else {
    176      mData[numBin]  += hfrom.mData[i];
    177      mNData[numBin] += hfrom.mNData[i];
    178      mErr2[numBin]  += hfrom.mErr2[i];
    179      nHist          += hfrom.mData[i];
    180      nEntries++;
    181    }
     142 for(int_4 i=0;i<hfrom.nx_;i++) {
     143   r_8 x = hfrom.BinCenter(i);
     144   int ii = FindBin(x);
     145   if(ii<0 || ii>=nx_) continue;
     146   data_(ii)  += hfrom.data_(ii);
     147   err2_(ii)  += hfrom.err2_(ii);
     148   ndata_(ii) += hfrom.ndata_(ii);
    182149 }
    183150 mCorrel = hfrom.mCorrel;
     
    192159{
    193160  if(this==&h) return *this;
    194   CreateOrResize(h.mMin,h.mMax,h.mBins);
    195   if(mData) memcpy(mData,h.mData,mBins*sizeof(r_8));
    196   if(mErr2) memcpy(mErr2,h.mErr2,mBins*sizeof(r_8));
    197   mUnder = h.mUnder; mOver = h.mOver;
    198   nHist = h.nHist; nEntries = h.nEntries;
    199   if(mNData) memcpy(mNData,h.mNData,mBins*sizeof(r_8));
     161  CreateOrResize(h.xmin_,h.xmax_,h.nx_);
     162  data_  = h.data_;
     163  err2_  = h.err2_;
     164  ndata_ = h.ndata_;
    200165  mCorrel = h.mCorrel;
    201 
    202166  return *this;
    203167}
     
    209173void HistoErr::Show(ostream & os) const
    210174{
    211   Histo::Show(os);
    212   os <<"       ncorrel="<<mCorrel<< endl;
     175  os <<"HistoErr(ncorrel="<<mCorrel<<")"<<endl
     176     <<"          nx="<<nx_<<" ["<<xmin_<<","<<xmax_<<"] dx="<<dx_<<endl;
    213177}
    214178
     
    224188string strg;
    225189
    226 if(dobj==NULL) dobj=new HistoErr;
    227   else         dobj->Delete();
     190if(dobj==NULL) dobj = new HistoErr;
    228191
    229192// Lecture entete
     
    233196is.Get(dobj->mCorrel);
    234197
    235 // Lecture des donnees HistoErr
    236 is.Get(dobj->mBins);
    237 if(dobj->mBins>0) dobj->mNData = new r_8[dobj->mBins];
    238 is.Get(dobj->mNData, dobj->mBins);
    239 
    240 // Lecture de l'histogramme
    241 is >> (Histo&)(*dobj);
     198// Lecture des parametres HistoErr
     199is.Get(dobj->xmin_);
     200is.Get(dobj->xmax_);
     201is.Get(dobj->nx_);
     202is.Get(dobj->dx_);
     203
     204// Lecture des donnees
     205if(dobj->nx_>0) {
     206  is >> dobj->data_;
     207  is >> dobj->err2_;
     208  is >> dobj->ndata_;
     209}
    242210
    243211return;
     
    257225os.Put(dobj->mCorrel);
    258226
    259 // Ecriture des valeurs
    260 os.Put(dobj->mBins);
    261 
    262 // Ecriture des donnees HistoErr nombre d entree par bin
    263 os.Put(dobj->mNData, dobj->mBins);
    264 
    265 // Ecriture de l'histogramme
    266 os << (Histo&)(*dobj);
     227// Ecriture des parametres HistoErr
     228os.Put(dobj->xmin_);
     229os.Put(dobj->xmax_);
     230os.Put(dobj->nx_);
     231os.Put(dobj->dx_);
     232
     233// Ecriture des donnees
     234if(dobj->nx_>0) {
     235  os << dobj->data_;
     236  os << dobj->err2_;
     237  os << dobj->ndata_;
     238}
    267239
    268240return;
Note: See TracChangeset for help on using the changeset viewer.