Logo ROOT  
Reference Guide
rf401_importttreethx.C
Go to the documentation of this file.
1/// \file
2/// \ingroup tutorial_roofit
3/// \notebook -nodraw
4/// Data and categories: advanced options for importing data from ROOT TTree and THx histograms
5///
6/// Basic import options are demonstrated in rf102_dataimport.C
7///
8/// \macro_output
9/// \macro_code
10///
11/// \date July 2008
12/// \author Wouter Verkerke
13
14#include "RooRealVar.h"
15#include "RooDataSet.h"
16#include "RooDataHist.h"
17#include "RooCategory.h"
18#include "RooGaussian.h"
19#include "TCanvas.h"
20#include "TAxis.h"
21#include "RooPlot.h"
22#include "TH1.h"
23#include "TTree.h"
24#include "TRandom.h"
25#include <map>
26
27using namespace RooFit;
28
29TH1 *makeTH1(const char *name, double mean, double sigma);
30TTree *makeTTree();
31
33{
34 // I m p o r t m u l t i p l e T H 1 i n t o a R o o D a t a H i s t
35 // --------------------------------------------------------------------------
36
37 // Create thee ROOT TH1 histograms
38 TH1 *hh_1 = makeTH1("hh1", 0, 3);
39 TH1 *hh_2 = makeTH1("hh2", -3, 1);
40 TH1 *hh_3 = makeTH1("hh3", +3, 4);
41
42 // Declare observable x
43 RooRealVar x("x", "x", -10, 10);
44
45 // Create category observable c that serves as index for the ROOT histograms
46 RooCategory c("c", "c", {{"SampleA",0}, {"SampleB",1}, {"SampleC",2}});
47
48 // Create a binned dataset that imports contents of all TH1 mapped by index category c
49 RooDataHist *dh = new RooDataHist("dh", "dh", x, Index(c), Import("SampleA", *hh_1), Import("SampleB", *hh_2),
50 Import("SampleC", *hh_3));
51 dh->Print();
52
53 // Alternative constructor form for importing multiple histograms
54 std::map<std::string, TH1 *> hmap;
55 hmap["SampleA"] = hh_1;
56 hmap["SampleB"] = hh_2;
57 hmap["SampleC"] = hh_3;
58 RooDataHist *dh2 = new RooDataHist("dh", "dh", x, c, hmap);
59 dh2->Print();
60
61 // I m p o r t i n g a T T r e e i n t o a R o o D a t a S e t w i t h c u t s
62 // -----------------------------------------------------------------------------------------
63
64 TTree *tree = makeTTree();
65
66 // Define observables y,z
67 RooRealVar y("y", "y", -10, 10);
68 RooRealVar z("z", "z", -10, 10);
69
70 // Import only observables (y,z)
71 RooDataSet ds("ds", "ds", RooArgSet(x, y), Import(*tree));
72 ds.Print();
73
74 // Import observables (x,y,z) but only event for which (y+z<0) is true
75 RooDataSet ds2("ds2", "ds2", RooArgSet(x, y, z), Import(*tree), Cut("y+z<0"));
76 ds2.Print();
77
78 // I m p o r t i n g i n t e g e r T T r e e b r a n c h e s
79 // ---------------------------------------------------------------
80
81 // Import integer tree branch as RooRealVar
82 RooRealVar i("i", "i", 0, 5);
83 RooDataSet ds3("ds3", "ds3", RooArgSet(i, x), Import(*tree));
84 ds3.Print();
85
86 // Define category i
87 RooCategory icat("i", "i");
88 icat.defineType("State0", 0);
89 icat.defineType("State1", 1);
90
91 // Import integer tree branch as RooCategory (only events with i==0 and i==1
92 // will be imported as those are the only defined states)
93 RooDataSet ds4("ds4", "ds4", RooArgSet(icat, x), Import(*tree));
94 ds4.Print();
95
96 // I m p o r t m u l t i p l e R o o D a t a S e t s i n t o a R o o D a t a S e t
97 // ----------------------------------------------------------------------------------------
98
99 // Create three RooDataSets in (y,z)
100 RooDataSet *dsA = (RooDataSet *)ds2.reduce(RooArgSet(x, y), "z<-5");
101 RooDataSet *dsB = (RooDataSet *)ds2.reduce(RooArgSet(x, y), "abs(z)<5");
102 RooDataSet *dsC = (RooDataSet *)ds2.reduce(RooArgSet(x, y), "z>5");
103
104 // Create a dataset that imports contents of all the above datasets mapped by index category c
105 RooDataSet *dsABC = new RooDataSet("dsABC", "dsABC", RooArgSet(x, y), Index(c), Import("SampleA", *dsA),
106 Import("SampleB", *dsB), Import("SampleC", *dsC));
107
108 dsABC->Print();
109}
110
111TH1 *makeTH1(const char *name, double mean, double sigma)
112{
113 // Create ROOT TH1 filled with a Gaussian distribution
114
115 TH1D *hh = new TH1D(name, name, 100, -10, 10);
116 for (int i = 0; i < 1000; i++) {
117 hh->Fill(gRandom->Gaus(mean, sigma));
118 }
119 return hh;
120}
121
122TTree *makeTTree()
123{
124 // Create ROOT TTree filled with a Gaussian distribution in x and a uniform distribution in y
125
126 TTree *tree = new TTree("tree", "tree");
127 double *px = new double;
128 double *py = new double;
129 double *pz = new double;
130 Int_t *pi = new Int_t;
131 tree->Branch("x", px, "x/D");
132 tree->Branch("y", py, "y/D");
133 tree->Branch("z", pz, "z/D");
134 tree->Branch("i", pi, "i/I");
135 for (int i = 0; i < 100; i++) {
136 *px = gRandom->Gaus(0, 3);
137 *py = gRandom->Uniform() * 30 - 15;
138 *pz = gRandom->Gaus(0, 5);
139 *pi = i % 3;
140 tree->Fill();
141 }
142 return tree;
143}
#define c(i)
Definition: RSha256.hxx:101
int Int_t
Definition: RtypesCore.h:45
char name[80]
Definition: TGX11.cxx:110
R__EXTERN TRandom * gRandom
Definition: TRandom.h:62
void Print(Option_t *options=nullptr) const override
Print TNamed name and title.
Definition: RooAbsData.h:239
RooAbsData * reduce(const RooCmdArg &arg1, const RooCmdArg &arg2=RooCmdArg(), const RooCmdArg &arg3=RooCmdArg(), const RooCmdArg &arg4=RooCmdArg(), const RooCmdArg &arg5=RooCmdArg(), const RooCmdArg &arg6=RooCmdArg(), const RooCmdArg &arg7=RooCmdArg(), const RooCmdArg &arg8=RooCmdArg())
Create a reduced copy of this dataset.
Definition: RooAbsData.cxx:449
RooArgSet is a container object that can hold multiple RooAbsArg objects.
Definition: RooArgSet.h:56
RooCategory is an object to represent discrete states.
Definition: RooCategory.h:28
The RooDataHist is a container class to hold N-dimensional binned data.
Definition: RooDataHist.h:39
RooDataSet is a container class to hold unbinned data.
Definition: RooDataSet.h:55
RooRealVar represents a variable that can be changed from the outside.
Definition: RooRealVar.h:40
1-D histogram with a double per channel (see TH1 documentation)}
Definition: TH1.h:620
TH1 is the base class of all histogram classes in ROOT.
Definition: TH1.h:58
virtual Int_t Fill(Double_t x)
Increment bin with abscissa X by 1.
Definition: TH1.cxx:3338
virtual Double_t Gaus(Double_t mean=0, Double_t sigma=1)
Samples a random number from the standard Normal (Gaussian) Distribution with the given mean and sigm...
Definition: TRandom.cxx:274
virtual Double_t Uniform(Double_t x1=1)
Returns a uniform deviate on the interval (0, x1).
Definition: TRandom.cxx:672
A TTree represents a columnar dataset.
Definition: TTree.h:79
RooCmdArg Index(RooCategory &icat)
RooCmdArg Import(const char *state, TH1 &histo)
RooCmdArg Cut(const char *cutSpec)
const Double_t sigma
Double_t y[n]
Definition: legend1.C:17
Double_t x[n]
Definition: legend1.C:17
The namespace RooFit contains mostly switches that change the behaviour of functions of PDFs (or othe...
Definition: Common.h:18
static constexpr double pi
Definition: tree.py:1