Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2026-08-06 09:24:02

0001 // -*- C++ -*-
0002 //
0003 // SMHiggsFermionsDecayer.h is a part of Herwig - A multi-purpose Monte Carlo event generator
0004 // Copyright (C) 2002-2019 The Herwig Collaboration
0005 //
0006 // Herwig 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 HERWIG_SMHiggsFermionsDecayer_H
0010 #define HERWIG_SMHiggsFermionsDecayer_H
0011 //
0012 // This is the declaration of the SMHiggsFermionsDecayer class.
0013 //
0014 
0015 #include "Herwig/Decay/PerturbativeDecayer.h"
0016 #include "ThePEG/Helicity/Vertex/AbstractFFSVertex.h"
0017 #include "Herwig/Decay/PhaseSpaceMode.h"
0018 
0019 namespace Herwig {
0020 using namespace ThePEG;
0021 
0022 /**
0023  * The SMHiggsFermionsDecayer class is designed to decay the Standard Model Higgs
0024  * to the Standard Model fermions.
0025  *
0026  * @see PerturbativeDecayer
0027  */
0028 class SMHiggsFermionsDecayer: public PerturbativeDecayer {
0029 
0030 public:
0031 
0032   /**
0033    * The default constructor.
0034    */
0035   SMHiggsFermionsDecayer();
0036   
0037   /**
0038    * Which of the possible decays is required
0039    */
0040   virtual int modeNumber(bool & , tcPDPtr , const tPDVector & ) const {return -1;}
0041 
0042   /**
0043    * Check if this decayer can perfom the decay for a particular mode.
0044    * Uses the modeNumber member but can be overridden
0045    * @param parent The decaying particle
0046    * @param children The decay products
0047    */
0048   virtual bool accept(tcPDPtr parent, const tPDVector & children) const;
0049 
0050   /**
0051    * For a given decay mode and a given particle instance, perform the
0052    * decay and return the decay products. As this is the base class this
0053    * is not implemented.
0054    * @return The vector of particles produced in the decay.
0055    */
0056   virtual ParticleVector decay(const Particle & parent,const tPDVector & children) const;
0057 
0058   /**
0059    * Return the matrix element squared for a given mode and phase-space channel.
0060    * @param ichan The channel we are calculating the matrix element for. 
0061    * @param part The decaying Particle.
0062    * @param outgoing The particles produced in the decay
0063    * @param momenta  The momenta of the particles produced in the decay
0064    * @param meopt Option for the calculation of the matrix element
0065    * @return The matrix element squared for the phase-space configuration.
0066    */
0067   double me2(const int ichan,const Particle & part,
0068          const tPDVector & outgoing,
0069          const vector<Lorentz5Momentum> & momenta,
0070          MEOption meopt) const;
0071 
0072   /**
0073    *   Construct the SpinInfos for the particles produced in the decay
0074    */
0075   virtual void constructSpinInfo(const Particle & part,
0076                  ParticleVector outgoing) const;
0077 
0078   /**
0079    * Output the setup information for the particle database
0080    * @param os The stream to output the information to
0081    * @param header Whether or not to output the information for MySQL
0082    */
0083   virtual void dataBaseOutput(ofstream & os,bool header) const;
0084   /**
0085    *  Has a POWHEG style correction
0086    */
0087   virtual POWHEGType hasPOWHEGCorrection() {return FSR;}
0088 
0089   /**
0090    *  Calculate matrix element ratio R/B
0091    */
0092   virtual double matrixElementRatio(const Particle & inpart, const ParticleVector & decay2,
0093                     const ParticleVector & decay3, MEOption meopt,
0094                     ShowerInteraction inter);
0095 
0096 public:
0097 
0098   /** @name Functions used by the persistent I/O system. */
0099   //@{
0100   /**
0101    * Function used to write out object persistently.
0102    * @param os the persistent output stream written to.
0103    */
0104   void persistentOutput(PersistentOStream & os) const;
0105 
0106   /**
0107    * Function used to read in object persistently.
0108    * @param is the persistent input stream read from.
0109    * @param version the version number of the object when written.
0110    */
0111   void persistentInput(PersistentIStream & is, int version);
0112   //@}
0113 
0114   /**
0115    * The standard Init function used to initialize the interfaces.
0116    * Called exactly once for each class by the class description system
0117    * before the main function starts or
0118    * when this class is dynamically loaded.
0119    */
0120   static void Init();
0121 
0122 protected:
0123 
0124   /** @name Clone Methods. */
0125   //@{
0126   /**
0127    * Make a simple clone of this object.
0128    * @return a pointer to the new object.
0129    */
0130   virtual IBPtr clone() const {return new_ptr(*this);}
0131 
0132   /** Make a clone of this object, possibly modifying the cloned object
0133    * to make it sane.
0134    * @return a pointer to the new object.
0135    */
0136   virtual IBPtr fullclone() const {return new_ptr(*this);}
0137   //@}
0138 
0139 protected:
0140   
0141   /**
0142    *  Calcluate the Kallen function
0143    */
0144   double calculateLambda(double x, double y, double z) const;
0145 
0146   /**
0147    *  Dipole subtraction term
0148    */
0149   InvEnergy2 dipoleSubtractionTerm(double x1, double x2) const;
0150 
0151   /**
0152    *  Real emission term
0153    */
0154   InvEnergy2 calculateRealEmission(double x1, double x2) const;
0155 
0156   /**
0157    *  Virtual term
0158    */
0159   double calculateVirtualTerm() const;
0160 
0161   /**
0162    *  Non-singlet term
0163    */
0164   double calculateNonSingletTerm(double beta, double L) const;
0165 
0166 protected:
0167 
0168   /** @name Standard Interfaced functions. */
0169   //@{
0170   /**
0171    * Initialize this object after the setup phase before saving an
0172    * EventGenerator to disk.
0173    * @throws InitException if object could not be initialized properly.
0174    */
0175   virtual void doinit();
0176 
0177   /**
0178    * Initialize this object. Called in the run phase just before
0179    * a run begins.
0180    */
0181   virtual void doinitrun();
0182   //@}
0183 
0184 private:
0185 
0186   /**
0187    * The assignment operator is private and must never be called.
0188    * In fact, it should not even be implemented.
0189    */
0190   SMHiggsFermionsDecayer & operator=(const SMHiggsFermionsDecayer &) = delete;
0191 
0192 private:
0193 
0194   /**
0195    * Pointer to the Higgs vertex
0196    */
0197   AbstractFFSVertexPtr _hvertex;
0198 
0199   /**
0200    * maximum weights for the different decay modes
0201    */
0202   vector<double> _maxwgt;
0203 
0204   /**
0205    *  Spin density matrix
0206    */
0207   mutable RhoDMatrix _rho;
0208 
0209   /**
0210    * Scalar wavefunction
0211    */
0212   mutable ScalarWaveFunction _swave;
0213 
0214   /**
0215    *  Spinor wavefunction
0216    */
0217   mutable vector<SpinorWaveFunction> _wave;
0218 
0219   /**
0220    *  Barred spinor wavefunction
0221    */
0222   mutable vector<SpinorBarWaveFunction> _wavebar;
0223 private:
0224 
0225   /**
0226    *  The colour factor 
0227    */
0228   double CF_;
0229 
0230   /**
0231    *  The Higgs mass
0232    */
0233   mutable Energy mHiggs_;
0234 
0235   /**
0236    *  The reduced mass
0237    */
0238   mutable double mu_;
0239 
0240   /**
0241    *  The square of the reduced mass
0242    */
0243   mutable double mu2_;
0244 
0245   /**
0246    *  The strong coupling
0247    */
0248   mutable double aS_;
0249 
0250   /**
0251    *  Stuff for the POWHEG correction
0252    */
0253   //@{
0254   /**
0255    *  The ParticleData objects for the fermions
0256    */
0257   vector<tcPDPtr> partons_;
0258 
0259   /**
0260    * The fermion momenta
0261    */
0262   vector<Lorentz5Momentum> quark_;
0263 
0264   /**
0265    *  The momentum of the radiated gauge boson
0266    */
0267   Lorentz5Momentum gauge_;
0268 
0269   /**
0270    *  The Higgs boson
0271    */
0272   PPtr higgs_;
0273 
0274   /**
0275    *  Higgs mass squared
0276    */
0277   Energy2 mh2_;
0278   //@}
0279 
0280   /**
0281    * LO or NLO ?
0282    */
0283   bool NLO_;
0284 };
0285 
0286 }
0287 
0288 #endif /* HERWIG_SMHiggsFermionsDecayer_H */