Back to home page

EIC code displayed by LXR

 
 

    


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

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