Index: trunk/SophyaLib/HiStats/hisprof.cc
===================================================================
--- trunk/SophyaLib/HiStats/hisprof.cc	(revision 1053)
+++ trunk/SophyaLib/HiStats/hisprof.cc	(revision 1056)
@@ -47,10 +47,14 @@
 HProf::HProf(const HProf& H)
 : Histo(H)
-, SumY(new double[H.bins]), SumY2(new double[H.bins]), SumW(new double[H.bins])
+, SumY((H.bins>0)  ? new double[H.bins] : NULL)
+, SumY2((H.bins>0) ? new double[H.bins] : NULL)
+, SumW((H.bins>0)  ? new double[H.bins] : NULL)
 , Ok(H.Ok), YMin(H.YMin), YMax(H.YMax), Opt(H.Opt)
 {
-  memcpy(SumY,  H.SumY,  bins*sizeof(double));
-  memcpy(SumY2, H.SumY2, bins*sizeof(double));
-  memcpy(SumW,  H.SumW,  bins*sizeof(double));
+  if(bins>0) {
+    memcpy(SumY,  H.SumY,  bins*sizeof(double));
+    memcpy(SumY2, H.SumY2, bins*sizeof(double));
+    memcpy(SumW,  H.SumW,  bins*sizeof(double));
+  }
   END_CONSTRUCTOR
 }
@@ -125,6 +129,6 @@
 void HProf::UpdateHisto() const
 {
-
 float m,e2;
+if(bins<=0) return;
 for(int i=0;i<bins;i++) {
   if(SumW[i]<=0.) {
@@ -185,5 +189,5 @@
 /********* Methode *********/
 /*!
-  Operateur H = H1
+  Operateur HProf H = H1
 */
 HProf& HProf::operator = (const HProf& h)
@@ -209,5 +213,5 @@
 /********* Methode *********/
 /*!
-  Operateur H += H1
+  Operateur HProf H += H1
 
   Attention dans cette addition il n'y a pas de gestion
@@ -273,5 +277,5 @@
 char strg[256];
 
-dobj->UpdateHisto();
+if(!(dobj->IsOk())) dobj->UpdateHisto();
 
 // Ecriture entete pour identifier facilement
Index: trunk/SophyaLib/HiStats/hisprof.h
===================================================================
--- trunk/SophyaLib/HiStats/hisprof.h	(revision 1053)
+++ trunk/SophyaLib/HiStats/hisprof.h	(revision 1056)
@@ -22,30 +22,35 @@
 
   // UPDATING or SETTING
-  void   Zero();
-  void   UpdateHisto() const;
-  void   SetErrOpt(bool spread = true);
-  void   Add(float x, float y, float w = 1.);
-  void   AddBin(int numBin, float y, float w = 1.);
+  void UpdateHisto() const;
+  void SetErrOpt(bool spread = true);
+  void Zero();
+  void Add(float x, float y, float w = 1.);
+  void AddBin(int numBin, float y, float w = 1.);
   
   // Acces a l information
+  //! Retourne true si l'histogramme est a jours, false sinon.
+  inline bool IsOk() const {return Ok;}
   //! Retourne l'histogramme de profil.
   inline Histo GetHisto()
                {if(!Ok) UpdateHisto(); return (Histo) *this;}
   //! Retourne le contenu de la moyenne dans le vecteur v
-  inline void GetMean(TVector<r_8>& v)
+  inline void GetValue(TVector<r_8>& v)
               {if(!Ok) UpdateHisto(); Histo::GetValue(v);}
   //! Retourne le contenu au carre de la dispersion/erreur dans le vecteur v
   inline void GetError2(TVector<r_8>& v)
               {if(!Ok) UpdateHisto(); Histo::GetError2(v);}
+  //! Retourne le contenu au carre de la dispersion/erreur dans le vecteur v
+  inline void GetError(TVector<r_8>& v)
+              {if(!Ok) UpdateHisto(); Histo::GetError(v);}
   //! Retourne le contenu du bin i
   inline float operator()(int i) const
                {if(!Ok) UpdateHisto(); return data[i];}
   //! Retourne le carre de la dispersion/erreur du bin i
-  inline float Error2(int i) const
-               {if(!Ok) UpdateHisto(); return (float) err2[i];}
+  inline double Error2(int i) const
+         {if(!Ok) UpdateHisto(); return (float) err2[i];}
   //! Retourne la dispersion/erreur du bin i
   inline float Error(int i) const
          {if(!Ok) UpdateHisto();
-          return err2[i]>0. ? (float) sqrt(err2[i]) : 0.f;}
+          return (err2[i]>0.) ? (float) sqrt(err2[i]) : 0.f;}
 
   // Operators
@@ -55,17 +60,22 @@
   // Fit
   //! Fit du profile par ``gfit''.
-  inline int    Fit(GeneralFit& gfit)
+  inline int Fit(GeneralFit& gfit)
          {if(!Ok) UpdateHisto(); return Histo::Fit(gfit,0);}
   //! Retourne l'Histogramme des residus par ``gfit''.
-  inline Histo  FitResidus(GeneralFit& gfit)
+  inline Histo FitResidus(GeneralFit& gfit)
          {if(!Ok) UpdateHisto(); return Histo::FitResidus(gfit);}
   //! Retourne l'Histogramme de la fonction fittee par ``gfit''.
-  inline Histo  FitFunction(GeneralFit& gfit)
+  inline Histo FitFunction(GeneralFit& gfit)
          {if(!Ok) UpdateHisto(); return Histo::FitFunction(gfit);}
 
   // Print
   //! Print, voir detail dans Histo::Print
-  inline void Print(int dyn=100,float hmin=1.,float hmax=-1.,int pflag=0,int il=1,int ih=-1)
-              {if(!Ok) UpdateHisto(); Histo::Print(dyn,hmin,hmax,pflag,il,ih);}
+  inline void Print(int dyn=100,float hmin=1.,float hmax=-1.
+                   ,int pflag=0,int il=1,int ih=-1)
+         {if(!Ok) UpdateHisto(); Histo::Print(dyn,hmin,hmax,pflag,il,ih);}
+  //! PrintF, voir detail dans Histo::PrintF
+  inline void PrintF(FILE * fp,int dyn=100,float hmin=1.,float hmax=-1.
+                    ,int pflag=0,int il=1,int ih=-1)
+         {if(!Ok) UpdateHisto(); Histo::PrintF(fp,dyn,hmin,hmax,pflag,il,ih);}
 
 protected:
@@ -75,5 +85,5 @@
   double*        SumY2; //!< somme des carres
   double*        SumW;  //!< somme des poids
-  bool           Ok;    //!< true isiupdate fait
+  bool           Ok;    //!< true if update fait
   float          YMin;  //!< limite minimum Y pour somme
   float          YMax;  //!< limite maximum Y pour somme
Index: trunk/SophyaLib/HiStats/histos.cc
===================================================================
--- trunk/SophyaLib/HiStats/histos.cc	(revision 1053)
+++ trunk/SophyaLib/HiStats/histos.cc	(revision 1056)
@@ -1,4 +1,4 @@
 //
-// $Id: histos.cc,v 1.6 2000-06-30 13:21:52 ansari Exp $
+// $Id: histos.cc,v 1.7 2000-07-07 08:41:11 ansari Exp $
 //
 
@@ -45,13 +45,16 @@
 /*! Constructeur par copie */
 Histo::Histo(const Histo& H)
-: data(new float[H.bins]), err2(NULL),
+: data((H.bins>0)? new float[H.bins] : NULL),
+  err2(NULL),
   under(H.under), over(H.over), nHist(H.nHist), nEntries(H.nEntries),
   bins(H.bins), min(H.min), max(H.max),
   binWidth(H.binWidth)
 {
-  memcpy(data, H.data, bins*sizeof(float));
-  if( H.err2 != NULL ) {
-    err2 = new double[bins];
-    memcpy(err2, H.err2, bins*sizeof(double));
+  if(bins>0) {
+    memcpy(data, H.data, bins*sizeof(float));
+    if( H.err2 != NULL ) {
+      err2 = new double[bins];
+      memcpy(err2, H.err2, bins*sizeof(double));
+    }
   }
   END_CONSTRUCTOR
@@ -82,4 +85,5 @@
 void Histo::Zero()
 {
+  if(bins<=0) return;
   memset(data, 0, bins*sizeof(float));
   under = over = 0;
@@ -95,21 +99,21 @@
 void Histo::Errors()
 {
- if( bins > 0 ) {
-   if(err2==NULL) err2 = new double[bins];
-   memset(err2, 0, bins*sizeof(double));
- }
-}
-
-/********* Methode *********/
-/*!
-  Operateur egal
+ if(bins<=0) return;
+ if(err2==NULL) err2 = new double[bins];
+ memset(err2, 0, bins*sizeof(double));
+}
+
+/********* Methode *********/
+/*!
+  Operateur egal Histo = Histo
 */
 Histo& Histo::operator = (const Histo& h)
 {
   if(this == &h) return *this;
+  if( h.bins <= 0 ) {Delete(); return *this;}
   if( h.bins > bins ) Delete();
+  if(!h.err2 && err2 ) { delete [] err2; err2=NULL;}
   if(!data) data = new float[h.bins];
-  if( !h.err2 && err2 ) { delete [] err2; err2=NULL;}
-  if( h.err2 && !err2 ) err2 = new double[h.bins];
+  if(h.err2 && !err2 ) err2 = new double[h.bins];
 
   under = h.under;
@@ -817,5 +821,5 @@
   if( nbinew <= 0 ) return;
 
-  // memoraisation de l'histogramme original
+  // memorisation de l'histogramme original
   Histo H(*this);
 
@@ -1324,5 +1328,4 @@
 	      int il, int ih)
 {
-
  
  if( il > ih ) { il = 0; ih = bins-1; }
@@ -1342,5 +1345,6 @@
       << "  min=" << min << "  max=" << max
       << "  binWidth=" << binWidth << endl;
- cout << "       mean=" << Mean() << " r.m.s=" << Sigma() << endl;
+ cout << "       mean=" << Mean() << " r.m.s=" << Sigma() 
+      << "  Errors="<<HasErrors()<< endl;
 
  if(hdyn<0 || pflag<0 ) return;
Index: trunk/SophyaLib/HiStats/histos.h
===================================================================
--- trunk/SophyaLib/HiStats/histos.h	(revision 1053)
+++ trunk/SophyaLib/HiStats/histos.h	(revision 1056)
@@ -1,5 +1,5 @@
 // This may look like C code, but it is really -*- C++ -*-
 //
-// $Id: histos.h,v 1.7 2000-06-30 13:21:53 ansari Exp $
+// $Id: histos.h,v 1.8 2000-07-07 08:41:11 ansari Exp $
 //
 
@@ -28,18 +28,18 @@
   Histo(float xMin, float xMax, int nBin=100);
   Histo(const Histo& H);
-  virtual        ~Histo();
+  virtual ~Histo();
 
   // OPTIONS
-  void   Errors();
+  void Errors();
 
   // UPDATING or SETTING
-  void   Zero();
-  void   Add(float x, float w = 1.);
-  void   AddBin(int numBin, float w = 1.);
-  void   SetBin(float x, float w = 1.);
-  void   SetBin(int numBin, float w = 1.);
-  void   SetErr2(float x, double e2);
-  void   SetErr2(int numBin, double e2);
-  void   SetErr(float x, float e);
+  void Zero();
+  void Add(float x, float w = 1.);
+  void AddBin(int numBin, float w = 1.);
+  void SetBin(float x, float w = 1.);
+  void SetBin(int numBin, float w = 1.);
+  void SetErr2(float x, double e2);
+  void SetErr2(int numBin, double e2);
+  void SetErr(float x, float e);
   void   SetErr(int numBin, float e);
 
@@ -68,76 +68,77 @@
   // INLINES
   //! Retourne l'abscisse minimum
-  inline float          XMin() const             {return min;}
+  inline float XMin() const {return min;}
   //! Retourne l'abscisse maximum
-  inline float          XMax() const             {return max;}
+  inline float XMax() const {return max;}
   //! Retourne le nombre de bins
-  inline int_4          NBins() const            {return bins;}
+  inline int_4 NBins() const {return bins;}
   //! Retourne la largeur du bin
-  inline float          BinWidth() const         {return binWidth;}
+  inline float BinWidth() const {return binWidth;}
   //! Retourne le pointeur sur le tableaux des contenus
-  inline float*         Bins() const             {return data;}
+  inline float* Bins() const {return data;}
   //! Retourne le contenu du bin i
-  inline float          operator()(int i) const  {return data[i];}
+  inline float operator()(int i) const  {return data[i];}
   //! Remplit le contenu du bin i
-  inline float&         operator()(int i)        {return data[i];}
+  inline float& operator()(int i) {return data[i];}
   //! retourne "true" si il y a des erreurs stoquees
-  inline bool           HasErrors() { if(err2) return true; else return false;}
+  inline bool HasErrors()
+         {if(err2) return true; else return false;}
   //! Retourne l'erreur du bin i
-  inline float          Error(int i) const
-                          {if(err2) {if(err2[i]>0.) return sqrt(err2[i]); else return 0.;}
-                           else return 0.;}
+  inline float Error(int i) const
+         {if(err2) {if(err2[i]>0.) return sqrt(err2[i]); else return 0.;}
+                    else return 0.;}
   //! Retourne l'erreur au carre du bin i
-  inline double         Error2(int i) const
-                          {if(err2) return err2[i]; else return 0.;}
+  inline double Error2(int i) const
+         {if(err2) return err2[i]; else return 0.;}
   //! Remplit l'erreur au carre du bin i
-  inline double&        Error2(int i) {return err2[i];}
+  inline double& Error2(int i) {return err2[i];}
   //! Retourne la somme ponderee
-  inline float          NData() const            {return (float) nHist;}
+  inline float NData() const            {return (float) nHist;}
   //! Retourne le nombre d'entrees
-  inline float          NEntries() const         {return nEntries;}
+  inline float NEntries() const         {return nEntries;}
   //! Retourne le nombre d'overflow
-  inline float          NOver() const            {return over;}
+  inline float NOver() const            {return over;}
   //! Retourne le nombre d'underflow
-  inline float          NUnder() const           {return under;}
+  inline float NUnder() const           {return under;}
 
   //! Retourne l'abscisse du bord inferieur du bin i
-  inline float          BinLowEdge(int i)  const {return min + i*binWidth;}
+  inline float BinLowEdge(int i)  const {return min + i*binWidth;}
   //! Retourne l'abscisse du centre du bin i
-  inline float          BinCenter(int i)   const {return min + (i+0.5)*binWidth;}
+  inline float BinCenter(int i)   const {return min + (i+0.5)*binWidth;}
   //! Retourne l'abscisse du bord superieur du bin i
-  inline float          BinHighEdge(int i) const {return min + (i+1)*binWidth;} 
+  inline float BinHighEdge(int i) const {return min + (i+1)*binWidth;} 
   //! Retourne le numero du bin contenant l'abscisse x
-  inline int_4          FindBin(float x) const   
-                            {return (int_4) floorf((x - min) / binWidth);}
+  inline int_4 FindBin(float x) const   
+         {return (int_4) floorf((x - min) / binWidth);}
 
   // Info, statistique et calculs sur les histogrammes
-  int            BinNonNul() const;
-  int            ErrNonNul() const;
-  int            IMax() const;
-  int            IMin() const;
-  float          VMax() const;
-  float          VMin() const;
-  float          Mean() const;
-  float          Sigma() const;
-  float          MeanLH(int il,int ih) const;
-  float          SigmaLH(int il,int ih) const;
-  float          Mean(float x0, float dx) const;
-  float          Sigma(float x0, float dx) const;
-  float          CleanedMean() const;
-  float          CleanedMean(float& sigma) const;
-  int            BinPercent(float per) const;
-  int            BinPercent(float x,float per,int& imin,int& imax);
-  int            BinPercent(float x,float per,float& xmin,float& xmax);
-  void           HInteg(float norm = 0.);
-  void           HDeriv();
-  void           HRebin(int nbinew);
-
-  int            MaxiLocal(float& maxi,int& imax,float& maxn,int& imaxn);
-  float          FitMax(int degree=2, float frac=0.5f, int debug=0) const;
-  float          FindWidth(float xmax,float frac=0.5f, int debug=0) const;
-  float          FindWidth(float frac=0.5f, int debug=0) const;
-  int            EstimeMax(float& xm,int SzPav = 3);
-  int            EstimeMax(int& im,float& xm,int SzPav = 3);
-  void           EstimeWidthS(float frac,float& widthG,float& widthD);
+  int       BinNonNul() const;
+  int       ErrNonNul() const;
+  int       IMax() const;
+  int       IMin() const;
+  float     VMax() const;
+  float     VMin() const;
+  float     Mean() const;
+  float     Sigma() const;
+  float     MeanLH(int il,int ih) const;
+  float     SigmaLH(int il,int ih) const;
+  float     Mean(float x0, float dx) const;
+  float     Sigma(float x0, float dx) const;
+  float     CleanedMean() const;
+  float     CleanedMean(float& sigma) const;
+  int       BinPercent(float per) const;
+  int       BinPercent(float x,float per,int& imin,int& imax);
+  int       BinPercent(float x,float per,float& xmin,float& xmax);
+  void      HInteg(float norm = 0.);
+  void      HDeriv();
+  void      HRebin(int nbinew);
+
+  int       MaxiLocal(float& maxi,int& imax,float& maxn,int& imaxn);
+  float     FitMax(int degree=2, float frac=0.5f, int debug=0) const;
+  float     FindWidth(float xmax,float frac=0.5f, int debug=0) const;
+  float     FindWidth(float frac=0.5f, int debug=0) const;
+  int       EstimeMax(float& xm,int SzPav = 3);
+  int       EstimeMax(int& im,float& xm,int SzPav = 3);
+  void      EstimeWidthS(float frac,float& widthG,float& widthD);
 
   // Fit
@@ -147,22 +148,22 @@
 
   // Print et Display ASCII
-  void           PrintF(FILE * fp, int dyn = 100, float hmin = 1., float hmax = -1.,
-			int pflag = 0, int il = 1, int ih = -1);
-  void           Print(int dyn = 100, float hmin = 1., float hmax = -1.,
-			int pflag = 0, int il = 1, int ih = -1);
+  void PrintF(FILE * fp, int dyn = 100, float hmin = 1., float hmax = -1.,
+		      int pflag = 0, int il = 1, int ih = -1);
+  void Print(int dyn = 100, float hmin = 1., float hmax = -1.,
+		     int pflag = 0, int il = 1, int ih = -1);
 
 protected:
   void Delete();
 
-  float*         data;     //!< donnees
-  double*        err2;	   //!< erreurs carrees
-  float          under;    //!< underflow
-  float          over;     //!< overflow
-  double         nHist;    //!< somme ponderee des entrees
-  int_4          nEntries; //!< nombre d'entrees
-  int_4          bins;     //!< nombre de bins
-  float          min;      //!< abscisse minimum
-  float          max;      //!< abscisse maximum
-  float          binWidth; //!< largeur du bin
+  float*    data;     //!< donnees
+  double*   err2;	   //!< erreurs carrees
+  float     under;    //!< underflow
+  float     over;     //!< overflow
+  double    nHist;    //!< somme ponderee des entrees
+  int_4     nEntries; //!< nombre d'entrees
+  int_4     bins;     //!< nombre de bins
+  float     min;      //!< abscisse minimum
+  float     max;      //!< abscisse maximum
+  float     binWidth; //!< largeur du bin
 };
 
Index: trunk/SophyaLib/HiStats/histos2.cc
===================================================================
--- trunk/SophyaLib/HiStats/histos2.cc	(revision 1053)
+++ trunk/SophyaLib/HiStats/histos2.cc	(revision 1056)
@@ -1002,5 +1002,6 @@
 void Histo2D::PrintStatus()
 {
-printf("~Histo::Print    nHist=%g nEntries=%d\n",nHist,nEntries);
+printf("~Histo::Print    nHist=%g nEntries=%d",nHist,nEntries);
+if(HasErrors()) printf("  Errors=1\n"); else printf("  Errors=0\n");
 printf("over: [ %g %g %g // %g %g %g  // %g %g %g ]\n"
       ,over[2][0],over[2][1],over[2][2]
