herosdevices.hardware.menlo.dual_laser_lock
===========================================

.. py:module:: herosdevices.hardware.menlo.dual_laser_lock

.. autoapi-nested-parse::

   HERO driver for a dual-wavelength laser-lock channel of a Menlo Systems frequency comb.





Module Contents
---------------

.. py:class:: DualLaserLock(ofc: herosdevices.hardware.menlo.ofc.OFC, funclayer_identifier: str, primary_frequency_distribution_node: str, secondary_frequency_distribution_node: str, tec_node: str, amp_node: str | None = None, observables: dict[str, dict[str, str]] | None = None)

   Bases: :py:obj:`herosdevices.hardware.menlo.laser_lock.LaserLock`


   Driver for a dual-wavelength laser-lock channel of a Menlo Systems frequency comb.

   Some CW channels (e.g. "CW 507 / 1014 / 1542", "CW 578 / 1157 / 1542" in Menlo's vendor software) lock two
   wavelengths through one shared `dds`/`mainControls`/`frequencyControl`/`amp*` node set, but have two
   separate `frequencyDistribution<wavelength>` blocks (one per wavelength) instead of a single plain
   `frequencyDistribution`, plus a single-wavelength thermo-electric-cooler node. Deploying plain
   :py:class:`~herosdevices.hardware.menlo.LaserLock` against one of these channels fails, since its
   `frequencyDistribution.*` properties hardcode a node name these channels don't have - use `DualLaserLock`
   instead, which composes both wavelength-suffixed nodes plus the TEC node explicitly.

   :param ofc: The OFC HERO this dual-wavelength channel belongs to.
   :param funclayer_identifier: Identifier of the module's functional-layer settings object, e.g.
                                "cw507_1014" for the sub-tree at `functionalLayer.cw507_1014Settings`.
   :param primary_frequency_distribution_node: Relative node name of the first wavelength's
                                               frequency-distribution block (mapped to :py:attr:`frequency_distribution`, inherited from
                                               `LaserLock`), e.g. `"frequencyDistribution507"`.
   :param secondary_frequency_distribution_node: Relative node name of the second wavelength's
                                                 frequency-distribution block (mapped to :py:attr:`secondary_frequency_distribution`), e.g.
                                                 `"frequencyDistribution1014"`.
   :param tec_node: Relative node name of the channel's thermo-electric-cooler block, e.g. `"spt1014Tec"`.
   :param amp_node: Relative node name of the channel's shared laser-diode current-control block (`amp*`), see
                    :py:class:`~herosdevices.hardware.menlo.LaserLock`.
   :param observables: Additional observables to poll, merged on top of `DEFAULT_OBSERVABLES`, see
                       :py:class:`~herosdevices.hardware.menlo.functional_layer.FunctionalLayerModule`.


   .. py:attribute:: secondary_frequency_distribution


   .. py:attribute:: tec


   .. py:attribute:: DEFAULT_OBSERVABLES
      :type:  dict[str, dict[str, str]]


   .. py:attribute:: locked


   .. py:attribute:: fast_output_setpoint


   .. py:attribute:: fast_output_locked


   .. py:attribute:: fast_output_monitor


   .. py:attribute:: unlock_here


   .. py:attribute:: frequency_control


   .. py:attribute:: frequency_distribution


   .. py:attribute:: select_monitor


   .. py:attribute:: current_control


   .. py:property:: amplifier_enabled
      :type: bool


      Whether the loop's actuator amplifier (e.g. piezo/current driver) is enabled.


   .. py:property:: slow_branch_setpoint
      :type: float


      Setpoint of the loop's slow feedback branch.


   .. py:property:: slow_branch_locked
      :type: bool


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


   .. py:property:: slow_branch_monitor
      :type: float


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


   .. py:attribute:: amp_max
      :type:  float
      :value: 1.0



   .. py:attribute:: amp_min
      :type:  float
      :value: 0.0



   .. py:attribute:: freq_max
      :type:  float
      :value: 100000000.0



   .. py:attribute:: freq_min
      :type:  float
      :value: 0.0



   .. py:property:: output_enabled
      :type: bool


      Whether the DDS output is enabled.


   .. py:attribute:: ofc


   .. py:attribute:: base_path


   .. py:attribute:: observables


   .. py:method:: 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
      :py:meth:`~herosdevices.hardware.menlo.ofc.OFC.explore` to find the available relative paths,
      e.g. `ofc.explore(module.base_path, depth=2)`.

      :param relative_path: Dotted path relative to `base_path`.

      :returns: The current value of the node.



   .. py:method:: set(relative_path: str, value: Any) -> None

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

      :param relative_path: Dotted path relative to `base_path`, see :py:meth:`get`.
      :param value: Value to set.



   .. py:attribute:: frequency
      :type:  float
      :value: 1000000.0



   .. py:attribute:: amplitude
      :type:  float
      :value: 0.1



   .. py:attribute:: phase
      :type:  float
      :value: 0.0



   .. py:attribute:: default_ramp_steps
      :type:  int
      :value: 30



   .. py:attribute:: blind
      :type:  bool
      :value: False



