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