Himalaya
Mh2EFTCalculator.cpp
Go to the documentation of this file.
1 // ====================================================================
2 // This file is part of Himalaya.
3 //
4 // Himalaya is licenced under the GNU General Public License (GNU GPL)
5 // version 3.
6 // ====================================================================
7 
11 #include "himalaya/mh2_fo/PV.hpp"
13 #include "himalaya/misc/Logger.hpp"
14 #include "himalaya/misc/Powers.hpp"
15 #include <cmath>
16 #include <iostream>
17 #include <string>
18 
19 /**
20  * @file Mh2EFTCalculator.cpp
21  * @brief Implementation of EFT Higgs mass calculation class.
22  */
23 
24 #define CALC_IF(cond,expr) ((cond) ? (expr) : 0)
25 
26 namespace himalaya {
27 namespace mh2_eft {
28 namespace {
29 
30 /// Returns var if not NaN, 0 otherwise
31 double discardNaN(double var, const std::string& msg = "")
32 {
33  if (std::isnan(var)) {
34  WARNING_MSG("NaN appeared in calculation of threshold correction"
35  << (msg.empty() ? "" : " " + msg) << "!");
36  return 0.;
37  }
38  return var;
39 }
40 
41 /// Re(B0(s,x,x,q2)), Eq.(2.4) from [hep-ph/0701051]
42 double fB(double s, double x, double q2) noexcept
43 {
44  return mh2_fo::b0xx(s, x, q2);
45 }
46 
47 } // anonymous namespace
48 
49 /**
50  * Constructor
51  * @param p_ a HimalayaInterface struct
52  * @param verbose a bool enable the output of the parameter validation. Enabled by default
53  */
55  : p(p_)
56 {
57  p.validate(verbose);
58 
59  // fill orders
60  orders.fill(1);
61 
62  const double eps = 1e-10;
63 
64  // TODO(voigt) check consistency
65  if (std::abs(p.g1) < eps) {
72  }
73 
74  if (std::abs(p.g2) < eps) {
79  }
80 
81  if (std::abs(p.Mt) < eps) {
90  }
91 
92  if (std::abs(p.Mb) < eps) {
103  }
104 
105  if (std::abs(p.Mtau) < eps) {
113  }
114 
115  // For now, disable all 1L corrections, except 1L O(at)
127 
128  // For now, disable all 2L corrections, except 2L O(at*as + at^2)
136 }
137 
139 {
140  if (flag < 0 || flag > 1)
141  ERROR_MSG("You can only enable (1) or disable (0) corrections!");
142 
143  orders.at(order) = flag;
144 }
145 
146 /**
147  * Returns the tree-level EFT contribution to the light CP-even Higgs mass
148  */
150 {
151  return pow2(p.MZ * std::cos(2 * calcBeta()));
152 }
153 
154 /**
155  * Returns the 1-loop EFT contribution to the light CP-even Higgs mass
156  *
157  * @param omitSMLogs an integer flag to remove all Log(mu^2/mt^2) terms
158  * @param omitMSSMLogs an integer flag to remove all Log(mu^2/Mx^2) terms
159  * @return 1-loop EFT contribution to the light CP-even Higgs mass
160  */
161 double Mh2EFTCalculator::getDeltaMh2EFT1Loop(int omitSMLogs, int omitMSSMLogs) const
162 {
163  ThresholdCalculator thresholdCalculator(p);
164 
165  const double lmMt = omitSMLogs * std::log(pow2(p.scale / p.Mt));
166 
167  const double v2 = calcV2();
168  const double gt = sqrt2 * p.Mt / calcV();
169 
170  // 1-Loop prefactor at
171  const double pref_at = oneLoop * pow2(p.Mt * gt);
172 
173  const double q2 = pow2(p.Mt);
174  const double beta = calcBeta();
175  const double cbeta = calcCosBeta();
176  const double c2beta = std::cos(2 * beta);
177  const double sbeta = calcSinBeta();
178  const double mhtree2 = pow2(c2beta * p.MZ);
179  const double yt = sqrt2 * p.Mt / p.vu;
180  const double yb = sqrt2 * p.Mb / p.vd;
181  const double ytau = sqrt2 * p.Mtau / p.vd;
182  const int Xi = 1; // gauge parameter
183 
184  // Threshold corrections
185  const double dlambdayb2g12 =
187  thresholdCalculator.getThresholdCorrection(
189  RenSchemes::DRBARPRIME, omitMSSMLogs));
190 
191  const double dlambdag14 =
193  thresholdCalculator.getThresholdCorrection(
195  omitMSSMLogs));
196 
197  const double dlambdaregg14 =
199  thresholdCalculator.getThresholdCorrection(
201  RenSchemes::DRBARPRIME, omitMSSMLogs));
202 
203  const double dlambdachig14 =
205  thresholdCalculator.getThresholdCorrection(
207  RenSchemes::DRBARPRIME, omitMSSMLogs));
208 
209  const double dg1g1 = CALC_IF(orders.at(CouplingOrders::G14),
210  thresholdCalculator.getThresholdCorrection(
212  RenSchemes::DRBARPRIME, omitMSSMLogs));
213 
214  const double dlambdachig24 =
216  thresholdCalculator.getThresholdCorrection(
218  RenSchemes::DRBARPRIME, omitMSSMLogs));
219 
220  const double dlambdag24 =
222  thresholdCalculator.getThresholdCorrection(
224  omitMSSMLogs));
225 
226  const double dg2g2 = CALC_IF(orders.at(CouplingOrders::G24),
227  thresholdCalculator.getThresholdCorrection(
229  RenSchemes::DRBARPRIME, omitMSSMLogs));
230 
231  const double dlambdaregg24 =
233  thresholdCalculator.getThresholdCorrection(
235  RenSchemes::DRBARPRIME, omitMSSMLogs));
236 
237  const double dlambdag12g22 =
239  thresholdCalculator.getThresholdCorrection(
241  RenSchemes::DRBARPRIME, omitMSSMLogs));
242 
243  const double dlambdaregg12g22 =
245  thresholdCalculator.getThresholdCorrection(
247  RenSchemes::DRBARPRIME, omitMSSMLogs));
248 
249  const double dlambdachig12g22 =
251  thresholdCalculator.getThresholdCorrection(
253  RenSchemes::DRBARPRIME, omitMSSMLogs));
254 
255  const double dlambdayb2g22 =
257  thresholdCalculator.getThresholdCorrection(
259  RenSchemes::DRBARPRIME, omitMSSMLogs));
260 
261  const double dlambdayb4 =
263  thresholdCalculator.getThresholdCorrection(
265  omitMSSMLogs));
266 
267  const double dlambdayt2g12 =
269  thresholdCalculator.getThresholdCorrection(
271  RenSchemes::DRBARPRIME, omitMSSMLogs));
272 
273  const double dlambdayt2g22 =
275  thresholdCalculator.getThresholdCorrection(
277  RenSchemes::DRBARPRIME, omitMSSMLogs));
278 
279  const double dlambdaytau2g12 =
281  thresholdCalculator.getThresholdCorrection(
283  RenSchemes::DRBARPRIME, omitMSSMLogs));
284 
285  const double dlambdaytau2g22 =
287  thresholdCalculator.getThresholdCorrection(
289  RenSchemes::DRBARPRIME, omitMSSMLogs));
290 
291  const double dlambdaytau4 =
293  thresholdCalculator.getThresholdCorrection(
295  omitMSSMLogs));
296 
297  const double dvg12 = 0.;
298  // CALC_IF(orders.at(CouplingOrders::G12G22) ||
299  // orders.at(CouplingOrders::G14),
300  // thresholdCalculator.getThresholdCorrection(
301  // ThresholdCouplingOrders::VEV_G12, RenSchemes::DRBARPRIME,
302  // omitMSSMLogs));
303 
304  const double dvg22 = 0.;
305  // CALC_IF(orders.at(CouplingOrders::G12G22) ||
306  // orders.at(CouplingOrders::G24),
307  // thresholdCalculator.getThresholdCorrection(
308  // ThresholdCouplingOrders::VEV_G22, RenSchemes::DRBARPRIME,
309  // omitMSSMLogs));
310 
311  const double dvyt2 = CALC_IF(orders.at(CouplingOrders::G12YT2) ||
313  thresholdCalculator.getThresholdCorrection(
315  RenSchemes::DRBARPRIME, omitMSSMLogs));
316 
317  const double dvyb2 = CALC_IF(orders.at(CouplingOrders::G12YB2) ||
319  thresholdCalculator.getThresholdCorrection(
321  RenSchemes::DRBARPRIME, omitMSSMLogs));
322 
323  const double dvytau2 = CALC_IF(orders.at(CouplingOrders::G12YTAU2) ||
325  thresholdCalculator.getThresholdCorrection(
327  RenSchemes::DRBARPRIME, omitMSSMLogs));
328 
329  const double bbhDR = fB(mhtree2, mhtree2, q2);
330  const double bbwDR = fB(mhtree2, pow2(p.MW), q2);
331  const double bbzDR = fB(mhtree2, pow2(p.MZ), q2);
332  const double B00DR = fB(mhtree2, 0., q2);
333 
334  // corrections to Mh2
335  const double dmh2g12g22 = discardNaN(
337  ((v2 *
338  (24 + 40 * dlambdachig12g22 + 40 * dlambdag12g22 +
339  40 * dlambdaregg12g22 - 36 * lmMt + 40 * dvg12 * pow2(c2beta) +
340  24 * dvg22 * pow2(c2beta) + 36 * lmMt * pow2(c2beta) -
341  12 * lmMt * Xi * pow2(c2beta) -
342  6 * bbwDR * (-2 + pow2(c2beta)) * pow2(c2beta) - 6 * pow4(c2beta) -
343  27 * bbhDR * pow4(c2beta) - 36 * lmMt * pow4(c2beta) -
344  3 * bbzDR * (12 - 4 * pow2(c2beta) + pow4(c2beta)))) /
345  80.),
346  "dmh2g12g22");
347 
348  const double dmh2g14 = discardNaN(
350  (-(v2 * (-4 * (18 + 100 * dlambdachig14 + 100 * dlambdag14 +
351  100 * dlambdaregg14 - 27 * lmMt) +
352  6 * (40 * dg1g1 - 40 * dvg12 + 3 * lmMt * (-3 + Xi)) *
353  pow2(c2beta) +
354  9 * (9 * bbhDR + 2 * (1 + bbwDR + 6 * lmMt)) * pow4(c2beta) +
355  9 * bbzDR * (12 - 4 * pow2(c2beta) + pow4(c2beta)))) /
356  800.),
357  "dmh2g14");
358 
359  const double dmh2g24 = discardNaN(
361  (-(v2 * (-24 - 16 * dlambdachig24 - 16 * dlambdag24 -
362  16 * dlambdaregg24 + 36 * lmMt + 16 * dg2g2 * pow2(c2beta) -
363  16 * dvg22 * pow2(c2beta) - 18 * lmMt * pow2(c2beta) +
364  6 * lmMt * Xi * pow2(c2beta) + 2 * pow4(c2beta) +
365  9 * bbhDR * pow4(c2beta) + 12 * lmMt * pow4(c2beta) +
366  2 * bbwDR * (12 - 4 * pow2(c2beta) + pow4(c2beta)) +
367  bbzDR * (12 - 4 * pow2(c2beta) + pow4(c2beta)))) /
368  32.),
369  "dmh2g24");
370 
371  const double dmh2g12yb2 =
372  discardNaN(orders.at(CouplingOrders::G12YB2) *
373  (((10 * dlambdayb2g12 -
374  3 * (3 * B00DR - 2 * dvyb2 + 3 * lmMt) * pow2(c2beta)) *
375  pow2(cbeta) * v2) /
376  20.),
377  "dmh2g12yb2");
378 
379  const double dmh2g22yb2 =
380  discardNaN(orders.at(CouplingOrders::G22YB2) *
381  (((2 * dlambdayb2g22 +
382  (-3 * B00DR + 2 * dvyb2 - 3 * lmMt) * pow2(c2beta)) *
383  pow2(cbeta) * v2) /
384  4.),
385  "dmh2g22yb2");
386 
387  const double dmh2yb4 = discardNaN(
389  (((12 * B00DR + dlambdayb4 + 12 * lmMt) * v2 * pow4(cbeta)) / 2.),
390  "dmh2yb4");
391 
392  const double dmh2g12yt2 = discardNaN(
394  (((10 * dlambdayt2g12 + (6 + 6 * dvyt2 - 9 * lmMt) * pow2(c2beta)) *
395  pow2(sbeta) * v2) /
396  20.),
397  "dmh2g12yt2");
398 
399  const double dmh2g22yt2 = discardNaN(
401  (((2 * dlambdayt2g22 + (2 + 2 * dvyt2 - 3 * lmMt) * pow2(c2beta)) *
402  pow2(sbeta) * v2) /
403  4.),
404  "dmh2g22yt2");
405 
406  const double dmh2yt4 = discardNaN(
408  (pref_at * (12 * lmMt + thresholdCalculator.getThresholdCorrection(
410  RenSchemes::DRBARPRIME, omitMSSMLogs))),
411  "dmh2yt4");
412 
413  const double dmh2g12ytau2 =
414  discardNaN(orders.at(CouplingOrders::G12YTAU2) *
415  (-((-10 * dlambdaytau2g12 + 3 * B00DR * pow2(c2beta) +
416  3 * (-2 * dvytau2 + lmMt) * pow2(c2beta)) *
417  pow2(cbeta) * v2) /
418  20.),
419  "dmh2g12ytau2");
420 
421  const double dmh2g22ytau2 =
422  discardNaN(orders.at(CouplingOrders::G22YTAU2) *
423  (-((-2 * dlambdaytau2g22 + B00DR * pow2(c2beta) +
424  (-2 * dvytau2 + lmMt) * pow2(c2beta)) *
425  pow2(cbeta) * v2) /
426  4.),
427  "dmh2g22ytau2");
428 
429  const double dmh2ytau4 = discardNaN(
431  (((4 * B00DR + dlambdaytau4 + 4 * lmMt) * v2 * pow4(cbeta)) / 2.),
432  "dmh2ytau4");
433 
434  return dmh2yt4 + oneLoop * (
435  pow2(p.g1 * p.g2) * dmh2g12g22 + pow4(p.g1) * dmh2g14 + pow4(p.g2) *
436  dmh2g24 + pow2(p.g1 * yb) * dmh2g12yb2 + pow2(p.g2 * yb) * dmh2g22yb2 + pow4(yb) *
437  dmh2yb4 + pow2(p.g1 * ytau) * dmh2g12ytau2 + pow2(p.g2 * ytau) * dmh2g22ytau2 +
438  pow4(ytau) * dmh2ytau4 + pow2(p.g1 * yt) * dmh2g12yt2 + pow2(p.g2 * yt) * dmh2g22yt2);
439 }
440 
441 /**
442  * Returns the 2-loop EFT contribution to the light CP-even Higgs mass
443  * @param omitSMLogs an integer flag to remove all Log(mu^2/mt^2) terms
444  * @param omitMSSMLogs an integer flag to remove all Log(mu^2/Mx^2) terms
445  * @return 2-loop EFT contribution to the light CP-even Higgs mass
446  */
447 double Mh2EFTCalculator::getDeltaMh2EFT2Loop(int omitSMLogs, int omitMSSMLogs) const
448 {
449  ThresholdCalculator thresholdCalculator(p);
450 
451  const double lmMt = omitSMLogs * std::log(pow2(p.scale / p.Mt));
452  // couplings
453  const double v2 = calcV2();
454  const double gt = sqrt2 * p.Mt / calcV();
455  const double g32 = pow2(p.g3);
456  const double yt2 = 2*pow2(p.Mt / p.vu);
457  const double yb2 = 2*pow2(p.Mb / p.vd);
458  const double ytau2 = 2*pow2(p.Mtau / p.vd);
459  const double yt4 = pow2(yt2);
460  const double yb4 = pow2(yb2);
461  const double yt6 = pow3(yt2);
462  const double yb6 = pow3(yb2);
463  const double ytau4 = pow2(ytau2);
464  const double ytau6 = pow3(ytau2);
465  const double cbeta = calcCosBeta();
466  const double sbeta = calcSinBeta();
467  const double lmbMt = std::log(pow2(p.Mb / p.Mt));
468 
469  // 2-Loop prefactor at*as
470  const double pref = twoLoop * pow2(p.Mt * gt * p.g3);
471  const double B00DR = 0.;
472 
473  // Threshold corrections
474  const double dytas = CALC_IF(orders.at(CouplingOrders::G32YT4),
475  thresholdCalculator.getThresholdCorrection(
477  RenSchemes::DRBARPRIME, omitMSSMLogs));
478 
479  const double dlambdayb4g32 =
481  thresholdCalculator.getThresholdCorrection(
483  RenSchemes::DRBARPRIME, omitMSSMLogs));
484 
485  const double dlambdayb4 = CALC_IF(
489  thresholdCalculator.getThresholdCorrection(
491  omitMSSMLogs));
492 
493  const double dlambdayb6 =
495  thresholdCalculator.getThresholdCorrection(
497  omitMSSMLogs));
498 
499  const double dlambdayt4 = CALC_IF(
501  thresholdCalculator.getThresholdCorrection(
503  omitMSSMLogs));
504 
505  const double dytyt = CALC_IF(orders.at(CouplingOrders::YT6),
506  thresholdCalculator.getThresholdCorrection(
508  RenSchemes::DRBARPRIME, omitMSSMLogs));
509 
510  const double dlambdayt6 =
512  thresholdCalculator.getThresholdCorrection(
514  omitMSSMLogs));
515 
516  const double dvyt2 = CALC_IF(orders.at(CouplingOrders::YT6) ||
518  thresholdCalculator.getThresholdCorrection(
520  RenSchemes::DRBARPRIME, omitMSSMLogs));
521 
522  const double dytauytau = CALC_IF(orders.at(CouplingOrders::YTAU6),
523  thresholdCalculator.getThresholdCorrection(
525  RenSchemes::DRBARPRIME, omitMSSMLogs));
526 
527  const double dlambdaytau4 = CALC_IF(
529  thresholdCalculator.getThresholdCorrection(
531  omitMSSMLogs));
532 
533  const double dlambdaytau6 =
535  thresholdCalculator.getThresholdCorrection(
537  omitMSSMLogs));
538 
539  const double dlambdayt2yb4 =
541  thresholdCalculator.getThresholdCorrection(
543  RenSchemes::DRBARPRIME, omitMSSMLogs));
544 
545  const double dlambdayt4yb2 =
547  thresholdCalculator.getThresholdCorrection(
549  RenSchemes::DRBARPRIME, omitMSSMLogs));
550 
551  const double dytyb = CALC_IF(orders.at(CouplingOrders::YB2YT4),
552  thresholdCalculator.getThresholdCorrection(
554  RenSchemes::DRBARPRIME, omitMSSMLogs));
555 
556  const double dvytau2 = CALC_IF(orders.at(CouplingOrders::YTAU2YB4) ||
558  thresholdCalculator.getThresholdCorrection(
560  RenSchemes::DRBARPRIME, omitMSSMLogs));
561 
562  const double dvyb2 = CALC_IF(orders.at(CouplingOrders::YB6) ||
565  thresholdCalculator.getThresholdCorrection(
567  RenSchemes::DRBARPRIME, omitMSSMLogs));
568 
569  const double dytauyb = CALC_IF(orders.at(CouplingOrders::YTAU4YB2),
570  thresholdCalculator.getThresholdCorrection(
572  RenSchemes::DRBARPRIME, omitMSSMLogs));
573 
574  const double dlambdayb4ytau2 =
576  thresholdCalculator.getThresholdCorrection(
578  RenSchemes::DRBARPRIME, omitMSSMLogs));
579 
580  const double dlambdayb2ytau4 =
582  thresholdCalculator.getThresholdCorrection(
584  RenSchemes::DRBARPRIME, omitMSSMLogs));
585 
586  const double dybyt = CALC_IF(orders.at(CouplingOrders::YT2YB4),
587  thresholdCalculator.getThresholdCorrection(
589  RenSchemes::DRBARPRIME, omitMSSMLogs));
590 
591  const double dybas = CALC_IF(orders.at(CouplingOrders::G32YB4),
592  thresholdCalculator.getThresholdCorrection(
594  RenSchemes::DRBARPRIME, omitMSSMLogs));
595 
596  const double dybyb = CALC_IF(orders.at(CouplingOrders::YB6),
597  thresholdCalculator.getThresholdCorrection(
599  RenSchemes::DRBARPRIME, omitMSSMLogs));
600 
601  // Corrections to Mh
602  const double dmh2yt4g32 = discardNaN(
604  (pref * (96 * pow2(lmMt) + (-32 + 48 * dytas) * lmMt - 24 * dytas +
605  thresholdCalculator.getThresholdCorrection(
607  RenSchemes::DRBARPRIME, omitMSSMLogs))),
608  "dmh2yt4g32");
609 
610  const double dmh2yb4g32 = discardNaN(
612  ((dlambdayb4g32 + 16 * (3 * B00DR * (dybas + 16 * lmMt) +
613  lmMt * (-2 + 3 * dybas + 24 * lmMt))) *
614  v2 * pow4(cbeta)) /
615  2.,
616  "dmh2yb4g32");
617 
618  const double dmh2yb6 = discardNaN(
620  (-((-144 * dybyb * (B00DR + lmMt) +
621  pow2(cbeta) *
622  (-49 - 3 * dlambdayb6 + 72 * dvyb2 - 72 * B00DR * dvyb2 -
623  60 * lmbMt + 234 * lmMt + 1296 * B00DR * lmMt -
624  72 * dvyb2 * lmMt +
625  dlambdayb4 * (-9 + 9 * B00DR - 6 * dvyb2 + 9 * lmMt) +
626  36 * pow2(lmbMt) + 648 * pow2(lmMt) - 6 * pow2(Pi))) *
627  v2 * pow4(cbeta)) /
628  6.),
629  "dmh2yb6");
630 
631  const double dmh2yt6 = discardNaN(
633  ((v2 *
634  (4 * dytyt * (-6 + dlambdayt4 + 12 * lmMt) +
635  (-12 + dlambdayt6 + dlambdayt4 * (2 + 2 * dvyt2 - 3 * lmMt) +
636  24 * dvyt2 * (-1 + lmMt) - 18 * lmMt * (1 + 3 * lmMt) -
637  2 * pow2(Pi)) *
638  pow2(sbeta)) *
639  pow4(sbeta)) /
640  2.),
641  "dmh2yt6");
642 
643  const double dmh2yb4ytau2 = discardNaN(
645  (((dlambdayb4ytau2 - 96 * B00DR * lmMt -
646  dlambdayb4 * (-1 + B00DR + lmMt) +
647  2 * dvytau2 * (-12 + 12 * B00DR + dlambdayb4 + 12 * lmMt) -
648  48 * pow2(lmMt)) *
649  v2 * pow6(cbeta)) /
650  2.),
651  "dmh2yb4ytau2");
652 
653  const double dmh2yb2ytau4 = discardNaN(
655  (((4 * dytauyb * (4 * B00DR + dlambdaytau4 + 4 * lmMt) +
656  pow2(cbeta) *
657  (dlambdayb2ytau4 - 8 * dvyb2 + 8 * B00DR * dvyb2 +
658  dlambdaytau4 * (3 - 3 * B00DR + 2 * dvyb2 - 3 * lmMt) -
659  6 * lmMt - 24 * B00DR * lmMt + 8 * dvyb2 * lmMt -
660  12 * pow2(lmMt))) *
661  v2 * pow4(cbeta)) /
662  2.),
663  "dmh2yb2ytau4");
664 
665  const double dmh2ytau6 = discardNaN(
667  (-((-12 * dytauytau * (4 * B00DR + dlambdaytau4 + 4 * lmMt) +
668  pow2(cbeta) *
669  (-3 * dlambdaytau6 +
670  3 * dlambdaytau4 * (-1 + B00DR - 2 * dvytau2 + lmMt) +
671  2 * (6 + 30 * (1 + B00DR) * lmMt -
672  12 * dvytau2 * (-1 + B00DR + lmMt) + 15 * pow2(lmMt) +
673  pow2(Pi)))) *
674  v2 * pow4(cbeta)) /
675  6.),
676  "dmh2ytau6");
677 
678  const double dmh2yt2yb4 = discardNaN(
680  (((48 * dybyt * lmMt +
681  (dlambdayt2yb4 + dlambdayb4 * (2 + 2 * dvyt2 - 3 * lmMt) +
682  3 * (-15 + 8 * lmbMt + 8 * dvyt2 * (-1 + lmMt) + 18 * lmMt -
683  24 * pow2(lmMt) - 2 * pow2(Pi))) *
684  pow2(sbeta) +
685  12 * B00DR * (4 * dybyt + (2 * dvyt2 - 9 * lmMt) * pow2(sbeta))) *
686  v2 * pow4(cbeta)) /
687  2.),
688  "dmh2yt2yb4");
689 
690  const double dmh2yt4yb2 = discardNaN(
692  (((4 * dytyb * (-6 + dlambdayt4 + 12 * lmMt) +
693  pow2(cbeta) *
694  (dlambdayt4yb2 +
695  dlambdayt4 * (3 - 3 * B00DR + 2 * dvyb2 - 3 * lmMt) -
696  6 * (4 * dvyb2 + lmMt + 6 * B00DR * lmMt - 4 * dvyb2 * lmMt +
697  3 * pow2(lmMt) - pow2(Pi)))) *
698  v2 * pow4(sbeta)) /
699  2.),
700  "dmh2yt4yb2");
701 
702  return twoLoop * (g32 * yb4 * dmh2yb4g32 + yb6 * dmh2yb6 + yt6 * dmh2yt6 + yb4 * ytau2
703  * dmh2yb4ytau2 + yb2 * ytau4 * dmh2yb2ytau4 + ytau6 * dmh2ytau6 + yt2 * yb4
704  * dmh2yt2yb4 + yt4 * yb2 * dmh2yt4yb2) + dmh2yt4g32;
705 }
706 
707 /**
708  * Returns the 3-loop EFT contribution to the light CP-even Higgs mass.
709  *
710  * @param omitSMLogs an integer flag to remove all Log(mu^2/mt^2) terms
711  * @param omitMSSMLogs an integer flag to remove all Log(mu^2/Mx^2) terms
712  * @param omitDeltaLambda3L an integer flag to disable the MSSM contribution to delta_lambda_3L
713  * @return 3-loop contribution to the light CP-even Higgs mass
714  */
716  int omitSMLogs, int omitMSSMLogs, int omitDeltaLambda3L) const
717 {
718  ThresholdCalculator thresholdCalculator(p);
719 
720  const double catas2 = 248.1215180432007;
721  const double lmMt = omitSMLogs * std::log(pow2(p.scale / p.Mt));
722  // threshold correction of yt_as DRbar'
723  const double dytas = thresholdCalculator.getThresholdCorrection(
725  // threshold correction of yt_as2 DRbar'
726  const double dytas2 = thresholdCalculator.getThresholdCorrection(
728  // threshold correction of g3_as DRbar'
729  const double dg3as = thresholdCalculator.getThresholdCorrection(
731 
732  const double gt = sqrt2 * p.Mt / std::sqrt(calcV2());
733 
734  // 3-Loop prefactor at*as^2
735  const double pref = threeLoop * pow2(p.Mt * gt * pow2(p.g3));
736 
737  return pref * (736 * pow3(lmMt) + (160 + 192 * dg3as + 384 * dytas) * pow2(lmMt)
738  + (-128 * z3 - 2056 / 3. + -64 * dg3as - 512 * dytas + 72 * pow2(dytas)
739  + 48 * dytas2) * lmMt + 64 * dytas - 84 * pow2(dytas) - 24 * dytas2
740  + catas2
741  + omitDeltaLambda3L * thresholdCalculator.getThresholdCorrection(
743  RenSchemes::DRBARPRIME, omitMSSMLogs));
744 }
745 
746 /**
747  * Returns the matching relation of delta_Lambda 3L for the degenerate
748  * mass case.
749  *
750  * @param scale the renormalization scale
751  * @param mst1 the mass of the light stop quark
752  * @param Xt stop mixing parameter
753  * @param omitlogs factor which multiplies the logs
754  * @return delta_Lambda 3L
755  */
757  double scale, double mst1, double Xt, int omitlogs) const
758 {
759  const double LS = omitlogs * std::log(pow2(scale / p.MSt(0)))
760  + std::log(pow2(p.MSt(0) / mst1));
761 
762  // to obtain delta_lambda one has to divide the difference of the two calculations by v^2
763  const double v2 = calcV2();
764 
765  const double gt = sqrt2 * p.Mt / calcV();
766 
767  // 3-Loop prefactor
768  const double pref = threeLoop * pow2(p.Mt * gt * pow2(p.g3));
769 
770  const double xt = Xt / mst1;
771  const double catas2 = 248.1215180432007;
772 
773  const double deltaLambda3L = 2 / 27.*pref * (6082 - 27832 * LS + 14856 * pow2(LS)
774  - 4032 * pow3(LS) - 15408 * z3 + 1728 * z3 * LS - 27 * catas2 / 2.
775  + xt * (7616 * LS - 11712 * pow2(LS) + 32 * (-940 + 477 * z3))
776  + pow2(xt) * (28848 - 2640 * LS + 1008 * pow2(LS) - 11880 * z3)
777  + pow3(xt) * (160 * LS + 864 * pow2(LS) + 8 * (2722 - 2259 * z3))) / v2;
778 
779  return deltaLambda3L;
780 }
781 
783 {
784  return std::atan(calcTanBeta());
785 }
786 
788 {
789  return p.vu / p.vd;
790 }
791 
793 {
794  return std::sqrt(calcV2());
795 }
796 
798 {
799  return pow2(p.vu) + pow2(p.vd);
800 }
801 
803 {
804  return p.vu / calcV();
805 }
806 
808 {
809  return p.vd / calcV();
810 }
811 
812 /**
813  * Calculates the loop corrections in the approximation v^2 << MS^2
814  * and prints the result.
815  *
816  * @param ostr output stream
817  * @param mhc Mh2EFTCalculator object
818  *
819  * @return output stream
820  */
821 std::ostream& operator<<(std::ostream& ostr, const Mh2EFTCalculator& mhc)
822 {
823  ostr << "=========================\n"
824  << "Himalaya Mh2EFTCalculator\n"
825  << "=========================\n"
826  << mhc.p;
827 
828  const auto dmh2_0l = mhc.getDeltaMh2EFT0Loop();
829  const auto dmh2_1l = mhc.getDeltaMh2EFT1Loop(1, 1);
830  const auto dmh2_2l = mhc.getDeltaMh2EFT2Loop(1, 1);
831 
832  ostr << "Mh^2_EFT_0L = " << dmh2_0l << " GeV^2 O(g1^2, g2^2)\n";
833  ostr << "ΔMh^2_EFT_1L = " << dmh2_1l << " GeV^2 O(full)\n";
834  ostr << "ΔMh^2_EFT_2L = " << dmh2_2l << " GeV^2 O((αt+αb)*αs + (αt+αb)^2 + αb*ατ + ατ^2)\n";
835 
836  return ostr;
837 }
838 
839 } // namespace mh2_eft
840 } // namespace himalaya
double calcBeta() const
calculate beta
double vu
VEV of up Higgs, with v = Sqrt[vu^2 + vd^2] ~ 246 GeV.
void setCorrectionFlag(CouplingOrders::CouplingOrders order, int flag)
Definition of threshold corrections class to express the Higgs mass calculation in terms of SM MS-bar...
double getDeltaMh2EFT3Loop(int omitSMLogs, int omitMSSMLogs, int omitDeltaLambda3L=1) const
double getThresholdCorrection(ThresholdCouplingOrders couplingOrder, RenSchemes scheme, int omitLogs) const
Definition: H3.cpp:14
void validate(bool verbose)
validates the parameter set
double b0xx(double p2, double m2, double q2) noexcept
B0(s,x,x,q2) Passarino-Veltman function.
Definition: PV.cpp:91
double vd
VEV of down Higgs, with v = Sqrt[vu^2 + vd^2] ~ 246 GeV.
double g2
gauge coupling g2
Mh2EFTCalculator(const Parameters &p_, bool verbose=true)
CouplingOrders
Coupling orders for calculation.
#define WARNING_MSG(message)
Definition: Logger.hpp:66
Declaration of real Passarino-Veltman loop functions with squared arguments.
double calcCosBeta() const
calculate cos(beta)
Implementation of logging macros.
double calcSinBeta() const
calculate sin(beta)
enum definitions
#define CALC_IF(cond, expr)
double Mtau
tau lepton
double getDeltaLambdaDegenerate(double scale, double mst1, double Xt, int omitlogs) const
Parameters p
The HimalayaInterface struct.
double scale
renormalization scale
double calcTanBeta() const
calculate tan(beta)
truncate the two loop expansion at the three loop expansion depth
double getDeltaMh2EFT2Loop(int omitSMLogs, int omitMSSMLogs) const
double calcV() const
calculate v
double g3
gauge coupling g3 SU(3)
double g1
GUT-normalized gauge coupling g1, with gY = g1*Sqrt[3/5].
Definition of EFT Higgs mass calculation class.
Complex< T > log(const Complex< T > &z_) noexcept
Definition: complex.hpp:45
#define ERROR_MSG(message)
Definition: Logger.hpp:67
friend std::ostream & operator<<(std::ostream &, const Mh2EFTCalculator &)
prints loop corrections for v^2 << MS^2
double getDeltaMh2EFT1Loop(int omitSMLogs, int omitMSSMLogs) const
std::array< int, CouplingOrders::NUMBER_OF_COUPLING_ORDERS > orders
holds all CouplingOrders to enable/disable certain corrections
double calcV2() const
calculate v^2