Back to home page

EIC code displayed by LXR

 
 

    


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

0001 // -*- C++ -*-
0002 //
0003 // MEPP2HiggsPowheg.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_MEPP2HiggsPowheg_H
0010 #define HERWIG_MEPP2HiggsPowheg_H
0011 //
0012 // This is the declaration of the MEPP2HiggsPowheg class.
0013 //
0014 
0015 #include "Herwig/MatrixElement/Hadron/MEPP2Higgs.h"
0016 #include "ThePEG/PDF/BeamParticleData.h"
0017 
0018 namespace Herwig {
0019 using namespace ThePEG;
0020 using namespace ThePEG::Helicity;
0021  
0022 /**
0023  * The MEPP2HiggsPowheg class implements the matrix element for the process
0024  * pp->Higgs with different Higgs shape prescriptions (see details in hep-ph/9505211)
0025  * and the NLL corrected Higgs width (see details in the FORTRAN HERWIG manual).
0026  *
0027  * @see \ref MEPP2HiggsPowhegInterfaces "The interfaces"
0028  * defined for MEPP2HiggsPowheg.
0029  */
0030 class MEPP2HiggsPowheg: public MEPP2Higgs {
0031 
0032 public:
0033 
0034   /**
0035    * The default constructor.
0036    */
0037   MEPP2HiggsPowheg();
0038 
0039 public:
0040 
0041   /** @name Virtual functions required by the MEBase class. */
0042   //@{
0043   /**
0044    * The matrix element for the kinematical configuration
0045    * previously provided by the last call to setKinematics(), suitably
0046    * scaled by sHat() to give a dimension-less number.
0047    * @return the matrix element scaled with sHat() to give a
0048    * dimensionless number.
0049    */
0050   virtual double me2() const;
0051 
0052   /**
0053    * Generate internal degrees of freedom given nDim() uniform
0054    * random numbers in the interval \f$ ]0,1[ \f$. To help the phase space
0055    * generator, the dSigHatDR should be a smooth function of these
0056    * numbers, although this is not strictly necessary.
0057    * @param r a pointer to the first of nDim() consecutive random numbers.
0058    * @return true if the generation succeeded, otherwise false.
0059    */
0060   virtual bool generateKinematics(const double * r);
0061 
0062   /**
0063    * Return the scale associated with the last set phase space point.
0064    */
0065   virtual Energy2 scale() const;
0066 
0067   /**
0068    * The number of internal degrees of freedom used in the matrix
0069    * element.
0070    */
0071   virtual int nDim() const;
0072   //@}
0073 
0074 public:
0075 
0076   /** @name Functions used by the persistent I/O system. */
0077   //@{
0078   /**
0079    * Function used to write out object persistently.
0080    * @param os the persistent output stream written to.
0081    */
0082   void persistentOutput(PersistentOStream & os) const;
0083 
0084   /**
0085    * Function used to read in object persistently.
0086    * @param is the persistent input stream read from.
0087    * @param version the version number of the object when written.
0088    */
0089   void persistentInput(PersistentIStream & is, int version);
0090   //@}
0091 
0092   /**
0093    * The standard Init function used to initialize the interfaces.
0094    * Called exactly once for each class by the class description system
0095    * before the main function starts or
0096    * when this class is dynamically loaded.
0097    */
0098   static void Init();
0099 
0100   /**
0101    * Function to set the born variables. 
0102    */
0103   void get_born_variables() const;
0104 
0105   /**
0106    * Calculate the correction weight with which leading-order
0107    * configurations are re-weighted.
0108    */
0109   double NLOweight() const;
0110 
0111   /**
0112    * Invariant required for the evaluation of next-to-leading order
0113    * quantities (Frixione et al. NPB.383 WZ production at colliders). 
0114    */
0115   Energy2 s(double xt, double y) const {
0116     return  p2_/x(xt,y);
0117   }
0118 
0119   /**
0120    * Invariant required for the evaluation of next-to-leading order
0121    * quantities (Frixione et al. NPB.383 WZ production at colliders). 
0122    */
0123   Energy2 tk(double xt, double y) const {
0124     double  x_xt_y(x(xt,y));
0125     return -0.5*p2_/x_xt_y*(1.- x_xt_y)*(1.-y);
0126   }
0127 
0128   /**
0129    * Invariant required for the evaluation of next-to-leading order
0130    * quantities (Frixione et al. NPB.383 WZ production at colliders). 
0131    */
0132   Energy2 uk(double xt, double y) const {
0133     double  x_xt_y(x(xt,y));
0134     return -0.5*p2_/x_xt_y*(1.- x_xt_y)*(1.+y);
0135   }
0136 
0137   /**
0138    * Calculate the minimum of \f$x\f$. 
0139    */
0140   double xbar(double y) const;
0141 
0142   /**
0143    * Calculate auxiliary function of \f$\bar{x}(y)\f$, \f$\bar{\eta}(y)\f$. 
0144    */
0145   double etabar(double y) const;
0146 
0147   /**
0148    * Calculate the variable \f$x=p^{2}/s\f$ from the integration variables. 
0149    */
0150   double x(double xt, double y) const {
0151     double x0(xbar(y));
0152     return x0+(1.-x0)*xt;
0153   }
0154 
0155   /**
0156    * Calculate the momentum fraction of the plus parton. 
0157    */
0158   double xp(double x, double y) const;
0159 
0160   /**
0161    * Calculate the momentum fraction of the minus parton. 
0162    */
0163   double xm(double x, double y) const;
0164 
0165   /**
0166    * Calculate the ratio of the NLO luminosity to the LO
0167    * luminosity function for the \f$q\bar{q}\f$ initiated channel. 
0168    */
0169   double Lhat_ab(tcPDPtr a, tcPDPtr b, double x, double y) const;
0170 
0171   /**
0172    * Calculate the universal soft-virtual contribution to the NLO weight. 
0173    */
0174   double Vtilde_universal() const;
0175 
0176   /**
0177    * Function for calculation of the \f$gg\f$ initiated real
0178    * contribution.
0179    */
0180   double Ctilde_Ltilde_gg_on_x(tcPDPtr a,tcPDPtr b,double xt,double y) const;
0181 
0182   /**
0183    * Function for calculation of the \f$qg\f$ initiated real
0184    * contribution.
0185    */
0186   double Ctilde_Ltilde_qg_on_x(tcPDPtr a,tcPDPtr b,double xt,double y) const;
0187 
0188   /**
0189    * Function for calculation of the \f$gq\f$ initiated real
0190    * contribution.
0191    */
0192   double Ctilde_Ltilde_gq_on_x(tcPDPtr a,tcPDPtr b,double xt,double y) const;
0193 
0194   /**
0195    * The regular part of the virtual correction matrix element(s) 
0196    */
0197   double M_V_regular() const;
0198 
0199   /**
0200    * The matrix element q + qbar -> n + g times tk*uk 
0201    */
0202   Energy2 t_u_M_R_qqbar(double xt, double y) const;
0203 
0204   /**
0205    * The matrix element qbar + q -> n + g times tk*uk 
0206    */
0207   Energy2 t_u_M_R_qbarq(double xt, double y) const;
0208 
0209   /**
0210    * The matrix element g + g    -> n + g times tk*uk 
0211    */
0212   Energy2 t_u_M_R_gg(double xt, double y) const;
0213 
0214   /**
0215    * The matrix element q + g    -> n + q times tk*uk 
0216    */
0217   Energy2 t_u_M_R_qg(double xt, double y) const;
0218 
0219   /**
0220    * The matrix element g + q    -> n + q times tk*uk 
0221    */
0222   Energy2 t_u_M_R_gq(double xt, double y) const;
0223 
0224   /**
0225    * Function for calculation of the \f$q\bar{q}\f$ initiated real
0226    * contribution.
0227    */
0228   double Rtilde_Ltilde_qqbar_on_x(tcPDPtr a,tcPDPtr b,double xt,double y) const;
0229 
0230   /**
0231    * Function for calculation of the \f$\bar{q}q\f$ initiated real
0232    * contribution.
0233    */
0234   double Rtilde_Ltilde_qbarq_on_x(tcPDPtr a,tcPDPtr b,double xt,double y) const;
0235 
0236   /**
0237    * Function for calculation of the \f$qq\f$ 
0238    * initiated real contribution.
0239    */
0240   double Rtilde_Ltilde_gg_on_x(tcPDPtr a,tcPDPtr b,double xt,double y) const;
0241 
0242   /**
0243    * Function for calculation of the \f$qg\f$ initiated real
0244    * contribution.
0245    */
0246   double Rtilde_Ltilde_qg_on_x(tcPDPtr a,tcPDPtr b,double xt,double y) const;
0247 
0248   /**
0249    * Function for calculation of the \f$gq\f$ initiated real
0250    * contribution.
0251    */
0252   double Rtilde_Ltilde_gq_on_x(tcPDPtr a,tcPDPtr b,double xt,double y) const;
0253 
0254 protected:
0255 
0256   /** @name Clone Methods. */
0257   //@{
0258   /**
0259    * Make a simple clone of this object.
0260    * @return a pointer to the new object.
0261    */
0262   virtual IBPtr clone() const { return new_ptr(*this); }
0263 
0264   /** Make a clone of this object, possibly modifying the cloned object
0265    * to make it sane.
0266    * @return a pointer to the new object.
0267    */
0268   virtual IBPtr fullclone() const { return new_ptr(*this); }
0269   //@}
0270 
0271 private:
0272 
0273   /**
0274    * The assignment operator is private and must never be called.
0275    * In fact, it should not even be implemented.
0276    */
0277   MEPP2HiggsPowheg & operator=(const MEPP2HiggsPowheg &) = delete;
0278 
0279 private:
0280 
0281   /**
0282    *  Parameters for the NLO weight
0283    */
0284   //@{
0285   /**
0286    *  The colour factors
0287    */
0288   const double CF_ , CA_ , TR_;
0289 
0290   /**
0291    * Number of light flavours (in the beta function beta0_)
0292    */
0293   const int nlf_;
0294 
0295   /**
0296    * (Proportional to) The beta function
0297    */
0298   const double beta0_;
0299 
0300   /**
0301    *  Whether to generate the positive, negative or leading order contribution
0302    */
0303   unsigned int contrib_;
0304 
0305   /**
0306    *  Whether to use a fixed or a running QCD coupling for the NLO weight
0307    */
0308   unsigned int nlo_alphaS_opt_;
0309 
0310   /**
0311    *  The value of alphaS to use for the nlo weight if nlo_alphaS_opt_=1
0312    */
0313   double fixed_alphaS_;
0314   //@}
0315 
0316   /**
0317    *  Radiation variables
0318    */
0319   //@{
0320   /**
0321    *   The \f$\tilde{x}\f$ variable
0322    */
0323   double xt_;
0324 
0325   /**
0326    *  The \f$y\f$ angular variable
0327    */
0328   double y_;
0329   //@}
0330 
0331   /**
0332    *  Values of the PDF's before radiation
0333    */
0334   mutable double lo_lumi_;
0335 
0336   /**
0337    *  The value of the leading order gg->H matrix element
0338    */
0339   mutable double lo_ggME_;
0340 
0341   /**
0342    * The invariant mass of the lo final state. 
0343    */
0344   mutable Energy2 p2_      ;
0345 
0346   /**
0347    * The invariant mass of the lo final state. 
0348    */
0349   mutable Energy2 s2_      ;
0350 
0351   /**
0352    *  The momentum fraction of the plus parton in the Born process
0353    */
0354   mutable double xbp_;
0355 
0356   /**
0357    *  The momentum fraction of the minus parton in the Born process
0358    */
0359   mutable double  xbm_;
0360 
0361   /**
0362    *  The sqrt(1-xbp_) 
0363    */
0364   mutable double etabarp_;
0365 
0366   /**
0367    *  The sqrt(1-xbm_) 
0368    */
0369   mutable double etabarm_;
0370 
0371   /**
0372    *  The ParticleData object for the plus lo parton
0373    */
0374   mutable tcPDPtr a_lo_;
0375 
0376   /**
0377    *  The ParticleData object for the minus lo parton
0378    */
0379   mutable tcPDPtr b_lo_;
0380 
0381   /**
0382    *  The BeamParticleData object for the plus direction hadron
0383    */
0384   mutable Ptr<BeamParticleData>::transient_const_pointer hadron_A_;
0385 
0386   /**
0387    *  The BeamParticleData object for the  minus direction hadron
0388    */
0389   mutable Ptr<BeamParticleData>::transient_const_pointer hadron_B_;
0390 
0391   /**
0392    *  The value of \f$\alpha_S\f$ used for the calculation
0393    */
0394   mutable double alphaS_;
0395 
0396   /**
0397    * Selects a dynamic (sHat) or fixed factorization scale
0398    */
0399   unsigned int scaleopt_;
0400 
0401   /**
0402    * The factorization  scale 
0403    */
0404   Energy mu_F_;
0405 
0406   /**
0407    * The renormalization scale
0408    */
0409   Energy mu_UV_;
0410 
0411   /**
0412    *  Prefactor if variable scale used
0413    */
0414   double scaleFact_;
0415 };
0416 
0417 }
0418 
0419 #endif /* HERWIG_MEPP2HiggsPowheg_H */