Power sweep of resonator¶
Using lockin
mode we perform a 2D sweep of the amplitude and frequency of the drive to the
resonator.
This experiment is an extension of the previous chapter in this tutorial: Resonator spectroscopy. The full source code for this experiment is available at presto-measure/sweep_power.py. Here, we first run the experiment and fit the resonator response, then we explain the main parts of the code.
You can create a new experiment and run it on your Presto. Be sure to change the parameters of
SweepPower
to match your experiment and change presto_address
to match the IP address of your
Presto.
from sweep_power import SweepPower
import numpy as np
experiment = SweepPower(
freq_center=6e9,
freq_span=5e6,
df=100e3,
num_averages=100,
amp_arr=np.linspace(0.1, 1, 10),
output_port=1,
input_port=1,
)
presto_address = "192.168.88.65" # your Presto IP address
save_filename = experiment.run(presto_address)
Or you can also load older data:
experiment = SweepPower.load("data/sweep_power_20220211_183107.h5")
In either case, we analyze the data to get a nice plot:
experiment.analyze()
If resonator_tools is available, we perform a fit to extract resonance frequency and internal and external quality factors for a slice of the data at the selected drive amplitude.
Code explanation¶
Here we discuss the main part of the code inside the SweepPower
class: the measurement loop. The
full code is available at presto-measure/sweep_power.py. See also the previous
chapter of this tutorial for a more detailed breakdown of the code.
There are two nested for
loops. The outer loop updates the amplitude of the resonator drive by
setting it into the OutputGroup
. The inner loop updates the drive frequency by
reconfiguring the digital IQ mixers with Hardware.configure_mixer()
.
for jj, amp in enumerate(self.amp_arr):
og.set_amplitudes(amp)
lck.apply_settings()
for ii, freq in enumerate(self.freq_arr):
lck.hardware.configure_mixer(freq, in_ports=self.input_port, out_ports=self.output_port)
lck.apply_settings()
_d = lck.get_pixels(self.num_skip + self.num_averages, quiet=True)
data_i = _d[self.input_port][1][:, 0]
data_q = _d[self.input_port][2][:, 0]
data = data_i.real + 1j * data_q.real # using zero IF
self.resp_arr[jj, ii] = np.mean(data[-self.num_averages :])