Logo ROOT   6.30.04
Reference Guide
 All Namespaces Files Pages
RooMoment.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 RooMoment.cxx
19 \class RooMoment
20 \ingroup Roofitcore
21 
22 RooMoment 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 "RooMoment.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 "RooFormulaVar.h"
43 #include "RooGlobalFunc.h"
44 #include "RooConstVar.h"
45 #include "RooRealIntegral.h"
46 #include "RooNumIntConfig.h"
47 #include <string>
48 using namespace std ;
49 
50 
51 ClassImp(RooMoment);
52 ;
53 
54 
55 ////////////////////////////////////////////////////////////////////////////////
56 /// Default constructor
57 
58 RooMoment::RooMoment()
59 {
60 }
61 
62 
63 
64 ////////////////////////////////////////////////////////////////////////////////
65 
66 RooMoment::RooMoment(const char* name, const char* title, RooAbsReal& func, RooRealVar& x, Int_t orderIn, Bool_t centr, Bool_t takeRoot) :
67  RooAbsMoment(name, title,func,x,orderIn,takeRoot),
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  RooFormulaVar* XF ;
77  if (centr) {
78  string formula=Form("pow((@0-@1),%d)*@2",_order) ;
79  string m1name=Form("%s_moment1",GetName()) ;
80  RooAbsReal* mom1 = func.mean(x) ;
81  XF = new RooFormulaVar(pname.c_str(),formula.c_str(),RooArgList(x,*mom1,func)) ;
82  XF->setExpensiveObjectCache(func.expensiveObjectCache()) ;
83  addOwnedComponents(*mom1) ;
84  _mean.setArg(*mom1) ;
85  } else {
86  string formula=Form("pow(@0,%d)*@1",_order) ;
87  XF = new RooFormulaVar(pname.c_str(),formula.c_str(),RooArgSet(x,func)) ;
88  XF->setExpensiveObjectCache(func.expensiveObjectCache()) ;
89  }
90 
91  if (func.isBinnedDistribution(x)) {
92  XF->specialIntegratorConfig(kTRUE)->method1D().setLabel("RooBinIntegrator");
93  }
94 
95  RooRealIntegral* intXF = (RooRealIntegral*) XF->createIntegral(x) ;
96  RooRealIntegral* intF = (RooRealIntegral*) func.createIntegral(x) ;
97  intXF->setCacheNumeric(kTRUE) ;
98  intF->setCacheNumeric(kTRUE) ;
99 
100  _xf.setArg(*XF) ;
101  _ixf.setArg(*intXF) ;
102  _if.setArg(*intF) ;
103  addOwnedComponents(RooArgSet(*XF,*intXF,*intF)) ;
104 }
105 
106 ////////////////////////////////////////////////////////////////////////////////
107 
108 RooMoment::RooMoment(const char* name, const char* title, RooAbsReal& func, RooRealVar& x, const RooArgSet& nset,
109  Int_t orderIn, Bool_t centr, Bool_t takeRoot, Bool_t intNSet) :
110  RooAbsMoment(name, title,func,x,orderIn,takeRoot),
111  _xf("!xf","xf",this,kFALSE,kFALSE),
112  _ixf("!ixf","ixf",this),
113  _if("!if","if",this)
114 {
115  setExpensiveObjectCache(func.expensiveObjectCache()) ;
116 
117  _nset.add(nset) ;
118 
119  string pname=Form("%s_product",name) ;
120  RooFormulaVar* XF ;
121  if (centr) {
122  string formula=Form("pow((@0-@1),%d)*@2",_order) ;
123  string m1name=Form("%s_moment1",GetName()) ;
124  RooAbsReal* mom1 = func.mean(x,nset) ;
125  XF = new RooFormulaVar(pname.c_str(),formula.c_str(),RooArgList(x,*mom1,func)) ;
126  XF->setExpensiveObjectCache(func.expensiveObjectCache()) ;
127  addOwnedComponents(*mom1) ;
128  _mean.setArg(*mom1) ;
129  } else {
130  string formula=Form("pow(@0,%d)*@1",_order) ;
131  XF = new RooFormulaVar(pname.c_str(),formula.c_str(),RooArgSet(x,func)) ;
132  XF->setExpensiveObjectCache(func.expensiveObjectCache()) ;
133  }
134 
135  if (func.isBinnedDistribution(x)) {
136  XF->specialIntegratorConfig(kTRUE)->method1D().setLabel("RooBinIntegrator");
137  }
138 
139  RooArgSet intSet(x) ;
140  if (intNSet) intSet.add(_nset,kTRUE) ;
141 
142  RooRealIntegral* intXF = (RooRealIntegral*) XF->createIntegral(intSet,&_nset) ;
143  RooRealIntegral* intF = (RooRealIntegral*) func.createIntegral(intSet,&_nset) ;
144  intXF->setCacheNumeric(kTRUE) ;
145  intF->setCacheNumeric(kTRUE) ;
146 
147  _xf.setArg(*XF) ;
148  _ixf.setArg(*intXF) ;
149  _if.setArg(*intF) ;
150  addOwnedComponents(RooArgSet(*XF,*intXF,*intF)) ;
151 }
152 
153 
154 
155 ////////////////////////////////////////////////////////////////////////////////
156 
157 RooMoment::RooMoment(const RooMoment& other, const char* name) :
158  RooAbsMoment(other, name),
159  _xf("xf",this,other._xf),
160  _ixf("ixf",this,other._ixf),
161  _if("if",this,other._if)
162 {
163 }
164 
165 
166 
167 ////////////////////////////////////////////////////////////////////////////////
168 /// Destructor
169 
170 RooMoment::~RooMoment()
171 {
172 }
173 
174 
175 
176 ////////////////////////////////////////////////////////////////////////////////
177 /// Calculate value
178 
179 Double_t RooMoment::evaluate() const
180 {
181  Double_t ratio = _ixf / _if ;
182  Double_t ret = _takeRoot ? pow(ratio,1.0/_order) : ratio ;
183  return ret ;
184 }
185 
186