source: Sophya/trunk/SophyaLib/HiStats/hist2err.cc@ 3136

Last change on this file since 3136 was 3136, checked in by cmv, 19 years ago

intro operator+=double HistoErr Histo2DErr cmv 16/01/07

File size: 6.4 KB
Line 
1#include "sopnamsp.h"
2#include "machdefs.h"
3#include <string.h>
4#include <stdio.h>
5#include <math.h>
6#include "perrors.h"
7#include "fioarr.h"
8#include "hist2err.h"
9
10/*!
11 \class SOPHYA::Histo2DErr
12 \ingroup HiStats
13 Classe d'histogrammes 1D avec erreurs donnees par l'utilisateur
14*/
15
16/********* Methode *********/
17/*! Constructeur par defaut */
18Histo2DErr::Histo2DErr(void)
19: xmin_(1.), xmax_(-1.), nx_(0), dx_(0.)
20, ymin_(1.), ymax_(-1.), ny_(0), dy_(0.)
21, mCorrel(0)
22{
23}
24
25/********* Methode *********/
26/*! Constructeur d'un histo */
27Histo2DErr::Histo2DErr(r_8 xmin,r_8 xmax,int_4 nx,r_8 ymin,r_8 ymax,int_4 ny)
28{
29 CreateOrResize(xmin,xmax,nx,ymin,ymax,ny);
30}
31
32/********* Methode *********/
33/*! Constructeur par copie */
34Histo2DErr::Histo2DErr(const Histo2DErr& H)
35: mCorrel(0)
36{
37 if(H.nx_<=0 || H.ny_<=0) return;
38 CreateOrResize(H.xmin_,H.xmax_,H.nx_,H.ymin_,H.ymax_,H.ny_);
39 data_ = H.data_;
40 err2_ = H.err2_;
41 ndata_ = H.ndata_;
42 mCorrel = H.mCorrel;
43}
44
45/********* Methode *********/
46/*! Destructeur */
47Histo2DErr::~Histo2DErr(void)
48{
49 mCorrel = 0;
50}
51
52/********* Methode *********/
53/*! Gestion de l'allocation */
54void Histo2DErr::CreateOrResize(r_8 xmin,r_8 xmax,int_4 nx,r_8 ymin,r_8 ymax,int_4 ny)
55{
56 xmin_ = xmin; xmax_ = xmax; nx_ = nx; dx_=0.;
57 ymin_ = ymin; ymax_ = ymax; ny_ = ny; dy_=0.;
58 if(nx_>0 && ny_>0) {
59 data_.ReSize(nx_,ny_); data_ = 0.;
60 err2_.ReSize(nx_,ny_); err2_ = 0.;
61 ndata_.ReSize(nx_,ny_); ndata_ = 0.;
62 dx_ = (xmax_-xmin_)/nx_;
63 dy_ = (ymax_-ymin_)/ny_;
64 }
65 mCorrel = 0;
66}
67
68/********* Methode *********/
69/*!
70 Remise a zero
71*/
72void Histo2DErr::Zero(void)
73{
74 if(nx_<=0 || ny_<=0) return;
75 data_ = 0.;
76 err2_ = 0.;
77 ndata_ = 0.;
78}
79
80/********* Methode *********/
81/*!
82 Recompute XMin (YMin) and XMax (YMax) so that
83 the CENTER of the first bin is exactly XMin (YMin) and
84 the CENTER of the last bin is exactly XMax (YMax).
85 Remember that otherwise
86 XMin (YMin) is the beginning of the first bin
87 and XMax (YMax) is the end of the last bin
88*/
89void Histo2DErr::ReCenterBinX(void)
90{
91 if(nx_<=1) return;
92 double dx = (xmax_-xmin_)/(nx_-1);
93 xmin_ -= dx/2.;
94 xmax_ += dx/2.;
95 dx_ = (xmax_-xmin_)/nx_;
96}
97
98void Histo2DErr::ReCenterBinY(void)
99{
100 if(ny_<=1) return;
101 double dy = (ymax_-ymin_)/(ny_-1);
102 ymin_ -= dy/2.;
103 ymax_ += dy/2.;
104 dy_ = (ymax_-ymin_)/ny_;
105}
106
107void Histo2DErr::ReCenterBin(void)
108{
109 ReCenterBinX();
110 ReCenterBinY();
111}
112
113/********* Methode *********/
114/*!
115 Compute the correlation histogram.
116 Each bin content is divided by the number of entries in that bin.
117 Each squared error is divided by the number of entries in that bin.
118 The number of entries by bin is NOT set to 1 (calling ToCorrel
119 many time will change the histogram !)
120*/
121void Histo2DErr::ToCorrel(void)
122{
123 if(nx_<1 || ny_<1) return;
124 mCorrel++;
125 for(int_4 i=0;i<nx_;i++) {
126 for(int_4 j=0;j<ny_;j++) {
127 if(ndata_(i,j)<1.) continue;
128 data_(i,j) /= ndata_(i,j);
129 err2_(i,j) /= ndata_(i,j);
130 }
131 }
132 return;
133}
134
135/********* Methode *********/
136/*!
137 Recompute back the original Histo2DErr before ToCorrel action
138*/
139void Histo2DErr::FromCorrel(void)
140{
141 if(nx_<1 || ny_<1) return;
142 mCorrel--;
143 for(int_4 i=0;i<nx_;i++) {
144 for(int_4 j=0;j<ny_;j++) {
145 if(ndata_(i,j)<1.) continue;
146 data_(i,j) *= ndata_(i,j);
147 err2_(i,j) *= ndata_(i,j);
148 }
149 }
150 return;
151}
152
153/********* Methode *********/
154/*!
155 Fill the histogram with an other histogram
156*/
157void Histo2DErr::FillFrHErr(Histo2DErr& hfrom)
158{
159 if(nx_<=0 || ny_<=0) return;
160 if(hfrom.nx_<=0 || hfrom.ny_<=0) return;
161
162 Zero();
163
164 for(int_4 i=0;i<hfrom.nx_;i++) {
165 for(int_4 j=0;j<hfrom.ny_;j++) {
166 r_8 x,y; hfrom.BinCenter(i,j,x,y);
167 int ii,jj; FindBin(x,y,ii,jj);
168 if(jj<0 || jj>=ny_ || ii<0 || ii>=nx_) continue;
169 data_(ii,jj) += hfrom.data_(ii,jj);
170 err2_(ii,jj) += hfrom.err2_(ii,jj);
171 ndata_(ii,jj) += hfrom.ndata_(ii,jj);
172 }
173 }
174 mCorrel = hfrom.mCorrel;
175
176}
177
178/********* Methode *********/
179/*!
180 Operateur egal Histo2DErr = Histo2DErr
181*/
182Histo2DErr& Histo2DErr::operator = (const Histo2DErr& h)
183{
184 if(this==&h) return *this;
185 CreateOrResize(h.xmin_,h.xmax_,h.nx_,h.ymin_,h.ymax_,h.ny_);
186 data_ = h.data_;
187 err2_ = h.err2_;
188 ndata_ = h.ndata_;
189 mCorrel = h.mCorrel;
190 return *this;
191}
192
193/********* Methode *********/
194/*!
195 Operateur de multiplication par une constante
196*/
197Histo2DErr& Histo2DErr::operator *= (r_8 b)
198{
199r_8 b2 = b*b;
200for(int_4 i=0;i<nx_;i++) {
201 for(int_4 j=0;j<ny_;j++) {
202 data_(i,j) *= b;
203 err2_(i,j) *= b2;
204 }
205}
206return *this;
207}
208
209/********* Methode *********/
210/*!
211 Print info
212*/
213void Histo2DErr::Show(ostream & os) const
214{
215 os <<"Histo2DErr(ncorrel="<<mCorrel<<")"<<endl
216 <<" nx="<<nx_<<" ["<<xmin_<<","<<xmax_<<"] dx="<<dx_<<endl
217 <<" ny="<<ny_<<" ["<<ymin_<<","<<ymax_<<"] dy="<<dy_<<endl;
218}
219
220///////////////////////////////////////////////////////////
221// --------------------------------------------------------
222// Les objets delegues pour la gestion de persistance
223// --------------------------------------------------------
224///////////////////////////////////////////////////////////
225
226DECL_TEMP_SPEC /* equivalent a template <> , pour SGI-CC en particulier */
227void ObjFileIO<Histo2DErr>::ReadSelf(PInPersist& is)
228{
229string strg;
230
231if(dobj==NULL) dobj = new Histo2DErr;
232
233// Lecture entete
234is.GetStr(strg);
235
236// Nombre d'appels a ToCorrel/FromCorrel
237is.Get(dobj->mCorrel);
238
239// Lecture des parametres Histo2DErr
240is.Get(dobj->xmin_);
241is.Get(dobj->xmax_);
242is.Get(dobj->nx_);
243is.Get(dobj->dx_);
244is.Get(dobj->ymin_);
245is.Get(dobj->ymax_);
246is.Get(dobj->ny_);
247is.Get(dobj->dy_);
248
249// Lecture des donnees
250if(dobj->nx_>0 && dobj->ny_>0) {
251 is >> dobj->data_;
252 is >> dobj->err2_;
253 is >> dobj->ndata_;
254}
255
256return;
257}
258
259DECL_TEMP_SPEC /* equivalent a template <> , pour SGI-CC en particulier */
260void ObjFileIO<Histo2DErr>::WriteSelf(POutPersist& os) const
261{
262if(dobj == NULL) return;
263string strg;
264
265// Ecriture entete
266strg = "Hist2DErr";
267os.PutStr(strg);
268
269// Nombre d'appels a ToCorrel/FromCorrel
270os.Put(dobj->mCorrel);
271
272// Ecriture des parametres Histo2DErr
273os.Put(dobj->xmin_);
274os.Put(dobj->xmax_);
275os.Put(dobj->nx_);
276os.Put(dobj->dx_);
277os.Put(dobj->ymin_);
278os.Put(dobj->ymax_);
279os.Put(dobj->ny_);
280os.Put(dobj->dy_);
281
282// Ecriture des donnees
283if(dobj->nx_>0 && dobj->ny_>0) {
284 os << dobj->data_;
285 os << dobj->err2_;
286 os << dobj->ndata_;
287}
288
289return;
290}
291
292#ifdef __CXX_PRAGMA_TEMPLATES__
293#pragma define_template ObjFileIO<Histo2DErr>
294#endif
295
296#if defined(ANSI_TEMPLATES) || defined(GNU_TEMPLATES)
297template class SOPHYA::ObjFileIO<Histo2DErr>;
298#endif
Note: See TracBrowser for help on using the repository browser.