Hyperiso 1.0.3
Modular flavour-physics calculations, Wilson coefficients and statistical inference
Loading...
Searching...
No Matches
BKstarGammaDecay.cpp
Go to the documentation of this file.
1#include "BKstarGammaDecay.h"
2
4
7 cache.m_b_m_b = (*p)(ParamId{ParameterType::SM, "SMINPUTS", 5}, DataType::VALUE);
8 cache.mu_h = sqrt(cache.m_b_m_b * (*p)(ParamId{ParameterType::DECAY, "B_Ks", 14}, DataType::VALUE));
10
11 cache.alpha_em = (*p)(ParamId{ParameterType::SM, "EW", {1, 2}}, DataType::VALUE);
12 // LOG_INFO("BKstargamma alpha_em =", cache.alpha_em);
13
14 cache.lambda_hat_u = std::conj((*p)(ParamId{ParameterType::SM, "VCKM", {0, 1}}, DataType::VALUE)) * (*p)(ParamId{ParameterType::SM, "VCKM", {0, 2}}, DataType::VALUE)
15 / (std::conj((*p)(ParamId{ParameterType::SM, "VCKM", {1, 1}}, DataType::VALUE)) * (*p)(ParamId{ParameterType::SM, "VCKM", {1, 2}}, DataType::VALUE));
16 cache.m_b_mu_b = (*iobs_qcdp)(MassConfig(5, cache.mu_b, MassType::MSBAR, MassType::POLE));
17 cache.z = std::pow((*iobs_qcdp)(MassConfig(4, cache.mu_b, MassType::MSBAR, MassType::POLE)) / cache.m_b_mu_b, 2);
18 // cache.z = 9.9551e-02; // ASK : Discrepancy between Isospin Asymmetry and BR. Need to homogeneize with QCDfCalculator
19 cache.f_Ks_par = (*p)(ParamId{ParameterType::FLAVOR, "FCONST", {323, 1}}, DataType::VALUE);
20 cache.f_B = (*p)(ParamId{ParameterType::FLAVOR, "FCONST", {521, 1}}, DataType::VALUE);
21 cache.alpha_s_mu_b = (*iobs_qcdp)(AlphasConfig(cache.mu_b, MassType::POLE, MassType::POLE));
22 cache.alpha_s_mu_h = (*iobs_qcdp)(AlphasConfig(cache.mu_h, MassType::POLE, MassType::POLE));
23 cache.lambda_B = (*p)(ParamId{ParameterType::DECAY, "B_Ks", 13}, DataType::VALUE) / (1. - cache.alpha_s_mu_h * log(pow(cache.mu_h, 2)) * 1.8 / (3. * PI));
24 // cache.T1_B_Ks = (*p)(ParamId{ParameterType::DECAY, "B_Ks", 16}); // ASK : Make it coherent with the FF choice ?
25 cache.mu_0 = (*p)(ParamId{ParameterType::DECAY, "B_Ks", 17}, DataType::VALUE);
26 if (fpeq(cache.mu_0, -1.)) cache.mu_0 = cache.mu_b;
27 cache.L_b = log(cache.mu_b / (*p)(ParamId{ParameterType::SM, "QCD", {5, 3}}, DataType::VALUE));
28 cache.C_F = (*iobs_qcdp).get_constants()->C_F;
29 cache.Nc = (*iobs_qcdp).get_constants()->Nc;
30 cache.n_f = 5.0;
31 double eta = cache.alpha_s_mu_h / (*iobs_qcdp)(AlphasConfig(1.0, MassType::POLE, MassType::POLE)); // ASK : In SI, eta = alpha(mu_b) / alpha(1), why not mu_h ?
32 cache.f_Ks_perp = (*p)(ParamId{ParameterType::FLAVOR, "FCONST", {323, 2}}, DataType::VALUE) * pow(eta, cache.C_F / (*iobs_qcdp).get_constants()->beta[4][0]);
33
34 load_cfg_dependent_params();
35}
36
37std::vector<ObservableValue> BKstarGammaDecay::compute_observable(Observables obs) {
38 double value;
39 switch (obs) {
42 value = BR();
43 break;
46 value = delta_0();
47 break;
50 value = BR();
51 break;
54 value = delta_0();
55 break;
56 default:
57 LOG_ERROR("IndexError", "Observable", ObservableMapper::str(obs), "doesn't belong to the decay", DecayMapper::str(this->id));
58 }
59
60 return {ObservableValue(ObservableMapper::to_id(obs), value)};
61}
62
63std::vector<ObservableValue> BKstarGammaDecay::compute_observable(ObservableId obs) {
65}
66
68 cache.C.clear();
69 cache.C_trad.clear();
70 this->w_proxy->set_basis(WilsonBasis::B_STANDARD);
71
72 auto b_wilsons = w_proxy->getAFR(WGroup::B, this->w_config.order);
73 auto bp_wilsons = w_proxy->getAFR(WGroup::BPrime, this->w_config.order);
74
75 WCoef bp_cached[1] {WCoef::CP7};
76
77 for (const auto& [id, val] : b_wilsons) {
78 cache.C[id] = val;
79 }
80 for (auto id : bp_cached) {
81 cache.C[id] = bp_wilsons.at(id);
82 }
83
84
85 this->w_proxy->set_basis(WilsonBasis::B_TRADITIONAL);
86 auto b_wilsons_trad = w_proxy->getAFR(WGroup::B, this->w_config.order);
87 auto bp_wilsons_trad = w_proxy->getAFR(WGroup::BPrime, this->w_config.order);
88
89 for (const auto& [id, val] : b_wilsons_trad) {
90 cache.C_trad[id] = val;
91 }
92
93 cache.C_trad[WCoef::C7] += bp_wilsons_trad[WCoef::CP7];
94 cache.C_trad[WCoef::C8] += bp_wilsons_trad[WCoef::CP8];
95
97 cache.C2_h = w_proxy->getFR(WGroup::B, WCoef::C2, w_config.order);
99
100
102 this->w_proxy->set_basis(WilsonBasis::B_STANDARD);
103}
104
107 cfg.charge == Charge::B_0 ? 511 : 521,
108 cfg.charge == Charge::B_0 ? 313 : 323,
109 p,
110 cfg.ff_src
111 );
112
114 cfg.charge == Charge::B_0 ? 511 : 521,
115 cfg.charge == Charge::B_0 ? 313 : 323,
116 cache.mu_b,
117 cache.C,
118 std::make_shared<BVFFCalculator>(cache.ff_calculator),
120 p,
122 );
123
124 cache.tau_B = (*p)(ParamId{ParameterType::FLAVOR, "FLIFE", cfg.charge == Charge::B_0 ? 511 : 521}, DataType::VALUE) / HBAR;
125 cache.m_B = (*p)(ParamId{ParameterType::FLAVOR, "FMASS", cfg.charge == Charge::B_0 ? 511 : 521}, DataType::VALUE);
126 cache.m_Ks = (*p)(ParamId{ParameterType::FLAVOR, "FMASS", cfg.charge == Charge::B_0 ? 313 : 323}, DataType::VALUE);
127 cache.N_prime = -(*p)(ParamId{ParameterType::SM, "SMINPUTS", 2}, DataType::VALUE) * cache.m_B * std::conj((*p)(ParamId{ParameterType::SM, "VCKM", {2, 1}}, DataType::VALUE)) * (*p)(ParamId{ParameterType::SM, "VCKM", {2, 2}}, DataType::VALUE) * cache.alpha_em / (PI * RT2);
128
129}
130
132 if (cfg.charge != charge) {
133 cfg.charge = charge;
135 }
136}
137
138complex_t BKstarGammaDecay::H_V(double sign, bool bar) {
139 complex_t pref = 2. * I * cache.N_prime * cache.m_b_m_b * (std::pow(cache.m_B, 2) - std::pow(cache.m_Ks, 2)) / (cache.m_B * std::sqrt(4 * PI * cache.alpha_em));
140 if (bar) pref = -std::conj(pref);
141
142 double T1_0 = cache.ff_calculator.get(BV_FF::T1, 0.0);
143 complex_t T_perp_p = cache.qcdf_calculator.T_perp_p(0.0, bar);
144 complex_t T_perp_m = cache.qcdf_calculator.T_perp_m(0.0, bar);
145
146 complex_t C7 = -sign * (sign == 1 ? cache.C[WCoef::CP7] : cache.C[WCoef::C7]);
147
148 return pref * (C7 * T1_0 + (T_perp_m - sign * T_perp_p) / 2.0);
149}
150
152 double F_p = cache.qcdf_calculator.F_perp(0.0);
153
154 return -(cache.C_trad[WCoef::C6] + cache.C_trad[WCoef::C5] / cache.Nc) * F_p
155 + cache.C_F * cache.alpha_s_mu_b / (4 * cache.Nc * PI) * (
156 pow(cache.m_b_mu_b / cache.m_B, 2) * cache.C_trad[WCoef::C8] * cache.qcdf_calculator.X_perp(0.0)
157 - cache.C_trad[WCoef::C2] * ((-4 * cache.L_b + 2) * F_p / 3 - cache.qcdf_calculator.G_perp())
158 + F_p * log(cache.mu_b / cache.mu_0) * (
159 8. * cache.C_trad[WCoef::C3] / 3.
160 + 4 * cache.n_f * (cache.C_trad[WCoef::C4] + cache.C_trad[WCoef::C6]) / 3.
161 - 8. * (cache.Nc * cache.C_trad[WCoef::C6] + cache.C_trad[WCoef::C5]))
162 );
163}
164
166 complex_t k2 = cache.C_trad[WCoef::C4] + cache.C_trad[WCoef::C3] / cache.Nc
167 + cache.C_F * cache.alpha_s_mu_b / (4 * cache.Nc * PI) * (
168 cache.C_trad[WCoef::C2] * ((2 - 4 * cache.L_b) / 3. - cache.qcdf_calculator.H_perp())
169 + log(cache.mu_b / cache.mu_0) * (
170 -44. * cache.C_trad[WCoef::C3] / 3.
171 -4. * cache.n_f * (cache.C_trad[WCoef::C4] + cache.C_trad[WCoef::C6]) / 3.)
172 );
173 if (q == 2)
174 k2 += cache.lambda_hat_u * (cache.C_trad[WCoef::C2] + cache.C_trad[WCoef::C1] / cache.Nc);
175
176 return k2;
177}
178
180 double pref = (std::pow(cache.m_B, 2) - std::pow(cache.m_Ks, 2)) / 16. / PI / std::pow(cache.m_B, 3);
181 double gamma = pref * (std::pow(std::abs(H_V(1, false)), 2) + std::pow(std::abs(H_V(-1, false)), 2));
182 double gamma_bar = pref * (std::pow(std::abs(H_V(1, true)), 2) + std::pow(std::abs(H_V(-1, true)), 2));
183
184 return cache.tau_B * (gamma + gamma_bar) / 2;
185}
186
188 complex_t a7c = cache.C_trad[WCoef::C7] + cache.alpha_s_mu_b * cache.C_F * (cache.C_trad[WCoef::C2] * BV::G2(cache.z, cache.L_b) + cache.C_trad[WCoef::C8] * BV::G8(cache.L_b)) / (4. * PI)
189 + cache.alpha_s_mu_h * cache.C_F * (cache.C8_h * cache.qcdf_calculator.H_8() + cache.C2_h * cache.qcdf_calculator.H_2()) / (4 * PI);
190
191 double T1_iso = (*p)(ParamId{ParameterType::DECAY, "B_Ks", 16}, DataType::VALUE);
192
193 complex_t pref = 4. * PI2 * cache.f_B / (cache.m_b_mu_b * T1_iso * a7c);
194 complex_t t1 = cache.f_Ks_perp * K1() / cache.m_b_mu_b;
195 complex_t f2 = cache.f_Ks_par * cache.m_Ks / (6. * cache.lambda_B * cache.m_B);
196 complex_t bd = -pref * (t1 + f2 * K2(1));
197 complex_t bu = 2. * pref * (t1 + f2 * K2(2));
198
199 return std::real(bd - bu);
200}
Observables
Definition GeneralEnum.h:4
WCoef
#define LOG_ERROR(type,...)
Macro for logging error messages and terminating the application.
Definition Logger.h:41
std::complex< double > complex_t
Convenience alias for std::complex<double>.
Definition Utils.h:35
complex_t H_V(double sign, bool bar)
void set_cfg_flags(BKstarGammaConfig::B_Charge charge)
complex_t K2(int q)
void load_params() override
Load and cache parameters needed by this decay.
std::vector< ObservableValue > compute_observable(Observables obs) override
Compute an observable given a public observable enum.
double get(BV_FF a, double q2) override
double X_perp(double s_hat)
complex_t T_perp_m(double q2, bool bar)
double F_perp(double s_hat)
complex_t T_perp_p(double q2, bool bar)
Definition BWilson.h:99
DecayId id
Unique decay identifier.
WilsonBuildConfig w_config
Wilson build configuration used when enabling this decay (scales, order, groups).
std::shared_ptr< IObsParameterProxy< ParamId, DataType, std::string, LhaID > > p
Parameter proxy for SM-like quantities used by the decay (may be SM/BSM depending on wiring).
std::shared_ptr< IObsWilsonProxy > w_proxy
Wilson proxy used at compute-time to query coefficients (matching/run).
Definition DecayParent.h:99
std::shared_ptr< IObsQCDProxy > iobs_qcdp
QCD proxy (alpha_s, running masses, constants...).
static std::optional< Observables > enum_of(const IdOf< ObservableTag > &id)
Attempts to recover the enum value associated with an identifier.
static IdOf< ObservableTag > to_id(Observables e)
Converts an enum value to an IdOf<Tag>.
static std::string str(const IdOf< ObservableTag > &id)
Returns the string representation of an identifier.
void set(const ParamId &, scalar_t) override
Assigns an absolute value to a parameter.
constexpr double PI
Definition constants.h:7
constexpr double HBAR
Definition constants.h:23
constexpr std::complex< double > I
Definition constants.h:20
constexpr double PI2
Definition constants.h:8
constexpr double RT2
Definition constants.h:15
complex_t G2(double z, double L_b)
complex_t G8(double L_b)
scalar_t pow(const scalar_t &base, const scalar_t &exp)
Definition scalar.cpp:75
std::enable_if_t< not std::numeric_limits< T >::is_integer, bool > fpeq(T, T, std::size_t n=10)
Compares two floating point numbers with a given precision.
Configuration for evaluating the strong coupling constant .
Definition Configs.h:206
std::map< WCoef, complex_t > C
BVFFCalculator ff_calculator
BVQCDfCalculator qcdf_calculator
std::map< WCoef, complex_t > C_trad
Configuration for computing a particle mass at a given scale.
Definition Configs.h:242
Container for a computed observable value, optionally binned.
Composite identifier for a single parameter.
Definition ParamID.h:57
double hadronic_scale
Hadronic scale (in GeV) at which the Wilson coefficients are evaluated in the effective theory.
Definition Configs.h:48
QCDOrder order
Perturbative QCD order used for the evolution and matching of Wilson coefficients....
Definition Configs.h:54