Logo ROOT  
Reference Guide
 
Loading...
Searching...
No Matches
ntpl004_dimuon.C
Go to the documentation of this file.
1/// \file
2/// \ingroup tutorial_ntuple
3/// \notebook
4/// Mini-Analysis on CMS OpenData with RDataFrame.
5/// This tutorial illustrates that analyzing data with RDataFrame works the same
6/// for both TTree data and RNTuple data. The RNTuple data are converted from the Events tree
7/// in http://root.cern.ch/files/NanoAOD_DoubleMuon_CMS2011OpenData.root
8/// Based on RDataFrame's df102_NanoAODDimuonAnalysis.C
9///
10/// \macro_image
11/// \macro_code
12///
13/// \date April 2019
14/// \author The ROOT Team
15
16// NOTE: The RNTuple classes are experimental at this point.
17// Functionality, interface, and data format is still subject to changes.
18// Do not use for real data!
19
20// Until C++ runtime modules are universally used, we explicitly load the ntuple library. Otherwise
21// triggering autoloading from the use of templated types would require an exhaustive enumeration
22// of "all" template instances in the LinkDef file.
23R__LOAD_LIBRARY(ROOTNTuple)
24
25#include <ROOT/RDataFrame.hxx>
26#include <ROOT/RNTuple.hxx>
27#include <ROOT/RNTupleDS.hxx>
28#include <ROOT/RVec.hxx>
29
30#include <TCanvas.h>
31#include <TH1D.h>
32#include <TLatex.h>
33#include <TStyle.h>
34
35#include <cassert>
36#include <cmath>
37#include <iostream>
38#include <memory>
39#include <string>
40#include <vector>
41#include <utility>
42
43// Import classes from experimental namespace for the time being
44using RNTupleReader = ROOT::Experimental::RNTupleReader;
45using RNTupleDS = ROOT::Experimental::RNTupleDS;
46
47constexpr char const* kNTupleFileName = "http://root.cern.ch/files/tutorials/ntpl004_dimuon_v1rc1.root";
48
49
50/// A wrapper for ROOT's InvariantMass function that takes std::vector instead of RVecs
51template <typename T>
52T InvariantMassStdVector(std::vector<T>& pt, std::vector<T>& eta, std::vector<T>& phi, std::vector<T>& mass)
53{
54 assert(pt.size() == 2 && eta.size() == 2 && phi.size() == 2 && mass.size() == 2);
55
56 // We adopt the memory here, no copy
58 ROOT::RVec<float> rvEta(eta);
59 ROOT::RVec<float> rvPhi(phi);
60 ROOT::RVec<float> rvMass(mass);
61
62 return InvariantMass(rvPt, rvEta, rvPhi, rvMass);
63}
64
65
66void ntpl004_dimuon() {
67 // Use all available CPU cores
69
70 auto df = ROOT::Experimental::MakeNTupleDataFrame("Events", kNTupleFileName);
71
72 // The tutorial is identical to df102_NanoAODDimuonAnalysis except the use of
73 // InvariantMassStdVector instead of InvariantMass (to be fixed in a later version of RNTuple)
74
75 // For simplicity, select only events with exactly two muons and require opposite charge
76 auto df_2mu = df.Filter("#Muon == 2", "Events with exactly two muons");
77 auto df_os = df_2mu.Filter("Muon.charge[0] != Muon.charge[1]", "Muons with opposite charge");
78
79 // Compute invariant mass of the dimuon system
80 auto df_mass = df_os.Define("Dimuon_mass", InvariantMassStdVector<float>, {"Muon.pt", "Muon.eta", "Muon.phi", "Muon.mass"});
81 auto df_size = df_os.Define("eta_size", "Muon.mass.size()");
82
83 // Make histogram of dimuon mass spectrum
84 auto h = df_mass.Histo1D({"Dimuon_mass", "Dimuon_mass", 30000, 0.25, 300}, "Dimuon_mass");
85
86 // Request cut-flow report
87 auto report = df_mass.Report();
88
89 // Produce plot
91 auto c = new TCanvas("c", "", 800, 700);
92 c->SetLogx(); c->SetLogy();
93
94 h->SetTitle("");
95 h->GetXaxis()->SetTitle("m_{#mu#mu} (GeV)"); h->GetXaxis()->SetTitleSize(0.04);
96 h->GetYaxis()->SetTitle("N_{Events}"); h->GetYaxis()->SetTitleSize(0.04);
97 h->DrawCopy();
98
99 TLatex label; label.SetNDC(true);
100 label.DrawLatex(0.175, 0.740, "#eta");
101 label.DrawLatex(0.205, 0.775, "#rho,#omega");
102 label.DrawLatex(0.270, 0.740, "#phi");
103 label.DrawLatex(0.400, 0.800, "J/#psi");
104 label.DrawLatex(0.415, 0.670, "#psi'");
105 label.DrawLatex(0.485, 0.700, "Y(1,2,3S)");
106 label.DrawLatex(0.755, 0.680, "Z");
107 label.SetTextSize(0.040); label.DrawLatex(0.100, 0.920, "#bf{CMS Open Data}");
108 label.SetTextSize(0.030); label.DrawLatex(0.630, 0.920, "#sqrt{s} = 8 TeV, L_{int} = 11.6 fb^{-1}");
109
110 // Print cut-flow report
111 report->Print();
112}
#define c(i)
Definition RSha256.hxx:101
#define h(i)
Definition RSha256.hxx:106
#define R__LOAD_LIBRARY(LIBRARY)
Definition Rtypes.h:472
R__EXTERN TStyle * gStyle
Definition TStyle.h:413
An RNTuple that is used to read data from storage.
Definition RNTuple.hxx:102
A "std::vector"-like collection of values implementing handy operation to analyse them.
Definition RVec.hxx:1455
virtual void SetTextFont(Font_t tfont=62)
Set the text font.
Definition TAttText.h:46
virtual void SetTextSize(Float_t tsize=1)
Set the text size.
Definition TAttText.h:47
The Canvas class.
Definition TCanvas.h:23
To draw Mathematical Formula.
Definition TLatex.h:18
TLatex * DrawLatex(Double_t x, Double_t y, const char *text)
Make a copy of this object with the new parameters And copy object attributes.
Definition TLatex.cxx:1941
void SetOptStat(Int_t stat=1)
The type of information printed in the histogram statistics box can be selected via the parameter mod...
Definition TStyle.cxx:1589
virtual void Print(Option_t *option="") const
Dump this text with its attributes.
Definition TText.cxx:780
virtual void SetNDC(Bool_t isNDC=kTRUE)
Set NDC mode on if isNDC = kTRUE, off otherwise.
Definition TText.cxx:813
TPaveText * pt
RDataFrame MakeNTupleDataFrame(std::string_view ntupleName, std::string_view fileName)
double T(double x)
Vector1::Scalar InvariantMass(const Vector1 &v1, const Vector2 &v2)
return the invariant mass of two LorentzVector The only requirement on the LorentzVector is that they...
Definition VectorUtil.h:246
void EnableImplicitMT(UInt_t numthreads=0)
Enable ROOT's implicit multi-threading for all objects and methods that provide an internal paralleli...
Definition TROOT.cxx:527