Source code for quantify_scheduler.instrument_coordinator.utility

# Repository: https://gitlab.com/quantify-os/quantify-scheduler
# Licensed according to the LICENCE file on the main branch
"""Utility functions for the instrument coordinator and components."""

import logging
from typing import Any

from qcodes.instrument.base import InstrumentBase
from qcodes.instrument import Parameter

[docs]logger = logging.getLogger(__name__)
[docs]def search_settable_param( instrument: InstrumentBase, nested_parameter_name: str ) -> Parameter: """ Searches for a settable parameter of an instrument when it is in a nested hierarchical form such as instrument.submodule_1.channel_1.parameter Parameters ---------- instrument: The root QCoDeS instrument where the parameter resides. nested_parameter_name: Hierarchical nested parameter name. Returns ------- Parameter: """ root_param = instrument split_params = nested_parameter_name.split(".") # Search for the parameter within the parameter, function # or submodule delegate_attrs_dict of the instrument for child_parameter_name in split_params: root_attr_dicts_list = [ root_param.parameters, root_param.submodules, root_param.functions, ] for root_attr_dict in root_attr_dicts_list: if child_parameter_name in root_attr_dict: root_param = root_attr_dict.get(child_parameter_name) if callable(child_parameter_name): root_param = child_parameter_name if not (isinstance(root_param, Parameter) or callable(root_param)): raise ValueError( f"Could not find settable parameter " f'"{nested_parameter_name}" in instrument "{instrument}"' ) return root_param
[docs]def lazy_set(instrument: InstrumentBase, parameter_name: str, val: Any) -> None: """ Sets the value of a QCoDeS parameter only if it is different from the value in cache. Parameters ---------- instrument: The QCoDeS instrument to set the parameter on. parameter_name: Name of the parameter to set. val: Value to set it to. If the value is `None` this always gets set, due to it being the same as the initial value of the cache. """ parameter = search_settable_param( instrument=instrument, nested_parameter_name=parameter_name ) if parameter.cache() != val or val is None: parameter.set(val) else: logger.info( f"Lazy set skipped setting parameter {instrument.name}.{parameter_name}" )