00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029 #include "RooFit.h"
00030
00031 #include "Riostream.h"
00032 #include "Riostream.h"
00033 #include "RooTruthModel.h"
00034
00035 ClassImp(RooTruthModel)
00036 ;
00037
00038
00039
00040
00041 RooTruthModel::RooTruthModel(const char *name, const char *title, RooRealVar& xIn) :
00042 RooResolutionModel(name,title,xIn)
00043 {
00044
00045
00046 }
00047
00048
00049
00050
00051 RooTruthModel::RooTruthModel(const RooTruthModel& other, const char* name) :
00052 RooResolutionModel(other,name)
00053 {
00054
00055 }
00056
00057
00058
00059
00060 RooTruthModel::~RooTruthModel()
00061 {
00062
00063 }
00064
00065
00066
00067
00068 Int_t RooTruthModel::basisCode(const char* name) const
00069 {
00070
00071
00072
00073
00074
00075
00076 if (!TString("exp(-@0/@1)").CompareTo(name)) return expBasisPlus ;
00077 if (!TString("exp(@0/@1)").CompareTo(name)) return expBasisMinus ;
00078 if (!TString("exp(-abs(@0)/@1)").CompareTo(name)) return expBasisSum ;
00079 if (!TString("exp(-@0/@1)*sin(@0*@2)").CompareTo(name)) return sinBasisPlus ;
00080 if (!TString("exp(@0/@1)*sin(@0*@2)").CompareTo(name)) return sinBasisMinus ;
00081 if (!TString("exp(-abs(@0)/@1)*sin(@0*@2)").CompareTo(name)) return sinBasisSum ;
00082 if (!TString("exp(-@0/@1)*cos(@0*@2)").CompareTo(name)) return cosBasisPlus ;
00083 if (!TString("exp(@0/@1)*cos(@0*@2)").CompareTo(name)) return cosBasisMinus ;
00084 if (!TString("exp(-abs(@0)/@1)*cos(@0*@2)").CompareTo(name)) return cosBasisSum ;
00085 if (!TString("(@0/@1)*exp(-@0/@1)").CompareTo(name)) return linBasisPlus ;
00086 if (!TString("(@0/@1)*(@0/@1)*exp(-@0/@1)").CompareTo(name)) return quadBasisPlus ;
00087 if (!TString("exp(-@0/@1)*cosh(@0*@2/2)").CompareTo(name)) return coshBasisPlus;
00088 if (!TString("exp(@0/@1)*cosh(@0*@2/2)").CompareTo(name)) return coshBasisMinus;
00089 if (!TString("exp(-abs(@0)/@1)*cosh(@0*@2/2)").CompareTo(name)) return coshBasisSum;
00090 if (!TString("exp(-@0/@1)*sinh(@0*@2/2)").CompareTo(name)) return sinhBasisPlus;
00091 if (!TString("exp(@0/@1)*sinh(@0*@2/2)").CompareTo(name)) return sinhBasisMinus;
00092 if (!TString("exp(-abs(@0)/@1)*sinh(@0*@2/2)").CompareTo(name)) return sinhBasisSum;
00093
00094
00095
00096 return genericBasis ;
00097 }
00098
00099
00100
00101
00102
00103 void RooTruthModel::changeBasis(RooFormulaVar* inBasis)
00104 {
00105
00106
00107
00108
00109
00110
00111
00112 if (_basis) {
00113 removeServer(*_basis) ;
00114 }
00115
00116
00117 _basis = inBasis ;
00118 if (_basis) {
00119 addServer(*_basis,kTRUE,kFALSE) ;
00120 }
00121
00122 _basisCode = inBasis?basisCode(inBasis->GetTitle()):0 ;
00123 }
00124
00125
00126
00127
00128
00129
00130 Double_t RooTruthModel::evaluate() const
00131 {
00132
00133
00134
00135
00136 if (_basisCode == noBasis) {
00137 if (x==0) return 1 ;
00138 return 0 ;
00139 }
00140
00141
00142 if (_basisCode == genericBasis) {
00143 return basis().getVal() ;
00144 }
00145
00146
00147 BasisType basisType = (BasisType)( (_basisCode == 0) ? 0 : (_basisCode/10) + 1 );
00148 BasisSign basisSign = (BasisSign)( _basisCode - 10*(basisType-1) - 2 ) ;
00149
00150
00151 if ((basisSign==Minus && x>0) ||
00152 (basisSign==Plus && x<0)) return 0 ;
00153
00154
00155 Double_t tau = ((RooAbsReal*)basis().getParameter(1))->getVal() ;
00156
00157 switch(basisType) {
00158 case expBasis: {
00159 return exp(-fabs((Double_t)x)/tau) ;
00160 }
00161 case sinBasis: {
00162 Double_t dm = ((RooAbsReal*)basis().getParameter(2))->getVal() ;
00163 return exp(-fabs((Double_t)x)/tau)*sin(x*dm) ;
00164 }
00165 case cosBasis: {
00166 Double_t dm = ((RooAbsReal*)basis().getParameter(2))->getVal() ;
00167 return exp(-fabs((Double_t)x)/tau)*cos(x*dm) ;
00168 }
00169 case linBasis: {
00170 Double_t tscaled = fabs((Double_t)x)/tau;
00171 return exp(-tscaled)*tscaled ;
00172 }
00173 case quadBasis: {
00174 Double_t tscaled = fabs((Double_t)x)/tau;
00175 return exp(-tscaled)*tscaled*tscaled;
00176 }
00177 case sinhBasis: {
00178 Double_t dg = ((RooAbsReal*)basis().getParameter(2))->getVal() ;
00179 return exp(-fabs((Double_t)x)/tau)*sinh(x*dg/2) ;
00180 }
00181 case coshBasis: {
00182 Double_t dg = ((RooAbsReal*)basis().getParameter(2))->getVal() ;
00183 return exp(-fabs((Double_t)x)/tau)*cosh(x*dg/2) ;
00184 }
00185 default:
00186 assert(0) ;
00187 }
00188
00189 return 0 ;
00190 }
00191
00192
00193
00194
00195 Int_t RooTruthModel::getAnalyticalIntegral(RooArgSet& allVars, RooArgSet& analVars, const char* ) const
00196 {
00197
00198
00199
00200 switch(_basisCode) {
00201
00202
00203 case noBasis:
00204 if (matchArgs(allVars,analVars,convVar())) return 1 ;
00205 break ;
00206
00207
00208 case expBasisPlus:
00209 case expBasisMinus:
00210 case expBasisSum:
00211 case sinBasisPlus:
00212 case sinBasisMinus:
00213 case sinBasisSum:
00214 case cosBasisPlus:
00215 case cosBasisMinus:
00216 case cosBasisSum:
00217 case linBasisPlus:
00218 case quadBasisPlus:
00219 case sinhBasisPlus:
00220 case sinhBasisMinus:
00221 case sinhBasisSum:
00222 case coshBasisPlus:
00223 case coshBasisMinus:
00224 case coshBasisSum:
00225 if (matchArgs(allVars,analVars,convVar())) return 1 ;
00226 break ;
00227 }
00228
00229 return 0 ;
00230 }
00231
00232
00233
00234
00235 Double_t RooTruthModel::analyticalIntegral(Int_t code, const char* rangeName) const
00236 {
00237
00238
00239
00240
00241
00242 assert(code==1) ;
00243
00244
00245 if (_basisCode==noBasis) return 1 ;
00246
00247
00248 BasisType basisType = (BasisType)( (_basisCode == 0) ? 0 : (_basisCode/10) + 1 );
00249 BasisSign basisSign = (BasisSign)( _basisCode - 10*(basisType-1) - 2 ) ;
00250
00251
00252 Double_t tau = ((RooAbsReal*)basis().getParameter(1))->getVal() ;
00253 switch (basisType) {
00254 case expBasis:
00255 {
00256 Double_t result(0) ;
00257 if (tau==0) return 1 ;
00258 if (basisSign != Minus) result += tau*(1-exp(-x.max(rangeName)/tau)) ;
00259 if (basisSign != Plus) result += tau*(1-exp(x.min(rangeName)/tau)) ;
00260 return result ;
00261 }
00262 case sinBasis:
00263 {
00264 Double_t result(0) ;
00265 if (tau==0) return 0 ;
00266 Double_t dm = ((RooAbsReal*)basis().getParameter(2))->getVal() ;
00267
00268
00269 if (basisSign != Minus) result += exp(-x.max(rangeName)/tau)*(-1/tau*sin(dm*x.max(rangeName)) - dm*cos(dm*x.max(rangeName))) + dm;
00270 if (basisSign != Plus) result -= exp( x.min(rangeName)/tau)*(-1/tau*sin(dm*(-x.min(rangeName))) - dm*cos(dm*(-x.min(rangeName)))) + dm ;
00271 return result / (1/(tau*tau) + dm*dm) ;
00272 }
00273 case cosBasis:
00274 {
00275 Double_t result(0) ;
00276 if (tau==0) return 1 ;
00277 Double_t dm = ((RooAbsReal*)basis().getParameter(2))->getVal() ;
00278 if (basisSign != Minus) result += exp(-x.max(rangeName)/tau)*(-1/tau*cos(dm*x.max(rangeName)) + dm*sin(dm*x.max(rangeName))) + 1/tau ;
00279
00280 if (basisSign != Plus) result += exp( x.min(rangeName)/tau)*(-1/tau*cos(dm*(-x.min(rangeName))) + dm*sin(dm*(-x.min(rangeName)))) + 1/tau ;
00281 return result / (1/(tau*tau) + dm*dm) ;
00282 }
00283 case linBasis:
00284 {
00285 if (tau==0) return 0 ;
00286 Double_t t_max = x.max(rangeName)/tau ;
00287 return tau*( 1 - (1 + t_max)*exp(-t_max) ) ;
00288 }
00289 case quadBasis:
00290 {
00291 if (tau==0) return 0 ;
00292 Double_t t_max = x.max(rangeName)/tau ;
00293 return tau*( 2 - (2 + (2 + t_max)*t_max)*exp(-t_max) ) ;
00294 }
00295 case sinhBasis:
00296 {
00297 Double_t result(0) ;
00298 if (tau==0) return 0 ;
00299 Double_t dg = ((RooAbsReal*)basis().getParameter(2))->getVal() ;
00300 Double_t taup = 2*tau/(2-tau*dg);
00301 Double_t taum = 2*tau/(2+tau*dg);
00302 if (basisSign != Minus) result += 0.5*( taup*(1-exp(-x.max(rangeName)/taup)) - taum*(1-exp(-x.max(rangeName)/taum)) ) ;
00303 if (basisSign != Plus) result -= 0.5*( taup*(1-exp( x.min(rangeName)/taup)) - taum*(1-exp( x.min(rangeName)/taum)) ) ;
00304 return result ;
00305 }
00306 case coshBasis:
00307 {
00308 Double_t result(0) ;
00309 if (tau==0) return 1 ;
00310 Double_t dg = ((RooAbsReal*)basis().getParameter(2))->getVal() ;
00311 Double_t taup = 2*tau/(2-tau*dg);
00312 Double_t taum = 2*tau/(2+tau*dg);
00313 if (basisSign != Minus) result += 0.5*( taup*(1-exp(-x.max(rangeName)/taup)) + taum*(1-exp(-x.max(rangeName)/taum)) ) ;
00314 if (basisSign != Plus) result += 0.5*( taup*(1-exp( x.min(rangeName)/taup)) + taum*(1-exp( x.min(rangeName)/taum)) ) ;
00315 return result ;
00316 }
00317 default:
00318 assert(0) ;
00319 }
00320
00321 assert(0) ;
00322 return 0 ;
00323 }
00324
00325
00326
00327
00328 Int_t RooTruthModel::getGenerator(const RooArgSet& directVars, RooArgSet &generateVars, Bool_t ) const
00329 {
00330
00331 if (matchArgs(directVars,generateVars,x)) return 1 ;
00332 return 0 ;
00333 }
00334
00335
00336
00337
00338 void RooTruthModel::generateEvent(Int_t code)
00339 {
00340
00341
00342
00343
00344 assert(code==1) ;
00345 Double_t zero(0.) ;
00346 x = zero ;
00347 return;
00348 }