#include "TTree.h" #include "TObjArray.h" #include "TBranchElement.h" #include "TTreeFormula.h" #include "TTreePlayer.h" TTree *v520CopyTree(TTree *fTree, const char *selection, Option_t * = 0, Long64_t nentries = 1000000000, Long64_t firstentry = 0) { // we make a copy of the tree header TTree *tree = fTree->CloneTree(0); tree->Reset(); if (tree == 0) return 0; // The clone should not delete any shared i/o buffers. TObjArray* branches = tree->GetListOfBranches(); Int_t nb = branches->GetEntriesFast(); for (Int_t i = 0; i < nb; ++i) { TBranch* br = (TBranch*) branches->UncheckedAt(i); if (br->InheritsFrom("TBranchElement")) { ((TBranchElement*) br)->ResetDeleteObject(); } } Long64_t entry,entryNumber; nentries = ((TTreePlayer*)fTree->GetPlayer())->GetEntriesToProcess(firstentry, nentries); // Compile selection expression if there is one TTreeFormula *select = 0; // no need to interfer with fSelect since we // handle the loop explicitly below and can call // UpdateFormulaLeaves ourselves. if (strlen(selection)) { select = new TTreeFormula("Selection",selection,fTree); if (!select || !select->GetNdim()) { delete select; } } //loop on the specified entries Int_t tnumber = -1; for (entry=firstentry;entryGetEntryNumber(entry); if (entryNumber < 0) break; Long64_t localEntry = fTree->LoadTree(entryNumber); if (localEntry < 0) break; if (tnumber != fTree->GetTreeNumber()) { tnumber = fTree->GetTreeNumber(); if (select) select->UpdateFormulaLeaves(); } if (select) { Int_t ndata = select->GetNdata(); Bool_t keep = kFALSE; for(Int_t current = 0; currentEvalInstance(current) != 0); } if (!keep) continue; } fTree->GetEntry(entryNumber); tree->Fill(); } delete select; return tree; }