RE: [ROOT] Can't strip TChain

From: Philippe Canal (pcanal@fnal.gov)
Date: Fri Nov 19 2004 - 18:52:50 MET


Hi,

With that old of a version you have to do something like:

   SetTheAddresses(chain); // set the address of ALL the top branches on the
chain an NOT on the tree
   if ( stripTree ) {
     std::cout << "Setting up strip tree" << std::endl;
     histf->cd();
     tskim = (TTree*)chain->GetTree()->CloneTree(0);
   }
 
Cheers,
Philippe.  

-----Original Message-----
From: Salvatore Rappoccio [mailto:rappoccio@heplcdf2.harvard.edu] 
Sent: Friday, November 19, 2004 10:31 AM
To: Philippe Canal
Cc: roottalk@pcroot.cern.ch
Subject: RE: [ROOT] Can't strip TChain

Hi, Philippe,

I'm using 3.05/07. I'll give this a try.

Thanks!
Sal

On Thu, 18 Nov 2004, Philippe Canal wrote:

> Hi Salvatore,
> 
> Which version of ROOT are using?
> 
> The problem is that you seemingly are setting the addresses of the 
> underlying original tree but not the addresses of the cloned tree:
> 
>     if ( chain->GetTreeNumber() != prevTreeNum ) {
>       SetTheAddresses(chain->GetTree());
>       prevTreeNum = chain->GetTreeNumber();
>     }
> 
> In recent version of ROOT, it is sufficient to set the address of the 
> original chain (using SetBranchAddress).
> 
> Cheers,
> Philippe.
> 
> -----Original Message-----
> From: owner-roottalk@pcroot.cern.ch 
> [mailto:owner-roottalk@pcroot.cern.ch]
> On Behalf Of Salvatore Rappoccio
> Sent: Thursday, November 18, 2004 2:34 PM
> To: roottalk@pcroot.cern.ch
> Subject: [ROOT] Can't strip TChain
> 
> Hi,
> 
> I am trying to read a subset of the events in my TChain object to 
> another file, given some selection criteria.
> 
> I can write the objects out without complaint, but when I try to read 
> back the events that I wrote from the second file of the TChain, I get 
> nonsense values.
> 
> Any ideas?
> 
> My code is:
> 
> {
>   std::cout << "Getting trees" << std::endl;
> 
>   TChain * chain = GetChain();
>   TTree * tskim = 0;
>   int nskim = 0;
>   int counter = 0;
>   int prevTreeNum = -1;
>   int prevRunNum = -1;
>   // Load the tree and set the addresses for the second time
>   chain->LoadTree(0);
>   chain->GetEntry(0);
>   
>   if ( stripTree ) {
>     std::cout << "Setting up strip tree" << std::endl;
>     histf->cd();
>     tskim = (TTree*)chain->GetTree()->CloneTree(0);
>   }
> 
> 
>   prevTreeNum=-1;
> 
>   //Loop over the events
>   for(int ev=firstEvent; ev<nEvents; ev++) { 
>     counter++;
>     int lflag = -1;
>     lflag = chain->LoadTree(ev);
> 
>     // If this tree hasn't already been set, set the branch addresses
>     if ( chain->GetTreeNumber() != prevTreeNum ) {
>       SetTheAddresses(chain->GetTree());
>       prevTreeNum = chain->GetTreeNumber();
>     }
> 
>     if ( stripTree )
>       lflag = chain->GetEntry(ev,1);
>     else
>       lflag = chain->GetEntry(ev);
> 
>     if ( lflag < 0 ) {
>       cout << "Error in loading trees" << endl;
>       return;
>     }
>     
>     // Decide to strip the event or not
>     bool stripEvent = false;
> 
>     
>     // If this event passes simple cuts, process the
>     // event, returning strip status
>     if ( PassCuts( ev, lflag ) ) {
>       stripEvent = Process( ev, lflag );
>       // If desired, strip this event and write to file
>       if ( stripTree ) {
> 	tskim->Fill();
> 	nskim++;
> 	if ( nskim % 10000 == 0 ) {
> 	cout << "Writing to strip tree : nskim = " << nskim << endl;
> 	tskim->AutoSave();
> 	}
>       }
>     }
>   }
> 
>   // Write stuff to output file
>   histf->cd();
> 
>   // Strip tree
>   if ( stripTree ) {
>     cout << "Writing to strip tree : nskim = " << nskim << endl;
>     tskim->AutoSave();
>   }
>   histf -> Close();
> 
> }
> 
> 
> Thanks,
> Sal Rappoccio
> 
> 



This archive was generated by hypermail 2b29 : Sun Jan 02 2005 - 05:50:10 MET