ROOT logo
// @(#)root/table:$Id: TFileIter.cxx 23777 2008-05-09 06:15:20Z brun $
// Author: Valery Fine(fine@bnl.gov)   01/03/2001

/*************************************************************************
 * Copyright (C) 1995-2004, Rene Brun and Fons Rademakers.               *
 * Copyright (C) 2001 [BNL] Brookhaven National Laboratory.              *
 * All rights reserved.                                                  *
 *                                                                       *
 * For the licensing terms see $ROOTSYS/LICENSE.                         *
 * For the list of contributors see $ROOTSYS/README/CREDITS.             *
 *************************************************************************/

///////////////////////////////////////////////////////////////////////////
//                                                                       //
// Class to iterate (read / write ) the events written to TFile.         //
// The event is supposed to assign an unique ID in form of               //
//                                                                       //
//  TKey <event Id> ::= eventName "." run_number "." event_number        //
//                                                                       //
// and stored as the TKey name of the object written                     //
//                                                                       //
//        ///////        //////////      ////////        ///////     //////
//
// void TesTFileIter(){
// // This macros tests the various methods of TFileIter class.
//   gSystem->Load("libTable");
//
//   //First create simple ROOT file
//   TDataSet *ds = new TDataSet("event");
//   TObject *nextObject = 0;
//   TRandom run;
//   TRandom event;
//   {
//     TFileIter outSet("test.root","RECREATE");
//     UInt_t totalEvent = 10;
//     UInt_t runNumber  = 20010301;
//     Int_t i=0;
//     Int_t j=0;
//     for (;j < 10;j++) {
//       for (i = 1;i<totalEvent;i++) {
//         outSet.NextEventPut(ds,UInt_t(i),UInt_t(runNumber+j+10*run.Rndm()-5));
//       }
//     }
//   }
//   printf(" ----------------------> TFile has been created <--------------------\n");
//   TFile *f = new TFile("test.root");
//   TFileIter readObj(f);
//   // the number of the object available directly from "MyDataSet.root"
//   Int_t size = readObj.TotalKeys();
//   printf(" The total number of the objects: %d\n",size);
//
//   //-----------------------------------------------------------------------
//   // Loop over all objects, read them in to memory one by one
//
//   printf(" -- > Loop over all objects, read them in to memory one by one < -- \n");
//   for( readObj = 0; int(readObj) < size; ++readObj){
//       nextObject = *readObj;
//       printf(" %d bytes of the object \"%s\" of class \"%s\" written with TKey \"%s\"  has been read from file\n"
//                ,readObj.GetObjlen()
//                ,nextObject->GetName()
//                ,nextObject->IsA()->GetName()
//                ,(const char *)readObj
//             );
//       delete nextObject;
//  }
// //-----------------------------------------------------------------------
// //  Now loop over all objects in inverse order
//  printf(" -- > Now loop over all objects in inverse order < -- \n");
//  for( readObj = size-1; (int)readObj >= 0; --readObj)
//  {
//       nextObject = *readObj;
//       if (nextObject) {
//          printf(" Object \"%s\" of class \"%s\" written with TKey \"%s\"  has been read from file\n"
//                 ,nextObject->GetName()
//                 , nextObject->IsA()->GetName()
//                 ,(const char *)readObj
//                );
//         delete nextObject;
//      } else {
//        printf("Error reading file by index\n");
//      }
//  }
// //-----------------------------------------------------------------------
// // Loop over the objects starting from the object with the key name "event.02.01"
//   printf(" -- > Loop over the objects starting from the object with the key name \"event.02.01\" < -- \n");
//   for( readObj = "event.02.01"; (const char *)readObj != 0; ++readObj){
//       nextObject = *readObj;
//       printf(" Object \"%s\" of class \"%s\" written with Tkey \"%s\"  has been read from file\n"
//               , nextObject->GetName()
//               , nextObject->IsA()->GetName()
//               , (const char *)readObj
//             );
//       delete nextObject;
//   }
//
//   printf(" -- > Loop over the objects starting from the 86-th object" < -- \n");
//   for( readObj = (const char *)(readObj = 86); (const char *)readObj != 0; ++readObj){
//       nextObject = *readObj;
//       printf(" Object \"%s\" of class \"%s\" written with Tkey \"%s\"  has been read from file\n"
//               , nextObject->GetName()
//               , nextObject->IsA()->GetName()
//               , (const char *)readObj
//             );
//       delete nextObject;
//   }
//
// }
//-----------------------------------------------------------------------
///////////////////////////////////////////////////////////////////////////


#include <assert.h>

#include "TEnv.h"
#include "TSystem.h"
#include "TFile.h"
#include "TKey.h"

#include "TFileIter.h"
#include "TDsKey.h"

ClassImp(TFileIter)

//__________________________________________________________________________
TFileIter::TFileIter(TFile *file) : fFileBackUp(0),fDirectoryBackUp(0), fNestedIterator(0)
         , fRootFile(file)
         , fEventName("event"), fRunNumber(UInt_t(-1)),fEventNumber(UInt_t(-1))
         , fCursorPosition(-1),  fOwnTFile(kFALSE)
{ 
   // Create iterator over all objects from the TFile provided
   Initialize(); 
}

//__________________________________________________________________________
TFileIter::TFileIter(TDirectory *directory) :  fFileBackUp(0),fDirectoryBackUp(0), fNestedIterator(0)
         , fRootFile(directory)
         , fEventName("event"), fRunNumber(UInt_t(-1)),fEventNumber(UInt_t(-1))
         , fCursorPosition(-1),  fOwnTFile(kFALSE)
{ 
   // Create iterator over all objects from the TDirectory provided
   Initialize(); 
}
//__________________________________________________________________________
TFileIter::TFileIter(const char *name, Option_t *option, const char *ftitle
                     , Int_t compress, Int_t /*netopt*/) :fNestedIterator(0),fRootFile (0)
{
   // Open ROOT TFile by the name provided;
   // This TFile is to be deleted by the TFileIter alone
   if (name && name[0]) {
      fOwnTFile = kTRUE;
      // Map a special file system to rfio
      //   /hpss/in2p3.fr/group/atlas/cppm/data/genz
      //   #setenv HPSSIN bnlhpss:/home/atlasgen/evgen
      // #example for castor:   /castor/cern.ch/user/p/paniccia/evgen
      fRootFile = TFile::Open(MapName(name),option,ftitle,compress);
      Initialize();
   }
}

//__________________________________________________________________________
TFileIter::TFileIter(const TFileIter &dst) : TListIter()
          ,fFileBackUp(0),  fDirectoryBackUp(0), fNestedIterator(0)
          ,fRootFile(dst.fRootFile),fEventName(dst.fEventName), fRunNumber(dst.fRunNumber)
          ,fEventNumber(dst.fRunNumber),
           fCursorPosition(-1),  fOwnTFile(dst.fOwnTFile)
{
   // Copy ctor can be used with the "read only" files only.
   assert(!fRootFile->IsWritable());
   if (fRootFile && fOwnTFile && !fRootFile->IsWritable()) {
      // Reopen the file
      if (fRootFile->InheritsFrom(TFile::Class())) 
      {
         TFile *thisFile = (TFile *)fRootFile;
         fRootFile = TFile::Open(MapName(fRootFile->GetName())
            ,fRootFile->GetOption()
            ,fRootFile->GetTitle()
            ,thisFile->GetCompressionLevel());
      }
   }

   Initialize();
   // Adjust this iterator position
   SkipObjects(dst.fCursorPosition);
}
//__________________________________________________________________________
TFileIter::~TFileIter()
{
   // TFileIter dtor
   TFileIter *deleteit = fNestedIterator; fNestedIterator = 0;
   delete deleteit;
   if (fRootFile && fOwnTFile ) {  // delete own TFile if any
      if (fRootFile->IsWritable()) fRootFile->Write();
      fRootFile->Close();
      delete fRootFile;
      fRootFile = 0;
   }
}

//__________________________________________________________________________
void TFileIter::Initialize()
{
   //to be documented
   if (fRootFile) {
      fDirection =  kIterForward;
      if (IsOpen()) Reset();
      else  {
         if (fRootFile && fOwnTFile ) delete fRootFile;
         fRootFile = 0;
      }
   }
}
//__________________________________________________________________________
Bool_t  TFileIter::IsOpen() const
{
   // Check whether the associated ROOT TFile was open
   // and TFile object is healthy.

   Bool_t iOpen = kFALSE;
   if (fRootFile && !fRootFile->IsZombie() ) {
      iOpen = kTRUE;
      if (fRootFile->InheritsFrom(TFile::Class()) && !((TFile*)fRootFile)->IsOpen()) 
         iOpen = kFALSE;
   }
   return iOpen;
}

//__________________________________________________________________________
TKey *TFileIter::GetCurrentKey() const
{
  // return the pointer to the current TKey
   
   return ((TFileIter*)this)->SkipObjects(0);
}
//__________________________________________________________________________
Int_t TFileIter::GetDepth() const
{
   // return the current number of the nested subdirectroies;
   //      = 0 - means there is no subdirectories
   return fNestedIterator ? fNestedIterator->GetDepth()+1 : 0;
}

//__________________________________________________________________________
const char *TFileIter::GetKeyName() const
{
   // return the name of the current TKey
   const char *name = 0;
   TKey *key  = GetCurrentKey();
   if (key) name = key->GetName();
   return name;
}
//__________________________________________________________________________
TObject *TFileIter::GetObject() const
{
  // read the object from TFile defined by the current TKey
  //
  // ATTENTION:  memory leak danger !!!
  // ---------
  // This method does create a new object and it is the end-user
  // code responsibility to take care about this object
  // to avoid memory leak.
  //
   return ReadObj(GetCurrentKey());
}
//__________________________________________________________________________
Int_t TFileIter::GetObjlen() const
{
   // Returns the uncompressed length of the current object
   Int_t lenObj = 0;
   TKey *key = GetCurrentKey();
   if (key) lenObj = ((TKey *)key)->GetObjlen();
   return lenObj;
}
//__________________________________________________________________________
Int_t TFileIter::TotalKeys() const
{
  // The total number of the TKey keys in the current TDirectory only
  // Usually this means the total number of different objects
  // those can be read one by one.
  // It does NOT count the nested sub-TDirectory. 
  // It is too costly and it can be abused.
   
   Int_t size = 0;
   if(fList) size +=  fList->GetSize();
   return size;
}
//__________________________________________________________________________
TObject *TFileIter::Next(Int_t  nSkip)
{
  // return the pointer to the object defined by next TKey
  // This method is not recommended. It was done for the sake
  // of the compatibility with TListIter

   SkipObjects(nSkip);
   return GetObject();
}

//__________________________________________________________________________
void TFileIter::PurgeKeys(TList *listOfKeys) 
{
   // Remove the TKey duplication,
   // leave the keys with highest cycle number only
   // Sort if first

   assert(listOfKeys);
   listOfKeys->Sort();
   TObjLink *lnk   = listOfKeys->FirstLink();
   while(lnk) {
      TKey *key = (TKey *)lnk->GetObject();
      Short_t cycle = key->GetCycle(); 
      const char *keyName = key->GetName();
      // Check next object
      lnk = lnk->Next();
      if (lnk) {
         TKey *nextkey = 0;
         TObjLink *lnkThis = lnk;
         while (     lnk
             &&   (nextkey = (TKey *)lnk->GetObject()) 
             &&  !strcmp(nextkey->GetName(), keyName) 
            ) {
            // compare the cycles
            Short_t nextCycle = nextkey->GetCycle() ;
            //printf(" TFileIter::PurgeKeys found new cycle %s :%d : %d\n",
            //      keyName,cycle ,nextCycle);
            assert(cycle != nextCycle);
            TObjLink *lnkNext = lnk->Next();
            if (cycle > nextCycle ) { 
               delete listOfKeys->Remove(lnk);
            } else {
               delete listOfKeys->Remove(lnkThis);
               cycle   = nextCycle;
               lnkThis = lnk;
            }
            lnk = lnkNext;
         }
      }
   }
}

//__________________________________________________________________________
void TFileIter::Reset()
{
   // Reset the status of the iterator
   if (fNestedIterator) { 
      TFileIter *it = fNestedIterator; 
      fNestedIterator=0;
      delete it;
   }
   TListIter::Reset();
   if (!fRootFile->IsWritable()) {
      TList *listOfKeys = fRootFile->GetListOfKeys();
      if (listOfKeys) {
         if (!listOfKeys->IsSorted()) PurgeKeys(listOfKeys);
         fList = listOfKeys;
         if (fDirection == kIterForward) {
            fCursorPosition = 0;
            fCurCursor = fList->FirstLink();
            if (fCurCursor) fCursor = fCurCursor->Next();
         } else {
            fCursorPosition = fList->GetSize()-1;
            fCurCursor = fList->LastLink();
            if (fCurCursor) fCursor = fCurCursor->Prev();
         }
      }
   }
}
//__________________________________________________________________________
void TFileIter::SetCursorPosition(const char *keyNameToFind)
{
   // Find the key by the name provided
   Reset();
   while( (*this != keyNameToFind) && SkipObjects() ) {;}
}
//__________________________________________________________________________
TKey *TFileIter::SkipObjects(Int_t  nSkip)
{
 //
 // Returns the TKey pointer to the nSkip TKey object from the current one
 // nSkip = 0; the state of the iterator is not changed
 //
 // nSkip > 0; iterator skips nSkip objects in the container.
 //            the direction of the iteration is
 //            sign(nSkip)*kIterForward
 //
 // Returns: TKey that can be used to fetch the object from the TDirectory
 //
   TKey *nextObject  = fNestedIterator ? fNestedIterator->SkipObjects(nSkip): 0;
   if (!nextObject) {
      if (fNestedIterator) {
         TFileIter *it = fNestedIterator;
         fNestedIterator = 0;
         delete it;
      }
      Int_t collectionSize = 0;
      if (fList && (collectionSize = fList->GetSize())  ) {
         if (fDirection !=kIterForward) nSkip = -nSkip;
         Int_t newPos = fCursorPosition + nSkip;
         if (0 <= newPos && newPos < collectionSize) {
            do {
               if (fCursorPosition < newPos) {
                  fCursorPosition++;
                  fCurCursor = fCursor;
                  fCursor    = fCursor->Next();
               } else if (fCursorPosition > newPos) {
                  fCursorPosition--;
                  fCurCursor = fCursor;
                  fCursor    = fCursor->Prev();
               }
            } while (fCursorPosition != newPos);
            if (fCurCursor) nextObject = dynamic_cast<TKey *>(fCurCursor->GetObject());
         } else  {
            fCurCursor = fCursor = 0;
            if (newPos < 0) {
               fCursorPosition = -1;
               if (fList) fCursor = fList->FirstLink();
            } else  {
               fCursorPosition = collectionSize;
               if (fList) fCursor = fList->LastLink();
            }
         }
      }
   }
   return nextObject;
}
//__________________________________________________________________________
TKey *TFileIter::NextEventKey(UInt_t eventNumber, UInt_t runNumber, const char *name)
{

   // Return the key that name matches the "event" . "run number" . "event number" schema

   Bool_t reset = kFALSE;
   if (name && name[0] && name[0] != '*') { if (fEventName > name) reset = kTRUE; fEventName   = name; }
   if (runNumber   !=UInt_t(-1) ) { if (fRunNumber > runNumber)     reset = kTRUE; fRunNumber   = runNumber;}
   if (eventNumber !=UInt_t(-1) ) { if (fEventNumber > eventNumber) reset = kTRUE; fEventNumber = eventNumber;}

   if (reset) Reset();
   //   TIter &nextKey = *fKeysIterator;
   TKey *key = 0;
   TDsKey thisKey;
   while ( (key = SkipObjects()) ) {
      if (fDirection==kIterForward) fCursorPosition++;
      else                          fCursorPosition--;
      if ( name[0] != '*') {
         thisKey.SetKey(key->GetName());
         if (thisKey.GetName() < name)  continue;
         if (thisKey.GetName() > name) { key = 0; break; }
      }
      // Check "run number"
      if (runNumber != UInt_t(-1)) {
         UInt_t thisRunNumber = thisKey.RunNumber();
         if (thisRunNumber < runNumber) continue;
         if (thisRunNumber < runNumber) { key = 0; break; }
      }
      // Check "event number"
      if (eventNumber != UInt_t(-1)) {
         UInt_t thisEventNumber = thisKey.EventNumber();
         if (thisEventNumber < eventNumber) continue;
         if (thisEventNumber > eventNumber) {key = 0; break; }
      }
      break;
   }
   return key;
}
//__________________________________________________________________________
TObject *TFileIter::NextEventGet(UInt_t eventNumber, UInt_t runNumber, const char *name)
{
  // reads, creates and returns the object by TKey name that matches
  // the "name" ."runNumber" ." eventNumber" schema
  // Attention: This method does create a new TObject and it is the user
  // code responsibility to take care (delete) this object to avoid
  // memory leak.

   return ReadObj(NextEventKey(eventNumber,runNumber,name));
}

//__________________________________________________________________________
TObject *TFileIter::ReadObj(const TKey *key)  const
{
   //Read the next TObject from for the TDirectory by TKey provided
   TObject *obj = 0;
   if (fNestedIterator) obj = fNestedIterator->ReadObj(key);
   else if (key)  {
      obj = ((TKey *)key)->ReadObj();
      if (obj && obj->InheritsFrom(TDirectory::Class()) ) 
      {
         // create the next iteration level.
         assert(!fNestedIterator);
         ((TFileIter*)this)->fNestedIterator = new TFileIter((TDirectory *)obj);
         // FIXME:  needs to set  fDirection if needed 02/11/2007 vf
      }
   }
   return obj;
}

//__________________________________________________________________________
Int_t  TFileIter::NextEventPut(TObject *obj, UInt_t eventNum,  UInt_t runNumber
                              , const char *name)
{
   // Create a special TKey name with obj provided and write it out.

   Int_t wBytes = 0;
   if (obj && IsOpen() && fRootFile->IsWritable()) {
      TDsKey thisKey(runNumber,eventNum);
      if (name && name[0])
         thisKey.SetName(name);
      else
         thisKey.SetName(obj->GetName());

      if (fRootFile != gDirectory) {
         SaveFileScope();
         fRootFile->cd();
      }
      wBytes = obj->Write(thisKey.GetKey());
      if (fRootFile->InheritsFrom(TFile::Class())) ((TFile*)fRootFile)->Flush();
      if (fRootFile != gDirectory)     RestoreFileScope();
   }
   return wBytes;
}
//__________________________________________________________________________
TString TFileIter::MapName(const char *name, const char *localSystemKey,const char *mountedFileSystemKey)
{
   // --------------------------------------------------------------------------------------
   // MapName(const char *name, const char *localSystemKey,const char *mountedFileSystemKey)
   // --------------------------------------------------------------------------------------
   // Substitute the logical name with the real one if any
   // 1. add a line into system.rootrc or ~/.rootrc or ./.rootrc
   //
   //  TFileIter.ForeignFileMap  mapFile // the name of the file
                                         // to map the local name
                                         // to the global file service
   //
   //  If this line is omitted then TFileIter class seeks for
   //  the default mapping file in the current directory "io.config"

   // 2. If the "io.config" file found then it defines the mapping as follows:
   //
   //  TFileIter.LocalFileSystem   /castor
   //  TFileIter.MountedFileSystem rfio:/castor

   // If "io.config" doesn't exist then no mapping is to be performed
   // and all file names are treated "as is"

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