import tempfile
from pathlib import Path
import numpy as np
from qcodes.dataset import Measurement
from qcodes.instrument import Instrument
from qcodes.validators import Arrays, Numbers
from qcodes.dataset import initialise_or_create_database_at, load_or_create_experiment
from qcodes.parameters import Parameter, ParameterWithSetpoints
class GeneratedSetPoints(Parameter):
"""
A parameter that generates a setpoint array from start, stop and num points
parameters.
"""
def __init__(self, startparam, stopparam, numpointsparam, *args, **kwargs):
super().__init__(*args, **kwargs)
self._startparam = startparam
self._stopparam = stopparam
self._numpointsparam = numpointsparam
def get_raw(self):
return np.linspace(
self._startparam(), self._stopparam(), self._numpointsparam()
)
class DummyArray(ParameterWithSetpoints):
def get_raw(self):
npoints = self.root_instrument.n_points.get_latest()
return np.random.default_rng().random(npoints)
class DummySpectrumAnalyzer(Instrument):
def __init__(self, name, **kwargs):
super().__init__(name, **kwargs)
self.add_parameter(
"f_start",
initial_value=0,
unit="Hz",
label="f start",
vals=Numbers(0, 1e3),
get_cmd=None,
set_cmd=None,
)
self.add_parameter(
"f_stop",
unit="Hz",
label="f stop",
vals=Numbers(1, 1e3),
get_cmd=None,
set_cmd=None,
)
self.add_parameter(
"n_points",
unit="",
initial_value=10,
vals=Numbers(1, 1e3),
get_cmd=None,
set_cmd=None,
)
self.add_parameter(
"freq_axis",
unit="Hz",
label="Freq Axis",
parameter_class=GeneratedSetPoints,
startparam=self.f_start,
stopparam=self.f_stop,
numpointsparam=self.n_points,
vals=Arrays(shape=(self.n_points.get_latest,)),
)
self.add_parameter(
"spectrum",
unit="dBm",
setpoints=(self.freq_axis,),
label="Spectrum",
parameter_class=DummyArray,
vals=Arrays(shape=(self.n_points.get_latest,)),
)
tutorial_db_path = Path(tempfile.mkdtemp(), "tutorial_paramter_with_setpoints.db")
initialise_or_create_database_at(tutorial_db_path)
load_or_create_experiment(
experiment_name="tutorial_ParameterWithSetpoints", sample_name="no sample"
)
Take the example notebook for
ParameterWithSetpoints.MWE setup code
Add a parameter that depends on, say,
f_stop, and sweepf_stopduring the measurement:The export to xarray fails:
The dataset should be easy to map to an xarray dataset though:
xr dataset init
I believe this used to work, but does not anymore on QCoDeS @ main. I suspect it's because
get_parameter_data()broadcasts the coordinates forspectruminstead of leaving them 1d.