PYTHIA  8.314
SimpleTimeShower.h
1 // SimpleTimeShower.h is a part of the PYTHIA event generator.
2 // Copyright (C) 2025 Torbjorn Sjostrand.
3 // PYTHIA is licenced under the GNU GPL v2 or later, see COPYING for details.
4 // Please respect the MCnet Guidelines, see GUIDELINES for details.
5 
6 // Header file for the original simple timelike final-state showers.
7 // TimeDipoleEnd: data on a radiating dipole end in FSR.
8 // SimpleTimeShower: handles the showering description.
9 
10 #ifndef Pythia8_SimpleTimeShower_H
11 #define Pythia8_SimpleTimeShower_H
12 
13 #include "Pythia8/TimeShower.h"
14 #include "Pythia8/SimpleWeakShowerMEs.h"
15 
16 namespace Pythia8 {
17 
18 // Forward declaration of SplitOnia;
19 class SplitOnia;
20 
21 //==========================================================================
22 
23 // Data on radiating dipole ends; only used inside SimpleTimeShower class.
24 
26 
27 public:
28 
29  // Constructors.
30  TimeDipoleEnd() : iRadiator(-1), iRecoiler(-1), pTmax(0.), colType(0),
31  chgType(0), gamType(0), weakType(0), isrType(0), system(0), systemRec(0),
32  MEtype(0), iMEpartner(-1), weakPol(0), oniumType(0), isHiddenValley(false),
33  colvType(0), MEmix(0.), MEorder(true), MEsplit(true), MEgluinoRec(false),
34  isFlexible(false), hasJunction(false), flavour(), iAunt(),
35  mRad(), m2Rad(), mRec(), m2Rec(), mDip(), m2Dip(), m2DipCorr(), pT2(),
36  m2(), z(), mFlavour(), asymPol(), flexFactor(), pAccept() {}
37  TimeDipoleEnd(int iRadiatorIn, int iRecoilerIn, double pTmaxIn = 0.,
38  int colIn = 0, int chgIn = 0, int gamIn = 0, int weakTypeIn = 0,
39  int isrIn = 0, int systemIn = 0, int MEtypeIn = 0, int iMEpartnerIn = -1,
40  int weakPolIn = 0, int oniumTypeIn = 0,
41  bool isHiddenValleyIn = false, int colvTypeIn = 0, double MEmixIn = 0.,
42  bool MEorderIn = true, bool MEsplitIn = true, bool MEgluinoRecIn = false,
43  bool isFlexibleIn = false, bool hasJunctionIn = false) :
44  iRadiator(iRadiatorIn), iRecoiler(iRecoilerIn), pTmax(pTmaxIn),
45  colType(colIn), chgType(chgIn), gamType(gamIn), weakType(weakTypeIn),
46  isrType(isrIn), system(systemIn), systemRec(systemIn), MEtype(MEtypeIn),
47  iMEpartner(iMEpartnerIn), weakPol(weakPolIn), oniumType(oniumTypeIn),
48  isHiddenValley(isHiddenValleyIn), colvType(colvTypeIn), MEmix(MEmixIn),
49  MEorder (MEorderIn), MEsplit(MEsplitIn), MEgluinoRec(MEgluinoRecIn),
50  isFlexible(isFlexibleIn), hasJunction(hasJunctionIn),
51  flavour(), iAunt(), mRad(), m2Rad(), mRec(), m2Rec(), mDip(), m2Dip(),
52  m2DipCorr(), pT2(), m2(), z(), mFlavour(), asymPol(), flexFactor(),
53  pAccept() {}
54 
55  // Basic properties related to dipole and matrix element corrections.
56  int iRadiator, iRecoiler;
57  double pTmax;
58  int colType, chgType, gamType, weakType, isrType, system, systemRec,
59  MEtype, iMEpartner, weakPol, oniumType;
60  bool isHiddenValley;
61  int colvType;
62  double MEmix;
63  bool MEorder, MEsplit, MEgluinoRec, isFlexible;
64  bool hasJunction;
65 
66 
67  // Properties specific to current trial emission.
68  int flavour, iAunt;
69  double mRad, m2Rad, mRec, m2Rec, mDip, m2Dip, m2DipCorr,
70  pT2, m2, z, mFlavour, asymPol, flexFactor, pAccept;
71  double m2A{0}, m2B{0}, m2C{0}, m2gg{-1};
72 
73  // Pointer to an onium emission object, if present.
74  shared_ptr<SplitOnia> emissionPtr{};
75 
76 };
77 
78 //==========================================================================
79 
80 // The SimpleTimeShower class does timelike showers.
81 
82 class SimpleTimeShower : public TimeShower {
83 
84 public:
85 
86  // Constructor.
87  SimpleTimeShower() : hasWeaklyRadiated(), iSysSel(), pTmaxFudge(),
88  pTLastBranch(), doQCDshower(), doQEDshowerByQ(), doQEDshowerByL(),
89  doQEDshowerByOther(), doQEDshowerByGamma(), doWeakShower(),
90  doMEcorrections(), doMEextended(), doMEafterFirst(),
91  doPhiPolAsym(), doPhiPolAsymHard(), doInterleave(),
92  doInterleaveResDec(), allowBeamRecoil(), dampenBeamRecoil(),
93  useFixedFacScale(), allowRescatter(), canVetoEmission(),
94  doHVshower(), brokenHVsym(), setLambdaHV(), globalRecoil(),
95  useLocalRecoilNow(), doSecondHard(), hasUserHooks(),
96  singleWeakEmission(), alphaSuseCMW(), vetoWeakJets(),
97  allowMPIdipole(), weakExternal(), recoilDeadCone(),
98  doDipoleRecoil(), doPartonVertex(), recoilRFUseParents(false),
99  pTmaxMatch(), pTdampMatch(), alphaSorder(), alphaSnfmax(),
100  nGluonToQuark(), weightGluonToQuark(), recoilStrategyRF(),
101  alphaEMorder(), nGammaToQuark(), nGammaToLepton(), nCHV(),
102  nFlavHV(), idHV(), alphaHVorder(), nMaxGlobalRecoil(), weakMode(),
103  pTdampFudge(), mc(), mb(), m2c(), m2b(), renormMultFac(),
104  factorMultFac(), fixedFacScale2(), alphaSvalue(), alphaS2pi(),
105  Lambda3flav(), Lambda4flav(), Lambda5flav(), Lambda3flav2(),
106  Lambda4flav2(), Lambda5flav2(), scaleGluonToQuark(),
107  extraGluonToQuark(), weightRF(1), pTcolCutMin(), pTcolCut(),
108  pT2colCut(), pTchgQCut(), pT2chgQCut(), pTchgLCut(), pT2chgLCut(),
109  pTweakCut(), pT2weakCut(), mMaxGamma(), m2MaxGamma(), mZ(),
110  gammaZ(), thetaWRat(), mW(), gammaW(), CFHV(), alphaHVfix(),
111  alphaHVref(), LambdaHV(), pThvCut(), pT2hvCut(), mHV(),
112  pTmaxFudgeMPI(), weakEnhancement(), vetoWeakDeltaR2(), twoHard(),
113  dopTlimit1(), dopTlimit2(), dopTdamp(), pT2damp(), kRad(), kEmt(),
114  pdfScale2(), doTrialNow(), canEnhanceEmission(),
115  canEnhanceTrial(), canEnhanceET(), doUncertaintiesNow(), dipSel(),
116  iDipSel(), nHard(), nFinalBorn(), nMaxGlobalBranch(), nGlobal(),
117  globalRecoilMode(), limitMUQ(), weakHardSize() { beamOffset = 0;
118  pdfMode = 0; useSystems = true; }
119 
120  // Destructor.
121  virtual ~SimpleTimeShower() override {}
122 
123  // Initialize alphaStrong and related pTmin parameters.
124  virtual void init( BeamParticlePtr beamAPtrIn = nullptr,
125  BeamParticlePtr beamBPtrIn = nullptr) override;
126 
127  // Find whether to limit maximum scale of emissions, and whether to dampen.
128  virtual bool limitPTmax( Event& event, double Q2Fac = 0.,
129  double Q2Ren = 0.) override;
130 
131  // Top-level routine to do a full time-like shower in resonance decay.
132  virtual int shower( int iBeg, int iEnd, Event& event, double pTmax,
133  int nBranchMax = 0) override;
134 
135  // Top-level routine for QED radiation in hadronic decay to two leptons.
136  virtual int showerQED( int i1, int i2, Event& event, double pTmax = -1.)
137  override;
138 
139  // Prepare process-level event for shower + interleaved resonance decays.
140  // Usage: prepareProcess( process, event, iPos).
141  // iPos provides mapping from process to event entries (before showering).
142  virtual void prepareProcess( Event& process, Event&, vector<int>&) override;
143 
144  // Global recoil: reset counters and store locations of outgoing partons.
145  virtual void prepareGlobal( Event& event) override;
146 
147  // Prepare system for evolution after each new interaction; identify ME.
148  virtual void prepare( int iSys, Event& event, bool limitPTmaxIn = true)
149  override;
150 
151  // Update dipole list after a multiparton interactions rescattering.
152  virtual void rescatterUpdate( int iSys, Event& event) override;
153 
154  // Update dipole list after each ISR emission.
155  virtual void update( int iSys, Event& event, bool hasWeakRad = false)
156  override;
157 
158  // Select next pT for FSR in downwards evolution.
159  virtual double pTnext( Event& event, double pTbegAll, double pTendAll,
160  bool isFirstTrial = false, bool doTrialIn = false) override;
161 
162  // Select next pT for interleaved resonance decays.
163  virtual double pTnextResDec() override;
164 
165  // ME corrections and kinematics that may give failure.
166  virtual bool branch( Event& event, bool isInterleaved = false) override;
167 
168  // Do a resonance decay + resonance shower (including any nested decays).
169  // May be called recursively for nested decays.
170  // Usage: resonanceShower( process, event, iPos, pTmerge), where iPos
171  // maps process to event entries, and pTmerge is the scale at which this
172  // system should be merged into its parent system.
173  virtual bool resonanceShower(Event& process, Event& event,
174  vector<int>& iPos, double qRestart) override;
175 
176  // Print dipole list; for debug mainly.
177  virtual void list() const override;
178 
179  // Initialize data members for calculation of uncertainty bands.
180  virtual bool initUncertainties() override;
181 
182  // Initialize data members for application of enhancements.
183  virtual bool initEnhancements() override;
184 
185  // Tell whether FSR has done a weak emission.
186  virtual bool getHasWeaklyRadiated() override {return hasWeaklyRadiated;}
187 
188  // Tell which system was the last processed one.
189  virtual int system() const override {return iSysSel;}
190 
191  // Potential enhancement factor of pTmax scale for hardest emission.
192  virtual double enhancePTmax() override {return pTmaxFudge;}
193 
194  // Provide the pT scale of the last branching in the above shower.
195  virtual double pTLastInShower() override {return pTLastBranch;}
196 
197  // Functions to directly extract the probability of no emission between two
198  // scales. These functions are not used in the Pythia core code, but can be
199  // used by external programs to interface with the shower directly.
200  double noEmissionProbability( double pTbegAll, double pTendAll, double m2dip,
201  int id, int type, double s = -1., double x = -1.) override;
202  double pTnext( vector<TimeDipoleEnd> dipEnds, Event event, double pTbegAll,
203  double pTendAll, double m2dip, int id, int type, double s = -1.,
204  double x = -1.);
205  int pdfMode;
206  bool useSystems;
207 
208 private:
209 
210  // Constants: could only be changed in the code itself.
211  static const double MCMIN, MBMIN, SIMPLIFYROOT, XMARGIN, XMARGINCOMB,
212  WTRATIOMAX,TINYPDF, LARGEM2, THRESHM2, LAMBDA3MARGIN1ORD,
213  LAMBDA3MARGIN2ORD,WEAKPSWEIGHT, WG2QEXTRA, REJECTFACTOR,
214  PROBLIMIT;
215  static const int NLOOPMAX;
216  // Rescatter: try to fix up recoil between systems
217  static const bool FIXRESCATTER, VETONEGENERGY;
218  static const double MAXVIRTUALITYFRACTION, MAXNEGENERGYFRACTION;
219 
220  // Store properties to be returned by methods.
221  bool hasWeaklyRadiated;
222  int iSysSel;
223  double pTmaxFudge, pTLastBranch;
224 
225  // Initialization data, normally only set once.
226  bool doQCDshower, doQEDshowerByQ, doQEDshowerByL, doQEDshowerByOther,
227  doQEDshowerByGamma, doWeakShower, doMEcorrections, doMEextended,
228  doMEafterFirst, doPhiPolAsym, doPhiPolAsymHard, doInterleave,
229  doInterleaveResDec, allowBeamRecoil, dampenBeamRecoil,
230  useFixedFacScale, allowRescatter, canVetoEmission, doHVshower,
231  brokenHVsym, setLambdaHV, globalRecoil, useLocalRecoilNow,
232  doSecondHard, hasUserHooks, singleWeakEmission, alphaSuseCMW,
233  vetoWeakJets, allowMPIdipole, weakExternal, recoilDeadCone,
234  doDipoleRecoil, doPartonVertex, recoilRFUseParents;
235  int pdfModeSave;
236  int pTmaxMatch, pTdampMatch, alphaSorder, alphaSnfmax, nGluonToQuark,
237  weightGluonToQuark, recoilStrategyRF, alphaEMorder, nGammaToQuark,
238  nGammaToLepton, nCHV, nFlavHV, idHV, alphaHVorder, nMaxGlobalRecoil,
239  weakMode;
240  double pTdampFudge, mc, mb, m2c, m2b, renormMultFac, factorMultFac,
241  fixedFacScale2, alphaSvalue, alphaS2pi, Lambda3flav, Lambda4flav,
242  Lambda5flav, Lambda3flav2, Lambda4flav2, Lambda5flav2,
243  scaleGluonToQuark, extraGluonToQuark, weightRF,
244  pTcolCutMin, pTcolCut, pT2colCut, pTchgQCut, pT2chgQCut,
245  pTchgLCut, pT2chgLCut, pTweakCut, pT2weakCut, mMaxGamma, m2MaxGamma,
246  mZ, gammaZ, thetaWRat, mW, gammaW, CFHV,
247  alphaHVfix, alphaHVref, LambdaHV, pThvCut, pT2hvCut, mHV,
248  pTmaxFudgeMPI, weakEnhancement, vetoWeakDeltaR2;
249 
250  // alphaStrong, alphaEM and alpha_HV calculations.
251  AlphaStrong alphaS;
252  AlphaEM alphaEM;
253  AlphaSUN alphaHV;
254 
255  // Weak matrix elements used for corrections both of ISR and FSR.
256  SimpleWeakShowerMEs simpleWeakShowerMEs;
257 
258  // Some current values.
259  bool twoHard, dopTlimit1, dopTlimit2, dopTdamp;
260  double pT2damp, kRad, kEmt, pdfScale2;
261 
262  // Bookkeeping of enhanced actual or trial emissions (see EPJC (2013) 73).
263  bool doTrialNow, canEnhanceEmission, canEnhanceTrial, canEnhanceET,
264  doUncertaintiesNow;
265  string splittingNameNow, splittingNameSel;
266  map< double, pair<string,double> > enhanceFactors;
267  void storeEnhanceFactor(double pT2, string name, double enhanceFactorIn)
268  { enhanceFactors.insert(make_pair(pT2,make_pair(name,enhanceFactorIn)));}
269 
270  // All dipole ends and a pointer to the selected hardest dipole end.
271  vector<TimeDipoleEnd> dipEnd;
272  TimeDipoleEnd* dipSel;
273  int iDipSel;
274 
275  // Setup a dipole end, either QCD, QED/photon, weak or Hidden Valley one.
276  void setupQCDdip( int iSys, int i, int colTag, int colSign, Event& event,
277  bool isOctetOnium = false, bool limitPTmaxIn = true);
278  void setupQEDdip( int iSys, int i, int chgType, int gamType, Event& event,
279  bool limitPTmaxIn = true);
280  void setupWeakdip( int iSys, int i,int weakType, Event& event,
281  bool limitPTmaxIn = true);
282  // Special setup for weak dipoles if already specified in info ptr.
283  void setupWeakdipExternal(Event& event, bool limitPTmaxIn = true);
284  void setupHVdip( int iSys, int i, int colvType, Event& event,
285  bool limitPTmaxIn = true);
286 
287  // Apply ME corrections for a specific subsystem.
288  bool applyMECorrections(const Event& event, TimeDipoleEnd* dipBranch,
289  int iSysBranch);
290 
291  // Special setup for onium.
292  void regenerateOniumDipoles(Event & event);
293 
294  // Evolve a QCD dipole end.
295  void pT2nextQCD( double pT2begDip, double pT2sel, TimeDipoleEnd& dip,
296  Event& event);
297 
298  // Evolve a QED dipole end, either charged or photon.
299  void pT2nextQED( double pT2begDip, double pT2sel, TimeDipoleEnd& dip,
300  Event& event);
301 
302  // Evolve a weak dipole end.
303  void pT2nextWeak( double pT2begDip, double pT2sel, TimeDipoleEnd& dip,
304  Event& event);
305 
306  // Evolve a Hidden Valley dipole end.
307  void pT2nextHV( double pT2begDip, double pT2sel, TimeDipoleEnd& dip,
308  Event& );
309 
310  // Evolve an onium dipole end.
311  void pT2nextOnium( double pT2begDip, double pT2sel, TimeDipoleEnd& dip,
312  Event& );
313 
314  // Find kind of QCD ME correction.
315  void findMEtype( Event& event, TimeDipoleEnd& dip);
316 
317  // Find type of particle; used by findMEtype.
318  int findMEparticle( int id, bool isHiddenColour = false);
319 
320  // Find mixture of V and A in gamma/Z: energy- and flavour-dependent.
321  double gammaZmix( Event& event, int iRes, int iDau1, int iDau2);
322 
323  // Set up to calculate QCD ME correction with calcMEcorr.
324  double findMEcorr(TimeDipoleEnd* dip, Particle& rad, Particle& partner,
325  Particle& emt, bool cutEdge = true);
326 
327  // Set up to calculate weak ME corrections for t-channel processes.
328  double findMEcorrWeak(TimeDipoleEnd* dip, Vec4 rad, Vec4 rec,
329  Vec4 emt, Vec4 p3, Vec4 p4, Vec4 radBef, Vec4 recBef);
330 
331  // Calculate value of QCD ME correction.
332  double calcMEcorr( int kind, int combiIn, double mixIn, double x1,
333  double x2, double r1, double r2, double r3 = 0., bool cutEdge = true);
334 
335  // Find coefficient of azimuthal asymmetry from gluon polarization.
336  void findAsymPol( Event& event, TimeDipoleEnd* dip);
337 
338  // Compute scale for interleaved resonance decays
339  double calcPTresDec(Particle& res);
340 
341  // Rescatter: propagate dipole recoil to internal lines connecting systems.
342  bool rescatterPropagateRecoil( Event& event, Vec4& pNew);
343 
344  // Properties stored for (some) global recoil schemes.
345  // Vectors of event indices defining the hard process.
346  vector<int> hardPartons;
347  // Number of partons in current hard event, number of partons in Born-type
348  // hard event (to distinguish between S and H), maximally allowed number of
349  // global recoil branchings.
350  int nHard, nFinalBorn, nMaxGlobalBranch;
351  // Number of proposed splittings in hard scattering systems.
352  map<int,int> nProposed;
353  // Number of splittings with global recoil (currently only 1).
354  int nGlobal, globalRecoilMode;
355  // Switch to constrain recoiling system.
356  bool limitMUQ;
357 
358  // Calculate uncertainty-band weights for accepted/rejected trial branching.
359  void calcUncertainties( bool accept, double pAccept,
360  double enhance, TimeDipoleEnd* dip, Particle* radPtr,
361  Particle* emtPtr, Particle* recPtr );
362 
363  // 2 -> 2 information needed for the external weak setup.
364  vector<Vec4> weakMomenta;
365  vector<int> weak2to2lines;
366  int weakHardSize;
367 
368  // Settings and member variables for interleaved resonance decays.
369  bool doFSRinResonances{};
370  int resDecScaleChoice{-1}, iHardResDecSav{}, nRecurseResDec{};
371  vector<int> idResDecSav;
372  vector<double> pTresDecSav;
373 
374  // Settings and containers for control of MECs.
375  bool skipFirstMECinHardProc;
376  vector<int> skipFirstMECinResDecIDs{};
377 
378  // Onium emissions.
379  bool doOniumShower{false};
380  vector<SplitOniaPtr> oniumEmissions;
381  set<double> oniumThresholds;
382 
383 };
384 
385 //==========================================================================
386 
387 } // end namespace Pythia8
388 
389 #endif // Pythia8_SimpleTimeShower_H
SimpleTimeShower()
Constructor.
Definition: SimpleTimeShower.h:87
Definition: StandardModel.h:23
virtual double enhancePTmax() override
Potential enhancement factor of pTmax scale for hardest emission.
Definition: SimpleTimeShower.h:192
The Event class holds all info on the generated event.
Definition: Event.h:408
The TimeShower class does timelike showers.
Definition: TimeShower.h:33
TimeDipoleEnd()
Constructors.
Definition: SimpleTimeShower.h:30
int flavour
Properties specific to current trial emission.
Definition: SimpleTimeShower.h:68
Definition: StandardModel.h:106
shared_ptr< SplitOnia > emissionPtr
Pointer to an onium emission object, if present.
Definition: SimpleTimeShower.h:74
Definition: StandardModel.h:226
virtual bool getHasWeaklyRadiated() override
Tell whether FSR has done a weak emission.
Definition: SimpleTimeShower.h:186
Data on radiating dipole ends; only used inside SimpleTimeShower class.
Definition: SimpleTimeShower.h:25
virtual double pTLastInShower() override
Provide the pT scale of the last branching in the above shower.
Definition: SimpleTimeShower.h:195
Definition: Event.h:32
virtual ~SimpleTimeShower() override
Destructor.
Definition: SimpleTimeShower.h:121
Definition: SimpleWeakShowerMEs.h:26
virtual int system() const override
Tell which system was the last processed one.
Definition: SimpleTimeShower.h:189
int iRadiator
Basic properties related to dipole and matrix element corrections.
Definition: SimpleTimeShower.h:56
Header for classes to set beam momentum and interaction vertex spread.
Definition: Analysis.h:20
The SimpleTimeShower class does timelike showers.
Definition: SimpleTimeShower.h:82
Definition: Basics.h:32