Index: trunk/SophyaLib/NTools/generaldata.cc
===================================================================
--- trunk/SophyaLib/NTools/generaldata.cc	(revision 244)
+++ trunk/SophyaLib/NTools/generaldata.cc	(revision 307)
@@ -3,4 +3,5 @@
 #include <stdlib.h>
 #include <iostream.h>
+#include <values.h>
 #include <math.h>
 #include <string.h>
@@ -11,8 +12,11 @@
 #endif
 
-#include "perrors.h"
 #include "nbtri.h"
 #include "generalfit.h"
 #include "generaldata.h"
+#include "pexceptions.h"
+#include "objfio.h"
+
+using namespace PlanckDPC;
 
 //================================================================
@@ -52,15 +56,14 @@
   , BuffVar(NULL), BuffVarR4(NULL)
 {
- TRY {
-   Alloc(nVar,ndatalloc,errx);
- } CATCHALL {
-   cout<<"GeneralFitData::GeneralFitData Impossible d'allouer l'espace"<<endl;
-   THROW_SAME;
- } ENDTRY
- END_CONSTRUCTOR
-}
-
-//++
-GeneralFitData::GeneralFitData(GeneralFitData& data, bool clean)
+try {
+  Alloc(nVar,ndatalloc,errx);
+} catch(PException e) {
+  cout << "Exception : " << typeid(e).name() << " " << e.Msg() << endl;
+  throw;
+}
+}
+
+//++
+GeneralFitData::GeneralFitData(const GeneralFitData& data, bool clean)
 //
 //	Constructeur par copie. Si ``clean'' est ``true''
@@ -74,10 +77,10 @@
   , BuffVar(NULL), BuffVarR4(NULL)
 {
- TRY {
-   Alloc(data.mNVar,((clean)?data.mNDataGood:data.mNDataAlloc),((data.mErrXP)?1:0));
- } CATCHALL {
-   cout<<"GeneralFitData::GeneralFitData Impossible d'allouer l'espace"<<endl;
-   THROW_SAME;
- } ENDTRY
+try {
+  Alloc(data.mNVar,((clean)?data.mNDataGood:data.mNDataAlloc),((data.mErrXP)?1:0));
+} catch(PException e) {
+  cout << "Exception : " << typeid(e).name() << " " << e.Msg() << endl;
+  throw;
+}
 
  // Remplissage
@@ -113,18 +116,4 @@
 
 //++
-GeneralFitData::GeneralFitData(char *flnm)
-//
-//	Constructeur par lecture d'un fichier ppersist..
-//--
-  : mNVar(0), mNDataAlloc(0), mNData(0), mNDataGood(0), mOk_EXP(0)
-  , mXP(NULL), mErrXP(NULL), mF(NULL), mErr(NULL), mOK(NULL)
-  , BuffVar(NULL), BuffVarR4(NULL)
-{
-  PInPersist s(flnm);
-  Read(s);
-  END_CONSTRUCTOR
-}
-
-//++
 GeneralFitData::~GeneralFitData()
 //
@@ -153,5 +142,5 @@
 mNDataAlloc = ndatalloc;
 
-TRY {
+try {
   mXP  = new r_8[nVar*ndatalloc];
   if(mOk_EXP) mErrXP  = new r_8[nVar*ndatalloc];
@@ -161,7 +150,7 @@
   BuffVar   = new r_8[2*nVar+3];
   BuffVarR4 = (r_4 *) BuffVar;
-} CATCHALL {
-  THROW_SAME;
-} ENDTRY
+} catch(PException e) {
+  throw(AllocationError("GeneralFitData::Alloc allocation error\n"));
+}
 }
 
@@ -824,20 +813,22 @@
 //////////////////////////////////////////////////////////////////////
 //++
-GeneralFitData* GeneralFitData::FitResidus(GeneralFit& gfit)
+GeneralFitData GeneralFitData::FitResidus(GeneralFit& gfit)
 //
 //	Retourne une classe contenant les residus du fit ``gfit''.
 //--
 {
-if(gfit.GetNVar()!=mNVar) return NULL;
+if(gfit.GetNVar()!=mNVar)
+  throw(SzMismatchError("GeneralFitData::FitResidus: size mismatch\n"));
 return gfit.DataResidus(true);
 }
 
 //++
-GeneralFitData* GeneralFitData::FitFunction(GeneralFit& gfit)
+GeneralFitData GeneralFitData::FitFunction(GeneralFit& gfit)
 //
 //	Retourne une classe contenant la function du fit ``gfit''.
 //--
 {
-if(gfit.GetNVar()!=mNVar) return NULL;
+if(gfit.GetNVar()!=mNVar)
+  throw(SzMismatchError("GeneralFitData::FitFunction: size mismatch\n"));
 return gfit.DataFunction(true);
 }
@@ -922,39 +913,200 @@
 //////////////////////////////////////////////////////////////////////
 //++
-void GeneralFitData::WriteSelf(POutPersist& s)  const
-//
-//	Ecriture ppersist
-//--
-{
+// int inline int GetSpaceFree() const
+//	Retourne la place restante dans la structure (nombre de
+//	donnees que l'on peut encore stoquer).
+//--
+//++
+// inline int  NVar()       const
+//	Retourne le nombre de variables Xi
+//--
+//++
+// inline int  NData()
+//	Retourne le nombre de donnees
+//--
+//++
+// inline int  NDataGood()  const
+//	Retourne le nombre de bonnes donnees (utilisees pour le fit)
+//--
+//++
+// inline int  NDataAlloc() const
+//	Retourne la place maximale allouee pour les donnees
+//--
+//++
+// inline unsigned short int IsValid(int i) const
+//	Retourne 1 si point valide, sinon 0
+//--
+//++
+// inline bool HasXErrors()
+//	Retourne ``true'' si il y a des erreurs sur les variables
+//	d'abscisse, ``false'' sinon.
+//--
+//++
+// inline double X1(int i) const
+//	Retourne l'abscisse pour 1 dimension (y=f(x)) donnee I
+//--
+//++
+// inline double X(int i) const
+//	Retourne la 1er abscisse (X) pour (v=f(x,y,z,...)) donnee I
+//--
+//++
+// inline double Y(int i) const
+//	Retourne la 2sd abscisse (Y) pour (v=f(x,y,z,...)) donnee I
+//--
+//++
+// inline double Z(int i) const
+//	Retourne la 3ieme abscisse (Z) pour (v=f(x,y,z,...)) donnee I
+//--
+//++
+// inline double Absc(int j,int i) const
+//	Retourne la Jieme abscisse (Xj) pour (v=f(x0,x1,x2,...)) donnee I
+//--
+//++
+// inline double Val(int i) const
+//	Retourne la valeur de la Ieme donnee
+//--
+//++
+// inline double EX1(int i) const
+//	Retourne l'erreur (dx) sur l'abscisse pour 1 dimension (y=f(x)) donnee I
+//--
+//++
+// inline double EX(int i) const
+//	Retourne l'erreur (dx) sur la 1er abscisse (X) pour (v=f(x,y,z,...)) donnee I
+//--
+//++
+// inline double EY(int i) const
+//	Retourne l'erreur (dy) sur la 2sd abscisse (Y) pour (v=f(x,y,z,...)) donnee I
+//--
+//++
+// inline double EZ(int i) const
+//	Retourne l'erreur (dz) sur la 3ieme abscisse (Z) pour (v=f(x,y,z,...)) donnee I
+//--
+//++
+// inline double EAbsc(int j,int i) const
+//	Retourne l'erreur (dxj) sur la Jieme abscisse (Xj) pour (v=f(x0,x1,x2,...)) donnee I
+//--
+//++
+// inline double EVal(int i) const {return mErr[i];}
+//	Retourne l'erreur de la Ieme donnee
+//--
+
+///////////////////////////////////////////////////////////
+// --------------------------------------------------------
+//   Les objets delegues pour la gestion de persistance 
+// --------------------------------------------------------
+///////////////////////////////////////////////////////////
+
+FIO_GeneralFitData::FIO_GeneralFitData()
+{
+dobj=new GeneralFitData;
+ownobj=true;
+}
+
+FIO_GeneralFitData::FIO_GeneralFitData(string const & filename) 
+{
+dobj=new GeneralFitData;
+ownobj=true; 
+Read(filename);
+}
+
+FIO_GeneralFitData::FIO_GeneralFitData(const GeneralFitData & obj) 
+{ 
+dobj = new GeneralFitData(obj);
+ownobj=true; 
+}
+
+FIO_GeneralFitData::FIO_GeneralFitData(GeneralFitData * obj) 
+{ 
+dobj = obj;
+ownobj=false; 
+}
+
+FIO_GeneralFitData::~FIO_GeneralFitData()
+{
+if (ownobj && dobj) delete dobj;
+}
+
+AnyDataObj* FIO_GeneralFitData::DataObj()
+{
+return(dobj);
+}
+
+void FIO_GeneralFitData::ReadSelf(PInPersist& is)
+{
+char strg[256];
+
+if(dobj==NULL) dobj=new GeneralFitData;
+  else         dobj->Delete();
+
+// Lecture entete
+is.GetLine(strg, 255);
+
+// Ecriture des valeurs de definitions
+int_4 nvar,ndatalloc,ndata,ndatagood;
+is.Get(nvar);
+is.Get(ndatalloc);
+is.Get(ndata);
+is.Get(ndatagood);
+is.Get(dobj->mOk_EXP);
+if(nvar<=0 || ndatalloc<=0 || ndata<=0 || ndatagood<0 || ndatalloc<ndata) return;
+
+// Allocation de la place (attention Alloc efface mNData,mNDataGood);
+dobj->Alloc(nvar,ndatalloc,-1);
+dobj->mNData = ndata;
+dobj->mNDataGood = ndatagood;
+
+// Lecture des datas
+is.GetLine(strg, 255);
+int blen = dobj->mNVar + 3;
+if(dobj->mOk_EXP) blen += dobj->mNVar;
+double *buff = new double[blen];
+for(int i=0;i<dobj->mNData;i++) {
+  is.Get(buff, blen);
+  int ip = i*dobj->mNVar;
+  {for(int j=0;j<dobj->mNVar;j++)  dobj->mXP[ip+j] = buff[j];}
+  dobj->mF[i] = buff[dobj->mNVar];
+  dobj->mErr[i] = buff[dobj->mNVar+1];
+  dobj->mOK[i] = (uint_2)(buff[dobj->mNVar+2]+0.01);
+  if(dobj->mOk_EXP) {for(int j=0;j<dobj->mNVar;j++)
+                        dobj->mErrXP[ip+j] = buff[dobj->mNVar+3+j];}
+}
+delete [] buff;
+
+return;
+}
+
+void FIO_GeneralFitData::WriteSelf(POutPersist& os) const
+{
+if (dobj == NULL)   return;
 char strg[256];
 
 // Ecriture entete pour identifier facilement
 sprintf(strg,"GeneralFitData: NVar=%d NDataAlloc=%d NData=%d NDataGood=%d Ok_EXP=%d"
-       ,mNVar,mNDataAlloc,mNData,mNDataGood,mOk_EXP);
-s.PutLine(strg);
+       ,dobj->mNVar,dobj->mNDataAlloc,dobj->mNData,dobj->mNDataGood,dobj->mOk_EXP);
+os.PutLine(strg);
 
 // Ecriture des valeurs de definitions
-s.PutI4(mNVar);
-s.PutI4(mNDataAlloc);
-s.PutI4(mNData);
-s.PutI4(mNDataGood);
-s.PutU2(mOk_EXP);
-if(mNVar<=0 || mNDataAlloc<=0 || mNData<=0 || mNDataGood<0) return;
+os.Put(dobj->mNVar);
+os.Put(dobj->mNDataAlloc);
+os.Put(dobj->mNData);
+os.Put(dobj->mNDataGood);
+os.Put(dobj->mOk_EXP);
+if(dobj->mNVar<=0 || dobj->mNDataAlloc<=0 || dobj->mNData<=0 || dobj->mNDataGood<0) return;
 
 // Ecriture des datas (on n'ecrit que mNData / mNDataAlloc)
 sprintf(strg
        ,"GeneralFitData: Abscisses, Ordonnee, Erreur Ordonnee, Flag, Erreur Abscisses");
-s.PutLine(strg);
-
-int blen = mNVar + 3;
-if(mOk_EXP) blen += mNVar;
+os.PutLine(strg);
+
+int blen = dobj->mNVar + 3;
+if(dobj->mOk_EXP) blen += dobj->mNVar;
 double *buff = new double[blen];
-for(int i=0;i<mNData;i++) {
-  {for(int j=0;j<mNVar;j++) buff[j] = Absc(j,i);}
-  buff[mNVar] = Val(i);
-  buff[mNVar+1] = EVal(i);
-  buff[mNVar+2] = (double) IsValid(i);
-  if(mOk_EXP) {for(int j=0;j<mNVar;j++) buff[mNVar+3+j] = EAbsc(j,i);}
-  s.PutR8s(buff, blen);
+for(int i=0;i<dobj->mNData;i++) {
+  {for(int j=0;j<dobj->mNVar;j++) buff[j] = dobj->Absc(j,i);}
+  buff[dobj->mNVar] = dobj->Val(i);
+  buff[dobj->mNVar+1] = dobj->EVal(i);
+  buff[dobj->mNVar+2] = (double) dobj->IsValid(i);
+  if(dobj->mOk_EXP) {for(int j=0;j<dobj->mNVar;j++) buff[dobj->mNVar+3+j] = dobj->EAbsc(j,i);}
+  os.Put(buff, blen);
 }
 delete [] buff;
@@ -962,129 +1114,2 @@
 return;
 }
-
-//////////////////////////////////////////////////////////////////////
-//++
-void GeneralFitData::ReadSelf(PInPersist& s)
-//
-//	Lecture ppersist
-//--
-{
-char strg[256];
-
-Delete();
-
-// Lecture entete
-s.GetLine(strg, 255);
-
-// Ecriture des valeurs de definitions
-int_4 nvar,ndatalloc,ndata,ndatagood;
-s.GetI4(nvar);
-s.GetI4(ndatalloc);
-s.GetI4(ndata);
-s.GetI4(ndatagood);
-s.GetU2(mOk_EXP);
-if(nvar<=0 || ndatalloc<=0 || ndata<=0 || ndatagood<0 || ndatalloc<ndata) return;
-
-// Allocation de la place (attention Alloc efface mNData,mNDataGood);
-Alloc(nvar,ndatalloc,-1);
-mNData = ndata;
-mNDataGood = ndatagood;
-
-// Lecture des datas
-s.GetLine(strg, 255);
-int blen = mNVar + 3;
-if(mOk_EXP) blen += mNVar;
-double *buff = new double[blen];
-for(int i=0;i<mNData;i++) {
-  s.GetR8s(buff, blen);
-  int ip = i*mNVar;
-  {for(int j=0;j<mNVar;j++)  mXP[ip+j] = buff[j];}
-  mF[i] = buff[mNVar];
-  mErr[i] = buff[mNVar+1];
-  mOK[i] = (uint_2)(buff[mNVar+2]+0.01);
-  if(mOk_EXP) {for(int j=0;j<mNVar;j++) mErrXP[ip+j] = buff[mNVar+3+j];}
-}
-delete [] buff;
-
-return;
-}
-
-//////////////////////////////////////////////////////////////////////
-//++
-// int inline int GetSpaceFree() const
-//	Retourne la place restante dans la structure (nombre de
-//	donnees que l'on peut encore stoquer).
-//--
-//++
-// inline int  NVar()       const
-//	Retourne le nombre de variables Xi
-//--
-//++
-// inline int  NData()
-//	Retourne le nombre de donnees
-//--
-//++
-// inline int  NDataGood()  const
-//	Retourne le nombre de bonnes donnees (utilisees pour le fit)
-//--
-//++
-// inline int  NDataAlloc() const
-//	Retourne la place maximale allouee pour les donnees
-//--
-//++
-// inline unsigned short int IsValid(int i) const
-//	Retourne 1 si point valide, sinon 0
-//--
-//++
-// inline bool HasXErrors()
-//	Retourne ``true'' si il y a des erreurs sur les variables
-//	d'abscisse, ``false'' sinon.
-//--
-//++
-// inline double X1(int i) const
-//	Retourne l'abscisse pour 1 dimension (y=f(x)) donnee I
-//--
-//++
-// inline double X(int i) const
-//	Retourne la 1er abscisse (X) pour (v=f(x,y,z,...)) donnee I
-//--
-//++
-// inline double Y(int i) const
-//	Retourne la 2sd abscisse (Y) pour (v=f(x,y,z,...)) donnee I
-//--
-//++
-// inline double Z(int i) const
-//	Retourne la 3ieme abscisse (Z) pour (v=f(x,y,z,...)) donnee I
-//--
-//++
-// inline double Absc(int j,int i) const
-//	Retourne la Jieme abscisse (Xj) pour (v=f(x0,x1,x2,...)) donnee I
-//--
-//++
-// inline double Val(int i) const
-//	Retourne la valeur de la Ieme donnee
-//--
-//++
-// inline double EX1(int i) const
-//	Retourne l'erreur (dx) sur l'abscisse pour 1 dimension (y=f(x)) donnee I
-//--
-//++
-// inline double EX(int i) const
-//	Retourne l'erreur (dx) sur la 1er abscisse (X) pour (v=f(x,y,z,...)) donnee I
-//--
-//++
-// inline double EY(int i) const
-//	Retourne l'erreur (dy) sur la 2sd abscisse (Y) pour (v=f(x,y,z,...)) donnee I
-//--
-//++
-// inline double EZ(int i) const
-//	Retourne l'erreur (dz) sur la 3ieme abscisse (Z) pour (v=f(x,y,z,...)) donnee I
-//--
-//++
-// inline double EAbsc(int j,int i) const
-//	Retourne l'erreur (dxj) sur la Jieme abscisse (Xj) pour (v=f(x0,x1,x2,...)) donnee I
-//--
-//++
-// inline double EVal(int i) const {return mErr[i];}
-//	Retourne l'erreur de la Ieme donnee
-//--
