Logo ROOT  
Reference Guide
 
Loading...
Searching...
No Matches
RooEffGenContext.cxx
Go to the documentation of this file.
1/*****************************************************************************
2 * Project: RooFit *
3 * Package: RooFitCore *
4 * @(#)root/roofitcore:$Id$
5 * Authors: *
6 * GR, Gerhard Raven, NIKHEF/VU, Gerhard.Raven@nikhf.nl *
7 * *
8 * Copyright (c) 2005, NIKHEF. All rights reserved. *
9 * *
10 * Redistribution and use in source and binary forms, *
11 * with or without modification, are permitted according to the terms *
12 * listed in LICENSE (http://roofit.sourceforge.net/license.txt) *
13 *****************************************************************************/
14
15/**
16\file RooEffGenContext.cxx
17\class RooEffGenContext
18\ingroup Roofitcore
19
20Specialized generator context for p.d.fs represented
21by class RooEffProd, which are p.d.fs multiplied with an efficiency function.
22This generator context generates events from such products by first
23generating events from a dedicated generator context of the input p.d.f.
24and applying an extra rejection step based on the efficiency function.
25**/
26
27#include <memory>
28
29#include "RooEffGenContext.h"
30#include "RooAbsPdf.h"
31#include "RooRandom.h"
32
34
35////////////////////////////////////////////////////////////////////////////////
36/// Constructor of generator context for RooEffProd products
37
39 const RooArgSet &vars, const RooDataSet *prototype, const RooArgSet *auxProto,
40 bool verbose, const RooArgSet * /*forceDirect*/)
41 : RooAbsGenContext(model, vars, prototype, auxProto, verbose), _maxEff(0.)
42{
43 RooArgSet x(eff, eff.GetName());
44 x.snapshot(_cloneSet, true);
45 initializeEff(eff);
46 _generator = std::unique_ptr<RooAbsGenContext>{pdf.genContext(vars, prototype, auxProto, verbose)};
47 vars.snapshot(_vars, true);
48}
49
50////////////////////////////////////////////////////////////////////////////////
51/// One-time initialization of generator.
52
54{
56 _generator->initGenerator(theEvent);
57
58 // Check if PDF supports maximum finding
59 Int_t code = _eff->getMaxVal(_vars);
60 if (!code) {
61 _maxEff = 1.;
62 } else {
63 _maxEff = _eff->maxVal(code);
64 }
65}
66
67////////////////////////////////////////////////////////////////////////////////
68/// Generate one event. Generate an event from the p.d.f and
69/// then perform an accept/reject sampling based on the efficiency
70/// function
71
73{
74 while (true) {
75 _generator->generateEvent(theEvent, remaining);
76 double val = _eff->getVal();
77 if (val > _maxEff && !_eff->getMaxVal(_vars)) {
78 coutE(Generation) << ClassName() << "::" << GetName()
79 << ":generateEvent: value of efficiency is larger than assumed maximum of 1." << std::endl;
80 continue;
81 }
82 if (val > RooRandom::uniform() * _maxEff) {
83 break;
84 }
85 }
86}
87
88////////////////////////////////////////////////////////////////////////////////
89/// Detailed printing interface
90
91void RooEffGenContext::printMultiline(std::ostream &os, Int_t content, bool verbose, TString indent) const
92{
93 RooAbsGenContext::printMultiline(os, content, verbose, indent);
94 os << indent << "--- RooEffGenContext ---" << std::endl;
95 os << indent << "Using EFF ";
97 os << indent << "PDF generator" << std::endl;
98
99 TString indent2(indent);
100 indent2.Append(" ");
101
102 _generator->printMultiline(os, content, verbose, indent2);
103}
#define coutE(a)
#define ClassImp(name)
Definition Rtypes.h:382
static void indent(ostringstream &buf, int indent_level)
bool recursiveRedirectServers(const RooAbsCollection &newServerList, bool mustReplaceAll=false, bool nameChange=false, bool recurseInNewSet=true)
Recursively replace all servers with the new servers in newSet.
Abstract base class for generator contexts of RooAbsPdf objects.
void printMultiline(std::ostream &os, Int_t contents, bool verbose=false, TString indent="") const override
Interface for multi-line printing.
Abstract interface for all probability density functions.
Definition RooAbsPdf.h:40
virtual RooAbsGenContext * genContext(const RooArgSet &vars, const RooDataSet *prototype=nullptr, const RooArgSet *auxProto=nullptr, bool verbose=false) const
Interface function to create a generator context from a p.d.f.
Abstract base class for objects that represent a real value and implements functionality common to al...
Definition RooAbsReal.h:59
double getVal(const RooArgSet *normalisationSet=nullptr) const
Evaluate object.
Definition RooAbsReal.h:103
virtual double maxVal(Int_t code) const
Return maximum value for set of observables identified by code assigned in getMaxVal.
virtual Int_t getMaxVal(const RooArgSet &vars) const
Advertise capability to determine maximum value of function for given set of observables.
RooArgSet is a container object that can hold multiple RooAbsArg objects.
Definition RooArgSet.h:24
RooArgSet * snapshot(bool deepCopy=true) const
Use RooAbsCollection::snapshot(), but return as RooArgSet.
Definition RooArgSet.h:154
Container class to hold unbinned data.
Definition RooDataSet.h:33
Specialized generator context for p.d.fs represented by class RooEffProd, which are p....
void generateEvent(RooArgSet &theEvent, Int_t remaining) override
Generate one event.
void printMultiline(std::ostream &os, Int_t content, bool verbose=false, TString indent="") const override
Detailed printing interface.
std::unique_ptr< RooAbsGenContext > _generator
Generator context for p.d.f.
RooArgSet _cloneSet
Internal clone of p.d.f.
RooEffGenContext(const RooAbsPdf &model, const RooAbsPdf &pdf, const RooAbsReal &eff, const RooArgSet &vars, const RooDataSet *prototype=nullptr, const RooArgSet *auxProto=nullptr, bool verbose=false, const RooArgSet *forceDirect=nullptr)
Constructor of generator context for RooEffProd products.
void initializeEff(RooAbsReal const &eff)
void initGenerator(const RooArgSet &theEvent) override
One-time initialization of generator.
RooArgSet _vars
Vars to generate.
double _maxEff
Maximum of efficiency in vars.
RooAbsReal * _eff
Pointer to efficiency function.
virtual void printStream(std::ostream &os, Int_t contents, StyleOption style, TString indent="") const
Print description of object on ostream, printing contents set by contents integer,...
static double uniform(TRandom *generator=randomGenerator())
Return a number uniformly distributed from (0,1)
Definition RooRandom.cxx:78
const char * GetName() const override
Returns name of object.
Definition TNamed.h:47
virtual const char * ClassName() const
Returns name of class to which the object belongs.
Definition TObject.cxx:225
Basic string class.
Definition TString.h:139
TString & Append(const char *cs)
Definition TString.h:572
Double_t x[n]
Definition legend1.C:17