source: Sophya/trunk/SophyaLib/HiStats/hisprof.cc@ 1053

Last change on this file since 1053 was 1053, checked in by ansari, 25 years ago

les friend operator ne marche plus ? passage en inline cmv 30/06/00

File size: 7.2 KB
Line 
1#include "machdefs.h"
2#include <string.h>
3#include <stdio.h>
4#include <math.h>
5#include "hisprof.h"
6#include "perrors.h"
7
8/*!
9 \class SOPHYA::HProf
10 \ingroup HiStats
11 Classe de profil d'histogrammes.
12*/
13
14/********* Methode *********/
15/*!
16 Constructeur par defaut.
17*/
18HProf::HProf()
19: Histo()
20, SumY(NULL), SumY2(NULL), SumW(NULL), Ok(false), YMin(1.), YMax(-1.), Opt(0)
21{
22 END_CONSTRUCTOR
23}
24
25/********* Methode *********/
26/*!
27 Constructeur. Histogramme de profil de ``nBin'' bins entre ``xMin''
28 et ``xMax'' avec coupure d'acceptance sur y entre ``yMin'' et ``yMax''.
29 Si yMin>=yMax alors pas de coupure d'acceptance sur y.
30 Par defaut l'erreur du profil represente la dispersion dans le bin,
31 SetErrOpt(1) permet de demander de calculer l'erreur sur la moyenne.
32*/
33HProf::HProf(float xMin, float xMax, int nBin, float yMin, float yMax)
34: Histo(xMin,xMax,nBin)
35, SumY(new double[nBin]), SumY2(new double[nBin]), SumW(new double[nBin])
36, Ok(false), YMin(yMin), YMax(yMax), Opt(0)
37{
38 Histo::Errors();
39 Zero();
40 END_CONSTRUCTOR
41}
42
43/********* Methode *********/
44/*!
45 Constructeur par copie.
46*/
47HProf::HProf(const HProf& H)
48: Histo(H)
49, SumY(new double[H.bins]), SumY2(new double[H.bins]), SumW(new double[H.bins])
50, Ok(H.Ok), YMin(H.YMin), YMax(H.YMax), Opt(H.Opt)
51{
52 memcpy(SumY, H.SumY, bins*sizeof(double));
53 memcpy(SumY2, H.SumY2, bins*sizeof(double));
54 memcpy(SumW, H.SumW, bins*sizeof(double));
55 END_CONSTRUCTOR
56}
57
58/********* Methode *********/
59/*!
60 Des-allocation
61*/
62void HProf::Delete()
63{
64 if( SumY != NULL ) { delete[] SumY; SumY = NULL;}
65 if( SumY2 != NULL ) { delete[] SumY2; SumY2 = NULL;}
66 if( SumW != NULL ) { delete[] SumW; SumW = NULL;}
67 Ok = false;
68}
69
70/********* Methode *********/
71/*!
72 Destructeur
73*/
74HProf::~HProf()
75{
76Delete();
77}
78
79/********* Methode *********/
80/*!
81 Remise a zero
82*/
83void HProf::Zero()
84{
85 memset(SumY, 0, bins*sizeof(double));
86 memset(SumY2, 0, bins*sizeof(double));
87 memset(SumW, 0, bins*sizeof(double));
88 Ok = false;
89 Histo::Zero();
90}
91
92/********* Methode *********/
93/*!
94 Pour changer l'option de calcul de l'erreur du profile.
95 Si ``spread'' = true alors l'erreur represente la dispersion
96 des donnees dans le bin, si = false elle represente l'erreur
97 sur la moyenne du bin.
98 \verbatim
99 - Pour le bin (j):
100 H(j) = sum(y), E(j) = sum(y^2), L(j) = sum(w)
101 -> s(j) = sqrt(E(j)/L(j) - (H(j)/L(j))^2) dispersion
102 -> e(j) = s(j)/sqrt(L(j)) erreur sur la moyenne
103 spread=true: opt=0 : dispersion des donnees dans le bin = s(j)
104 spread=false: opt=1 : erreur sur la moyenne du bin = e(j)
105 \endverbatim
106*/
107void HProf::SetErrOpt(bool spread)
108{
109int opt = (spread) ? 0 : 1;
110if(opt!=Opt) {Opt=opt; Ok=false;}
111}
112
113/********* Methode *********/
114/*!
115 Pour mettre a jour l'histogramme de profil.
116 Il est important d'appeler cette methode si on veut
117 utiliser les methodes de la classe Histo qui ne sont
118 pas redefinies dans la classe HProf.
119 En effet, pour des raisons de precision la classe
120 HProf travaille avec des tableaux en double precision
121 et seulement au moment ou l'on a besoin de l'histogramme
122 ce dernier est rempli avec les valeurs demandees (moyenne
123 et dispersion/erreur sur la moyenne).
124*/
125void HProf::UpdateHisto() const
126{
127
128float m,e2;
129for(int i=0;i<bins;i++) {
130 if(SumW[i]<=0.) {
131 m = e2 = 0.;
132 } else {
133 m = SumY[i]/SumW[i];
134 e2 = SumY2[i]/SumW[i] - m*m;
135 if(Opt) e2 /= SumW[i];
136 }
137 data[i] = m;
138 err2[i] = e2;
139}
140// Attention, a cause de "WriteSelf const" UpdateHisto doit etre "const".
141// Comme on veut modifier Ok, on est oblige de faire cette entourloupe:
142HProf *buff = (HProf *) this;
143buff->Ok = true;
144}
145
146/********* Methode *********/
147/*!
148 Addition au contenu de l'histo pour abscisse x de la valeur y et poids w
149*/
150void HProf::Add(float x, float y, float w)
151{
152 if(YMax>YMin && (y<YMin || YMax<y)) return;
153 int numBin = FindBin(x);
154 if (numBin<0) under += w;
155 else if (numBin>=bins) over += w;
156 else {
157 Ok = false;
158 SumY[numBin] += y;
159 SumY2[numBin] += y*y;
160 SumW[numBin] += w;
161 nHist += w;
162 nEntries++;
163 }
164}
165
166/********* Methode *********/
167/*!
168 Addition au contenu de l'histo bin numBin de la valeur y poids w
169*/
170void HProf::AddBin(int numBin, float y, float w)
171{
172 if(YMax>YMin && (y<YMin || YMax<y)) return;
173 if (numBin<0) under += w;
174 else if (numBin>=bins) over += w;
175 else {
176 Ok = false;
177 SumY[numBin] += y;
178 SumY2[numBin] += y*y;
179 SumW[numBin] += w;
180 nHist += w;
181 nEntries++;
182 }
183}
184
185/********* Methode *********/
186/*!
187 Operateur H = H1
188*/
189HProf& HProf::operator = (const HProf& h)
190{
191if(this == &h) return *this;
192if( h.bins > bins ) Delete();
193Histo *hthis = (Histo *) this;
194*hthis = (Histo) h;
195if(!SumY) SumY = new double[bins];
196if(!SumY2) SumY2 = new double[bins];
197if(!SumW) SumW = new double[bins];
198memcpy(SumY, h.SumY, bins*sizeof(double));
199memcpy(SumY2, h.SumY2, bins*sizeof(double));
200memcpy(SumW, h.SumW, bins*sizeof(double));
201Ok = h.Ok;
202YMin = h.YMin;
203YMax = h.YMax;
204Opt = h.Opt;
205
206return *this;
207}
208
209/********* Methode *********/
210/*!
211 Operateur H += H1
212
213 Attention dans cette addition il n'y a pas de gestion
214 des YMin et YMax. L'addition est faite meme si les limites
215 en Y de ``a'' sont differentes de celles de ``this''.
216*/
217HProf& HProf::operator += (const HProf& a)
218{
219if(bins!=a.bins) THROW(sizeMismatchErr);
220Histo *hthis = (Histo *) this;
221*hthis += (Histo) a;
222for(int i=0;i<bins;i++) {
223 SumY[i] += a.SumY[i];
224 SumY2[i] += a.SumY2[i];
225 SumW[i] += a.SumW[i];
226}
227Ok = false;
228
229return *this;
230}
231
232///////////////////////////////////////////////////////////
233// --------------------------------------------------------
234// Les objets delegues pour la gestion de persistance
235// --------------------------------------------------------
236///////////////////////////////////////////////////////////
237
238
239void ObjFileIO<HProf>::ReadSelf(PInPersist& is)
240{
241char strg[256];
242
243if(dobj==NULL) dobj=new HProf;
244 else dobj->Delete();
245
246// Lecture entete
247is.GetLine(strg,255);
248
249// Ecriture des valeurs
250is.Get(dobj->bins);
251is.Get(dobj->YMin);
252is.Get(dobj->YMax);
253is.Get(dobj->Opt);
254dobj->Ok = true;
255
256// Ecriture des donnees propres a l'histogramme de profil.
257is.GetLine(strg,255);
258dobj->SumY = new double[dobj->bins];
259dobj->SumY2 = new double[dobj->bins];
260dobj->SumW = new double[dobj->bins];
261is.Get(dobj->SumY, dobj->bins);
262is.Get(dobj->SumY2, dobj->bins);
263is.Get(dobj->SumW, dobj->bins);
264
265// Ecriture de l'histogramme
266is >> (Histo&)(*dobj);
267return;
268}
269
270void ObjFileIO<HProf>::WriteSelf(POutPersist& os) const
271{
272if (dobj == NULL) return;
273char strg[256];
274
275dobj->UpdateHisto();
276
277// Ecriture entete pour identifier facilement
278sprintf(strg,"HProf: YMin=%f YMax=%f Opt=%1d",dobj->YMin,dobj->YMax,dobj->Opt);
279os.PutLine(strg);
280
281// Ecriture des valeurs
282os.Put(dobj->bins);
283os.Put(dobj->YMin);
284os.Put(dobj->YMax);
285os.Put(dobj->Opt);
286
287// Ecriture des donnees propres a l'histogramme de profil.
288sprintf(strg,"HProf: SumY SumY2 SumW");
289os.PutLine(strg);
290os.Put(dobj->SumY, dobj->bins);
291os.Put(dobj->SumY2, dobj->bins);
292os.Put(dobj->SumW, dobj->bins);
293
294// Ecriture de l'histogramme
295// FIO_Histo fio_h((Histo&)*dobj);
296// fio_h.Write(os);
297os << (Histo&)(*dobj);
298
299return;
300}
301
302#ifdef __CXX_PRAGMA_TEMPLATES__
303#pragma define_template ObjFileIO<HProf>
304#endif
305
306#if defined(ANSI_TEMPLATES) || defined(GNU_TEMPLATES)
307template class ObjFileIO<HProf>;
308#endif
Note: See TracBrowser for help on using the repository browser.