#include "machdefs.h" #include #include #include #include "perrors.h" #include "fioarr.h" #include "hist2err.h" namespace SOPHYA { /*! \class Histo2DErr \ingroup HiStats Classe d'histogrammes 1D avec erreurs donnees par l'utilisateur */ /********* Methode *********/ /*! Constructeur par defaut */ Histo2DErr::Histo2DErr(void) : xmin_(1.), xmax_(-1.), dx_(0.) , ymin_(1.), ymax_(-1.), dy_(0.) , nx_(0), ny_(0), mMean(0) { } /********* Methode *********/ /*! Constructeur d'un histo */ Histo2DErr::Histo2DErr(r_8 xmin,r_8 xmax,int_4 nx,r_8 ymin,r_8 ymax,int_4 ny) { CreateOrResize(xmin,xmax,nx,ymin,ymax,ny); } /********* Methode *********/ /*! Constructeur par copie */ Histo2DErr::Histo2DErr(const Histo2DErr& H) : xmin_(1.), xmax_(-1.), dx_(0.) , ymin_(1.), ymax_(-1.), dy_(0.) , nx_(0), ny_(0), mMean(0) { if(H.nx_<=0 || H.ny_<=0) return; CreateOrResize(H.xmin_,H.xmax_,H.nx_,H.ymin_,H.ymax_,H.ny_); data_ = H.data_; err2_ = H.err2_; ndata_ = H.ndata_; mMean = H.mMean; } /********* Methode *********/ /*! Destructeur */ Histo2DErr::~Histo2DErr(void) { mMean = 0; } /********* Methode *********/ /*! Gestion de l'allocation */ void Histo2DErr::CreateOrResize(r_8 xmin,r_8 xmax,int_4 nx,r_8 ymin,r_8 ymax,int_4 ny) { xmin_ = xmin; xmax_ = xmax; nx_ = nx; dx_=0.; ymin_ = ymin; ymax_ = ymax; ny_ = ny; dy_=0.; if(nx_>0 && ny_>0) { data_.ReSize(nx_,ny_); data_ = 0.; err2_.ReSize(nx_,ny_); err2_ = 0.; ndata_.ReSize(nx_,ny_); ndata_ = 0.; dx_ = (xmax_-xmin_)/nx_; dy_ = (ymax_-ymin_)/ny_; } mMean = 0; } /********* Methode *********/ /*! Remise a zero */ void Histo2DErr::Zero(void) { if(nx_<=0 || ny_<=0) return; data_ = 0.; err2_ = 0.; ndata_ = 0.; mMean = 0; } /********* Methode *********/ /*! Recompute XMin (YMin) and XMax (YMax) so that the CENTER of the first bin is exactly XMin (YMin) and the CENTER of the last bin is exactly XMax (YMax). Remember that otherwise XMin (YMin) is the beginning of the first bin and XMax (YMax) is the end of the last bin WARNING: number of bins is kept, bin width is changed */ void Histo2DErr::ReCenterBinX(void) { if(nx_<=1) return; double dx = (xmax_-xmin_)/(nx_-1); xmin_ -= dx/2.; xmax_ += dx/2.; dx_ = (xmax_-xmin_)/nx_; } void Histo2DErr::ReCenterBinY(void) { if(ny_<=1) return; double dy = (ymax_-ymin_)/(ny_-1); ymin_ -= dy/2.; ymax_ += dy/2.; dy_ = (ymax_-ymin_)/ny_; } void Histo2DErr::ReCenterBin(void) { ReCenterBinX(); ReCenterBinY(); } /********* Methode *********/ /*! Recompute XMin (YMin) and XMax (YMax) so that the CENTER of the first bin is exactly XMin (YMin) and the CENTER of the last bin is exactly XMax (YMax). Remember that otherwise XMin (YMin) is the beginning of the first bin and XMax (YMax) is the end of the last bin WARNING: bin widths are kept, numbers of bins are increased by 1 */ void Histo2DErr::ReCenterBinW(void) { CreateOrResize(xmin_-dx_/2.,xmax_+dx_/2.,nx_+1,ymin_-dy_/2.,ymax_+dy_/2.,ny_+1); } /********* Methode *********/ /*! Compute the mean histogram. Each bin content is divided by the number of entries in the bin. Each squared error is divided by the number of entries in the bin. The number of entries by bin is NOT set to 1 (calling ToMean many time will change the histogram !) */ void Histo2DErr::ToMean(void) { if(nx_<1 || ny_<1) return; mMean++; for(int_4 i=0;i=ny_ || ii<0 || ii>=nx_) continue; data_(ii,jj) += hfrom.data_(ii,jj); err2_(ii,jj) += hfrom.err2_(ii,jj); ndata_(ii,jj) += hfrom.ndata_(ii,jj); } } mMean = hfrom.mMean; } /********* Methode *********/ /*! Operateur egal Histo2DErr = Histo2DErr */ Histo2DErr& Histo2DErr::operator = (const Histo2DErr& h) { if(this==&h) return *this; CreateOrResize(h.xmin_,h.xmax_,h.nx_,h.ymin_,h.ymax_,h.ny_); data_ = h.data_; err2_ = h.err2_; ndata_ = h.ndata_; mMean = h.mMean; return *this; } /********* Methode *********/ /*! Operateur de multiplication par une constante */ Histo2DErr& Histo2DErr::operator *= (r_8 b) { r_8 b2 = b*b; for(int_4 i=0;i , pour SGI-CC en particulier */ void ObjFileIO::ReadSelf(PInPersist& is) { string strg; if(dobj==NULL) dobj = new Histo2DErr; // Lecture entete is.GetStr(strg); // Nombre d'appels a ToMean/FromMean is.Get(dobj->mMean); // Lecture des parametres Histo2DErr is.Get(dobj->xmin_); is.Get(dobj->xmax_); is.Get(dobj->nx_); is.Get(dobj->dx_); is.Get(dobj->ymin_); is.Get(dobj->ymax_); is.Get(dobj->ny_); is.Get(dobj->dy_); // Lecture des donnees if(dobj->nx_>0 && dobj->ny_>0) { is >> dobj->data_; is >> dobj->err2_; is >> dobj->ndata_; } return; } DECL_TEMP_SPEC /* equivalent a template <> , pour SGI-CC en particulier */ void ObjFileIO::WriteSelf(POutPersist& os) const { if(dobj == NULL) return; string strg; // Ecriture entete strg = "Hist2DErr"; os.PutStr(strg); // Nombre d'appels a ToMean/FromMean os.Put(dobj->mMean); // Ecriture des parametres Histo2DErr os.Put(dobj->xmin_); os.Put(dobj->xmax_); os.Put(dobj->nx_); os.Put(dobj->dx_); os.Put(dobj->ymin_); os.Put(dobj->ymax_); os.Put(dobj->ny_); os.Put(dobj->dy_); // Ecriture des donnees if(dobj->nx_>0 && dobj->ny_>0) { os << dobj->data_; os << dobj->err2_; os << dobj->ndata_; } return; } #ifdef __CXX_PRAGMA_TEMPLATES__ #pragma define_template ObjFileIO #endif #if defined(ANSI_TEMPLATES) || defined(GNU_TEMPLATES) template class ObjFileIO; #endif } // FIN namespace SOPHYA