Skip to content

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)