RE: [ROOT] Can't strip TChain

From: Philippe Canal (pcanal@fnal.gov)
Date: Fri Nov 19 2004 - 19:21:49 MET


Hi,

>From the fact that tskim->AutoSave does not crash, I guess that you put this
snippet of code __inside__ the loop instead of leaving it outside:

   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);
   } 
  prevTreeNum=-1;
  //Loop over the events
   for(int ev=firstEvent; ev<nEvents; ev++) { 
     counter++;

Cheers,
Philippe.

-----Original Message-----
From: Salvatore Rappoccio [mailto:rappoccio@heplcdf2.harvard.edu] 
Sent: Friday, November 19, 2004 12:13 PM
To: Philippe Canal
Cc: rappocc@fnal.gov; roottalk@pcroot.cern.ch
Subject: RE: [ROOT] Can't strip TChain

Hi, Philippe,

I tried this, and now it seems that I only get the events from the LAST file
of the original chain.

I also tried adding

    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->AutoSave();
      tskim = (TTree*)chain->GetTree()->CloneTree(0);
    }


How do I tell the chain written to histf to pick up the earlier data?

Thanks,
Sal

>  
> 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