00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013 #ifndef ROOT_StFileIter
00014 #define ROOT_StFileIter
00015
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00046
00047 #ifndef ROOT_TString
00048 #include "TString.h"
00049 #endif
00050 #ifndef ROOT_TIterator
00051 #include "TIterator.h"
00052 #endif
00053 #ifndef ROOT_TList
00054 #include "TList.h"
00055 #endif
00056 #ifndef ROOT_TFile
00057 #include "TFile.h"
00058 #endif
00059
00060
00061 class StFileIter : public TListIter {
00062
00063 private:
00064
00065 TFile *fFileBackUp;
00066 TDirectory *fDirectoryBackUp;
00067 StFileIter *fNestedIterator;
00068
00069 bool operator!=(const TIterator&) const{return true;}
00070 TIterator& operator=(const TIterator&){ return *this;}
00071
00072 protected:
00073 TDirectory *fRootFile;
00074 TString fEventName;
00075 UInt_t fRunNumber;
00076 UInt_t fEventNumber;
00077 Int_t fCursorPosition;
00078 Bool_t fOwnTFile;
00079
00080 void Initialize();
00081 TObject *ReadObj(const TKey *key) const;
00082 void RestoreFileScope();
00083 void SaveFileScope();
00084
00085 public:
00086
00087 StFileIter(const char *name, Option_t *option = "",
00088 const char *ftitle = "", Int_t compress = 1,
00089 Int_t netopt = 0);
00090 StFileIter(TFile *file=0);
00091 StFileIter(TDirectory *directory);
00092 StFileIter(const StFileIter &);
00093 virtual ~StFileIter();
00094
00095 Int_t CurrentCursorPosition() const;
00096 virtual const TFile *GetTFile() const;
00097 virtual const TDirectory *GetTDirectory() const;
00098 static TString MapName(const char *name, const char *localSystemKey = 0
00099 , const char *mountedFileSystemKey = 0);
00100 static const char *GetResourceName();
00101 static const char *GetDefaultMapFileName();
00102 static const char *GetLocalFileNameKey();
00103 static const char *GetForeignFileSystemKey();
00104 static void PurgeKeys(TList *listOfKeys);
00105 virtual Bool_t IsOpen() const;
00106 virtual TObject *NextEventGet(UInt_t eventNumber=UInt_t(-1), UInt_t runNumber=UInt_t(-1), const char *name="*");
00107 virtual Int_t NextEventPut(TObject *obj, UInt_t eventNum, UInt_t runNumber, const char *name=0);
00108 TKey *NextEventKey(UInt_t eventNumber=UInt_t(-1), UInt_t runNumber=UInt_t(-1), const char *name="*");
00109 void SetCursorPosition(Int_t cursorPosition);
00110 void SetCursorPosition(const char *keyNameToFind);
00111 Int_t GetObjlen() const;
00112 virtual Int_t TotalKeys() const;
00113 virtual TKey *SkipObjects(Int_t nSkip=1);
00114 virtual TObject *GetObject() const;
00115 virtual Int_t GetDepth() const;
00116
00117 TKey *GetCurrentKey() const;
00118 const char *GetKeyName() const;
00119
00120 StFileIter &operator=(Int_t cursorPosition);
00121 StFileIter &operator=(const char *keyNameToFind);
00122 StFileIter &operator+=(Int_t shift);
00123 StFileIter &operator-=(Int_t shift);
00124 StFileIter &operator++();
00125 StFileIter &operator--();
00126
00127 TObject *operator*() const;
00128 operator const char *() const;
00129 operator const TFile *() const;
00130 operator const TDirectory *() const;
00131 operator int () const;
00132 int operator==(const char *name) const;
00133 int operator!=(const char *name) const;
00134
00135 public:
00136
00137 virtual TObject *Next();
00138 virtual TObject *Next(Int_t nSkip);
00139 virtual void Reset();
00140 virtual void Rewind();
00141 TObject *operator()(Int_t nSkip);
00142 TObject *operator()();
00143
00144 ClassDef(StFileIter,0)
00145 };
00146
00147
00148 inline const char *StFileIter::GetResourceName() {return "ForeignFileMap";}
00149
00150 inline const char *StFileIter::GetDefaultMapFileName() {return "io.config";}
00151
00152 inline const char *StFileIter::GetLocalFileNameKey() {return "LocalFileSystem";}
00153
00154 inline const char *StFileIter::GetForeignFileSystemKey(){return "MountedFileSystem";}
00155
00156
00157 inline Int_t StFileIter::CurrentCursorPosition() const
00158 {
00159
00160 return fNestedIterator ? fNestedIterator->CurrentCursorPosition() : fCursorPosition;
00161 }
00162
00163
00164 inline const TFile *StFileIter::GetTFile() const { return GetTDirectory()->GetFile(); }
00165
00166 inline const TDirectory *StFileIter::GetTDirectory() const
00167 { return fNestedIterator ? fNestedIterator->GetTDirectory() : fRootFile; }
00168
00169
00170 inline TObject *StFileIter::Next()
00171 {
00172
00173
00174 return Next(1);
00175 }
00176
00177
00178 inline void StFileIter::Rewind()
00179 {
00180
00181 Reset();
00182 }
00183
00184 inline void StFileIter::SetCursorPosition(Int_t cursorPosition)
00185 {
00186
00187
00188 if (fNestedIterator)
00189 fNestedIterator->SetCursorPosition(cursorPosition);
00190 else
00191 SkipObjects(cursorPosition - fCursorPosition);
00192 }
00193
00194
00195 inline StFileIter &StFileIter::operator=(const char *keyNameToFind)
00196 {
00197
00198 SetCursorPosition(keyNameToFind); return *this;}
00199
00200
00201 inline StFileIter &StFileIter::operator=(Int_t cursorPosition)
00202 {
00203
00204 SetCursorPosition(cursorPosition);
00205 return *this;
00206 }
00207
00208 inline StFileIter::operator const TDirectory *() const
00209 { return GetTDirectory(); }
00210
00211
00212 inline StFileIter::operator const TFile *() const
00213 { return GetTFile (); }
00214
00215 inline StFileIter &StFileIter::operator+=(Int_t shift)
00216 { SkipObjects(shift); return *this;}
00217
00218 inline StFileIter &StFileIter::operator-=(Int_t shift)
00219 { return operator+=(-shift);}
00220
00221 inline StFileIter &StFileIter::operator++()
00222 { SkipObjects( 1); return *this;}
00223
00224 inline StFileIter &StFileIter::operator--()
00225 { SkipObjects(-1); return *this;}
00226
00227 inline TObject *StFileIter::operator*() const
00228 { return GetObject();}
00229
00230 inline StFileIter::operator int () const
00231 { return CurrentCursorPosition(); }
00232
00233 inline StFileIter::operator const char *() const
00234 {
00235
00236 return GetKeyName();
00237 }
00238
00239 inline int StFileIter::operator==(const char *name) const
00240 { return name ? !strcmp(name,GetKeyName()):0;}
00241
00242
00243 inline int StFileIter::operator!=(const char *name) const
00244 { return !(operator==(name)); }
00245
00246
00247 inline TObject *StFileIter::operator()(){ return Next(); }
00248
00249 inline TObject *StFileIter::operator()(Int_t nSkip){ return Next(nSkip);}
00250
00251
00252 inline void StFileIter::SaveFileScope()
00253 { fFileBackUp = gFile; fDirectoryBackUp = gDirectory; }
00254
00255
00256 inline void StFileIter::RestoreFileScope()
00257 { gFile = fFileBackUp; gDirectory = fDirectoryBackUp; }
00258
00259 #endif