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 ExRootAnalysis

Commands to create shared library for interactive ROOT session:

   cd ExRootAnalysis


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:


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

   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


Macro-based analysis

ExRootAnalysis provides a set of classes simplifying access to the root ROOT trees. The most interesting class is ExRootTreeReader. This class provides simple methods sufficient to access every branch in every event stored in a ROOT tree:

  • ExRootTreeReader(TTree*) – constructor takes ROOT tree as parameter
  • Long64_t GetEntries() – returns total number of events stored on the tree
  • TClonesArray *UseBranch(branchName) – returns pointer to collection of branch

elements and specifies branches needed for analysis

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

Basic analysis macro:

  // Load shared library

  // Create chain of root trees
  TChain chain("LHCO");
  // 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
    // If event contains at least 1 jet
    if(branchJet->GetEntries() > 0) {

      // Take first jet
      TRootJet *jet = (TRootJet*) branchJet->At(0);
      // Plot jet transverse momentum
      // 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

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

Last modified 6 years ago Last modified on 09/10/13 10:01:05