ROOT logo
// @(#)root/histpainter:$Id: TGraph2DPainter.cxx,v 1.00
// Author: Olivier Couet

/*************************************************************************
 * Copyright (C) 1995-2000, Rene Brun and Fons Rademakers.               *
 * All rights reserved.                                                  *
 *                                                                       *
 * For the licensing terms see $ROOTSYS/LICENSE.                         *
 * For the list of contributors see $ROOTSYS/README/CREDITS.             *
 *************************************************************************/

#include "TROOT.h"
#include "TGraph2DPainter.h"
#include "TMath.h"
#include "TList.h"
#include "TGraph.h"
#include "TGraph2D.h"
#include "TGraphDelaunay.h"
#include "TPolyLine.h"
#include "TPolyMarker.h"
#include "TVirtualPad.h"
#include "TView.h"
#include "THLimitsFinder.h"
#include "TStyle.h"
#include "Hoption.h"
#include "TH1.h"

R__EXTERN TH1  *gCurrentHist;
R__EXTERN Hoption_t Hoption;

ClassImp(TGraph2DPainter)


//______________________________________________________________________________
//
// TGraph2DPainter paints a TGraphDelaunay
//


//______________________________________________________________________________
TGraph2DPainter::TGraph2DPainter()
{
   // TGraph2DPainter default constructor

   fDelaunay = 0;
}


//______________________________________________________________________________
TGraph2DPainter::TGraph2DPainter(TGraphDelaunay *gd)
{
   // TGraph2DPainter constructor

   fDelaunay = gd;
   fGraph2D  = fDelaunay->GetGraph2D();
   fNpoints  = fGraph2D->GetN();
   fX        = fGraph2D->GetX();
   fY        = fGraph2D->GetY();
   fZ        = fGraph2D->GetZ();
   fNdt      = 0;
   fXN       = 0;
   fYN       = 0;
   fXNmin    = 0;
   fXNmax    = 0;
   fYNmin    = 0;
   fYNmax    = 0;
   fPTried   = 0;
   fNTried   = 0;
   fMTried   = 0;
}


//______________________________________________________________________________
TGraph2DPainter::~TGraph2DPainter()
{
   // TGraph2DPainter destructor.
}


//______________________________________________________________________________
void TGraph2DPainter::FindTriangles()
{
   // Find triangles in fDelaunay and initialise the TGraph2DPainter values
   // needed to paint triangles or find contours.

   fDelaunay->FindAllTriangles();
   fNdt    = fDelaunay->GetNdt();
   fXN     = fDelaunay->GetXN();
   fYN     = fDelaunay->GetYN();
   fXNmin  = fDelaunay->GetXNmin();
   fXNmax  = fDelaunay->GetXNmax();
   fYNmin  = fDelaunay->GetYNmin();
   fYNmax  = fDelaunay->GetYNmax();
   fPTried = fDelaunay->GetPTried();
   fNTried = fDelaunay->GetNTried();
   fMTried = fDelaunay->GetMTried();
}


//______________________________________________________________________________
TList *TGraph2DPainter::GetContourList(Double_t contour)
{
   // Returns the X and Y graphs building a contour. A contour level may 
   // consist in several parts not connected to each other. This function
   // finds them and returns them in a graphs' list.

   // Exit if the contour is outisde the Z range.
   Double_t zmin = gCurrentHist->GetMinimum();
   Double_t zmax = gCurrentHist->GetMaximum();
   if (Hoption.Logz) {
      if (zmin > 0) {
         zmin = TMath::Log10(zmin);
         zmax = TMath::Log10(zmax);
      } else {
         return 0;
      }
   }
   if(contour<zmin || contour>zmax) {
      Error("GetContourList", "Contour level (%g) outside the Z scope [%g,%g]",
      contour,zmin,zmax);
      return 0;
   }

   if (!fNdt) FindTriangles();

   TGraph *graph = 0;           // current graph
   Int_t npg     = 0;           // number of points in the current graph
   TList *list   = new TList(); // list holding all the graphs

   // Find all the segments making the contour
 
   Double_t r21, r20, r10;
   Int_t p0, p1, p2;
   Double_t x0, y0, z0;
   Double_t x1, y1, z1;
   Double_t x2, y2, z2;
   Int_t t[3],i,it,i0,i1,i2;

   // Allocate space to store the segments. They cannot be more than the
   // number of triangles.
   Double_t xs0c, ys0c, xs1c, ys1c;
   Double_t *xs0 = new Double_t[fNdt];
   Double_t *ys0 = new Double_t[fNdt];
   Double_t *xs1 = new Double_t[fNdt];
   Double_t *ys1 = new Double_t[fNdt];
   for (i=0;i<fNdt;i++) {
      xs0[i] = 0.;
      ys0[i] = 0.;
      xs1[i] = 0.;
      ys1[i] = 0.;
   }
   Int_t nbSeg   = 0;

   // Loop over all the triangles in order to find all the line segments
   // making the contour.
   for(it=0; it<fNdt; it++) {
      t[0] = fPTried[it];
      t[1] = fNTried[it];
      t[2] = fMTried[it];
      p0   = t[0]-1;
      p1   = t[1]-1;
      p2   = t[2]-1;
      x0   = fX[p0]; x2 = fX[p0];
      y0   = fY[p0]; y2 = fY[p0];
      z0   = fZ[p0]; z2 = fZ[p0];
   
      // Order along Z axis the points (xi,yi,zi) where "i" belongs to {0,1,2}
      // After this z0 < z1 < z2
      i0=0, i1=0, i2=0;
      if (fZ[p1]<=z0) {z0=fZ[p1]; x0=fX[p1]; y0=fY[p1]; i0=1;}
      if (fZ[p1]>z2)  {z2=fZ[p1]; x2=fX[p1]; y2=fY[p1]; i2=1;}
      if (fZ[p2]<=z0) {z0=fZ[p2]; x0=fX[p2]; y0=fY[p2]; i0=2;}
      if (fZ[p2]>z2)  {z2=fZ[p2]; x2=fX[p2]; y2=fY[p2]; i2=2;}
      i1 = 3-i2-i0;
      x1 = fX[t[i1]-1];
      y1 = fY[t[i1]-1];
      z1 = fZ[t[i1]-1];

      if (Hoption.Logz) {
         z0 = TMath::Log10(z0);
         z1 = TMath::Log10(z1);
         z2 = TMath::Log10(z2);
      }

      if(contour >= z0 && contour <=z2) {
         r20 = (contour-z0)/(z2-z0);
         xs0c = r20*(x2-x0)+x0;
         ys0c = r20*(y2-y0)+y0;
         if(contour >= z1 && contour <=z2) {
            r21 = (contour-z1)/(z2-z1);
            xs1c = r21*(x2-x1)+x1;
            ys1c = r21*(y2-y1)+y1;
         } else {
            r10 = (contour-z0)/(z1-z0);
            xs1c = r10*(x1-x0)+x0;
            ys1c = r10*(y1-y0)+y0;
         }
         // do not take the segments equal to a point
         if(xs0c != xs1c || ys0c != ys1c) {
            nbSeg++;
            xs0[nbSeg-1] = xs0c;
            ys0[nbSeg-1] = ys0c;
            xs1[nbSeg-1] = xs1c;
            ys1[nbSeg-1] = ys1c;
         }
      }
   }

   Bool_t *segUsed = new Bool_t[fNdt];
   for(i=0; i<fNdt; i++) segUsed[i]=kFALSE;

   // Find all the graphs making the contour. There is two kind of graphs,
   // either they are "opened" or they are "closed"

   // Find the opened graphs
   Double_t xc=0, yc=0, xnc=0, ync=0;
   Bool_t findNew;
   Bool_t s0, s1;
   Int_t is, js;
   for (is=0; is<nbSeg; is++) {
      if (segUsed[is]) continue;
      s0 = s1 = kFALSE;

      // Find to which segment is is connected. It can be connected
      // via 0, 1 or 2 vertices.
      for (js=0; js<nbSeg; js++) {
         if (is==js) continue;
         if (xs0[is]==xs0[js] && ys0[is]==ys0[js]) s0 = kTRUE;
         if (xs0[is]==xs1[js] && ys0[is]==ys1[js]) s0 = kTRUE;
         if (xs1[is]==xs0[js] && ys1[is]==ys0[js]) s1 = kTRUE;
         if (xs1[is]==xs1[js] && ys1[is]==ys1[js]) s1 = kTRUE;
      }

      // Segment is is alone, not connected. It is stored in the
      // list and the next segment is examined.
      if (!s0 && !s1) {
         graph = new TGraph();
         graph->SetPoint(npg,xs0[is],ys0[is]); npg++;
         graph->SetPoint(npg,xs1[is],ys1[is]); npg++;
         segUsed[is] = kTRUE;
         list->Add(graph); npg = 0;
         continue;
      }

      // Segment is is connected via 1 vertex only and can be considered
      // as the starting point of an opened contour.
      if (!s0 || !s1) {
         // Find all the segments connected to segment is
         graph = new TGraph();
         if (s0) {xc = xs0[is]; yc = ys0[is]; xnc = xs1[is]; ync = ys1[is];}
         if (s1) {xc = xs1[is]; yc = ys1[is]; xnc = xs0[is]; ync = ys0[is];}
         graph->SetPoint(npg,xnc,ync); npg++;
         segUsed[is] = kTRUE;
         js = 0;
L01:
         findNew = kFALSE;
         if (segUsed[js] && js<nbSeg) {
            js++;
            goto L01;
         } else if (xc==xs0[js] && yc==ys0[js]) {
            xc      = xs1[js];
            yc      = ys1[js];
            findNew = kTRUE;
         } else if (xc==xs1[js] && yc==ys1[js]) {
            xc      = xs0[js];
            yc      = ys0[js];
            findNew = kTRUE;
         }
         if (findNew) {
            segUsed[js] = kTRUE;
            graph->SetPoint(npg,xc,yc); npg++;
            js = 0;
            goto L01;
         }
         js++; 
         if (js<nbSeg) goto L01;
         list->Add(graph); npg = 0;
      }
   }

   // Find the closed graphs. At this point all the remaining graphs
   // are closed. Any segment can be used to start the search. 
   for (is=0; is<nbSeg; is++) {
      if (segUsed[is]) continue;

      // Find all the segments connected to segment is
      graph = new TGraph();
      segUsed[is] = kTRUE;
      xc = xs0[is];
      yc = ys0[is];
      js = 0;
      graph->SetPoint(npg,xc,yc); npg++;
L02:
      findNew = kFALSE;
      if (segUsed[js] && js<nbSeg) {
         js++;
         goto L02;
      } else if (xc==xs0[js] && yc==ys0[js]) {
         xc      = xs1[js];
         yc      = ys1[js];
         findNew = kTRUE;
      } else if (xc==xs1[js] && yc==ys1[js]) {
         xc      = xs0[js];
         yc      = ys0[js];
         findNew = kTRUE;
      }
      if (findNew) {
         segUsed[js] = kTRUE;
         graph->SetPoint(npg,xc,yc); npg++;
         js = 0;
         goto L02;
      }
      js++; 
      if (js<nbSeg) goto L02;
      // Close the contour
      graph->SetPoint(npg,xs0[is],ys0[is]); npg++;
      list->Add(graph); npg = 0;
   }
   
   delete [] xs0;
   delete [] ys0;
   delete [] xs1;
   delete [] ys1;
   delete [] segUsed;
   return list;
}


//______________________________________________________________________________
void TGraph2DPainter::Paint(Option_t *option)
{
   // Paint a TGraphDelaunay according to the value of "option":
   //
   //   "TRI"  : The Delaunay triangles are drawn using filled area.
   //            An hidden surface drawing technique is used. The surface is  
   //            painted with the current fill area color. The edges of each
   //            triangles are painted with the current line color.
   //   "TRIW" : The Delaunay triangles are drawn as wire frame
   //   "TRI1" : The Delaunay triangles are painted with color levels. The edges
   //            of each triangles are painted with the current line color.
   //   "TRI2" : the Delaunay triangles are painted with color levels.
   //   "P"    : Draw a marker at each vertex
   //   "P0"   : Draw a circle at each vertex. Each circle background is white.
   //   "PCOL" : Draw a marker at each vertex. The color of each marker is 
   //            defined according to its Z position. 
   //   "CONT" : Draw contours
   //   "LINE" : Draw a 3D polyline

   TString opt = option;
   opt.ToLower();
   Bool_t triangles = opt.Contains("tri")  ||
                      opt.Contains("tri1") ||
                      opt.Contains("tri2"); 
   if (opt.Contains("tri0")) triangles = kFALSE;

   Bool_t markers   = opt.Contains("p") && !triangles;
   Bool_t contour   = opt.Contains("cont");
   Bool_t line      = opt.Contains("line");

   fGraph2D->TAttLine::Modify();
   fGraph2D->TAttFill::Modify();
   fGraph2D->TAttMarker::Modify();

   // Compute minimums and maximums
   TAxis *xaxis = gCurrentHist->GetXaxis();
   Int_t first = xaxis->GetFirst();
   fXmin = xaxis->GetBinLowEdge(first);
   if (Hoption.Logx && fXmin <= 0) fXmin = xaxis->GetBinUpEdge(xaxis->FindFixBin(0.01*xaxis->GetBinWidth(first)));
   fXmax = xaxis->GetBinUpEdge(xaxis->GetLast());
   TAxis *yaxis = gCurrentHist->GetYaxis();
   first = yaxis->GetFirst();
   fYmin = yaxis->GetBinLowEdge(first);
   if (Hoption.Logy && fYmin <= 0) fYmin = yaxis->GetBinUpEdge(yaxis->FindFixBin(0.01*yaxis->GetBinWidth(first)));
   fYmax = yaxis->GetBinUpEdge(yaxis->GetLast());
   fZmax = gCurrentHist->GetMaximum();
   fZmin = gCurrentHist->GetMinimum();
   if (Hoption.Logz && fZmin <= 0) fZmin = TMath::Min((Double_t)1, (Double_t)0.001*gCurrentHist->GetMaximum());

   if (triangles) PaintTriangles(option);
   if (markers)   PaintPolyMarker(option);
   if (contour)   PaintContour(option);
   if (line)      PaintPolyLine(option);
}


//______________________________________________________________________________
void TGraph2DPainter::PaintContour(Option_t * /*option*/)
{
   // Paints the 2D graph as a contour plot. Delaunay triangles are used
   // to compute the contours.

   // Initialize the levels on the Z axis
   Int_t ncolors  = gStyle->GetNumberOfColors();
   Int_t ndiv   = gCurrentHist->GetContour();
   if (ndiv == 0 ) {
      ndiv = gStyle->GetNumberContours();
      gCurrentHist->SetContour(ndiv);
   }
   Int_t ndivz  = TMath::Abs(ndiv);
   if (gCurrentHist->TestBit(TH1::kUserContour) == 0) gCurrentHist->SetContour(ndiv);

   Int_t theColor;
   TList *l;
   TGraph *g;
   TObject *obj;
   Double_t c;

   if (!fNdt) FindTriangles();

   for (Int_t k=0; k<ndiv; k++) {
      c = gCurrentHist->GetContourLevelPad(k);
      l = GetContourList(c);
      TIter next(l);   
      while ((obj = next())) {
         if(obj->InheritsFrom(TGraph::Class()) ) {
            g=(TGraph*)obj;
            theColor = Int_t((k+0.99)*Float_t(ncolors)/Float_t(ndivz));
            g->SetLineColor(gStyle->GetColorPalette(theColor));
            g->Paint("l");
         }
      }
   }
}


//______________________________________________________________________________
void TGraph2DPainter::PaintLevels(Int_t *t,Double_t *x, Double_t *y,
                           Int_t nblev, Double_t *glev)
{
   // Paints one triangle.
   // nblev  = 0 : paint the color levels
   // nblev != 0 : paint the grid

   Int_t i, fillColor, ncolors, theColor0, theColor2;
   
   Int_t p0=t[0]-1;
   Int_t p1=t[1]-1;
   Int_t p2=t[2]-1;
   Double_t xl[2],yl[2];
   Double_t zl, r21, r20, r10;
   Double_t x0 = x[0]  , x2 = x[0];
   Double_t y0 = y[0]  , y2 = y[0];
   Double_t z0 = fZ[p0], z2 = fZ[p0];

   // Order along Z axis the points (xi,yi,zi) where "i" belongs to {0,1,2}
   // After this z0 < z1 < z2
   Int_t i0=0, i1=0, i2=0;
   if (fZ[p1]<=z0) {z0=fZ[p1]; x0=x[1]; y0=y[1]; i0=1;}
   if (fZ[p1]>z2)  {z2=fZ[p1]; x2=x[1]; y2=y[1]; i2=1;}
   if (fZ[p2]<=z0) {z0=fZ[p2]; x0=x[2]; y0=y[2]; i0=2;}
   if (fZ[p2]>z2)  {z2=fZ[p2]; x2=x[2]; y2=y[2]; i2=2;}
   i1 = 3-i2-i0;
   Double_t x1 = x[i1];
   Double_t y1 = y[i1];
   Double_t z1 = fZ[t[i1]-1];
   if (z0>fZmax) z0 = fZmax;
   if (z2>fZmax) z2 = fZmax;
   if (z0<fZmin) z0 = fZmin;
   if (z2<fZmin) z2 = fZmin;

   // zi  = Z values of the stripe number i
   // zip = Previous zi 
   Double_t zi=0, zip=0;

   if (nblev <= 0) {
      // Paint the colors levels

      // Compute the color associated to z0 (theColor0) and z2 (theColor2)
      ncolors   = gStyle->GetNumberOfColors();
      theColor0 = (Int_t)( ((z0-fZmin)/(fZmax-fZmin))*(ncolors-1) );
      theColor2 = (Int_t)( ((z2-fZmin)/(fZmax-fZmin))*(ncolors-1) );

      // The stripes drawn to fill the triangles may have up to 5 points
      Double_t xp[5], yp[5];

      // rl = Ratio between z0 and z2 (long) 
      // rs = Ratio between z0 and z1 or z1 and z2 (short) 
      Double_t rl,rs;

      // ci = Color of the stripe number i
      // npf = number of point needed to draw the current stripe
      Int_t ci,npf;

      fillColor = fGraph2D->GetFillColor();

      // If the z0's color and z2's colors are the same, the whole triangle
      // can be painted in one go.
      if(theColor0 == theColor2) {
         fGraph2D->SetFillColor(gStyle->GetColorPalette(theColor0));
         fGraph2D->TAttFill::Modify();
         gPad->PaintFillArea(3,x,y);

      // The triangle must be painted with several colors
      } else {
         for(ci=theColor0; ci<=theColor2; ci++) {
            fGraph2D->SetFillColor(gStyle->GetColorPalette(ci));
            fGraph2D->TAttFill::Modify();
            if (ci==theColor0) {
               zi    = (((ci+1)*(fZmax-fZmin))/(ncolors-1))+fZmin;
               xp[0] = x0;
               yp[0] = y0;
               rl    = (zi-z0)/(z2-z0);
               xp[1] = rl*(x2-x0)+x0;
               yp[1] = rl*(y2-y0)+y0;
               if (zi>=z1 || z0==z1) {
                  rs    = (zi-z1)/(z2-z1);
                  xp[2] = rs*(x2-x1)+x1;
                  yp[2] = rs*(y2-y1)+y1;
                  xp[3] = x1;
                  yp[3] = y1;
                  npf   = 4;
               } else {
                  rs    = (zi-z0)/(z1-z0);
                  xp[2] = rs*(x1-x0)+x0;
                  yp[2] = rs*(y1-y0)+y0;
                  npf   = 3;
               }
            } else if (ci==theColor2) {
               xp[0] = xp[1];
               yp[0] = yp[1];
               xp[1] = x2;
               yp[1] = y2;
               if (zi<z1 || z2==z1) {
                  xp[3] = xp[2];
                  yp[3] = yp[2];
                  xp[2] = x1;
                  yp[2] = y1;
                  npf   = 4;
               } else {
                  npf   = 3;
               }
            } else {
               zi    = (((ci+1)*(fZmax-fZmin))/(ncolors-1))+fZmin;
               xp[0] = xp[1];
               yp[0] = yp[1];
               rl    = (zi-z0)/(z2-z0);
               xp[1] = rl*(x2-x0)+x0;
               yp[1] = rl*(y2-y0)+y0;
               if ( zi>=z1 && zip<=z1) {
                  xp[3] = x1;
                  yp[3] = y1;
                  xp[4] = xp[2];
                  yp[4] = yp[2];
                  npf   = 5;
               } else {
                  xp[3] = xp[2];
                  yp[3] = yp[2];
                  npf   = 4;
               }
               if (zi<z1) {
                  rs    = (zi-z0)/(z1-z0);
                  xp[2] = rs*(x1-x0)+x0;
                  yp[2] = rs*(y1-y0)+y0;
               } else {
                  rs    = (zi-z1)/(z2-z1);
                  xp[2] = rs*(x2-x1)+x1;
                  yp[2] = rs*(y2-y1)+y1;
               }
            }
            zip = zi;
            // Paint a stripe
            gPad->PaintFillArea(npf,xp,yp);
         }
      }
      fGraph2D->SetFillColor(fillColor);
      fGraph2D->TAttFill::Modify();

   } else {
      // Paint the grid levels
      fGraph2D->SetLineStyle(3);
      fGraph2D->TAttLine::Modify();
      for(i=0; i<nblev; i++){
         zl=glev[i];
         if(zl >= z0 && zl <=z2) {
            r21=(zl-z1)/(z2-z1);
            r20=(zl-z0)/(z2-z0);
            r10=(zl-z0)/(z1-z0);
            xl[0]=r20*(x2-x0)+x0;
            yl[0]=r20*(y2-y0)+y0;
            if(zl >= z1 && zl <=z2) {
               xl[1]=r21*(x2-x1)+x1;
               yl[1]=r21*(y2-y1)+y1;
            } else {
               xl[1]=r10*(x1-x0)+x0;
               yl[1]=r10*(y1-y0)+y0;
            }
            gPad->PaintPolyLine(2,xl,yl);
         }
      }
      fGraph2D->SetLineStyle(1);
      fGraph2D->TAttLine::Modify();
   }
}


//______________________________________________________________________________
void TGraph2DPainter::PaintPolyMarker(Option_t *option)
{
   // Paints the 2D graph as PaintPolyMarker

   Double_t temp1[3],temp2[3];

   TView *view = gPad->GetView();
   if (!view) {
      Error("PaintPolyMarker", "No TView in current pad");
      return;
   }

   TString opt = option;
   opt.ToLower();
   Bool_t markers0 = opt.Contains("p0");
   Bool_t colors   = opt.Contains("pcol");
   Int_t  ncolors  = gStyle->GetNumberOfColors();
   Int_t  it, theColor;

   Double_t *xm = new Double_t[fNpoints]; 
   Double_t *ym = new Double_t[fNpoints];
   Int_t    npd = 0;
   for (it=0; it<fNpoints; it++) {
      xm[it] = 0;
      ym[it] = 0;
      if(fX[it] < fXmin || fX[it] > fXmax) continue;
      if(fY[it] < fYmin || fY[it] > fYmax) continue;
      npd++;
      temp1[0] = fX[it];
      temp1[1] = fY[it];
      temp1[2] = fZ[it];
      temp1[0] = TMath::Max(temp1[0],fXmin);
      temp1[1] = TMath::Max(temp1[1],fYmin);
      temp1[2] = TMath::Max(temp1[2],fZmin);
      temp1[2] = TMath::Min(temp1[2],fZmax);
      if (Hoption.Logx) temp1[0] = TMath::Log10(temp1[0]);
      if (Hoption.Logy) temp1[1] = TMath::Log10(temp1[1]);
      if (Hoption.Logz) temp1[2] = TMath::Log10(temp1[2]);
      view->WCtoNDC(temp1, &temp2[0]);
      xm[it] = temp2[0];
      ym[it] = temp2[1];
   }
   if (markers0) {
      PaintPolyMarker0(npd,xm,ym);
   } else if (colors) {
      for (it=0; it<fNpoints; it++) {
         theColor = (Int_t)( ((fZ[it]-fZmin)/(fZmax-fZmin))*(ncolors-1) );
         fGraph2D->SetMarkerColor(gStyle->GetColorPalette(theColor));
         fGraph2D->TAttMarker::Modify();
         gPad->PaintPolyMarker(1,&xm[it],&ym[it]);
      }
   } else {
      fGraph2D->SetMarkerStyle(fGraph2D->GetMarkerStyle());
      fGraph2D->SetMarkerSize(fGraph2D->GetMarkerSize());
      fGraph2D->SetMarkerColor(fGraph2D->GetMarkerColor());
      fGraph2D->TAttMarker::Modify();
      gPad->PaintPolyMarker(npd,xm,ym);
   }
   delete [] xm;
   delete [] ym;
}

//______________________________________________________________________________
void TGraph2DPainter::PaintPolyLine(Option_t * /* option */)
{
   // Paints the 2D graph as PaintPolyLine

   Double_t temp1[3],temp2[3];

   TView *view = gPad->GetView();
   if (!view) {
      Error("PaintPolyLine", "No TView in current pad");
      return;
   }

   Int_t  it;

   Double_t *xm = new Double_t[fNpoints]; 
   Double_t *ym = new Double_t[fNpoints];
   Int_t    npd = 0;
   for (it=0; it<fNpoints; it++) {
      if(fX[it] < fXmin || fX[it] > fXmax) continue;
      if(fY[it] < fYmin || fY[it] > fYmax) continue;
      npd++;
      temp1[0] = fX[it];
      temp1[1] = fY[it];
      temp1[2] = fZ[it];
      temp1[0] = TMath::Max(temp1[0],fXmin);
      temp1[1] = TMath::Max(temp1[1],fYmin);
      temp1[2] = TMath::Max(temp1[2],fZmin);
      temp1[2] = TMath::Min(temp1[2],fZmax);
      if (Hoption.Logx) temp1[0] = TMath::Log10(temp1[0]);
      if (Hoption.Logy) temp1[1] = TMath::Log10(temp1[1]);
      if (Hoption.Logz) temp1[2] = TMath::Log10(temp1[2]);
      view->WCtoNDC(temp1, &temp2[0]);
      xm[it] = temp2[0];
      ym[it] = temp2[1];
   }
   fGraph2D->SetLineStyle(fGraph2D->GetLineStyle());
   fGraph2D->SetLineWidth(fGraph2D->GetLineWidth());
   fGraph2D->SetLineColor(fGraph2D->GetLineColor());
   fGraph2D->TAttLine::Modify();
   gPad->PaintPolyLine(npd,xm,ym);
   delete [] xm;
   delete [] ym;
}

//______________________________________________________________________________
void TGraph2DPainter::PaintPolyMarker0(Int_t n, Double_t *x, Double_t *y)
{
   // Paints a circle at each vertex. Each circle background is white. 

   fGraph2D->SetMarkerSize(fGraph2D->GetMarkerSize());
   Int_t mc = fGraph2D->GetMarkerColor();
   for (Int_t i=0; i<n; i++) {
      fGraph2D->SetMarkerStyle(20);
      fGraph2D->SetMarkerColor(0);
      fGraph2D->TAttMarker::Modify();
      gPad->PaintPolyMarker(1,&x[i],&y[i]);
      fGraph2D->SetMarkerStyle(24);
      fGraph2D->SetMarkerColor(mc);
      fGraph2D->TAttMarker::Modify();
      gPad->PaintPolyMarker(1,&x[i],&y[i]);
   }
}


//______________________________________________________________________________
void TGraph2DPainter::PaintTriangles(Option_t *option)
{
   // Paints the 2D graph as triangles

   Double_t x[4], y[4], temp1[3],temp2[3];
   Int_t it,t[3];
   Int_t *order = 0;
   Double_t *dist = 0;

   TView *view = gPad->GetView();
   if (!view) {
      Error("PaintTriangles", "No TView in current pad");
      return;
   }

   TString opt = option;
   opt.ToLower();
   Bool_t tri1      = opt.Contains("tri1"); 
   Bool_t tri2      = opt.Contains("tri2"); 
   Bool_t markers   = opt.Contains("p");
   Bool_t markers0  = opt.Contains("p0");
   Bool_t wire      = opt.Contains("w");

   // Define the grid levels drawn on the triangles.
   // The grid levels are aligned on the Z axis' main tick marks.
   Int_t nblev=0;
   Double_t *glev=0;
   if (!tri1 && !tri2 && !wire) {
      Int_t ndivz = gCurrentHist->GetZaxis()->GetNdivisions()%100;
      Int_t nbins;
      Double_t binLow, binHigh, binWidth;

      // Find the main tick marks positions.
      Double_t *r0 = view->GetRmin();
      Double_t *r1 = view->GetRmax();

      if (ndivz > 0) {
         THLimitsFinder::Optimize(r0[2], r1[2], ndivz,
                                  binLow, binHigh, nbins, binWidth, " ");
      } else {
         nbins = TMath::Abs(ndivz);
         binLow = r0[2];
         binHigh = r1[2];
         binWidth = (binHigh-binLow)/nbins;
      }
      // Define the grid levels
      nblev = nbins+1;
      glev = new Double_t[nblev];
      for (Int_t i = 0; i < nblev; ++i) glev[i] = binLow+i*binWidth;
   }
   
   // Initialize the levels on the Z axis
   if (tri1 || tri2) {
      Int_t ndiv   = gCurrentHist->GetContour();
      if (ndiv == 0 ) {
         ndiv = gStyle->GetNumberContours();
         gCurrentHist->SetContour(ndiv);
      }
      if (gCurrentHist->TestBit(TH1::kUserContour) == 0) gCurrentHist->SetContour(ndiv);
   }

   // For each triangle, compute the distance between the triangle centre
   // and the back planes. Then these distances are sorted in order to draw
   // the triangles from back to front. 
   if (!fNdt) FindTriangles();
   Double_t cp = TMath::Cos(view->GetLongitude()*TMath::Pi()/180.);
   Double_t sp = TMath::Sin(view->GetLongitude()*TMath::Pi()/180.);
   order = new Int_t[fNdt];
   dist  = new Double_t[fNdt];
   Double_t xd,yd;
   Int_t p, n, m;
   Bool_t o = kFALSE;
   for (it=0; it<fNdt; it++) {
      p = fPTried[it];
      n = fNTried[it];
      m = fMTried[it];
      xd = (fXN[p]+fXN[n]+fXN[m])/3;
      yd = (fYN[p]+fYN[n]+fYN[m])/3;
      if ((cp >= 0) && (sp >= 0.)) {
         dist[it] = -(fXNmax-xd+fYNmax-yd);
      } else if ((cp <= 0) && (sp >= 0.)) {
         dist[it] = -(fXNmax-xd+yd-fYNmin);
         o = kTRUE;
      } else if ((cp <= 0) && (sp <= 0.)) {
         dist[it] = -(xd-fXNmin+yd-fYNmin);
      } else {
         dist[it] = -(xd-fXNmin+fYNmax-yd);
         o = kTRUE;
      }
   }
   TMath::Sort(fNdt, dist, order, o);
   
   // Draw the triangles and markers if requested
   fGraph2D->SetFillColor(fGraph2D->GetFillColor());
   Int_t fs = fGraph2D->GetFillStyle();
   fGraph2D->SetFillStyle(1001);
   fGraph2D->TAttFill::Modify();
   fGraph2D->SetLineColor(fGraph2D->GetLineColor());
   fGraph2D->TAttLine::Modify();
   int lst = fGraph2D->GetLineStyle();
   for (it=0; it<fNdt; it++) {
      t[0] = fPTried[order[it]];
      t[1] = fNTried[order[it]];
      t[2] = fMTried[order[it]];
      for (Int_t k=0; k<3; k++) {
         if(fX[t[k]-1] < fXmin || fX[t[k]-1] > fXmax) goto endloop;
         if(fY[t[k]-1] < fYmin || fY[t[k]-1] > fYmax) goto endloop;
         temp1[0] = fX[t[k]-1];
         temp1[1] = fY[t[k]-1];
         temp1[2] = fZ[t[k]-1];
         temp1[0] = TMath::Max(temp1[0],fXmin);
         temp1[1] = TMath::Max(temp1[1],fYmin);
         temp1[2] = TMath::Max(temp1[2],fZmin);
         temp1[2] = TMath::Min(temp1[2],fZmax);
         if (Hoption.Logx) temp1[0] = TMath::Log10(temp1[0]);
         if (Hoption.Logy) temp1[1] = TMath::Log10(temp1[1]);
         if (Hoption.Logz) temp1[2] = TMath::Log10(temp1[2]);
         view->WCtoNDC(temp1, &temp2[0]);
         x[k] = temp2[0];
         y[k] = temp2[1];
      }
      x[3] = x[0];
      y[3] = y[0];
      if (tri1 || tri2) PaintLevels(t,x,y);
      if (!tri1 && !tri2 && !wire) {
         gPad->PaintFillArea(3,x,y);
         PaintLevels(t,x,y,nblev,glev);
      }
      if (!tri2) gPad->PaintPolyLine(4,x,y);
      if (markers) {
         if (markers0) {
            PaintPolyMarker0(3,x,y);
         } else {
            fGraph2D->SetMarkerStyle(fGraph2D->GetMarkerStyle());
            fGraph2D->SetMarkerSize(fGraph2D->GetMarkerSize());
            fGraph2D->SetMarkerColor(fGraph2D->GetMarkerColor());
            fGraph2D->TAttMarker::Modify();
            gPad->PaintPolyMarker(3,x,y);
         }
      }
endloop:
      continue;
   }
   fGraph2D->SetFillStyle(fs);
   fGraph2D->SetLineStyle(lst);
   fGraph2D->TAttLine::Modify();
   fGraph2D->TAttFill::Modify();
   delete [] order;
   delete [] dist;
   if (glev) delete [] glev;
}
 TGraph2DPainter.cxx:1
 TGraph2DPainter.cxx:2
 TGraph2DPainter.cxx:3
 TGraph2DPainter.cxx:4
 TGraph2DPainter.cxx:5
 TGraph2DPainter.cxx:6
 TGraph2DPainter.cxx:7
 TGraph2DPainter.cxx:8
 TGraph2DPainter.cxx:9
 TGraph2DPainter.cxx:10
 TGraph2DPainter.cxx:11
 TGraph2DPainter.cxx:12
 TGraph2DPainter.cxx:13
 TGraph2DPainter.cxx:14
 TGraph2DPainter.cxx:15
 TGraph2DPainter.cxx:16
 TGraph2DPainter.cxx:17
 TGraph2DPainter.cxx:18
 TGraph2DPainter.cxx:19
 TGraph2DPainter.cxx:20
 TGraph2DPainter.cxx:21
 TGraph2DPainter.cxx:22
 TGraph2DPainter.cxx:23
 TGraph2DPainter.cxx:24
 TGraph2DPainter.cxx:25
 TGraph2DPainter.cxx:26
 TGraph2DPainter.cxx:27
 TGraph2DPainter.cxx:28
 TGraph2DPainter.cxx:29
 TGraph2DPainter.cxx:30
 TGraph2DPainter.cxx:31
 TGraph2DPainter.cxx:32
 TGraph2DPainter.cxx:33
 TGraph2DPainter.cxx:34
 TGraph2DPainter.cxx:35
 TGraph2DPainter.cxx:36
 TGraph2DPainter.cxx:37
 TGraph2DPainter.cxx:38
 TGraph2DPainter.cxx:39
 TGraph2DPainter.cxx:40
 TGraph2DPainter.cxx:41
 TGraph2DPainter.cxx:42
 TGraph2DPainter.cxx:43
 TGraph2DPainter.cxx:44
 TGraph2DPainter.cxx:45
 TGraph2DPainter.cxx:46
 TGraph2DPainter.cxx:47
 TGraph2DPainter.cxx:48
 TGraph2DPainter.cxx:49
 TGraph2DPainter.cxx:50
 TGraph2DPainter.cxx:51
 TGraph2DPainter.cxx:52
 TGraph2DPainter.cxx:53
 TGraph2DPainter.cxx:54
 TGraph2DPainter.cxx:55
 TGraph2DPainter.cxx:56
 TGraph2DPainter.cxx:57
 TGraph2DPainter.cxx:58
 TGraph2DPainter.cxx:59
 TGraph2DPainter.cxx:60
 TGraph2DPainter.cxx:61
 TGraph2DPainter.cxx:62
 TGraph2DPainter.cxx:63
 TGraph2DPainter.cxx:64
 TGraph2DPainter.cxx:65
 TGraph2DPainter.cxx:66
 TGraph2DPainter.cxx:67
 TGraph2DPainter.cxx:68
 TGraph2DPainter.cxx:69
 TGraph2DPainter.cxx:70
 TGraph2DPainter.cxx:71
 TGraph2DPainter.cxx:72
 TGraph2DPainter.cxx:73
 TGraph2DPainter.cxx:74
 TGraph2DPainter.cxx:75
 TGraph2DPainter.cxx:76
 TGraph2DPainter.cxx:77
 TGraph2DPainter.cxx:78
 TGraph2DPainter.cxx:79
 TGraph2DPainter.cxx:80
 TGraph2DPainter.cxx:81
 TGraph2DPainter.cxx:82
 TGraph2DPainter.cxx:83
 TGraph2DPainter.cxx:84
 TGraph2DPainter.cxx:85
 TGraph2DPainter.cxx:86
 TGraph2DPainter.cxx:87
 TGraph2DPainter.cxx:88
 TGraph2DPainter.cxx:89
 TGraph2DPainter.cxx:90
 TGraph2DPainter.cxx:91
 TGraph2DPainter.cxx:92
 TGraph2DPainter.cxx:93
 TGraph2DPainter.cxx:94
 TGraph2DPainter.cxx:95
 TGraph2DPainter.cxx:96
 TGraph2DPainter.cxx:97
 TGraph2DPainter.cxx:98
 TGraph2DPainter.cxx:99
 TGraph2DPainter.cxx:100
 TGraph2DPainter.cxx:101
 TGraph2DPainter.cxx:102
 TGraph2DPainter.cxx:103
 TGraph2DPainter.cxx:104
 TGraph2DPainter.cxx:105
 TGraph2DPainter.cxx:106
 TGraph2DPainter.cxx:107
 TGraph2DPainter.cxx:108
 TGraph2DPainter.cxx:109
 TGraph2DPainter.cxx:110
 TGraph2DPainter.cxx:111
 TGraph2DPainter.cxx:112
 TGraph2DPainter.cxx:113
 TGraph2DPainter.cxx:114
 TGraph2DPainter.cxx:115
 TGraph2DPainter.cxx:116
 TGraph2DPainter.cxx:117
 TGraph2DPainter.cxx:118
 TGraph2DPainter.cxx:119
 TGraph2DPainter.cxx:120
 TGraph2DPainter.cxx:121
 TGraph2DPainter.cxx:122
 TGraph2DPainter.cxx:123
 TGraph2DPainter.cxx:124
 TGraph2DPainter.cxx:125
 TGraph2DPainter.cxx:126
 TGraph2DPainter.cxx:127
 TGraph2DPainter.cxx:128
 TGraph2DPainter.cxx:129
 TGraph2DPainter.cxx:130
 TGraph2DPainter.cxx:131
 TGraph2DPainter.cxx:132
 TGraph2DPainter.cxx:133
 TGraph2DPainter.cxx:134
 TGraph2DPainter.cxx:135
 TGraph2DPainter.cxx:136
 TGraph2DPainter.cxx:137
 TGraph2DPainter.cxx:138
 TGraph2DPainter.cxx:139
 TGraph2DPainter.cxx:140
 TGraph2DPainter.cxx:141
 TGraph2DPainter.cxx:142
 TGraph2DPainter.cxx:143
 TGraph2DPainter.cxx:144
 TGraph2DPainter.cxx:145
 TGraph2DPainter.cxx:146
 TGraph2DPainter.cxx:147
 TGraph2DPainter.cxx:148
 TGraph2DPainter.cxx:149
 TGraph2DPainter.cxx:150
 TGraph2DPainter.cxx:151
 TGraph2DPainter.cxx:152
 TGraph2DPainter.cxx:153
 TGraph2DPainter.cxx:154
 TGraph2DPainter.cxx:155
 TGraph2DPainter.cxx:156
 TGraph2DPainter.cxx:157
 TGraph2DPainter.cxx:158
 TGraph2DPainter.cxx:159
 TGraph2DPainter.cxx:160
 TGraph2DPainter.cxx:161
 TGraph2DPainter.cxx:162
 TGraph2DPainter.cxx:163
 TGraph2DPainter.cxx:164
 TGraph2DPainter.cxx:165
 TGraph2DPainter.cxx:166
 TGraph2DPainter.cxx:167
 TGraph2DPainter.cxx:168
 TGraph2DPainter.cxx:169
 TGraph2DPainter.cxx:170
 TGraph2DPainter.cxx:171
 TGraph2DPainter.cxx:172
 TGraph2DPainter.cxx:173
 TGraph2DPainter.cxx:174
 TGraph2DPainter.cxx:175
 TGraph2DPainter.cxx:176
 TGraph2DPainter.cxx:177
 TGraph2DPainter.cxx:178
 TGraph2DPainter.cxx:179
 TGraph2DPainter.cxx:180
 TGraph2DPainter.cxx:181
 TGraph2DPainter.cxx:182
 TGraph2DPainter.cxx:183
 TGraph2DPainter.cxx:184
 TGraph2DPainter.cxx:185
 TGraph2DPainter.cxx:186
 TGraph2DPainter.cxx:187
 TGraph2DPainter.cxx:188
 TGraph2DPainter.cxx:189
 TGraph2DPainter.cxx:190
 TGraph2DPainter.cxx:191
 TGraph2DPainter.cxx:192
 TGraph2DPainter.cxx:193
 TGraph2DPainter.cxx:194
 TGraph2DPainter.cxx:195
 TGraph2DPainter.cxx:196
 TGraph2DPainter.cxx:197
 TGraph2DPainter.cxx:198
 TGraph2DPainter.cxx:199
 TGraph2DPainter.cxx:200
 TGraph2DPainter.cxx:201
 TGraph2DPainter.cxx:202
 TGraph2DPainter.cxx:203
 TGraph2DPainter.cxx:204
 TGraph2DPainter.cxx:205
 TGraph2DPainter.cxx:206
 TGraph2DPainter.cxx:207
 TGraph2DPainter.cxx:208
 TGraph2DPainter.cxx:209
 TGraph2DPainter.cxx:210
 TGraph2DPainter.cxx:211
 TGraph2DPainter.cxx:212
 TGraph2DPainter.cxx:213
 TGraph2DPainter.cxx:214
 TGraph2DPainter.cxx:215
 TGraph2DPainter.cxx:216
 TGraph2DPainter.cxx:217
 TGraph2DPainter.cxx:218
 TGraph2DPainter.cxx:219
 TGraph2DPainter.cxx:220
 TGraph2DPainter.cxx:221
 TGraph2DPainter.cxx:222
 TGraph2DPainter.cxx:223
 TGraph2DPainter.cxx:224
 TGraph2DPainter.cxx:225
 TGraph2DPainter.cxx:226
 TGraph2DPainter.cxx:227
 TGraph2DPainter.cxx:228
 TGraph2DPainter.cxx:229
 TGraph2DPainter.cxx:230
 TGraph2DPainter.cxx:231
 TGraph2DPainter.cxx:232
 TGraph2DPainter.cxx:233
 TGraph2DPainter.cxx:234
 TGraph2DPainter.cxx:235
 TGraph2DPainter.cxx:236
 TGraph2DPainter.cxx:237
 TGraph2DPainter.cxx:238
 TGraph2DPainter.cxx:239
 TGraph2DPainter.cxx:240
 TGraph2DPainter.cxx:241
 TGraph2DPainter.cxx:242
 TGraph2DPainter.cxx:243
 TGraph2DPainter.cxx:244
 TGraph2DPainter.cxx:245
 TGraph2DPainter.cxx:246
 TGraph2DPainter.cxx:247
 TGraph2DPainter.cxx:248
 TGraph2DPainter.cxx:249
 TGraph2DPainter.cxx:250
 TGraph2DPainter.cxx:251
 TGraph2DPainter.cxx:252
 TGraph2DPainter.cxx:253
 TGraph2DPainter.cxx:254
 TGraph2DPainter.cxx:255
 TGraph2DPainter.cxx:256
 TGraph2DPainter.cxx:257
 TGraph2DPainter.cxx:258
 TGraph2DPainter.cxx:259
 TGraph2DPainter.cxx:260
 TGraph2DPainter.cxx:261
 TGraph2DPainter.cxx:262
 TGraph2DPainter.cxx:263
 TGraph2DPainter.cxx:264
 TGraph2DPainter.cxx:265
 TGraph2DPainter.cxx:266
 TGraph2DPainter.cxx:267
 TGraph2DPainter.cxx:268
 TGraph2DPainter.cxx:269
 TGraph2DPainter.cxx:270
 TGraph2DPainter.cxx:271
 TGraph2DPainter.cxx:272
 TGraph2DPainter.cxx:273
 TGraph2DPainter.cxx:274
 TGraph2DPainter.cxx:275
 TGraph2DPainter.cxx:276
 TGraph2DPainter.cxx:277
 TGraph2DPainter.cxx:278
 TGraph2DPainter.cxx:279
 TGraph2DPainter.cxx:280
 TGraph2DPainter.cxx:281
 TGraph2DPainter.cxx:282
 TGraph2DPainter.cxx:283
 TGraph2DPainter.cxx:284
 TGraph2DPainter.cxx:285
 TGraph2DPainter.cxx:286
 TGraph2DPainter.cxx:287
 TGraph2DPainter.cxx:288
 TGraph2DPainter.cxx:289
 TGraph2DPainter.cxx:290
 TGraph2DPainter.cxx:291
 TGraph2DPainter.cxx:292
 TGraph2DPainter.cxx:293
 TGraph2DPainter.cxx:294
 TGraph2DPainter.cxx:295
 TGraph2DPainter.cxx:296
 TGraph2DPainter.cxx:297
 TGraph2DPainter.cxx:298
 TGraph2DPainter.cxx:299
 TGraph2DPainter.cxx:300
 TGraph2DPainter.cxx:301
 TGraph2DPainter.cxx:302
 TGraph2DPainter.cxx:303
 TGraph2DPainter.cxx:304
 TGraph2DPainter.cxx:305
 TGraph2DPainter.cxx:306
 TGraph2DPainter.cxx:307
 TGraph2DPainter.cxx:308
 TGraph2DPainter.cxx:309
 TGraph2DPainter.cxx:310
 TGraph2DPainter.cxx:311
 TGraph2DPainter.cxx:312
 TGraph2DPainter.cxx:313
 TGraph2DPainter.cxx:314
 TGraph2DPainter.cxx:315
 TGraph2DPainter.cxx:316
 TGraph2DPainter.cxx:317
 TGraph2DPainter.cxx:318
 TGraph2DPainter.cxx:319
 TGraph2DPainter.cxx:320
 TGraph2DPainter.cxx:321
 TGraph2DPainter.cxx:322
 TGraph2DPainter.cxx:323
 TGraph2DPainter.cxx:324
 TGraph2DPainter.cxx:325
 TGraph2DPainter.cxx:326
 TGraph2DPainter.cxx:327
 TGraph2DPainter.cxx:328
 TGraph2DPainter.cxx:329
 TGraph2DPainter.cxx:330
 TGraph2DPainter.cxx:331
 TGraph2DPainter.cxx:332
 TGraph2DPainter.cxx:333
 TGraph2DPainter.cxx:334
 TGraph2DPainter.cxx:335
 TGraph2DPainter.cxx:336
 TGraph2DPainter.cxx:337
 TGraph2DPainter.cxx:338
 TGraph2DPainter.cxx:339
 TGraph2DPainter.cxx:340
 TGraph2DPainter.cxx:341
 TGraph2DPainter.cxx:342
 TGraph2DPainter.cxx:343
 TGraph2DPainter.cxx:344
 TGraph2DPainter.cxx:345
 TGraph2DPainter.cxx:346
 TGraph2DPainter.cxx:347
 TGraph2DPainter.cxx:348
 TGraph2DPainter.cxx:349
 TGraph2DPainter.cxx:350
 TGraph2DPainter.cxx:351
 TGraph2DPainter.cxx:352
 TGraph2DPainter.cxx:353
 TGraph2DPainter.cxx:354
 TGraph2DPainter.cxx:355
 TGraph2DPainter.cxx:356
 TGraph2DPainter.cxx:357
 TGraph2DPainter.cxx:358
 TGraph2DPainter.cxx:359
 TGraph2DPainter.cxx:360
 TGraph2DPainter.cxx:361
 TGraph2DPainter.cxx:362
 TGraph2DPainter.cxx:363
 TGraph2DPainter.cxx:364
 TGraph2DPainter.cxx:365
 TGraph2DPainter.cxx:366
 TGraph2DPainter.cxx:367
 TGraph2DPainter.cxx:368
 TGraph2DPainter.cxx:369
 TGraph2DPainter.cxx:370
 TGraph2DPainter.cxx:371
 TGraph2DPainter.cxx:372
 TGraph2DPainter.cxx:373
 TGraph2DPainter.cxx:374
 TGraph2DPainter.cxx:375
 TGraph2DPainter.cxx:376
 TGraph2DPainter.cxx:377
 TGraph2DPainter.cxx:378
 TGraph2DPainter.cxx:379
 TGraph2DPainter.cxx:380
 TGraph2DPainter.cxx:381
 TGraph2DPainter.cxx:382
 TGraph2DPainter.cxx:383
 TGraph2DPainter.cxx:384
 TGraph2DPainter.cxx:385
 TGraph2DPainter.cxx:386
 TGraph2DPainter.cxx:387
 TGraph2DPainter.cxx:388
 TGraph2DPainter.cxx:389
 TGraph2DPainter.cxx:390
 TGraph2DPainter.cxx:391
 TGraph2DPainter.cxx:392
 TGraph2DPainter.cxx:393
 TGraph2DPainter.cxx:394
 TGraph2DPainter.cxx:395
 TGraph2DPainter.cxx:396
 TGraph2DPainter.cxx:397
 TGraph2DPainter.cxx:398
 TGraph2DPainter.cxx:399
 TGraph2DPainter.cxx:400
 TGraph2DPainter.cxx:401
 TGraph2DPainter.cxx:402
 TGraph2DPainter.cxx:403
 TGraph2DPainter.cxx:404
 TGraph2DPainter.cxx:405
 TGraph2DPainter.cxx:406
 TGraph2DPainter.cxx:407
 TGraph2DPainter.cxx:408
 TGraph2DPainter.cxx:409
 TGraph2DPainter.cxx:410
 TGraph2DPainter.cxx:411
 TGraph2DPainter.cxx:412
 TGraph2DPainter.cxx:413
 TGraph2DPainter.cxx:414
 TGraph2DPainter.cxx:415
 TGraph2DPainter.cxx:416
 TGraph2DPainter.cxx:417
 TGraph2DPainter.cxx:418
 TGraph2DPainter.cxx:419
 TGraph2DPainter.cxx:420
 TGraph2DPainter.cxx:421
 TGraph2DPainter.cxx:422
 TGraph2DPainter.cxx:423
 TGraph2DPainter.cxx:424
 TGraph2DPainter.cxx:425
 TGraph2DPainter.cxx:426
 TGraph2DPainter.cxx:427
 TGraph2DPainter.cxx:428
 TGraph2DPainter.cxx:429
 TGraph2DPainter.cxx:430
 TGraph2DPainter.cxx:431
 TGraph2DPainter.cxx:432
 TGraph2DPainter.cxx:433
 TGraph2DPainter.cxx:434
 TGraph2DPainter.cxx:435
 TGraph2DPainter.cxx:436
 TGraph2DPainter.cxx:437
 TGraph2DPainter.cxx:438
 TGraph2DPainter.cxx:439
 TGraph2DPainter.cxx:440
 TGraph2DPainter.cxx:441
 TGraph2DPainter.cxx:442
 TGraph2DPainter.cxx:443
 TGraph2DPainter.cxx:444
 TGraph2DPainter.cxx:445
 TGraph2DPainter.cxx:446
 TGraph2DPainter.cxx:447
 TGraph2DPainter.cxx:448
 TGraph2DPainter.cxx:449
 TGraph2DPainter.cxx:450
 TGraph2DPainter.cxx:451
 TGraph2DPainter.cxx:452
 TGraph2DPainter.cxx:453
 TGraph2DPainter.cxx:454
 TGraph2DPainter.cxx:455
 TGraph2DPainter.cxx:456
 TGraph2DPainter.cxx:457
 TGraph2DPainter.cxx:458
 TGraph2DPainter.cxx:459
 TGraph2DPainter.cxx:460
 TGraph2DPainter.cxx:461
 TGraph2DPainter.cxx:462
 TGraph2DPainter.cxx:463
 TGraph2DPainter.cxx:464
 TGraph2DPainter.cxx:465
 TGraph2DPainter.cxx:466
 TGraph2DPainter.cxx:467
 TGraph2DPainter.cxx:468
 TGraph2DPainter.cxx:469
 TGraph2DPainter.cxx:470
 TGraph2DPainter.cxx:471
 TGraph2DPainter.cxx:472
 TGraph2DPainter.cxx:473
 TGraph2DPainter.cxx:474
 TGraph2DPainter.cxx:475
 TGraph2DPainter.cxx:476
 TGraph2DPainter.cxx:477
 TGraph2DPainter.cxx:478
 TGraph2DPainter.cxx:479
 TGraph2DPainter.cxx:480
 TGraph2DPainter.cxx:481
 TGraph2DPainter.cxx:482
 TGraph2DPainter.cxx:483
 TGraph2DPainter.cxx:484
 TGraph2DPainter.cxx:485
 TGraph2DPainter.cxx:486
 TGraph2DPainter.cxx:487
 TGraph2DPainter.cxx:488
 TGraph2DPainter.cxx:489
 TGraph2DPainter.cxx:490
 TGraph2DPainter.cxx:491
 TGraph2DPainter.cxx:492
 TGraph2DPainter.cxx:493
 TGraph2DPainter.cxx:494
 TGraph2DPainter.cxx:495
 TGraph2DPainter.cxx:496
 TGraph2DPainter.cxx:497
 TGraph2DPainter.cxx:498
 TGraph2DPainter.cxx:499
 TGraph2DPainter.cxx:500
 TGraph2DPainter.cxx:501
 TGraph2DPainter.cxx:502
 TGraph2DPainter.cxx:503
 TGraph2DPainter.cxx:504
 TGraph2DPainter.cxx:505
 TGraph2DPainter.cxx:506
 TGraph2DPainter.cxx:507
 TGraph2DPainter.cxx:508
 TGraph2DPainter.cxx:509
 TGraph2DPainter.cxx:510
 TGraph2DPainter.cxx:511
 TGraph2DPainter.cxx:512
 TGraph2DPainter.cxx:513
 TGraph2DPainter.cxx:514
 TGraph2DPainter.cxx:515
 TGraph2DPainter.cxx:516
 TGraph2DPainter.cxx:517
 TGraph2DPainter.cxx:518
 TGraph2DPainter.cxx:519
 TGraph2DPainter.cxx:520
 TGraph2DPainter.cxx:521
 TGraph2DPainter.cxx:522
 TGraph2DPainter.cxx:523
 TGraph2DPainter.cxx:524
 TGraph2DPainter.cxx:525
 TGraph2DPainter.cxx:526
 TGraph2DPainter.cxx:527
 TGraph2DPainter.cxx:528
 TGraph2DPainter.cxx:529
 TGraph2DPainter.cxx:530
 TGraph2DPainter.cxx:531
 TGraph2DPainter.cxx:532
 TGraph2DPainter.cxx:533
 TGraph2DPainter.cxx:534
 TGraph2DPainter.cxx:535
 TGraph2DPainter.cxx:536
 TGraph2DPainter.cxx:537
 TGraph2DPainter.cxx:538
 TGraph2DPainter.cxx:539
 TGraph2DPainter.cxx:540
 TGraph2DPainter.cxx:541
 TGraph2DPainter.cxx:542
 TGraph2DPainter.cxx:543
 TGraph2DPainter.cxx:544
 TGraph2DPainter.cxx:545
 TGraph2DPainter.cxx:546
 TGraph2DPainter.cxx:547
 TGraph2DPainter.cxx:548
 TGraph2DPainter.cxx:549
 TGraph2DPainter.cxx:550
 TGraph2DPainter.cxx:551
 TGraph2DPainter.cxx:552
 TGraph2DPainter.cxx:553
 TGraph2DPainter.cxx:554
 TGraph2DPainter.cxx:555
 TGraph2DPainter.cxx:556
 TGraph2DPainter.cxx:557
 TGraph2DPainter.cxx:558
 TGraph2DPainter.cxx:559
 TGraph2DPainter.cxx:560
 TGraph2DPainter.cxx:561
 TGraph2DPainter.cxx:562
 TGraph2DPainter.cxx:563
 TGraph2DPainter.cxx:564
 TGraph2DPainter.cxx:565
 TGraph2DPainter.cxx:566
 TGraph2DPainter.cxx:567
 TGraph2DPainter.cxx:568
 TGraph2DPainter.cxx:569
 TGraph2DPainter.cxx:570
 TGraph2DPainter.cxx:571
 TGraph2DPainter.cxx:572
 TGraph2DPainter.cxx:573
 TGraph2DPainter.cxx:574
 TGraph2DPainter.cxx:575
 TGraph2DPainter.cxx:576
 TGraph2DPainter.cxx:577
 TGraph2DPainter.cxx:578
 TGraph2DPainter.cxx:579
 TGraph2DPainter.cxx:580
 TGraph2DPainter.cxx:581
 TGraph2DPainter.cxx:582
 TGraph2DPainter.cxx:583
 TGraph2DPainter.cxx:584
 TGraph2DPainter.cxx:585
 TGraph2DPainter.cxx:586
 TGraph2DPainter.cxx:587
 TGraph2DPainter.cxx:588
 TGraph2DPainter.cxx:589
 TGraph2DPainter.cxx:590
 TGraph2DPainter.cxx:591
 TGraph2DPainter.cxx:592
 TGraph2DPainter.cxx:593
 TGraph2DPainter.cxx:594
 TGraph2DPainter.cxx:595
 TGraph2DPainter.cxx:596
 TGraph2DPainter.cxx:597
 TGraph2DPainter.cxx:598
 TGraph2DPainter.cxx:599
 TGraph2DPainter.cxx:600
 TGraph2DPainter.cxx:601
 TGraph2DPainter.cxx:602
 TGraph2DPainter.cxx:603
 TGraph2DPainter.cxx:604
 TGraph2DPainter.cxx:605
 TGraph2DPainter.cxx:606
 TGraph2DPainter.cxx:607
 TGraph2DPainter.cxx:608
 TGraph2DPainter.cxx:609
 TGraph2DPainter.cxx:610
 TGraph2DPainter.cxx:611
 TGraph2DPainter.cxx:612
 TGraph2DPainter.cxx:613
 TGraph2DPainter.cxx:614
 TGraph2DPainter.cxx:615
 TGraph2DPainter.cxx:616
 TGraph2DPainter.cxx:617
 TGraph2DPainter.cxx:618
 TGraph2DPainter.cxx:619
 TGraph2DPainter.cxx:620
 TGraph2DPainter.cxx:621
 TGraph2DPainter.cxx:622
 TGraph2DPainter.cxx:623
 TGraph2DPainter.cxx:624
 TGraph2DPainter.cxx:625
 TGraph2DPainter.cxx:626
 TGraph2DPainter.cxx:627
 TGraph2DPainter.cxx:628
 TGraph2DPainter.cxx:629
 TGraph2DPainter.cxx:630
 TGraph2DPainter.cxx:631
 TGraph2DPainter.cxx:632
 TGraph2DPainter.cxx:633
 TGraph2DPainter.cxx:634
 TGraph2DPainter.cxx:635
 TGraph2DPainter.cxx:636
 TGraph2DPainter.cxx:637
 TGraph2DPainter.cxx:638
 TGraph2DPainter.cxx:639
 TGraph2DPainter.cxx:640
 TGraph2DPainter.cxx:641
 TGraph2DPainter.cxx:642
 TGraph2DPainter.cxx:643
 TGraph2DPainter.cxx:644
 TGraph2DPainter.cxx:645
 TGraph2DPainter.cxx:646
 TGraph2DPainter.cxx:647
 TGraph2DPainter.cxx:648
 TGraph2DPainter.cxx:649
 TGraph2DPainter.cxx:650
 TGraph2DPainter.cxx:651
 TGraph2DPainter.cxx:652
 TGraph2DPainter.cxx:653
 TGraph2DPainter.cxx:654
 TGraph2DPainter.cxx:655
 TGraph2DPainter.cxx:656
 TGraph2DPainter.cxx:657
 TGraph2DPainter.cxx:658
 TGraph2DPainter.cxx:659
 TGraph2DPainter.cxx:660
 TGraph2DPainter.cxx:661
 TGraph2DPainter.cxx:662
 TGraph2DPainter.cxx:663
 TGraph2DPainter.cxx:664
 TGraph2DPainter.cxx:665
 TGraph2DPainter.cxx:666
 TGraph2DPainter.cxx:667
 TGraph2DPainter.cxx:668
 TGraph2DPainter.cxx:669
 TGraph2DPainter.cxx:670
 TGraph2DPainter.cxx:671
 TGraph2DPainter.cxx:672
 TGraph2DPainter.cxx:673
 TGraph2DPainter.cxx:674
 TGraph2DPainter.cxx:675
 TGraph2DPainter.cxx:676
 TGraph2DPainter.cxx:677
 TGraph2DPainter.cxx:678
 TGraph2DPainter.cxx:679
 TGraph2DPainter.cxx:680
 TGraph2DPainter.cxx:681
 TGraph2DPainter.cxx:682
 TGraph2DPainter.cxx:683
 TGraph2DPainter.cxx:684
 TGraph2DPainter.cxx:685
 TGraph2DPainter.cxx:686
 TGraph2DPainter.cxx:687
 TGraph2DPainter.cxx:688
 TGraph2DPainter.cxx:689
 TGraph2DPainter.cxx:690
 TGraph2DPainter.cxx:691
 TGraph2DPainter.cxx:692
 TGraph2DPainter.cxx:693
 TGraph2DPainter.cxx:694
 TGraph2DPainter.cxx:695
 TGraph2DPainter.cxx:696
 TGraph2DPainter.cxx:697
 TGraph2DPainter.cxx:698
 TGraph2DPainter.cxx:699
 TGraph2DPainter.cxx:700
 TGraph2DPainter.cxx:701
 TGraph2DPainter.cxx:702
 TGraph2DPainter.cxx:703
 TGraph2DPainter.cxx:704
 TGraph2DPainter.cxx:705
 TGraph2DPainter.cxx:706
 TGraph2DPainter.cxx:707
 TGraph2DPainter.cxx:708
 TGraph2DPainter.cxx:709
 TGraph2DPainter.cxx:710
 TGraph2DPainter.cxx:711
 TGraph2DPainter.cxx:712
 TGraph2DPainter.cxx:713
 TGraph2DPainter.cxx:714
 TGraph2DPainter.cxx:715
 TGraph2DPainter.cxx:716
 TGraph2DPainter.cxx:717
 TGraph2DPainter.cxx:718
 TGraph2DPainter.cxx:719
 TGraph2DPainter.cxx:720
 TGraph2DPainter.cxx:721
 TGraph2DPainter.cxx:722
 TGraph2DPainter.cxx:723
 TGraph2DPainter.cxx:724
 TGraph2DPainter.cxx:725
 TGraph2DPainter.cxx:726
 TGraph2DPainter.cxx:727
 TGraph2DPainter.cxx:728
 TGraph2DPainter.cxx:729
 TGraph2DPainter.cxx:730
 TGraph2DPainter.cxx:731
 TGraph2DPainter.cxx:732
 TGraph2DPainter.cxx:733
 TGraph2DPainter.cxx:734
 TGraph2DPainter.cxx:735
 TGraph2DPainter.cxx:736
 TGraph2DPainter.cxx:737
 TGraph2DPainter.cxx:738
 TGraph2DPainter.cxx:739
 TGraph2DPainter.cxx:740
 TGraph2DPainter.cxx:741
 TGraph2DPainter.cxx:742
 TGraph2DPainter.cxx:743
 TGraph2DPainter.cxx:744
 TGraph2DPainter.cxx:745
 TGraph2DPainter.cxx:746
 TGraph2DPainter.cxx:747
 TGraph2DPainter.cxx:748
 TGraph2DPainter.cxx:749
 TGraph2DPainter.cxx:750
 TGraph2DPainter.cxx:751
 TGraph2DPainter.cxx:752
 TGraph2DPainter.cxx:753
 TGraph2DPainter.cxx:754
 TGraph2DPainter.cxx:755
 TGraph2DPainter.cxx:756
 TGraph2DPainter.cxx:757
 TGraph2DPainter.cxx:758
 TGraph2DPainter.cxx:759
 TGraph2DPainter.cxx:760
 TGraph2DPainter.cxx:761
 TGraph2DPainter.cxx:762
 TGraph2DPainter.cxx:763
 TGraph2DPainter.cxx:764
 TGraph2DPainter.cxx:765
 TGraph2DPainter.cxx:766
 TGraph2DPainter.cxx:767
 TGraph2DPainter.cxx:768
 TGraph2DPainter.cxx:769
 TGraph2DPainter.cxx:770
 TGraph2DPainter.cxx:771
 TGraph2DPainter.cxx:772
 TGraph2DPainter.cxx:773
 TGraph2DPainter.cxx:774
 TGraph2DPainter.cxx:775
 TGraph2DPainter.cxx:776
 TGraph2DPainter.cxx:777
 TGraph2DPainter.cxx:778
 TGraph2DPainter.cxx:779
 TGraph2DPainter.cxx:780
 TGraph2DPainter.cxx:781
 TGraph2DPainter.cxx:782
 TGraph2DPainter.cxx:783
 TGraph2DPainter.cxx:784
 TGraph2DPainter.cxx:785
 TGraph2DPainter.cxx:786
 TGraph2DPainter.cxx:787
 TGraph2DPainter.cxx:788
 TGraph2DPainter.cxx:789
 TGraph2DPainter.cxx:790
 TGraph2DPainter.cxx:791
 TGraph2DPainter.cxx:792
 TGraph2DPainter.cxx:793
 TGraph2DPainter.cxx:794
 TGraph2DPainter.cxx:795
 TGraph2DPainter.cxx:796
 TGraph2DPainter.cxx:797
 TGraph2DPainter.cxx:798
 TGraph2DPainter.cxx:799
 TGraph2DPainter.cxx:800
 TGraph2DPainter.cxx:801
 TGraph2DPainter.cxx:802
 TGraph2DPainter.cxx:803
 TGraph2DPainter.cxx:804
 TGraph2DPainter.cxx:805
 TGraph2DPainter.cxx:806
 TGraph2DPainter.cxx:807
 TGraph2DPainter.cxx:808
 TGraph2DPainter.cxx:809
 TGraph2DPainter.cxx:810
 TGraph2DPainter.cxx:811
 TGraph2DPainter.cxx:812
 TGraph2DPainter.cxx:813
 TGraph2DPainter.cxx:814
 TGraph2DPainter.cxx:815
 TGraph2DPainter.cxx:816
 TGraph2DPainter.cxx:817
 TGraph2DPainter.cxx:818
 TGraph2DPainter.cxx:819
 TGraph2DPainter.cxx:820
 TGraph2DPainter.cxx:821
 TGraph2DPainter.cxx:822
 TGraph2DPainter.cxx:823
 TGraph2DPainter.cxx:824
 TGraph2DPainter.cxx:825
 TGraph2DPainter.cxx:826
 TGraph2DPainter.cxx:827
 TGraph2DPainter.cxx:828
 TGraph2DPainter.cxx:829
 TGraph2DPainter.cxx:830
 TGraph2DPainter.cxx:831
 TGraph2DPainter.cxx:832
 TGraph2DPainter.cxx:833
 TGraph2DPainter.cxx:834
 TGraph2DPainter.cxx:835
 TGraph2DPainter.cxx:836
 TGraph2DPainter.cxx:837
 TGraph2DPainter.cxx:838
 TGraph2DPainter.cxx:839
 TGraph2DPainter.cxx:840
 TGraph2DPainter.cxx:841
 TGraph2DPainter.cxx:842
 TGraph2DPainter.cxx:843
 TGraph2DPainter.cxx:844
 TGraph2DPainter.cxx:845
 TGraph2DPainter.cxx:846
 TGraph2DPainter.cxx:847
 TGraph2DPainter.cxx:848
 TGraph2DPainter.cxx:849
 TGraph2DPainter.cxx:850
 TGraph2DPainter.cxx:851
 TGraph2DPainter.cxx:852
 TGraph2DPainter.cxx:853
 TGraph2DPainter.cxx:854
 TGraph2DPainter.cxx:855
 TGraph2DPainter.cxx:856
 TGraph2DPainter.cxx:857
 TGraph2DPainter.cxx:858
 TGraph2DPainter.cxx:859
 TGraph2DPainter.cxx:860
 TGraph2DPainter.cxx:861
 TGraph2DPainter.cxx:862
 TGraph2DPainter.cxx:863
 TGraph2DPainter.cxx:864
 TGraph2DPainter.cxx:865
 TGraph2DPainter.cxx:866
 TGraph2DPainter.cxx:867
 TGraph2DPainter.cxx:868
 TGraph2DPainter.cxx:869
 TGraph2DPainter.cxx:870
 TGraph2DPainter.cxx:871
 TGraph2DPainter.cxx:872
 TGraph2DPainter.cxx:873
 TGraph2DPainter.cxx:874
 TGraph2DPainter.cxx:875