herwig is hosted by Hepforge, IPPP Durham
Herwig  7.2.1
FIMassiveKinematics.h
1 // -*- C++ -*-
2 //
3 // FILightKinematics.h is a part of Herwig - A multi-purpose Monte Carlo event generator
4 // Copyright (C) 2002-2019 The Herwig Collaboration
5 //
6 // Herwig is licenced under version 3 of the GPL, see COPYING for details.
7 // Please respect the MCnet academic guidelines, see GUIDELINES for details.
8 //
9 #ifndef HERWIG_FILightKinematics_H
10 #define HERWIG_FILightKinematics_H
11 //
12 // This is the declaration of the FILightKinematics class.
13 //
14 
15 #include "DipoleSplittingKinematics.h"
16 
17 namespace Herwig {
18 
19 using namespace ThePEG;
20 
30 
31 public:
32 
39 
43  virtual ~FIMassiveKinematics();
45 
46 public:
47 
53  virtual pair<double,double> kappaSupport(const DipoleSplittingInfo& dIndex) const;
54 
59  virtual pair<double,double> xiSupport(const DipoleSplittingInfo& dIndex) const;
60 
64  virtual pair<double,double> zBoundaries(Energy,
65  const DipoleSplittingInfo&,
66  const DipoleSplittingKernel&) const {
67  return {0.0,1.0};
68  }
69 
78  virtual Energy dipoleScale(const Lorentz5Momentum& pEmitter,
79  const Lorentz5Momentum& pSpectator) const;
80 
84  virtual Energy ptMax(Energy dScale,
85  double emX, double specX,
86  const DipoleSplittingInfo& dInfo,
87  const DipoleSplittingKernel& split) const;
88 
92  virtual Energy ptMax(Energy dScale,
93  double, double,
94  const DipoleIndex& dIndex,
95  const DipoleSplittingKernel& split,
96  tPPtr emitter, tPPtr) const;
97 
101  virtual Energy ptMax(Energy,
102  double, double,
103  const DipoleIndex&,
104  const DipoleSplittingKernel&) const {
105  // Only the DipoleSplittingInfo version should be used for massive
106  // dipoles, for now anyway.
107  assert(false);
108  return ZERO;
109  }
110 
114  virtual Energy QMax(Energy dScale,
115  double emX, double specX,
116  const DipoleSplittingInfo& dInfo,
117  const DipoleSplittingKernel& split) const;
118 
122  virtual Energy QMax(Energy,
123  double, double,
124  const DipoleIndex&,
125  const DipoleSplittingKernel&) const {
126  // Only the DipoleSplittingInfo version should be used for massive
127  // dipoles, for now anyway.
128  assert(false);
129  return ZERO;
130  }
131 
135  virtual Energy PtFromQ(Energy scale, const DipoleSplittingInfo&) const;
136 
140  virtual Energy QFromPt(Energy scale, const DipoleSplittingInfo&) const;
141 
146  virtual double ptToRandom(Energy pt, Energy dScale,
147  double emX, double specX,
148  const DipoleIndex& dIndex,
149  const DipoleSplittingKernel&) const;
150 
156  virtual bool generateSplitting(double kappa, double xi, double phi,
157  DipoleSplittingInfo& dIndex,
158  const DipoleSplittingKernel&);
159 
165  virtual void generateKinematics(const Lorentz5Momentum& pEmitter,
166  const Lorentz5Momentum& pSpectator,
167  const DipoleSplittingInfo& dInfo);
168 
169 public:
170 
174  template <class T>
175  inline double rootOfKallen (T a, T b, T c) const {
176  double sres=a*a + b*b + c*c - 2.*( a*b+a*c+b*c );
177  return sres>0.?sqrt( sres ):0.; }
178 
179 
180 public:
181 
188  void persistentOutput(PersistentOStream & os) const;
189 
195  void persistentInput(PersistentIStream & is, int version);
197 
204  static void Init();
205 
206 protected:
207 
214  virtual IBPtr clone() const;
215 
220  virtual IBPtr fullclone() const;
222 
223 
224 // If needed, insert declarations of virtual function defined in the
225 // InterfacedBase class here (using ThePEG-interfaced-decl in Emacs).
226 
227 
228 private:
229 
235 
240  FIMassiveKinematics & operator=(const FIMassiveKinematics &) = delete;
241 
242 };
243 
244 }
245 
246 #include "ThePEG/Utilities/ClassTraits.h"
247 
248 namespace ThePEG {
249 
254 template <>
255 struct BaseClassTrait<Herwig::FIMassiveKinematics,1> {
257  typedef Herwig::DipoleSplittingKinematics NthBase;
258 };
259 
262 template <>
263 struct ClassTraits<Herwig::FIMassiveKinematics>
264  : public ClassTraitsBase<Herwig::FIMassiveKinematics> {
266  static string className() { return "Herwig::FIMassiveKinematics"; }
274  static string library() { return "HwDipoleShower.so"; }
275 };
276 
279 }
280 
281 #endif /* HERWIG_FIMassiveKinematics_H */
double sqrt(int x)
DipoleSplittingKinematics is the base class for dipole splittings as performed in the dipole shower...
ThePEG::Ptr< InterfacedBase >::pointer IBPtr
DipoleIndex is used to index splitting generators for a particular dipole.
FIMassiveKinematics implements massless splittings off a final-initial dipole.
static ClassDescription< FIMassiveKinematics > initFIMassiveKinematics
The static object used to initialize the description of this class.
virtual Energy QMax(Energy, double, double, const DipoleIndex &, const DipoleSplittingKernel &) const
Return the maximum virtuality for the given dipole scale.
virtual Energy ptMax(Energy, double, double, const DipoleIndex &, const DipoleSplittingKernel &) const
Return the maximum pt for the given dipole scale.
double rootOfKallen(T a, T b, T c) const
Triangular / Kallen function.
ThePEG::Ptr< Particle >::transient_pointer tPPtr
-*- C++ -*-
virtual pair< double, double > zBoundaries(Energy, const DipoleSplittingInfo &, const DipoleSplittingKernel &) const
Return the boundaries on the momentum fraction.
DipoleSplittingInfo contains all parameters to generate a full dipole splitting.
constexpr ZeroUnit ZERO
DipoleSplittingKernel is the base class for all kernels used within the dipole shower.