Logo ROOT   6.30.04
Reference Guide
 All Namespaces Files Pages
RooFunctor1DBinding.cxx
Go to the documentation of this file.
1 /*****************************************************************************
2  * Project: RooFit *
3  * Package: RooFitCore *
4  * File: $Id$
5  * Authors: *
6  * WV, Wouter Verkerke, NIKHEF, verkerke@nikhef.nl *
7  * *
8  * Copyright (c) 2000-2008, NIKHEF, Regents of the University of California *
9  * and Stanford University. All rights reserved. *
10  * *
11  *****************************************************************************/
12 
13 /** \class RooFunctor1DBinding
14  \ingroup Roofit
15 
16 RooCFunction1Binding is a templated implementation of class RooAbsReal that binds
17 generic C(++) functions to a RooAbsReal argument thus allowing generic C++
18 functions to be used as RooFit functions. Instances of function binding
19 classes are fully functional RooFit function objects with one exception:
20 if the bound function is _not_ a standard TMath or MathMore function the
21 class cannot be persisted in a RooWorkspace without registering the function
22 pointer first using RooCFunction1Binding<T1,T2>::register().
23 **/
24 
25 /** \class RooFunctor1DPdfBinding
26  \ingroup Roofit
27 **/
28 
29 #include "Riostream.h"
30 #include "RooFunctor1DBinding.h"
31 
32 using namespace std ;
33 
34 ClassImp(RooFunctor1DBinding);
35 ClassImp(RooFunctor1DPdfBinding);
36 
37 ////////////////////////////////////////////////////////////////////////////////
38 
39 RooFunctor1DBinding::RooFunctor1DBinding(const char *name, const char *title, const ROOT::Math::IBaseFunctionOneDim& ftor, RooAbsReal& x) :
40  RooAbsReal(name,title),
41  func(&ftor),
42  var("x","x",this,x)
43 {
44 }
45 
46 ////////////////////////////////////////////////////////////////////////////////
47 
48 RooFunctor1DBinding::RooFunctor1DBinding(const RooFunctor1DBinding& other, const char* name) :
49  RooAbsReal(other,name),
50  func(other.func),
51  var("x",this,other.var)
52 {
53  // Copy constructor
54 }
55 
56 ////////////////////////////////////////////////////////////////////////////////
57 
58 void RooFunctor1DBinding::printArgs(ostream& os) const {
59  // Print object arguments and name/address of function pointer
60  os << "[ function=" << func << " " ;
61  for (Int_t i=0 ; i<numProxies() ; i++) {
62  RooAbsProxy* p = getProxy(i) ;
63  if (!TString(p->name()).BeginsWith("!")) {
64  p->print(os) ;
65  os << " " ;
66  }
67  }
68  os << "]" ;
69 }
70 
71 ////////////////////////////////////////////////////////////////////////////////
72 
73 Double_t RooFunctor1DBinding::evaluate() const {
74  // Return value of embedded function using value of referenced variable x
75  return (*func)(var.arg().getVal()) ;
76  }
77 
78 ////////////////////////////////////////////////////////////////////////////////
79 
80 RooFunctor1DPdfBinding::RooFunctor1DPdfBinding(const char *name, const char *title, const ROOT::Math::IBaseFunctionOneDim& ftor, RooAbsReal& x) :
81  RooAbsPdf(name,title),
82  func(&ftor),
83  var("x","x",this,x)
84 {
85 }
86 
87 ////////////////////////////////////////////////////////////////////////////////
88 
89 RooFunctor1DPdfBinding::RooFunctor1DPdfBinding(const RooFunctor1DPdfBinding& other, const char* name) :
90  RooAbsPdf(other,name),
91  func(other.func),
92  var("x",this,other.var)
93 {
94  // Copy constructor
95 }
96 
97 ////////////////////////////////////////////////////////////////////////////////
98 
99 void RooFunctor1DPdfBinding::printArgs(ostream& os) const {
100  // Print object arguments and name/address of function pointer
101  os << "[ function=" << func << " " ;
102  for (Int_t i=0 ; i<numProxies() ; i++) {
103  RooAbsProxy* p = getProxy(i) ;
104  if (!TString(p->name()).BeginsWith("!")) {
105  p->print(os) ;
106  os << " " ;
107  }
108  }
109  os << "]" ;
110 }
111 
112 ////////////////////////////////////////////////////////////////////////////////
113 
114 Double_t RooFunctor1DPdfBinding::evaluate() const {
115  // Return value of embedded function using value of referenced variable x
116  return (*func)(var.arg().getVal()) ;
117  }
118 
119 namespace RooFit {
120 
121  RooAbsReal* bindFunction(const char* name, const ROOT::Math::IBaseFunctionOneDim& ftor, RooAbsReal& var) {
122  return new RooFunctor1DBinding(name,name,ftor,var) ;
123  }
124 
125  RooAbsPdf* bindPdf(const char* name, const ROOT::Math::IBaseFunctionOneDim& ftor, RooAbsReal& var) {
126  return new RooFunctor1DPdfBinding(name,name,ftor,var) ;
127  }
128 
129 }