#include "sopnamsp.h" #include "machdefs.h" #include #include #include #include "histinit.h" #include "histerr.h" #include "perrors.h" /*! \class SOPHYA::HistoErr \ingroup HiStats Classe d'histogrammes 1D avec erreurs donnees par l'utilisateur */ /********* Methode *********/ /*! Constructeur par defaut */ HistoErr::HistoErr(void) : Histo(), mNData(NULL), mCorrel(0) { } /********* Methode *********/ /*! Constructeur d'un histo de nBin bins allant de xMin a xMax */ HistoErr::HistoErr(r_8 xMin, r_8 xMax, int_4 nBin) : Histo(), mNData(NULL) { CreateOrResize(xMin,xMax,nBin); } /********* Methode *********/ /*! Constructeur par copie */ HistoErr::HistoErr(const HistoErr& H) : Histo(H), mNData((H.mBins>0)? new r_8[H.mBins] : NULL), mCorrel(H.mCorrel) { if(mNData>0) memcpy(mNData,H.mNData,mBins*sizeof(r_8)); } /********* Methode *********/ /*! Destructeur */ HistoErr::~HistoErr(void) { Delete(); } /********* Methode *********/ /*! Gestion de l'allocation */ void HistoErr::CreateOrResize(r_8 xMin, r_8 xMax, int_4 nBin) { //cout<<"HistoErr::CreateOrResize()"<0 && mNData==NULL) mNData = new r_8[nBin]; if(mNData) memset(mNData,0,nBin*sizeof(r_8)); mCorrel = 0; } /********* Methode *********/ /*! Delete des tableaux */ void HistoErr::Delete(void) { //cout<<"HistoErr::Delete()"<=0 && numBin& v) const { v.Realloc(mBins); for(int_4 i=0;i &v) { int_4 n = (v.NElts()0) for(int_4 i=0;i=mBins) mOver += hfrom.mData[i]; else { mData[numBin] += hfrom.mData[i]; mNData[numBin] += hfrom.mNData[i]; mErr2[numBin] += hfrom.mErr2[i]; nHist += hfrom.mData[i]; nEntries++; } } mCorrel = hfrom.mCorrel; } /********* Methode *********/ /*! Operateur egal HistoErr = HistoErr */ HistoErr& HistoErr::operator = (const HistoErr& h) { if(this==&h) return *this; CreateOrResize(h.mMin,h.mMax,h.mBins); if(mData) memcpy(mData,h.mData,mBins*sizeof(r_8)); if(mErr2) memcpy(mErr2,h.mErr2,mBins*sizeof(r_8)); mUnder = h.mUnder; mOver = h.mOver; nHist = h.nHist; nEntries = h.nEntries; if(mNData) memcpy(mNData,h.mNData,mBins*sizeof(r_8)); mCorrel = h.mCorrel; return *this; } /********* Methode *********/ /*! Print info */ void HistoErr::Show(ostream & os) const { Histo::Show(os); os <<" ncorrel="< , pour SGI-CC en particulier */ void ObjFileIO::ReadSelf(PInPersist& is) { string strg; if(dobj==NULL) dobj=new HistoErr; else dobj->Delete(); // Lecture entete is.GetStr(strg); // Nombre d'appels a ToCorrel/FromCorrel is.Get(dobj->mCorrel); // Lecture des donnees HistoErr is.Get(dobj->mBins); if(dobj->mBins>0) dobj->mNData = new r_8[dobj->mBins]; is.Get(dobj->mNData, dobj->mBins); // Lecture de l'histogramme is >> (Histo&)(*dobj); 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 = "HistErr"; os.PutStr(strg); // Nombre d'appels a ToCorrel/FromCorrel os.Put(dobj->mCorrel); // Ecriture des valeurs os.Put(dobj->mBins); // Ecriture des donnees HistoErr nombre d entree par bin os.Put(dobj->mNData, dobj->mBins); // Ecriture de l'histogramme os << (Histo&)(*dobj); return; } #ifdef __CXX_PRAGMA_TEMPLATES__ #pragma define_template ObjFileIO #endif #if defined(ANSI_TEMPLATES) || defined(GNU_TEMPLATES) template class SOPHYA::ObjFileIO; #endif