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

Last change on this file since 2604 was 2604, checked in by cmv, 21 years ago

nouvelles methode dans HistoErr cmv 3/9/04

File size: 4.6 KB
Line 
1#include "machdefs.h"
2#include <string.h>
3#include <stdio.h>
4#include <math.h>
5#include "histinit.h"
6#include "histerr.h"
7#include "perrors.h"
8
9/*!
10 \class SOPHYA::HistoErr
11 \ingroup HiStats
12 Classe d'histogrammes 1D avec erreurs donnees par l'utilisateur
13*/
14
15/********* Methode *********/
16/*! Constructeur par defaut */
17HistoErr::HistoErr(void)
18: Histo(), mNData(NULL)
19{
20}
21
22/********* Methode *********/
23/*! Constructeur d'un histo de nBin bins allant de xMin a xMax */
24HistoErr::HistoErr(r_8 xMin, r_8 xMax, int_4 nBin)
25: Histo(xMin,xMax,nBin), mNData((nBin>0) ? new uint_4[nBin] : NULL)
26{
27 this->Errors();
28 if(mNData) memset(mNData,0,mBins*sizeof(uint_4));
29}
30
31/********* Methode *********/
32/*! Constructeur par copie */
33HistoErr::HistoErr(const HistoErr& H)
34: Histo(H), mNData((H.mBins>0)? new uint_4[H.mBins] : NULL)
35{
36 if(mBins>0) memcpy(mNData,H.mNData,mBins*sizeof(uint_4));
37}
38
39/********* Methode *********/
40/*! Destructeur */
41HistoErr::~HistoErr(void)
42{
43 if(mNData) {delete [] mNData; mNData=NULL;}
44}
45
46/********* Methode *********/
47/*!
48 Remise a zero
49*/
50void HistoErr::Zero(void)
51{
52 if(mNData != NULL) memset(mNData,0,mBins*sizeof(uint_4));
53 Histo::Zero();
54}
55
56/********* Methode *********/
57/*!
58 Addition du contenu de l'histo pour abscisse x poids w et l'erreur e
59*/
60void HistoErr::Add(r_8 x, r_8 w, r_8 e)
61{
62 int_4 numBin = (int_4)floor((x-mMin)/binWidth);
63 if(numBin<0) mUnder += w;
64 else if(numBin>=mBins) mOver += w;
65 else {
66 mData[numBin] += w; mNData[numBin]++; mErr2[numBin] += e*e;
67 nHist += w; nEntries++;
68 }
69}
70
71/********* Methode *********/
72/*!
73 Addition du contenu de l'histo pour le bin numBin poids w et l'erreur e
74*/
75void HistoErr::AddBin(int_4 numBin, r_8 w, r_8 e)
76{
77 if(numBin<0) mUnder += w;
78 else if(numBin>=mBins) mOver += w;
79 else {
80 mData[numBin] += w; mNData[numBin]++; mErr2[numBin] += e*e;
81 nHist += w; nEntries++;
82 }
83}
84
85/********* Methode *********/
86/*!
87 Remplissage du contenu de l'histo pour le bin numBin poids w et l'erreur e
88*/
89void HistoErr::SetBin(int_4 numBin, r_8 w, r_8 e, uint_4 nb)
90{
91Histo::SetBin(numBin,w);
92Histo::SetErr2(numBin,e*e);
93SetNentB(numBin,nb);
94return;
95}
96
97/********* Methode *********/
98/*!
99 Remplissage nombre d'entrees pour le bin numBin
100*/
101void HistoErr::SetNentB(int_4 numBin, uint_4 nb)
102{
103 if(numBin>=0 && numBin<mBins) mNData[numBin] = nb;
104return;
105}
106
107/*!
108 Remplissage d'un tableau avec les nombres d'entrees dans le bin de l'histo
109*/
110void HistoErr::GetNBin(TVector<int_4>& v) const
111{
112v.Realloc(mBins);
113for(int_4 i=0;i<mBins;i++) v(i) = mNData[i];
114return;
115}
116
117/********* Methode *********/
118/*!
119 Remplissage du nombre d'entrees dans les bins de l'histo avec les valeurs d'un vecteur
120*/
121void HistoErr::PutNBin(TVector<int_4> &v)
122{
123int_4 n = (v.NElts()<mBins) ? v.NElts(): mBins;
124if(n>0) for(int_4 i=0;i<n;i++) mNData[i] = v(i);
125return;
126}
127
128
129/********* Methode *********/
130/*!
131 Compute the correlation histogram.
132 Each bin content is divided by the number of entries in that bin.
133 Each squared error is divided by the number of entries in that bin.
134 The number of entries by bin is set to 1
135*/
136void HistoErr::ToCorrel(void)
137{
138 if(mBins<1) return;
139 for(int_4 i=0;i<mBins;i++) {
140 if(mNData[i]<1) continue;
141 mData[i] /= (r_8) mNData[i];
142 mErr2[i] /= (r_8) mNData[i];
143 mNData[i] = 1;
144 }
145 return;
146}
147
148///////////////////////////////////////////////////////////
149// --------------------------------------------------------
150// Les objets delegues pour la gestion de persistance
151// --------------------------------------------------------
152///////////////////////////////////////////////////////////
153
154DECL_TEMP_SPEC /* equivalent a template <> , pour SGI-CC en particulier */
155void ObjFileIO<HistoErr>::ReadSelf(PInPersist& is)
156{
157char strg[256];
158
159if(dobj==NULL) dobj=new HistoErr;
160 else dobj->Delete();
161
162// Lecture entete
163is.GetLine(strg, 255);
164
165// Lecture des donnees HistoErr
166is.Get(dobj->mBins);
167is.GetLine(strg, 255);
168is.Get(dobj->mNData, dobj->mBins);
169
170// Lecture de l'histogramme
171is >> (Histo&)(*dobj);
172
173return;
174}
175
176DECL_TEMP_SPEC /* equivalent a template <> , pour SGI-CC en particulier */
177void ObjFileIO<HistoErr>::WriteSelf(POutPersist& os) const
178{
179if(dobj == NULL) return;
180char strg[256];
181
182sprintf(strg,"HistErr");
183os.PutLine(strg);
184
185// Ecriture des valeurs
186os.Put(dobj->mBins);
187
188// Ecriture des donnees HistoErr nombre d entree par bin
189sprintf(strg,"Tableau du nombre d entree par bin");
190os.PutLine(strg);
191os.Put(dobj->mNData, dobj->mBins);
192
193// Ecriture de l'histogramme
194os << (Histo&)(*dobj);
195
196return;
197}
198
199#ifdef __CXX_PRAGMA_TEMPLATES__
200#pragma define_template ObjFileIO<HistoErr>
201#endif
202
203#if defined(ANSI_TEMPLATES) || defined(GNU_TEMPLATES)
204template class ObjFileIO<HistoErr>;
205#endif
Note: See TracBrowser for help on using the repository browser.