// @(#)root/graf:$Id$
// Author: Rene Brun   16/05/97

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


//______________________________________________________________________________
/* Begin_Html
<center><h2>Graphical cut class</h2></center>
A Graphical cut.
<p>
A TCutG object is a closed polygon defining a closed region in a x,y plot.
It can be created via the graphics editor option "CutG" or directly by
invoking its constructor. The first and last points should be the same.
<p>
To create a TCutG via the graphics editor, use the left button to select the
points building the contour of the cut. Click on the right button to close the
TCutG. When it is created via the graphics editor, the TCutG object is named
"CUTG". It is recommended to immediatly change the name by using the context
menu item "SetName". When the graphics editor is used, the names of the
variables X,Y are automatically taken from the current pad title.
<p>
Example:
<p>
Assume a TTree object T and:
<pre>
     Root > T.Draw("abs(fMomemtum)%fEtot")
</pre>
the TCutG members fVarX, fVary will be set to:
<pre>
     fVarx = fEtot
     fVary = abs(fMomemtum)
</pre>

A graphical cut can be used in a TTree selection expression:
<pre>
    Root > T.Draw("fEtot","cutg1")
</pre>
where "cutg1" is the name of an existing graphical cut.
<p>
Note that, as shown in the example above, a graphical cut may be used in a
selection expression when drawing TTrees expressions of 1-d, 2-d or
3-dimensions. The expressions used in TTree::Draw can reference the variables in
the fVarX, fVarY of the graphical cut plus other variables.
<p>
When the TCutG object is created by TTree::Draw, it is added to the list of special objects in
the main TROOT object pointed by gROOT. To retrieve a pointer to this object
from the code or command line, do:
<pre>
    TCutG *mycutg;
    mycutg = (TCutG*)gROOT->GetListOfSpecials()->FindObject("CUTG")
    mycutg->SetName("mycutg");
</pre>
<p>
When the TCutG is not created via TTree::Draw, one must set the variable names
corresponding to x,y if one wants to use the cut as input to TTree::Draw,eg
<pre>
   TCutG *cutg = new TCutG("mycut",5);
   cutg->SetVarX("y");
   cutg->SetVarY("x");
   cutg->SetPoint(0,-0.3586207,1.509534);
   cutg->SetPoint(1,-1.894181,-0.529661);
   cutg->SetPoint(2,0.07780173,-1.21822);
   cutg->SetPoint(3,-1.0375,-0.07944915);
   cutg->SetPoint(4,0.756681,0.1853814);
   cutg->SetPoint(5,-0.3586207,1.509534);
</pre>
<p>
Example of use of a TCutG in TTree::Draw:
<pre>
   tree.Draw("x:y","mycutg && z>0 %% sqrt(x)>1")
</pre>
<p>
A Graphical cut may be drawn via TGraph::Draw. It can be edited like a normal
TGraph.
<p>
A Graphical cut may be saved to a file via TCutG::Write.
End_Html */

#include <string.h>

#include "Riostream.h"
#include "TROOT.h"
#include "TCutG.h"
#include "TVirtualPad.h"
#include "TPaveText.h"
#include "TH2.h"
#include "TClass.h"
#include "TMath.h"

ClassImp(TCutG)


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

   fObjectX  = 0;
   fObjectY  = 0;
}


//______________________________________________________________________________
TCutG::TCutG(const TCutG &cutg)
      :TGraph(cutg)
{
   // TCutG copy constructor

   fVarX    = cutg.fVarX;
   fVarY    = cutg.fVarY;
   fObjectX = cutg.fObjectX;
   fObjectY = cutg.fObjectY;
}


//______________________________________________________________________________
TCutG::TCutG(const char *name, Int_t n)
      :TGraph(n)
{
   // TCutG normal constructor.

   fObjectX  = 0;
   fObjectY  = 0;
   SetName(name);
   delete gROOT->GetListOfSpecials()->FindObject(name);
   gROOT->GetListOfSpecials()->Add(this);

   // Take name of cut variables from pad title if title contains ":"
   if (gPad) {
      TPaveText *ptitle = (TPaveText*)gPad->FindObject("title");
      if (!ptitle) return;
      TText *ttitle = ptitle->GetLineWith(":");
      if (!ttitle) ttitle = ptitle->GetLineWith("{");
      if (!ttitle) ttitle = ptitle->GetLine(0);
      if (!ttitle) return;
      const char *title = ttitle->GetTitle();
      Int_t nch = strlen(title);
      char *vars = new char[nch+1];
      strlcpy(vars,title,nch+1);
      char *col = strstr(vars,":");
      if (col) {
         *col = 0;
         col++;
         char *brak = strstr(col," {");
         if (brak) *brak = 0;
         fVarY = vars;
         fVarX = col;
      } else {
         char *brak = strstr(vars," {");
         if (brak) *brak = 0;
         fVarX = vars;
      }
      delete [] vars;
   }
}


//______________________________________________________________________________
TCutG::TCutG(const char *name, Int_t n, const Float_t *x, const Float_t *y)
      :TGraph(n,x,y)
{
   // TCutG normal constructor.

   fObjectX  = 0;
   fObjectY  = 0;
   SetName(name);
   delete gROOT->GetListOfSpecials()->FindObject(name);
   gROOT->GetListOfSpecials()->Add(this);

   // Take name of cut variables from pad title if title contains ":"
   if (gPad) {
      TPaveText *ptitle = (TPaveText*)gPad->FindObject("title");
      if (!ptitle) return;
      TText *ttitle = ptitle->GetLineWith(":");
      if (!ttitle) ttitle = ptitle->GetLineWith("{");
      if (!ttitle) ttitle = ptitle->GetLine(0);
      if (!ttitle) return;
      const char *title = ttitle->GetTitle();
      Int_t nch = strlen(title);
      char *vars = new char[nch+1];
      strlcpy(vars,title,nch+1);
      char *col = strstr(vars,":");
      if (col) {
         *col = 0;
         col++;
         char *brak = strstr(col," {");
         if (brak) *brak = 0;
         fVarY = vars;
         fVarX = col;
      } else {
         char *brak = strstr(vars," {");
         if (brak) *brak = 0;
         fVarX = vars;
      }
      delete [] vars;
   }
}


//______________________________________________________________________________
TCutG::TCutG(const char *name, Int_t n, const Double_t *x, const Double_t *y)
      :TGraph(n,x,y)
{
   // TCutG normal constructor.

   fObjectX  = 0;
   fObjectY  = 0;
   SetName(name);
   delete gROOT->GetListOfSpecials()->FindObject(name);
   gROOT->GetListOfSpecials()->Add(this);

   // Take name of cut variables from pad title if title contains ":"
   if (gPad) {
      TPaveText *ptitle = (TPaveText*)gPad->FindObject("title");
      if (!ptitle) return;
      TText *ttitle = ptitle->GetLineWith(":");
      if (!ttitle) ttitle = ptitle->GetLineWith("{");
      if (!ttitle) ttitle = ptitle->GetLine(0);
      if (!ttitle) return;
      const char *title = ttitle->GetTitle();
      Int_t nch = strlen(title);
      char *vars = new char[nch+1];
      strlcpy(vars,title,nch+1);
      char *col = strstr(vars,":");
      if (col) {
         *col = 0;
         col++;
         char *brak = strstr(col," {");
         if (brak) *brak = 0;
         fVarY = vars;
         fVarX = col;
      } else {
         char *brak = strstr(vars," {");
         if (brak) *brak = 0;
         fVarX = vars;
      }
      delete [] vars;
   }
}

//______________________________________________________________________________
TCutG::~TCutG()
{
   // TCutG destructor.

   delete fObjectX;
   delete fObjectY;
   gROOT->GetListOfSpecials()->Remove(this);
}

//______________________________________________________________________________
TCutG &TCutG::operator=(const TCutG &rhs)
{
   // Assignment operator.

   if (this != &rhs) {
      TGraph::operator=(rhs);
      delete fObjectX;
      delete fObjectY;
      fObjectX = rhs.fObjectX->Clone();
      fObjectY = rhs.fObjectY->Clone();
   }
   return *this;
}

//______________________________________________________________________________
Double_t TCutG::Area() const
{
   // Compute the area inside this TCutG
   // The algorithm uses Stoke's theorem over the border of the closed polygon.
   // Just as a reminder: Stoke's theorem reduces a surface integral
   // to a line integral over the border of the surface integral.
   Double_t a = 0;
   Int_t n = GetN();
   for (Int_t i=0;i<n-1;i++) {
      a += (fX[i]-fX[i+1])*(fY[i]+fY[i+1]);
   }
   a *= 0.5;
   return a;
}

//______________________________________________________________________________
void TCutG::Center(Double_t &cx, Double_t &cy) const
{
   // Compute the center x,y of this TCutG
   // The algorithm uses Stoke's theorem over the border of the closed polygon.
   // Just as a reminder: Stoke's theorem reduces a surface integral
   // to a line integral over the border of the surface integral.
   Int_t n = GetN();
   Double_t a  = 0;
   cx = cy = 0;
   Double_t t;
   for (Int_t i=0;i<n-1;i++) {
      t   = 2*fX[i]*fY[i] + fY[i]*fX[i+1] + fX[i]*fY[i+1] + 2*fX[i+1]*fY[i+1];
      cx += (fX[i]-fX[i+1])*t;
      cy += (-fY[i]+fY[i+1])*t;
      a  += (fX[i]-fX[i+1])*(fY[i]+fY[i+1]);
   }
   a  *= 0.5;
   cx *= 1./(6*a);
   cy *= 1./(6*a);
}

//______________________________________________________________________________
Double_t TCutG::IntegralHist(TH2 *h, Option_t *option) const
{
   // Compute the integral of 2-d histogram h for all bins inside the cut
   // if option "width" is specified, the integral is the sum of
   // the bin contents multiplied by the bin width in x and in y.

   if (!h) return 0;
   Int_t n = GetN();
   Double_t xmin= 1e200;
   Double_t xmax = -xmin;
   Double_t ymin = xmin;
   Double_t ymax = xmax;
   for (Int_t i=0;i<n;i++) {
      if (fX[i] < xmin) xmin = fX[i];
      if (fX[i] > xmax) xmax = fX[i];
      if (fY[i] < ymin) ymin = fY[i];
      if (fY[i] > ymax) ymax = fY[i];
   }
   TAxis *xaxis = h->GetXaxis();
   TAxis *yaxis = h->GetYaxis();
   Int_t binx1 = xaxis->FindBin(xmin);
   Int_t binx2 = xaxis->FindBin(xmax);
   Int_t biny1 = yaxis->FindBin(ymin);
   Int_t biny2 = yaxis->FindBin(ymax);
   Int_t nbinsx = h->GetNbinsX();
   Stat_t integral = 0;

   // Loop on bins for which the bin center is in the cut
   TString opt = option;
   opt.ToLower();
   Bool_t width = kFALSE;
   if (opt.Contains("width")) width = kTRUE;
   Int_t bin, binx, biny;
   for (biny=biny1;biny<=biny2;biny++) {
      Double_t y = yaxis->GetBinCenter(biny);
      for (binx=binx1;binx<=binx2;binx++) {
         Double_t x = xaxis->GetBinCenter(binx);
         if (!IsInside(x,y)) continue;
         bin = binx +(nbinsx+2)*biny;
         if (width) integral += h->GetBinContent(bin)*xaxis->GetBinWidth(binx)*yaxis->GetBinWidth(biny);
         else       integral += h->GetBinContent(bin);
      }
   }
   return integral;
}


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

   char quote = '"';
   out<<"   "<<std::endl;
   if (gROOT->ClassSaved(TCutG::Class())) {
      out<<"   ";
   } else {
      out<<"   TCutG *";
   }
   out<<"cutg = new TCutG("<<quote<<GetName()<<quote<<","<<fNpoints<<");"<<std::endl;
   out<<"   cutg->SetVarX("<<quote<<GetVarX()<<quote<<");"<<std::endl;
   out<<"   cutg->SetVarY("<<quote<<GetVarY()<<quote<<");"<<std::endl;
   out<<"   cutg->SetTitle("<<quote<<GetTitle()<<quote<<");"<<std::endl;

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

   for (Int_t i=0;i<fNpoints;i++) {
      out<<"   cutg->SetPoint("<<i<<","<<fX[i]<<","<<fY[i]<<");"<<std::endl;
   }
   out<<"   cutg->Draw("
      <<quote<<option<<quote<<");"<<std::endl;
}

//______________________________________________________________________________
void TCutG::SetObjectX(TObject *obj)
{
   // Set the X object (and delete the previous one if any).

   delete fObjectX;
   fObjectX = obj;
}

//______________________________________________________________________________
void TCutG::SetObjectY(TObject *obj)
{
   // Set the Y object (and delete the previous one if any).

   delete fObjectY;
   fObjectY = obj;
}

//______________________________________________________________________________
void TCutG::SetVarX(const char *varx)
{
   // Set X variable.

   fVarX = varx;
   delete fObjectX;
   fObjectX = 0;
}


//______________________________________________________________________________
void TCutG::SetVarY(const char *vary)
{
   // Set Y variable.

   fVarY = vary;
   delete fObjectY;
   fObjectY = 0;
}


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

   if (R__b.IsReading()) {
      R__b.ReadClassBuffer(TCutG::Class(), this);
      gROOT->GetListOfSpecials()->Add(this);
   } else {
      R__b.WriteClassBuffer(TCutG::Class(), this);
   }
}
 TCutG.cxx:1
 TCutG.cxx:2
 TCutG.cxx:3
 TCutG.cxx:4
 TCutG.cxx:5
 TCutG.cxx:6
 TCutG.cxx:7
 TCutG.cxx:8
 TCutG.cxx:9
 TCutG.cxx:10
 TCutG.cxx:11
 TCutG.cxx:12
 TCutG.cxx:13
 TCutG.cxx:14
 TCutG.cxx:15
 TCutG.cxx:16
 TCutG.cxx:17
 TCutG.cxx:18
 TCutG.cxx:19
 TCutG.cxx:20
 TCutG.cxx:21
 TCutG.cxx:22
 TCutG.cxx:23
 TCutG.cxx:24
 TCutG.cxx:25
 TCutG.cxx:26
 TCutG.cxx:27
 TCutG.cxx:28
 TCutG.cxx:29
 TCutG.cxx:30
 TCutG.cxx:31
 TCutG.cxx:32
 TCutG.cxx:33
 TCutG.cxx:34
 TCutG.cxx:35
 TCutG.cxx:36
 TCutG.cxx:37
 TCutG.cxx:38
 TCutG.cxx:39
 TCutG.cxx:40
 TCutG.cxx:41
 TCutG.cxx:42
 TCutG.cxx:43
 TCutG.cxx:44
 TCutG.cxx:45
 TCutG.cxx:46
 TCutG.cxx:47
 TCutG.cxx:48
 TCutG.cxx:49
 TCutG.cxx:50
 TCutG.cxx:51
 TCutG.cxx:52
 TCutG.cxx:53
 TCutG.cxx:54
 TCutG.cxx:55
 TCutG.cxx:56
 TCutG.cxx:57
 TCutG.cxx:58
 TCutG.cxx:59
 TCutG.cxx:60
 TCutG.cxx:61
 TCutG.cxx:62
 TCutG.cxx:63
 TCutG.cxx:64
 TCutG.cxx:65
 TCutG.cxx:66
 TCutG.cxx:67
 TCutG.cxx:68
 TCutG.cxx:69
 TCutG.cxx:70
 TCutG.cxx:71
 TCutG.cxx:72
 TCutG.cxx:73
 TCutG.cxx:74
 TCutG.cxx:75
 TCutG.cxx:76
 TCutG.cxx:77
 TCutG.cxx:78
 TCutG.cxx:79
 TCutG.cxx:80
 TCutG.cxx:81
 TCutG.cxx:82
 TCutG.cxx:83
 TCutG.cxx:84
 TCutG.cxx:85
 TCutG.cxx:86
 TCutG.cxx:87
 TCutG.cxx:88
 TCutG.cxx:89
 TCutG.cxx:90
 TCutG.cxx:91
 TCutG.cxx:92
 TCutG.cxx:93
 TCutG.cxx:94
 TCutG.cxx:95
 TCutG.cxx:96
 TCutG.cxx:97
 TCutG.cxx:98
 TCutG.cxx:99
 TCutG.cxx:100
 TCutG.cxx:101
 TCutG.cxx:102
 TCutG.cxx:103
 TCutG.cxx:104
 TCutG.cxx:105
 TCutG.cxx:106
 TCutG.cxx:107
 TCutG.cxx:108
 TCutG.cxx:109
 TCutG.cxx:110
 TCutG.cxx:111
 TCutG.cxx:112
 TCutG.cxx:113
 TCutG.cxx:114
 TCutG.cxx:115
 TCutG.cxx:116
 TCutG.cxx:117
 TCutG.cxx:118
 TCutG.cxx:119
 TCutG.cxx:120
 TCutG.cxx:121
 TCutG.cxx:122
 TCutG.cxx:123
 TCutG.cxx:124
 TCutG.cxx:125
 TCutG.cxx:126
 TCutG.cxx:127
 TCutG.cxx:128
 TCutG.cxx:129
 TCutG.cxx:130
 TCutG.cxx:131
 TCutG.cxx:132
 TCutG.cxx:133
 TCutG.cxx:134
 TCutG.cxx:135
 TCutG.cxx:136
 TCutG.cxx:137
 TCutG.cxx:138
 TCutG.cxx:139
 TCutG.cxx:140
 TCutG.cxx:141
 TCutG.cxx:142
 TCutG.cxx:143
 TCutG.cxx:144
 TCutG.cxx:145
 TCutG.cxx:146
 TCutG.cxx:147
 TCutG.cxx:148
 TCutG.cxx:149
 TCutG.cxx:150
 TCutG.cxx:151
 TCutG.cxx:152
 TCutG.cxx:153
 TCutG.cxx:154
 TCutG.cxx:155
 TCutG.cxx:156
 TCutG.cxx:157
 TCutG.cxx:158
 TCutG.cxx:159
 TCutG.cxx:160
 TCutG.cxx:161
 TCutG.cxx:162
 TCutG.cxx:163
 TCutG.cxx:164
 TCutG.cxx:165
 TCutG.cxx:166
 TCutG.cxx:167
 TCutG.cxx:168
 TCutG.cxx:169
 TCutG.cxx:170
 TCutG.cxx:171
 TCutG.cxx:172
 TCutG.cxx:173
 TCutG.cxx:174
 TCutG.cxx:175
 TCutG.cxx:176
 TCutG.cxx:177
 TCutG.cxx:178
 TCutG.cxx:179
 TCutG.cxx:180
 TCutG.cxx:181
 TCutG.cxx:182
 TCutG.cxx:183
 TCutG.cxx:184
 TCutG.cxx:185
 TCutG.cxx:186
 TCutG.cxx:187
 TCutG.cxx:188
 TCutG.cxx:189
 TCutG.cxx:190
 TCutG.cxx:191
 TCutG.cxx:192
 TCutG.cxx:193
 TCutG.cxx:194
 TCutG.cxx:195
 TCutG.cxx:196
 TCutG.cxx:197
 TCutG.cxx:198
 TCutG.cxx:199
 TCutG.cxx:200
 TCutG.cxx:201
 TCutG.cxx:202
 TCutG.cxx:203
 TCutG.cxx:204
 TCutG.cxx:205
 TCutG.cxx:206
 TCutG.cxx:207
 TCutG.cxx:208
 TCutG.cxx:209
 TCutG.cxx:210
 TCutG.cxx:211
 TCutG.cxx:212
 TCutG.cxx:213
 TCutG.cxx:214
 TCutG.cxx:215
 TCutG.cxx:216
 TCutG.cxx:217
 TCutG.cxx:218
 TCutG.cxx:219
 TCutG.cxx:220
 TCutG.cxx:221
 TCutG.cxx:222
 TCutG.cxx:223
 TCutG.cxx:224
 TCutG.cxx:225
 TCutG.cxx:226
 TCutG.cxx:227
 TCutG.cxx:228
 TCutG.cxx:229
 TCutG.cxx:230
 TCutG.cxx:231
 TCutG.cxx:232
 TCutG.cxx:233
 TCutG.cxx:234
 TCutG.cxx:235
 TCutG.cxx:236
 TCutG.cxx:237
 TCutG.cxx:238
 TCutG.cxx:239
 TCutG.cxx:240
 TCutG.cxx:241
 TCutG.cxx:242
 TCutG.cxx:243
 TCutG.cxx:244
 TCutG.cxx:245
 TCutG.cxx:246
 TCutG.cxx:247
 TCutG.cxx:248
 TCutG.cxx:249
 TCutG.cxx:250
 TCutG.cxx:251
 TCutG.cxx:252
 TCutG.cxx:253
 TCutG.cxx:254
 TCutG.cxx:255
 TCutG.cxx:256
 TCutG.cxx:257
 TCutG.cxx:258
 TCutG.cxx:259
 TCutG.cxx:260
 TCutG.cxx:261
 TCutG.cxx:262
 TCutG.cxx:263
 TCutG.cxx:264
 TCutG.cxx:265
 TCutG.cxx:266
 TCutG.cxx:267
 TCutG.cxx:268
 TCutG.cxx:269
 TCutG.cxx:270
 TCutG.cxx:271
 TCutG.cxx:272
 TCutG.cxx:273
 TCutG.cxx:274
 TCutG.cxx:275
 TCutG.cxx:276
 TCutG.cxx:277
 TCutG.cxx:278
 TCutG.cxx:279
 TCutG.cxx:280
 TCutG.cxx:281
 TCutG.cxx:282
 TCutG.cxx:283
 TCutG.cxx:284
 TCutG.cxx:285
 TCutG.cxx:286
 TCutG.cxx:287
 TCutG.cxx:288
 TCutG.cxx:289
 TCutG.cxx:290
 TCutG.cxx:291
 TCutG.cxx:292
 TCutG.cxx:293
 TCutG.cxx:294
 TCutG.cxx:295
 TCutG.cxx:296
 TCutG.cxx:297
 TCutG.cxx:298
 TCutG.cxx:299
 TCutG.cxx:300
 TCutG.cxx:301
 TCutG.cxx:302
 TCutG.cxx:303
 TCutG.cxx:304
 TCutG.cxx:305
 TCutG.cxx:306
 TCutG.cxx:307
 TCutG.cxx:308
 TCutG.cxx:309
 TCutG.cxx:310
 TCutG.cxx:311
 TCutG.cxx:312
 TCutG.cxx:313
 TCutG.cxx:314
 TCutG.cxx:315
 TCutG.cxx:316
 TCutG.cxx:317
 TCutG.cxx:318
 TCutG.cxx:319
 TCutG.cxx:320
 TCutG.cxx:321
 TCutG.cxx:322
 TCutG.cxx:323
 TCutG.cxx:324
 TCutG.cxx:325
 TCutG.cxx:326
 TCutG.cxx:327
 TCutG.cxx:328
 TCutG.cxx:329
 TCutG.cxx:330
 TCutG.cxx:331
 TCutG.cxx:332
 TCutG.cxx:333
 TCutG.cxx:334
 TCutG.cxx:335
 TCutG.cxx:336
 TCutG.cxx:337
 TCutG.cxx:338
 TCutG.cxx:339
 TCutG.cxx:340
 TCutG.cxx:341
 TCutG.cxx:342
 TCutG.cxx:343
 TCutG.cxx:344
 TCutG.cxx:345
 TCutG.cxx:346
 TCutG.cxx:347
 TCutG.cxx:348
 TCutG.cxx:349
 TCutG.cxx:350
 TCutG.cxx:351
 TCutG.cxx:352
 TCutG.cxx:353
 TCutG.cxx:354
 TCutG.cxx:355
 TCutG.cxx:356
 TCutG.cxx:357
 TCutG.cxx:358
 TCutG.cxx:359
 TCutG.cxx:360
 TCutG.cxx:361
 TCutG.cxx:362
 TCutG.cxx:363
 TCutG.cxx:364
 TCutG.cxx:365
 TCutG.cxx:366
 TCutG.cxx:367
 TCutG.cxx:368
 TCutG.cxx:369
 TCutG.cxx:370
 TCutG.cxx:371
 TCutG.cxx:372
 TCutG.cxx:373
 TCutG.cxx:374
 TCutG.cxx:375
 TCutG.cxx:376
 TCutG.cxx:377
 TCutG.cxx:378
 TCutG.cxx:379
 TCutG.cxx:380
 TCutG.cxx:381
 TCutG.cxx:382
 TCutG.cxx:383
 TCutG.cxx:384
 TCutG.cxx:385
 TCutG.cxx:386
 TCutG.cxx:387
 TCutG.cxx:388
 TCutG.cxx:389
 TCutG.cxx:390
 TCutG.cxx:391
 TCutG.cxx:392
 TCutG.cxx:393
 TCutG.cxx:394
 TCutG.cxx:395
 TCutG.cxx:396
 TCutG.cxx:397
 TCutG.cxx:398
 TCutG.cxx:399
 TCutG.cxx:400
 TCutG.cxx:401
 TCutG.cxx:402
 TCutG.cxx:403
 TCutG.cxx:404
 TCutG.cxx:405
 TCutG.cxx:406
 TCutG.cxx:407
 TCutG.cxx:408
 TCutG.cxx:409
 TCutG.cxx:410
 TCutG.cxx:411
 TCutG.cxx:412
 TCutG.cxx:413
 TCutG.cxx:414
 TCutG.cxx:415
 TCutG.cxx:416
 TCutG.cxx:417
 TCutG.cxx:418
 TCutG.cxx:419
 TCutG.cxx:420
 TCutG.cxx:421
 TCutG.cxx:422
 TCutG.cxx:423
 TCutG.cxx:424
 TCutG.cxx:425
 TCutG.cxx:426
 TCutG.cxx:427
 TCutG.cxx:428
 TCutG.cxx:429
 TCutG.cxx:430
 TCutG.cxx:431
 TCutG.cxx:432
 TCutG.cxx:433
 TCutG.cxx:434
 TCutG.cxx:435
 TCutG.cxx:436
 TCutG.cxx:437
 TCutG.cxx:438