[ROOT] Re: your mail

From: Rene Brun (Rene.Brun@cern.ch)
Date: Fri Jul 27 2001 - 09:19:09 MEST


The CopyTree function for chains was only implemented in version 3.01.
Upgrade your setup to the current pro version 3.01/06.
With this version, if your branches are only basic types, you
can do:
   TChain datachain("h300");
   datachain->Add("tops_m10_iso4_real_1a_01.root/TOPS/h300");
   datachain->Add("tops_m10_iso4_real_1a_02.root/TOPS/h300");
   ..........
   TFile *newFile = new TFile("myfile.root","recreate");
   //solution 1 with an inline selection
   TTree *tree = datachain.CopyTree("(ezflag_d==0)&&(mzflag_d==0)");   
   //or solution 2 with your own loop
   Int_t  ndataevents = Int_t(datachain->GetEntries());

   for (Int_t ev=0; ev<ndataevents; ev++) {

     datachain->GetEntry(ev);

     if(nhptm_d>0) {

         if((ezflag_d==0)&&(mzflag_d==0)) {
            tree->Fill();
      ...
   }
   newFile->cd();
   tree->Write();

Rene Brun


On Thu, 26 Jul 2001, Min-Jeong Kim wrote:

> 
> Dear all,
> 
> I might miss something, however I can't logically understand why
> my lines cause a problem, maybe more. Please, correct me.
> 
> I am working with ROOT 2.24/04 on SGI. I have a large size of
> data samples divided into around 35 root files which have been
> "h2root"ed from PAW row-wise ntuples, and I would like to generate
> a filtered sample from the data sample. I already know the number
> of selected events is very small, let's say 200 events, so I want
> to keep them as one root file. That was my first intention of this
> try.
> 
> At first, I made a chain from data files; and, set branch address
> for several branches which are used for the candidate selection.
> However, I would like to keep all branches in my new root file
> for the selected events.
> 
>    TChain datachain("h300");
>    datachain->Add("tops_m10_iso4_real_1a_01.root/TOPS/h300");
>    datachain->Add("tops_m10_iso4_real_1a_02.root/TOPS/h300");
>    ..........
> 
>    datachain->SetBranchStatus("*",1);
> 
>    Float_t  nhptm_d;
>    datachain->SetBranchAddress("nhptm",&nhptm_d);
>    Float_t  ezflag_d;
>    datachain->SetBranchAddress("ezflag",&ezflag_d);
>    Float_t  mzflag_d;
>    datachain->SetBranchAddress("mzflag",&mzflag_d);
>    ...........
> 
> Second, I create new file; and, tried to clone only header from old tree.
> Because the event selection would be done by some comparisons in the
> later part of this file.
> 
>    TFile *filterdatafile = gROOT->FindObject("data_filter.root");
>    if (filterdatafile) filterdatafile->Close();
>    filterdatafile = new TFile("data_filter.root", "RECREATE",
>                               "Filtered Data: the paris of Mu and Tau");
> 
>    TTree *filterdatatree = datachain->CloneTree(0);
>    ================================================
> ==> I guess this line is not working. However, TTree is inherited as
>     public to TChain, so that the public member of TTree, CloneTree,
>     is able to be used, I think, in this way.
> 
>     message: *** Break *** segmentation violation
> 
> Third, I began the filtering by several comparisons:
> 
>    Int_t  ndataevents = Int_t(datachain->GetEntries());
> 
>    for (Int_t ev=0; ev<ndataevents; ev++) {
> 
>      datachain->GetEntry(ev);
> 
>      if(nhptm_d>0) {
> 
> 	 if((ezflag_d==0)&&(mzflag_d==0)) {
> 
>                ......
> 
>                filterdatatree->CopyEntries(datachain,1);
> 
>          }
>       }
>    }
> 
>    filterdatatree->Print();
>    filterdatafile->Write();
> 
> }
> 
> I might start from very wrong place far from my intention. Any
> other suggestion or collection, both are welcome. Thanks.
> 
> ===============================================================
>  Min-Jeong Kim, CDF/Carnegie Mellon University, mjkim@fnal.gov
> ===============================================================
> 



This archive was generated by hypermail 2b29 : Tue Jan 01 2002 - 17:50:53 MET