pyextal.jaxJoint.link¶
Which structure factor is which, across datasets.
The engine names each refined structure factor by a representative it picks
from the dataset’s own beam list: under SpaceGroup the first member of the
symmetry group it meets (GroupSymmetry.uniqueBeams), under Friedel
whichever of g and -g comes first. Two datasets – another zone axis, or just a
different beam list – can therefore name the same U_g differently, and the
values under the two names are not equal: a glide or screw translation t makes
U(R g) = U(g) exp(-2 pi i t.g)
– a sign change for a phase of pi, which on La4Ni3O10 (P2_1/a) is a third of all equivalent pairs – and U(-g) = U(g)* for the Friedel mate.
So every U_g has a canonical key, the largest (h, k, l) of its whole orbit,
which no beam list influences; the shared parameter is U at the canonical key.
Each dataset’s own label r reaches it through a fixed link map M,
4 x 4 on (xfre, xfim, afre, afim): U_local = M @ U_shared – a rotation
by the translation phase, preceded by a conjugation when r lies in the orbit
of -g. M is orthogonal, so U_shared = M.T @ U_local.
check_links verifies every map against the engine’s own structure factors
(defaultsf) before anything is refined.
Attributes¶
Functions¶
|
Any triple (ints, floats, numpy scalars) -> a tuple of ints. |
|
|
|
|
|
|
|
Every reflection sharing g's refined structure factor. |
|
The canonical key of g's structure factor: the largest member of its orbit. |
|
|
|
The engine's |
|
Verifies each link map against the engine's structure factors. |
|
Every g = h_i - h_j of a beam list, (000) excluded: the U_g its matrix holds. |
|
Shortest index first, as the engine orders its reflections. |
Module Contents¶
- pyextal.jaxJoint.link.CONJ¶
- pyextal.jaxJoint.link.as_hkl(g)¶
Any triple (ints, floats, numpy scalars) -> a tuple of ints.
- pyextal.jaxJoint.link.neg(g)¶
- pyextal.jaxJoint.link.rotation(phi)¶
Mmultiplying U and U’ byexp(i phi).
- pyextal.jaxJoint.link._symmetry_members(g)¶
[(member, translation)]of g’s orbit under the engine’s operations.
- pyextal.jaxJoint.link.is_centro()¶
- pyextal.jaxJoint.link.orbit(g, symmetry, centro)¶
Every reflection sharing g’s refined structure factor.
- Parameters:
g (tuple) – A reflection.
symmetry (str) –
'Friedel'– g and -g only – or'SpaceGroup'– the orbit under the space group, with that of -g when the group is centrosymmetric (the engine keeps ops without the inversion and adds it itself, as GroupSymmetry does).centro (bool) – The group is centrosymmetric.
- Returns:
set[tuple]
- pyextal.jaxJoint.link.canonical(g, symmetry, centro)¶
The canonical key of g’s structure factor: the largest member of its orbit.
- pyextal.jaxJoint.link.link_map(local, key, symmetry, centro)¶
MwithU(local) = M @ U(key).- Parameters:
local (tuple) – The dataset’s label.
key (tuple) – The canonical key, in
local’s orbit.symmetry (str) –
'Friedel'or'SpaceGroup'.centro (bool) – The group is centrosymmetric.
- Returns:
(4, 4).
- Return type:
np.ndarray
- Raises:
SetupError – If
localis not inkey’s orbit.
- pyextal.jaxJoint.link.tabulated(g)¶
The engine’s
(xfre, xfim, afre, afim)for g, from the crystal structure.
- pyextal.jaxJoint.link.check_links(links, rtol=0.001, floor=1e-07)¶
Verifies each link map against the engine’s structure factors.
For every
(local, key, M),M @ U(key)must equalU(local)asdefaultsfcomputes them from the atom positions. This catches a wrong sign convention, which would otherwise quietly refine a sum of U_g that should be a difference.- Parameters:
links (list) –
(local, key, M)triples; the engine must hold the dataset they belong to.rtol (float) – Tolerance, relative to the larger of the two values.
floor (float) – Pairs where both are below this are not tested (the sign of a zero cannot be checked).
- Raises:
SetupError – Naming the pairs that disagree.
- pyextal.jaxJoint.link.beam_differences(hkl)¶
Every g = h_i - h_j of a beam list, (000) excluded: the U_g its matrix holds.
- pyextal.jaxJoint.link.sort_keys(keys)¶
Shortest index first, as the engine orders its reflections.