RooGaussModel.h

Go to the documentation of this file.
00001 /*****************************************************************************
00002  * Project: RooFit                                                           *
00003  * Package: RooFitModels                                                     *
00004  *    File: $Id: RooGaussModel.h,v 1.21 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_GAUSS_MODEL
00017 #define ROO_GAUSS_MODEL
00018 
00019 #include "RooResolutionModel.h"
00020 #include "RooRealProxy.h"
00021 #include "RooComplex.h"
00022 #include "RooMath.h"
00023 
00024 class RooGaussModel : public RooResolutionModel {
00025 public:
00026 
00027   enum RooGaussBasis { noBasis=0, expBasisMinus= 1, expBasisSum= 2, expBasisPlus= 3,
00028                                   sinBasisMinus=11, sinBasisSum=12, sinBasisPlus=13,
00029                                   cosBasisMinus=21, cosBasisSum=22, cosBasisPlus=23,
00030                                                                     linBasisPlus=33,
00031                                                                    quadBasisPlus=43, 
00032                                   coshBasisMinus=51,coshBasisSum=52,coshBasisPlus=53,
00033                                   sinhBasisMinus=61,sinhBasisSum=62,sinhBasisPlus=63};
00034   enum BasisType { none=0, expBasis=1, sinBasis=2, cosBasis=3,
00035                    linBasis=4, quadBasis=5, coshBasis=6, sinhBasis=7 } ;
00036   enum BasisSign { Both=0, Plus=+1, Minus=-1 } ;
00037 
00038   // Constructors, assignment etc
00039   inline RooGaussModel() : _flatSFInt(kFALSE), _asympInt(kFALSE) { }
00040   RooGaussModel(const char *name, const char *title, RooRealVar& x, 
00041                 RooAbsReal& mean, RooAbsReal& sigma) ; 
00042   RooGaussModel(const char *name, const char *title, RooRealVar& x, 
00043                 RooAbsReal& mean, RooAbsReal& sigma, RooAbsReal& msSF) ; 
00044   RooGaussModel(const char *name, const char *title, RooRealVar& x, 
00045                 RooAbsReal& mean, RooAbsReal& sigma, RooAbsReal& meanSF, RooAbsReal& sigmaSF) ; 
00046   RooGaussModel(const RooGaussModel& other, const char* name=0);
00047   virtual TObject* clone(const char* newname) const { return new RooGaussModel(*this,newname) ; }
00048   virtual ~RooGaussModel();
00049   
00050   virtual Int_t basisCode(const char* name) const ;
00051   virtual Int_t getAnalyticalIntegral(RooArgSet& allVars, RooArgSet& analVars, const char* rangeName=0) const ;
00052   virtual Double_t analyticalIntegral(Int_t code, const char* rangeName) const ;
00053 
00054   Int_t getGenerator(const RooArgSet& directVars, RooArgSet &generateVars, Bool_t staticInitOK=kTRUE) const;
00055   void generateEvent(Int_t code);
00056 
00057   void advertiseFlatScaleFactorIntegral(Bool_t flag) { _flatSFInt = flag ; }
00058 
00059   void advertiseAymptoticIntegral(Bool_t flag) { _asympInt = flag ; }  // added FMV,07/24/03
00060 
00061 protected:
00062 
00063   virtual Double_t evaluate() const ;
00064   RooComplex evalCerfApprox(Double_t swt, Double_t u, Double_t c) const ;
00065 
00066   // Calculate exp(-u^2) cwerf(swt*c + i(u+c)), taking care of numerical instabilities
00067   inline RooComplex evalCerf(Double_t swt, Double_t u, Double_t c) const {
00068     RooComplex z(swt*c,u+c);
00069     return (z.im()>-4.0) ? RooMath::FastComplexErrFunc(z)*exp(-u*u) : evalCerfApprox(swt,u,c) ;
00070   }
00071     
00072   // Calculate Re(exp(-u^2) cwerf(swt*c + i(u+c))), taking care of numerical instabilities
00073   inline Double_t evalCerfRe(Double_t swt, Double_t u, Double_t c) const {
00074     RooComplex z(swt*c,u+c);
00075     return (z.im()>-4.0) ? RooMath::FastComplexErrFuncRe(z)*exp(-u*u) : evalCerfApprox(swt,u,c).re() ;
00076   }
00077   
00078   // Calculate Im(exp(-u^2) cwerf(swt*c + i(u+c))), taking care of numerical instabilities
00079   inline Double_t evalCerfIm(Double_t swt, Double_t u, Double_t c) const {
00080     RooComplex z(swt*c,u+c);
00081     return (z.im()>-4.0) ? RooMath::FastComplexErrFuncIm(z)*exp(-u*u) : evalCerfApprox(swt,u,c).im() ;
00082   }
00083 
00084   // Calculate Re(exp(-u^2) cwerf(i(u+c)))
00085   // added FMV, 08/17/03
00086   inline Double_t evalCerfRe(Double_t u, Double_t c) const {
00087     return exp(u*2*c+c*c) * RooMath::erfc(u+c);
00088   }
00089 
00090   // Calculate common normalization factors 
00091   // added FMV,07/24/03
00092   RooComplex evalCerfInt(Double_t sign, Double_t wt, Double_t tau, Double_t umin, Double_t umax, Double_t c) const ;
00093   Double_t evalCerfInt(Double_t sign, Double_t tau, Double_t umin, Double_t umax, Double_t c) const ;
00094 
00095   Bool_t _flatSFInt ;
00096 
00097   Bool_t _asympInt ;  // added FMV,07/24/03
00098   
00099   RooRealProxy mean ;
00100   RooRealProxy sigma ;
00101   RooRealProxy msf ;
00102   RooRealProxy ssf ;
00103 
00104   ClassDef(RooGaussModel,1) // Gaussian Resolution Model
00105 };
00106 
00107 #endif
00108 
00109 
00110 
00111 
00112 
00113 
00114 
00115 
00116 

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