Logo ROOT  
Reference Guide
RooFoamGenerator.cxx
Go to the documentation of this file.
1/*****************************************************************************
2 * Project: RooFit *
3 * Package: RooFitCore *
4 * @(#)root/roofitcore:$Id$
5 * Authors: *
6 * WV, Wouter Verkerke, UC Santa Barbara, verkerke@slac.stanford.edu *
7 * DK, David Kirkby, UC Irvine, dkirkby@uci.edu *
8 * *
9 * Copyright (c) 2000-2005, Regents of the University of California *
10 * and Stanford University. All rights reserved. *
11 * *
12 * Redistribution and use in source and binary forms, *
13 * with or without modification, are permitted according to the terms *
14 * listed in LICENSE (http://roofit.sourceforge.net/license.txt) *
15 *****************************************************************************/
16
17/**
18\file RooFoamGenerator.cxx
19\class RooFoamGenerator
20\ingroup Roofitcore
21
22Class RooFoamGenerator is a generic toy monte carlo generator that implement
23the TFOAM sampling technique on any positively valued function.
24The RooFoamGenerator generator is used by the various generator context
25classes to take care of generation of observables for which p.d.fs
26do not define internal methods.
27
28The foam generator reacts to the following config options:
29- nCell[123N]D
30- nSample
31- chatLevel
32Access those using:
33 myPdf->specialGeneratorConfig()->getConfigSection("RooFoamGenerator").setRealValue("nSample",1e4);
34
35\see rf902_numgenconfig.C
36**/
37
38#include "Riostream.h"
39
40#include "RooFoamGenerator.h"
41#include "RooAbsReal.h"
42#include "RooCategory.h"
43#include "RooRealVar.h"
44#include "RooDataSet.h"
45#include "RooRandom.h"
46#include "RooErrorHandler.h"
47
48#include "RooMsgService.h"
49#include "TFoam.h"
50#include "RooTFoamBinding.h"
51#include "RooNumGenFactory.h"
52#include "RooNumGenConfig.h"
53
54#include <assert.h>
55
56using namespace std;
57
58
59////////////////////////////////////////////////////////////////////////////////
60/// Register RooIntegrator1D, is parameters and capabilities with RooNumIntFactory
61
63{
64 // Register RooIntegrator1D, is parameters and capabilities with RooNumIntFactory
65 RooRealVar nSample("nSample","Number of samples per cell",200,0,1e6) ;
66 RooRealVar nCell1D("nCell1D","Number of cells for 1-dim generation",30,0,1e6) ;
67 RooRealVar nCell2D("nCell2D","Number of cells for 2-dim generation",500,0,1e6) ;
68 RooRealVar nCell3D("nCell3D","Number of cells for 3-dim generation",5000,0,1e6) ;
69 RooRealVar nCellND("nCellND","Number of cells for N-dim generation",10000,0,1e6) ;
70 RooRealVar chatLevel("chatLevel","TFOAM 'chat level' (verbosity)",0,0,2) ;
71
73 fact.storeProtoSampler(proto,RooArgSet(nSample,nCell1D,nCell2D,nCell3D,nCellND,chatLevel)) ;
74}
75
76
77
78
79////////////////////////////////////////////////////////////////////////////////
80
81RooFoamGenerator::RooFoamGenerator(const RooAbsReal &func, const RooArgSet &genVars, const RooNumGenConfig& config, bool verbose, const RooAbsReal* maxFuncVal) :
82 RooAbsNumGenerator(func,genVars,verbose,maxFuncVal)
83{
85
86 _tfoam = new TFoam("TFOAM") ;
90 switch(_realVars.getSize()) {
91 case 1:_tfoam->SetnCells((Int_t)config.getConfigSection("RooFoamGenerator").getRealValue("nCell1D")) ; break ;
92 case 2:_tfoam->SetnCells((Int_t)config.getConfigSection("RooFoamGenerator").getRealValue("nCell2D")) ; break ;
93 case 3:_tfoam->SetnCells((Int_t)config.getConfigSection("RooFoamGenerator").getRealValue("nCell3D")) ; break ;
94 default:_tfoam->SetnCells((Int_t)config.getConfigSection("RooFoamGenerator").getRealValue("nCellND")) ; break ;
95 }
96 _tfoam->SetnSampl((Int_t)config.getConfigSection("RooFoamGenerator").getRealValue("nSample")) ;
98 _tfoam->SetChat((Int_t)config.getConfigSection("RooFoamGenerator").getRealValue("chatLevel")) ;
100
101 _vec = new double[_realVars.getSize()] ;
102 _xmin = new double[_realVars.getSize()] ;
103 _range = new double[_realVars.getSize()] ;
104
105 Int_t i(0) ;
106 for (const auto arg : _realVars) {
107 auto var = static_cast<const RooRealVar*>(arg);
108 _xmin[i] = var->getMin() ;
109 _range[i] = var->getMax() - var->getMin() ;
110 i++ ;
111 }
112}
113
114
115////////////////////////////////////////////////////////////////////////////////
116/// Destructor
117
119{
120 delete[] _vec ;
121 delete[] _xmin ;
122 delete[] _range ;
123 delete _tfoam ;
124 delete _binding ;
125}
126
127
128
129////////////////////////////////////////////////////////////////////////////////
130/// are we actually generating anything? (the cache always contains at least our function value)
131
132const RooArgSet *RooFoamGenerator::generateEvent(UInt_t /*remaining*/, double& /*resampleRatio*/)
133{
134 const RooArgSet *event= _cache->get();
135 if(event->getSize() == 1) return event;
136
137 _tfoam->MakeEvent() ;
139
140 // Transfer contents to dataset
141 Int_t i(0) ;
142 for (auto arg : _realVars) {
143 auto var = static_cast<RooRealVar*>(arg);
144 var->setVal(_xmin[i] + _range[i]*_vec[i]) ;
145 i++ ;
146 }
147 return &_realVars ;
148}
149
150std::string const& RooFoamGenerator::generatorName() const {
151 static const std::string name = "RooFoamGenerator";
152 return name;
153}
char name[80]
Definition: TGX11.cxx:110
const char * proto
Definition: civetweb.c:17502
double getRealValue(const char *name, double defVal=0.0, bool verbose=false) const
Get value of a RooAbsReal stored in set with given name.
Int_t getSize() const
Return the number of elements in the collection.
Class RooAbsNumGenerator is the abstract base class for MC event generator implementations like RooAc...
RooArgSet _realVars
Sets of discrete and real valued observabeles.
RooDataSet * _cache
Dataset holding generared values of observables.
RooAbsReal * _funcClone
Pointer to top level node of cloned function.
RooAbsReal is the common abstract base class for objects that represent a real value and implements f...
Definition: RooAbsReal.h:60
RooArgSet is a container object that can hold multiple RooAbsArg objects.
Definition: RooArgSet.h:56
const RooArgSet * get(Int_t index) const override
Return RooArgSet with coordinates of event 'index'.
Class RooFoamGenerator is a generic toy monte carlo generator that implement the TFOAM sampling techn...
const RooArgSet * generateEvent(UInt_t remaining, double &resampleRatio) override
are we actually generating anything? (the cache always contains at least our function value)
double * _range
Range of observables to be generated ;.
~RooFoamGenerator() override
Destructor.
RooTFoamBinding * _binding
Binding of RooAbsReal to TFoam function interface.
double * _xmin
Lower bound of observables to be generated ;.
std::string const & generatorName() const override
Return unique name of generator implementation.
TFoam * _tfoam
Instance of TFOAM generator.
static void registerSampler(RooNumGenFactory &fact)
Register RooIntegrator1D, is parameters and capabilities with RooNumIntFactory.
double * _vec
Transfer array for FOAM output.
RooNumGenConfig holds the configuration parameters of the various numeric integrators used by RooReal...
const RooArgSet & getConfigSection(const char *name) const
Retrieve configuration information specific to integrator with given name.
RooNumGenFactory is a factory to instantiate numeric integrators from a given function binding and a ...
bool storeProtoSampler(RooAbsNumGenerator *proto, const RooArgSet &defConfig)
Method accepting registration of a prototype numeric integrator along with a RooArgSet of its default...
static TRandom * randomGenerator()
Return a pointer to a singleton random-number generator implementation.
Definition: RooRandom.cxx:51
RooRealVar represents a variable that can be changed from the outside.
Definition: RooRealVar.h:40
void setVal(double value) override
Set value of variable to 'value'.
Definition: RooRealVar.cxx:254
Lightweight interface adaptor that binds a RooAbsPdf to TFOAM.
TFoam is the main class of the multi-dimensional general purpose Monte Carlo event generator (integra...
Definition: TFoam.h:21
virtual void GetMCvect(Double_t *)
User may get generated MC point/vector with help of this method.
Definition: TFoam.cxx:1172
virtual void MakeEvent()
User method.
Definition: TFoam.cxx:1122
virtual void Initialize()
Basic initialization of FOAM invoked by the user.
Definition: TFoam.cxx:321
virtual void SetnSampl(Long_t nSampl)
Definition: TFoam.h:117
virtual void SetChat(Int_t Chat)
Definition: TFoam.h:119
virtual void SetnCells(Long_t nCells)
Definition: TFoam.h:116
virtual void SetRho(TFoamIntegrand *Rho)
User may use this method to set the distribution object.
Definition: TFoam.cxx:1018
virtual void SetPseRan(TRandom *PseRan)
Definition: TFoam.h:112
virtual void SetkDim(Int_t kDim)
Definition: TFoam.h:115