41 ClassImp(RooTruthModel);
49 RooTruthModel::RooTruthModel(
const char *name,
const char *title, RooRealVar& xIn) :
50 RooResolutionModel(name,title,xIn)
59 RooTruthModel::RooTruthModel(
const RooTruthModel& other,
const char* name) :
60 RooResolutionModel(other,name)
69 RooTruthModel::~RooTruthModel()
81 Int_t RooTruthModel::basisCode(
const char* name)
const
84 if (!TString(
"exp(-@0/@1)").CompareTo(name))
return expBasisPlus ;
85 if (!TString(
"exp(@0/@1)").CompareTo(name))
return expBasisMinus ;
86 if (!TString(
"exp(-abs(@0)/@1)").CompareTo(name))
return expBasisSum ;
87 if (!TString(
"exp(-@0/@1)*sin(@0*@2)").CompareTo(name))
return sinBasisPlus ;
88 if (!TString(
"exp(@0/@1)*sin(@0*@2)").CompareTo(name))
return sinBasisMinus ;
89 if (!TString(
"exp(-abs(@0)/@1)*sin(@0*@2)").CompareTo(name))
return sinBasisSum ;
90 if (!TString(
"exp(-@0/@1)*cos(@0*@2)").CompareTo(name))
return cosBasisPlus ;
91 if (!TString(
"exp(@0/@1)*cos(@0*@2)").CompareTo(name))
return cosBasisMinus ;
92 if (!TString(
"exp(-abs(@0)/@1)*cos(@0*@2)").CompareTo(name))
return cosBasisSum ;
93 if (!TString(
"(@0/@1)*exp(-@0/@1)").CompareTo(name))
return linBasisPlus ;
94 if (!TString(
"(@0/@1)*(@0/@1)*exp(-@0/@1)").CompareTo(name))
return quadBasisPlus ;
95 if (!TString(
"exp(-@0/@1)*cosh(@0*@2/2)").CompareTo(name))
return coshBasisPlus;
96 if (!TString(
"exp(@0/@1)*cosh(@0*@2/2)").CompareTo(name))
return coshBasisMinus;
97 if (!TString(
"exp(-abs(@0)/@1)*cosh(@0*@2/2)").CompareTo(name))
return coshBasisSum;
98 if (!TString(
"exp(-@0/@1)*sinh(@0*@2/2)").CompareTo(name))
return sinhBasisPlus;
99 if (!TString(
"exp(@0/@1)*sinh(@0*@2/2)").CompareTo(name))
return sinhBasisMinus;
100 if (!TString(
"exp(-abs(@0)/@1)*sinh(@0*@2/2)").CompareTo(name))
return sinhBasisSum;
104 return genericBasis ;
113 void RooTruthModel::changeBasis(RooFormulaVar* inBasis)
121 removeServer(*_basis) ;
127 addServer(*_basis,kTRUE,kFALSE) ;
130 _basisCode = inBasis?basisCode(inBasis->GetTitle()):0 ;
141 Double_t RooTruthModel::evaluate()
const
144 if (_basisCode == noBasis) {
150 if (_basisCode == genericBasis) {
151 return basis().getVal() ;
155 BasisType basisType = (BasisType)( (_basisCode == 0) ? 0 : (_basisCode/10) + 1 );
156 BasisSign basisSign = (BasisSign)( _basisCode - 10*(basisType-1) - 2 ) ;
159 if ((basisSign==Minus && x>0) ||
160 (basisSign==Plus && x<0))
return 0 ;
163 Double_t tau = ((RooAbsReal*)basis().getParameter(1))->getVal() ;
168 return exp(-fabs((Double_t)x)/tau) ;
171 Double_t dm = ((RooAbsReal*)basis().getParameter(2))->getVal() ;
172 return exp(-fabs((Double_t)x)/tau)*sin(x*dm) ;
175 Double_t dm = ((RooAbsReal*)basis().getParameter(2))->getVal() ;
176 return exp(-fabs((Double_t)x)/tau)*cos(x*dm) ;
179 Double_t tscaled = fabs((Double_t)x)/tau;
180 return exp(-tscaled)*tscaled ;
183 Double_t tscaled = fabs((Double_t)x)/tau;
184 return exp(-tscaled)*tscaled*tscaled;
187 Double_t dg = ((RooAbsReal*)basis().getParameter(2))->getVal() ;
188 return exp(-fabs((Double_t)x)/tau)*sinh(x*dg/2) ;
191 Double_t dg = ((RooAbsReal*)basis().getParameter(2))->getVal() ;
192 return exp(-fabs((Double_t)x)/tau)*cosh(x*dg/2) ;
207 Int_t RooTruthModel::getAnalyticalIntegral(RooArgSet& allVars, RooArgSet& analVars,
const char* )
const
213 if (matchArgs(allVars,analVars,convVar()))
return 1 ;
234 if (matchArgs(allVars,analVars,convVar()))
return 1 ;
247 Double_t RooTruthModel::analyticalIntegral(Int_t code,
const char* rangeName)
const
254 if (_basisCode==noBasis)
return 1 ;
257 BasisType basisType = (BasisType)( (_basisCode == 0) ? 0 : (_basisCode/10) + 1 );
258 BasisSign basisSign = (BasisSign)( _basisCode - 10*(basisType-1) - 2 ) ;
261 Double_t tau = ((RooAbsReal*)basis().getParameter(1))->getVal() ;
267 if (tau==0)
return 1 ;
268 if ((basisSign != Minus) && (x.max(rangeName)>0)) {
269 result += tau*(-exp(-x.max(rangeName)/tau) - -exp(-max(0.,x.min(rangeName))/tau) ) ;
271 if ((basisSign != Plus) && (x.min(rangeName)<0)) {
272 result -= tau*(-exp(-max(0.,x.min(rangeName))/tau)) - -tau*exp(-x.max(rangeName)/tau) ;
280 if (tau==0)
return 0 ;
281 Double_t dm = ((RooAbsReal*)basis().getParameter(2))->getVal() ;
282 if (basisSign != Minus) result += exp(-x.max(rangeName)/tau)*(-1/tau*sin(dm*x.max(rangeName)) - dm*cos(dm*x.max(rangeName))) + dm;
283 if (basisSign != Plus) result -= exp( x.min(rangeName)/tau)*(-1/tau*sin(dm*(-x.min(rangeName))) - dm*cos(dm*(-x.min(rangeName)))) + dm ;
284 return result / (1/(tau*tau) + dm*dm) ;
289 if (tau==0)
return 1 ;
290 Double_t dm = ((RooAbsReal*)basis().getParameter(2))->getVal() ;
291 if (basisSign != Minus) result += exp(-x.max(rangeName)/tau)*(-1/tau*cos(dm*x.max(rangeName)) + dm*sin(dm*x.max(rangeName))) + 1/tau ;
292 if (basisSign != Plus) result += exp( x.min(rangeName)/tau)*(-1/tau*cos(dm*(-x.min(rangeName))) + dm*sin(dm*(-x.min(rangeName)))) + 1/tau ;
293 return result / (1/(tau*tau) + dm*dm) ;
297 if (tau==0)
return 0 ;
298 Double_t t_max = x.max(rangeName)/tau ;
299 return tau*( 1 - (1 + t_max)*exp(-t_max) ) ;
303 if (tau==0)
return 0 ;
304 Double_t t_max = x.max(rangeName)/tau ;
305 return tau*( 2 - (2 + (2 + t_max)*t_max)*exp(-t_max) ) ;
310 if (tau==0)
return 0 ;
311 Double_t dg = ((RooAbsReal*)basis().getParameter(2))->getVal() ;
312 Double_t taup = 2*tau/(2-tau*dg);
313 Double_t taum = 2*tau/(2+tau*dg);
314 if (basisSign != Minus) result += 0.5*( taup*(1-exp(-x.max(rangeName)/taup)) - taum*(1-exp(-x.max(rangeName)/taum)) ) ;
315 if (basisSign != Plus) result -= 0.5*( taup*(1-exp( x.min(rangeName)/taup)) - taum*(1-exp( x.min(rangeName)/taum)) ) ;
321 if (tau==0)
return 1 ;
322 Double_t dg = ((RooAbsReal*)basis().getParameter(2))->getVal() ;
323 Double_t taup = 2*tau/(2-tau*dg);
324 Double_t taum = 2*tau/(2+tau*dg);
325 if (basisSign != Minus) result += 0.5*( taup*(1-exp(-x.max(rangeName)/taup)) + taum*(1-exp(-x.max(rangeName)/taum)) ) ;
326 if (basisSign != Plus) result += 0.5*( taup*(1-exp( x.min(rangeName)/taup)) + taum*(1-exp( x.min(rangeName)/taum)) ) ;
340 RooAbsGenContext* RooTruthModel::modelGenContext
341 (
const RooAbsAnaConvPdf& convPdf,
const RooArgSet &vars,
const RooDataSet *prototype,
342 const RooArgSet* auxProto, Bool_t verbose)
const
344 RooArgSet forceDirect(convVar()) ;
345 return new RooGenContext(dynamic_cast<const RooAbsPdf&>(convPdf), vars, prototype,
346 auxProto, verbose, &forceDirect) ;
354 Int_t RooTruthModel::getGenerator(
const RooArgSet& directVars, RooArgSet &generateVars, Bool_t )
const
356 if (matchArgs(directVars,generateVars,x))
return 1 ;
367 void RooTruthModel::generateEvent(Int_t code)