00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016 #ifndef ROO_GEXP_MODEL
00017 #define ROO_GEXP_MODEL
00018
00019 #include "RooResolutionModel.h"
00020 #include "RooRealProxy.h"
00021 #include "RooComplex.h"
00022 #include "RooMath.h"
00023
00024 class RooGExpModel : public RooResolutionModel {
00025 public:
00026
00027 enum RooGExpBasis { noBasis=0, expBasisMinus= 1, expBasisSum= 2, expBasisPlus= 3,
00028 sinBasisMinus=11, sinBasisSum=12, sinBasisPlus=13,
00029 cosBasisMinus=21, cosBasisSum=22, cosBasisPlus=23,
00030 sinhBasisMinus=31,sinhBasisSum=32,sinhBasisPlus=33,
00031 coshBasisMinus=41,coshBasisSum=42,coshBasisPlus=43} ;
00032
00033
00034
00035 enum BasisType { none=0, expBasis=1, sinBasis=2, cosBasis=3, sinhBasis=4, coshBasis=5 } ;
00036 enum BasisSign { Both=0, Plus=+1, Minus=-1 } ;
00037 enum Type { Normal, Flipped };
00038
00039
00040 inline RooGExpModel() {
00041
00042 }
00043 RooGExpModel(const char *name, const char *title, RooRealVar& x,
00044 RooAbsReal& sigma, RooAbsReal& rlife,
00045 Bool_t nlo=kFALSE, Type type=Normal) ;
00046
00047 RooGExpModel(const char *name, const char *title, RooRealVar& x,
00048 RooAbsReal& sigma, RooAbsReal& rlife,
00049 RooAbsReal& srSF,
00050 Bool_t nlo=kFALSE, Type type=Normal) ;
00051
00052 RooGExpModel(const char *name, const char *title, RooRealVar& x,
00053 RooAbsReal& sigma, RooAbsReal& rlife,
00054 RooAbsReal& sigmaSF, RooAbsReal& rlifeSF,
00055 Bool_t nlo=kFALSE, Type type=Normal) ;
00056
00057 RooGExpModel(const RooGExpModel& other, const char* name=0);
00058 virtual TObject* clone(const char* newname) const { return new RooGExpModel(*this,newname) ; }
00059 virtual ~RooGExpModel();
00060
00061 virtual Int_t basisCode(const char* name) const ;
00062 virtual Int_t getAnalyticalIntegral(RooArgSet& allVars, RooArgSet& analVars, const char* rangeName=0) const ;
00063 virtual Double_t analyticalIntegral(Int_t code, const char* rangeName=0) const ;
00064
00065 Int_t getGenerator(const RooArgSet& directVars, RooArgSet &generateVars, Bool_t staticInitOK=kTRUE) const;
00066 void generateEvent(Int_t code);
00067
00068 void advertiseFlatScaleFactorIntegral(Bool_t flag) { _flatSFInt = flag ; }
00069
00070 void advertiseAsymptoticIntegral(Bool_t flag) { _asympInt = flag ; }
00071
00072 protected:
00073
00074 Double_t logErfC(Double_t x) const ;
00075
00076
00077 Double_t calcDecayConv(Double_t sign, Double_t tau, Double_t sig, Double_t rtau, Double_t fsign) const ;
00078
00079 RooComplex calcSinConv(Double_t sign, Double_t sig, Double_t tau, Double_t omega, Double_t rtau, Double_t fsign) const ;
00080 Double_t calcSinConv(Double_t sign, Double_t sig, Double_t tau, Double_t rtau, Double_t fsign) const ;
00081 RooComplex calcSinConvNorm(Double_t sign, Double_t tau, Double_t omega,
00082 Double_t sig, Double_t rtau, Double_t fsign, const char* rangeName) const ;
00083 Double_t calcSinConvNorm(Double_t sign, Double_t tau,
00084 Double_t sig, Double_t rtau, Double_t fsign, const char* rangeName) const ;
00085
00086
00087 virtual Double_t evaluate() const ;
00088 RooComplex evalCerfApprox(Double_t swt, Double_t u, Double_t c) const ;
00089
00090
00091 inline RooComplex evalCerf(Double_t swt, Double_t u, Double_t c) const {
00092 RooComplex z(swt*c,u+c);
00093 return (z.im()>-4.0) ? RooMath::FastComplexErrFunc(z)*exp(-u*u) : evalCerfApprox(swt,u,c) ;
00094 }
00095
00096
00097 inline Double_t evalCerfRe(Double_t swt, Double_t u, Double_t c) const {
00098 RooComplex z(swt*c,u+c);
00099 return (z.im()>-4.0) ? RooMath::FastComplexErrFuncRe(z)*exp(-u*u) : evalCerfApprox(swt,u,c).re() ;
00100 }
00101
00102
00103 inline Double_t evalCerfIm(Double_t swt, Double_t u, Double_t c) const {
00104 RooComplex z(swt*c,u+c);
00105 return (z.im()>-4.0) ? RooMath::FastComplexErrFuncIm(z)*exp(-u*u) : evalCerfApprox(swt,u,c).im() ;
00106 }
00107
00108
00109
00110 inline Double_t evalCerfRe(Double_t u, Double_t c) const {
00111 Double_t expArg = u*2*c+c*c ;
00112 if (expArg<300) {
00113 return exp(expArg) * RooMath::erfc(u+c);
00114 } else {
00115 return exp(expArg+logErfC(u+c));
00116 }
00117 }
00118
00119
00120
00121 RooComplex evalCerfInt(Double_t sign, Double_t wt, Double_t tau, Double_t umin, Double_t umax, Double_t c) const ;
00122 Double_t evalCerfInt(Double_t sign, Double_t tau, Double_t umin, Double_t umax, Double_t c) const ;
00123
00124 RooRealProxy sigma ;
00125 RooRealProxy rlife ;
00126 RooRealProxy ssf ;
00127 RooRealProxy rsf ;
00128 Bool_t _flip ;
00129 Bool_t _nlo ;
00130 Bool_t _flatSFInt ;
00131 Bool_t _asympInt ;
00132
00133 ClassDef(RooGExpModel,1)
00134 };
00135
00136 #endif
00137
00138
00139
00140
00141