wiki:UserManual

Version 2 (modified by Pavel Demin, 14 years ago) ( diff )

--

Introductory remarks

ExRootAnalysis is a package designed to simplify ROOT tree production and analysis. The purpose of this tutorial is to present current functionality of this software.

Quick start with ExRootAnalysis

Make sure that ROOT is installed and ROOTSYS, PATH, LD_LIBRARY_PATH, DYLD_LIBRARY_PATH are configured correctly.

Command to unpack the source code:

   svn checkout https://server06.fynu.ucl.ac.be/sources/ExRootAnalysis/trunk ExRootAnalysis

Commands to create shared library for interactive ROOT session:

   cd ExRootAnalysis

   make

Simple analysis using TTree::Draw

Now we can start ROOT and look at the data stored in the ROOT tree.

Start ROOT and load shared library:

   root
   gSystem->Load("lib/libExRootAnalysis.so");

Open ROOT tree file and do some basic analysis using Draw or TBrowser:

   TFile::Open("pgs_events.root");
   LHCO->Draw("Electron.PT");
   TBrowser browser;

Note 1: LHCO - tree name, it can be learnt e.g. from TBrowser

Note 2: Electron - branch name; PT - variable (leaf) of this branch

Complete description of all branches can be found in

   ExRootAnalysis/doc/RootTreeDescription.html

Macro-based analysis

Analysis macro consists of histogram booking, event loop (histogram filling), histogram display

Basic analysis macro:

{
  // Load shared library
  gSystem->Load("lib/libExRootAnalysis.so");
  gSystem->Load("libPhysics");

  // Create chain of root trees
  TChain chain("LHCO");
  chain.Add("pgs_events.root");
  
  // Create object of class ExRootTreeReader
  ExRootTreeReader *treeReader = new ExRootTreeReader(&chain);
  Long64_t numberOfEntries = treeReader->GetEntries();
  
  // Get pointers to branches used in this analysis
  TClonesArray *branchJet = treeReader->UseBranch("Jet");
  TClonesArray *branchElectron = treeReader->UseBranch("Electron");
  
  // Book histograms
  TH1 *histJetPT = new TH1F("jet_pt", "jet P_{T}", 100, 0.0, 100.0);
  TH1 *histMass = new TH1F("mass", "M_{inv}(e_{1}, e_{2})", 100, 40.0, 140.0);

  // Loop over all events
  for(Int_t entry = 0; entry < numberOfEntries; ++entry) {

    // Load selected branches with data from specified event
    treeReader->ReadEntry(entry);
  
    // If event contains at least 1 jet
    if(branchJet->GetEntries() > 0) {

      // Take first jet
      TRootJet *jet = (TRootJet*) branchJet->At(0);
      
      // Plot jet transverse momentum
      histJetPT->Fill(jet->PT);
      
      // Print jet transverse momentum
      cout << jet->PT << endl;
    }

    TRootElectron *elec1, *elec2;
    TLorentzVector vec1, vec2;

    // If event contains at least 2 electrons
    if(branchElectron->GetEntries() > 1) {

      // Take first two electrons
      elec1 = (TRootElectron *) branchElectron->At(0);
      elec2 = (TRootElectron *) branchElectron->At(1);

      // Create two 4-vectors for the electrons
      vec1.SetPtEtaPhiM(elec1->PT, elec1->Eta, elec1->Phi, 0.0);
      vec2.SetPtEtaPhiM(elec2->PT, elec2->Eta, elec2->Phi, 0.0);

      // Plot their invariant mass
      histMass->Fill((vec1 + vec2).M());
    }
  }

  // Show resulting histograms
  histJetPT->Draw();
  histMass->Draw();
}

More advanced macro-based analysis

ExRootAnalysis/test contains macro Example.C using class ExRootTreeReader to access data and class ExRootResult to manage histograms booking and output

Here are commands to run this macro:

   cd ExRootAnalysis/test
   $EDITOR test.list
   root
   gSystem->Load("../lib/libExRootAnalysis.so");
   .X Example.C("test.list");

Note: file test.list should contain list of root files that you would like to analyse (one root file per line)

Note: See TracWiki for help on using the wiki.