herwig is hosted by Hepforge, IPPP Durham
Herwig++  2.7.0
SMZFermionsPOWHEGDecayer.h
00001 // -*- C++ -*-
00002 #ifndef HERWIG_SMZFermionsPOWHEGDecayer_H
00003 #define HERWIG_SMZFermionsPOWHEGDecayer_H
00004 //
00005 // This is the declaration of the SMZFermionsPOWHEGDecayer class.
00006 //
00007 
00008 #include "SMZDecayer.h"
00009 #include "Herwig++/Utilities/Maths.h"
00010 
00011 namespace Herwig {
00012   
00013 using namespace ThePEG;
00014 
00015 
00022   class SMZFermionsPOWHEGDecayer: public SMZDecayer{
00023 
00024 public:
00025 
00029     SMZFermionsPOWHEGDecayer();
00030     
00034     virtual POWHEGType hasPOWHEGCorrection() {return FSR;}
00035 
00039   virtual HardTreePtr generateHardest(ShowerTreePtr);
00040   
00045   virtual double me2(const int ichan, const Particle & part,
00046                      const ParticleVector & decay, MEOption meopt) const;
00047 
00048 public:
00049 
00056   void persistentOutput(PersistentOStream & os) const;
00057 
00063   void persistentInput(PersistentIStream & is, int version);
00065 
00072   static void Init();
00073 
00074 protected:
00075 
00082   virtual IBPtr clone() const;
00083 
00088   virtual IBPtr fullclone() const;
00090 
00091 protected:
00092 
00100   virtual void doinit();
00102 
00103 private:
00104 
00109   static ClassDescription<SMZFermionsPOWHEGDecayer> initSMZFermionsPOWHEGDecayer;
00110 
00115   SMZFermionsPOWHEGDecayer & operator=(const SMZFermionsPOWHEGDecayer &);
00116 
00120   AbstractFFVVertexPtr FFZVertex() const {return FFZVertex_;}
00121 
00125   AbstractFFVVertexPtr FFGVertex() const {return FFGVertex_;}
00126 
00130   double calculateRealEmission(double x1, double x2, 
00131                                vector<PPtr> hardProcess,
00132                                double phi,
00133                                bool subtract,
00134                                int emitter) const;
00135 
00139   double calculateRealEmission(double x1, double x2, 
00140                                vector<PPtr> hardProcess,
00141                                double phi,
00142                                bool subtract) const;
00143 
00147   bool checkZMomenta(double x1, double x2, double x3, double y, Energy pT) const;
00148 
00152   InvEnergy calculateJacobian(double x1, double x2, Energy pT) const;
00153 
00157   double meRatio(vector<cPDPtr> partons, 
00158                  vector<Lorentz5Momentum> momenta,
00159                  unsigned int iemitter,bool subtract) const;
00163   double loME(const vector<cPDPtr> & partons, 
00164               const vector<Lorentz5Momentum> & momenta) const;
00165 
00169   InvEnergy2 realME(const vector<cPDPtr> & partons, 
00170                   const vector<Lorentz5Momentum> & momenta) const;
00171 
00175   bool getEvent(vector<PPtr> hardProcess);
00176 
00177 private:
00178 
00182   AbstractFFVVertexPtr FFZVertex_;
00183 
00187   AbstractFFVVertexPtr FFGVertex_;
00188 
00192   double CF_;
00193 
00197   mutable Energy mZ_;
00198 
00202   mutable double mu_;
00203 
00207   mutable double mu2_;
00208 
00212   mutable double aS_;
00213 
00217   mutable Energy2 scale_;
00218 
00226   tcPDPtr gluon_;
00227 
00231   Energy pTmin_;
00232 
00233   //  radiative variables (pt,y)
00234   Energy pT_;
00235 
00239   vector<tcPDPtr> partons_;
00240 
00244   vector<Lorentz5Momentum> quark_;
00245 
00249   Lorentz5Momentum gauge_;
00250 
00254   PPtr zboson_;
00255 
00259   Energy2 mz2_;
00261 };
00262 
00263 }
00264 
00265 #include "ThePEG/Utilities/ClassTraits.h"
00266 
00267 namespace ThePEG {
00268 
00273 template <>
00274 struct BaseClassTrait<Herwig::SMZFermionsPOWHEGDecayer,1> {
00276   typedef Herwig::SMZDecayer NthBase;
00277 };
00278 
00281 template <>
00282 struct ClassTraits<Herwig::SMZFermionsPOWHEGDecayer>
00283   : public ClassTraitsBase<Herwig::SMZFermionsPOWHEGDecayer> {
00285   static string className() { return "Herwig::SMZFermionsPOWHEGDecayer"; }
00293   static string library() { return "HwPerturbativeDecay.so"; }
00294 };
00295 
00298 }
00299 
00300 #endif /* HERWIG_SMZFermionsPOWHEGDecayer_H */