Source code for attune._tune_test

"""Methods for processing OPA 800 tuning data."""


import numpy as np

import WrightTools as wt

from ._discrete_tune import DiscreteTune
from ._instrument import Instrument
from ._transition import Transition
from ._plot import plot_tune_test
from ._common import save
from ._map import map_ind_points

__all__ = ["tune_test"]


def _offsets(data, channel_name, tune_points, *, spline=True, **spline_kwargs):
    data.moment(axis=1, channel=channel_name, moment=1, resultant=data.axes[0].shape)
    offsets = data[f"{channel_name}_1_moment_1"].points

    if spline:
        return wt.kit.Spline(data.axes[0].points, offsets, **spline_kwargs)
    if np.allclose(data.axes[0].points, tune_points):
        return offsets.clip(data.axes[1].min(), data.axes[1].max())
    if np.allclose(data.axes[0].points, tune_points[::-1]):
        return offsets.clip(data.axes[1].min(), data.axes[1].max())[::-1]
    else:
        raise ValueError("Data points and instrument points do not match, and splining disabled")


[docs] def tune_test( *, data, channel, arrangement, instrument, level=False, gtol=0.01, ltol=0.1, restore_setpoints=True, autosave=True, save_directory=None, **spline_kwargs, ) -> Instrument: """Workup a Tune Test. Parameters ---------- data : wt.data.Data should be in (setpoint, dependent) channel: wt.data.Channel or int or str channel to process arrangement: str name of the arrangment to modify instrument: attune.Instrument instrument object to modify level: bool, optional toggle leveling data (Defalts to False) gtol: float, optional global tolerance for rejecting noise level relative to global maximum ltol: float, optional local tolerance for rejecting data relative to slice maximum restore_setpoints: bool, optional toggles remapping onto original setpoints for each tune (default is True) autosave: bool, optional toggles saving of instrument file and images (Defaults to True) save_directory: Path-like where to save (Defaults to current working directory) **spline_kwargs: optional extra arguments to pass to spline creation (e.g. s=0, k=1 for linear interpolation) Returns ------- attune.Instrument New instrument object. Example ------- ``` >>> d = wt.open(path_to_data_file) >>> d.transform("w3_points", "wm-w3") >>> instr2 = attune.tune_test( data=d, channel="sample", arrangement="df1", instrument=instr, gtol=.0002, ltol=.01, autosave=False, save_directory=folder ) ``` """ metadata = { "channel": channel, "arrangement": arrangement, "level": level, "gtol": gtol, "ltol": ltol, "spline_kwargs": spline_kwargs, } if not isinstance(channel, (int, str)): metadata["channel"] = channel.natural_name transition = Transition("tune_test", instrument, metadata=metadata, data=data) data = data.copy() data.convert("nm") setpoints = data.axes[0].points setpoints.sort() if isinstance(channel, (int, str)): channel = data.channels[wt.kit.get_index(data.channel_names, channel)] orig_channel = data.create_channel( f"{channel.natural_name}_orig", channel, units=channel.units ) # TODO: check if level does what we want if level: data.level(channel.natural_name, 0, -3) # TODO: gtol/ltol should maybe be moved to wt cutoff = channel.max() * gtol channel.clip(min=cutoff) max_axis = tuple(i for i, v in enumerate(data.axes[0].shape) if v > 1) cutoff = np.nanmax(channel[:], axis=1, keepdims=True) * ltol channel.clip(min=cutoff) offset_spline = _offsets(data, channel.natural_name, setpoints, **spline_kwargs) try: raw_offsets = _offsets(data, channel.natural_name, setpoints, spline=False) except ValueError: raw_offsets = None old_instrument = instrument.as_dict() for tune in old_instrument["arrangements"][arrangement]["tunes"].values(): if "ranges" in tune: # Discrete tune in dict form continue tune["independent"] += offset_spline(tune["independent"]) new_instrument = Instrument(**old_instrument) if restore_setpoints: for tune in new_instrument[arrangement].keys(): if isinstance(instrument[arrangement][tune], DiscreteTune): continue new_instrument = map_ind_points( new_instrument, arrangement, tune, instrument[arrangement][tune].independent ) new_instrument._transition = transition fig, _ = plot_tune_test( data, channel.natural_name, used_offsets=offset_spline(setpoints), raw_offsets=raw_offsets, ) if autosave: save(new_instrument, fig, "tune_test", save_directory) return new_instrument