Index: /trunk/SophyaPI/PIext/nomherradapter.cc
===================================================================
--- /trunk/SophyaPI/PIext/nomherradapter.cc	(revision 3134)
+++ /trunk/SophyaPI/PIext/nomherradapter.cc	(revision 3135)
@@ -102,10 +102,5 @@
 PIDrawer* NOMAdapter_HistoErr::GetDrawer(string & dopt)
 {
-  /*  A_FAIRE_CMV    -> + des options pour choisir val / err2 / nb
-      pour les options, il faut rajouter des arguments ou methodes a 
-      la classe HistoErrWrapper() et modifier la methode  operator()(int_4 i) Error() 
-
-      Si besoin, modifier dopt apres... dopt = "fcirclemarker5 " + dopt;
-  */
+dopt = "thinline " + dopt;
 HistoErrWrapper* hw = new HistoErrWrapper(mHerr, false); // false: le Wrapper ne delete pas l'objet mHerr
 PIHisto * pih = new PIHisto(hw, true); // true: PIHisto delete l'objet HistoErrWrapper hw
Index: /trunk/SophyaPI/PIext/pawexecut.cc
===================================================================
--- /trunk/SophyaPI/PIext/pawexecut.cc	(revision 3134)
+++ /trunk/SophyaPI/PIext/pawexecut.cc	(revision 3135)
@@ -309,4 +309,11 @@
 usage += "\n h/err namehisto expr_func";
 usage += "\n  Related commands: h/set/err";  
+piac->RegisterCommand(kw,usage,this,hgrp);
+
+kw = "herr/correl";
+usage = "Perform bin mean computation for HistoErr and Histo2DErr";
+usage += "\n herr/correl nameherr todo";
+usage += "\n    todo = +1 : compute mean";
+usage += "\n         = -1 : cancel computation";
 piac->RegisterCommand(kw,usage,this,hgrp);
 
@@ -375,4 +382,6 @@
 } else if(kw == "h/err") {
   h_err(tokens); return(0);
+} else if(kw == "herr/correl") {
+  herr_correl(tokens); return(0);
 } else return(1); 
 }
@@ -2414,2 +2423,38 @@
 
 }
+
+/* methode */
+void PAWExecutor::herr_correl(vector<string>& tokens)
+// Pour appliquer ToCorrel ou FromCorrel a un HistoErr ou Histo2DErr
+{
+  int_4 tks = tokens.size();
+  if(tks<1)
+    {cout<<"Usage: herr_correl namehisterr [+1,-1]"<<endl;
+     return;}
+
+  NamedObjMgr omg;
+  AnyDataObj* mobj = omg.GetObj(tokens[0]);
+  if( mobj==NULL)
+    {cout<<"PAWExecutor::h_copy Error: unknow object "<<tokens[0]<<endl;
+    return;}
+
+  int sens = 1;
+  if(tks>1) sens = atoi(tokens[1].c_str());
+
+  HistoErr   *herr  = dynamic_cast<HistoErr*>(mobj);
+  Histo2DErr *herr2 = dynamic_cast<Histo2DErr*>(mobj);
+
+  if(sens>=0) {
+    if(herr) herr->ToCorrel();
+    else if(herr2) herr2->ToCorrel();
+  } else {
+    if(herr) herr->FromCorrel();
+    else if(herr2) herr2->FromCorrel();
+  }
+
+  int ncorrel = 0;
+  if(herr) ncorrel = herr->NCorrel();
+  else if(herr2) ncorrel = herr2->NCorrel();
+  cout<<tokens[0]<<" : ncorrel = "<<ncorrel<<endl;
+
+}
Index: /trunk/SophyaPI/PIext/pawexecut.h
===================================================================
--- /trunk/SophyaPI/PIext/pawexecut.h	(revision 3134)
+++ /trunk/SophyaPI/PIext/pawexecut.h	(revision 3135)
@@ -47,4 +47,5 @@
   void  h_set(string dum,vector<string>& tokens);
   void  h_err(vector<string>& tokens);
+  void  herr_correl(vector<string>& tokens);
   int_4 decodepawstring(string tokens,string& nameobj
                        ,string& xexp,string& yexp,string& zexp);
Index: /trunk/SophyaPI/PIext/phistwrapper.h
===================================================================
--- /trunk/SophyaPI/PIext/phistwrapper.h	(revision 3134)
+++ /trunk/SophyaPI/PIext/phistwrapper.h	(revision 3135)
@@ -31,4 +31,5 @@
   virtual r_8 Value(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 ); }
Index: /trunk/SophyaPI/PIext/pihisto.cc
===================================================================
--- /trunk/SophyaPI/PIext/pihisto.cc	(revision 3134)
+++ /trunk/SophyaPI/PIext/pihisto.cc	(revision 3135)
@@ -41,5 +41,5 @@
       mScale = atof(opts.substr(7).c_str());
     }
-    else if(opt[k].substr(0,8) == "hoffset=") {
+    else if(opts.substr(0,8) == "hoffset=") {
       mOff = atof(opts.substr(8).c_str());
     }
@@ -72,22 +72,28 @@
 //--
 //++
-// PIHisto(P1DHistoWrapper* histo, bool ad=false)
-//	Constructeur. Si "ad == true", l'objet "histo" est détruit par 
+// PIHisto(P1DHistoWrapper* histowp, bool ad=false)
+//	Constructeur. Si "ad == true", l'objet "histowp" est détruit par 
 //	le destructeur de l'objet "PIHisto"
-//	Note : "histo" doit être créé par new
+//	Note : "histowp" doit être créé par new
 //
-// void  SetStats(bool fg=true) 
-//	Active/ désactive l'indication des statistiques d'histogramme
 //--
 
 
-PIHisto::PIHisto(P1DHistoWrapper* histo, bool ad)
-: PIDrawer(), mHisto(histo)
-{
-  mAdDO = ad;     // Flag pour suppression automatique de mHisto
-  SetStats();
-  SetError();
-  SetFilled();
-  SetStatPosOffset();
+PIHisto::PIHisto(P1DHistoWrapper* histowp, bool ad)
+: PIDrawer(), mHistoWp(histowp)
+{
+  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;
+  filled=false;
+  spoX=-0.01; spoY=-0.01;
   SetName("HistoDrw");
 }
@@ -95,5 +101,5 @@
 PIHisto::~PIHisto()
 {
-  if(mAdDO) delete mHisto;
+  if(mAdDO) delete mHistoWp;
 }
 
@@ -101,20 +107,19 @@
 PIHisto::UpdateLimits()
 {
-  if (!mHisto)  return;
-  double v1,v2,hmin,hmax;
+  if (!mHistoWp)  return;
+  double v,hmin,hmax;
   hmin = 9.e39;
   hmax = -9.e39;
-  for (int i=1; i<mHisto->NBins(); i++) {
-    v1 = (*mHisto)(i); //DEL  - mHisto->Error(i);
-    v2 = (*mHisto)(i); //DEL  + mHisto->Error(i);
-    if(v1<hmin) hmin = v1;
-    if(v2>hmax) hmax = v2;
+  for (int i=1; i<mHistoWp->NBins(); i++) {
+    v = DrawVal(i);
+    if(v<hmin) hmin = v;
+    if(v>hmax) hmax = v;
   }
   // REZA$CHECK : Modifier pour tenir compte si axe (Y) en log
-  v1 = 0.1*(hmax-hmin);
-  hmin -= v1;   hmax += v1;
+  v = 0.1*(hmax-hmin);
+  hmin -= v;   hmax += v;
 
   if(hmax<=hmin) hmax = hmin+1.;
-  SetLimits(mHisto->XMin(), mHisto->XMax(), hmin, hmax);
+  SetLimits(mHistoWp->XMin(), mHistoWp->XMax(), hmin, hmax);
 }
 
@@ -124,8 +129,8 @@
   if (axesFlags != kAxesNone) DrawAxes(g);
 
-  if (!mHisto)  return;
-  if (mHisto->NBins()<=0) return;
+  if (!mHistoWp)  return;
+  if (mHistoWp->NBins()<=0) return;
  
-  mHisto->Update();
+  mHistoWp->Update();
 
   bool oktrace=false;
@@ -136,10 +141,7 @@
   bool drawmarker=false;
   if (GetGraphicAtt().GetMarker() != PI_NotDefMarker) drawmarker = true;
-//RZDEL   ||  (typeid(*mHisto) == typeid(HProf)) ) drawmarker = true;
   // Tracer des erreurs ?
   bool drawerr=false;
   if(error==0) {  // Gestion automatique des erreurs
-    //RZDEL  Tracer les erreurs si HProf
-//RZDEL    if( typeid(*mHisto)==typeid(HProf) ) drawerr=true;
     // Trace les erreurs si marqueurs demandes
     if(drawmarker) drawerr=true;
@@ -156,9 +158,9 @@
   if(drawfill) {
     oktrace = true;
-    for(int i=0; i<mHisto->NBins(); i++) {
-      double left   = mHisto->BinLowEdge(i);
-      double width  = mHisto->BinWidth();
+    for(int i=0; i<mHistoWp->NBins(); i++) {
+      double left   = mHistoWp->BinLowEdge(i);
+      double width  = mHistoWp->BinWidth();
       double bottom = 0;
-      double height = (*mHisto)(i);
+      double height = DrawVal(i);
       g->DrawFBox(left,bottom,width,height);
     }
@@ -168,7 +170,7 @@
   if(drawmarker) {
     double x1,y1; oktrace = true;
-    for(int i=0; i<mHisto->NBins(); i++) {
-      x1 = mHisto->BinCenter(i);
-      y1 = (*mHisto)(i);
+    for(int i=0; i<mHistoWp->NBins(); i++) {
+      x1 = mHistoWp->BinCenter(i);
+      y1 = DrawVal(i);
       g->DrawMarker(x1,y1);
     }
@@ -179,11 +181,11 @@
     if(GetGraphicAtt().GetLineAtt()==PI_NotDefLineAtt) g->SelLine(PI_ThinLine);
     double x1,x2,y1,y2;  oktrace = true;
-    double bw = mHisto->BinWidth();
-    for(int i=0; i<mHisto->NBins(); i++) {
-      if(mHisto->Error(i)>0.) {
+    double bw = mHistoWp->BinWidth();
+    for(int i=0; i<mHistoWp->NBins(); i++) {
+      if(mHistoWp->Error(i)>0.) {
         // barres d'erreur verticales
-        x1 = x2 = mHisto->BinCenter(i);
-        y1 = (*mHisto)(i) - mHisto->Error(i);
-        y2 = (*mHisto)(i) + mHisto->Error(i);
+        x1 = x2 = mHistoWp->BinCenter(i);
+        y1 = DrawVal(i) - mHistoWp->Error(i);
+        y2 = DrawVal(i) + mHistoWp->Error(i);
         g->DrawLine(x1,y1, x1, y2);
         // limites de barres d'erreurs (horizontales)
@@ -197,14 +199,14 @@
   // Trace de la ligne continue si demandee
   if(drawpline) {
-    PIGrCoord* x1 = new PIGrCoord[2*mHisto->NBins()+2];
-    PIGrCoord* y1 = new PIGrCoord[2*mHisto->NBins()+2];
-    double dx = mHisto->BinWidth();
+    PIGrCoord* x1 = new PIGrCoord[2*mHistoWp->NBins()+2];
+    PIGrCoord* y1 = new PIGrCoord[2*mHistoWp->NBins()+2];
+    double dx = mHistoWp->BinWidth();
     int npt=0;
-    x1[npt] = mHisto->BinLowEdge(0);
+    x1[npt] = mHistoWp->BinLowEdge(0);
     y1[npt] = 0;
     npt++;
-    for(int i=0; i<mHisto->NBins(); i++) {
-      x1[npt] = mHisto->BinLowEdge(i);
-      y1[npt] = (*mHisto)(i);
+    for(int i=0; i<mHistoWp->NBins(); i++) {
+      x1[npt] = mHistoWp->BinLowEdge(i);
+      y1[npt] = DrawVal(i);
       npt++;
       x1[npt] = (double)x1[npt-1] + dx;
@@ -238,17 +240,21 @@
   for( k=0; k<opt.size(); k++ ) {
     string opts = opt[k];
-    if(opts=="sta" || opts=="stat" || opts=="stats") SetStats(true);
+    if(opts=="sta" || opts=="stat" || opts=="stats") stats=true;
     else if(  opts=="nsta"   || opts=="nstat"
-           || opts=="nostat" || opts=="nostats") SetStats(false);
-    else if(opts=="err")      SetError(1);
-    else if(opts=="noerr" || opts=="nerr")    SetError(-1);
-    else if(opts=="autoerr")  SetError(0);
-    else if(opts=="fill")     SetFilled(true);
-    else if(opts=="nofill" || opts=="nfill")   SetFilled(false);
+           || 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=="nofill" || opts=="nfill") filled=false;
     else if(opts.substr(0,11) == "statposoff=") {
       float xo=0., yo=0.;
       sscanf(opts.substr(11).c_str(),"%g,%g",&xo, &yo);
-      SetStatPosOffset(xo, yo);
-    }
+      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--;
@@ -264,6 +270,6 @@
   // Decodage des options par le histo-wrapper
   int ndec2 = 0;
-  if ( ( optsz1-ndec1-ndec > 0) && (mHisto) ) {
-    ndec2 = mHisto->DecodeOptionString(opt, rmdecopt);
+  if ( ( optsz1-ndec1-ndec > 0) && (mHistoWp) ) {
+    ndec2 = mHistoWp->DecodeOptionString(opt, rmdecopt);
   }
   return(ndec+ndec1+ndec2);
@@ -280,4 +286,7 @@
      else if(error==1) opt.push_back("err");
  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");
 
  char str[256]; sprintf(str,"statposoff=%g,%g",spoX,spoY);
@@ -291,8 +300,12 @@
 {
 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)";
 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 OR Profile histo\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";
@@ -310,5 +323,5 @@
 PIHisto::DrawStats(PIGraphicUC* g)
 {
-  if (!mHisto) return;
+  if (!mHistoWp) return;
   //  if (mLAtt == PI_NotDefLineAtt)  g->SelLine(PI_ThinLine);
   g->SelLine(PI_ThinLine);
@@ -319,5 +332,5 @@
   double cH = (double)g->GetFontHeight(a,d);
   vector<string> lines;
-  int nlig = mHisto->GetStatInfoAsText(lines);
+  int nlig = mHistoWp->GetStatInfoAsText(lines);
   if (nlig < 1) return;
 
@@ -361,15 +374,14 @@
 }
 
-
-
 /* --Methode-- */
-double PIHisto::GetDistanceToPoint(double x, double y)
-{
- if (!mHisto) return 1.e+9;
+double
+PIHisto::GetDistanceToPoint(double x, double y)
+{
+ if (!mHistoWp) return 1.e+9;
 
  double dist = -1.e+18;
- for(int i=0; i<mHisto->NBins(); i++) {
-   double xp=mHisto->BinCenter(i);
-   double yp=(*mHisto)(i);
+ for(int i=0; i<mHistoWp->NBins(); i++) {
+   double xp=mHistoWp->BinCenter(i);
+   double yp=DrawVal(i);
    xp = (xp-x)/(XMax()-XMin())/0.5;
    yp = (yp-y)/(YMax()-YMin())/0.5;
@@ -379,5 +391,5 @@
  dist=sqrt(fabs(dist));
  //cout<<dist<<"PIHisto: xlim="<<XMin()<<","<<XMax()<<" ylim="<<YMin()<<","<<YMax()
- //    <<" NBins="<<mHisto->NBins()<<endl;
+ //    <<" NBins="<<mHistoWp->NBins()<<endl;
  //cout<<"....d="<<dist<<" x="<<x<<" y="<<y<<endl;
 
Index: /trunk/SophyaPI/PIext/pihisto.h
===================================================================
--- /trunk/SophyaPI/PIext/pihisto.h	(revision 3134)
+++ /trunk/SophyaPI/PIext/pihisto.h	(revision 3135)
@@ -13,16 +13,18 @@
 class PIHisto : public PIDrawer {
 public:
-                     PIHisto(P1DHistoWrapper* histo, bool ad=true);
+                     PIHisto(P1DHistoWrapper* histowp, bool ad=true);
   virtual           ~PIHisto();
   virtual void       Draw(PIGraphicUC* g, double xmin, double ymin, double xmax, double ymax);
   virtual void       UpdateLimits();
-  inline  void       SetStats(bool fg=true) {stats=fg;}
-  inline  void       SetStatPosOffset(float ofx=-0.01, float ofy=-0.01) 
-                                     {spoX=ofx; spoY=ofy; }
-  // fg=-1 pas de barre d'erreur, 1=barres d'erreurs,
-  // 0=barres d'erreurs automatiques: trace si HProf ou markeur demande
-  inline  void       SetError(short fg=0) {error=fg;}
-  inline  void       SetFilled(bool fg=false) {filled=fg;}
-  inline  P1DHistoWrapper*     HistoWrapper() {return(mHisto);}
+
+  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
@@ -36,8 +38,8 @@
 protected:
   virtual void       DrawStats(PIGraphicUC* g);
-  P1DHistoWrapper*   mHisto;
+  P1DHistoWrapper*   mHistoWp;
   bool mAdDO;
   bool stats,filled;
-  short error;
+  short error,todraw;
   float spoX, spoY; // Stat pos offset par rapport a position defaut
 };
Index: /trunk/SophyaPI/PIext/piinit.cc
===================================================================
--- /trunk/SophyaPI/PIext/piinit.cc	(revision 3134)
+++ /trunk/SophyaPI/PIext/piinit.cc	(revision 3135)
@@ -5,4 +5,5 @@
 #include "servnobjm.h"
 #include "nomhistadapter.h"
+#include "nomherradapter.h"
 #include "nomgfdadapter.h"
 #include "nomimagadapter.h"
@@ -50,6 +51,9 @@
   serv->RegisterClass(new Histo, new NOMAdapter_Histo );
   serv->RegisterClass(new HProf, new NOMAdapter_Histo );
-  serv->RegisterClass(new HistoErr, new NOMAdapter_Histo );
   serv->RegisterClass(new Histo2D, new NOMAdapter_Histo2D );
+
+  serv->RegisterClass(new HistoErr, new NOMAdapter_HistoErr );
+  serv->RegisterClass(new Histo2DErr, new NOMAdapter_Histo2DErr );
+
   serv->RegisterClass(new NTuple, new NOMAdapter_NTuple );
 
Index: /trunk/SophyaPI/PIext/sohiswrap.h
===================================================================
--- /trunk/SophyaPI/PIext/sohiswrap.h	(revision 3134)
+++ /trunk/SophyaPI/PIext/sohiswrap.h	(revision 3135)
@@ -25,5 +25,7 @@
   {
     if (h == NULL) throw NullPtrError("HistoWrapper(Histo* h = NULL)");
-    mHis = h;  mAD = ad;
+    mHis = h;
+    mHpr = dynamic_cast<HProf*>(h);
+    mAD = ad;
   }
   ~HistoWrapper() { if (mAD) delete mHis; }
@@ -40,4 +42,5 @@
   virtual r_8 Value(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.; }
 
   virtual void Update() { mHis->UpdateHisto(); }
@@ -59,6 +62,8 @@
   // pointeur sur l'objet histo
   inline Histo* getHisto() { return mHis; }
+
 protected:
   Histo* mHis;
+  HProf* mHpr;
   bool mAD;
 };
@@ -87,13 +92,14 @@
   virtual r_8 Value(int_4 i) { return (*mHis)(i) ; }
   virtual r_8 Error(int_4 i) { return mHis->Error(i) ; }
-
-  // CMV $CHECK$  pas besoin ? virtual void Update() { }
+  virtual r_8 NbEntries(int_4 i) { return mHis->NEntBin(i) ; }
 
   // ajoute des lignes de texte avec les infos statistiques 
   virtual int GetStatInfoAsText(vector<string> & text) 
   {
-    // CMV $CHECK$  Y-a-t il qque chose a ecrire ?
-    string s = "HistoErr"; 
-    text.push_back(s);
+    char label[64]; string s;
+
+    sprintf(label, "NCor= %d",mHis->NCorrel());
+    s = label; text.push_back(s);
+
     return 1;
   }
@@ -101,4 +107,5 @@
   // pointeur sur l'objet histo
   inline HistoErr* getHistoErr() { return mHis; }
+
 protected:
   HistoErr* mHis;
