Documentation of MARTY
A Modern ARtificial Theoretical phYsicist
2HDM.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 "model.h"
27 #include "mrtInterface.h"
28 #include "CKM.h"
29 #include "SM.h"
30 
31 namespace mty {
32 
33 template<int type>
34 struct Z2_charges {};
35 
36 template<>
37 struct Z2_charges<1> {
38  static constexpr int u = 1;
39  static constexpr int d = 1;
40  static constexpr int e = 1;
41 };
42 template<>
43 struct Z2_charges<2> {
44  static constexpr int u = 1;
45  static constexpr int d = -1;
46  static constexpr int e = -1;
47 };
48 template<>
49 struct Z2_charges<3> {
50  static constexpr int u = 1;
51  static constexpr int d = -1;
52  static constexpr int e = 1;
53 };
54 template<>
55 struct Z2_charges<4> {
56  static constexpr int u = 1;
57  static constexpr int d = 1;
58  static constexpr int e = -1;
59 };
60 
61 std::pair<csl::Expr, csl::Expr> Z2_coef(
62  int charge);
63 csl::Expr Z2_mass_coef(
64  csl::Expr const &v1,
65  csl::Expr const &v2,
66  int charge);
67 
68 template<int type>
69 class TwoHDM_Model: public mty::Model {
70 
71 public:
72  TwoHDM_Model();
73  ~TwoHDM_Model() override;
74 
75  template<int t_type>
76  friend std::ostream &operator<<(
77  std::ostream &out,
78  TwoHDM_Model const &model
79  );
80 };
81 
82 template<int type>
84  :mty::Model("models/files/2HDM.json")
85 {
86  getParticle("g")->setDrawType(drawer::ParticleType::Gluon);
87  csl::Expr m11 = csl::constant_s("m_{11}");
88  csl::Expr m12 = csl::constant_s("m_{12}");
89  csl::Expr m22 = csl::constant_s("m_{22}");
90  csl::Expr lambda1 = csl::constant_s("\\lambda _1");
91  csl::Expr lambda2 = csl::constant_s("\\lambda _2");
92  csl::Expr lambda3 = csl::constant_s("\\lambda _3");
93  csl::Expr lambda4 = csl::constant_s("\\lambda _4");
94  csl::Expr lambda5 = csl::constant_s("\\lambda _5");
95 
96  Particle Phi1 = GetParticle(*this, "\\Phi _1");
97  Particle Phi2 = GetParticle(*this, "\\Phi _2");
98 
99  csl::Index i = GaugeIndex(*this, "SU2L", Phi1);
100  csl::Index j = GaugeIndex(*this, "SU2L", Phi1);
101 
102  csl::Expr s11 = csl::GetComplexConjugate(Phi1(i)) * Phi1(i);
103  csl::Expr s12 = csl::GetComplexConjugate(Phi1(i)) * Phi2(i);
104  csl::Expr s21 = csl::GetComplexConjugate(Phi2(j)) * Phi1(j);
105  csl::Expr s22 = csl::GetComplexConjugate(Phi2(j)) * Phi2(j);
106 
107  csl::Expr term_m11 = -m11*m11 * s11;
108  csl::Expr term_m22 = -m22*m22 * s22;
109  csl::Expr term_m12 = m12*m12 * (s12 + s21);
110 
111  csl::Expr term_l1 = -lambda1 / 2 * csl::pow_s(s11, 2);
112  csl::Expr term_l2 = -lambda2 / 2 * csl::pow_s(s22, 2);
113  csl::Expr term_l3 = -lambda3 * s11 * s22;
114  csl::Expr term_l4 = -lambda4 * s12 * s21;
115  csl::Expr term_l5 = -lambda5 / 2 * (csl::pow_s(s12, 2) + csl::pow_s(s21, 2));
116 
117  AddTerm(*this, {term_m11, term_m12, term_m22,
118  term_l1, term_l2, term_l3, term_l4, term_l5});
119 
121  // Breaking gauge SU(2)_L symmetry, renaming
123 
124  BreakGaugeSymmetry(*this, "U1Y");
125  BreakGaugeSymmetry(
126  *this,
127  "SU2L",
128  {"\\Phi _1", "\\Phi _2", "W", "Q", "L"},
129  {{"\\Phi _{10}", "\\Phi _{11}"},
130  {"\\Phi _{20}", "\\Phi _{21}"},
131  {"W^1", "W^2", "W^3"},
132  {"U_L", "D_L"},
133  {"\\Nu _L", "E_L"}});
134 
136  // Replacements to get SM particles W +-
138 
139  Particle W1 = GetParticle(*this, "W^1");
140  Particle W2 = GetParticle(*this, "W^2");
141  Particle W_SM = GenerateSimilarParticle("W", W1);
142  SetSelfConjugate(W_SM, false);
143 
145  csl::Index nu = MinkowskiIndex();
146  csl::Expr W_p = W_SM(+mu);
147  csl::Expr W_m = csl::GetComplexConjugate(W_SM(+mu));
148  csl::Expr F_W_p = W_SM({+mu,+nu});
149  csl::Expr F_W_m = csl::GetComplexConjugate(W_SM({+mu, +nu}));
150 
151  Replaced(*this,
152  W1,
153  (W_p + W_m) / csl::sqrt_s(2));
154  Replaced(*this,
155  W2,
156  CSL_I * (W_p - W_m) / csl::sqrt_s(2));
157  Replaced(*this,
158  GetFieldStrength(W1),
159  (F_W_p + F_W_m) / csl::sqrt_s(2));
160  Replaced(*this,
161  GetFieldStrength(W2),
162  CSL_I * (F_W_p - F_W_m) / csl::sqrt_s(2));
163 
165  // Actual gauge (spontaneous) symmetry breaking
167 
168  csl::Expr v1 = csl::constant_s("v1");
169  csl::Expr beta = csl::constant_s("\\beta");
170  csl::Expr tan_beta = csl::tan_s(beta);
171  csl::Expr v = csl::constant_s("v");
172  csl::Expr v2 = v1 * tan_beta;
173 
174  Particle Phi_10 = GetParticle(*this, "\\Phi _{10}");
175  Particle Phi_11 = GetParticle(*this, "\\Phi _{11}");
176  Particle Phi_20 = GetParticle(*this, "\\Phi _{20}");
177  Particle Phi_21 = GetParticle(*this, "\\Phi _{21}");
178 
179  Particle phi1_c = scalarboson_s("\\phi _1^+", *this);
180  Particle phi2_c = scalarboson_s("\\phi _2^+", *this);
181  Particle rho_1 = scalarboson_s("\\rho _1", *this);
182  Particle rho_2 = scalarboson_s("\\rho _2", *this);
183  Particle eta_1 = scalarboson_s("\\eta _1", *this);
184  Particle eta_2 = scalarboson_s("\\eta _2", *this);
185  SetSelfConjugate(rho_1, true);
186  SetSelfConjugate(rho_2, true);
187  SetSelfConjugate(eta_1, true);
188  SetSelfConjugate(eta_2, true);
189 
190  Replaced(*this,
191  Phi_10,
192  phi1_c());
193  Replaced(*this,
194  Phi_11,
195  (rho_1() + CSL_I*eta_1() + v1)/csl::sqrt_s(2));
196 
197  Replaced(*this,
198  Phi_20,
199  phi2_c());
200  Replaced(*this,
201  Phi_21,
202  (rho_2() + CSL_I*eta_2() + v2)/csl::sqrt_s(2));
203 
204  Replaced(*this,
205  csl::pow_s(m11, 2),
206  - CSL_HALF*lambda1*v1*v1 + v2/v1*m12*m12
207  - v2*v2/2*lambda3 - v2*v2/2*lambda4 - v2*v2/2*lambda5);
208 
209  Replaced(*this,
210  csl::pow_s(m22, 2),
211  - CSL_HALF*lambda2*v2*v2 + v1/v2*m12*m12
212  - v1*v1/2*lambda3 - v1*v1/2*lambda4 - v1*v1/2*lambda5);
213 
215  // Diagonalizing what can be
217 
218  Particle h = scalarboson_s("h^0", *this);
219  Particle H = scalarboson_s("H^0", *this);
220  SetSelfConjugate(h, true);
221  SetSelfConjugate(H, true);
222  csl::Expr alpha = csl::constant_s("\\alpha");
223  Rotate(*this,
224  {rho_1, rho_2},
225  {h, H},
226  {{-csl::sin_s(alpha), csl::cos_s(alpha)},
227  {csl::cos_s(alpha), csl::sin_s(alpha)}},
228  true);
229 
230  DiagonalizeMassMatrices(*this);
231  Rename(*this, "B", "A");
232  Rename(*this, "W^3", "Z");
233  Rename(*this, "\\phi _1^+", "G^+");
234  Rename(*this, "\\phi _2^+", "H^+");
235  Rename(*this, "\\eta _1", "G^0");
236  Rename(*this, "\\eta _2", "A^0");
237 
238  csl::Expr gY = GetCoupling(*this, "gY");
239  csl::Expr gL = GetCoupling(*this, "gL");
240  csl::Expr theta_Weinberg = csl::constant_s("theta_W");
241  csl::Expr e = csl::constant_s("e_em");
242 
243  Replaced(*this,
244  gL*gL + gY*gY,
245  csl::pow_s(gL/csl::cos_s(theta_Weinberg), csl::int_s(2)));
246  Replaced(*this,
247  gY,
248  e / csl::cos_s(theta_Weinberg));
249  Replaced(*this,
250  gL,
251  e / csl::sin_s(theta_Weinberg));
252 
254  // Taking care of yukawa couplings
256 
257  csl::Tensor Ye1 = GetYukawa(*this, "Y1e");
258  csl::Tensor Yu1 = GetYukawa(*this, "Y1u");
259  csl::Tensor Yd1 = GetYukawa(*this, "Y1d");
260 
261  csl::Tensor Ye2 = GetYukawa(*this, "Y2e");
262  csl::Tensor Yu2 = GetYukawa(*this, "Y2u");
263  csl::Tensor Yd2 = GetYukawa(*this, "Y2d");
264 
265  csl::Expr Ye2_tensor = Ye2->getTensor();
266  for (int i = 0; i != 3; ++i)
267  for (int j= 0; j != 3; ++j)
268  if (i != j)
269  Ye2_tensor->setArgument(CSL_0, {i, j});
270 
271  csl::Expr m_e = csl::constant_s("m_e");
272  csl::Expr m_mu = csl::constant_s("m_\\mu");
273  csl::Expr m_tau = csl::constant_s("m_\\tau");
274  csl::Expr m_u = csl::constant_s("m_u");
275  csl::Expr m_c = csl::constant_s("m_c");
276  csl::Expr m_t = csl::constant_s("m_t");
277  csl::Expr m_d = csl::constant_s("m_d");
278  csl::Expr m_s = csl::constant_s("m_s");
279  csl::Expr m_b = csl::constant_s("m_b");
280 
281  const csl::Space* flavorSpace = GetSpace(Ye1);
282  csl::Tensor M_e = csl::tensor_s(
283  "M_e",
284  {flavorSpace, flavorSpace},
285  csl::matrix_s({{m_e, CSL_0, CSL_0},
286  {CSL_0, m_mu, CSL_0},
287  {CSL_0, CSL_0, m_tau}}));
288 
289  csl::Tensor M_u = csl::tensor_s(
290  "M_u",
291  {flavorSpace, flavorSpace},
292  csl::matrix_s({{m_u, CSL_0, CSL_0},
293  {CSL_0, m_c, CSL_0},
294  {CSL_0, CSL_0, m_t}}));
295 
296  csl::Tensor M_d = csl::tensor_s(
297  "M_d",
298  {flavorSpace, flavorSpace},
299  csl::matrix_s({{m_d, CSL_0, CSL_0},
300  {CSL_0, m_s, CSL_0},
301  {CSL_0, CSL_0, m_b}}));
302 
303 
304  csl::Index f_i = GetIndex(flavorSpace);
305  csl::Index f_j = GetIndex(flavorSpace);
306  csl::Index f_k = GetIndex(flavorSpace);
307  csl::Index f_l = GetIndex(flavorSpace);
308  csl::Tensor delta_flav = Delta(flavorSpace);
309 
310  csl::Tensor U_uL = Unitary("U^u_L", flavorSpace);
311  csl::Tensor U_uR = Unitary("U^u_R", flavorSpace);
312  csl::Tensor U_dR = Unitary("U^d_R", flavorSpace);
313 
314  buildCKM(flavorSpace);
315 
316  auto e_coefs = Z2_coef(Z2_charges<type>::e);
317  auto u_coefs = Z2_coef(Z2_charges<type>::u);
318  auto d_coefs = Z2_coef(Z2_charges<type>::d);
319  Replaced(*this,
320  Ye1,
321  e_coefs.first * Ye1({f_i, f_j}));
322  Replaced(*this,
323  Ye2,
324  e_coefs.second * Ye1({f_i, f_j}));
325  Replaced(*this,
326  Yu1,
327  u_coefs.first * Yu1({f_i, f_j}));
328  Replaced(*this,
329  Yu2,
330  u_coefs.second * Yu1({f_i, f_j}));
331  Replaced(*this,
332  Yd1,
333  d_coefs.first * Yd1({f_i, f_j}));
334  Replaced(*this,
335  Yd2,
336  d_coefs.second * Yd1({f_i, f_j}));
337 
338  csl::Expr e_mass_coef = Z2_mass_coef(v1, v2, Z2_charges<type>::e);
339  csl::Expr u_mass_coef = Z2_mass_coef(v1, v2, Z2_charges<type>::u);
340  csl::Expr d_mass_coef = Z2_mass_coef(v1, v2, Z2_charges<type>::d);
341  Replaced(*this,
342  Ye1,
343  e_mass_coef * M_e({f_i, f_j}));
344  Replaced(*this,
345  Yu1,
346  u_mass_coef * M_u({f_i, f_j}));
347  Replaced(*this,
348  Yd1,
349  d_mass_coef * csl::prod_s({V_CKM({f_i, f_k}),
350  M_d({f_k, f_l}),
351  GetHermitianConjugate(V_CKM({f_l, f_j}),
352  flavorSpace)},
353  true));
354 
355  mty::Particle D_L = GetParticle(*this, "D_L");
356  mty::Particle D_R = GetParticle(*this, "D_R");
357  csl::Index a1 = DiracIndex();
358  csl::Index A = GaugeIndex(*this, "SU3c", D_L);
359  Replaced(*this,
360  D_L({f_j, A, a1}),
361  V_CKM({f_j, f_k}) * D_L({f_k, A, a1}));
362  Replaced(*this,
363  D_R({f_i, A, a1}),
364  V_CKM({f_i, f_j}) * D_R({f_j, A, a1}));
365  Replaced(*this,
366  1 + csl::pow_s(tan_beta, -2),
367  v*v/(v2*v2));
368 
370  // Finally breaking SM flavor symmetry
371  // to get the 3 fermion generations
373 
374  BreakFlavorSymmetry(*this,
375  "SM_flavor",
376  {"U_L", "U_R", "D_L", "D_R", "E_L", "E_R", "\\Nu _L"},
377  {{"u_L", "c_L", "t_L"},
378  {"u_R", "c_R", "t_R"},
379  {"d_L", "s_L", "b_L"},
380  {"d_R", "s_R", "b_R"},
381  {"e_L", "mu_L;\\mu_L", "tau_L;\\tau_L"},
382  {"e_R", "mu_R;\\mu_R", "tau_R;\\tau_R"},
383  {"nue;\\nu_{eL}", "num;\\nu_{\\mu L}", "nut;\\nu_{\\tau L}"}});
384 
385  Replaced(*this,
386  getParticle("W")->getMass(),
387  sm_input::M_W);
388  getParticle("W")->setMass(sm_input::M_W);
389  Replaced(*this,
390  getParticle("Z")->getMass(),
391  sm_input::M_Z);
392  getParticle("Z")->setMass(sm_input::M_Z);
393  PromoteGoldstone(*this, "G^+", "W");
394  PromoteGoldstone(*this, "G^0", "Z");
395  // Replaced(*this,
396  // 1 + tan_beta*tan_beta,
397  // csl::pow_s(2 * getParticle("W")->getMass()
398  // * csl::sin_s(theta_Weinberg) / (e * v1), 2));
399  Replaced(*this,
400  tan_beta + 1/tan_beta,
401  (1 + tan_beta*tan_beta) / tan_beta
402  );
403  Replaced(*this,
404  v1,
405  v / csl::sqrt_s(1 + tan_beta*tan_beta)
406  );
407  Replaced(*this,
408  v,
409  (2 * sm_input::M_W * csl::sin_s(theta_Weinberg)) / e
410  );
411  Replaced(*this,
412  1 / (1 + tan_beta*tan_beta) + tan_beta*tan_beta / (1 + tan_beta*tan_beta),
413  CSL_1
414  );
415  refresh();
416  L.mergeTerms();
417 }
418 
419 template<int type>
421 {
422 
423 }
424 
425 template<int t_type>
426 std::ostream &operator<<(
427  std::ostream &out,
428  TwoHDM_Model<t_type> const &model
429  )
430 {
431  return out << *static_cast<Model const*>(&model);
432 }
433 
434 } // End of namespace mty
435 
436 #endif
void Replaced(mty::Model &model, csl::Expr const &init, csl::Expr const &target)
Replaces an expression in all kinetic / mass / interactions terms of a model.
Definition: mrtInterface.cpp:499
Particle scalarboson_s(Args &&...args)
Delegates the construction of a Scalar boson and returns the result.
Definition: scalarField.h:204
csl::Tensor Delta(const csl::Space *space)
Returns the Kronecker delta of a given vector space.
Definition: mrtInterface.cpp:116
csl::Index DiracIndex(std::string const &name="")
Returns a csl::Index in the 4-dimensional Dirac space mty::dirac4.
Definition: mrtInterface.cpp:44
csl::Expr beta
Ratio of Higgs vacuum expectation values.
Definition: MSSM.h:79
csl::Expr mu
mu parameter.
Definition: MSSM.h:83
Definition: 2HDM.h:69
std::ostream & operator<<(std::ostream &fout, csl::Type type)
This class inherits from std::shared_ptr<QuantumFieldParent> and should be used instead of direct Qua...
Definition: quantumField.h:1409
Namespace of MARTY.
Definition: 2HDM.h:31
Contains the mty::Model class. It contains all objects in the theory. In particular QuantumField obje...
csl::Expr alpha
Diagonalization angle for (h0 H0).
Definition: MSSM.h:75
csl::Index GaugeIndex(std::string const &nameIndex, mty::Model const &model, GroupType &&group, FieldType &&part)
Returns a csl::Index living in the representation of a certain field in a certain group...
Definition: mrtInterface.h:166
Definition: 2HDM.h:34
Contains interface functions for the user.
csl::Index MinkowskiIndex(std::string const &name="")
Returns a csl::Index in csl::Minkowki space.
Definition: mrtInterface.cpp:37
File containing the Standard Model itself as a mty::Model object.
void Rotate(mty::Model &model, std::vector< mty::Particle > const &fields, std::vector< mty::Particle > const &newFields, std::vector< std::vector< csl::Expr >> const &rotation, bool diagonalizeMasses=false)
Rotates a bunch of fields to another using a given matrix.
Definition: mrtInterface.cpp:527
Contains all objects in the theory. In particular QuantumField objects, Gauge, Flavor, Particle...
Definition: model.h:68
Definition: gaugedGroup.h:97