EPR automation¶
epr_auto is a YAML protocol runner for unattended pulsed-EPR tune-up and
measurement on the endstation's X-band pulsed machine. Instead of clicking
through the phasing, field, and acquisition tools by hand for every sample, you
declare the run as a list of steps in a text file; the runner tunes the
spectrometer, judges every result, adapts the scan count to a signal-to-noise
target, and records a manifest of what it did.
A protocol is a short, diffable description of intent. Each step names a primitive — set the temperature, find the line, calibrate the pulses, zero the phase, measure a relaxation curve — with per-step parameter overrides. The runner executes them in order, applies a pass/fail judge to each result, carries calibrations forward (a measured field or phase feeds later steps), and pauses or notifies according to the protocol's autonomy policy.
It ships only with Atomize_ITC, the EPR-endstation variant of Atomize — not with plain Atomize and not from PyPI. The machine it drives is described on the endstation page.
How it relates to the GUI tools¶
epr_auto does not re-implement the spectrometer. Its engine reuses the AWG
phasing tool's own acquisition worker (the Worker class from
awg_phasing_insys.py), the same hardware-validated scan loop the GUI pickles
when you press Start. The engine only rebuilds the argument tuples the GUI would
have built from a preset, so an engine run is argument-identical to a
GUI-launched run of the same *.phase_awg preset. Because the acquisition path
is unchanged, a run started from a terminal while the Atomize GUI is open plots
live into that GUI exactly as an interactive scan does — the runner reaches the
same LivePlot socket. This is also why the command-line runner changes its
working directory into libs/ before touching hardware: the Insys FPGA driver
reads its brd.ini / exam_adc.ini relative to the current directory at
instantiation time.
A protocol at a glance¶
sample: RO2411
autonomy: checkpointed # supervised | checkpointed | autonomous
notify: none # telegram: notify on checkpoint/finish/abort
steps:
- tune.power_for_length: # coarse: rotary vane sets the power regime
target_length: 32 ns
amplitude: 95
- field.edfs: # find the line, center from h*nu/(g*mu_B)
range: auto
pick: max
- tune.echo_window # integration window from the averaged echo
- tune.auto_phase # zero the signal phase (runs after the window)
- tune.pi_calibration: # fine: per-pulse AWG amplitude sweep
mode: amplitude
retries: 1
Steps with no parameters are written as a bare name; everything else is a
key/value block. Full step and parameter details are on the
Step reference page and are also available offline from
epr-auto steps.
Current status¶
The runner is implemented and dry-run-verified end to end; on-hardware commissioning is in progress.
Commissioning status
Live execution is enabled from the CLI, but the automation chain has not
yet been validated on the spectrometer — every step is implemented and
verified in dry-run (--test) only. Always dry-run a protocol first, and
keep the first live sessions in supervised autonomy with an operator
present.
Where to go next¶
| Page | What it covers |
|---|---|
| Quickstart | Install, validate, and dry-run a protocol |
| Writing protocols | The YAML schema, autonomy, foreach series, value substitution |
| Step reference | Every step, its parameters, defaults, and constraints |
| The tune-up chain | How the calibration steps compose and invalidate each other |
| Presets | What a step expects of a .phase_awg preset, and what the runner overrides |
| Examples | Two annotated protocols: a single T2 and a field series |
| Troubleshooting | Common failures, verbatim, and what they mean |