// Author: Roel Aaij 15/08/2007

/*************************************************************************
 * Copyright (C) 1995-2007, 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 "TClass.h"
#include "Riostream.h"
#include "TSystem.h"
#include "TEnv.h"
#include "TGResourcePool.h"
#include "TTreeTableInterface.h"
#include "TTreeFormula.h"
#include "TError.h"
#include "TTree.h"
#include "TEntryList.h"
#include "TSelectorDraw.h"
#include "TTreeFormulaManager.h"
#include "TTreeFormula.h"

ClassImp(TTreeTableInterface)

//////////////////////////////////////////////////////////////////////////
//                                                                      //
// TTreeTableInterface.                                                 //
//                                                                      //
// TTreeTableInterface is used to interface to data that is stored in a //
// TTree. When the interface is created, an expression can be           //
// specified. This expression will define the columns to be shown.      //
//                                                                      //
// A selection criterium can also be specified. A TEntryList will be    //
// created and applied to the TTree using this criterium.               //
// a new TEntryList to use can be specified using SetEntryList.         //
// TGTable->Update() will need to be called to show the effects.        //
//                                                                      //
// WARNING: Do not apply an entrylist to the tree in any other way than //
// through the interface, this will have undefined consequences.        //
//                                                                      //
// Columns can be manipulated using the appropriate methods. A          //
// TGTable->Update is always needed afterwards to make the table aware  //
// of the changes.                                                      //
//                                                                      //
//////////////////////////////////////////////////////////////////////////

//______________________________________________________________________________
TTreeTableInterface::TTreeTableInterface (TTree *tree, const char *varexp,
   const char *selection, Option_t *option, Long64_t nentries,
   Long64_t firstentry)
   : TVirtualTableInterface(), fTree(tree), fFormulas(0), fEntry(0),
     fNEntries(nentries), fFirstEntry(firstentry), fManager(0), fSelect(0), fSelector(0), fInput(0),
     fForceDim(kFALSE), fEntries(0), fNRows(0), fNColumns(0)
{
   // TTreeTableInterface constructor.

   if (fTree == 0) {
      Error("TTreeTableInterface", "No tree supplied");
      return;
   }

   fFormulas= new TList();
   fSelector = new TSelectorDraw();
   fInput = new TList();
   fInput->Add(new TNamed("varexp",""));
   fInput->Add(new TNamed("selection",""));
   fSelector->SetInputList(fInput);
   fEntry=fFirstEntry;

   TString opt = option;

   if (nentries == 0) {
      fNEntries = fTree->GetEntries();
      Info("TTreeTableInterface", "nentries was 0, setting to maximum number"
           " available in the tree");
   }

   // Do stuff with opt.Contains() and options
   SetVariablesExpression(varexp);
   SetSelection(selection);

   if (fNRows == 0) {
      Warning ("TTreeTableInterface::TTreeTableInterface", "nrows = 0");
   }
   if (fNColumns == 0) {
      Warning ("TTreeTableInterface::TTreeTableInterface", "ncolumns = 0");
   }
}

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

   fFormulas->Delete();
   delete fFormulas;
   delete fInput;
   delete fSelector;

   if (fTree) fTree->SetEntryList(0);
   delete fEntries;
}

//______________________________________________________________________________
void TTreeTableInterface::SetVariablesExpression(const char *varexp)
{
   // Compile the variables expression from the given varexp.

   // FIXME check if enough protection against wrong expressions is in place

   Bool_t allvar = kFALSE;

   if (varexp) {
      if (!strcmp(varexp, "*")) { allvar = kTRUE; }
   } else {
      // if varexp is empty, take all available leaves as a column
      allvar = kTRUE;
   }

   if (allvar) {
      TObjArray *leaves = fTree->GetListOfLeaves();
      UInt_t nleaves = leaves->GetEntries();
      if (!nleaves) {
         Error("TTreeTableInterface", "No leaves in Tree");
         return;
      }
      fNColumns = nleaves;
      for (UInt_t ui = 0; ui < fNColumns; ui++) {
         TLeaf *lf = (TLeaf*)leaves->At(ui);
         fFormulas->Add(new TTreeFormula("Var1", lf->GetName(), fTree));
      }
      // otherwise select only the specified columns
   } else {
      std::vector<TString> cnames;
      fNColumns = fSelector->SplitNames(varexp,cnames);

      // Create the TreeFormula objects corresponding to each column
      for (UInt_t ui = 0; ui < fNColumns; ui++) {
         fFormulas->Add(new TTreeFormula("Var1", cnames[ui].Data(), fTree));
      }
   }
}

//______________________________________________________________________________
void TTreeTableInterface::SetSelection(const char *selection)
{
   // Set the selection expression.

   // FIXME verify functionality
   if (fSelect) {
      fFormulas->Remove(fSelect);
      delete fSelect;
      fSelect = 0;
   }
   if (selection && strlen(selection)) {
      fSelect = new TTreeFormula("Selection", selection, fTree);
      fFormulas->Add(fSelect);
   }

   if (fManager) {
      for (Int_t i = 0; i <= fFormulas->LastIndex(); i++) {
         fManager->Remove((TTreeFormula*)fFormulas->At(i));
      }
   }

   // SyncFormulas() will update the formula manager if needed
   SyncFormulas();
   InitEntries();
}

//______________________________________________________________________________
void TTreeTableInterface::SyncFormulas()
{
   // Sync the formulas using the TTreeFormulaManager.

   // FIXME verify functionality

   Int_t i = 0;
   if (fFormulas->LastIndex() >= 0) {
      if (fSelect) {
         if (fSelect->GetManager()->GetMultiplicity() > 0 ) {
            if (!fManager) fManager = new TTreeFormulaManager;
            for (i = 0; i <= fFormulas->LastIndex(); i++) {
               fManager->Add((TTreeFormula*)fFormulas->At(i));
            }
            fManager->Sync();
         }
      }
      for (i = 0; i < fFormulas->LastIndex(); i++) {
         TTreeFormula *form = ((TTreeFormula*)fFormulas->At(i));
         switch (form->GetManager()->GetMultiplicity()) {
            case  1:
            case  2:
            case -1:
               fForceDim = kTRUE;
               break;
            case  0:
               break;
         }
      }
   }
}

//______________________________________________________________________________
void TTreeTableInterface::InitEntries()
{
   // Initialise the TEntryList with the entries that match the
   // selection criterium.

   TEntryList *entrylist = new TEntryList(fTree);

   UInt_t ui = 0;
   Int_t i = 0;

   Long64_t notSkipped = 0;
   Int_t tnumber = -1;
   Long64_t entry = fFirstEntry;
   Int_t entriesToDisplay = fNEntries;

   while (entriesToDisplay != 0){
//       entryNumber = fTree->GetEntryNumber(entry);
//       if(entryNumber < 0) break;
      Long64_t localEntry = fTree->LoadTree(entry);
      if (localEntry < 0) break;
      if (tnumber != fTree->GetTreeNumber()) {
         tnumber = fTree->GetTreeNumber();
         if (fManager) fManager->UpdateFormulaLeaves();
         else {
            for(i = 0; i < fFormulas->LastIndex(); i++)
               ((TTreeFormula*)fFormulas->At(ui))->UpdateFormulaLeaves();
         }
      }
      Int_t ndata = 1;
      if (fForceDim){
         if (fManager)
            ndata = fManager->GetNdata(kTRUE);
         else {
            for (ui = 0; ui < fNColumns; ui++){
               if (ndata < ((TTreeFormula*)fFormulas->At(ui))->GetNdata())
               {
                  ndata = ((TTreeFormula*)fFormulas->At(ui))->GetNdata();
               }
            }
            if (fSelect && fSelect->GetNdata() == 0)
               ndata = 0;
         }
      }
      Bool_t skip = kFALSE;

      // Loop over the instances of the selection condition
      for (Int_t inst = 0; inst < ndata; inst++){
         if (fSelect){
            if (fSelect->EvalInstance(inst) == 0){
               skip = kTRUE;
               entry++;
            }
         }
      }
      if (!skip){
         entrylist->Enter(entry);
         notSkipped++;
         entriesToDisplay--;
         entry++;
      }
   }
   SetEntryList(entrylist);
}

//______________________________________________________________________________
Double_t TTreeTableInterface::GetValue(UInt_t row, UInt_t column)
{
   // Return the value of row,column. If the position does not exist
   // or does not contain a number, 0 is returned.

   static UInt_t prow = 0;

   if (row < fNRows) {
      Long64_t entry = 0;
      if (row == prow + 1) {
         entry = fEntries->Next();
      } else {
         entry = fEntries->GetEntry(row);
      }
      prow = row;
      fTree->LoadTree(entry);
   } else {
      Error("TTreeTableInterface", "Row requested does not exist");
      return 0;
   }
   if (column < fNColumns) {
      TTreeFormula *formula = (TTreeFormula *)fFormulas->At(column);
      if (!formula->IsString()) {
         return (Double_t)formula->EvalInstance();
      } else {
         Warning("TTreeTableInterface::GetValue", "Value requested is a "
                 "string, returning 0.");
         return 0;
      }
   } else {
      Error("TTreeTableInterface", "Column requested does not exist");
      return 0;
   }
}

//______________________________________________________________________________
const char *TTreeTableInterface::GetValueAsString(UInt_t row, UInt_t column)
{
   // Return the content of row,column as string to use in a
   // TGTableCell label.

   static UInt_t prow = 0;

   if (row < fNRows) {
      Long64_t entry = 0;
      if (row == prow + 1) {
         entry = fEntries->Next();
      } else {
         entry = fEntries->GetEntry(row);
      }
      prow = row;
      fTree->LoadTree(entry);
   } else {
      Error("TTreeTableInterface", "Row requested does not exist");
      return 0;
   }
   if (column < fNColumns) {
      TTreeFormula *formula = (TTreeFormula *)fFormulas->At(column);
      if(formula->IsString()) {
         return Form("%s", formula->EvalStringInstance());
      } else {
         return Form("%5.2f", (Double_t)formula->EvalInstance());
      }
   } else {
      Error("TTreeTableInterface", "Column requested does not exist");
      return 0;
   }
}

//______________________________________________________________________________
const char *TTreeTableInterface::GetRowHeader(UInt_t row)
{
   // Return a string to use as a label for rowheader at column.

   if (row < fNRows) {
      return Form("%lld", fEntries->GetEntry(row));
   } else {
      Error("TTreeTableInterface", "Row requested does not exist");
      return "";
   }
}

//______________________________________________________________________________
const char *TTreeTableInterface::GetColumnHeader(UInt_t column)
{
   // Return a string to use as a label for columnheader at column.

   TTreeFormula *formula = (TTreeFormula *)fFormulas->At(column);
   if (column < fNColumns) {
      return formula->GetTitle();
   } else {
      Error("TTreeTableInterface", "Column requested does not exist");
      return "";
   }
}

//______________________________________________________________________________
UInt_t TTreeTableInterface::GetNColumns()
{
   // Return the amount of column available.

   return fNColumns;
}

//______________________________________________________________________________
UInt_t TTreeTableInterface::GetNRows()
{
   // Return the amount of rows in the Tree.

   return fNRows;
}

//______________________________________________________________________________
void TTreeTableInterface::AddColumn(const char *expression, UInt_t position)
{
   // Add column according ot expression at position,
   // TGTable->Update() is needed afterwards to apply the change to
   // the TGTable.

   TString onerow = expression;

   if (onerow.Contains(':')) {
      Error("TTreeTableInterface::AddColumn", "Only 1 expression allowed.");
      return;
   }

   // Create the TreeFormula objects corresponding to the new expression
   TTreeFormula *formula = new TTreeFormula("Var1", expression, fTree);
   fFormulas->AddAt(formula, position);

   if (fManager) {
      fManager->Add(formula);
      fManager->Sync();
   }
   fNColumns++;
}

//______________________________________________________________________________
void TTreeTableInterface::AddColumn(TTreeFormula *formula, UInt_t position)
{
   // Add column with formula at position, TGTable->Update() is needed
   // afterwards to apply the change to the TGTable.

   if (position > fNColumns) {
      Error("TTreeTableInterface::AddColumn", "Please specify a "
            "valid position.");
      return;
   }
   fFormulas->AddAt(formula, position);
   if (fManager) {
      fManager->Add(formula);
      fManager->Sync();
   }
   fNColumns++;
}

//______________________________________________________________________________
void TTreeTableInterface::RemoveColumn(UInt_t position)
{
   // Remove column at position, TGTable->Update() is needed
   // afterwards to apply the change to the TGTable.

   if (position >= fNColumns) {
      Error("TTreeTableInterface::RemoveColumn", "Please specify a "
            "valid column.");
      return;
   } else if (fNColumns == 1) {
      Error("TTreeTableInterface::RemoveColumn", "Can't remove last column");
      return;
   }

   TTreeFormula *formula = (TTreeFormula *)fFormulas->RemoveAt(position);
   if (fManager) {
      fManager->Remove(formula);
      fManager->Sync();
   }

   if (formula) delete formula;
   fNColumns--;
}

//______________________________________________________________________________
void TTreeTableInterface::SetFormula(TTreeFormula *formula, UInt_t position)
{
   // Set the TTreeFormula of position to formula.

   if (position >= fNColumns) {
      Error("TTreeTableInterface::SetFormula", "Please specify a "
            "valid position.");
      return;
   }
   TTreeFormula *form = (TTreeFormula *)fFormulas->RemoveAt(position);
   if (fSelect) {
      fManager->Remove(form);
   }
   if (form) delete form;
   fFormulas->AddAt(formula, position);
   if (fManager) {
      fManager->Add(formula);
      fManager->Sync();
   }

}

//______________________________________________________________________________
void TTreeTableInterface::SetEntryList(TEntryList *entrylist)
{
   // Set the currently active entrylist.

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