Back to home page

EIC code displayed by LXR

 
 

    


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

0001 // -*- C++ -*-
0002 //
0003 // VFFDecayer.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_VFFDecayer_H
0010 #define HERWIG_VFFDecayer_H
0011 //
0012 // This is the declaration of the VFFDecayer class.
0013 //
0014 
0015 #include "GeneralTwoBodyDecayer.h"
0016 #include "ThePEG/Repository/EventGenerator.h"
0017 #include "ThePEG/Helicity/Vertex/Vector/FFVVertex.h"
0018 #include "ThePEG/Helicity/Vertex/Vector/VVVVertex.h"
0019 
0020 namespace Herwig {
0021 using namespace ThePEG;
0022 using Helicity::FFVVertexPtr;
0023 
0024 /** \ingroup Decay
0025  * The VFFDecayer class implements the decay of a vector
0026  * to 2 fermions in a general model. It holds an FFVVertex pointer
0027  * that must be typecast from the VertexBase pointer held in 
0028  * GeneralTwoBodyDecayer. It implents the virtual functions me2() and
0029  * partialWidth(). 
0030  *
0031  * @see GeneralTwoBodyDecayer
0032  */
0033 class VFFDecayer: public GeneralTwoBodyDecayer {
0034 
0035 public:
0036   
0037   /**
0038    * The default constructor.
0039    */
0040   VFFDecayer() {}
0041 
0042 public:
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    *  Has a POWHEG style correction
0077    */
0078   virtual POWHEGType hasPOWHEGCorrection()  {
0079     POWHEGType output = FSR;
0080     for(auto vertex : vertex_) {
0081       if(vertex->orderInAllCouplings()!=1) {
0082     output = No;
0083     break;
0084       }
0085     }
0086     return output;
0087   }
0088 
0089   /**
0090    *  Three-body matrix element including additional QCD radiation
0091    */
0092   virtual double threeBodyME(const int , const Particle & inpart,
0093                  const ParticleVector & decay,
0094                  ShowerInteraction inter, MEOption meopt);
0095 
0096   /**
0097    * Indentify outgoing vertices for the fermion and antifermion
0098    */
0099   void identifyVertices(const int iferm, const int ianti,
0100             const Particle & inpart, const ParticleVector & decay,
0101             AbstractFFVVertexPtr & abstractOutgoingVertexF, 
0102             AbstractFFVVertexPtr & abstractOutgoingVertexA,
0103             ShowerInteraction inter);
0104 
0105   /**
0106    *  Set the information on the decay
0107    */
0108   virtual void setDecayInfo(PDPtr incoming, PDPair outgoing,
0109                 vector<VertexBasePtr>,
0110                 map<ShowerInteraction,VertexBasePtr> &,
0111                 const vector<map<ShowerInteraction,VertexBasePtr> > &,
0112                 map<ShowerInteraction,VertexBasePtr>);
0113   //@}
0114 
0115 public:
0116 
0117   /** @name Functions used by the persistent I/O system. */
0118   //@{
0119   /**
0120    * Function used to write out object persistently.
0121    * @param os the persistent output stream written to.
0122    */
0123   void persistentOutput(PersistentOStream & os) const;
0124 
0125   /**
0126    * Function used to read in object persistently.
0127    * @param is the persistent input stream read from.
0128    * @param version the version number of the object when written.
0129    */
0130   void persistentInput(PersistentIStream & is, int version);
0131   //@}
0132 
0133   /**
0134    * The standard Init function used to initialize the interfaces.
0135    * Called exactly once for each class by the class description system
0136    * before the main function starts or
0137    * when this class is dynamically loaded.
0138    */
0139   static void Init();
0140 
0141 protected:
0142 
0143   /** @name Clone Methods. */
0144   //@{
0145   /**
0146    * Make a simple clone of this object.
0147    * @return a pointer to the new object.
0148    */
0149   virtual IBPtr clone() const;
0150 
0151   /** Make a clone of this object, possibly modifying the cloned object
0152    * to make it sane.
0153    * @return a pointer to the new object.
0154    */
0155   virtual IBPtr fullclone() const;
0156   //@}
0157 
0158 private:
0159   
0160   /**
0161    * The assignment operator is private and must never be called.
0162    * In fact, it should not even be implemented.
0163    */
0164   VFFDecayer & operator=(const VFFDecayer &) = delete;
0165 
0166 private:
0167 
0168   /**
0169    *  Abstract pointer to AbstractFFVVertex
0170    */
0171   vector<AbstractFFVVertexPtr> vertex_;
0172 
0173   /**
0174    * Pointer to the perturbative vertex
0175    */
0176   vector<FFVVertexPtr> perturbativeVertex_;
0177 
0178   /**
0179    *  Abstract pointer to AbstractVVVVertex for QCD radiation from incoming vector
0180    */
0181   map<ShowerInteraction,AbstractVVVVertexPtr> incomingVertex_;
0182 
0183   /**
0184    *  Abstract pointer to AbstractFFVVertex for QCD radiation from outgoing (anti)fermion
0185    */
0186   map<ShowerInteraction,AbstractFFVVertexPtr> outgoingVertex1_;
0187 
0188   /**
0189    *  Abstract pointer to AbstractFFVVertex for QCD radiation from outgoing (anti)fermion
0190    */
0191   map<ShowerInteraction,AbstractFFVVertexPtr> outgoingVertex2_;
0192 
0193   /**
0194    *  Spin density matrix 
0195    */
0196   mutable RhoDMatrix rho_;
0197 
0198   /**
0199    *  Polarization vectors for the decaying particle
0200    */
0201   mutable vector<VectorWaveFunction> vectors_;
0202 
0203   /**
0204    *  Spinors for the decay products 
0205    */
0206   mutable vector<SpinorWaveFunction> wave_;
0207 
0208   /**
0209    *  Barred spinors for the decay products
0210    */
0211   mutable vector<SpinorBarWaveFunction> wavebar_;
0212  /**
0213    *  Spin density matrix for 3 body decay
0214    */
0215   mutable RhoDMatrix rho3_;
0216 
0217   /**
0218    *  Scalar wavefunction for 3 body decay
0219    */
0220   mutable vector<VectorWaveFunction> vector3_;
0221 
0222   /**
0223    *  Spinor wavefunction for 3 body decay
0224    */
0225   mutable vector<SpinorWaveFunction> wave3_;
0226 
0227   /**
0228    *  Barred spinor wavefunction for 3 body decay
0229    */
0230   mutable vector<SpinorBarWaveFunction> wavebar3_;
0231 
0232     /**
0233    *  Vector wavefunction for 3 body decay
0234    */
0235   mutable vector<VectorWaveFunction> gluon_;
0236 
0237 };
0238 
0239 }
0240 
0241 #endif /* HERWIG_VFFDecayer_H */