import numpy as np
from qibolab import AcquisitionType, AveragingMode, ExecutionParameters
from qibolab.platform import Platform
from qibolab.pulses import PulseSequence
from qibolab.qubits import QubitId
from qibocal.auto.operation import Routine
from .t2_signal import T2SignalData, T2SignalParameters, _fit, _plot, _update
from .utils import CoherenceType
[docs]def _acquisition(
params: T2SignalParameters,
platform: Platform,
targets: list[QubitId],
) -> T2SignalData:
"""Data acquisition for Ramsey Experiment (detuned)."""
# create a sequence of pulses for the experiment
# RX90 - t - RX90 - MZ
ro_pulses = {}
RX90_pulses1 = {}
RX90_pulses2 = {}
sequence = PulseSequence()
for qubit in targets:
RX90_pulses1[qubit] = platform.create_RX90_pulse(qubit, start=0)
RX90_pulses2[qubit] = platform.create_RX90_pulse(
qubit,
start=RX90_pulses1[qubit].finish,
)
ro_pulses[qubit] = platform.create_qubit_readout_pulse(
qubit, start=RX90_pulses2[qubit].finish
)
sequence.add(RX90_pulses1[qubit])
sequence.add(RX90_pulses2[qubit])
sequence.add(ro_pulses[qubit])
# define the parameter to sweep and its range:
waits = np.arange(
# wait time between RX90 pulses
params.delay_between_pulses_start,
params.delay_between_pulses_end,
params.delay_between_pulses_step,
)
data = T2SignalData()
# sweep the parameter
for wait in waits:
for qubit in targets:
RX90_pulses2[qubit].start = RX90_pulses1[qubit].finish + wait
ro_pulses[qubit].start = RX90_pulses2[qubit].finish
# execute the pulse sequence
results = platform.execute_pulse_sequence(
sequence,
ExecutionParameters(
nshots=params.nshots,
relaxation_time=params.relaxation_time,
acquisition_type=AcquisitionType.INTEGRATION,
averaging_mode=AveragingMode.CYCLIC,
),
)
for qubit in targets:
result = results[ro_pulses[qubit].serial]
data.register_qubit(
CoherenceType,
(qubit),
dict(
wait=np.array([wait]),
signal=np.array([result.magnitude]),
phase=np.array([result.phase]),
),
)
return data
t2_sequences = Routine(_acquisition, _fit, _plot, _update)
"""T2 Routine object."""