herwig is hosted by Hepforge, IPPP Durham
Herwig  7.2.1
FlatInvertiblePhasespace.h
1 // -*- C++ -*-
2 //
3 // FlatInvertiblePhasespace.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_FlatInvertiblePhasespace_H
10 #define Herwig_FlatInvertiblePhasespace_H
11 //
12 // This is the declaration of the FlatInvertiblePhasespace class.
13 //
14 
15 #include "Herwig/MatrixElement/Matchbox/Phasespace/MatchboxPhasespace.h"
16 
17 namespace Herwig {
18 
19 using namespace ThePEG;
20 
29 
30 public:
31 
38 
42  virtual ~FlatInvertiblePhasespace();
44 
45 public:
46 
50  virtual double generateTwoToNKinematics(const double*,
51  vector<Lorentz5Momentum>& momenta);
52 
57  virtual int nDimPhasespace(int nFinal) const {
58  if ( nFinal == 1 )
59  return 1;
60  return 3*nFinal - 4;
61  }
62 
63 public:
64 
68  virtual bool isInvertible() const { return true; }
69 
74  virtual double invertTwoToNKinematics(const vector<Lorentz5Momentum>& momenta,
75  double* r) const {
76  return invertKinematics(momenta,(momenta[0]+momenta[1]).m(),r);
77  }
78 
79 private:
80 
84  double bisect(double v, double n,
85  double target = -16., double maxLevel = 80.) const;
86 
90  double rho(Energy M, Energy N, Energy m) const {
91  return sqrt((sqr(M)-sqr(N+m))*(sqr(M)-sqr(N-m)))/(8.*sqr(M));
92  }
93 
97  double generateIntermediates(vector<Energy>& K,
98  const double* r) const;
99 
103  double invertIntermediates(const vector<Energy>& K,
104  double* r) const;
105 
109  double generateIntermediates(vector<Energy>& M,
110  const vector<Energy>& m,
111  const double* r) const;
112 
116  double invertIntermediates(const vector<Energy>& M,
117  const vector<Energy>& m,
118  double* r) const;
119 
123  double generateKinematics(vector<Lorentz5Momentum>& P,
124  Energy Ecm,
125  const double* r) const;
126 
130  double invertKinematics(const vector<Lorentz5Momentum>& P,
131  Energy Ecm,
132  double* r) const;
133 
142  long double flatWeights(int n) const;
143 
144 public:
145 
152  void persistentOutput(PersistentOStream & os) const;
153 
159  void persistentInput(PersistentIStream & is, int version);
161 
168  static void Init();
169 
170 protected:
171 
178  virtual IBPtr clone() const;
179 
184  virtual IBPtr fullclone() const;
186 
187 
188 // If needed, insert declarations of virtual function defined in the
189 // InterfacedBase class here (using ThePEG-interfaced-decl in Emacs).
190 
191 
192 private:
193 
198  FlatInvertiblePhasespace & operator=(const FlatInvertiblePhasespace &) = delete;
199 
200 };
201 
202 }
203 
204 #endif /* Herwig_FlatInvertiblePhasespace_H */
double sqrt(int x)
ThePEG::Ptr< InterfacedBase >::pointer IBPtr
constexpr auto sqr(const T &x) -> decltype(x *x)
MatchboxPhasespace defines an abstract interface to a phase space generator.
FlatInvertiblePhasespace implements flat, invertible phase space generation.
virtual double invertTwoToNKinematics(const vector< Lorentz5Momentum > &momenta, double *r) const
Invert the given phase space point to the random numbers which would have generated it...
-*- C++ -*-
double rho(Energy M, Energy N, Energy m) const
Return rho.
virtual bool isInvertible() const
Return true, if this phase space generator is invertible.
virtual int nDimPhasespace(int nFinal) const
Return the number of random numbers required to produce a given multiplicity final state...