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

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

documentation cmv 13/4/00

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