Hyperiso 1.0.3
Modular flavour-physics calculations, Wilson coefficients and statistical inference
Loading...
Searching...
No Matches
ObservableInterface.cpp
Go to the documentation of this file.
2
5 std::shared_ptr<WilsonBuilder> builder_ptr = std::make_shared<WilsonBuilder>(config);
6 std::shared_ptr<IObsWilsonBuilder> builder = std::make_shared<ObsWilsonBuilder>(builder_ptr);
7 std::shared_ptr<ObsWilsonHelper> wilson_helper = std::make_shared<ObsWilsonHelper>();
8
9
10 std::shared_ptr<IObsParameterProxy<ParamId, DataType, std::string, LhaID>> iobspp_sm = std::make_shared<ObsParameterProxy>();
11
12 std::shared_ptr<IObsParameterProxy<ParamId, DataType, std::string, LhaID>> iobspp_flav = std::make_shared<ObsParameterProxy>(ParameterType::FLAVOR);
13 std::shared_ptr<IObsQCDProxy> iobs_qcdp = std::make_shared<ObsQCDProxy>();
14
15
16 std::shared_ptr<IObsCoreAPI<bool>> iobs_use_marty = std::make_shared<ObsUseMarty>();
17
18 std::shared_ptr<IWilsonFreezer<WGroupId>> iobs_wfreezer = std::make_shared<WilsonFreezer>(builder);
19
20 ports = std::make_shared<ObservablePortsConfig>(builder, iobspp_sm, iobspp_flav, iobs_qcdp, iobs_use_marty, iobs_wfreezer, wilson_helper);
21
22 manager = std::make_shared<ObsManager>(*ports);
23}
24
25void ObservableInterface::add_custom_decay(DecayId id, std::shared_ptr<DecayParent> ptr) {
26 manager->add_custom_decay(id, ptr);
27}
28
30 if (config.observables.empty()) {
31 LOG_ERROR("ValueError", "Cannot register lambda decay", config.canonical, "without observables.");
32 }
33
34 std::vector<CustomObservableSpec> specs;
35 specs.reserve(config.observables.size());
36 for (const auto& obs : config.observables) {
37 specs.push_back(CustomObservableSpec{obs.canonical, obs.aliases, obs.flha});
38 }
39
41 config.canonical,
42 config.aliases,
43 std::move(specs)
44 );
45
46 if (!registered) {
48 "Lambda decay",
49 config.canonical,
50 "was not newly registered. Reusing an existing mapper entry if it exists."
51 );
52 }
53
54 for (const auto& custom_group : config.custom_wilson_groups) {
55 this->ports->iobswb->add_custom_group(custom_group);
56 this->ports->iobs_whelper->mark_built(
57 custom_group.group,
58 custom_group.matching_scale,
59 custom_group.hadronic_scale,
60 custom_group.order
61 );
62 }
63
64 DecayId decay_id = DecayMapper::id_of(config.canonical);
65 auto decay = std::make_shared<LambdaDecay>(decay_id, config, *this->ports);
66 this->manager->add_custom_decay(decay_id, decay);
67
68 if (add_observables) {
69 for (const auto& obs : config.observables) {
70 ObservableId obs_id = ObservableMapper::id_of(obs.canonical);
71 this->manager->add_obs(obs_id, config.order, false);
72 if (!obs.dependencies.empty()) {
73 this->manager->add_obs_deps(obs_id, obs.dependencies);
74 }
75 }
76 }
77
78 return *this;
79}
80
81
83 this->ports->iobswb->add_matching_patch(patch);
84 return *this;
85}
86
90
92 manager->add_obs(obs, order, add_dependencies);
93 return *this;
94}
95
97 manager->add_obs(obs, order, add_dependencies);
98 return *this;
99}
100
102 QCDOrder order,
103 bool add_dependencies)
104{
105 manager->add_obs(obs, order, add_dependencies);
106 return *this;
107}
108
109void ObservableInterface::add_observables(std::map<Observables, QCDOrder> obss,
110 bool add_dependencies)
111{
112 for (auto &[k, v] : obss) {
113 add_observable(k, v, add_dependencies);
114 }
115}
116
117void ObservableInterface::add_observables(std::map<ObservableId, QCDOrder> obss, bool add_dependencies) {
118 for (auto &[k, v] : obss) {
119
120 add_observable(k, v, add_dependencies);
121 }
122}
123
125 QCDOrder order,
126 bool add_dependencies,
127 std::pair<double, double> bin)
128{
129 for (auto &obs : DecayMapper::get_observables(decay)) {
130 if (manager->is_observable_binned(obs)) {
131 add_observable(BinnedObservableId(obs, bin), order, add_dependencies);
132 } else {
133 add_observable(obs, order, add_dependencies);
134 }
135 }
136}
137
139 QCDOrder order,
140 bool add_dependencies,
141 std::pair<double, double> bin)
142{
143 for (auto &obs : DecayMapper::get_observables(decay)) {
144 if (manager->is_observable_binned(obs)) {
145 add_observable(BinnedObservableId(obs, bin), order, add_dependencies);
146 } else {
147 add_observable(obs, order, add_dependencies);
148 }
149 }
150}
151
153 return manager->is_decay_binned(decay);
154}
155
157 return manager->is_decay_binned(decay);
158}
159
161 return manager->is_observable_binned(obs);
162}
163
165 return manager->is_observable_binned(obs);
166}
167
169 manager->add_obs_dep(obs, pid);
170}
171
173 manager->add_obs_dep(obs, pid);
174}
175
176void ObservableInterface::add_observable_parameters(Observables obs, std::unordered_set<ParamId> pids) {
177 manager->add_obs_deps(obs, pids);
178}
179
180void ObservableInterface::add_observable_parameters(ObservableId obs, std::unordered_set<ParamId> pids) {
181 manager->add_obs_deps(obs, pids);
182}
183
184std::vector<ObservableValue> ObservableInterface::compute_observable(Observables obs) const {
185 return manager->evaluate(obs);
186}
187
188std::vector<ObservableValue> ObservableInterface::compute_observable(ObservableId obs) const {
189 return manager->evaluate(obs);
190}
191
193 return manager->evaluate(obs);
194}
195
197 manager->remove_obs(id);
198}
199
201 manager->remove_obs(id);
202}
203
204void ObservableInterface::remove_observables(std::unordered_set<Observables> ids) {
205 for (Observables id : ids) {
207 }
208};
209
210
216
218 return manager->get_obs(id)->get_exp_val({0,0}, "DEFAULT");
219};
220
222 return manager->get_obs(id)->get_exp_val({0,0}, "DEFAULT");
223};
224
226 return manager->get_obs(id.s)->get_exp_val(id.p, "DEFAULT");
227};
228
230 return manager->get_obs(id.obs.s)->get_exp_val(id.obs.p, id.experiment);
231};
232
234 return manager->get_obs(id)->get_exp_uncertainty({0,0}, "DEFAULT", u_type);
235}
236
238 return manager->get_obs(id)->get_exp_uncertainty({0,0}, "DEFAULT", u_type);
239}
240
242 return manager->get_obs(id.s)->get_exp_uncertainty(id.p, "DEFAULT", u_type);
243}
244
246 return manager->get_obs(id.obs.s)->get_exp_uncertainty(id.obs.p, id.experiment, u_type);
247}
248
249std::vector<BinnedObservableId> ObservableInterface::get_current_observables() {
250 return manager->get_current_obss();
251}
252
253std::shared_ptr<ObservableInterface> ObservableInterface::clone_for_worker() const {
254 auto worker = std::make_shared<ObservableInterface>();
255 auto selection = manager->snapshot_observable_selection();
256
257 for (const auto& item : selection) {
258 if (item.binned) {
259 worker->add_observable(item.id, item.order, false);
260 } else {
261 worker->add_observable(item.id.s, item.order, false);
262 }
263
264 if (!item.dependencies.empty()) {
265 worker->add_observable_parameters(item.id.s, item.dependencies);
266 }
267 }
268
269 return worker;
270}
271
273 return manager->snapshot_decay_threads();
274}
275
277 manager->set_all_decay_threads(n_threads);
278}
279
281 manager->restore_decay_threads(snapshot);
282}
283
284std::map<ObservableId, std::vector<ObservableValue>> ObservableInterface::compute_all() {
285 return manager->evaluate_all();
286}
287
288
289void ObservableInterface::set_param(const std::string& block, LhaID code, double value, ParameterType type) {
290 Parameters::GetInstance(type)->setBlockValue(block, code, value);
291}
292
293double ObservableInterface::get_param(const std::string& block, LhaID code, ParameterType type) {
294 return Parameters::GetInstance(type)->operator()(block, code);
295}
296
298 return manager->get_all_ops_deps(id);
299}
300
301std::unordered_set<ParamId> ObservableInterface::get_all_ops_deps(Observables id) {
302 return manager->get_all_ops_deps(ObservableMapper::to_id(id));
303}
304
306 manager->reload_params();
307}
308
310 manager->enable_obs();
311}
313 manager->set_decay_config(dec, config);
314}
315
316ObservablePortsConfig& ObservableInterface::get_ports() {return this->manager->get_ports();}
317
318void ObservableInterface::set_decay_threads(Decays dec, size_t n_threads) {this->manager->set_decay_threads(dec, n_threads);}
319
320void ObservableInterface::set_bkstarll_threads(size_t n_threads) {this->manager->set_bkstarll_threads(n_threads);}
321
322void ObservableInterface::set_bkll_threads(size_t n_threads) {this->manager->set_bkll_threads(n_threads);}
323
324void ObservableInterface::set_bsphi_threads(size_t n_threads) {this->manager->set_bsphi_threads(n_threads);}
325
326void ObservableInterface::set_lblll_threads(size_t n_threads) {this->manager->set_lblll_threads(n_threads);}
Observables
Definition GeneralEnum.h:4
QCDOrder
ParameterType
Decays
UncertaintyType
#define LOG_ERROR(type,...)
Macro for logging error messages and terminating the application.
Definition Logger.h:41
#define LOG_WARN(...)
Macro for logging warning messages.
Definition Logger.h:40
std::unordered_map< DecayId, size_t > DecayThreadSnapshot
Definition ObsManager.h:79
High-level, user-facing entry point to compute flavor observables.
static bool register_custom_with_observables(std::string canonical, std::vector< std::string > aliases, std::vector< CustomObservableSpec > observables)
Register a custom decay and its custom observables in one call.
static std::vector< Observables > get_observables(Decays d)
Legacy static lookup of builtin observables for a builtin decay.
static IdOf< ObservableTag > to_id(Observables e)
Converts an enum value to an IdOf<Tag>.
static IdOf< DecayTag > id_of(std::string_view s)
Resolves a string into an IdOf<Tag> via the registry.
void add_observables(std::map< Observables, QCDOrder > obss, bool add_dependencies=false)
Add multiple observables at once (enum map).
std::vector< BinnedObservableId > get_current_observables()
Return the set of currently registered observables.
void set_bkstarll_threads(size_t n_threads)
Set the thread option for the bkstarll decay.
ObservableInterface()
Construct a ready-to-use observable interface.
bool is_observable_binned(Observables obs) const
Return whether a specific observable requires q² bins.
void add_observable_parameter(Observables obs, ParamId pid)
Manually add a single parameter dependence to an observable (enum API).
void set_all_decay_threads(size_t n_threads)
Set every thread-configurable decay to the same value.
std::shared_ptr< ObservableInterface > clone_for_worker() const
Build a fresh ObservableInterface with the same selected builtin observables.
void set_bkll_threads(size_t n_threads)
Set the thread option for the bkll decay.
double get_param(const std::string &block, LhaID code, ParameterType type)
Read an input parameter in a given parameter space.
DecayThreadSnapshot snapshot_decay_threads() const
Snapshot thread settings for thread-configurable decays.
void set_param(const std::string &block, LhaID code, double value, ParameterType type)
Set an input parameter in a given parameter space.
scalar_t get_exp_uncertainty(Observables id, UncertaintyType u_type=UncertaintyType::COMBINED)
Get experimental uncertainty for an observable (enum API).
void remove_observable(Observables id)
Remove an observable from the manager (enum API).
void set_decay_config(Decays dec, std::any config)
Set configuration for a given decay.
void set_decay_threads(Decays dec, size_t n_threads)
Set the thread option for any decay that supports it.
void add_custom_decay(DecayId id, std::shared_ptr< DecayParent > ptr)
Register a custom decay implementation.
std::vector< ObservableValue > compute_observable(Observables obs) const
Compute a theory prediction for an observable (enum API).
void enable_obs()
Force enabling/re-enabling currently registered observables.
void restore_decay_threads(const DecayThreadSnapshot &snapshot)
Restore a previous decay-thread snapshot.
std::map< ObservableId, std::vector< ObservableValue > > compute_all()
Compute all currently registered observables.
ObservablePortsConfig & get_ports()
Access the underlying ports configuration (advanced use).
ObservableInterface & add_observable(Observables obs, QCDOrder order, bool add_dependencies=false)
Add an observable to the manager (enum API).
ObservableInterface & addMatchingPatch(const WilsonMatchingPatch &patch)
Camel-case alias for add_matching_patch.
ObservableInterface & add_lambda_decay(LambdaDecayConfig config, bool add_observables=true)
Register a complete custom decay backed by user lambdas.
void add_observable_parameters(Observables obs, std::unordered_set< ParamId > pids)
Manually add multiple parameter dependences to an observable (enum API).
void set_bsphi_threads(size_t n_threads)
Set the thread option for the bsphi decay.
ObservableInterface & add_matching_patch(const WilsonMatchingPatch &patch)
Add an additive Wilson matching patch through the observable layer.
bool is_decay_binned(Decays decay) const
Return whether this decay has at least one observable requiring q² bins.
std::unordered_set< ParamId > get_all_ops_deps(ObservableId id)
Retrieve the full allow-list of parameter dependences for an observable (id API).
void set_lblll_threads(size_t n_threads)
Set the thread option for the Lambda_b -> Lambda l+ l- decay.
void reload_params()
Reload cached parameters for all registered decays.
scalar_t get_exp_value(Observables id)
Get experimental central value for an observable (enum API).
void remove_observables(std::unordered_set< Observables > ids)
Remove several observables (enum set).
static std::shared_ptr< Parameters > GetInstance(ParameterType id=ParameterType::SM)
Returns the singleton-like repository for a given parameter type.
Identifies an observable together with a numerical bin.
Small value object used to register a custom decay with observables.
Definition decay_ids.hpp:62
std::string canonical
Canonical observable name.
Definition decay_ids.hpp:63
Full runtime definition of a custom decay and its observables.
std::vector< CustomWilsonGroupConfig > custom_wilson_groups
Custom Wilson groups to install before this decay is evaluated.
std::vector< LambdaObservableConfig > observables
Custom observables owned by this decay. Must not be empty.
QCDOrder order
Requested QCD order for the decay.
std::vector< std::string > aliases
Optional alternative decay names accepted by DecayMapper::id_of().
std::string canonical
Canonical decay name, for example "MY_DECAY".
Represents an identifier of a LHA element, possibly containing several sub-ids.
Definition LhaID.h:56
Dependency container (“ports”) for observable computations.
Container for a computed observable value, optionally binned.
Composite identifier for a single parameter.
Definition ParamID.h:57
Configuration for building sets of Wilson coefficients.
Definition Configs.h:32