File indexing completed on 2026-08-06 09:24:24
0001
0002
0003
0004
0005
0006
0007
0008
0009 #ifndef HERWIG_FFMassiveKinematics_H
0010 #define HERWIG_FFMassiveKinematics_H
0011
0012
0013
0014
0015 #include "DipoleSplittingKinematics.h"
0016
0017 namespace Herwig {
0018
0019 using namespace ThePEG;
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029 class FFMassiveKinematics: public DipoleSplittingKinematics {
0030
0031 public:
0032
0033
0034
0035
0036 FFMassiveKinematics();
0037
0038 public:
0039
0040
0041
0042
0043
0044
0045 virtual pair<double,double> kappaSupport(const DipoleSplittingInfo& dIndex) const;
0046
0047
0048
0049
0050
0051 virtual pair<double,double> xiSupport(const DipoleSplittingInfo& dIndex) const;
0052
0053
0054
0055
0056 virtual pair<double,double> zBoundaries(Energy,
0057 const DipoleSplittingInfo&,
0058 const DipoleSplittingKernel&) const {
0059 return {0.0,1.0};
0060 }
0061
0062
0063
0064
0065
0066
0067
0068
0069
0070 virtual Energy dipoleScale(const Lorentz5Momentum& pEmitter,
0071 const Lorentz5Momentum& pSpectator) const;
0072
0073
0074
0075
0076 virtual Energy ptMax(Energy dScale,
0077 double emX, double specX,
0078 const DipoleSplittingInfo& dInfo,
0079 const DipoleSplittingKernel& split) const;
0080
0081
0082
0083
0084 virtual Energy ptMax(Energy dScale,
0085 double, double,
0086 const DipoleIndex& dIndex,
0087 const DipoleSplittingKernel& split,
0088 tPPtr emitter, tPPtr spectator) const;
0089
0090
0091
0092
0093 virtual Energy ptMax(Energy,
0094 double, double,
0095 const DipoleIndex&,
0096 const DipoleSplittingKernel&) const {
0097
0098
0099 assert(false);
0100 return ZERO;
0101 }
0102
0103
0104
0105
0106 virtual Energy QMax(Energy dScale,
0107 double emX, double specX,
0108 const DipoleSplittingInfo& dInfo,
0109 const DipoleSplittingKernel& split) const;
0110
0111
0112
0113
0114 virtual Energy QMax(Energy,
0115 double, double,
0116 const DipoleIndex&,
0117 const DipoleSplittingKernel&) const {
0118
0119
0120 assert(false);
0121 return ZERO;
0122 }
0123
0124
0125
0126
0127 virtual Energy PtFromQ(Energy scale, const DipoleSplittingInfo&) const;
0128
0129
0130
0131
0132 virtual Energy QFromPt(Energy scale, const DipoleSplittingInfo&) const;
0133
0134
0135
0136
0137
0138 virtual double ptToRandom(Energy pt, Energy dScale,
0139 double emX, double specX,
0140 const DipoleIndex& dIndex,
0141 const DipoleSplittingKernel& split) const;
0142
0143
0144
0145
0146
0147
0148 virtual bool generateSplitting(double kappa, double xi, double phi,
0149 DipoleSplittingInfo& dIndex,
0150 const DipoleSplittingKernel& split);
0151
0152
0153
0154
0155
0156
0157 virtual void generateKinematics(const Lorentz5Momentum& pEmitter,
0158 const Lorentz5Momentum& pSpectator,
0159 const DipoleSplittingInfo& dInfo);
0160
0161 public:
0162
0163
0164
0165
0166 template <class T>
0167 inline T rootOfKallen (T a, T b, T c) const {
0168 if ( a*a + b*b + c*c - 2.*(a*b + a*c + b*c) > ZERO )
0169 return sqrt(a*a + b*b + c*c - 2.*(a*b + a*c + b*c) ) ;
0170 else
0171 return ZERO; }
0172
0173
0174
0175
0176
0177
0178 ThreeVector<double> rotateToZ (Lorentz5Momentum& pTarget, Lorentz5Momentum& p1){
0179 ThreeVector<double> oldAxis = pTarget.vect().unit();
0180 double ct = oldAxis.z(); double st = sqrt( 1.-sqr(ct) );
0181 double cp = oldAxis.x()/st; double sp = oldAxis.y()/st;
0182 pTarget.setZ( pTarget.vect().mag() ); pTarget.setX( 0.*GeV ); pTarget.setY( 0.*GeV );
0183 Lorentz5Momentum p1old = p1;
0184 p1.setX( sp*p1old.x() - cp*p1old.y() );
0185 p1.setY( ct*cp*p1old.x() + ct*sp*p1old.y() - st*p1old.z() );
0186 p1.setZ( st*cp*p1old.x() + st*sp*p1old.y() + ct*p1old.z() );
0187 return oldAxis;
0188 }
0189
0190 public:
0191
0192
0193
0194
0195
0196
0197
0198 void persistentOutput(PersistentOStream & os) const;
0199
0200
0201
0202
0203
0204
0205 void persistentInput(PersistentIStream & is, int version);
0206
0207
0208
0209
0210
0211
0212
0213
0214 static void Init();
0215
0216 protected:
0217
0218
0219
0220
0221
0222
0223
0224 virtual IBPtr clone() const;
0225
0226
0227
0228
0229
0230 virtual IBPtr fullclone() const;
0231
0232
0233
0234
0235
0236
0237
0238 private:
0239
0240
0241
0242
0243
0244 static ClassDescription<FFMassiveKinematics> initFFMassiveKinematics;
0245
0246
0247
0248
0249
0250 FFMassiveKinematics & operator=(const FFMassiveKinematics &) = delete;
0251
0252 };
0253
0254 }
0255
0256 #include "ThePEG/Utilities/ClassTraits.h"
0257
0258 namespace ThePEG {
0259
0260
0261
0262
0263
0264 template <>
0265 struct BaseClassTrait<Herwig::FFMassiveKinematics,1> {
0266
0267 typedef Herwig::DipoleSplittingKinematics NthBase;
0268 };
0269
0270
0271
0272 template <>
0273 struct ClassTraits<Herwig::FFMassiveKinematics>
0274 : public ClassTraitsBase<Herwig::FFMassiveKinematics> {
0275
0276 static string className() { return "Herwig::FFMassiveKinematics"; }
0277
0278
0279
0280
0281
0282
0283
0284 static string library() { return "HwDipoleShower.so"; }
0285 };
0286
0287
0288
0289 }
0290
0291 #endif