1 #include "../interface/VerticalInterpPdf.h"
8 #include "RooRealProxy.h"
10 #include "RooRealVar.h"
11 #include "RooAddGenContext.h"
12 #include "RooRealConstant.h"
13 #include "RooRealIntegral.h"
14 #include "RooMsgService.h"
26 _funcIter = _funcList.createIterator() ;
27 _coefIter = _coefList.createIterator() ;
34 RooAbsPdf(name,title),
36 _funcList(
"!funcList",
"List of functions",this),
37 _coefList(
"!coefList",
"List of coefficients",this),
38 _quadraticRegion(quadraticRegion),
39 _quadraticAlgo(quadraticAlgo)
42 if (inFuncList.getSize()!=2*inCoefList.getSize()+1) {
43 coutE(InputArguments) <<
"VerticalInterpPdf::VerticalInterpPdf(" << GetName()
44 <<
") number of pdfs and coefficients inconsistent, must have Nfunc=1+2*Ncoef" << endl ;
48 TIterator* funcIter = inFuncList.createIterator() ;
50 while((func = (RooAbsArg*)funcIter->Next())) {
51 if (!dynamic_cast<RooAbsReal*>(func)) {
52 coutE(InputArguments) <<
"ERROR: VerticalInterpPdf::VerticalInterpPdf(" << GetName() <<
") function " << func->GetName() <<
" is not of type RooAbsReal" << endl;
59 TIterator* coefIter = inCoefList.createIterator() ;
61 while((coef = (RooAbsArg*)coefIter->Next())) {
62 if (!dynamic_cast<RooAbsReal*>(coef)) {
63 coutE(InputArguments) <<
"ERROR: VerticalInterpPdf::VerticalInterpPdf(" << GetName() <<
") coefficient " << coef->GetName() <<
" is not of type RooAbsReal" << endl;
87 RooAbsPdf(other,name),
88 _normIntMgr(other._normIntMgr,this),
89 _funcList(
"!funcList",this,other._funcList),
90 _coefList(
"!coefList",this,other._coefList),
91 _quadraticRegion(other._quadraticRegion),
92 _quadraticAlgo(other._quadraticAlgo)
120 RooAbsReal* func = (RooAbsReal*)
_funcIter->Next();
122 Double_t central = func->getVal();
127 while((coef=(RooAbsReal*)
_coefIter->Next())) {
128 Double_t coefVal = coef->getVal() ;
129 RooAbsReal* funcUp = (RooAbsReal*)
_funcIter->Next() ;
130 RooAbsReal* funcDn = (RooAbsReal*)
_funcIter->Next() ;
131 value +=
interpolate(coefVal, central, funcUp, funcDn);
135 while((coef=(RooAbsReal*)
_coefIter->Next())) {
136 Double_t coefVal = coef->getVal() ;
137 RooAbsReal* funcUp = (RooAbsReal*)
_funcIter->Next() ;
138 RooAbsReal* funcDn = (RooAbsReal*)
_funcIter->Next() ;
139 value *=
interpolate(coefVal, central, funcUp, funcDn);
143 return value > 0 ? value : 1E-9 ;
163 while((coef=(RooAbsReal*)
_coefIter->Next())) {
164 if (coef->dependsOn(*nset)) {
165 coutE(InputArguments) <<
"RooRealPdf::checkObservables(" << GetName() <<
"): ERROR coefficient " << coef->GetName()
166 <<
" depends on one or more of the following observables" ; nset->Print(
"1") ;
173 while((func = (RooAbsReal*)
_funcIter->Next())) {
174 if (func->observableOverlaps(nset,*coef)) {
175 coutE(InputArguments) <<
"VerticalInterpPdf::checkObservables(" << GetName() <<
"): ERROR: coefficient " << coef->GetName()
176 <<
" and FUNC " << func->GetName() <<
" have one or more observables in common" << endl ;
189 const RooArgSet* normSet2,
const char* )
const
194 if (allVars.getSize()==0)
return 0 ;
195 if (_forceNumInt)
return 0 ;
198 analVars.add(allVars) ;
199 RooArgSet* normSet = normSet2 ? getObservables(normSet2) : 0 ;
203 Int_t sterileIdx(-1) ;
215 while((func=(RooAbsReal*)
_funcIter->Next())) {
216 RooAbsReal* funcInt = func->createIntegral(analVars) ;
218 if (normSet && normSet->getSize()>0) {
219 RooAbsReal* funcNorm = func->createIntegral(*normSet) ;
225 Int_t code =
_normIntMgr.setObj(normSet,&analVars,(RooAbsCacheElement*)cache,0) ;
244 if (code==0)
return getVal(normSet2) ;
252 TIterator* funcIntIter = cache->
_funcIntList.createIterator() ;
253 RooAbsReal *funcInt = (RooAbsReal *) funcIntIter->Next();
254 Double_t central = funcInt->getVal();
258 while((coef=(RooAbsReal*)
_coefIter->Next())) {
259 Double_t coefVal = coef->getVal(normSet2) ;
260 RooAbsReal * funcIntUp = (RooAbsReal*)funcIntIter->Next() ;
261 RooAbsReal * funcIntDn = (RooAbsReal*)funcIntIter->Next() ;
262 value +=
interpolate(coefVal, central, funcIntUp, funcIntDn);
267 Double_t normVal(1) ;
271 TIterator* funcNormIter = cache->
_funcNormList.createIterator() ;
273 RooAbsReal* funcNorm = (RooAbsReal*) funcNormIter->Next();
274 central = funcNorm->getVal(normSet2) ;
277 while((coef=(RooAbsReal*)
_coefIter->Next())) {
278 RooAbsReal *funcNormUp = (RooAbsReal*)funcNormIter->Next() ;
279 RooAbsReal *funcNormDn = (RooAbsReal*)funcNormIter->Next() ;
280 Double_t coefVal = coef->getVal(normSet2) ;
281 normVal +=
interpolate(coefVal, central, funcNormUp, funcNormDn);
284 delete funcNormIter ;
287 return ( value > 0 ? value : 1E-9 ) / normVal;
293 Double_t kappa = (coeff > 0 ? fUp->getVal()/central : central/fDn->getVal());
294 return pow(kappa,fabs(coeff));
298 return coeff * (coeff > 0 ? fUp->getVal() - central : central - fDn->getVal());
314 return c_up * fUp->getVal() + c_dn * fDn->getVal() + c_cen * central;
333 Double_t c_cen = - c_up - c_dn;
334 return c_up * fUp->getVal() + c_dn * fDn->getVal() + c_cen * central;
Double_t interpolate(Double_t coeff, Double_t central, RooAbsReal *fUp, RooAbsReal *fDown) const
Iterator over coefficient list.
virtual ~VerticalInterpPdf()
Double_t _quadraticRegion
RooObjCacheManager _normIntMgr
TIterator * _coefIter
Iterator over FUNC list.
virtual Bool_t checkObservables(const RooArgSet *nset) const
Double_t analyticalIntegralWN(Int_t code, const RooArgSet *normSet, const char *rangeName=0) const
Int_t getAnalyticalIntegralWN(RooArgSet &allVars, RooArgSet &numVars, const RooArgSet *normSet, const char *rangeName=0) const
Double_t evaluate() const
Power< A, B >::type pow(const A &a, const B &b)