Index: trunk/SophyaLib/HiStats/histerr.h
===================================================================
--- trunk/SophyaLib/HiStats/histerr.h	(revision 3118)
+++ trunk/SophyaLib/HiStats/histerr.h	(revision 3123)
@@ -5,5 +5,5 @@
 #include <iostream>
 #include <stdio.h>
-#include "histos.h"
+#include "tvector.h"
 
 namespace SOPHYA {
@@ -12,58 +12,103 @@
 template <class T>  class FitsHandler;
 
-//! 1 dimension histograms with errors given by user
-class HistoErr : public Histo {
+
+//! 1 dimensions histograms with errors given by user
+class HistoErr : public AnyDataObj {
   friend class ObjFileIO<HistoErr>;
-  friend class FitsHandler<Histo>;
+  friend class FitsHandler<HistoErr>;
 public:
 
-  // CREATOR / DESTRUCTOR
+  //! Create or destroy
   HistoErr(void);
-  HistoErr(r_8 xMin, r_8 xMax, int_4 nBin=100);
+  HistoErr(r_8 xmin,r_8 xmax,int_4 nx);
   HistoErr(const HistoErr& H);
   virtual ~HistoErr(void);
 
-  // UPDATING or SETTING
+  //! Updating or Setting
+  void ReCenterBin(void);
   void Zero(void);
-  //! Addition du contenu de l'histo pour abscisse x poids w et l'erreur e
-  inline void 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] += 1.; mErr2[numBin] += e*e;
-    nHist += w; nEntries++;
-  }
-  }
-  inline void Add(r_8 x, r_8 w) {Add(x,w,1.);}
-  inline void Add(r_8 x) {Add(x,1.,1.);}
-  //! Addition du contenu de l'histo pour le bin numBin poids w et l'erreur e
-  inline void 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] += 1.; mErr2[numBin] += e*e;
-    nHist += w; nEntries++;
-  }
-  }
-  inline void AddBin(int_4 numBin, r_8 w) {AddBin(numBin,w,1.);}
-  inline void AddBin(int_4 numBin) {AddBin(numBin,1.,1.);}
-  //! remplissage contenu de l'histo pour le bin numBin poids w et l'erreur e
-  void SetBin(int_4 numBin, r_8 w, r_8 e, r_8 nb);
-  inline void SetBin(int_4 numBin, r_8 w, r_8 e) {SetBin(numBin,w,e,1.);}
-  inline void SetBin(int_4 numBin, r_8 w) {SetBin(numBin,w,1.,1.);}
-  inline void SetBin(int_4 numBin) {SetBin(numBin,1.,1.,1.);}
-  //! remplissage nombre d'entrees pour le bin numBin
-  void SetNentB(int_4 numBin, r_8 nb=1.);
+
+  //! Getting Info
+  int_4 NBins(void) {return nx_;}
+  r_8 XMin(void) {return xmin_;}
+  r_8 XMax(void) {return xmax_;}
+  r_8 BinWidth(void) {return dx_;}
+
+  //! Retourne le contenu du bin
+  inline r_8 operator()(int_4 i) const
+    {
+    if(i<0 || i>=nx_) return 0.;
+    return data_(i);
+    }
+  inline r_8& operator()(int_4 i)
+    {
+    return data_(i);
+    }
+
+  //! Retourne le nombre l'erreur au carre dans le bin
+  inline r_8 Error2(int_4 i) const
+    {
+    if(i<0 || i>=nx_) return 0.;
+    return err2_(i);
+    }
 
   //! Retourne le nombre d'entree dans le bin
   inline r_8 NEntBin(int_4 i) const
-         {if(mNData) return mNData[i]; else return 0.;}
+    {
+    if(i<0 || i>=nx_) return 0.;
+    return ndata_(i);
+    }
 
-  //! get/put from/to a vector
-  void GetNBin(TVector<r_8>& v) const;
-  void PutNBin(TVector<r_8>& v);
+  //! Retourne l'abscisse et l'ordonnee du coin inferieur du bin i.
+  inline r_8 BinLowEdge(int_4 i) const {return xmin_ + i*dx_;}
+  //! Retourne l'abscisse et l'ordonnee du centre du bin i.
+  inline r_8 BinCenter(int_4 i) const  {return xmin_ + (i+0.5)*dx_;}
+  //! Retourne l'abscisse et l'ordonnee du coin superieur du bin i.
+  inline r_8 BinHighEdge(int_4 i) const {return xmin_ + (i+1)*dx_;}
+  //! Retourne les numeros du bin contenant l'abscisse et l'ordonnee x,y.
+  inline int_4 FindBin(r_8 x) const {return (int_4)floor((x-xmin_)/dx_);}
+
+  //! Addition du contenu de l'histo pour abscisse x poids w et l'erreur e
+  inline void Add(r_8 x, r_8 w, r_8 e)
+    {
+    int_4 i = FindBin(x);
+    if(i<0 || i>=nx_) return;
+    data_(i) += w; ndata_(i) += 1.; err2_(i) += e*e;
+    }
+  inline void Add(r_8 x, r_8 w) {Add(x,w,1.);}
+  inline void Add(r_8 x) {Add(x,1.,1.);}
+
+  //! Addition du contenu de l'histo pour le bin i poids w et l'erreur e
+  inline void AddBin(int_4 i, r_8 w, r_8 e)
+    {
+    if(i<0 || i>=nx_) return;
+    data_(i) += w; ndata_(i) += 1.; err2_(i) += e*e;
+    }
+  inline void AddBin(int_4 i, r_8 w) {AddBin(i,w,1.);}
+  inline void AddBin(int_4 i) {AddBin(i,1.,1.);}
+
+  //! remplissage contenu de l'histo pour le bin i poids w et l'erreur e
+  inline void SetBin(int_4 i, r_8 w, r_8 e, r_8 nb)
+    {
+    if(i<0 || i>=nx_) return;
+    data_(i)  = w;
+    err2_(i)  = e*e;
+    ndata_(i) = nb;
+    }
+  inline void SetBin(int_4 i, r_8 w, r_8 e) {SetBin(i,w,e,1.);}
+  inline void SetBin(int_4 i, r_8 w) {SetBin(i,w,1.,1.);}
+  inline void SetBin(int_4 i) {SetBin(i,1.,1.,1.);}
+  //! remplissage de l'erreur carree pour le bin i
+  void SetErr2(int_4 i, r_8 e2)
+    {
+    if(i<0 || i>=nx_) return;
+    err2_(i) = e2;
+    }
+  //! remplissage nombre d'entrees pour le bin i
+  void SetNentB(int_4 i, r_8 nb)
+    {
+    if(i<0 || i>=nx_) return;
+    ndata_(i) = nb;
+    }
 
   //! Compute the correlation histogram
@@ -76,4 +121,9 @@
   void FillFrHErr(HistoErr& hfrom);
 
+  //! Recuperation des matrices elementaires
+  inline void GetData(TVector<r_8>& data) {data = data_;}
+  inline void GetError2(TVector<r_8>& err2) {err2 = err2_;}
+  inline void GetNData(TVector<r_8>& ndata) {ndata = ndata_;}
+
   // Operators
   HistoErr& operator = (const HistoErr& h);
@@ -84,8 +134,11 @@
 
 protected:
-  void CreateOrResize(r_8 xMin, r_8 xMax, int_4 nBin);
-  void Delete(void);
+  void CreateOrResize(r_8 xmin,r_8 xmax,int_4 nx);
 
-  r_8* mNData;    //!< nombre d'entrees dans chaque bin
+  r_4 xmin_,xmax_,dx_;
+  int_4 nx_;
+  TVector<r_8> data_;
+  TVector<r_8> err2_;
+  TVector<r_8> ndata_;
   int_4 mCorrel;  //!< Nombre d'appels a ToCorrel(+1) ou FromCorrel(-1)
 };
