Index: trunk/SophyaLib/HiStats/histerr.cc
===================================================================
--- trunk/SophyaLib/HiStats/histerr.cc	(revision 2603)
+++ trunk/SophyaLib/HiStats/histerr.cc	(revision 2603)
@@ -0,0 +1,163 @@
+#include "machdefs.h"
+#include <string.h>
+#include <stdio.h>
+#include <math.h>
+#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)
+{
+}
+
+/********* 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(xMin,xMax,nBin), mNData((nBin>0) ? new uint_4[nBin] : NULL)
+{
+ this->Errors();
+ if(mNData) memset(mNData,0,mBins*sizeof(uint_4));
+}
+
+/********* Methode *********/
+/*! Constructeur par copie */
+HistoErr::HistoErr(const HistoErr& H)
+: Histo(H), mNData((H.mBins>0)? new uint_4[H.mBins] : NULL)
+{
+ if(mBins>0) memcpy(mNData,H.mNData,mBins*sizeof(uint_4));
+}
+
+/********* Methode *********/
+/*! Destructeur */
+HistoErr::~HistoErr(void)
+{
+ if(mNData) {delete [] mNData; mNData=NULL;}
+}
+
+/********* Methode *********/
+/*!
+  Remise a zero
+*/
+void HistoErr::Zero(void)
+{
+ if(mNData != NULL) memset(mNData,0,mBins*sizeof(uint_4));
+ Histo::Zero();
+}
+
+/********* Methode *********/
+/*!
+ Addition du contenu de l'histo pour abscisse x poids w et l'erreur e
+*/
+void HistoErr::Add(r_8 x, r_8 w, r_8 e)
+{
+ int_4 numBin = (int_4)floor((x-mMin)/binWidth);
+ if(numBin<0) mUnder += w;
+ else if(numBin>=mBins) mOver += w;
+ else {
+   mData[numBin] += w; mNData[numBin]++; mErr2[numBin] += e*e;
+   nHist += w; nEntries++;
+ }
+}
+
+/********* Methode *********/
+/*!
+ Addition du contenu de l'histo pour le bin numBin poids w et l'erreur e
+*/
+void HistoErr::AddBin(int_4 numBin, r_8 w, r_8 e)
+{
+ if(numBin<0) mUnder += w;
+ else if(numBin>=mBins) mOver += w;
+ else {
+   mData[numBin] += w; mNData[numBin]++; mErr2[numBin] += e*e;
+   nHist += w; nEntries++;
+ }
+}
+
+/*!
+  Remplissage d'un tableau avec les nombres d'entrees dans le bin de l'histo
+*/
+void HistoErr::GetNBin(TVector<int_4>& v) const
+{
+v.Realloc(mBins);
+for(int_4 i=0;i<mBins;i++) v(i) = mNData[i];
+return;
+}
+
+/********* Methode *********/
+/*!
+  Remplissage du nombre d'entrees dans les bins de l'histo avec les valeurs d'un vecteur
+*/
+void HistoErr::PutNBin(TVector<int_4> &v)
+{
+uint_4 n = (v.NElts()<(uint_4) mBins) ? v.NElts(): (uint_4) mBins;
+if(n>0) for(uint_4 i=0;i<n;i++) mNData[i] = v(i);
+return;
+}
+
+///////////////////////////////////////////////////////////
+// --------------------------------------------------------
+//   Les objets delegues pour la gestion de persistance 
+// --------------------------------------------------------
+///////////////////////////////////////////////////////////
+
+DECL_TEMP_SPEC  /* equivalent a template <> , pour SGI-CC en particulier */
+void ObjFileIO<HistoErr>::ReadSelf(PInPersist& is)
+{
+char strg[256];
+
+if(dobj==NULL) dobj=new HistoErr;
+  else         dobj->Delete();
+
+// Lecture entete
+is.GetLine(strg, 255);
+
+// Lecture des donnees HistoErr
+is.Get(dobj->mBins);
+is.GetLine(strg, 255);
+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<HistoErr>::WriteSelf(POutPersist& os) const
+{
+if(dobj == NULL)   return;
+char strg[256];
+
+sprintf(strg,"HistErr");
+os.PutLine(strg);
+
+// Ecriture des valeurs
+os.Put(dobj->mBins);
+
+// Ecriture des donnees HistoErr nombre d entree par bin
+sprintf(strg,"Tableau du nombre d entree par bin");
+os.PutLine(strg);
+os.Put(dobj->mNData, dobj->mBins);
+
+// Ecriture de l'histogramme
+os << (Histo&)(*dobj);
+
+return;
+}
+
+#ifdef __CXX_PRAGMA_TEMPLATES__
+#pragma define_template ObjFileIO<HistoErr>
+#endif
+
+#if defined(ANSI_TEMPLATES) || defined(GNU_TEMPLATES)
+template class ObjFileIO<HistoErr>;
+#endif
Index: trunk/SophyaLib/HiStats/histerr.h
===================================================================
--- trunk/SophyaLib/HiStats/histerr.h	(revision 2603)
+++ trunk/SophyaLib/HiStats/histerr.h	(revision 2603)
@@ -0,0 +1,52 @@
+#ifndef HISTERR_SEEN
+#define HISTERR_SEEN
+
+#include "objfio.h"
+#include <iostream>
+#include <stdio.h>
+#include "histos.h"
+
+namespace SOPHYA {
+
+//! 1 dimension histograms with errors given by user
+class HistoErr : public Histo {
+  friend class ObjFileIO<HistoErr>;
+public:
+
+  // CREATOR / DESTRUCTOR
+  HistoErr(void);
+  HistoErr(r_8 xMin, r_8 xMax, int_4 nBin=100);
+  HistoErr(const HistoErr& H);
+  virtual ~HistoErr(void);
+
+  // UPDATING or SETTING
+  void Zero(void);
+  //! Addition du contenu de l'histo pour abscisse x poids w et l'erreur e
+  void Add(r_8 x, r_8 w=1., r_8 e=1.);
+  //! Addition du contenu de l'histo pour le bin numBin poids w et l'erreur e
+  void AddBin(int_4 numBin, r_8 w=1., r_8 e=1.);
+
+  //! Retourne le nombre d'entree dans le bin
+  inline uint_4 NEntBin(int_4 i) const
+         {if(mNData) return mNData[i]; else return 0;}
+
+  // get/put dans/depuis un vector
+  void GetNBin(TVector<int_4>& v) const;
+  void PutNBin(TVector<int_4>& v);
+
+protected:
+  uint_4* mNData;    //!< nombre d'entrees dans chaque bin
+};
+
+/*! \ingroup HiStats \fn operator<<(POuttPersist&,HistoErr)
+  \brief Persistance management */
+inline POutPersist& operator << (POutPersist& os, HistoErr & obj)
+{ ObjFileIO<HistoErr> fio(&obj);  fio.Write(os);  return(os); }
+/*! \ingroup HiStats \fn operator<<(POuttPersist&,HistoErr)
+  \brief Persistance management */
+inline PInPersist& operator >> (PInPersist& is, HistoErr & obj)
+{ ObjFileIO<HistoErr> fio(&obj); is.SkipToNextObject(); fio.Read(is); return(is); }
+
+} // Fin du namespace
+
+#endif // HISTERR_SEEN
Index: trunk/SophyaLib/HiStats/histinit.cc
===================================================================
--- trunk/SophyaLib/HiStats/histinit.cc	(revision 2602)
+++ trunk/SophyaLib/HiStats/histinit.cc	(revision 2603)
@@ -8,4 +8,5 @@
 #include "histos2.h"
 #include "hisprof.h"
+#include "histerr.h"
 #include "ntuple.h"
 #include "xntuple.h"
@@ -37,4 +38,6 @@
   PPRegister(ObjFileIO<HProf>);
   DObjRegister(ObjFileIO<HProf>, HProf);
+  PPRegister(ObjFileIO<HistoErr>);
+  DObjRegister(ObjFileIO<HistoErr>, HistoErr);
 
   PPRegister(ObjFileIO<NTuple>);
