]> git.uio.no Git - u/mrichter/AliRoot.git/blame - PYTHIA8/pythia8175/include/HelicityMatrixElements.h
CID 21231: Uninitialized scalar field (UNINIT_CTOR)
[u/mrichter/AliRoot.git] / PYTHIA8 / pythia8175 / include / HelicityMatrixElements.h
CommitLineData
c6b60c38 1// HelicityMatrixElements.h is a part of the PYTHIA event generator.
2// Copyright (C) 2013 Philip Ilten, 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 a number of physics classes used in tau decays.
7
8#ifndef Pythia8_HelicityMatrixElements_H
9#define Pythia8_HelicityMatrixElements_H
10
11#include "Basics.h"
12#include "Event.h"
13#include "HelicityBasics.h"
14#include "PythiaComplex.h"
15#include "PythiaStdlib.h"
16#include "StandardModel.h"
17
18namespace Pythia8 {
19
20//==========================================================================
21
22// The helicity matrix element class.
23
24class HelicityMatrixElement {
25
26public:
27
28 // Constructor and destructor.
b3a7e181 29 HelicityMatrixElement():DECAYWEIGHTMAX() {};
c6b60c38 30 virtual ~HelicityMatrixElement() {};
31
32 // Initialize the physics matrices and pointers.
33 virtual void initPointers(ParticleData*, Couplings*);
34
35 // Initialize the channel.
36 virtual HelicityMatrixElement* initChannel(vector<HelicityParticle>&);
37
38 // Calculate the matrix element weight for a decay.
39 virtual double decayWeight(vector<HelicityParticle>&);
40
41 // Calculate the maximum matrix element decay weight.
42 virtual double decayWeightMax(vector<HelicityParticle>&)
43 {return DECAYWEIGHTMAX;}
44
45 // Calculate the helicity matrix element.
46 virtual complex calculateME(vector<int>){return complex(0,0);}
47
48 // Calculate the decay matrix for a particle.
49 virtual void calculateD(vector<HelicityParticle>&);
50
51 // Calculate the density matrix for a particle.
52 virtual void calculateRho(unsigned int, vector<HelicityParticle>&);
53
54 // Set a fermion line.
55 void setFermionLine(int, HelicityParticle&, HelicityParticle&);
56
57 // Calculate Breit-Wigner's with running widths and fixed.
58 virtual complex breitWigner(double s, double M, double G);
59 virtual complex sBreitWigner(double m0, double m1, double s,
60 double M, double G);
61 virtual complex pBreitWigner(double m0, double m1, double s,
62 double M, double G);
63 virtual complex dBreitWigner(double m0, double m1, double s,
64 double M, double G);
65
66protected:
67
68 // Maximum decay weight. WARNING: hardcoded constant.
69 double DECAYWEIGHTMAX;
70
71 // Physics matrices.
72 vector< GammaMatrix > gamma;
73
74 // Particle map vector.
75 vector< int > pMap;
76
77 // Particle ID vector.
78 vector< int > pID;
79
80 // Particle mass vector.
81 vector< double > pM;
82
83 // Wave functions.
84 vector< vector< Wave4 > > u;
85
86 // Initialize the constants for the matrix element (called by initChannel).
87 virtual void initConstants() {};
88
89 // Initialize the wave functions (called by decayWeight and calculateRho/D).
90 virtual void initWaves(vector<HelicityParticle>&) {};
91
92 // Pointer to particle data.
93 ParticleData* particleDataPtr;
94
95 // Pointer to Standard Model constants.
96 Couplings* couplingsPtr;
97
98private:
99
100 // Recursive sub-method to calculate the density matrix for a particle.
101 void calculateRho(unsigned int, vector<HelicityParticle>&,
102 vector<int>&, vector<int>&, unsigned int);
103
104 // Recursive sub-method to calculate the decay matrix for a particle.
105 void calculateD(vector<HelicityParticle>&, vector<int>&, vector<int>&,
106 unsigned int);
107
108 // Recursive sub-method to calculate the matrix element weight for a decay.
109 void decayWeight(vector<HelicityParticle>&, vector<int>&, vector<int>&,
110 complex&, unsigned int);
111
112 // Calculate the product of the decay matrices for a hard process.
113 complex calculateProductD(unsigned int, unsigned int,
114 vector<HelicityParticle>&, vector<int>&, vector<int>&);
115
116 // Calculate the product of the decay matrices for a decay process.
117 complex calculateProductD(vector<HelicityParticle>&,
118 vector<int>&, vector<int>&);
119
120};
121
122//==========================================================================
123
124// Helicity matrix element for the hard process of two fermions -> W ->
125// two fermions.
126
127class HMETwoFermions2W2TwoFermions : public HelicityMatrixElement {
128
129public:
130
131 void initWaves(vector<HelicityParticle>&);
132
133 complex calculateME(vector<int>);
134
135};
136
137//==========================================================================
138
139// Helicity matrix element for the hard process of two fermions ->
140// photon -> two fermions.
141
142class HMETwoFermions2Gamma2TwoFermions : public HelicityMatrixElement {
143
144public:
145
146 void initWaves(vector<HelicityParticle>&);
147
148 complex calculateME(vector<int>);
149
150private:
151
152 // Fermion line charge and interaction energy.
153 double p0Q, p2Q, s;
154
155};
156
157//==========================================================================
158
159// Helicity matrix element for the hard process of two fermions ->
160// Z -> two fermions.
161
162class HMETwoFermions2Z2TwoFermions : public HelicityMatrixElement {
163
164public:
165
166 void initConstants();
167
168 void initWaves(vector<HelicityParticle>&);
169
170 complex calculateME(vector<int>);
171
172private:
173
174 // Vector and axial couplings.
175 double p0CA, p2CA, p0CV, p2CV;
176
177 // Weinberg angle, Z width (on-shell), Z mass (on-shell), and s.
178 double cos2W, sin2W, zG, zM, s;
179
180 // Bool whether the incoming fermions are oriented with the z-axis.
181 bool zaxis;
182
183};
184
185//==========================================================================
186
187// Helicity matrix element for the hard process of two fermions ->
188// photon/Z -> two fermions with full interference.
189
190// In general the initPointers and initChannel methods should not need to be
191// redeclared, but in this case each matrix element needs to be initialized.
192
193class HMETwoFermions2GammaZ2TwoFermions : public HelicityMatrixElement {
194
195public:
196
197 HelicityMatrixElement* initChannel(vector<HelicityParticle>&);
198
199 void initPointers(ParticleData*, Couplings*);
200
201 void initWaves(vector<HelicityParticle>&);
202
203 complex calculateME(vector<int>);
204
205private:
206
207 HMETwoFermions2Z2TwoFermions zHME;
208 HMETwoFermions2Gamma2TwoFermions gHME;
209
210};
211
212//==========================================================================
213
214// Helicity matrix element for the hard process of Z -> two fermions.
215
216class HMEZ2TwoFermions : public HelicityMatrixElement {
217
218public:
219
220 void initConstants();
221
222 void initWaves(vector<HelicityParticle>&);
223
224 complex calculateME(vector<int>);
225
226private:
227
228 // Vector and axial couplings.
229 double p2CA, p2CV;
230
231};
232
233//==========================================================================
234
235// Helicity matrix element for the decay of a CP even Higgs -> two fermions.
236
237// Because the Higgs is spin zero the Higgs production mechanism is not
238// needed for calculating helicity density matrices.
239
240class HMEHiggsEven2TwoFermions : public HelicityMatrixElement {
241
242public:
243
244 void initWaves(vector<HelicityParticle>&);
245
246 complex calculateME(vector<int>);
247
248private:
249
250 // Coupling constants of the fermions with the Higgs.
251 double p2CA, p2CV;
252
253};
254
255//==========================================================================
256
257// Helicity matrix element for the decay of a CP odd Higgs -> two fermions.
258
259class HMEHiggsOdd2TwoFermions : public HelicityMatrixElement {
260
261public:
262
263 void initWaves(vector<HelicityParticle>&);
264
265 complex calculateME(vector<int>);
266
267private:
268
269 // Coupling constants of the fermions with the Higgs.
270 double p2CA, p2CV;
271
272};
273
274//==========================================================================
275
276// Helicity matrix element for the decay of a charged Higgs -> two fermions.
277
278class HMEHiggsCharged2TwoFermions : public HelicityMatrixElement {
279
280public:
281
282 void initWaves(vector<HelicityParticle>&);
283
284 complex calculateME(vector<int>);
285
286private:
287
288 // Coupling constants of the fermions with the Higgs.
289 double p2CA, p2CV;
290
291};
292
293//==========================================================================
294
295// Helicity matrix element which provides an unpolarized on-diagonal helicity
296// density matrix. Used for unknown hard processes.
297
298class HMEUnpolarized : public HelicityMatrixElement {
299
300public:
301
302 void calculateRho(unsigned int, vector<HelicityParticle>&);
303
304};
305
306//==========================================================================
307
308// Base class for all tau decay helicity matrix elements.
309
310class HMETauDecay : public HelicityMatrixElement {
311
312public:
313
314 virtual void initWaves(vector<HelicityParticle>&);
315
316 virtual complex calculateME(vector<int>);
317
318 virtual double decayWeightMax(vector<HelicityParticle>&);
319
320protected:
321
322 virtual void initHadronicCurrent(vector<HelicityParticle>&) {};
323
324 virtual void calculateResonanceWeights(vector<double>&, vector<double>&,
325 vector<complex>&);
326
327};
328
329//==========================================================================
330
331// Helicity matrix element for a tau decaying into a single scalar meson.
332
333class HMETau2Meson : public HMETauDecay {
334
335public:
336
337 void initConstants();
338
339 void initHadronicCurrent(vector<HelicityParticle>&);
340
341};
342
343//==========================================================================
344
345// Helicity matrix element for a tau decaying into two leptons.
346
347class HMETau2TwoLeptons : public HMETauDecay {
348
349public:
350
351 void initConstants();
352
353 void initWaves(vector<HelicityParticle>&);
354
355 complex calculateME(vector<int>);
356
357};
358
359//==========================================================================
360
361// Helicity matrix element for a tau decaying into two mesons through a
362// vector meson resonance.
363
364class HMETau2TwoMesonsViaVector : public HMETauDecay {
365
366public:
367
368 void initConstants();
369
370 void initHadronicCurrent(vector<HelicityParticle>&);
371
372private:
373
374 // Resonance masses, widths, and weights.
375 vector<double> vecM, vecG, vecP, vecA;
376 vector<complex> vecW;
377
378};
379
380//==========================================================================
381
382// Helicity matrix element for a tau decay into two mesons through a vector
383// or scalar meson resonance.
384
385class HMETau2TwoMesonsViaVectorScalar : public HMETauDecay {
386
387public:
388
389 void initConstants();
390
391 void initHadronicCurrent(vector<HelicityParticle>&);
392
393private:
394
395 // Coupling to vector and scalar resonances.
396 double scaC, vecC;
397
398 // Resonance masses, widths, and weights.
399 vector<double> scaM, scaG, scaP, scaA, vecM, vecG, vecP, vecA;
400 vector<complex> scaW, vecW;
401
402};
403
404//==========================================================================
405
406// Helicity matrix element for a tau decay into three mesons (base class).
407
408class HMETau2ThreeMesons : public HMETauDecay {
409
410public:
411
412 void initConstants();
413
414 void initHadronicCurrent(vector<HelicityParticle>&);
415
416protected:
417
418 // Decay mode of the tau.
419 enum Mode{Pi0Pi0Pim, PimPimPip, Pi0PimK0b, PimPipKm, Pi0PimEta, PimKmKp,
420 Pi0K0Km, KlPimKs, Pi0Pi0Km, KlKlPim, PimKsKs, PimK0bK0, Uknown};
421 Mode mode;
422
423 // Initialize decay mode and resonance constants (called by initConstants).
424 virtual void initMode();
425 virtual void initResonances() {;}
426
427 // Initialize the momenta.
428 virtual void initMomenta(vector<HelicityParticle>&);
429
430 // Center of mass energies and momenta.
431 double s1, s2, s3, s4;
432 Wave4 q, q2, q3, q4;
433
434 // Stored a1 Breit-Wigner (for speed).
435 complex a1BW;
436
437 // Form factors.
438 virtual complex F1() {return complex(0, 0);}
439 virtual complex F2() {return complex(0, 0);}
440 virtual complex F3() {return complex(0, 0);}
441 virtual complex F4() {return complex(0, 0);}
442
443 // Phase space and Breit-Wigner for the a1.
444 virtual double a1PhaseSpace(double);
445 virtual complex a1BreitWigner(double);
446
447 // Sum running p and fixed width Breit-Wigner resonances.
448 complex T(double m0, double m1, double s,
449 vector<double>& M, vector<double>& G, vector<double>& W);
450 complex T(double s, vector<double>& M, vector<double>& G, vector<double>& W);
451
452};
453
454//==========================================================================
455
456// Helicity matrix element for a tau decay into three pions.
457
458class HMETau2ThreePions : public HMETau2ThreeMesons {
459
460private:
461
462 void initResonances();
463
464 // Resonance masses, widths, and weights.
465 vector<double> rhoM, rhoG, rhoPp, rhoAp, rhoPd, rhoAd;
466 double f0M, f0G, f0P, f0A, f2M, f2G, f2P, f2A;
467 double sigM, sigG, sigP, sigA;
468 vector<complex> rhoWp, rhoWd;
469 complex f0W, f2W, sigW;
470
471 // Form factors.
472 complex F1();
473 complex F2();
474 complex F3();
475
476 // Running width and Breit-Wigner for the a1.
477 double a1PhaseSpace(double);
478 complex a1BreitWigner(double);
479
480};
481
482//==========================================================================
483
484// Helicity matrix element for a tau decay into three mesons with kaons.
485
486class HMETau2ThreeMesonsWithKaons : public HMETau2ThreeMesons {
487
488private:
489
490 void initResonances();
491
492 // Resonance masses, widths, and weights.
493 vector<double> rhoMa, rhoGa, rhoWa, rhoMv, rhoGv, rhoWv;
494 vector<double> kstarMa, kstarGa, kstarWa, kstarMv, kstarGv, kstarWv;
495 vector<double> k1Ma, k1Ga, k1Wa, k1Mb, k1Gb, k1Wb;
496 vector<double> omegaM, omegaG, omegaW;
497 double kM, piM, piW;
498
499 // Form factors.
500 complex F1();
501 complex F2();
502 complex F4();
503
504};
505
506//==========================================================================
507
508// Helicity matrix element for a tau decay into generic three mesons.
509
510class HMETau2ThreeMesonsGeneric : public HMETau2ThreeMesons {
511
512private:
513
514 void initResonances();
515
516 // Resonance masses, widths, and weights.
517 vector<double> rhoMa, rhoGa, rhoWa, rhoMv, rhoGv, rhoWv;
518 vector<double> kstarM, kstarG, kstarW, k1M, k1G, k1W;
519 double kM, piM, piW;
520
521 // Form factors.
522 complex F1();
523 complex F2();
524 complex F4();
525
526};
527
528//==========================================================================
529
530// Helicity matrix element for a tau decay into two pions and a photon.
531
532class HMETau2TwoPionsGamma : public HMETauDecay {
533
534public:
535
536 void initConstants();
537
538 void initWaves(vector<HelicityParticle>&);
539
540 complex calculateME(vector<int>);
541
542protected:
543
544 // Resonance masses, widths, and weights.
545 vector<double> rhoM, rhoG, rhoW, omegaM, omegaG, omegaW;
546 double piM;
547
548 // Form factor.
549 complex F(double s, vector<double> M, vector<double> G, vector<double> W);
550
551};
552
553//==========================================================================
554
555// Helicity matrix element for a tau decay into four pions.
556
557class HMETau2FourPions : public HMETauDecay {
558
559public:
560
561 void initConstants();
562
563 void initHadronicCurrent(vector<HelicityParticle>& p);
564
565private:
566
567 // G-function form factors (fits).
568 double G(int i, double s);
569
570 // T-vector functions.
571 Wave4 t1(Wave4&, Wave4&, Wave4&, Wave4&, Wave4&);
572 Wave4 t2(Wave4&, Wave4&, Wave4&, Wave4&, Wave4&);
573 Wave4 t3(Wave4&, Wave4&, Wave4&, Wave4&, Wave4&);
574
575 // Breit-Wigner denominators for the intermediate mesons.
576 complex a1D(double s);
577 complex rhoD(double s);
578 complex sigD(double s);
579 complex omeD(double s);
580
581 // Form factors needed for the a1, rho, and omega.
582 double a1FormFactor(double s);
583 double rhoFormFactor1(double s);
584 double rhoFormFactor2(double s);
585 double omeFormFactor(double s);
586
587 // Masses and widths of the intermediate mesons.
588 double a1M, a1G, rhoM, rhoG, sigM, sigG, omeM, omeG;
589
590 // Masses for the pions (charged and neutral).
591 double picM, pinM;
592
593 // Amplitude, phases, and weights for mixing.
594 double sigA, sigP, omeA, omeP;
595 complex sigW, omeW;
596
597 // Cut-off for a1 form factor.
598 double lambda2;
599
600};
601
602//==========================================================================
603
604// Helicity matrix element for a tau decaying into five pions.
605
606class HMETau2FivePions : public HMETauDecay {
607
608public:
609
610 void initConstants();
611
612 void initHadronicCurrent(vector<HelicityParticle>&);
613
614private:
615
616 // Hadronic currents.
617 Wave4 Ja(Wave4 &q, Wave4 &q1, Wave4 &q2, Wave4 &q3, Wave4 &q4, Wave4 &q5);
618 Wave4 Jb(Wave4 &q, Wave4 &q1, Wave4 &q2, Wave4 &q3, Wave4 &q4, Wave4 &q5);
619
620 // Simplified s-wave Breit-Wigner assuming massless products.
621 complex breitWigner(double s, double M, double G);
622
623 // Masses and widths of intermediates.
624 double a1M, a1G, rhoM, rhoG, omegaM, omegaG, omegaW, sigmaM, sigmaG, sigmaW;
625
626};
627
628//==========================================================================
629
630// Helicity matrix element for a tau decay into flat phase space.
631
632class HMETau2PhaseSpace : public HMETauDecay {
633
634public:
635
636 void initWaves(vector<HelicityParticle>&) {};
637
638 complex calculateME(vector<int>) {return 1;}
639
640 void calculateD(vector<HelicityParticle>&) {};
641
642 void calculateRho(unsigned int, vector<HelicityParticle>&) {};
643
644 double decayWeight(vector<HelicityParticle>&) {return 1.0;}
645
646 double decayWeightMax(vector<HelicityParticle>&) {return 1.0;}
647
648};
649
650//==========================================================================
651
652} // end namespace Pythia8
653
654#endif // end Pythia8_HelicityMatrixElements_H