Back to home page

EIC code displayed by LXR

 
 

    


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

0001 // -*- C++ -*-
0002 #ifndef HERWIG_MENeutralCurrentDIS_H
0003 #define HERWIG_MENeutralCurrentDIS_H
0004 //
0005 // This is the declaration of the MENeutralCurrentDIS class.
0006 //
0007 
0008 #include "DISBase.h"
0009 #include "ThePEG/Helicity/Vertex/AbstractFFVVertex.fh"
0010 #include "Herwig/MatrixElement/ProductionMatrixElement.h"
0011 #include "ThePEG/Helicity/WaveFunction/SpinorWaveFunction.h"
0012 #include "ThePEG/Helicity/WaveFunction/SpinorBarWaveFunction.h"
0013 
0014 namespace Herwig {
0015 
0016 using namespace ThePEG;
0017 
0018 /**
0019  * The MENeutralCurrentDIS class provides the matrix elements for
0020  * neutral current DIS.
0021  *
0022  *  For consistency both the incoming and outgoing quarks are assumed to be massless.
0023  *
0024  * @see \ref MENeutralCurrentDISInterfaces "The interfaces"
0025  * defined for MENeutralCurrentDIS.
0026  */
0027 class MENeutralCurrentDIS: public DISBase {
0028 
0029 public:
0030 
0031   /**
0032    * The default constructor.
0033    */
0034   MENeutralCurrentDIS();
0035 
0036   /** @name Virtual functions required by the MEBase class. */
0037   //@{
0038   /**
0039    * Return the order in \f$\alpha_S\f$ in which this matrix
0040    * element is given.
0041    */
0042   virtual unsigned int orderInAlphaS() const;
0043 
0044   /**
0045    * Return the order in \f$\alpha_{EW}\f$ in which this matrix
0046    * element is given.
0047    */
0048   virtual unsigned int orderInAlphaEW() const;
0049 
0050   /**
0051    * The matrix element for the kinematical configuration
0052    * previously provided by the last call to setKinematics(), suitably
0053    * scaled by sHat() to give a dimension-less number.
0054    * @return the matrix element scaled with sHat() to give a
0055    * dimensionless number.
0056    */
0057   virtual double me2() const;
0058 
0059   /**
0060    * Add all possible diagrams with the add() function.
0061    */
0062   virtual void getDiagrams() const;
0063 
0064   /**
0065    * Get diagram selector. With the information previously supplied with the
0066    * setKinematics method, a derived class may optionally
0067    * override this method to weight the given diagrams with their
0068    * (although certainly not physical) relative probabilities.
0069    * @param dv the diagrams to be weighted.
0070    * @return a Selector relating the given diagrams to their weights.
0071    */
0072   virtual Selector<DiagramIndex> diagrams(const DiagramVector & dv) const;
0073 
0074   /**
0075    * Return a Selector with possible colour geometries for the selected
0076    * diagram weighted by their relative probabilities.
0077    * @param diag the diagram chosen.
0078    * @return the possible colour geometries weighted by their
0079    * relative probabilities.
0080    */
0081   virtual Selector<const ColourLines *>
0082   colourGeometries(tcDiagPtr diag) const;
0083 
0084   /**
0085    *  Construct the vertex of spin correlations.
0086    */
0087   virtual void constructVertex(tSubProPtr);
0088   //@}
0089 
0090 public:
0091 
0092   /** @name Functions used by the persistent I/O system. */
0093   //@{
0094   /**
0095    * Function used to write out object persistently.
0096    * @param os the persistent output stream written to.
0097    */
0098   void persistentOutput(PersistentOStream & os) const;
0099 
0100   /**
0101    * Function used to read in object persistently.
0102    * @param is the persistent input stream read from.
0103    * @param version the version number of the object when written.
0104    */
0105   void persistentInput(PersistentIStream & is, int version);
0106   //@}
0107 
0108   /**
0109    * The standard Init function used to initialize the interfaces.
0110    * Called exactly once for each class by the class description system
0111    * before the main function starts or
0112    * when this class is dynamically loaded.
0113    */
0114   static void Init();
0115 
0116 protected:
0117 
0118   /**
0119    * Matrix element for \f$\ell q\to \gamma/Z \to \ell q\f$.
0120    * @param f1 Fermion on lepton line
0121    * @param a1 Anti-fermion on lepton line
0122    * @param f2 Fermion on quark line
0123    * @param a2 Anti-fermion on quark line
0124    * @param lorder The order of particles on the lepton line
0125    * @param qorder The order of particles on the quark line
0126    * @param me  Whether or not to calculate the matrix element for spin correlations
0127    */
0128   double helicityME(vector<SpinorWaveFunction>    & f1 ,
0129             vector<SpinorWaveFunction>    & f2,
0130             vector<SpinorBarWaveFunction> & a1 ,
0131             vector<SpinorBarWaveFunction> & a2,
0132             bool lorder, bool qorder,
0133             bool me) const;
0134 
0135 
0136   /**
0137    *  Option for treatment of \f$\gamma/Z\f$ terms
0138    */
0139   inline unsigned int gammaZOption() const {return _gammaZ;}
0140 
0141   /**
0142    *  Calculate the coefficient A for the correlations in the hard
0143    *  radiation
0144    */
0145   virtual double A(tcPDPtr lin, tcPDPtr lout, tcPDPtr qin, tcPDPtr qout,
0146            Energy2 scale) const;
0147 
0148 protected:
0149 
0150   /** @name Standard Interfaced functions. */
0151   //@{
0152   /**
0153    * Initialize this object after the setup phase before saving an
0154    * EventGenerator to disk.
0155    * @throws InitException if object could not be initialized properly.
0156    */
0157   virtual void doinit();
0158   //@}
0159 
0160 protected:
0161 
0162   /** @name Clone Methods. */
0163   //@{
0164   /**
0165    * Make a simple clone of this object.
0166    * @return a pointer to the new object.
0167    */
0168   virtual IBPtr clone() const {return new_ptr(*this);}
0169 
0170   /** Make a clone of this object, possibly modifying the cloned object
0171    * to make it sane.
0172    * @return a pointer to the new object.
0173    */
0174   virtual IBPtr fullclone() const {return new_ptr(*this);}
0175   //@}
0176 
0177 private:
0178 
0179   /**
0180    * The assignment operator is private and must never be called.
0181    * In fact, it should not even be implemented.
0182    */
0183   MENeutralCurrentDIS & operator=(const MENeutralCurrentDIS &) = delete;
0184 
0185 private:
0186 
0187   /**
0188    *  Pointer to the vertices for the helicity calculations
0189    */
0190   //@{
0191   /**
0192    *  Pointer to the Z vertex
0193    */
0194   AbstractFFVVertexPtr _theFFZVertex;
0195 
0196   /**
0197    *  Pointer to the photon vertex
0198    */
0199   AbstractFFVVertexPtr _theFFPVertex;
0200   //@}
0201 
0202   /**
0203    *  Pointers to the intermediate resonances
0204    */
0205   //@{
0206   /**
0207    *  Pointer to the Z ParticleData object
0208    */
0209   tcPDPtr _z0;
0210 
0211   /**
0212    *  Pointer to the photon ParticleData object
0213    */
0214   tcPDPtr _gamma;
0215   //@}
0216 
0217   /**
0218    *  Switches to control the particles in the hard process
0219    */
0220   //@{
0221   /**
0222    *  Minimumflavour of the incoming quarks
0223    */
0224   int _minflavour;
0225 
0226   /**
0227    *  Maximum flavour of the incoming quarks
0228    */
0229   int _maxflavour;
0230 
0231   /**
0232    *  Whether to include both \f$Z^0\f$ and \f$\gamma\f$ or only one
0233    */
0234   unsigned int _gammaZ;
0235   //@}
0236 
0237   /**
0238    * Matrix element for spin correlations
0239    */
0240   ProductionMatrixElement _me;
0241 
0242   /**
0243    *  Electroweak parameters
0244    */
0245   //@{
0246   /**
0247    *  \f$\sin\theta_W\f$
0248    */
0249   double _sinW;
0250 
0251   /**
0252    *  \f$\cos\theta_W\f$
0253    */
0254   double _cosW;
0255 
0256   /**
0257    *  The square of the Z mass
0258    */
0259   Energy2 _mz2;
0260   //@}
0261 
0262 };
0263 
0264 }
0265 
0266 #endif /* HERWIG_MENeutralCurrentDIS_H */