StRoot  1
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Groups Pages
TimeShower.h
1 // TimeShower.h is a part of the PYTHIA event generator.
2 // Copyright (C) 2014 Torbjorn Sjostrand.
3 // PYTHIA is licenced under the GNU GPL version 2, see COPYING for details.
4 // Please respect the MCnet Guidelines, see GUIDELINES for details.
5 
6 // Header file for the timelike final-state showers.
7 // TimeDipoleEnd: data on a radiating dipole end.
8 // TimeShower: handles the showering description.
9 
10 #ifndef Pythia8_TimeShower_H
11 #define Pythia8_TimeShower_H
12 
13 #include "Pythia8/Basics.h"
14 #include "Pythia8/BeamParticle.h"
15 #include "Pythia8/Event.h"
16 #include "Pythia8/Info.h"
17 #include "Pythia8/ParticleData.h"
18 #include "Pythia8/PartonSystems.h"
19 #include "Pythia8/PythiaStdlib.h"
20 #include "Pythia8/Settings.h"
21 #include "Pythia8/StandardModel.h"
22 #include "Pythia8/UserHooks.h"
23 #include "Pythia8/MergingHooks.h"
24 #include "Pythia8/WeakShowerMEs.h"
25 
26 namespace Pythia8 {
27 
28 //==========================================================================
29 
30 // Data on radiating dipole ends; only used inside TimeShower class.
31 
32 class TimeDipoleEnd {
33 
34 public:
35 
36  // Constructors.
37  TimeDipoleEnd() : iRadiator(-1), iRecoiler(-1), pTmax(0.), colType(0),
38  chgType(0), gamType(0), weakType(0), isrType(0), system(0), systemRec(0),
39  MEtype(0), iMEpartner(-1), weakPol(0), isOctetOnium(false),
40  isHiddenValley(false), colvType(0), MEmix(0.), MEorder(true),
41  MEsplit(true), MEgluinoRec(false), isFlexible(false) { }
42  TimeDipoleEnd(int iRadiatorIn, int iRecoilerIn, double pTmaxIn = 0.,
43  int colIn = 0, int chgIn = 0, int gamIn = 0, int weakTypeIn = 0,
44  int isrIn = 0, int systemIn = 0, int MEtypeIn = 0, int iMEpartnerIn = -1,
45  int weakPolIn = 0, bool isOctetOniumIn = false,
46  bool isHiddenValleyIn = false, int colvTypeIn = 0, double MEmixIn = 0.,
47  bool MEorderIn = true, bool MEsplitIn = true, bool MEgluinoRecIn = false,
48  bool isFlexibleIn = false) :
49  iRadiator(iRadiatorIn), iRecoiler(iRecoilerIn), pTmax(pTmaxIn),
50  colType(colIn), chgType(chgIn), gamType(gamIn), weakType(weakTypeIn),
51  isrType(isrIn), system(systemIn), systemRec(systemIn), MEtype(MEtypeIn),
52  iMEpartner(iMEpartnerIn), weakPol(weakPolIn), isOctetOnium(isOctetOniumIn),
53  isHiddenValley(isHiddenValleyIn), colvType(colvTypeIn), MEmix(MEmixIn),
54  MEorder (MEorderIn), MEsplit(MEsplitIn), MEgluinoRec(MEgluinoRecIn),
55  isFlexible(isFlexibleIn) { }
56 
57  // Basic properties related to dipole and matrix element corrections.
58  int iRadiator, iRecoiler;
59  double pTmax;
60  int colType, chgType, gamType, weakType, isrType, system, systemRec,
61  MEtype, iMEpartner, weakPol;
62  bool isOctetOnium, isHiddenValley;
63  int colvType;
64  double MEmix;
65  bool MEorder, MEsplit, MEgluinoRec, isFlexible;
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;
71 
72 } ;
73 
74 //==========================================================================
75 
76 // The TimeShower class does timelike showers.
77 
78 class TimeShower {
79 
80 public:
81 
82  // Constructor.
83  TimeShower() {beamOffset = 0;}
84 
85  // Destructor.
86  virtual ~TimeShower() {}
87 
88  // Initialize various pointers.
89  // (Separated from rest of init since not virtual.)
90  void initPtr(Info* infoPtrIn, Settings* settingsPtrIn,
91  ParticleData* particleDataPtrIn, Rndm* rndmPtrIn,
92  CoupSM* coupSMPtrIn, PartonSystems* partonSystemsPtrIn,
93  UserHooks* userHooksPtrIn, MergingHooks* mergingHooksPtrIn = 0) {
94  infoPtr = infoPtrIn; settingsPtr = settingsPtrIn;
95  particleDataPtr = particleDataPtrIn; rndmPtr = rndmPtrIn;
96  coupSMPtr = coupSMPtrIn; partonSystemsPtr = partonSystemsPtrIn;
97  userHooksPtr = userHooksPtrIn; mergingHooksPtr = mergingHooksPtrIn;}
98 
99  // Initialize alphaStrong and related pTmin parameters.
100  virtual void init( BeamParticle* beamAPtrIn = 0,
101  BeamParticle* beamBPtrIn = 0);
102 
103  // New beams possible for handling of hard diffraction. (Not virtual.)
104  void reassignBeamPtrs( BeamParticle* beamAPtrIn, BeamParticle* beamBPtrIn,
105  int beamOffsetIn = 0) {beamAPtr = beamAPtrIn; beamBPtr = beamBPtrIn;
106  beamOffset = beamOffsetIn;}
107 
108  // Find whether to limit maximum scale of emissions, and whether to dampen.
109  virtual bool limitPTmax( Event& event, double Q2Fac = 0.,
110  double Q2Ren = 0.);
111 
112  // Potential enhancement factor of pTmax scale for hardest emission.
113  double enhancePTmax() {return pTmaxFudge;}
114 
115  // Top-level routine to do a full time-like shower in resonance decay.
116  virtual int shower( int iBeg, int iEnd, Event& event, double pTmax,
117  int nBranchMax = 0);
118 
119  // Top-level routine for QED radiation in hadronic decay to two leptons.
120  virtual int showerQED( int i1, int i2, Event& event, double pTmax);
121 
122  // Provide the pT scale of the last branching in the above shower.
123  double pTLastInShower() {return pTLastBranch;}
124 
125  // Global recoil: reset counters and store locations of outgoing partons.
126  virtual void prepareGlobal( Event& event);
127 
128  // Prepare system for evolution after each new interaction; identify ME.
129  virtual void prepare( int iSys, Event& event, bool limitPTmaxIn = true);
130 
131  // Update dipole list after a multiparton interactions rescattering.
132  virtual void rescatterUpdate( int iSys, Event& event);
133 
134  // Update dipole list after each ISR emission.
135  virtual void update( int iSys, Event& event, bool hasWeakRad = false);
136 
137  // Select next pT in downwards evolution.
138  virtual double pTnext( Event& event, double pTbegAll, double pTendAll,
139  bool isFirstTrial = false);
140 
141  // ME corrections and kinematics that may give failure.
142  virtual bool branch( Event& event, bool isInterleaved = false);
143 
144  // Tell which system was the last processed one.
145  int system() const {return iSysSel;};
146 
147  // Tell whether FSR has done a weak emission.
148  bool getHasWeaklyRadiated() {return hasWeaklyRadiated;}
149 
150  // Print dipole list; for debug mainly.
151  virtual void list( ostream& os = cout) const;
152 
153 protected:
154 
155  // Pointer to various information on the generation.
156  Info* infoPtr;
157 
158  // Pointer to the settings database.
159  Settings* settingsPtr;
160 
161  // Pointer to the particle data table.
162  ParticleData* particleDataPtr;
163 
164  // Pointer to the random number generator.
165  Rndm* rndmPtr;
166 
167  // Pointer to Standard Model couplings.
168  CoupSM* coupSMPtr;
169 
170  // Pointers to the two incoming beams. Offset their location in event.
171  BeamParticle* beamAPtr;
172  BeamParticle* beamBPtr;
173  int beamOffset;
174 
175  // Pointer to information on subcollision parton locations.
176  PartonSystems* partonSystemsPtr;
177 
178  // Pointer to userHooks object for user interaction with program.
179  UserHooks* userHooksPtr;
180 
181  // Weak matrix elements used for corrections both of ISR and FSR.
182  WeakShowerMEs weakShowerMEs;
183 
184  // Store properties to be returned by methods.
185  int iSysSel;
186  double pTmaxFudge, pTLastBranch;
187 
188 private:
189 
190  // Constants: could only be changed in the code itself.
191  static const double MCMIN, MBMIN, SIMPLIFYROOT, XMARGIN, XMARGINCOMB,
192  TINYPDF, LARGEM2, THRESHM2, LAMBDA3MARGIN, WEAKPSWEIGHT, WG2QEXTRA;
193  // Rescatter: try to fix up recoil between systems
194  static const bool FIXRESCATTER, VETONEGENERGY;
195  static const double MAXVIRTUALITYFRACTION, MAXNEGENERGYFRACTION;
196 
197  // Initialization data, normally only set once.
198  bool doQCDshower, doQEDshowerByQ, doQEDshowerByL, doQEDshowerByGamma,
199  doWeakShower, doMEcorrections, doMEafterFirst, doPhiPolAsym,
200  doInterleave, allowBeamRecoil, dampenBeamRecoil, recoilToColoured,
201  useFixedFacScale, allowRescatter, canVetoEmission, doHVshower,
202  brokenHVsym, globalRecoil, useLocalRecoilNow, doSecondHard,
203  singleWeakEmission, alphaSuseCMW, vetoWeakJets;
204  int pTmaxMatch, pTdampMatch, alphaSorder, alphaSnfmax, nGluonToQuark,
205  weightGluonToQuark, alphaEMorder, nGammaToQuark, nGammaToLepton,
206  nCHV, idHV, nMaxGlobalRecoil, weakMode;
207  double pTdampFudge, mc, mb, m2c, m2b, renormMultFac, factorMultFac,
208  fixedFacScale2, alphaSvalue, alphaS2pi, Lambda3flav, Lambda4flav,
209  Lambda5flav, Lambda3flav2, Lambda4flav2, Lambda5flav2,
210  scaleGluonToQuark, extraGluonToQuark, pTcolCutMin, pTcolCut,
211  pT2colCut, pTchgQCut, pT2chgQCut, pTchgLCut, pT2chgLCut,
212  pTweakCut, pT2weakCut, mMaxGamma, m2MaxGamma, octetOniumFraction,
213  octetOniumColFac, mZ, gammaZ, thetaWRat, mW, gammaW, CFHV,
214  alphaHVfix, pThvCut, pT2hvCut, mHV, pTmaxFudgeMPI,
215  weakEnhancement, vetoWeakDeltaR2;
216 
217  // alphaStrong and alphaEM calculations.
218  AlphaStrong alphaS;
219  AlphaEM alphaEM;
220 
221  // Some current values.
222  bool dopTlimit1, dopTlimit2, dopTdamp, hasWeaklyRadiated;
223  double pT2damp, kRad, kEmt, pdfScale2;
224 
225  // All dipole ends and a pointer to the selected hardest dipole end.
226  vector<TimeDipoleEnd> dipEnd;
227  TimeDipoleEnd* dipSel;
228  int iDipSel;
229 
230  // Setup a dipole end, either QCD, QED/photon, weak or Hidden Valley one.
231  void setupQCDdip( int iSys, int i, int colTag, int colSign, Event& event,
232  bool isOctetOnium = false, bool limitPTmaxIn = true);
233  void setupQEDdip( int iSys, int i, int chgType, int gamType, Event& event,
234  bool limitPTmaxIn = true);
235  void setupWeakdip( int iSys, int i,int weakType, Event& event,
236  bool limitPTmaxIn = true);
237  void setupHVdip( int iSys, int i, Event& event, bool limitPTmaxIn = true);
238 
239  // Evolve a QCD dipole end.
240  void pT2nextQCD( double pT2begDip, double pT2sel, TimeDipoleEnd& dip,
241  Event& event);
242 
243  // Evolve a QED dipole end, either charged or photon.
244  void pT2nextQED( double pT2begDip, double pT2sel, TimeDipoleEnd& dip,
245  Event& event);
246 
247  // Evolve a weak dipole end.
248  void pT2nextWeak( double pT2begDip, double pT2sel, TimeDipoleEnd& dip,
249  Event& event);
250 
251  // Evolve a Hidden Valley dipole end.
252  void pT2nextHV( double pT2begDip, double pT2sel, TimeDipoleEnd& dip,
253  Event& );
254 
255  // Find kind of QCD ME correction.
256  void findMEtype( Event& event, TimeDipoleEnd& dip);
257 
258  // Find type of particle; used by findMEtype.
259  int findMEparticle( int id, bool isHiddenColour = false);
260 
261  // Find mixture of V and A in gamma/Z: energy- and flavour-dependent.
262  double gammaZmix( Event& event, int iRes, int iDau1, int iDau2);
263 
264  // Set up to calculate QCD ME correction with calcMEcorr.
265  double findMEcorr(TimeDipoleEnd* dip, Particle& rad, Particle& partner,
266  Particle& emt, bool cutEdge = true);
267 
268  // Set up to calculate weak ME corrections for t-channel processes.
269  double findMEcorrWeak(TimeDipoleEnd* dip, Vec4 rad, Vec4 rec,
270  Vec4 emt, Vec4 p3, Vec4 p4, Vec4 radBef, Vec4 recBef);
271 
272  // Calculate value of QCD ME correction.
273  double calcMEcorr( int kind, int combiIn, double mixIn, double x1,
274  double x2, double r1, double r2, double r3 = 0., bool cutEdge = true);
275 
276  // Find coefficient of azimuthal asymmetry from gluon polarization.
277  void findAsymPol( Event& event, TimeDipoleEnd* dip);
278 
279  // Rescatter: propagate dipole recoil to internal lines connecting systems.
280  bool rescatterPropagateRecoil( Event& event, Vec4& pNew);
281 
282  // Properties stored for (some) global recoil schemes.
283  // Vectors of event indices defining the hard process.
284  vector<int> hardPartons;
285  // Number of proposed splittings, number of partons in current hard event,
286  // number of partons in Born-type hard event (distinguish between S and H).
287  int nProposed, nHard, nFinalBorn, nMaxGlobalBranch;
288  // Number of splittings with global recoil (currently only 1).
289  int nGlobal, globalRecoilMode;
290  // Switch to constrain recoiling system.
291  bool limitMUQ;
292 
293  // Pointer to MergingHooks object for NLO merging.
294  MergingHooks* mergingHooksPtr;
295 
296 };
297 
298 //==========================================================================
299 
300 } // end namespace Pythia8
301 
302 #endif // Pythia8_TimeShower_H
Definition: AgUStep.h:26