pyrtc.corrector_splitter

Drive several wavefront correctors from one loop (woofer/tweeter, tip-tilt offload).

The loop controls one modal vector. A CorrectorSplitter in the loop’s wfc section owns that stream. It is the concatenation of each corrector’s modes, in the order they are listed, and the splitter writes each corrector its slice every frame. The interaction matrix therefore calibrates every corrector’s modes, because each poke reaches the right device, and the loop needs no changes.

Offloading moves content from one corrector (the source, e.g. a tweeter) to another (the target, e.g. a woofer or a tip-tilt stage) without changing the wavefront. The coupling matrix C (source modes x target modes) gives the source-mode equivalent of one unit of each target mode. CorrectorSplitter.set_coupling_from_im() estimates it from the loop’s IM as pinv(IM_source) @ IM_target. Each frame, with offload gain g:

source_out = source_loop - C @ offload target_out = target_loop + offload offload += g * pinv(C) @ source_out

The target takes over, at rate g, the part of the source command it can represent, and the source is left with the rest. A configured gain takes effect once the coupling is set, so calibrate the IM first (its pokes must reach the correctors unchanged), then call set_coupling_from_im.

Config (wfc section):

wfc:
  class_name: pyrtc.corrector_splitter.CorrectorSplitter
  correctors:
    - {name: woofer, stream: woofer_wfc, modes: 20}
    - {name: tweeter, stream: tweeter_wfc, modes: 60}
  offload: {source: tweeter, target: woofer, gain: 0.02}   # optional
  functions: [split]

Each corrector is an ordinary wavefront-corrector section whose wfc input stream is the listed stream.

Classes

CorrectorSplitter(conf)

Split the loop's modal command across several correctors, with offloading.