ROOT  6.06/09
Reference Guide
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 //////////////////////////////////////////////////////////////////////////////
17 //
18 // BEGIN_HTML
19 // RooEffGenContext is a specialized generator context for p.d.fs represented
20 // by class RooEffProd, which are p.d.fs multiplied with an efficiency function.
21 // This generator context generates events from such products by first
22 // generating events from a dedicated generator context of the input p.d.f.
23 // and applying an extra rejection step based on the efficiency function.
24 // END_HTML
25 //
26 
27 #include <memory>
28 
29 #include "RooFit.h"
30 #include "RooEffGenContext.h"
31 #include "RooAbsPdf.h"
32 #include "RooRandom.h"
33 
34 using namespace std;
35 
37 
38 ////////////////////////////////////////////////////////////////////////////////
39 /// Constructor of generator context for RooEffProd products
40 
42  const RooAbsPdf& pdf, const RooAbsReal& eff,
43  const RooArgSet &vars,
44  const RooDataSet *prototype, const RooArgSet* auxProto,
45  Bool_t verbose, const RooArgSet* /*forceDirect*/) :
46  RooAbsGenContext(model, vars, prototype, auxProto, verbose), _maxEff(0.)
47 {
48  RooArgSet x(eff,eff.GetName());
49  _cloneSet = static_cast<RooArgSet*>(x.snapshot(kTRUE));
50  _eff = dynamic_cast<RooAbsReal*>(_cloneSet->find(eff.GetName()));
51  _generator = pdf.genContext(vars, prototype, auxProto, verbose);
52  _vars = static_cast<RooArgSet*>(vars.snapshot(kTRUE));
53 }
54 
55 ////////////////////////////////////////////////////////////////////////////////
56 /// Destructor
57 
59 {
60  delete _generator;
61  delete _cloneSet;
62  delete _vars;
63 }
64 
65 ////////////////////////////////////////////////////////////////////////////////
66 /// One-time initialization of generator.
67 
69 {
70  _eff->recursiveRedirectServers(theEvent);
71  _generator->initGenerator(theEvent);
72 
73  // Check if PDF supports maximum finding
74  Int_t code = _eff->getMaxVal(*_vars);
75  if (!code) {
76  _maxEff = 1.;
77  } else {
78  _maxEff = _eff->maxVal(code);
79  }
80 }
81 
82 ////////////////////////////////////////////////////////////////////////////////
83 /// Generate one event. Generate an event from the p.d.f and
84 /// then perform an accept/reject sampling based on the efficiency
85 /// function
86 
88 {
89  while (true) {
90  _generator->generateEvent(theEvent, remaining);
91  double val = _eff->getVal();
92  if (val > _maxEff && !_eff->getMaxVal(*_vars)) {
93  coutE(Generation) << ClassName() << "::" << GetName()
94  << ":generateEvent: value of efficiency is larger than assumed maximum of 1." << std::endl;
95  continue;
96  }
97  if (val > RooRandom::uniform() * _maxEff) {
98  break;
99  }
100  }
101 }
#define coutE(a)
Definition: RooMsgService.h:35
RooAbsCollection * snapshot(Bool_t deepCopy=kTRUE) const
Take a snap shot of current collection contents: An owning collection is returned containing clones o...
void initGenerator(const RooArgSet &theEvent)
One-time initialization of generator.
RooArgSet * _cloneSet
int Int_t
Definition: RtypesCore.h:41
bool Bool_t
Definition: RtypesCore.h:59
STL namespace.
RooAbsReal * _eff
virtual ~RooEffGenContext()
Destructor.
Double_t x[n]
Definition: legend1.C:17
Double_t getVal(const RooArgSet *set=0) const
Definition: RooAbsReal.h:64
RooEffGenContext(const RooAbsPdf &model, const RooAbsPdf &pdf, const RooAbsReal &eff, const RooArgSet &vars, const RooDataSet *prototype=0, const RooArgSet *auxProto=0, Bool_t verbose=kFALSE, const RooArgSet *forceDirect=0)
Constructor of generator context for RooEffProd products.
void generateEvent(RooArgSet &theEvent, Int_t remaining)
Generate one event.
virtual const char * ClassName() const
Returns name of class to which the object belongs.
Definition: TObject.cxx:187
bool verbose
virtual void generateEvent(RooArgSet &theEvent, Int_t remaining)=0
virtual const char * GetName() const
Returns name of object.
Definition: TNamed.h:51
virtual Int_t getMaxVal(const RooArgSet &vars) const
Advertise capability to determine maximum value of function for given set of observables.
static Double_t uniform(TRandom *generator=randomGenerator())
Return a number uniformly distributed from (0,1)
Definition: RooRandom.cxx:83
RooAbsReal is the common abstract base class for objects that represent a real value and implements f...
Definition: RooAbsReal.h:53
ClassImp(RooEffGenContext)
RooAbsGenContext * _generator
RooAbsPdf is the abstract interface for all probability density functions The class provides hybrid a...
Definition: RooAbsPdf.h:41
virtual Double_t maxVal(Int_t code) const
Return maximum value for set of observables identified by code assigned in getMaxVal.
Bool_t recursiveRedirectServers(const RooAbsCollection &newServerList, Bool_t mustReplaceAll=kFALSE, Bool_t nameChange=kFALSE, Bool_t recurseInNewSet=kTRUE)
Definition: RooAbsArg.cxx:1087
const Bool_t kTRUE
Definition: Rtypes.h:91
virtual void initGenerator(const RooArgSet &theEvent)
Interface function to initialize context for generation for given set of observables.
virtual RooAbsGenContext * genContext(const RooArgSet &vars, const RooDataSet *prototype=0, const RooArgSet *auxProto=0, Bool_t verbose=kFALSE) const
Interface function to create a generator context from a p.d.f.
Definition: RooAbsPdf.cxx:1638