Changeset 3123 in Sophya for trunk/SophyaLib/HiStats/histerr.cc
- Timestamp:
- Jan 10, 2007, 12:53:57 PM (19 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/SophyaLib/HiStats/histerr.cc
r3057 r3123 4 4 #include <stdio.h> 5 5 #include <math.h> 6 #include "histinit.h" 6 #include "perrors.h" 7 #include "fioarr.h" 7 8 #include "histerr.h" 8 #include "perrors.h"9 9 10 10 /*! … … 17 17 /*! Constructeur par defaut */ 18 18 HistoErr::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 */ 26 HistoErr::HistoErr(r_8 xmin,r_8 xmax,int_4 nx) 27 : mCorrel(0) 28 { 29 CreateOrResize(xmin,xmax,nx); 29 30 } 30 31 … … 32 33 /*! Constructeur par copie */ 33 34 HistoErr::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_; 37 42 } 38 43 … … 41 46 HistoErr::~HistoErr(void) 42 47 { 43 Delete();48 mCorrel = 0; 44 49 } 45 50 46 51 /********* Methode *********/ 47 52 /*! Gestion de l'allocation */ 48 void HistoErr::CreateOrResize(r_8 x Min, 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));53 void 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 } 57 62 mCorrel = 0; 58 63 } 59 64 60 65 /********* 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 *********/71 66 /*! 72 67 Remise a zero … … 74 69 void HistoErr::Zero(void) 75 70 { 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 */ 86 void 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_; 122 93 } 123 94 … … 132 103 void HistoErr::ToCorrel(void) 133 104 { 134 if( mBins<1) return;105 if(nx_<1) return; 135 106 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); 140 111 } 141 112 return; … … 148 119 void HistoErr::FromCorrel(void) 149 120 { 150 if( mBins<1) return;121 if(nx_<1) return; 151 122 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); 156 127 } 157 128 return; … … 164 135 void HistoErr::FillFrHErr(HistoErr& hfrom) 165 136 { 166 if( mBins<=0) return;167 if(hfrom. mBins<=0) return;137 if(nx_<=0) return; 138 if(hfrom.nx_<=0) return; 168 139 169 140 Zero(); 170 141 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); 182 149 } 183 150 mCorrel = hfrom.mCorrel; … … 192 159 { 193 160 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_; 200 165 mCorrel = h.mCorrel; 201 202 166 return *this; 203 167 } … … 209 173 void HistoErr::Show(ostream & os) const 210 174 { 211 Histo::Show(os);212 os <<" ncorrel="<<mCorrel<<endl;175 os <<"HistoErr(ncorrel="<<mCorrel<<")"<<endl 176 <<" nx="<<nx_<<" ["<<xmin_<<","<<xmax_<<"] dx="<<dx_<<endl; 213 177 } 214 178 … … 224 188 string strg; 225 189 226 if(dobj==NULL) dobj=new HistoErr; 227 else dobj->Delete(); 190 if(dobj==NULL) dobj = new HistoErr; 228 191 229 192 // Lecture entete … … 233 196 is.Get(dobj->mCorrel); 234 197 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 199 is.Get(dobj->xmin_); 200 is.Get(dobj->xmax_); 201 is.Get(dobj->nx_); 202 is.Get(dobj->dx_); 203 204 // Lecture des donnees 205 if(dobj->nx_>0) { 206 is >> dobj->data_; 207 is >> dobj->err2_; 208 is >> dobj->ndata_; 209 } 242 210 243 211 return; … … 257 225 os.Put(dobj->mCorrel); 258 226 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 228 os.Put(dobj->xmin_); 229 os.Put(dobj->xmax_); 230 os.Put(dobj->nx_); 231 os.Put(dobj->dx_); 232 233 // Ecriture des donnees 234 if(dobj->nx_>0) { 235 os << dobj->data_; 236 os << dobj->err2_; 237 os << dobj->ndata_; 238 } 267 239 268 240 return;
Note:
See TracChangeset
for help on using the changeset viewer.