Back to home page

EIC code displayed by LXR

 
 

    


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

0001 // -*- C++ -*-
0002 //
0003 // MEfv2vf.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_MEfv2vf_H
0010 #define HERWIG_MEfv2vf_H
0011 //
0012 // This is the declaration of the MEfv2vf class.
0013 //
0014 
0015 #include "GeneralHardME.h"
0016 #include "Herwig/MatrixElement/ProductionMatrixElement.h"
0017 #include "ThePEG/Helicity/WaveFunction/VectorWaveFunction.h"
0018 #include "ThePEG/Helicity/WaveFunction/SpinorWaveFunction.h"
0019 #include "ThePEG/Helicity/WaveFunction/SpinorBarWaveFunction.h"
0020 #include "ThePEG/Helicity/Vertex/AbstractFFVVertex.h"
0021 #include "ThePEG/Helicity/Vertex/AbstractVVVVertex.h"
0022 #include "ThePEG/Helicity/Vertex/AbstractFFVVVertex.h"
0023 
0024 namespace Herwig {
0025 using namespace ThePEG;
0026 
0027 /**
0028  * This class implements the matrix element for a fermion and a vector
0029  * boson to a fermion and a vector boson. It inherits from GeneralHardME
0030  * and implements the appropriate virtual functions. 
0031  * 
0032  * @see GeneralHardME
0033  *
0034  */
0035 class MEfv2vf: public GeneralHardME {
0036 
0037 public:
0038 
0039   /** A vector of SpinorWaveFunctions. */
0040   typedef vector<Helicity::SpinorWaveFunction> SpinorVector;
0041 
0042   /** A vector of SpinorBarWaveFunctions. */
0043   typedef vector<Helicity::SpinorBarWaveFunction> SpinorBarVector;
0044 
0045   /** A vector of VectorWaveFunctions. */
0046   typedef vector<Helicity::VectorWaveFunction> VBVector;
0047 
0048 public:
0049 
0050   /** @name Virtual functions required by the MEBase class. */
0051   //@{
0052   /**
0053    * The matrix element for the kinematical configuration
0054    * previously provided by the last call to setKinematics(), suitably
0055    * scaled by sHat() to give a dimension-less number.
0056    * @return the matrix element scaled with sHat() to give a
0057    * dimensionless number.
0058    */
0059   virtual double me2() const;
0060   //@}
0061 
0062   /**
0063    * Construct the vertex information for the spin correlations
0064    * @param sub Pointer to the relevent SubProcess
0065    */
0066   virtual void constructVertex(tSubProPtr sub);
0067 
0068 private:
0069 
0070   /** @name Functions to calculate the Helicity MatrixElement.*/
0071   //@{
0072   /**
0073    * Calculate the matrix element for an incoming fermion
0074    * @param spIn A vector of spinors for the incoming fermion
0075    * @param vecIn A vector of VectorWaveFunctions for the incoming boson
0076    * @param spbOut A vector of SpinorBarWaveFunctions for the outgoing fermion
0077    * @param vecOut A vector of VectorWaveFunctions for the outgoing boson
0078    * @param mc If the outgoing vector is massless or not
0079    * @param first Whether or not first call to decide if colour decomposition etc
0080    * should be calculated
0081    * @param mesq The matrix element squared
0082   */
0083   ProductionMatrixElement
0084   fv2vfHeME(const SpinorVector & spIn,  const VBVector & vecIn, 
0085         const VBVector & vecOut, bool mc,
0086         const SpinorBarVector & spbOut, 
0087         double & mesq, bool first) const;
0088 
0089   /**
0090    * Calculate the matrix element for an incoming anti-fermion
0091    * @param spbIn A vector of SpinorBarWaveFunctions for the incoming anti-fermion
0092    * @param vecIn A vector of VectorWaveFunctions for the incoming boson
0093    * @param spOut A vector of Spinors for the outgoing antifermion
0094    * @param vecOut A vector of VectorWaveFunctions for the outgoing boson
0095    * @param mc If the outgoing vector is massless or not
0096    * @param first Whether or not first call to decide if colour decomposition etc
0097    * should be calculated
0098    * @param mesq The matrix element squared
0099   */
0100   ProductionMatrixElement
0101   fbv2vfbHeME(const SpinorBarVector & spbIn,  const VBVector & vecIn, 
0102           const VBVector & vecOut, bool mc,
0103           const SpinorVector & spOut, 
0104           double & mesq, bool first) const;
0105   //@}
0106 
0107 protected:
0108   
0109   /**
0110    * A debugging function to test the value of me2 against an
0111    * analytic function.
0112    * @param me2 The value of the \f$ |\bar{\mathcal{M}}|^2 \f$
0113    */
0114   virtual void debug(double me2) const;
0115 
0116 public:
0117 
0118   /** @name Functions used by the persistent I/O system. */
0119   //@{
0120   /**
0121    * Function used to write out object persistently.
0122    * @param os the persistent output stream written to.
0123    */
0124   void persistentOutput(PersistentOStream & os) const;
0125 
0126   /**
0127    * Function used to read in object persistently.
0128    * @param is the persistent input stream read from.
0129    * @param version the version number of the object when written.
0130    */
0131   void persistentInput(PersistentIStream & is, int version);
0132   //@}
0133 
0134   /**
0135    * The standard Init function used to initialize the interfaces.
0136    * Called exactly once for each class by the class description system
0137    * before the main function starts or
0138    * when this class is dynamically loaded.
0139    */
0140   static void Init();
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 protected:
0156 
0157   /** @name Clone Methods. */
0158   //@{
0159   /**
0160    * Make a simple clone of this object.
0161    * @return a pointer to the new object.
0162    */
0163   virtual IBPtr clone() const {return new_ptr(*this);}
0164 
0165   /** Make a clone of this object, possibly modifying the cloned object
0166    * to make it sane.
0167    * @return a pointer to the new object.
0168    */
0169   virtual IBPtr fullclone() const {return new_ptr(*this);}
0170   //@}
0171 
0172 private:
0173 
0174   /**
0175    * The assignment operator is private and must never be called.
0176    * In fact, it should not even be implemented.
0177    */
0178   MEfv2vf & operator=(const MEfv2vf &) = delete;
0179 
0180 private:
0181   
0182   /** @name Store dynamically casted vertices. */
0183   //@{
0184   /**
0185    * A pair off FFVVertex pointers 
0186    */
0187   vector<pair<AbstractFFVVertexPtr, AbstractFFVVertexPtr> > fermion_;
0188 
0189   /**
0190    * A pair of FFVVertex, VVVertex pointers 
0191    */
0192   vector<pair<AbstractFFVVertexPtr, AbstractVVVVertexPtr> > vector_;
0193 
0194   /**
0195    *  Four point vertices
0196    */
0197   vector<AbstractFFVVVertexPtr> four_;
0198   //@}
0199 
0200 };
0201 
0202 }
0203 
0204 #endif /* HERWIG_MEfv2vf_H */