RE: [ROOT] Can't strip TChain

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


Hi Salvatore,

The code you sent me seems to prevent all the flaws I have been mentioning.

Your TopNtuplePlots::SetTheAddress is NOT calling SetBranchAddress and in
consequence will
NOT properly work on a chain. (The branch object belong to the underlying
tree and do not communicate any information to the next tree in the chain)

    ++i; if ( thT->GetBranch("evt") )
thT->GetBranch("evt")->SetAddress(&evtA);

Should simply be 

    ++i; if ( thT->GetBranch("evt") ) thT->SetBranchAddress("evt",&evtA);

And SetTheAddress should be called on the chain NOT a a tree:

  SetTheAddresses(chain);

Cheers,
Philippe.

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

Hi, Philippe,

I have attached my code to create my base class. The files are:

HighLevelObjects : Class definitions of our tree classes
TopNtuplePlots   : Driver base class
TMYtools         : Miscellaneous tools


Thanks for taking a look at this. I'll try to update to 4.01/02 if I can.

Thanks,
Sal

On Fri, 19 Nov 2004, Philippe Canal wrote:

> > Okay, I removed it and it still loops over all the files fine, but 
> > reading
> back in the ntuple, it only has events from the first file, and the 
> other entries are garbage.
> 
> Did you really make sure that the addresses are set on the chain via a 
> call to chain->SetBranchAddresses?
> If it is the case, either update to ROOT 4.01/02 or later or send me a 
> complete example.
> 
> Cheers,
> Philippe.
> 
> -----Original Message-----
> From: Salvatore Rappoccio [mailto:rappoccio@heplcdf2.harvard.edu]
> Sent: Friday, November 19, 2004 1:04 PM
> To: Philippe Canal
> Cc: rappocc@fnal.gov; roottalk@pcroot.cern.ch
> Subject: RE: [ROOT] Can't strip TChain
> 
> Okay, I removed it and it still loops over all the files fine, but 
> reading back in the ntuple, it only has events from the first file, 
> and the other entries are garbage.
> 
> Any ideas how to fix this?
> 
> Thanks for all your help, I appreciate it!
> 
> Sal
> 
> 
> 
> On Fri, 19 Nov 2004, Philippe Canal wrote:
> 
> > Hi,
> > 
> > Obviously the one inside the loop Clone the tree over and over 
> > again, losing the previous information!
> > Remove it!
> > 
> > Cheers,
> > Philippe. 
> > 
> > -----Original Message-----
> > From: Salvatore Rappoccio [mailto:rappoccio@heplcdf2.harvard.edu]
> > Sent: Friday, November 19, 2004 12:45 PM
> > To: Philippe Canal
> > Cc: rappocc@fnal.gov; roottalk@pcroot.cern.ch
> > Subject: RE: [ROOT] Can't strip TChain
> > 
> > Hi, Philippe,
> > 
> > I put them in both places:
> > 
> > 
> > 
> >     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++;
> > 
> > 
> >     if ( chain->GetTreeNumber() != prevTreeNum ) {
> >       SetTheAddresses(chain->GetTree());
> >       prevTreeNum = chain->GetTreeNumber();
> >       if ( stripTree ) {
> > 	histf->cd();
> > 	tskim->AutoSave();
> > 	tskim = (TTree *)chain->GetTree()->CloneTree(0);
> >       }
> > 
> >     }
> > 
> > 
> >   ....
> >   }
> > 
> > Thanks,
> > Sal
> >  
> > > 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