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

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

cmv 7/7/2000

hisprof.cc,h:

fonction IsOk()
GetMean -> GetValue (mauvais nom)
float Error2() -> double Error2()
nouveau: GetError(TVector<r_8>& v)
HProf::PrintF() sur-ecriture de Histo::PrintF
protection dans createur par copie dans alloc

SumY... pour le cas ou H.bins==0

protection dans UpdateHisto pour HProf cree par defaut (bins==0)
Dans WriteSelf UpdateHisto appele que si necessaire (IsOk()?)

histos2.cc : le Print() dit si les erreurs ont ete demandees
histos.cc,h:

protection dans createur par copie dans alloc

pour le cas ou H.bins==0

protection dans Zero() pour Histo cree par defaut (bins==0)
protection dans operator=() pour Histo cree par defaut (bins==0)
le Print() dit si les erreurs ont ete demandees

cmv 7/7/2000

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