Back to home page

EIC code displayed by LXR

 
 

    


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

0001 // -*- C++ -*-
0002 //
0003 // SVVDecayer.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_SVVDecayer_H
0010 #define HERWIG_SVVDecayer_H
0011 //
0012 // This is the declaration of the SVVDecayer class.
0013 //
0014 
0015 #include "GeneralTwoBodyDecayer.h"
0016 #include "ThePEG/Repository/EventGenerator.h"
0017 #include "ThePEG/Helicity/Vertex/Scalar/VVSVertex.h"
0018 #include "ThePEG/Helicity/WaveFunction/ScalarWaveFunction.h"
0019 #include "ThePEG/Helicity/WaveFunction/VectorWaveFunction.h"
0020 
0021 namespace Herwig {
0022 using namespace ThePEG;
0023 using Helicity::VVSVertexPtr; 
0024 
0025 /** \ingroup Decay
0026  * This SVVDecayer class implements the decay of a scalar to 
0027  * 2 vector bosons using either the tree level VVSVertex or the loop vertex.
0028  * It inherits from 
0029  * GeneralTwoBodyDecayer and implements the virtual member functions me2() 
0030  * and partialWidth(). It also stores a pointer to the VVSVertex.
0031  *
0032  * @see GeneralTwoBodyDecayer 
0033  * 
0034  */
0035 class SVVDecayer: public GeneralTwoBodyDecayer {
0036 
0037 public:
0038 
0039   /**
0040    * The default constructor.
0041    */
0042   SVVDecayer() {}
0043 
0044   /** @name Virtual functions required by the Decayer class. */
0045   //@{
0046   /**
0047    * Return the matrix element squared for a given mode and phase-space channel.
0048    * @param ichan The channel we are calculating the matrix element for. 
0049    * @param part The decaying Particle.
0050    * @param outgoing The particles produced in the decay
0051    * @param momenta  The momenta of the particles produced in the decay
0052    * @param meopt Option for the calculation of the matrix element
0053    * @return The matrix element squared for the phase-space configuration.
0054    */
0055   double me2(const int ichan,const Particle & part,
0056          const tPDVector & outgoing,
0057          const vector<Lorentz5Momentum> & momenta,
0058          MEOption meopt) const;
0059 
0060   /**
0061    *   Construct the SpinInfos for the particles produced in the decay
0062    */
0063   virtual void constructSpinInfo(const Particle & part,
0064                  ParticleVector outgoing) const;
0065   
0066   /**
0067    * Function to return partial Width
0068    * @param inpart The decaying particle.
0069    * @param outa One of the decay products.
0070    * @param outb The other decay product.
0071    */
0072   virtual Energy partialWidth(PMPair inpart, PMPair outa, 
0073                   PMPair outb) const;
0074 
0075   /**
0076    *  Set the information on the decay
0077    */
0078   virtual void setDecayInfo(PDPtr incoming, PDPair outgoing,
0079                 vector<VertexBasePtr>,
0080                 map<ShowerInteraction,VertexBasePtr> &,
0081                 const vector<map<ShowerInteraction,VertexBasePtr> > &,
0082                 map<ShowerInteraction,VertexBasePtr>);
0083   
0084   /**
0085    *  Has a POWHEG style correction
0086    */
0087   virtual POWHEGType hasPOWHEGCorrection()  {
0088     POWHEGType output = FSR;
0089     for(auto vertex : vertex_) {
0090       if(vertex->orderInAllCouplings()!=1) {
0091     output = No;
0092     break;
0093       }
0094     }
0095     return output;
0096   }
0097 
0098   /**
0099    *  Three-body matrix element including additional QCD radiation
0100    */
0101   virtual double threeBodyME(const int , const Particle & inpart,
0102                  const ParticleVector & decay,
0103                  ShowerInteraction inter, MEOption meopt);
0104   //@}
0105 
0106 public:
0107 
0108   /** @name Functions used by the persistent I/O system. */
0109   //@{
0110   /**
0111    * Function used to write out object persistently.
0112    * @param os the persistent output stream written to.
0113    */
0114   void persistentOutput(PersistentOStream & os) const;
0115 
0116   /**
0117    * Function used to read in object persistently.
0118    * @param is the persistent input stream read from.
0119    * @param version the version number of the object when written.
0120    */
0121   void persistentInput(PersistentIStream & is, int version);
0122   //@}
0123 
0124   /**
0125    * The standard Init function used to initialize the interfaces.
0126    * Called exactly once for each class by the class description system
0127    * before the main function starts or
0128    * when this class is dynamically loaded.
0129    */
0130   static void Init();
0131 
0132 protected:
0133 
0134   /** @name Clone Methods. */
0135   //@{
0136   /**
0137    * Make a simple clone of this object.
0138    * @return a pointer to the new object.
0139    */
0140   virtual IBPtr clone() const;
0141 
0142   /** Make a clone of this object, possibly modifying the cloned object
0143    * to make it sane.
0144    * @return a pointer to the new object.
0145    */
0146   virtual IBPtr fullclone() const;
0147   //@}
0148   
0149 protected:
0150 
0151   /**
0152    *  Find the vertices for the decay
0153    */
0154   void identifyVertices(const Particle & inpart, const ParticleVector & decay, 
0155             AbstractVVVVertexPtr & outgoingVertex1, 
0156             AbstractVVVVertexPtr & outgoingVertex2,
0157             ShowerInteraction inter);
0158 
0159 private:
0160 
0161   /**
0162    * The assignment operator is private and must never be called.
0163    * In fact, it should not even be implemented.
0164    */
0165   SVVDecayer & operator=(const SVVDecayer &) = delete;
0166 
0167 private:
0168   
0169   /**
0170    *  Abstract pointer to general VVS vertex
0171    */
0172   vector<AbstractVVSVertexPtr> vertex_;
0173 
0174   /**
0175    * Pointer to the perturbative form
0176    */
0177   vector<VVSVertexPtr> perturbativeVertex_;
0178 
0179   /**
0180    *  Abstract pointer to AbstractVSSVertex for QCD radiation from incoming scalar
0181    */
0182   map<ShowerInteraction,AbstractVSSVertexPtr> incomingVertex_;
0183 
0184   /**
0185    *  Abstract pointer to AbstractFFVVertex for QCD radiation from the 1st outgoing vector
0186    */
0187   map<ShowerInteraction,AbstractVVVVertexPtr> outgoingVertex1_;
0188 
0189   /**
0190    *  Abstract pointer to AbstractFFVVertex for QCD radiation from the 2nd outgoing vector
0191    */
0192   map<ShowerInteraction,AbstractVVVVertexPtr> outgoingVertex2_;
0193 
0194   /**
0195    *  Spin density matrix
0196    */
0197   mutable RhoDMatrix rho_;
0198 
0199   /**
0200    *  Scalar wavefunction
0201    */
0202   mutable Helicity::ScalarWaveFunction swave_;
0203 
0204   /**
0205    *  Vector wavefunctions
0206    */
0207   mutable vector<Helicity::VectorWaveFunction> vectors_[2];
0208 
0209 private:
0210 
0211   /**
0212    *  Member for the POWHEG correction
0213    */
0214   //@{
0215   /**
0216    *  Spin density matrix for 3 body decay
0217    */
0218   mutable RhoDMatrix rho3_;
0219   
0220   /**
0221    *  Scalar wavefunction for 3 body decay
0222    */
0223   mutable ScalarWaveFunction swave3_;
0224 
0225   /**
0226    *  Vector wavefunctions
0227    */
0228   mutable vector<Helicity::VectorWaveFunction> vectors3_[2];
0229 
0230     /**
0231    *  Vector wavefunction for 3 body decay
0232    */
0233   mutable vector<Helicity::VectorWaveFunction> gluon_;
0234   //@}
0235 };
0236 
0237 }
0238 
0239 #endif /* HERWIG_SVVDecayer_H */