Iteration

Tools for iterating; the core of the logic behind sweeping.

File structure

The package consists of only two modules: spacq.iteration.sweep which contains SweepController, and spacq.iteration.variables which defines input and output variables. Together, these modules can be used to provide iteration over a set of variables.

Sweeping

spacq.iteration.sweep.SweepController goes through a process of several stages, as crudely drawn in its docstring:

init -> next -> transition -> write -> dwell -> pulse -> read -> ramp_down -> end
^       ^                                  |_____________^  |            |
|       |___________________________________________________|            |
|________________________________________________________________________|

The ordering is approximately linear, but with some loops and skips:

  • If no pulse program is defined, the pulse stage is skipped.
  • If more items remain to be iterated over, read heads to next.
  • If the sweep is continuous, ramp_down restarts it instead of finishing it.

Those steps which deal with accessing resources (transition, write, read, ramp_down) do so in parallel, using as many concurrent threading.Thread objects as necessary.

The sweeping process can be interrupted at any time for many reasons; some of these include: user error, device error, and the user pressing the “Cancel” button. In the case that it is interrupted, the sweep simply proceeds to either the ramp_down or the end stage, depending on whether the interruption is fatal. In the case of a fatal interruption, the ramp_down stage cannot be expected to succeed (for example, if writing to a resource failed), so it is skipped.