(geometry-kappa4ch)=
# kappa4ch — Kappa Four-Circle (horizontal)
Four-circle kappa diffractometer, horizontal scattering plane. The
chi circle is replaced by a kappa arm tilted at α = 50° from the
**vertical** axis toward the **longitudinal** axis (along the
incident beam), lying entirely in the vertical–longitudinal plane.
Laboratory convention.
**Walko (2016) designation:** S3D1 (kappa)
**Coordinate basis:** Busing & Levy ({data}`~ad_hoc_diffractometer.factories.BASIS_BL`): transverse=+x, longitudinal=+y, vertical=+z.
## Quick start
```python
import ad_hoc_diffractometer as ahd
g = ahd.make_geometry("kappa4ch")
g.wavelength = 1.0 # Å
print(g.summary())
```
## Demo geometry definition
This geometry is defined by the {ref}`geometry-kappa4ch` factory
function — see the [source](https://github.com/BCDA-APS/ad_hoc_diffractometer/blob/main/src/ad_hoc_diffractometer/geometries/kappa4ch.yml) for the complete stage
and mode configuration.
## Stage layout
```{raw} html
Static fallback (click to expand if the interactive figure above is blank)
```

```{raw} html
```
**Sample stages (base first):**
| Stage | Axis | Handedness | Parent |
|---|---|---|---|
| ``komega`` | vertical (−z in BL) | left-handed | base |
| ``kappa`` | (cos α)·vertical + (sin α)·longitudinal = (cos α)·ẑ + (sin α)·ŷ in BL (α = 50°) | right-handed | ``komega`` |
| ``kphi`` | vertical (−z in BL) | left-handed | ``kappa`` |
**Detector stages (base first):**
| Stage | Axis | Handedness | Parent |
|---|---|---|---|
| ``ttheta`` | vertical (−z in BL) | left-handed | base |
### How the kappa axis is defined
The kappa rotation axis is **inclined by α from the omega axis**,
lying in the plane that contains both omega and the
equivalent-Eulerian chi axis, and tilted from omega toward that chi
direction (Walko 2016 §4.1; ITC Vol. C §2.2.6.2: *"the κ axis is
inclined at 50° to the ω axis"*).
For ``kappa4ch`` the omega axis lies along the **vertical** line
and the equivalent-Eulerian chi axis lies along the **longitudinal**
direction (along the X-ray beam). The kappa arm therefore lies in
the **vertical–longitudinal plane**, tilted by ``α`` from the
vertical line toward +L:
$$
\hat{n}_{\kappa} \;=\; \cos\alpha \cdot \hat{V} \;+\; \sin\alpha \cdot \hat{L}.
$$
In the BL basis (V=+ẑ, L=+ŷ) at α = 50° this is
$$
\hat{n}_{\kappa} \;=\; \cos 50° \cdot \hat{z} \;+\; \sin 50° \cdot \hat{y} \;=\; (0,\, 0.766,\, 0.643).
$$
The transverse component is *exactly zero*: the kappa arm rises
upward and toward the X-ray source/sample direction in the plane
that contains the vertical omega axis and the beam.
**Published reference figure.** This convention matches Wyckoff
(1985) Figure 2(b) on p. 334 — the canonical Enraf-Nonius kappa
diffractometer in the horizontal-scattering laboratory layout.
ITC Vol. C §2.2.6 cites this figure as the schematic for the
kappa goniostat. Walko (2016) Figure 3 shows the same instrument
rotated 90° onto the vertical scattering plane (the ``kappa4cv``
convention).
The omega axis sense (``komega = −vertical`` = left-handed
rotation about +V) follows Walko's left-handed sign convention.
ITC Vol. C §2.2.6.2 prefers a right-handed sign convention for
``omega/chi/phi``; the two are equivalent up to motor-angle sign
flips.
**Virtual Eulerian angles** ``omega``, ``chi``, ``phi`` are mapped
to / from the real motors via the geometry-aware decomposition in
{func}`~ad_hoc_diffractometer.kappa.eulerian_to_kappa_axes` and
{func}`~ad_hoc_diffractometer.kappa.kappa_to_eulerian_axes`.
## Diffraction modes
Each mode is a {class}`~ad_hoc_diffractometer.mode.ConstraintSet` of 1 constraint
(N − 3 = 1 for N = 4 DOF).
Identical mode set to {doc}`kappa4cv`.
See {doc}`../howto/modes` for usage and {doc}`../howto/constraints` for
changing constraint values at run time.
### `bisecting` *(default)*
{class}`~ad_hoc_diffractometer.mode.VirtualBisectConstraint`:
``omega_virtual = ttheta / 2`` enforced on the virtual Eulerian
omega pseudoangle. Solved via the geometry-aware
{func}`~ad_hoc_diffractometer.kappa.eulerian_to_kappa_axes`
decomposition.
| | |
|---|---|
| **Computed** | komega, kappa, kphi, ttheta |
| **Constant during** `forward()` | — |
### `fixed_kphi`
{class}`~ad_hoc_diffractometer.mode.SampleConstraint`:
`kphi` held at declared value (default 0°) — real stage, no kappa inversion needed.
| | |
|---|---|
| **Computed** | komega, kappa, ttheta |
| **Constant during** `forward()` | kphi |
### `fixed_omega`
Fix virtual Eulerian omega at declared value (default 0°) — see {doc}`kappa4cv` for details.
| | |
|---|---|
| **Computed** | komega, kappa, kphi, ttheta |
| **Constant during** `forward()` | omega (virtual) |
### `fixed_chi`
Fix virtual Eulerian chi at declared value (default 90°).
| | |
|---|---|
| **Computed** | komega, kappa, kphi, ttheta |
| **Constant during** `forward()` | chi (virtual) |
### `fixed_phi`
Fix virtual Eulerian phi at declared value (default 0°).
| | |
|---|---|
| **Computed** | komega, kappa, kphi, ttheta |
| **Constant during** `forward()` | phi (virtual) |
### `fixed_psi`
{class}`~ad_hoc_diffractometer.mode.ReferenceConstraint`:
azimuthal angle ψ validation filter.
Set ``g.azimuthal_reference = (h, k, l)`` before calling ``forward()``.
Returns bisecting solutions only when the natural ψ for (h,k,l) matches
the stored target. See {doc}`../howto/surface`.
| | |
|---|---|
| **Extras (input)** | n̂ (reference vector), ψ (target azimuth, degrees) |
| **Extras (output)** | psi (computed azimuth) |
## API reference
- {ref}`geometry-kappa4ch`
- {class}`~ad_hoc_diffractometer.diffractometer.AdHocDiffractometer`
- {class}`~ad_hoc_diffractometer.mode.ConstraintSet`
- {class}`~ad_hoc_diffractometer.mode.BisectConstraint`
- {class}`~ad_hoc_diffractometer.mode.SampleConstraint`
- {class}`~ad_hoc_diffractometer.mode.ReferenceConstraint`
- {class}`~ad_hoc_diffractometer.mode.EwaldSphereViolation`
- {class}`~ad_hoc_diffractometer.mode.ConstraintViolation`
## References
- H.W. Wyckoff, *Diffractometry*, in *Methods in Enzymology* **114**,
330–386 (1985), Figure 2(b) on p. 334 (canonical Enraf-Nonius
kappa diffractometer).
DOI: [10.1016/0076-6879(85)14026-7](https://doi.org/10.1016/0076-6879(85)14026-7).
- D.A. Walko, *Multicircle Diffractometry Methods*, in *Reference
Module in Materials Science and Materials Engineering* (Elsevier,
2016), §4.1, equation [16].
DOI: [10.1016/B978-0-12-803581-8.01215-7](https://doi.org/10.1016/B978-0-12-803581-8.01215-7).
- W.R. Busing & H.A. Levy, *Angle calculations for 3- and 4-circle
X-ray and neutron diffractometers*, Acta Cryst. **22**, 457–464
(1967) (BL coordinate basis).
DOI: [10.1107/S0365110X67000970](https://doi.org/10.1107/S0365110X67000970).
- *International Tables for Crystallography*, Vol. C, §2.2.6
(2006), p. 36 (α = 50° convention; cites Wyckoff 1985 for the
schematic picture).
DOI: [10.1107/97809553602060000577](https://doi.org/10.1107/97809553602060000577).