78 ClassImp(TEntryListArray);
 
   83 void TEntryListArray::Init()
 
   87    fLastSubListQueried = 0;
 
   94 TEntryListArray::TEntryListArray() : TEntryList(), fSubLists(0), fEntry(-1), fLastSubListQueried(0), fSubListIter(0)
 
  101 TEntryListArray::TEntryListArray(
const char *name, 
const char *title): TEntryList(name, title), fSubLists(0), fEntry(-1), fLastSubListQueried(0), fSubListIter(0)
 
  108 TEntryListArray::TEntryListArray(
const char *name, 
const char *title, 
const TTree *tree): TEntryList(name, title, tree), fSubLists(0), fEntry(-1), fLastSubListQueried(0), fSubListIter(0)
 
  115 TEntryListArray::TEntryListArray(
const char *name, 
const char *title, 
const char *treename, 
const char *filename): TEntryList(name, title, treename, filename), fSubLists(0), fEntry(-1), fLastSubListQueried(0), fSubListIter(0)
 
  122 TEntryListArray::TEntryListArray(
const TTree *tree) : TEntryList(tree), fSubLists(0), fEntry(-1), fLastSubListQueried(0), fSubListIter(0)
 
  129 TEntryListArray::TEntryListArray(
const TEntryListArray &elist) : TEntryList(), fSubLists(0), fEntry(-1), fLastSubListQueried(0), fSubListIter(0)
 
  131    fEntry = elist.fEntry;
 
  138 TEntryListArray::TEntryListArray(
const TEntryList& elist) : TEntryList(elist), fSubLists(0), fEntry(-1), fLastSubListQueried(0), fSubListIter(0)
 
  145 TEntryListArray::~TEntryListArray()
 
  159 void TEntryListArray::Add(
const TEntryList *elist)
 
  164       TEntryList::Add(elist);
 
  170    if (elist->GetLists()) { 
 
  171       TIter next(elist->GetLists());
 
  172       const TEntryList *e = 0;
 
  173       while ((e = (
const TEntryList*)next())) {
 
  174          SetTree(e->GetTreeName(), e->GetFileName());
 
  177       SetTree(elist->GetTreeName(), elist->GetFileName());
 
  180    AddEntriesAndSubLists(elist);
 
  188 void TEntryListArray::AddEntriesAndSubLists(
const TEntryList *elist)
 
  198       TEntryListArray* e = 0;
 
  202       while ((e = (TEntryListArray*) next())) {
 
  203          e->AddEntriesAndSubLists(elist);
 
  206    } 
else if (elist->GetLists()) { 
 
  207       TIter next(elist->GetLists());
 
  209       while ((e = (TEntryList*) next())) {
 
  210          AddEntriesAndSubLists(e);
 
  213       if (strcmp(elist->GetTreeName(), fTreeName.Data()) || strcmp(elist->GetFileName(), fFileName.Data()))
 
  215       const TEntryListArray *elist_array = 
dynamic_cast< const TEntryListArray *
>(elist);
 
  216       if (!fSubLists && (!elist_array || !elist_array->GetSubLists())) {  
 
  217          TEntryList::Add(elist);
 
  224       if (!fSubLists && elist_array->GetSubLists()) {
 
  225          fSubLists = 
new TList();
 
  227       TEntryListArray *el1;
 
  228       const TEntryListArray *el2;
 
  229       TCollection *other_sublists = 0;
 
  231          other_sublists = elist_array->GetSubLists();
 
  233       TIter next1(fSubLists);
 
  234       TIter next2(other_sublists); 
 
  236       for (el1 = (TEntryListArray*) next1(), el2 = (
const TEntryListArray*) next2(); el1 || el2;)  {
 
  237          if (el1 && el2 && el1->fEntry == el2->fEntry) { 
 
  238             el1->TEntryList::Add(el2);
 
  239             el1 = (TEntryListArray*) next1();
 
  240             el2 = (
const TEntryListArray*) next2();
 
  241          } 
else if (el1 && (!el2 || el1->fEntry < el2->fEntry)) { 
 
  242             if ((const_cast<TEntryList*>(elist))->Contains(el1->fEntry)) {
 
  245             el1 = (TEntryListArray*) next1();
 
  247             if (!Contains(el2->fEntry)) {
 
  249                   fSubLists->AddLast(
new TEntryListArray(*el2));
 
  251                   fSubLists->AddBefore(el1, 
new TEntryListArray(*el2));
 
  254             el2 = (
const TEntryListArray*) next2();
 
  257       TEntryList::Add(elist);
 
  270 Int_t TEntryListArray::Contains(Long64_t entry, TTree *tree, Long64_t subentry)
 
  275       Long64_t localentry = tree->LoadTree(entry);
 
  276       SetTree(tree->GetTree());
 
  277       TEntryListArray *currentArray = 
dynamic_cast<TEntryListArray*
>(fCurrent);
 
  279          return currentArray->Contains(localentry, 0, subentry);
 
  284    Int_t result = TEntryList::Contains(entry);
 
  285    if (result && fSubLists) {
 
  286       TEntryListArray *t = GetSubListForEntry(entry);
 
  288          result = t->TEntryList::Contains(subentry);
 
  299 void TEntryListArray::ConvertToTEntryListArray(TEntryList *e)
 
  309    TEntryListArray *earray = 
new TEntryListArray(*e);
 
  320       earray->fSubLists = fSubLists;
 
  323    if (e == fLists->First()) {
 
  324       fLists->AddFirst(earray);
 
  340 Bool_t TEntryListArray::Enter(Long64_t entry, TTree *tree, Long64_t subentry)
 
  350       Long64_t localentry = tree->LoadTree(entry);
 
  351       SetTree(tree->GetTree());
 
  352       TEntryListArray *currentArray = 
dynamic_cast<TEntryListArray*
>(fCurrent);
 
  354          if ((result = currentArray->Enter(localentry, 0, subentry)))
 
  360       if (!fCurrent) fCurrent = (TEntryList*)fLists->First();
 
  361       TEntryListArray *currentArray = 
dynamic_cast<TEntryListArray*
>(fCurrent);
 
  362       if (currentArray && (result = currentArray->Enter(entry, 0, subentry))) {
 
  369    TEntryListArray *t = GetSubListForEntry(entry);
 
  371       if (subentry != -1) {
 
  372          t->TEntryList::Enter(subentry);
 
  377       result = TEntryList::Enter(entry);
 
  378       if (subentry != -1 && result) { 
 
  380          if (t) t->TEntryList::Enter(subentry);
 
  389 TEntryListArray* TEntryListArray::GetSubListForEntry(Long64_t entry, TTree *tree)
 
  392       Long64_t localentry = tree->LoadTree(entry);
 
  393       SetTree(tree->GetTree());
 
  395          TEntryListArray *currentArray = 
dynamic_cast<TEntryListArray*
>(fCurrent);
 
  397             return currentArray->GetSubListForEntry(localentry);
 
  404    if (!fSubLists || !fSubLists->GetEntries()) {
 
  409       fSubListIter = 
new TIter(fSubLists);
 
  410       fLastSubListQueried = (TEntryListArray*) fSubListIter->Next();
 
  412    else if (!fLastSubListQueried || entry < fLastSubListQueried->fEntry) {
 
  416       fSubListIter->Reset();
 
  417       fLastSubListQueried = (TEntryListArray*) fSubListIter->Next();
 
  420    if (entry == fLastSubListQueried->fEntry) {
 
  421       return fLastSubListQueried;
 
  424    while ((fLastSubListQueried = (TEntryListArray*) fSubListIter->Next())) {
 
  425       if (fLastSubListQueried->fEntry == entry) {
 
  426          return fLastSubListQueried;
 
  428       if (fLastSubListQueried->fEntry > entry) {
 
  441 void TEntryListArray::Print(
const Option_t* option)
 const 
  443    TString opt = option;
 
  445    Bool_t new_line = !opt.Contains(
"EOL");
 
  447    if (!opt.Contains(
"S") && new_line) {
 
  448       TEntryList::Print(option);
 
  454       TEntryListArray *e = 0;
 
  455       while ((e = (TEntryListArray*)next())) {
 
  456          std::cout << e->fTreeName << 
":" << std::endl;
 
  463    TEntryListArray *tmp = 
const_cast<TEntryListArray *
>(
this);
 
  464    TIter next(fSubLists);
 
  465    TEntryListArray *e = (TEntryListArray*)next();
 
  466    for (Int_t i = 0; i < tmp->fN; ++i) {
 
  467       Long64_t entry = tmp->GetEntry(i);
 
  468       std::cout << entry << 
" ";
 
  472       if (e && e->fEntry == entry) {
 
  474          e = (TEntryListArray*)next();
 
  477          std::cout << std::endl;
 
  491 Bool_t TEntryListArray::Remove(Long64_t entry, TTree *tree, Long64_t subentry)
 
  496       Long64_t localentry = tree->LoadTree(entry);
 
  497       SetTree(tree->GetTree());
 
  498       TEntryListArray *currentArray = 
dynamic_cast<TEntryListArray*
>(fCurrent);
 
  499       if (currentArray && (result = currentArray->Remove(localentry, 0, subentry))) {
 
  507       if (!fCurrent) fCurrent = (TEntryList*)fLists->First();
 
  508       TEntryListArray *currentArray = 
dynamic_cast<TEntryListArray*
>(fCurrent);
 
  509       if (currentArray && (result = currentArray->Remove(entry, 0, subentry)) && fLists) {
 
  516    TEntryListArray *e = GetSubListForEntry(entry);
 
  518       if (subentry != -1) {
 
  519          e->TEntryList::Remove(subentry);
 
  521       if (subentry == -1 || !e->GetN()) {
 
  522          RemoveSubList(e, tree);
 
  523          return TEntryList::Remove(entry);
 
  525    } 
else if (subentry == -1) {
 
  526       return TEntryList::Remove(entry);
 
  534 Bool_t TEntryListArray::RemoveSubList(TEntryListArray *e, TTree *tree)
 
  538       SetTree(tree->GetTree());
 
  539       TEntryListArray *currentArray = 
dynamic_cast<TEntryListArray*
>(fCurrent);
 
  541          return currentArray->RemoveSubList(e);
 
  545    if (!fSubLists->Remove(e)) {
 
  551    if (!fSubLists->GetEntries()) {
 
  561 Bool_t TEntryListArray::RemoveSubListForEntry(Long64_t entry, TTree *tree)
 
  564       Long64_t localentry = tree->LoadTree(entry);
 
  565       SetTree(tree->GetTree());
 
  566       TEntryListArray *currentArray = 
dynamic_cast<TEntryListArray*
>(fCurrent);
 
  568          return currentArray->RemoveSubListForEntry(localentry);
 
  571    return RemoveSubList(GetSubListForEntry(entry));
 
  577 void TEntryListArray::Reset()
 
  581       if (!((TEntryListArray*)fSubLists->First())->GetDirectory()) {
 
  594 TEntryListArray* TEntryListArray::SetEntry(Long64_t entry, TTree *tree)
 
  596    if (entry < 0) 
return 0;
 
  600       Long64_t localentry = tree->LoadTree(entry);
 
  601       SetTree(tree->GetTree());
 
  602       TEntryListArray *currentArray = 
dynamic_cast<TEntryListArray*
>(fCurrent);
 
  604          return currentArray->SetEntry(localentry);
 
  610       fSubLists = 
new TList();
 
  612    TEntryListArray *newlist = 
new TEntryListArray();
 
  613    newlist->fEntry = entry;
 
  614    if (fLastSubListQueried) {
 
  615       fSubLists->AddBefore(fLastSubListQueried, newlist);
 
  616       fSubListIter->Reset(); 
 
  618       fSubLists->AddLast(newlist);
 
  620    fLastSubListQueried = newlist;
 
  630 void TEntryListArray::Subtract(
const TEntryList *elist)
 
  635       TEntryListArray* e = 0;
 
  638       while ((e = (TEntryListArray*) next())) {
 
  642    } 
else if (elist->GetLists()) { 
 
  643       TIter next(elist->GetLists());
 
  645       while ((e = (TEntryList*) next())) {
 
  649       if (strcmp(elist->GetTreeName(), fTreeName.Data()) || strcmp(elist->GetFileName(), fFileName.Data()))
 
  651       const TEntryListArray *elist_array = 
dynamic_cast< const TEntryListArray *
>(elist);
 
  652       if (!fSubLists || !elist_array || !elist_array->GetSubLists()) {  
 
  653          TEntryList::Subtract(elist);
 
  655             TEntryListArray *e = 0;
 
  656             TIter next(fSubLists);
 
  657             while ((e = (TEntryListArray*) next())) {
 
  658                if (!Contains(e->fEntry))
 
  663          TEntryListArray *el1, *el2;
 
  664          TIter next1(fSubLists);
 
  665          TIter next2(elist_array->GetSubLists());
 
  666          el1 = (TEntryListArray*) next1();
 
  667          el2 = (TEntryListArray*) next2();
 
  669          Long64_t n2 = elist->GetN();
 
  671          for (Int_t i = 0; i < n2; ++i) {
 
  672             entry = (
const_cast<TEntryList*
>(elist))->GetEntry(i);
 
  674             while (el1 && el1->fEntry < entry) { 
 
  675                el1 = (TEntryListArray*) next1();
 
  677             while (el2 && el2->fEntry < entry) { 
 
  678                el2 = (TEntryListArray*) next2();
 
  681             if (el1 && el2 && entry == el1->fEntry && entry == el2->fEntry) { 
 
  698 void TEntryListArray::SetTree(
const char *treename, 
const char *filename)
 
  706       nLists = fLists->GetEntries();
 
  708    TEntryList::SetTree(treename, filename);
 
  709    if (fLists && fLists->GetEntries() != nLists) { 
 
  715          ConvertToTEntryListArray((TEntryList*) fLists->First());
 
  717       ConvertToTEntryListArray((TEntryList*) fLists->Last());