42 ClassImp(TEntryListFromFile);
44 TEntryListFromFile::TEntryListFromFile(): TEntryList(),
45 fListFileName(
""), fListName(
""), fNFiles(0), fListOffset(0), fFile(0), fFileNames(0)
65 TEntryListFromFile::TEntryListFromFile(
const char *filename,
const char *listname, Int_t nfiles) : TEntryList(),
66 fListFileName(filename), fListName(listname), fNFiles(nfiles), fListOffset(0), fFile(0), fFileNames(0)
68 fListOffset =
new Long64_t[fNFiles+1];
70 for (Int_t i=1; i<fNFiles+1; i++){
71 fListOffset[i]=TTree::kMaxEntries;
73 fN = TTree::kMaxEntries;
79 TEntryListFromFile::~TEntryListFromFile()
81 delete [] fListOffset;
91 Long64_t TEntryListFromFile::GetEntry(Int_t index)
93 if (index<0)
return -1;
95 if (index > fListOffset[fNFiles] && fListOffset[fNFiles]!=TTree::kMaxEntries){
96 Error(
"GetEntry",
"Index value is too large\n");
100 if (index==fLastIndexQueried+1)
104 while (!fCurrent && itree<fNFiles){
108 if (itree == fNFiles){
109 Error(
"GetEntry",
"All lists are empty\n");
113 if (index < fListOffset[fTreeNumber]) {
116 for (itree=0; itree<fTreeNumber; itree++){
117 if (index >= fListOffset[itree] && fListOffset[itree]!=fListOffset[itree+1])
122 else if (index >= fListOffset[fTreeNumber+1]){
125 while (itree < fNFiles){
127 if (fListOffset[itree+1]==TTree::kMaxEntries){
131 if (index < fListOffset[itree+1]){
136 if (fTreeNumber == fNFiles){
137 Error(
"GetEntry",
"Entry number is too big\n");
140 if (fTreeNumber!=itree)
144 Long64_t localentry = index - fListOffset[fTreeNumber];
145 Long64_t retentry = fCurrent->GetEntry(localentry);
146 fLastIndexQueried = index;
147 fLastIndexReturned = retentry;
156 Long64_t TEntryListFromFile::GetEntryAndTree(Int_t index, Int_t &treenum)
158 Long64_t result = GetEntry(index);
159 treenum = fTreeNumber;
167 Long64_t TEntryListFromFile::GetEntries()
169 if (fN==TTree::kMaxEntries){
170 for (Int_t i=0; i<fNFiles; i++){
171 if (fListOffset[i+1]==TTree::kMaxEntries){
176 fN = fListOffset[fNFiles];
177 fLastIndexQueried = -3;
185 Long64_t TEntryListFromFile::Next()
188 while (!fCurrent && itree<fNFiles){
192 if (itree == fNFiles){
193 Error(
"Next",
"All lists are empty\n");
197 Long64_t retentry = fCurrent->Next();
199 if (fLastIndexQueried == fListOffset[fTreeNumber+1]-1){
201 if (fTreeNumber == fNFiles -1){
208 LoadList(fTreeNumber);
209 }
while (fListOffset[fTreeNumber+1]==fListOffset[fTreeNumber] && fTreeNumber<fNFiles-1);
210 if (fTreeNumber == fNFiles -1 && fListOffset[fTreeNumber+1]==fListOffset[fTreeNumber]){
214 retentry = fCurrent->Next();
216 Error(
"Next",
"Something wrong with reading the current list, even though thefile #%d and the list exist\n", fTreeNumber);
223 fLastIndexReturned = retentry;
232 Int_t TEntryListFromFile::LoadList(Int_t listnumber)
243 R__ASSERT(fFileNames);
247 TNamed *nametitle = (TNamed*)fFileNames->At(listnumber);
248 TString filename_short = nametitle->GetTitle();
249 if (filename_short.Contains(
".root")){
250 filename_short.Remove(filename_short.Length()-5, 5);
252 if (!strcmp(fListFileName.Data(),
"")){
254 filename_short.Append(
"_elist.root");
256 fFile = TFile::Open(filename_short.Data());
258 TString filename = fListFileName;
259 filename.ReplaceAll(
"$", filename_short);
261 fFile = TFile::Open(filename.Data());
264 if (!fFile || fFile->IsZombie()){
270 fListOffset[listnumber+1] = fListOffset[listnumber];
274 if (!strcmp(fListName.Data(),
"")){
276 TIter nextkey(fFile->GetListOfKeys());
277 while ((key=(TKey*)nextkey())){
278 if (strcmp(
"TEntryList", key->GetClassName())==0){
280 fCurrent = (TEntryList*)key->ReadObj();
284 fCurrent = (TEntryList*)fFile->Get(fListName.Data());
288 Error(
"LoadList",
"List %s not found in the file\n", fListName.Data());
290 fListOffset[listnumber+1]=fListOffset[listnumber];
293 fTreeNumber = listnumber;
294 Long64_t nentries = fCurrent->GetN();
295 if (fListOffset[fTreeNumber+1] != (fListOffset[fTreeNumber] + nentries)) {
296 fListOffset[fTreeNumber+1] = fListOffset[fTreeNumber] + nentries;
297 fN = fListOffset[fNFiles];
306 void TEntryListFromFile::Print(
const Option_t* option)
const
308 printf(
"total number of files: %d\n", fNFiles);
312 Error(
"Print",
"fFileNames was not set properly.");
314 for (Int_t listnumber=0; listnumber<fNFiles; listnumber++){
315 TNamed *nametitle = (TNamed*)fFileNames->At(listnumber);
316 TString filename_short = nametitle->GetTitle();
317 if (filename_short.Contains(
".root")){
318 filename_short.Remove(filename_short.Length()-5, 5);
320 if (!strcmp(fListFileName.Data(),
"")){
322 filename_short.Append(
"_elist.root");
324 f = TFile::Open(filename_short.Data());
326 TString filename = fListFileName;
327 filename.ReplaceAll(
"$", filename_short);
329 f = TFile::Open(filename.Data());
331 if (f && !f->IsZombie()){
332 if (!strcmp(fListName.Data(),
"")){
334 TIter nextkey(f->GetListOfKeys());
335 while ((key=(TKey*)nextkey())){
336 if (strcmp(
"TEntryList", key->GetClassName())==0){
338 el = (TEntryList*)key->ReadObj();
342 el = (TEntryList*)f->Get(fListName.Data());