Source code for quantify_scheduler.schedules.spectroscopy_schedules

# Repository: https://gitlab.com/quantify-os/quantify-scheduler
# Licensed according to the LICENCE file on the main branch
"""
Module containing schedules for common spectroscopy experiments.
"""
from __future__ import annotations

from typing import Optional

from quantify_scheduler.schedules.schedule import Schedule
from quantify_scheduler.operations.acquisition_library import SSBIntegrationComplex
from quantify_scheduler.operations.pulse_library import IdlePulse, SquarePulse
from quantify_scheduler.operations.gate_library import Reset, Measure
from quantify_scheduler.operations.nv_native_library import ChargeReset, CRCount
from quantify_scheduler.operations.shared_native_library import SpectroscopyOperation
from quantify_scheduler.resources import ClockResource


# pylint: disable=too-many-arguments
[docs]def heterodyne_spec_sched( pulse_amp: float, pulse_duration: float, frequency: float, acquisition_delay: float, integration_time: float, port: str, clock: str, init_duration: float = 10e-6, repetitions: int = 1, port_out: Optional[str] = None, ) -> Schedule: """ Generate a schedule for performing heterodyne spectroscopy. Parameters ---------- pulse_amp amplitude of the spectroscopy pulse in Volt. pulse_duration duration of the spectroscopy pulse in seconds. frequency frequency of the spectroscopy pulse and of the data acquisition in Hertz. acquisition_delay start of the data acquisition with respect to the start of the spectroscopy pulse in seconds. integration_time integration time of the data acquisition in seconds. port Location on the device where the acquisition is performed. clock reference clock used to track the spectroscopy frequency. init_duration : The relaxation time or dead time. repetitions The amount of times the Schedule will be repeated. port_out: Output port on the device where the pulse should be applied. If `None`, then use the same as `port`. """ sched = Schedule("Heterodyne spectroscopy", repetitions) sched.add_resource(ClockResource(name=clock, freq=frequency)) sched.add(IdlePulse(duration=init_duration), label="buffer") if port_out is None: port_out = port pulse = sched.add( SquarePulse( duration=pulse_duration, amp=pulse_amp, port=port_out, clock=clock, ), label="spec_pulse", ) sched.add( SSBIntegrationComplex( duration=integration_time, port=port, clock=clock, acq_index=0, acq_channel=0, ), ref_op=pulse, ref_pt="start", rel_time=acquisition_delay, label="acquisition", ) return sched
# pylint: disable=too-many-arguments # pylint: disable=too-many-locals
[docs]def two_tone_spec_sched( spec_pulse_amp: float, spec_pulse_duration: float, spec_pulse_frequency: float, spec_pulse_port: str, spec_pulse_clock: str, ro_pulse_amp: float, ro_pulse_duration: float, ro_pulse_delay: float, ro_pulse_port: str, ro_pulse_clock: str, ro_pulse_frequency: float, ro_acquisition_delay: float, ro_integration_time: float, init_duration: float = 10e-6, repetitions: int = 1, ) -> Schedule: """ Generate a schedule for performing two-tone spectroscopy. Parameters ---------- spec_pulse_amp amplitude of the spectroscopy pulse in Volt. spec_pulse_duration duration of the spectroscopy pulse in seconds. spec_pulse_frequency frequency of the spectroscopy pulse in Hertz. spec_pulse_port location on the device where the spectroscopy pulse should be applied. spec_pulse_clock reference clock used to track the spectroscopy frequency. ro_pulse_amp amplitude of the readout (spectroscopy) pulse in Volt. ro_pulse_duration duration of the readout (spectroscopy) pulse in seconds. ro_pulse_delay time between the end of the spectroscopy pulse and the start of the readout (spectroscopy) pulse. ro_pulse_port location on the device where the readout (spectroscopy) pulse should be applied. ro_pulse_clock reference clock used to track the readout (spectroscopy) frequency. ro_pulse_frequency frequency of the spectroscopy pulse and of the data acquisition in Hertz. ro_acquisition_delay start of the data acquisition with respect to the start of the spectroscopy pulse in seconds. ro_integration_time integration time of the data acquisition in seconds. init_duration : The relaxation time or dead time. repetitions The amount of times the Schedule will be repeated. """ sched = Schedule("Pulsed spectroscopy", repetitions) sched.add_resource(ClockResource(name=spec_pulse_clock, freq=spec_pulse_frequency)) sched.add_resource(ClockResource(name=ro_pulse_clock, freq=ro_pulse_frequency)) sched.add( IdlePulse(duration=init_duration), label="buffer", ) sched.add( SquarePulse( duration=spec_pulse_duration, amp=spec_pulse_amp, port=spec_pulse_port, clock=spec_pulse_clock, ), label="spec_pulse", ) ro_pulse = sched.add( SquarePulse( duration=ro_pulse_duration, amp=ro_pulse_amp, port=ro_pulse_port, clock=ro_pulse_clock, ), label="readout_pulse", rel_time=ro_pulse_delay, ) sched.add( SSBIntegrationComplex( duration=ro_integration_time, port=ro_pulse_port, clock=ro_pulse_clock, acq_index=0, acq_channel=0, ), ref_op=ro_pulse, ref_pt="start", rel_time=ro_acquisition_delay, label="acquisition", ) return sched
[docs]def nv_dark_esr_sched( qubit: str, repetitions: int = 1, ) -> Schedule: """Generates a schedule for a dark ESR experiment on an NV-center. The spectroscopy frequency is taken from the device element. Please use the clock specified in the "spectroscopy_operation" entry of the device config. This schedule can currently not be compiled with the Zurich Instruments backend. Parameters ---------- qubit Name of the 'DeviceElement' representing the NV-center. repetitions, optional Number of schedule repetitions. Returns ------- Schedule with a single frequency """ sched = Schedule("Dark ESR Schedule", repetitions=repetitions) sched.add(ChargeReset(qubit), label="Charge reset") sched.add(CRCount(qubit, acq_index=0), label="CRCount pre") sched.add(Reset(qubit), label="Reset") sched.add(SpectroscopyOperation(qubit), label="Spectroscopy") sched.add(Measure(qubit, acq_index=1), label="Measure") sched.add(CRCount(qubit, acq_index=2), label="CRCount post") return sched