ROOT logo
// @(#)root/hist:$Id: TGraphBentErrors.cxx 30393 2009-09-24 08:45:21Z couet $
// Author: Dave Morrison  30/06/2003

/*************************************************************************
 * Copyright (C) 1995-2003, 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 "TGraphBentErrors.h"
#include "TStyle.h"
#include "TMath.h"
#include "TArrow.h"
#include "TBox.h"
#include "TVirtualPad.h"
#include "TH1.h"
#include "TF1.h"

ClassImp(TGraphBentErrors)


//______________________________________________________________________________
/* Begin_Html
<center><h2>TGraphBentErrors class</h2></center>
A TGraphBentErrors is a TGraph with bent, assymetric error bars.
<p>
The TGraphBentErrors painting is permofed 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 bent error bars",200,10,700,500);
   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 exl[n]  = {.05,.1,.07,.07,.04,.05,.06,.07,.08,.05};
   Double_t eyl[n]  = {.8,.7,.6,.5,.4,.4,.5,.6,.7,.8};
   Double_t exh[n]  = {.02,.08,.05,.05,.03,.03,.04,.05,.06,.03};
   Double_t eyh[n]  = {.6,.5,.4,.3,.2,.2,.3,.4,.5,.6};
   Double_t exld[n] = {.0,.0,.0,.0,.0,.0,.0,.0,.0,.0};
   Double_t eyld[n] = {.0,.0,.05,.0,.0,.0,.0,.0,.0,.0};
   Double_t exhd[n] = {.0,.0,.0,.0,.0,.0,.0,.0,.0,.0};
   Double_t eyhd[n] = {.0,.0,.0,.0,.0,.0,.0,.0,.05,.0};
   gr = new TGraphBentErrors(n,x,y,exl,exh,eyl,eyh,exld,exhd,eyld,eyhd);
   gr->SetTitle("TGraphBentErrors Example");
   gr->SetMarkerColor(4);
   gr->SetMarkerStyle(21);
   gr->Draw("ALP");
   return c1;
}
End_Macro */


//_____________________________________________________________________________
TGraphBentErrors::TGraphBentErrors(): TGraph()
{
   // TGraphBentErrors default constructor.

   CtorAllocate();
}


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

   if (!CtorAllocate()) return;
   Int_t n = fNpoints*sizeof(Double_t);
   memcpy(fEXlow, gr.fEXlow, n);
   memcpy(fEYlow, gr.fEYlow, n);
   memcpy(fEXhigh, gr.fEXhigh, n);
   memcpy(fEYhigh, gr.fEYhigh, n);
   memcpy(fEXlowd, gr.fEXlowd, n);
   memcpy(fEYlowd, gr.fEYlowd, n);
   memcpy(fEXhighd, gr.fEXhighd, n);
   memcpy(fEYhighd, gr.fEYhighd, n);
}


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

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


//_____________________________________________________________________________
TGraphBentErrors::TGraphBentErrors(Int_t n,
                                   const Float_t *x, const Float_t *y,
                                   const Float_t *exl, const Float_t *exh,
                                   const Float_t *eyl, const Float_t *eyh,
                                   const Float_t *exld, const Float_t *exhd,
                                   const Float_t *eyld, const Float_t *eyhd)
  : TGraph(n,x,y)
{
   // TGraphBentErrors normal constructor.
   //
   // if exl,h or eyl,h are null, the corresponding arrays are preset to zero

   if (!CtorAllocate()) return;

   for (Int_t i=0;i<n;i++) {
      if (exl) fEXlow[i]  = exl[i];
      else     fEXlow[i]  = 0;
      if (exh) fEXhigh[i] = exh[i];
      else     fEXhigh[i] = 0;
      if (eyl) fEYlow[i]  = eyl[i];
      else     fEYlow[i]  = 0;
      if (eyh) fEYhigh[i] = eyh[i];
      else     fEYhigh[i] = 0;

      if (exld) fEXlowd[i]  = exld[i];
      else     fEXlowd[i]  = 0;
      if (exhd) fEXhighd[i] = exhd[i];
      else     fEXhighd[i] = 0;
      if (eyld) fEYlowd[i]  = eyld[i];
      else     fEYlowd[i]  = 0;
      if (eyhd) fEYhighd[i] = eyhd[i];
      else     fEYhighd[i] = 0;
   }
}


//_____________________________________________________________________________
TGraphBentErrors::TGraphBentErrors(Int_t n,
                                   const Double_t *x, const Double_t *y,
                                   const Double_t *exl, const Double_t *exh,
                                   const Double_t *eyl, const Double_t *eyh,
                                   const Double_t *exld, const Double_t *exhd,
                                   const Double_t *eyld, const Double_t *eyhd)
  : TGraph(n,x,y)
{
   // TGraphBentErrors normal constructor.
   //
   // if exl,h or eyl,h are null, the corresponding arrays are preset to zero

   if (!CtorAllocate()) return;
   n = sizeof(Double_t)*fNpoints;

      if (exl) memcpy(fEXlow, exl, n);
      else     memset(fEXlow, 0, n);
      if (exh) memcpy(fEXhigh, exh, n);
      else     memset(fEXhigh, 0, n);
      if (eyl) memcpy(fEYlow, eyl, n);
      else     memset(fEYlow, 0, n);
      if (eyh) memcpy(fEYhigh, eyh, n);
      else     memset(fEYhigh, 0, n);

      if (exld) memcpy(fEXlowd, exld, n);
      else      memset(fEXlowd, 0, n);
      if (exhd) memcpy(fEXhighd, exhd, n);
      else      memset(fEXhighd, 0, n);
      if (eyld) memcpy(fEYlowd,  eyld, n);
      else      memset(fEYlowd, 0, n);
      if (eyhd) memcpy(fEYhighd, eyhd, n);
      else      memset(fEYhighd, 0, n);
}


//_____________________________________________________________________________
TGraphBentErrors::~TGraphBentErrors()
{
   // TGraphBentErrors default destructor.

   delete [] fEXlow;
   delete [] fEXhigh;
   delete [] fEYlow;
   delete [] fEYhigh;

   delete [] fEXlowd;
   delete [] fEXhighd;
   delete [] fEYlowd;
   delete [] fEYhighd;
}


//_____________________________________________________________________________
void TGraphBentErrors::Apply(TF1 *f)
{
   // apply a function to all data points
   // y = f(x,y)
   //
   // Errors are calculated as eyh = f(x,y+eyh)-f(x,y) and
   // eyl = f(x,y)-f(x,y-eyl)
   //
   // Special treatment has to be applied for the functions where the
   // role of "up" and "down" is reversed.
   // function suggested/implemented by Miroslav Helbich <helbich@mail.desy.de>

   Double_t x,y,exl,exh,eyl,eyh,eyl_new,eyh_new,fxy;

   for (Int_t i=0;i<GetN();i++) {
      GetPoint(i,x,y);
      exl=GetErrorXlow(i);
      exh=GetErrorXhigh(i);
      eyl=GetErrorYlow(i);
      eyh=GetErrorYhigh(i);

      fxy = f->Eval(x,y);
      SetPoint(i,x,fxy);

      // in the case of the functions like y-> -1*y the roles of the
      // upper and lower error bars is reversed
      if (f->Eval(x,y-eyl)<f->Eval(x,y+eyh)) {
         eyl_new = TMath::Abs(fxy - f->Eval(x,y-eyl));
         eyh_new = TMath::Abs(f->Eval(x,y+eyh) - fxy);
      }
      else {
         eyh_new = TMath::Abs(fxy - f->Eval(x,y-eyl));
         eyl_new = TMath::Abs(f->Eval(x,y+eyh) - fxy);
      }

      //error on x doesn't change
      SetPointError(i,exl,exh,eyl_new,eyh_new);
   }
}


//_____________________________________________________________________________
void TGraphBentErrors::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] -fEXlow[i] < xmin) {
         if (gPad && gPad->GetLogx()) {
            if (fEXlow[i] < fX[i]) xmin = fX[i]-fEXlow[i];
            else                   xmin = TMath::Min(xmin,fX[i]/3);
         } else {
            xmin = fX[i]-fEXlow[i];
         }
      }
      if (fX[i] +fEXhigh[i] > xmax) xmax = fX[i]+fEXhigh[i];
      if (fY[i] -fEYlow[i] < ymin) {
         if (gPad && gPad->GetLogy()) {
            if (fEYlow[i] < fY[i]) ymin = fY[i]-fEYlow[i];
            else                   ymin = TMath::Min(ymin,fY[i]/3);
         } else {
            ymin = fY[i]-fEYlow[i];
         }
      }
      if (fY[i] +fEYhigh[i] > ymax) ymax = fY[i]+fEYhigh[i];
   }
}


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

   CopyPoints(newarrays, ibegin, iend, obegin);
   if (newarrays) {
      delete[] fEXlow;
      fEXlow = newarrays[0];
      delete[] fEXhigh;
      fEXhigh = newarrays[1];
      delete[] fEYlow;
      fEYlow = newarrays[2];
      delete[] fEYhigh;
      fEYhigh = newarrays[3];
      delete[] fEXlowd;
      fEXlowd = newarrays[4];
      delete[] fEXhighd;
      fEXhighd = newarrays[5];
      delete[] fEYlowd;
      fEYlowd = newarrays[6];
      delete[] fEYhighd;
      fEYhighd = newarrays[7];
      delete[] fX;
      fX = newarrays[8];
      delete[] fY;
      fY = newarrays[9];
      delete[] newarrays;
   }
}


//______________________________________________________________________________
Bool_t TGraphBentErrors::CopyPoints(Double_t **arrays,
                                    Int_t ibegin, Int_t iend, Int_t obegin)
{
   // Copy errors from fE*** to arrays[***]
   // or to f*** Copy points.

   if (TGraph::CopyPoints(arrays ? arrays+8 : 0, ibegin, iend, obegin)) {
      Int_t n = (iend - ibegin)*sizeof(Double_t);
      if (arrays) {
         memmove(&arrays[0][obegin], &fEXlow[ibegin], n);
         memmove(&arrays[1][obegin], &fEXhigh[ibegin], n);
         memmove(&arrays[2][obegin], &fEYlow[ibegin], n);
         memmove(&arrays[3][obegin], &fEYhigh[ibegin], n);
         memmove(&arrays[4][obegin], &fEXlowd[ibegin], n);
         memmove(&arrays[5][obegin], &fEXhighd[ibegin], n);
         memmove(&arrays[6][obegin], &fEYlowd[ibegin], n);
         memmove(&arrays[7][obegin], &fEYhighd[ibegin], n);
      } else {
         memmove(&fEXlow[obegin], &fEXlow[ibegin], n);
         memmove(&fEXhigh[obegin], &fEXhigh[ibegin], n);
         memmove(&fEYlow[obegin], &fEYlow[ibegin], n);
         memmove(&fEYhigh[obegin], &fEYhigh[ibegin], n);
         memmove(&fEXlowd[obegin], &fEXlowd[ibegin], n);
         memmove(&fEXhighd[obegin], &fEXhighd[ibegin], n);
         memmove(&fEYlowd[obegin], &fEYlowd[ibegin], n);
         memmove(&fEYhighd[obegin], &fEYhighd[ibegin], n);
      }
      return kTRUE;
   } else {
      return kFALSE;
   }
}


//______________________________________________________________________________
Bool_t TGraphBentErrors::CtorAllocate(void)
{
   // Should be called from ctors after fNpoints has been set

   if (!fNpoints) {
      fEXlow = fEYlow = fEXhigh = fEYhigh = 0;
      fEXlowd = fEYlowd = fEXhighd = fEYhighd = 0;
      return kFALSE;
   }
   fEXlow = new Double_t[fMaxSize];
   fEYlow = new Double_t[fMaxSize];
   fEXhigh = new Double_t[fMaxSize];
   fEYhigh = new Double_t[fMaxSize];
   fEXlowd = new Double_t[fMaxSize];
   fEYlowd = new Double_t[fMaxSize];
   fEXhighd = new Double_t[fMaxSize];
   fEYhighd = new Double_t[fMaxSize];
   return kTRUE;
}


//_____________________________________________________________________________
Double_t TGraphBentErrors::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 (!fEXlow && !fEXhigh) return -1;
   Double_t elow=0, ehigh=0;
   if (fEXlow)  elow  = fEXlow[i];
   if (fEXhigh) ehigh = fEXhigh[i];
   return TMath::Sqrt(0.5*(elow*elow + ehigh*ehigh));
}


//_____________________________________________________________________________
Double_t TGraphBentErrors::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 (!fEYlow && !fEYhigh) return -1;
   Double_t elow=0, ehigh=0;
   if (fEYlow)  elow  = fEYlow[i];
   if (fEYhigh) ehigh = fEYhigh[i];
   return TMath::Sqrt(0.5*(elow*elow + ehigh*ehigh));
}


//______________________________________________________________________________
Double_t TGraphBentErrors::GetErrorXhigh(Int_t i) const
{
   // Get high error on X[i].

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


//______________________________________________________________________________
Double_t TGraphBentErrors::GetErrorXlow(Int_t i) const
{
   // Get low error on X[i].

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


//______________________________________________________________________________
Double_t TGraphBentErrors::GetErrorYhigh(Int_t i) const
{
   // Get high error on Y[i].

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


//______________________________________________________________________________
Double_t TGraphBentErrors::GetErrorYlow(Int_t i) const
{
   // Get low error on Y[i].

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


//______________________________________________________________________________
void TGraphBentErrors::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(fEXlow + begin, 0, n);
   memset(fEXhigh + begin, 0, n);
   memset(fEYlow + begin, 0, n);
   memset(fEYhigh + begin, 0, n);
   memset(fEXlowd + begin, 0, n);
   memset(fEXhighd + begin, 0, n);
   memset(fEYlowd + begin, 0, n);
   memset(fEYhighd + begin, 0, n);
}


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

   for (Int_t i=0;i<fNpoints;i++) {
      printf("x[%d]=%g, y[%d]=%g, exl[%d]=%g, exh[%d]=%g, eyl[%d]=%g, eyh[%d]=%g\n"
         ,i,fX[i],i,fY[i],i,fEXlow[i],i,fEXhigh[i],i,fEYlow[i],i,fEYhigh[i]);
   }
}


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

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

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

   for (Int_t i=0;i<fNpoints;i++) {
      out<<"   grbe->SetPoint("<<i<<","<<fX[i]<<","<<fY[i]<<");"<<endl;
      out<<"   grbe->SetPointError("<<i<<","<<fEXlow[i]<<","<<fEXhigh[i]
                                       <<","<<fEYlow[i]<<","<<fEYhigh[i]
                                       <<","<<fEXlowd[i]<<","<<fEXhighd[i]
                                       <<","<<fEYlowd[i]<<","<<fEYhighd[i]
                                       <<");"<<endl;
   }

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

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

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


//______________________________________________________________________________
void TGraphBentErrors::SetPointError(Double_t exl, Double_t exh, Double_t eyl, Double_t eyh,
                                     Double_t exld, Double_t exhd, Double_t eyld, Double_t eyhd)
{
   // 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;

   fEXlow[ipoint]   = exl;
   fEYlow[ipoint]   = eyl;
   fEXhigh[ipoint]  = exh;
   fEYhigh[ipoint]  = eyh;
   fEXlowd[ipoint]  = exld;
   fEXhighd[ipoint] = exhd;
   fEYlowd[ipoint]  = eyld;
   fEYhighd[ipoint] = eyhd;
   gPad->Modified();
}


//______________________________________________________________________________
void TGraphBentErrors::SetPointError(Int_t i, Double_t exl, Double_t exh, Double_t eyl, Double_t eyh,
                                     Double_t exld, Double_t exhd, Double_t eyld, Double_t eyhd)
{
   // Set ex and ey values for point number i.

   if (i < 0) return;
   if (i >= fNpoints) {
   // re-allocate the object
      TGraphBentErrors::SetPoint(i,0,0);
   }
   fEXlow[i]   = exl;
   fEYlow[i]   = eyl;
   fEXhigh[i]  = exh;
   fEYhigh[i]  = eyh;
   fEXlowd[i]  = exld;
   fEXhighd[i] = exhd;
   fEYlowd[i]  = eyld;
   fEYhighd[i] = eyhd;
}


//_____________________________________________________________________________
void TGraphBentErrors::SwapPoints(Int_t pos1, Int_t pos2)
{
   // Swap points.

   SwapValues(fEXlow,  pos1, pos2);
   SwapValues(fEXhigh, pos1, pos2);
   SwapValues(fEYlow,  pos1, pos2);
   SwapValues(fEYhigh, pos1, pos2);

   SwapValues(fEXlowd,  pos1, pos2);
   SwapValues(fEXhighd, pos1, pos2);
   SwapValues(fEYlowd,  pos1, pos2);
   SwapValues(fEYhighd, pos1, pos2);

   TGraph::SwapPoints(pos1, pos2);
}
 TGraphBentErrors.cxx:1
 TGraphBentErrors.cxx:2
 TGraphBentErrors.cxx:3
 TGraphBentErrors.cxx:4
 TGraphBentErrors.cxx:5
 TGraphBentErrors.cxx:6
 TGraphBentErrors.cxx:7
 TGraphBentErrors.cxx:8
 TGraphBentErrors.cxx:9
 TGraphBentErrors.cxx:10
 TGraphBentErrors.cxx:11
 TGraphBentErrors.cxx:12
 TGraphBentErrors.cxx:13
 TGraphBentErrors.cxx:14
 TGraphBentErrors.cxx:15
 TGraphBentErrors.cxx:16
 TGraphBentErrors.cxx:17
 TGraphBentErrors.cxx:18
 TGraphBentErrors.cxx:19
 TGraphBentErrors.cxx:20
 TGraphBentErrors.cxx:21
 TGraphBentErrors.cxx:22
 TGraphBentErrors.cxx:23
 TGraphBentErrors.cxx:24
 TGraphBentErrors.cxx:25
 TGraphBentErrors.cxx:26
 TGraphBentErrors.cxx:27
 TGraphBentErrors.cxx:28
 TGraphBentErrors.cxx:29
 TGraphBentErrors.cxx:30
 TGraphBentErrors.cxx:31
 TGraphBentErrors.cxx:32
 TGraphBentErrors.cxx:33
 TGraphBentErrors.cxx:34
 TGraphBentErrors.cxx:35
 TGraphBentErrors.cxx:36
 TGraphBentErrors.cxx:37
 TGraphBentErrors.cxx:38
 TGraphBentErrors.cxx:39
 TGraphBentErrors.cxx:40
 TGraphBentErrors.cxx:41
 TGraphBentErrors.cxx:42
 TGraphBentErrors.cxx:43
 TGraphBentErrors.cxx:44
 TGraphBentErrors.cxx:45
 TGraphBentErrors.cxx:46
 TGraphBentErrors.cxx:47
 TGraphBentErrors.cxx:48
 TGraphBentErrors.cxx:49
 TGraphBentErrors.cxx:50
 TGraphBentErrors.cxx:51
 TGraphBentErrors.cxx:52
 TGraphBentErrors.cxx:53
 TGraphBentErrors.cxx:54
 TGraphBentErrors.cxx:55
 TGraphBentErrors.cxx:56
 TGraphBentErrors.cxx:57
 TGraphBentErrors.cxx:58
 TGraphBentErrors.cxx:59
 TGraphBentErrors.cxx:60
 TGraphBentErrors.cxx:61
 TGraphBentErrors.cxx:62
 TGraphBentErrors.cxx:63
 TGraphBentErrors.cxx:64
 TGraphBentErrors.cxx:65
 TGraphBentErrors.cxx:66
 TGraphBentErrors.cxx:67
 TGraphBentErrors.cxx:68
 TGraphBentErrors.cxx:69
 TGraphBentErrors.cxx:70
 TGraphBentErrors.cxx:71
 TGraphBentErrors.cxx:72
 TGraphBentErrors.cxx:73
 TGraphBentErrors.cxx:74
 TGraphBentErrors.cxx:75
 TGraphBentErrors.cxx:76
 TGraphBentErrors.cxx:77
 TGraphBentErrors.cxx:78
 TGraphBentErrors.cxx:79
 TGraphBentErrors.cxx:80
 TGraphBentErrors.cxx:81
 TGraphBentErrors.cxx:82
 TGraphBentErrors.cxx:83
 TGraphBentErrors.cxx:84
 TGraphBentErrors.cxx:85
 TGraphBentErrors.cxx:86
 TGraphBentErrors.cxx:87
 TGraphBentErrors.cxx:88
 TGraphBentErrors.cxx:89
 TGraphBentErrors.cxx:90
 TGraphBentErrors.cxx:91
 TGraphBentErrors.cxx:92
 TGraphBentErrors.cxx:93
 TGraphBentErrors.cxx:94
 TGraphBentErrors.cxx:95
 TGraphBentErrors.cxx:96
 TGraphBentErrors.cxx:97
 TGraphBentErrors.cxx:98
 TGraphBentErrors.cxx:99
 TGraphBentErrors.cxx:100
 TGraphBentErrors.cxx:101
 TGraphBentErrors.cxx:102
 TGraphBentErrors.cxx:103
 TGraphBentErrors.cxx:104
 TGraphBentErrors.cxx:105
 TGraphBentErrors.cxx:106
 TGraphBentErrors.cxx:107
 TGraphBentErrors.cxx:108
 TGraphBentErrors.cxx:109
 TGraphBentErrors.cxx:110
 TGraphBentErrors.cxx:111
 TGraphBentErrors.cxx:112
 TGraphBentErrors.cxx:113
 TGraphBentErrors.cxx:114
 TGraphBentErrors.cxx:115
 TGraphBentErrors.cxx:116
 TGraphBentErrors.cxx:117
 TGraphBentErrors.cxx:118
 TGraphBentErrors.cxx:119
 TGraphBentErrors.cxx:120
 TGraphBentErrors.cxx:121
 TGraphBentErrors.cxx:122
 TGraphBentErrors.cxx:123
 TGraphBentErrors.cxx:124
 TGraphBentErrors.cxx:125
 TGraphBentErrors.cxx:126
 TGraphBentErrors.cxx:127
 TGraphBentErrors.cxx:128
 TGraphBentErrors.cxx:129
 TGraphBentErrors.cxx:130
 TGraphBentErrors.cxx:131
 TGraphBentErrors.cxx:132
 TGraphBentErrors.cxx:133
 TGraphBentErrors.cxx:134
 TGraphBentErrors.cxx:135
 TGraphBentErrors.cxx:136
 TGraphBentErrors.cxx:137
 TGraphBentErrors.cxx:138
 TGraphBentErrors.cxx:139
 TGraphBentErrors.cxx:140
 TGraphBentErrors.cxx:141
 TGraphBentErrors.cxx:142
 TGraphBentErrors.cxx:143
 TGraphBentErrors.cxx:144
 TGraphBentErrors.cxx:145
 TGraphBentErrors.cxx:146
 TGraphBentErrors.cxx:147
 TGraphBentErrors.cxx:148
 TGraphBentErrors.cxx:149
 TGraphBentErrors.cxx:150
 TGraphBentErrors.cxx:151
 TGraphBentErrors.cxx:152
 TGraphBentErrors.cxx:153
 TGraphBentErrors.cxx:154
 TGraphBentErrors.cxx:155
 TGraphBentErrors.cxx:156
 TGraphBentErrors.cxx:157
 TGraphBentErrors.cxx:158
 TGraphBentErrors.cxx:159
 TGraphBentErrors.cxx:160
 TGraphBentErrors.cxx:161
 TGraphBentErrors.cxx:162
 TGraphBentErrors.cxx:163
 TGraphBentErrors.cxx:164
 TGraphBentErrors.cxx:165
 TGraphBentErrors.cxx:166
 TGraphBentErrors.cxx:167
 TGraphBentErrors.cxx:168
 TGraphBentErrors.cxx:169
 TGraphBentErrors.cxx:170
 TGraphBentErrors.cxx:171
 TGraphBentErrors.cxx:172
 TGraphBentErrors.cxx:173
 TGraphBentErrors.cxx:174
 TGraphBentErrors.cxx:175
 TGraphBentErrors.cxx:176
 TGraphBentErrors.cxx:177
 TGraphBentErrors.cxx:178
 TGraphBentErrors.cxx:179
 TGraphBentErrors.cxx:180
 TGraphBentErrors.cxx:181
 TGraphBentErrors.cxx:182
 TGraphBentErrors.cxx:183
 TGraphBentErrors.cxx:184
 TGraphBentErrors.cxx:185
 TGraphBentErrors.cxx:186
 TGraphBentErrors.cxx:187
 TGraphBentErrors.cxx:188
 TGraphBentErrors.cxx:189
 TGraphBentErrors.cxx:190
 TGraphBentErrors.cxx:191
 TGraphBentErrors.cxx:192
 TGraphBentErrors.cxx:193
 TGraphBentErrors.cxx:194
 TGraphBentErrors.cxx:195
 TGraphBentErrors.cxx:196
 TGraphBentErrors.cxx:197
 TGraphBentErrors.cxx:198
 TGraphBentErrors.cxx:199
 TGraphBentErrors.cxx:200
 TGraphBentErrors.cxx:201
 TGraphBentErrors.cxx:202
 TGraphBentErrors.cxx:203
 TGraphBentErrors.cxx:204
 TGraphBentErrors.cxx:205
 TGraphBentErrors.cxx:206
 TGraphBentErrors.cxx:207
 TGraphBentErrors.cxx:208
 TGraphBentErrors.cxx:209
 TGraphBentErrors.cxx:210
 TGraphBentErrors.cxx:211
 TGraphBentErrors.cxx:212
 TGraphBentErrors.cxx:213
 TGraphBentErrors.cxx:214
 TGraphBentErrors.cxx:215
 TGraphBentErrors.cxx:216
 TGraphBentErrors.cxx:217
 TGraphBentErrors.cxx:218
 TGraphBentErrors.cxx:219
 TGraphBentErrors.cxx:220
 TGraphBentErrors.cxx:221
 TGraphBentErrors.cxx:222
 TGraphBentErrors.cxx:223
 TGraphBentErrors.cxx:224
 TGraphBentErrors.cxx:225
 TGraphBentErrors.cxx:226
 TGraphBentErrors.cxx:227
 TGraphBentErrors.cxx:228
 TGraphBentErrors.cxx:229
 TGraphBentErrors.cxx:230
 TGraphBentErrors.cxx:231
 TGraphBentErrors.cxx:232
 TGraphBentErrors.cxx:233
 TGraphBentErrors.cxx:234
 TGraphBentErrors.cxx:235
 TGraphBentErrors.cxx:236
 TGraphBentErrors.cxx:237
 TGraphBentErrors.cxx:238
 TGraphBentErrors.cxx:239
 TGraphBentErrors.cxx:240
 TGraphBentErrors.cxx:241
 TGraphBentErrors.cxx:242
 TGraphBentErrors.cxx:243
 TGraphBentErrors.cxx:244
 TGraphBentErrors.cxx:245
 TGraphBentErrors.cxx:246
 TGraphBentErrors.cxx:247
 TGraphBentErrors.cxx:248
 TGraphBentErrors.cxx:249
 TGraphBentErrors.cxx:250
 TGraphBentErrors.cxx:251
 TGraphBentErrors.cxx:252
 TGraphBentErrors.cxx:253
 TGraphBentErrors.cxx:254
 TGraphBentErrors.cxx:255
 TGraphBentErrors.cxx:256
 TGraphBentErrors.cxx:257
 TGraphBentErrors.cxx:258
 TGraphBentErrors.cxx:259
 TGraphBentErrors.cxx:260
 TGraphBentErrors.cxx:261
 TGraphBentErrors.cxx:262
 TGraphBentErrors.cxx:263
 TGraphBentErrors.cxx:264
 TGraphBentErrors.cxx:265
 TGraphBentErrors.cxx:266
 TGraphBentErrors.cxx:267
 TGraphBentErrors.cxx:268
 TGraphBentErrors.cxx:269
 TGraphBentErrors.cxx:270
 TGraphBentErrors.cxx:271
 TGraphBentErrors.cxx:272
 TGraphBentErrors.cxx:273
 TGraphBentErrors.cxx:274
 TGraphBentErrors.cxx:275
 TGraphBentErrors.cxx:276
 TGraphBentErrors.cxx:277
 TGraphBentErrors.cxx:278
 TGraphBentErrors.cxx:279
 TGraphBentErrors.cxx:280
 TGraphBentErrors.cxx:281
 TGraphBentErrors.cxx:282
 TGraphBentErrors.cxx:283
 TGraphBentErrors.cxx:284
 TGraphBentErrors.cxx:285
 TGraphBentErrors.cxx:286
 TGraphBentErrors.cxx:287
 TGraphBentErrors.cxx:288
 TGraphBentErrors.cxx:289
 TGraphBentErrors.cxx:290
 TGraphBentErrors.cxx:291
 TGraphBentErrors.cxx:292
 TGraphBentErrors.cxx:293
 TGraphBentErrors.cxx:294
 TGraphBentErrors.cxx:295
 TGraphBentErrors.cxx:296
 TGraphBentErrors.cxx:297
 TGraphBentErrors.cxx:298
 TGraphBentErrors.cxx:299
 TGraphBentErrors.cxx:300
 TGraphBentErrors.cxx:301
 TGraphBentErrors.cxx:302
 TGraphBentErrors.cxx:303
 TGraphBentErrors.cxx:304
 TGraphBentErrors.cxx:305
 TGraphBentErrors.cxx:306
 TGraphBentErrors.cxx:307
 TGraphBentErrors.cxx:308
 TGraphBentErrors.cxx:309
 TGraphBentErrors.cxx:310
 TGraphBentErrors.cxx:311
 TGraphBentErrors.cxx:312
 TGraphBentErrors.cxx:313
 TGraphBentErrors.cxx:314
 TGraphBentErrors.cxx:315
 TGraphBentErrors.cxx:316
 TGraphBentErrors.cxx:317
 TGraphBentErrors.cxx:318
 TGraphBentErrors.cxx:319
 TGraphBentErrors.cxx:320
 TGraphBentErrors.cxx:321
 TGraphBentErrors.cxx:322
 TGraphBentErrors.cxx:323
 TGraphBentErrors.cxx:324
 TGraphBentErrors.cxx:325
 TGraphBentErrors.cxx:326
 TGraphBentErrors.cxx:327
 TGraphBentErrors.cxx:328
 TGraphBentErrors.cxx:329
 TGraphBentErrors.cxx:330
 TGraphBentErrors.cxx:331
 TGraphBentErrors.cxx:332
 TGraphBentErrors.cxx:333
 TGraphBentErrors.cxx:334
 TGraphBentErrors.cxx:335
 TGraphBentErrors.cxx:336
 TGraphBentErrors.cxx:337
 TGraphBentErrors.cxx:338
 TGraphBentErrors.cxx:339
 TGraphBentErrors.cxx:340
 TGraphBentErrors.cxx:341
 TGraphBentErrors.cxx:342
 TGraphBentErrors.cxx:343
 TGraphBentErrors.cxx:344
 TGraphBentErrors.cxx:345
 TGraphBentErrors.cxx:346
 TGraphBentErrors.cxx:347
 TGraphBentErrors.cxx:348
 TGraphBentErrors.cxx:349
 TGraphBentErrors.cxx:350
 TGraphBentErrors.cxx:351
 TGraphBentErrors.cxx:352
 TGraphBentErrors.cxx:353
 TGraphBentErrors.cxx:354
 TGraphBentErrors.cxx:355
 TGraphBentErrors.cxx:356
 TGraphBentErrors.cxx:357
 TGraphBentErrors.cxx:358
 TGraphBentErrors.cxx:359
 TGraphBentErrors.cxx:360
 TGraphBentErrors.cxx:361
 TGraphBentErrors.cxx:362
 TGraphBentErrors.cxx:363
 TGraphBentErrors.cxx:364
 TGraphBentErrors.cxx:365
 TGraphBentErrors.cxx:366
 TGraphBentErrors.cxx:367
 TGraphBentErrors.cxx:368
 TGraphBentErrors.cxx:369
 TGraphBentErrors.cxx:370
 TGraphBentErrors.cxx:371
 TGraphBentErrors.cxx:372
 TGraphBentErrors.cxx:373
 TGraphBentErrors.cxx:374
 TGraphBentErrors.cxx:375
 TGraphBentErrors.cxx:376
 TGraphBentErrors.cxx:377
 TGraphBentErrors.cxx:378
 TGraphBentErrors.cxx:379
 TGraphBentErrors.cxx:380
 TGraphBentErrors.cxx:381
 TGraphBentErrors.cxx:382
 TGraphBentErrors.cxx:383
 TGraphBentErrors.cxx:384
 TGraphBentErrors.cxx:385
 TGraphBentErrors.cxx:386
 TGraphBentErrors.cxx:387
 TGraphBentErrors.cxx:388
 TGraphBentErrors.cxx:389
 TGraphBentErrors.cxx:390
 TGraphBentErrors.cxx:391
 TGraphBentErrors.cxx:392
 TGraphBentErrors.cxx:393
 TGraphBentErrors.cxx:394
 TGraphBentErrors.cxx:395
 TGraphBentErrors.cxx:396
 TGraphBentErrors.cxx:397
 TGraphBentErrors.cxx:398
 TGraphBentErrors.cxx:399
 TGraphBentErrors.cxx:400
 TGraphBentErrors.cxx:401
 TGraphBentErrors.cxx:402
 TGraphBentErrors.cxx:403
 TGraphBentErrors.cxx:404
 TGraphBentErrors.cxx:405
 TGraphBentErrors.cxx:406
 TGraphBentErrors.cxx:407
 TGraphBentErrors.cxx:408
 TGraphBentErrors.cxx:409
 TGraphBentErrors.cxx:410
 TGraphBentErrors.cxx:411
 TGraphBentErrors.cxx:412
 TGraphBentErrors.cxx:413
 TGraphBentErrors.cxx:414
 TGraphBentErrors.cxx:415
 TGraphBentErrors.cxx:416
 TGraphBentErrors.cxx:417
 TGraphBentErrors.cxx:418
 TGraphBentErrors.cxx:419
 TGraphBentErrors.cxx:420
 TGraphBentErrors.cxx:421
 TGraphBentErrors.cxx:422
 TGraphBentErrors.cxx:423
 TGraphBentErrors.cxx:424
 TGraphBentErrors.cxx:425
 TGraphBentErrors.cxx:426
 TGraphBentErrors.cxx:427
 TGraphBentErrors.cxx:428
 TGraphBentErrors.cxx:429
 TGraphBentErrors.cxx:430
 TGraphBentErrors.cxx:431
 TGraphBentErrors.cxx:432
 TGraphBentErrors.cxx:433
 TGraphBentErrors.cxx:434
 TGraphBentErrors.cxx:435
 TGraphBentErrors.cxx:436
 TGraphBentErrors.cxx:437
 TGraphBentErrors.cxx:438
 TGraphBentErrors.cxx:439
 TGraphBentErrors.cxx:440
 TGraphBentErrors.cxx:441
 TGraphBentErrors.cxx:442
 TGraphBentErrors.cxx:443
 TGraphBentErrors.cxx:444
 TGraphBentErrors.cxx:445
 TGraphBentErrors.cxx:446
 TGraphBentErrors.cxx:447
 TGraphBentErrors.cxx:448
 TGraphBentErrors.cxx:449
 TGraphBentErrors.cxx:450
 TGraphBentErrors.cxx:451
 TGraphBentErrors.cxx:452
 TGraphBentErrors.cxx:453
 TGraphBentErrors.cxx:454
 TGraphBentErrors.cxx:455
 TGraphBentErrors.cxx:456
 TGraphBentErrors.cxx:457
 TGraphBentErrors.cxx:458
 TGraphBentErrors.cxx:459
 TGraphBentErrors.cxx:460
 TGraphBentErrors.cxx:461
 TGraphBentErrors.cxx:462
 TGraphBentErrors.cxx:463
 TGraphBentErrors.cxx:464
 TGraphBentErrors.cxx:465
 TGraphBentErrors.cxx:466
 TGraphBentErrors.cxx:467
 TGraphBentErrors.cxx:468
 TGraphBentErrors.cxx:469
 TGraphBentErrors.cxx:470
 TGraphBentErrors.cxx:471
 TGraphBentErrors.cxx:472
 TGraphBentErrors.cxx:473
 TGraphBentErrors.cxx:474
 TGraphBentErrors.cxx:475
 TGraphBentErrors.cxx:476
 TGraphBentErrors.cxx:477
 TGraphBentErrors.cxx:478
 TGraphBentErrors.cxx:479
 TGraphBentErrors.cxx:480
 TGraphBentErrors.cxx:481
 TGraphBentErrors.cxx:482
 TGraphBentErrors.cxx:483
 TGraphBentErrors.cxx:484
 TGraphBentErrors.cxx:485
 TGraphBentErrors.cxx:486
 TGraphBentErrors.cxx:487
 TGraphBentErrors.cxx:488
 TGraphBentErrors.cxx:489
 TGraphBentErrors.cxx:490
 TGraphBentErrors.cxx:491
 TGraphBentErrors.cxx:492
 TGraphBentErrors.cxx:493
 TGraphBentErrors.cxx:494
 TGraphBentErrors.cxx:495
 TGraphBentErrors.cxx:496
 TGraphBentErrors.cxx:497
 TGraphBentErrors.cxx:498
 TGraphBentErrors.cxx:499
 TGraphBentErrors.cxx:500
 TGraphBentErrors.cxx:501
 TGraphBentErrors.cxx:502
 TGraphBentErrors.cxx:503
 TGraphBentErrors.cxx:504
 TGraphBentErrors.cxx:505
 TGraphBentErrors.cxx:506
 TGraphBentErrors.cxx:507
 TGraphBentErrors.cxx:508
 TGraphBentErrors.cxx:509
 TGraphBentErrors.cxx:510
 TGraphBentErrors.cxx:511
 TGraphBentErrors.cxx:512
 TGraphBentErrors.cxx:513
 TGraphBentErrors.cxx:514
 TGraphBentErrors.cxx:515
 TGraphBentErrors.cxx:516
 TGraphBentErrors.cxx:517
 TGraphBentErrors.cxx:518
 TGraphBentErrors.cxx:519
 TGraphBentErrors.cxx:520
 TGraphBentErrors.cxx:521
 TGraphBentErrors.cxx:522
 TGraphBentErrors.cxx:523
 TGraphBentErrors.cxx:524
 TGraphBentErrors.cxx:525
 TGraphBentErrors.cxx:526
 TGraphBentErrors.cxx:527
 TGraphBentErrors.cxx:528
 TGraphBentErrors.cxx:529
 TGraphBentErrors.cxx:530
 TGraphBentErrors.cxx:531
 TGraphBentErrors.cxx:532
 TGraphBentErrors.cxx:533
 TGraphBentErrors.cxx:534
 TGraphBentErrors.cxx:535
 TGraphBentErrors.cxx:536
 TGraphBentErrors.cxx:537
 TGraphBentErrors.cxx:538
 TGraphBentErrors.cxx:539
 TGraphBentErrors.cxx:540
 TGraphBentErrors.cxx:541
 TGraphBentErrors.cxx:542
 TGraphBentErrors.cxx:543
 TGraphBentErrors.cxx:544
 TGraphBentErrors.cxx:545
 TGraphBentErrors.cxx:546
 TGraphBentErrors.cxx:547
 TGraphBentErrors.cxx:548
 TGraphBentErrors.cxx:549
 TGraphBentErrors.cxx:550
 TGraphBentErrors.cxx:551
 TGraphBentErrors.cxx:552
 TGraphBentErrors.cxx:553
 TGraphBentErrors.cxx:554
 TGraphBentErrors.cxx:555
 TGraphBentErrors.cxx:556
 TGraphBentErrors.cxx:557
 TGraphBentErrors.cxx:558
 TGraphBentErrors.cxx:559
 TGraphBentErrors.cxx:560
 TGraphBentErrors.cxx:561
 TGraphBentErrors.cxx:562
 TGraphBentErrors.cxx:563
 TGraphBentErrors.cxx:564
 TGraphBentErrors.cxx:565
 TGraphBentErrors.cxx:566
 TGraphBentErrors.cxx:567
 TGraphBentErrors.cxx:568
 TGraphBentErrors.cxx:569
 TGraphBentErrors.cxx:570
 TGraphBentErrors.cxx:571
 TGraphBentErrors.cxx:572
 TGraphBentErrors.cxx:573
 TGraphBentErrors.cxx:574
 TGraphBentErrors.cxx:575
 TGraphBentErrors.cxx:576
 TGraphBentErrors.cxx:577
 TGraphBentErrors.cxx:578
 TGraphBentErrors.cxx:579
 TGraphBentErrors.cxx:580
 TGraphBentErrors.cxx:581
 TGraphBentErrors.cxx:582
 TGraphBentErrors.cxx:583
 TGraphBentErrors.cxx:584
 TGraphBentErrors.cxx:585
 TGraphBentErrors.cxx:586
 TGraphBentErrors.cxx:587
 TGraphBentErrors.cxx:588
 TGraphBentErrors.cxx:589
 TGraphBentErrors.cxx:590
 TGraphBentErrors.cxx:591
 TGraphBentErrors.cxx:592
 TGraphBentErrors.cxx:593
 TGraphBentErrors.cxx:594