Cryoscope experiment¶
In this section we show how to run a cryoscope experiment using Qibocal.
The goal of the Cryoscope experiment is to reconstruct the shape of the flux pulse sent to the qubit in order to determine correction for signal distortions. To do this we exploit the dependence of the transition frequency of a transmon qubit on the magnetic flux
where \(E_C\) is the charging energy, \(E_J\) is the sum of the Jospehson energies and \(\Phi_0\) is the flux quantum. The routine implementation follows the description given in [26]:
Cryoscope¶
The cryoscope experiment consists of a Ramsey-like experiment where a flux pulse is embedded between the two \(\pi/2\) pulses separated by a fixed time interval \(T\). The first \(\pi /2\) rotation around the \(Y\) axis change the qubit state from \(\ket{0}\) to \(\frac{\ket{0}+\ket{1}}{\sqrt{2}}\); then the flux pulse transforms the qubit state to \(\frac{\ket{0}+e^{i\phi_\tau}\ket{1}}{\sqrt{2}}\) where
Then the experiment is completed with a \(\pi/2\) rotation either around the \(y\) axis or around the \(x\) axis in order to obtain, respectively the \(\langle Y \rangle\) or \(\langle X \rangle\) component of the Bloch vector. From the \(\langle X \rangle\) and \(\langle Y \rangle\) components of the Bloch vector we can derive the relative phase \(\phi_\tau\) which in turn can be used to computed
and then we can extract an estimate of the effective flux pulse \(\Phi_Q(t)\) on the qubit by inverting (1).
Parameters¶
- class qibocal.protocols.flux_dependence.cryoscope.CryoscopeParameters(duration_max: float, flux_pulse_amplitude: float, fir: int, iir: bool, use_existing_filter: bool = False, padding_duration: float = 0)[source]
Cryoscope user inputs.
- duration_max: float
Maximum flux pulse duration [ns].
- flux_pulse_amplitude: float
Flux pulse amplitude.
- fir: int
Total number of feedforward taps, including the one used to enforce that the DC gain is 1.0.
- iir: bool
Whether an IIR filter should be determined. If False only an FIR filter is determined.
- use_existing_filter: bool = False
Whether the existing filters stored in the platform should be applied to the flux pulse during the acquisition.
If False (default) the filters stored in the platform (parameters.json) are removed for the duration of the acquisition, so that the flux pulse is acquired without predistortion and new filters are determined and stored by this protocol.
If True the filters are applied to the flux pulse, as in any other experiment, and their effect is assessed from the reconstructed waveform. New filters are therefore not determined and the platform is not updated.
- padding_duration: float = 0
Duration in ns of the leading zeros in the flux pulse.
Padding is fixed during the duration sweep and added before the pulse. The waveform consists of padding_duration ns of zeros followed by duration ns of rectangular samples, for a total length of padding_duration + duration.
Useful when hardware enforces a minimum pulse length.
- nshots: int
Number of executions on hardware.
- relaxation_time: float
Wait time for the qubit to decohere back to the ground state.
Example¶
A possible runcard to launch a Cryoscope experiment could be the following:
- id: cryoscope
operation: cryoscope
parameters:
duration_max: 80
flux_pulse_amplitude: 0.7
fir: 32
iir: true
relaxation_time: 50000
The expected output is the following:
Note
The flux pulse duration is swept one sample at a time, from a single sample up to
duration_max. Set iir: false to determine only an FIR filter. On instruments
that enforce a minimum pulse duration (e.g. Qblox), use padding_duration to
prepend leading zeros to the flux pulse, so that also flux pulses below that limit can
be executed.
The protocol computes the FIR and IIR filters and stores them on the platform,
overwriting any existing filters. Set use_existing_filter: true to instead apply
the filters already stored in the platform and assess their effect, without
determining new filters.