Hyperiso 1.0.3
Modular flavour-physics calculations, Wilson coefficients and statistical inference
Loading...
Searching...
No Matches
thdm.h
Go to the documentation of this file.
1// This file is part of MARTY.
2//
3// MARTY is free software: you can redistribute it and/or modify
4// it under the terms of the GNU General Public License as published by
5// the Free Software Foundation, either version 3 of the License, or
6// (at your option) any later version.
7//
8// MARTY is distributed in the hope that it will be useful,
9// but WITHOUT ANY WARRANTY; without even the implied warranty of
10// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11// GNU General Public License for more details.
12//
13// You should have received a copy of the GNU General Public License
14// along with MARTY. If not, see <https://www.gnu.org/licenses/>.
23#ifndef _2HDM_H_INCLUDED
24#define _2HDM_H_INCLUDED
25
26#include <marty/core/ckm.h>
27#include <marty/core/ghostField.h>
28#include <marty/core/model.h>
29#include <marty/core/mrtInterface.h>
30#include "sm.h"
31
32namespace mty {
33
34template <int type>
35struct Z2_charges {
36};
37
38template <>
39struct Z2_charges<1> {
40 static constexpr int u = 1;
41 static constexpr int d = 1;
42 static constexpr int e = 1;
43};
44template <>
45struct Z2_charges<2> {
46 static constexpr int u = 1;
47 static constexpr int d = -1;
48 static constexpr int e = -1;
49};
50template <>
51struct Z2_charges<3> {
52 static constexpr int u = 1;
53 static constexpr int d = -1;
54 static constexpr int e = 1;
55};
56template <>
57struct Z2_charges<4> {
58 static constexpr int u = 1;
59 static constexpr int d = 1;
60 static constexpr int e = -1;
61};
62
63std::pair<csl::Expr, csl::Expr> Z2_coef(int charge);
64csl::Expr Z2_mass_coef(csl::Expr const &v1, csl::Expr const &v2, int charge);
65
66template <int type>
67class THDM_Model : public mty::SM_Model {
68
69 public:
70 THDM_Model(bool initialize = true);
71 ~THDM_Model() override;
72
73 void init();
74
75 void initContent();
76 void initHiggsSector();
77 void initYukawas();
78
79 void replaceHiggs();
81 void replaceYukawas();
82 void adjust();
83
84 template <int t_type>
85 friend std::ostream &operator<<(std::ostream &out,
86 THDM_Model const &model);
87
88 protected:
89 // Higgs potential parameters
91
92 csl::Expr v, v1, v2; // VEV parameters
93 csl::Expr alpha, beta, tan_beta; // Higgs rotatioin parameters
94 csl::Expr e, gY, gL, theta_Weinberg; // Electroweak parameters
95};
96
97template <int type>
98THDM_Model<type>::THDM_Model(bool initialize) : SM_Model(false)
99{
100 if (initialize)
101 init();
102}
103
104template <int type>
106{
107 initContent();
109 replaceHiggs();
110 diagonalize2By2Matrices();
111 replaceYukawas();
113 adjust();
114}
115template <int type>
123
124template <int type>
126{
127 m11 = csl::constant_s("m_11");
128 m12 = csl::constant_s("m_12");
129 m22 = csl::constant_s("m_22");
130 lambda1 = csl::constant_s("lambda_1");
131 lambda2 = csl::constant_s("lambda_2");
132 lambda3 = csl::constant_s("lambda_3");
133 lambda4 = csl::constant_s("lambda_4");
134 lambda5 = csl::constant_s("lambda_5");
135
136 Particle Phi1 = scalarboson_s("Phi1 ; \\Phi_{1}", *this);
137 Phi1->setSelfConjugate(false);
138 Phi1->setGroupRep("L", 1);
139 Phi1->setGroupRep("Y", {1, 2});
140 Particle Phi2 = scalarboson_s("Phi2 ; \\Phi_{2}", *this);
141 Phi2->setSelfConjugate(false);
142 Phi2->setGroupRep("L", 1);
143 Phi2->setGroupRep("Y", {1, 2});
144 addParticles({Phi1, Phi2});
145
146 csl::Index i = GaugeIndex(*this, "L", Phi1);
147 csl::Index j = GaugeIndex(*this, "L", Phi1);
148
149 csl::Expr s11 = csl::GetComplexConjugate(Phi1(i)) * Phi1(i);
150 csl::Expr s12 = csl::GetComplexConjugate(Phi1(i)) * Phi2(i);
151 csl::Expr s21 = csl::GetComplexConjugate(Phi2(j)) * Phi1(j);
152 csl::Expr s22 = csl::GetComplexConjugate(Phi2(j)) * Phi2(j);
153
154 csl::Expr term_m11 = -m11 * m11 * s11;
155 csl::Expr term_m22 = -m22 * m22 * s22;
156 csl::Expr term_m12 = m12 * m12 * (s12 + s21);
157
158 csl::Expr term_l1 = -lambda1 / 2 * csl::pow_s(s11, 2);
159 csl::Expr term_l2 = -lambda2 / 2 * csl::pow_s(s22, 2);
160 csl::Expr term_l3 = -lambda3 * s11 * s22;
161 csl::Expr term_l4 = -lambda4 * s12 * s21;
162 csl::Expr term_l5
163 = -lambda5 / 2 * (csl::pow_s(s12, 2) + csl::pow_s(s21, 2));
164
165 AddTerm(*this,
166 {term_m11,
167 term_m12,
168 term_m22,
169 term_l1,
170 term_l2,
171 term_l3,
172 term_l4,
173 term_l5});
174}
175
176template <int type>
178{
179 auto *flavorSpace = getVectorSpace("SM_flavor");
180 csl::Tensor Y1u("Y1u", {flavorSpace, flavorSpace});
181 csl::Tensor Y1d("Y1d", {flavorSpace, flavorSpace});
182 csl::Tensor Y1e("Y1e", {flavorSpace, flavorSpace});
183 Y1u->setComplexProperty(csl::ComplexProperty::Complex);
184 Y1d->setComplexProperty(csl::ComplexProperty::Complex);
185 Y1e->setComplexProperty(csl::ComplexProperty::Complex);
186 csl::Tensor Y2u("Y2u", {flavorSpace, flavorSpace});
187 csl::Tensor Y2d("Y2d", {flavorSpace, flavorSpace});
188 csl::Tensor Y2e("Y2e", {flavorSpace, flavorSpace});
189 Y2u->setComplexProperty(csl::ComplexProperty::Complex);
190 Y2d->setComplexProperty(csl::ComplexProperty::Complex);
191 Y2e->setComplexProperty(csl::ComplexProperty::Complex);
192 csl::Tensor eps = getVectorSpace("L", "Q")->getEpsilon();
193 csl::Index I = flavorSpace->generateIndex();
194 csl::Index J = flavorSpace->generateIndex();
195 csl::Index a = generateIndex("C", "Q");
196 csl::Index i = generateIndex("L", "Q");
197 csl::Index j = generateIndex("L", "Q");
198 csl::Index al = DiracIndex();
199
200 Particle Q = getParticle("Q");
201 Particle U = getParticle("U_R");
202 Particle D = getParticle("D_R");
203 Particle L = getParticle("L");
204 Particle E = getParticle("E_R");
205 Particle Phi1 = getParticle("Phi1");
206 Particle Phi2 = getParticle("Phi2");
207
208 addLagrangianTerm(
209 Y1u({I, J}) * csl::GetComplexConjugate(Phi1(i)) * eps({i, j})
210 * csl::GetComplexConjugate(Q({I, a, j, al})) * U({J, a, al}),
211 true);
212 addLagrangianTerm(-Y1d({I, J}) * Phi1(i)
213 * csl::GetComplexConjugate(Q({I, a, i, al}))
214 * D({J, a, al}),
215 true);
216 addLagrangianTerm(-Y1e({I, J}) * Phi1(i)
217 * csl::GetComplexConjugate(L({I, i, al}))
218 * E({J, al}),
219 true);
220
221 addLagrangianTerm(
222 Y2u({I, J}) * csl::GetComplexConjugate(Phi2(i)) * eps({i, j})
223 * csl::GetComplexConjugate(Q({I, a, j, al})) * U({J, a, al}),
224 true);
225 addLagrangianTerm(-Y2d({I, J}) * Phi2(i)
226 * csl::GetComplexConjugate(Q({I, a, i, al}))
227 * D({J, a, al}),
228 true);
229 addLagrangianTerm(-Y2e({I, J}) * Phi2(i)
230 * csl::GetComplexConjugate(L({I, i, al}))
231 * E({J, al}),
232 true);
233
234 addTensorCoupling(Y1e);
235 addTensorCoupling(Y1u);
236 addTensorCoupling(Y1d);
237 addTensorCoupling(Y2e);
238 addTensorCoupling(Y2u);
239 addTensorCoupling(Y2d);
240}
241
242template <int type>
244{
246 // Actual gauge (spontaneous) symmetry breaking
248
249 v1 = csl::constant_s("v1");
250 beta = csl::constant_s("beta");
251 tan_beta = csl::tan_s(beta);
252 v = csl::constant_s("v");
253 v2 = v1 * tan_beta;
254
255 Particle Phi_10 = GetParticle(*this, "Phi1_1");
256 Particle Phi_11 = GetParticle(*this, "Phi1_2");
257 Particle Phi_20 = GetParticle(*this, "Phi2_1");
258 Particle Phi_21 = GetParticle(*this, "Phi2_2");
259
260 Particle phi1_c = scalarboson_s("phi_1", *this);
261 Particle phi2_c = scalarboson_s("phi_2", *this);
262 Particle rho_1 = scalarboson_s("rho_1", *this);
263 Particle rho_2 = scalarboson_s("rho_2", *this);
264 Particle eta_1 = scalarboson_s("eta_1", *this);
265 Particle eta_2 = scalarboson_s("eta_2", *this);
266 SetSelfConjugate(rho_1, true);
267 SetSelfConjugate(rho_2, true);
268 SetSelfConjugate(eta_1, true);
269 SetSelfConjugate(eta_2, true);
270
271 Replaced(*this, Phi_10, phi1_c());
272 Replaced(*this, Phi_11, (rho_1() + CSL_I * eta_1() + v1) / csl::sqrt_s(2));
273
274 Replaced(*this, Phi_20, phi2_c());
275 Replaced(*this, Phi_21, (rho_2() + CSL_I * eta_2() + v2) / csl::sqrt_s(2));
276
277 Replaced(*this,
278 csl::pow_s(m11, 2),
279 -CSL_HALF * lambda1 * v1 * v1 + v2 / v1 * m12 * m12
280 - v2 * v2 / 2 * lambda3 - v2 * v2 / 2 * lambda4
281 - v2 * v2 / 2 * lambda5);
282
283 Replaced(*this,
284 csl::pow_s(m22, 2),
285 -CSL_HALF * lambda2 * v2 * v2 + v1 / v2 * m12 * m12
286 - v1 * v1 / 2 * lambda3 - v1 * v1 / 2 * lambda4
287 - v1 * v1 / 2 * lambda5);
288}
289
290template <int type>
292{
294 // Diagonalizing what can be
296
297 alpha = csl::constant_s("alpha");
298
299 mty::Particle eta_u = getParticle("eta_1");
300 mty::Particle eta_d = getParticle("eta_2");
301 mty::Particle G0 = scalarboson_s("G0; G^0", *this);
302 mty::Particle A0 = scalarboson_s("A0; A^0", *this);
303 mty::SetSelfConjugate(G0, true);
304 mty::SetSelfConjugate(A0, true);
305 rotateFields({eta_u, eta_d},
306 {G0, A0},
307 {{csl::cos_s(beta), -csl::sin_s(beta)},
308 {csl::sin_s(beta), csl::cos_s(beta)}},
309 true,
310 1 // diagonalize, one massless state
311 );
312
313 mty::Particle phi_u = getParticle("phi_1");
314 mty::Particle phi_d = getParticle("phi_2");
315 mty::Particle Gp = scalarboson_s("Gp; G^+", *this);
316 mty::Particle Hp = scalarboson_s("Hp; H^+", *this);
317 rotateFields({phi_u, phi_d},
318 {Gp, Hp},
319 {{csl::cos_s(beta), -csl::sin_s(beta)},
320 {csl::sin_s(beta), csl::cos_s(beta)}},
321 true,
322 1 // diagonalize, one massless state
323 );
324
325 mty::Particle rho_u = getParticle("rho_1");
326 mty::Particle rho_d = getParticle("rho_2");
327 mty::Particle h = scalarboson_s("h; h^0", *this);
328 mty::Particle H = scalarboson_s("H0; H^0", *this);
329 mty::SetSelfConjugate(h, true);
330 mty::SetSelfConjugate(H, true);
331 rotateFields({rho_u, rho_d},
332 {h, H},
333 {{-csl::sin_s(alpha), csl::cos_s(alpha)},
334 {csl::cos_s(alpha), csl::sin_s(alpha)}},
335 true // diagonalize, no massless state
336 );
337
338 DiagonalizeMassMatrices(*this);
339 Rename(*this, "B", "A");
340 Rename(*this, "W_3", "Z");
341
342 gY = GetCoupling(*this, "g_Y");
343 gL = GetCoupling(*this, "g_L");
344 theta_Weinberg = csl::constant_s("theta_W");
345 e = csl::constant_s("e_em");
346
347 Replaced(*this,
348 gL * gL + gY * gY,
349 csl::pow_s(gL / csl::cos_s(theta_Weinberg), csl::int_s(2)));
350 Replaced(*this, gY, e / csl::cos_s(theta_Weinberg));
351 Replaced(*this, gL, e / csl::sin_s(theta_Weinberg));
352}
353
354template <int type>
356{
358 // Taking care of yukawa couplings
360
361 csl::Tensor Ye1 = GetYukawa(*this, "Y1e");
362 csl::Tensor Yu1 = GetYukawa(*this, "Y1u");
363 csl::Tensor Yd1 = GetYukawa(*this, "Y1d");
364
365 csl::Tensor Ye2 = GetYukawa(*this, "Y2e");
366 csl::Tensor Yu2 = GetYukawa(*this, "Y2u");
367 csl::Tensor Yd2 = GetYukawa(*this, "Y2d");
368
369 csl::Expr m_e = csl::constant_s("m_e");
370 csl::Expr m_mu = csl::constant_s("m_mu");
371 csl::Expr m_tau = csl::constant_s("m_tau");
372 csl::Expr m_u = csl::constant_s("m_u");
373 csl::Expr m_c = csl::constant_s("m_c");
374 csl::Expr m_t = csl::constant_s("m_t");
375 csl::Expr m_d = csl::constant_s("m_d");
376 csl::Expr m_s = csl::constant_s("m_s");
377 csl::Expr m_b = csl::constant_s("m_b");
378
379 const csl::Space *flavorSpace = GetSpace(Ye1);
380 csl::Tensor M_e = csl::tensor_s("M_e",
381 {flavorSpace, flavorSpace},
382 csl::matrix_s({{m_e, CSL_0, CSL_0},
383 {CSL_0, m_mu, CSL_0},
384 {CSL_0, CSL_0, m_tau}}));
385
386 csl::Tensor M_u = csl::tensor_s(
387 "M_u",
388 {flavorSpace, flavorSpace},
389 csl::matrix_s(
390 {{m_u, CSL_0, CSL_0}, {CSL_0, m_c, CSL_0}, {CSL_0, CSL_0, m_t}}));
391
392 csl::Tensor M_d = csl::tensor_s(
393 "M_d",
394 {flavorSpace, flavorSpace},
395 csl::matrix_s(
396 {{m_d, CSL_0, CSL_0}, {CSL_0, m_s, CSL_0}, {CSL_0, CSL_0, m_b}}));
397
398 csl::Index f_i = GetIndex(flavorSpace);
399 csl::Index f_j = GetIndex(flavorSpace);
400 csl::Index f_k = GetIndex(flavorSpace);
401 csl::Index f_l = GetIndex(flavorSpace);
402 csl::Tensor delta_flav = Delta(flavorSpace);
403
404 buildCKM(flavorSpace);
405
406 auto e_coefs = Z2_coef(Z2_charges<type>::e);
407 auto u_coefs = Z2_coef(Z2_charges<type>::u);
408 auto d_coefs = Z2_coef(Z2_charges<type>::d);
409 Replaced(*this, Ye1, e_coefs.first * Ye1({f_i, f_j}));
410 Replaced(*this, Ye2, e_coefs.second * Ye1({f_i, f_j}));
411 Replaced(*this, Yu1, u_coefs.first * Yu1({f_i, f_j}));
412 Replaced(*this, Yu2, u_coefs.second * Yu1({f_i, f_j}));
413 Replaced(*this, Yd1, d_coefs.first * Yd1({f_i, f_j}));
414 Replaced(*this, Yd2, d_coefs.second * Yd1({f_i, f_j}));
415
416 csl::Expr e_mass_coef = Z2_mass_coef(v1, v2, Z2_charges<type>::e);
417 csl::Expr u_mass_coef = Z2_mass_coef(v1, v2, Z2_charges<type>::u);
418 csl::Expr d_mass_coef = Z2_mass_coef(v1, v2, Z2_charges<type>::d);
419 Replaced(*this, Ye1, e_mass_coef * M_e({f_i, f_j}));
420 Replaced(*this, Yu1, u_mass_coef * M_u({f_i, f_j}));
421 Replaced(*this,
422 Yd1({f_i, f_j}),
423 d_mass_coef
424 * csl::prod_s(
425 {V_CKM({f_i, f_k}),
426 M_d({f_k, f_l}),
427 GetHermitianConjugate(V_CKM({f_l, f_j}), flavorSpace)},
428 true));
429
430 mty::Particle D_L = GetParticle(*this, "D_L");
431 mty::Particle D_R = GetParticle(*this, "D_R");
432 csl::Index a1 = DiracIndex();
433 csl::Index A = GaugeIndex(*this, "C", D_L);
434 Replaced(*this, D_L({f_j, A, a1}), V_CKM({f_j, f_k}) * D_L({f_k, A, a1}));
435 Replaced(*this, D_R({f_i, A, a1}), V_CKM({f_i, f_j}) * D_R({f_j, A, a1}));
436 Replaced(*this, 1 + csl::pow_s(tan_beta, -2), v * v / (v2 * v2));
437}
438
439template <int type>
441{
442 Replaced(*this, getParticle("W")->getMass(), sm_input::M_W);
443 getParticle("W")->setMass(sm_input::M_W);
444 Replaced(*this, getParticle("Z")->getMass(), sm_input::M_Z);
445 getParticle("Z")->setMass(sm_input::M_Z);
446 PromoteGoldstone(*this, "Gp", "W");
447 PromoteGoldstone(*this, "G0", "Z");
448 // Replaced(*this,
449 // 1 + tan_beta*tan_beta,
450 // csl::pow_s(2 * getParticle("W")->getMass()
451 // * csl::sin_s(theta_Weinberg) / (e * v1), 2));
452 Replaced(
453 *this, tan_beta + 1 / tan_beta, (1 + tan_beta * tan_beta) / tan_beta);
454 Replaced(*this, v1, v / csl::sqrt_s(1 + tan_beta * tan_beta));
455 Replaced(*this, v, (2 * sm_input::M_W * csl::sin_s(theta_Weinberg)) / e);
456 Replaced(*this,
457 1 / (1 + tan_beta * tan_beta)
458 + tan_beta * tan_beta / (1 + tan_beta * tan_beta),
459 CSL_1);
460 Replaced(*this,
461 1 + csl::pow_s(tan_beta, -2),
462 1 / csl::pow_s(csl::sin_s(beta), 2));
463 Replaced(*this,
464 1 + csl::pow_s(tan_beta, 2),
465 1 / csl::pow_s(csl::cos_s(beta), 2));
466 Replaced(*this, csl::tan_s(beta), csl::sin_s(beta) / csl::cos_s(beta));
467 refresh();
468 L.mergeTerms();
469}
470
471template <int type>
475
476template <int t_type>
477std::ostream &operator<<(std::ostream &out, THDM_Model<t_type> const &model)
478{
479 return out << *static_cast<Model const *>(&model);
480}
481
482} // End of namespace mty
483
484#endif
Standard Model of particle physics.
Definition sm.h:35
void initGauge()
void flavorSymmetryBreaking()
void gaugeSymmetryBreaking()
void initFermions()
csl::Expr lambda3
Definition thdm.h:90
void adjust()
Definition thdm.h:440
void diagonalize2By2Matrices()
Definition thdm.h:291
csl::Expr m11
Definition thdm.h:90
csl::Expr e
Definition thdm.h:94
csl::Expr lambda4
Definition thdm.h:90
csl::Expr beta
Definition thdm.h:93
csl::Expr gY
Definition thdm.h:94
csl::Expr lambda1
Definition thdm.h:90
void replaceHiggs()
Definition thdm.h:243
csl::Expr alpha
Definition thdm.h:93
csl::Expr v
Definition thdm.h:92
friend std::ostream & operator<<(std::ostream &out, THDM_Model const &model)
void initYukawas()
Definition thdm.h:177
void initContent()
Definition thdm.h:116
csl::Expr v2
Definition thdm.h:92
void initHiggsSector()
Definition thdm.h:125
void init()
Definition thdm.h:105
csl::Expr gL
Definition thdm.h:94
csl::Expr tan_beta
Definition thdm.h:93
csl::Expr m22
Definition thdm.h:90
THDM_Model(bool initialize=true)
Definition thdm.h:98
csl::Expr lambda2
Definition thdm.h:90
~THDM_Model() override
Definition thdm.h:472
void replaceYukawas()
Definition thdm.h:355
csl::Expr theta_Weinberg
Definition thdm.h:94
csl::Expr v1
Definition thdm.h:92
csl::Expr lambda5
Definition thdm.h:90
csl::Expr m12
Definition thdm.h:90
constexpr std::complex< double > I
Definition constants.h:20
constexpr double E
Definition constants.h:13
csl::Expr M_Z
Definition sm.h:94
csl::Expr M_W
Definition sm.h:106
Definition sm.h:30
std::ostream & operator<<(std::ostream &out, THDM_Model< t_type > const &model)
Definition thdm.h:477
csl::Expr Z2_mass_coef(csl::Expr const &v1, csl::Expr const &v2, int charge)
std::pair< csl::Expr, csl::Expr > Z2_coef(int charge)