Hyperiso 1.0.3
Modular flavour-physics calculations, Wilson coefficients and statistical inference
Loading...
Searching...
No Matches
ObservableInterface.py
Go to the documentation of this file.
1"""Python wrapper for the observable computation interface.
2
3This module exposes a Pythonic facade over the C++ ``ObservableInterface``.
4It lets users select observables, compute theory predictions, inspect
5experimental inputs, manage observable dependencies, and update parameters
6used by the observable layer.
7
8The public API accepts and returns Python wrapper objects only. Conversion to
9and from the pybind11 objects is intentionally kept inside this module.
10
11Example:
12 >>> from pyhyperiso.core.BusinessLogic.ObservableInterface import ObservableInterface
13 >>> from pyhyperiso.core.Common.GeneralEnum import Observables, QCDOrder
14 >>> oi = ObservableInterface()
15 >>> oi.add_observable(Observables.BR_BS_MUMU, QCDOrder.NNLO, add_dependencies=True)
16 >>> values = oi.compute_observable(Observables.BR_BS_MUMU)
17 >>> central = oi.compute_observable_central(Observables.BR_BS_MUMU)
18"""
19
20from __future__ import annotations
21
22from typing import Dict, List, Mapping, Sequence, Set, Tuple
23
24from pyhyperiso.phyperiso.pyhyperiso.observable import (
25 ObservableInterface as _CppObservableInterface,
26)
27from pyhyperiso.core.BusinessLogic.ObservableValue import ObservableValue
28from pyhyperiso.core.Common.BinnedObservableId import BinnedObservableId
30 Decays,
31 Observables,
32 ParameterType,
33 QCDOrder,
34 UncertaintyType,
35)
36from pyhyperiso.core.Common.LhaID import LhaID
37from pyhyperiso.core.Common.ParamId import ParamId
38from pyhyperiso.core.Common.SymbolId import ObservableId
40from pyhyperiso.core.BusinessLogic.LambdaDecay import LambdaDecayConfig
41
42
43def _require(value, typ, name: str):
44 if not isinstance(value, typ):
45 raise TypeError(f"{name} must be {typ.__name__}, received {type(value)!r}.")
46 return value
47
48
49def _cpp_observable_enum(obs: Observables):
50 return _require(obs, Observables, "obs").value
51
52
53def _cpp_observable_id(obs: ObservableId):
54 return _require(obs, ObservableId, "obs")._to_cpp()
55
56
57def _cpp_binned_observable_id(obs: BinnedObservableId):
58 return _require(obs, BinnedObservableId, "obs").to_cpp()
59
60
61def _cpp_bin(bin_range: Sequence[float]) -> Tuple[float, float]:
62 if not (isinstance(bin_range, (tuple, list)) and len(bin_range) == 2):
63 raise TypeError("bin must be un tuple/list (q2_min, q2_max).")
64 q2_min = float(bin_range[0])
65 q2_max = float(bin_range[1])
66 if q2_min >= q2_max:
67 raise ValueError("bin must satisfy q2_min < q2_max.")
68 return (q2_min, q2_max)
69
70
71def _cpp_qcd_order(order: QCDOrder):
72 return _require(order, QCDOrder, "qcd_order").value
73
74
75def _cpp_decay(decay: Decays):
76 return _require(decay, Decays, "decay").value
77
78
79def _cpp_uncertainty_type(u_type: UncertaintyType):
80 return _require(u_type, UncertaintyType, "u_type").value
81
82
83def _cpp_param_id(pid: ParamId):
84 return _require(pid, ParamId, "pid").to_cpp()
85
86
87def _param_from_cpp(cpp_obj) -> ParamId:
88 return ParamId.from_cpp(cpp_obj)
89
90
91def _single_lha_code(code: LhaID) -> int:
92 _require(code, LhaID, "pid.code")
93 parts = code.get_parts()
94 if len(parts) != 1:
95 raise ValueError(
96 "set_param/get_param via ObservableInterface requires a single-entry LhaID."
97 )
98 return int(parts[0])
99
100
102 """High-level API used to configure and compute observables.
103
104 ``ObservableInterface`` mirrors the C++ class of the same name. It owns an
105 underlying C++ observable manager and exposes a chainable Python API for
106 common workflows:
107
108 * register observables by enum, by internal ``ObservableId`` or by binned id;
109 * compute one observable or all registered observables;
110 * inspect experimental central values and uncertainties;
111 * add explicit parameter dependencies for likelihood/statistical workflows;
112 * set or read model parameters through the global parameter store.
113
114 Notes:
115 ``add_dependencies=True`` asks the C++ observable manager to attach the
116 full dependency allow-list known for the selected observable. This is
117 important for subsequent statistical workflows, because those
118 dependencies are used to decide which nuisance parameters should be
119 propagated or profiled.
120
121 The QCD order is passed to the C++ decay computation. Depending on the
122 backend and observable, the actual Wilson-coefficient order may be
123 limited by backend capabilities.
124
125 Example:
126 >>> oi = ObservableInterface()
127 >>> oi.add_observable(Observables.BR_BS_MUMU, QCDOrder.NNLO, True)
128 >>> oi.get_current_observables()
129 [...]
130 >>> oi.compute_observable_central(Observables.BR_BS_MUMU)
131 3.6e-09
132 """
133
134 def __init__(self) -> None:
135 """Create a new observable interface backed by a fresh C++ manager."""
136 self._cpp_obj = _CppObservableInterface()
137
139 self, config: LambdaDecayConfig, add_observables: bool = True
140 ) -> "ObservableInterface":
141 """Register a lambda-backed custom decay and its observables.
142
143 Args:
144 config: Runtime decay configuration containing custom observables and
145 optionally custom Wilson groups.
146 add_observables: If ``True``, select every observable declared in
147 ``config`` immediately.
148
149 Returns:
150 ``self`` for fluent chaining.
151 """
152 if isinstance(config, LambdaDecayConfig):
153 config = config.to_cpp()
154 self._cpp_obj.add_lambda_decay(config, bool(add_observables))
155 return self
156
157 @classmethod
158 def from_cpp(cls, cpp_obj) -> "ObservableInterface":
159 """Wrap an existing C++ ``ObservableInterface`` instance.
160
161 Args:
162 cpp_obj: Bound C++ object produced by pybind11.
163
164 Returns:
165 A Python ``ObservableInterface`` sharing ownership of ``cpp_obj``.
166 """
167 inst = cls.__new__(cls)
168 inst._cpp_obj = cpp_obj
169 return inst
170
171 def _to_cpp(self):
172 """Return the underlying pybind11 object.
173
174 Returns:
175 The wrapped C++ ``ObservableInterface`` object.
176 """
177 return self._cpp_obj
178
180 self,
181 obs: Observables,
182 qcd_order: QCDOrder,
183 add_dependencies: bool = True,
184 ) -> "ObservableInterface":
185 """Register an observable using the public observable enum.
186
187 Args:
188 obs: Observable enum value to register.
189 qcd_order: Maximum QCD order requested for the corresponding decay.
190 add_dependencies: Whether to also attach the C++ dependency
191 allow-list for the observable.
192
193 Returns:
194 ``self`` to support fluent chaining.
195 """
197 _cpp_observable_enum(obs), _cpp_qcd_order(qcd_order), bool(add_dependencies)
198 )
199 return self
200
202 self,
203 obs: ObservableId,
204 qcd_order: QCDOrder,
205 add_dependencies: bool = True,
206 ) -> "ObservableInterface":
207 """Register an observable using an internal ``ObservableId``.
208
209 Args:
210 obs: Internal observable identifier.
211 qcd_order: Maximum QCD order requested for the corresponding decay.
212 add_dependencies: Whether to also attach known parameter
213 dependencies for this observable.
214
215 Returns:
216 ``self`` to support fluent chaining.
217 """
219 _cpp_observable_id(obs), _cpp_qcd_order(qcd_order), bool(add_dependencies)
220 )
221 return self
222
224 self,
225 obs: BinnedObservableId,
226 qcd_order: QCDOrder,
227 add_dependencies: bool = True,
228 ) -> "ObservableInterface":
229 """Register a single binned observable.
230
231 Args:
232 obs: Binned observable identifier, including the observable id and
233 bin range.
234 qcd_order: Maximum QCD order requested for the corresponding decay.
235 add_dependencies: Whether to also attach known parameter
236 dependencies for this observable.
237
238 Returns:
239 ``self`` to support fluent chaining.
240 """
242 _cpp_binned_observable_id(obs), _cpp_qcd_order(qcd_order), bool(add_dependencies)
243 )
244 return self
245
247 self,
248 obs_names: Mapping[Observables, QCDOrder],
249 add_dependencies: bool = True,
250 ) -> "ObservableInterface":
251 """Register several enum-based observables at once.
252
253 Args:
254 obs_names: Mapping from observable enum values to requested QCD
255 orders.
256 add_dependencies: Whether to attach dependencies for every
257 observable in the mapping.
258
259 Returns:
260 ``self`` to support fluent chaining.
261
262 Example:
263 >>> oi.add_observables({
264 ... Observables.BR_BS_MUMU: QCDOrder.NNLO,
265 ... Observables.BR_BD_MUMU: QCDOrder.NNLO,
266 ... }, add_dependencies=True)
267 """
268 cpp_map = {_cpp_observable_enum(k): _cpp_qcd_order(v) for k, v in obs_names.items()}
269 self._cpp_obj.add_observables(cpp_map, bool(add_dependencies))
270 return self
271
273 self,
274 obs_names: Mapping[ObservableId, QCDOrder],
275 add_dependencies: bool = True,
276 ) -> "ObservableInterface":
277 """Register several id-based observables at once.
278
279 Args:
280 obs_names: Mapping from internal observable ids to requested QCD
281 orders.
282 add_dependencies: Whether to attach dependencies for every
283 observable in the mapping.
284
285 Returns:
286 ``self`` to support fluent chaining.
287 """
288 cpp_map = {_cpp_observable_id(k): _cpp_qcd_order(v) for k, v in obs_names.items()}
289 self._cpp_obj.add_observables(cpp_map, bool(add_dependencies))
290 return self
291
293 self,
294 decay: Decays,
295 qcd_order: QCDOrder,
296 add_dependencies: bool = True,
297 bin: Tuple[float, float] = (1.0, 6.0),
298 ) -> "ObservableInterface":
299 """Register every observable attached to a decay channel.
300
301 Args:
302 decay: Decay family whose observables should be registered.
303 qcd_order: Maximum QCD order requested for all observables in the
304 decay family.
305 add_dependencies: Whether to attach dependencies for the selected
306 observables.
307 bin: q² interval used only for observables that require bins. Mixed
308 decays such as ``B -> K* ll`` keep their non-binned observables
309 unbinned.
310
311 Returns:
312 ``self`` to support fluent chaining.
313 """
315 _cpp_decay(decay),
316 _cpp_qcd_order(qcd_order),
317 bool(add_dependencies),
318 _cpp_bin(bin),
319 )
320 return self
321
322 def is_decay_binned(self, decay: Decays) -> bool:
323 """Return whether a decay has at least one q²-binned observable.
324
325 Args:
326 decay: Decay family to inspect.
327
328 Returns:
329 ``True`` if at least one observable in the decay requires a q² bin.
330 """
331 return bool(self._cpp_obj.is_decay_binned(_cpp_decay(decay)))
332
333 def is_observable_binned(self, obs: Observables) -> bool:
334 """Return whether an enum observable requires a q² bin.
335
336 Args:
337 obs: Observable enum value to inspect.
338
339 Returns:
340 ``True`` if the observable must be added/computed as binned.
341 """
343
344 def is_observable_id_binned(self, obs: ObservableId) -> bool:
345 """Return whether an internal observable id requires a q² bin."""
346 return bool(self._cpp_obj.is_observable_binned(_cpp_observable_id(obs)))
347
348 def add_observable_parameter(self, obs: Observables, pid: ParamId) -> "ObservableInterface":
349 """Add one explicit parameter dependency to an enum observable.
350
351 Args:
352 obs: Observable enum value.
353 pid: Parameter identifier to mark as a dependency.
354
355 Returns:
356 ``self`` to support fluent chaining.
357 """
359 return self
360
361 def add_observable_id_parameter(self, obs: ObservableId, pid: ParamId) -> "ObservableInterface":
362 """Add one explicit parameter dependency to an id-based observable.
363
364 Args:
365 obs: Internal observable identifier.
366 pid: Parameter identifier to mark as a dependency.
367
368 Returns:
369 ``self`` to support fluent chaining.
370 """
372 return self
373
375 self, obs: Observables, pids: Set[ParamId]
376 ) -> "ObservableInterface":
377 """Add several dependencies to an enum observable.
378
379 Args:
380 obs: Observable enum value.
381 pids: Set of parameter identifiers to attach.
382
383 Returns:
384 ``self`` to support fluent chaining.
385 """
387 _cpp_observable_enum(obs), {_cpp_param_id(p) for p in pids}
388 )
389 return self
390
392 self, obs: ObservableId, pids: Set[ParamId]
393 ) -> "ObservableInterface":
394 """Add several dependencies to an id-based observable.
395
396 Args:
397 obs: Internal observable identifier.
398 pids: Set of parameter identifiers to attach.
399
400 Returns:
401 ``self`` to support fluent chaining.
402 """
404 _cpp_observable_id(obs), {_cpp_param_id(p) for p in pids}
405 )
406 return self
407
408 def remove_observable(self, obs: Observables) -> "ObservableInterface":
409 """Remove one enum observable from the current selection.
410
411 Args:
412 obs: Observable enum value to remove.
413
414 Returns:
415 ``self`` to support fluent chaining.
416 """
418 return self
419
420 def remove_observable_id(self, obs: ObservableId) -> "ObservableInterface":
421 """Remove one id-based observable from the current selection.
422
423 Args:
424 obs: Internal observable identifier to remove.
425
426 Returns:
427 ``self`` to support fluent chaining.
428 """
430 return self
431
432 def remove_observables(self, ids: Set[Observables]) -> "ObservableInterface":
433 """Remove several enum observables from the current selection.
434
435 Args:
436 ids: Set of observable enum values to remove.
437
438 Returns:
439 ``self`` to support fluent chaining.
440 """
441 self._cpp_obj.remove_observables({_cpp_observable_enum(x) for x in ids})
442 return self
443
444 def remove_observables_from_decay(self, decay: Decays) -> "ObservableInterface":
445 """Remove every selected observable associated with a decay family.
446
447 Args:
448 decay: Decay family whose observables should be removed.
449
450 Returns:
451 ``self`` to support fluent chaining.
452 """
454 return self
455
456 def compute_observable(self, obs: Observables) -> List[ObservableValue]:
457 """Compute the theory prediction for one enum observable.
458
459 Args:
460 obs: Observable enum value to compute.
461
462 Returns:
463 List of observable values. Unbinned observables usually return a
464 single entry. Binned observables return one entry per bin.
465 """
466 return [
467 ObservableValue.from_cpp(v)
469 ]
470
471 def compute_observable_id(self, obs: ObservableId) -> List[ObservableValue]:
472 """Compute the theory prediction for one id-based observable.
473
474 Args:
475 obs: Internal observable identifier to compute.
476
477 Returns:
478 List of observable values. Binned observables can contain multiple
479 entries with non-null ``ObservableValue.bin``.
480 """
481 return [
482 ObservableValue.from_cpp(v)
484 ]
485
486 def compute_binned_observable(self, obs: BinnedObservableId) -> ObservableValue:
487 """Compute one observable at one explicit q² bin.
488
489 Args:
490 obs: Binned observable identifier.
491
492 Returns:
493 The C++ ``ObservableValue`` for the requested bin.
494 """
495 return ObservableValue.from_cpp(
497 )
498
499 def compute_observable_central(self, obs: Observables) -> float:
500 """Compute a scalar central value for an unbinned enum observable.
501
502 Args:
503 obs: Observable enum value to compute.
504
505 Returns:
506 The single predicted value.
507
508 Raises:
509 RuntimeError: If the C++ layer returns no value or more than one
510 value, which indicates that the observable is binned and should
511 be read with :meth:`compute_observable`.
512 """
513 vals = self.compute_observable(obs)
514 if not vals:
515 raise RuntimeError("compute_observable returned an empty list.")
516 if len(vals) != 1:
517 raise RuntimeError("Binned observable: use compute_observable() to retrieve all bins.")
518 return vals[0].value
519
520 def compute_observable_id_central(self, obs: ObservableId) -> float:
521 """Compute a scalar central value for an unbinned id-based observable.
522
523 Args:
524 obs: Internal observable identifier to compute.
525
526 Returns:
527 The single predicted value.
528
529 Raises:
530 RuntimeError: If the C++ layer returns no value or more than one
531 value, which indicates that the observable is binned and should
532 be read with :meth:`compute_observable_id`.
533 """
534 vals = self.compute_observable_id(obs)
535 if not vals:
536 raise RuntimeError("compute_observable_id returned an empty list.")
537 if len(vals) != 1:
538 raise RuntimeError(
539 "Binned observable: use compute_observable_id() to retrieve all bins."
540 )
541 return vals[0].value
542
543 def compute_all(self) -> Dict[ObservableId, List[ObservableValue]]:
544 """Compute all currently registered observables.
545
546 Returns:
547 Mapping from observable id to a list of predicted values. Each list
548 may contain several bins.
549 """
550 cpp_map = self._cpp_obj.compute_all()
551 return {
552 ObservableId(str(cpp_id)): [ObservableValue.from_cpp(v) for v in values]
553 for cpp_id, values in cpp_map.items()
554 }
555
556 def get_exp_value(self, obs: Observables) -> float:
557 """Return the experimental central value for an enum observable.
558
559 Args:
560 obs: Observable enum value.
561
562 Returns:
563 Experimental central value stored in the C++ observable database.
564 """
565 return float(self._cpp_obj.get_exp_value(_cpp_observable_enum(obs)))
566
567 def get_exp_value_id(self, obs: ObservableId) -> float:
568 """Return the experimental central value for an id-based observable.
569
570 Args:
571 obs: Internal observable identifier.
572
573 Returns:
574 Experimental central value stored in the C++ observable database.
575 """
576 return float(self._cpp_obj.get_exp_value(_cpp_observable_id(obs)))
577
578 def get_exp_value_binned(self, obs: BinnedObservableId) -> float:
579 """Return the experimental central value for one binned observable."""
580 return float(self._cpp_obj.get_exp_value(_cpp_binned_observable_id(obs)))
581
583 self,
584 obs: Observables,
585 u_type: UncertaintyType = UncertaintyType.COMBINED,
586 ) -> float:
587 """Return an experimental uncertainty for an enum observable.
588
589 Args:
590 obs: Observable enum value.
591 u_type: Type of uncertainty to retrieve. The default is the combined
592 uncertainty.
593
594 Returns:
595 Requested experimental uncertainty.
596 """
597 return float(
600 )
601 )
602
604 self,
605 obs: ObservableId,
606 u_type: UncertaintyType = UncertaintyType.COMBINED,
607 ) -> float:
608 """Return an experimental uncertainty for an id-based observable.
609
610 Args:
611 obs: Internal observable identifier.
612 u_type: Type of uncertainty to retrieve. The default is the combined
613 uncertainty.
614
615 Returns:
616 Requested experimental uncertainty.
617 """
618 return float(
621 )
622 )
623
625 self,
626 obs: BinnedObservableId,
627 u_type: UncertaintyType = UncertaintyType.COMBINED,
628 ) -> float:
629 """Return an experimental uncertainty for one binned observable."""
630 return float(
633 )
634 )
635
636 def get_current_observables(self) -> List[BinnedObservableId]:
637 """Return the currently registered observable/bin identifiers.
638
639 Returns:
640 List of ``BinnedObservableId`` objects currently selected in the
641 C++ observable manager.
642 """
643 return [BinnedObservableId.from_cpp(x) for x in self._cpp_obj.get_current_observables()]
644
645 def get_all_ops_deps(self, obs: Observables) -> Set[ParamId]:
646 """Return all known parameter dependencies for an enum observable.
647
648 Args:
649 obs: Observable enum value.
650
651 Returns:
652 Set of parameter identifiers allowed as dependencies for this
653 observable.
654 """
655 return {
657 }
658
659 def get_all_ops_deps_id(self, obs: ObservableId) -> Set[ParamId]:
660 """Return all known parameter dependencies for an id-based observable.
661
662 Args:
663 obs: Internal observable identifier.
664
665 Returns:
666 Set of parameter identifiers allowed as dependencies for this
667 observable.
668 """
669 return {_param_from_cpp(x) for x in self._cpp_obj.get_all_ops_deps(_cpp_observable_id(obs))}
670
671 def set_decay_config(self, decay: Decays, config: DecayConfig) -> "ObservableInterface":
672 """Set the concrete configuration object used by one decay engine.
673
674 Args:
675 decay: Decay family to configure.
676 config: Python decay-configuration wrapper. The concrete wrapper class
677 must match the selected decay engine, for example ``BKllConfig`` for
678 ``Decays.B__K_l_l`` or ``BKstarllConfig`` for
679 ``Decays.B__Kstar_l_l``.
680
681 Returns:
682 ``self`` to support fluent chaining.
683 """
684 if not isinstance(config, DecayConfig):
685 raise TypeError(f"config must inherit DecayConfig, got {type(config).__name__}.")
686 self._cpp_obj.set_decay_config(_cpp_decay(decay), config.to_cpp())
687 return self
688
689 def set_param(self, pid: ParamId, value: float) -> None:
690 """Set one model parameter in the C++ parameter store.
691
692 Args:
693 pid: Parameter identifier. ``pid.type`` must be defined and
694 ``pid.code`` must contain exactly one LHA code entry.
695 value: New parameter value.
696
697 Raises:
698 ValueError: If ``pid.type`` is missing or if the LHA code is not a
699 single integer code.
700 TypeError: If ``pid`` or ``pid.type`` has an invalid Python type.
701
702 Notes:
703 After mutating parameters, call :meth:`reload_params` and possibly
704 :meth:`enable_obs` if the selected decays cache input parameters.
705 """
706 _require(pid, ParamId, "pid")
707 if pid.type is None:
708 raise ValueError("pid.type must be defined for set_param().")
709 _require(pid.type, ParameterType, "pid.type")
710 self._cpp_obj.set_param(
711 str(pid.block), _single_lha_code(pid.code), float(value), pid.type.value
712 )
713
714 def get_param(self, pid: ParamId):
715 """Read one model parameter from the C++ parameter store.
716
717 Args:
718 pid: Parameter identifier. ``pid.type`` must be defined and
719 ``pid.code`` must contain exactly one LHA code entry.
720
721 Returns:
722 Parameter value returned by the C++ parameter provider.
723
724 Raises:
725 ValueError: If ``pid.type`` is missing or if the LHA code is not a
726 single integer code.
727 TypeError: If ``pid`` or ``pid.type`` has an invalid Python type.
728 """
729 _require(pid, ParamId, "pid")
730 if pid.type is None:
731 raise ValueError("pid.type must be defined before calling get_param().")
732 _require(pid.type, ParameterType, "pid.type")
733 return self._cpp_obj.get_param(str(pid.block), _single_lha_code(pid.code), pid.type.value)
734
735 def reload_params(self) -> None:
736 """Reload cached parameters for every registered decay.
737
738 This forwards to the C++ manager and is typically used after calling
739 :meth:`set_param`.
740 """
742
743 def enable_obs(self) -> None:
744 """Force the C++ manager to enable/re-enable selected observables.
745
746 This can rebuild or refresh the internal observable state after a larger
747 configuration change.
748 """
749 self._cpp_obj.enable_obs()
750
751 def set_decay_threads(self, decay: Decays, n_threads: int) -> None:
752 """Configure the number of threads used by a decay that supports it.
753
754 Args:
755 decay: Decay family whose decay engine should receive the thread setting.
756 n_threads: Number of worker threads requested by the C++ decay
757 implementation. ``0`` delegates to hardware concurrency for
758 supported decays.
759 """
760 self._cpp_obj.set_decay_threads(_cpp_decay(decay), int(n_threads))
761
762 def set_bkstarll_threads(self, n_threads: int) -> None:
763 """Configure the number of threads used by the ``B -> K* ll`` decay.
764
765 Args:
766 n_threads: Number of worker threads requested by the C++ decay
767 implementation.
768 """
769 self._cpp_obj.set_bkstarll_threads(int(n_threads))
770
771 def set_bkll_threads(self, n_threads: int) -> None:
772 """Configure the number of threads used by the ``B -> K ll`` decay.
773
774 Args:
775 n_threads: Number of worker threads requested by the C++ decay
776 implementation.
777 """
778 self._cpp_obj.set_bkll_threads(int(n_threads))
779
780 def set_bsphi_threads(self, n_threads: int) -> None:
781 """Configure the number of threads used by the ``Bs -> phi ll`` decay.
782
783 Args:
784 n_threads: Number of worker threads requested by the C++ decay
785 implementation.
786 """
787 self._cpp_obj.set_bsphi_threads(int(n_threads))
788
789 def set_lblll_threads(self, n_threads: int) -> None:
790 """Configure the number of threads used by the ``Lambda_b -> Lambda ll`` decay.
791
792 Args:
793 n_threads: Number of worker threads requested by the C++ decay
794 implementation.
795 """
796 self._cpp_obj.set_lblll_threads(int(n_threads))
797
798
799__all__ = ["ObservableInterface"]
"ObservableInterface" add_lambda_decay(self, LambdaDecayConfig config, bool add_observables=True)
"ObservableInterface" add_observables_from_decay(self, Decays decay, QCDOrder qcd_order, bool add_dependencies=True, Tuple[float, float] bin=(1.0, 6.0))
"ObservableInterface" add_observable_id_parameters(self, ObservableId obs, Set[ParamId] pids)
"ObservableInterface" add_observable_id(self, ObservableId obs, QCDOrder qcd_order, bool add_dependencies=True)
float get_exp_uncertainty(self, Observables obs, UncertaintyType u_type=UncertaintyType.COMBINED)
"ObservableInterface" add_observable_parameters(self, Observables obs, Set[ParamId] pids)
"ObservableInterface" add_observable_id_parameter(self, ObservableId obs, ParamId pid)
"ObservableInterface" add_binned_observable(self, BinnedObservableId obs, QCDOrder qcd_order, bool add_dependencies=True)
"ObservableInterface" add_observable_ids(self, Mapping[ObservableId, QCDOrder] obs_names, bool add_dependencies=True)
"ObservableInterface" remove_observables(self, Set[Observables] ids)
"ObservableInterface" add_observables(self, Mapping[Observables, QCDOrder] obs_names, bool add_dependencies=True)
"ObservableInterface" add_observable_parameter(self, Observables obs, ParamId pid)
ObservableValue compute_binned_observable(self, BinnedObservableId obs)
float get_exp_uncertainty_id(self, ObservableId obs, UncertaintyType u_type=UncertaintyType.COMBINED)
"ObservableInterface" add_observable(self, Observables obs, QCDOrder qcd_order, bool add_dependencies=True)
"ObservableInterface" set_decay_config(self, Decays decay, DecayConfig config)
float get_exp_uncertainty_binned(self, BinnedObservableId obs, UncertaintyType u_type=UncertaintyType.COMBINED)
List[ObservableValue] compute_observable_id(self, ObservableId obs)
Tuple[float, float] _cpp_bin(Sequence[float] bin_range)