Geometries#
Each solver registered under the hklpy2.solver entry-point group
exposes one or more named geometries. The geometry name is passed to
the solver when it is instantiated by hklpy2.
ad_hoc solver#
Wraps ad_hoc_diffractometer (Jemian 2026).
The ad_hoc solver discovers geometries dynamically from the
ad_hoc_diffractometer
library. All geometries registered in the
library’s geometry registry (including via entry points) are
automatically available. The pseudo axes are always h, k, l.
In the per-mode tables below the extra(s) column names the
surface_normal
or
azimuth
attribute that the mode reads (set on the underlying geometry object),
followed by any per-call scalar extras (psi, incidence,
emergence). See Set the reference vector (n̂) for the
recipes.
Note
Reference-constraint modes (those listing psi, incidence,
emergence, or surface_normal/azimuth) require
ad_hoc_diffractometer >= 0.11.3 and the corresponding reference
vector to be set (via the n_hat extra); otherwise
forward() raises
SolverError.
fourcv#
Busing & Levy (1967) four-circle Eulerian diffractometer (vertical scattering plane, transverse ttheta, synchrotron).
See ad_hoc_diffractometer fourcv.
Property |
Value |
|---|---|
Geometry name |
|
Real axes |
|
Pseudo axes |
|
Default mode |
|
Mode name |
Constant stages |
writable(s) |
extra(s) |
|---|---|---|---|
|
omega |
chi, phi, ttheta |
|
|
chi |
omega, phi, ttheta |
|
|
phi |
omega, chi, ttheta |
|
|
omega |
chi, phi, ttheta |
|
|
(none) |
omega, chi, phi, ttheta |
azimuth, psi |
|
(none) |
omega, chi, phi, ttheta |
h2, k2, l2 |
fourch#
Busing & Levy (1967) four-circle Eulerian diffractometer (horizontal scattering plane, vertical ttheta, laboratory).
See ad_hoc_diffractometer fourch.
Property |
Value |
|---|---|
Geometry name |
|
Real axes |
|
Pseudo axes |
|
Default mode |
|
Mode name |
Constant stages |
writable(s) |
extra(s) |
|---|---|---|---|
|
omega |
chi, phi, ttheta |
|
|
chi |
omega, phi, ttheta |
|
|
phi |
omega, chi, ttheta |
|
|
omega |
chi, phi, ttheta |
|
|
(none) |
omega, chi, phi, ttheta |
azimuth, psi |
|
(none) |
omega, chi, phi, ttheta |
h2, k2, l2 |
psic#
You (1999) 4S+2D six-circle diffractometer (transverse detector, vertical scattering plane, synchrotron).
See ad_hoc_diffractometer psic.
Property |
Value |
|---|---|
Geometry name |
|
Real axes |
|
Pseudo axes |
|
Default mode |
|
Mode name |
Constant stages |
writable(s) |
extra(s) |
|---|---|---|---|
|
eta, mu, nu |
chi, phi, delta |
|
|
mu, nu, phi |
eta, chi, delta |
|
|
chi, mu, nu |
eta, phi, delta |
|
|
mu, nu |
eta, chi, phi, delta |
surface_normal, incidence, emergence |
|
mu, nu |
eta, chi, phi, delta |
surface_normal, incidence, emergence |
|
mu, nu |
eta, chi, phi, delta |
surface_normal, incidence, emergence |
|
mu, nu |
eta, chi, phi, delta |
azimuth, psi |
|
chi, phi |
mu, eta, nu, delta |
surface_normal, incidence, emergence |
|
mu, nu |
eta, chi, phi, delta |
|
|
mu, nu |
eta, chi, phi, delta |
h2, k2, l2 |
|
delta, eta, mu |
chi, phi, nu |
|
|
delta, eta, phi |
mu, chi, nu |
|
|
chi, delta, eta |
mu, phi, nu |
|
|
delta, eta |
mu, chi, phi, nu |
surface_normal, incidence, emergence |
|
delta, eta |
mu, chi, phi, nu |
surface_normal, incidence, emergence |
|
delta, eta |
mu, chi, phi, nu |
surface_normal, incidence, emergence |
|
delta, eta |
mu, chi, phi, nu |
azimuth, psi |
|
delta, eta |
mu, chi, phi, nu |
|
|
delta, eta |
mu, chi, phi, nu |
h2, k2, l2 |
|
mu, nu |
eta, chi, phi, delta |
|
|
delta, eta |
mu, chi, phi, nu |
|
|
chi, eta, mu |
phi, nu, delta |
|
|
chi, eta, phi |
mu, nu, delta |
|
|
chi, mu, phi |
eta, nu, delta |
sixc#
Lohmeier & Vlieg (1993) six-circle surface diffractometer.
See ad_hoc_diffractometer sixc.
Property |
Value |
|---|---|
Geometry name |
|
Real axes |
|
Pseudo axes |
|
Default mode |
|
Mode name |
Constant stages |
writable(s) |
extra(s) |
|---|---|---|---|
|
alpha, gamma, omega |
chi, phi, delta |
|
|
alpha, gamma, omega |
chi, phi, delta |
|
|
alpha, gamma, omega |
chi, phi, delta |
|
|
alpha, chi |
omega, phi, delta, gamma |
surface_normal, incidence, emergence |
|
chi, gamma |
alpha, omega, phi, delta |
surface_normal, incidence, emergence |
|
chi, phi |
alpha, omega, delta, gamma |
surface_normal, incidence, emergence |
fivec#
Five-circle geometry (four-circle with additional mu tilt).
See ad_hoc_diffractometer fivec.
Property |
Value |
|---|---|
Geometry name |
|
Real axes |
|
Pseudo axes |
|
Default mode |
|
Mode name |
Constant stages |
writable(s) |
extra(s) |
|---|---|---|---|
|
mu, omega |
chi, phi, ttheta |
|
|
chi, mu |
omega, phi, ttheta |
|
|
mu, phi |
omega, chi, ttheta |
|
|
mu, omega |
chi, phi, ttheta |
|
|
mu, omega |
chi, phi, ttheta |
kappa4cv#
Kappa four-circle vertical-scattering geometry.
See ad_hoc_diffractometer kappa4cv.
Property |
Value |
|---|---|
Geometry name |
|
Real axes |
|
Pseudo axes |
|
Default mode |
|
Mode name |
Constant stages |
writable(s) |
extra(s) |
|---|---|---|---|
|
omega (virtual) |
komega, kappa, kphi, ttheta |
|
|
kphi |
komega, kappa, ttheta |
|
|
omega (virtual) |
komega, kappa, kphi, ttheta |
|
|
chi (virtual) |
komega, kappa, kphi, ttheta |
|
|
phi (virtual) |
komega, kappa, kphi, ttheta |
|
|
(none) |
komega, kappa, kphi, ttheta |
azimuth, psi |
|
(none) |
komega, kappa, kphi, ttheta |
h2, k2, l2 |
kappa4ch#
Kappa four-circle horizontal-scattering geometry.
See ad_hoc_diffractometer kappa4ch.
Property |
Value |
|---|---|
Geometry name |
|
Real axes |
|
Pseudo axes |
|
Default mode |
|
Mode name |
Constant stages |
writable(s) |
extra(s) |
|---|---|---|---|
|
omega (virtual) |
komega, kappa, kphi, ttheta |
|
|
kphi |
komega, kappa, ttheta |
|
|
omega (virtual) |
komega, kappa, kphi, ttheta |
|
|
chi (virtual) |
komega, kappa, kphi, ttheta |
|
|
phi (virtual) |
komega, kappa, kphi, ttheta |
|
|
(none) |
komega, kappa, kphi, ttheta |
azimuth, psi |
kappa6c#
Kappa six-circle geometry (psic-style outer axes, transverse detector, synchrotron).
See ad_hoc_diffractometer kappa6c.
Property |
Value |
|---|---|
Geometry name |
|
Real axes |
|
Pseudo axes |
|
Default mode |
|
Mode name |
Constant stages |
writable(s) |
extra(s) |
|---|---|---|---|
|
mu, nu, omega (virtual) |
komega, kappa, kphi, delta |
|
|
delta, komega, mu |
kappa, kphi, nu |
|
|
kphi, mu, nu |
komega, kappa, delta |
|
|
mu, nu, omega (virtual) |
komega, kappa, kphi, delta |
|
|
mu, nu, omega (virtual) |
komega, kappa, kphi, delta |
|
|
delta, komega, mu |
kappa, kphi, nu |
|
|
komega, mu |
kappa, kphi, nu, delta |
|
|
kphi, mu |
komega, kappa, nu, delta |
|
|
mu, omega (virtual) |
komega, kappa, kphi, nu, delta |
azimuth, psi |
|
komega, mu |
kappa, kphi, nu, delta |
azimuth, psi |
|
mu, nu |
komega, kappa, kphi, delta |
h2, k2, l2 |
|
delta, komega |
mu, kappa, kphi, nu |
h2, k2, l2 |
|
mu, nu |
komega, kappa, kphi, delta |
|
|
delta, komega |
mu, kappa, kphi, nu |
zaxis#
Z-axis four-circle surface diffraction geometry (Bloch 1985).
See ad_hoc_diffractometer zaxis.
Property |
Value |
|---|---|
Geometry name |
|
Real axes |
|
Pseudo axes |
|
Default mode |
|
Mode name |
Constant stages |
writable(s) |
extra(s) |
|---|---|---|---|
|
(none) |
alpha, Z, delta, gamma |
surface_normal, incidence, emergence |
|
(none) |
alpha, Z, delta, gamma |
surface_normal, incidence, emergence |
s2d2#
Two-sample / two-detector surface diffraction geometry (Evans-Lutterodt & Tang 1995).
See ad_hoc_diffractometer s2d2.
Property |
Value |
|---|---|
Geometry name |
|
Real axes |
|
Pseudo axes |
|
Default mode |
|
Mode name |
Constant stages |
writable(s) |
extra(s) |
|---|---|---|---|
|
mu |
Z, nu, delta |
|
|
(none) |
mu, Z, nu, delta |
surface_normal, incidence, emergence |
Kappa geometries#
The kappa geometries (kappa4cv,
kappa4ch, kappa6c) accept a
kappa_alpha_deg keyword argument when the solver is created. This
sets the fixed tilt angle of the kappa arm. The default is 50 degrees.
The kappa modes fixed_omega, fixed_chi, and fixed_phi (and,
on kappa6c, bisecting_vertical / fixed_mu / fixed_nu)
constrain the equivalent Euler (virtual) angles rather than the
physical kappa motors.
Extensibility#
The ad_hoc solver discovers geometries dynamically from the
ad_hoc_diffractometer
library’s registry. New geometries added to
the library (including via entry points) are automatically available
without changes to the solver code.
diffcalc solver#
Wraps diffcalc-core (You 1999). See the diffcalc-core documentation for full details of the underlying library.
diffcalc_4S_2D#
You, J. Appl. Cryst. 32, 614 (1999) six-circle geometry.
Property |
Value |
|---|---|
Geometry name |
|
Real axes |
|
Pseudo axes |
|
Default mode |
|
Operating modes#
The diffcalc solver selects three diffractometer constraints to fix for
each operating mode. This geometry has no extra parameters
(extras is always {}). The axes computed by forward()
(writable) are all real axes not listed as fixed constraints; the
remaining axes are held constant (axes_c, derived by hklpy2).
Mode name |
Fixed constraints |
writable(s) |
extra(s) |
|---|---|---|---|
|
delta=0, a_eq_b, mu=0 |
nu, eta, chi, phi |
|
|
nu=0, a_eq_b, mu=0 |
delta, eta, chi, phi |
|
|
delta=0, a_eq_b, eta=0 |
mu, nu, chi, phi |
|
|
nu=0, psi=0, phi=0 |
mu, delta, eta, chi |
|
|
delta=0, chi=0, phi=0 |
mu, nu, eta |
|
|
delta=0, mu=0, eta=0 |
nu, chi, phi |
|
|
delta=0, mu=0, phi=0 |
nu, eta, chi |
|
|
nu=0, mu=0, chi=0 |
delta, eta, phi |
|
|
nu=0, eta=0, phi=0 |
mu, delta, chi |
|
|
nu=0, eta=0, chi=0 |
mu, delta, phi |
|
|
bisect, mu=0, nu=0 |
delta, eta, chi, phi |
|
|
bisect, eta=0, delta=0 |
mu, nu, chi, phi |
|
|
bisect, omega=0, nu=0 |
mu, delta, eta, chi, phi |
|
|
a_eq_b, chi=0, phi=0 |
mu, delta, nu, eta |
|
|
a_eq_b, chi=0, eta=0 |
mu, delta, nu, phi |
|
|
a_eq_b, chi=0, mu=0 |
delta, nu, eta, phi |
|
|
a_eq_b, mu=0, eta=0 |
delta, nu, chi, phi |
|
|
a_eq_b, mu=0, phi=0 |
delta, nu, eta, chi |
|
|
a_eq_b, eta=0, phi=0 |
mu, delta, nu, chi |
|
|
eta=0, chi=0, phi=0 |
mu, delta, nu |
|
|
mu=0, chi=0, phi=0 |
delta, nu, eta |
|
|
mu=0, eta=0, phi=0 |
delta, nu, chi |
|
|
mu=0, eta=0, chi=0 |
delta, nu, phi |
Default mode#
The default mode is bisect fixed_mu fixed_nu (canonical
bisecting_vertical: bisect, mu=0, nu=0).
Equivalent to bisecting_vertical in E6C terminology: scattering
stays in the vertical plane on the delta axis with the sample
bisecting the scattering angle.
Note
Bisecting modes
Following You (1999) Figure 1 (see also
diffcalc-core docs),
delta rotates about a horizontal axis and swings the detector
vertically; nu rotates about a vertical axis and swings the
detector horizontally. mu is the horizontal-arm sample
axis (rotates about the vertical lab axis); eta rotates about a
horizontal axis.
diffcalc’s bisect constraint pairs with one sample axis at a
time (mu, eta, or omega) and pins the other
in-plane axes so that the active detector axis bisects with that
sample axis:
Mode |
Family |
Pinned axes |
Active axes |
|---|---|---|---|
|
bisecting vertical (≡ E6C |
|
|
|
bisecting horizontal (≡ E6C |
|
|
|
bisecting vertical with |
|
|
Mode naming convention#
Each mode name lists the three diffcalc constraints separated by
spaces. Token order is keyword constraints first
(a_eq_b, bisect, bin_eq_bout), then fixed_<axis>
tokens. For all-fixed_* modes the conventional order is
detector → sample(s).
fixed_<axis>— that axis or pseudo-angle is pinned at0. Applies to detector axes (delta,nu), reference angles (psi), and sample axes (mu,eta,chi,phi,omega).a_eq_b— reference-vector constraint: azimuthal reference equals scattering vector direction. Caution: singular when the scattering vector is parallel to the reference vector; avoid as a default.bin_eq_bout— reference constraint: incidence equals exit angle.bisect— sample bisector condition (one of three diffcalc variants, see “Bisector modes” above).
For example, bisect fixed_mu fixed_nu encodes
{bisect: True, mu: 0, nu: 0} and a_eq_b fixed_delta fixed_mu
encodes {a_eq_b: True, delta: 0, mu: 0}. See the
How to use the diffcalc solver “Cross-reference to common conventions” section
for a mapping between these names and the
bisecting_vertical / lifting_detector_<axis> / double_diffraction
vocabulary used by other solvers.
Extensibility#
The available constraint names are fixed by diffcalc-core and cannot be
changed without modifying that library. Each constraint name has specific
mathematical implementation inside diffcalc-core’s solver — the name is merely
a handle for the underlying algebra that reduces the degrees of freedom during
position calculation. A new constraint (e.g. mu = nu/2) would require
new code in diffcalc-core, not just a new entry in _MODES. From the
user’s perspective the mode list is not extensible.