Logo ROOT   6.30.04
Reference Guide
 All Namespaces Files Pages
RooFirstMoment.cxx
Go to the documentation of this file.
1 /*****************************************************************************
2  * Project: RooFit *
3  * Package: RooFitCore *
4  * @(#)root/roofitcore:$Id$
5  * Authors: *
6  * WV, Wouter Verkerke, UC Santa Barbara, verkerke@slac.stanford.edu *
7  * DK, David Kirkby, UC Irvine, dkirkby@uci.edu *
8  * *
9  * Copyright (c) 2000-2005, Regents of the University of California *
10  * and Stanford University. All rights reserved. *
11  * *
12  * Redistribution and use in source and binary forms, *
13  * with or without modification, are permitted according to the terms *
14  * listed in LICENSE (http://roofit.sourceforge.net/license.txt) *
15  *****************************************************************************/
16 
17 /**
18 \file RooFirstMoment.cxx
19 \class RooFirstMoment
20 \ingroup Roofitcore
21 
22 RooFirstMoment represents the first, second, or third order derivative
23 of any RooAbsReal as calculated (numerically) by the MathCore Richardson
24 derivator class.
25 **/
26 
27 
28 #include "RooFit.h"
29 
30 #include "Riostream.h"
31 #include "Riostream.h"
32 #include <math.h>
33 
34 #include "RooFirstMoment.h"
35 #include "RooAbsReal.h"
36 #include "RooAbsPdf.h"
37 #include "RooErrorHandler.h"
38 #include "RooArgSet.h"
39 #include "RooMsgService.h"
40 #include "RooRealVar.h"
41 #include "RooFunctor.h"
42 #include "RooGlobalFunc.h"
43 #include "RooConstVar.h"
44 #include "RooRealIntegral.h"
45 #include "RooNumIntConfig.h"
46 #include "RooProduct.h"
47 #include <string>
48 using namespace std ;
49 
50 
51 ClassImp(RooFirstMoment);
52 ;
53 
54 
55 ////////////////////////////////////////////////////////////////////////////////
56 /// Default constructor
57 
58 RooFirstMoment::RooFirstMoment()
59 {
60 }
61 
62 
63 
64 ////////////////////////////////////////////////////////////////////////////////
65 
66 RooFirstMoment::RooFirstMoment(const char* name, const char* title, RooAbsReal& func, RooRealVar& x) :
67  RooAbsMoment(name, title,func,x,1,kFALSE),
68  _xf("!xf","xf",this,kFALSE,kFALSE),
69  _ixf("!ixf","ixf",this),
70  _if("!if","if",this)
71 {
72  setExpensiveObjectCache(func.expensiveObjectCache()) ;
73 
74  string pname=Form("%s_product",name) ;
75 
76  RooProduct* XF = new RooProduct(pname.c_str(),pname.c_str(),RooArgSet(x,func)) ;
77  XF->setExpensiveObjectCache(func.expensiveObjectCache()) ;
78 
79  if (func.isBinnedDistribution(x)) {
80  XF->specialIntegratorConfig(kTRUE)->method1D().setLabel("RooBinIntegrator");
81  }
82 
83  RooRealIntegral* intXF = (RooRealIntegral*) XF->createIntegral(x) ;
84  RooRealIntegral* intF = (RooRealIntegral*) func.createIntegral(x) ;
85  intXF->setCacheNumeric(kTRUE) ;
86  intF->setCacheNumeric(kTRUE) ;
87 
88  _xf.setArg(*XF) ;
89  _ixf.setArg(*intXF) ;
90  _if.setArg(*intF) ;
91  addOwnedComponents(RooArgSet(*XF,*intXF,*intF)) ;
92 }
93 
94 ////////////////////////////////////////////////////////////////////////////////
95 
96 RooFirstMoment::RooFirstMoment(const char* name, const char* title, RooAbsReal& func, RooRealVar& x, const RooArgSet& nset, Bool_t intNSet) :
97  RooAbsMoment(name, title,func,x,1,kFALSE),
98  _xf("!xf","xf",this,kFALSE,kFALSE),
99  _ixf("!ixf","ixf",this),
100  _if("!if","if",this)
101 {
102  setExpensiveObjectCache(func.expensiveObjectCache()) ;
103 
104  _nset.add(nset) ;
105 
106  string pname=Form("%s_product",name) ;
107 
108  RooProduct* XF = new RooProduct(pname.c_str(),pname.c_str(),RooArgSet(x,func)) ;
109  XF->setExpensiveObjectCache(func.expensiveObjectCache()) ;
110 
111  if (func.isBinnedDistribution(x)) {
112  XF->specialIntegratorConfig(kTRUE)->method1D().setLabel("RooBinIntegrator");
113  }
114 
115  if (intNSet && _nset.getSize()>0 && func.isBinnedDistribution(_nset)) {
116  XF->specialIntegratorConfig(kTRUE)->method2D().setLabel("RooBinIntegrator");
117  XF->specialIntegratorConfig(kTRUE)->methodND().setLabel("RooBinIntegrator");
118  }
119 
120  RooArgSet intSet(x) ;
121  if (intNSet) intSet.add(_nset,kTRUE) ;
122  RooRealIntegral* intXF = (RooRealIntegral*) XF->createIntegral(intSet,&_nset) ;
123  RooRealIntegral* intF = (RooRealIntegral*) func.createIntegral(intSet,&_nset) ;
124  intXF->setCacheNumeric(kTRUE) ;
125  intF->setCacheNumeric(kTRUE) ;
126 
127  _xf.setArg(*XF) ;
128  _ixf.setArg(*intXF) ;
129  _if.setArg(*intF) ;
130  addOwnedComponents(RooArgSet(*XF,*intXF,*intF)) ;
131 }
132 
133 
134 
135 ////////////////////////////////////////////////////////////////////////////////
136 
137 RooFirstMoment::RooFirstMoment(const RooFirstMoment& other, const char* name) :
138  RooAbsMoment(other, name),
139  _xf("xf",this,other._xf),
140  _ixf("ixf",this,other._ixf),
141  _if("if",this,other._if)
142 {
143 }
144 
145 
146 
147 ////////////////////////////////////////////////////////////////////////////////
148 /// Destructor
149 
150 RooFirstMoment::~RooFirstMoment()
151 {
152 }
153 
154 
155 
156 ////////////////////////////////////////////////////////////////////////////////
157 /// Calculate value
158 
159 Double_t RooFirstMoment::evaluate() const
160 {
161  Double_t ratio = _ixf / _if ;
162  //cout << "\nRooFirstMoment::eval(" << GetName() << ") val = " << ratio << endl ;
163  return ratio ;
164 }
165 
166