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

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

Histos/Hprof/Histo2D en r_8 cmv 26/7/00

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