Index: /trunk/SophyaPI/PI/lut.h
===================================================================
--- /trunk/SophyaPI/PI/lut.h	(revision 3291)
+++ /trunk/SophyaPI/PI/lut.h	(revision 3292)
@@ -12,5 +12,5 @@
 // et de 1 a nLevel pour min<=x<max
 
-// Type de lut possibles (Seul Lineaire implemente 05/95
+// Type de lut possibles 
 enum {kLutType_Lin=1, kLutType_Log=2, kLutType_Sqrt=3, kLutType_Square=4};
 
Index: /trunk/SophyaPI/PI/parradapter.cc
===================================================================
--- /trunk/SophyaPI/PI/parradapter.cc	(revision 3291)
+++ /trunk/SophyaPI/PI/parradapter.cc	(revision 3292)
@@ -250,5 +250,8 @@
 
 /* --Methode-- */
-void P2DArrayAdapter::ComputeLut_PicHisto(double& min, double& max, int nbsig, double fracmax)
+void P2DArrayAdapter::ComputeLut_PicHisto(double& min, double& max, bool htail, 
+					  double nbsig, double fracmax)
+// htail = true --> on vire le pic et on garde la queue de l'histo
+// htail = false --> on garde le pic le l'histo 
 {
 // TIMEF ; 
@@ -258,5 +261,5 @@
 int nbin = sX*sY/10;
 nbin = (nbin < MINNBIN) ? MINNBIN : ((nbin > MAXNBIN) ? MAXNBIN : nbin );
-int vitesse = sX*sY / 20000;
+int vitesse = sX*sY / 50000;
 vitesse = (vitesse < 1) ? 1 : ((vitesse > 25) ? 25 : vitesse );
 
@@ -331,14 +334,15 @@
 q = phis+binmax;
 while ( ((*q) > hmin) && (sigr < (nbin-binmax)) )  { sigr++;  q++; }
+if (sigr < 1) sigr = 1.;
 int sigl = 0;
 q = phis+binmax;
 while ( ((*q) > hmin) && (sigl < binmax) )  { sigl++; q--; }
-
-
-if (nbsig == 0) nbsig = 1;
-if (nbsig < 0)  {  /*   On considere le cas ou NbSigmas est negatif   */
-  if ( (bin = binmax+nbsig*sigl) < 0 )  bin = 0;
+if (sigl < 1) sigl = 1.;
+
+if (nbsig <= 0.) nbsig = 1.;
+if (htail == false)  {  /*   On recherche le min/max autour du pic de l'histo  */
+  if ( (bin = binmax-(nbsig*sigl)) < 0 )  bin = 0;
   min = minhis + (double)bin*binwidth;
-  if ( (bin = binmax-nbsig*sigr) >= nbin ) bin = nbin-1;
+  if ( (bin = binmax+(nbsig*sigr)) >= nbin ) bin = nbin-1;
   max = minhis + (double)bin*binwidth;
   if (max < (min+MINDYNAMIC))  max = min+MINDYNAMIC;
@@ -346,6 +350,6 @@
   }
 
-// NbSigma positif 
-if ( (bin = binmax+nbsig*sigl) >= nbin ) {
+//  On recherche le min/max en supprimant le pic de l'histo  (la queue, > pic)
+if ( (bin = binmax+(nbsig*sigl)) >= nbin ) {
   min = minhis + binmax*binwidth;
   max = maxhis;
Index: /trunk/SophyaPI/PI/parradapter.h
===================================================================
--- /trunk/SophyaPI/PI/parradapter.h	(revision 3291)
+++ /trunk/SophyaPI/PI/parradapter.h	(revision 3292)
@@ -83,5 +83,6 @@
   virtual int     CheckDyn(double& min, double& max, double& moy, double& sig, int& nbnul, int& nbsat, int vit=10);
 //    Calcul AutoLut
-  virtual void    ComputeLut_PicHisto(double& min, double& max, int nbsig=1, double fracmax=0.95);
+  virtual void    ComputeLut_PicHisto(double& min, double& max, bool htail, 
+				      double nbsig=1., double fracmax=0.95);
 
 //    Calcul pixmap avec un LUT
Index: /trunk/SophyaPI/PI/piimage.cc
===================================================================
--- /trunk/SophyaPI/PI/piimage.cc	(revision 3291)
+++ /trunk/SophyaPI/PI/piimage.cc	(revision 3292)
@@ -55,5 +55,5 @@
 //	* <Alt>+ <Cntl>+ : Augmentation du facteur de zoom
 //	* <Alt>- <Cntl>- : Diminution du facteur de zoom
-//	* Touches Curseurs : déplace la pavé.
+//	* Touches Curseurs : déplace le pavé.
 //--
 //++
@@ -148,5 +148,5 @@
 AddDrawer(mdrw, true, false, false, false);
 
-SetLut(-9.e19, 9.e19, kLutType_Lin, 0, false);
+SetLut(AutoLut_No, -9.e19, 9.e19, kLutType_Lin, 0, false);
 SetColMapId(CMAP_COLRJ32);
 // pour le copier-coller
@@ -262,9 +262,9 @@
 if (img)  {
 //  SetSize(img->XSize(), img->YSize());
+// Reza, Aout 2007 : SetLut par defaut passe a AutoLut MeanSigma a 2 sigmas
+// a l'occasion des corrections et nouveaux types de calculs d'autolut
   CenterPave();
-  double min=1., max=-1., moy, sig;
-  int nbnul, nbsat;
-  img->CheckDyn(min, max, moy, sig, nbnul, nbsat);
-  SetLut(min, max, kLutType_Lin, 1, refr);
+  double min=1., max=-1.;
+  SetLut(AutoLut_MeanSigma, min, max, kLutType_Lin, 2., refr);
   aisup = ad;
   }
@@ -415,6 +415,6 @@
 
 //++
-// SetLut(double min, double max, int typlut=kLutType_Lin, \
-//        int lauto=0, bool refr=true)
+// SetLut(AutoLutType alt, double min, double max, int typlut=kLutType_Lin, \
+//        double nsa=1., bool refr=true)
 //	Definit la LUT pour l'affichage
 //	Si "refr=="true", la fenetre est rafraichie
@@ -437,17 +437,46 @@
 
 /* --Methode-- */
-void PIImage::SetLut(double min, double max, int typlut, int lauto, bool refr)
-{
+void PIImage::SetLut(AutoLutType alt, double min, double max, int typlut, double nsa, bool refr)
+{
+t_al = alt; 
+if (alt != AutoLut_No) { 
+  min_al = min; max_al = max; ns_al = nsa;
+}
 if (lut) delete(lut);
-if (lauto && img) 
-  {
-  int nbsig = lauto;  
-  double fracmax = 1. - 0.05*nbsig;
-  int nbnul, nbsat;
-  double moy, sig;
-  img->CheckDyn(min, max, moy, sig, nbnul, nbsat);
-  img->ComputeLut_PicHisto(min, max, nbsig, fracmax);
-  }
-
+int nbnul, nbsat;
+double moy, sig, fracmax;
+double dmx, smin, smax;
+bool fgtail;
+
+switch (alt)
+{
+ case AutoLut_No :
+   if (min >= max)  img->CheckDyn(min, max, moy, sig, nbnul, nbsat);
+   break;
+ case AutoLut_MinMax :
+   min = 1.; max = -1.;  
+   img->CheckDyn(min, max, moy, sig, nbnul, nbsat);
+   if (max <= min) max = min+0.1*fabs(min);
+   if ((nsa <= 0.)||(nsa > 1.))  nsa = 1.;
+   dmx = (nsa-1.)*(max-min);
+   min = min+dmx;  max = max-dmx;
+   break; 
+ case AutoLut_MeanSigma :
+   img->CheckDyn(min, max, moy, sig, nbnul, nbsat);
+   smin = min, smax = max;
+   min = moy - nsa*sig;   max = moy + nsa*sig;
+   if (min < smin) min = smin;
+   if (max > smax) max = smax;
+   break;
+ case AutoLut_HistoPeak :
+ case AutoLut_HistoTail :
+   fracmax = 1.-0.05*nsa;
+   if (min >= max)  img->CheckDyn(min, max, moy, sig, nbnul, nbsat);
+   fgtail = (alt == AutoLut_HistoTail) ? true : false;
+   img->ComputeLut_PicHisto(min, max, fgtail, nsa, fracmax);
+   break;
+} 
+
+if (max <= min) max = min + 0.1*fabs(min);
 lut = new LUT(min, max, NbCol(), typlut);
 
@@ -461,4 +490,5 @@
 void PIImage::SetLut(LUT *clut, bool refr)
 {
+t_al = AutoLut_No;
 LUT * olut = lut;
 lut = new LUT(clut->Min(), clut->Max(), NbCol(), clut->Type());
@@ -593,5 +623,5 @@
       continue;
     }
-    // lut lineaire
+    // Changementr de lut - avec specification type de lut [et min/max] 
     if (opts.substr(0,4) == "lut=") {
       double min = Lut()->Min();
@@ -605,5 +635,29 @@
       else if (opts.substr(4,4) == "sqrt")  typlut=kLutType_Sqrt;
       else if (opts.substr(4,6) == "square")  typlut=kLutType_Square;
-      SetLut(min, max, typlut, 0, false);
+      SetLut(AutoLut_No, min, max, typlut, 0, false);
+      continue;
+    }
+    // Auto lut avec specification type auto-lut [et nb-sigmas] (Aout2007)
+    if (opts.substr(0,8) == "autolut=") {
+      double min = min_al;
+      double max = max_al;
+      int ctlut = Lut()->Type();
+      double pnsal = ns_al; 
+      size_t q = opts.find(',');
+      if (q < opts.length()-1) {
+	string suop = opts.substr(q+1);
+	size_t q2 = suop.find(','); 
+	if (q2 < suop.length()-1) 
+	  sscanf(suop.c_str(),"%lg,%lg,%lg",&pnsal,&min, &max);
+	else pnsal = atof( suop.c_str() );
+      }
+      AutoLutType palt = AutoLut_No;     
+      if (opts.substr(8,6) == "minmax")  palt = AutoLut_MinMax;
+      else if (opts.substr(8,7) == "meansig")  palt = AutoLut_MeanSigma;
+      else if (opts.substr(8,7) == "hispeak")  palt = AutoLut_HistoPeak;
+      else if (opts.substr(8,9) == "hispeak")  palt = AutoLut_HistoPeak;
+      else if (opts.substr(8,6) == "hispic")   palt = AutoLut_HistoPeak;
+      else if (opts.substr(8,7) == "histail")  palt = AutoLut_HistoTail;
+      if ( palt != AutoLut_No )  SetLut(palt, min_al, max_al, ctlut, pnsal, false);
       continue;
     }
@@ -627,4 +681,7 @@
   if ( ( optsz1-ndec > 0) && (img) ) {
     ndec2 = img->DecodeOptionString(opt, rmdecopt);
+    // On recalcule la LUT si on est en auto-lut, le contenu de l'image peut avoir change (Aout2007)
+    if ((ndec2 > 0) && (t_al != AutoLut_No))  
+      SetLut(t_al, min_al, max_al, Lut()->Type(), ns_al, false);
   }
   return(ndec+ndec2);
Index: /trunk/SophyaPI/PI/piimage.h
===================================================================
--- /trunk/SophyaPI/PI/piimage.h	(revision 3291)
+++ /trunk/SophyaPI/PI/piimage.h	(revision 3292)
@@ -20,7 +20,9 @@
 class PIDrwMgrMenu;
 
+enum AutoLutType { AutoLut_No=0, AutoLut_MinMax=1, AutoLut_MeanSigma=2, 
+		   AutoLut_HistoPeak=3, AutoLut_HistoTail=4}; 
+
 class PIImage : public PIPixmap
 {
-
 public:
   enum {ClassId = 5150};
@@ -53,6 +55,6 @@
 
 //  Gestion du choix de LUT, facteur d agrandissement, table de couleur
-  void SetLut(double min, double max, int typlut=kLutType_Lin,
-              int lauto=0, bool refr=true);
+  void SetLut(AutoLutType alt, double min, double max, int typlut=kLutType_Lin,
+              double nsa=1., bool refr=true);
   void SetLut(LUT *clut, bool refr=true);
 
@@ -155,4 +157,6 @@
   int xspxm, yspxm;
   LUT * lut;
+  AutoLutType t_al;   // Si AutoLut et le type lors du dernier appel a SetLut()
+  double min_al, max_al, ns_al; // Parametres nsa, min et max lors  du dernier appel a SetLut()
   int offx, offy;
   PIElDrawer* mdrw;
Index: /trunk/SophyaPI/PI/piimgtools.cc
===================================================================
--- /trunk/SophyaPI/PI/piimgtools.cc	(revision 3291)
+++ /trunk/SophyaPI/PI/piimgtools.cc	(revision 3292)
@@ -111,12 +111,16 @@
 cpx += spx+bsx; 
 mOpt[1] = new PIOptMenu(this, "imglut-opt-2", 1.5*bsx, bsy, cpx, cpy);
-mOpt[1]->AppendItem("+3 Sig", 1203);
-mOpt[1]->AppendItem("+2 Sig", 1202);
-mOpt[1]->AppendItem("+1 Sig", 1201);
+mOpt[1]->AppendItem("MeanMax", 1206);
+mOpt[1]->AppendItem("MeanMax90%", 1205);
+mOpt[1]->AppendItem("MeanMax70%", 1204);
+mOpt[1]->AppendItem("MeanSig 3", 1203);
+mOpt[1]->AppendItem("MeanSig 2", 1202);
+mOpt[1]->AppendItem("MeanSig 1", 1201);
 mOpt[1]->AppendItem("NoAuto", 1200);
-mOpt[1]->AppendItem("-1 Sig", 1199);
-mOpt[1]->AppendItem("-2 Sig", 1198);
-mOpt[1]->AppendItem("-3 Sig", 1197);
-mOpt[1]->SetValue(1202);
+mOpt[1]->AppendItem("HistoTail+1s", 1207);
+mOpt[1]->AppendItem("HistoTail+2s", 1208);
+mOpt[1]->AppendItem("HistoPeak+1s", 1209);
+mOpt[1]->AppendItem("HistoPeak+2s", 1210);
+mOpt[1]->SetValue(1200);
 mOpt[1]->SetBinding(PIBK_elastic,PIBK_elastic, PIBK_elastic,PIBK_elastic);
 
@@ -349,5 +353,11 @@
 int lauto, typ;
 int typlut[4] = {kLutType_Lin, kLutType_Log, kLutType_Sqrt, kLutType_Square} ; 
-
+AutoLutType alts[11] = { AutoLut_No, 
+			 AutoLut_MeanSigma, AutoLut_MeanSigma, AutoLut_MeanSigma,
+			 AutoLut_MinMax, AutoLut_MinMax, AutoLut_MinMax, 
+			 AutoLut_HistoTail, AutoLut_HistoTail, 
+			 AutoLut_HistoPeak, AutoLut_HistoPeak } ; 
+double nsas[11] = {0., 1., 2., 3., 0.70, 0.9, 1., 2., 1., 2.};
+ 
 msg = UserMsg(msg);
 
@@ -388,7 +398,8 @@
     }
     else lauto = mOpt[1]->GetValue() - 1200;
+    if ((lauto < 0) || (lauto > 10))  lauto = 10;
     typ = mOpt[0]->GetValue() - 1100;
     if ( (typ < 0) || (typ > 3) )  typ = 0;
-    (PIImage::CurrentPIImage())->SetLut(min, max, typlut[typ], lauto);
+    (PIImage::CurrentPIImage())->SetLut(alts[lauto], min, max, typlut[typ], nsas[lauto]);
     if (msg == 2500) { 
       min_lut = min;   max_lut = max;
Index: /trunk/SophyaPI/PI/piversion.h
===================================================================
--- /trunk/SophyaPI/PI/piversion.h	(revision 3291)
+++ /trunk/SophyaPI/PI/piversion.h	(revision 3292)
@@ -2,5 +2,5 @@
 #define PIVERSION_H_SEEN
 
-#define PI_VERSIONNUMBER  4.02
+#define PI_VERSIONNUMBER  4.05
 
 #endif
