Logo ROOT   6.30.04
Reference Guide
 All Namespaces Files Pages
RooGExpModel.h
Go to the documentation of this file.
1 /*****************************************************************************
2  * Project: RooFit *
3  * Package: RooFitModels *
4  * File: $Id: RooGExpModel.h,v 1.16 2007/05/11 09:13:07 verkerke Exp $
5  * Authors: *
6  * WV, Wouter Verkerke, UC Santa Barbara, verkerke@slac.stanford.edu *
7  * DK, David Kirkby, UC Irvine, dkirkby@uci.edu *
8  * *
9  * Copyright (c) 2000-2005, Regents of the University of California *
10  * and Stanford University. All rights reserved. *
11  * *
12  * Redistribution and use in source and binary forms, *
13  * with or without modification, are permitted according to the terms *
14  * listed in LICENSE (http://roofit.sourceforge.net/license.txt) *
15  *****************************************************************************/
16 #ifndef ROO_GEXP_MODEL
17 #define ROO_GEXP_MODEL
18 
19 #include <cmath>
20 #include <complex>
21 
22 #include "Rtypes.h"
23 #include "RooResolutionModel.h"
24 #include "RooRealProxy.h"
25 #include "RooMath.h"
26 
27 class RooGExpModel : public RooResolutionModel {
28 public:
29 
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} ;
35 
36 
37 
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 };
41 
42  // Constructors, assignment etc
43  inline RooGExpModel() {
44  // coverity[UNINIT_CTOR]
45  }
46  RooGExpModel(const char *name, const char *title, RooRealVar& x,
47  RooAbsReal& sigma, RooAbsReal& rlife,
48  Bool_t nlo=kFALSE, Type type=Normal) ;
49 
50  RooGExpModel(const char *name, const char *title, RooRealVar& x,
51  RooAbsReal& sigma, RooAbsReal& rlife,
52  RooAbsReal& srSF,
53  Bool_t nlo=kFALSE, Type type=Normal) ;
54 
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) ;
59 
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();
63 
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 ;
67 
68  Int_t getGenerator(const RooArgSet& directVars, RooArgSet &generateVars, Bool_t staticInitOK=kTRUE) const;
69  void generateEvent(Int_t code);
70 
71  void advertiseFlatScaleFactorIntegral(Bool_t flag) { _flatSFInt = flag ; }
72 
73  void advertiseAsymptoticIntegral(Bool_t flag) { _asympInt = flag ; } // added FMV,07/24/03
74 
75 protected:
76 
77  Double_t logErfC(Double_t x) const ;
78 
79  //Double_t calcDecayConv(Double_t sign, Double_t tau, Double_t sig, Double_t rtau) const ;
80  Double_t calcDecayConv(Double_t sign, Double_t tau, Double_t sig, Double_t rtau, Double_t fsign) const ;
81  // modified FMV,08/13/03
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 ; // modified FMV,07/24/03
86  Double_t calcSinConvNorm(Double_t sign, Double_t tau,
87  Double_t sig, Double_t rtau, Double_t fsign, const char* rangeName) const ; // added FMV,08/18/03
88  //Double_t calcSinhConv(Double_t sign, Double_t sign1, Double_t sign2, Double_t tau, Double_t dgamma, Double_t sig, Double_t rtau, Double_t fsign) const ;
89  //Double_t calcCoshConv(Double_t sign, Double_t tau, Double_t dgamma, Double_t sig, Double_t rtau, Double_t fsign) const ;
90  virtual Double_t evaluate() const ;
91  static std::complex<Double_t> evalCerfApprox(Double_t swt, Double_t u, Double_t c);
92 
93  // Calculate exp(-u^2) cwerf(swt*c + i(u+c)), taking care of numerical instabilities
94  static inline std::complex<Double_t> evalCerf(Double_t swt, Double_t u, Double_t c)
95  {
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) ;
98  }
99 
100  // Calculate Re(exp(-u^2) cwerf(i(u+c)))
101  // added FMV, 08/17/03
102  inline Double_t evalCerfRe(Double_t u, Double_t c) const {
103  Double_t expArg = u*2*c+c*c ;
104  if (expArg<300) {
105  return exp(expArg) * RooMath::erfc(u+c);
106  } else {
107  return exp(expArg+logErfC(u+c));
108  }
109  }
110 
111  // Calculate common normalization factors
112  // added FMV,07/24/03
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 ;
115 
116  RooRealProxy sigma ;
117  RooRealProxy rlife ;
118  RooRealProxy ssf ;
119  RooRealProxy rsf ;
120  Bool_t _flip ;
121  Bool_t _nlo ;
122  Bool_t _flatSFInt ;
123  Bool_t _asympInt ; // added FMV,07/24/03
124 
125  ClassDef(RooGExpModel,1) // Gauss (x) Exponential resolution model
126 };
127 
128 #endif