16 #ifndef ROO_GEXP_MODEL
17 #define ROO_GEXP_MODEL
27 class RooGExpModel :
public RooResolutionModel {
30 enum RooGExpBasis { noBasis=0, expBasisMinus= 1, expBasisSum= 2, expBasisPlus= 3,
31 sinBasisMinus=11, sinBasisSum=12, sinBasisPlus=13,
32 cosBasisMinus=21, cosBasisSum=22, cosBasisPlus=23,
33 sinhBasisMinus=31,sinhBasisSum=32,sinhBasisPlus=33,
34 coshBasisMinus=41,coshBasisSum=42,coshBasisPlus=43} ;
38 enum BasisType { none=0, expBasis=1, sinBasis=2, cosBasis=3, sinhBasis=4, coshBasis=5 } ;
39 enum BasisSign { Both=0, Plus=+1, Minus=-1 } ;
40 enum Type { Normal, Flipped };
43 inline RooGExpModel() {
46 RooGExpModel(
const char *name,
const char *title, RooRealVar& x,
47 RooAbsReal& sigma, RooAbsReal& rlife,
48 Bool_t nlo=kFALSE, Type type=Normal) ;
50 RooGExpModel(
const char *name,
const char *title, RooRealVar& x,
51 RooAbsReal& sigma, RooAbsReal& rlife,
53 Bool_t nlo=kFALSE, Type type=Normal) ;
55 RooGExpModel(
const char *name,
const char *title, RooRealVar& x,
56 RooAbsReal& sigma, RooAbsReal& rlife,
57 RooAbsReal& sigmaSF, RooAbsReal& rlifeSF,
58 Bool_t nlo=kFALSE, Type type=Normal) ;
60 RooGExpModel(
const RooGExpModel& other,
const char* name=0);
61 virtual TObject* clone(
const char* newname)
const {
return new RooGExpModel(*
this,newname) ; }
62 virtual ~RooGExpModel();
64 virtual Int_t basisCode(
const char* name)
const ;
65 virtual Int_t getAnalyticalIntegral(RooArgSet& allVars, RooArgSet& analVars,
const char* rangeName=0)
const ;
66 virtual Double_t analyticalIntegral(Int_t code,
const char* rangeName=0)
const ;
68 Int_t getGenerator(
const RooArgSet& directVars, RooArgSet &generateVars, Bool_t staticInitOK=kTRUE)
const;
69 void generateEvent(Int_t code);
71 void advertiseFlatScaleFactorIntegral(Bool_t flag) { _flatSFInt = flag ; }
73 void advertiseAsymptoticIntegral(Bool_t flag) { _asympInt = flag ; }
77 Double_t logErfC(Double_t x)
const ;
80 Double_t calcDecayConv(Double_t sign, Double_t tau, Double_t sig, Double_t rtau, Double_t fsign)
const ;
82 std::complex<Double_t> calcSinConv(Double_t sign, Double_t sig, Double_t tau, Double_t omega, Double_t rtau, Double_t fsign)
const ;
83 Double_t calcSinConv(Double_t sign, Double_t sig, Double_t tau, Double_t rtau, Double_t fsign)
const ;
84 std::complex<Double_t> calcSinConvNorm(Double_t sign, Double_t tau, Double_t omega,
85 Double_t sig, Double_t rtau, Double_t fsign,
const char* rangeName)
const ;
86 Double_t calcSinConvNorm(Double_t sign, Double_t tau,
87 Double_t sig, Double_t rtau, Double_t fsign,
const char* rangeName)
const ;
90 virtual Double_t evaluate()
const ;
91 static std::complex<Double_t> evalCerfApprox(Double_t swt, Double_t u, Double_t c);
94 static inline std::complex<Double_t> evalCerf(Double_t swt, Double_t u, Double_t c)
96 std::complex<Double_t> z(swt*c,u+c);
97 return (z.imag()>-4.0) ? RooMath::faddeeva_fast(z)*std::exp(-u*u) : evalCerfApprox(swt,u,c) ;
102 inline Double_t evalCerfRe(Double_t u, Double_t c)
const {
103 Double_t expArg = u*2*c+c*c ;
105 return exp(expArg) * RooMath::erfc(u+c);
107 return exp(expArg+logErfC(u+c));
113 std::complex<Double_t> evalCerfInt(Double_t sign, Double_t wt, Double_t tau, Double_t umin, Double_t umax, Double_t c)
const ;
114 Double_t evalCerfInt(Double_t sign, Double_t tau, Double_t umin, Double_t umax, Double_t c)
const ;
125 ClassDef(RooGExpModel,1)