herosdevices.hardware.menlo.repetition_rate

HERO driver for the repetition-rate stabilization loop of a Menlo Systems frequency comb.

Module Contents

class herosdevices.hardware.menlo.repetition_rate.RepetitionRate(ofc: herosdevices.hardware.menlo.ofc.OFC, amp_node: str | None = None, observables: dict[str, dict[str, str]] | None = None)[source]

Bases: herosdevices.hardware.menlo.dds.DDS, herosdevices.hardware.menlo.beat_loop.BeatLoop

Driver for the repetition-rate stabilization loop of a Menlo Systems frequency comb.

Wraps the OFC’s functionalLayer.rrSettings sub-tree, a fixed, singleton module (there is only one repetition-rate loop per OFC, so unlike DDS/ LaserLock there is no funclayer_identifier to select).

Combines DDS (the loop’s underlying DDS, confirmed identical in shape to a laser-lock module’s) with BeatLoop (the shared lock-loop shape). This means RepetitionRate implements atomiq’s RFSource interface via the DDS: _set_frequency tunes the DDS directly, not the loop’s beat-frequency setpoint (see beat_frequency_setpoint for that).

Also exposes select_monitor (the same node shape seen on CW channels and CEO, so treated as a general default here). One observed comb additionally has amp1542 (laser-diode current control, see amp_node), frequencyDistributionOpticalBeat/frequencyDistributionRfBeat, and an operationMode.lockMode single/dual-lock switch - none of those are modeled here, since they weren’t seen anywhere else and it’s unconfirmed whether they’re a fixed feature of every Menlo repetition-rate loop or specific to that comb’s configuration. Poll/control them via observables or ofc.get_node/ set_node directly if your comb has them.

Parameters:
  • ofc – The OFC HERO this loop belongs to.

  • amp_node – Relative node name of this loop’s laser-diode current-control block (amp*), if it has one. None (the default) leaves current_control unset.

  • observables – Additional observables to poll, merged on top of DEFAULT_OBSERVABLES, see FunctionalLayerModule.

DEFAULT_OBSERVABLES: dict[str, dict[str, str]]
select_monitor
current_control
property beat_frequency: float

The currently measured repetition-rate beat frequency. Read-only.

property beat_frequency_setpoint: float

Target repetition-rate beat frequency.

amp_max: float = 1.0
amp_min: float = 0.0
freq_max: float = 100000000.0
freq_min: float = 0.0
property output_enabled: bool

Whether the DDS output is enabled.

ofc
base_path
observables
get(relative_path: str) Any

Read the current value of a node relative to this module’s settings object.

Use this for module properties not already exposed as a named attribute. See explore() to find the available relative paths, e.g. ofc.explore(module.base_path, depth=2).

Parameters:

relative_path – Dotted path relative to base_path.

Returns:

The current value of the node.

set(relative_path: str, value: Any) None

Set the value of a node relative to this module’s settings object.

Parameters:
  • relative_path – Dotted path relative to base_path, see get().

  • value – Value to set.

frequency: float = 1000000.0
amplitude: float = 0.1
phase: float = 0.0
default_ramp_steps: int = 30
blind: bool = False
property locked: bool

Whether the loop is currently locked.

property fast_output_locked: bool

Whether the loop’s fast feedback branch is currently locked. Read-only status.

property fast_output_monitor: float

Monitor voltage of the loop’s fast feedback branch. Read-only.

property fast_output_setpoint: float

Setpoint of the loop’s fast feedback branch.

property slow_output_locked: bool

Whether the loop’s slow feedback branch is currently locked. Read-only status.

property slow_output_monitor: float

Monitor voltage of the loop’s slow feedback branch. Read-only.

property slow_output_setpoint: float

Setpoint of the loop’s slow feedback branch.

unlock_here() None

Unlock the loop and immediately re-engage it at the current beat frequency.

Shared with LaserLock, which uses the same mainControls.unlockHere node name.

Inferred from context (Menlo’s own naming and the sibling lock/setpoint nodes) rather than verified against vendor documentation: releases the lock if engaged, then re-engages it using the beat note as it currently stands as the new setpoint, instead of servoing to a previously configured setpoint.