Back to home page

EIC code displayed by LXR

 
 

    


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

0001 // -*- C++ -*-
0002 #ifndef HERWIG_GeneralQQHiggs_H
0003 #define HERWIG_GeneralQQHiggs_H
0004 //
0005 // This is the declaration of the GeneralQQHiggs class.
0006 //
0007 
0008 #include "Herwig/MatrixElement/HwMEBase.h"
0009 #include "Herwig/MatrixElement/ProductionMatrixElement.h"
0010 #include "ThePEG/Helicity/Vertex/AbstractFFVVertex.h"
0011 #include "ThePEG/Helicity/Vertex/AbstractFFSVertex.h"
0012 #include "ThePEG/Helicity/Vertex/AbstractVVVVertex.h"
0013 #include "ThePEG/Helicity/WaveFunction/ScalarWaveFunction.h"
0014 #include "ThePEG/Helicity/WaveFunction/SpinorWaveFunction.h"
0015 #include "ThePEG/Helicity/WaveFunction/VectorWaveFunction.h"
0016 #include "ThePEG/Helicity/WaveFunction/SpinorBarWaveFunction.h"
0017 #include "Herwig/PDT/GenericMassGenerator.h"
0018 #include "GeneralQQHiggs.fh"
0019 
0020 namespace Herwig {
0021 
0022 using namespace ThePEG;
0023 
0024 /**
0025  * The GeneralQQHiggs class implements the matrix elements for
0026  * \f$gg\to Q \bar Q h^0\f$ and \f$q\bar q\to Q \bar Q h^0\f$.
0027  *
0028  * @see \ref GeneralQQHiggsInterfaces "The interfaces"
0029  * defined for GeneralQQHiggs.
0030  */
0031 class GeneralQQHiggs: public HwMEBase {
0032 
0033 public:
0034 
0035   /** @name Standard constructors and destructors. */
0036   //@{
0037   /**
0038    * The default constructor.
0039    */
0040   GeneralQQHiggs();
0041   //@}
0042 
0043   /**
0044    *  Initialisation if used in a general model
0045    */
0046 
0047   /**
0048    *  Set up the matrix element
0049    */
0050   void setProcessInfo(unsigned int quark, PDPtr higgs,
0051               AbstractFFSVertexPtr vertex,
0052               unsigned int shapeOpt,
0053               unsigned int proc);
0054 
0055 public:
0056 
0057   /** @name Virtual functions required by the HwMEBase class. */
0058   //@{
0059   /**
0060    * Return the order in \f$\alpha_S\f$ in which this matrix
0061    * element is given.
0062    */
0063   virtual unsigned int orderInAlphaS() const;
0064 
0065   /**
0066    * Return the order in \f$\alpha_{EW}\f$ in which this matrix
0067    * element is given.
0068    */
0069   virtual unsigned int orderInAlphaEW() const;
0070 
0071   /**
0072    * The matrix element for the kinematical configuration
0073    * previously provided by the last call to setKinematics(), suitably
0074    * scaled by sHat() to give a dimension-less number.
0075    * @return the matrix element scaled with sHat() to give a
0076    * dimensionless number.
0077    */
0078   virtual double me2() const;
0079 
0080   /**
0081    * Return the scale associated with the last set phase space point.
0082    */
0083   virtual Energy2 scale() const;
0084 
0085   /**
0086    * Set the typed and momenta of the incoming and outgoing partons to
0087    * be used in subsequent calls to me() and colourGeometries()
0088    * according to the associated XComb object. If the function is
0089    * overridden in a sub class the new function must call the base
0090    * class one first.
0091    */
0092   virtual void setKinematics();
0093 
0094   /**
0095    * The number of internal degrees of freedom used in the matrix
0096    * element.
0097    */
0098   virtual int nDim() const;
0099 
0100   /**
0101    * Generate internal degrees of freedom given nDim() uniform
0102    * random numbers in the interval \f$ ]0,1[ \f$. To help the phase space
0103    * generator, the dSigHatDR should be a smooth function of these
0104    * numbers, although this is not strictly necessary.
0105    * @param r a pointer to the first of nDim() consecutive random numbers.
0106    * @return true if the generation succeeded, otherwise false.
0107    */
0108   virtual bool generateKinematics(const double * r);
0109 
0110   /**
0111    * Return the matrix element squared differential in the variables
0112    * given by the last call to generateKinematics().
0113    */
0114   virtual CrossSection dSigHatDR() const;
0115 
0116   /**
0117    * Add all possible diagrams with the add() function.
0118    */
0119   virtual void getDiagrams() const;
0120 
0121   /**
0122    * Get diagram selector. With the information previously supplied with the
0123    * setKinematics method, a derived class may optionally
0124    * override this method to weight the given diagrams with their
0125    * (although certainly not physical) relative probabilities.
0126    * @param dv the diagrams to be weighted.
0127    * @return a Selector relating the given diagrams to their weights.
0128    */
0129   virtual Selector<DiagramIndex> diagrams(const DiagramVector & dv) const;
0130 
0131   /**
0132    * Return a Selector with possible colour geometries for the selected
0133    * diagram weighted by their relative probabilities.
0134    * @param diag the diagram chosen.
0135    * @return the possible colour geometries weighted by their
0136    * relative probabilities.
0137    */
0138   virtual Selector<const ColourLines *>
0139   colourGeometries(tcDiagPtr diag) const;
0140 
0141   /**
0142    *  Construct the vertex of spin correlations.
0143    */
0144   virtual void constructVertex(tSubProPtr);
0145   //@}
0146 
0147 protected:
0148 
0149   /**
0150    *  Members to calculate the matrix elements
0151    */
0152   //@{
0153   /**
0154    * Matrix element for \f$gg\to Q\bar{Q}h^0\f$
0155    * @param g1   The wavefunctions for the first  incoming gluon
0156    * @param g2   The wavefunctions for the second incoming gluon
0157    * @param q    The wavefunction  for the outgoing quark
0158    * @param qbar The wavefunction  for the outgoing antiquark
0159    * @param h    The wavefunction for the outgoing Higgs boson
0160    * @param flow The colour flow
0161    */
0162   double ggME(vector<VectorWaveFunction> &g1,vector<VectorWaveFunction> &g2,
0163           vector<SpinorBarWaveFunction> & q,vector<SpinorWaveFunction> & qbar,
0164           ScalarWaveFunction & h,
0165           unsigned int flow) const;
0166 
0167   /**
0168    * Matrix element for \f$q\bar{q}\to Q\bar{Q}h^0\f$
0169    * @param q1 The wavefunction  for the incoming quark
0170    * @param q2 The wavefunction  for the incoming antiquark
0171    * @param q3 The wavefunction  for the outgoing quark
0172    * @param q4 The wavefunction  for the outgoing antiquark
0173    * @param h    The wavefunction for the outgoing Higgs boson
0174    * @param flow The colour flow
0175    */
0176   double qqME(vector<SpinorWaveFunction> & q1,
0177           vector<SpinorBarWaveFunction> & q2,
0178           vector<SpinorBarWaveFunction>    & q3,
0179           vector<SpinorWaveFunction>    & q4,
0180           ScalarWaveFunction & h,
0181           unsigned int flow) const;
0182   //@} 
0183 
0184 public:
0185 
0186   /** @name Functions used by the persistent I/O system. */
0187   //@{
0188   /**
0189    * Function used to write out object persistently.
0190    * @param os the persistent output stream written to.
0191    */
0192   void persistentOutput(PersistentOStream & os) const;
0193 
0194   /**
0195    * Function used to read in object persistently.
0196    * @param is the persistent input stream read from.
0197    * @param version the version number of the object when written.
0198    */
0199   void persistentInput(PersistentIStream & is, int version);
0200   //@}
0201 
0202   /**
0203    * The standard Init function used to initialize the interfaces.
0204    * Called exactly once for each class by the class description system
0205    * before the main function starts or
0206    * when this class is dynamically loaded.
0207    */
0208   static void Init();
0209 
0210 protected:
0211 
0212   /** @name Clone Methods. */
0213   //@{
0214   /**
0215    * Make a simple clone of this object.
0216    * @return a pointer to the new object.
0217    */
0218   virtual IBPtr clone() const;
0219 
0220   /** Make a clone of this object, possibly modifying the cloned object
0221    * to make it sane.
0222    * @return a pointer to the new object.
0223    */
0224   virtual IBPtr fullclone() const;
0225   //@}
0226 
0227 protected:
0228 
0229   /** @name Standard Interfaced functions. */
0230   //@{
0231   /**
0232    * Initialize this object after the setup phase before saving an
0233    * EventGenerator to disk.
0234    * @throws InitException if object could not be initialized properly.
0235    */
0236   virtual void doinit();
0237   //@}
0238 
0239 private:
0240 
0241   /**
0242    * The assignment operator is private and must never be called.
0243    * In fact, it should not even be implemented.
0244    */
0245   GeneralQQHiggs & operator=(const GeneralQQHiggs &) = delete;
0246 
0247 private:
0248   
0249   /**
0250    *  Switches to control the subprocess
0251    */
0252   //@{
0253   /**
0254    *  Quark Flavour
0255    */
0256   unsigned int quarkFlavour_;
0257   
0258   /**
0259    *  Processes to include
0260    */
0261   unsigned int process_;
0262   //@}
0263 
0264   /**
0265    *  Switches etc for the Higgs mass generation
0266    */
0267   //@{
0268   /**
0269    * Defines the Higgs resonance shape
0270    */
0271   unsigned int shapeOpt_;
0272 
0273   /**
0274    *  On-shell mass for the higgs
0275    */
0276   Energy mh_;
0277 
0278   /**
0279    *  On-shell width for the higgs
0280    */
0281   Energy wh_;
0282 
0283   /**
0284    *  The mass generator for the Higgs
0285    */
0286   GenericMassGeneratorPtr hmass_;
0287   //@}
0288   
0289   /**
0290    *  Vertices needed to compute the diagrams
0291    */
0292   //@{
0293   /**
0294    *  \f$ggg\f$ vertex
0295    */
0296   AbstractVVVVertexPtr GGGVertex_;
0297   
0298   /**
0299    *  \f$q\bar{q}g\f$ vertex
0300    */
0301   AbstractFFVVertexPtr QQGVertex_;
0302 
0303   /**
0304    *  \f$q\bar q h^0\f$ vertex
0305    */
0306   AbstractFFSVertexPtr QQHVertex_;
0307   //@}
0308   
0309 
0310   /**
0311    *  ParticleData objects of the particles
0312    */  
0313   //@{
0314   /**
0315    *  The gluon
0316    */
0317   PDPtr gluon_;
0318 
0319   /**
0320    * The Higgs boson
0321    */
0322   PDPtr higgs_;
0323   
0324   /**
0325    *  the quarks
0326    */
0327   vector<PDPtr> quark_;
0328 
0329   /**
0330    *  the antiquarks
0331    */
0332   vector<PDPtr> antiquark_;
0333   //@}
0334 
0335   /**
0336    *  Parameters for the phase-space generation
0337    */
0338   //@{
0339   /**
0340    *  Power for the phase-space mapping
0341    */
0342   double alpha_;
0343   //@}
0344 
0345   /**
0346    *  Colour flow
0347    */
0348   mutable unsigned int flow_;
0349 
0350   /**
0351    *  Diagram
0352    */
0353   mutable unsigned int diagram_;
0354 
0355   /**
0356    *  Matrix element
0357    */
0358   mutable ProductionMatrixElement me_;
0359 };
0360 
0361 }
0362 
0363 #endif /* HERWIG_GeneralQQHiggs_H */