ROOT logo
// @(#)root/tree:$Id: TTreeCache.cxx 29125 2009-06-22 09:03:21Z brun $
// Author: Rene Brun   04/06/2006

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

//////////////////////////////////////////////////////////////////////////
//                                                                      //
// TTreeCache                                                           //
//                                                                      //
//  A specialized TFileCacheRead object for a TTree                     //
//  This class acts as a file cache, registering automatically the      //
//  baskets from the branches being processed (TTree::Draw or           //
//  TTree::Process and TSelectors) when in the learning phase.          //
//  The learning phase is by default 100 entries.                       //
//  It can be changed via TTreeCache::SetLearnEntries.                  //
//                                                                      //
//  This cache speeds-up considerably the performance, in particular    //
//  when the Tree is accessed remotely via a high latency network.      //
//                                                                      //
//  The default cache size (10 Mbytes) may be changed via the function  //
//      TTreeCache::SetCacheSize                                        //
//                                                                      //
//  Only the baskets for the requested entry range are put in the cache //
//                                                                      //
//  For each Tree being processed a TTreeCache object is created.       //
//  This object is automatically deleted when the Tree is deleted or    //
//  when the file is deleted.                                           //
//                                                                      //
//  -Special case of a TChain                                           //
//   Once the training is done on the first Tree, the list of branches  //
//   in the cache is kept for the following files.                      //
//                                                                      //
//  -Special case of a TEventlist                                       //
//   if the Tree or TChain has a TEventlist, only the buffers           //
//   referenced by the list are put in the cache.                       //
//                                                                      //
//////////////////////////////////////////////////////////////////////////

#include "TTreeCache.h"
#include "TChain.h"
#include "TList.h"
#include "TBranch.h"
#include "TEventList.h"
#include "TObjString.h"
#include "TRegexp.h"
#include "TLeaf.h"
#include "TFriendElement.h"
#include "TFile.h"

Int_t TTreeCache::fgLearnEntries = 100;

ClassImp(TTreeCache)

//______________________________________________________________________________
TTreeCache::TTreeCache() : TFileCacheRead(),
   fEntryMin(0),
   fEntryMax(1),
   fEntryNext(1),
   fZipBytes(0),
   fNbranches(0),
   fNReadOk(0),
   fNReadMiss(0),
   fNReadPref(0),
   fBranches(0),
   fBrNames(0),
   fOwner(0),
   fTree(0),
   fIsLearning(kTRUE),
   fIsManual(kFALSE)
{
   // Default Constructor.
}

//______________________________________________________________________________
TTreeCache::TTreeCache(TTree *tree, Int_t buffersize) : TFileCacheRead(tree->GetCurrentFile(),buffersize),
   fEntryMin(0),
   fEntryMax(tree->GetEntriesFast()),
   fEntryNext(0),
   fZipBytes(0),
   fNbranches(0),
   fNReadOk(0),
   fNReadMiss(0),
   fNReadPref(0),
   fBranches(0),
   fBrNames(new TList),
   fOwner(tree),
   fTree(0),
   fIsLearning(kTRUE),
   fIsManual(kFALSE)
{
   // Constructor.

   fEntryNext = fEntryMin + fgLearnEntries;
   Int_t nleaves = tree->GetListOfLeaves()->GetEntries();
   fBranches = new TObjArray(nleaves);
}

//______________________________________________________________________________
TTreeCache::~TTreeCache()
{
   // destructor. (in general called by the TFile destructor

   delete fBranches;
   if (fBrNames) {fBrNames->Delete(); delete fBrNames; fBrNames=0;}
}

//_____________________________________________________________________________
void TTreeCache::AddBranch(TBranch *b, Bool_t subbranches /*= kFALSE*/)
{
   //add a branch to the list of branches to be stored in the cache
   //this function is called by TBranch::GetBasket

   if (!fIsLearning) return;

   // Reject branch that are not from the cached tree.
   if (!b || fOwner->GetTree() != b->GetTree()) return;

   //Is branch already in the cache?
   Bool_t isNew = kTRUE;
   for (int i=0;i<fNbranches;i++) {
      if (fBranches->UncheckedAt(i) == b) {isNew = kFALSE; break;}
   }
   if (isNew) {
      fTree = b->GetTree();
      fBranches->AddAtAndExpand(b, fNbranches);
      fBrNames->Add(new TObjString(b->GetName()));
      fZipBytes += b->GetZipBytes();
      fNbranches++;
      if (gDebug > 0) printf("Entry: %lld, registering branch: %s\n",b->GetTree()->GetReadEntry(),b->GetName());
   }
   
   // process subbranches
   if (subbranches) {
      TObjArray *lb = b->GetListOfBranches();
      Int_t nb = lb->GetEntriesFast();
      for (Int_t j = 0; j < nb; j++) {
         TBranch* branch = (TBranch*) lb->UncheckedAt(j);
         if (!branch) continue;
         AddBranch(branch, subbranches);
      }
   }
}


//_____________________________________________________________________________
void TTreeCache::AddBranch(const char *bname, Bool_t subbranches /*= kFALSE*/)
{
   // Add a branch to the list of branches to be stored in the cache
   // this is to be used by user (thats why we pass the name of the branch).
   // It works in exactly the same way as TTree::SetBranchStatus so you
   // probably want to look over ther for details about the use of bname
   // with regular expresions.
   // The branches are taken with respect to the Owner of this TTreeCache
   // (i.e. the original Tree)
   
   TBranch *branch, *bcount;
   TLeaf *leaf, *leafcount;

   Int_t i;
   Int_t nleaves = (fOwner->GetListOfLeaves())->GetEntriesFast();
   TRegexp re(bname,kTRUE);
   Int_t nb = 0;

   // first pass, loop on all branches
   // for leafcount branches activate/deactivate in function of status
   for (i=0;i<nleaves;i++)  {
      leaf = (TLeaf*)(fOwner->GetListOfLeaves())->UncheckedAt(i);
      branch = (TBranch*)leaf->GetBranch();
      TString s = branch->GetName();
      if (strcmp(bname,"*")) { //Regexp gives wrong result for [] in name
         TString longname; 
         longname.Form("%s.%s",fOwner->GetName(),branch->GetName());
         if (strcmp(bname,branch->GetName()) 
             && longname != bname
             && s.Index(re) == kNPOS) continue;
      }
      nb++;
      AddBranch(branch, subbranches);
      leafcount = leaf->GetLeafCount();
      if (leafcount) {
         bcount = leafcount->GetBranch();
         AddBranch(bcount, subbranches);
      }
   }
   if (nb==0 && strchr(bname,'*')==0) {
      branch = fOwner->GetBranch(bname);
      if (branch) {
         AddBranch(branch, subbranches);
         ++nb;
      }
   }

   //search in list of friends
   UInt_t foundInFriend = 0;
   if (fOwner->GetListOfFriends()) {
      TIter nextf(fOwner->GetListOfFriends());
      TFriendElement *fe;
      TString name;
      while ((fe = (TFriendElement*)nextf())) {
         TTree *t = fe->GetTree();
         if (t==0) continue;

         // If the alias is present replace it with the real name.
         char *subbranch = (char*)strstr(bname,fe->GetName());
         if (subbranch!=bname) subbranch = 0;
         if (subbranch) {
            subbranch += strlen(fe->GetName());
            if ( *subbranch != '.' ) subbranch = 0;
            else subbranch ++;
         }
         if (subbranch) {
            name.Form("%s.%s",t->GetName(),subbranch);
         } else {
            name = bname;
         }
         AddBranch(name, subbranches);
      }
   }
   if (!nb && !foundInFriend) {
      if (gDebug > 0) printf("AddBranch: unknown branch -> %s \n", bname);
      return;
   }
}

//_____________________________________________________________________________
Bool_t TTreeCache::FillBuffer()
{
   // Fill the cache buffer with the branches in the cache.


   if (fNbranches <= 0) return kFALSE;
   TTree *tree = ((TBranch*)fBranches->UncheckedAt(0))->GetTree();
   Long64_t entry = tree->GetReadEntry();
   
   if (!fIsManual && fIsLearning && entry < fEntryNext) return kFALSE;
   
   // Triggered by the user, not the learning phase
   if (entry == -1)  entry=0;

   // Estimate number of entries that can fit in the cache compare it
   // to the original value of fBufferSize not to the real one
   if (fZipBytes==0) {
      fEntryNext = entry + tree->GetEntries();;    
   } else {
      fEntryNext = entry + tree->GetEntries()*fBufferSizeMin/fZipBytes;
   }
   if (fEntryMax <= 0) fEntryMax = tree->GetEntries();
   if (fEntryNext > fEntryMax) fEntryNext = fEntryMax+1;

   // Check if owner has a TEventList set. If yes we optimize for this
   // Special case reading only the baskets containing entries in the
   // list.
   TEventList *elist = fOwner->GetEventList();
   Long64_t chainOffset = 0;
   if (elist) {
      if (fOwner->IsA() ==TChain::Class()) {
         TChain *chain = (TChain*)fOwner;
         Int_t t = chain->GetTreeNumber();
         chainOffset = chain->GetTreeOffset()[t];
      }
   }

   //clear cache buffer
   TFileCacheRead::Prefetch(0,0);
   //store baskets
   Bool_t mustBreak = kFALSE;
   for (Int_t i=0;i<fNbranches;i++) {
      if (mustBreak) break;
      TBranch *b = (TBranch*)fBranches->UncheckedAt(i);
      if (b->GetDirectory()==0) continue;
      if (b->GetDirectory()->GetFile() != fFile) continue;
      Int_t nb = b->GetMaxBaskets();
      Int_t *lbaskets   = b->GetBasketBytes();
      Long64_t *entries = b->GetBasketEntry();
      if (!lbaskets || !entries) continue;
      //we have found the branch. We now register all its baskets
      //from the requested offset to the basket below fEntrymax
      Int_t blistsize = b->GetListOfBaskets()->GetSize();
      for (Int_t j=0;j<nb;j++) {
         // This basket has already been read, skip it
         if (j<blistsize && b->GetListOfBaskets()->UncheckedAt(j)) continue;

         Long64_t pos = b->GetBasketSeek(j);
         Int_t len = lbaskets[j];
         if (pos <= 0 || len <= 0) continue;
         if (entries[j] > fEntryNext) continue;
         if (entries[j] < entry && (j<nb-1 && entries[j+1] < entry)) continue;
         if (elist) {
            Long64_t emax = fEntryMax;
            if (j<nb-1) emax = entries[j+1]-1;
            if (!elist->ContainsRange(entries[j]+chainOffset,emax+chainOffset)) continue;
         }
         fNReadPref++;
         TFileCacheRead::Prefetch(pos,len);
         //we allow up to twice the default buffer size. When using eventlist in particular
         //it may happen that the evaluation of fEntryNext is bad, hence this protection
         if (fNtot > 2*fBufferSizeMin) {TFileCacheRead::Prefetch(0,0);mustBreak = kTRUE; break;}
      }
      if (gDebug > 0) printf("Entry: %lld, registering baskets branch %s, fEntryNext=%lld, fNseek=%d, fNtot=%d\n",entry,((TBranch*)fBranches->UncheckedAt(i))->GetName(),fEntryNext,fNseek,fNtot);
   }
   fIsLearning = kFALSE;
   if (mustBreak) return kFALSE;
   return kTRUE;
}

//_____________________________________________________________________________
Double_t TTreeCache::GetEfficiency()
{
   // Give the total efficiency of the cache... defined as the ratio
   // of blocks found in the cache vs. the number of blocks prefetched
   // ( it could be more than 1 if we read the same block from the cache more
   //   than once )
   // Note: This should eb used at the end of the processing or we will
   //       get uncomplete stats

   if ( !fNReadPref )
      return 0;

   return ((Double_t)fNReadOk / (Double_t)fNReadPref);
}

//_____________________________________________________________________________
Double_t TTreeCache::GetEfficiencyRel()
{
   // This will indicate a sort of relative efficiency... a ratio of the
   // reads found in the cache to the number of reads so far

   if ( !fNReadOk && !fNReadMiss )
      return 0;

   return ((Double_t)fNReadOk / (Double_t)(fNReadOk + fNReadMiss));
}

//_____________________________________________________________________________
Int_t TTreeCache::GetLearnEntries()
{
   //static function returning the number of entries used to train the cache
   //see SetLearnEntries

   return fgLearnEntries;
}

//_____________________________________________________________________________
TTree *TTreeCache::GetOwner() const
{
   //return the owner of this cache.

   return fOwner;
}

//_____________________________________________________________________________
TTree *TTreeCache::GetTree() const
{
   //return Tree in the cache
   if (fNbranches <= 0) return 0;
   return ((TBranch*)(fBranches->UncheckedAt(0)))->GetTree();
}

//_____________________________________________________________________________
Int_t TTreeCache::ReadBuffer(char *buf, Long64_t pos, Int_t len)
{
   // Read buffer at position pos.
   // If pos is in the list of prefetched blocks read from fBuffer.
   // Otherwise try to fill the cache from the list of selected branches,
   // and recheck if pos is now in the list.
   // Returns 
   //    -1 in case of read failure, 
   //     0 in case not in cache,
   //     1 in case read from cache.
   // This function overloads TFileCacheRead::ReadBuffer.

   //Is request already in the cache?
   if (TFileCacheRead::ReadBuffer(buf,pos,len) == 1){
      fNReadOk++;
      return 1;
   }

   //not found in cache. Do we need to fill the cache?
   Bool_t bufferFilled = FillBuffer();
   if (bufferFilled) {
      Int_t res = TFileCacheRead::ReadBuffer(buf,pos,len);

      if (res == 1)
         fNReadOk++;
      else if (res == 0)
         fNReadMiss++;

      return res;
   }
   fNReadMiss++;

   return 0;
}

//_____________________________________________________________________________
void TTreeCache::ResetCache()
{
   // This will simply clear the cache
   TFileCacheRead::Prefetch(0,0);
}

//_____________________________________________________________________________
void TTreeCache::SetEntryRange(Long64_t emin, Long64_t emax)
{
   // Set the minimum and maximum entry number to be processed
   // this information helps to optimize the number of baskets to read
   // when prefetching the branch buffers.

   // This is called by TTreePlayer::Process in an automatic way...
   // don't do it if the user has specified the branches.
   if(fIsManual)
      return;

   fEntryMin  = emin;
   fEntryMax  = emax;
   fEntryNext  = fEntryMin + fgLearnEntries;
   if (gDebug > 0)
      Info("SetEntryRange", "fEntryMin=%lld, fEntryMax=%lld, fEntryNext=%lld",
                             fEntryMin, fEntryMax, fEntryNext);
   if (fIsLearning) {
      // Restart learning
      fIsLearning = kTRUE;
      fIsManual = kFALSE;
      fNbranches  = 0;
      fZipBytes   = 0;
      if (fBrNames) fBrNames->Delete();
   }
}

//_____________________________________________________________________________
void TTreeCache::SetLearnEntries(Int_t n)
{
   // Static function to set the number of entries to be used in learning mode
   // The default value for n is 10. n must be >= 1

   if (n < 1) n = 1;
   fgLearnEntries = n;
}

//_____________________________________________________________________________
void TTreeCache::StartLearningPhase()
{
   // The name should be enough to explain the method.
   // The only additional comments is that the cache is cleaned before
   // the new learning phase.
   
   fIsLearning = kTRUE;
   fIsManual = kFALSE;
   fNbranches  = 0;
   fZipBytes   = 0;
   if (fBrNames) fBrNames->Delete();
   fIsTransferred = kFALSE;
}

//_____________________________________________________________________________
void TTreeCache::StopLearningPhase()
{
   // This is the counterpart of StartLearningPhase() and can be used to stop
   // the learning phase. It's useful when the user knows exactly what branches
   // he is going to use.
   // For the moment it's just a call to FillBuffer() since that method
   // will create the buffer lists from the specified branches.
   
   fIsLearning = kFALSE;
   fIsManual = kTRUE;
   FillBuffer();

   // If this is the first time we get here since the last FillBuffer
   // it's probable that the information about the prefetched buffers is there
   // but it hasn't actually been transfered... Is this the best place to put it??
   if (fNseek > 0 && !fIsSorted) {
      Sort();

      // Then we use the vectored read to read everything now
      fFile->ReadBuffers(fBuffer,fPos,fLen,fNb);
      fIsTransferred = kTRUE;
   }
}

//_____________________________________________________________________________
void TTreeCache::UpdateBranches(TTree *tree, Bool_t owner)
{
   //update pointer to current Tree and recompute pointers to the branches in the cache

   if (owner) {
      fOwner = tree;
      SetFile(tree->GetCurrentFile());
   }
   fTree = tree;

   fEntryMin  = 0;
   fEntryMax  = fTree->GetEntries();
   fEntryNext = fEntryMin + fgLearnEntries;
   if (fBrNames->GetEntries() > 0) {
      fIsLearning = kFALSE;
   }
   fZipBytes  = 0;
   fNbranches = 0;

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