source: Sophya/trunk/SophyaLib/HiStats/histos2.h@ 3049

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

Fits IO Histo,HProf,HistErr,Histo2D cmv 11/8/2006

File size: 11.8 KB
Line 
1//
2// histogrammes 2D cmv 2/8/96
3//
4
5#ifndef HISTOS2_SEEN
6#define HISTOS2_SEEN
7
8#include "machdefs.h"
9#include <string>
10
11#include <list>
12#if defined(__KCC__)
13#include <list.h>
14#endif
15
16#include "peida.h"
17#include "utils.h"
18#include "histos.h"
19
20namespace SOPHYA {
21
22// Forward class declaration for Fits handler
23template <class T> class FitsHandler;
24
25//! 2 dimensions histograms
26class Histo2D : public AnyDataObj {
27 friend class ObjFileIO<Histo2D>;
28 friend class FitsHandler<Histo2D>;
29public:
30
31 // CREATOR / DESTRUCTOR
32 Histo2D(r_8 xMin,r_8 xMax,int_4 nxBin,r_8 yMin,r_8 yMax,int_4 nyBin);
33 Histo2D(r_4 xMin,r_4 xMax,int_4 nxBin,r_4 yMin,r_4 yMax,int_4 nyBin);
34 Histo2D(const Histo2D& h);
35 Histo2D();
36 virtual ~Histo2D();
37
38 // OPTIONS
39 void Errors();
40
41 // UPDATING
42 void Zero();
43 void Add(r_8 x, r_8 y, r_8 w = 1.);
44
45 // Operators
46 Histo2D& operator = (const Histo2D& h);
47 Histo2D& operator *= (r_8 b);
48 Histo2D& operator /= (r_8 b);
49 Histo2D& operator += (r_8 b);
50 Histo2D& operator -= (r_8 b);
51 Histo2D& operator += (const Histo2D& a);
52 Histo2D& operator -= (const Histo2D& a);
53 Histo2D& operator *= (const Histo2D& a);
54 Histo2D& operator /= (const Histo2D& a);
55
56 // get/put dans/depuis une matrice / vector
57 void GetXCoor(TVector<r_8>& v) const;
58 void GetValue(TMatrix<r_8> &v) const;
59 void GetYCoor(TVector<r_8>& v) const;
60 void GetError2(TMatrix<r_8>& v) const;
61 void GetError(TMatrix<r_8>& v) const;
62 void PutValue(TMatrix<r_8>& v, int_4 ierr=0);
63 void PutValueAdd(TMatrix<r_8>& v, int_4 ierr=0);
64 void PutError2(TMatrix<r_8>& v);
65 void PutError2Add(TMatrix<r_8>& v);
66 void PutError(TMatrix<r_8>& v);
67
68 // INLINES
69 //! Retourne l'abscisse minimum.
70 inline r_8 XMin() const {return mXmin;}
71 //! Retourne l'abscisse maximum.
72 inline r_8 XMax() const {return mXmax;}
73 //! Retourne l'ordonnee minimum.
74 inline r_8 YMin() const {return mYmin;}
75 //! Retourne l'ordonnee maximum.
76 inline r_8 YMax() const {return mYmax;}
77 //! Retourne le nombre de bins selon X.
78 inline int_4 NBinX() const {return mNx;}
79 //! Retourne le nombre de bins selon Y.
80 inline int_4 NBinY() const {return mNy;}
81 //! Retourne la largeur du bin selon X.
82 inline r_8 WBinX() const {return mWBinx;}
83 //! Retourne la largeur du bin selon Y.
84 inline r_8 WBinY() const {return mWBiny;}
85 //! Retourne le pointeur sur le tableaux des contenus.
86 inline r_8* Bins() const {return mData;}
87 //! Retourne le contenu du bin i,j.
88 inline r_8 operator()(int_4 i,int_4 j) const {return mData[j*mNx+i];}
89 //! Remplit le contenu du bin i,j.
90 inline r_8& operator()(int_4 i,int_4 j) {return mData[j*mNx+i];}
91 //! retourne "true" si il y a des erreurs stoquees
92 inline bool HasErrors() const { if(mErr2) return true; else return false;}
93 //! Retourne l'erreur du bin i,j.
94 inline r_8 Error(int_4 i,int_4 j) const
95 {if(mErr2)
96 {if(mErr2[j*mNx+i]>0.) return sqrt(mErr2[j*mNx+i]); else return 0.;}
97 else return 0.;}
98 //! Remplit l'erreur au carre du bin i,j.
99 inline r_8 Error2(int_4 i,int_4 j) const
100 {if(mErr2) return mErr2[j*mNx+i]; else return 0.;}
101 //! Remplit l'erreur au carre du bin i,j.
102 inline r_8& Error2(int_4 i,int_4 j) {return mErr2[j*mNx+i];}
103 //! Retourne la somme ponderee.
104 inline r_8 NData() const {return nHist;}
105 //! Retourne le nombre d'entrees.
106 inline int_4 NEntries() const {return nEntries;}
107 //! Retourne l'abscisse et l'ordonnee du coin inferieur du bin i,j.
108 inline void BinLowEdge(int_4 i,int_4 j,r_8& x,r_8& y) const
109 {x = mXmin + i*mWBinx; y = mYmin + j*mWBiny;}
110 //! Retourne l'abscisse et l'ordonnee du coin inferieur du bin i,j.
111 inline void BinLowEdge(int_4 i,int_4 j,r_4& xf,r_4& yf) const
112 {r_8 x,y; BinLowEdge(i,j,x,y); xf=x; yf=y;}
113 //! Retourne l'abscisse et l'ordonnee du centre du bin i,j.
114 inline void BinCenter(int_4 i,int_4 j,r_8& x,r_8& y) const
115 {x = mXmin + (i+0.5)*mWBinx; y = mYmin + (j+0.5)*mWBiny;}
116 //! Retourne l'abscisse et l'ordonnee du centre du bin i,j.
117 inline void BinCenter(int_4 i,int_4 j,r_4& xf,r_4& yf) const
118 {r_8 x,y; BinCenter(i,j,x,y); xf=x; yf=y;}
119 //! Retourne l'abscisse et l'ordonnee du coin superieur du bin i,j.
120 inline void BinHighEdge(int_4 i,int_4 j,r_8& x,r_8& y) const
121 {x = mXmin + (i+1)*mWBinx; y = mYmin + (j+1)*mWBiny;}
122 //! Retourne l'abscisse et l'ordonnee du coin superieur du bin i,j.
123 inline void BinHighEdge(int_4 i,int_4 j,r_4& xf,r_4& yf) const
124 {r_8 x,y; BinHighEdge(i,j,x,y); xf=x; yf=y;}
125 //! Retourne les numeros du bin contenant l'abscisse et l'ordonnee x,y.
126 inline void FindBin(r_8 x,r_8 y,int_4& i,int_4& j) const
127 {i=(int_4) floor((x-mXmin)/mWBinx); j=(int_4) floor((y-mYmin)/mWBiny);}
128
129 // Info, statistique et calculs sur les histogrammes
130 r_8 NOver(int_4 i=-1,int_4 j=-1) const;
131 int_4 BinNonNul() const;
132 int_4 ErrNonNul() const;
133 void IJMax(int_4& imax,int_4& jmax,int_4 il=1,int_4 ih= -1,int_4 jl=1,int_4 jh= -1) const;
134 void IJMin(int_4& imax,int_4& jmax,int_4 il=1,int_4 ih= -1,int_4 jl=1,int_4 jh= -1) const;
135 r_8 VMax(int_4 il=1,int_4 ih= -1,int_4 jl=1,int_4 jh= -1) const;
136 r_8 VMin(int_4 il=1,int_4 ih= -1,int_4 jl=1,int_4 jh= -1) const;
137 int_4 EstimeMax(r_8& xm,r_8& ym,int_4 SzPav = 3
138 ,int_4 il=1,int_4 ih= -1,int_4 jl=1,int_4 jh= -1) const;
139 int_4 EstimeMax(int_4 im,int_4 jm,r_8& xm,r_8& ym,int_4 SzPav = 3) const;
140 int_4 FindMax(int_4& im,int_4& jm,int_4 SzPav = 3,r_8 Dz = 0.
141 ,int_4 il=1,int_4 ih= -1,int_4 jl=1,int_4 jh= -1) const;
142
143 // Print et Display ASCII
144 virtual void Show(ostream& os) const;
145 inline void PrintStatus() const { Show(cout); }
146
147 void Print(r_8 min=1.,r_8 max=-1.
148 ,int_4 il=1,int_4 ih= -1,int_4 jl=1,int_4 jh= -1) const;
149
150 // PROJECTIONS
151 void SetProjX();
152 void SetProjY();
153 void SetProj();
154 void DelProjX();
155 void DelProjY();
156 void DelProj();
157 void ZeroProjX();
158 void ZeroProjY();
159 void ZeroProj();
160 //! Retourne le pointeur sur l'histo 1D de la projection selon X.
161 inline Histo* HProjX() const {return mHprojx;}
162 //! Retourne le pointeur sur l'histo 1D de la projection selon Y.
163 inline Histo* HProjY() const {return mHprojy;}
164 void ShowProj() const;
165
166 // BANDES
167 //! Retourne le nombre de bandes selon X
168 inline int_4 NBandX() const {return mLBandx.size();}
169 //! Retourne le nombre de bandes selon Y
170 inline int_4 NBandY() const {return mLBandy.size();}
171 int_4 SetBandX(r_8 ybmin,r_8 ybmax);
172 int_4 SetBandY(r_8 xbmin,r_8 xbmax);
173 void DelBandX();
174 void DelBandY();
175 void ZeroBandX();
176 void ZeroBandY();
177 Histo* HBandX(int_4 n) const;
178 Histo* HBandY(int_4 n) const;
179 void GetBandX(int_4 n,r_8& ybmin,r_8& ybmax) const;
180 void GetBandY(int_4 n,r_8& xbmin,r_8& xbmax) const;
181 void ShowBand(int_4 lp = 0) const;
182
183 // SLICES
184 //! Retourne le nombre de slices selon X
185 inline int_4 NSliX() const {return mLSlix.size();}
186 //! Retourne le nombre de slices selon Y
187 inline int_4 NSliY() const {return mLSliy.size();}
188 int_4 SetSliX(int_4 nsli);
189 int_4 SetSliY(int_4 nsli);
190 void DelSliX();
191 void DelSliY();
192 void ZeroSliX();
193 void ZeroSliY();
194 Histo* HSliX(int_4 n) const;
195 Histo* HSliY(int_4 n) const;
196 void ShowSli(int_4 lp = 0) const;
197
198#ifndef __DECCXX
199protected:
200#endif
201 //! structure de definition des bandes
202 struct bande_slice {
203 int_4 num; //!< nombre de bandes
204 r_8 min; //!< limite minimum pour remplir la bande
205 r_8 max; //!< limite maximum pour remplir la bande
206 Histo* H; //!< pointer sur l Histo 1D de la bande
207 STRUCTCOMP(bande_slice)
208 };
209#ifdef __DECCXX
210protected:
211#endif
212
213 void Delete();
214
215 r_8* mData; //!< donnees
216 r_8* mErr2; //!< erreurs carrees
217
218 r_8 mOver[3][3]; //!< overflow table
219 r_8 nHist; //!< somme ponderee des entrees
220 int_4 nEntries; //!< nombre d'entrees
221
222 int_4 mNx; //!< nombre de bins en X
223 int_4 mNy; //!< nombre de bins en Y
224 int_4 mNxy; //!< nombre de bins total
225 r_8 mXmin; //!< abscisse minimum
226 r_8 mXmax; //!< abscisse maximum
227 r_8 mYmin; //!< ordonnee minimum
228 r_8 mYmax; //!< ordonnee maximum
229 r_8 mWBinx; //!< largeur du bin en X
230 r_8 mWBiny; //!< largeur du bin en Y
231
232 bande_slice mB_s;
233
234 Histo* mHprojx; //!< pointer sur Histo des proj X
235 Histo* mHprojy; //!< pointer sur Histo des proj Y
236
237 list<bande_slice> mLBandx; //!< liste des bandes selon X
238 list<bande_slice> mLBandy; //!< liste des bandes selon Y
239
240 list<bande_slice> mLSlix; //!< liste des slices selon X
241 list<bande_slice> mLSliy; //!< liste des slices selon Y
242
243};
244
245/*! Prints histogram information on stream \b s (h.Show(s)) */
246inline ostream& operator << (ostream& s, Histo2D const & h)
247 { h.Show(s); return(s); }
248
249/////////////////////////////////////////////////////////////////////////
250// Classe pour la gestion de persistance
251
252/*! \ingroup HiStats \fn operator<<(POuttPersist&,Histo2D)
253 \brief Persistance management */
254inline POutPersist& operator << (POutPersist& os, Histo2D & obj)
255{ ObjFileIO<Histo2D> fio(&obj); fio.Write(os); return(os); }
256/*! \ingroup HiStats \fn operator<<(POuttPersist&,Histo2D)
257 \brief Persistance management */
258inline PInPersist& operator >> (PInPersist& is, Histo2D & obj)
259{ ObjFileIO<Histo2D> fio(&obj); is.SkipToNextObject(); fio.Read(is); return(is); }
260
261// Classe pour la gestion de persistance
262// ObjFileIO<Histo2D>
263
264/*! \ingroup HiStats \fn operator*(const Histo2D&,r_8)
265 \brief Operateur H2 = H1 * b */
266inline Histo2D operator * (const Histo2D& a, r_8 b)
267{
268 Histo2D result(a);
269 return (result *= b);
270}
271
272/*! \ingroup HiStats \fn operator*(r_8,const Histo2D&)
273 \brief Operateur H2 = b * H1 */
274inline Histo2D operator * (r_8 b, const Histo2D& a)
275{
276 Histo2D result(a);
277 return (result *= b);
278}
279
280/*! \ingroup HiStats \fn operator/(const Histo2D&,r_8)
281 \brief Operateur H2 = H1 / b */
282inline Histo2D operator / (const Histo2D& a, r_8 b)
283{
284 Histo2D result(a);
285 return (result /= b);
286}
287
288/*! \ingroup HiStats \fn operator+(const Histo2D&,r_8)
289 \brief Operateur H2 = H1 + b */
290inline Histo2D operator + (const Histo2D& a, r_8 b)
291{
292 Histo2D result(a);
293 return (result += b);
294}
295
296/*! \ingroup HiStats \fn operator+(r_8,const Histo2D&)
297 \brief Operateur H2 = b + H1 */
298inline Histo2D operator + (r_8 b, const Histo2D& a)
299{
300 Histo2D result(a);
301 return (result += b);
302}
303
304/*! \ingroup HiStats \fn operator-(const Histo2D&,r_8)
305 \brief Operateur H2 = H1 - b */
306inline Histo2D operator - (const Histo2D& a, r_8 b)
307{
308 Histo2D result(a);
309 return (result -= b);
310}
311
312/*! \ingroup HiStats \fn operator-(r_8,const Histo2D&)
313 \brief Operateur H2 = b - H1 */
314inline Histo2D operator - (r_8 b, const Histo2D& a)
315{
316 Histo2D result(a);
317 result *= -1.;
318 return (result += b);
319}
320
321/*! \ingroup HiStats \fn operator+(const Histo2D&,const Histo2D&)
322 \brief Operateur H = H1 + H2 */
323
324inline Histo2D operator + (const Histo2D& a, const Histo2D& b)
325{
326if (b.NBinX()!=a.NBinX() || b.NBinY()!=a.NBinY()) throw SzMismatchError(PExcLongMessage(""));
327Histo2D c(a);
328return (c += b);
329}
330
331/*! \ingroup HiStats \fn operator-(const Histo2D&,const Histo2D&)
332 \brief Operateur H = H1 - H2 */
333inline Histo2D operator - (const Histo2D& a, const Histo2D& b)
334{
335if (b.NBinX()!=a.NBinX() || b.NBinY()!=a.NBinY()) throw SzMismatchError(PExcLongMessage(""));
336Histo2D c(a);
337return (c -= b);
338}
339
340/*! \ingroup HiStats \fn operator*(const Histo2D&,const Histo2D&)
341 \brief Operateur H = H1 * H2 */
342inline Histo2D operator * (const Histo2D& a, const Histo2D& b)
343{
344if (b.NBinX()!=a.NBinX() || b.NBinY()!=a.NBinY()) throw SzMismatchError(PExcLongMessage(""));
345Histo2D c(a);
346return (c *= b);
347}
348
349/*! \ingroup HiStats \fn operator/(const Histo2D&,const Histo2D&)
350 \brief Operateur H = H1 / H2 */
351inline Histo2D operator / (const Histo2D& a, const Histo2D& b)
352{
353if (b.NBinX()!=a.NBinX() || b.NBinY()!=a.NBinY()) throw SzMismatchError(PExcLongMessage(""));
354Histo2D c(a);
355return (c /= b);
356}
357
358} // Fin du namespace
359
360#endif // HISTOS2_SEEN
Note: See TracBrowser for help on using the repository browser.