[ROOT] TChain::SetBranchStatus()

From: Thomas Bretz (Thomas_Bretz@ph.tum.de)
Date: Sat Nov 08 2003 - 19:47:58 MET


Sorry, I attached a non-working version of the macro. Here is the correct
one.

Thomas.


void test()
{
    //
    // Write a simple file file simple objects...
    //
    TFile f("test.root", "recreate");
    TTree *t = new TTree("Events", "Test");
    TNamed *named = new TNamed;
    TNamed *named2 = new TNamed;
    t->Branch("TNamed.", "TNamed", &named);
    t->Branch("TNamed2.", "TNamed", &named2);

    for (int i=0; i<20000; i++)
    {
        named->SetName(Form("Name #%d", i));
        t->Fill();
    }
    f.Write();
    f.Close();

    TStopwatch w;

    //
    // This is much much too slow. It should be as fast as chain2
    // below, but because GetEntry() is not called before setting
    // the branch status it's slow like a snake!
    //
    // For our own class (a copy of TArrayD but derived from TNamed)
    // this also results in a big memory leak!
    //
    TChain chain("Events");
    chain.Add("test.root");
    chain.SetBranchAddress("TNamed.", &named);
    chain.SetBranchStatus("*", 0);
    chain.SetBranchStatus("TNamed.*", 1);
    w.Start();
    for (int i=0; i<chain.GetEntries(); i++)
    {
        chain.GetEntry(i);
        if (i%5000==0) named->Print();
    }
    w.Stop();
    w.Print();

    //
    // Reading the first entry before setting the branch status
    // results in only reading "TNamed."
    //
    TChain chain2("Events");
    chain2.Add("test.root");
    chain2.SetBranchAddress("TNamed.", &named);
    chain2.GetEntry(0);
    chain2.SetBranchStatus("*", 0);
    chain2.SetBranchStatus("TNamed.*", 1);
    w.Start();
    for (int i=0; i<chain2.GetEntries(); i++)
    {
        chain2.GetEntry(i);
        if (i%5000==0) named->Print();
    }
    w.Stop();
    w.Print();

    //
    // For comparison: Not setting the branch status is about
    // two times slower, becuase "TNamed." and "TNamed2." are read
    //
    TChain chain3("Events");
    chain3.Add("test.root");
    chain3.SetBranchAddress("TNamed.", &named);
    w.Start();
    for (int i=0; i<chain3.GetEntries(); i++)
    {
        chain3.GetEntry(i);
        if (i%5000==0) named->Print();
    }
    w.Stop();
    w.Print();
}



This archive was generated by hypermail 2b29 : Thu Jan 01 2004 - 17:50:16 MET