Index: /trunk/SophyaPI/PIext/Makefile
===================================================================
--- /trunk/SophyaPI/PIext/Makefile	(revision 3144)
+++ /trunk/SophyaPI/PIext/Makefile	(revision 3145)
@@ -597,5 +597,6 @@
   $(SOPHYAINCP)pisurfdr.h pipodrw.h \
   $(SOPHYAINCP)histos2.h $(SOPHYAINCP)histos.h \
-  pintuple.h pintup3d.h pigfd1.h pigfd2.h
+  $(SOPHYAINCP)hist2err.h pintuple.h pintup3d.h pigfd1.h \
+  pigfd2.h
 	$(CXXCOMPILE) $(CXXTEMPFLG) -o $@  nobjmgr.cc
  
@@ -691,4 +692,5 @@
   $(SOPHYAINCP)generalfunc.h pipodrw.h \
   $(SOPHYAINCP)histos2.h $(SOPHYAINCP)histos.h \
+  $(SOPHYAINCP)hist2err.h \
   $(SOPHYAINCP)objfitter.h \
   $(SOPHYAINCP)cimage.h $(SOPHYAINCP)fioarr.h \
@@ -741,11 +743,27 @@
   $(SOPHYAINCP)generalfunc.h \
   $(SOPHYAINCP)histerr.h \
-  $(SOPHYAINCP)hist2err.h servnobjm.h nobjmgr.h dlftypes.h \
-  $(SOPHYAINCP)pdlmgr.h $(SOPHYAINCP)zthread.h \
-  pihisto.h phistwrapper.h sohiswrap.h $(SOPHYAINCP)histos.h \
-  $(SOPHYAINCP)hisprof.h \
+  $(SOPHYAINCP)hist2err.h pihisto.h phistwrapper.h \
+  pihisto2d.h $(SOPHYAINCP)pimenux.h \
+  $(SOPHYAINCP)pimenugen.h \
+  $(SOPHYAINCP)pimenubarx.h \
+  $(SOPHYAINCP)pimenubargen.h \
+  $(SOPHYAINCP)pioptmenux.h \
+  $(SOPHYAINCP)pioptmenugen.h \
+  $(SOPHYAINCP)pistdwdgx.h \
+  $(SOPHYAINCP)pistdwdggen.h \
+  $(SOPHYAINCP)piscdrawwdg.h \
+  $(SOPHYAINCP)pibwdgx.h \
+  $(SOPHYAINCP)pigraphps.h \
+  $(SOPHYAINCP)piwindowx.h \
+  $(SOPHYAINCP)piwindowgen.h \
+  $(SOPHYAINCP)picontainerx.h \
+  $(SOPHYAINCP)picontainergen.h \
+  $(SOPHYAINCP)pieldrw.h sohiswrap.h \
+  $(SOPHYAINCP)histos.h $(SOPHYAINCP)hisprof.h \
+  $(SOPHYAINCP)histos2.h pipodrw.h servnobjm.h nobjmgr.h \
+  dlftypes.h $(SOPHYAINCP)pdlmgr.h \
+  $(SOPHYAINCP)zthread.h \
   $(SOPHYAINCP)objfitter.h \
-  $(SOPHYAINCP)cimage.h $(SOPHYAINCP)fioarr.h \
-  $(SOPHYAINCP)histos2.h
+  $(SOPHYAINCP)cimage.h $(SOPHYAINCP)fioarr.h
 	$(CXXCOMPILE) $(CXXTEMPFLG) -o $@  nomherradapter.cc
  
@@ -795,9 +813,11 @@
   $(SOPHYAINCP)generalfunc.h \
   $(SOPHYAINCP)histos.h $(SOPHYAINCP)histos2.h \
-  $(SOPHYAINCP)hisprof.h $(SOPHYAINCP)histerr.h \
-  $(SOPHYAINCP)ntuple.h $(SOPHYAINCP)xntuple.h \
+  $(SOPHYAINCP)hisprof.h $(SOPHYAINCP)ntuple.h \
+  $(SOPHYAINCP)xntuple.h \
   $(SOPHYAINCP)basedtable.h \
   $(SOPHYAINCP)segdatablock.h pihisto.h phistwrapper.h \
-  sohiswrap.h pihisto2d.h $(SOPHYAINCP)pimenux.h \
+  sohiswrap.h $(SOPHYAINCP)histerr.h \
+  $(SOPHYAINCP)hist2err.h pihisto2d.h \
+  $(SOPHYAINCP)pimenux.h \
   $(SOPHYAINCP)pimenugen.h \
   $(SOPHYAINCP)pimenubarx.h \
@@ -1436,5 +1456,5 @@
   $(SOPHYAINCP)pitherm.h \
   $(SOPHYAINCP)resusage.h nomhistadapter.h \
-  $(SOPHYAINCP)histerr.h $(SOPHYAINCP)xntuple.h \
+  $(SOPHYAINCP)xntuple.h \
   $(SOPHYAINCP)basedtable.h \
   $(SOPHYAINCP)segdatablock.h nomgfdadapter.h \
@@ -1547,5 +1567,6 @@
   $(SOPHYAINCP)pievthandler.h \
   $(SOPHYAINCP)psfile.h $(SOPHYAINCP)pigratt.h \
-  $(SOPHYAINCP)piaxes.h phistwrapper.h
+  $(SOPHYAINCP)piaxes.h phistwrapper.h \
+  $(SOPHYAINCP)parradapter.h $(SOPHYAINCP)lut.h
 	$(CXXCOMPILE) $(CXXTEMPFLG) -o $@  pihisto.cc
  
@@ -1584,22 +1605,4 @@
   $(SOPHYAINCP)pioptmenux.h \
   $(SOPHYAINCP)pioptmenugen.h \
-  $(SOPHYAINCP)histos2.h $(SOPHYAINCP)peida.h \
-  $(SOPHYAINCP)utils.h $(SOPHYAINCP)perrors.h \
-  $(SOPHYAINCP)pexceptions.h \
-  $(SOPHYAINCP)fmath.h $(SOPHYAINCP)histos.h \
-  $(SOPHYAINCP)objfio.h \
-  $(SOPHYAINCP)anydataobj.h \
-  $(SOPHYAINCP)ppersist.h $(SOPHYAINCP)gnumd5.h \
-  $(SOPHYAINCP)ppfbinstream.h \
-  $(SOPHYAINCP)rawstream.h \
-  $(SOPHYAINCP)ppfnametag.h \
-  $(SOPHYAINCP)tvector.h $(SOPHYAINCP)tmatrix.h \
-  $(SOPHYAINCP)tarray.h $(SOPHYAINCP)basarr.h \
-  $(SOPHYAINCP)mutyv.h $(SOPHYAINCP)timestamp.h \
-  $(SOPHYAINCP)dvlist.h \
-  $(SOPHYAINCP)ndatablock.h \
-  $(SOPHYAINCP)utilarr.h \
-  $(SOPHYAINCP)tmatrix_tsnl.h \
-  $(SOPHYAINCP)tvector_tsnl.h \
   $(SOPHYAINCP)pidrawer.h \
   $(SOPHYAINCP)pigratt.h $(SOPHYAINCP)piaxes.h \
@@ -1607,5 +1610,6 @@
   $(SOPHYAINCP)piwindowx.h \
   $(SOPHYAINCP)piwindowgen.h \
-  $(SOPHYAINCP)pieldrw.h \
+  $(SOPHYAINCP)pieldrw.h phistwrapper.h \
+  $(SOPHYAINCP)parradapter.h $(SOPHYAINCP)lut.h \
   $(SOPHYAINCP)srandgen.h
 	$(CXXCOMPILE) $(CXXTEMPFLG) -o $@  pihisto2d.cc
@@ -1697,10 +1701,12 @@
   $(SOPHYAINCP)generalfunc.h \
   $(SOPHYAINCP)histos.h $(SOPHYAINCP)histos2.h \
-  $(SOPHYAINCP)hisprof.h $(SOPHYAINCP)histerr.h \
-  $(SOPHYAINCP)ntuple.h $(SOPHYAINCP)xntuple.h \
+  $(SOPHYAINCP)hisprof.h $(SOPHYAINCP)ntuple.h \
+  $(SOPHYAINCP)xntuple.h \
   $(SOPHYAINCP)basedtable.h \
-  $(SOPHYAINCP)segdatablock.h nomgfdadapter.h \
-  nomimagadapter.h $(SOPHYAINCP)cimage.h \
-  $(SOPHYAINCP)fioarr.h nomtmatvecadapter.h nomtarradapter.h \
+  $(SOPHYAINCP)segdatablock.h nomherradapter.h \
+  $(SOPHYAINCP)histerr.h \
+  $(SOPHYAINCP)hist2err.h nomgfdadapter.h nomimagadapter.h \
+  $(SOPHYAINCP)cimage.h $(SOPHYAINCP)fioarr.h \
+  nomtmatvecadapter.h nomtarradapter.h \
   $(SOPHYAINCP)datatable.h \
   $(SOPHYAINCP)swppfdtable.h \
@@ -1817,4 +1823,5 @@
   $(SOPHYAINCP)tmatrix_tsnl.h \
   $(SOPHYAINCP)tvector_tsnl.h \
+  $(SOPHYAINCP)hist2err.h \
   $(SOPHYAINCP)generalfit.h \
   $(SOPHYAINCP)generaldata.h \
@@ -2094,5 +2101,6 @@
   $(SOPHYAINCP)segdatablock.h \
   $(SOPHYAINCP)piyfxdrw.h \
-  $(SOPHYAINCP)pisurfdr.h pintuple.h pintup3d.h pipodrw.h
+  $(SOPHYAINCP)pisurfdr.h pintuple.h pintup3d.h pipodrw.h \
+  $(SOPHYAINCP)hist2err.h
 	$(CXXCOMPILE) $(CXXTEMPFLG) -o $@  servnobjm.cc
  
Index: /trunk/SophyaPI/PIext/nomherradapter.cc
===================================================================
--- /trunk/SophyaPI/PIext/nomherradapter.cc	(revision 3144)
+++ /trunk/SophyaPI/PIext/nomherradapter.cc	(revision 3145)
@@ -7,6 +7,7 @@
 
 #include "nomherradapter.h"
-#include "pihisto.h"   /* Wrapper pour HistoErr */
-#include "sohiswrap.h"   /* Wrapper pour HistoErr */
+#include "pihisto.h"   /* Traceur pour Histo1D */
+#include "pihisto2d.h"   /* Traceur pour Histo2D */
+#include "sohiswrap.h"   /* Wrapper pour histos (HistoErr Histo2DErr ...) */
 
 #include "pipodrw.h"
@@ -242,9 +243,6 @@
 PIDrawer* NOMAdapter_Histo2DErr::GetDrawer(string & dopt)
 {
-  /* A_FAIRE_REZA    -> + des options pour choisir val / err2 / nb
-dopt = "thinline " + dopt;
-return( new PIHisto2DErr(mHerr, false) );
-  */
-  return NULL;
+dopt = "thinline " + dopt; // $CHECK$ CMV : faut-il ajouter thinline 
+return( new PIHisto2D(new Histo2DErrWrapper(mHerr, false), true) );
 }
 
@@ -252,5 +250,9 @@
 P2DArrayAdapter* NOMAdapter_Histo2DErr::Get2DArray(string & dopt)
 {
-return ( new POHe2DAdapter(mHerr, false) );
+// DEL return ( new POHe2DAdapter(mHerr, false) );  -- A SUPPRIMER 
+Histo2DErrWrapper* hwp = new Histo2DErrWrapper(mHerr, false);
+// $CHECK$ CMV  : pour les options hbincont hbinerr ...
+// voir NOMAdapter_Histo2D::Get2DArray(string & dopt) ds nomhistadapter.cc
+ return hwp;
 }
 
Index: /trunk/SophyaPI/PIext/nomhistadapter.cc
===================================================================
--- /trunk/SophyaPI/PIext/nomhistadapter.cc	(revision 3144)
+++ /trunk/SophyaPI/PIext/nomhistadapter.cc	(revision 3145)
@@ -331,6 +331,6 @@
 PIDrawer* NOMAdapter_Histo2D::GetDrawer(string & dopt)
 {
-dopt = "thinline " + dopt;
-return( new PIHisto2D(mHis, false) );
+dopt = "thinline " + dopt;  // $CHECK$ CMV : faut-il ajouter thinline 
+return( new PIHisto2D(new Histo2DWrapper(mHis, false), true) );
 }
 
@@ -338,5 +338,12 @@
 P2DArrayAdapter* NOMAdapter_Histo2D::Get2DArray(string & dopt)
 {
-return (new POH2DAdapter(mHis, false) );
+// DEL return (new POH2DAdapter(mHis, false) ); -- A SUPPRIMER 
+Histo2DWrapper* hwp = new Histo2DWrapper(mHis, false);
+// $CHECK$ CMV  : pour les options hbincont hbinerr ...
+// On peut decoder les options si on veut, par exemple avec :
+// vector<string> vopts; 
+// FillVStringFrString(string const & dopt, vector<string>& vopts,char sep = ' ')
+// hwp->DecodeOptionString(vopts, false);
+return hwp;
 }
 
Index: /trunk/SophyaPI/PIext/phistwrapper.h
===================================================================
--- /trunk/SophyaPI/PIext/phistwrapper.h	(revision 3144)
+++ /trunk/SophyaPI/PIext/phistwrapper.h	(revision 3145)
@@ -9,12 +9,13 @@
 #include <string> 
 #include <vector> 
+#include "parradapter.h"
 
 
 //! Wrapper class interface for 1d-histogram like objects , used by PIHisto
 // methodes par defaut dans pihisto.cc
-class P1DHistoWrapper 
+class P1DHistoWrapper : public P1DArrayAdapter
 {
 public:
-  P1DHistoWrapper();
+  P1DHistoWrapper(int asz);  // asz: taille du tableau pour P1DArrayAdapter
   virtual ~P1DHistoWrapper(); 
 
@@ -29,9 +30,18 @@
 
   // Renvoie contenu du bin i
-  virtual r_8 Value(int_4 i) = 0;
+  virtual r_8 Content(int_4 i) = 0;
   virtual r_8 Error(int_4 i) = 0;
   virtual r_8 NbEntries(int_4 i) = 0;
 
-  inline  r_8 operator()(int_4 i) { return ( Value(i)*mScale+mOff ); }
+  inline  r_8 operator()(int_4 i) 
+  { 
+    r_8 rv = (mRetFg == 2) ? NbEntries(i) : ( (mRetFg == 1) ? Error(i) : Content(i) ) ;
+    return ( rv*mScale+mOff ); 
+  }
+
+  // Implementation de la methode P1DArrayAdapter::Value(int i) 
+  // Identique a l'operateur ()(i)
+  virtual double Value(int i) { return (*this)(i); }
+
   // Methode de mise a jour du contenu 
   // avec implementation par defaut - ne faisant rien 
@@ -45,10 +55,70 @@
 //   l'implementation par defaut ds le fichier pihisto.cc 
   virtual int DecodeOptionString(vector<string> & opt, bool rmdecopt=true);
+//   liste des options sous forme text (ds pihisto.cc )
+  virtual int OptionToString(vector<string> & opt) const;
 
 protected:
-  r_8 mScale, mOff;   // scaling coefficient, offset coefficient
+  r_8 mScale, mOff;   // scaling coefficient, offset coefficient used in operator ()
+  short mRetFg;       // operator() : 0 -> bin content , 1 -> bin error , 2 -> bin nentries
+};
 
+//-----------------------------------------------------------------------------
+
+//! Wrapper class interface for 2d-histogram like objects , used by PIHisto2D
+// methodes par defaut dans pihisto2d.cc
+class P2DHistoWrapper : public P2DArrayAdapter
+{
+public:
+  P2DHistoWrapper(int_4 asx, int_4 asy); // asx,asy: tailles du tableau pour P2DArrayAdapter
+  virtual ~P2DHistoWrapper(); 
+
+  virtual int_4 NBinX() = 0; 
+  virtual int_4 NBinY() = 0; 
+  virtual r_8 XMin() = 0; 
+  virtual r_8 XMax() = 0;
+  virtual r_8 YMin() = 0; 
+  virtual r_8 YMax() = 0;
+  virtual r_8 WBinX() = 0; 
+  virtual r_8 WBinY() = 0; 
+
+  virtual void BinLowEdge(int_4 i, int_4 j, r_8& xr, r_8& yr) = 0;
+  virtual void BinCenter(int_4 i, int_4 j, r_8& xr, r_8& yr) = 0;
+  virtual void BinHighEdge(int_4 i, int_4 j, r_8& xr, r_8& yr) = 0;
+
+  // Renvoie contenu du bin i
+  virtual r_8 Content(int_4 i, int_4 j) = 0;
+  virtual r_8 Error(int_4 i, int_4 j) = 0;
+  virtual r_8 NbEntries(int_4 i, int_4 j) = 0;
+
+  inline  r_8 operator()(int_4 i, int_4 j) 
+  { 
+    r_8 rv = (mRetFg == 2) ? NbEntries(i,j) : ( (mRetFg == 1) ? Error(i,j) : Content(i,j) ) ;
+    return ( rv*mScale+mOff ); 
+  }
+  // Implementation de la methode P2DArrayAdapter::Value(int i, j) 
+  // Identique a l'operateur ()(i)
+  virtual double Value(int i, int j) { return (*this)(i, j); }
+
+  // Methode de mise a jour du contenu 
+  // avec implementation par defaut - ne faisant rien 
+  virtual void Update() { return; }
+
+  // ajoute des lignes de texte avec les infos statistiques (dans text)
+  // renvoie le nombre de lignes ajoutees - avec implementation par defaut
+  virtual int GetStatInfoAsText(vector<string> &  text );
+
+//   Methode de decodage des options - avec implementation par defaut 
+//   l'implementation par defaut ds le fichier pihisto.cc 
+  virtual int DecodeOptionString(vector<string> & opt, bool rmdecopt=true);
+//   liste des options sous forme text (ds pihisto.cc )
+  virtual int OptionToString(vector<string> & opt) const;
+
+protected:
+  r_8 mScale, mOff;   // scaling coefficient, offset coefficient used in operator ()
+  short mRetFg;       // operator() : 0 -> bin content , 1 -> bin error , 2 -> bin nentries
 };
 
 
+
+
 #endif
Index: /trunk/SophyaPI/PIext/pihisto.cc
===================================================================
--- /trunk/SophyaPI/PIext/pihisto.cc	(revision 3144)
+++ /trunk/SophyaPI/PIext/pihisto.cc	(revision 3145)
@@ -12,6 +12,7 @@
 
 //------ Implementation classe P1DHistoWrapper
-P1DHistoWrapper::P1DHistoWrapper() 
-: mScale(1.) , mOff(0.) 
+P1DHistoWrapper::P1DHistoWrapper(int_4 asx)
+  :  P1DArrayAdapter(asx) , 
+     mScale(1.) , mOff(0.) , mRetFg(0)
 {
 }
@@ -44,4 +45,13 @@
       mOff = atof(opts.substr(8).c_str());
     }
+    else if(opts.substr(0,8) == "hbincont") {
+      mRetFg = 0;
+    }    
+    else if(opts.substr(0,8) == "hbinerr") {
+      mRetFg = 1;
+    }    
+    else if(opts.substr(0,8) == "hbinent") {
+      mRetFg = 2;
+    }    
     else {
       ndec--;
@@ -54,4 +64,17 @@
   if (rmdecopt)  opt = udopt;
   return(ndec);
+}
+
+int
+P1DHistoWrapper::OptionToString(vector<string> & opt) const
+{
+  char buff[64];
+  sprintf(buff, "hscale=%g", mScale);  opt.push_back(buff);
+  sprintf(buff, "hoffset=%g", mOff);  opt.push_back(buff);
+  if (mRetFg == 2) opt.push_back("hbinent");
+  else if (mRetFg == 1) opt.push_back("hbinerr");
+  else opt.push_back("hbincont");
+
+  return 1;
 }
 
@@ -75,5 +98,5 @@
 //	Constructeur. Si "ad == true", l'objet "histowp" est détruit par 
 //	le destructeur de l'objet "PIHisto"
-//	Note : "histowp" doit être créé par new
+//	Note : "histowp" doit être créé par new si ad==true
 //
 //--
@@ -85,13 +108,6 @@
   mAdDO = ad;     // Flag pour suppression automatique de mHistoWp
   stats=true;
-  // todraw = 0 draw scaled and offset value (default)
-  //        = 1 draw bin content
-  //        = 2 draw bin error (if exist)
-  //        = 3 draw number of entries in the bin (if exist)
-  todraw=0;
-  // error = -1 pas de barre d'erreur
-  //          1 barres d'erreurs,
-  //          0 barres d'erreurs automatiques (si markeur demande)
-  error=0;
+  pline=true;
+  error=false;
   filled=false;
   spoX=-0.01; spoY=-0.01;
@@ -108,17 +124,32 @@
 {
   if (!mHistoWp)  return;
+  if ( mHistoWp->NBins() < 1 ) {
+    SetLimits(mHistoWp->XMin(), mHistoWp->XMax(), 0., 1.);
+  }
   double v,hmin,hmax;
-  hmin = 9.e39;
-  hmax = -9.e39;
-  for (int i=1; i<mHistoWp->NBins(); i++) {
-    v = DrawVal(i);
+  hmin = hmax = (*mHistoWp)(0);
+  for (int_4 i=1; i<mHistoWp->NBins(); i++) {
+    v = (*mHistoWp)(i);
     if(v<hmin) hmin = v;
     if(v>hmax) hmax = v;
   }
-  // REZA$CHECK : Modifier pour tenir compte si axe (Y) en log
-  v = 0.1*(hmax-hmin);
-  hmin -= v;   hmax += v;
-
+  if ( isLogScaleY() ) {
+    if ( hmin >= 0.) {
+      if ( hmax <= hmin ) {
+	hmax = hmin*10.;
+	if (hmax <= 0.) hmax = 1.;
+	if (hmin <= 0.) hmin = hmax / 100.; 
+      }
+      else if ( (hmin == 0.) && (hmax > hmin) ) hmin = hmax/1.e6;
+      else hmin /= 1.1;
+    }
+    else if (hmax > 0.) hmax *= 1.1;
+  }
+  else {
+      v = 0.05*(hmax-hmin);
+      hmin -= v;   hmax += v;
+  }
   if(hmax<=hmin) hmax = hmin+1.;
+    
   SetLimits(mHistoWp->XMin(), mHistoWp->XMax(), hmin, hmax);
 }
@@ -134,8 +165,7 @@
   mHistoWp->Update();
 
-  bool oktrace=false;
   // Tracer d'une polyline si demandee
   bool drawpline=false;
-  if(GetGraphicAtt().GetLineAtt() != PI_NotDefLineAtt) drawpline=true;
+  if (pline) drawpline=true;
   // Tracer des marqueurs si demande ou si HProf
   bool drawmarker=false;
@@ -143,24 +173,18 @@
   // Tracer des erreurs ?
   bool drawerr=false;
-  if(error==0) {  // Gestion automatique des erreurs
-    // Trace les erreurs si marqueurs demandes
-    if(drawmarker) drawerr=true;
-  }
-  else if(error>0) drawerr=true;
-  else if(error<0) drawerr=false;
+  if (error) drawerr = true;
   // Fill de l'histo ?
   bool drawfill=false;
   if(filled) drawfill=true; else drawfill=false;
-  // Et aussi si on ne demande ni ligne ni marqueur ?
-  if( !drawmarker && !drawpline && !drawerr ) drawfill=true;
+  // Et aussi si on ne demande ni ligne ni marqueur ni erreur ni fill ?
+  if( !drawmarker && !drawfill && !drawerr ) drawpline=true;
 
   // Remplissage des bins avec la couleur courante (trace en premier)
   if(drawfill) {
-    oktrace = true;
     for(int i=0; i<mHistoWp->NBins(); i++) {
       double left   = mHistoWp->BinLowEdge(i);
       double width  = mHistoWp->BinWidth();
       double bottom = 0;
-      double height = DrawVal(i);
+      double height = (*mHistoWp)(i);
       g->DrawFBox(left,bottom,width,height);
     }
@@ -169,8 +193,8 @@
   // Trace des marqeurs
   if(drawmarker) {
-    double x1,y1; oktrace = true;
+    double x1,y1; 
     for(int i=0; i<mHistoWp->NBins(); i++) {
       x1 = mHistoWp->BinCenter(i);
-      y1 = DrawVal(i);
+      y1 = (*mHistoWp)(i);
       g->DrawMarker(x1,y1);
     }
@@ -180,5 +204,5 @@
   if(drawerr) {
     if(GetGraphicAtt().GetLineAtt()==PI_NotDefLineAtt) g->SelLine(PI_ThinLine);
-    double x1,x2,y1,y2;  oktrace = true;
+    double x1,x2,y1,y2;  
     double bw = mHistoWp->BinWidth();
     for(int i=0; i<mHistoWp->NBins(); i++) {
@@ -186,6 +210,6 @@
         // barres d'erreur verticales
         x1 = x2 = mHistoWp->BinCenter(i);
-        y1 = DrawVal(i) - mHistoWp->Error(i);
-        y2 = DrawVal(i) + mHistoWp->Error(i);
+        y1 = (*mHistoWp)(i) - mHistoWp->Error(i);
+        y2 = (*mHistoWp)(i) + mHistoWp->Error(i);
         g->DrawLine(x1,y1, x1, y2);
         // limites de barres d'erreurs (horizontales)
@@ -199,4 +223,5 @@
   // Trace de la ligne continue si demandee
   if(drawpline) {
+    if(GetGraphicAtt().GetLineAtt()==PI_NotDefLineAtt) g->SelLine(PI_ThinLine);
     PIGrCoord* x1 = new PIGrCoord[2*mHistoWp->NBins()+2];
     PIGrCoord* y1 = new PIGrCoord[2*mHistoWp->NBins()+2];
@@ -208,5 +233,5 @@
     for(int i=0; i<mHistoWp->NBins(); i++) {
       x1[npt] = mHistoWp->BinLowEdge(i);
-      y1[npt] = DrawVal(i);
+      y1[npt] = (*mHistoWp)(i);
       npt++;
       x1[npt] = (double)x1[npt-1] + dx;
@@ -219,5 +244,4 @@
     g->DrawPolygon(x1,y1,npt,false);
     delete [] x1; delete [] y1;
-    oktrace = true;
   }
 
@@ -243,9 +267,12 @@
     else if(  opts=="nsta"   || opts=="nstat"
            || opts=="nostat" || opts=="nostats") stats=false;
-    else if(opts=="err") error=1;
-    else if(opts=="noerr" || opts=="nerr") error=-1;
-    else if(opts=="autoerr") error=0;
-    else if(opts=="fill") filled=true;
+    else if(opts=="err") error=true;
+    else if(opts=="noerr" || opts=="nerr") error=false;
+    // $CHECK$CMV  : on desactive pline si fill ? 
+    else if(opts=="fill") { filled=true; pline=false; }  
     else if(opts=="nofill" || opts=="nfill") filled=false;
+    // $CHECK$CMV  : on desactive fill si pline ? 
+    else if(opts=="pline") { pline=true; filled=false; }
+    else if(opts=="nopline") pline=false;
     else if(opts.substr(0,11) == "statposoff=") {
       float xo=0., yo=0.;
@@ -253,8 +280,4 @@
       spoX=xo; spoY=yo;
     }
-    else if(opts.substr(0,6) == "draw=v") todraw = 1;
-    else if(opts.substr(0,6) == "draw=e") todraw = 2;
-    else if(opts.substr(0,6) == "draw=n") todraw = 3;
-    else if(opts.substr(0,5) == "draw=" ) todraw = 0;
     else {
       ndec--;
@@ -281,16 +304,13 @@
  PIDrawer::OptionToString(opt);
 
- if(stats) opt.push_back("stat"); else opt.push_back("nstat");
- if(error==-1) opt.push_back("noerr");
-   else if(error==0) opt.push_back("autoerr");
-     else if(error==1) opt.push_back("err");
+ if(stats) opt.push_back("stat"); else opt.push_back("nostat");
+ if(error) opt.push_back("err");  else opt.push_back("noerr");
  if(filled) opt.push_back("fill"); else opt.push_back("nofill");
- if(todraw==1) opt.push_back("draw=v");
-   else if(todraw==2) opt.push_back("draw=e");
-     else if(todraw==3) opt.push_back("draw=n");
+ if(pline) opt.push_back("pline"); else opt.push_back("nopline");
 
  char str[256]; sprintf(str,"statposoff=%g,%g",spoX,spoY);
  opt.push_back(str);
 
+ mHistoWp->OptionToString(opt);
  return 1;
 }
@@ -300,19 +320,19 @@
 {
 info += " ---- PIHisto options help info : \n" ;
-info += "  draw=v: draw bin content\n";
-info += "      =e: draw bin error (if exist)\n";
-info += "      =n: draw number of entries in the bin (if exist)\n";
-info += "      default: draw scaled and offset value (default)\n";
-info += "  sta,stat,stats:            activate   statistic display\n";
-info += "  nsta,nstat,nostat,nostats: deactivate statistic display\n";
-info += "  err / noerr,nerr : draw, do not draw error bars\n";
-info += "  autoerr : draw error bars if Marker drawing requested\n";
-info += "  fill / nofill,nfill : fill, do not fill bars with selected color\n";
-info += "  statposoff=OffsetX,OffsetY : Position offset for Stats drawing \n";
-info += "       as a fraction of total size \n";
+info += " sta,stat,stats:            activate   statistic display\n";
+info += " nsta,nstat,nostat,nostats: deactivate statistic display\n";
+info += " pline/nopline: display/do not display as polyline (def= pline) \n";
+info += " err/noerr,nerr: draw/do not draw error bars (def= noerr) \n";
+info += " fill/nofill,nfill: fill/do not fill histo (def= nofill) \n";
+info += " - Use marker attribute (marker=...) to draw markers \n"; 
+info += " statposoff=OffsetX,OffsetY : Position offset for Stats drawing \n";
+info += "      as a fraction of total size \n";
 info += " ---- HistoWrapper options : \n" ;
-info += "  hscale=value  : multiplicative factor (in Y) \n" ;
-info += "  hoffset=value : additive coefficient  (in Y) \n" ;
-info += "  hs1 : set hscale=1 hoffset=0  (default) \n" ;
+info += " hbincont: select bin content as Y value for display (default) \n";
+info += " hbinerr: select bin error as Y value for display \n";
+info += " hbinent: select bin entries as Y value for display \n";
+info += " hscale=value : multiplicative factor for Y value \n" ;
+info += " hoffset=value : additive coefficient for Y value \n" ;
+info += " hs1: set hscale=1 hoffset=0  (default) \n" ;
 // On recupere ensuite la chaine info de la classe de base
 PIDrawer::GetOptionsHelpInfo(info);
@@ -335,5 +355,5 @@
   if (nlig < 1) return;
 
-  double cellHeight = (nlig+0.6) * cH;
+  double cellHeight = nlig*1.2 * cH;
 
   int idxll = 0;
@@ -383,5 +403,5 @@
  for(int i=0; i<mHistoWp->NBins(); i++) {
    double xp=mHistoWp->BinCenter(i);
-   double yp=DrawVal(i);
+   double yp=(*mHistoWp)(i);
    xp = (xp-x)/(XMax()-XMin())/0.5;
    yp = (yp-y)/(YMax()-YMin())/0.5;
Index: /trunk/SophyaPI/PIext/pihisto.h
===================================================================
--- /trunk/SophyaPI/PIext/pihisto.h	(revision 3144)
+++ /trunk/SophyaPI/PIext/pihisto.h	(revision 3145)
@@ -20,12 +20,4 @@
   inline  P1DHistoWrapper*     HistoWrapper() {return(mHistoWp);}
 
-//   ce qu'on plot
-  double DrawVal(int_4 i) {
-    if(todraw==1) return mHistoWp->Value(i);
-    if(todraw==2) return mHistoWp->Error(i);
-    if(todraw==3) return mHistoWp->NbEntries(i);
-    return (*mHistoWp)(i);
-  }
-
 //   Methode de decodage des options
   virtual int        DecodeOptionString(vector<string> & opt, bool rmdecopt=true);
@@ -40,7 +32,9 @@
   P1DHistoWrapper*   mHistoWp;
   bool mAdDO;
-  bool stats,filled;
-  short error,todraw;
-  float spoX, spoY; // Stat pos offset par rapport a position defaut
+  bool stats;        // if true: draw text with statistical information
+  bool filled;       // if true: fill histo with fg color
+  bool pline;        // if true: draw histogram as polyline 
+  bool error;        // if true: draw error bars
+  float spoX, spoY;  // Stat pos offset par rapport a position defaut
 };
 
Index: /trunk/SophyaPI/PIext/pihisto2d.cc
===================================================================
--- /trunk/SophyaPI/PIext/pihisto2d.cc	(revision 3144)
+++ /trunk/SophyaPI/PIext/pihisto2d.cc	(revision 3145)
@@ -3,4 +3,8 @@
 #include <pisysdep.h>
 #include PIAPP_H
+
+#include <iostream>
+#include <math.h>
+
 #include "sopnamsp.h"
 #include "pihisto2d.h"
@@ -9,4 +13,73 @@
 static int dbg = 0;
 
+
+//------ Implementation classe P2DHistoWrapper
+P2DHistoWrapper::P2DHistoWrapper(int_4 asx, int_4 asy) 
+  :  P2DArrayAdapter(asx, asy) , 
+     mScale(1.) , mOff(0.) , mRetFg(0)
+{
+}
+
+P2DHistoWrapper::~P2DHistoWrapper()
+{
+}
+
+int P2DHistoWrapper::GetStatInfoAsText(vector<string> & /* text */ )
+{
+  return 0;
+}
+
+int P2DHistoWrapper::DecodeOptionString(vector<string> & opt, bool rmdecopt)
+{
+  if(opt.size() < 1) return(0); 
+
+  vector<string> udopt;  // On gardera ici les options non decodees
+  unsigned int k = 0;
+  int ndec = opt.size();
+  for( k=0; k<opt.size(); k++ ) {
+    string & opts = opt[k];
+    if(opts.substr(0,7) == "hs1") {
+      mScale = 1.;  mOff = 0.; 
+    }
+    else if(opts.substr(0,7) == "hscale=") {
+      mScale = atof(opts.substr(7).c_str());
+    }
+    else if(opts.substr(0,8) == "hoffset=") {
+      mOff = atof(opts.substr(8).c_str());
+    }
+    else if(opts.substr(0,8) == "hbincont") {
+      mRetFg = 0;
+    }    
+    else if(opts.substr(0,8) == "hbinerr") {
+      mRetFg = 1;
+    }    
+    else if(opts.substr(0,8) == "hbinent") {
+      mRetFg = 2;
+    }    
+    else {
+      ndec--;
+      // S'il faut supprimer les options decodees
+      if (rmdecopt)  udopt.push_back(opts);
+    }
+  }
+  // S'il faut supprimer les options decodees, on remplace l'argument opt
+  // par le vecteur des options non decodees.
+  if (rmdecopt)  opt = udopt;
+  return(ndec);
+}
+
+int
+P2DHistoWrapper::OptionToString(vector<string> & opt) const
+{
+  char buff[64];
+  sprintf(buff, "hscale=%g", mScale);  opt.push_back(buff);
+  sprintf(buff, "hoffset=%g", mOff);  opt.push_back(buff);
+  if (mRetFg == 2) opt.push_back("hbinent");
+  else if (mRetFg == 1) opt.push_back("hbinerr");
+  else opt.push_back("hbincont");
+
+  return 1;
+}
+
 //++
 // Class	PIHisto2D
@@ -28,11 +101,11 @@
 
 //++
-PIHisto2D::PIHisto2D(Histo2D* histo, bool ad)
+PIHisto2D::PIHisto2D(P2DHistoWrapper* histowp, bool ad)
 //
 //	Createur d'une classe de dessin pour l'histogramme 2D histo.
 //--
-: PIDrawer(), mHisto(histo), mAdDO(ad), mLogScale(10.), mFPoints(0.5)
-{
-// mAdDO : Flag pour suppression automatique de mHisto
+: PIDrawer(), mHistoWp(histowp), mAdDO(ad), mLogScale(10.), mFPoints(0.5)
+{
+// mAdDO : Flag pour suppression automatique de mHistoWp
 // Attention: mFPoints n'est initialise que si on display par nuages de points
 //            mLogScale n'est initialise que si on utilise une echelle log
@@ -43,5 +116,5 @@
 UseFrac();
 SetStats();
- SetStatPosOffset();
+SetStatPosOffset();
 SetName("Histo2DDrw"); 
 // PIHisto2D has specific control tools
@@ -62,5 +135,5 @@
 // ---> parametre d'appel PIBaseWdgGen* wdg=NULL
 DeactivateControlWindow(NULL);
-if(mAdDO && mHisto!=NULL) delete mHisto;
+if(mAdDO && mHistoWp!=NULL) delete mHistoWp;
 }
 
@@ -139,5 +212,5 @@
 
 //++
-void PIHisto2D::UseDyn(float hmin,float hmax)
+void PIHisto2D::UseDyn(float fmin,float fmax)
 //
 //	Gestion de la dynamique a representer:
@@ -151,8 +224,19 @@
 //--
 {
-if(mHisto)
-  if(hmin>=hmax) {hmin = mHisto->VMin(); hmax = mHisto->VMax();}
-if(hmin>=hmax) hmax = hmin+1.;
-mHMin = hmin; mHMax = hmax;
+  if( (mHistoWp) && (mHistoWp->NBinX()>0) && (mHistoWp->NBinY()>0) && (fmin>=fmax) ) {
+    double v,hmin,hmax;
+    hmin = hmax = (*mHistoWp)(0,0);
+    for (int_4 i=0; i<mHistoWp->NBinX(); i++) 
+      for (int_4 j=0; j<mHistoWp->NBinY(); j++) {
+	v = (*mHistoWp)(i, j);
+	if(v<hmin) hmin = v;
+	if(v>hmax) hmax = v;
+      }
+    fmin = hmin;  fmax = hmax;   // $CHECK$ CMV : attention, double vers float !!
+  }
+
+// $CHECK$ CMV : Ne faut-il pas passer les attributs de la classe en double ??
+if(fmin>=fmax) fmax = fmin+1.;
+mHMin = fmin; mHMax = fmax;
 }
 
@@ -189,6 +273,6 @@
       ,(int)mFgCol,(int)mCmap,(int)mRevCmap,mTypScal,mTypDisp,mFPoints);
 printf("                 Dyn=%g,%g Frac=%g,%g LogSc=%g H=%p\n"
-      ,mHMin,mHMax,mFracMin,mFracMax,mLogScale,mHisto);
-if(lp>=1) mHisto->PrintStatus();
+      ,mHMin,mHMax,mFracMin,mFracMax,mLogScale,mHistoWp);
+// if(lp>=1) mHistoWp->PrintStatus();  $CHECK$ CMV : que faut-il faire ? 
 fflush(stdout);
 }
@@ -201,6 +285,6 @@
 //--
 {
- if(!mHisto) return;
- SetLimits(mHisto->XMin(), mHisto->XMax(), mHisto->YMin() , mHisto->YMax());
+ if(!mHistoWp) return;
+ SetLimits(mHistoWp->XMin(), mHistoWp->XMax(), mHistoWp->YMin() , mHistoWp->YMax());
 }
 
@@ -259,9 +343,9 @@
 if (axesFlags != kAxesNone) DrawAxes(g);
 
-if(!mHisto) return;
-if(mHisto->NBinX()<=0 || mHisto->NBinY()<=0) return;
+if(!mHistoWp) return;
+if(mHistoWp->NBinX()<=0 || mHistoWp->NBinY()<=0) return;
 
 // Caracteristiques histogramme
-double dx = mHisto->WBinX(),dy = mHisto->WBinY();
+double dx = mHistoWp->WBinX(),dy = mHistoWp->WBinY();
 double p1dx,p1dy;
 g->DGrC2UC(1.,1.,p1dx,p1dy);
@@ -309,12 +393,12 @@
 
 // Plot de l'histogramme
-for(int i=0; i<mHisto->NBinX(); i++)
-  for(int j=0; j<mHisto->NBinY(); j++) {
+for(int i=0; i<mHistoWp->NBinX(); i++)
+  for(int j=0; j<mHistoWp->NBinY(); j++) {
 
   r_8 left0,bottom0;
-  mHisto->BinLowEdge(i,j,left0,bottom0);
+  mHistoWp->BinLowEdge(i,j,left0,bottom0);
 
   // Gestion de la dynamique a dessiner
-  float frac = ((*mHisto)(i,j)-HMin())/(HMax()-HMin());
+  float frac = ((*mHistoWp)(i,j)-HMin())/(HMax()-HMin());
   if(frac<0.) continue;
   if(mTypScal==1) {              // echelle log10
@@ -385,14 +469,17 @@
 //--
 {
-Histo2D* h = Histogram();
+P2DHistoWrapper* h = HistoWrapper();
 if(h == NULL) return;
 
-int i,j;
-h->FindBin(x,y,i,j);
+int_4 i,j;
+i = floor((x-h->XMin())/h->WBinX()); 
+j = floor((y-h->YMin())/h->WBinY());
+
 if(i>=0 && i<h->NBinX() && j>=0 && j<h->NBinY()) {
   char str[64];
   if(fgdiff) {
     int i0,j0;
-    h->FindBin(x0,y0,i0,j0);
+    i0 = floor((x0-h->XMin())/h->WBinX()); 
+    j0 = floor((y0-h->YMin())/h->WBinY());
     if(i0>=0 && i0<h->NBinX() && j0>=0 && j0<h->NBinY()) {
       sprintf(str," DV=%g",(*h)(i,j)-(*h)(i0,j0));
@@ -417,5 +504,5 @@
 //--
 {
-  if (!mHisto) return;
+  if (!mHistoWp) return;
   if (GetGraphicAtt().GetLineAtt() == PI_NotDefLineAtt)  g->SelLine(PI_ThinLine);
   g->SelFontSz((YMax() - YMin())/30);
@@ -424,10 +511,19 @@
   PIGrCoord a, d;
   double cH = (double)g->GetFontHeight(a,d);
-  double cellHeight = 1.2 * cH;
-
-  // Les labels et leurs longueurs -> largeur de la cellule
-  char label[64];
-  sprintf(label,"N= %-g", mHisto->NData());
-  double cellWidth =  1.1 * (double)g->CalcStringWidth(label);
+  vector<string> lines;
+  int nlig = mHistoWp->GetStatInfoAsText(lines);
+  if (nlig < 1) return;
+
+  double cellHeight = nlig*1.2 * cH;
+
+  int idxll = 0;
+  
+  int kl;
+  // on recherche la ligne la plus longue
+  for(kl=1; kl<nlig; kl++)
+    if ( lines[kl].length() > lines[idxll].length() )  idxll = kl;
+
+  double cellWidth =  1.1 * (double)g->CalcStringWidth(lines[idxll].c_str());
+
 
   double ofpx = spoX*(XMax()-XMin());
@@ -446,11 +542,18 @@
   cw = (g->isAxeXDirRtoL()) ? -0.05*cellWidth : -0.95*cellWidth;
   xu = g->DeltaUCX(XMax(),cw);
-  cw = (g->isAxeYDirUpDown()) ? -0.1*cH : -1.1*cH;
+
+  cw = (g->isAxeYDirUpDown()) ? -0.15*cH : -1.15*cH;
   yu = g->DeltaUCY(YMax(),cw);
   xu += ofpx;  yu += ofpy;
-  g->DrawString(xu,yu,label);
+
+  for(kl=0; kl<nlig; kl++) {
+    g->DrawString(xu, yu, lines[kl].c_str() );
+    cw +=  -1.15*cH;
+    yu = g->DeltaUCY(YMax(),cw);  yu += ofpy;
+  }
+
 
   //  printf("H[%d,%d] Dynamique: [%g,%g] Frac [%g,%g]\n"
-  //        ,mHisto->NBinX(),mHisto->NBinY(),HMin(),HMax(),FMin(),FMax());
+  //        ,mHistoWp->NBinX(),mHistoWp->NBinY(),HMin(),HMax(),FMin(),FMax());
 }
 
@@ -489,5 +592,5 @@
 //--
 {
-double dx = mHisto->WBinX(),dy = mHisto->WBinY();
+double dx = mHistoWp->WBinX(),dy = mHistoWp->WBinY();
 double dxg,dyg;
 g->DUC2GrC(dx,dy,dxg,dyg);
@@ -573,8 +676,14 @@
   if (rmdecopt)  opt = udopt;
 
+  // Decodage des options par le histo-wrapper
+  int ndec2 = 0;
+  if ( ( optsz1-ndec1-ndec > 0) && (mHistoWp) ) {
+    ndec2 = mHistoWp->DecodeOptionString(opt, rmdecopt);
+  }
+
   // Liste des options si demande
   if(listopt) Print();
 
-  return(ndec+ndec1);
+  return(ndec+ndec1+ndec2);
 }
 
@@ -607,4 +716,6 @@
  if(mRevCmap) opt.push_back("revcmap");
 
+ // Les options du Histo2DWrapper :
+ mHistoWp->OptionToString(opt);
  return 1;
 }
@@ -630,8 +741,15 @@
 info += "- h2scale=lin/log[,logscale]: choose linear or logarithmic scale\n";
 info += "- h2dyn=[hmin][,hmax]: choose histogramme range for display\n";
-info += "- use general key to define color table (ex: grey32,midas_heat,...)\n";
+info += "- use graphic att. to define color table (ex: grey32,midas_heat,...)\n";
 info += "            (see general graphicatt description)\n";
-info += "- use key \"revcmap\" to reverse color table\n";
+info += "- use \"revcmap\" to reverse color table\n";
 info += "- h2frac=[fmin][,fmax]: choose sub-range display [0,1]\n";
+info += " ---- HistoWrapper options : \n" ;
+info += " hbincont: select bin content as Y value for display (default) \n";
+info += " hbinerr: select bin error as Y value for display \n";
+info += " hbinent: select bin entries as Y value for display \n";
+info += " hscale=value : multiplicative factor for Y value \n" ;
+info += " hoffset=value : additive coefficient for Y value \n" ;
+info += " hs1: set hscale=1 hoffset=0  (default) \n" ;
 // On recupere ensuite la chaine info de la classe de base
 PIDrawer::GetOptionsHelpInfo(info);
Index: /trunk/SophyaPI/PIext/pihisto2d.h
===================================================================
--- /trunk/SophyaPI/PIext/pihisto2d.h	(revision 3144)
+++ /trunk/SophyaPI/PIext/pihisto2d.h	(revision 3145)
@@ -12,12 +12,13 @@
 #include PIOPTMENU_H
 
-#include "histos2.h"
 #include "pidrawer.h"
 #include "piscdrawwdg.h"
+
+#include "phistwrapper.h"
 
 ////////////////////////////////////////////////////////////////////
 class PIHisto2D : public PIDrawer {
 public:
-  PIHisto2D(Histo2D* histo, bool ad=false);
+  PIHisto2D(P2DHistoWrapper* h2wp, bool ad=false);
   virtual ~PIHisto2D();
 
@@ -56,5 +57,5 @@
 
   // Methodes inline
-  inline Histo2D*       Histogram()   {return(mHisto);}
+  inline P2DHistoWrapper*       HistoWrapper()   {return(mHistoWp);}
   inline bool           Color()       {return(mFgCol);}
   inline CMapId         ColMap()      {return(mCmap);}
@@ -73,5 +74,5 @@
   char HPrint2(float f);
 
-  Histo2D* mHisto;
+  P2DHistoWrapper* mHistoWp;
   bool mAdDO; bool stats;
   bool mFgCol; CMapId mCmap; bool mRevCmap;
Index: /trunk/SophyaPI/PIext/pipodrw.cc
===================================================================
--- /trunk/SophyaPI/PIext/pipodrw.cc	(revision 3144)
+++ /trunk/SophyaPI/PIext/pipodrw.cc	(revision 3145)
@@ -56,53 +56,4 @@
 
 
-// ----------------------------------------------------------
-// Adaptateur d'Histo-2D a P2DArrayAdapter
-// ----------------------------------------------------------
-
-/* --Methode-- */
-POH2DAdapter::POH2DAdapter(Histo2D* h2d, bool ad)
-        : P2DArrayAdapter(h2d->NBinX(), h2d->NBinY())
-{
-aDel = ad; mH2d = h2d;
-DefineXYCoordinates(h2d->XMin(), h2d->YMin(), h2d->WBinX(), h2d->WBinY() );
-}
-
-/* --Methode-- */
-POH2DAdapter::~POH2DAdapter()
-{
-if (aDel)  delete mH2d;
-}
-
-/* --Methode-- */
-double POH2DAdapter::Value(int ix, int iy)
-{
-return((*mH2d)(ix, iy));
-}
-
-// ----------------------------------------------------------
-// Adaptateur d'Histo2DErr a P2DArrayAdapter
-// ----------------------------------------------------------
-
-/* --Methode-- */
-POHe2DAdapter::POHe2DAdapter(Histo2DErr* he2d, bool ad)
-        : P2DArrayAdapter(he2d->NBinX(), he2d->NBinY())
-{
-aDel = ad; mHe2d = he2d;
-DefineXYCoordinates(he2d->XMin(), he2d->YMin(), he2d->WBinX(), he2d->WBinY() );
-}
-
-/* --Methode-- */
-POHe2DAdapter::~POHe2DAdapter()
-{
-if (aDel)  delete mHe2d;
-}
-
-/* --Methode-- */
-double POHe2DAdapter::Value(int ix, int iy)
-{
-return((*mHe2d)(ix, iy));
-}
-
-
 #ifdef SANS_EVOLPLANCK
 
@@ -129,4 +80,6 @@
 return((*mVec)(i)); 
 }
+
+------- FIN SUPPRESSION */
 
 // ----------------------------------------------------------
Index: /trunk/SophyaPI/PIext/pipodrw.h
===================================================================
--- /trunk/SophyaPI/PIext/pipodrw.h	(revision 3144)
+++ /trunk/SophyaPI/PIext/pipodrw.h	(revision 3145)
@@ -34,30 +34,4 @@
 
 
-// Adaptateur d'Histo-2D a P2DArrayAdapter
-class POH2DAdapter :  public P2DArrayAdapter {
-public :
-                  POH2DAdapter(Histo2D* h2d, bool ad=false);
-  virtual         ~POH2DAdapter();
-
-  virtual double  Value(int ix, int iy);   
-
-protected:
-  bool aDel;
-  Histo2D* mH2d;
-};
-
-// Adaptateur d'Histo2DErr a P2DArrayAdapter
-class POHe2DAdapter :  public P2DArrayAdapter {
-public :
-                  POHe2DAdapter(Histo2DErr* he2d, bool ad=false);
-  virtual         ~POHe2DAdapter();
-
-  virtual double  Value(int ix, int iy);   
-
-protected:
-  bool aDel;
-  Histo2DErr* mHe2d;
-};
-
 #ifdef SANS_EVOLPLANCK
 #include "cvector.h"
Index: /trunk/SophyaPI/PIext/smakefile
===================================================================
--- /trunk/SophyaPI/PIext/smakefile	(revision 3144)
+++ /trunk/SophyaPI/PIext/smakefile	(revision 3145)
@@ -597,5 +597,6 @@
   $(SOPHYAINCP)pisurfdr.h pipodrw.h \
   $(SOPHYAINCP)histos2.h $(SOPHYAINCP)histos.h \
-  pintuple.h pintup3d.h pigfd1.h pigfd2.h
+  $(SOPHYAINCP)hist2err.h pintuple.h pintup3d.h pigfd1.h \
+  pigfd2.h
 	$(CXXCOMPILE) $(CXXTEMPFLG) -o $@  nobjmgr.cc
  
@@ -691,4 +692,5 @@
   $(SOPHYAINCP)generalfunc.h pipodrw.h \
   $(SOPHYAINCP)histos2.h $(SOPHYAINCP)histos.h \
+  $(SOPHYAINCP)hist2err.h \
   $(SOPHYAINCP)objfitter.h \
   $(SOPHYAINCP)cimage.h $(SOPHYAINCP)fioarr.h \
@@ -741,11 +743,27 @@
   $(SOPHYAINCP)generalfunc.h \
   $(SOPHYAINCP)histerr.h \
-  $(SOPHYAINCP)hist2err.h servnobjm.h nobjmgr.h dlftypes.h \
-  $(SOPHYAINCP)pdlmgr.h $(SOPHYAINCP)zthread.h \
-  pihisto.h phistwrapper.h sohiswrap.h $(SOPHYAINCP)histos.h \
-  $(SOPHYAINCP)hisprof.h \
+  $(SOPHYAINCP)hist2err.h pihisto.h phistwrapper.h \
+  pihisto2d.h $(SOPHYAINCP)pimenux.h \
+  $(SOPHYAINCP)pimenugen.h \
+  $(SOPHYAINCP)pimenubarx.h \
+  $(SOPHYAINCP)pimenubargen.h \
+  $(SOPHYAINCP)pioptmenux.h \
+  $(SOPHYAINCP)pioptmenugen.h \
+  $(SOPHYAINCP)pistdwdgx.h \
+  $(SOPHYAINCP)pistdwdggen.h \
+  $(SOPHYAINCP)piscdrawwdg.h \
+  $(SOPHYAINCP)pibwdgx.h \
+  $(SOPHYAINCP)pigraphps.h \
+  $(SOPHYAINCP)piwindowx.h \
+  $(SOPHYAINCP)piwindowgen.h \
+  $(SOPHYAINCP)picontainerx.h \
+  $(SOPHYAINCP)picontainergen.h \
+  $(SOPHYAINCP)pieldrw.h sohiswrap.h \
+  $(SOPHYAINCP)histos.h $(SOPHYAINCP)hisprof.h \
+  $(SOPHYAINCP)histos2.h pipodrw.h servnobjm.h nobjmgr.h \
+  dlftypes.h $(SOPHYAINCP)pdlmgr.h \
+  $(SOPHYAINCP)zthread.h \
   $(SOPHYAINCP)objfitter.h \
-  $(SOPHYAINCP)cimage.h $(SOPHYAINCP)fioarr.h \
-  $(SOPHYAINCP)histos2.h
+  $(SOPHYAINCP)cimage.h $(SOPHYAINCP)fioarr.h
 	$(CXXCOMPILE) $(CXXTEMPFLG) -o $@  nomherradapter.cc
  
@@ -795,9 +813,11 @@
   $(SOPHYAINCP)generalfunc.h \
   $(SOPHYAINCP)histos.h $(SOPHYAINCP)histos2.h \
-  $(SOPHYAINCP)hisprof.h $(SOPHYAINCP)histerr.h \
-  $(SOPHYAINCP)ntuple.h $(SOPHYAINCP)xntuple.h \
+  $(SOPHYAINCP)hisprof.h $(SOPHYAINCP)ntuple.h \
+  $(SOPHYAINCP)xntuple.h \
   $(SOPHYAINCP)basedtable.h \
   $(SOPHYAINCP)segdatablock.h pihisto.h phistwrapper.h \
-  sohiswrap.h pihisto2d.h $(SOPHYAINCP)pimenux.h \
+  sohiswrap.h $(SOPHYAINCP)histerr.h \
+  $(SOPHYAINCP)hist2err.h pihisto2d.h \
+  $(SOPHYAINCP)pimenux.h \
   $(SOPHYAINCP)pimenugen.h \
   $(SOPHYAINCP)pimenubarx.h \
@@ -1436,5 +1456,5 @@
   $(SOPHYAINCP)pitherm.h \
   $(SOPHYAINCP)resusage.h nomhistadapter.h \
-  $(SOPHYAINCP)histerr.h $(SOPHYAINCP)xntuple.h \
+  $(SOPHYAINCP)xntuple.h \
   $(SOPHYAINCP)basedtable.h \
   $(SOPHYAINCP)segdatablock.h nomgfdadapter.h \
@@ -1547,5 +1567,6 @@
   $(SOPHYAINCP)pievthandler.h \
   $(SOPHYAINCP)psfile.h $(SOPHYAINCP)pigratt.h \
-  $(SOPHYAINCP)piaxes.h phistwrapper.h
+  $(SOPHYAINCP)piaxes.h phistwrapper.h \
+  $(SOPHYAINCP)parradapter.h $(SOPHYAINCP)lut.h
 	$(CXXCOMPILE) $(CXXTEMPFLG) -o $@  pihisto.cc
  
@@ -1584,22 +1605,4 @@
   $(SOPHYAINCP)pioptmenux.h \
   $(SOPHYAINCP)pioptmenugen.h \
-  $(SOPHYAINCP)histos2.h $(SOPHYAINCP)peida.h \
-  $(SOPHYAINCP)utils.h $(SOPHYAINCP)perrors.h \
-  $(SOPHYAINCP)pexceptions.h \
-  $(SOPHYAINCP)fmath.h $(SOPHYAINCP)histos.h \
-  $(SOPHYAINCP)objfio.h \
-  $(SOPHYAINCP)anydataobj.h \
-  $(SOPHYAINCP)ppersist.h $(SOPHYAINCP)gnumd5.h \
-  $(SOPHYAINCP)ppfbinstream.h \
-  $(SOPHYAINCP)rawstream.h \
-  $(SOPHYAINCP)ppfnametag.h \
-  $(SOPHYAINCP)tvector.h $(SOPHYAINCP)tmatrix.h \
-  $(SOPHYAINCP)tarray.h $(SOPHYAINCP)basarr.h \
-  $(SOPHYAINCP)mutyv.h $(SOPHYAINCP)timestamp.h \
-  $(SOPHYAINCP)dvlist.h \
-  $(SOPHYAINCP)ndatablock.h \
-  $(SOPHYAINCP)utilarr.h \
-  $(SOPHYAINCP)tmatrix_tsnl.h \
-  $(SOPHYAINCP)tvector_tsnl.h \
   $(SOPHYAINCP)pidrawer.h \
   $(SOPHYAINCP)pigratt.h $(SOPHYAINCP)piaxes.h \
@@ -1607,5 +1610,6 @@
   $(SOPHYAINCP)piwindowx.h \
   $(SOPHYAINCP)piwindowgen.h \
-  $(SOPHYAINCP)pieldrw.h \
+  $(SOPHYAINCP)pieldrw.h phistwrapper.h \
+  $(SOPHYAINCP)parradapter.h $(SOPHYAINCP)lut.h \
   $(SOPHYAINCP)srandgen.h
 	$(CXXCOMPILE) $(CXXTEMPFLG) -o $@  pihisto2d.cc
@@ -1697,10 +1701,12 @@
   $(SOPHYAINCP)generalfunc.h \
   $(SOPHYAINCP)histos.h $(SOPHYAINCP)histos2.h \
-  $(SOPHYAINCP)hisprof.h $(SOPHYAINCP)histerr.h \
-  $(SOPHYAINCP)ntuple.h $(SOPHYAINCP)xntuple.h \
+  $(SOPHYAINCP)hisprof.h $(SOPHYAINCP)ntuple.h \
+  $(SOPHYAINCP)xntuple.h \
   $(SOPHYAINCP)basedtable.h \
-  $(SOPHYAINCP)segdatablock.h nomgfdadapter.h \
-  nomimagadapter.h $(SOPHYAINCP)cimage.h \
-  $(SOPHYAINCP)fioarr.h nomtmatvecadapter.h nomtarradapter.h \
+  $(SOPHYAINCP)segdatablock.h nomherradapter.h \
+  $(SOPHYAINCP)histerr.h \
+  $(SOPHYAINCP)hist2err.h nomgfdadapter.h nomimagadapter.h \
+  $(SOPHYAINCP)cimage.h $(SOPHYAINCP)fioarr.h \
+  nomtmatvecadapter.h nomtarradapter.h \
   $(SOPHYAINCP)datatable.h \
   $(SOPHYAINCP)swppfdtable.h \
@@ -1817,4 +1823,5 @@
   $(SOPHYAINCP)tmatrix_tsnl.h \
   $(SOPHYAINCP)tvector_tsnl.h \
+  $(SOPHYAINCP)hist2err.h \
   $(SOPHYAINCP)generalfit.h \
   $(SOPHYAINCP)generaldata.h \
@@ -2094,5 +2101,6 @@
   $(SOPHYAINCP)segdatablock.h \
   $(SOPHYAINCP)piyfxdrw.h \
-  $(SOPHYAINCP)pisurfdr.h pintuple.h pintup3d.h pipodrw.h
+  $(SOPHYAINCP)pisurfdr.h pintuple.h pintup3d.h pipodrw.h \
+  $(SOPHYAINCP)hist2err.h
 	$(CXXCOMPILE) $(CXXTEMPFLG) -o $@  servnobjm.cc
  
Index: /trunk/SophyaPI/PIext/sohiswrap.h
===================================================================
--- /trunk/SophyaPI/PIext/sohiswrap.h	(revision 3144)
+++ /trunk/SophyaPI/PIext/sohiswrap.h	(revision 3145)
@@ -12,4 +12,7 @@
 #include "histerr.h"
 
+#include "histos2.h"
+#include "hist2err.h"
+
 #include "pexceptions.h"
 
@@ -18,9 +21,10 @@
 namespace SOPHYA {
  
-//! Wrapper class for SOPHYA::Histo  , SOPHYA::HProf
+//! Wrapper class for SOPHYA::Histo  , SOPHYA::HProf , for use by PIHisto 
 class HistoWrapper : public P1DHistoWrapper
 {
 public:
   HistoWrapper(Histo* h, bool ad=true) 
+    : P1DHistoWrapper(h->NBins())
   {
     if (h == NULL) throw NullPtrError("HistoWrapper(Histo* h = NULL)");
@@ -28,4 +32,5 @@
     mHpr = dynamic_cast<HProf*>(h);
     mAD = ad;
+    DefineXCoordinate(h->XMin(), h->BinWidth()); // Pour P1DArrayAdapter
   }
   ~HistoWrapper() { if (mAD) delete mHis; }
@@ -40,5 +45,5 @@
   virtual r_8 BinHighEdge(int_4 i) { return mHis->BinHighEdge(i) ; }
 
-  virtual r_8 Value(int_4 i) { return (*mHis)(i) ; }
+  virtual r_8 Content(int_4 i) { return (*mHis)(i) ; }
   virtual r_8 Error(int_4 i) { return mHis->Error(i) ; }
   virtual r_8 NbEntries(int_4 i) { if(mHpr) return mHpr->SumW(i); else return 0.; }
@@ -70,12 +75,14 @@
 
 
-//! Wrapper class for SOPHYA::HistoErr  
+//! Wrapper class for SOPHYA::HistoErr  for use by PIHisto 
 class HistoErrWrapper : public P1DHistoWrapper 
 {
 public:
   HistoErrWrapper(HistoErr* h, bool ad=false) 
-  {
-    if (h == NULL) throw NullPtrError("HistoWrapper(HistoErr* h = NULL)");
+    : P1DHistoWrapper(h->NBins())
+  {
+    if (h == NULL) throw NullPtrError("HistoErrWrapper(HistoErr* h = NULL)");
     mHis = h;  mAD = ad;
+    DefineXCoordinate(h->XMin(), h->BinWidth()); // Pour P1DArrayAdapter
   }
   ~HistoErrWrapper() { if (mAD) delete mHis; }
@@ -90,5 +97,5 @@
   virtual r_8 BinHighEdge(int_4 i) { return mHis->BinHighEdge(i) ; }
 
-  virtual r_8 Value(int_4 i) { return (*mHis)(i) ; }
+  virtual r_8 Content(int_4 i) { return (*mHis)(i) ; }
   virtual r_8 Error(int_4 i) { return mHis->Error(i) ; }
   virtual r_8 NbEntries(int_4 i) { return mHis->NEntBin(i) ; }
@@ -113,4 +120,121 @@
 };
 
+
+//! Wrapper class for SOPHYA::Histo2D   for use by PIHisto2D 
+class Histo2DWrapper : public P2DHistoWrapper
+{
+public:
+  Histo2DWrapper(Histo2D* h, bool ad=true) 
+    : P2DHistoWrapper(h->NBinX(), h->NBinY())
+  {
+    if (h == NULL) throw NullPtrError("Histo2DWrapper(Histo2D* h = NULL)");
+    mHis = h;  mAD = ad;
+    DefineXYCoordinates(h->XMin(), h->YMin(), h->WBinX(), h->WBinY() ); // pour P2DArrayAdapter
+  }
+
+  virtual ~Histo2DWrapper() { if (mAD) delete mHis; }
+
+  virtual int_4 NBinX() { return mHis->NBinX(); }
+  virtual int_4 NBinY() { return mHis->NBinY(); }
+  virtual r_8 XMin() { return mHis->XMin() ; } 
+  virtual r_8 XMax() { return mHis->XMax() ; } 
+  virtual r_8 YMin() { return mHis->YMin() ; } 
+  virtual r_8 YMax() { return mHis->YMax() ; } 
+  virtual r_8 WBinX() { return mHis->WBinX() ; } 
+  virtual r_8 WBinY() { return mHis->WBinY() ; } 
+
+  virtual void BinLowEdge(int_4 i, int_4 j, r_8& xr, r_8& yr) 
+    { mHis->BinLowEdge(i, j, xr, yr); return; }
+  virtual void BinCenter(int_4 i, int_4 j, r_8& xr, r_8& yr)
+    { mHis->BinCenter(i, j, xr, yr); return; }
+  virtual void BinHighEdge(int_4 i, int_4 j, r_8& xr, r_8& yr) 
+    { mHis->BinHighEdge(i, j, xr, yr); return; }
+
+  // Renvoie contenu du bin i
+  virtual r_8 Content(int_4 i, int_4 j) { return (*mHis)(i,j) ; }
+  virtual r_8 Error(int_4 i, int_4 j) { return mHis->Error(i,j) ; }
+  virtual r_8 NbEntries(int_4 i, int_4 j) { return 0.; }  // $CHECK$ CMV 0 ?? 
+
+  // Methode de mise a jour du contenu 
+  //  virtual void Update() $CHECK$ CMV  a supprimer ?
+
+  // ajoute des lignes de texte avec les infos statistiques (dans text)
+  // renvoie le nombre de lignes ajoutees - avec implementation par defaut
+  virtual int GetStatInfoAsText(vector<string> &  text )
+  {
+    // $CHECK$ CMV , faut-il completer ?
+    char label[64];
+    string s;
+    sprintf(label,"N= %-g", mHis->NData());
+    s = label;   text.push_back(s);
+    return 1;
+  }
+
+  inline Histo2D* getHisto2D() { return mHis; }
+
+protected:
+  Histo2D* mHis;
+  bool mAD;
+};
+
+
+
+//! Wrapper class for SOPHYA::Histo2DErr   for use by PIHisto2D 
+class Histo2DErrWrapper : public P2DHistoWrapper
+{
+public:
+  Histo2DErrWrapper(Histo2DErr* h, bool ad=true) 
+    : P2DHistoWrapper(h->NBinX(), h->NBinY())
+  {
+    if (h == NULL) throw NullPtrError("Histo2DErrWrapper(Histo2DErr* h = NULL)");
+    mHis = h;    mAD = ad;
+    DefineXYCoordinates(h->XMin(), h->YMin(), h->WBinX(), h->WBinY() ); // pour P2DArrayAdapter
+  }
+
+  virtual ~Histo2DErrWrapper() { if (mAD) delete mHis; }
+
+  virtual int_4 NBinX() { return mHis->NBinX(); }
+  virtual int_4 NBinY() { return mHis->NBinY(); }
+  virtual r_8 XMin() { return mHis->XMin() ; } 
+  virtual r_8 XMax() { return mHis->XMax() ; } 
+  virtual r_8 YMin() { return mHis->YMin() ; } 
+  virtual r_8 YMax() { return mHis->YMax() ; } 
+  virtual r_8 WBinX() { return mHis->WBinX() ; } 
+  virtual r_8 WBinY() { return mHis->WBinY() ; } 
+
+  virtual void BinLowEdge(int_4 i, int_4 j, r_8& xr, r_8& yr) 
+    { mHis->BinLowEdge(i, j, xr, yr); return; }
+  virtual void BinCenter(int_4 i, int_4 j, r_8& xr, r_8& yr)
+    { mHis->BinCenter(i, j, xr, yr); return; }
+  virtual void BinHighEdge(int_4 i, int_4 j, r_8& xr, r_8& yr) 
+    { mHis->BinHighEdge(i, j, xr, yr); return; }
+
+  // Renvoie contenu du bin i
+  virtual r_8 Content(int_4 i, int_4 j) { return (*mHis)(i,j) ; }
+  virtual r_8 Error(int_4 i, int_4 j) { return mHis->Error(i,j) ; }
+  virtual r_8 NbEntries(int_4 i, int_4 j) { return mHis->NEntBin(i,j) ; }  // $CHECK$ CMV  OK ?
+
+  // Methode de mise a jour du contenu 
+  //  virtual void Update() $CHECK$ CMV  a supprimer ?
+
+  // ajoute des lignes de texte avec les infos statistiques (dans text)
+  // renvoie le nombre de lignes ajoutees - avec implementation par defaut
+  virtual int GetStatInfoAsText(vector<string> &  text )
+  {
+    // $CHECK$ CMV , faut-il completer ?
+    char label[64];
+    string s;
+    sprintf(label,"NCorrel= %d", mHis->NCorrel());
+    text.push_back(label);
+    return 1;
+  }
+
+  inline Histo2DErr* getHisto2DErr() { return mHis; }
+
+protected:
+  Histo2DErr* mHis;
+  bool mAD;
+};
+
 } // Fin du namespace
 
