Index: trunk/SophyaPI/PIext/nobjmgr.cc
===================================================================
--- trunk/SophyaPI/PIext/nobjmgr.cc	(revision 463)
+++ trunk/SophyaPI/PIext/nobjmgr.cc	(revision 466)
@@ -119,5 +119,5 @@
   CreateDir(dirn);
   SetKeepOldDirAtt(dirn, false);
-  dirn = "func";
+  dirn = "autoc";
   CreateDir(dirn);
   SetKeepOldDirAtt(dirn, false);
@@ -420,6 +420,6 @@
   }
 
-// Si c'est le repertoire /func, on nettoie
-if (nrep == "func")  {
+// Si c'est le repertoire /autoc, on nettoie
+if (nrep == "autoc")  {
   CleanDir(nrep);
   }
@@ -439,7 +439,7 @@
 it = myObjs->find(nom);
 if (it != myObjs->end()) { // l'objet existe deja
-  if (nrep == "func") {  // Dans /func , on garde les objets affiches, donc del. par Clean
+  if (nrep == "autoc") {  // Dans /autoc , on garde les objets affiches, donc del. par Clean
     sprintf(buff, "%d", (*it).second.oid); 
-    string nomnew = "/func/" + nobj + buff;
+    string nomnew = "/autoc/" + nobj + buff;
     RenameObj(nom, nomnew);
     }                              
Index: trunk/SophyaPI/PIext/pawexecut.cc
===================================================================
--- trunk/SophyaPI/PIext/pawexecut.cc	(revision 463)
+++ trunk/SophyaPI/PIext/pawexecut.cc	(revision 466)
@@ -5,32 +5,440 @@
 #include <typeinfo>
 
+#include "strutil.h"
+#include "cvector.h"
+#include "matrix.h"
+#include "histos.h"
 #include "histos.h"
 #include "histos2.h"
+#include "hisprof.h"
 #include "ntuple.h"
 
 #include "pawexecut.h"
 #include "nobjmgr.h"
+#include "servnobjm.h"
 #include "pistdimgapp.h"
 
+/* Reza + cmv  13/10/99 */
+
+/* methode */
 PAWExecutor::PAWExecutor(PIACmd *piac, PIStdImgApp* app)
-  : mApp(app)
+: mApp(app)
 {
 string kw, usage;
 string hgrp = "pawCmd";
-kw = "h/op/res";
-usage = "Reset histogram - " ;
-piac->RegisterCommand(kw,usage,this,hgrp);
-}
-
+
+kw = "reset";
+usage = "Reset histograms vectors or matrix";
+usage += "\n reset nameobj";
+piac->RegisterCommand(kw,usage,this,hgrp);
+
+kw = "n/plot";
+usage = "Plot NTuple variable a la paw";
+usage += "\n n/plot nameobj.x_exp [cut] [w_exp] [gratt]";
+usage += "\n n/plot nameobj.y_exp%x_exp [cut] [w_exp] [gratt]";
+usage += "\n n/plot nameobj.z_exp%y_exp%x_exp [cut] [gratt]";
+usage += "\n  Related commands: plot2dw plot3d";  
+piac->RegisterCommand(kw,usage,this,hgrp);
+
+kw = "n/proj";
+usage = "Project NTuple in histogram (1D or 2D) a la paw";
+usage += "\n n/proj nameproj nameobj.x_exp [cut] [w_exp] [gratt]";
+usage += "\n n/proj nameproj nameobj.y_exp%x_exp [cut] [w_exp] [gratt]";
+usage += "\n  Related commands: projh1d projh2d projprof";  
+piac->RegisterCommand(kw,usage,this,hgrp);
+
+kw = "h/integ";
+usage = "Integrate a 1D histogram or profile";
+usage += "\n h/integ nameh1d [norm]";
+usage += "\n  Related commands: h/deriv";  
+piac->RegisterCommand(kw,usage,this,hgrp);
+
+kw = "h/deriv";
+usage = "Derivate a 1D histogram or profile";
+usage += "\n h/deriv nameh1d";
+usage += "\n  Related commands: h/integ";  
+piac->RegisterCommand(kw,usage,this,hgrp);
+
+kw = "h/rebin";
+usage = "Rebin a 1D histogram or profile";
+usage += "\n h/rebin nbin";
+piac->RegisterCommand(kw,usage,this,hgrp);
+
+kw = "h/cadd";
+usage = "Add a constant to an histogramme";
+usage += "\n h/cadd val";
+usage += "\n  Related commands: h/cmult";  
+piac->RegisterCommand(kw,usage,this,hgrp);
+
+kw = "h/cmult";
+usage = "Multiply an histogramme by a constant";
+usage += "\n h/cmult val";
+usage += "\n  Related commands: h/cadd";  
+piac->RegisterCommand(kw,usage,this,hgrp);
+
+kw = "h/plot/2d";
+usage = "Specific plot for 2D histogrammes";
+usage += "\n h/plot/2d nameh2d show        : infos on 2D histogramme";
+usage += "\n h/plot/2d nameh2d h    [dopt] : plot 2D histogramme";
+usage += "\n h/plot/2d nameh2d px   [dopt] : plot X projection";
+usage += "\n h/plot/2d nameh2d py   [dopt] : plot Y projection";
+usage += "\n h/plot/2d nameh2d bx n [dopt] : plot X band number n";
+usage += "\n h/plot/2d nameh2d by n [dopt] : plot Y band number n";
+usage += "\n h/plot/2d nameh2d sx n [dopt] : plot X slice number n";
+usage += "\n h/plot/2d nameh2d sy n [dopt] : plot Y slice number n";
+usage += "\n                      n < 0 means Show Info";
+piac->RegisterCommand(kw,usage,this,hgrp);
+}
+
+/* methode */
 PAWExecutor::~PAWExecutor()
 {
 }
 
+/* methode */
 int PAWExecutor::Execute(string& kw, vector<string>& tokens)
 {
-if(kw == "h/op/res") {
-  cout << " CMV-A faire - h/op/res pas implemente " << endl;
-  return(0);
+if(kw == "reset") {
+  reset(tokens); return(0);
+} else if(kw == "n/plot") {
+  n_plot(tokens); return(0);
+} else if(kw == "n/proj") {
+  n_proj(tokens); return(0);
+} else if(kw == "h/integ") {
+  h_integ(tokens); return(0);
+} else if(kw == "h/deriv") {
+  h_deriv(tokens); return(0);
+} else if(kw == "h/rebin") {
+  h_rebin(tokens); return(0);
+} else if(kw == "h/cadd") {
+  h_cadd(tokens); return(0);
+} else if(kw == "h/cmult") {
+  h_cmult(tokens); return(0);
+} else if(kw == "h/plot/2d") {
+  h_plot_2d(tokens); return(0);
+} else return(1); 
+}
+
+/* methode */
+void PAWExecutor::reset(vector<string>& tokens)
+// Reset d'histogrammes, vecteurs et matrices
+{
+if(tokens.size() < 1)
+  {cout<<"Usage: reset nameobj"<<endl;
+  return;}
+NamedObjMgr omg;
+AnyDataObj* mobj = omg.GetObj(tokens[0]);
+if(mobj == NULL)
+  {cout<<"PAWExecutor::reset Error , Pas d'objet de nom "<<tokens[0]<<endl;
+   return;}
+string ctyp = typeid(*mobj).name();
+
+if(typeid(*mobj)==typeid(Vector))       {Vector*  ob=(Vector*) mobj; ob->Zero();}
+else if(typeid(*mobj)==typeid(Matrix))  {Matrix*  ob=(Matrix*) mobj; ob->Zero();}
+else if(typeid(*mobj)==typeid(Histo))   {Histo*   ob=(Histo*)  mobj; ob->Zero();}
+else if(typeid(*mobj)==typeid(HProf))   {HProf*   ob=(HProf*)  mobj; ob->Zero();}
+else if(typeid(*mobj)==typeid(Histo2D)) {Histo2D* ob=(Histo2D*)mobj; ob->Zero();}
+else {
+  cout<<"PAWExecutor::reset Error , No reset possible on "<<ctyp<<endl;
+  return;
+}
+
+return;
+}
+
+/* methode */
+void PAWExecutor::n_plot(vector<string>& tokens)
+// Equivalent n/plot de paw
+// Plot 1D
+//   n/plot nameobj.x_exp [cut] [w_exp] [gratt]
+// Plot 2D (plot2dw)
+//   n/plot nameobj.y_exp%x_exp [cut] [w_exp] [gratt]
+// Plot 3D (plot3d)
+//   n/plot nameobj.z_exp%y_exp%x_exp [cut] [gratt]
+{
+if(tokens.size() < 1) {
+  cout
+  <<"Usage: n/plot nameobj.[z_exp%y_exp%]x_exp [cut] [w_exp] [gratt]"<<endl
+  <<"       n/plot nameobj.z_exp%y_exp%x_exp [cut] [gratt]"<<endl;
+  return;
+}
+string nameobj,expx,expy,expz;
+int nvar = decodepawstring(tokens[0],nameobj,expx,expy,expz);
+string expcut = "1";
+string expwt = "1.";
+string dopt = "";
+string loop = "";
+if(tokens.size()>=2) expcut = tokens[1];
+if(tokens.size()>=3) expwt  = tokens[2];
+if(tokens.size()>=4) dopt   = tokens[3];
+
+
+NamedObjMgr omg;
+Services2NObjMgr* srvo = omg.GetServiceObj();
+
+if(nvar<=0) {
+  cout<<"PAWExecutor::n_plot Error: bad coding "<<tokens[0]<<endl;
+} else if(nvar==1) { // c'est un plot 1D
+  string nameproj = "/autoc/paw_n_plot1D";
+  AnyDataObj* mobj = omg.GetObj(nameproj);
+  if(mobj!=NULL) omg.DelObj(nameproj);
+  srvo->ProjectH1(nameobj,expx,expwt,expcut,nameproj,dopt,loop);
+} else if(nvar==2) { // c'est un plot 2D
+  srvo->DisplayPoints2DW(nameobj,expx,expy,expwt,expcut,dopt,loop);
+} else {             // c'est un plot 3D
+  srvo->DisplayPoints3D(nameobj,expx,expy,expz,expcut,dopt,loop);
+}
+
+return;
+}
+
+/* methode */
+void PAWExecutor::n_proj(vector<string>& tokens)
+// Equivalent n/proj de paw
+// Project NTuple in histogram a la paw
+// Dans un Histo 1D
+//   n/proj nameproj nameobj.x_exp [cut] [w_exp] [gratt]
+// Dans un Histo 2D ou un HProf (dans ce cas nameproj doit etre cree).
+//   n/proj nameproj nameobj.y_exp%x_exp [cut] [w_exp] [gratt]
+{
+if(tokens.size()<2)
+  {cout<<"Usage: n/proj nameproj nameobj.[y_exp%]x_exp [cut] [w_exp] [gratt]"<<endl;
+  return;}
+string nameproj = tokens[0];
+string nameobj,expx,expy,expz;
+int nvar = decodepawstring(tokens[1],nameobj,expx,expy,expz);
+string expcut = "1";
+string expwt = "1.";
+string dopt = "";
+string loop = "";
+if(tokens.size()>=3) expcut = tokens[2];
+if(tokens.size()>=4) expwt  = tokens[3];
+if(tokens.size()>=5) dopt   = tokens[4];
+
+NamedObjMgr omg;
+Services2NObjMgr* srvo = omg.GetServiceObj();
+
+if(nvar<=0) {
+  cout<<"PAWExecutor::n_proj Error: bad coding "<<tokens[1]<<endl;
+} else if(nvar==1) {
+  // c'est une projection dans un histo 1D
+  srvo->ProjectH1(nameobj,expx,expwt,expcut,nameproj,dopt,loop);
+} else {
+  // c'est une projection dans un histo2D
+  // OU un HProf si nameproj est HProf un deja defini
+  AnyDataObj* mobj = omg.GetObj(nameproj);
+  if(mobj==NULL)
+    srvo->ProjectH2(nameobj,expx,expy,expwt,expcut,nameproj,dopt,loop);
+  else if(dynamic_cast<HProf*>(mobj))
+    srvo->ProjectHProf(nameobj,expx,expy,expwt,expcut,nameproj,dopt,loop);
+  else
+    srvo->ProjectH2(nameobj,expx,expy,expwt,expcut,nameproj,dopt,loop);
+}
+
+return;
+}
+
+/* methode */
+void PAWExecutor::h_integ(vector<string>& tokens)
+// Pour remplacer le contenu d'un histo 1D par son integrale
+{
+if(tokens.size()<1)
+  {cout<<"Usage: h/integ nameh1d [norm]"<<endl; return;}
+NamedObjMgr omg;
+AnyDataObj* mobj = omg.GetObj(tokens[0]);
+if(mobj==NULL)
+  {cout<<"PAWExecutor::h_integ Error: unknow object"<<tokens[0]<<endl;
+  return;}
+double norm = 1.;
+if(tokens.size()>=2) norm = atof(tokens[1].c_str());
+Histo* h1 = dynamic_cast<Histo*>(mobj);
+// Le HProf se fait tout seul avec Histo: dynamic_cast<Histo*>(HProf)=Vrai!
+//HProf* hp = dynamic_cast<HProf*>(mobj);
+if(h1)      h1->HInteg(norm);
+//else if(hp) hp->HInteg(norm);
+else cout<<"PAWExecutor::h_integ Error: "<<tokens[0]<<" not an Histo/HProf"<<endl;
+}
+
+/* methode */
+void PAWExecutor::h_deriv(vector<string>& tokens)
+// Pour remplacer le contenu d'un histo 1D par sa derivee
+{
+if(tokens.size()<1)
+  {cout<<"Usage: h/deriv nameh1d"<<endl; return;}
+NamedObjMgr omg;
+AnyDataObj* mobj = omg.GetObj(tokens[0]);
+if(mobj==NULL)
+  {cout<<"PAWExecutor::h_deriv Error: unknow object"<<tokens[0]<<endl;
+  return;}
+Histo* h1 = dynamic_cast<Histo*>(mobj);
+//HProf* hp = dynamic_cast<HProf*>(mobj);
+if(h1)      h1->HDeriv();
+//else if(hp) hp->HDeriv();
+else cout<<"PAWExecutor::h_deriv Error: "<<tokens[0]<<" not an Histo/HProf"<<endl;
+}
+
+/* methode */
+void PAWExecutor::h_rebin(vector<string>& tokens)
+// Pour re-binner un histogramme 1D
+{
+if(tokens.size()<2)
+  {cout<<"Usage: h/rebin nameh1d nbin"<<endl; return;}
+NamedObjMgr omg;
+AnyDataObj* mobj = omg.GetObj(tokens[0]);
+if(mobj==NULL)
+  {cout<<"PAWExecutor::h_rebin Error: unknow object"<<tokens[0]<<endl;
+  return;}
+int nbin = atoi(tokens[1].c_str());
+Histo* h1 = dynamic_cast<Histo*>(mobj);
+//HProf* hp = dynamic_cast<HProf*>(mobj);
+if(h1)      h1->HRebin(nbin);
+//else if(hp) hp->HRebin(nbin);
+else cout<<"PAWExecutor::h_rebin Error: "<<tokens[0]<<" not an Histo/HProf"<<endl;
+}
+
+/* methode */
+void PAWExecutor::h_cadd(vector<string>& tokens)
+// Additionne une constante a un histogramme
+{
+if(tokens.size()<2)
+  {cout<<"Usage: h/cadd nameh1d val"<<endl; return;}
+NamedObjMgr omg;
+AnyDataObj* mobj = omg.GetObj(tokens[0]);
+if(mobj==NULL)
+  {cout<<"PAWExecutor::h_cadd Error: unknow object"<<tokens[0]<<endl;
+  return;}
+double val = atof(tokens[1].c_str());
+Histo*   h1 = dynamic_cast<Histo*>(mobj);
+Histo2D* h2 = dynamic_cast<Histo2D*>(mobj);
+if(h1)      *h1 += val;
+else if(h2) *h2 += val;
+else cout<<"PAWExecutor::h_cadd Error: "<<tokens[0]<<" not an Histo/HProf/Histo2D"<<endl;
+}
+
+/* methode */
+void PAWExecutor::h_cmult(vector<string>& tokens)
+// Multiplie un histogramme par une constante
+{
+if(tokens.size()<2)
+  {cout<<"Usage: h/cmult nameh1d val"<<endl; return;}
+NamedObjMgr omg;
+AnyDataObj* mobj = omg.GetObj(tokens[0]);
+if(mobj==NULL)
+  {cout<<"PAWExecutor::h_cmult Error: unknow object"<<tokens[0]<<endl;
+  return;}
+double val = atof(tokens[1].c_str());
+Histo*   h1 = dynamic_cast<Histo*>(mobj);
+Histo2D* h2 = dynamic_cast<Histo2D*>(mobj);
+if(h1)      *h1 *= val;
+else if(h2) *h2 *= val;
+else cout<<"PAWExecutor::h_cmult Error: "<<tokens[0]
+         <<" not an Histo/HProf/Histo2D"<<endl;
+}
+
+/* methode */
+void PAWExecutor::h_plot_2d(vector<string>& tokens)
+// plot for 2D histogramme: plot histo, bandx/y, slicex/y or projx/y
+{
+if(tokens.size()<2)
+  {cout<<"Usage: h/plot/2d nameh2d to_plot [n/s] [dopt]"<<endl; return;}
+NamedObjMgr omg;
+AnyDataObj* mobj = omg.GetObj(tokens[0]);
+if(mobj==NULL)
+  {cout<<"PAWExecutor::h_plot_2d Error: unknow object"<<tokens[0]<<endl;
+  return;}
+Histo2D* h2 = dynamic_cast<Histo2D*>(mobj);
+if(!h2)
+  {cout<<"PAWExecutor::h_plot_2d Error: "<<tokens[0]<<" not an Histo2D"<<endl;
+  return;}
+
+Histo* h1p = NULL; string nametoplot = "/autoc/h_plot_2d_h1";
+AnyDataObj* mobjh1 = omg.GetObj(nametoplot);
+if(mobjh1!=NULL) omg.DelObj(nametoplot);
+
+string dopt = ""; if(tokens.size()>=3) dopt = tokens[2];
+if(tokens[1] == "show") {
+  h2->ShowProj();
+  h2->ShowBand(2);
+  h2->ShowSli(2);
+  return;
+} else if(tokens[1] == "h") {
+  nametoplot = tokens[0];
+} else if(tokens[1] == "px") {  
+  if((h1p=h2->HProjX())) {Histo* h1=new Histo(*h1p); omg.AddObj(h1,nametoplot);}
+    else {h2->ShowProj(); return;}
+} else if(tokens[1] == "py") {
+  if((h1p=h2->HProjY())) {Histo* h1=new Histo(*h1p); omg.AddObj(h1,nametoplot);}
+    else {h2->ShowProj(); return;}
+} else {
+  if(tokens.size()<3)
+    {cout<<"Usage: h/plot/2d nameh2d bx/by/sx/sy n [dopt]"<<endl; return;}
+  int n = atoi(tokens[2].c_str());
+  dopt = ""; if(tokens.size()>=4) dopt = tokens[3];
+  if(tokens[1] == "bx") {
+    if((h1p=h2->HBandX(n))) {Histo* h1=new Histo(*h1p); omg.AddObj(h1,nametoplot);}
+    else {h2->ShowBand(); return;}
+  } else if(tokens[1] == "by") {
+    if((h1p=h2->HBandY(n))) {Histo* h1=new Histo(*h1p); omg.AddObj(h1,nametoplot);}
+    else {h2->ShowBand(); return;}
+  } else if(tokens[1] == "sx") {
+    if((h1p=h2->HSliX(n))) {Histo* h1=new Histo(*h1p); omg.AddObj(h1,nametoplot);}
+    else {h2->ShowSli(); return;}
+  } else if(tokens[1] == "sy") {
+    if((h1p=h2->HSliY(n))) {Histo* h1=new Histo(*h1p); omg.AddObj(h1,nametoplot);}
+    else {h2->ShowSli(); return;}
   }
-else return(1); 
-}
+}
+
+omg.DisplayObj(nametoplot,dopt);
+}
+
+/* methode */
+int PAWExecutor::decodepawstring(string tokens,string& nameobj
+                                ,string& xexp,string& yexp,string& zexp)
+// Decodage general de "nameobj.xexp"
+//                     "nameobj.yexp%xexp"
+//                     "nameobj.zexp%yexp%xexp"
+// Return: nombre de variables trouvees, -1 si probleme
+{
+nameobj = ""; xexp= ""; yexp= ""; zexp= "";
+
+int lt = (int) tokens.length();
+if(lt<=0) return -1;
+
+// decodage de la chaine de type PAW.
+char *str = new char[lt+2];
+strcpy(str,tokens.c_str()); strip(str,'B',' '); lt = strlen(str);
+//cout<<"chaine1["<<lt<<"] :"<<str<<":"<<endl;
+char *c[3] = {NULL,NULL,NULL};
+int i, np=0; bool namefound = false;
+for(int i=0;i<lt;i++) {
+  if(!namefound && str[i]=='.') {
+    str[i]='\0';
+    namefound=true;
+    c[np] = str+i+1; np++;
+  }
+  if( namefound && str[i]=='%') {
+    str[i]='\0';
+    if(np<3) {c[np] = str+i+1; np++;}
+  }
+}
+//cout<<"chaine2 :"; for(i=0;i<lt;i++) cout<<str[i]; cout<<":"<<endl;
+
+// Remplissage du nom et des variables
+nameobj = str;
+if(np==1)  xexp=c[0];
+if(np==2) {yexp=c[0]; xexp=c[1];}
+if(np==3) {zexp=c[0]; yexp=c[1]; xexp=c[2];}
+//cout<<"pawstring str,c[0-2] "<<str<<" "<<c[0]<<" "<<c[1]<<" "<<c[2]<<endl;
+delete [] str;
+
+// Comptage des variables
+np = -1;
+if(nameobj.length()>0) 
+  {np = 0; if(xexp.length()>0)
+             {np++; if(yexp.length()>0)
+                      {np++; if(zexp.length()>0) np++;}}}
+cout<<"pawstring["<<np<<"] name="<<nameobj
+    <<" xexp="<<xexp<<" yexp="<<yexp<<" zexp="<<zexp<<endl;
+return np;
+}
Index: trunk/SophyaPI/PIext/pawexecut.h
===================================================================
--- trunk/SophyaPI/PIext/pawexecut.h	(revision 463)
+++ trunk/SophyaPI/PIext/pawexecut.h	(revision 466)
@@ -20,7 +20,17 @@
   virtual int      Execute(string& keyw, vector<string>& args);
 protected:
+  void reset(vector<string>& tokens);
+  void n_plot(vector<string>& tokens);
+  void n_proj(vector<string>& tokens);
+  void h_integ(vector<string>& tokens);
+  void h_deriv(vector<string>& tokens);
+  void h_rebin(vector<string>& tokens);
+  void h_cadd(vector<string>& tokens);
+  void h_cmult(vector<string>& tokens);
+  void h_plot_2d(vector<string>& tokens);
+  int  decodepawstring(string tokens,string& nameobj
+                      ,string& xexp,string& yexp,string& zexp);
   PIStdImgApp* mApp;
 };
 
 #endif
-
Index: trunk/SophyaPI/PIext/piafitting.cc
===================================================================
--- trunk/SophyaPI/PIext/piafitting.cc	(revision 463)
+++ trunk/SophyaPI/PIext/piafitting.cc	(revision 466)
@@ -54,11 +54,17 @@
 
 ////////////////////////////////////////////////////////////////////////
+// --- Generation automatique du "usage" pour helpfit:
+// 1-/ copier le texte ci-dessous de piafitting.cc dans toto
+// 2-/ cat toto | sed 's?^//?usage+="\\n?' | sed 's?$?    ";?'
+// NE PAS EFFACER LA SUITE: c'est elle qui doit etre modifiee,
+// le usage du helpfit sera regenere a l'aide des commandes ci-dessus.
+////////////////////////////////////////////////////////////////////////
 //| --------------- Fit Lineaire a 1 et 2 dimensions ---------------
 //| Syntaxe:
 //| fitlin nom pnn [o:.aa,bb,cc, o;dd,ee,ff o:gg,hh,jj,kk etc...]
 //| avec:
-//| nom  : cf commentaire ordre "fit"
+//| nom  : cf commentaire ordre ''fit''
 //| pnn  : fit polynome degre nn avec classe Poly (lineaire) 1D ou 2D
-//| o:aa,...,bb : cf commentaires ordre "fit"
+//| o:aa,...,bb : cf commentaires ordre ''fit''
 //|
 ////////////////////////////////////////////////////////////////////////
@@ -69,5 +75,5 @@
 //|     [p:p1,p2,...,pn s:s1,s2,...,sn m:m1,m2,...,mn M:M1,mM2,...,Mn f:f1,...,fn]
 //|     [o:.aa,bb,cc, o;dd,ee,ff o:gg,hh,jj,kk etc...]
-//| cf commentaire ordre "fit"
+//| cf commentaire ordre ''fit''
 //|
 ////////////////////////////////////////////////////////////////////////
@@ -109,16 +115,16 @@
 //|
 //|----- OPTIONS -----
-//| o    : options "o:Eaa.b,eaa.b,f,r,caa.b,Xaa.b"
+//| o    : options ''o:Eaa.b,eaa.b,f,r,caa.b,Xaa.b''
 //|      F : initialisation a partir des resultats et de l'etat du fit precedent
 //|          (option non prioritaire sur les definitions p:,s:,m:,M:,f:o:)
 //|      a : initialisation automatique des parametres du fit (si disponible)
 //|          (option non prioritaire sur les definitions p:,s:,m:,M:,f:o:
-//|           et sur l'initialisation pa l'option "F")
+//|           et sur l'initialisation pa l'option ''F'')
 //|      f : generation d'un Objet identique contenant la fonction fittee
 //|      r : generation d'un Objet identique contenant les residus
 //|      Xaa.b : aa.b valeur du DXi2 d'arret (def=1.e-3)
 //|      Naa : aa nombre maximum d'iterations (def=100)
-//|      la : niveau "a" de print: a=niveau de print Fit1/2D
-//|      da : niveau "a" de debug: a=niveau de GeneralFit
+//|      la : niveau ''a'' de print: a=niveau de print Fit1/2D
+//|      da : niveau ''a'' de debug: a=niveau de GeneralFit
 //|      Ii1/i2 : numeros des bins X de l'histos utilises pour le fit [i1,i2]
 //|2D    Jj1/j2 : numeros des bins Y de l'histos utilises pour le fit [j1,j2]
@@ -137,5 +143,5 @@
 //|          Actif pour  exp+poly 1D, poly 1D
 //|          Pour gauss+poly 1D, xc est le centre de la gaussienne.
-//|2D    yaa.b et y : idem "xaa.b et x" mais pour y
+//|2D    yaa.b et y : idem ''xaa.b et x'' mais pour y
 //|
 ////////////////////////////////////////////////////////////////////////
@@ -156,8 +162,8 @@
 //|            double gauss2_der(double const* x,double const* p,double* dp)
 //|     ou dp[i] = dF(x[];p[])/dp[i]
-//|     Par convention, cette fonction a le meme nom suivi de "_der"
+//|     Par convention, cette fonction a le meme nom suivi de ''_der''
 //| > crfitfun nom_fichier nom_fonction nvar npar
-//|     Permet de compiler le fichier "nom_fichier" et de linker
-//|     la fonction "nom_fonction"
+//|     Permet de compiler le fichier ''nom_fichier'' et de linker
+//|     la fonction ''nom_fonction''
 //|   - Un meme fichier peut contenir plusieurs fonctions a fitter
 //|
@@ -184,5 +190,119 @@
 
 // enregistrement des ordres de fit
-string kw, usage;
+string kw, usage, grp = "Fitting";
+
+kw = "helpfit";
+usage="";
+usage+="\n//////////////////////////////////////////////////////////////////////    ";
+usage+="\n| --------------- Fit Lineaire a 1 et 2 dimensions ---------------    ";
+usage+="\n| Syntaxe:    ";
+usage+="\n| fitlin nom pnn [o:.aa,bb,cc, o;dd,ee,ff o:gg,hh,jj,kk etc...]    ";
+usage+="\n| avec:    ";
+usage+="\n| nom  : cf commentaire ordre ''fit''    ";
+usage+="\n| pnn  : fit polynome degre nn avec classe Poly (lineaire) 1D ou 2D    ";
+usage+="\n| o:aa,...,bb : cf commentaires ordre ''fit''    ";
+usage+="\n|    ";
+usage+="\n//////////////////////////////////////////////////////////////////////    ";
+usage+="\n| --------------- Fit d'objets a 1 et 2 dimensions ---------------    ";
+usage+="\n|                 avec interface d'aide graphique    ";
+usage+="\n| Syntaxe:    ";
+usage+="\n| fitw nom func    ";
+usage+="\n|     [p:p1,p2,...,pn s:s1,s2,...,sn m:m1,m2,...,mn M:M1,mM2,...,Mn f:f1,...,fn]    ";
+usage+="\n|     [o:.aa,bb,cc, o;dd,ee,ff o:gg,hh,jj,kk etc...]    ";
+usage+="\n| cf commentaire ordre ''fit''    ";
+usage+="\n|    ";
+usage+="\n//////////////////////////////////////////////////////////////////////    ";
+usage+="\n| --------------- Fit d'objets a 1 et 2 dimensions ---------------    ";
+usage+="\n| Syntaxe:    ";
+usage+="\n| fit nom func    ";
+usage+="\n|     [p:p1,p2,...,pn s:s1,s2,...,sn m:m1,m2,...,mn M:M1,mM2,...,Mn f:f1,...,fn]    ";
+usage+="\n|     [o:.aa,bb,cc, o;dd,ee,ff o:gg,hh,jj,kk etc...]    ";
+usage+="\n|----- OBJET -----    ";
+usage+="\n| nom  : nom de l'objet qui peut etre:    ";
+usage+="\n|        fit-1D:  Vector,Histo1D,HProf ou GeneraFitData(1D)    ";
+usage+="\n|        fit-2D:  Matrix,Histo2D,Image<T> ou GeneraFitData(2D)    ";
+usage+="\n|    ";
+usage+="\n|----- FUNCTION -----    ";
+usage+="\n| func : pnn : fit polynome degre nn avec GeneralFit (non-lineaire) 1D ou 2D    ";
+usage+="\n|      : gnn : fit gaussienne (hauteur) + polynome de degre nn 1D    ";
+usage+="\n|      : g   : fit gaussienne (hauteur) 1D    ";
+usage+="\n|      : enn : fit exponentielle + polynome de degre nn 1D    ";
+usage+="\n|      : e   : fit exponentielle 1D    ";
+usage+="\n|      : Gnn : fit gaussienne (volume) + polynome de degre nn 1D    ";
+usage+="\n|      : G   : fit gaussienne (volume) 1D    ";
+usage+="\n|      :     : fit gaussienne+fond (volume) 2D    ";
+usage+="\n|      : Gi  : fit gaussienne+fond integree (volume) 2D    ";
+usage+="\n|      : d   : fit DL de gaussienne+fond (volume) 2D    ";
+usage+="\n|      : di  : fit DL de gaussienne+fond integree (volume) 2D    ";
+usage+="\n|      : D   : fit DL de gaussienne+fond avec coeff variable p6 (volume) 2D    ";
+usage+="\n|      : Di  : fit DL de gaussienne+fond integree avec coeff variable p6 (volume) 2D    ";
+usage+="\n|      : M   : fit Moffat+fond (expos=p6) (volume) 2D    ";
+usage+="\n|      : Mi  : fit Moffat+fond integree (expos=p6) (volume) 2D    ";
+usage+="\n|      : Autre : fonction definie par l'utilisateur (cf commentaires ci apres)    ";
+usage+="\n|    ";
+usage+="\n|----- INIT PARAMETRES ET ETAT DU FIT -----    ";
+usage+="\n| p    : p1,...,pn : valeur d'initialisation des parametres (def=0)    ";
+usage+="\n| s    : s1,...,sn : valeur des steps de depart (def=1)    ";
+usage+="\n| m    : m1,...,mn : valeur des minima (def=1)    ";
+usage+="\n| M    : M1,...,Mn : valeur des maxima (def=-1) (max<=min : pas de limite)    ";
+usage+="\n| f    : f1,...,fn : si >=1 parametre fixe sinon libre (def=0)    ";
+usage+="\n| - Remarque: si pi,si,mi ou Mi = '!' la valeur correspondante n'est pas changee    ";
+usage+="\n|    ";
+usage+="\n|----- OPTIONS -----    ";
+usage+="\n| o    : options ''o:Eaa.b,eaa.b,f,r,caa.b,Xaa.b''    ";
+usage+="\n|      F : initialisation a partir des resultats et de l'etat du fit precedent    ";
+usage+="\n|          (option non prioritaire sur les definitions p:,s:,m:,M:,f:o:)    ";
+usage+="\n|      a : initialisation automatique des parametres du fit (si disponible)    ";
+usage+="\n|          (option non prioritaire sur les definitions p:,s:,m:,M:,f:o:    ";
+usage+="\n|           et sur l'initialisation pa l'option ''F'')    ";
+usage+="\n|      f : generation d'un Objet identique contenant la fonction fittee    ";
+usage+="\n|      r : generation d'un Objet identique contenant les residus    ";
+usage+="\n|      Xaa.b : aa.b valeur du DXi2 d'arret (def=1.e-3)    ";
+usage+="\n|      Naa : aa nombre maximum d'iterations (def=100)    ";
+usage+="\n|      la : niveau ''a'' de print: a=niveau de print Fit1/2D    ";
+usage+="\n|      da : niveau ''a'' de debug: a=niveau de GeneralFit    ";
+usage+="\n|      Ii1/i2 : numeros des bins X de l'histos utilises pour le fit [i1,i2]    ";
+usage+="\n|2D    Jj1/j2 : numeros des bins Y de l'histos utilises pour le fit [j1,j2]    ";
+usage+="\n|    - L'erreur est celle associee a l'objet (si elle existe),    ";
+usage+="\n|      elle est mise a 1 sinon, sauf si E... ou e... est precise:    ";
+usage+="\n|      Eaa.b : si |val|>=1 erreur = aa.b*sqrt(|val|)    ";
+usage+="\n|              si |val|<1  erreur = aa.b    ";
+usage+="\n|              si aa.b <=0 alors aa.b=1.0    ";
+usage+="\n|              E seul est equivalent a E1.0    ";
+usage+="\n|      eaa.b : erreur = aa.b    ";
+usage+="\n|              si aa.b <=0 alors aa.b=1.0    ";
+usage+="\n|              e seul est equivalent a e1.0    ";
+usage+="\n|      xaa.b : demande de centrage: on fit x-aa.b au lieu de x)    ";
+usage+="\n|      x : demande de centrage: on fit x-xc au lieu de x    ";
+usage+="\n|          avec xc=abscisse du milieu de l'histogramme    ";
+usage+="\n|          Actif pour  exp+poly 1D, poly 1D    ";
+usage+="\n|          Pour gauss+poly 1D, xc est le centre de la gaussienne.    ";
+usage+="\n|2D    yaa.b et y : idem ''xaa.b et x'' mais pour y    ";
+usage+="\n|    ";
+usage+="\n//////////////////////////////////////////////////////////////////////    ";
+usage+="\n| --------------- Def des fcts de fit par l'utilisateur ---------------    ";
+usage+="\n| Pour definir une fonction parametree utilisateur:    ";
+usage+="\n| Un exemple de fichier contenant des fonctions a fitter: PIext/userfitfunex.c    ";
+usage+="\n| > crfitfil nom_fichier nom_fonction nvar npar    ";
+usage+="\n|     pour creer un squelette de fichier C contenant la fonction a fitter    ";
+usage+="\n|            nom_fichier : nom du fichier ou est le code de la fonction    ";
+usage+="\n|                          c'est un fichier C de nom blabla.c    ";
+usage+="\n|            nom_fonction : nom de la fonction ex: gauss2    ";
+usage+="\n|            nvar : nombre de variables x[] (1D=1, 2D=2, etc...)    ";
+usage+="\n|            npar : nombre de parametre p[]    ";
+usage+="\n|   - La fonction est donc F(x[];p[]), soit par ex:    ";
+usage+="\n|            double gauss2(double const* x,double const* p)    ";
+usage+="\n|   - L'utilisateur a la possibilite de donner egalement la fonction    ";
+usage+="\n|     retournant les derivees de la fonction par rapport aux parametres    ";
+usage+="\n|            double gauss2_der(double const* x,double const* p,double* dp)    ";
+usage+="\n|     ou dp[i] = dF(x[];p[])/dp[i]    ";
+usage+="\n|     Par convention, cette fonction a le meme nom suivi de ''_der''    ";
+usage+="\n| > crfitfun nom_fichier nom_fonction nvar npar    ";
+usage+="\n|     Permet de compiler le fichier ''nom_fichier'' et de linker    ";
+usage+="\n|     la fonction ''nom_fonction''    ";
+usage+="\n|   - Un meme fichier peut contenir plusieurs fonctions a fitter    ";
+usage+="\n|    ";
+usage+="\n//////////////////////////////////////////////////////////////////////    ";
+piac->RegisterHelp(kw,usage,grp);
 
 kw = "fit";
@@ -190,5 +310,6 @@
 usage += "\n Usage: fit nomobj func [Options]";
 usage += "\n [p:p1,...,pn s:s1,...,sn m:m1,...,mn M:M1,...,Mn o:... o:...]";
-piac->RegisterCommand(kw,usage,this,"Fitting");
+usage += "\n  Related commands: fitw fitlin crfitfun crfitfil";  
+piac->RegisterCommand(kw,usage,this,grp);
 
 kw = "fitw";
@@ -196,20 +317,24 @@
 usage += "\n Usage: fitw nomobj func [Options]";
 usage += "\n [p:p1,...,pn s:s1,...,sn m:m1,...,mn M:M1,...,Mn o:... o:...]";
-piac->RegisterCommand(kw,usage,this,"Fitting");
+usage += "\n  Related commands: fit fitlin crfitfun crfitfil";  
+piac->RegisterCommand(kw,usage,this,grp);
 
 kw = "fitlin";
 usage = "Linear Fitting of Polynoms to DataObjects";
 usage += "\n Usage: fitlin nomobj func [o:... o:...]";
-piac->RegisterCommand(kw,usage,this,"Fitting");
+usage += "\n  Related commands: fit fitw crfitfun crfitfil";  
+piac->RegisterCommand(kw,usage,this,grp);
 
 kw = "crfitfun";
 usage = "Creation et link de function utilisateur pour le fit";
 usage += "\n Usage: crfitfun file func nvar npar";
-piac->RegisterCommand(kw,usage,this,"Fitting");
+usage += "\n  Related commands: fit fitw fitlin crfitfil";  
+piac->RegisterCommand(kw,usage,this,grp);
 
 kw = "crfitfil";
 usage = "Creation de fichier C pour function utilisateur du fit";
 usage += "\n Usage: crfitfil file func nvar npar";
-piac->RegisterCommand(kw,usage,this,"Fitting");
+usage += "\n  Related commands: fit fitw fitlin crfitfun";  
+piac->RegisterCommand(kw,usage,this,grp);
 }
 
Index: trunk/SophyaPI/PIext/servnobjm.cc
===================================================================
--- trunk/SophyaPI/PIext/servnobjm.cc	(revision 463)
+++ trunk/SophyaPI/PIext/servnobjm.cc	(revision 466)
@@ -199,5 +199,5 @@
   if (nom.length() < 1) {
      titre = "Function f(x)";
-     nom = "/func/f_x";
+     nom = "/autoc/f_x";
     }
   else titre = nom;
@@ -261,5 +261,5 @@
   if (nom.length() < 1) {
      titre = "Function f(x,y)";
-     nom = "/func/f2d_xy";
+     nom = "/autoc/f2d_xy";
     }
   else titre = nom;
@@ -485,5 +485,5 @@
   double xmin, xmax, ymin, ymax;
   nt->GetMinMax(0, xmin, xmax);
-  nt->GetMinMax(0, ymin, ymax);
+  nt->GetMinMax(1, ymin, ymax);
   h2 = new Histo2D(xmin, xmax, 50, ymin, ymax, 50);
   int k;
