Index: trunk/SophyaLib/NTools/histos.cc
===================================================================
--- trunk/SophyaLib/NTools/histos.cc	(revision 244)
+++ trunk/SophyaLib/NTools/histos.cc	(revision 307)
@@ -1,4 +1,4 @@
 //
-// $Id: histos.cc,v 1.2 1999-04-22 16:18:36 ansari Exp $
+// $Id: histos.cc,v 1.3 1999-05-19 15:57:59 ansari Exp $
 //
 
@@ -14,4 +14,6 @@
 #include "generalfit.h"
 
+using namespace PlanckDPC;
+
 //++
 // Class	Histo
@@ -50,18 +52,4 @@
 {
   Zero();
-  END_CONSTRUCTOR
-}
-
-/********* Methode *********/
-//++
-Histo::Histo(char *flnm)
-//
-//--
-: data(NULL), err2(NULL),
-  under(0), over(0), nHist(0), nEntries(0),
-  bins(0), min(0), max(0), binWidth(0)
-{
-  PInPersist s(flnm);
-  Read(s);
   END_CONSTRUCTOR
 }
@@ -379,5 +367,5 @@
 //--
 {
-if (b.bins!=a.bins) THROW(sizeMismatchErr);
+if (b.NBins()!=a.NBins()) THROW(sizeMismatchErr);
 Histo c(a);
 return (c += b);
@@ -389,5 +377,5 @@
 //--
 {
-if (b.bins!=a.bins) THROW(sizeMismatchErr);
+if (b.NBins()!=a.NBins()) THROW(sizeMismatchErr);
 Histo c(a);
 return (c -= b);
@@ -399,5 +387,5 @@
 //--
 {
-if (b.bins!=a.bins) THROW(sizeMismatchErr);
+if (b.NBins()!=a.NBins()) THROW(sizeMismatchErr);
 Histo c(a);
 return (c *= b);
@@ -409,5 +397,5 @@
 //--
 {
-if (b.bins!=a.bins) THROW(sizeMismatchErr);
+if (b.NBins()!=a.NBins()) THROW(sizeMismatchErr);
 Histo c(a);
 return (c /= b);
@@ -1446,17 +1434,19 @@
 
 //++
-Histo* Histo::FitResidus(GeneralFit& gfit)
+Histo Histo::FitResidus(GeneralFit& gfit)
 //
 //	Retourne une classe contenant les residus du fit ``gfit''.
 //--
 {
-if(NBins()<=0) return NULL;
+if(NBins()<=0)
+  throw(SzMismatchError("Histo::FitResidus: size mismatch\n"));
 GeneralFunction* f = gfit.GetFunction();
-if(f==NULL) return NULL;
+if(f==NULL)
+  throw(NullPtrError("Histo::FitResidus: NULL pointer\n"));
 Vector par = gfit.GetParm();
-Histo* h = new Histo(*this);
+Histo h(*this);
 for(int i=0;i<NBins();i++) {
   double x = (double) BinCenter(i);
-  (*h)(i) -= (float) f->Value(&x,par.Data());
+  h(i) -= (float) f->Value(&x,par.Data());
 }
 return h;
@@ -1464,17 +1454,19 @@
 
 //++
-Histo* Histo::FitFunction(GeneralFit& gfit)
+Histo Histo::FitFunction(GeneralFit& gfit)
 //
 //	Retourne une classe contenant la fonction du fit ``gfit''.
 //--
 {
-if(NBins()<=0) return NULL;
+if(NBins()<=0)
+  throw(SzMismatchError("Histo::FitFunction: size mismatch\n"));
 GeneralFunction* f = gfit.GetFunction();
-if(f==NULL) return NULL;
+if(f==NULL)
+  throw(NullPtrError("Histo::FitFunction: NULL pointer\n"));
 Vector par = gfit.GetParm();
-Histo* h = new Histo(*this);
+Histo h(*this);
 for(int i=0;i<NBins();i++) {
   double x = (double) BinCenter(i);
-  (*h)(i) = (float) f->Value(&x,par.Data());
+  h(i) = (float) f->Value(&x,par.Data());
 }
 return h;
@@ -1662,172 +1654,204 @@
  Histo::PrintF(stdout, hdyn, hmin, hmax, pflag, il, ih);
 }
- 
-
-/********* Methode *********/
-//++
-void  Histo::WriteSelf(POutPersist& s)  const
-//
-//	Ecriture ppersist
-//--
+
+
+// Rappel des inlines functions pour commentaires
+//++
+// inline float          XMin() const
+//	Retourne l'abscisse minimum
+//--
+//++
+// inline float          XMax() const
+//	Retourne l'abscisse maximum
+//--
+//++
+// inline int            NBins() const
+//	Retourne le nombre de bins
+//--
+//++
+// inline float          BinWidth() const
+//	Retourne la largeur du bin
+//--
+//++
+// inline float*         Bins() const
+//	Retourne le pointeur sur le tableaux des contenus
+//--
+//++
+// inline float          operator()(int i) const
+//	Retourne le contenu du bin i
+//--
+//++
+// inline float&         operator()(int i)
+//	Remplit le contenu du bin i
+//--
+//++
+// inline float          Error(int i) const
+//	Retourne l'erreur du bin i
+//--
+//++
+// inline double         Error2(int i) const
+//	Retourne l'erreur au carre du bin i
+//--
+//++
+// inline double&        Error2(int i)
+//	Remplit l'erreur au carre du bin i
+//--
+//++
+// inline float          NData() const
+//	Retourne la somme ponderee
+//--
+//++
+// inline float          NEntries()
+//	Retourne le nombre d'entrees
+//--
+//++
+// inline float          NOver() const
+//	Retourne le nombre d'overflow
+//--
+//++
+// inline float          NUnder() const
+//	Retourne le nombre d'underflow
+//--
+//++
+// inline float          BinLowEdge(int i)  const
+//	Retourne l'abscisse du bord inferieur du bin i
+//--
+//++
+// inline float          BinCenter(int i)   const
+//	Retourne l'abscisse du centre du bin i
+//--
+//++
+// inline float          BinHighEdge(int i) const
+//	Retourne l'abscisse du bord superieur du bin i
+//--
+//++
+// inline int            FindBin(float x) const   
+//	Retourne le numero du bin contenant l'abscisse x
+//--
+
+
+///////////////////////////////////////////////////////////
+// --------------------------------------------------------
+//   Les objets delegues pour la gestion de persistance 
+// --------------------------------------------------------
+///////////////////////////////////////////////////////////
+
+FIO_Histo::FIO_Histo()
+{
+dobj=new Histo;
+ownobj=true;
+}
+
+FIO_Histo::FIO_Histo(string const & filename) 
+{
+dobj=new Histo;
+ownobj=true; 
+Read(filename);
+}
+
+FIO_Histo::FIO_Histo(const Histo & obj) 
+{ 
+dobj = new Histo(obj);
+ownobj=true; 
+}
+
+FIO_Histo::FIO_Histo(Histo * obj) 
+{ 
+dobj = obj;
+ownobj=false; 
+}
+
+FIO_Histo::~FIO_Histo()
+{
+if (ownobj && dobj) delete dobj;
+}
+
+AnyDataObj* FIO_Histo::DataObj()
+{
+return(dobj);
+}
+
+void FIO_Histo::ReadSelf(PInPersist& is)
 {
 char strg[256];
 
+if(dobj==NULL) dobj=new Histo;
+  else         dobj->Delete();
+
+// Lecture entete
+is.GetLine(strg, 255);
+is.GetLine(strg, 255);
+is.GetLine(strg, 255);
+
+// Lecture des valeurs
+is.Get(dobj->bins);
+is.Get(dobj->nEntries);
+int_4 errok;
+is.Get(errok);
+
+is.Get(dobj->binWidth);
+is.Get(dobj->min);
+is.Get(dobj->max);
+is.Get(dobj->under);
+is.Get(dobj->over);
+
+is.Get(dobj->nHist);
+
+// Lecture des donnees Histo 1D
+dobj->data = new float[dobj->bins];
+is.GetLine(strg, 255);
+is.Get(dobj->data, dobj->bins);
+
+// Lecture des erreurs
+if(errok) {
+  is.GetLine(strg, 255);
+  dobj->err2 = new double[dobj->bins];
+  is.Get(dobj->err2, dobj->bins);
+}
+
+return;
+}
+
+void FIO_Histo::WriteSelf(POutPersist& os) const
+{
+if (dobj == NULL)   return;
+char strg[256];
+
 // Que faut-il ecrire?
-int errok = (err2) ? 1 : 0;
+int errok = (dobj->err2) ? 1 : 0;
 
 // Ecriture entete pour identifier facilement
-sprintf(strg,"bins=%6d  NEnt=%15d  errok=%1d",bins,nEntries,errok);
-s.PutLine(strg);
-sprintf(strg,"binw=%g  min=%g max=%g",binWidth,min,max);
-s.PutLine(strg);
-sprintf(strg, "under=%g over=%g nHist=%g",under,over,nHist);
-s.PutLine(strg);
+sprintf(strg,"bins=%6d  NEnt=%15d  errok=%1d",dobj->bins,dobj->nEntries,errok);
+os.PutLine(strg);
+sprintf(strg,"binw=%g  min=%g max=%g",dobj->binWidth,dobj->min,dobj->max);
+os.PutLine(strg);
+sprintf(strg, "under=%g over=%g nHist=%g",dobj->under,dobj->over,dobj->nHist);
+os.PutLine(strg);
 
 // Ecriture des valeurs
-s.PutI4(bins);
-s.PutI4(nEntries);
-s.PutI4(errok);
-
-s.PutR4(binWidth);
-s.PutR4(min);
-s.PutR4(max);
-s.PutR4(under);
-s.PutR4(over);
-
-s.PutR8(nHist);
+os.Put(dobj->bins);
+os.Put(dobj->nEntries);
+os.Put(errok);
+
+os.Put(dobj->binWidth);
+os.Put(dobj->min);
+os.Put(dobj->max);
+os.Put(dobj->under);
+os.Put(dobj->over);
+
+os.Put(dobj->nHist);
 
 // Ecriture des donnees Histo 1D
-sprintf(strg,"Histo: Tableau des donnees %d",bins);
-s.PutLine(strg);
-s.PutR4s(data, bins);
+sprintf(strg,"Histo: Tableau des donnees %d",dobj->bins);
+os.PutLine(strg);
+os.Put(dobj->data, dobj->bins);
 
 // Ecriture des erreurs
 if(errok) {
-  sprintf(strg,"Histo: Tableau des erreurs %d",bins);
-  s.PutLine(strg);
-  s.PutR8s(err2, bins);
+  sprintf(strg,"Histo: Tableau des erreurs %d",dobj->bins);
+  os.PutLine(strg);
+  os.Put(dobj->err2, dobj->bins);
 }
 
 return;
 }
-
-/********* Methode *********/
-//++
-void  Histo::ReadSelf(PInPersist& s)
-//
-//	Lecture ppersist
-//--
-{
-char strg[256];
-
-Delete();
-
-// Lecture entete
-s.GetLine(strg, 255);
-s.GetLine(strg, 255);
-s.GetLine(strg, 255);
-
-// Lecture des valeurs
-s.GetI4(bins);
-s.GetI4(nEntries);
-int_4 errok;
-s.GetI4(errok);
-
-s.GetR4(binWidth);
-s.GetR4(min);
-s.GetR4(max);
-s.GetR4(under);
-s.GetR4(over);
-
-s.GetR8(nHist);
-
-// Lecture des donnees Histo 1D
-data = new float[bins];
-s.GetLine(strg, 255);
-s.GetR4s(data, bins);
-
-// Lecture des erreurs
-if(errok) {
-  s.GetLine(strg, 255);
-  err2 = new double[bins];
-  s.GetR8s(err2, bins);
-}
-
-return;
-}
-
-
-
-// Rappel des inlines functions pour commentaires
-//++
-// inline float          XMin() const
-//	Retourne l'abscisse minimum
-//--
-//++
-// inline float          XMax() const
-//	Retourne l'abscisse maximum
-//--
-//++
-// inline int            NBins() const
-//	Retourne le nombre de bins
-//--
-//++
-// inline float          BinWidth() const
-//	Retourne la largeur du bin
-//--
-//++
-// inline float*         Bins() const
-//	Retourne le pointeur sur le tableaux des contenus
-//--
-//++
-// inline float          operator()(int i) const
-//	Retourne le contenu du bin i
-//--
-//++
-// inline float&         operator()(int i)
-//	Remplit le contenu du bin i
-//--
-//++
-// inline float          Error(int i) const
-//	Retourne l'erreur du bin i
-//--
-//++
-// inline double         Error2(int i) const
-//	Retourne l'erreur au carre du bin i
-//--
-//++
-// inline double&        Error2(int i)
-//	Remplit l'erreur au carre du bin i
-//--
-//++
-// inline float          NData() const
-//	Retourne la somme ponderee
-//--
-//++
-// inline float          NEntries()
-//	Retourne le nombre d'entrees
-//--
-//++
-// inline float          NOver() const
-//	Retourne le nombre d'overflow
-//--
-//++
-// inline float          NUnder() const
-//	Retourne le nombre d'underflow
-//--
-//++
-// inline float          BinLowEdge(int i)  const
-//	Retourne l'abscisse du bord inferieur du bin i
-//--
-//++
-// inline float          BinCenter(int i)   const
-//	Retourne l'abscisse du centre du bin i
-//--
-//++
-// inline float          BinHighEdge(int i) const
-//	Retourne l'abscisse du bord superieur du bin i
-//--
-//++
-// inline int            FindBin(float x) const   
-//	Retourne le numero du bin contenant l'abscisse x
-//--
