Back to home page

EIC code displayed by LXR

 
 

    


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

0001 // -*- C++ -*-
0002 //
0003 // MEff2ff.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_MEff2ff_H
0010 #define HERWIG_MEff2ff_H
0011 //
0012 // This is the declaration of the MEff2ff class.
0013 //
0014 
0015 #include "GeneralHardME.h"
0016 #include "ThePEG/Helicity/WaveFunction/SpinorWaveFunction.h"
0017 #include "ThePEG/Helicity/WaveFunction/SpinorBarWaveFunction.h"
0018 #include "Herwig/MatrixElement/ProductionMatrixElement.h"
0019 #include "ThePEG/Helicity/Vertex/AbstractFFSVertex.h"
0020 #include "ThePEG/Helicity/Vertex/AbstractFFVVertex.h"
0021 #include "ThePEG/Helicity/Vertex/AbstractFFTVertex.h"
0022 #include "ThePEG/Helicity/Vertex/AbstractFFFFVertex.h"
0023 
0024 namespace Herwig {
0025 using namespace ThePEG;
0026 using Helicity::SpinorWaveFunction;
0027 using Helicity::SpinorBarWaveFunction;
0028 
0029 /**
0030  * This is the implementation of the \f$ 2\to 2\f$ matrix element for
0031  * a \f$ \Psi \Psi \to \Psi \Psi\f$ process. It inherits from 
0032  * GeneralHardME and implements the appropriate virtual functions.
0033  *
0034  * @see GeneralHardME
0035  */
0036 class MEff2ff: public GeneralHardME {
0037 
0038 public:
0039   
0040   /** Vector of SpinorWaveFunctions. */
0041   typedef vector<SpinorWaveFunction> SpinorVector;
0042 
0043   /** Vector of SpinorBarWaveFunctions. */
0044   typedef vector<SpinorBarWaveFunction> SpinorBarVector;
0045 
0046 public:
0047 
0048   /** @name Virtual functions required by the MEBase class. */
0049   //@{
0050   /**
0051    * The matrix element for the kinematical configuration
0052    * previously provided by the last call to setKinematics(), suitably
0053    * scaled by sHat() to give a dimension-less number.
0054    * @return the matrix element scaled with sHat() to give a
0055    * dimensionless number.
0056    */
0057   virtual double me2() const;
0058   //@}
0059 
0060 private:
0061   
0062   /** @name Functions to compute the ProductionMatrixElement. */
0063   //@{
0064   /**
0065    * Compute the matrix element for \f$\Psi\bar{\Psi}\to\Psi\bar{\Psi}\f$
0066    * @param me2 colour averaged, spin summed ME
0067    * @param first Whether or not first call to decide if colour decomposition etc
0068    * should be calculated
0069    * @return ProductionMatrixElement containing results of 
0070    * helicity calculations
0071    */
0072   ProductionMatrixElement
0073   ffb2ffbHeME(double & me2, bool first) const;
0074 
0075   /**
0076    * Compute the matrix element for \f$\Psi\Psi\to\Psi\Psi\f$
0077    * @param first Whether or not first call to decide if colour decomposition etc
0078    * should be calculated
0079    * @return ProductionMatrixElement containing results of 
0080    * helicity calculations
0081    */
0082   ProductionMatrixElement ff2ffHeME(double & me2, bool first) const;
0083   
0084   /**
0085    * Compute the matrix element for 
0086    * \f$\bar{\Psi}\bar{\Psi}\to\bar{\Psi}\bar{\Psi}\f$
0087    * @param me2 colour averaged, spin summed ME
0088    * @param first Whether or not first call to decide if colour decomposition etc
0089    * should be calculated
0090    * @return ProductionMatrixElement containing results of 
0091    * helicity calculations
0092    */
0093   ProductionMatrixElement fbfb2fbfbHeME(double & me2, bool first) const;
0094 
0095   /**
0096    * Compute the matrix element for \f$\Psi\bar{\Psi}\to\lambda\lambda\f$
0097    * @param me2 colour averaged, spin summed ME
0098    * @param first Whether or not first call to decide if colour decomposition etc
0099    * should be calculated
0100    * @return ProductionMatrixElement containing results of 
0101    * helicity calculations
0102    */
0103   ProductionMatrixElement 
0104   ffb2mfmfHeME(double & me2, bool first) const;
0105   //@}
0106 
0107   /**
0108    * Construct the vertex information for the spin correlations
0109    * @param sub Pointer to the relevent SubProcess
0110    */
0111   virtual void constructVertex(tSubProPtr sub);
0112 
0113 protected:
0114   
0115   /**
0116    * A debugging function to test the value of me2 against an
0117    * analytic function.
0118    * @param me2 The value of the \f$ |\bar{\mathcal{M}}|^2 \f$
0119    */
0120   virtual void debug(double me2) const;
0121   
0122 public:
0123 
0124   /** @name Functions used by the persistent I/O system. */
0125   //@{
0126   /**
0127    * Function used to write out object persistently.
0128    * @param os the persistent output stream written to.
0129    */
0130   void persistentOutput(PersistentOStream & os) const;
0131 
0132   /**
0133    * Function used to read in object persistently.
0134    * @param is the persistent input stream read from.
0135    * @param version the version number of the object when written.
0136    */
0137   void persistentInput(PersistentIStream & is, int version);
0138   //@}
0139 
0140   /**
0141    * The standard Init function used to initialize the interfaces.
0142    * Called exactly once for each class by the class description system
0143    * before the main function starts or
0144    * when this class is dynamically loaded.
0145    */
0146   static void Init();
0147 
0148 protected:
0149 
0150   /** @name Standard Interfaced functions. */
0151   //@{
0152   /**
0153    * Initialize this object after the setup phase before saving an
0154    * EventGenerator to disk.
0155    * @throws InitException if object could not be initialized properly.
0156    */
0157   virtual void doinit();
0158   //@}
0159 
0160 protected:
0161 
0162   /** @name Clone Methods. */
0163   //@{
0164   /**
0165    * Make a simple clone of this object.
0166    * @return a pointer to the new object.
0167    */
0168   virtual IBPtr clone() const {return new_ptr(*this);}
0169 
0170   /** Make a clone of this object, possibly modifying the cloned object
0171    * to make it sane.
0172    * @return a pointer to the new object.
0173    */
0174   virtual IBPtr fullclone() const {return new_ptr(*this);}
0175   //@}
0176 
0177 private:
0178 
0179   /**
0180    * The assignment operator is private and must never be called.
0181    * In fact, it should not even be implemented.
0182    */
0183   MEff2ff & operator=(const MEff2ff &) = delete;
0184 
0185 private:
0186   
0187   /**
0188    * Store the vector of FFSVertex pairs
0189    */
0190   vector<pair<AbstractFFSVertexPtr, AbstractFFSVertexPtr> > scalar_;
0191 
0192   /**
0193    * Store the vector of FFVVertex pairs
0194    */
0195   vector<pair<AbstractFFVVertexPtr, AbstractFFVVertexPtr> > vector_;
0196 
0197   /**
0198    * Store the vector of FFTVertex pairs
0199    */
0200   vector<pair<AbstractFFTVertexPtr, AbstractFFTVertexPtr> > tensor_;
0201 
0202   /**
0203    *  Store any 4-point vertices
0204    */
0205   vector<AbstractFFFFVertexPtr> four_;
0206 
0207   /**
0208    *  Spinors
0209    */
0210   mutable std::array<SpinorVector,4> spin_;
0211 
0212   /**
0213    *  Barred spinors
0214    */
0215   mutable std::array<SpinorBarVector,4> sbar_;
0216 };
0217 
0218 }
0219 
0220 #endif /* HERWIG_MEff2ff_H */