Logo ROOT  
Reference Guide
 
Loading...
Searching...
No Matches
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
39#include "RooFit.h"
40#include "Riostream.h"
41
42#include "RooFoamGenerator.h"
43#include "RooAbsReal.h"
44#include "RooCategory.h"
45#include "RooRealVar.h"
46#include "RooDataSet.h"
47#include "RooRandom.h"
48#include "RooErrorHandler.h"
49
50#include "TString.h"
51#include "TIterator.h"
52#include "RooMsgService.h"
53#include "TClass.h"
54#include "TFoam.h"
55#include "RooTFoamBinding.h"
56#include "RooNumGenFactory.h"
57#include "RooNumGenConfig.h"
58
59#include <assert.h>
60
61using namespace std;
62
64 ;
65
66
67////////////////////////////////////////////////////////////////////////////////
68/// Register RooIntegrator1D, is parameters and capabilities with RooNumIntFactory
69
71{
72 // Register RooIntegrator1D, is parameters and capabilities with RooNumIntFactory
73 RooRealVar nSample("nSample","Number of samples per cell",200,0,1e6) ;
74 RooRealVar nCell1D("nCell1D","Number of cells for 1-dim generation",30,0,1e6) ;
75 RooRealVar nCell2D("nCell2D","Number of cells for 2-dim generation",500,0,1e6) ;
76 RooRealVar nCell3D("nCell3D","Number of cells for 3-dim generation",5000,0,1e6) ;
77 RooRealVar nCellND("nCellND","Number of cells for N-dim generation",10000,0,1e6) ;
78 RooRealVar chatLevel("chatLevel","TFOAM 'chat level' (verbosity)",0,0,2) ;
79
81 fact.storeProtoSampler(proto,RooArgSet(nSample,nCell1D,nCell2D,nCell3D,nCellND,chatLevel)) ;
82}
83
84
85
86
87////////////////////////////////////////////////////////////////////////////////
88
89RooFoamGenerator::RooFoamGenerator(const RooAbsReal &func, const RooArgSet &genVars, const RooNumGenConfig& config, Bool_t verbose, const RooAbsReal* maxFuncVal) :
90 RooAbsNumGenerator(func,genVars,verbose,maxFuncVal)
91{
93
94 _tfoam = new TFoam("TFOAM") ;
98 switch(_realVars.getSize()) {
99 case 1:_tfoam->SetnCells((Int_t)config.getConfigSection("RooFoamGenerator").getRealValue("nCell1D")) ; break ;
100 case 2:_tfoam->SetnCells((Int_t)config.getConfigSection("RooFoamGenerator").getRealValue("nCell2D")) ; break ;
101 case 3:_tfoam->SetnCells((Int_t)config.getConfigSection("RooFoamGenerator").getRealValue("nCell3D")) ; break ;
102 default:_tfoam->SetnCells((Int_t)config.getConfigSection("RooFoamGenerator").getRealValue("nCellND")) ; break ;
103 }
104 _tfoam->SetnSampl((Int_t)config.getConfigSection("RooFoamGenerator").getRealValue("nSample")) ;
106 _tfoam->SetChat((Int_t)config.getConfigSection("RooFoamGenerator").getRealValue("chatLevel")) ;
107 _tfoam->Initialize() ;
108
109 _vec = new Double_t[_realVars.getSize()] ;
112
113 Int_t i(0) ;
114 for (const auto arg : _realVars) {
115 auto var = static_cast<const RooRealVar*>(arg);
116 _xmin[i] = var->getMin() ;
117 _range[i] = var->getMax() - var->getMin() ;
118 i++ ;
119 }
120}
121
122
123////////////////////////////////////////////////////////////////////////////////
124/// Destructor
125
127{
128 delete[] _vec ;
129 delete[] _xmin ;
130 delete[] _range ;
131 delete _tfoam ;
132 delete _binding ;
133}
134
135
136
137////////////////////////////////////////////////////////////////////////////////
138/// are we actually generating anything? (the cache always contains at least our function value)
139
140const RooArgSet *RooFoamGenerator::generateEvent(UInt_t /*remaining*/, Double_t& /*resampleRatio*/)
141{
142 const RooArgSet *event= _cache->get();
143 if(event->getSize() == 1) return event;
144
145 _tfoam->MakeEvent() ;
147
148 // Transfer contents to dataset
149 Int_t i(0) ;
150 for (auto arg : _realVars) {
151 auto var = static_cast<RooRealVar*>(arg);
152 var->setVal(_xmin[i] + _range[i]*_vec[i]) ;
153 i++ ;
154 }
155 return &_realVars ;
156}
#define ClassImp(name)
Definition Rtypes.h:364
const char * proto
Definition civetweb.c:16613
Int_t getSize() const
Double_t getRealValue(const char *name, Double_t defVal=0, Bool_t verbose=kFALSE) const
Get value of a RooAbsReal stored in set with given name.
Class RooAbsNumGenerator is the abstract base class for MC event generator implementations like RooAc...
RooAbsReal is the common abstract base class for objects that represent a real value and implements f...
Definition RooAbsReal.h:64
RooArgSet is a container object that can hold multiple RooAbsArg objects.
Definition RooArgSet.h:35
virtual 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...
virtual ~RooFoamGenerator()
Destructor.
const RooArgSet * generateEvent(UInt_t remaining, Double_t &resampleRatio)
are we actually generating anything? (the cache always contains at least our function value)
RooTFoamBinding * _binding
static void registerSampler(RooNumGenFactory &fact)
Register RooIntegrator1D, is parameters and capabilities with RooNumIntFactory.
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_t 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:53
RooRealVar represents a variable that can be changed from the outside.
Definition RooRealVar.h:39
virtual void setVal(Double_t value)
Set value of variable to 'value'.
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:1176
virtual void MakeEvent()
User method.
Definition TFoam.cxx:1126
virtual void Initialize()
Basic initialization of FOAM invoked by the user.
Definition TFoam.cxx:323
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:1022
virtual void SetPseRan(TRandom *PseRan)
Definition TFoam.h:112
virtual void SetkDim(Int_t kDim)
Definition TFoam.h:115