axiom

Designing an experiment before there is any data · step 3 of 6

What shape to cut the aperture

Same solid angle, same counts — does the shape matter?

A counter needs a hole to look through, and a bigger hole means more counts. The obvious hole is round. The scattering does not depend on azimuth, though, which means the two directions of a hole are not equivalent at all.

Only the radial half-width smears the angle; azimuth is free resolution. So hold the radial width at the workshop's floor and take every extra steradian out in arc. A round hole of the same area at 90 degrees would have to be many degrees wide and would report a rate belonging to no angle in particular — the same counts, at a fraction of the resolution.

θ = 90° annular slot ±0.91° radial, 360° of arc round hole, same solid angle radius 14° reports the angle to 0.025% reports it 6.6% high
Looking straight down the beam at the 90° station: the scattering arrives on the dashed ring. Both apertures subtend the same solid angle and collect the same counts — the slot is a thin band lying along the ring, the round hole a disc wide enough to average over everything inside it. Radius here is the angle from the beam axis, which is not an area-preserving projection, so do not read equal areas off the drawing; the angular extents beneath each shape are the honest comparison. The radial band is drawn at a legible minimum — the real one is thinner.

what an annular slot subtends

Ω(θ, δ, φ) = φ · 2 sin θ sin δ
in axiom
half, arc = s.slit_for(theta, omega)
# omega is fixed by the counter's rate cap; only the
# split between radial half-width and arc is yours

the aperture enters the model as a column

μ = rate(θ) · Ω · t
in axiom
expected = Mul(factors=(
    rate,
    Data(name="omega", dimension=dimensionless()),
    Data(name="exposure", dimension=BASES.time),
))
# geometry and exposure are data, not parameters
step 3
print(f"{'angle':>7} {'radial':>9} {'arc':>9} {'slot bias':>11} {'hole bias':>11}")
for theta in (5.0, 45.0, 90.0, 150.0):
    omega_here = float(s.widest_aperture([theta], s.HARD_CENTRE)[0])
    half, arc = s.slit_for(theta, omega_here)
    slot = 100.0 * s.aperture_bias(theta, half, arc, s.HARD_CENTRE)
    # a round hole of the same solid angle: equal in both directions
    hole = np.degrees(np.sqrt(omega_here / np.pi))
    hole_bias = 100.0 * s.aperture_bias(theta, hole, 2 * hole, s.HARD_CENTRE)
    print(f"{theta:6.1f}d {half:8.2f}d {arc:8.1f}d "
          f"{slot:10.3f}% {hole_bias:10.2f}%")
print()
print("same solid angle, same counts. the slot reports the angle it is at;")
print("the hole reports an average over everything it can see.")

# the 90 degree station, which the diagram on this page draws
theta = 90.0
omega90 = float(s.widest_aperture([theta], s.HARD_CENTRE)[0])
half90, arc90 = s.slit_for(theta, omega90)
hole90 = float(np.degrees(np.sqrt(omega90 / np.pi)))
slit_geometry = {
    "theta": theta,
    "omega": omega90,
    "half": half90,
    "arc": arc90,
    "hole_radius": hole90,
    "slot_bias_pct": 100.0 * s.aperture_bias(theta, half90, arc90, s.HARD_CENTRE),
    "hole_bias_pct": 100.0
    * s.aperture_bias(theta, hole90, 2 * hole90, s.HARD_CENTRE),
}
what it printed
  angle    radial       arc   slot bias   hole bias
   5.0d     0.05d      2.0d      0.020%       0.04%
  45.0d     0.20d    360.0d      0.004%       3.46%
  90.0d     0.91d    360.0d      0.025%       6.64%
 150.0d     1.82d    360.0d      0.054%       3.48%

same solid angle, same counts. the slot reports the angle it is at;
the hole reports an average over everything it can see.

Every line above was captured by running this code at build time. The steps share one namespace, so the code on this page is the code you would type after the steps before it.