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());