Logo ROOT   6.30.04
Reference Guide
 All Namespaces Files Pages
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 
37 ClassImp(RooEffGenContext);
38 
39 ////////////////////////////////////////////////////////////////////////////////
40 /// Constructor of generator context for RooEffProd products
41 
42 RooEffGenContext::RooEffGenContext(const RooAbsPdf &model,
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 
59 RooEffGenContext::~RooEffGenContext()
60 {
61  delete _generator;
62  delete _cloneSet;
63  delete _vars;
64 }
65 
66 ////////////////////////////////////////////////////////////////////////////////
67 /// One-time initialization of generator.
68 
69 void RooEffGenContext::initGenerator(const RooArgSet &theEvent)
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 
88 void RooEffGenContext::generateEvent(RooArgSet &theEvent, Int_t remaining)
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 }