ROOT  6.07/01
Reference Guide
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
rf104_classfactory.C
Go to the documentation of this file.
1 /// \file
2 /// \ingroup tutorial_roofit
3 /// 'BASIC FUNCTIONALITY' RooFit tutorial macro #104
4 ///
5 /// The class factory for functions and p.d.f.s
6 ///
7 ///
8 /// NOTE: This demo uses code that is generated by the macro,
9 /// therefore it cannot be compiled in one step by ACliC.
10 /// To run this macro compiled with ACliC do
11 ///
12 /// root>.x rf104_classfactory.C // run interpreted to generate code
13 /// root>.L MyPdfV3.cxx+ // Compile and load created classs
14 /// root>.x rf104_classfactory.C+ // run compiled code
15 ///
16 ///
17 /// \macro_code
18 /// \author 07/2008 - Wouter Verkerke
19 
20 
21 #ifndef __CINT__
22 #include "RooGlobalFunc.h"
23 #endif
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 #ifndef __CINT__
34 #include "MyPdfV3.h"
35 #endif
36 
37 
38 using namespace RooFit ;
39 
40 
41 void rf104_classfactory()
42 {
43  // W r i t e c l a s s s k e l e t o n c o d e
44  // --------------------------------------------------
45 
46  // Write skeleton p.d.f class with variable x,a,b
47  // To use this class,
48  // - Edit the file MyPdfV1.cxx and implement the evaluate() method in terms of x,a and b
49  // - Compile and link class with '.x MyPdfV1.cxx+'
50  //
51  RooClassFactory::makePdf("MyPdfV1","x,A,B") ;
52 
53 
54  // 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
55  // ---------------------------------------------------------------------
56 
57  // Write skeleton p.d.f class with variable x,a,b and given formula expression
58  // To use this class,
59  // - Compile and link class with '.x MyPdfV2.cxx+'
60  //
61  RooClassFactory::makePdf("MyPdfV2","x,A,B","","A*fabs(x)+pow(x-B,2)") ;
62 
63 
64  // 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
65  // ---------------------------------------------------------------------------------
66 
67  // Write skeleton p.d.f class with variable x,a,b, given formula expression _and_
68  // given expression for analytical integral over x
69  // To use this class,
70  // - Compile and link class with '.x MyPdfV3.cxx+'
71  //
72  RooClassFactory::makePdf("MyPdfV3","x,A,B","","A*fabs(x)+pow(x-B,2)",kTRUE,kFALSE,
73  "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))") ;
74 
75 
76 
77  // 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
78  // ---------------------------------------------------------
79 
80  // Compile MyPdfV3 class (only when running in CINT)
81 #ifdef __CINT__
82  gROOT->ProcessLineSync(".x MyPdfV3.cxx+") ;
83 #endif
84 
85  // Creat instance of MyPdfV3 class
86  RooRealVar a("a","a",1) ;
87  RooRealVar b("b","b",2,-10,10) ;
88  RooRealVar y("y","y",-10,10);
89  MyPdfV3 pdf("pdf","pdf",y,a,b) ;
90 
91  // Generate toy data from pdf and plot data and p.d.f on frame
92  RooPlot* frame1 = y.frame(Title("Compiled class MyPdfV3")) ;
93  RooDataSet* data = pdf.generate(y,1000) ;
94  pdf.fitTo(*data) ;
95  data->plotOn(frame1) ;
96  pdf.plotOn(frame1) ;
97 
98 
99  ///////////////////////////////////////////////////////////////////////
100  // 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 //
101  ///////////////////////////////////////////////////////////////////////
102 
103  // Declare observable x
104  RooRealVar x("x","x",-20,20) ;
105 
106  // The RooClassFactory::makePdfInstance() function performs code writing, compiling, linking
107  // and object instantiation in one go and can serve as a straight replacement of RooGenericPdf
108 
109  RooRealVar alpha("alpha","alpha",5,0.1,10) ;
110  RooAbsPdf* genpdf = RooClassFactory::makePdfInstance("GenPdf","(1+0.1*fabs(x)+sin(sqrt(fabs(x*alpha+0.1))))",RooArgSet(x,alpha)) ;
111 
112  // Generate a toy dataset from the interpreted p.d.f
113  RooDataSet* data2 = genpdf->generate(x,50000) ;
114 
115  // Fit the interpreted p.d.f to the generated data
116  genpdf->fitTo(*data2) ;
117 
118  // Make a plot of the data and the p.d.f overlaid
119  RooPlot* frame2 = x.frame(Title("Compiled version of pdf of rf103")) ;
120  data2->plotOn(frame2) ;
121  genpdf->plotOn(frame2) ;
122 
123  // Draw all frames on a canvas
124  TCanvas* c = new TCanvas("rf104_classfactory","rf104_classfactory",800,400) ;
125  c->Divide(2) ;
126  c->cd(1) ; gPad->SetLeftMargin(0.15) ; frame1->GetYaxis()->SetTitleOffset(1.4) ; frame1->Draw() ;
127  c->cd(2) ; gPad->SetLeftMargin(0.15) ; frame2->GetYaxis()->SetTitleOffset(1.4) ; frame2->Draw() ;
128 
129 }
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:245
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...
TAxis * GetYaxis() const
Definition: RooPlot.cxx:1118
#define gROOT
Definition: TROOT.h:344
TArc * a
Definition: textangle.C:12
const Bool_t kFALSE
Definition: Rtypes.h:92
RooCmdArg Title(const char *name)
Double_t x[n]
Definition: legend1.C:17
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
Plot dataset on specified frame.
Definition: RooAbsData.cxx:626
RooRealVar represents a fundamental (non-derived) real valued object.
Definition: RooRealVar.h:37
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...
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
Plot (project) PDF on specified frame.
Definition: RooAbsPdf.h:105
RooDataSet is a container class to hold unbinned data.
Definition: RooDataSet.h:29
A RooPlot is a plot frame and a container for graphics objects within that frame. ...
Definition: RooPlot.h:41
Double_t y[n]
Definition: legend1.C:17
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())
Generate a new dataset containing the specified variables with events sampled from our distribution...
Definition: RooAbsPdf.cxx:1702
#define gPad
Definition: TVirtualPad.h:288
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:1056
const Bool_t kTRUE
Definition: Rtypes.h:91
virtual void Draw(Option_t *options=0)
Draw this plot and all of the elements it contains.
Definition: RooPlot.cxx:559