Skip to content
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Commit 30d1a04

Browse files
committedMar 10, 2025·
DOC #14 geometry tables
1 parent 8e7e2eb commit 30d1a04

File tree

5 files changed

+668
-3
lines changed

5 files changed

+668
-3
lines changed
 

‎Makefile

+3
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,9 @@ docs ::
1515

1616
doc :: docs
1717

18+
geo_tables:
19+
python ./docs/make_geometries_doc.py
20+
1821
isort:
1922
isort --sl ./hklpy2
2023

‎docs/make_geometries_doc.py

+137
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,137 @@
1+
"""
2+
(Re)create the `geometries.rst` document.
3+
"""
4+
5+
import datetime
6+
import pathlib
7+
from collections import defaultdict
8+
9+
from pyRestTable import Table
10+
11+
import hklpy2
12+
13+
DOCS_DIR = pathlib.Path(__file__).parent / "source"
14+
GEO_DOC = DOCS_DIR / "geometry_tables.rst"
15+
H1, H2, H3, H4 = "= - ^ ~".split()
16+
17+
PREFACE = """
18+
Tables are provided for the different geometries (sorted by number of real axes)
19+
and then, for each geometry, the calculation engines, modes of operation, pseudo
20+
axes required, and any additional parameters required by the
21+
:meth:`~hklpy2.backends.base.SolverBase.mode`. The mode defines which axes will
22+
be computed, which will be held constant, and any relationships between axes.
23+
"""
24+
25+
26+
def title(text: str, underchar: str = H1, both: bool = False) -> str:
27+
bars = underchar * len(text)
28+
result = f"{text}\n{bars}\n"
29+
if both:
30+
result = f"{bars}\n{result}"
31+
return result
32+
33+
34+
def page_header():
35+
text = [
36+
f".. author: {__file__.split('/')[-1]}",
37+
f".. date: {datetime.datetime.now()}",
38+
"",
39+
".. _geometries:",
40+
"",
41+
title("Diffractometer Geometries", underchar=H1, both=True),
42+
".. index:: geometries",
43+
"",
44+
]
45+
return "\n".join(text)
46+
47+
48+
def rst_anchor(sname: str, gname: str) -> str:
49+
safe_gname = gname.replace(" ", "_")
50+
return f"geometries.{sname}.{safe_gname}"
51+
52+
53+
def table_of_reals():
54+
# Count the reals.
55+
circles = defaultdict(list)
56+
for sname in sorted(hklpy2.solvers()):
57+
Solver = hklpy2.get_solver(sname)
58+
geometries = Solver.geometries()
59+
if len(geometries) == 0:
60+
continue
61+
for gname in sorted(Solver.geometries()):
62+
solver = Solver(gname)
63+
n = len(solver.real_axis_names)
64+
anchor = f":ref:`{sname}, {gname} <{rst_anchor(sname, gname)}>`"
65+
circles[n].append(anchor)
66+
67+
# Build the table, sorted by number of reals.
68+
table = Table()
69+
table.labels = ["#reals", "solver, geometry"]
70+
for n, anchors in sorted(circles.items()):
71+
for anchor in anchors:
72+
table.addRow((n, anchor))
73+
74+
# Build the report.
75+
text = [
76+
".. _geometries.number_of_reals:",
77+
"",
78+
title("Geometries, by number of real axes", H1),
79+
".. index:: geometries; by number of reals",
80+
"",
81+
"The different diffractometer geometries are distinguished,",
82+
"primarily, by the number of real axes. This",
83+
"table is sorted first by the number of real axes, then by",
84+
"solver and geometry names.",
85+
"",
86+
str(table),
87+
]
88+
return "\n".join(text)
89+
90+
91+
def geometry_summary_table(solver_name, geometry_name: str) -> str:
92+
text = [
93+
f".. _{rst_anchor(solver_name, geometry_name)}:",
94+
"",
95+
title(f"solver={solver_name!r}, geometry={geometry_name!r}", H2),
96+
f".. index:: geometries; {solver_name}; {geometry_name}",
97+
"",
98+
str(hklpy2.get_solver(solver_name)(geometry=geometry_name).summary),
99+
]
100+
return "\n".join(text)
101+
102+
103+
def all_summary_tables():
104+
text = [
105+
".. _geometries.summary_tables:",
106+
"",
107+
title("Available Solver Geometry Tables", H1),
108+
".. index:: geometries; tables",
109+
"",
110+
".. seealso:: :func:`hklpy2.user.solver_summary()`",
111+
"",
112+
]
113+
114+
for sname in sorted(hklpy2.solvers()):
115+
Solver = hklpy2.get_solver(sname)
116+
geometries = Solver.geometries()
117+
if len(geometries) == 0:
118+
continue
119+
for gname in sorted(Solver.geometries()):
120+
text.append(geometry_summary_table(sname, gname))
121+
122+
return "\n".join(text)
123+
124+
125+
def main():
126+
text = [
127+
page_header(),
128+
PREFACE,
129+
table_of_reals(),
130+
all_summary_tables(),
131+
]
132+
with open(GEO_DOC, "w") as f:
133+
f.write("\n".join(text))
134+
135+
136+
if __name__ == "__main__":
137+
main()

‎docs/source/concepts.rst

+17-3
Original file line numberDiff line numberDiff line change
@@ -47,13 +47,27 @@ from to solution(s) transformation
4747
*pseudos* *reals* 0, 1, or more :meth:`~hklpy2.diffract.DiffractometerBase.forward()`
4848
========== ========= ============== ================
4949

50-
A |solver| provides support for one or more diffractometer geometries. Each
51-
geometry has a specific set of *pseudos*, *reals*, and other terms which support
52-
the ``forward()`` and ``inverse()`` transformations. See
50+
.. rubric:: Solvers
51+
52+
A |solver| provides computational support for one or more diffractometer
53+
geometries. Each geometry has a specific set of *pseudos*, *reals*, and other
54+
terms which support the ``forward()`` and ``inverse()`` transformations. See
5355
:ref:`concepts.solvers` for more details.
5456

57+
.. rubric:: Core Operations
58+
59+
The :class:`~hklpy2.diffract.DiffractometerBase` class provides the ophyd
60+
*PseudoPositioner*. This class relies on :class:`~hklpy2.ops.Operations` to
61+
provide most features (sample, lattice, reflections, ...) and to connect with
62+
the diffractometer's chosen |solver|. See
63+
:ref:`concepts.ops` for more details.
64+
65+
----
66+
5567
.. seealso:: :ref:`glossary`
5668

69+
.. rubric:: Footnotes
70+
5771
.. [#] https://en.wikipedia.org/wiki/Diffractometer
5872
.. [#] https://blueskyproject.io/ophyd/user/how-to/pseudopositioner.html
5973
.. [#] *monochromatic*: The range of wavelengths in the source is negligible

‎docs/source/geometry_tables.rst

+510
Large diffs are not rendered by default.

‎docs/source/user_guide.rst

+1
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ User Guide
1212

1313
quickstart
1414
concepts
15+
geometry_tables
1516
examples
1617
install
1718
glossary

0 commit comments

Comments
 (0)
Please sign in to comment.