[ROOT] Re: filter out the chain

From: Dmitriy Bandourine (bandurin@fnal.gov)
Date: Fri Feb 01 2002 - 18:39:10 MET


Thank you Rene again.
The last variant works perfectly. I tried both
clicking some leaves and rereading new tree from "small.root".
The cut function really removed the unwanted events from initial chain and
saved to new tree properly.

 - Dmitriy - 

On Fri, 1 Feb 2002, Rene Brun wrote:

> Hi Dmitryi,
> 
> Could you try the following variant?
>  TChain *chain = new TChain("Global");
>  chain->Add("file1.root");
>  chain->Add("file2.root");
>  chain->Add("file3.root"); 
>  chain->GetEntry(0);  //<========new line
>  
>    TFile *newFile = new TFile("small.root","recreate");
>    TTree *tree = (TTree*)chain->GetTree()->CloneTree(0); //<===new line
> 
> 
> Rene Brun
> 
> //<=====Dmitriy Bandourine wrote:
> > 
> > Thank you Rene!
> > 
> > With your changes ew tree was created and written to the file "small.root"
> > But when I tried to read this tree in new session, I got:
> > *----
> > Error in <TFile::ReadBuffer>: error reading all requested bytes from file  small.root, got 0 of 26444
> > *---
> > 
> > When I clicked on some leaf in one of braches of the tree in "small.root", I got
> > *---
> > root [2] <TCanvas::MakeDefCanvas>: created default TCanvas with name c1
> > Error in <TFile::ReadBuffer>: error reading all requested bytes from file small.root, got 0 of 26444
> > C++ runtime abort: terminate() called by the exception handling mechanism.
> > *---
> > 
> > I expect that the size of the created "small.root" file  should be at
> > least 5-6 times larger than it is.
> > 
> >  - Dmitriy -
> > 
> > On Fri, 1 Feb 2002, Rene Brun wrote:
> > 
> > > Hi Dmitriy,
> > >
> > > TTree::CloneTree returns a clone of the original object. In case of a TChain,
> > > CloneTree returns a TChain*. You cannot fill a TChain, only a TTree.
> > > I suggest the following changes in your code:
> > >
> > >
> > > 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;
> > >   TChain *newchain = (TChain*)chain->CloneTree(0); //<====
> > >   TTree *tree = newchain->GetTree(); //<=====
> > >
> > >   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();
> > > }
> > >
> > > Rene Brun
> > >
> > > Dmitriy Bandourine wrote:
> > > >
> > > > 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