Index: trunk/SophyaLib/NTools/NTools.o.list
===================================================================
--- trunk/SophyaLib/NTools/NTools.o.list	(revision 475)
+++ trunk/SophyaLib/NTools/NTools.o.list	(revision 490)
@@ -11,4 +11,6 @@
 fct1dfit.o
 fct2dfit.o
+fftpackc.o
+fftserver.o
 generaldata.o
 generalfit.o
@@ -25,4 +27,5 @@
 nbrandom.o
 nbtri.o
+ntupintf.o
 ntuple.o
 outilsinit.o
Index: trunk/SophyaLib/NTools/cimage.cc
===================================================================
--- trunk/SophyaLib/NTools/cimage.cc	(revision 475)
+++ trunk/SophyaLib/NTools/cimage.cc	(revision 490)
@@ -5,5 +5,5 @@
 // LAL (Orsay) / IN2P3-CNRS  DAPNIA/SPP (Saclay) / CEA
 
-// $Id: cimage.cc,v 1.4 1999-04-27 15:03:01 ansari Exp $        
+// $Id: cimage.cc,v 1.5 1999-10-21 15:25:42 ansari Exp $        
 
 
@@ -1069,5 +1069,5 @@
   if(deb>0) cout<<"MoySigmaIter mean="<<mean<<" sigma="<<sigma
                 <<" npix="<<rc<<" entre "<<xmin<<","<<xmax<<endl;
-  if( rc <= 0 ) return rc;
+  if( rc <= 0 || sigma<=0. ) return rc;
   if( it>=1 && fabs((double)(sigma-sigmaold))/sigma < perdiff ) break;
   xmin = mean - scut*sigma; if(testl && xmin<lowbad ) xmin = lowbad;
@@ -1213,5 +1213,5 @@
 {
 int i,j;
-int x,y;
+// int x,y;  $CHECK$ Reza 21/06/99 changement de methode de calcul des bornes
 const T1* pt_pim;
 T2* pt_copie;
@@ -1221,5 +1221,5 @@
 int step_pim_x;
 int pim_siz_x, pim_siz_y;
-int copie_siz_x, copie_siz_y;
+// int copie_siz_x, copie_siz_y;  $CHECK$ Reza 21/06/99 changement de methode de calcul des bornes
 int switch_copie;
 
@@ -1227,18 +1227,21 @@
 pim_siz_y=pim.YSize();
 if((org_pim_x < 0) || (org_pim_x > pim_siz_x))
-  { cout<< "CopieImage_erreure : org_pim_x: " <<org_pim_x<<" < 0 ou > a "<<pim_siz_x<<"\n\n";
+  { cout<< "CopieImage_erreure : org_pim_x: " <<org_pim_x<<" < 0 ou > a "<<pim_siz_x<<endl;
     THROW(rangeCheckErr);}
 if((org_pim_y < 0) || (org_pim_y > pim_siz_y))
-  { cout<< "CopieImage_erreure : org_pim_y: " <<org_pim_y<<" < 0 ou > a "<<pim_siz_y<<"\n\n";
+  { cout<< "CopieImage_erreure : org_pim_y: " <<org_pim_y<<" < 0 ou > a "<<pim_siz_y<<endl;
     THROW(rangeCheckErr);}
 
-copie_siz_x=copie.XSize();
-copie_siz_y=copie.YSize();
-if((org_copie_x < 0) || (org_copie_x > copie_siz_x))
-  { cout<< "CopieImage_erreure : org_copie_x: " <<org_copie_x<<" < 0 ou > a "<<copie_siz_x<<"\n\n";
+if( (org_copie_x < 0) || (org_copie_x > copie.XSize()) )
+  { cout<< "CopieImage_erreure : org_copie_x: " <<org_copie_x<<" < 0 ou > a "<< copie.XSize() << endl;
     THROW(rangeCheckErr);}
-if((org_copie_y < 0) || (org_copie_y > copie_siz_y))
-  { cout<< "CopieImage_erreure : org_copie_y: " <<org_copie_y<<" < 0 ou > a "<<copie_siz_y<<"\n\n";
+if( (org_copie_y < 0) || (org_copie_y > copie.YSize()) )
+  { cout<< "CopieImage_erreure : org_copie_y: " <<org_copie_y<<" < 0 ou > a "<< copie.YSize() << endl;
     THROW(rangeCheckErr);}
+
+/* $CHECK$ Reza 21/06/99  Changement de methode de calcul ------
+$CHECK$ Reza 21/06/99 , je change la taille a copier en fonction de l'origine de copie 
+copie_siz_x=copie.XSize()-org_copie_x;
+copie_siz_y=copie.YSize()-org_copie_y;
 
 x=pim_lpav_x;
@@ -1268,5 +1271,5 @@
     }
   else
-    {
+    { 
      step_copie_x=copie_siz_x-l_copie_x;
     }
@@ -1285,6 +1288,17 @@
    }
 
-pt_pim  = pim.ImagePtr()+org_pim_y*pim_siz_x+org_pim_x;
-pt_copie=copie.ImagePtr()+org_copie_y*copie_siz_x+org_copie_x;
+*/
+
+l_copie_x = copie.XSize()-org_copie_x;
+l_copie_y = copie.YSize()-org_copie_y;
+if ( pim_lpav_x > (pim.XSize()-org_pim_x) )  pim_lpav_x = pim.XSize()-org_pim_x;
+if ( pim_lpav_y > (pim.YSize()-org_pim_y) )  pim_lpav_y = pim.YSize()-org_pim_y;
+if ( (pim_lpav_x > 0) && (l_copie_x > pim_lpav_x) )  l_copie_x = pim_lpav_x;
+if ( (pim_lpav_y > 0) && (l_copie_y > pim_lpav_y) )  l_copie_y = pim_lpav_y;
+step_pim_x = pim.XSize()-l_copie_x;
+step_copie_x = copie.XSize()-l_copie_x;
+
+pt_pim  = pim.ImagePtr() + org_pim_y*pim.XSize() + org_pim_x;
+pt_copie=copie.ImagePtr() + org_copie_y*copie.XSize() + org_copie_x;
 
 switch((int)ConvType(*pt_pim,*pt_copie)) {
@@ -1361,26 +1375,48 @@
 if (!pim.ImagePtr())   THROW(nullPtrErr);
 if (!copie.ImagePtr()) THROW(nullPtrErr);
-copie.SetOrg(org_pim_x,org_pim_y);
-
-/* $CHECK$ Reza 28/04/95 : Je protege pour le moment contre les pave en
+copie.SetOrg( pim.XOrg()+org_pim_x-org_copie_x, pim.YOrg()+org_pim_y-org_copie_y);
+// copie.SetOrg(org_pim_x,org_pim_y);
+
+/* Reza 28/04/95 : Je protege pour le moment contre les pave en
 dehors de l'image, mais je veux pouvoir copier des paves decale par
-rapport aux bornes de l'image source  Re- $CHECK$ CMV+Reza 30/09/96 */
+rapport aux bornes de l'image source  Re- CMV+Reza 30/09/96 */
+/* $CHECK$ Reza 21/06/99 - Ca devrait etre OK  */
 if ( (org_pim_x < 0) || (org_pim_y < 0) ||
      (org_pim_x >= pim.XSize() ) || (org_pim_y >= pim.YSize() ) ||
      ((org_pim_x+copie.XSize()) > pim.XSize()) ||
-     ((org_pim_y+copie.YSize()) > pim.YSize()) ) copie.Zero();
-if ( (org_pim_x < 0) || (org_pim_y < 0) ||
-     (org_pim_x >= pim.XSize() ) || (org_pim_y >= pim.YSize() )) return;
+     ((org_pim_y+copie.YSize()) > pim.YSize()) ) copie.Zero(); 
+
+if ( (org_pim_x >= pim.XSize()) || (org_pim_y >= pim.YSize()) ) {
+  copie.SetOrg( pim.XOrg()+org_pim_x-org_copie_x, pim.YOrg()+org_pim_y-org_copie_y);
+  return;
+}   
+// if ( (org_pim_x < 0) || (org_pim_y < 0) ||
+//      (org_pim_x >= pim.XSize() ) || (org_pim_y >= pim.YSize() )) return;
+
+int oox = org_pim_x;
+int ooy = org_pim_y;
+int ocx = org_copie_x;
+int ocy = org_copie_y;
+if (oox < 0)  { ocx -= oox;  oox = 0; }
+if (ooy < 0)  { ocy -= ooy;  ooy = 0; }
 /*  Fin de $CHECK$  */
+
+// void CopieImageF(Image<T2>& copie, Image<T1> const& pim,
+//         int org_pim_x, int org_pim_y,            /* origine pave a copier */
+//         int pim_lpav_x, int pim_lpav_y,          /* largeur pave a copier */
+//         int org_copie_x, int org_copie_y,        /* origine copie         */
+//         double cutmin, double cutmax)            /* coupure pour max range*/
 
 if((pim_lpav_x <= 0) || (pim_lpav_x > pim.XSize())) pim_lpav_x=pim.XSize();
 if((pim_lpav_y <= 0) || (pim_lpav_y > pim.YSize())) pim_lpav_y=pim.YSize();
-TRY {
-  CopieImageF(copie, pim,org_pim_x,org_pim_y,
+try {
+  CopieImageF(copie, pim, oox, ooy, 
               pim_lpav_x, pim_lpav_y,
-              org_copie_x,org_copie_y,cutmin,cutmax);
+              ocx, ocy, cutmin,cutmax);
   }  catch(RangeCheckError) {
-      // if (merr != rangeCheckErr) THROW(merr);   Re- $CHECK$ CMV+Reza 30/09/96
+// $PLANCKCHECK$   if (merr != rangeCheckErr) THROW(merr);  // Re- $CHECK$ CMV+Reza 30/09/96
   } ENDTRY
+
+copie.SetOrg( pim.XOrg()+org_pim_x-org_copie_x, pim.YOrg()+org_pim_y-org_copie_y);
 }
 
Index: trunk/SophyaLib/NTools/datacards.h
===================================================================
--- trunk/SophyaLib/NTools/datacards.h	(revision 475)
+++ trunk/SophyaLib/NTools/datacards.h	(revision 490)
@@ -1,5 +1,5 @@
 // This may look like C code, but it is really -*- C++ -*-
 //
-// $Id: datacards.h,v 1.1.1.1 1999-04-09 17:57:55 ansari Exp $
+// $Id: datacards.h,v 1.2 1999-10-21 15:25:42 ansari Exp $
 //
 // Datacards, acquisition EROS II
@@ -20,11 +20,4 @@
 #include <vector>
 #include <string>
-
-#if defined(__KCC__)
-using std::string ;
-#include <functional.h>
-#include <list.h>
-#include <vector.h>
-#endif
 
 #include "peida.h"
Index: trunk/SophyaLib/NTools/dates.h
===================================================================
--- trunk/SophyaLib/NTools/dates.h	(revision 475)
+++ trunk/SophyaLib/NTools/dates.h	(revision 490)
@@ -6,7 +6,4 @@
 #include <iostream.h>
 #include "pexceptions.h"
-#if defined(__KCC__)
-using std::string ;
-#endif
 
 class TimeZone;
Index: trunk/SophyaLib/NTools/dvlist.h
===================================================================
--- trunk/SophyaLib/NTools/dvlist.h	(revision 475)
+++ trunk/SophyaLib/NTools/dvlist.h	(revision 490)
@@ -16,9 +16,4 @@
 #include <string.h>
 #include <string>
-#if defined(__KCC__)
-using std::string ;
-#include <list.h>
-#include <map.h>
-#endif
 
 namespace PlanckDPC {
Index: trunk/SophyaLib/NTools/fct2dfit.cc
===================================================================
--- trunk/SophyaLib/NTools/fct2dfit.cc	(revision 475)
+++ trunk/SophyaLib/NTools/fct2dfit.cc	(revision 490)
@@ -56,5 +56,5 @@
 : GeneralFunction(2,nPar), VolEps(1.e-4)
 {
-DBASSERT( nPar>0 );
+ASSERT( nPar>0 );
 }
 
@@ -212,7 +212,7 @@
   , mPsf2D(psf2d), mNStar(nstar)
 {
-DBASSERT( nstar>0 && psf2d!=NULL );
+ASSERT( nstar>0 && psf2d!=NULL );
 mNForme = mPsf2D->NPar() - 7;
-DBASSERT( mNForme>=0 );
+ASSERT( mNForme>=0 );
 mNParm = mPsf2D->NPar();
 mParm = new double[mNParm];
@@ -1539,5 +1539,5 @@
 double X2_GauRho2D::Value(GeneralFitData& data, double* parm, int& ndataused)
 {
- DBASSERT( data.NVar()==2 );
+ ASSERT( data.NVar()==2 );
  double x[2],z;
 
@@ -1556,5 +1556,5 @@
 double X2_GauRho2D::Derivee2(GeneralFitData& data, int i,int j, double* parm)
 {
- DBASSERT( data.NVar()==2 && i<7 && j<7);
+ ASSERT( data.NVar()==2 && i<7 && j<7);
  double x[2],dparm[7];
 
Index: trunk/SophyaLib/NTools/generaldata.cc
===================================================================
--- trunk/SophyaLib/NTools/generaldata.cc	(revision 475)
+++ trunk/SophyaLib/NTools/generaldata.cc	(revision 490)
@@ -8,8 +8,5 @@
 #include <string>
 
-#if defined(__KCC__)
-using std::string ;
-#endif
-
+#include "strutil.h"
 #include "nbtri.h"
 #include "generalfit.h"
@@ -134,5 +131,5 @@
 //--
 {
-DBASSERT( nVar>0 && ndatalloc>0 );
+ASSERT( nVar>0 && ndatalloc>0 );
 
 Delete();
@@ -176,5 +173,5 @@
 //--
 {
- DBASSERT(ptr >= 0 && ptr < mNDataAlloc);
+ ASSERT(ptr >= 0 && ptr < mNDataAlloc);
  mNData = ptr;
  mNDataGood = 0;
@@ -190,5 +187,5 @@
 //--
 {
- DBASSERT(i >= 0 && i < mNData);
+ ASSERT(i >= 0 && i < mNData);
 
  if( ! mOK[i] ) return;
@@ -203,7 +200,7 @@
 //--
 {
- DBASSERT(i1 >= 0 && i1 < mNData);
- DBASSERT(i2 >= 0 && i2 < mNData);
- DBASSERT(i1 <= i2 );
+ ASSERT(i1 >= 0 && i1 < mNData);
+ ASSERT(i2 >= 0 && i2 < mNData);
+ ASSERT(i1 <= i2 );
 
  for(int i=i1;i<=i2;i++) KillData(i);
@@ -217,5 +214,5 @@
 //--
 {
- DBASSERT(i >= 0 && i < mNData);
+ ASSERT(i >= 0 && i < mNData);
 
  if( mOK[i] ) return;
@@ -234,7 +231,7 @@
 //--
 {
- DBASSERT(i1 >= 0 && i1 < mNData);
- DBASSERT(i2 >= 0 && i2 < mNData);
- DBASSERT(i1 <= i2 );
+ ASSERT(i1 >= 0 && i1 < mNData);
+ ASSERT(i2 >= 0 && i2 < mNData);
+ ASSERT(i1 <= i2 );
 
  for(int i=i1;i<=i2;i++) ValidData(i);
@@ -281,5 +278,5 @@
 //--
 {
- DBASSERT(i>=0 && i<mNData);
+ ASSERT(i>=0 && i<mNData);
  bool ok = true;
 
@@ -335,5 +332,5 @@
 //--
 {
- DBASSERT(mNData < mNDataAlloc);
+ ASSERT(mNData < mNDataAlloc);
  bool ok = true;
 
@@ -377,5 +374,5 @@
 //--
 {
- DBASSERT(nData>0 && mNData+nData<=mNDataAlloc);
+ ASSERT(nData>0 && mNData+nData<=mNDataAlloc);
 
  for(int i=0;i<nData;i++) {
@@ -394,5 +391,5 @@
 //--
 {
- DBASSERT(nData>0 && mNData+nData<=mNDataAlloc);
+ ASSERT(nData>0 && mNData+nData<=mNDataAlloc);
 
  for(int i=0;i<nData;i++) {
@@ -411,5 +408,5 @@
 //--
 {
- DBASSERT(nData>0 && mNData+nData<=mNDataAlloc);
+ ASSERT(nData>0 && mNData+nData<=mNDataAlloc);
 
  for(int i=0;i<nData;i++) {
@@ -429,5 +426,5 @@
 //--
 {
- DBASSERT(nData>0 && mNData+nData<=mNDataAlloc);
+ ASSERT(nData>0 && mNData+nData<=mNDataAlloc);
 
  for(int i=0;i<nData;i++) {
@@ -454,5 +451,5 @@
 //--
 {
- DBASSERT(nData>0 && mNData+nData<=mNDataAlloc);
+ ASSERT(nData>0 && mNData+nData<=mNDataAlloc);
  if(mOk_EXP && !errxp) {for(int j=0;j<mNVar;j++) BuffVar[mNVar+j] = Def_ErrX;}
 
@@ -473,5 +470,5 @@
 //--
 {
- DBASSERT(nData>0 && mNData+nData<=mNDataAlloc);
+ ASSERT(nData>0 && mNData+nData<=mNDataAlloc);
 
  if(mOk_EXP && !errxp) {for(int j=0;j<mNVar;j++) BuffVar[mNVar+j] = Def_ErrX;}
@@ -506,5 +503,5 @@
 //--
 {
- DBASSERT(i>=0 && i<mNData);
+ ASSERT(i>=0 && i<mNData);
 
  cout<<" "<<i<<" F( ";
@@ -540,12 +537,28 @@
 //--
 {
- DBASSERT(mNData>0);
+ ASSERT(mNData>0);
 
  PrintData(0,mNData-1);
 }
 
-//////////////////////////////////////////////////////////////////////
-//++
-int GeneralFitData::GetMinMax(int var,int& imin,int& imax)
+//++
+void GeneralFitData::Show(ostream& os) const
+//
+//	Impression de l'etat de la structure de donnees avec bornes sur "s"
+//--
+{
+double min,max;
+os<<"GeneralFitData:: NVar,ErrX="<<mNVar<<","<<mOk_EXP
+  <<" Data: "<<mNData<<" Good,Alloc="<<mNDataGood<<","<<mNDataAlloc<<endl;
+for(int k=0;k<2*NVar()+3;k++) {
+  GetMinMax(k,min,max);
+  os<<" - "<<k<<" "<<ColumnName(k)<<"  ,  "<<min<<","<<max<<endl;
+}
+return;
+}
+
+//////////////////////////////////////////////////////////////////////
+//++
+int GeneralFitData::GetMnMx(int var,int& imin,int& imax) const
 //
 //	Retourne les numeros des points de valeurs minimum et maximum
@@ -582,13 +595,13 @@
 
 //++
-int GeneralFitData::GetMinMax(int var,double& min,double& max)
+int GeneralFitData::GetMnMx(int var,double& min,double& max) const
 //
 //	Retourne le minimum et le maximum de la variable ``var''
-//	(cf commentaires GetMinMax).
+//	(cf commentaires GetMnMx).
 //--
 {
 min = 1.; max = -1.;
 int imin,imax;
-int ntest = GetMinMax(var,imin,imax);
+int ntest = GetMnMx(var,imin,imax);
 if(ntest<=0) return ntest;
 int ix = var/10;
@@ -615,5 +628,5 @@
 //
 //	Retourne la moyenne et le sigma de la variable ``var''
-//	(cf commentaires GetMinMax).
+//	(cf commentaires GetMnMx).
 //| - Return : nombre de donnees utilisees, -1 si pb, -2 si sigma<0.
 //| - Seuls les points valides de valeur entre min,max sont utilises.
@@ -655,5 +668,5 @@
 //
 //	Retourne le mode de la variable ``var''
-//	(cf commentaires GetMinMax).
+//	(cf commentaires GetMnMx).
 //| - Return : nombre de donnees utilisees, -1 si pb.
 //| - Seuls les points valides de valeur entre min,max sont utilises.
@@ -876,4 +889,174 @@
 //////////////////////////////////////////////////////////////////////
 //++
+// 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
+//--
+
+
+//////////////////////////////////////////////////////////////////////
+// ------- Implementation de  l interface NTuple  ---------
+
+uint_4 GeneralFitData::NbLines() const
+{
+return(NData());
+}
+
+//++
+uint_4 GeneralFitData::NbColumns() const
+//
+//	Retourne le nombre de colonnes du ntuple equivalent:
+//| Exemple: on a une fonction sur un espace a 4 dimensions:
+//| "x0,x1,x2,x3    , ex0,ex1,ex2,ex3    , y,   ey ,    ok"
+//|   0  1  2  3        4   5   6   7      8     9      10
+//|   |        |        |           |      |     |       |        
+//|   0       nv-1     nv         2*nv-1  2*nv  2*nv+1  2*nv+2
+//| soit 2*nvar+3 variables/colonnes.
+//--
+{
+return(2*NVar()+3);
+}
+
+r_8 * GeneralFitData::GetLineD(int n) const
+{
+return(GetVec(n,NULL));
+}
+
+r_8 GeneralFitData::GetCell(int n, int k) const
+{
+if(k<0 || k>=2*NVar()+3) return 0.;
+r_8 * val = GetVec(n,NULL);
+return val[k];
+}
+
+r_8 GeneralFitData::GetCell(int n, string const & nom) const
+{
+int k = ColumnIndex(nom);
+return(GetCell(n,k));
+}
+
+//++
+void GeneralFitData::GetMinMax(int k, double& min, double& max)  const
+//
+//	Retourne le minimum et le maximum de la variable `k'.
+//--
+{
+int var;
+if(k<0 || k>=2*NVar()+3) return;
+else if(k<NVar())      var = 10*k+2;          // Variable Xi
+else if(k<2*NVar())    var = 10*(k-NVar())+3; // Variable EXi
+else if(k==2*NVar())   var = 0;               // Variable Y
+else if(k==2*NVar()+1) var = 1;               // Variable EY
+else {min=0.; max=1.; return;}                // Variable Ok
+GetMnMx(var,min,max);
+return;
+}
+
+void GeneralFitData::GetMinMax(string const & nom, double& min, double& max)   const
+{
+int k = ColumnIndex(nom);
+GetMinMax(k,min,max);
+}
+
+int GeneralFitData::ColumnIndex(string const & nom)  const
+{
+char str[64]; int k = -1;
+strcpy(str,nom.c_str()); strip(str,'L',' ');
+if(str[0]=='y') return 2*NVar();
+if(str[0]=='o') return 2*NVar()+2;
+if(str[0]=='x') {sscanf(str,"x%d",&k); return k;}
+if(str[0]=='e')
+  if(str[1]=='y') return 2*NVar()+1;
+  else if(str[1]=='x') {sscanf(str,"ex%d",&k); return NVar()+k;}
+return -1;
+}
+
+string GeneralFitData::ColumnName(int k) const
+{
+if(k==2*NVar())                return string("y");
+else if(k==2*NVar()+1)         return string("ey");
+else if(k==2*NVar()+2)         return string("ok");
+else if(k<0 || k>=2*NVar()+3)  return string("");
+
+char str[64] = "";
+if(k<NVar()) sprintf(str,"x%d",k);
+else if(k<2*NVar()) sprintf(str,"ex%d",k-NVar());
+return string(str);
+}
+
+//++
 string GeneralFitData::VarList_C(const char* nomx)  const
 //
@@ -911,84 +1094,4 @@
 }
 
-//////////////////////////////////////////////////////////////////////
-//++
-// 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
-//--
-
 ///////////////////////////////////////////////////////////
 // --------------------------------------------------------
@@ -997,40 +1100,6 @@
 ///////////////////////////////////////////////////////////
 
-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)
+
+void ObjFileIO<GeneralFitData>::ReadSelf(PInPersist& is)
 {
 char strg[256];
@@ -1076,5 +1145,5 @@
 }
 
-void FIO_GeneralFitData::WriteSelf(POutPersist& os) const
+void ObjFileIO<GeneralFitData>::WriteSelf(POutPersist& os) const
 {
 if (dobj == NULL)   return;
@@ -1114,2 +1183,11 @@
 return;
 }
+
+
+#ifdef __CXX_PRAGMA_TEMPLATES__
+#pragma define_template ObjFileIO<GeneralFitData>
+#endif
+
+#if defined(ANSI_TEMPLATES) || defined(GNU_TEMPLATES)
+template class ObjFileIO<GeneralFitData>;
+#endif
Index: trunk/SophyaLib/NTools/generaldata.h
===================================================================
--- trunk/SophyaLib/NTools/generaldata.h	(revision 475)
+++ trunk/SophyaLib/NTools/generaldata.h	(revision 490)
@@ -4,13 +4,14 @@
 #define GENERALDATA_SEEN
 
+#include "objfio.h"
+#include <iostream.h>
 #include "pexceptions.h"
 #include "ppersist.h"
+#include "ntupintf.h"
 #include "poly.h"
-#include "anydataobj.h"
 
 namespace PlanckDPC {
 
 class GeneralFit;
-class FIO_GeneralFitData;
 
 //================================================================
@@ -18,7 +19,7 @@
 //================================================================
 
-class GeneralFitData : public AnyDataObj {
+class GeneralFitData : public AnyDataObj , public NTupleInterface {
   friend class GeneralFit;
-  friend class FIO_GeneralFitData;
+  friend class ObjFileIO<GeneralFitData>;
 public:
   enum {Def_ErrF = 1, Def_ErrX = 0};
@@ -63,4 +64,6 @@
   void PrintData(int i1,int i2);
   void PrintData();
+  void Show(ostream& os) const;
+  inline void Show() const {Show(cout);}
 
   inline int GetSpaceFree() const { return mNDataAlloc - mNData; }
@@ -103,8 +106,8 @@
                 {if(i>=0 && i<mNData) return mErr[i]; else return 0.;}
 
-  r_8* GetVec(int n, r_8* ret=NULL)  const ;
-  r_4* GetVecR4(int n, r_4* ret=NULL)  const ;
-  int GetMinMax(int var,int& imin,int& imax);
-  int GetMinMax(int var,double& min,double& max);
+  r_8* GetVec(int n, r_8* ret=NULL)  const;
+  r_4* GetVecR4(int n, r_4* ret=NULL)  const;
+  int GetMnMx(int var,int& imin,int& imax) const;
+  int GetMnMx(int var,double& min,double& max) const;
   int GetMeanSigma(int var,double& mean,double& sigma,double min=1.,double max=-1.);
   int GetMoMeMed(int var,double& mode,double& mean,double& median,
@@ -115,5 +118,16 @@
   GeneralFitData FitResidus(GeneralFit& gfit);
   GeneralFitData FitFunction(GeneralFit& gfit);
-  string VarList_C(const char* nomx)  const;
+
+// Declaration de l interface NTuple
+  virtual uint_4        NbLines() const;
+  virtual uint_4        NbColumns() const;
+  virtual r_8 *         GetLineD(int n) const;
+  virtual r_8		GetCell(int n, int k) const;
+  virtual r_8		GetCell(int n, string const & nom) const;
+  virtual void		GetMinMax(int k, double& min, double& max) const; 
+  virtual void		GetMinMax(string const & nom, double& min, double& max) const;
+  virtual int           ColumnIndex(string const & nom) const;
+  virtual string        ColumnName(int k) const;
+  virtual string	VarList_C(const char* nomx=NULL) const;
 
 protected:
@@ -134,21 +148,17 @@
 };
 
+inline ostream& operator << (ostream& s, GeneralFitData const & g)
+                         {g.Show(s); return(s);}
+
 /////////////////////////////////////////////////////////////////////////
 // Classe pour la gestion de persistance
-class FIO_GeneralFitData : public  PPersist  {
-public:
-  FIO_GeneralFitData();
-  FIO_GeneralFitData(string const & filename); 
-  FIO_GeneralFitData(const GeneralFitData & obj);
-  FIO_GeneralFitData(GeneralFitData * obj);
-  virtual ~FIO_GeneralFitData();
-  virtual AnyDataObj* DataObj();
-  inline operator GeneralFitData() { return(*dobj); }
-protected :
-  virtual void ReadSelf(PInPersist&);           
-  virtual void WriteSelf(POutPersist&) const;  
-  GeneralFitData * dobj;
-  bool ownobj;
-};
+
+inline POutPersist& operator << (POutPersist& os, GeneralFitData & obj)
+{ ObjFileIO<GeneralFitData> fio(&obj);  fio.Write(os);  return(os); }
+inline PInPersist& operator >> (PInPersist& is, GeneralFitData & obj)
+{ ObjFileIO<GeneralFitData> fio(&obj);  fio.Read(is);  return(is); }
+
+// Classe pour la gestion de persistance
+// ObjFileIO<GeneralFitData>
 
 } // Fin du namespace
Index: trunk/SophyaLib/NTools/generalfit.cc
===================================================================
--- trunk/SophyaLib/NTools/generalfit.cc	(revision 475)
+++ trunk/SophyaLib/NTools/generalfit.cc	(revision 490)
@@ -7,8 +7,4 @@
 #include <string>
 
-#if defined(__KCC__)
-using std::string ;
-#endif
-
 #include "pexceptions.h"
 #include "generalfit.h"
@@ -41,5 +37,5 @@
   : mNVar(nVar), mNPar(nPar)
 {
- DBASSERT( nVar > 0 && nPar > 0 );
+ ASSERT( nVar > 0 && nPar > 0 );
  deltaParm = new double[nPar];
  tmpParm   = new double[nPar];
@@ -86,5 +82,5 @@
 //--
 {
- DBASSERT(numPar >= 0 && numPar < mNPar);
+ ASSERT(numPar >= 0 && numPar < mNPar);
  deltaParm[numPar] = d;
 }
@@ -226,5 +222,5 @@
   : mNPar(nPar)
 { 
- DBASSERT( nPar>0 );
+ ASSERT( nPar>0 );
  deltaParm = new double[nPar];
  END_CONSTRUCTOR
@@ -307,5 +303,5 @@
 //--
 {
- DBASSERT(numPar >= 0 && numPar < mNPar);
+ ASSERT(numPar >= 0 && numPar < mNPar);
   
  deltaParm[numPar] = d;
@@ -375,6 +371,6 @@
     D             (f->NPar())
 {
- DBASSERT(mNVar>0 && mNPar>0);
- DBASSERT(mNPar<1000000);
+ ASSERT(mNVar>0 && mNPar>0);
+ ASSERT(mNPar<1000000);
 
  TRY {
@@ -418,6 +414,6 @@
     D             (f->NPar())
 {
- DBASSERT( mNPar>0 );
- DBASSERT( mNPar < 1000000 );
+ ASSERT( mNPar>0 );
+ ASSERT( mNPar < 1000000 );
 
  TRY {
@@ -573,5 +569,5 @@
 //--
 {
- DBASSERT(n>=0 && n<mNPar);
+ ASSERT(n>=0 && n<mNPar);
  Eps(n) = (ep<=0.) ? EPS_FIT_MIN: ep;
  if(debugLevel>0) cout<<"SetEps("<<n<<") = "<<Eps(n)<<endl;
@@ -616,8 +612,8 @@
 //--
 {
- DBASSERT( mFuncXi2  == NULL );
- DBASSERT( f != NULL );
- DBASSERT( f->NVar() == mNVar );
- DBASSERT( f->NPar() == mNPar );
+ ASSERT( mFuncXi2  == NULL );
+ ASSERT( f != NULL );
+ ASSERT( f->NVar() == mNVar );
+ ASSERT( f->NPar() == mNPar );
  mFunction = f;
  if(debugLevel>0) cout<<"SetFunction "<<mFunction<<endl;
@@ -632,7 +628,7 @@
 //--
 {
- DBASSERT( mFunction == NULL );
- DBASSERT( f != NULL );
- DBASSERT( f->NPar() == mNPar );
+ ASSERT( mFunction == NULL );
+ ASSERT( f != NULL );
+ ASSERT( f->NPar() == mNPar );
  mFuncXi2  = f;
  if(debugLevel>0) cout<<"SetFuncXi2 "<<mFuncXi2<<endl;
@@ -646,5 +642,5 @@
 //--
 {
- DBASSERT( data->NVar()==mNVar || mFunction==NULL );
+ ASSERT( data->NVar()==mNVar );
  mData = data;
  mNddl = mData->NDataGood() - mNParFree;
@@ -661,5 +657,5 @@
 //--
 {
- DBASSERT(n>=0 && n<mNPar);
+ ASSERT(n>=0 && n<mNPar);
 
  Param(n)     = value;
@@ -688,5 +684,5 @@
 //--
 {
- DBASSERT(n>=0 && n<mNPar);
+ ASSERT(n>=0 && n<mNPar);
  SetParam(n,value,step,min,max);
  nameParam[n] = name;
@@ -700,5 +696,5 @@
 //--
 {
- DBASSERT(n>=0 && n<mNPar);
+ ASSERT(n>=0 && n<mNPar);
  Param(n) = value;
  if(debugLevel) {cout<<"Set_Param "; PrintParm(n);}
@@ -713,5 +709,5 @@
 //--
 {
- DBASSERT(n>=0 && n<mNPar);
+ ASSERT(n>=0 && n<mNPar);
  if(step>0.) {
    if( fixParam[n] ) { fixParam[n]=0; mNParFree++;}
@@ -734,5 +730,5 @@
 //--
 {
- DBASSERT(i>=0 && i<mNPar);
+ ASSERT(i>=0 && i<mNPar);
  if(val<0.) minStepDeriv(i) = Eps(i);
    else     minStepDeriv(i) = val;
@@ -759,5 +755,5 @@
 //--
 {
- DBASSERT(n>=0 && n<mNPar && max>min);
+ ASSERT(n>=0 && n<mNPar && max>min);
 
  minParam(n)  = min;
@@ -778,5 +774,5 @@
 //--
 {
- DBASSERT(n>=0 && n<mNPar && maxParam(n)>minParam(n));
+ ASSERT(n>=0 && n<mNPar && maxParam(n)>minParam(n));
  SetBound(n,minParam(n),maxParam(n));
 }
@@ -788,5 +784,5 @@
 //--
 {
- DBASSERT(n>=0 && n<mNPar);
+ ASSERT(n>=0 && n<mNPar);
 
  if( boundParam[n] ) {
@@ -814,5 +810,5 @@
 //--
 {
- DBASSERT(n>=0 && n<mNPar);
+ ASSERT(n>=0 && n<mNPar);
 
  Param(n) = v;
@@ -833,5 +829,5 @@
 //--
 {
- DBASSERT(n>=0 && n<mNPar);
+ ASSERT(n>=0 && n<mNPar);
  SetFix(n,Param(n));
 }
@@ -843,5 +839,5 @@
 //--
 {
- DBASSERT(n>=0 && n<mNPar);
+ ASSERT(n>=0 && n<mNPar);
 
  if( fixParam[n] ) {
@@ -873,5 +869,5 @@
 //--
 {
- DBASSERT(n>=0 && n<mNPar);
+ ASSERT(n>=0 && n<mNPar);
  return Param(n);
 }
@@ -892,5 +888,5 @@
 //--
 {
- DBASSERT(n>=0 && n<mNPar);
+ ASSERT(n>=0 && n<mNPar);
  return errParam(n);
 }
@@ -902,5 +898,5 @@
 //--
 {
- DBASSERT(i>=0 && i<mNPar && j>=0 && j<mNPar);
+ ASSERT(i>=0 && i<mNPar && j>=0 && j<mNPar);
  return ATGA(i,j);
 }
@@ -913,5 +909,5 @@
 //--
 {
- DBASSERT(n>=0 && n<mNPar);
+ ASSERT(n>=0 && n<mNPar);
  return stepParam(n);
 }
@@ -923,5 +919,5 @@
 //--
 {
- DBASSERT(n>=0 && n<mNPar);
+ ASSERT(n>=0 && n<mNPar);
  return maxParam(n);
 }
@@ -933,5 +929,5 @@
 //--
 {
- DBASSERT(n>=0 && n<mNPar);
+ ASSERT(n>=0 && n<mNPar);
  return minParam(n);
 }
@@ -986,5 +982,5 @@
 //--
 {
- DBASSERT(n>=0 && n<mNPar);
+ ASSERT(n>=0 && n<mNPar);
 
  cout<<"Par["<<n<<"] "<<nameParam[n]
@@ -1396,5 +1392,5 @@
 //--
 {
-double c2 = -.1;
+double c2 = -1.;
 if(par==NULL) par = Param.Data();
 if( mData->NData() <= 0 ) {nddl = -100; return 0.;}
@@ -1622,13 +1618,13 @@
 void GeneralFit::CheckSanity()
 {
-  DBASSERT( mData != NULL );
-  DBASSERT( mFunction != NULL || mFuncXi2 != NULL );
+  ASSERT( mData != NULL );
+  ASSERT( mFunction != NULL || mFuncXi2 != NULL );
   if( mFunction != NULL ) {
-    DBASSERT( mFunction->NVar() == mNVar );
-    DBASSERT( mData->NVar() == mNVar );
+    ASSERT( mFunction->NVar() == mNVar );
+    ASSERT( mData->NVar() == mNVar );
   }
-  DBASSERT( mNParFree > 0 && mNParFree <= mNPar );
-  DBASSERT( mNParBound >= 0 && mNParBound <= mNPar );
-  DBASSERT( mNParFree <= mData->NDataGood() );
+  ASSERT( mNParFree > 0 && mNParFree <= mNPar );
+  ASSERT( mNParBound >= 0 && mNParBound <= mNPar );
+  ASSERT( mNParFree <= mData->NDataGood() );
 }
 
@@ -1638,5 +1634,5 @@
 // D = (max-min)/Pi
 {
-  // DBASSERT(i>=0 && i<mNPar);
+  // ASSERT(i>=0 && i<mNPar);
  C(i) = D(i) = 0.;
  if( !boundParam[i] || fixParam[i] ) return;
@@ -1661,5 +1657,5 @@
 // tr = tan( (p-C)/D )
 {
- // DBASSERT(i>=0 && i<mNPar);
+ // ASSERT(i>=0 && i<mNPar);
  double tr = p;
  if(boundParam[i]) tr = tan((p-C(i))/D(i));
@@ -1692,5 +1688,5 @@
 // p = C+D*atan(tr)
 {
- // DBASSERT(i>=0 && i<mNPar);
+ // ASSERT(i>=0 && i<mNPar);
  double p = tr;
  if(boundParam[i]) p = C(i)+D(i)*atan(tr);
@@ -1724,5 +1720,5 @@
 // attention: df/dp = (1+tr**2)/D * dF/dtr = coeff * dF/dtr
 {
- // DBASSERT(i>=0 && i<mNPar);
+ // ASSERT(i>=0 && i<mNPar);
  double coeff = 1.;
  if(boundParam[i]) coeff = (1.+tr*tr)/D(i);
@@ -1756,5 +1752,5 @@
 // attention: df/dtr = D/(1+tr**2) * dF/dp = coeff * dF/dp
 {
-  // DBASSERT(i>=0 && i<mNPar);
+  // ASSERT(i>=0 && i<mNPar);
  double coeff = 1.;
  if(boundParam[i]) coeff = D(i)/(1.+tr*tr);
Index: trunk/SophyaLib/NTools/hisprof.cc
===================================================================
--- trunk/SophyaLib/NTools/hisprof.cc	(revision 475)
+++ trunk/SophyaLib/NTools/hisprof.cc	(revision 490)
@@ -303,40 +303,6 @@
 ///////////////////////////////////////////////////////////
 
-FIO_HProf::FIO_HProf()
-{
-dobj=new HProf;
-ownobj=true;
-}
-
-FIO_HProf::FIO_HProf(string const & filename) 
-{
-dobj=new HProf;
-ownobj=true; 
-Read(filename);
-}
-
-FIO_HProf::FIO_HProf(const HProf & obj) 
-{ 
-dobj = new HProf(obj);
-ownobj=true; 
-}
-
-FIO_HProf::FIO_HProf(HProf * obj) 
-{ 
-dobj = obj;
-ownobj=false; 
-}
-
-FIO_HProf::~FIO_HProf()
-{
-if (ownobj && dobj) delete dobj;
-}
-
-AnyDataObj* FIO_HProf::DataObj()
-{
-return(dobj);
-}
-
-void FIO_HProf::ReadSelf(PInPersist& is)
+
+void ObjFileIO<HProf>::ReadSelf(PInPersist& is)
 {
 char strg[256];
@@ -365,11 +331,9 @@
 
 // Ecriture de l'histogramme
-FIO_Histo fio_h((Histo&)*dobj);
-fio_h.Read(is);
-
+is >> (Histo&)(*dobj);
 return;
 }
 
-void FIO_HProf::WriteSelf(POutPersist& os) const
+void ObjFileIO<HProf>::WriteSelf(POutPersist& os) const
 {
 if (dobj == NULL)   return;
@@ -396,7 +360,16 @@
 
 // Ecriture de l'histogramme
-FIO_Histo fio_h((Histo&)*dobj);
-fio_h.Write(os);
+// FIO_Histo fio_h((Histo&)*dobj);
+// fio_h.Write(os);
+os << (Histo&)(*dobj);
 
 return;
 }
+
+#ifdef __CXX_PRAGMA_TEMPLATES__
+#pragma define_template ObjFileIO<HProf>
+#endif
+
+#if defined(ANSI_TEMPLATES) || defined(GNU_TEMPLATES)
+template class ObjFileIO<HProf>;
+#endif
Index: trunk/SophyaLib/NTools/hisprof.h
===================================================================
--- trunk/SophyaLib/NTools/hisprof.h	(revision 475)
+++ trunk/SophyaLib/NTools/hisprof.h	(revision 490)
@@ -11,5 +11,5 @@
 
 class HProf : public Histo {
-  friend class FIO_HProf;
+  friend class ObjFileIO<HProf>;
 public:
 
@@ -65,21 +65,12 @@
 };
 
-/////////////////////////////////////////////////////////////////////////
+
+inline POutPersist& operator << (POutPersist& os, HProf & obj)
+{ ObjFileIO<HProf> fio(&obj);  fio.Write(os);  return(os); }
+inline PInPersist& operator >> (PInPersist& is, HProf & obj)
+{ ObjFileIO<HProf> fio(&obj);  fio.Read(is);  return(is); }
 // Classe pour la gestion de persistance
-class FIO_HProf : public  PPersist  {
-public:
-  FIO_HProf();
-  FIO_HProf(string const & filename); 
-  FIO_HProf(const HProf & obj);
-  FIO_HProf(HProf * obj);
-  virtual ~FIO_HProf();
-  virtual AnyDataObj* DataObj();
-  inline operator HProf() { return(*dobj); }
-protected :
-  virtual void ReadSelf(PInPersist&);           
-  virtual void WriteSelf(POutPersist&) const;  
-  HProf * dobj;
-  bool ownobj;
-};
+// ObjFileIO<HProf>
+
 
 } // Fin du namespace
Index: trunk/SophyaLib/NTools/history_eros
===================================================================
--- trunk/SophyaLib/NTools/history_eros	(revision 475)
+++ trunk/SophyaLib/NTools/history_eros	(revision 490)
@@ -2,138 +2,217 @@
 -----------> cspline.cc
    Repository revision:	1.5	/projects/Eros/CVSEros/CodeCxx/Outils/cspline.cc,v
+   OK                   1.5
 -----------> cspline.h
    Repository revision:	1.4	/projects/Eros/CVSEros/CodeCxx/Outils/cspline.h,v
+   OK                   1.4
 -----------> cvector.cc
    Repository revision:	1.8	/projects/Eros/CVSEros/CodeCxx/Outils/cvector.cc,v
+   OK                   1.8
 -----------> cvector.h
    Repository revision:	1.7	/projects/Eros/CVSEros/CodeCxx/Outils/cvector.h,v
+   OK                   1.7
 -----------> datacards.cc
    Repository revision:	1.18	/projects/Eros/CVSEros/CodeCxx/Outils/datacards.cc,v
+   OK                   1.18
 -----------> datacards.h
    Repository revision:	1.10	/projects/Eros/CVSEros/CodeCxx/Outils/datacards.h,v
+   MAJ                  1.11   (pour namespace std de KCC)
 -----------> datatypes.cc
    Repository revision:	1.5	/projects/Eros/CVSEros/CodeCxx/Outils/datatypes.cc,v
+   OK                   1.5
 -----------> datatypes.h
    Repository revision:	1.4	/projects/Eros/CVSEros/CodeCxx/Outils/datatypes.h,v
+   OK                   1.4
 -----------> dates.cc
    Repository revision:	1.11	/projects/Eros/CVSEros/CodeCxx/Outils/dates.cc,v
+   OK                   1.11
 -----------> dates.h
    Repository revision:	1.9	/projects/Eros/CVSEros/CodeCxx/Outils/dates.h,v
+   MAJ                  1.10
 -----------> difeq.cc
    Repository revision:	1.9	/projects/Eros/CVSEros/CodeCxx/Outils/difeq.cc,v
+   OK                   1.9
 -----------> difeq.h
    Repository revision:	1.6	/projects/Eros/CVSEros/CodeCxx/Outils/difeq.h,v
+   OK                   1.6
 -----------> dvlist.cc
    Repository revision:	1.9	/projects/Eros/CVSEros/CodeCxx/Outils/dvlist.cc,v
+   OK                   1.9
 -----------> dvlist.h
    Repository revision:	1.14	/projects/Eros/CVSEros/CodeCxx/Outils/dvlist.h,v
+   MAJ                  1.16
 -----------> fct1dfit.cc
    Repository revision:	1.7	/projects/Eros/CVSEros/CodeCxx/Outils/fct1dfit.cc,v
+   OK                   1.7
 -----------> fct1dfit.h
    Repository revision:	1.4	/projects/Eros/CVSEros/CodeCxx/Outils/fct1dfit.h,v
+   OK                   1.4
 -----------> fct2dfit.cc
    Repository revision:	1.8	/projects/Eros/CVSEros/CodeCxx/Outils/fct2dfit.cc,v
+   MAJ                  1.9
 -----------> fct2dfit.h
    Repository revision:	1.4	/projects/Eros/CVSEros/CodeCxx/Outils/fct2dfit.h,v
+   OK                   1.4
 -----------> generaldata.cc
    Repository revision:	1.6	/projects/Eros/CVSEros/CodeCxx/Outils/generaldata.cc,v
+   MAJ                  1.9
 -----------> generaldata.h
    Repository revision:	1.4	/projects/Eros/CVSEros/CodeCxx/Outils/generaldata.h,v
+   MAJ                  1.5
 -----------> generalfit.cc
    Repository revision:	1.47	/projects/Eros/CVSEros/CodeCxx/Outils/generalfit.cc,v
+   MAJ                  1.51
 -----------> generalfit.h
    Repository revision:	1.20	/projects/Eros/CVSEros/CodeCxx/Outils/generalfit.h,v
+   OK                   1.20
 -----------> hisprof.cc
    Repository revision:	1.3	/projects/Eros/CVSEros/CodeCxx/Outils/hisprof.cc,v
+   OK                   1.3
 -----------> hisprof.h
    Repository revision:	1.3	/projects/Eros/CVSEros/CodeCxx/Outils/hisprof.h,v
+   OK                   1.3
 -----------> histos.cc
    Repository revision:	1.27	/projects/Eros/CVSEros/CodeCxx/Outils/histos.cc,v
+   OK                   1.27
 -----------> histos.h
    Repository revision:	1.19	/projects/Eros/CVSEros/CodeCxx/Outils/histos.h,v
+   OK                   1.19
 -----------> histos2.cc
    Repository revision:	1.17	/projects/Eros/CVSEros/CodeCxx/Outils/histos2.cc,v
+   MAJ                  1.19
 -----------> histos2.h
    Repository revision:	1.15	/projects/Eros/CVSEros/CodeCxx/Outils/histos2.h,v
+   MAJ                  1.16
 -----------> integ.cc
    Repository revision:	1.8	/projects/Eros/CVSEros/CodeCxx/Outils/integ.cc,v
+   OK                   1.8
 -----------> integ.h
    Repository revision:	1.6	/projects/Eros/CVSEros/CodeCxx/Outils/integ.h,v
+   MAJ                  1.7
 -----------> linfit.cc
    Repository revision:	1.4	/projects/Eros/CVSEros/CodeCxx/Outils/linfit.cc,v
+   OK                   1.4
 -----------> linfit.h
    Repository revision:	1.7	/projects/Eros/CVSEros/CodeCxx/Outils/linfit.h,v
+   OK                   1.7
 -----------> matrix.cc
    Repository revision:	1.17	/projects/Eros/CVSEros/CodeCxx/Outils/matrix.cc,v
+   MAJ                  1.18
 -----------> matrix.h
    Repository revision:	1.8	/projects/Eros/CVSEros/CodeCxx/Outils/matrix.h,v
+   OK                   1.8
 -----------> median.cc
    Repository revision:	1.1	/projects/Eros/CVSEros/CodeCxx/Outils/median.cc,v
+   OK                   1.1
 -----------> median.h
    Repository revision:	1.1	/projects/Eros/CVSEros/CodeCxx/Outils/median.h,v
+   OK                   1.1
 -----------> nbconst.h
    Repository revision:	1.6	/projects/Eros/CVSEros/CodeCxx/Outils/nbconst.h,v
+   MAJ                  1.7     juste un commentaire /**/ en //
+
+-----------> ntupintf.cc 
+   Repository revision: 1.3     /projects/Eros/CVSEros/CodeCxx/Outils/ntupintf.h,v
+   OK - ajoute
+-----------> ntupintf.h 
+   Repository revision: 1.4     /projects/Eros/CVSEros/CodeCxx/Outils/ntupintf.h,v
+   OK - ajoute
 -----------> ntuple.cc
    Repository revision:	1.12	/projects/Eros/CVSEros/CodeCxx/Outils/ntuple.cc,v
+   OK                   1.19
 -----------> ntuple.h
+   MAJ                  1.15
    Repository revision:	1.9	/projects/Eros/CVSEros/CodeCxx/Outils/ntuple.h,v
 -----------> outilsinit.cc
    Repository revision:	1.2	/projects/Eros/CVSEros/CodeCxx/Outils/outilsinit.cc,v
+                        1.3   Ajout de XNTuple, pas fait
 -----------> outilsinit.h
    Repository revision:	1.3	/projects/Eros/CVSEros/CodeCxx/Outils/outilsinit.h,v
+   OK                   1.3
 -----------> pclassids.h
    Repository revision:	1.8	/projects/Eros/CVSEros/CodeCxx/Outils/pclassids.h,v
+   MAJ                  1.9     ClassId_XNTuple 
 -----------> peida.h
    Repository revision:	1.4	/projects/Eros/CVSEros/CodeCxx/Outils/peida.h,v
+   OK                   1.4
 -----------> pemath.h
    Repository revision:	1.2	/projects/Eros/CVSEros/CodeCxx/Outils/pemath.h,v
+   OK                   1.2
 -----------> perandom.cc
    Repository revision:	1.11	/projects/Eros/CVSEros/CodeCxx/Outils/perandom.cc,v
+   OK                   1.11
 -----------> perandom.h
    Repository revision:	1.8	/projects/Eros/CVSEros/CodeCxx/Outils/perandom.h,v
+   OK                   1.8
 -----------> poly.cc
    Repository revision:	1.10	/projects/Eros/CVSEros/CodeCxx/Outils/poly.cc,v
+   MAJ                  1.12
 -----------> poly.h
    Repository revision:	1.8	/projects/Eros/CVSEros/CodeCxx/Outils/poly.h,v
+   OK                   1.8
 -----------> pversion.cc
    Repository revision:	1.4	/projects/Eros/CVSEros/CodeCxx/Outils/pversion.cc,v
+   OK                   1.4
 -----------> pversion.h
    Repository revision:	1.37	/projects/Eros/CVSEros/CodeCxx/Outils/pversion.h,v
+   OK                   1.42    rien a faire - numero de version
+   
 -----------> rk4cdifeq.cc
    Repository revision:	1.4	/projects/Eros/CVSEros/CodeCxx/Outils/rk4cdifeq.cc,v
+   OK                   1.4
 -----------> rk4cdifeq.h
    Repository revision:	1.2	/projects/Eros/CVSEros/CodeCxx/Outils/rk4cdifeq.h,v
+   OK                   1.2
 -----------> simplesort.cc
    Repository revision:	1.9	/projects/Eros/CVSEros/CodeCxx/Outils/simplesort.cc,v
+   OK                   1.9
 -----------> simplesort.h
    Repository revision:	1.11	/projects/Eros/CVSEros/CodeCxx/Outils/simplesort.h,v
+   MAJ                  1.12    KCC std
+   
 -----------> simps2d.h
    Repository revision:	1.1	/projects/Eros/CVSEros/CodeCxx/Outils/simps2d.h,v
+   OK                   1.1
 -----------> tabmath.cc
    Repository revision:	1.3	/projects/Eros/CVSEros/CodeCxx/Outils/tabmath.cc,v
+   OK                   1.3
 -----------> tabmath.h
    Repository revision:	1.2	/projects/Eros/CVSEros/CodeCxx/Outils/tabmath.h,v
+   OK                   1.2
 -----------> utils.cc
    Repository revision:	1.9	/projects/Eros/CVSEros/CodeCxx/Outils/utils.cc,v
+   OK                   1.9
 -----------> utils.h
    Repository revision:	1.14	/projects/Eros/CVSEros/CodeCxx/Outils/utils.h,v
+   OK                   1.15    KCC std
 
 NTools from Images++
 -----------> cimage.cc
    Repository revision:	1.36	/projects/Eros/CVSEros/CodeCxx/Images/cimage.cc,v
+   MAJ                  1.38
 -----------> cimage.h
    Repository revision:	1.22	/projects/Eros/CVSEros/CodeCxx/Images/cimage.h,v
+   OK                   1.22
 -----------> dynccd.cc
    Repository revision:	1.20	/projects/Eros/CVSEros/CodeCxx/Images/dynccd.cc,v
+   OK                   1.20
 -----------> dynccd.h
    Repository revision:	1.11	/projects/Eros/CVSEros/CodeCxx/Images/dynccd.h,v
+   OK                   1.11
 -----------> imageop.cc
    Repository revision:	1.27	/projects/Eros/CVSEros/CodeCxx/Images/imageop.cc,v
+   MAJ                  1.28    NoiseFiltImage
 -----------> imageop.h
    Repository revision:	1.17	/projects/Eros/CVSEros/CodeCxx/Images/imageop.h,v
+   MAJ                  1.18    
 -----------> rzimage.cc
    Repository revision:	1.29	/projects/Eros/CVSEros/CodeCxx/Images/rzimage.cc,v
+   OK                   1.29
 -----------> rzimage.h
    Repository revision:	1.13	/projects/Eros/CVSEros/CodeCxx/Images/rzimage.h,v
+   OK                   1.13
 -----------> rzvect.h
    Repository revision:	1.6	/projects/Eros/CVSEros/CodeCxx/Images/rzvect.h,v
+   OK                   1.6
+
+
Index: trunk/SophyaLib/NTools/histos.cc
===================================================================
--- trunk/SophyaLib/NTools/histos.cc	(revision 475)
+++ trunk/SophyaLib/NTools/histos.cc	(revision 490)
@@ -1,4 +1,4 @@
 //
-// $Id: histos.cc,v 1.3 1999-05-19 15:57:59 ansari Exp $
+// $Id: histos.cc,v 1.4 1999-10-21 15:25:45 ansari Exp $
 //
 
@@ -1737,40 +1737,5 @@
 ///////////////////////////////////////////////////////////
 
-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)
+void ObjFileIO<Histo>::ReadSelf(PInPersist& is)
 {
 char strg[256];
@@ -1813,5 +1778,5 @@
 }
 
-void FIO_Histo::WriteSelf(POutPersist& os) const
+void ObjFileIO<Histo>::WriteSelf(POutPersist& os) const
 {
 if (dobj == NULL)   return;
@@ -1856,2 +1821,10 @@
 return;
 }
+
+#ifdef __CXX_PRAGMA_TEMPLATES__
+#pragma define_template ObjFileIO<Histo>
+#endif
+
+#if defined(ANSI_TEMPLATES) || defined(GNU_TEMPLATES)
+template class ObjFileIO<Histo>;
+#endif
Index: trunk/SophyaLib/NTools/histos.h
===================================================================
--- trunk/SophyaLib/NTools/histos.h	(revision 475)
+++ trunk/SophyaLib/NTools/histos.h	(revision 490)
@@ -1,5 +1,5 @@
 // This may look like C code, but it is really -*- C++ -*-
 //
-// $Id: histos.h,v 1.2 1999-05-19 15:58:00 ansari Exp $
+// $Id: histos.h,v 1.3 1999-10-21 15:25:47 ansari Exp $
 //
 
@@ -7,4 +7,6 @@
 #define HISTOS_SEEN
 
+#include "objfio.h"
+#include <iostream.h>
 #include <stdio.h>
 #include "peida.h"
@@ -18,5 +20,5 @@
 
 class Histo : public AnyDataObj {
-  friend class FIO_Histo;
+  friend class ObjFileIO<Histo>;
 public:
 
@@ -156,21 +158,13 @@
 };
 
-/////////////////////////////////////////////////////////////////////////
+
+inline POutPersist& operator << (POutPersist& os, Histo & obj)
+{ ObjFileIO<Histo> fio(&obj);  fio.Write(os);  return(os); }
+inline PInPersist& operator >> (PInPersist& is, Histo & obj)
+{ ObjFileIO<Histo> fio(&obj);  fio.Read(is);  return(is); }
+
 // Classe pour la gestion de persistance
-class FIO_Histo : public  PPersist  {
-public:
-  FIO_Histo();
-  FIO_Histo(string const & filename); 
-  FIO_Histo(const Histo & obj);
-  FIO_Histo(Histo * obj);
-  virtual ~FIO_Histo();
-  virtual AnyDataObj* DataObj();
-  inline operator Histo() { return(*dobj); }
-protected :
-  virtual void ReadSelf(PInPersist&);           
-  virtual void WriteSelf(POutPersist&) const;  
-  Histo * dobj;
-  bool ownobj;
-};
+// ObjFileIO<Histo>
+
 
 } // Fin du namespace
Index: trunk/SophyaLib/NTools/histos2.cc
===================================================================
--- trunk/SophyaLib/NTools/histos2.cc	(revision 475)
+++ trunk/SophyaLib/NTools/histos2.cc	(revision 490)
@@ -45,5 +45,5 @@
       , hprojx(NULL), hprojy(NULL)
 {
-DBASSERT(nxBin>0 && nyBin>0 && xMin<xMax && yMin<yMax);
+ASSERT(nxBin>0 && nyBin>0 && xMin<xMax && yMin<yMax);
 for(int i=0;i<3;i++) for(int j=0;j<3;j++) over[i][j]=0.;
 Zero();
@@ -663,8 +663,7 @@
 int i,j;
 v.Realloc(nx,ny);
-if(!err2) for(i=0;i<nx;i++)
-            for(j=0;j<ny;j++) { v(i,j) = 0.; return;}
-for(i=0;i<nx;i++)
-  for(j=0;j<ny;j++) v(i,j) = Error2(i,j);
+if(!err2)
+  {for(i=0;i<nx;i++) for(j=0;j<ny;j++) v(i,j) = 0.; return;}
+for(i=0;i<nx;i++) for(j=0;j<ny;j++) v(i,j) = Error2(i,j);
 return;
 }
@@ -678,8 +677,7 @@
 int i,j;
 v.Realloc(nx,ny);
-if(!err2) for(i=0;i<nx;i++)
-            for(j=0;j<ny;j++) { v(i,j) = 0.; return;}
-for(i=0;i<nx;i++)
-  for(j=0;j<ny;j++) v(i,j) = Error(i,j);
+if(!err2)
+  {for(i=0;i<nx;i++) for(j=0;j<ny;j++) v(i,j) = 0.; return;}
+for(i=0;i<nx;i++) for(j=0;j<ny;j++) v(i,j) = Error(i,j);
 return;
 }
@@ -1786,40 +1784,6 @@
 ///////////////////////////////////////////////////////////
 
-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)
+
+void  ObjFileIO<Histo2D>::ReadSelf(PInPersist& is)
 {
 char strg[256];
@@ -1879,5 +1843,5 @@
   is.GetLine(strg, 255);
   dobj->SetProjX();
-  FIO_Histo fio_h(dobj->hprojx);
+  ObjFileIO<Histo> fio_h(dobj->hprojx);
   fio_h.Read(is);
 }
@@ -1885,5 +1849,5 @@
   is.GetLine(strg, 255);
   dobj->SetProjY();
-  FIO_Histo fio_h(dobj->hprojy);
+  ObjFileIO<Histo> fio_h(dobj->hprojy);
   fio_h.Read(is);
 }
@@ -1893,14 +1857,14 @@
   is.GetLine(strg, 255);
   dobj->SetSliX(nslix);
-  DBASSERT (nslix==dobj->NSliX());
+  ASSERT (nslix==dobj->NSliX());
   for(int j=0;j<dobj->NSliX();j++)
-    {FIO_Histo fio_h(dobj->HSliX(j)); fio_h.Read(is);}
+    {ObjFileIO<Histo> fio_h(dobj->HSliX(j)); fio_h.Read(is);}
 }
 if(nsliy>0) {
   is.GetLine(strg, 255);
   dobj->SetSliY(nsliy);
-  DBASSERT (nsliy==dobj->NSliY());
+  ASSERT (nsliy==dobj->NSliY());
   for(int j=0;j<dobj->NSliY();j++)
-    {FIO_Histo fio_h(dobj->HSliY(j)); fio_h.Read(is);}
+    {ObjFileIO<Histo> fio_h(dobj->HSliY(j)); fio_h.Read(is);}
 }
 
@@ -1912,7 +1876,7 @@
     dobj->SetBandX(min,max);
   }}
-  DBASSERT (nbanx==dobj->NBandX());
+  ASSERT (nbanx==dobj->NBandX());
   {for(int j=0; j<dobj->NBandX(); j++) {
-    FIO_Histo fio_h(dobj->HBandX(j));
+    ObjFileIO<Histo> fio_h(dobj->HBandX(j));
     fio_h.Read(is);
   }}
@@ -1924,7 +1888,7 @@
     dobj->SetBandY(min,max);
   }}
-  DBASSERT (nbany==dobj->NBandY());
+  ASSERT (nbany==dobj->NBandY());
   {for(int j=0; j<dobj->NBandY(); j++) {
-    FIO_Histo fio_h(dobj->HBandY(j));
+    ObjFileIO<Histo> fio_h(dobj->HBandY(j));
     fio_h.Read(is);
   }}
@@ -1934,5 +1898,5 @@
 }
 
-void FIO_Histo2D::WriteSelf(POutPersist& os) const
+void ObjFileIO<Histo2D>::WriteSelf(POutPersist& os) const
 {
 if (dobj == NULL)   return;
@@ -2010,10 +1974,10 @@
   sprintf(strg,"Histo2D: Projection X");
   os.PutLine(strg);
-  FIO_Histo fio_h(dobj->hprojx); fio_h.Write(os);
+  ObjFileIO<Histo> fio_h(dobj->hprojx); fio_h.Write(os);
 }
 if(projy) {
   sprintf(strg,"Histo2D: Projection Y");
   os.PutLine(strg);
-  FIO_Histo fio_h(dobj->hprojy); fio_h.Write(os);
+  ObjFileIO<Histo> fio_h(dobj->hprojy); fio_h.Write(os);
 }
 
@@ -2024,5 +1988,5 @@
   for(int j=0;j<nslix;j++) {
     Histo* h = dobj->HSliX(j);
-    FIO_Histo fio_h(h); fio_h.Write(os);
+    ObjFileIO<Histo> fio_h(h); fio_h.Write(os);
   }
 }
@@ -2032,5 +1996,5 @@
   for(int j=0;j<nsliy;j++) {
     Histo* h = dobj->HSliY(j);
-    FIO_Histo fio_h(h); fio_h.Write(os);
+    ObjFileIO<Histo> fio_h(h); fio_h.Write(os);
   }
 }
@@ -2047,5 +2011,5 @@
   for(it = dobj->lbandx.begin(); it != dobj->lbandx.end(); it++) {
     Histo* h = (*it).H;
-    FIO_Histo fio_h(h); fio_h.Write(os);
+    ObjFileIO<Histo> fio_h(h); fio_h.Write(os);
   }
 }
@@ -2060,5 +2024,5 @@
   for(it = dobj->lbandy.begin(); it != dobj->lbandy.end(); it++) {
     Histo* h = (*it).H;
-    FIO_Histo fio_h(h); fio_h.Write(os);
+    ObjFileIO<Histo> fio_h(h); fio_h.Write(os);
   }
 }
@@ -2066,2 +2030,11 @@
 return;
 }
+
+
+#ifdef __CXX_PRAGMA_TEMPLATES__
+#pragma define_template ObjFileIO<Histo2D>
+#endif
+
+#if defined(ANSI_TEMPLATES) || defined(GNU_TEMPLATES)
+template class ObjFileIO<Histo2D>;
+#endif
Index: trunk/SophyaLib/NTools/histos2.h
===================================================================
--- trunk/SophyaLib/NTools/histos2.h	(revision 475)
+++ trunk/SophyaLib/NTools/histos2.h	(revision 490)
@@ -23,5 +23,5 @@
 
 class Histo2D : public AnyDataObj {
-  friend class FIO_Histo2D;
+  friend class ObjFileIO<Histo2D>;
 public:
 
@@ -216,19 +216,12 @@
 /////////////////////////////////////////////////////////////////////////
 // Classe pour la gestion de persistance
-class FIO_Histo2D : public  PPersist  {
-public:
-  FIO_Histo2D();
-  FIO_Histo2D(string const & filename); 
-  FIO_Histo2D(const Histo2D & obj);
-  FIO_Histo2D(Histo2D * obj);
-  virtual ~FIO_Histo2D();
-  virtual AnyDataObj* DataObj();
-  inline operator Histo2D() { return(*dobj); }
-protected :
-  virtual void ReadSelf(PInPersist&);           
-  virtual void WriteSelf(POutPersist&) const;  
-  Histo2D * dobj;
-  bool ownobj;
-};
+
+inline POutPersist& operator << (POutPersist& os, Histo2D & obj)
+{ ObjFileIO<Histo2D> fio(&obj);  fio.Write(os);  return(os); }
+inline PInPersist& operator >> (PInPersist& is, Histo2D & obj)
+{ ObjFileIO<Histo2D> fio(&obj);  fio.Read(is);  return(is); }
+
+// Classe pour la gestion de persistance
+// ObjFileIO<Histo2D>
 
 } // Fin du namespace
Index: trunk/SophyaLib/NTools/imageop.cc
===================================================================
--- trunk/SophyaLib/NTools/imageop.cc	(revision 475)
+++ trunk/SophyaLib/NTools/imageop.cc	(revision 490)
@@ -528,4 +528,34 @@
 
 }
+
+/* Nouvelle-Fonction */
+//++
+ImageR4* NoiseFiltImage(ImageR4& img, ImageR4& filtre, DynCCD& dynccd)
+//	Calcule une image de bruit, a partir de "img" et de "dynccd"
+//	prenant en compte le filtre de convolution "filtre".
+//	L'image de bruit renvoyee contient les correlations de bruit entre
+//	pixels, du au filtrage (convolution) de l'image "img" par le 
+//	filtre "filtre".
+//--
+{
+  ImageR4* ImgBrt = NoiseImage(&img,&dynccd);
+
+  int i,j;  
+  for (i=0; i<ImgBrt->XSize(); i++)
+    for (j=0; j<ImgBrt->YSize(); j++)  (*ImgBrt)(i,j) =(*ImgBrt)(i,j) *(*ImgBrt)(i,j);
+
+  ImageR4 Filter2(filtre.XSize(), filtre.YSize()) ;
+  for (i=0; i<filtre.XSize(); i++)
+    for (j=0; j<filtre.YSize(); j++) (Filter2)(i,j) = filtre(i,j) * filtre(i,j);  
+ 
+  ImageR4* out2;
+  out2 = new ImageR4(ImgBrt->XSize(), ImgBrt->YSize());
+  FilterImage(ImgBrt, out2, &Filter2);   
+  for (i=0; i<out2->XSize(); i++)
+    for (j=0; j<out2->YSize(); j++)  (*out2)(i,j) =sqrt((*out2)(i,j));
+  delete ImgBrt;
+  return(out2);
+}
+
 
 //////////////////////////////////////////////////////////////////////////////
Index: trunk/SophyaLib/NTools/imageop.h
===================================================================
--- trunk/SophyaLib/NTools/imageop.h	(revision 475)
+++ trunk/SophyaLib/NTools/imageop.h	(revision 490)
@@ -13,4 +13,5 @@
 #include "cimage.h"
 #include "cspline.h"
+#include "dynccd.h"
 
 template <class T>
@@ -49,4 +50,7 @@
 Image<T> * FilterImage(Image<T> const * pim, Image<T> * pom, ImageR4 *matx);
 
+// Calcul une image de bruit prenant en compte le filtre de convolution
+ImageR4* NoiseFiltImage(ImageR4& img, ImageR4& filtre, DynCCD& dynccd);
+
 ///////////////////////////////////////////////////////////////////
 //// Filtre statistique d'images
Index: trunk/SophyaLib/NTools/integ.h
===================================================================
--- trunk/SophyaLib/NTools/integ.h	(revision 475)
+++ trunk/SophyaLib/NTools/integ.h	(revision 490)
@@ -3,5 +3,5 @@
 // integ.h
 //
-// $Id: integ.h,v 1.3 1999-05-19 15:58:01 ansari Exp $
+// $Id: integ.h,v 1.4 1999-10-21 15:25:49 ansari Exp $
 //
 
@@ -12,7 +12,4 @@
 #include "pexceptions.h"
 #include <set>
-#if defined(__KCC__)
-#include <set.h>
-#endif
 
 namespace PlanckDPC {class GeneralFunction;}
Index: trunk/SophyaLib/NTools/matrix.cc
===================================================================
--- trunk/SophyaLib/NTools/matrix.cc	(revision 475)
+++ trunk/SophyaLib/NTools/matrix.cc	(revision 490)
@@ -1,3 +1,3 @@
-// $Id: matrix.cc,v 1.4 1999-05-19 15:58:02 ansari Exp $
+// $Id: matrix.cc,v 1.5 1999-10-21 15:25:49 ansari Exp $
 
 #include "machdefs.h"
@@ -240,5 +240,5 @@
 //--
 {
-  DBASSERT( b != 0. );
+  ASSERT( b != 0. );
   double* p    = data;
   double* pEnd = data + ndata;
@@ -572,5 +572,5 @@
 void Matrix::WriteSelf(POutPersist& s) const
 {
-  DBASSERT(ndata == nr*nc);
+  ASSERT(ndata == nr*nc);
   s << nr << nc;
   s.PutR8s(data, ndata);
@@ -582,5 +582,5 @@
   s >> r >> c;
   Realloc(r,c);
-  DBASSERT(ndata == nr*nc);
+  ASSERT(ndata == nr*nc);
   s.GetR8s(data, ndata);
 }
Index: trunk/SophyaLib/NTools/ntupintf.cc
===================================================================
--- trunk/SophyaLib/NTools/ntupintf.cc	(revision 490)
+++ trunk/SophyaLib/NTools/ntupintf.cc	(revision 490)
@@ -0,0 +1,150 @@
+
+#include "ntupintf.h"
+#include <stdlib.h>
+#include <stdio.h>
+
+//++
+// Class	NTupleInterface
+// Lib	Outils++ 
+// include	ntupintf.h
+//
+//	Interface permettant de construire des vues NTuples (tableau lignes-colonnes) 
+//	pour differents objets. Toutes les methodes ont une implementation par defaut. 
+//--
+
+//++
+// NTupleInterface()
+//	Constructeur.
+// virtual ~NTupleInterface()
+//	Destructeur
+// uint_4  NbLines() const 
+//	Nombre de lignes du tableau
+// uint_4  NbColumns() const 
+//	Nombre de colonnes du tableau
+// r_8 *  GetLineD(int n) const
+//	Renvoie un tableau avec le contenu de la ligne "n"
+// r_8	GetCell(int n, int k) const
+//	Renvoie le contenu de la cellule correspondant a la ligne "n"
+//	et colonne "k"
+// r_8  GetCell(int n, string const & nom) const
+//	Renvoie le contenu de la cellule correspondant a la ligne "n"
+//	pour la colonne identifiee par "nom"
+// string  GetCelltoString(int n, int k) const
+//	Renvoie le contenu de la cellule correspondant a la ligne "n"
+//	et colonne "k", sous forme de chaine de caracteres.
+// string  GetCell(int n, string const & nom) const
+//	Renvoie le contenu de la cellule correspondant a la ligne "n"
+//	pour la colonne identifiee par "nom", sous forme de chaine de caracteres.
+// void GetMinMax(int k, double& min, double& max)  const
+//	Renvoie la valeur mini et maxi de la colonne numero "k"
+// void	GetMinMax(string const & nom, double& min, double& max)
+//	Renvoie la valeur mini et maxi de la colonne identifiee par "nom"
+// int  ColumnIndex(string const & nom)  const
+//	Renvoie le numero de colonne identifiee par "nom". Renvoie -1 (negatif)
+//	si colonne "nom" n'existe pas.
+// string ColumnName(int k) const
+//	Renvoie le nom de la colonne numero "k"
+// string VarList_C(const char* nomx=NULL) const
+//	Renvoie une chaine avec les declarations "C" pour les
+//	variables avec les noms de colonnes
+// string  LineHeaderToString()
+//	Renvoie une chaine avec les noms de colonnes, utilisables pour l'impression
+// string  LineToString(int n)
+//	Renvoie une chaine avec le contenu de la ligne "n", utilisable pour l'impression
+//--
+
+/* --Methode-- */
+NTupleInterface::NTupleInterface()
+{
+}
+/* --Methode-- */
+NTupleInterface::~NTupleInterface()
+{
+}
+
+/* --Methode-- */
+uint_4 NTupleInterface::NbLines() const
+{
+return(0);
+}
+/* --Methode-- */
+uint_4 NTupleInterface::NbColumns() const
+{
+return(0);
+}
+
+/* --Methode-- */
+r_8 * NTupleInterface::GetLineD(int ) const
+{
+return(NULL);
+}
+
+/* --Methode-- */
+r_8 NTupleInterface::GetCell(int , int ) const
+{
+return(0.);
+}
+
+/* --Methode-- */
+r_8 NTupleInterface::GetCell(int n, string const & nom) const
+{
+return(GetCell(n, ColumnIndex(nom)));
+}
+
+string NTupleInterface::GetCelltoString(int n, int k) const
+{
+char strg[64];
+//sprintf(strg,"C%d= %g\n", k, GetCell(n, k));
+sprintf(strg,"%g\n", GetCell(n, k));
+return(strg);
+}
+
+string NTupleInterface::GetCelltoString(int n, string const & nom) const
+{
+return(GetCelltoString(n, ColumnIndex(nom)));
+}
+
+/* --Methode-- */
+void NTupleInterface::GetMinMax(int , double& min, double& max)   const
+{
+min = max = 0.;
+}
+
+/* --Methode-- */
+void NTupleInterface::GetMinMax(string const & , double& min, double& max)   const
+{
+min = max = 0.;
+}
+
+/* --Methode-- */
+int NTupleInterface::ColumnIndex(string const & nom)  const
+{
+return(-1);
+}
+
+/* --Methode-- */
+string NTupleInterface::ColumnName(int k) const
+{
+return("");
+}
+
+/* --Methode-- */
+string NTupleInterface::VarList_C(const char*) const
+{
+return("");
+}
+
+/* --Methode-- */
+string NTupleInterface::LineHeaderToString() const
+{
+return("");
+}
+
+/* --Methode-- */
+string NTupleInterface::LineToString(int ) const
+{
+return("");
+}
+
+
+
Index: trunk/SophyaLib/NTools/ntupintf.h
===================================================================
--- trunk/SophyaLib/NTools/ntupintf.h	(revision 490)
+++ trunk/SophyaLib/NTools/ntupintf.h	(revision 490)
@@ -0,0 +1,48 @@
+// This may look like C code, but it is really -*- C++ -*-
+// Interface de type NTuple           Reza 05/99
+// LAL-IN2P3/CNRS               CEA-DAPNIA      
+
+#ifndef NTUPLEINTERFACE_H_SEEN
+#define NTUPLEINTERFACE_H_SEEN
+
+#include "machdefs.h"
+#include <string>
+
+class NTupleInterface {
+public:
+  			NTupleInterface(); 
+  virtual		~NTupleInterface();
+// Nombre de lignes du NTuple  (Nb d'entrees)  
+  virtual uint_4        NbLines() const ;
+// Nombre de colonnes (nb de variables)
+  virtual uint_4        NbColumns() const ;
+// La ligne numero n, sous forme d'un tableau de double
+  virtual r_8 *         GetLineD(int n) const ;
+// Cellule de la ligne n, colonne k
+  virtual r_8		GetCell(int n, int k) const ;
+// Cellule de la ligne n, colonne nom
+  virtual r_8		GetCell(int n, string const & nom) const ;
+// Cellule de la ligne n, colonne k, converti en chaine de caracteres
+  virtual string	GetCelltoString(int n, int k) const ;
+// Cellule de la ligne n, colonne nom, converti en chaine de caracteres
+  virtual string	GetCelltoString(int n, string const & nom) const ;
+// Min et Max pour la colonne k
+  virtual void		GetMinMax(int k, double& min, double& max)   const ; 
+// Min et Max pour la colonne nom
+  virtual void		GetMinMax(string const & nom, double& min, double& max)   const ;
+// Numero de colonne pour nom 
+  virtual int           ColumnIndex(string const & nom)  const ;
+// Nom de colonne numero k
+  virtual string        ColumnName(int k) const;
+// Declaration des variables style C
+  virtual string	VarList_C(const char* nomx=NULL) const ;
+// Entete et liste de variable, pouvant servir a l'impression
+  virtual string        LineHeaderToString() const;
+// Contenu de la ligne n, pouvant servir a l'impression
+  virtual string        LineToString(int n) const;  
+};
+
+
+#endif   /*  NTUPLEINTERFACE_H_SEEN  */
+
+
Index: trunk/SophyaLib/NTools/ntuple.cc
===================================================================
--- trunk/SophyaLib/NTools/ntuple.cc	(revision 475)
+++ trunk/SophyaLib/NTools/ntuple.cc	(revision 490)
@@ -2,4 +2,5 @@
 #include <string.h>
 
+#include "strutil.h"
 #include "perrors.h"
 #include "ntuple.h"
@@ -16,4 +17,9 @@
 //
 //	Classe de ntuples
+//--
+//++
+// Links        Parents
+// PPersist
+// NTupleInterface
 //--
 
@@ -35,33 +41,61 @@
 //++
 NTuple::NTuple(int nvar, char** noms, int blk)
-  //
-  //	Createur d'un ntuple de `nvar' variables dont les
-  //	noms sont dans le tableau de cahines de caracteres `noms'
-  //	avec `blk' d'evenements par blocks.
-//--
-{
-  mNVar = mNEnt = mBlk = mNBlk = 0;
-  mVar = NULL;
-  mVarD = NULL;
-  mNames = NULL;
-  mInfo = NULL;
-  if (nvar <= 0)  THROW(sizeMismatchErr); 
-  mNVar = nvar;
-  mVar = new r_4[nvar];
-  mVarD = new r_8[nvar];
-  if (blk < 10) blk = 10;
-  mBlk = blk;
-  // On prend des noms de LENNAME char pour le moment
-  mNames = new char[nvar*LENNAME1];
-  r_4* pt = new r_4[nvar*blk];
-  mNBlk = 1;
-  mPtr.push_back(pt);
-  int i;
-  for(i=0; i<nvar; i++)
-    { 
-      strncpy(mNames+i*LENNAME1, noms[i], LENNAME);  
-      mNames[i*LENNAME1+LENNAME] = '\0'; 
-    }
-  return;
+//
+//	Createur d'un ntuple de `nvar' variables dont les
+//	noms sont dans le tableau de cahines de caracteres `noms'
+//	avec `blk' d'evenements par blocks.
+//--
+{
+mNVar = mNEnt = mBlk = mNBlk = 0;
+mVar = NULL;
+mVarD = NULL;
+mNames = NULL;
+mInfo = NULL;
+if (nvar <= 0)  THROW(sizeMismatchErr); 
+mNVar = nvar;
+mVar = new r_4[nvar];
+mVarD = new r_8[nvar];
+if (blk < 10) blk = 10;
+mBlk = blk;
+// On prend des noms de LENNAME char pour le moment
+mNames = new char[nvar*LENNAME1];
+r_4* pt = new r_4[nvar*blk];
+mNBlk = 1;
+mPtr.push_back(pt);
+int i;
+for(i=0; i<nvar; i++)
+  { strncpy(mNames+i*LENNAME1, noms[i], LENNAME);  
+  mNames[i*LENNAME1+LENNAME] = '\0'; }
+return;
+}
+
+//                                       cmv 8/10/99
+//++
+NTuple::NTuple(const NTuple& NT)
+//
+//	Createur par copie (clone).
+//--
+: mNVar(0), mNEnt(0), mBlk(0), mNBlk(0)
+, mVar(NULL), mVarD(NULL), mNames(NULL), mInfo(NULL)
+{
+if(NT.mNVar<=0) return; // cas ou NT est cree par defaut
+mNVar = NT.mNVar;
+mBlk = NT.mBlk;
+mVar = new r_4[NT.mNVar];
+mVarD = new r_8[NT.mNVar];
+mNames = new char[NT.mNVar*LENNAME1];
+
+int i;
+r_4* pt = new r_4[mNVar*mBlk];
+mNBlk = 1; mPtr.push_back(pt);
+
+for(i=0;i<mNVar;i++) strcpy(mNames+i*LENNAME1,NT.NomIndex(i)); 
+
+if(NT.mInfo!=NULL) {mInfo = new DVList; *mInfo = *(NT.mInfo);}
+
+if(NT.mNEnt<=0) return;
+for(i=0;i<NT.mNEnt;i++) {r_4* x=NT.GetVec(i,NULL); Fill(x);}
+
+return;
 }
 
@@ -79,5 +113,6 @@
 mInfo = NULL;
 PInPersist s(flnm);
-Read(s);
+ObjFileIO<NTuple> fiont(this);
+fiont.Read(s);
 }
 
@@ -96,5 +131,5 @@
 if (mInfo) delete mInfo;
 int i;
-for(i=0; i<mNBlk; i++)  delete[] mPtr[i];
+if(mNBlk>0) for(i=0; i<mNBlk; i++)  delete[] mPtr[i];
 mPtr.erase(mPtr.begin(), mPtr.end());
 mNVar = mNEnt = mBlk = mNBlk = 0;
@@ -102,5 +137,38 @@
 mVarD = NULL;
 mNames = NULL;
+mInfo = NULL;
 return;
+}
+
+/* --Methode--        cmv 08/10/99 */
+//++
+NTuple& NTuple::operator = (const NTuple& NT)
+//
+//	Operateur egal (clone).
+//--
+{
+if(this == &NT) return *this;
+Clean();
+if(NT.mNVar<=0) return *this; // cas ou NT est cree par defaut
+mNVar = NT.mNVar;
+mBlk = NT.mBlk;
+mVar = new r_4[NT.mNVar];
+mVarD = new r_8[NT.mNVar];
+mNames = new char[NT.mNVar*LENNAME1];
+
+int i;
+r_4* pt = new r_4[mNVar*mBlk];
+mNBlk = 1; mPtr.push_back(pt);
+
+for(i=0;i<mNVar;i++) strcpy(mNames+i*LENNAME1,NT.NomIndex(i)); 
+
+if(NT.mInfo!=NULL) {mInfo = new DVList; *mInfo = *(NT.mInfo);}
+
+if(NT.mNEnt<=0) return *this;
+for(i=0;i<NT.mNEnt;i++) {r_4* x=NT.GetVec(i,NULL); Fill(x);}
+
+// En fait il faudrait un createur par copie qui partage les donnees
+// quand l'objet est temporaire... trop complique A FAIRE !  cmv.
+return *this;
 }
 
@@ -167,33 +235,4 @@
 }
 
-/* --Methode-- */
-//++
-string NTuple::VarList_C(const char* nomx)  const
-//
-//	Retourne une chaine de caracteres avec la declaration des noms de 
-//	variables. si "nomx!=NULL" , des instructions d'affectation
-//	a partir d'un tableau "nomx[i]" sont ajoutees. 
-//--
-{
-string rets;
-int i;
-for(i=0; i<mNVar; i++) {
-  if ( (i%5 == 0) && (i > 0) )  rets += ";";  
-  if (i%5 == 0)   rets += "\ndouble "; 
-  else rets += ",";
-  rets += mNames+i*LENNAME1;
-  }
-rets += "; \n";
-if (nomx) { 
-  char buff[256];
-  for(i=0; i<mNVar; i++) {
-    sprintf(buff,"%s=%s[%d]; ",  mNames+i*LENNAME1, nomx, i);
-    rets += buff;
-    if ( (i%3 == 0) && (i > 0) )  rets += "\n"; 
-    }
-  }
-
-return(rets);
-}
   
 /* --Methode-- */
@@ -231,7 +270,164 @@
 }
 
-/* --Methode-- */
-//++
-void  NTuple::GetMinMax(int k, float& min, float& max)  const
+
+
+/* --Methode-- */
+//++
+DVList&  NTuple::Info()
+//
+//	Renvoie une référence sur l'objet DVList Associé
+//--
+{
+if (mInfo == NULL)  mInfo = new DVList;
+return(*mInfo);
+}
+
+/* --Methode-- */
+//++
+void  NTuple::Print(int num, int nmax)  const
+//
+//	Imprime `nmax' evenements a partir du numero `num'.
+//--
+{
+int i,j;
+
+printf("Num     ");
+for(i=0; i<mNVar; i++)  printf("%8s ", mNames+i*LENNAME1);
+putchar('\n');
+
+if (nmax <= 0)  nmax = 1;
+if (num < 0)  num = 0;
+nmax += num;
+if (nmax > mNEnt) nmax = mNEnt;
+for(i=num; i<nmax; i++) {
+  GetVec(i, NULL); 
+  printf("%6d  ", i);  
+  for(j=0; j<mNVar; j++)  printf("%8g ", (float)mVar[j]);
+  putchar('\n');
+}
+return;
+}
+
+/* --Methode-- */
+//++
+void  NTuple::Show(ostream& os)  const
+//
+//	Imprime l'information generale sur le ntuple.
+//--
+{
+os << "NTuple: NVar= " << mNVar << " NEnt=" << mNEnt  
+   << " (Blk Sz,Nb= " << mBlk << " ," << mNBlk << ")\n";
+os << "            Variables       Min      Max       \n";
+int i;
+double min, max;
+char buff[128];
+for(i=0; i<mNVar; i++) {
+  GetMinMax(i, min, max);
+  sprintf(buff, "%3d  %16s  %10lg  %10lg \n", i, mNames+i*LENNAME1, min, max);
+  os << (string)buff ;
+  }
+os << endl;
+}
+
+
+/* --Methode-- */
+//++
+int  NTuple::FillFromASCIIFile(string const& fn, float defval)
+//
+//	Remplit le ntuple a partir d'un fichier ASCII.
+//	Renvoie le nombre de lignes ajoutees.
+//--
+{
+if (NbColumns() < 1)  { 
+  cout << "NTuple::FillFromASCIIFile() Ntuple has " << NbColumns() << " columns" << endl;
+  return(-1);
+  }
+FILE * fip = fopen(fn.c_str(), "r");
+if (fip == NULL) {
+  cout << "NTuple::FillFromASCIIFile() Error opening file " << fn << endl;
+  return(-2);
+  }
+
+char lineb[4096];
+char *line;
+char buff[64];
+char* ccp;
+int i,j,l,kk;
+int postab, posb;
+float* xv = new float[NbColumns()];
+
+int nlread = 0;
+int nvar = NbColumns();
+// On boucle sur toutes les lignes
+while (fgets(lineb,4096,fip) != NULL) {
+  lineb[4095] = '\0';
+  j = 0; line = lineb;
+//  On enleve les espaces et tab de debut 
+  while ( (line[j] != '\0') && ((line[j] == ' ') || (line[j] == '\t')) )  j++;
+  line = lineb+j; 
+// Il faut que le premier caractere non-espace soit un digit, ou + ou - ou .
+  if (!( isdigit(line[0]) || (line[0] == '+') || (line[0] == '-') || (line[0] == '.') ))  continue;
+  ccp = line;
+  for(kk=0; kk<nvar; kk++)  xv[kk] = defval;
+  for(kk=0; kk<nvar; kk++) {
+// Les mots sont separes par des espaces ou des tab
+    postab = posc(ccp, '\t' );
+    posb = posc(ccp, ' ' );
+    if (postab >= 0) { 
+       if (posb < 0) posb = postab;
+       else if (postab < posb)  posb = postab; 
+       } 
+    if (posb >= 0)  ccp[posb] = '\0';
+    if ( isdigit(line[0]) || (line[0] == '+') || (line[0] == '-') || (line[0] == '.') ) 
+      xv[kk] = atof(ccp);
+    if (posb < 0)  break;
+    ccp += posb+1;   j = 0;
+    while ( (ccp[j] != '\0') && ((ccp[j] == ' ') || (ccp[j] == '\t')) )  j++;
+    ccp += j;
+    }
+  Fill(xv);
+  nlread++;
+  }
+
+delete[] xv;
+cout << "NTuple::FillFromASCIIFile( " << fn << ") " << nlread << " fill from file " << endl;
+return(nlread);
+}
+
+
+// ------- Implementation de  l interface NTuple  ---------
+
+/* --Methode-- */
+uint_4 NTuple::NbLines() const
+{
+return(NEntry());
+}
+/* --Methode-- */
+uint_4 NTuple::NbColumns() const
+{
+return(NVar());
+}
+
+/* --Methode-- */
+r_8 * NTuple::GetLineD(int n) const
+{
+return(GetVecD(n));
+}
+
+/* --Methode-- */
+r_8 NTuple::GetCell(int n, int k) const
+{
+return(GetVal(n, k));
+}
+
+/* --Methode-- */
+r_8 NTuple::GetCell(int n, string const & nom) const
+{
+return(GetVal(n, nom.c_str()));
+}
+
+/* --Methode-- */
+//++
+void  NTuple::GetMinMax(int k, double& min, double& max)  const
 //
 //	Retourne le minimum et le maximum de la variable `k'.
@@ -241,5 +437,5 @@
 if ( (k < 0) || (k >= mNVar) )    return;
 int jb,ib,i;
-float x;
+double x;
 i=0;
 for(jb=0; jb< mNBlk; jb++)
@@ -256,37 +452,113 @@
 
 /* --Methode-- */
-//++
-DVList&  NTuple::Info()
-//
-//	Renvoie une référence sur l'objet DVList Associé
-//--
-{
-if (mInfo == NULL)  mInfo = new DVList;
-return(*mInfo);
-}
-
-/* --Methode-- */
-//++
-void  NTuple::Print(int num, int nmax)  const
-//
-//	Imprime `nmax' evenements a partir du numero `num'.
-//--
-{
-int i,j;
-
-printf("Num     ");
-for(i=0; i<mNVar; i++)  printf("%8s ", mNames+i*LENNAME1);
-putchar('\n');
-
-if (nmax <= 0)  nmax = 1;
-if (num < 0)  num = 0;
-nmax += num;
-if (nmax > mNEnt) nmax = mNEnt;
-for(i=num; i<nmax; i++) {
-  GetVec(i, NULL); 
-  printf("%6d  ", i);  
-  for(j=0; j<mNVar; j++)  printf("%8g ", (float)mVar[j]);
-  putchar('\n');
-}
+void NTuple::GetMinMax(string const & nom, double& min, double& max)   const
+{
+GetMinMax(IndexNom(nom.c_str()), min, max);
+}
+
+/* --Methode-- */
+int NTuple::ColumnIndex(string const & nom)  const
+{
+return(IndexNom(nom.c_str()));
+}
+
+/* --Methode-- */
+string NTuple::ColumnName(int k) const
+{
+return(NomIndex(k));
+}
+
+/* --Methode-- */
+//++
+string NTuple::VarList_C(const char* nomx)  const
+//
+//	Retourne une chaine de caracteres avec la declaration des noms de 
+//	variables. si "nomx!=NULL" , des instructions d'affectation
+//	a partir d'un tableau "nomx[i]" sont ajoutees. 
+//--
+{
+string rets="";
+int i;
+for(i=0; i<mNVar; i++) {
+  if ( (i%5 == 0) && (i > 0) )  rets += ";";  
+  if (i%5 == 0)   rets += "\ndouble "; 
+  else rets += ",";
+  rets += mNames+i*LENNAME1;
+  }
+rets += "; \n";
+if (nomx) { 
+  char buff[256];
+  for(i=0; i<mNVar; i++) {
+    sprintf(buff,"%s=%s[%d]; ",  mNames+i*LENNAME1, nomx, i);
+    rets += buff;
+    if ( (i%3 == 0) && (i > 0) )  rets += "\n"; 
+    }
+  }
+
+return(rets);
+}
+
+
+/* --Methode-- */
+//++
+string NTuple::LineHeaderToString() const 
+//	Retourne une chaine de caracteres avec la liste des noms de  
+//	variables, utilisables pour une impression
+//--
+{
+char buff[32];
+string rets=" Num    ";
+for(int i=0; i<mNVar; i++) {
+  sprintf(buff, "%8s ", mNames+i*LENNAME1);
+  rets += buff;
+  }
+rets += '\n';
+return(rets);
+}
+
+/* --Methode-- */
+//++
+string NTuple::LineToString(int n) const
+//	Retourne une chaine de caracteres avec le contenu de la ligne "n"
+//	utilisable pour une impression
+//--
+{
+char buff[32];
+double* val;
+val = GetLineD(n);
+sprintf(buff,"%6d: ",n);  
+string rets=buff;
+int i;
+for(i=0; i<mNVar; i++) {
+  sprintf(buff, "%8.3g ", val[i]);
+  rets += buff;
+  }
+rets += '\n';
+return(rets);
+}
+
+
+/* --Methode-- */
+//++
+void   ObjFileIO<NTuple>::WriteSelf(POutPersist& s)  const
+//
+//	Ecriture ppersist du ntuple.
+//--
+{
+char strg[256];
+if (dobj->mInfo)  sprintf(strg, "NVar=%6d  NEnt=%9d  BlkSz=%6d NBlk=%6d  HasInfo", 
+                          (int)dobj->mNVar, (int)dobj->mNEnt, (int)dobj->mBlk, (int)dobj->mNBlk);
+else sprintf(strg, "NVar=%6d  NEnt=%9d  BlkSz=%6d NBlk=%6d ", 
+                   (int)dobj->mNVar, (int)dobj->mNEnt, (int)dobj->mBlk, (int)dobj->mNBlk);
+s.PutLine(strg);
+s.PutI4(dobj->mNVar);
+s.PutBytes(dobj->mNames, dobj->mNVar*LENNAME1);
+s.PutI4(dobj->mNEnt);
+s.PutI4(dobj->mBlk);
+s.PutI4(dobj->mNBlk);
+if (dobj->mInfo)  s << (*(dobj->mInfo));
+int jb;
+for(jb=0; jb<dobj->mNBlk; jb++)
+  s.PutR4s(dobj->mPtr[jb], dobj->mNVar*dobj->mBlk); 
 return;
 }
@@ -294,129 +566,46 @@
 /* --Methode-- */
 //++
-void  NTuple::Show(ostream& os)  const
-//
-//	Imprime l'information generale sur le ntuple.
-//--
-{
-os << "NTuple: NVar= " << mNVar << " NEnt=" << mNEnt  
-   << " (Blk Sz,Nb= " << mBlk << " ," << mNBlk << ")\n";
-os << "            Variables       Min      Max       \n";
-int i;
-float min, max;
-char buff[128];
-for(i=0; i<mNVar; i++) {
-  GetMinMax(i, min, max);
-  sprintf(buff, "%3d  %16s  %10g  %10g \n", i, mNames+i*LENNAME1, min, max);
-  os << (string)buff ;
-  }
-os << endl;
-}
-
-
-/* --Methode-- */
-//++
-void  NTuple::WriteSelf(POutPersist& s)  const
-//
-//	Ecriture ppersist du ntuple.
-//--
-{
+void  ObjFileIO<NTuple>::ReadSelf(PInPersist& s)
+//
+//	Lecture ppersist du ntuple.
+//--
+{
+
+dobj->Clean();
+
 char strg[256];
-if (mInfo)  sprintf(strg, "NVar=%6d  NEnt=%9d  BlkSz=%6d NBlk=%6d  HasInfo", 
-                          (int)mNVar, (int)mNEnt, (int)mBlk, (int)mNBlk);
-else sprintf(strg, "NVar=%6d  NEnt=%9d  BlkSz=%6d NBlk=%6d ", 
-                   (int)mNVar, (int)mNEnt, (int)mBlk, (int)mNBlk);
-s.PutLine(strg);
-s.PutI4(mNVar);
-s.PutBytes(mNames, mNVar*LENNAME1);
-s.PutI4(mNEnt);
-s.PutI4(mBlk);
-s.PutI4(mNBlk);
-if (mInfo)  s << (*mInfo);
-int jb;
-for(jb=0; jb<mNBlk; jb++)
-  s.PutR4s(mPtr[jb], mNVar*mBlk); 
-return;
-}
-
-/* --Methode-- */
-//++
-void  NTuple::ReadSelf(PInPersist& s)
-//
-//	Lecture ppersist du ntuple.
-//--
-{
-
-  Clean();
-  
-  char strg[256];
-  s.GetLine(strg, 255);
-  // Pour savoir s'il y avait un DVList Info associe
-  bool hadinfo = false;
-  if (strncmp(strg+strlen(strg)-7, "HasInfo", 7) == 0)  hadinfo = true;
-
-  s.GetI4(mNVar);
-  mNames = new char[mNVar*LENNAME1];
-  mVar = new r_4[mNVar];
-  mVarD = new r_8[mNVar];
-  s.GetBytes(mNames, mNVar*LENNAME1);
-  s.GetI4(mNEnt);
-  s.GetI4(mBlk);
-  s.GetI4(mNBlk);
-
-  if (hadinfo) {    // Lecture eventuelle du DVList Info
-    if (mInfo == NULL)  mInfo = new DVList;
-    s >> (*mInfo);
-  }
-
-  int jb; 
-  for(jb=0; jb<mNBlk; jb++) {
-    r_4* pt = new r_4[mNVar*mBlk];
-    mPtr.push_back(pt);
-    s.GetR4s(mPtr[jb], mNVar*mBlk); 
-  }
-}
-
-NTuple& NTuple::operator=(const NTuple &ntpl)
-{
-  mNVar= ntpl.mNVar;
-  mNEnt= ntpl.mNEnt;
-  mBlk = ntpl.mBlk;
-  mNBlk= ntpl.mNBlk;
-  
-  mVar= new r_4[mNVar];
-  for(int k = 0; k < mNVar; k++)
-    mVar[k]= ntpl.mVar[k];
-  
-  mVarD= new r_8[mNVar];
-  for(int k = 0; k < mNVar; k++)
-    mVarD[k]= ntpl.mVarD[k];
-  
-  mNames = new char[mNVar*LENNAME1];
-  for(int i = 0; i < mNVar; i++)
-    {
-      strncpy(mNames+i*LENNAME1,(ntpl.mNames)+i*LENNAME1, LENNAME);  
-      mNames[i*LENNAME1+LENNAME] = '\0'; 
-    }
-
-  for(int k = 0; k < mNBlk; k++)
-    {
-      r_4 *ptr= new r_4[mNVar*mBlk];
-      for(int i = 0; i < mNVar*mBlk; i++)
-	{
-	  *(ptr+i)= *(ntpl.mPtr[k]+i);
-	}
-      mPtr.push_back(ptr);
-    }
-
-  mInfo = new DVList;
-  if(ntpl.mInfo)  
-    {
-      *mInfo= *(ntpl.mInfo);
-    }
-  else
-    {
-      mInfo = NULL;
-    }
-
-  return *this;
-}
+s.GetLine(strg, 255);
+// Pour savoir s'il y avait un DVList Info associe
+bool hadinfo = false;
+if (strncmp(strg+strlen(strg)-7, "HasInfo", 7) == 0)  hadinfo = true;
+
+s.GetI4(dobj->mNVar);
+dobj->mNames = new char[dobj->mNVar*LENNAME1];
+dobj->mVar = new r_4[dobj->mNVar];
+dobj->mVarD = new r_8[dobj->mNVar];
+s.GetBytes(dobj->mNames, dobj->mNVar*LENNAME1);
+s.GetI4(dobj->mNEnt);
+s.GetI4(dobj->mBlk);
+s.GetI4(dobj->mNBlk);
+
+if (hadinfo) {    // Lecture eventuelle du DVList Info
+  if (dobj->mInfo == NULL)  dobj->mInfo = new DVList;
+  s >> (*(dobj->mInfo));
+  }
+
+int jb; 
+for(jb=0; jb<dobj->mNBlk; jb++) {
+  r_4* pt = new r_4[dobj->mNVar*dobj->mBlk];
+  dobj->mPtr.push_back(pt);
+  s.GetR4s(dobj->mPtr[jb], dobj->mNVar*dobj->mBlk); 
+}
+
+}
+
+#ifdef __CXX_PRAGMA_TEMPLATES__
+#pragma define_template ObjFileIO<NTuple>
+#endif
+
+#if defined(ANSI_TEMPLATES) || defined(GNU_TEMPLATES)
+template class ObjFileIO<NTuple>;
+#endif
Index: trunk/SophyaLib/NTools/ntuple.h
===================================================================
--- trunk/SophyaLib/NTools/ntuple.h	(revision 475)
+++ trunk/SophyaLib/NTools/ntuple.h	(revision 490)
@@ -1,9 +1,11 @@
+// This may look like C code, but it is really -*- C++ -*-
 // Class NTuple
 //  CMV+Reza     Juillet 97
 //  CEA-DAPNIA      LAL-IN2P3/CNRS
-//  added overloading of operator =      F. Touze, Guy Le Meur 19-OCT-99 
 
 #ifndef NTUPLE_H_SEEN
 #define NTUPLE_H_SEEN
+
+#include "objfio.h"
 
 #include <iostream.h>
@@ -11,44 +13,39 @@
 #include <vector>
 
-#if defined(__KCC__)
-using std::string ;
-#include <vector.h>
-#endif
-
+#include "ntupintf.h"
 #include "ppersist.h"
 #include "dvlist.h"
 
+namespace PlanckDPC {
 
-class NTuple : public PPersist {
+class NTuple : public AnyDataObj , public NTupleInterface {
 public:
-  enum {classId = ClassId_NTuple };
+//  enum {classId = ClassId_NTuple };
 
   		    NTuple(int nvar, char** noms, int blk=512);
 		    NTuple();
+                    NTuple(const NTuple& NT);
 		    NTuple(char* flnm);
   virtual           ~NTuple();
 
-  NTuple &operator=(const NTuple &ntpl);
-
+  NTuple&           operator = (const NTuple& NT);
+ 
   void              Fill(r_4* x);
 
-  inline int_4      NEntry() { return(mNEnt); }
-  inline int_4      NVar() { return(mNVar); }
-  inline int_4      BLock() { return(mBlk); }
+  inline int_4      NEntry() const  { return(mNEnt); }  
+  inline int_4      NVar() const { return(mNVar); }  
+  inline int_4      BLock() const { return(mBlk); }  
+// $CHECK$ Reza 21/10/99 Pourquoi faire BLock() ?
 
   float             GetVal(int n, int k)   const;
-  inline float	    GetVal(int n, char* nom) const 
-                         { return(GetVal(n, IndexNom(nom)) ); }
+  inline float	    GetVal(int n, const char* nom) const 
+                            { return(GetVal(n, IndexNom(nom)) ); }
   int               IndexNom(const char* nom)  const ;
   char*             NomIndex(int k) const;
-  string            VarList_C(const char* nomx=NULL)  const;
 
   r_4*	            GetVec(int n, r_4* ret=NULL)  const ;
   r_8*	            GetVecD(int n, r_8* ret=NULL)  const ;
 
-  void              GetMinMax(int k, float& min, float& max)   const ; 
-  inline void       GetMinMax(const char* nom, float& min, float& max)  const 
-                         { GetMinMax(IndexNom(nom), min, max); }
-
+// Impression, I/O
   void              Print(int num, int nmax=1)  const ;
   void              Show(ostream& os) const;
@@ -57,10 +54,24 @@
   DVList&           Info();
 
-  int_4             ClassId() const        { return classId; }
-  static PPersist*  Create()               { return new NTuple;}
+// Remplissage depuis fichier ASCII 
+  int		    FillFromASCIIFile(string const& fn, float defval=0.);
 
-  virtual void      WriteSelf(POutPersist&) const;
-  virtual void      ReadSelf(PInPersist&);
 
+// Declaration de l interface NTuple
+  virtual uint_4        NbLines() const ;
+  virtual uint_4        NbColumns() const ;
+  virtual r_8 *         GetLineD(int n) const ;
+  virtual r_8		GetCell(int n, int k) const ;
+  virtual r_8		GetCell(int n, string const & nom) const ;
+  virtual void		GetMinMax(int k, double& min, double& max)   const ; 
+  virtual void		GetMinMax(string const & nom, double& min, double& max)   const ; 
+  virtual int           ColumnIndex(string const & nom)  const ;
+  virtual string        ColumnName(int k) const;
+  virtual string	VarList_C(const char* nomx=NULL) const ;
+  virtual string        LineHeaderToString() const;
+  virtual string        LineToString(int n) const;  
+
+//  Pour la gestion de persistance
+  friend class ObjFileIO<NTuple> ;
 
 private:
@@ -81,8 +92,18 @@
   {  nt.Show(s);  return(s);  }
 
+inline POutPersist& operator << (POutPersist& os, NTuple & obj)
+{ ObjFileIO<NTuple> fio(&obj);  fio.Write(os);  return(os); }
+inline PInPersist& operator >> (PInPersist& is, NTuple & obj)
+{ ObjFileIO<NTuple> fio(&obj);  fio.Read(is);  return(is); }
+
+// Classe pour la gestion de persistance
+// ObjFileIO<NTuple>
+
 #ifdef __MWERKS__
 __MSL_FIX_ITERATORS__(r_4*);
 #endif
 
+} // namespace PlanckDPC
+
 #endif
   
Index: trunk/SophyaLib/NTools/outilsinit.cc
===================================================================
--- trunk/SophyaLib/NTools/outilsinit.cc	(revision 475)
+++ trunk/SophyaLib/NTools/outilsinit.cc	(revision 490)
@@ -13,4 +13,6 @@
 #include "ntuple.h"
 #include "generaldata.h"
+#include "tmatrix.h"
+#include "tvector.h"
 
 #include "cimage.h"
@@ -35,9 +37,33 @@
   PPRegister(Poly2);
   PPRegister(ObjFileIO<DVList>);
-  //PPRegister(Histo);
-  //PPRegister(Histo2D);
-  //PPRegister(HProf);
-  PPRegister(NTuple);
-  //PPRegister(GeneralFitData);
+  PPRegister(ObjFileIO<Histo>);
+  PPRegister(ObjFileIO<Histo2D>);
+  PPRegister(ObjFileIO<HProf>);
+
+  PPRegister(ObjFileIO<NTuple>);
+  PPRegister(ObjFileIO<GeneralFitData>);
+
+  PPRegister(FIO_TMatrix<uint_1>);
+  PPRegister(FIO_TMatrix<uint_2>);
+  PPRegister(FIO_TMatrix<int_2>);
+  PPRegister(FIO_TMatrix<int_4>);
+  PPRegister(FIO_TMatrix<int_8>);
+  PPRegister(FIO_TMatrix<uint_8>);
+  PPRegister(FIO_TMatrix<r_4>);
+  PPRegister(FIO_TMatrix<r_8>);
+  PPRegister(FIO_TMatrix< complex<float> >);
+  PPRegister(FIO_TMatrix< complex<double> >);
+
+  PPRegister(FIO_TVector<uint_1>);
+  PPRegister(FIO_TVector<uint_2>);
+  PPRegister(FIO_TVector<int_2>);
+  PPRegister(FIO_TVector<int_4>);
+  PPRegister(FIO_TVector<int_8>);
+  PPRegister(FIO_TVector<uint_8>);
+  PPRegister(FIO_TVector<r_4>);
+  PPRegister(FIO_TVector<r_8>);
+  PPRegister(FIO_TVector< complex<float> >);
+  PPRegister(FIO_TVector< complex<double> >);
+
 
   PPRegister(RzImage);
Index: trunk/SophyaLib/NTools/pclassids.h
===================================================================
--- trunk/SophyaLib/NTools/pclassids.h	(revision 475)
+++ trunk/SophyaLib/NTools/pclassids.h	(revision 490)
@@ -29,5 +29,6 @@
    ClassId_HProf    = 0x0203,
    ClassId_NTuple   = 0x0210,
- 
+   ClassId_XNTuple  = 0x0211,
+
    ClassId_GeneralFitData  = 0x0290,
 
Index: trunk/SophyaLib/NTools/poly.cc
===================================================================
--- trunk/SophyaLib/NTools/poly.cc	(revision 475)
+++ trunk/SophyaLib/NTools/poly.cc	(revision 490)
@@ -566,6 +566,10 @@
   maxDegY = degreY;
 
-  for (int i=0; i<= tmp.degX; i++)
-    for (int j=0; j<= tmp.degY; j++)
+// Attention - Reza 30/09/99
+// il faut prendre le min en degre du polynome de depart et le nouveau
+  int cdegx = (tmp.degX < degreX) ? tmp.degX : degreX;
+  int cdegy = (tmp.degY < degreY) ? tmp.degY : degreY;
+  for (int i=0; i<= cdegx; i++)
+    for (int j=0; j<= cdegy; j++)
       Coef(i,j) = tmp.Coef(i,j);
 }
Index: trunk/SophyaLib/NTools/pversion.h
===================================================================
--- trunk/SophyaLib/NTools/pversion.h	(revision 475)
+++ trunk/SophyaLib/NTools/pversion.h	(revision 490)
@@ -2,7 +2,7 @@
 #define PVERSION_H
 
-#define PEIDA_VERSION   4.0
-#define PEIDA_REVISION  1
-#define PEIDA_TAG       "V_Avr99"
+#define PEIDA_VERSION   1.0
+#define PEIDA_REVISION  6
+#define PEIDA_TAG       "V_Nov99"
 
 #endif
Index: trunk/SophyaLib/NTools/simplesort.h
===================================================================
--- trunk/SophyaLib/NTools/simplesort.h	(revision 475)
+++ trunk/SophyaLib/NTools/simplesort.h	(revision 490)
@@ -1,5 +1,5 @@
 // This may look like C code, but it is really -*- C++ -*-
 //
-// $Id: simplesort.h,v 1.1.1.1 1999-04-09 17:57:58 ansari Exp $
+// $Id: simplesort.h,v 1.2 1999-10-21 15:25:52 ansari Exp $
 //
 
@@ -61,8 +61,4 @@
 #include <functional>
 #include <algorithm>
-#if defined(__KCC__)
-#include <functional.h>
-#include <algorithm.h>
-#endif
 
 
Index: trunk/SophyaLib/NTools/tmatrix.h
===================================================================
--- trunk/SophyaLib/NTools/tmatrix.h	(revision 475)
+++ trunk/SophyaLib/NTools/tmatrix.h	(revision 490)
@@ -194,4 +194,11 @@
   bool ownobj;
 };
+
+template <class T>
+inline POutPersist& operator << (POutPersist& os, TMatrix<T> & obj)
+{ FIO_TMatrix<T> fio(&obj);  fio.Write(os);  return(os); }
+template <class T>
+inline PInPersist& operator >> (PInPersist& is, TMatrix<T> & obj)
+{ FIO_TMatrix<T> fio(&obj);  fio.Read(is);  return(is); }
 
 /////////////////////////////////////////////////////////////////////////
Index: trunk/SophyaLib/NTools/tvector.h
===================================================================
--- trunk/SophyaLib/NTools/tvector.h	(revision 475)
+++ trunk/SophyaLib/NTools/tvector.h	(revision 490)
@@ -92,4 +92,11 @@
 };
 
+template <class T>
+inline POutPersist& operator << (POutPersist& os, TVector<T> & obj)
+{ FIO_TVector<T> fio(&obj);  fio.Write(os);  return(os); }
+template <class T>
+inline PInPersist& operator >> (PInPersist& is, TVector<T> & obj)
+{ FIO_TVector<T> fio(&obj);  fio.Read(is);  return(is); }
+
 } // Fin du namespace
 
Index: trunk/SophyaLib/NTools/utils.h
===================================================================
--- trunk/SophyaLib/NTools/utils.h	(revision 475)
+++ trunk/SophyaLib/NTools/utils.h	(revision 490)
@@ -1,5 +1,5 @@
 // This may look like C code, but it is really -*- C++ -*-
 //
-// $Id: utils.h,v 1.2 1999-04-22 16:18:52 ansari Exp $
+// $Id: utils.h,v 1.3 1999-10-21 15:25:53 ansari Exp $
 //
 
@@ -13,7 +13,4 @@
 #include <stdio.h>
 
-#if defined(__KCC__)
-using std::string ;
-#endif
 
 // MemCpy marche meme en cas de recouvrement.
