Index: trunk/SophyaPI/PIext/graphexecut.cc
===================================================================
--- trunk/SophyaPI/PIext/graphexecut.cc	(revision 4067)
+++ trunk/SophyaPI/PIext/graphexecut.cc	(revision 4071)
@@ -467,4 +467,6 @@
 usage += ">> cdreal,cdimag,cdphase,cdmod,cdmod2 (default=cdmod): Displayed value\n";
 usage += "     for complex arrays (real/imaginary part, phase, module, module^2)\n";
+usage += ">> polarplot polarangle=ConvFactorToRadian,AngOffsetinRadian polarangledeg\n";
+usage += "     for 2D plots in polar coordinates (PINTuple)\n";
 usage += "--- General purpose options:\n";
 usage += ">> stat,stats / nsta,nstat,nostat,nostats : Toggle statistic display\n";
@@ -489,4 +491,5 @@
 usage += "         nbticks=X_NTicks,Y_NTicks  \n"; 
 usage += "         tickslen=MajTickLenFrac,MinTickLenFrac \n"; 
+usage += "         polaraxes or polaraxes=NbCircles,NbCteTheta,ThetaOffdeg";
 usage += ">> Axe labels font size: fixedfontsize/autofontsize=fszf \n";
 usage += "         autofontsize=fsizef: Font size computed automatically \n";
@@ -755,4 +758,5 @@
 usage = "Displays Points (X-Y) [with error-bar / Weight / Label ] from an NTuple ";
 usage += "\n Usage : nt2d nameobj varx vary [errx erry wt label graphic_attributes]";
+usage += "\n  For plots in polar coordinates, specify polarplot graphic_att";
 usage += "\n  Related commands: disp surf nt2dcn nt2dci nt3d  gfd2d vecplot";  
 mpiac->RegisterCommand(kw, usage, this, grp);
Index: trunk/SophyaPI/PIext/pintuple.cc
===================================================================
--- trunk/SophyaPI/PIext/pintuple.cc	(revision 4067)
+++ trunk/SophyaPI/PIext/pintuple.cc	(revision 4071)
@@ -60,7 +60,8 @@
   SelectColorByName(NULL);
   SelectColorByIndex(NULL);
+  SelectPolar(NULL,NULL);
   SetName("NTupleDrw");
-  NptDraw = 0;
-
+  NptDraw=0;
+  polarPlot=false;
 }
 
@@ -85,4 +86,6 @@
 // void  SelectLabel(const char* plabel=NULL)
 //	Choix du nom de colonne correspondant à l'étiquette.
+// void  SelectPolar(const char* pradius, const char* pangle, double angconv=1., double angoffser=0.)
+//      Choix des noms de colonnes rayon/angle pour un trace en coordonnees polaires
 //--
 
@@ -96,4 +99,5 @@
 if (py == NULL) yK = -1;
 else { name = py; yK = mNT->ColumnIndex(name); }
+polarPlot=false;
 }
 
@@ -143,4 +147,17 @@
 }
 
+/* --Methode-- */
+void  PINTuple::SelectPolar(const char* pangle, const char* pradius, double angconv, double angoff)
+{
+string name;
+if (mNT == NULL)  xK = yK = -1;
+if (pangle == NULL) xK = -1;
+else { name = pangle; xK = mNT->ColumnIndex(name); }
+if (pradius == NULL) yK = -1;
+else { name = pradius; yK = mNT->ColumnIndex(name); }
+polarPlot=true;
+angConvFactor=angconv;
+angOffset=angoff;
+}
 
 /* --Methode-- */
@@ -153,10 +170,19 @@
   // Commencer par trouver nos limites
   double xmin, xmax, ymin, ymax;
-  xmin = ymin = 9.e19;
-  xmax = ymax = -9.e19;
-  mNT->GetMinMax(xK, xmin, xmax);
-  mNT->GetMinMax(yK, ymin, ymax);
-  PIAxes::ReSizeMinMax(isLogScaleX(),xmin,xmax);
-  PIAxes::ReSizeMinMax(isLogScaleY(),ymin,ymax);
+  if (polarPlot) {
+    double rmin,rmax;
+    mNT->GetMinMax(yK, rmin, rmax);
+    if (rmax<=0.)  rmax=1.;
+    xmin=ymin=-rmax;
+    xmax=ymax=rmax; 
+  }
+  else {
+    xmin = ymin = 9.e19;
+    xmax = ymax = -9.e19;
+    mNT->GetMinMax(xK, xmin, xmax);
+    mNT->GetMinMax(yK, ymin, ymax);
+    PIAxes::ReSizeMinMax(isLogScaleX(),xmin,xmax);
+    PIAxes::ReSizeMinMax(isLogScaleY(),ymin,ymax);
+  }
   SetLimits(xmin,xmax,ymin,ymax);
 //  SetAxesFlags(kBoxAxes | kExtTicks | kLabels);  Ne pas faire - Reza 11/99
@@ -169,4 +195,5 @@
 {
 double xp,yp,xer,yer,wp;
+double ray,ang;
 double xl,yl;
 long nok;
@@ -228,8 +255,14 @@
 for (long i=0; i<(long)mNT->NbLines(); i++) {
   xl = xp;  yl = yp; fgoklastpt = fgokcurpt;
-
-  xp = mNT->GetCell(i, xK);
-  yp = mNT->GetCell(i, yK);
-
+  if (polarPlot) {
+    ang = mNT->GetCell(i, xK)*angConvFactor+angOffset;
+    ray = mNT->GetCell(i, yK);
+    xp=cos(ang)*ray;
+    yp=sin(ang)*ray;
+  }
+  else {
+    xp = mNT->GetCell(i, xK);
+    yp = mNT->GetCell(i, yK);
+  }
   // Comptage du nombre de pts dans la zone graphique du widget
   if ( !((xp < xmin2) || (xp > xmax2) || (yp < ymin2) || (yp > ymax2)) )  nok++;
@@ -287,9 +320,22 @@
   if (xebK >= 0) {
     xer = mNT->GetCell(i, xebK);
-    if(xer>0.) g->DrawLine(xp-xer, yp, xp+xer, yp);
+    if(xer>0.) { 
+      if (polarPlot) {
+	g->DrawLine(xp,yp,ray*cos(ang-yer*angConvFactor),ray*sin(ang-yer*angConvFactor));
+	g->DrawLine(xp,yp,ray*cos(ang+yer*angConvFactor),ray*sin(ang+yer*angConvFactor));
+      }
+      else g->DrawLine(xp-xer, yp, xp+xer, yp);
+    }
   }
   if (yebK >= 0) {
     yer = mNT->GetCell(i, yebK);
-    if(yer>0.) g->DrawLine(xp, yp-yer, xp, yp+yer);
+    if(yer>0.) { 
+      if (polarPlot) {
+	double ray1=ray-xer;  if (ray1<0.) ray1=0.;
+	double ray2=ray+xer;  if (ray2<0.) ray2=0.;
+	g->DrawLine(ray1*cos(ang), ray1*sin(ang), ray2*cos(ang), ray2*sin(ang));
+      }
+      else g->DrawLine(xp, yp-yer, xp, yp+yer);
+    }
   }
 
@@ -418,5 +464,12 @@
       UseSizeScale(true, nbn);
     }
-
+    // gestion trace en coordonnees polaires 
+    else if (opts == "polarplot") { polarPlot=true; }
+    else if (opts == "polarangledeg") { angConvFactor=M_PI/180.; }  
+    else if (opts.substr(0,11) == "polarangle=") {
+      double aconv=1., aoff=0.;
+      sscanf(opts.substr(11).c_str(),"%lf,%lf",&aconv, &aoff);
+      angConvFactor=aconv; angOffset=aoff; 
+    }
     else {
       // Si option non decode
@@ -453,4 +506,8 @@
  } else opt.push_back("nosizescale");
 
+ if (polarPlot) {
+   sprintf(str,"polarplot polarangle==%g,%g",angConvFactor,angOffset); opt.push_back(str);
+ }
+
  return 1;
 }
@@ -474,4 +531,7 @@
 info += "  colorscale/nocolorscale (Use color scale for weight) \n";
 info += "  sizescale/sizescale=nbins/nosizescale (Use marker size for weight) \n";
+info += "  polarplot: select plot in polar coordinates \n";
+info += "  polarangle=ConvFactorToRadian,AngOffsetinRadian Polar angle conversion \n";
+info += "  polarangledeg: set ConvFactorToRadian for input angles in degree \n";
 info += "   (and usual color/line/marker/... attribute decoding)  \n";
 // On recupere ensuite la chaine info de la classe de base
Index: trunk/SophyaPI/PIext/pintuple.h
===================================================================
--- trunk/SophyaPI/PIext/pintuple.h	(revision 4067)
+++ trunk/SophyaPI/PIext/pintuple.h	(revision 4071)
@@ -24,4 +24,5 @@
   virtual void       SelectColorByName(const char* pcolnm=NULL);
   virtual void       SelectColorByIndex(const char* pcolidx=NULL);
+  virtual void       SelectPolar(const char* pangle, const char* pradius, double angconv=1., double angoff=0.);
 
   inline  void       ConnectPoints(bool fg=false) { connectPts = fg; }
@@ -54,5 +55,5 @@
   NTupleInterface* mNT;
   bool mAdDO;
-  int xK, yK;          // Index du nom de variable en X/Y ds le ntuple
+  int xK, yK;          // Index du nom de variable en X/Y (ou rayon/angle) ds le ntuple
   int xebK, yebK;      // Index du nom de variable en ErrBarX/Y ds le ntuple
   int wK;              // Index du nom de variable poids
@@ -64,4 +65,7 @@
   int nWbins;          // Nombre de bins taille de marker variable
   bool colorScale;     // true -> Couleur de marker variable suivant poids
+  bool polarPlot;      // true -> polar plot 
+  double angConvFactor;  // Facteur de conversion de l'angle en radian
+  double angOffset;      // Offset de l'angle (en radian) apres conversion 
   bool stats;               // true -> indication du nb de points
   bool connectPts;          // true -> les points sont relies par une ligne
Index: trunk/SophyaPI/PIext/pistdimgapp.cc
===================================================================
--- trunk/SophyaPI/PIext/pistdimgapp.cc	(revision 4067)
+++ trunk/SophyaPI/PIext/pistdimgapp.cc	(revision 4071)
@@ -1794,5 +1794,5 @@
 {
   DispWinEnum rc = Disp_Next;
-  //DBG  cerr << " DBG-Parse-A sop=" << sop << " sop.length()= " << sop.length() << endl;
+  // cerr << " DBG-Parse-A sop=" << sop << " sop.length()= " << sop.length() << endl;
   if (opts.size() > 0)  opts.erase(opts.begin(), opts.end());
   if (sop.length() < 1) return(rc);
@@ -1833,9 +1833,18 @@
       wname=token.substr(6);
     }
-    // Option a etre decode par les drawers, etc ...
+    // Gestion specifique des options concernant les traces en coord. polaires 
+    else if (token == "polarplot")  { 
+      opts.push_back("polaraxes"); 
+      opts.push_back(token); 
+    }
+    else if ((token == "polaraxes")||(token.substr(0,10) == "polaraxes=")) {
+      opts.push_back("polarplot"); 
+      opts.push_back(token); 
+    }
+    //--- Option a etre decode par les drawers, etc ...
     else  opts.push_back(token); 
   }
 
-  //DBG  cerr << " DBG-Parse-B opts.size()=" << opts.size() << endl;
+  // cerr << " DBG-Parse-B opts.size()=" << opts.size() << endl;
   if (rc == Disp_Same) nb_disp_same++;
   else nb_disp_same = 0;
