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