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