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.
6 // Header file for a number of physics classes used in tau decays.
8 #ifndef Pythia8_HelicityMatrixElements_H
9 #define Pythia8_HelicityMatrixElements_H
13 #include "HelicityBasics.h"
14 #include "PythiaComplex.h"
15 #include "PythiaStdlib.h"
16 #include "StandardModel.h"
20 //==========================================================================
22 // The helicity matrix element class.
24 class HelicityMatrixElement {
28 // Constructor and destructor.
29 HelicityMatrixElement() {};
30 virtual ~HelicityMatrixElement() {};
32 // Initialize the physics matrices and pointers.
33 virtual void initPointers(ParticleData*, Couplings*);
35 // Initialize the channel.
36 virtual HelicityMatrixElement* initChannel(vector<HelicityParticle>&);
38 // Calculate the matrix element weight for a decay.
39 virtual double decayWeight(vector<HelicityParticle>&);
41 // Calculate the maximum matrix element decay weight.
42 virtual double decayWeightMax(vector<HelicityParticle>&)
43 {return DECAYWEIGHTMAX;}
45 // Calculate the helicity matrix element.
46 virtual complex calculateME(vector<int>){return complex(0,0);}
48 // Calculate the decay matrix for a particle.
49 virtual void calculateD(vector<HelicityParticle>&);
51 // Calculate the density matrix for a particle.
52 virtual void calculateRho(unsigned int, vector<HelicityParticle>&);
54 // Set a fermion line.
55 void setFermionLine(int, HelicityParticle&, HelicityParticle&);
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,
61 virtual complex pBreitWigner(double m0, double m1, double s,
63 virtual complex dBreitWigner(double m0, double m1, double s,
68 // Maximum decay weight. WARNING: hardcoded constant.
69 double DECAYWEIGHTMAX;
72 vector< GammaMatrix > gamma;
74 // Particle map vector.
77 // Particle ID vector.
80 // Particle mass vector.
84 vector< vector< Wave4 > > u;
86 // Initialize the constants for the matrix element (called by initChannel).
87 virtual void initConstants() {};
89 // Initialize the wave functions (called by decayWeight and calculateRho/D).
90 virtual void initWaves(vector<HelicityParticle>&) {};
92 // Pointer to particle data.
93 ParticleData* particleDataPtr;
95 // Pointer to Standard Model constants.
96 Couplings* couplingsPtr;
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);
104 // Recursive sub-method to calculate the decay matrix for a particle.
105 void calculateD(vector<HelicityParticle>&, vector<int>&, vector<int>&,
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);
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>&);
116 // Calculate the product of the decay matrices for a decay process.
117 complex calculateProductD(vector<HelicityParticle>&,
118 vector<int>&, vector<int>&);
122 //==========================================================================
124 // Helicity matrix element for the hard process of two fermions -> W ->
127 class HMETwoFermions2W2TwoFermions : public HelicityMatrixElement {
131 void initWaves(vector<HelicityParticle>&);
133 complex calculateME(vector<int>);
137 //==========================================================================
139 // Helicity matrix element for the hard process of two fermions ->
140 // photon -> two fermions.
142 class HMETwoFermions2Gamma2TwoFermions : public HelicityMatrixElement {
146 void initWaves(vector<HelicityParticle>&);
148 complex calculateME(vector<int>);
152 // Fermion line charge and interaction energy.
157 //==========================================================================
159 // Helicity matrix element for the hard process of two fermions ->
160 // Z -> two fermions.
162 class HMETwoFermions2Z2TwoFermions : public HelicityMatrixElement {
166 void initConstants();
168 void initWaves(vector<HelicityParticle>&);
170 complex calculateME(vector<int>);
174 // Vector and axial couplings.
175 double p0CA, p2CA, p0CV, p2CV;
177 // Weinberg angle, Z width (on-shell), Z mass (on-shell), and s.
178 double cos2W, sin2W, zG, zM, s;
180 // Bool whether the incoming fermions are oriented with the z-axis.
185 //==========================================================================
187 // Helicity matrix element for the hard process of two fermions ->
188 // photon/Z -> two fermions with full interference.
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.
193 class HMETwoFermions2GammaZ2TwoFermions : public HelicityMatrixElement {
197 HelicityMatrixElement* initChannel(vector<HelicityParticle>&);
199 void initPointers(ParticleData*, Couplings*);
201 void initWaves(vector<HelicityParticle>&);
203 complex calculateME(vector<int>);
207 HMETwoFermions2Z2TwoFermions zHME;
208 HMETwoFermions2Gamma2TwoFermions gHME;
212 //==========================================================================
214 // Helicity matrix element for the hard process of Z -> two fermions.
216 class HMEZ2TwoFermions : public HelicityMatrixElement {
220 void initConstants();
222 void initWaves(vector<HelicityParticle>&);
224 complex calculateME(vector<int>);
228 // Vector and axial couplings.
233 //==========================================================================
235 // Helicity matrix element for the decay of a CP even Higgs -> two fermions.
237 // Because the Higgs is spin zero the Higgs production mechanism is not
238 // needed for calculating helicity density matrices.
240 class HMEHiggsEven2TwoFermions : public HelicityMatrixElement {
244 void initWaves(vector<HelicityParticle>&);
246 complex calculateME(vector<int>);
250 // Coupling constants of the fermions with the Higgs.
255 //==========================================================================
257 // Helicity matrix element for the decay of a CP odd Higgs -> two fermions.
259 class HMEHiggsOdd2TwoFermions : public HelicityMatrixElement {
263 void initWaves(vector<HelicityParticle>&);
265 complex calculateME(vector<int>);
269 // Coupling constants of the fermions with the Higgs.
274 //==========================================================================
276 // Helicity matrix element for the decay of a charged Higgs -> two fermions.
278 class HMEHiggsCharged2TwoFermions : public HelicityMatrixElement {
282 void initWaves(vector<HelicityParticle>&);
284 complex calculateME(vector<int>);
288 // Coupling constants of the fermions with the Higgs.
293 //==========================================================================
295 // Helicity matrix element which provides an unpolarized on-diagonal helicity
296 // density matrix. Used for unknown hard processes.
298 class HMEUnpolarized : public HelicityMatrixElement {
302 void calculateRho(unsigned int, vector<HelicityParticle>&);
306 //==========================================================================
308 // Base class for all tau decay helicity matrix elements.
310 class HMETauDecay : public HelicityMatrixElement {
314 virtual void initWaves(vector<HelicityParticle>&);
316 virtual complex calculateME(vector<int>);
318 virtual double decayWeightMax(vector<HelicityParticle>&);
322 virtual void initHadronicCurrent(vector<HelicityParticle>&) {};
324 virtual void calculateResonanceWeights(vector<double>&, vector<double>&,
329 //==========================================================================
331 // Helicity matrix element for a tau decaying into a single scalar meson.
333 class HMETau2Meson : public HMETauDecay {
337 void initConstants();
339 void initHadronicCurrent(vector<HelicityParticle>&);
343 //==========================================================================
345 // Helicity matrix element for a tau decaying into two leptons.
347 class HMETau2TwoLeptons : public HMETauDecay {
351 void initConstants();
353 void initWaves(vector<HelicityParticle>&);
355 complex calculateME(vector<int>);
359 //==========================================================================
361 // Helicity matrix element for a tau decaying into two mesons through a
362 // vector meson resonance.
364 class HMETau2TwoMesonsViaVector : public HMETauDecay {
368 void initConstants();
370 void initHadronicCurrent(vector<HelicityParticle>&);
374 // Resonance masses, widths, and weights.
375 vector<double> vecM, vecG, vecP, vecA;
376 vector<complex> vecW;
380 //==========================================================================
382 // Helicity matrix element for a tau decay into two mesons through a vector
383 // or scalar meson resonance.
385 class HMETau2TwoMesonsViaVectorScalar : public HMETauDecay {
389 void initConstants();
391 void initHadronicCurrent(vector<HelicityParticle>&);
395 // Coupling to vector and scalar resonances.
398 // Resonance masses, widths, and weights.
399 vector<double> scaM, scaG, scaP, scaA, vecM, vecG, vecP, vecA;
400 vector<complex> scaW, vecW;
404 //==========================================================================
406 // Helicity matrix element for a tau decay into three mesons (base class).
408 class HMETau2ThreeMesons : public HMETauDecay {
412 void initConstants();
414 void initHadronicCurrent(vector<HelicityParticle>&);
418 // Decay mode of the tau.
419 enum Mode{Pi0Pi0Pim, PimPimPip, Pi0PimK0b, PimPipKm, Pi0PimEta, PimKmKp,
420 Pi0K0Km, KlPimKs, Pi0Pi0Km, KlKlPim, PimKsKs, PimK0bK0, Uknown};
423 // Initialize decay mode and resonance constants (called by initConstants).
424 virtual void initMode();
425 virtual void initResonances() {;}
427 // Initialize the momenta.
428 virtual void initMomenta(vector<HelicityParticle>&);
430 // Center of mass energies and momenta.
431 double s1, s2, s3, s4;
434 // Stored a1 Breit-Wigner (for speed).
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);}
443 // Phase space and Breit-Wigner for the a1.
444 virtual double a1PhaseSpace(double);
445 virtual complex a1BreitWigner(double);
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);
454 //==========================================================================
456 // Helicity matrix element for a tau decay into three pions.
458 class HMETau2ThreePions : public HMETau2ThreeMesons {
462 void initResonances();
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;
476 // Running width and Breit-Wigner for the a1.
477 double a1PhaseSpace(double);
478 complex a1BreitWigner(double);
482 //==========================================================================
484 // Helicity matrix element for a tau decay into three mesons with kaons.
486 class HMETau2ThreeMesonsWithKaons : public HMETau2ThreeMesons {
490 void initResonances();
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;
506 //==========================================================================
508 // Helicity matrix element for a tau decay into generic three mesons.
510 class HMETau2ThreeMesonsGeneric : public HMETau2ThreeMesons {
514 void initResonances();
516 // Resonance masses, widths, and weights.
517 vector<double> rhoMa, rhoGa, rhoWa, rhoMv, rhoGv, rhoWv;
518 vector<double> kstarM, kstarG, kstarW, k1M, k1G, k1W;
528 //==========================================================================
530 // Helicity matrix element for a tau decay into two pions and a photon.
532 class HMETau2TwoPionsGamma : public HMETauDecay {
536 void initConstants();
538 void initWaves(vector<HelicityParticle>&);
540 complex calculateME(vector<int>);
544 // Resonance masses, widths, and weights.
545 vector<double> rhoM, rhoG, rhoW, omegaM, omegaG, omegaW;
549 complex F(double s, vector<double> M, vector<double> G, vector<double> W);
553 //==========================================================================
555 // Helicity matrix element for a tau decay into four pions.
557 class HMETau2FourPions : public HMETauDecay {
561 void initConstants();
563 void initHadronicCurrent(vector<HelicityParticle>& p);
567 // G-function form factors (fits).
568 double G(int i, double s);
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&);
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);
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);
587 // Masses and widths of the intermediate mesons.
588 double a1M, a1G, rhoM, rhoG, sigM, sigG, omeM, omeG;
590 // Masses for the pions (charged and neutral).
593 // Amplitude, phases, and weights for mixing.
594 double sigA, sigP, omeA, omeP;
597 // Cut-off for a1 form factor.
602 //==========================================================================
604 // Helicity matrix element for a tau decaying into five pions.
606 class HMETau2FivePions : public HMETauDecay {
610 void initConstants();
612 void initHadronicCurrent(vector<HelicityParticle>&);
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);
620 // Simplified s-wave Breit-Wigner assuming massless products.
621 complex breitWigner(double s, double M, double G);
623 // Masses and widths of intermediates.
624 double a1M, a1G, rhoM, rhoG, omegaM, omegaG, omegaW, sigmaM, sigmaG, sigmaW;
628 //==========================================================================
630 // Helicity matrix element for a tau decay into flat phase space.
632 class HMETau2PhaseSpace : public HMETauDecay {
636 void initWaves(vector<HelicityParticle>&) {};
638 complex calculateME(vector<int>) {return 1;}
640 void calculateD(vector<HelicityParticle>&) {};
642 void calculateRho(unsigned int, vector<HelicityParticle>&) {};
644 double decayWeight(vector<HelicityParticle>&) {return 1.0;}
646 double decayWeightMax(vector<HelicityParticle>&) {return 1.0;}
650 //==========================================================================
652 } // end namespace Pythia8
654 #endif // end Pythia8_HelicityMatrixElements_H