source: Sophya/trunk/SophyaLib/HiStats/histerr.cc@ 3122

Last change on this file since 3122 was 3057, checked in by cmv, 19 years ago
  • changement nom variables internes Histo...Histo2D
  • re-arrangement CreateOrResize et operator=
  • protection dans methodes (VMIN etc..) pour Histo 1d+2d vides

cmv 13/8/2006

File size: 6.1 KB
RevLine 
[2615]1#include "sopnamsp.h"
[2603]2#include "machdefs.h"
3#include <string.h>
4#include <stdio.h>
5#include <math.h>
6#include "histinit.h"
7#include "histerr.h"
8#include "perrors.h"
9
10/*!
11 \class SOPHYA::HistoErr
12 \ingroup HiStats
13 Classe d'histogrammes 1D avec erreurs donnees par l'utilisateur
14*/
15
16/********* Methode *********/
17/*! Constructeur par defaut */
18HistoErr::HistoErr(void)
[3053]19: Histo(), mNData(NULL), mCorrel(0)
[2603]20{
21}
22
23/********* Methode *********/
24/*! Constructeur d'un histo de nBin bins allant de xMin a xMax */
25HistoErr::HistoErr(r_8 xMin, r_8 xMax, int_4 nBin)
[3053]26: Histo(), mNData(NULL)
[2603]27{
[3053]28 CreateOrResize(xMin,xMax,nBin);
[2603]29}
30
31/********* Methode *********/
32/*! Constructeur par copie */
33HistoErr::HistoErr(const HistoErr& H)
[3053]34: Histo(H), mNData((H.mBins>0)? new r_8[H.mBins] : NULL), mCorrel(H.mCorrel)
[2603]35{
[3053]36 if(mNData>0) memcpy(mNData,H.mNData,mBins*sizeof(r_8));
[2603]37}
38
39/********* Methode *********/
40/*! Destructeur */
41HistoErr::~HistoErr(void)
42{
[2619]43 Delete();
[2603]44}
[2619]45
[2608]46/********* Methode *********/
[3053]47/*! Gestion de l'allocation */
48void HistoErr::CreateOrResize(r_8 xMin, r_8 xMax, int_4 nBin)
49{
50 //cout<<"HistoErr::CreateOrResize()"<<endl;
[3057]51 bool samelen = (nBin==mBins)? true: false;
[3053]52 Histo::CreateOrResize(xMin,xMax,nBin);
53 Histo::Errors();
[3057]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));
[3053]57 mCorrel = 0;
58}
59
60/********* Methode *********/
[2619]61/*! Delete des tableaux */
62void HistoErr::Delete(void)
63{
[3053]64 //cout<<"HistoErr::Delete()"<<endl;
65 Histo::Delete();
66 if(mNData) {delete [] mNData; mNData=NULL;}
67 mCorrel = 0;
[2619]68}
69
70/********* Methode *********/
[2603]71/*!
72 Remise a zero
73*/
74void HistoErr::Zero(void)
75{
[3053]76 Histo::Zero();
77 if(mNData) memset(mNData,0,mBins*sizeof(r_8));
78 mCorrel = 0;
[2603]79}
80
81/********* Methode *********/
82/*!
[2604]83 Remplissage du contenu de l'histo pour le bin numBin poids w et l'erreur e
84*/
[2626]85void HistoErr::SetBin(int_4 numBin, r_8 w, r_8 e, r_8 nb)
[2604]86{
87Histo::SetBin(numBin,w);
88Histo::SetErr2(numBin,e*e);
89SetNentB(numBin,nb);
90return;
91}
92
93/********* Methode *********/
94/*!
95 Remplissage nombre d'entrees pour le bin numBin
96*/
[2626]97void HistoErr::SetNentB(int_4 numBin, r_8 nb)
[2604]98{
99 if(numBin>=0 && numBin<mBins) mNData[numBin] = nb;
100return;
101}
102
103/*!
[2603]104 Remplissage d'un tableau avec les nombres d'entrees dans le bin de l'histo
105*/
[2626]106void HistoErr::GetNBin(TVector<r_8>& v) const
[2603]107{
108v.Realloc(mBins);
109for(int_4 i=0;i<mBins;i++) v(i) = mNData[i];
110return;
111}
112
113/********* Methode *********/
114/*!
115 Remplissage du nombre d'entrees dans les bins de l'histo avec les valeurs d'un vecteur
116*/
[2626]117void HistoErr::PutNBin(TVector<r_8> &v)
[2603]118{
[2604]119int_4 n = (v.NElts()<mBins) ? v.NElts(): mBins;
120if(n>0) for(int_4 i=0;i<n;i++) mNData[i] = v(i);
[2603]121return;
122}
123
[2608]124/********* Methode *********/
125/*!
[2604]126 Compute the correlation histogram.
127 Each bin content is divided by the number of entries in that bin.
128 Each squared error is divided by the number of entries in that bin.
[2622]129 The number of entries by bin is NOT set to 1 (calling ToCorrel
130 many time will change the histogram !)
[2604]131*/
132void HistoErr::ToCorrel(void)
133{
134 if(mBins<1) return;
[3049]135 mCorrel++;
[2604]136 for(int_4 i=0;i<mBins;i++) {
[2627]137 if(mNData[i]<1.) continue;
[2626]138 mData[i] /= mNData[i];
139 mErr2[i] /= mNData[i];
[2604]140 }
141 return;
142}
143
[2619]144/********* Methode *********/
145/*!
[2819]146 Recompute back the original HistoErr before ToCorrel action
147*/
148void HistoErr::FromCorrel(void)
149{
150 if(mBins<1) return;
[3049]151 mCorrel--;
[2819]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];
156 }
157 return;
158}
159
160/********* Methode *********/
161/*!
[2628]162 Fill the histogram with an other histogram
163*/
164void HistoErr::FillFrHErr(HistoErr& hfrom)
165{
166 if(mBins<=0) return;
167 if(hfrom.mBins<=0) return;
168
169 Zero();
170
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 }
182 }
[3049]183 mCorrel = hfrom.mCorrel;
[2628]184
185}
186
187/********* Methode *********/
188/*!
[2619]189 Operateur egal HistoErr = HistoErr
190*/
191HistoErr& HistoErr::operator = (const HistoErr& h)
192{
193 if(this==&h) return *this;
[3057]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));
[3049]200 mCorrel = h.mCorrel;
[2619]201
202 return *this;
203}
204
[3053]205/********* Methode *********/
206/*!
207 Print info
208*/
209void HistoErr::Show(ostream & os) const
210{
211 Histo::Show(os);
212 os <<" ncorrel="<<mCorrel<< endl;
213}
214
[2603]215///////////////////////////////////////////////////////////
216// --------------------------------------------------------
217// Les objets delegues pour la gestion de persistance
218// --------------------------------------------------------
219///////////////////////////////////////////////////////////
220
221DECL_TEMP_SPEC /* equivalent a template <> , pour SGI-CC en particulier */
222void ObjFileIO<HistoErr>::ReadSelf(PInPersist& is)
223{
[2608]224string strg;
[2603]225
226if(dobj==NULL) dobj=new HistoErr;
227 else dobj->Delete();
228
229// Lecture entete
[2608]230is.GetStr(strg);
[2603]231
[3049]232// Nombre d'appels a ToCorrel/FromCorrel
233is.Get(dobj->mCorrel);
234
[2603]235// Lecture des donnees HistoErr
236is.Get(dobj->mBins);
[3057]237if(dobj->mBins>0) dobj->mNData = new r_8[dobj->mBins];
[2603]238is.Get(dobj->mNData, dobj->mBins);
239
240// Lecture de l'histogramme
241is >> (Histo&)(*dobj);
242
243return;
244}
245
246DECL_TEMP_SPEC /* equivalent a template <> , pour SGI-CC en particulier */
247void ObjFileIO<HistoErr>::WriteSelf(POutPersist& os) const
248{
249if(dobj == NULL) return;
[2608]250string strg;
[2603]251
[3049]252// Ecriture entete
[2608]253strg = "HistErr";
254os.PutStr(strg);
[2603]255
[3049]256// Nombre d'appels a ToCorrel/FromCorrel
257os.Put(dobj->mCorrel);
258
[2603]259// Ecriture des valeurs
260os.Put(dobj->mBins);
261
262// Ecriture des donnees HistoErr nombre d entree par bin
263os.Put(dobj->mNData, dobj->mBins);
264
265// Ecriture de l'histogramme
266os << (Histo&)(*dobj);
267
268return;
269}
270
271#ifdef __CXX_PRAGMA_TEMPLATES__
272#pragma define_template ObjFileIO<HistoErr>
273#endif
274
275#if defined(ANSI_TEMPLATES) || defined(GNU_TEMPLATES)
[2868]276template class SOPHYA::ObjFileIO<HistoErr>;
[2603]277#endif
Note: See TracBrowser for help on using the repository browser.