Skip to content

Commit 5aa002e

Browse files
committed
DOC: hide sympified attributes from expression classes
1 parent ba92746 commit 5aa002e

File tree

3 files changed

+84
-14
lines changed

3 files changed

+84
-14
lines changed

docs/_extend_docstrings.py

Lines changed: 34 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -373,6 +373,36 @@ def extend_is_within_phasespace() -> None:
373373
)
374374

375375

376+
def extend_MultichannelBreitWigner() -> None:
377+
from ampform.dynamics import (
378+
ChannelArguments,
379+
MultichannelBreitWigner,
380+
SimpleBreitWigner,
381+
)
382+
383+
s, m0, w0 = sp.symbols("s m0 Gamma0", nonnegative=True)
384+
channels = [
385+
ChannelArguments(*sp.symbols("Gamma1 m_a1 m_b1 L1 d", nonnegative=True)),
386+
ChannelArguments(*sp.symbols("Gamma2 m_a2 m_b2 L2 d", nonnegative=True)),
387+
]
388+
expr = MultichannelBreitWigner(s, m0, channels=channels)
389+
_append_latex_doit_definition(expr)
390+
bw = SimpleBreitWigner(s, m0, w0)
391+
_append_to_docstring(
392+
MultichannelBreitWigner,
393+
Rf"""
394+
with :math:`{sp.latex(bw)}` defined by Equation :eq:`SimpleBreitWigner`, a
395+
`SimpleBreitWigner`.
396+
""",
397+
)
398+
_append_to_docstring(
399+
ChannelArguments.formulate_width,
400+
Rf"""
401+
.. math:: {sp.latex(channels[0].formulate_width(s, m0))}
402+
""",
403+
)
404+
405+
376406
def extend_PhaseSpaceFactor() -> None:
377407
from ampform.dynamics.phasespace import PhaseSpaceFactor
378408

@@ -743,8 +773,10 @@ def _create_latex_doit_definition(expr: sp.Expr, deep: bool = False) -> str:
743773

744774

745775
def _append_to_docstring(class_type: Callable | type, appended_text: str) -> None:
746-
assert class_type.__doc__ is not None
747-
class_type.__doc__ += appended_text
776+
if class_type.__doc__ is None:
777+
class_type.__doc__ = appended_text
778+
else:
779+
class_type.__doc__ += appended_text
748780

749781

750782
def __generate_transitions_cached(

docs/conf.py

Lines changed: 46 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
11
from __future__ import annotations
22

3+
import importlib
4+
import inspect
35
import os
46
import sys
7+
from dataclasses import is_dataclass
58

69
from sphinx_api_relink.helpers import (
710
get_branch_name,
@@ -12,9 +15,51 @@
1215
set_intersphinx_version_remapping,
1316
)
1417

18+
from ampform.sympy._decorator import get_sympy_fields # noqa: PLC2701
19+
1520
sys.path.insert(0, os.path.abspath("."))
1621
from _extend_docstrings import extend_docstrings # noqa: PLC2701
1722

23+
24+
def _get_excluded_members() -> list[str]:
25+
default_exclusions = {
26+
"as_explicit",
27+
"default_assumptions",
28+
"doit",
29+
"evaluate",
30+
"is_commutative",
31+
"is_extended_real",
32+
"items",
33+
"keys",
34+
"precedence",
35+
"values",
36+
}
37+
for cls in [
38+
*_get_dataclasses_recursive("ampform"),
39+
]:
40+
fields = get_sympy_fields(cls)
41+
arg_names = {f.name for f in fields}
42+
default_exclusions.update(arg_names)
43+
return sorted(default_exclusions)
44+
45+
46+
def _get_dataclasses_recursive(module_name: str) -> list[type]:
47+
module = importlib.import_module(module_name)
48+
dataclass_list = _get_dataclasses(module)
49+
for _, submodule in inspect.getmembers(module, inspect.ismodule):
50+
if submodule.__name__.startswith(module_name):
51+
dataclass_list.extend(_get_dataclasses_recursive(submodule.__name__))
52+
return dataclass_list
53+
54+
55+
def _get_dataclasses(module):
56+
dataclass_list = []
57+
for _, obj in inspect.getmembers(module):
58+
if inspect.isclass(obj) and is_dataclass(obj):
59+
dataclass_list.append(obj)
60+
return dataclass_list
61+
62+
1863
extend_docstrings()
1964
set_intersphinx_version_remapping({
2065
"ipython": {
@@ -85,18 +130,7 @@
85130
}
86131
author = "Common Partial Wave Analysis"
87132
autodoc_default_options = {
88-
"exclude-members": ", ".join([
89-
"as_explicit",
90-
"default_assumptions",
91-
"doit",
92-
"evaluate",
93-
"is_commutative",
94-
"is_extended_real",
95-
"items",
96-
"keys",
97-
"precedence",
98-
"values",
99-
]),
133+
"exclude-members": ", ".join(_get_excluded_members()),
100134
"members": True,
101135
"undoc-members": True,
102136
"show-inheritance": True,

src/ampform/dynamics/__init__.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,8 @@ def _latex_repr_(self, printer: LatexPrinter, *args) -> str:
135135

136136
@unevaluated
137137
class MultichannelBreitWigner(sp.Expr):
138+
"""`BreitWigner` for multiple channels."""
139+
138140
s: Any
139141
mass: Any
140142
channels: list[ChannelArguments] = argument(sympify=False)
@@ -155,6 +157,8 @@ def _latex_repr_(self, printer: LatexPrinter, *args) -> str:
155157

156158
@frozen
157159
class ChannelArguments:
160+
"""Arguments for a channel in a `MultichannelBreitWigner`."""
161+
158162
width: Any
159163
m1: Any = 0
160164
m2: Any = 0

0 commit comments

Comments
 (0)