Back to home page

EIC code displayed by LXR

 
 

    


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

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