Measurement Control#

We first prepare some utilities necessarily for the examples.

from pathlib import Path

import matplotlib.pyplot as plt
import numpy as np
import xarray as xr
from qcodes import ManualParameter, Parameter

import quantify_core.data.handling as dh
from quantify_core.measurement import MeasurementControl

dh.set_datadir(Path.home() / "quantify-data")
meas_ctrl = MeasurementControl("meas_ctrl")

par0 = ManualParameter(name="x0", label="X0", unit="s")
par1 = ManualParameter(name="x1", label="X1", unit="s")
par2 = ManualParameter(name="x2", label="X2", unit="s")
par3 = ManualParameter(name="x3", label="X3", unit="s")
sig = Parameter(name="sig", label="Signal", unit="V", get_cmd=lambda: np.exp(par0()))

Comparing iterative and batched execution loop#

Iterative settables only#

par0.batched = False
par1.batched = False
par2.batched = False

sig.batched = False

meas_ctrl.settables([par0, par1, par2])
meas_ctrl.setpoints_grid(
    [
        np.linspace(0, 1, 4),
        np.linspace(1, 2, 5),
        np.linspace(2, 3, 6),
    ]
)
meas_ctrl.gettables(sig)
dset = meas_ctrl.run("demo")
list(xr.plot.line(xi, label=name) for name, xi in dset.coords.items())
plt.gca().legend()
Starting iterative measurement...
<matplotlib.legend.Legend at 0x787dba78fb80>
../_images/301a14280722190391e86e4339c7c0cb89a17ad75ac75e2e22ea1ea43143bbec.png

Batched settables only#

Note that the settable with lowest .batch_size will be correspond to the innermost loop.

par0.batched = True
par1.batch_size = 8
par1.batched = True
par1.batch_size = 8
par2.batched = True
par2.batch_size = 4

sig = Parameter(name="sig", label="Signal", unit="V", get_cmd=lambda: np.exp(par2()))
sig.batched = True
sig.batch_size = 32

meas_ctrl.settables([par0, par1, par2])
meas_ctrl.setpoints_grid(
    [
        np.linspace(0, 1, 3),
        np.linspace(1, 2, 5),
        np.linspace(2, 3, 4),
    ]
)
meas_ctrl.gettables(sig)
dset = meas_ctrl.run("demo")
list(xr.plot.line(xi, label=name) for name, xi in dset.coords.items())
plt.gca().legend()
Starting batched measurement...
Iterative settable(s) [outer loop(s)]:
	 --- (None) --- 
Batched settable(s):
	 x0, x1, x2 
Batch size limit: 4
<matplotlib.legend.Legend at 0x787dd00707c0>
../_images/70005df2ca63f29bbd44389ee4a40403141b5eaec4687dab7d08d05311bf2f7e.png

Mixed batched and iterative settables#

Note that the settable with lowest .batch_size will be correspond to the innermost loop. Furthermore, the iterative settables will be the outermost loops.

par0.batched = False
par1.batched = True
par1.batch_size = 8
par2.batched = False
par3.batched = True
par3.batch_size = 4

sig = Parameter(name="sig", label="Signal", unit="V", get_cmd=lambda: np.exp(par3()))
sig.batched = True
sig.batch_size = 32

meas_ctrl.settables([par0, par1, par2, par3])
meas_ctrl.setpoints_grid(
    [
        np.linspace(0, 1, 3),
        np.linspace(1, 2, 5),
        np.linspace(2, 3, 4),
        np.linspace(3, 4, 6),
    ]
)
meas_ctrl.gettables(sig)
dset = meas_ctrl.run("demo")
list(xr.plot.line(xi, label=name) for name, xi in dset.coords.items())
plt.gca().legend()
Starting batched measurement...
Iterative settable(s) [outer loop(s)]:
	 x0, x2 
Batched settable(s):
	 x1, x3 
Batch size limit: 4
<matplotlib.legend.Legend at 0x787d90705af0>
../_images/c59ebb2b130c0af757222d59814b0a7311cdd145193a26b96dca6c019662ece9.png

Instrument Monitor#

You can instantiate an instrument monitor in the following way:

from quantify_core.measurement import MeasurementControl
from quantify_core.visualization import InstrumentMonitor

instrument_monitor = InstrumentMonitor("instrument_monitor")
# Set True if you want to query the instruments about each parameter
# before updating the window. Can be slow due to communication overhead.
instrument_monitor.update_snapshot(False)