Logo ROOT   6.30.04
Reference Guide
 All Namespaces Files Pages
RooAbsSelfCachedReal.cxx
Go to the documentation of this file.
1  /*****************************************************************************
2  * Project: RooFit *
3  * *
4  * Copyright (c) 2000-2005, Regents of the University of California *
5  * and Stanford University. All rights reserved. *
6  * *
7  * Redistribution and use in source and binary forms, *
8  * with or without modification, are permitted according to the terms *
9  * listed in LICENSE (http://roofit.sourceforge.net/license.txt) *
10  *****************************************************************************/
11 
12 /**
13 \file RooAbsSelfCachedReal.cxx
14 \class RooAbsSelfCachedReal
15 \ingroup Roofitcore
16 
17 RooAbsSelfCachedReal is an abstract base class for functions whose
18 output is cached in terms of a histogram in all observables between
19 getVal() and evaluate(). For certain p.d.f.s that are very
20 expensive to calculate it may be beneficial to implement them as a
21 RooAbsSelfCachedReal rather than a RooAbsReal. Class
22 RooAbsSelfCachedReal is designed to have its interface identical to
23 that of RooAbsReal, so any p.d.f can make use of its caching
24 functionality by merely switching its base class. Existing
25 RooAbsReal objects can also be cached a posteriori with the
26 RooCachedReal wrapper function that takes any RooAbsReal object as
27 input.
28 **/
29 
30 #include "Riostream.h"
31 
32 #include "RooFit.h"
33 #include "RooAbsSelfCachedReal.h"
34 #include "RooAbsReal.h"
35 #include "RooMsgService.h"
36 #include "RooDataHist.h"
37 #include "RooHistPdf.h"
38 
39 using namespace std ;
40 
41 ClassImp(RooAbsSelfCachedReal);
42 
43 
44 
45 ////////////////////////////////////////////////////////////////////////////////
46 /// Constructor
47 
48 RooAbsSelfCachedReal::RooAbsSelfCachedReal(const char *name, const char *title, Int_t ipOrder) :
49  RooAbsCachedReal(name,title,ipOrder)
50  {
51  }
52 
53 
54 
55 ////////////////////////////////////////////////////////////////////////////////
56 /// Copy constructor
57 
58 RooAbsSelfCachedReal::RooAbsSelfCachedReal(const RooAbsSelfCachedReal& other, const char* name) :
59  RooAbsCachedReal(other,name)
60  {
61  }
62 
63 
64 
65 ////////////////////////////////////////////////////////////////////////////////
66 /// Destructor
67 
68 RooAbsSelfCachedReal::~RooAbsSelfCachedReal()
69 {
70 }
71 
72 
73 
74 ////////////////////////////////////////////////////////////////////////////////
75 /// Fill cache with sampling of function as defined by the evaluate() implementation
76 
77 void RooAbsSelfCachedReal::fillCacheObject(RooAbsCachedReal::FuncCacheElem& cache) const
78 {
79  RooDataHist& cacheHist = *cache.hist() ;
80 
81  // Make deep clone of self in non-caching mde and attach to dataset observables
82  RooArgSet* cloneSet = (RooArgSet*) RooArgSet(*this).snapshot(kTRUE) ;
83  RooAbsSelfCachedReal* clone2 = (RooAbsSelfCachedReal*) cloneSet->find(GetName()) ;
84  clone2->disableCache(kTRUE) ;
85  clone2->attachDataSet(cacheHist) ;
86 
87  // Iterator over all bins of RooDataHist and fill weights
88  for (Int_t i=0 ; i<cacheHist.numEntries() ; i++) {
89  const RooArgSet* obs = cacheHist.get(i) ;
90  Double_t wgt = clone2->getVal(obs) ;
91  cacheHist.set(wgt) ;
92  }
93 
94  delete cloneSet ;
95 }
96 
97 
98 
99 ////////////////////////////////////////////////////////////////////////////////
100 /// Defines observables to be cached, given a set of user defined observables
101 /// Returns the subset of nset that are observables this p.d.f
102 
103 RooArgSet* RooAbsSelfCachedReal::actualObservables(const RooArgSet& nset) const
104 {
105  // Make list of servers
106  RooArgSet serverSet;
107 
108  for (auto server : _serverList) {
109  serverSet.add(*server);
110  }
111 
112  // Return servers that are in common with given normalization set
113  return (RooArgSet*) serverSet.selectCommon(nset);
114 
115 }
116 
117 
118 ////////////////////////////////////////////////////////////////////////////////
119 /// Defines parameters on which cache contents depends. Returns
120 /// subset of variables of self that is not contained in the
121 /// supplied nset
122 
123 RooArgSet* RooAbsSelfCachedReal::actualParameters(const RooArgSet& nset) const
124 {
125  // Make list of servers
126  RooArgSet *serverSet = new RooArgSet;
127 
128  for (auto server : _serverList) {
129  serverSet->add(*server);
130  }
131 
132  // Remove all given observables from server list
133  serverSet->remove(nset,kTRUE,kTRUE);
134 
135  return serverSet;
136 }
137 
138 
139 
140 
141 
142 
143