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

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

using namespace sophya enleve de machdefs.h, nouveau sopnamsp.h cmv 10/09/2004

File size: 5.0 KB
Line 
1#include "sopnamsp.h"
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)
19: Histo(), mNData(NULL)
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)
26: Histo(xMin,xMax,nBin), mNData(NULL)
27{
28 this->Errors();
29 allocate_mNData(nBin);
30 Zero();
31}
32
33/********* Methode *********/
34/*! Constructeur par copie */
35HistoErr::HistoErr(const HistoErr& H)
36: Histo(H), mNData(NULL)
37{
38 allocate_mNData(H.mBins);
39 if(mBins>0) memcpy(mNData,H.mNData,mBins*sizeof(uint_4));
40}
41
42/********* Methode *********/
43/*! Destructeur */
44HistoErr::~HistoErr(void)
45{
46 if(mNData) {delete [] mNData; mNData=NULL;}
47}
48/********* Methode *********/
49/*! Allocation du tableau mNData */
50void HistoErr::allocate_mNData(int nbin)
51{
52 if(nbin<=0) return;
53 if(mNData) {delete [] mNData; mNData=NULL;}
54 mNData = new uint_4[nbin];
55}
56
57/********* Methode *********/
58/*!
59 Remise a zero
60*/
61void HistoErr::Zero(void)
62{
63 if(mNData != NULL) memset(mNData,0,mBins*sizeof(uint_4));
64 Histo::Zero();
65}
66
67/********* Methode *********/
68/*!
69 Addition du contenu de l'histo pour abscisse x poids w et l'erreur e
70*/
71void HistoErr::Add(r_8 x, r_8 w, r_8 e)
72{
73 int_4 numBin = (int_4)floor((x-mMin)/binWidth);
74 if(numBin<0) mUnder += w;
75 else if(numBin>=mBins) mOver += w;
76 else {
77 mData[numBin] += w; mNData[numBin]++; mErr2[numBin] += e*e;
78 nHist += w; nEntries++;
79 }
80}
81
82/********* Methode *********/
83/*!
84 Addition du contenu de l'histo pour le bin numBin poids w et l'erreur e
85*/
86void HistoErr::AddBin(int_4 numBin, r_8 w, r_8 e)
87{
88 if(numBin<0) mUnder += w;
89 else if(numBin>=mBins) mOver += w;
90 else {
91 mData[numBin] += w; mNData[numBin]++; mErr2[numBin] += e*e;
92 nHist += w; nEntries++;
93 }
94}
95
96/********* Methode *********/
97/*!
98 Remplissage du contenu de l'histo pour le bin numBin poids w et l'erreur e
99*/
100void HistoErr::SetBin(int_4 numBin, r_8 w, r_8 e, uint_4 nb)
101{
102Histo::SetBin(numBin,w);
103Histo::SetErr2(numBin,e*e);
104SetNentB(numBin,nb);
105return;
106}
107
108/********* Methode *********/
109/*!
110 Remplissage nombre d'entrees pour le bin numBin
111*/
112void HistoErr::SetNentB(int_4 numBin, uint_4 nb)
113{
114 if(numBin>=0 && numBin<mBins) mNData[numBin] = nb;
115return;
116}
117
118/*!
119 Remplissage d'un tableau avec les nombres d'entrees dans le bin de l'histo
120*/
121void HistoErr::GetNBin(TVector<int_4>& v) const
122{
123v.Realloc(mBins);
124for(int_4 i=0;i<mBins;i++) v(i) = mNData[i];
125return;
126}
127
128/********* Methode *********/
129/*!
130 Remplissage du nombre d'entrees dans les bins de l'histo avec les valeurs d'un vecteur
131*/
132void HistoErr::PutNBin(TVector<int_4> &v)
133{
134int_4 n = (v.NElts()<mBins) ? v.NElts(): mBins;
135if(n>0) for(int_4 i=0;i<n;i++) mNData[i] = v(i);
136return;
137}
138
139/********* Methode *********/
140/*!
141 Recompute XMin and XMax so that
142 the center of the first bin is exactly xcmin and
143 the center of the last bin is exactly xcmax
144*/
145void HistoErr::ReCenterBin(r_8 xcmin,r_8 xcmax)
146{
147 if(xcmax<=xcmin) return;
148 if(mBins<=1) return;
149 double dx = (mMax-mMin)/(mBins-1);
150 mMin -= dx/2.;
151 mMax += dx/2.;
152 binWidth = (mMax-mMin)/mBins;
153}
154
155/********* Methode *********/
156/*!
157 Compute the correlation histogram.
158 Each bin content is divided by the number of entries in that bin.
159 Each squared error is divided by the number of entries in that bin.
160 The number of entries by bin is set to 1
161*/
162void HistoErr::ToCorrel(void)
163{
164 if(mBins<1) return;
165 for(int_4 i=0;i<mBins;i++) {
166 if(mNData[i]<1) continue;
167 mData[i] /= (r_8) mNData[i];
168 mErr2[i] /= (r_8) mNData[i];
169 mNData[i] = 1;
170 }
171 return;
172}
173
174///////////////////////////////////////////////////////////
175// --------------------------------------------------------
176// Les objets delegues pour la gestion de persistance
177// --------------------------------------------------------
178///////////////////////////////////////////////////////////
179
180DECL_TEMP_SPEC /* equivalent a template <> , pour SGI-CC en particulier */
181void ObjFileIO<HistoErr>::ReadSelf(PInPersist& is)
182{
183string strg;
184
185if(dobj==NULL) dobj=new HistoErr;
186 else dobj->Delete();
187
188// Lecture entete
189is.GetStr(strg);
190
191// Lecture des donnees HistoErr
192is.Get(dobj->mBins);
193 dobj->allocate_mNData(dobj->mBins);
194is.Get(dobj->mNData, dobj->mBins);
195
196// Lecture de l'histogramme
197is >> (Histo&)(*dobj);
198
199return;
200}
201
202DECL_TEMP_SPEC /* equivalent a template <> , pour SGI-CC en particulier */
203void ObjFileIO<HistoErr>::WriteSelf(POutPersist& os) const
204{
205if(dobj == NULL) return;
206string strg;
207
208strg = "HistErr";
209os.PutStr(strg);
210
211// Ecriture des valeurs
212os.Put(dobj->mBins);
213
214// Ecriture des donnees HistoErr nombre d entree par bin
215os.Put(dobj->mNData, dobj->mBins);
216
217// Ecriture de l'histogramme
218os << (Histo&)(*dobj);
219
220return;
221}
222
223#ifdef __CXX_PRAGMA_TEMPLATES__
224#pragma define_template ObjFileIO<HistoErr>
225#endif
226
227#if defined(ANSI_TEMPLATES) || defined(GNU_TEMPLATES)
228template class ObjFileIO<HistoErr>;
229#endif
Note: See TracBrowser for help on using the repository browser.