Index: trunk/SophyaLib/NTools/histos2.cc
===================================================================
--- trunk/SophyaLib/NTools/histos2.cc	(revision 244)
+++ trunk/SophyaLib/NTools/histos2.cc	(revision 307)
@@ -16,4 +16,6 @@
 #include "generalfit.h"
 
+using namespace PlanckDPC;
+
 //++
 // Class	Histo2D
@@ -132,22 +134,4 @@
 for(int i=0;i<3;i++) for(int j=0;j<3;j++) over[i][j]=0.;
 b_s.H = NULL;
-END_CONSTRUCTOR
-}
-
-//++
-Histo2D::Histo2D(char *flnm)
-//
-//	Constructeur par lecture d'un fichier ppersist.
-//--
-      : data(NULL), err2(NULL)
-      , nHist(0), nEntries(0)
-      , nx(0), ny(0), nxy(0)
-      , xmin(0), xmax(0), ymin(0), ymax(0)
-      , wbinx(0), wbiny(0)
-      , hprojx(NULL), hprojy(NULL)
-{
-b_s.H = NULL;
-PInPersist s(flnm);
-Read(s);
 END_CONSTRUCTOR
 }
@@ -582,5 +566,5 @@
 //--
 {
-if (b.nx!=a.nx || b.ny!=a.ny) THROW(sizeMismatchErr);
+if (b.NBinX()!=a.NBinX() || b.NBinY()!=a.NBinY()) THROW(sizeMismatchErr);
 Histo2D c(a);
 return (c += b);
@@ -592,5 +576,5 @@
 //--
 {
-if (b.nx!=a.nx || b.ny!=a.ny) THROW(sizeMismatchErr);
+if (b.NBinX()!=a.NBinX() || b.NBinY()!=a.NBinY()) THROW(sizeMismatchErr);
 Histo2D c(a);
 return (c -= b);
@@ -602,5 +586,5 @@
 //--
 {
-if (b.nx!=a.nx || b.ny!=a.ny) THROW(sizeMismatchErr);
+if (b.NBinX()!=a.NBinX() || b.NBinY()!=a.NBinY()) THROW(sizeMismatchErr);
 Histo2D c(a);
 return (c *= b);
@@ -612,5 +596,5 @@
 //--
 {
-if (b.nx!=a.nx || b.ny!=a.ny) THROW(sizeMismatchErr);
+if (b.NBinX()!=a.NBinX() || b.NBinY()!=a.NBinY()) THROW(sizeMismatchErr);
 Histo2D c(a);
 return (c /= b);
@@ -1113,19 +1097,21 @@
 
 //++
-Histo2D* Histo2D::FitResidus(GeneralFit& gfit)
+Histo2D Histo2D::FitResidus(GeneralFit& gfit)
 //
 //	Retourne une classe contenant les residus du fit ``gfit''.
 //--
 {
-if(NBinX()<=0 || NBinY()<=0) return NULL;
+if(NBinX()<=0 || NBinY()<=0)
+  throw(SzMismatchError("Histo2D::FitResidus: size mismatch\n"));
 GeneralFunction* f = gfit.GetFunction();
-if(f==NULL) return NULL;
+if(f==NULL)
+  throw(NullPtrError("Histo2D::FitResidus: NULL pointer\n"));
 Vector par = gfit.GetParm();
-Histo2D* h2 = new Histo2D(*this);
+Histo2D h2(*this);
 for(int i=0;i<NBinX();i++) for(int j=0;j<NBinY();j++) {
   float xc,yc;
   BinCenter(i,j,xc,yc);
   double x[2] = {(double)xc,(double)yc};
-  (*h2)(i,j) -= (float) f->Value(x,par.Data());
+  h2(i,j) -= (float) f->Value(x,par.Data());
 }
 return h2;
@@ -1133,19 +1119,21 @@
 
 //++
-Histo2D* Histo2D::FitFunction(GeneralFit& gfit)
+Histo2D Histo2D::FitFunction(GeneralFit& gfit)
 //
 //	Retourne une classe contenant la fonction du fit ``gfit''.
 //--
 {
-if(NBinX()<=0 || NBinY()<=0) return NULL;
+if(NBinX()<=0 || NBinY()<=0)
+  throw(SzMismatchError("Histo2D::FitFunction: size mismatch\n"));
 GeneralFunction* f = gfit.GetFunction();
-if(f==NULL) return NULL;
+if(f==NULL)
+  throw(NullPtrError("Histo2D::FitFunction: NULL pointer\n"));
 Vector par = gfit.GetParm();
-Histo2D* h2 = new Histo2D(*this);
+Histo2D h2(*this);
 for(int i=0;i<NBinX();i++) for(int j=0;j<NBinY();j++) {
   float xc,yc;
   BinCenter(i,j,xc,yc);
   double x[2] = {(double)xc,(double)yc};
-  (*h2)(i,j) = (float) f->Value(x,par.Data());
+  h2(i,j) = (float) f->Value(x,par.Data());
 }
 return h2;
@@ -1792,82 +1780,229 @@
 
 
-///////////////////////////////////////////////////////////////////
-//++
-// Titre	Methodes pour ecriture ppersist
-//--
-
-//++
-void  Histo2D::WriteSelf(POutPersist& s)  const
-//
-//	Ecriture fichier de type ppersist.
-//--
+///////////////////////////////////////////////////////////
+// --------------------------------------------------------
+//   Les objets delegues pour la gestion de persistance 
+// --------------------------------------------------------
+///////////////////////////////////////////////////////////
+
+FIO_Histo2D::FIO_Histo2D()
+{
+dobj=new Histo2D;
+ownobj=true;
+}
+
+FIO_Histo2D::FIO_Histo2D(string const & filename) 
+{
+dobj=new Histo2D;
+ownobj=true; 
+Read(filename);
+}
+
+FIO_Histo2D::FIO_Histo2D(const Histo2D & obj) 
+{ 
+dobj = new Histo2D(obj);
+ownobj=true; 
+}
+
+FIO_Histo2D::FIO_Histo2D(Histo2D * obj) 
+{ 
+dobj = obj;
+ownobj=false; 
+}
+
+FIO_Histo2D::~FIO_Histo2D()
+{
+if (ownobj && dobj) delete dobj;
+}
+
+AnyDataObj* FIO_Histo2D::DataObj()
+{
+return(dobj);
+}
+
+void FIO_Histo2D::ReadSelf(PInPersist& is)
 {
 char strg[256];
-int j;
+
+if(dobj==NULL) dobj=new Histo2D;
+  else         dobj->Delete();
+
 float min,max;
 Histo* h;
+int_4 errok, projx, projy, nslix, nsliy, nbanx, nbany;
+
+// Lecture entete
+is.GetLine(strg, 255);
+is.GetLine(strg, 255);
+is.GetLine(strg, 255);
+is.GetLine(strg, 255);
+is.GetLine(strg, 255);
+is.GetLine(strg, 255);
+
+// Lecture variables de definitions
+is.Get(dobj->nx);
+is.Get(dobj->ny);
+is.Get(dobj->nxy);
+is.Get(errok);
+is.Get(dobj->nEntries);
+is.Get(dobj->nHist);
+
+is.Get(dobj->xmin);
+is.Get(dobj->xmax);
+is.Get(dobj->ymin);
+is.Get(dobj->ymax);
+is.Get(dobj->wbinx);
+is.Get(dobj->wbiny);
+
+is.Get(&(dobj->over[0][0]),9);
+
+is.Get(projx);
+is.Get(projy);
+is.Get(nslix);
+is.Get(nsliy);
+is.Get(nbanx);
+is.Get(nbany);
+
+// Lecture histo2D
+dobj->data = new float[dobj->nxy];
+is.GetLine(strg, 255);
+{for(int j=0;j<dobj->ny;j++) is.Get(dobj->data+j*dobj->nx,dobj->nx);}
+
+// Lecture erreurs
+if(errok) {
+  is.GetLine(strg, 255);
+  dobj->err2 = new double[dobj->nxy];
+  for(int j=0;j<dobj->ny;j++) is.Get(dobj->err2+j*dobj->nx,dobj->nx);
+}
+
+// Lecture des projections
+if(projx) {
+  is.GetLine(strg, 255);
+  dobj->SetProjX();
+  FIO_Histo fio_h(dobj->hprojx);
+  fio_h.Read(is);
+}
+if(projy) {
+  is.GetLine(strg, 255);
+  dobj->SetProjY();
+  FIO_Histo fio_h(dobj->hprojy);
+  fio_h.Read(is);
+}
+
+// Lecture des slices
+if(nslix>0) {
+  is.GetLine(strg, 255);
+  dobj->SetSliX(nslix);
+  DBASSERT (nslix==dobj->NSliX());
+  for(int j=0;j<dobj->NSliX();j++)
+    {FIO_Histo fio_h(dobj->HSliX(j)); fio_h.Read(is);}
+}
+if(nsliy>0) {
+  is.GetLine(strg, 255);
+  dobj->SetSliY(nsliy);
+  DBASSERT (nsliy==dobj->NSliY());
+  for(int j=0;j<dobj->NSliY();j++)
+    {FIO_Histo fio_h(dobj->HSliY(j)); fio_h.Read(is);}
+}
+
+// Lecture des bandes
+if( nbanx>0 ) {
+  is.GetLine(strg, 255);
+  {for(int j=0; j<nbanx; j++) {
+    is.Get(min); is.Get(max);
+    dobj->SetBandX(min,max);
+  }}
+  DBASSERT (nbanx==dobj->NBandX());
+  {for(int j=0; j<dobj->NBandX(); j++) {
+    FIO_Histo fio_h(dobj->HBandX(j));
+    fio_h.Read(is);
+  }}
+}
+if( nbany>0 ) {
+  is.GetLine(strg, 255);
+  {for(int j=0; j<nbany; j++) {
+    is.Get(min); is.Get(max);
+    dobj->SetBandY(min,max);
+  }}
+  DBASSERT (nbany==dobj->NBandY());
+  {for(int j=0; j<dobj->NBandY(); j++) {
+    FIO_Histo fio_h(dobj->HBandY(j));
+    fio_h.Read(is);
+  }}
+}
+
+return;
+}
+
+void FIO_Histo2D::WriteSelf(POutPersist& os) const
+{
+if (dobj == NULL)   return;
+char strg[256];
 
 // Que faut-il ecrire?
-int_4 errok = (err2) ? 1 : 0;
-int_4 projx = (hprojx) ? 1 : 0;
-int_4 projy = (hprojy) ? 1 : 0;
-int_4 nslix = NSliX();
-int_4 nsliy = NSliY();
-int_4 nbanx = NBandX();
-int_4 nbany = NBandY();
+int_4 errok = (dobj->err2) ? 1 : 0;
+int_4 projx = (dobj->hprojx) ? 1 : 0;
+int_4 projy = (dobj->hprojy) ? 1 : 0;
+int_4 nslix = dobj->NSliX();
+int_4 nsliy = dobj->NSliY();
+int_4 nbanx = dobj->NBandX();
+int_4 nbany = dobj->NBandY();
 
 // Ecriture entete pour identifier facilement
-sprintf(strg,"nx=%d  ny=%d  nxy=%d errok=%1d",nx,ny,nxy,errok);
-s.PutLine(strg);
-sprintf(strg,"nHist=%g nEntries=%d",nHist,nEntries);
-s.PutLine(strg);
-sprintf(strg,"wbinx=%g wbiny=%g",wbinx,wbiny);
-s.PutLine(strg);
-sprintf(strg,"xmin=%g xmax=%g ymin=%g ymax=%g",xmin,xmax,ymin,ymax);
-s.PutLine(strg);
+sprintf(strg,"nx=%d  ny=%d  nxy=%d errok=%1d"
+       ,dobj->nx,dobj->ny,dobj->nxy,errok);
+os.PutLine(strg);
+sprintf(strg,"nHist=%g nEntries=%d",dobj->nHist,dobj->nEntries);
+os.PutLine(strg);
+sprintf(strg,"wbinx=%g wbiny=%g",dobj->wbinx,dobj->wbiny);
+os.PutLine(strg);
+sprintf(strg,"xmin=%g xmax=%g ymin=%g ymax=%g"
+       ,dobj->xmin,dobj->xmax,dobj->ymin,dobj->ymax);
+os.PutLine(strg);
 sprintf(strg,"projx/y=%d %d nbandx/y=%d %d nbslix/y=%d %d"
        ,projx,projy,nbanx,nbany,nslix,nsliy);
-s.PutLine(strg);
+os.PutLine(strg);
 sprintf(strg,"over %g %g %g %g %g %g %g %g %g"
-       ,over[0][0],over[0][1],over[0][2]
-       ,over[1][0],over[1][1],over[1][2]
-       ,over[2][0],over[2][1],over[2][2]);
-s.PutLine(strg);
+       ,dobj->over[0][0],dobj->over[0][1],dobj->over[0][2]
+       ,dobj->over[1][0],dobj->over[1][1],dobj->over[1][2]
+       ,dobj->over[2][0],dobj->over[2][1],dobj->over[2][2]);
+os.PutLine(strg);
 
 // Ecriture variables de definitions
-s.PutI4(nx);
-s.PutI4(ny);
-s.PutI4(nxy);
-s.PutI4(errok);
-s.PutI4(nEntries);
-s.PutR8(nHist);
-
-s.PutR4(xmin);
-s.PutR4(xmax);
-s.PutR4(ymin);
-s.PutR4(ymax);
-s.PutR4(wbinx);
-s.PutR4(wbiny);
-
-s.PutR4s(&over[0][0],9);
-
-s.PutI4(projx);
-s.PutI4(projy);
-s.PutI4(nslix);
-s.PutI4(nsliy);
-s.PutI4(nbanx);
-s.PutI4(nbany);
+os.Put(dobj->nx);
+os.Put(dobj->ny);
+os.Put(dobj->nxy);
+os.Put(errok);
+os.Put(dobj->nEntries);
+os.Put(dobj->nHist);
+
+os.Put(dobj->xmin);
+os.Put(dobj->xmax);
+os.Put(dobj->ymin);
+os.Put(dobj->ymax);
+os.Put(dobj->wbinx);
+os.Put(dobj->wbiny);
+
+os.Put(&(dobj->over[0][0]),9);
+
+os.Put(projx);
+os.Put(projy);
+os.Put(nslix);
+os.Put(nsliy);
+os.Put(nbanx);
+os.Put(nbany);
 
 // Ecriture histo2D
-sprintf(strg,"Histo2D: Tableau des donnees %d = %d * %d",nxy,nx,ny);
-s.PutLine(strg);
-for(j=0;j<ny;j++) s.PutR4s(data+j*nx,nx);
-
+sprintf(strg,"Histo2D: Tableau des donnees %d = %d * %d"
+       ,dobj->nxy,dobj->nx,dobj->ny);
+os.PutLine(strg);
+{for(int j=0;j<dobj->ny;j++) os.Put(dobj->data+j*dobj->nx,dobj->nx);}
 
 // Ecriture erreurs
 if(errok) {
-  sprintf(strg,"Histo2D: Tableau des erreurs %d = %d * %d",nxy,nx,ny);
-  s.PutLine(strg);
-  for(j=0;j<ny;j++) s.PutR8s(err2+j*nx,nx);
+  sprintf(strg,"Histo2D: Tableau des erreurs %d = %d * %d"
+         ,dobj->nxy,dobj->nx,dobj->ny);
+  os.PutLine(strg);
+  for(int j=0;j<dobj->ny;j++) os.Put(dobj->err2+j*dobj->nx,dobj->nx);
 }
 
@@ -1875,11 +2010,11 @@
 if(projx) {
   sprintf(strg,"Histo2D: Projection X");
-  s.PutLine(strg);
-  hprojx->Write(s);
+  os.PutLine(strg);
+  FIO_Histo fio_h(dobj->hprojx); fio_h.Write(os);
 }
 if(projy) {
   sprintf(strg,"Histo2D: Projection Y");
-  s.PutLine(strg);
-  hprojy->Write(s);
+  os.PutLine(strg);
+  FIO_Histo fio_h(dobj->hprojy); fio_h.Write(os);
 }
 
@@ -1887,16 +2022,16 @@
 if(nslix>0) {
   sprintf(strg,"Histo2D: Slices X %d",nslix);
-  s.PutLine(strg);
-  for(j=0;j<nslix;j++) {
-    h = HSliX(j);
-    h->Write(s);
+  os.PutLine(strg);
+  for(int j=0;j<nslix;j++) {
+    Histo* h = dobj->HSliX(j);
+    FIO_Histo fio_h(h); fio_h.Write(os);
   }
 }
 if(nsliy>0) {
   sprintf(strg,"Histo2D: Slices Y %d",nsliy);
-  s.PutLine(strg);
-  for(j=0;j<nsliy;j++) {
-    h = HSliY(j);
-    h->Write(s);
+  os.PutLine(strg);
+  for(int j=0;j<nsliy;j++) {
+    Histo* h = dobj->HSliY(j);
+    FIO_Histo fio_h(h); fio_h.Write(os);
   }
 }
@@ -1905,30 +2040,26 @@
 if( nbanx>0 ) {
   sprintf(strg,"Histo2D: Bandes X %d",nbanx);
-  s.PutLine(strg);
-  list<bande_slice>::const_iterator it;
-  for(it = lbandx.begin(); it != lbandx.end(); it++) {
-    min = (*it).min;
-    max = (*it).max;
-    s.PutR4(min);
-    s.PutR4(max);
-  }
-  for(it = lbandx.begin(); it != lbandx.end(); it++) {
-    h = (*it).H;
-    h->Write(s);
+  os.PutLine(strg);
+  list<Histo2D::bande_slice>::const_iterator it;
+  for(it = dobj->lbandx.begin(); it != dobj->lbandx.end(); it++) {
+    float min = (*it).min; float max = (*it).max;
+    os.Put(min); os.Put(max);
+  }
+  for(it = dobj->lbandx.begin(); it != dobj->lbandx.end(); it++) {
+    Histo* h = (*it).H;
+    FIO_Histo fio_h(h); fio_h.Write(os);
   }
 }
 if( nbany>0 ) {
   sprintf(strg,"Histo2D: Bandes Y %d",nbany);
-  s.PutLine(strg);
-  list<bande_slice>::const_iterator it;
-  for(it = lbandy.begin(); it != lbandy.end(); it++) {
-    min = (*it).min;
-    max = (*it).max;
-    s.PutR4(min);
-    s.PutR4(max);
-  }
-  for(it = lbandy.begin(); it != lbandy.end(); it++) {
-    h = (*it).H;
-    h->Write(s);
+  os.PutLine(strg);
+  list<Histo2D::bande_slice>::const_iterator it;
+  for(it = dobj->lbandy.begin(); it != dobj->lbandy.end(); it++) {
+    float min = (*it).min; float max = (*it).max;
+    os.Put(min); os.Put(max);
+  }
+  for(it = dobj->lbandy.begin(); it != dobj->lbandy.end(); it++) {
+    Histo* h = (*it).H;
+    FIO_Histo fio_h(h); fio_h.Write(os);
   }
 }
@@ -1936,118 +2067,2 @@
 return;
 }
-
-//++
-void  Histo2D::ReadSelf(PInPersist& s)
-//
-//	Lecture fichier de type ppersist.
-//--
-{
-Delete();
-
-int j;
-float min,max;
-Histo* h;
-char strg[256];
-int_4 errok, projx, projy, nslix, nsliy, nbanx, nbany;
-
-// Lecture entete
-s.GetLine(strg, 255);
-s.GetLine(strg, 255);
-s.GetLine(strg, 255);
-s.GetLine(strg, 255);
-s.GetLine(strg, 255);
-s.GetLine(strg, 255);
-
-
-// Lecture variables de definitions
-s.GetI4(nx);
-s.GetI4(ny);
-s.GetI4(nxy);
-s.GetI4(errok);
-s.GetI4(nEntries);
-s.GetR8(nHist);
-
-s.GetR4(xmin);
-s.GetR4(xmax);
-s.GetR4(ymin);
-s.GetR4(ymax);
-s.GetR4(wbinx);
-s.GetR4(wbiny);
-
-s.GetR4s(&over[0][0],9);
-
-s.GetI4(projx);
-s.GetI4(projy);
-s.GetI4(nslix);
-s.GetI4(nsliy);
-s.GetI4(nbanx);
-s.GetI4(nbany);
-
-// Lecture histo2D
-data = new float[nxy];
-s.GetLine(strg, 255);
-for(j=0;j<ny;j++) s.GetR4s(data+j*nx,nx);
-
-// Lecture erreurs
-if(errok) {
-  s.GetLine(strg, 255);
-  err2 = new double[nxy];
-  for(j=0;j<ny;j++) s.GetR8s(err2+j*nx,nx);
-}
-
-// Lecture des projections
-if(projx) {
-  s.GetLine(strg, 255);
-  SetProjX();
-  hprojx->Read(s);
-}
-if(projy) {
-  s.GetLine(strg, 255);
-  SetProjY();
-  hprojy->Read(s);
-}
-
-// Lecture des slices
-if(nslix>0) {
-  s.GetLine(strg, 255);
-  SetSliX(nslix);
-  DBASSERT (nslix==NSliX());
-  for(j=0;j<NSliX();j++) HSliX(j)->Read(s);
-}
-if(nsliy>0) {
-  s.GetLine(strg, 255);
-  SetSliY(nsliy);
-  DBASSERT (nsliy==NSliY());
-  for(j=0;j<NSliY();j++) HSliY(j)->Read(s);
-}
-
-// Lecture des bandes
-if( nbanx>0 ) {
-  s.GetLine(strg, 255);
-  for( j=0; j<nbanx; j++) {
-    s.GetR4(min);
-    s.GetR4(max);
-    SetBandX(min,max);
-  }
-  DBASSERT (nbanx==NBandX());
-  for( j=0; j<NBandX(); j++) {
-    h = HBandX(j);
-    h->Read(s);
-  }
-}
-if( nbany>0 ) {
-  s.GetLine(strg, 255);
-  for( j=0; j<nbany; j++) {
-    s.GetR4(min);
-    s.GetR4(max);
-    SetBandY(min,max);
-  }
-  DBASSERT (nbany==NBandY());
-  for( j=0; j<NBandY(); j++) {
-    h = HBandY(j);
-    h->Read(s);
-  }
-}
-
-return;
-}
