Logo ROOT   6.16/01
Reference Guide
rf104_classfactory.C
Go to the documentation of this file.
1/// \file
2/// \ingroup tutorial_roofit
3/// \notebook -js
4/// 'BASIC FUNCTIONALITY' RooFit tutorial macro #104
5///
6/// The class factory for functions and p.d.f.s
7///
8///
9/// NOTE: This demo uses code that is generated by the macro,
10/// therefore it cannot be compiled in one step by ACliC.
11/// To run this macro compiled with ACliC do
12///
13/// ~~~ {.cpp}
14/// root>.x rf104_classfactory.C // run interpreted to generate code
15/// root>.L MyPdfV3.cxx+ // Compile and load created class
16/// root>.x rf104_classfactory.C+ // run compiled code
17/// ~~~
18///
19/// \macro_image
20/// \macro_output
21/// \macro_code
22/// \author 07/2008 - Wouter Verkerke
23
24#include "RooRealVar.h"
25#include "RooDataSet.h"
26#include "RooGaussian.h"
27#include "TCanvas.h"
28#include "TAxis.h"
29#include "RooPlot.h"
30#include "RooClassFactory.h"
31#include "TROOT.h"
32
33
34using namespace RooFit ;
35
36
38{
39 // W r i t e c l a s s s k e l e t o n c o d e
40 // --------------------------------------------------
41
42 // Write skeleton p.d.f class with variable x,a,b
43 // To use this class,
44 // - Edit the file MyPdfV1.cxx and implement the evaluate() method in terms of x,a and b
45 // - Compile and link class with '.x MyPdfV1.cxx+'
46 //
47 RooClassFactory::makePdf("MyPdfV1","x,A,B") ;
48
49
50 // W i t h a d d e d i n i t i a l v a l u e e x p r e s s i o n
51 // ---------------------------------------------------------------------
52
53 // Write skeleton p.d.f class with variable x,a,b and given formula expression
54 // To use this class,
55 // - Compile and link class with '.x MyPdfV2.cxx+'
56 //
57 RooClassFactory::makePdf("MyPdfV2","x,A,B","","A*fabs(x)+pow(x-B,2)") ;
58
59
60 // W i t h a d d e d a n a l y t i c a l i n t e g r a l e x p r e s s i o n
61 // ---------------------------------------------------------------------------------
62
63 // Write skeleton p.d.f class with variable x,a,b, given formula expression _and_
64 // given expression for analytical integral over x
65 // To use this class,
66 // - Compile and link class with '.x MyPdfV3.cxx+'
67 //
68 RooClassFactory::makePdf("MyPdfV3","x,A,B","","A*fabs(x)+pow(x-B,2)",kTRUE,kFALSE,
69 "x:(A/2)*(pow(x.max(rangeName),2)+pow(x.min(rangeName),2))+(1./3)*(pow(x.max(rangeName)-B,3)-pow(x.min(rangeName)-B,3))") ;
70
71
72
73 // U s e i n s t a n c e o f c r e a t e d c l a s s
74 // ---------------------------------------------------------
75
76 // Compile MyPdfV3 class
77 gROOT->ProcessLineSync(".x MyPdfV3.cxx+") ;
78
79 // Create instance of MyPdfV3 class
80 RooRealVar a("a","a",1) ;
81 RooRealVar b("b","b",2,-10,10);
82 RooRealVar y("y","y",-10,10);
83
84 // We need to hide the type to run in a ROOT macro
85 RooWorkspace w("w");
86 w.factory("MyPdfV3::pdf(y[-10,10], a[1], b[2,-10,10])");
87 auto pdf = w.pdf("pdf");
88
89 // Generate toy data from pdf and plot data and p.d.f on frame
90 RooPlot* frame1 = y.frame(Title("Compiled class MyPdfV3")) ;
91 RooDataSet* data = pdf->generate(y,1000) ;
92 pdf->fitTo(*data) ;
93 data->plotOn(frame1) ;
94 pdf->plotOn(frame1) ;
95
96
97 // -----------------------------------------------------------------
98 // C o m p i l e d v e r s i o n o f e x a m p l e r f 1 0 3
99 // =================================================================
100
101 // Declare observable x
102 RooRealVar x("x","x",-20,20) ;
103
104 // The RooClassFactory::makePdfInstance() function performs code writing, compiling, linking
105 // and object instantiation in one go and can serve as a straight replacement of RooGenericPdf
106
107 RooRealVar alpha("alpha","alpha",5,0.1,10) ;
108 RooAbsPdf* genpdf = RooClassFactory::makePdfInstance("GenPdf","(1+0.1*fabs(x)+sin(sqrt(fabs(x*alpha+0.1))))",RooArgSet(x,alpha)) ;
109
110 // Generate a toy dataset from the interpreted p.d.f
111 RooDataSet* data2 = genpdf->generate(x,50000) ;
112
113 // Fit the interpreted p.d.f to the generated data
114 genpdf->fitTo(*data2) ;
115
116 // Make a plot of the data and the p.d.f overlaid
117 RooPlot* frame2 = x.frame(Title("Compiled version of pdf of rf103")) ;
118 data2->plotOn(frame2) ;
119 genpdf->plotOn(frame2) ;
120
121 // Draw all frames on a canvas
122 TCanvas* c = new TCanvas("rf104_classfactory","rf104_classfactory",800,400) ;
123 c->Divide(2) ;
124 c->cd(1) ; gPad->SetLeftMargin(0.15) ; frame1->GetYaxis()->SetTitleOffset(1.4) ; frame1->Draw() ;
125 c->cd(2) ; gPad->SetLeftMargin(0.15) ; frame2->GetYaxis()->SetTitleOffset(1.4) ; frame2->Draw() ;
126
127}
#define b(i)
Definition: RSha256.hxx:100
#define c(i)
Definition: RSha256.hxx:101
const Bool_t kFALSE
Definition: RtypesCore.h:88
const Bool_t kTRUE
Definition: RtypesCore.h:87
#define gROOT
Definition: TROOT.h:410
#define gPad
Definition: TVirtualPad.h:286
virtual RooPlot * plotOn(RooPlot *frame, const RooCmdArg &arg1=RooCmdArg::none(), const RooCmdArg &arg2=RooCmdArg::none(), const RooCmdArg &arg3=RooCmdArg::none(), const RooCmdArg &arg4=RooCmdArg::none(), const RooCmdArg &arg5=RooCmdArg::none(), const RooCmdArg &arg6=RooCmdArg::none(), const RooCmdArg &arg7=RooCmdArg::none(), const RooCmdArg &arg8=RooCmdArg::none()) const
Calls RooPlot* plotOn(RooPlot* frame, const RooLinkedList& cmdList) const ;.
Definition: RooAbsData.cxx:531
RooAbsPdf is the abstract interface for all probability density functions The class provides hybrid a...
Definition: RooAbsPdf.h:41
RooDataSet * generate(const RooArgSet &whatVars, Int_t nEvents, const RooCmdArg &arg1, const RooCmdArg &arg2=RooCmdArg::none(), const RooCmdArg &arg3=RooCmdArg::none(), const RooCmdArg &arg4=RooCmdArg::none(), const RooCmdArg &arg5=RooCmdArg::none())
See RooAbsPdf::generate(const RooArgSet&,const RooCmdArg&,const RooCmdArg&,const RooCmdArg&,...
Definition: RooAbsPdf.h:56
virtual RooFitResult * fitTo(RooAbsData &data, const RooCmdArg &arg1=RooCmdArg::none(), const RooCmdArg &arg2=RooCmdArg::none(), const RooCmdArg &arg3=RooCmdArg::none(), const RooCmdArg &arg4=RooCmdArg::none(), const RooCmdArg &arg5=RooCmdArg::none(), const RooCmdArg &arg6=RooCmdArg::none(), const RooCmdArg &arg7=RooCmdArg::none(), const RooCmdArg &arg8=RooCmdArg::none())
Fit PDF to given dataset.
Definition: RooAbsPdf.cxx:1081
virtual RooPlot * plotOn(RooPlot *frame, const RooCmdArg &arg1=RooCmdArg::none(), const RooCmdArg &arg2=RooCmdArg::none(), const RooCmdArg &arg3=RooCmdArg::none(), const RooCmdArg &arg4=RooCmdArg::none(), const RooCmdArg &arg5=RooCmdArg::none(), const RooCmdArg &arg6=RooCmdArg::none(), const RooCmdArg &arg7=RooCmdArg::none(), const RooCmdArg &arg8=RooCmdArg::none(), const RooCmdArg &arg9=RooCmdArg::none(), const RooCmdArg &arg10=RooCmdArg::none()) const
Helper calling plotOn(RooPlot*, RooLinkedList&) const.
Definition: RooAbsPdf.h:119
RooArgSet is a container object that can hold multiple RooAbsArg objects.
Definition: RooArgSet.h:28
static RooAbsPdf * makePdfInstance(const char *className, const char *name, const char *expression, const RooArgList &vars, const char *intExpression=0)
Write, compile and load code and instantiate object for a RooAbsPdf implementation with class name 'n...
static Bool_t makePdf(const char *name, const char *realArgNames=0, const char *catArgNames=0, const char *expression="1.0", Bool_t hasAnaInt=kFALSE, Bool_t hasIntGen=kFALSE, const char *intExpression=0)
Write code for a RooAbsPdf implementation with class name 'name', taking RooAbsReal arguments with na...
RooDataSet is a container class to hold unbinned data.
Definition: RooDataSet.h:31
A RooPlot is a plot frame and a container for graphics objects within that frame.
Definition: RooPlot.h:41
TAxis * GetYaxis() const
Definition: RooPlot.cxx:1123
virtual void Draw(Option_t *options=0)
Draw this plot and all of the elements it contains.
Definition: RooPlot.cxx:558
RooRealVar represents a fundamental (non-derived) real valued object.
Definition: RooRealVar.h:36
The RooWorkspace is a persistable container for RooFit projects.
Definition: RooWorkspace.h:43
virtual void SetTitleOffset(Float_t offset=1)
Set distance between the axis and the axis title Offset is a correction factor with respect to the "s...
Definition: TAttAxis.cxx:294
The Canvas class.
Definition: TCanvas.h:31
Double_t y[n]
Definition: legend1.C:17
Double_t x[n]
Definition: legend1.C:17
const char * Title
Definition: TXMLSetup.cxx:67
auto * a
Definition: textangle.C:12