Back to home page

EIC code displayed by LXR

 
 

    


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

0001 // -*- C++ -*-
0002 //
0003 // SMHiggsGGHiggsPPDecayer.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_SMHiggsGGHiggsPPDecayer_H
0010 #define HERWIG_SMHiggsGGHiggsPPDecayer_H
0011 //
0012 // This is the declaration of the SMHiggsGGHiggsPPDecayer class.
0013 //
0014 
0015 #include "Herwig/Decay/PerturbativeDecayer.h"
0016 #include "Herwig/Decay/PhaseSpaceMode.h"
0017 #include "Herwig/Models/StandardModel/StandardModel.h"
0018 #include "ThePEG/Helicity/Vertex/AbstractVVSVertex.h"
0019 
0020 namespace Herwig {
0021 using namespace ThePEG;
0022 using namespace ThePEG::Helicity;
0023   
0024 /**
0025  * The <code>SMHiggsGGHiggsPPDecayer</code> class performs the
0026  * of a Standard Model Higgs boson to:  a pair
0027  * of photons or a pair of gluons, or a \f$Z^0\f$ boson and a photon.
0028  *
0029  * @see PerturbativeDecayer
0030  */ 
0031 class SMHiggsGGHiggsPPDecayer: public PerturbativeDecayer {
0032   
0033 public:
0034 
0035   /**
0036    * The default constructor.
0037    */
0038   SMHiggsGGHiggsPPDecayer() : _h0wgt(3,1.), _minloop(6), _maxloop(6), _massopt(0)
0039   {}
0040   
0041   /** @name Virtual functions required by the Decayer class. */
0042   //@{
0043   /**
0044    * Return the matrix element squared for a given mode and phase-space channel.
0045    * @param ichan The channel we are calculating the matrix element for. 
0046    * @param part The decaying Particle.
0047    * @param outgoing The particles produced in the decay
0048    * @param momenta  The momenta of the particles produced in the decay
0049    * @param meopt Option for the calculation of the matrix element
0050    * @return The matrix element squared for the phase-space configuration.
0051    */
0052   double me2(const int ichan,const Particle & part,
0053          const tPDVector & outgoing,
0054          const vector<Lorentz5Momentum> & momenta,
0055          MEOption meopt) const;
0056 
0057   /**
0058    *   Construct the SpinInfos for the particles produced in the decay
0059    */
0060   virtual void constructSpinInfo(const Particle & part,
0061                  ParticleVector outgoing) const;
0062   
0063   /**
0064    * Check if this decayer can perfom the decay for a particular mode.
0065    * Uses the modeNumber member but can be overridden
0066    * @param parent The decaying particle
0067    * @param children The decay products
0068    */
0069   virtual bool accept(tcPDPtr parent, const tPDVector & children) const;
0070   
0071   /**
0072    * Which of the possible decays is required
0073    */
0074   virtual int modeNumber(bool &, tcPDPtr, const tPDVector & ) const {return -1;}
0075   
0076   /**
0077    * For a given decay mode and a given particle instance, perform the
0078    * decay and return the decay products. As this is the base class this
0079    * is not implemented.
0080    * @return The vector of particles produced in the decay.
0081    */
0082   virtual ParticleVector decay(const Particle & parent,const tPDVector & children) const;
0083 
0084   /**
0085    * Output the setup information for the particle database
0086    * @param os The stream to output the information to
0087    * @param header Whether or not to output the information for MySQL
0088    */
0089   virtual void dataBaseOutput(ofstream & os,bool header) const;
0090 
0091   /**
0092    *  Calculate matrix element ratio R/B
0093    */
0094   virtual double matrixElementRatio(const Particle & inpart, const ParticleVector & decay2,
0095                     const ParticleVector & decay3, MEOption meopt,
0096                     ShowerInteraction inter);
0097 
0098   /**
0099    *  Has a POWHEG style correction
0100    */
0101   virtual POWHEGType hasPOWHEGCorrection() {return FSR;}
0102   //@}
0103   
0104 public:
0105   
0106   /** @name Functions used by the persistent I/O system. */
0107   //@{
0108   /**
0109    * Function used to write out object persistently.
0110    * @param os the persistent output stream written to.
0111    */
0112   void persistentOutput(PersistentOStream & os) const;
0113   
0114   /**
0115    * Function used to read in object persistently.
0116    * @param is the persistent input stream read from.
0117    * @param version the version number of the object when written.
0118    */
0119   void persistentInput(PersistentIStream & is, int version);
0120   //@}
0121   
0122   /**
0123    * The standard Init function used to initialize the interfaces.
0124    * Called exactly once for each class by the class description system
0125    * before the main function starts or
0126    * when this class is dynamically loaded.
0127    */
0128   static void Init();
0129   
0130 protected:
0131   
0132   /** @name Clone Methods. */
0133   //@{
0134   /**
0135    * Make a simple clone of this object.
0136    * @return a pointer to the new object.
0137    */
0138   virtual IBPtr clone() const {return new_ptr(*this);}
0139   
0140   /** Make a clone of this object, possibly modifying the cloned object
0141    * to make it sane.
0142    * @return a pointer to the new object.
0143    */
0144   virtual IBPtr fullclone() const {return new_ptr(*this);}
0145   //@}
0146   
0147 protected:
0148   
0149   /** @name Standard Interfaced functions. */
0150   //@{
0151   /**
0152    * Initialize this object after the setup phase before saving and
0153    * EventGenerator to disk.
0154    * @throws InitException if object could not be initialized properly.
0155    */
0156   virtual void doinit();
0157   
0158   /**
0159    * Initialize this object. Called in the run phase just before
0160    * a run begins.
0161    */
0162   virtual void doinitrun();
0163   //@}
0164 
0165 protected:
0166 
0167   /**
0168    *  Calculate the NLO real emission piece of ME
0169    */
0170   double realME(const vector<cPDPtr> & partons, 
0171         const vector<Lorentz5Momentum> & momenta) const;
0172   
0173   /**
0174    *  Calculate the LO ME
0175    */
0176   Energy2 loME(Energy mh) const;
0177   
0178 private:
0179   
0180   /**
0181    * The assignment operator is private and must never be called.
0182    * In fact, it should not even be implemented.
0183    */
0184   SMHiggsGGHiggsPPDecayer & operator=(const SMHiggsGGHiggsPPDecayer &) = delete;
0185   
0186   /**
0187    * Pointer to h->gluon,gluon vertex
0188    */
0189   AbstractVVSVertexPtr _hggvertex;
0190   
0191   /**
0192    * Pointer to h->gamma,gamma vertex
0193    */
0194   AbstractVVSVertexPtr _hppvertex;
0195   
0196   /**
0197    * Pointer to h->gamma,gamma vertex
0198    */
0199   AbstractVVSVertexPtr _hzpvertex;
0200   
0201   /**
0202    * Maximum weight for integration
0203    */
0204   vector<double> _h0wgt;
0205   
0206   /**
0207    *  Spin density matrix
0208    */
0209   mutable RhoDMatrix _rho;
0210 
0211   /**
0212    *  Scalar wavefunction
0213    */
0214   mutable ScalarWaveFunction _swave;
0215 
0216   /**
0217    *  Vector wavefunctions
0218    */
0219   mutable vector<VectorWaveFunction> _vwave[2];
0220 
0221 private:
0222 
0223   /**
0224    *  Parameters for the real POWHEG correction
0225    */
0226   //@{
0227   /**
0228    *  Minimum flavour of quarks to include in the loops
0229    */
0230   int _minloop;
0231 
0232   /**
0233    *  Maximum flavour of quarks to include in the loops
0234    */
0235   int _maxloop;
0236 
0237   /**
0238    *  Option for treatment of the fermion loops
0239    */
0240   unsigned int _massopt;
0241   //@}
0242 };
0243   
0244 }
0245 
0246 #endif /* HERWIG_SMHiggsGGHiggsPPDecayer_H */