Hi rooters,
I need to filter out the events containing in the chain
of root-files using some function INSIDE the loop over events
and then save them in new tree with analogous branch structure.
The method with
TTree *tree = chain.CloneTree(Tcut);
does not suit me because, as mentioned above, I need to use a
selection function, which return value depends on the event parameters.
My script looks like this:
#===========================================
void filter()
{
TChain *chain = new TChain("Global");
chain->Add("file1.root");
chain->Add("file2.root");
chain->Add("file3.root");
cout << " Creating new root-file ..."<< endl;
TFile *newFile = new TFile("small.root","recreate");
cout << " Creating new tree ..."<< endl;
TTree *tree = chain.CloneTree(0);
if (fChain == 0) return;
Int_t nentries = Int_t(fChain->GetEntries());
Int_t nbytes = 0, nb = 0;
for (Int_t jentry=0; jentry<nentries;jentry++) {
Int_t ientry = LoadTree(jentry); //in case of a TChain,
nb = fChain->GetEntry(jentry); nbytes += nb;
if ( SelectionFunction() ) tree->Fill();
}// end loop over events
newFile->cd();
tree->Write();
}
#==============================================
For 3.01.06 in this case I get:
Warning in <TChain::Fill()>: may not use this method
and nothing written to "tree".
For 3.02.07 I get:
*** Break *** segmentation violation
How to initialize properly "tree"?
Obviously, the string:
TTree *tree = chain.CloneTree(0);
does not help
Thanks in advance,
Dmitri
This archive was generated by hypermail 2b29 : Sat Jan 04 2003 - 23:50:40 MET