ROOT logo
// @(#)root/hist:$Id$
// Author: Rene Brun   15/09/96

/*************************************************************************
 * 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 <string.h>

#include "Riostream.h"
#include "TROOT.h"
#include "TGraphErrors.h"
#include "TStyle.h"
#include "TMath.h"
#include "TArrow.h"
#include "TBox.h"
#include "TVirtualPad.h"
#include "TH1.h"
#include "TF1.h"
#include "TVector.h"
#include "TVectorD.h"
#include "TStyle.h"
#include "TClass.h"
#include "TSystem.h"
#include <string>

ClassImp(TGraphErrors)


//______________________________________________________________________________
/* Begin_Html
<center><h2>TGraphErrors class</h2></center>
A TGraphErrors is a TGraph with error bars.
<p>
The TGraphErrors painting is performed thanks to the
<a href="http://root.cern.ch/root/html/TGraphPainter.html">TGraphPainter</a>
class. All details about the various painting options are given in
<a href="http://root.cern.ch/root/html/TGraphPainter.html">this class</a>.
<p>
The picture below gives an example:
End_Html
Begin_Macro(source)
{
   c1 = new TCanvas("c1","A Simple Graph with error bars",200,10,700,500);
   c1->SetFillColor(42);
   c1->SetGrid();
   c1->GetFrame()->SetFillColor(21);
   c1->GetFrame()->SetBorderSize(12);
   Int_t n = 10;
   Double_t x[n]  = {-0.22, 0.05, 0.25, 0.35, 0.5, 0.61,0.7,0.85,0.89,0.95};
   Double_t y[n]  = {1,2.9,5.6,7.4,9,9.6,8.7,6.3,4.5,1};
   Double_t ex[n] = {.05,.1,.07,.07,.04,.05,.06,.07,.08,.05};
   Double_t ey[n] = {.8,.7,.6,.5,.4,.4,.5,.6,.7,.8};
   gr = new TGraphErrors(n,x,y,ex,ey);
   gr->SetTitle("TGraphErrors Example");
   gr->SetMarkerColor(4);
   gr->SetMarkerStyle(21);
   gr->Draw("ALP");
   return c1;
}
End_Macro */


//______________________________________________________________________________
TGraphErrors::TGraphErrors(): TGraph()
{
   // TGraphErrors default constructor.

   if (!CtorAllocate()) return;
}


//______________________________________________________________________________
TGraphErrors::TGraphErrors(Int_t n)
   : TGraph(n)
{
   // TGraphErrors normal constructor.
   //
   //  the arrays are preset to zero

   if (!CtorAllocate()) return;
   FillZero(0, fNpoints);
}


//______________________________________________________________________________
TGraphErrors::TGraphErrors(Int_t n, const Float_t *x, const Float_t *y, const Float_t *ex, const Float_t *ey)
   : TGraph(n, x, y)
{
   // TGraphErrors normal constructor.
   //
   //  if ex or ey are null, the corresponding arrays are preset to zero

   if (!CtorAllocate()) return;

   for (Int_t i = 0; i < n; i++) {
      if (ex) fEX[i] = ex[i];
      else    fEX[i] = 0;
      if (ey) fEY[i] = ey[i];
      else    fEY[i] = 0;
   }
}


//______________________________________________________________________________
TGraphErrors::TGraphErrors(Int_t n, const Double_t *x, const Double_t *y, const Double_t *ex, const Double_t *ey)
   : TGraph(n, x, y)
{
   // TGraphErrors normal constructor.
   //
   //  if ex or ey are null, the corresponding arrays are preset to zero

   if (!CtorAllocate()) return;

   n = sizeof(Double_t) * fNpoints;
   if (ex) memcpy(fEX, ex, n);
   else    memset(fEX, 0, n);
   if (ey) memcpy(fEY, ey, n);
   else    memset(fEY, 0, n);
}


//______________________________________________________________________________
TGraphErrors::TGraphErrors(const TVectorF &vx, const TVectorF &vy, const TVectorF &vex, const TVectorF &vey)
   : TGraph(TMath::Min(vx.GetNrows(), vy.GetNrows()), vx.GetMatrixArray(), vy.GetMatrixArray() )
{
   // constructor with four vectors of floats in input
   // A grapherrors is built with the X coordinates taken from vx and Y coord from vy
   // and the errors from vectors vex and vey.
   // The number of points in the graph is the minimum of number of points
   // in vx and vy.

   if (!CtorAllocate()) return;
   Int_t ivexlow = vex.GetLwb();
   Int_t iveylow = vey.GetLwb();
   for (Int_t i = 0; i < fNpoints; i++) {
      fEX[i]  = vex(i + ivexlow);
      fEY[i]  = vey(i + iveylow);
   }
}


//______________________________________________________________________________
TGraphErrors::TGraphErrors(const TVectorD  &vx, const TVectorD  &vy, const TVectorD  &vex, const TVectorD  &vey)
   : TGraph(TMath::Min(vx.GetNrows(), vy.GetNrows()), vx.GetMatrixArray(), vy.GetMatrixArray() )
{
   // constructor with four vectors of doubles in input
   // A grapherrors is built with the X coordinates taken from vx and Y coord from vy
   // and the errors from vectors vex and vey.
   // The number of points in the graph is the minimum of number of points
   // in vx and vy.

   if (!CtorAllocate()) return;
   Int_t ivexlow = vex.GetLwb();
   Int_t iveylow = vey.GetLwb();
   for (Int_t i = 0; i < fNpoints; i++) {
      fEX[i]  = vex(i + ivexlow);
      fEY[i]  = vey(i + iveylow);
   }
}


//______________________________________________________________________________
TGraphErrors::TGraphErrors(const TGraphErrors &gr)
   : TGraph(gr)
{
   // TGraphErrors copy constructor

   if (!CtorAllocate()) return;

   Int_t n = sizeof(Double_t) * fNpoints;
   memcpy(fEX, gr.fEX, n);
   memcpy(fEY, gr.fEY, n);
}


//______________________________________________________________________________
TGraphErrors& TGraphErrors::operator=(const TGraphErrors &gr)
{
   // TGraphErrors assignment operator

   if (this != &gr) {
      TGraph::operator=(gr);
      // N.B CtorAllocate does not delete arrays
      if (fEX) delete [] fEX;
      if (fEY) delete [] fEY;
      if (!CtorAllocate()) return *this;

      Int_t n = sizeof(Double_t) * fNpoints;
      memcpy(fEX, gr.fEX, n);
      memcpy(fEY, gr.fEY, n);
   }
   return *this;
}


//______________________________________________________________________________
TGraphErrors::TGraphErrors(const TH1 *h)
   : TGraph(h)
{
   // TGraphErrors constructor importing its parameters from the TH1 object passed as argument

   if (!CtorAllocate()) return;

   for (Int_t i = 0; i < fNpoints; i++) {
      fEX[i] = h->GetBinWidth(i + 1) * gStyle->GetErrorX();
      fEY[i] = h->GetBinError(i + 1);
   }
}


//______________________________________________________________________________
TGraphErrors::TGraphErrors(const char *filename, const char *format, Option_t *option)
   : TGraph(100)
{
   // GraphErrors constructor reading input from filename
   // filename is assumed to contain at least 3 columns of numbers
   // convention for format (default="%lg %lg %lg %lg)
   //  format = "%lg %lg"         read only 2 first columns into X,Y
   //  format = "%lg %lg %lg"     read only 3 first columns into X,Y and EY
   //  format = "%lg %lg %lg %lg" read only 4 first columns into X,Y,EX,EY.
   //
   // For files separated by a specific delimiter different from ' ' and '\t' (e.g. ';' in csv files)
   // you can avoid using %*s to bypass this delimiter by explicitly specify the "option" argument,
   // e.g. option=" \t,;" for columns of figures separated by any of these characters (' ', '\t', ',', ';')
   // used once (e.g. "1;1") or in a combined way (" 1;,;;  1").
   // Note in that case, the instanciation is about 2 times slower.
   // In case a delimiter is specified, the format "%lg %lg %lg" will read X,Y,EX.

   if (!CtorAllocate()) return;
   Double_t x, y, ex, ey;
   TString fname = filename;
   gSystem->ExpandPathName(fname);
   ifstream infile(fname.Data());
   if (!infile.good()) {
      MakeZombie();
      Error("TGraphErrors", "Cannot open file: %s, TGraphErrors is Zombie", filename);
      fNpoints = 0;
      return;
   }
   std::string line;
   Int_t np = 0;

   if (strcmp(option, "") == 0) { // No delimiters specified (standard constructor).

      Int_t ncol = CalculateScanfFields(format);  //count number of columns in format
      Int_t res;
      while (std::getline(infile, line, '\n')) {
         ex = ey = 0;
         if (ncol < 3) {
            res = sscanf(line.c_str(), format, &x, &y);
         } else if (ncol < 4) {
            res = sscanf(line.c_str(), format, &x, &y, &ey);
         } else {
            res = sscanf(line.c_str(), format, &x, &y, &ex, &ey);
         }
         if (res < 2) {
            continue; //skip empty and ill-formed lines
         }
         SetPoint(np, x, y);
         SetPointError(np, ex, ey);
         np++;
      }
      Set(np);

   } else { // A delimiter has been specified in "option"

      // Checking format and creating its boolean equivalent
      TString format_ = TString(format) ;
      format_.ReplaceAll(" ", "") ;
      format_.ReplaceAll("\t", "") ;
      format_.ReplaceAll("lg", "") ;
      format_.ReplaceAll("s", "") ;
      format_.ReplaceAll("%*", "0") ;
      format_.ReplaceAll("%", "1") ;
      if (!format_.IsDigit()) {
         Error("TGraphErrors", "Incorrect input format! Allowed format tags are {\"%%lg\",\"%%*lg\" or \"%%*s\"}");
         return ;
      }
      Int_t ntokens = format_.Length() ;
      if (ntokens < 2) {
         Error("TGraphErrors", "Incorrect input format! Only %d tag(s) in format whereas at least 2 \"%%lg\" tags are expected!", ntokens);
         return ;
      }
      Int_t ntokensToBeSaved = 0 ;
      Bool_t * isTokenToBeSaved = new Bool_t [ntokens] ;
      for (Int_t idx = 0; idx < ntokens; idx++) {
         isTokenToBeSaved[idx] = TString::Format("%c", format_[idx]).Atoi() ; //atoi(&format_[idx]) does not work for some reason...
         if (isTokenToBeSaved[idx] == 1) {
            ntokensToBeSaved++ ;
         }
      }
      if (ntokens >= 2 && (ntokensToBeSaved < 2 || ntokensToBeSaved > 4)) { //first condition not to repeat the previous error message
         Error("TGraphErrors", "Incorrect input format! There are %d \"%%lg\" tag(s) in format whereas 2,3 or 4 are expected!", ntokensToBeSaved);
         delete [] isTokenToBeSaved ;
         return ;
      }

      // Initializing loop variables
      Bool_t isLineToBeSkipped = kFALSE ; //empty and ill-formed lines
      char * token = NULL ;
      TString token_str = "" ;
      Int_t token_idx = 0 ;
      Double_t * value = new Double_t [4] ; //x,y,ex,ey buffers
      for (Int_t k = 0; k < 4; k++) {
         value[k] = 0. ;
      }
      Int_t value_idx = 0 ;

      // Looping
      while (std::getline(infile, line, '\n')) {
         if (line != "") {
            if (line[line.size() - 1] == char(13)) {  // removing DOS CR character
               line.erase(line.end() - 1, line.end()) ;
            }
            token = strtok(const_cast<char*>(line.c_str()), option) ;
            while (token != NULL && value_idx < ntokensToBeSaved) {
               if (isTokenToBeSaved[token_idx]) {
                  token_str = TString(token) ;
                  token_str.ReplaceAll("\t", "") ;
                  if (!token_str.IsFloat()) {
                     isLineToBeSkipped = kTRUE ;
                     break ;
                  } else {
                     value[value_idx] = token_str.Atof() ;
                     value_idx++ ;
                  }
               }
               token = strtok(NULL, option) ; //next token
               token_idx++ ;
            }
            if (!isLineToBeSkipped && value_idx > 1) { //i.e. 2,3 or 4
               x = value[0] ;
               y = value[1] ;
               ex = value[2] ;
               ey = value[3] ;
               SetPoint(np, x, y) ;
               SetPointError(np, ex, ey);
               np++ ;
            }
         }
         isLineToBeSkipped = kFALSE ;
         token = NULL ;
         token_idx = 0 ;
         value_idx = 0 ;
      }
      Set(np) ;

      // Cleaning
      delete [] isTokenToBeSaved ;
      delete [] value ;
      delete token ;
   }
   infile.close();
}


//______________________________________________________________________________
TGraphErrors::~TGraphErrors()
{
   // TGraphErrors default destructor.

   delete [] fEX;
   delete [] fEY;
}


//______________________________________________________________________________
void TGraphErrors::Apply(TF1 *f)
{
   // apply function to all the data points
   // y = f(x,y)
   //
   // The error is calculated as ey=(f(x,y+ey)-f(x,y-ey))/2
   // This is the same as error(fy) = df/dy * ey for small errors
   //
   // For generic functions the symmetric errors might become non-symmetric
   // and are averaged here. Use TGraphAsymmErrors if desired.
   //
   // error on x doesn't change
   // function suggested/implemented by Miroslav Helbich <helbich@mail.desy.de>

   Double_t x, y, ex, ey;

   if (fHistogram) {
      delete fHistogram;
      fHistogram = 0;
   }
   for (Int_t i = 0; i < GetN(); i++) {
      GetPoint(i, x, y);
      ex = GetErrorX(i);
      ey = GetErrorY(i);

      SetPoint(i, x, f->Eval(x, y));
      SetPointError(i, ex, TMath::Abs(f->Eval(x, y + ey) - f->Eval(x, y - ey)) / 2.);
   }
   if (gPad) gPad->Modified();
}


//______________________________________________________________________________
Int_t TGraphErrors::CalculateScanfFields(const char *fmt)
{
   // Calculate scan fields.

   Int_t fields = 0;
   while ((fmt = strchr(fmt, '%'))) {
      Bool_t skip = kFALSE;
      while (*(++fmt)) {
         if ('[' == *fmt) {
            if (*++fmt && '^' == *fmt) ++fmt; // "%[^]a]"
            if (*++fmt && ']' == *fmt) ++fmt; // "%[]a]" or "%[^]a]"
            while (*fmt && *fmt != ']')
               ++fmt;
            if (!skip) ++fields;
            break;
         }
         if ('%' == *fmt) break; // %% literal %
         if ('*' == *fmt) {
            skip = kTRUE; // %*d -- skip a number
         } else if (strchr("dDiouxXxfegEscpn", *fmt)) {
            if (!skip) ++fields;
            break;
         }
         // skip modifiers & field width
      }
   }
   return fields;
}


//______________________________________________________________________________
void TGraphErrors::ComputeRange(Double_t &xmin, Double_t &ymin, Double_t &xmax, Double_t &ymax) const
{
   // Compute range.

   TGraph::ComputeRange(xmin, ymin, xmax, ymax);

   for (Int_t i = 0; i < fNpoints; i++) {
      if (fX[i] - fEX[i] < xmin) {
         if (gPad && gPad->GetLogx()) {
            if (fEX[i] < fX[i]) xmin = fX[i] - fEX[i];
            else                xmin = TMath::Min(xmin, fX[i] / 3);
         } else {
            xmin = fX[i] - fEX[i];
         }
      }
      if (fX[i] + fEX[i] > xmax) xmax = fX[i] + fEX[i];
      if (fY[i] - fEY[i] < ymin) {
         if (gPad && gPad->GetLogy()) {
            if (fEY[i] < fY[i]) ymin = fY[i] - fEY[i];
            else                ymin = TMath::Min(ymin, fY[i] / 3);
         } else {
            ymin = fY[i] - fEY[i];
         }
      }
      if (fY[i] + fEY[i] > ymax) ymax = fY[i] + fEY[i];
   }
}


//______________________________________________________________________________
void TGraphErrors::CopyAndRelease(Double_t **newarrays,
                                  Int_t ibegin, Int_t iend, Int_t obegin)
{
   // Copy and release.

   CopyPoints(newarrays, ibegin, iend, obegin);
   if (newarrays) {
      delete[] fX;
      fX = newarrays[2];
      delete[] fY;
      fY = newarrays[3];
      delete[] fEX;
      fEX = newarrays[0];
      delete[] fEY;
      fEY = newarrays[1];
      delete[] newarrays;
   }
}


//______________________________________________________________________________
Bool_t TGraphErrors::CopyPoints(Double_t **arrays, Int_t ibegin, Int_t iend,
                                Int_t obegin)
{
   // Copy errors from fEX and fEY to arrays[0] and arrays[1]
   // or to fX and fY. Copy points.

   if (TGraph::CopyPoints(arrays ? arrays + 2 : 0, ibegin, iend, obegin)) {
      Int_t n = (iend - ibegin) * sizeof(Double_t);
      if (arrays) {
         memmove(&arrays[0][obegin], &fEX[ibegin], n);
         memmove(&arrays[1][obegin], &fEY[ibegin], n);
      } else {
         memmove(&fEX[obegin], &fEX[ibegin], n);
         memmove(&fEY[obegin], &fEY[ibegin], n);
      }
      return kTRUE;
   } else {
      return kFALSE;
   }
}


//______________________________________________________________________________
Bool_t TGraphErrors::CtorAllocate()
{
   // Constructor allocate.
   //Note: This function should be called only from the constructor
   // since it does not delete previously existing arrays


   if (!fNpoints) {
      fEX = fEY = 0;
      return kFALSE;
   } else {
      fEX = new Double_t[fMaxSize];
      fEY = new Double_t[fMaxSize];
   }
   return kTRUE;
}

//______________________________________________________________________________
Bool_t TGraphErrors::DoMerge(const TGraph *g)
{
   //  protected function to perform the merge operation of a graph with errors

   if (g->GetN() == 0) return kFALSE;

   Double_t * ex = g->GetEX();
   Double_t * ey = g->GetEY();
   if (ex == 0 || ey == 0 ) {
      if (g->IsA() != TGraph::Class() )
         Warning("DoMerge","Merging a %s is not compatible with a TGraphErrors - errors will be ignored",g->IsA()->GetName());
      return TGraph::DoMerge(g);
   }
   for (Int_t i = 0 ; i < g->GetN(); i++) {
      Int_t ipoint = GetN();
      Double_t x = g->GetX()[i];
      Double_t y = g->GetY()[i];
      SetPoint(ipoint, x, y);
      SetPointError( ipoint, ex[i], ey[i] );
   }
   return kTRUE;
}


//______________________________________________________________________________
void TGraphErrors::FillZero(Int_t begin, Int_t end, Bool_t from_ctor)
{
   // Set zero values for point arrays in the range [begin, end]

   if (!from_ctor) {
      TGraph::FillZero(begin, end, from_ctor);
   }
   Int_t n = (end - begin) * sizeof(Double_t);
   memset(fEX + begin, 0, n);
   memset(fEY + begin, 0, n);
}


//______________________________________________________________________________
Double_t TGraphErrors::GetErrorX(Int_t i) const
{
   // This function is called by GraphFitChisquare.
   // It returns the error along X at point i.

   if (i < 0 || i >= fNpoints) return -1;
   if (fEX) return fEX[i];
   return -1;
}


//______________________________________________________________________________
Double_t TGraphErrors::GetErrorY(Int_t i) const
{
   // This function is called by GraphFitChisquare.
   // It returns the error along Y at point i.

   if (i < 0 || i >= fNpoints) return -1;
   if (fEY) return fEY[i];
   return -1;
}


//______________________________________________________________________________
Double_t TGraphErrors::GetErrorXhigh(Int_t i) const
{
   // This function is called by GraphFitChisquare.
   // It returns the error along X at point i.

   if (i < 0 || i >= fNpoints) return -1;
   if (fEX) return fEX[i];
   return -1;
}


//______________________________________________________________________________
Double_t TGraphErrors::GetErrorXlow(Int_t i) const
{
   // This function is called by GraphFitChisquare.
   // It returns the error along X at point i.

   if (i < 0 || i >= fNpoints) return -1;
   if (fEX) return fEX[i];
   return -1;
}


//______________________________________________________________________________
Double_t TGraphErrors::GetErrorYhigh(Int_t i) const
{
   // This function is called by GraphFitChisquare.
   // It returns the error along X at point i.

   if (i < 0 || i >= fNpoints) return -1;
   if (fEY) return fEY[i];
   return -1;
}


//______________________________________________________________________________
Double_t TGraphErrors::GetErrorYlow(Int_t i) const
{
   // This function is called by GraphFitChisquare.
   // It returns the error along X at point i.

   if (i < 0 || i >= fNpoints) return -1;
   if (fEY) return fEY[i];
   return -1;
}


//______________________________________________________________________________
void TGraphErrors::Print(Option_t *) const
{
   // Print graph and errors values.

   for (Int_t i = 0; i < fNpoints; i++) {
      printf("x[%d]=%g, y[%d]=%g, ex[%d]=%g, ey[%d]=%g\n", i, fX[i], i, fY[i], i, fEX[i], i, fEY[i]);
   }
}


//______________________________________________________________________________
void TGraphErrors::SavePrimitive(ostream &out, Option_t *option /*= ""*/)
{
   // Save primitive as a C++ statement(s) on output stream out

   char quote = '"';
   out << "   " << endl;
   if (gROOT->ClassSaved(TGraphErrors::Class())) {
      out << "   ";
   } else {
      out << "   TGraphErrors *";
   }
   out << "gre = new TGraphErrors(" << fNpoints << ");" << endl;
   out << "   gre->SetName(" << quote << GetName() << quote << ");" << endl;
   out << "   gre->SetTitle(" << quote << GetTitle() << quote << ");" << endl;

   SaveFillAttributes(out, "gre", 0, 1001);
   SaveLineAttributes(out, "gre", 1, 1, 1);
   SaveMarkerAttributes(out, "gre", 1, 1, 1);

   for (Int_t i = 0; i < fNpoints; i++) {
      out << "   gre->SetPoint(" << i << "," << fX[i] << "," << fY[i] << ");" << endl;
      out << "   gre->SetPointError(" << i << "," << fEX[i] << "," << fEY[i] << ");" << endl;
   }

   static Int_t frameNumber = 0;
   if (fHistogram) {
      frameNumber++;
      TString hname = fHistogram->GetName();
      hname += frameNumber;
      fHistogram->SetName(Form("Graph_%s", hname.Data()));
      fHistogram->SavePrimitive(out, "nodraw");
      out << "   gre->SetHistogram(" << fHistogram->GetName() << ");" << endl;
      out << "   " << endl;
   }

   // save list of functions
   TIter next(fFunctions);
   TObject *obj;
   while ((obj = next())) {
      obj->SavePrimitive(out, "nodraw");
      if (obj->InheritsFrom("TPaveStats")) {
         out << "   gre->GetListOfFunctions()->Add(ptstats);" << endl;
         out << "   ptstats->SetParent(gre->GetListOfFunctions());" << endl;
      } else {
         out << "   gre->GetListOfFunctions()->Add(" << obj->GetName() << ");" << endl;
      }
   }

   const char *l = strstr(option, "multigraph");
   if (l) {
      out << "   multigraph->Add(gre," << quote << l + 10 << quote << ");" << endl;
   } else {
      out << "   gre->Draw(" << quote << option << quote << ");" << endl;
   }
}


//______________________________________________________________________________
void TGraphErrors::SetPointError(Double_t ex, Double_t ey)
{
   // Set ex and ey values for point pointed by the mouse.

   Int_t px = gPad->GetEventX();
   Int_t py = gPad->GetEventY();

   //localize point to be deleted
   Int_t ipoint = -2;
   Int_t i;
   // start with a small window (in case the mouse is very close to one point)
   for (i = 0; i < fNpoints; i++) {
      Int_t dpx = px - gPad->XtoAbsPixel(gPad->XtoPad(fX[i]));
      Int_t dpy = py - gPad->YtoAbsPixel(gPad->YtoPad(fY[i]));
      if (dpx * dpx + dpy * dpy < 25) {
         ipoint = i;
         break;
      }
   }
   if (ipoint == -2) return;

   fEX[ipoint] = ex;
   fEY[ipoint] = ey;
   gPad->Modified();
}


//______________________________________________________________________________
void TGraphErrors::SetPointError(Int_t i, Double_t ex, Double_t ey)
{
   // Set ex and ey values for point number i.

   if (i < 0) return;
   if (i >= fNpoints) {
      // re-allocate the object
      TGraphErrors::SetPoint(i, 0, 0);
   }
   fEX[i] = ex;
   fEY[i] = ey;
}


//______________________________________________________________________________
void TGraphErrors::Streamer(TBuffer &b)
{
   // Stream an object of class TGraphErrors.

   if (b.IsReading()) {
      UInt_t R__s, R__c;
      Version_t R__v = b.ReadVersion(&R__s, &R__c);
      if (R__v > 2) {
         b.ReadClassBuffer(TGraphErrors::Class(), this, R__v, R__s, R__c);
         return;
      }
      //====process old versions before automatic schema evolution
      TGraph::Streamer(b);
      fEX = new Double_t[fNpoints];
      fEY = new Double_t[fNpoints];
      if (R__v < 2) {
         Float_t *ex = new Float_t[fNpoints];
         Float_t *ey = new Float_t[fNpoints];
         b.ReadFastArray(ex, fNpoints);
         b.ReadFastArray(ey, fNpoints);
         for (Int_t i = 0; i < fNpoints; i++) {
            fEX[i] = ex[i];
            fEY[i] = ey[i];
         }
         delete [] ey;
         delete [] ex;
      } else {
         b.ReadFastArray(fEX, fNpoints);
         b.ReadFastArray(fEY, fNpoints);
      }
      b.CheckByteCount(R__s, R__c, TGraphErrors::IsA());
      //====end of old versions

   } else {
      b.WriteClassBuffer(TGraphErrors::Class(), this);
   }
}


//______________________________________________________________________________
void TGraphErrors::SwapPoints(Int_t pos1, Int_t pos2)
{
   // Swap points

   SwapValues(fEX, pos1, pos2);
   SwapValues(fEY, pos1, pos2);
   TGraph::SwapPoints(pos1, pos2);
}
 TGraphErrors.cxx:1
 TGraphErrors.cxx:2
 TGraphErrors.cxx:3
 TGraphErrors.cxx:4
 TGraphErrors.cxx:5
 TGraphErrors.cxx:6
 TGraphErrors.cxx:7
 TGraphErrors.cxx:8
 TGraphErrors.cxx:9
 TGraphErrors.cxx:10
 TGraphErrors.cxx:11
 TGraphErrors.cxx:12
 TGraphErrors.cxx:13
 TGraphErrors.cxx:14
 TGraphErrors.cxx:15
 TGraphErrors.cxx:16
 TGraphErrors.cxx:17
 TGraphErrors.cxx:18
 TGraphErrors.cxx:19
 TGraphErrors.cxx:20
 TGraphErrors.cxx:21
 TGraphErrors.cxx:22
 TGraphErrors.cxx:23
 TGraphErrors.cxx:24
 TGraphErrors.cxx:25
 TGraphErrors.cxx:26
 TGraphErrors.cxx:27
 TGraphErrors.cxx:28
 TGraphErrors.cxx:29
 TGraphErrors.cxx:30
 TGraphErrors.cxx:31
 TGraphErrors.cxx:32
 TGraphErrors.cxx:33
 TGraphErrors.cxx:34
 TGraphErrors.cxx:35
 TGraphErrors.cxx:36
 TGraphErrors.cxx:37
 TGraphErrors.cxx:38
 TGraphErrors.cxx:39
 TGraphErrors.cxx:40
 TGraphErrors.cxx:41
 TGraphErrors.cxx:42
 TGraphErrors.cxx:43
 TGraphErrors.cxx:44
 TGraphErrors.cxx:45
 TGraphErrors.cxx:46
 TGraphErrors.cxx:47
 TGraphErrors.cxx:48
 TGraphErrors.cxx:49
 TGraphErrors.cxx:50
 TGraphErrors.cxx:51
 TGraphErrors.cxx:52
 TGraphErrors.cxx:53
 TGraphErrors.cxx:54
 TGraphErrors.cxx:55
 TGraphErrors.cxx:56
 TGraphErrors.cxx:57
 TGraphErrors.cxx:58
 TGraphErrors.cxx:59
 TGraphErrors.cxx:60
 TGraphErrors.cxx:61
 TGraphErrors.cxx:62
 TGraphErrors.cxx:63
 TGraphErrors.cxx:64
 TGraphErrors.cxx:65
 TGraphErrors.cxx:66
 TGraphErrors.cxx:67
 TGraphErrors.cxx:68
 TGraphErrors.cxx:69
 TGraphErrors.cxx:70
 TGraphErrors.cxx:71
 TGraphErrors.cxx:72
 TGraphErrors.cxx:73
 TGraphErrors.cxx:74
 TGraphErrors.cxx:75
 TGraphErrors.cxx:76
 TGraphErrors.cxx:77
 TGraphErrors.cxx:78
 TGraphErrors.cxx:79
 TGraphErrors.cxx:80
 TGraphErrors.cxx:81
 TGraphErrors.cxx:82
 TGraphErrors.cxx:83
 TGraphErrors.cxx:84
 TGraphErrors.cxx:85
 TGraphErrors.cxx:86
 TGraphErrors.cxx:87
 TGraphErrors.cxx:88
 TGraphErrors.cxx:89
 TGraphErrors.cxx:90
 TGraphErrors.cxx:91
 TGraphErrors.cxx:92
 TGraphErrors.cxx:93
 TGraphErrors.cxx:94
 TGraphErrors.cxx:95
 TGraphErrors.cxx:96
 TGraphErrors.cxx:97
 TGraphErrors.cxx:98
 TGraphErrors.cxx:99
 TGraphErrors.cxx:100
 TGraphErrors.cxx:101
 TGraphErrors.cxx:102
 TGraphErrors.cxx:103
 TGraphErrors.cxx:104
 TGraphErrors.cxx:105
 TGraphErrors.cxx:106
 TGraphErrors.cxx:107
 TGraphErrors.cxx:108
 TGraphErrors.cxx:109
 TGraphErrors.cxx:110
 TGraphErrors.cxx:111
 TGraphErrors.cxx:112
 TGraphErrors.cxx:113
 TGraphErrors.cxx:114
 TGraphErrors.cxx:115
 TGraphErrors.cxx:116
 TGraphErrors.cxx:117
 TGraphErrors.cxx:118
 TGraphErrors.cxx:119
 TGraphErrors.cxx:120
 TGraphErrors.cxx:121
 TGraphErrors.cxx:122
 TGraphErrors.cxx:123
 TGraphErrors.cxx:124
 TGraphErrors.cxx:125
 TGraphErrors.cxx:126
 TGraphErrors.cxx:127
 TGraphErrors.cxx:128
 TGraphErrors.cxx:129
 TGraphErrors.cxx:130
 TGraphErrors.cxx:131
 TGraphErrors.cxx:132
 TGraphErrors.cxx:133
 TGraphErrors.cxx:134
 TGraphErrors.cxx:135
 TGraphErrors.cxx:136
 TGraphErrors.cxx:137
 TGraphErrors.cxx:138
 TGraphErrors.cxx:139
 TGraphErrors.cxx:140
 TGraphErrors.cxx:141
 TGraphErrors.cxx:142
 TGraphErrors.cxx:143
 TGraphErrors.cxx:144
 TGraphErrors.cxx:145
 TGraphErrors.cxx:146
 TGraphErrors.cxx:147
 TGraphErrors.cxx:148
 TGraphErrors.cxx:149
 TGraphErrors.cxx:150
 TGraphErrors.cxx:151
 TGraphErrors.cxx:152
 TGraphErrors.cxx:153
 TGraphErrors.cxx:154
 TGraphErrors.cxx:155
 TGraphErrors.cxx:156
 TGraphErrors.cxx:157
 TGraphErrors.cxx:158
 TGraphErrors.cxx:159
 TGraphErrors.cxx:160
 TGraphErrors.cxx:161
 TGraphErrors.cxx:162
 TGraphErrors.cxx:163
 TGraphErrors.cxx:164
 TGraphErrors.cxx:165
 TGraphErrors.cxx:166
 TGraphErrors.cxx:167
 TGraphErrors.cxx:168
 TGraphErrors.cxx:169
 TGraphErrors.cxx:170
 TGraphErrors.cxx:171
 TGraphErrors.cxx:172
 TGraphErrors.cxx:173
 TGraphErrors.cxx:174
 TGraphErrors.cxx:175
 TGraphErrors.cxx:176
 TGraphErrors.cxx:177
 TGraphErrors.cxx:178
 TGraphErrors.cxx:179
 TGraphErrors.cxx:180
 TGraphErrors.cxx:181
 TGraphErrors.cxx:182
 TGraphErrors.cxx:183
 TGraphErrors.cxx:184
 TGraphErrors.cxx:185
 TGraphErrors.cxx:186
 TGraphErrors.cxx:187
 TGraphErrors.cxx:188
 TGraphErrors.cxx:189
 TGraphErrors.cxx:190
 TGraphErrors.cxx:191
 TGraphErrors.cxx:192
 TGraphErrors.cxx:193
 TGraphErrors.cxx:194
 TGraphErrors.cxx:195
 TGraphErrors.cxx:196
 TGraphErrors.cxx:197
 TGraphErrors.cxx:198
 TGraphErrors.cxx:199
 TGraphErrors.cxx:200
 TGraphErrors.cxx:201
 TGraphErrors.cxx:202
 TGraphErrors.cxx:203
 TGraphErrors.cxx:204
 TGraphErrors.cxx:205
 TGraphErrors.cxx:206
 TGraphErrors.cxx:207
 TGraphErrors.cxx:208
 TGraphErrors.cxx:209
 TGraphErrors.cxx:210
 TGraphErrors.cxx:211
 TGraphErrors.cxx:212
 TGraphErrors.cxx:213
 TGraphErrors.cxx:214
 TGraphErrors.cxx:215
 TGraphErrors.cxx:216
 TGraphErrors.cxx:217
 TGraphErrors.cxx:218
 TGraphErrors.cxx:219
 TGraphErrors.cxx:220
 TGraphErrors.cxx:221
 TGraphErrors.cxx:222
 TGraphErrors.cxx:223
 TGraphErrors.cxx:224
 TGraphErrors.cxx:225
 TGraphErrors.cxx:226
 TGraphErrors.cxx:227
 TGraphErrors.cxx:228
 TGraphErrors.cxx:229
 TGraphErrors.cxx:230
 TGraphErrors.cxx:231
 TGraphErrors.cxx:232
 TGraphErrors.cxx:233
 TGraphErrors.cxx:234
 TGraphErrors.cxx:235
 TGraphErrors.cxx:236
 TGraphErrors.cxx:237
 TGraphErrors.cxx:238
 TGraphErrors.cxx:239
 TGraphErrors.cxx:240
 TGraphErrors.cxx:241
 TGraphErrors.cxx:242
 TGraphErrors.cxx:243
 TGraphErrors.cxx:244
 TGraphErrors.cxx:245
 TGraphErrors.cxx:246
 TGraphErrors.cxx:247
 TGraphErrors.cxx:248
 TGraphErrors.cxx:249
 TGraphErrors.cxx:250
 TGraphErrors.cxx:251
 TGraphErrors.cxx:252
 TGraphErrors.cxx:253
 TGraphErrors.cxx:254
 TGraphErrors.cxx:255
 TGraphErrors.cxx:256
 TGraphErrors.cxx:257
 TGraphErrors.cxx:258
 TGraphErrors.cxx:259
 TGraphErrors.cxx:260
 TGraphErrors.cxx:261
 TGraphErrors.cxx:262
 TGraphErrors.cxx:263
 TGraphErrors.cxx:264
 TGraphErrors.cxx:265
 TGraphErrors.cxx:266
 TGraphErrors.cxx:267
 TGraphErrors.cxx:268
 TGraphErrors.cxx:269
 TGraphErrors.cxx:270
 TGraphErrors.cxx:271
 TGraphErrors.cxx:272
 TGraphErrors.cxx:273
 TGraphErrors.cxx:274
 TGraphErrors.cxx:275
 TGraphErrors.cxx:276
 TGraphErrors.cxx:277
 TGraphErrors.cxx:278
 TGraphErrors.cxx:279
 TGraphErrors.cxx:280
 TGraphErrors.cxx:281
 TGraphErrors.cxx:282
 TGraphErrors.cxx:283
 TGraphErrors.cxx:284
 TGraphErrors.cxx:285
 TGraphErrors.cxx:286
 TGraphErrors.cxx:287
 TGraphErrors.cxx:288
 TGraphErrors.cxx:289
 TGraphErrors.cxx:290
 TGraphErrors.cxx:291
 TGraphErrors.cxx:292
 TGraphErrors.cxx:293
 TGraphErrors.cxx:294
 TGraphErrors.cxx:295
 TGraphErrors.cxx:296
 TGraphErrors.cxx:297
 TGraphErrors.cxx:298
 TGraphErrors.cxx:299
 TGraphErrors.cxx:300
 TGraphErrors.cxx:301
 TGraphErrors.cxx:302
 TGraphErrors.cxx:303
 TGraphErrors.cxx:304
 TGraphErrors.cxx:305
 TGraphErrors.cxx:306
 TGraphErrors.cxx:307
 TGraphErrors.cxx:308
 TGraphErrors.cxx:309
 TGraphErrors.cxx:310
 TGraphErrors.cxx:311
 TGraphErrors.cxx:312
 TGraphErrors.cxx:313
 TGraphErrors.cxx:314
 TGraphErrors.cxx:315
 TGraphErrors.cxx:316
 TGraphErrors.cxx:317
 TGraphErrors.cxx:318
 TGraphErrors.cxx:319
 TGraphErrors.cxx:320
 TGraphErrors.cxx:321
 TGraphErrors.cxx:322
 TGraphErrors.cxx:323
 TGraphErrors.cxx:324
 TGraphErrors.cxx:325
 TGraphErrors.cxx:326
 TGraphErrors.cxx:327
 TGraphErrors.cxx:328
 TGraphErrors.cxx:329
 TGraphErrors.cxx:330
 TGraphErrors.cxx:331
 TGraphErrors.cxx:332
 TGraphErrors.cxx:333
 TGraphErrors.cxx:334
 TGraphErrors.cxx:335
 TGraphErrors.cxx:336
 TGraphErrors.cxx:337
 TGraphErrors.cxx:338
 TGraphErrors.cxx:339
 TGraphErrors.cxx:340
 TGraphErrors.cxx:341
 TGraphErrors.cxx:342
 TGraphErrors.cxx:343
 TGraphErrors.cxx:344
 TGraphErrors.cxx:345
 TGraphErrors.cxx:346
 TGraphErrors.cxx:347
 TGraphErrors.cxx:348
 TGraphErrors.cxx:349
 TGraphErrors.cxx:350
 TGraphErrors.cxx:351
 TGraphErrors.cxx:352
 TGraphErrors.cxx:353
 TGraphErrors.cxx:354
 TGraphErrors.cxx:355
 TGraphErrors.cxx:356
 TGraphErrors.cxx:357
 TGraphErrors.cxx:358
 TGraphErrors.cxx:359
 TGraphErrors.cxx:360
 TGraphErrors.cxx:361
 TGraphErrors.cxx:362
 TGraphErrors.cxx:363
 TGraphErrors.cxx:364
 TGraphErrors.cxx:365
 TGraphErrors.cxx:366
 TGraphErrors.cxx:367
 TGraphErrors.cxx:368
 TGraphErrors.cxx:369
 TGraphErrors.cxx:370
 TGraphErrors.cxx:371
 TGraphErrors.cxx:372
 TGraphErrors.cxx:373
 TGraphErrors.cxx:374
 TGraphErrors.cxx:375
 TGraphErrors.cxx:376
 TGraphErrors.cxx:377
 TGraphErrors.cxx:378
 TGraphErrors.cxx:379
 TGraphErrors.cxx:380
 TGraphErrors.cxx:381
 TGraphErrors.cxx:382
 TGraphErrors.cxx:383
 TGraphErrors.cxx:384
 TGraphErrors.cxx:385
 TGraphErrors.cxx:386
 TGraphErrors.cxx:387
 TGraphErrors.cxx:388
 TGraphErrors.cxx:389
 TGraphErrors.cxx:390
 TGraphErrors.cxx:391
 TGraphErrors.cxx:392
 TGraphErrors.cxx:393
 TGraphErrors.cxx:394
 TGraphErrors.cxx:395
 TGraphErrors.cxx:396
 TGraphErrors.cxx:397
 TGraphErrors.cxx:398
 TGraphErrors.cxx:399
 TGraphErrors.cxx:400
 TGraphErrors.cxx:401
 TGraphErrors.cxx:402
 TGraphErrors.cxx:403
 TGraphErrors.cxx:404
 TGraphErrors.cxx:405
 TGraphErrors.cxx:406
 TGraphErrors.cxx:407
 TGraphErrors.cxx:408
 TGraphErrors.cxx:409
 TGraphErrors.cxx:410
 TGraphErrors.cxx:411
 TGraphErrors.cxx:412
 TGraphErrors.cxx:413
 TGraphErrors.cxx:414
 TGraphErrors.cxx:415
 TGraphErrors.cxx:416
 TGraphErrors.cxx:417
 TGraphErrors.cxx:418
 TGraphErrors.cxx:419
 TGraphErrors.cxx:420
 TGraphErrors.cxx:421
 TGraphErrors.cxx:422
 TGraphErrors.cxx:423
 TGraphErrors.cxx:424
 TGraphErrors.cxx:425
 TGraphErrors.cxx:426
 TGraphErrors.cxx:427
 TGraphErrors.cxx:428
 TGraphErrors.cxx:429
 TGraphErrors.cxx:430
 TGraphErrors.cxx:431
 TGraphErrors.cxx:432
 TGraphErrors.cxx:433
 TGraphErrors.cxx:434
 TGraphErrors.cxx:435
 TGraphErrors.cxx:436
 TGraphErrors.cxx:437
 TGraphErrors.cxx:438
 TGraphErrors.cxx:439
 TGraphErrors.cxx:440
 TGraphErrors.cxx:441
 TGraphErrors.cxx:442
 TGraphErrors.cxx:443
 TGraphErrors.cxx:444
 TGraphErrors.cxx:445
 TGraphErrors.cxx:446
 TGraphErrors.cxx:447
 TGraphErrors.cxx:448
 TGraphErrors.cxx:449
 TGraphErrors.cxx:450
 TGraphErrors.cxx:451
 TGraphErrors.cxx:452
 TGraphErrors.cxx:453
 TGraphErrors.cxx:454
 TGraphErrors.cxx:455
 TGraphErrors.cxx:456
 TGraphErrors.cxx:457
 TGraphErrors.cxx:458
 TGraphErrors.cxx:459
 TGraphErrors.cxx:460
 TGraphErrors.cxx:461
 TGraphErrors.cxx:462
 TGraphErrors.cxx:463
 TGraphErrors.cxx:464
 TGraphErrors.cxx:465
 TGraphErrors.cxx:466
 TGraphErrors.cxx:467
 TGraphErrors.cxx:468
 TGraphErrors.cxx:469
 TGraphErrors.cxx:470
 TGraphErrors.cxx:471
 TGraphErrors.cxx:472
 TGraphErrors.cxx:473
 TGraphErrors.cxx:474
 TGraphErrors.cxx:475
 TGraphErrors.cxx:476
 TGraphErrors.cxx:477
 TGraphErrors.cxx:478
 TGraphErrors.cxx:479
 TGraphErrors.cxx:480
 TGraphErrors.cxx:481
 TGraphErrors.cxx:482
 TGraphErrors.cxx:483
 TGraphErrors.cxx:484
 TGraphErrors.cxx:485
 TGraphErrors.cxx:486
 TGraphErrors.cxx:487
 TGraphErrors.cxx:488
 TGraphErrors.cxx:489
 TGraphErrors.cxx:490
 TGraphErrors.cxx:491
 TGraphErrors.cxx:492
 TGraphErrors.cxx:493
 TGraphErrors.cxx:494
 TGraphErrors.cxx:495
 TGraphErrors.cxx:496
 TGraphErrors.cxx:497
 TGraphErrors.cxx:498
 TGraphErrors.cxx:499
 TGraphErrors.cxx:500
 TGraphErrors.cxx:501
 TGraphErrors.cxx:502
 TGraphErrors.cxx:503
 TGraphErrors.cxx:504
 TGraphErrors.cxx:505
 TGraphErrors.cxx:506
 TGraphErrors.cxx:507
 TGraphErrors.cxx:508
 TGraphErrors.cxx:509
 TGraphErrors.cxx:510
 TGraphErrors.cxx:511
 TGraphErrors.cxx:512
 TGraphErrors.cxx:513
 TGraphErrors.cxx:514
 TGraphErrors.cxx:515
 TGraphErrors.cxx:516
 TGraphErrors.cxx:517
 TGraphErrors.cxx:518
 TGraphErrors.cxx:519
 TGraphErrors.cxx:520
 TGraphErrors.cxx:521
 TGraphErrors.cxx:522
 TGraphErrors.cxx:523
 TGraphErrors.cxx:524
 TGraphErrors.cxx:525
 TGraphErrors.cxx:526
 TGraphErrors.cxx:527
 TGraphErrors.cxx:528
 TGraphErrors.cxx:529
 TGraphErrors.cxx:530
 TGraphErrors.cxx:531
 TGraphErrors.cxx:532
 TGraphErrors.cxx:533
 TGraphErrors.cxx:534
 TGraphErrors.cxx:535
 TGraphErrors.cxx:536
 TGraphErrors.cxx:537
 TGraphErrors.cxx:538
 TGraphErrors.cxx:539
 TGraphErrors.cxx:540
 TGraphErrors.cxx:541
 TGraphErrors.cxx:542
 TGraphErrors.cxx:543
 TGraphErrors.cxx:544
 TGraphErrors.cxx:545
 TGraphErrors.cxx:546
 TGraphErrors.cxx:547
 TGraphErrors.cxx:548
 TGraphErrors.cxx:549
 TGraphErrors.cxx:550
 TGraphErrors.cxx:551
 TGraphErrors.cxx:552
 TGraphErrors.cxx:553
 TGraphErrors.cxx:554
 TGraphErrors.cxx:555
 TGraphErrors.cxx:556
 TGraphErrors.cxx:557
 TGraphErrors.cxx:558
 TGraphErrors.cxx:559
 TGraphErrors.cxx:560
 TGraphErrors.cxx:561
 TGraphErrors.cxx:562
 TGraphErrors.cxx:563
 TGraphErrors.cxx:564
 TGraphErrors.cxx:565
 TGraphErrors.cxx:566
 TGraphErrors.cxx:567
 TGraphErrors.cxx:568
 TGraphErrors.cxx:569
 TGraphErrors.cxx:570
 TGraphErrors.cxx:571
 TGraphErrors.cxx:572
 TGraphErrors.cxx:573
 TGraphErrors.cxx:574
 TGraphErrors.cxx:575
 TGraphErrors.cxx:576
 TGraphErrors.cxx:577
 TGraphErrors.cxx:578
 TGraphErrors.cxx:579
 TGraphErrors.cxx:580
 TGraphErrors.cxx:581
 TGraphErrors.cxx:582
 TGraphErrors.cxx:583
 TGraphErrors.cxx:584
 TGraphErrors.cxx:585
 TGraphErrors.cxx:586
 TGraphErrors.cxx:587
 TGraphErrors.cxx:588
 TGraphErrors.cxx:589
 TGraphErrors.cxx:590
 TGraphErrors.cxx:591
 TGraphErrors.cxx:592
 TGraphErrors.cxx:593
 TGraphErrors.cxx:594
 TGraphErrors.cxx:595
 TGraphErrors.cxx:596
 TGraphErrors.cxx:597
 TGraphErrors.cxx:598
 TGraphErrors.cxx:599
 TGraphErrors.cxx:600
 TGraphErrors.cxx:601
 TGraphErrors.cxx:602
 TGraphErrors.cxx:603
 TGraphErrors.cxx:604
 TGraphErrors.cxx:605
 TGraphErrors.cxx:606
 TGraphErrors.cxx:607
 TGraphErrors.cxx:608
 TGraphErrors.cxx:609
 TGraphErrors.cxx:610
 TGraphErrors.cxx:611
 TGraphErrors.cxx:612
 TGraphErrors.cxx:613
 TGraphErrors.cxx:614
 TGraphErrors.cxx:615
 TGraphErrors.cxx:616
 TGraphErrors.cxx:617
 TGraphErrors.cxx:618
 TGraphErrors.cxx:619
 TGraphErrors.cxx:620
 TGraphErrors.cxx:621
 TGraphErrors.cxx:622
 TGraphErrors.cxx:623
 TGraphErrors.cxx:624
 TGraphErrors.cxx:625
 TGraphErrors.cxx:626
 TGraphErrors.cxx:627
 TGraphErrors.cxx:628
 TGraphErrors.cxx:629
 TGraphErrors.cxx:630
 TGraphErrors.cxx:631
 TGraphErrors.cxx:632
 TGraphErrors.cxx:633
 TGraphErrors.cxx:634
 TGraphErrors.cxx:635
 TGraphErrors.cxx:636
 TGraphErrors.cxx:637
 TGraphErrors.cxx:638
 TGraphErrors.cxx:639
 TGraphErrors.cxx:640
 TGraphErrors.cxx:641
 TGraphErrors.cxx:642
 TGraphErrors.cxx:643
 TGraphErrors.cxx:644
 TGraphErrors.cxx:645
 TGraphErrors.cxx:646
 TGraphErrors.cxx:647
 TGraphErrors.cxx:648
 TGraphErrors.cxx:649
 TGraphErrors.cxx:650
 TGraphErrors.cxx:651
 TGraphErrors.cxx:652
 TGraphErrors.cxx:653
 TGraphErrors.cxx:654
 TGraphErrors.cxx:655
 TGraphErrors.cxx:656
 TGraphErrors.cxx:657
 TGraphErrors.cxx:658
 TGraphErrors.cxx:659
 TGraphErrors.cxx:660
 TGraphErrors.cxx:661
 TGraphErrors.cxx:662
 TGraphErrors.cxx:663
 TGraphErrors.cxx:664
 TGraphErrors.cxx:665
 TGraphErrors.cxx:666
 TGraphErrors.cxx:667
 TGraphErrors.cxx:668
 TGraphErrors.cxx:669
 TGraphErrors.cxx:670
 TGraphErrors.cxx:671
 TGraphErrors.cxx:672
 TGraphErrors.cxx:673
 TGraphErrors.cxx:674
 TGraphErrors.cxx:675
 TGraphErrors.cxx:676
 TGraphErrors.cxx:677
 TGraphErrors.cxx:678
 TGraphErrors.cxx:679
 TGraphErrors.cxx:680
 TGraphErrors.cxx:681
 TGraphErrors.cxx:682
 TGraphErrors.cxx:683
 TGraphErrors.cxx:684
 TGraphErrors.cxx:685
 TGraphErrors.cxx:686
 TGraphErrors.cxx:687
 TGraphErrors.cxx:688
 TGraphErrors.cxx:689
 TGraphErrors.cxx:690
 TGraphErrors.cxx:691
 TGraphErrors.cxx:692
 TGraphErrors.cxx:693
 TGraphErrors.cxx:694
 TGraphErrors.cxx:695
 TGraphErrors.cxx:696
 TGraphErrors.cxx:697
 TGraphErrors.cxx:698
 TGraphErrors.cxx:699
 TGraphErrors.cxx:700
 TGraphErrors.cxx:701
 TGraphErrors.cxx:702
 TGraphErrors.cxx:703
 TGraphErrors.cxx:704
 TGraphErrors.cxx:705
 TGraphErrors.cxx:706
 TGraphErrors.cxx:707
 TGraphErrors.cxx:708
 TGraphErrors.cxx:709
 TGraphErrors.cxx:710
 TGraphErrors.cxx:711
 TGraphErrors.cxx:712
 TGraphErrors.cxx:713
 TGraphErrors.cxx:714
 TGraphErrors.cxx:715
 TGraphErrors.cxx:716
 TGraphErrors.cxx:717
 TGraphErrors.cxx:718
 TGraphErrors.cxx:719
 TGraphErrors.cxx:720
 TGraphErrors.cxx:721
 TGraphErrors.cxx:722
 TGraphErrors.cxx:723
 TGraphErrors.cxx:724
 TGraphErrors.cxx:725
 TGraphErrors.cxx:726
 TGraphErrors.cxx:727
 TGraphErrors.cxx:728
 TGraphErrors.cxx:729
 TGraphErrors.cxx:730
 TGraphErrors.cxx:731
 TGraphErrors.cxx:732
 TGraphErrors.cxx:733
 TGraphErrors.cxx:734
 TGraphErrors.cxx:735
 TGraphErrors.cxx:736
 TGraphErrors.cxx:737
 TGraphErrors.cxx:738
 TGraphErrors.cxx:739
 TGraphErrors.cxx:740
 TGraphErrors.cxx:741
 TGraphErrors.cxx:742
 TGraphErrors.cxx:743
 TGraphErrors.cxx:744
 TGraphErrors.cxx:745
 TGraphErrors.cxx:746
 TGraphErrors.cxx:747
 TGraphErrors.cxx:748
 TGraphErrors.cxx:749
 TGraphErrors.cxx:750
 TGraphErrors.cxx:751
 TGraphErrors.cxx:752
 TGraphErrors.cxx:753
 TGraphErrors.cxx:754
 TGraphErrors.cxx:755
 TGraphErrors.cxx:756
 TGraphErrors.cxx:757
 TGraphErrors.cxx:758
 TGraphErrors.cxx:759
 TGraphErrors.cxx:760
 TGraphErrors.cxx:761
 TGraphErrors.cxx:762
 TGraphErrors.cxx:763
 TGraphErrors.cxx:764
 TGraphErrors.cxx:765
 TGraphErrors.cxx:766
 TGraphErrors.cxx:767
 TGraphErrors.cxx:768
 TGraphErrors.cxx:769
 TGraphErrors.cxx:770
 TGraphErrors.cxx:771
 TGraphErrors.cxx:772
 TGraphErrors.cxx:773
 TGraphErrors.cxx:774
 TGraphErrors.cxx:775
 TGraphErrors.cxx:776
 TGraphErrors.cxx:777
 TGraphErrors.cxx:778
 TGraphErrors.cxx:779
 TGraphErrors.cxx:780
 TGraphErrors.cxx:781
 TGraphErrors.cxx:782
 TGraphErrors.cxx:783
 TGraphErrors.cxx:784
 TGraphErrors.cxx:785
 TGraphErrors.cxx:786
 TGraphErrors.cxx:787
 TGraphErrors.cxx:788
 TGraphErrors.cxx:789
 TGraphErrors.cxx:790
 TGraphErrors.cxx:791
 TGraphErrors.cxx:792
 TGraphErrors.cxx:793
 TGraphErrors.cxx:794
 TGraphErrors.cxx:795
 TGraphErrors.cxx:796
 TGraphErrors.cxx:797
 TGraphErrors.cxx:798
 TGraphErrors.cxx:799