Iterative measurements of ScheduleGettable with multiple acquisitions are not possible
Problem
MeasurementControl
fails when executing a schedule with more than one acquisition using the ScheduleGettable
. This happens only in iterative mode. However, doing the same measurement in batched mode with batch_size = 1 succeeds.
Possible Solution
I think the output-array evaluation of ScheduleGettable in iterative mode does not work as intended.
Minimal error reproducing example
import numpy as np
import os
from qcodes.instrument.parameter import ManualParameter
from quantify_core.data.handling import get_datadir, set_datadir
from quantify_core.measurement.control import MeasurementControl
from quantify_core.utilities import general
from quantify_scheduler.gettables import ScheduleGettable
from quantify_scheduler.schedules.schedule import Schedule
from quantify_scheduler.device_under_test.quantum_device import QuantumDevice
from quantify_scheduler.device_under_test.transmon_element import BasicTransmonElement
from quantify_scheduler.instrument_coordinator import InstrumentCoordinator
from quantify_scheduler.operations.gate_library import (Reset, Rxy, Measure)
from quantify_scheduler.operations.pulse_library import IdlePulse
set_datadir("data")
hw_conf = dict(
{
"backend": "quantify_scheduler.backends.qblox_backend.hardware_compile",
"qrm0": {
"instrument_type": "Pulsar_QRM",
"ref": "external",
"complex_output_0": {
"lo_name": "lo1",
"dc_mixer_offset_I": -0.054,
"dc_mixer_offset_Q": -0.034,
"portclock_configs": [
{
"mixer_amp_ratio": 0.9997,
"mixer_phase_error_deg": -4.0,
"port": "q0:res",
"clock": "q0.ro",
"interm_freq": None
},
{
"mixer_amp_ratio": 0.9997,
"mixer_phase_error_deg": -4.0,
"port": "q0:res",
"clock": "q0.multiplex",
"interm_freq": None
}
]
}
}
}
)
meas_ctrl = MeasurementControl("meas_ctrl")
instrument_coordinator = InstrumentCoordinator(name="instrument_coordinator")
q0 = BasicTransmonElement("q0")
quantum_device = QuantumDevice(name="quantum_device")
quantum_device.add_element(q0)
quantum_device.instr_measurement_control(meas_ctrl.name)
quantum_device.instr_instrument_coordinator(instrument_coordinator.name)
quantum_device.hardware_config.set(hw_conf)
q0.clock_freqs.readout.set(0)
def two_measurement_sched(sweep_param, qubit:str, repetitions: int = 128) -> Schedule:
sched = Schedule("two_meas_sched", repetitions = repetitions)
sched.add(Reset(qubit))
sched.add(IdlePulse(duration = sweep_param))
sched.add(Measure(qubit, acq_index = 0), label = f'meas_{0}')
sched.add(Measure(qubit, acq_index = 1), label = f'meas_{1}')
return sched
from qblox_instruments import (Pulsar, Cluster)
from qblox_instruments.types import (PulsarType, ClusterType)
from quantify_scheduler.instrument_coordinator.components.qblox import QRMComponent
qrm0 = Pulsar('qrm0', dummy_type = PulsarType.PULSAR_QRM)
instrument_coordinator.add_component(QRMComponent(qrm0))
spec_param = ManualParameter("sweep_param", initial_value=0, unit="s")
schedule_kwargs = {
"sweep_param": spec_param,
"qubit": "q0",
}
spec_gettable = ScheduleGettable(
quantum_device=quantum_device,
schedule_function=two_measurement_sched,
schedule_kwargs=schedule_kwargs,
real_imag=False,
)
params = np.arange(1e-6,2e-6,0.1e-6)
meas_ctrl.settables(spec_param)
meas_ctrl.setpoints(params)
meas_ctrl.gettables(spec_gettable)
label = f"Example measurement {quantum_device.name}"
dset = meas_ctrl.run(label)