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