Back to home page

EIC code displayed by LXR

 
 

    


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

0001 // -*- C++ -*-
0002 //
0003 // SMHiggsWWDecayer.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_SMHiggsWWDecayer_H
0010 #define HERWIG_SMHiggsWWDecayer_H
0011 //
0012 // This is the declaration of the SMHiggsWWDecayer class.
0013 //
0014 
0015 #include "Herwig/Decay/PerturbativeDecayer.h"
0016 #include "Herwig/Decay/PhaseSpaceMode.h"
0017 #include "ThePEG/Helicity/Vertex/AbstractFFVVertex.fh"
0018 #include "ThePEG/Helicity/Vertex/AbstractVVSVertex.fh"
0019 #include "ThePEG/Helicity/WaveFunction/ScalarWaveFunction.h"
0020 #include "ThePEG/Helicity/WaveFunction/SpinorBarWaveFunction.h"
0021 
0022 namespace Herwig {
0023 
0024 using namespace ThePEG;
0025 using namespace ThePEG::Helicity;
0026 
0027 /**
0028  * The SMHiggsWWDecayer class performs the decay of the Standard Model
0029  * Higgs boson to \f$W^+W^-\f$ and \f$Z^0Z^0\f$ including the decays
0030  * of the gauge bosons.
0031  *
0032  * @see \ref SMHiggsWWDecayerInterfaces "The interfaces"
0033  * defined for SMHiggsWWDecayer.
0034  */
0035 class SMHiggsWWDecayer: public PerturbativeDecayer {
0036 
0037 public:
0038 
0039   /**
0040    *  A typedef to select the  boson decay modes
0041    */
0042   typedef Selector<unsigned int> ModeSelector;
0043 
0044 public:
0045 
0046   /**
0047    * The default constructor.
0048    */
0049   SMHiggsWWDecayer();
0050 
0051   /**
0052    * Check if this decayer can perfom the decay for a particular mode.
0053    * Uses the modeNumber member but can be overridden
0054    * @param parent The decaying particle
0055    * @param children The decay products
0056    */
0057   virtual bool accept(tcPDPtr parent, const tPDVector & children) const;
0058 
0059   /**
0060    * For a given decay mode and a given particle instance, perform the
0061    * decay and return the decay products. As this is the base class this
0062    * is not implemented.
0063    * @return The vector of particles produced in the decay.
0064    */
0065   virtual ParticleVector decay(const Particle & parent,
0066                    const tPDVector & children) const;
0067 
0068   /**
0069    * Which of the possible decays is required
0070    */
0071   virtual int modeNumber(bool &, tcPDPtr, const tPDVector & ) const {return -1;}
0072   
0073   /**
0074    * Return the matrix element squared for a given mode and phase-space channel.
0075    * @param ichan The channel we are calculating the matrix element for. 
0076    * @param part The decaying Particle.
0077    * @param outgoing The particles produced in the decay
0078    * @param momenta  The momenta of the particles produced in the decay
0079    * @param meopt Option for the calculation of the matrix element
0080    * @return The matrix element squared for the phase-space configuration.
0081    */
0082   double me2(const int ichan,const Particle & part,
0083          const tPDVector & outgoing,
0084          const vector<Lorentz5Momentum> & momenta,
0085          MEOption meopt) const;
0086 
0087   /**
0088    *   Construct the SpinInfos for the particles produced in the decay
0089    */
0090   virtual void constructSpinInfo(const Particle & part,
0091                  ParticleVector outgoing) const;
0092 
0093   /**
0094    * Output the setup information for the particle database
0095    * @param os The stream to output the information to
0096    * @param header Whether or not to output the information for MySQL
0097    */
0098   virtual void dataBaseOutput(ofstream & os,bool header) const;
0099 
0100 public:
0101 
0102   /** @name Functions used by the persistent I/O system. */
0103   //@{
0104   /**
0105    * Function used to write out object persistently.
0106    * @param os the persistent output stream written to.
0107    */
0108   void persistentOutput(PersistentOStream & os) const;
0109 
0110   /**
0111    * Function used to read in object persistently.
0112    * @param is the persistent input stream read from.
0113    * @param version the version number of the object when written.
0114    */
0115   void persistentInput(PersistentIStream & is, int version);
0116   //@}
0117 
0118   /**
0119    * The standard Init function used to initialize the interfaces.
0120    * Called exactly once for each class by the class description system
0121    * before the main function starts or
0122    * when this class is dynamically loaded.
0123    */
0124   static void Init();
0125 
0126 protected:
0127 
0128   /** @name Clone Methods. */
0129   //@{
0130   /**
0131    * Make a simple clone of this object.
0132    * @return a pointer to the new object.
0133    */
0134   virtual IBPtr clone() const {return new_ptr(*this);}
0135 
0136   /** Make a clone of this object, possibly modifying the cloned object
0137    * to make it sane.
0138    * @return a pointer to the new object.
0139    */
0140   virtual IBPtr fullclone() const {return new_ptr(*this);}
0141   //@}
0142 
0143 protected:
0144 
0145   /** @name Standard Interfaced functions. */
0146   //@{
0147   /**
0148    * Initialize this object after the setup phase before saving an
0149    * EventGenerator to disk.
0150    * @throws InitException if object could not be initialized properly.
0151    */
0152   virtual void doinit();
0153 
0154   /**
0155    * Initialize this object. Called in the run phase just before
0156    * a run begins.
0157    */
0158   virtual void doinitrun();
0159   //@}
0160 
0161 
0162 private:
0163 
0164   /**
0165    * The assignment operator is private and must never be called.
0166    * In fact, it should not even be implemented.
0167    */
0168   SMHiggsWWDecayer & operator=(const SMHiggsWWDecayer &) = delete;
0169 
0170 private:
0171 
0172   /**
0173    *  Pointers to the vertices for the helicity calculations
0174    */
0175   //@{
0176   /**
0177    *  Pointer to the fermion-femion-W vertex
0178    */
0179   AbstractFFVVertexPtr _theFFWVertex;
0180 
0181   /**
0182    *  Pointer to the fermion-femion-Z vertex
0183    */
0184   AbstractFFVVertexPtr _theFFZVertex;
0185 
0186   /**
0187    *  Pointer to the higgs-WW/ZZ vertex
0188    */
0189   AbstractVVSVertexPtr _theHVVVertex;
0190   //@}
0191 
0192   /**
0193    *  Selectors for the gauge boson decay modes
0194    */
0195   //@{
0196   /**
0197    *  Selector for the W decays
0198    */
0199   ModeSelector _wdecays;
0200 
0201   /**
0202    *  Selector for the Z decays
0203    */
0204   ModeSelector _zdecays;
0205   //@}
0206 
0207   /**
0208    *  Product of gauge boson branching ratios for normalisation
0209    */
0210   vector<double> _ratio;
0211 
0212   /**
0213    *  Maximum weights for the decays
0214    */
0215   //@{
0216   /**
0217    *  Maximum weight for \f$H\to W^+W^-\f$ decays
0218    */
0219   vector<double> _wmax;
0220 
0221   /**
0222    *  Maximum weight for \f$H\to Z^0Z^0\f$ decays
0223    */
0224   vector<double> _zmax;
0225   //@}
0226 
0227   /**
0228    *  Spin density matrix
0229    */
0230   mutable RhoDMatrix _rho;
0231 
0232   /**
0233    *  Scalar wavefunction
0234    */
0235   mutable ScalarWaveFunction _swave;
0236 
0237   /**
0238    *  1st spinor wavefunction
0239    */
0240   mutable vector<SpinorWaveFunction   > _awave1;
0241 
0242   /**
0243    *  2nd spinor wavefunction
0244    */
0245   mutable vector<SpinorWaveFunction   > _awave2;
0246 
0247   /**
0248    *  1st barred spinor wavefunction
0249    */
0250   mutable vector<SpinorBarWaveFunction> _fwave1;
0251 
0252   /**
0253    *  2nd barred spinor wavefunction
0254    */
0255   mutable vector<SpinorBarWaveFunction> _fwave2;
0256 };
0257 
0258 }
0259 
0260 #endif /* HERWIG_SMHiggsWWDecayer_H */