Back to home page

EIC code displayed by LXR

 
 

    


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

0001 // -*- C++ -*-
0002 #ifndef HERWIG_MEfftoVH_H
0003 #define HERWIG_MEfftoVH_H
0004 //
0005 // This is the declaration of the MEfftoVH class.
0006 //
0007 
0008 #include "DrellYanBase.h"
0009 #include "ThePEG/Helicity/Vertex/AbstractFFVVertex.h"
0010 #include "ThePEG/Helicity/Vertex/AbstractVVSVertex.h"
0011 #include "Herwig/MatrixElement/ProductionMatrixElement.h"
0012 #include "Herwig/PDT/GenericMassGenerator.h"
0013 
0014 namespace Herwig {
0015 using namespace ThePEG;
0016 
0017 /**
0018  * The MEfftoVH class is the base class for \f$f\bar{f}\to VH\f$ processes. 
0019  * This base class handles the phase-space integration while
0020  * the inheriting classes implement the matrix element
0021  *
0022  * @see \ref MEfftoVHInterfaces "The interfaces"
0023  * defined for MEfftoVH.
0024  */
0025 class MEfftoVH: public DrellYanBase {
0026 
0027 public:
0028 
0029   /**
0030    * The default constructor.
0031    */
0032   MEfftoVH() : _shapeopt(2), _maxflavour(5), _mh(), _wh() {}
0033 
0034   /** @name Virtual functions required by the MEBase class. */
0035   //@{
0036   /**
0037    * Return the order in \f$\alpha_S\f$ in which this matrix
0038    * element is given.
0039    */
0040   virtual unsigned int orderInAlphaS() const;
0041 
0042   /**
0043    * Return the order in \f$\alpha_{EW}\f$ in which this matrix
0044    * element is given.
0045    */
0046   virtual unsigned int orderInAlphaEW() const;
0047 
0048   /**
0049    * The matrix element for the kinematical configuration
0050    * previously provided by the last call to setKinematics(), suitably
0051    * scaled by sHat() to give a dimension-less number.
0052    * @return the matrix element scaled with sHat() to give a
0053    * dimensionless number.
0054    */
0055   virtual double me2() const;
0056 
0057   /**
0058    * Return the scale associated with the last set phase space point.
0059    */
0060   virtual Energy2 scale() const;
0061 
0062   /**
0063    * Set the typed and momenta of the incoming and outgoing partons to
0064    * be used in subsequent calls to me() and colourGeometries()
0065    * according to the associated XComb object. If the function is
0066    * overridden in a sub class the new function must call the base
0067    * class one first.
0068    */
0069   virtual void setKinematics();
0070 
0071   /**
0072    * The number of internal degrees of freedom used in the matrix
0073    * element.
0074    */
0075   virtual int nDim() const;
0076 
0077   /**
0078    * Generate internal degrees of freedom given nDim() uniform
0079    * random numbers in the interval \f$ ]0,1[ \f$. To help the phase space
0080    * generator, the dSigHatDR should be a smooth function of these
0081    * numbers, although this is not strictly necessary.
0082    * @param r a pointer to the first of nDim() consecutive random numbers.
0083    * @return true if the generation succeeded, otherwise false.
0084    */
0085   virtual bool generateKinematics(const double * r);
0086 
0087   /**
0088    * Return the matrix element squared differential in the variables
0089    * given by the last call to generateKinematics().
0090    */
0091   virtual CrossSection dSigHatDR() const;
0092 
0093   /**
0094    * Get diagram selector. With the information previously supplied with the
0095    * setKinematics method, a derived class may optionally
0096    * override this method to weight the given diagrams with their
0097    * (although certainly not physical) relative probabilities.
0098    * @param dv the diagrams to be weighted.
0099    * @return a Selector relating the given diagrams to their weights.
0100    */
0101   virtual Selector<DiagramIndex> diagrams(const DiagramVector & dv) const;
0102 
0103   /**
0104    * Return a Selector with possible colour geometries for the selected
0105    * diagram weighted by their relative probabilities.
0106    * @param diag the diagram chosen.
0107    * @return the possible colour geometries weighted by their
0108    * relative probabilities.
0109    */
0110   virtual Selector<const ColourLines *>
0111   colourGeometries(tcDiagPtr diag) const;
0112 
0113   /**
0114    *  Construct the vertex of spin correlations.
0115    */
0116   virtual void constructVertex(tSubProPtr);
0117   //@}
0118 
0119 
0120 public:
0121 
0122   /** @name Functions used by the persistent I/O system. */
0123   //@{
0124   /**
0125    * Function used to write out object persistently.
0126    * @param os the persistent output stream written to.
0127    */
0128   void persistentOutput(PersistentOStream & os) const;
0129 
0130   /**
0131    * Function used to read in object persistently.
0132    * @param is the persistent input stream read from.
0133    * @param version the version number of the object when written.
0134    */
0135   void persistentInput(PersistentIStream & is, int version);
0136   //@}
0137 
0138   /**
0139    * The standard Init function used to initialize the interfaces.
0140    * Called exactly once for each class by the class description system
0141    * before the main function starts or
0142    * when this class is dynamically loaded.
0143    */
0144   static void Init();
0145 
0146 protected:
0147 
0148   /**
0149    * Matrix element for \f$f\bar{f}\to V h^0\to f'\bar{f'} h^0\f$.
0150    * @param fin  Spinors for incoming fermion
0151    * @param ain  Spinors for incoming antifermion
0152    * @param fout Spinors for incoming fermion
0153    * @param aout Spinors for incoming antifermion
0154    * @param me  Whether or not to calculate the matrix element for spin correlations
0155    */
0156   double helicityME(vector<SpinorWaveFunction> & fin ,
0157          vector<SpinorBarWaveFunction> & ain ,
0158          vector<SpinorBarWaveFunction> & fout,
0159          vector<SpinorWaveFunction>    & aout,
0160          bool me) const;
0161 
0162   /**
0163    *  Access to the vector ParticleData objects
0164    */
0165   //@{
0166   /**
0167    *  Access to the \f$W^+\f$ data
0168    */ 
0169   PDPtr WPlus() const { return _wplus; }
0170 
0171   /**
0172    *  Access to the \f$W^-\f$ data
0173    */ 
0174   PDPtr WMinus() const { return _wminus; }
0175 
0176   /**
0177    *  Access to the \f$Z^0\f$ data
0178    */ 
0179   PDPtr Z0() const { return _z0; }
0180 
0181   /**
0182    *  Access to the higgs data
0183    */ 
0184   PDPtr higgs() const { return _higgs; }
0185 
0186   /**
0187    *  Set the higgs data
0188    */ 
0189   void higgs(PDPtr in) {_higgs =in;}
0190   //@}
0191 
0192   /**
0193    *  Set the pointer to the vector-vector-Higgs vertex
0194    */
0195   void setWWHVertex(AbstractVVSVertexPtr in) {
0196     _vertexWWH = in;
0197   }
0198 
0199   /**
0200    *  Set the line shape treatment
0201    */
0202   void lineShape(unsigned int in) {_shapeopt=in;}
0203 
0204   /**
0205    *  Maximum flavour of the incoming partons
0206    */
0207   unsigned int maxFlavour() const {return _maxflavour;}
0208 
0209 protected:
0210 
0211   /** @name Standard Interfaced functions. */
0212   //@{
0213   /**
0214    * Initialize this object after the setup phase before saving an
0215    * EventGenerator to disk.
0216    * @throws InitException if object could not be initialized properly.
0217    */
0218   virtual void doinit();
0219   //@}
0220 
0221 private:
0222 
0223   /**
0224    * The assignment operator is private and must never be called.
0225    * In fact, it should not even be implemented.
0226    */
0227   MEfftoVH & operator=(const MEfftoVH &) = delete;
0228 
0229 private:
0230 
0231   /**
0232    * Defines the Higgs resonance shape
0233    */
0234   unsigned int _shapeopt;
0235 
0236   /**
0237    *  The allowed flavours of the incoming quarks
0238    */
0239   unsigned int _maxflavour;
0240 
0241   /**
0242    *  The intermediate vector bosons
0243    */
0244   //@{
0245   /**
0246    *  \f$W^+\f$
0247    */
0248   PDPtr _wplus;
0249 
0250   /**
0251    *  \f$W^-\f$
0252    */
0253   PDPtr _wminus;
0254 
0255   /**
0256    *  \f$Z^0\f$
0257    */
0258   PDPtr _z0;
0259 
0260   /**
0261    *  The higgs bosom
0262    */
0263   PDPtr _higgs;
0264   //@}
0265 
0266   /**
0267    *  The vertices for the calculation of the matrix element
0268    */
0269   //@{
0270   /**
0271    *  Vertex for fermion-fermion-W
0272    */
0273   AbstractFFVVertexPtr _vertexFFW;
0274 
0275   /**
0276    *  Vertex for fermion-fermion-Z
0277    */
0278   AbstractFFVVertexPtr _vertexFFZ;
0279 
0280   /**
0281    *  Vertex for vector-vector-Higgs
0282    */
0283   AbstractVVSVertexPtr _vertexWWH;
0284   //@}
0285 
0286   /**
0287    *  On-shell mass for the higgs
0288    */
0289   Energy _mh;
0290 
0291   /**
0292    *  On-shell width for the higgs
0293    */
0294   Energy _wh;
0295 
0296   /**
0297    *  The mass generator for the Higgs
0298    */
0299   GenericMassGeneratorPtr _hmass;
0300 
0301   /**
0302    * Matrix element for spin correlations
0303    */
0304   ProductionMatrixElement _me;
0305 };
0306 
0307 }
0308 
0309 #endif /* HERWIG_MEfftoVH_H */