Back to home page

EIC code displayed by LXR

 
 

    


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

0001 // -*- C++ -*-
0002 //
0003 // MEPP2Higgs.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_MEPP2Higgs_H
0010 #define HERWIG_MEPP2Higgs_H
0011 //
0012 // This is the declaration of the MEPP2Higgs class.
0013 //
0014 
0015 #include "Herwig/MatrixElement/HwMEBase.h"
0016 #include "ThePEG/Helicity/WaveFunction/ScalarWaveFunction.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/AbstractFFSVertex.h"
0021 #include "ThePEG/Helicity/Vertex/AbstractVVSVertex.h"
0022 #include "Herwig/PDT/GenericMassGenerator.h"
0023 #include "Herwig/MatrixElement/ProductionMatrixElement.h"
0024 #include "Herwig/Shower/ShowerAlpha.h"
0025 
0026 namespace Herwig {
0027 using namespace ThePEG;
0028 using namespace ThePEG::Helicity;
0029 
0030 /**
0031  * The MEPP2Higgs class implements the matrix element for the process
0032  * pp->Higgs with different Higgs shape prescriptions (see details in hep-ph/9505211)
0033  * and the NLL corrected Higgs width (see details in the FORTRAN HERWIG manual).
0034  *
0035  * @see \ref MEPP2HiggsInterfaces "The interfaces"
0036  * defined for MEPP2Higgs.
0037  */
0038 class MEPP2Higgs: public HwMEBase {
0039 
0040 public:
0041 
0042   /**
0043    * The default constructor.
0044    */
0045   MEPP2Higgs();
0046 
0047   /**
0048    * Return the matrix element for the kinematical configuation
0049    * previously provided by the last call to setKinematics(). Uses
0050    * me().
0051    */
0052   virtual CrossSection dSigHatDR() const;
0053 
0054   /**
0055    * Set the typed and momenta of the incoming and outgoing partons to
0056    * be used in subsequent calls to me() and colourGeometries()
0057    * according to the associated XComb object.
0058    */
0059   virtual void setKinematics() {
0060     HwMEBase::setKinematics();
0061     mh2_ = sHat();
0062   }
0063 
0064 public:
0065  
0066   /** @name Member functions for the generation of hard QCD radiation */
0067   //@{
0068   /**
0069    *  Has a POWHEG style correction
0070    */
0071   virtual POWHEGType hasPOWHEGCorrection() {return ISR;}
0072 
0073   /**
0074    *  Has an old fashioned ME correction
0075    */
0076   virtual bool hasMECorrection() {return true;}
0077 
0078   /**
0079    *  Initialize the ME correction
0080    */
0081   virtual void initializeMECorrection(RealEmissionProcessPtr, double &,
0082                       double & );
0083 
0084   /**
0085    *  Apply the hard matrix element correction to a given hard process or decay
0086    */
0087   virtual RealEmissionProcessPtr applyHardMatrixElementCorrection(RealEmissionProcessPtr);
0088 
0089   /**
0090    * Apply the soft matrix element correction
0091    * @param parent The initial particle in the current branching
0092    * @param progenitor The progenitor particle of the jet
0093    * @param fs Whether the emission is initial or final-state
0094    * @param highestpT The highest pT so far in the shower
0095    * @param ids ids of the particles produced in the branching
0096    * @param z The momentum fraction of the branching
0097    * @param scale the evolution scale of the branching
0098    * @param pT The transverse momentum of the branching
0099    * @return If true the emission should be vetoed
0100    */
0101   virtual bool softMatrixElementVeto(PPtr parent,
0102                      PPtr progenitor,
0103                      const bool & fs,
0104                      const Energy & highestpT,
0105                      const vector<tcPDPtr> & ids,
0106                      const double & z,
0107                      const Energy & scale,
0108                      const Energy & pT);
0109 
0110   /**
0111    *  Apply the POWHEG style correction
0112    */
0113   virtual RealEmissionProcessPtr generateHardest(RealEmissionProcessPtr,
0114                          ShowerInteraction);
0115   //@}
0116 
0117 public:
0118 
0119   /** @name Virtual functions required by the MEBase class. */
0120   //@{
0121   /**
0122    * Return the order in \f$\alpha_S\f$ in which this matrix
0123    * element is given.
0124    */
0125   virtual unsigned int orderInAlphaS() const;
0126 
0127   /**
0128    * Return the order in \f$\alpha_{EW}\f$ in which this matrix
0129    * element is given.
0130    */
0131   virtual unsigned int orderInAlphaEW() const;
0132 
0133   /**
0134    * The matrix element for the kinematical configuration
0135    * previously provided by the last call to setKinematics(), suitably
0136    * scaled by sHat() to give a dimension-less number.
0137    * @return the matrix element scaled with sHat() to give a
0138    * dimensionless number.
0139    */
0140   virtual double me2() const;
0141 
0142   /**
0143    * Generate internal degrees of freedom given nDim() uniform
0144    * random numbers in the interval \f$ ]0,1[ \f$. To help the phase space
0145    * generator, the dSigHatDR should be a smooth function of these
0146    * numbers, although this is not strictly necessary.
0147    * @param r a pointer to the first of nDim() consecutive random numbers.
0148    * @return true if the generation succeeded, otherwise false.
0149    */
0150   virtual bool generateKinematics(const double * r);
0151 
0152   /**
0153    * Return the scale associated with the last set phase space point.
0154    */
0155   virtual Energy2 scale() const;
0156 
0157   /**
0158    * The number of internal degrees of freedom used in the matrix
0159    * element.
0160    */
0161   virtual int nDim() const;
0162 
0163   /**
0164    * Add all possible diagrams with the add() function.
0165    */
0166   virtual void getDiagrams() const;
0167 
0168   /**
0169    * Get diagram selector. With the information previously supplied with the
0170    * setKinematics method, a derived class may optionally
0171    * override this method to weight the given diagrams with their
0172    * (although certainly not physical) relative probabilities.
0173    * @param dv the diagrams to be weighted.
0174    * @return a Selector relating the given diagrams to their weights.
0175    */
0176   virtual Selector<DiagramIndex> diagrams(const DiagramVector & dv) const;
0177 
0178   /**
0179    * Return a Selector with possible colour geometries for the selected
0180    * diagram weighted by their relative probabilities.
0181    * @param diag the diagram chosen.
0182    * @return the possible colour geometries weighted by their
0183    * relative probabilities.
0184    */
0185   virtual Selector<const ColourLines *> colourGeometries(tcDiagPtr diag) const;
0186 
0187   /**
0188    *  Construct the vertex of spin correlations.
0189    */
0190   virtual void constructVertex(tSubProPtr);
0191   //@}
0192 
0193 public:
0194 
0195   /** @name Functions used by the persistent I/O system. */
0196   //@{
0197   /**
0198    * Function used to write out object persistently.
0199    * @param os the persistent output stream written to.
0200    */
0201   void persistentOutput(PersistentOStream & os) const;
0202 
0203   /**
0204    * Function used to read in object persistently.
0205    * @param is the persistent input stream read from.
0206    * @param version the version number of the object when written.
0207    */
0208   void persistentInput(PersistentIStream & is, int version);
0209   //@}
0210 
0211   /**
0212    * The standard Init function used to initialize the interfaces.
0213    * Called exactly once for each class by the class description system
0214    * before the main function starts or
0215    * when this class is dynamically loaded.
0216    */
0217   static void Init();
0218 
0219 protected:
0220 
0221   /** @name Clone Methods. */
0222   //@{
0223   /**
0224    * Make a simple clone of this object.
0225    * @return a pointer to the new object.
0226    */
0227   virtual IBPtr clone() const { return new_ptr(*this); }
0228 
0229   /** Make a clone of this object, possibly modifying the cloned object
0230    * to make it sane.
0231    * @return a pointer to the new object.
0232    */
0233   virtual IBPtr fullclone() const { return new_ptr(*this); }
0234   //@}
0235 
0236 protected:
0237 
0238   /** @name Standard Interfaced functions. */
0239   //@{
0240   /**
0241    * Initialize this object after the setup phase before saving an
0242    * EventGenerator to disk.
0243    * @throws InitException if object could not be initialized properly.
0244    */
0245   virtual void doinit();
0246  
0247   /**
0248    * Finalize this object. Called in the run phase just after a
0249    * run has ended. Used eg. to write out statistics.
0250    */
0251   virtual void dofinish();
0252   //@}
0253 
0254 protected:
0255   
0256   /**
0257    *   Members to calculate the real emission matrix elements
0258    */
0259   //@{
0260   /**
0261    *  The leading-order matrix element for \f$gg\to H\f$
0262    */
0263   Energy4 loME() const;
0264 
0265   /**
0266    *  The matrix element for \f$gg\to H g\f$
0267    */
0268   Energy2 ggME(Energy2 s, Energy2 t, Energy2 u);
0269 
0270   /**
0271    *  The matrix element for \f$qg\to H q\f$
0272    */
0273   Energy2 qgME(Energy2 s, Energy2 t, Energy2 u);
0274 
0275   /**
0276    *  The matrix element for \f$qbarg\to H qbar\f$
0277    */
0278   Energy2 qbargME(Energy2 s, Energy2 t, Energy2 u);
0279   //@}
0280 
0281   /**
0282    *  Members to calculate the functions for the loop diagrams
0283    */
0284   //@{
0285   /**
0286    *  The \f$B(s)\f$ function of NBP339 (1990) 38-66
0287    * @param s The scale
0288    * @param mf2 The fermion mass squared.
0289    */
0290   Complex B(Energy2 s,Energy2 mf2) const;
0291 
0292   /**
0293    *  The \f$C(s)\f$ function of NBP339 (1990) 38-66
0294    * @param s The scale
0295    * @param mf2 The fermion mass squared.
0296    */
0297   complex<InvEnergy2> C(Energy2 s,Energy2 mf2) const;
0298 
0299   /**
0300    *  The \f$C(s)\f$ function of NBP339 (1990) 38-66
0301    * @param s The \f$s\f$ invariant
0302    * @param t The \f$t\f$ invariant
0303    * @param u The \f$u\f$ invariant
0304    * @param mf2 The fermion mass squared
0305    */
0306   complex<InvEnergy4> D(Energy2 s,Energy2 t, Energy2 u,Energy2 mf2) const;
0307 
0308   /**
0309    * The integral \f$\int\frac{dy}{y-y_0}\log(a-i\epsilon-b y(1-y))\f$
0310    * from NBP339 (1990) 38-66.
0311    * @param a  The parameter \f$a\f$.
0312    * @param b  The parameter \f$b\f$.
0313    * @param y0 The parameter \f$y_0\f$.
0314    */
0315   Complex dIntegral(Energy2 a, Energy2 b, double y0) const;
0316 
0317   /**
0318    *  The \f$M_{+++}\f$ matrix element of NBP339 (1990) 38-66.
0319    * @param s   The \f$s\f$ invariant
0320    * @param t   The \f$t\f$ invariant
0321    * @param u   The \f$u\f$ invariant
0322    * @param mf2 The fermion mass squared.
0323    * @param i Which of the stored values to use for \f$D(u,t)\f$.
0324    * @param j Which of the stored values to use for \f$D(u,s)\f$.
0325    * @param k Which of the stored values to use for \f$D(s,t)\f$.
0326    * @param i1 Which of the stored values to use for \f$C_1(s)\f$.
0327    * @param j1 Which of the stored values to use for \f$C_1(t)\f$.
0328    * @param k1 Which of the stored values to use for \f$C_1(u)\f$.
0329    */
0330   complex<Energy> me1(Energy2 s,Energy2 t,Energy2 u, Energy2 mf2,
0331                  unsigned int i,unsigned int j, unsigned int k,
0332                  unsigned int i1,unsigned int j1, unsigned int k1) const;
0333 
0334   /**
0335    *  The \f$M_{++-}\f$ matrix element of NBP339 (1990) 38-66.
0336    * @param s   The \f$s\f$ invariant
0337    * @param t   The \f$t\f$ invariant
0338    * @param u   The \f$u\f$ invariant
0339    * @param mf2 The fermion mass squared.
0340    */
0341   complex<Energy> me2(Energy2 s,Energy2 t,Energy2 u, Energy2 mf2) const;
0342 
0343   /**
0344    *  The \f$F(x)\f$ function for the leading-order result
0345    */
0346   Complex F(double x) const;
0347   //@}
0348 
0349   /**
0350    *  Method to extract the PDF weight for quark/antiquark
0351    * initiated processes and select the quark flavour
0352    */  
0353   tPDPtr quarkFlavour(tcPDFPtr pdf, Energy2 scale, double x, tcBeamPtr beam, 
0354               double & pdfweight, bool anti);
0355 
0356   /**
0357    * Return the momenta and type of hard matrix element correction
0358    * @param gluons The original incoming particles.
0359    * @param beams The BeamParticleData objects
0360    * @param higgs The original outgoing higgs
0361    * @param iemit Whether the first (0) or second (1) particle emitted
0362    * the radiation
0363    * @param itype The type of radiated particle (0 is gluon, 1 is quark 
0364    *              and 2 is antiquark)
0365    * @param pnew The momenta of the new particles
0366    * @param xnew The new values of the momentuym fractions
0367    * @param out The ParticleData object for the outgoing parton
0368    * @return Whether or not the matrix element correction needs to be applied
0369    */
0370   bool applyHard(ParticleVector gluons,
0371          vector<tcBeamPtr> beams,
0372          PPtr higgs,unsigned int & iemit,
0373          unsigned int & itype,vector<Lorentz5Momentum> & pnew,
0374          pair<double,double> & xnew,
0375          tPDPtr & out);
0376 
0377   /**
0378    *  generates the hardest emission (yj,p)
0379    * @param pnew The momenta of the new particles
0380    * @param emissiontype The type of emission, as for getResult
0381    * @return Whether not an emission was generated
0382    */
0383   bool getEvent(vector<Lorentz5Momentum> & pnew,int & emissiontype);
0384 
0385   /**
0386    * Returns the matrix element for a given type of process,
0387    * rapidity of the jet \f$y_j\f$ and transverse momentum \f$p_T\f$
0388    * @param emis_type the type of emission,
0389    * (0 is \f$gg\to h^0g\f$, 1 is \f$qg\to h^0q\f$ and 2 is \f$g\bar{q}\to h^0\bar{q}\f$)
0390    * @param pt The transverse momentum of the jet
0391    * @param yj The rapidity of the jet
0392    * @param outParton the outgoing parton
0393    */
0394   double getResult(int emis_type, Energy pt, double yj,tcPDPtr & outParton);
0395 
0396 private:
0397 
0398   /**
0399    * The assignment operator is private and must never be called.
0400    * In fact, it should not even be implemented.
0401    */
0402   MEPP2Higgs & operator=(const MEPP2Higgs &) = delete;
0403   //@}
0404 
0405   /**
0406    *  Members to return the matrix elements for the different subprocesses
0407    */
0408   //@{
0409   /**
0410    * Calculates the matrix element for the process g,g->h (via quark loops)
0411    * @param g1 a vector of wave functions of the first incoming gluon
0412    * @param g2 a vector of wave functions of the second incoming gluon
0413    * @param calc Whether or not to calculate the matrix element for spin correlations
0414    * @return the amlitude value.
0415    */
0416   double ggME(vector<VectorWaveFunction> g1,
0417               vector<VectorWaveFunction> g2,
0418               ScalarWaveFunction &, 
0419               bool calc) const;
0420 
0421   /**
0422    * Calculates the matrix element for the process q,qbar->h
0423    * @param fin a vector of quark spinors
0424    * @param ain a vector of anti-quark spinors
0425    * @param calc Whether or not to calculate the matrix element for spin correlations
0426    * @return the amlitude value.
0427    */
0428   double qqME(vector<SpinorWaveFunction> & fin, 
0429               vector<SpinorBarWaveFunction> & ain, 
0430               ScalarWaveFunction &, 
0431               bool calc) const;
0432   //@}
0433 
0434 private:
0435 
0436   /**
0437    * Selects a dynamic (sHat) or fixed factorization scale
0438    */
0439   unsigned int scaleopt_;
0440 
0441   /**
0442    * The value associated to the fixed factorization scale option
0443    */
0444   Energy mu_F_;
0445 
0446   /**
0447    * Defines the Higgs resonance shape
0448    */
0449   unsigned int shapeOption_;
0450 
0451   /**
0452    * The processes to be included (GG->H and/or qq->H)
0453    */
0454   unsigned int processOption_;
0455 
0456   /**
0457    * Minimum flavour of incoming quarks
0458    */
0459   int minFlavour_;
0460 
0461   /**
0462    * Maximum flavour of incoming quarks
0463    */
0464   int maxFlavour_;
0465 
0466   /**
0467    * Matrix element for spin correlations
0468    */
0469   ProductionMatrixElement me_;
0470 
0471   /**
0472    * Pointer to the H-> 2 gluon vertex (used in gg->H)
0473    */
0474   AbstractVVSVertexPtr HGGVertex_;
0475 
0476   /**
0477    * Pointer to the fermion-fermion Higgs vertex (used in qq->H)
0478    */
0479   AbstractFFSVertexPtr HFFVertex_;
0480 
0481   /**
0482    *  The mass generator for the Higgs
0483    */
0484   GenericMassGeneratorPtr hmass_;
0485 
0486   /**
0487    *  On-shell mass for the higgs
0488    */
0489   Energy mh_;
0490 
0491   /**
0492    *  On-shell width for the higgs
0493    */
0494   Energy wh_;
0495 
0496   /**
0497    *  Stuff for the ME correction
0498    */
0499   //@{
0500   /**
0501    *  Parameters for the evaluation of the loops for the 
0502    *  matrix elements
0503    */
0504   //@{
0505   /**
0506    *  Minimum flavour of quarks to include in the loops
0507    */
0508   unsigned int minLoop_;
0509 
0510   /**
0511    *  Maximum flavour of quarks to include in the loops
0512    */
0513   unsigned int maxLoop_;
0514 
0515   /**
0516    *  Option for treatment of the fermion loops
0517    */
0518   unsigned int massOption_;
0519 
0520   /**
0521    *  Option for dynamic scale choice in alpha_S (0=mT,>0=pT)
0522    */
0523   unsigned int mu_R_opt_;
0524 
0525   /**
0526    *  Option for dynamic scale choice in PDFs    (0=mT,>0=pT)
0527    */
0528   unsigned int mu_F_opt_;
0529   //@}
0530 
0531   //@}
0532 
0533   /**
0534    *  Small complex number to regularize some integrals
0535    */
0536   static const complex<Energy2> epsi_;
0537 
0538   /**
0539    *  Storage of the loop functions
0540    */
0541   //@{
0542   /**
0543    *  B functions
0544    */
0545   mutable Complex bi_[5];
0546 
0547   /**
0548    *  C functions
0549    */
0550   mutable complex<InvEnergy2> ci_[8];
0551 
0552   /**
0553    *  D functions
0554    */
0555   mutable complex<InvEnergy4> di_[4];
0556   //@}
0557 
0558   /**
0559    *  Pointer to the object calculating the strong coupling
0560    */
0561   ShowerAlphaPtr alpha_;
0562 
0563   /**
0564    *  Mass squared of Higgs
0565    */  
0566   Energy2 mh2_;
0567 
0568   /**
0569    *  Relative weight of the \f$qg\f$ to the \f$gg\f$  channel
0570    */
0571   double channelwgtA_;
0572 
0573   /**
0574    *  Relative weight for the \f$\bar{q}g\f$ to the \f$gg\f$  channel
0575    */
0576   double channelwgtB_;
0577 
0578   /**
0579    *  Weights for the channels as a vector
0580    */
0581   vector<double> channelWeights_;
0582 
0583   /**
0584    *  Power for the \f$\frac{{\rm d}\hat{s}}{\hat{s}^n}\f$ importance sampling
0585    *  of the \f$gg\f$ component 
0586    */
0587   double ggPow_;
0588 
0589   /**
0590    *  Power for the \f$\frac{{\rm d}\hat{s}}{\hat{s}^n}\f$ importance sampling
0591    *  of the \f$qg\f$ and \f$\bar{q}g\f$ components 
0592    */
0593   double qgPow_;
0594 
0595   /**
0596    *  The enhancement factor for initial-state radiation
0597    */
0598   double enhance_;
0599   
0600   /**
0601    *  Number of weights greater than 1
0602    */
0603   unsigned int nover_;
0604 
0605   /**
0606    *  Number of attempts
0607    */
0608   unsigned int ntry_;
0609 
0610   /**
0611    *  Number which suceed
0612    */
0613   unsigned int ngen_;
0614 
0615   /**
0616    *  Maximum weight
0617    */
0618   double maxwgt_;
0619   //@}
0620 
0621   /**
0622    *  Constants for the sampling. The distribution is assumed to have the
0623    *  form \f$\frac{c}{{\rm GeV}}\times\left(\frac{{\rm GeV}}{p_T}\right)^n\f$ 
0624    */
0625   //@{
0626   /**
0627    * The power, \f$n\f$, for the sampling
0628    */
0629   double power_;
0630 
0631   /**
0632    *  The prefactor, \f$c\f$ for the \f$gg\f$ channel
0633    */
0634   double pregg_;
0635 
0636   /**
0637    *  The prefactor, \f$c\f$ for the \f$qg\f$ channel
0638    */
0639   double preqg_;
0640 
0641   /**
0642    *  The prefactor, \f$c\f$ for the \f$g\bar{q}\f$ channel
0643    */
0644   double pregqbar_;
0645 
0646   /**
0647    *  The prefactors as a vector for easy use
0648    */
0649   vector<double> prefactor_;
0650   //@}
0651 
0652   /**
0653    *  The transverse momentum of the jet
0654    */
0655   Energy minpT_;
0656 
0657   /**
0658    *  Properties of the incoming particles
0659    */
0660   //@{
0661   /**
0662    *  Pointers to the BeamParticleData objects
0663    */
0664   vector<tcBeamPtr> beams_;
0665   
0666   /**
0667    *  Pointers to the ParticleDataObjects for the partons
0668    */
0669   vector<tcPDPtr> partons_;
0670   //@}
0671 
0672   /**
0673    *  Properties of the boson and jets
0674    */
0675   //@{
0676   /**
0677    *  The rapidity of the Higgs boson
0678    */
0679   double yh_;
0680 
0681   /**
0682    *  The mass of the Higgs boson
0683    */
0684   Energy mass_;
0685 
0686   /**
0687    *  the rapidity of the jet
0688    */
0689   double yj_;
0690 
0691   /**
0692    *  The transverse momentum of the jet
0693    */
0694   Energy pt_;
0695 
0696   /**
0697    *  The outgoing parton
0698    */
0699   tcPDPtr out_;
0700   //@}
0701 
0702   /**
0703    *  Whether of not to construct the vertex for spin correlations
0704    */
0705   bool spinCorrelations_;
0706 
0707 };
0708 
0709 }
0710 
0711 #endif /* HERWIG_MEPP2Higgs_H */