herwig is hosted by Hepforge, IPPP Durham
Herwig++  2.7.0
MEqq2ZPrime2ZGamma2ffGamma.h
00001 // -*- C++ -*-
00002 #ifndef RADIATIVEZPRIME_MEqq2ZPrime2ZGamma2ffGamma_H
00003 #define RADIATIVEZPRIME_MEqq2ZPrime2ZGamma2ffGamma_H
00004 //
00005 // This is the declaration of the MEqq2ZPrime2ZGamma2ffGamma class.
00006 //
00007 
00008 #include "ThePEG/MatrixElement/MEBase.h"
00009 #include "ThePEG/Helicity/WaveFunction/SpinorWaveFunction.h"
00010 #include "ThePEG/Helicity/WaveFunction/VectorWaveFunction.h"
00011 #include "ThePEG/Helicity/WaveFunction/SpinorBarWaveFunction.h"
00012 #include "Herwig++/MatrixElement/ProductionMatrixElement.h"
00013 #include "ThePEG/Helicity/Vertex/AbstractFFVVertex.fh"
00014 #include "ThePEG/Helicity/Vertex/AbstractVVVVertex.fh"
00015 
00016 namespace RadiativeZPrime {
00017 
00018 using namespace ThePEG;
00019 using namespace Herwig;
00020 
00028 class MEqq2ZPrime2ZGamma2ffGamma: public MEBase {
00029 
00030 public:
00031 
00037   inline MEqq2ZPrime2ZGamma2ffGamma()  :_maxflavour(5) {}
00038 
00045   virtual unsigned int orderInAlphaS() const;
00046 
00051   virtual unsigned int orderInAlphaEW() const;
00052 
00060   virtual double me2() const;
00061 
00065   virtual Energy2 scale() const;
00066 
00071   virtual int nDim() const;
00072 
00081   virtual bool generateKinematics(const double * r);
00082 
00087   virtual CrossSection dSigHatDR() const;
00088 
00092   virtual void getDiagrams() const;
00093 
00102   virtual Selector<DiagramIndex> diagrams(const DiagramVector & dv) const;
00103 
00111   virtual Selector<const ColourLines *>
00112   colourGeometries(tcDiagPtr diag) const;
00113 
00117   virtual void constructVertex(tSubProPtr);
00119 
00120 public:
00121 
00128   void persistentOutput(PersistentOStream & os) const;
00129 
00135   void persistentInput(PersistentIStream & is, int version);
00137 
00144   static void Init();
00145 
00146 protected:
00147 
00152   double getCosTheta(double cthmin, double cthmax, const double r);
00153 
00167   InvEnergy2 qqbarME(vector<SpinorWaveFunction> & fin,
00168                      vector<SpinorBarWaveFunction> & ain,
00169                      vector<VectorWaveFunction> & gout,
00170                      vector<SpinorBarWaveFunction> & lm, vector<SpinorWaveFunction> & lp,
00171                      bool me=false) const;
00172 
00173 protected:
00174 
00181   inline virtual IBPtr clone() const {return new_ptr(*this);}
00182 
00187   inline virtual IBPtr fullclone() const {return new_ptr(*this);}
00189 
00190 protected:
00191 
00199   virtual void doinit();
00201 
00202 private:
00203 
00208   static ClassDescription<MEqq2ZPrime2ZGamma2ffGamma> initMEqq2ZPrime2ZGamma2ffGamma;
00209 
00214   MEqq2ZPrime2ZGamma2ffGamma & operator=(const MEqq2ZPrime2ZGamma2ffGamma &);
00215 
00216 private:
00217 
00225   AbstractFFVVertexPtr _theFFZVertex;
00229   AbstractFFVVertexPtr _theFFZPrimeVertex;
00230 
00234   AbstractVVVVertexPtr _theGammaZPrimeZVertex;
00236 
00244   tcPDPtr _z0;
00245 
00249   tcPDPtr _zPrime;
00251 
00259   unsigned int _maxflavour;
00261 
00265   ProductionMatrixElement _me;
00266   
00270   Energy2 _mz2;
00271 
00272 };
00273 
00274 }
00275 
00276 #include "ThePEG/Utilities/ClassTraits.h"
00277 
00278 namespace ThePEG {
00279 
00284 template <>
00285 struct BaseClassTrait<RadiativeZPrime::MEqq2ZPrime2ZGamma2ffGamma,1> {
00287   typedef MEBase NthBase;
00288 };
00289 
00292 template <>
00293 struct ClassTraits<RadiativeZPrime::MEqq2ZPrime2ZGamma2ffGamma>
00294   : public ClassTraitsBase<RadiativeZPrime::MEqq2ZPrime2ZGamma2ffGamma> {
00296   static string className() { return "RadiativeZPrime::MEqq2ZPrime2ZGamma2ffGamma"; }
00304   static string library() { return "RadiativeZPrime.so"; }
00305 };
00306 
00309 }
00310 
00311 #endif /* RADIATIVEZPRIME_MEqq2ZPrime2ZGamma2ffGamma_H */