RooGExpModel.h

Go to the documentation of this file.
00001 /*****************************************************************************
00002  * Project: RooFit                                                           *
00003  * Package: RooFitModels                                                     *
00004  *    File: $Id: RooGExpModel.h,v 1.16 2007/05/11 09:13:07 verkerke Exp $
00005  * Authors:                                                                  *
00006  *   WV, Wouter Verkerke, UC Santa Barbara, verkerke@slac.stanford.edu       *
00007  *   DK, David Kirkby,    UC Irvine,         dkirkby@uci.edu                 *
00008  *                                                                           *
00009  * Copyright (c) 2000-2005, Regents of the University of California          *
00010  *                          and Stanford University. All rights reserved.    *
00011  *                                                                           *
00012  * Redistribution and use in source and binary forms,                        *
00013  * with or without modification, are permitted according to the terms        *
00014  * listed in LICENSE (http://roofit.sourceforge.net/license.txt)             *
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   // Constructors, assignment etc
00040   inline RooGExpModel() { 
00041     // coverity[UNINIT_CTOR]
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 ; }  // added FMV,07/24/03
00071 
00072 protected:
00073 
00074   Double_t logErfC(Double_t x) const ;
00075 
00076   //Double_t calcDecayConv(Double_t sign, Double_t tau, Double_t sig, Double_t rtau) const ;
00077   Double_t calcDecayConv(Double_t sign, Double_t tau, Double_t sig, Double_t rtau, Double_t fsign) const ;  
00078         // modified FMV,08/13/03
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 ; // modified FMV,07/24/03
00083   Double_t calcSinConvNorm(Double_t sign, Double_t tau, 
00084         Double_t sig, Double_t rtau, Double_t fsign, const char* rangeName) const ; // added FMV,08/18/03
00085   //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 ;
00086   //Double_t calcCoshConv(Double_t sign, Double_t tau, Double_t dgamma, Double_t sig, Double_t rtau, Double_t fsign) const ;
00087   virtual Double_t evaluate() const ;
00088   RooComplex evalCerfApprox(Double_t swt, Double_t u, Double_t c) const ;
00089 
00090   // Calculate exp(-u^2) cwerf(swt*c + i(u+c)), taking care of numerical instabilities
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   // Calculate Re(exp(-u^2) cwerf(swt*c + i(u+c))), taking care of numerical instabilities
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   // Calculate Im(exp(-u^2) cwerf(swt*c + i(u+c))), taking care of numerical instabilities
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   // Calculate Re(exp(-u^2) cwerf(i(u+c)))
00109   // added FMV, 08/17/03
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   // Calculate common normalization factors 
00120   // added FMV,07/24/03
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 ;  // added FMV,07/24/03
00132 
00133   ClassDef(RooGExpModel,1) // Gauss (x) Expontial resolution model
00134 };
00135 
00136 #endif
00137 
00138 
00139 
00140 
00141 

Generated on Tue Jul 5 14:26:11 2011 for ROOT_528-00b_version by  doxygen 1.5.1