importtempfilefrompathlibimportPathimportnumpyasnpfromqcodes.datasetimportMeasurementfromqcodes.instrumentimportInstrumentfromqcodes.validatorsimportArrays, Numbersfromqcodes.datasetimportinitialise_or_create_database_at, load_or_create_experimentfromqcodes.parametersimportParameter, ParameterWithSetpointsclassGeneratedSetPoints(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=startparamself._stopparam=stopparamself._numpointsparam=numpointsparamdefget_raw(self):
returnnp.linspace(
self._startparam(), self._stopparam(), self._numpointsparam()
)
classDummyArray(ParameterWithSetpoints):
defget_raw(self):
npoints=self.root_instrument.n_points.get_latest()
returnnp.random.default_rng().random(npoints)
classDummySpectrumAnalyzer(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.