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.
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 |
n_hat, 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 |
n_hat, 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 |
n_hat, alpha_i, beta_out |
|
mu, nu |
eta, chi, phi, delta |
n_hat, alpha_i, beta_out |
|
mu, nu |
eta, chi, phi, delta |
n_hat, alpha_i, beta_out |
|
mu, nu |
eta, chi, phi, delta |
n_hat, psi |
|
chi, phi |
mu, eta, nu, delta |
n_hat, alpha_i, beta_out |
|
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 |
n_hat, alpha_i, beta_out |
|
delta, eta |
mu, chi, phi, nu |
n_hat, alpha_i, beta_out |
|
delta, eta |
mu, chi, phi, nu |
n_hat, alpha_i, beta_out |
|
delta, eta |
mu, chi, phi, nu |
n_hat, 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 |
n_hat, alpha_i, beta_out |
|
chi, gamma |
alpha, omega, phi, delta |
n_hat, alpha_i, beta_out |
|
chi, phi |
alpha, omega, delta, gamma |
n_hat, alpha_i, beta_out |
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 |
n_hat, 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 |
n_hat, 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 |
n_hat, psi |
|
komega, mu |
kappa, kphi, nu, delta |
n_hat, 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 |
n_hat, alpha_i, beta_out |
|
(none) |
alpha, Z, delta, gamma |
n_hat, alpha_i, beta_out |
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 |
n_hat, alpha_i, beta_out |
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 |
|
|
delta=0, bisect, mu=0 |
nu, eta, chi, phi |
|
|
nu=0, bisect, eta=0 |
mu, delta, chi, phi |
|
|
nu=0, bisect, omega=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 4S+2D bisect_eta_fixed nu_fixed (bisect,
eta=0, nu=0). This is equivalent to bisecting_vertical in E6C
terminology: scattering stays in the vertical plane with the sample
angle bisecting the detector angle (eta = delta/2).
Note
Bisector modes
Following You (1999) Figure 1 (see also
diffcalc-core docs),
nu rotates about the vertical axis and swings the detector
horizontally; delta rotates about the horizontal axis and swings
the detector vertically.
The bisect constraint implements eta = delta/2 (vertical
bisector). 4S+2D bisect_eta_fixed nu_fixed (bisect + eta=0 +
nu=0) is equivalent to a bisecting_vertical mode: scattering
stays in the vertical plane with the sample bisecting the detector
angle. 4S+2D bisect_mu_fixed delta_fixed (bisect + mu=0 +
delta=0) is the horizontal counterpart.
In the mode name the bisected sample axis is stated; the
corresponding detector axis is implied by the bisect constraint
(delta).
Mode naming convention#
All mode names follow the pattern 4S+2D <constraints>, where 4S+2D
identifies the You (1999) geometry and the suffix encodes the three fixed
constraints:
<axis>_fixedor<ax1>_<ax2>_fixed— motor axis (or axes) fixed at zero.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.bisect— bisector condition:eta = delta/2. The bisected sample axis (e.g.eta) is named; the detector axis (delta) is implied.psi_fixed,omega_fixed— azimuthal or omega angle fixed at zero.
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.