Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2026-08-06 09:38:31

0001 // -*- C++ -*-
0002 //
0003 // StandardModelBase.h is a part of ThePEG - Toolkit for HEP Event Generation
0004 // Copyright (C) 1999-2019 Leif Lonnblad
0005 //
0006 // ThePEG is licenced under version 3 of the GPL, see COPYING for details.
0007 // Please respect the MCnet academic guidelines, see GUIDELINES for details.
0008 //
0009 #ifndef ThePEG_StandardModelBase_H
0010 #define ThePEG_StandardModelBase_H
0011 // This is the declaration of the StandardModelBase class.
0012 
0013 #include "ThePEG/Config/ThePEG.h"
0014 #include "AlphaEMBase.h"
0015 #include "CKMBase.h"
0016 #include "AlphaSBase.h"
0017 // #include "StandardModelBase.fh"
0018 // #include "StandardModelBase.xh"
0019 
0020 namespace ThePEG {
0021 
0022 /**
0023  * StandardModelBase is used to handle standard model parameters in an
0024  * EventGenerator. It uses AlphaEMBase, AlphaSBase and CKMBase to help
0025  * with the implementation of the electro-magnetic and QCD couplings
0026  * and the flavour mixing matrix. This means that StandardModelBase
0027  * does not need to be inherited from when it comes to standard model
0028  * parameters. Beyond the standard model parameters should be
0029  * implemented as sub-classes.
0030  *
0031  * @see \ref StandardModelBaseInterfaces "The interfaces"
0032  * defined for StandardModelBase.
0033  * @see EventGenerator
0034  * @see AlphaEMBase
0035  * @see AlphaSBase
0036  * @see CKMBase
0037  */
0038 class StandardModelBase: public Interfaced {
0039 
0040   /** Declare a pointer to an AlphaEMBase object. */
0041   typedef Ptr<AlphaEMBase>::pointer AEMPtr;
0042   /** Declare a pointer to an AlphaSBase object. */
0043   typedef Ptr<AlphaSBase>::pointer ASPtr;
0044   /** Declare a pointer to n CKMBase object. */
0045   typedef Ptr<CKMBase>::pointer CKMPtr;
0046   /** Declare a transient pointer to an AlphaEMBase object. */
0047   typedef Ptr<AlphaEMBase>::transient_pointer tAEMPtr;
0048   /** Declare a transient pointer to an AlphaSBase object. */
0049   typedef Ptr<AlphaSBase>::transient_pointer tASPtr;
0050   /** Declare a transient pointer to a CKMBase object. */
0051   typedef Ptr<CKMBase>::transient_pointer tCKMPtr;
0052 
0053 public:
0054 
0055   /** @name Standard constructors and destructors. */
0056   //@{
0057   /**
0058    * Default constructor.
0059    */
0060   StandardModelBase();
0061 
0062   /**
0063    * Destructor.
0064    */
0065   virtual ~StandardModelBase();
0066   //@}
0067 
0068 public:
0069 
0070   /**
0071    * Return the number of families assumed in the standard model.
0072    */
0073   unsigned int families() const { return theFamilies; }
0074 
0075 public:
0076 
0077 
0078   /** @name Functions accessing electro-weak parameters. */
0079   /**
0080    *  Return the electroweak scheme used
0081    */
0082   unsigned int ewScheme() const { return theElectroWeakScheme; }
0083 
0084   /**
0085    *  Set the electroweak scheme used
0086    */
0087   void ewScheme(unsigned int s) { theElectroWeakScheme = s; }
0088 
0089   //@{
0090   /**
0091    * Constant \f$\alpha_{EM}(q^2=0)\f$.
0092    */
0093   double alphaEM() const { return theAlphaEM; }
0094 
0095   /**
0096    * Constant \f$\alpha_{EM}(q^2=m_Z^2)\f$.
0097    */
0098   double alphaEMMZ() const { return theAlphaEMMZ; }
0099 
0100   /**
0101    *  The electromagnetic coupling for vertex classes
0102    *  in a well defined self-consistent EW scheme if requested
0103    */
0104   double alphaEMME(Energy2 scale) const {
0105     if(theElectroWeakScheme==0)
0106       return alphaEM(scale);
0107     else if(scale>1e-6*GeV2)
0108       return theAlphaEMMZ;
0109     else
0110       return theAlphaEM;
0111   }
0112 
0113   /**
0114    * Running \f$\alpha_{EM}\f$.
0115    */
0116   double alphaEM(Energy2 scale) const {
0117     return theRunningAlphaEM->value(scale, *this);
0118   }
0119 
0120   /**
0121    * Return a pointer to the object handling \f$\alpha_{EM}\f$.
0122    */
0123   tAEMPtr alphaEMPtr() const { return theRunningAlphaEM; }
0124 
0125   /**
0126    * Return \f$\sin^2(\theta_W)\f$.
0127    */
0128   double sin2ThetaW() const { return theSin2ThetaW; }
0129 
0130   /**
0131    *  The Fermi constant
0132    */
0133   InvEnergy2 fermiConstant() const {return theGF;}
0134 
0135   /**
0136    * The neutrino-photon coupling.
0137    */
0138   double enu() const { return theEnu; }
0139 
0140   /**
0141    * The charged lepton-photon coupling.
0142    */
0143   double ee() const { return theEe; }
0144 
0145   /**
0146    * The up-type-photon coupling.
0147    */
0148   double eu() const { return theEu; }
0149 
0150   /**
0151    * The down-type-photon coupling.
0152    */
0153   double ed() const { return theEd; }
0154 
0155   /**
0156    * The vector neutrino-\f$Z^0\f$ coupling.
0157    */
0158   double vnu() const { return theVnu; }
0159 
0160   /**
0161    * The vector charged lepton-\f$Z^0\f$ coupling.
0162    */
0163   double ve() const { return theVe; }
0164 
0165   /**
0166    * The vector up-type-\f$Z^0\f$ coupling.
0167    */
0168   double vu() const { return theVu; }
0169 
0170   /**
0171    * The vector down-type-\f$Z^0\f$ coupling.
0172    */
0173   double vd() const { return theVd; }
0174 
0175   /**
0176    * The axial neutrino-\f$Z^0\f$ coupling.
0177    */
0178   double anu() const { return theAnu; }
0179 
0180   /**
0181    * The axial charged lepton-\f$Z^0\f$ coupling.
0182    */
0183   double ae() const { return theAe; }
0184 
0185   /**
0186    * The axial up-type-\f$Z^0\f$ coupling.
0187    */
0188   double au() const { return theAu; }
0189 
0190   /**
0191    * The axial down-type-\f$Z^0\f$ coupling.
0192    */
0193   double ad() const { return theAd; }
0194 
0195   /**
0196    * Return a pointer to the CKMBase object used.
0197    */
0198   tCKMPtr CKM() const { return theCKM; }
0199 
0200   /**
0201    * Return a square of the element of the Cabibbo-Kobayashi-Maskawa
0202    * Matrix. The fatrix element for the \a uf up-type family and \a df
0203    * down-type family.
0204    */
0205   double CKM(unsigned int uf, unsigned int df) const;
0206 
0207   /**
0208    * Return the square of the elements of the Cabibbo-Kobayashi-Maskawa
0209    * Matrix.
0210    */
0211   double CKM(const ParticleData & uType,
0212             const ParticleData & dType) const;
0213   //@}
0214 
0215 public:
0216 
0217   /** @name Functions accessing QCD parameters. */
0218   //@{
0219   /**
0220    * Return the number of colours.
0221    */
0222   unsigned int Nc() const { return theNc; }
0223 
0224   /**
0225    * Return the number of avtive quark flavours for a given \a scale.
0226    */
0227   unsigned int Nf(Energy2 scale) const {
0228     return theRunningAlphaS->Nf(scale);
0229   }
0230 
0231   /**
0232    * Return the constant strong coupling constant.
0233    */
0234   double alphaS() const { return theAlphaS; }
0235 
0236   /**
0237    * Return the running strong coupling for a given \a scale
0238    */
0239   double alphaS(Energy2 scale) const {
0240     return theRunningAlphaS->value(scale, *this);
0241   }
0242 
0243   /**
0244    * Return a pointer to the object handling \f$\alpha_S\f$.
0245    */
0246   tASPtr alphaSPtr() const {
0247     return theRunningAlphaS;
0248   }
0249 
0250   /**
0251    * Return the \f$\Lambda_{QCD}\f$ for \a nflav active flavours.
0252    */
0253   Energy LambdaQCD(unsigned int nflav) const {
0254     return theRunningAlphaS->LambdaQCD(nflav);
0255   }
0256 
0257   /**
0258    * Return the \f$\Lambda_{QCD}\f$ for the given \a scale.
0259    */
0260   Energy LambdaQCD(Energy2 scale) const { return LambdaQCD(Nf(scale)); }
0261   //@}
0262 
0263 public:
0264 
0265 
0266   /** @name Functions used by the persistent I/O system. */
0267   //@{
0268   /**
0269    * Function used to write out object persistently.
0270    * @param os the persistent output stream written to.
0271    */
0272   void persistentOutput(PersistentOStream & os) const;
0273 
0274   /**
0275    * Function used to read in object persistently.
0276    * @param is the persistent input stream read from.
0277    * @param version the version number of the object when written.
0278    */
0279   void persistentInput(PersistentIStream & is, int version);
0280   //@}
0281 
0282   /**
0283    * Standard Init function used to initialize the interface.
0284    */
0285   static void Init();
0286 
0287   /**
0288    * Overloaded function from Interfaced
0289    */
0290   virtual bool preInitialize() const {
0291     return true;
0292   }
0293 
0294 protected:
0295 
0296   /** @name Clone Methods. */
0297   //@{
0298   /**
0299    * Make a simple clone of this object.
0300    * @return a pointer to the new object.
0301    */
0302   virtual IBPtr clone() const;
0303 
0304   /** Make a clone of this object, possibly modifying the cloned object
0305    * to make it sane.
0306    * @return a pointer to the new object.
0307    */
0308   virtual IBPtr fullclone() const;
0309   //@}
0310 
0311 
0312 protected:
0313 
0314   /** @name Standard Interfaced functions. */
0315   //@{
0316 
0317   /**
0318    * Initialize this object after the setup phase before saving an
0319    * EventGenerator to disk.
0320    * @throws InitException if object could not be initialized properly.
0321    */
0322   virtual void doinit();
0323   //@}
0324 
0325 private:
0326 
0327   /**
0328    * The number of families.
0329    */
0330   unsigned int theFamilies;
0331 
0332   /**
0333    * The constant \f$\alpha_{EM}\f$.
0334    */
0335   double theAlphaEM;
0336 
0337   /**
0338    * The constant \f$\alpha_{EM}\f$.
0339    */
0340   double theAlphaEMMZ;
0341 
0342   /**
0343    * Pointer to an object capable of calculating the running
0344    * \f$\alpha_{EM}\f$.
0345    */
0346   AEMPtr theRunningAlphaEM;
0347 
0348   /**
0349    * The \f$\sin^2(\theta_W)\f$
0350    */
0351   double theSin2ThetaW;
0352 
0353   /**
0354    * The Fermi contants \f$G_F\f$
0355    */
0356   InvEnergy2 theGF;
0357 
0358   /**
0359    * Coupling between a fundamental fermion and the photon.
0360    */
0361   double theEnu;
0362 
0363   /**
0364    * Coupling between a fundamental fermion and the photon.
0365    */
0366   double theEe;
0367 
0368   /**
0369    * Coupling between a fundamental fermion and the photon.
0370    */
0371   double theEu;
0372 
0373   /**
0374    * Coupling between a fundamental fermion and the photon.
0375    */
0376   double theEd;
0377 
0378   /**
0379    * Vector coupling between a fundamental fermion and Z^0.
0380    */
0381   double theVnu;
0382 
0383   /**
0384    * Vector coupling between a fundamental fermion and Z^0.
0385    */
0386   double theVe;
0387 
0388   /**
0389    * Vector coupling between a fundamental fermion and Z^0.
0390    */
0391   double theVu;
0392 
0393   /**
0394    * Vector coupling between a fundamental fermion and Z^0.
0395    */
0396   double theVd;
0397 
0398   /**
0399    * Axial coupling between a fundamental fermions and Z^0.
0400    */
0401   double theAnu;
0402 
0403   /**
0404    * Axial coupling between a fundamental fermions and Z^0.
0405    */
0406   double theAe;
0407 
0408   /**
0409    * Axial coupling between a fundamental fermions and Z^0.
0410    */
0411   double theAu;
0412 
0413   /**
0414    * Axial coupling between a fundamental fermions and Z^0.
0415    */
0416   double theAd;
0417 
0418   /**
0419    * If true, the electro-weak couplings are derived from
0420    * \f$\theta_W\f$ in the initialization.
0421    */
0422   long recalculateEW;
0423 
0424   /**
0425    * A pointer to an object representing the Cabibbo-Kobayashi-Maskawa
0426    * matrix.
0427    */
0428   CKMPtr theCKM;
0429 
0430   /**
0431    * The matrix of squared CKM elements set from theCKM at initialization.
0432    */
0433   mutable vector< vector<double> > theCKM2Matrix;
0434 
0435   /**
0436    * The number of colours;
0437    */
0438   unsigned int theNc;
0439 
0440   /**
0441    * The fixed strong coupling.
0442    */
0443   double theAlphaS;
0444 
0445   /**
0446    * Pointer to an object capable of calculating the running
0447    * \f$\alpha_{S}\f$.
0448    */
0449   ASPtr theRunningAlphaS;
0450 
0451   /**
0452    *  Electroweak scheme
0453    */
0454   unsigned int theElectroWeakScheme;
0455 
0456   /**
0457    *  Option for the calculation of the W/Z widths
0458    */
0459   unsigned int theBosonWidthOption;
0460 
0461 private:
0462 
0463   /**
0464    * Describe a concrete class with persistent data.
0465    */
0466   static ClassDescription<StandardModelBase> initStandardModelBase;
0467 
0468   /**
0469    *  Private and non-existent assignment operator.
0470    */
0471   StandardModelBase & operator=(const StandardModelBase &) = delete;
0472 
0473 };
0474 
0475 /** @cond TRAITSPECIALIZATIONS */
0476 
0477 /** This template specialization informs ThePEG about the base classes
0478  *  of StandardModelBase. */
0479 template <>
0480 struct BaseClassTrait<StandardModelBase,1>: public ClassTraitsType {
0481   /** Typedef of the first base class of StandardModelBase. */
0482   typedef Interfaced NthBase;
0483 };
0484 
0485 /** This template specialization informs ThePEG about the name of the
0486  *  StandardModelBase class. */
0487 template <>
0488 struct ClassTraits<StandardModelBase>:
0489     public ClassTraitsBase<StandardModelBase> {
0490   /** Return a platform-independent class name */
0491   static string className() { return "ThePEG::StandardModelBase"; }
0492 };
0493 
0494 /** @endcond */
0495 
0496 }
0497 
0498 #endif /* ThePEG_StandardModelBase_H */