From 12ac036d63a4ac25f9784ef29baa63a4941b0eee Mon Sep 17 00:00:00 2001 From: Marco Gobbo Date: Wed, 3 Jul 2024 10:12:22 +0200 Subject: [PATCH 01/45] Add resonator utils to calibrate and fit data The goal is to implement Sebastian Probst's paper (https://doi.org/10.1063/1.4907935) using an algebraic method --- src/qibocal/protocols/resonator_utils.py | 290 +++++++++++++++++++++++ 1 file changed, 290 insertions(+) create mode 100644 src/qibocal/protocols/resonator_utils.py diff --git a/src/qibocal/protocols/resonator_utils.py b/src/qibocal/protocols/resonator_utils.py new file mode 100644 index 000000000..84cce4640 --- /dev/null +++ b/src/qibocal/protocols/resonator_utils.py @@ -0,0 +1,290 @@ +import numpy as np +from scipy.ndimage import gaussian_filter1d +from scipy.optimize import leastsq, newton + + +def resonator_fit( + frequencies: np.array, + resonance: float, + q_loaded: float, + q_coupling: float, + phi: float = 0.0, + amplitude: float = 1.0, + alpha: float = 0.0, + tau: float = 0.0, +): + return ( + amplitude + * np.exp(1j * alpha) + * np.exp(-2 * np.pi * 1j * frequencies * tau) + * ( + 1 + - ((q_loaded / (np.abs(q_coupling))) * np.exp(1j * phi)) + / (1 + 2j * q_loaded * (frequencies / resonance - 1)) + ) + ) + + +def get_cable_delay(frequencies: np.array, z: np.array, num_points: int = 10): + phases = np.unwrap(np.angle(z)) + + frequencies_selected = np.concatenate( + (frequencies[:num_points], frequencies[-num_points:]) + ) + phase_selected = np.concatenate((phases[:num_points], phases[-num_points:])) + + pvals = np.polyfit(frequencies_selected, phase_selected, 1) + + return pvals[0] / (-2 * np.pi) + + +def remove_cable_delay(frequencies: np.array, z: np.array, tau: float): + return z * np.exp(2j * np.pi * frequencies * tau) + + +def circle_fit(z: np.array): + z = z.deepcopy() + x_norm = 0.5 * (np.max(z.real) + np.min(z.real)) + y_norm = 0.5 * (np.max(z.imag) + np.min(z.imag)) + z -= x_norm + 1j * y_norm + + amplitude_norm = np.max(np.abs(z)) + z /= amplitude_norm + + x_i = z.real + x_i2 = x_i**2 + + y_i = z.imag + y_i2 = y_i**2 + + z_i = x_i2 + y_i2 + z_i2 = z_i**2 + + n = len(x_i) + + x_i_sum = np.sum(x_i) + y_i_sum = np.sum(y_i) + z_i_sum = np.sum(z_i) + x_i_y_i_sum = np.sum(x_i * y_i) + x_i_z_i_sum = np.sum(x_i * z_i) + y_i_z_i_sum = np.sum(y_i * z_i) + z_i2_sum = np.sum(z_i2) + x_i2_sum = np.sum(x_i2) + y_i2_sum = np.sum(y_i2) + + m_matrix = np.array( + [ + [z_i2_sum, x_i_z_i_sum, y_i_z_i_sum, z_i_sum], + [x_i_z_i_sum, x_i2_sum, x_i_y_i_sum, x_i_sum], + [y_i_z_i_sum, x_i_y_i_sum, y_i2_sum, y_i_sum], + [z_i_sum, x_i_sum, y_i_sum, n], + ] + ) + + a_0 = ( + ( + (m_matrix[2][0] * m_matrix[3][2] - m_matrix[2][2] * m_matrix[3][0]) + * m_matrix[1][1] + - m_matrix[1][2] * m_matrix[2][0] * m_matrix[3][1] + - m_matrix[1][0] * m_matrix[2][1] * m_matrix[3][2] + + m_matrix[1][0] * m_matrix[2][2] * m_matrix[3][1] + + m_matrix[1][2] * m_matrix[2][1] * m_matrix[3][0] + ) + * m_matrix[0][3] + + ( + m_matrix[0][2] * m_matrix[2][3] * m_matrix[3][0] + - m_matrix[0][2] * m_matrix[2][0] * m_matrix[3][3] + + m_matrix[0][0] * m_matrix[2][2] * m_matrix[3][3] + - m_matrix[0][0] * m_matrix[2][3] * m_matrix[3][2] + ) + * m_matrix[1][1] + + ( + m_matrix[0][1] * m_matrix[1][3] * m_matrix[3][0] + - m_matrix[0][1] * m_matrix[1][0] * m_matrix[3][3] + - m_matrix[0][0] * m_matrix[1][3] * m_matrix[3][1] + ) + * m_matrix[2][2] + + ( + -m_matrix[0][1] * m_matrix[1][2] * m_matrix[2][3] + - m_matrix[0][2] * m_matrix[1][3] * m_matrix[2][1] + ) + * m_matrix[3][0] + + ( + (m_matrix[2][3] * m_matrix[3][1] - m_matrix[2][1] * m_matrix[3][3]) + * m_matrix[1][2] + + m_matrix[2][1] * m_matrix[3][2] * m_matrix[1][3] + ) + * m_matrix[0][0] + + ( + m_matrix[1][0] * m_matrix[2][3] * m_matrix[3][2] + + m_matrix[2][0] + * (m_matrix[1][2] * m_matrix[3][3] - m_matrix[1][3] * m_matrix[3][2]) + ) + * m_matrix[0][1] + + ( + (m_matrix[2][1] * m_matrix[3][3] - m_matrix[2][3] * m_matrix[3][1]) + * m_matrix[1][0] + + m_matrix[1][3] * m_matrix[2][0] * m_matrix[3][1] + ) + * m_matrix[0][2] + ) + a_1 = ( + ( + (m_matrix[3][0] - 2.0 * m_matrix[2][2]) * m_matrix[1][1] + - m_matrix[1][0] * m_matrix[3][1] + + m_matrix[2][2] * m_matrix[3][0] + + 2.0 * m_matrix[1][2] * m_matrix[2][1] + - m_matrix[2][0] * m_matrix[3][2] + ) + * m_matrix[0][3] + + ( + 2.0 * m_matrix[2][0] * m_matrix[3][2] + - m_matrix[0][0] * m_matrix[3][3] + - 2.0 * m_matrix[2][2] * m_matrix[3][0] + + 2.0 * m_matrix[0][2] * m_matrix[2][3] + ) + * m_matrix[1][1] + + ( + -m_matrix[0][0] * m_matrix[3][3] + + 2.0 * m_matrix[0][1] * m_matrix[1][3] + + 2.0 * m_matrix[1][0] * m_matrix[3][1] + ) + * m_matrix[2][2] + + ( + -m_matrix[0][1] * m_matrix[1][3] + + 2.0 * m_matrix[1][2] * m_matrix[2][1] + - m_matrix[0][2] * m_matrix[2][3] + ) + * m_matrix[3][0] + + (m_matrix[1][3] * m_matrix[3][1] + m_matrix[2][3] * m_matrix[3][2]) + * m_matrix[0][0] + + (m_matrix[1][0] * m_matrix[3][3] - 2.0 * m_matrix[1][2] * m_matrix[2][3]) + * m_matrix[0][1] + + (m_matrix[2][0] * m_matrix[3][3] - 2.0 * m_matrix[1][3] * m_matrix[2][1]) + * m_matrix[0][2] + - 2.0 * m_matrix[1][2] * m_matrix[2][0] * m_matrix[3][1] + - 2.0 * m_matrix[1][0] * m_matrix[2][1] * m_matrix[3][2] + ) + a_2 = ( + (2.0 * m_matrix[1][1] - m_matrix[3][0] + 2.0 * m_matrix[2][2]) * m_matrix[0][3] + + (2.0 * m_matrix[3][0] - 4.0 * m_matrix[2][2]) * m_matrix[1][1] + - 2.0 * m_matrix[2][0] * m_matrix[3][2] + + 2.0 * m_matrix[2][2] * m_matrix[3][0] + + m_matrix[0][0] * m_matrix[3][3] + + 4.0 * m_matrix[1][2] * m_matrix[2][1] + - 2.0 * m_matrix[0][1] * m_matrix[1][3] + - 2.0 * m_matrix[1][0] * m_matrix[3][1] + - 2.0 * m_matrix[0][2] * m_matrix[2][3] + ) + a_3 = ( + -2.0 * m_matrix[3][0] + + 4.0 * m_matrix[1][1] + + 4.0 * m_matrix[2][2] + - 2.0 * m_matrix[0][3] + ) + a_4 = -4 + + def char_pol(x: np.array): + return a_0 + a_1 * x + a_2 * x**2 + a_3 * x**3 + a_4 * x**4 + + def d_char_pol(x: np.array): + return a_1 + 2 * a_2 * x + 3 * a_3 * x**2 + 4 * a_4 * x**3 + + eta = newton(char_pol, 0.0, fprime=d_char_pol) + + m_matrix[3][0] = m_matrix[3][0] + 2 * eta + m_matrix[0][3] = m_matrix[0][3] + 2 * eta + m_matrix[1][1] = m_matrix[1][1] - eta + m_matrix[2][2] = m_matrix[2][2] - eta + + _, s, vt = np.linalg.svd(m_matrix) + a_vec = vt[np.argmin(s), :] + + x_c = -a_vec[1] / (2.0 * a_vec[0]) + y_c = -a_vec[2] / (2.0 * a_vec[0]) + + r_0 = ( + 1.0 + / (2.0 * np.absolute(a_vec[0])) + * np.sqrt(a_vec[1] * a_vec[1] + a_vec[2] * a_vec[2] - 4.0 * a_vec[0] * a_vec[3]) + ) + + return ( + x_c * amplitude_norm + x_norm, + y_c * amplitude_norm + y_norm, + r_0 * amplitude_norm, + ) + + +def phase_fit(frequencies: np.array, z: np.array): + phase = np.unwrap(np.angle(z)) + + # For centered circle roll-off should be close to 2pi. If not warn user. + if np.max(phase) - np.min(phase) <= 0.8 * 2 * np.pi: + roll_off = np.max(phase) - np.min(phase) + else: + roll_off = 2 * np.pi + # Use maximum of derivative of phase as guess for fr + phase_smooth = gaussian_filter1d(phase, 30) + phase_derivative = np.gradient(phase_smooth) + resonance_guess = frequencies[np.argmax(np.abs(phase_derivative))] + q_loaded_guess = 2 * resonance_guess / (frequencies[-1] - frequencies[0]) + slope = phase[-1] - phase[0] + roll_off + tau_guess = -slope / (2 * np.pi * (frequencies[-1] - frequencies[0])) + theta_guess = 0.5 * (np.mean(phase[:5]) + np.mean(phase[-5:])) + + # Fit model with less parameters first to improve stability of fit + def residuals_q_loaded(params): + q_loaded = params + return residuals_full((resonance_guess, q_loaded, theta_guess, tau_guess)) + + def residuals_resonance_theta(params): + resonance, theta = params + return residuals_full((resonance, q_loaded_guess, theta, tau_guess)) + + def residuals_tau(params): + tau = params + return residuals_full((resonance_guess, q_loaded_guess, theta_guess, tau)) + + def residuals_resonance_q_loaded(params): + resonance, q_loaded = params + return residuals_full((resonance, q_loaded, theta_guess, tau_guess)) + + def residuals_full(params): + return phase_dist(phase - phase_centered(frequencies, *params)) + + p_final = leastsq(residuals_q_loaded, [q_loaded_guess]) + q_loaded_guess = p_final[0] + p_final = leastsq(residuals_resonance_theta, [resonance_guess, theta_guess]) + resonance_guess, theta_guess = p_final[0] + p_final = leastsq(residuals_tau, [tau_guess]) + tau_guess = p_final[0] + p_final = leastsq(residuals_resonance_q_loaded, [resonance_guess, q_loaded_guess]) + resonance_guess, q_loaded_guess = p_final[0] + p_final = leastsq( + residuals_full, [resonance_guess, q_loaded_guess, theta_guess, tau_guess] + ) + + return p_final[0] + + +def phase_dist(phase: np.array): + return np.pi - np.abs(np.pi - np.abs(phase)) + + +def phase_centered( + frequencies: np.array, + resonance: float, + q_loaded: float, + theta: float, + tau: float = 0.0, +): + return ( + theta + - 2 * np.pi * tau * (frequencies - resonance) + + 2.0 * np.arctan(2.0 * q_loaded * (1.0 - frequencies / resonance)) + ) + + +def periodic_boundary(angle: np.array): + return (angle + np.pi) % (2 * np.pi) - np.pi From 8dbfa3c8977e53405f83507c6f11824df70d7c2b Mon Sep 17 00:00:00 2001 From: Marco Gobbo Date: Wed, 3 Jul 2024 17:29:21 +0200 Subject: [PATCH 02/45] Update resonator functions, add docstrings --- src/qibocal/protocols/resonator_utils.py | 150 +++++++++++++++++------ 1 file changed, 110 insertions(+), 40 deletions(-) diff --git a/src/qibocal/protocols/resonator_utils.py b/src/qibocal/protocols/resonator_utils.py index 84cce4640..be6738891 100644 --- a/src/qibocal/protocols/resonator_utils.py +++ b/src/qibocal/protocols/resonator_utils.py @@ -1,31 +1,23 @@ import numpy as np +from numpy.typing import NDArray from scipy.ndimage import gaussian_filter1d from scipy.optimize import leastsq, newton -def resonator_fit( - frequencies: np.array, - resonance: float, - q_loaded: float, - q_coupling: float, - phi: float = 0.0, - amplitude: float = 1.0, - alpha: float = 0.0, - tau: float = 0.0, -): - return ( - amplitude - * np.exp(1j * alpha) - * np.exp(-2 * np.pi * 1j * frequencies * tau) - * ( - 1 - - ((q_loaded / (np.abs(q_coupling))) * np.exp(1j * phi)) - / (1 + 2j * q_loaded * (frequencies / resonance - 1)) - ) - ) +def get_cable_delay(frequencies: NDArray, z: NDArray, num_points: int = 10) -> float: + """ + Evaluates the cable delay τ caused by the length of the cable and the finite speed of light. + Performs a first-grade polynomial fit of the phase and extracts the angular coefficient. + Args: + frequencies (NDArray[float]): frequencies (Hz) at which the measurement was taken. + z (NDArray[complex]): S21 scattering matrix element. + num_points (int): number of points selected from both the start and the end of the + frequencies array to perform the linear fit. -def get_cable_delay(frequencies: np.array, z: np.array, num_points: int = 10): + Returns: + The value (float) of the cable delay τ in seconds. + """ phases = np.unwrap(np.angle(z)) frequencies_selected = np.concatenate( @@ -38,12 +30,34 @@ def get_cable_delay(frequencies: np.array, z: np.array, num_points: int = 10): return pvals[0] / (-2 * np.pi) -def remove_cable_delay(frequencies: np.array, z: np.array, tau: float): +def remove_cable_delay(frequencies: NDArray, z: NDArray, tau: float) -> NDArray: + """ + Corrects the S21 scattering matrix element array from the cable delay. + + Args: + frequencies (NDArray[float]): frequencies (Hz) at which the measurement was taken. + z (NDArray[complex]): S21 scattering matrix element. + tau (float): the cable delay τ in seconds. + Returns: + The corrected S21 scattering matrix element (NDArray[complex]). + """ return z * np.exp(2j * np.pi * frequencies * tau) -def circle_fit(z: np.array): - z = z.deepcopy() +def circle_fit(z: NDArray) -> tuple[float, float, float]: + """ + Fits the circle of an S21 scattering matrix element array using the algebraic fit described in + "Efficient and robust analysis of complex scattering data under noise in microwave resonators" + (https://doi.org/10.1063/1.4907935) by Sebastian Probst. + + Args: + z (NDArray[complex]): S21 scattering matrix element. + tau (float): the cable delay τ in seconds + Returns: + (tuple[float, float, float]): the (x,y) coordinates of the circle's center and + the radius of the circle. + """ + z = z.copy() x_norm = 0.5 * (np.max(z.real) + np.min(z.real)) y_norm = 0.5 * (np.max(z.imag) + np.min(z.imag)) z -= x_norm + 1j * y_norm @@ -184,13 +198,30 @@ def circle_fit(z: np.array): ) a_4 = -4 - def char_pol(x: np.array): + def pol_func(x: float) -> float: + """ + Polynomio for find a root of a real or complex function using the Newton-Raphson method. + + Args: + x (float): independent variable. + Returns: + Evaluated polynomial (float). + """ return a_0 + a_1 * x + a_2 * x**2 + a_3 * x**3 + a_4 * x**4 - def d_char_pol(x: np.array): + def der_pol_func(x: float) -> float: + """ + Derivative of the polynomio for find a root of a real or complex function using the + Newton-Raphson method. + + Args: + x (float): independent variable. + Returns: + Evaluated derivative of the polynomial (float). + """ return a_1 + 2 * a_2 * x + 3 * a_3 * x**2 + 4 * a_4 * x**3 - eta = newton(char_pol, 0.0, fprime=d_char_pol) + eta = newton(pol_func, 0.0, fprime=der_pol_func) m_matrix[3][0] = m_matrix[3][0] + 2 * eta m_matrix[0][3] = m_matrix[0][3] + 2 * eta @@ -216,15 +247,25 @@ def d_char_pol(x: np.array): ) -def phase_fit(frequencies: np.array, z: np.array): +def phase_fit(frequencies: NDArray, z: NDArray) -> NDArray: + """ + Fits the phase response of a resonator. + + Args: + frequencies (NDArray[float]): frequencies (Hz) at which the measurement was taken. + z (NDArray[complex]): S21 scattering matrix element. + + Returns: + Resonance frequency, loaded quality factor, offset phase and time delay between output + and input signal leading to linearly frequency dependent phase shift (NDArray[float]). + """ phase = np.unwrap(np.angle(z)) - # For centered circle roll-off should be close to 2pi. If not warn user. if np.max(phase) - np.min(phase) <= 0.8 * 2 * np.pi: roll_off = np.max(phase) - np.min(phase) else: roll_off = 2 * np.pi - # Use maximum of derivative of phase as guess for fr + phase_smooth = gaussian_filter1d(phase, 30) phase_derivative = np.gradient(phase_smooth) resonance_guess = frequencies[np.argmax(np.abs(phase_derivative))] @@ -233,9 +274,8 @@ def phase_fit(frequencies: np.array, z: np.array): tau_guess = -slope / (2 * np.pi * (frequencies[-1] - frequencies[0])) theta_guess = 0.5 * (np.mean(phase[:5]) + np.mean(phase[-5:])) - # Fit model with less parameters first to improve stability of fit def residuals_q_loaded(params): - q_loaded = params + (q_loaded,) = params return residuals_full((resonance_guess, q_loaded, theta_guess, tau_guess)) def residuals_resonance_theta(params): @@ -243,7 +283,7 @@ def residuals_resonance_theta(params): return residuals_full((resonance, q_loaded_guess, theta, tau_guess)) def residuals_tau(params): - tau = params + (tau,) = params return residuals_full((resonance_guess, q_loaded_guess, theta_guess, tau)) def residuals_resonance_q_loaded(params): @@ -254,11 +294,11 @@ def residuals_full(params): return phase_dist(phase - phase_centered(frequencies, *params)) p_final = leastsq(residuals_q_loaded, [q_loaded_guess]) - q_loaded_guess = p_final[0] + (q_loaded_guess,) = p_final[0] p_final = leastsq(residuals_resonance_theta, [resonance_guess, theta_guess]) resonance_guess, theta_guess = p_final[0] p_final = leastsq(residuals_tau, [tau_guess]) - tau_guess = p_final[0] + (tau_guess,) = p_final[0] p_final = leastsq(residuals_resonance_q_loaded, [resonance_guess, q_loaded_guess]) resonance_guess, q_loaded_guess = p_final[0] p_final = leastsq( @@ -268,17 +308,39 @@ def residuals_full(params): return p_final[0] -def phase_dist(phase: np.array): - return np.pi - np.abs(np.pi - np.abs(phase)) +def phase_dist(angle: float) -> float: + """ + Maps angle [-2pi, 2pi] to phase distance on circle [0, pi]. + + Args: + angle (float): angle to be mapped. + Returns: + Mapped angle (float). + """ + return np.pi - np.abs(np.pi - np.abs(angle)) def phase_centered( - frequencies: np.array, + frequencies: NDArray, resonance: float, q_loaded: float, theta: float, tau: float = 0.0, -): +) -> NDArray: + """ + Evaluates the phase response of a resonator which corresponds to a circle centered around + the origin. Additionally, a linear background slope is accounted for if needed. + + Args: + frequencies (NDArray[float]): frequencies (Hz) at which the measurement was taken. + resonance (float): resonance frequency. + q_loaded (float): loaded quality factor. + theta (float): offset phase. + tau (float): time delay between output and input signal leading to linearly frequency + dependent phase shift. + Returns: + Phase centered array (NDArray[float]). + """ return ( theta - 2 * np.pi * tau * (frequencies - resonance) @@ -286,5 +348,13 @@ def phase_centered( ) -def periodic_boundary(angle: np.array): +def periodic_boundary(angle: float) -> float: + """ + Maps arbitrary angle to interval [-np.pi, np.pi). + + Args: + angle (float): angle to be mapped. + Returns: + Mapped angle (float). + """ return (angle + np.pi) % (2 * np.pi) - np.pi From d06f3db5699aba0ee52807097adcd2908d60752d Mon Sep 17 00:00:00 2001 From: Marco Gobbo Date: Wed, 3 Jul 2024 17:39:39 +0200 Subject: [PATCH 03/45] Refactor ndarray --- src/qibocal/protocols/utils.py | 25 ++++++++++++++++--------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/src/qibocal/protocols/utils.py b/src/qibocal/protocols/utils.py index 0584e4c21..5f8ec3831 100644 --- a/src/qibocal/protocols/utils.py +++ b/src/qibocal/protocols/utils.py @@ -3,17 +3,24 @@ from typing import Union import numpy as np -import numpy.typing as npt import pandas as pd import plotly.graph_objects as go +from numpy.typing import NDArray from plotly.subplots import make_subplots -from qibolab.qubits import QubitId from scipy import constants from scipy.optimize import curve_fit from qibocal.auto.operation import Data, Results from qibocal.config import log from qibocal.fitting.classifier import run +from qibocal.protocols.resonator_utils import ( + circle_fit, + get_cable_delay, + periodic_boundary, + phase_fit, + remove_cable_delay, +) +from qibolab.qubits import QubitId GHZ_TO_HZ = 1e9 HZ_TO_GHZ = 1e-9 @@ -38,7 +45,7 @@ def effective_qubit_temperature( - prob_0: np.array, prob_1: np.array, qubit_frequency: float, nshots: int + prob_0: NDArray, prob_1: NDArray, qubit_frequency: float, nshots: int ): """Calculates the qubit effective temperature. @@ -47,8 +54,8 @@ def effective_qubit_temperature( kB Teff = - hbar qubit_freq / ln(prob_1/prob_0) Args: - prob_0 (np.array): population 0 samples - prob_1 (np.array): population 1 samples + prob_0 (NDArray): population 0 samples + prob_1 (NDArray): population 1 samples qubit_frequency(float): frequency of qubit nshots (int): number of shots Returns: @@ -431,9 +438,9 @@ def format_error_single_cell(measure: tuple): def chi2_reduced( - observed: npt.NDArray, - estimated: npt.NDArray, - errors: npt.NDArray, + observed: NDArray, + estimated: NDArray, + errors: NDArray, dof: float = None, ): if np.count_nonzero(errors) < len(errors): @@ -483,7 +490,7 @@ def significant_digit(number: float): def evaluate_grid( - data: npt.NDArray, + data: NDArray, ): """ This function returns a matrix grid evaluated from From aeacdf832f4a14b3b08ad21ecfe300fd7ec1194e Mon Sep 17 00:00:00 2001 From: Marco Gobbo Date: Wed, 3 Jul 2024 17:45:37 +0200 Subject: [PATCH 04/45] Add S21 fit function to calibrate data --- src/qibocal/protocols/utils.py | 87 +++++++++++++++++++++++++++++++++- 1 file changed, 86 insertions(+), 1 deletion(-) diff --git a/src/qibocal/protocols/utils.py b/src/qibocal/protocols/utils.py index 5f8ec3831..54fc50fb6 100644 --- a/src/qibocal/protocols/utils.py +++ b/src/qibocal/protocols/utils.py @@ -7,6 +7,7 @@ import plotly.graph_objects as go from numpy.typing import NDArray from plotly.subplots import make_subplots +from qibolab.qubits import QubitId from scipy import constants from scipy.optimize import curve_fit @@ -20,7 +21,6 @@ phase_fit, remove_cable_delay, ) -from qibolab.qubits import QubitId GHZ_TO_HZ = 1e9 HZ_TO_GHZ = 1e-9 @@ -164,6 +164,91 @@ def lorentzian_fit(data, resonator_type=None, fit=None): log.warning(f"Lorentzian fit not successful due to {e}") +def s21( + frequencies: NDArray, + resonance: float, + q_loaded: float, + q_coupling: float, + phi: float = 0.0, + amplitude: float = 1.0, + alpha: float = 0.0, + tau: float = 0.0, +) -> NDArray: + """ + Full model of the S21 notch resonator based on eq. (1) described in: + "Efficient and robust analysis of complex scattering data under noise in microwave resonators" + (https://doi.org/10.1063/1.4907935) by Sebastian Probst. + + The equation is split into two parts describing the ideal resonator and the environment. + + Args: + frequencies (NDArray[float]): frequencies (Hz) at which the measurement was taken. + resonance (float): resonance frequency (Hz). + q_loaded (float): loaded quality factor. + q_coupling (float): coupling quality factor. + phi (float): quantifies the impedance mismatch. + amplitude (float): accounts for additional attenuation/amplification present in the setup. + alpha (float): accounts for a additional phase shift. + tau (float): cable delay caused by the length of the cable and finite speed of light. + + Returns: + S21 resonance profile array (NDArray) of a notch resonator. + """ + return ( + amplitude + * np.exp(1j * alpha) + * np.exp(-2 * np.pi * 1j * frequencies * tau) + * ( + 1 + - ((q_loaded / (np.abs(q_coupling))) * np.exp(1j * phi)) + / (1 + 2j * q_loaded * (frequencies / resonance - 1)) + ) + ) + + +def s21_fit(data: NDArray, resonator_type=None, fit=None) -> tuple[float, list[float]]: + """ + Calibrates the S21 profile of a notch resonator, based on https://github.com/qkitgroup/qkit. + + Args: + data (NDArray[complex]): S21 scattering matrix element. + Returns: + Model parameters + + """ + f_data = data.freq + z_data = data.signal * np.exp(1j * data.phase) + + tau = get_cable_delay(f_data, z_data, 20) + z_1 = remove_cable_delay(f_data, z_data, tau) + + x_c, y_c, r_0 = circle_fit(z_1) + z_c = x_c + 1j * y_c + z_2 = z_1 - z_c + + resonance, q_loaded, theta, _ = phase_fit(f_data, z_2) + theta = periodic_boundary(theta) + beta = periodic_boundary(theta - np.pi) + off_resonant_point = z_c + r_0 * np.cos(beta) + 1j * r_0 * np.sin(beta) + + amplitude = np.abs(off_resonant_point) + alpha = np.angle(off_resonant_point) + phi = periodic_boundary(beta - alpha) + r_0_norm = r_0 / amplitude + q_coupling = q_loaded / (2 * r_0_norm) / np.cos(phi) + + model_parameters = [ + resonance, + q_loaded, + q_coupling, + phi, + amplitude, + alpha, + tau, + ] + return model_parameters[0], model_parameters + + def spectroscopy_plot(data, qubit, fit: Results = None): figures = [] fig = make_subplots( From 0d2adc9171676f7aaa334f6d20b5a5e9154fab4d Mon Sep 17 00:00:00 2001 From: Marco Gobbo Date: Wed, 3 Jul 2024 17:47:13 +0200 Subject: [PATCH 05/45] Add resonator_spectroscopy_plot function Add raw and calibrate plots fitted with the S21 profile of the notch resonator. --- src/qibocal/protocols/utils.py | 374 +++++++++++++++++++++++++++++++++ 1 file changed, 374 insertions(+) diff --git a/src/qibocal/protocols/utils.py b/src/qibocal/protocols/utils.py index 54fc50fb6..dda3bac04 100644 --- a/src/qibocal/protocols/utils.py +++ b/src/qibocal/protocols/utils.py @@ -408,6 +408,380 @@ def spectroscopy_plot(data, qubit, fit: Results = None): return figures, fitting_report +def resonator_spectroscopy_plot(data, qubit, fit: Results = None): + figures = [] + fig_raw = make_subplots( + rows=2, + cols=2, + horizontal_spacing=0.1, + vertical_spacing=0.1, + specs=[ + [{"rowspan": 2}, {}], + [None, {}], + ], + ) + qubit_data = data[qubit] + fitting_report = "" + frequencies = qubit_data.freq + signal = qubit_data.signal + phase = qubit_data.phase + s21_raw = np.abs(signal) * np.exp(1j * phase) + + fig_raw.add_trace( + go.Scatter( + x=np.real(s21_raw), + y=np.imag(s21_raw), + mode="markers", + marker=dict( + size=4, + ), + opacity=1, + name="S21", + showlegend=True, + legendgroup="S21", + ), + row=1, + col=1, + ) + + fig_raw.add_trace( + go.Scatter( + x=frequencies * HZ_TO_GHZ, + y=signal, + mode="markers", + marker=dict( + size=4, + ), + opacity=1, + name="Magnitude", + showlegend=True, + legendgroup="Magnitude", + ), + row=1, + col=2, + ) + + fig_raw.add_trace( + go.Scatter( + x=frequencies * HZ_TO_GHZ, + y=np.unwrap(phase), + mode="markers", + marker=dict( + size=4, + ), + opacity=1, + name="Phase", + showlegend=True, + legendgroup="Phase", + ), + row=2, + col=2, + ) + + show_error_bars = not np.isnan(qubit_data.error_signal).any() + + if show_error_bars: + errors_signal = qubit_data.error_signal + errors_phase = qubit_data.error_phase + fig_raw.add_trace( + go.Scatter( + x=np.concatenate((frequencies, frequencies[::-1])), + y=np.concatenate( + (signal + errors_signal, (signal - errors_signal)[::-1]) + ), + fill="toself", + fillcolor=COLORBAND, + line=dict(color=COLORBAND_LINE), + showlegend=True, + name="Signal Errors", + ), + row=1, + col=1, + ) + + fig_raw.add_trace( + go.Scatter( + x=np.concatenate((frequencies, frequencies[::-1])), + y=np.concatenate((phase + errors_phase), (phase - errors_phase[::-1])), + fill="toself", + fillcolor=COLORBAND, + line=dict(color=COLORBAND_LINE), + showlegend=True, + name="Phase Errors", + ), + row=1, + col=2, + ) + + freqrange = np.linspace( + min(frequencies), + max(frequencies), + 2 * len(frequencies), + ) + + if fit is not None: + params = fit.fitted_parameters[qubit] + s21_fitted = s21(freqrange, *params) + + fig_raw.add_trace( + go.Scatter( + x=np.real(s21_fitted), + y=np.imag(s21_fitted), + opacity=1, + name="S21 Fit", + line=go.scatter.Line(dash="solid"), + ), + row=1, + col=1, + ) + fig_raw.add_trace( + go.Scatter( + x=freqrange * HZ_TO_GHZ, + y=np.abs(s21_fitted), + name="Magnitude Fit", + line=go.scatter.Line(dash="solid"), + ), + row=1, + col=2, + ) + fig_raw.add_trace( + go.Scatter( + x=freqrange * HZ_TO_GHZ, + y=np.unwrap(np.angle(s21_fitted)), + name="Phase Fit", + line=go.scatter.Line(dash="solid"), + ), + row=2, + col=2, + ) + + if data.power_level is PowerLevel.low: + label = "Readout Frequency [Hz]" + freq = fit.frequency + elif data.power_level is PowerLevel.high: + label = "Bare Resonator Frequency [Hz]" + freq = fit.bare_frequency + else: + label = "Qubit Frequency [Hz]" + freq = fit.frequency + + if data.amplitudes[qubit] is not None: + if show_error_bars: + labels = [label, "Amplitude", "Chi2 Reduced"] + values = [ + ( + freq[qubit], + fit.error_fit_pars[qubit][1], + ), + (data.amplitudes[qubit], 0), + fit.chi2_reduced[qubit], + ] + else: + labels = [ + label, + "Loaded Quality Factor", + "Internal Quality Factor", + "Coupling Quality Factor", + "ϕ", + "Amplitude [a.u.]", + "Phase Shift α", + "Electronic Delay 𝜏", + ] + values = [ + freq[qubit], + params[1], + 1.0 / (1.0 / params[1] - 1.0 / params[2]), + params[2], + params[3], + params[4], + params[5], + params[6], + ] + + fitting_report = table_html( + table_dict( + qubit, + labels, + values, + display_error=show_error_bars, + ) + ) + s21_calibrated = ( + s21_raw + / params[4] + * np.exp(1j * (-params[5] + 2.0 * np.pi * params[6] * frequencies)) + ) + fig_calibrated = make_subplots( + rows=2, + cols=2, + horizontal_spacing=0.1, + vertical_spacing=0.1, + specs=[ + [{"rowspan": 2}, {}], + [None, {}], + ], + ) + + fig_calibrated.add_trace( + go.Scatter( + x=np.real(s21_calibrated), + y=np.imag(s21_calibrated), + mode="markers", + marker=dict( + size=4, + ), + opacity=1, + name="S21", + showlegend=True, + legendgroup="S21", + ), + row=1, + col=1, + ) + + fig_calibrated.add_trace( + go.Scatter( + x=frequencies * HZ_TO_GHZ, + y=np.abs(s21_calibrated), + mode="markers", + marker=dict( + size=4, + ), + opacity=1, + name="Magnitude", + showlegend=True, + legendgroup="Magnitude", + ), + row=1, + col=2, + ) + + fig_calibrated.add_trace( + go.Scatter( + x=frequencies * HZ_TO_GHZ, + y=np.unwrap(np.angle(s21_calibrated)), + mode="markers", + marker=dict( + size=4, + ), + opacity=1, + name="Phase", + showlegend=True, + legendgroup="Phase", + ), + row=2, + col=2, + ) + + show_error_bars = not np.isnan(qubit_data.error_signal).any() + + if show_error_bars: + errors_signal = qubit_data.error_signal + errors_phase = qubit_data.error_phase + fig_calibrated.add_trace( + go.Scatter( + x=np.concatenate((frequencies, frequencies[::-1])), + y=np.concatenate( + (signal + errors_signal, (signal - errors_signal)[::-1]) + ), + fill="toself", + fillcolor=COLORBAND, + line=dict(color=COLORBAND_LINE), + showlegend=True, + name="Signal Errors", + ), + row=1, + col=1, + ) + + fig_calibrated.add_trace( + go.Scatter( + x=np.concatenate((frequencies, frequencies[::-1])), + y=np.concatenate( + (phase + errors_phase), (phase - errors_phase[::-1]) + ), + fill="toself", + fillcolor=COLORBAND, + line=dict(color=COLORBAND_LINE), + showlegend=True, + name="Phase Errors", + ), + row=1, + col=2, + ) + + freqrange = np.linspace( + min(frequencies), + max(frequencies), + 2 * len(frequencies), + ) + s21_calibrated_fitted = s21( + freqrange, params[0], params[1], params[2], params[3] + ) + fig_calibrated.add_trace( + go.Scatter( + x=np.real(s21_calibrated_fitted), + y=np.imag(s21_calibrated_fitted), + opacity=1, + name="S21 Fit", + line=go.scatter.Line(dash="solid"), + ), + row=1, + col=1, + ) + fig_calibrated.add_trace( + go.Scatter( + x=freqrange * HZ_TO_GHZ, + y=np.abs(s21_calibrated_fitted), + name="Magnitude Fit", + line=go.scatter.Line(dash="solid"), + ), + row=1, + col=2, + ) + fig_calibrated.add_trace( + go.Scatter( + x=freqrange * HZ_TO_GHZ, + y=np.unwrap(np.angle(s21_calibrated_fitted)), + name="Phase Fit", + line=go.scatter.Line(dash="solid"), + ), + row=2, + col=2, + ) + + fig_calibrated.update_xaxes(scaleanchor="y", scaleratio=1, row=1, col=1) + fig_calibrated.update_yaxes(scaleanchor="x", scaleratio=1, row=1, col=1) + fig_calibrated.update_layout( + title="Calibrated data", + showlegend=True, + xaxis_title="Real [a.u.]", + yaxis_title="Imaginary [a.u.]", + xaxis2_title="", + yaxis2_title="Magnitude [a.u.]", + xaxis3_title="Frequency [GHz]", + yaxis3_title="Phase [rad]", + ) + figures.append(fig_calibrated) + + fig_raw.update_xaxes(scaleanchor="y", scaleratio=1, row=1, col=1) + fig_raw.update_yaxes(scaleanchor="x", scaleratio=1, row=1, col=1) + fig_raw.update_layout( + title="Raw data", + showlegend=True, + xaxis_title="Real [a.u.]", + yaxis_title="Imaginary [a.u.]", + xaxis2_title="", + yaxis2_title="Magnitude [a.u.]", + xaxis3_title="Frequency [GHz]", + yaxis3_title="Phase [rad]", + ) + figures.append(fig_raw) + figures.reverse() + + return figures, fitting_report + + def norm(x_mags): return (x_mags - np.min(x_mags)) / (np.max(x_mags) - np.min(x_mags)) From a0b38f4b7e7310255f15bb77a7b30daf7e534279 Mon Sep 17 00:00:00 2001 From: Marco Gobbo Date: Wed, 3 Jul 2024 17:49:53 +0200 Subject: [PATCH 06/45] Add fit_function to parameters of the runcard.yml User can choose if fit with a lorentzian profile or a calibrated S21 profile. --- src/qibocal/protocols/resonator_spectroscopy.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/qibocal/protocols/resonator_spectroscopy.py b/src/qibocal/protocols/resonator_spectroscopy.py index e728873e1..946db8f61 100644 --- a/src/qibocal/protocols/resonator_spectroscopy.py +++ b/src/qibocal/protocols/resonator_spectroscopy.py @@ -39,6 +39,8 @@ class ResonatorSpectroscopyParameters(Parameters): """Width for frequency sweep relative to the readout frequency [Hz].""" freq_step: int """Frequency step for sweep [Hz].""" + fit_function: str + """Fit function used for the resonance.""" power_level: Union[PowerLevel, str] """Power regime (low or high). If low the readout frequency will be updated. If high both the readout frequency and the bare resonator frequency will be updated.""" @@ -100,6 +102,8 @@ class ResonatorSpectroscopyData(Data): """Resonator type.""" amplitudes: dict[QubitId, float] """Amplitudes provided by the user.""" + fit_function: str + """Fit function used for the resonance.""" data: dict[QubitId, npt.NDArray[ResSpecType]] = field(default_factory=dict) """Raw data acquired.""" power_level: Optional[PowerLevel] = None @@ -163,6 +167,7 @@ def _acquisition( power_level=params.power_level, amplitudes=amplitudes, attenuations=attenuations, + fit_function=params.fit_function, ) results = platform.sweep( From f12ec5af4fff99c6390887e92eca3cf11d58e7a5 Mon Sep 17 00:00:00 2001 From: Marco Gobbo Date: Wed, 3 Jul 2024 17:51:18 +0200 Subject: [PATCH 07/45] Add S21 fit function --- .../protocols/resonator_spectroscopy.py | 68 +++++++++++-------- 1 file changed, 41 insertions(+), 27 deletions(-) diff --git a/src/qibocal/protocols/resonator_spectroscopy.py b/src/qibocal/protocols/resonator_spectroscopy.py index 946db8f61..0a16952bb 100644 --- a/src/qibocal/protocols/resonator_spectroscopy.py +++ b/src/qibocal/protocols/resonator_spectroscopy.py @@ -16,6 +16,8 @@ chi2_reduced, lorentzian, lorentzian_fit, + resonator_spectroscopy_plot, + s21_fit, spectroscopy_plot, ) @@ -207,25 +209,36 @@ def _fit( chi2 = {} amplitudes = {} for qubit in qubits: - fit_result = lorentzian_fit( - data[qubit], resonator_type=data.resonator_type, fit="resonator" - ) - - if fit_result is not None: - frequency[qubit], fitted_parameters[qubit], error_fit_pars[qubit] = ( - fit_result + if data.fit_function == "s21": + fit_result = s21_fit(data[qubit]) + + if fit_result is not None: + frequency[qubit], fitted_parameters[qubit] = fit_result + error_fit_pars[qubit] = len(fitted_parameters[qubit]) * [0.0] + if data.power_level is PowerLevel.high: + bare_frequency[qubit] = frequency[qubit] + chi2[qubit] = 0.0 + amplitudes[qubit] = fitted_parameters[qubit][0] + else: + fit_result = lorentzian_fit( + data[qubit], resonator_type=data.resonator_type, fit="resonator" ) - if data.power_level is PowerLevel.high: - bare_frequency[qubit] = frequency[qubit] - chi2[qubit] = ( - chi2_reduced( - data[qubit].signal, - lorentzian(data[qubit].freq, *fitted_parameters[qubit]), - data[qubit].error_signal, - ), - np.sqrt(2 / len(data[qubit].freq)), - ) - amplitudes[qubit] = fitted_parameters[qubit][0] + + if fit_result is not None: + frequency[qubit], fitted_parameters[qubit], error_fit_pars[qubit] = ( + fit_result + ) + if data.power_level is PowerLevel.high: + bare_frequency[qubit] = frequency[qubit] + chi2[qubit] = ( + chi2_reduced( + data[qubit].signal, + lorentzian(data[qubit].freq, *fitted_parameters[qubit]), + data[qubit].error_signal, + ), + np.sqrt(2 / len(data[qubit].freq)), + ) + amplitudes[qubit] = fitted_parameters[qubit][0] if data.power_level is PowerLevel.high: return ResonatorSpectroscopyResults( @@ -237,21 +250,22 @@ def _fit( amplitude=data.amplitudes, attenuation=data.attenuations, ) - else: - return ResonatorSpectroscopyResults( - frequency=frequency, - fitted_parameters=fitted_parameters, - error_fit_pars=error_fit_pars, - chi2_reduced=chi2, - amplitude=data.amplitudes, - attenuation=data.attenuations, - ) + return ResonatorSpectroscopyResults( + frequency=frequency, + fitted_parameters=fitted_parameters, + error_fit_pars=error_fit_pars, + chi2_reduced=chi2, + amplitude=data.amplitudes, + attenuation=data.attenuations, + ) def _plot( data: ResonatorSpectroscopyData, target: QubitId, fit: ResonatorSpectroscopyResults ): """Plotting function for ResonatorSpectroscopy.""" + if data.fit_function == "s21": + return resonator_spectroscopy_plot(data, target, fit) return spectroscopy_plot(data, target, fit) From a758cdcc2fae89e1060adf0c92c9022b57022476 Mon Sep 17 00:00:00 2001 From: Marco Gobbo Date: Wed, 3 Jul 2024 18:00:34 +0200 Subject: [PATCH 08/45] Update parameters fit name --- src/qibocal/protocols/utils.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/qibocal/protocols/utils.py b/src/qibocal/protocols/utils.py index dda3bac04..87849d23f 100644 --- a/src/qibocal/protocols/utils.py +++ b/src/qibocal/protocols/utils.py @@ -186,7 +186,7 @@ def s21( resonance (float): resonance frequency (Hz). q_loaded (float): loaded quality factor. q_coupling (float): coupling quality factor. - phi (float): quantifies the impedance mismatch. + phi (float): quantifies the impedance mismatch (Fano interference). amplitude (float): accounts for additional attenuation/amplification present in the setup. alpha (float): accounts for a additional phase shift. tau (float): cable delay caused by the length of the cable and finite speed of light. @@ -582,10 +582,10 @@ def resonator_spectroscopy_plot(data, qubit, fit: Results = None): "Loaded Quality Factor", "Internal Quality Factor", "Coupling Quality Factor", - "ϕ", + "Fano interference ϕ [rad]", "Amplitude [a.u.]", - "Phase Shift α", - "Electronic Delay 𝜏", + "Phase Shift α [rad]", + "Electronic Delay 𝜏 [rad]", ] values = [ freq[qubit], From 23f22e556aed477f1131155ca6430bce73f85aaa Mon Sep 17 00:00:00 2001 From: Marco Gobbo Date: Wed, 3 Jul 2024 18:04:12 +0200 Subject: [PATCH 09/45] Update Magnitude to Transmission --- src/qibocal/protocols/utils.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/qibocal/protocols/utils.py b/src/qibocal/protocols/utils.py index 87849d23f..bd93f725a 100644 --- a/src/qibocal/protocols/utils.py +++ b/src/qibocal/protocols/utils.py @@ -758,7 +758,7 @@ def resonator_spectroscopy_plot(data, qubit, fit: Results = None): xaxis_title="Real [a.u.]", yaxis_title="Imaginary [a.u.]", xaxis2_title="", - yaxis2_title="Magnitude [a.u.]", + yaxis2_title="Transmission [a.u.]", xaxis3_title="Frequency [GHz]", yaxis3_title="Phase [rad]", ) From bc049a2edc2f591ab07fbe564e7b59c4d4f33e7e Mon Sep 17 00:00:00 2001 From: Marco Gobbo Date: Thu, 4 Jul 2024 10:11:17 +0200 Subject: [PATCH 10/45] Add test for the S21 resonator fit --- tests/runcards/protocols.yml | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/tests/runcards/protocols.yml b/tests/runcards/protocols.yml index bfdce4260..760f0b33b 100644 --- a/tests/runcards/protocols.yml +++ b/tests/runcards/protocols.yml @@ -50,6 +50,17 @@ actions: nshots: 10 + - id: resonator low power high attenuation s21 + operation: resonator_spectroscopy + parameters: + freq_width: 10_000_000 # 20_000_000 + freq_step: 100_000 # 500_00 + attenuation: 60 + power_level: low + nshots: 10 + fit_function: s21 + + - id: resonator punchout operation: resonator_punchout parameters: From 51a0297ec6d435f15418d8890f4e4a36d8f0aba9 Mon Sep 17 00:00:00 2001 From: Marco Gobbo Date: Thu, 4 Jul 2024 10:12:32 +0200 Subject: [PATCH 11/45] Update fit_function parameter Now is optional parameter with default set to lorentzian --- src/qibocal/protocols/resonator_spectroscopy.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/qibocal/protocols/resonator_spectroscopy.py b/src/qibocal/protocols/resonator_spectroscopy.py index 0a16952bb..730165769 100644 --- a/src/qibocal/protocols/resonator_spectroscopy.py +++ b/src/qibocal/protocols/resonator_spectroscopy.py @@ -41,11 +41,11 @@ class ResonatorSpectroscopyParameters(Parameters): """Width for frequency sweep relative to the readout frequency [Hz].""" freq_step: int """Frequency step for sweep [Hz].""" - fit_function: str - """Fit function used for the resonance.""" power_level: Union[PowerLevel, str] """Power regime (low or high). If low the readout frequency will be updated. If high both the readout frequency and the bare resonator frequency will be updated.""" + fit_function: Optional[str] = "lorentzian" + """Fit function (optional) used for the resonance.""" amplitude: Optional[float] = None """Readout amplitude (optional). If defined, same amplitude will be used in all qubits. Otherwise the default amplitude defined on the platform runcard will be used""" @@ -104,8 +104,8 @@ class ResonatorSpectroscopyData(Data): """Resonator type.""" amplitudes: dict[QubitId, float] """Amplitudes provided by the user.""" - fit_function: str - """Fit function used for the resonance.""" + fit_function: Optional[str] = "lorentzian" + """Fit function (optional) used for the resonance.""" data: dict[QubitId, npt.NDArray[ResSpecType]] = field(default_factory=dict) """Raw data acquired.""" power_level: Optional[PowerLevel] = None From fafa706ceef4f903b44ea27f04eb97a51b1bdf78 Mon Sep 17 00:00:00 2001 From: Marco Gobbo Date: Thu, 4 Jul 2024 10:14:09 +0200 Subject: [PATCH 12/45] Update calibrated plot --- src/qibocal/protocols/utils.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/qibocal/protocols/utils.py b/src/qibocal/protocols/utils.py index bd93f725a..114c38b19 100644 --- a/src/qibocal/protocols/utils.py +++ b/src/qibocal/protocols/utils.py @@ -648,9 +648,9 @@ def resonator_spectroscopy_plot(data, qubit, fit: Results = None): size=4, ), opacity=1, - name="Magnitude", + name="Transmission", showlegend=True, - legendgroup="Magnitude", + legendgroup="Transmission", ), row=1, col=2, @@ -733,7 +733,7 @@ def resonator_spectroscopy_plot(data, qubit, fit: Results = None): go.Scatter( x=freqrange * HZ_TO_GHZ, y=np.abs(s21_calibrated_fitted), - name="Magnitude Fit", + name="Transmission Fit", line=go.scatter.Line(dash="solid"), ), row=1, From 983af33920b021a4473b4c309c2f91f51ae13b99 Mon Sep 17 00:00:00 2001 From: Marco Gobbo <44322256+marcogobbo@users.noreply.github.com> Date: Thu, 4 Jul 2024 14:07:24 +0200 Subject: [PATCH 13/45] Update src/qibocal/protocols/resonator_utils.py Co-authored-by: Alessandro Candido --- src/qibocal/protocols/resonator_utils.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/qibocal/protocols/resonator_utils.py b/src/qibocal/protocols/resonator_utils.py index be6738891..68fb9a447 100644 --- a/src/qibocal/protocols/resonator_utils.py +++ b/src/qibocal/protocols/resonator_utils.py @@ -48,7 +48,7 @@ def circle_fit(z: NDArray) -> tuple[float, float, float]: """ Fits the circle of an S21 scattering matrix element array using the algebraic fit described in "Efficient and robust analysis of complex scattering data under noise in microwave resonators" - (https://doi.org/10.1063/1.4907935) by Sebastian Probst. + (https://doi.org/10.1063/1.4907935) by S. Probst et al. Args: z (NDArray[complex]): S21 scattering matrix element. From 75771657a87e76f7216a675a7d2a803d0933c94c Mon Sep 17 00:00:00 2001 From: Marco Gobbo Date: Mon, 8 Jul 2024 11:03:35 +0200 Subject: [PATCH 14/45] Update _fit method --- .../protocols/resonator_spectroscopy.py | 54 +++++++++++++------ 1 file changed, 38 insertions(+), 16 deletions(-) diff --git a/src/qibocal/protocols/resonator_spectroscopy.py b/src/qibocal/protocols/resonator_spectroscopy.py index 730165769..bcd7991f6 100644 --- a/src/qibocal/protocols/resonator_spectroscopy.py +++ b/src/qibocal/protocols/resonator_spectroscopy.py @@ -17,6 +17,7 @@ lorentzian, lorentzian_fit, resonator_spectroscopy_plot, + s21, s21_fit, spectroscopy_plot, ) @@ -208,37 +209,58 @@ def _fit( error_fit_pars = {} chi2 = {} amplitudes = {} + for qubit in qubits: if data.fit_function == "s21": - fit_result = s21_fit(data[qubit]) - - if fit_result is not None: - frequency[qubit], fitted_parameters[qubit] = fit_result - error_fit_pars[qubit] = len(fitted_parameters[qubit]) * [0.0] - if data.power_level is PowerLevel.high: - bare_frequency[qubit] = frequency[qubit] - chi2[qubit] = 0.0 - amplitudes[qubit] = fitted_parameters[qubit][0] + fit_result = s21_fit( + data[qubit], resonator_type=data.resonator_type, fit="resonator" + ) else: fit_result = lorentzian_fit( data[qubit], resonator_type=data.resonator_type, fit="resonator" ) + if fit_result is not None: + ( + frequency[qubit], + fitted_parameters[qubit], + error_fit_pars[qubit], + ) = fit_result + + dof = len(data[qubit].freq) - len(fitted_parameters[qubit]) + + if data.power_level is PowerLevel.high: + bare_frequency[qubit] = frequency[qubit] + + if data.fit_function == "s21": + z_fit = s21(data[qubit].freq, *fitted_parameters[qubit]) - if fit_result is not None: - frequency[qubit], fitted_parameters[qubit], error_fit_pars[qubit] = ( - fit_result + chi2[qubit] = ( + chi2_reduced( + np.abs(data[qubit].signal), + np.abs(z_fit), + data[qubit].error_signal, + dof, + ), + +chi2_reduced( + data[qubit].phase, + np.angle(z_fit), + data[qubit].error_phase, + dof, + True, + ), + np.sqrt(2 / dof), ) - if data.power_level is PowerLevel.high: - bare_frequency[qubit] = frequency[qubit] + else: chi2[qubit] = ( chi2_reduced( data[qubit].signal, lorentzian(data[qubit].freq, *fitted_parameters[qubit]), data[qubit].error_signal, ), - np.sqrt(2 / len(data[qubit].freq)), + np.sqrt(2 / dof), ) - amplitudes[qubit] = fitted_parameters[qubit][0] + + amplitudes[qubit] = fitted_parameters[qubit][0] if data.power_level is PowerLevel.high: return ResonatorSpectroscopyResults( From be8a2a76bfd91682bc73d48336e42cf9c9bb050b Mon Sep 17 00:00:00 2001 From: Marco Gobbo Date: Mon, 8 Jul 2024 11:04:50 +0200 Subject: [PATCH 15/45] Update Chi2 test --- src/qibocal/protocols/utils.py | 33 ++++++++++++++++++++++----------- 1 file changed, 22 insertions(+), 11 deletions(-) diff --git a/src/qibocal/protocols/utils.py b/src/qibocal/protocols/utils.py index 114c38b19..19dfa7b02 100644 --- a/src/qibocal/protocols/utils.py +++ b/src/qibocal/protocols/utils.py @@ -206,7 +206,9 @@ def s21( ) -def s21_fit(data: NDArray, resonator_type=None, fit=None) -> tuple[float, list[float]]: +def s21_fit( + data: NDArray, resonator_type=None, fit=None +) -> tuple[float, list[float], list[float]]: """ Calibrates the S21 profile of a notch resonator, based on https://github.com/qkitgroup/qkit. @@ -246,7 +248,9 @@ def s21_fit(data: NDArray, resonator_type=None, fit=None) -> tuple[float, list[f alpha, tau, ] - return model_parameters[0], model_parameters + perr = [0.0] * 7 + + return model_parameters[0], model_parameters, perr def spectroscopy_plot(data, qubit, fit: Results = None): @@ -343,19 +347,19 @@ def spectroscopy_plot(data, qubit, fit: Results = None): ) if data.power_level is PowerLevel.low: - label = "readout frequency[Hz]" + label = "Readout Frequency [Hz]" freq = fit.frequency elif data.power_level is PowerLevel.high: - label = "bare resonator frequency[Hz]" + label = "Bare Resonator Frequency [Hz]" freq = fit.bare_frequency else: - label = "qubit frequency[Hz]" + label = "Qubit Frequency [Hz]" freq = fit.frequency if data.attenuations: if data.attenuations[qubit] is not None: if show_error_bars: - labels = [label, "amplitude", "attenuation", "chi2 reduced"] + labels = [label, "Amplitude", "Attenuation", "Chi2 Reduced"] values = [ ( freq[qubit], @@ -366,7 +370,7 @@ def spectroscopy_plot(data, qubit, fit: Results = None): fit.chi2_reduced[qubit], ] else: - labels = [label, "amplitude", "attenuation"] + labels = [label, "Amplitude", "Attenuation"] values = [ freq[qubit], data.amplitudes[qubit], @@ -374,7 +378,7 @@ def spectroscopy_plot(data, qubit, fit: Results = None): ] if data.amplitudes[qubit] is not None: if show_error_bars: - labels = [label, "amplitude", "chi2 reduced"] + labels = [label, "Amplitude", "Chi2 reduced"] values = [ ( freq[qubit], @@ -384,7 +388,7 @@ def spectroscopy_plot(data, qubit, fit: Results = None): fit.chi2_reduced[qubit], ] else: - labels = [label, "amplitude"] + labels = [label, "Amplitude"] values = [freq[qubit], data.amplitudes[qubit]] fitting_report = table_html( @@ -582,7 +586,7 @@ def resonator_spectroscopy_plot(data, qubit, fit: Results = None): "Loaded Quality Factor", "Internal Quality Factor", "Coupling Quality Factor", - "Fano interference ϕ [rad]", + "Fano Interference ϕ [rad]", "Amplitude [a.u.]", "Phase Shift α [rad]", "Electronic Delay 𝜏 [rad]", @@ -901,6 +905,7 @@ def chi2_reduced( estimated: NDArray, errors: NDArray, dof: float = None, + periodic: bool = False, ): if np.count_nonzero(errors) < len(errors): return EXTREME_CHI @@ -908,7 +913,13 @@ def chi2_reduced( if dof is None: dof = len(observed) - 1 - chi2 = np.sum(np.square((observed - estimated) / errors)) / dof + if not periodic: + chi2 = np.sum(np.square((observed - estimated) / errors)) / dof + else: + delta_phase = np.arctan2( + np.sin(observed - estimated), np.cos(observed - estimated) + ) + chi2 = np.sum(np.square(delta_phase / errors)) / dof return chi2 From 85b4dbb98b23ccbcb30125477084657161e9d279 Mon Sep 17 00:00:00 2001 From: Marco Gobbo Date: Tue, 9 Jul 2024 10:11:07 +0200 Subject: [PATCH 16/45] Update _fit method --- .../protocols/resonator_spectroscopy.py | 44 ++++++++++++++----- 1 file changed, 34 insertions(+), 10 deletions(-) diff --git a/src/qibocal/protocols/resonator_spectroscopy.py b/src/qibocal/protocols/resonator_spectroscopy.py index bcd7991f6..cc503994e 100644 --- a/src/qibocal/protocols/resonator_spectroscopy.py +++ b/src/qibocal/protocols/resonator_spectroscopy.py @@ -16,7 +16,6 @@ chi2_reduced, lorentzian, lorentzian_fit, - resonator_spectroscopy_plot, s21, s21_fit, spectroscopy_plot, @@ -232,21 +231,46 @@ def _fit( bare_frequency[qubit] = frequency[qubit] if data.fit_function == "s21": + z_data = np.abs(data[qubit].signal) * np.exp(1j * data[qubit].phase) z_fit = s21(data[qubit].freq, *fitted_parameters[qubit]) + z_data_real = np.real(z_data) + z_data_imag = np.imag(z_data) + + z_fit_real = np.real(z_fit) + z_fit_imag = np.imag(z_fit) + + z_data_error_real = np.sqrt( + (np.cos(data[qubit].phase) * data[qubit].error_signal) ** 2 + + ( + data[qubit].signal + * np.sin(data[qubit].phase) + * data[qubit].error_phase + ) + ** 2 + ) + z_data_error_imag = np.sqrt( + (np.sin(data[qubit].phase) * data[qubit].error_signal) ** 2 + + ( + data[qubit].signal + * np.cos(data[qubit].phase) + * data[qubit].error_phase + ) + ** 2 + ) + chi2[qubit] = ( chi2_reduced( - np.abs(data[qubit].signal), - np.abs(z_fit), - data[qubit].error_signal, + z_data_real, + z_fit_real, + z_data_error_real, dof, - ), - +chi2_reduced( - data[qubit].phase, - np.angle(z_fit), - data[qubit].error_phase, + ) + + chi2_reduced( + z_data_imag, + z_fit_imag, + z_data_error_imag, dof, - True, ), np.sqrt(2 / dof), ) From 33057b652023436a50429c7e8535e2637c6b892a Mon Sep 17 00:00:00 2001 From: Marco Gobbo <44322256+marcogobbo@users.noreply.github.com> Date: Tue, 9 Jul 2024 10:26:17 +0200 Subject: [PATCH 17/45] Update src/qibocal/protocols/resonator_spectroscopy.py Co-authored-by: Alessandro Candido --- src/qibocal/protocols/resonator_spectroscopy.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/qibocal/protocols/resonator_spectroscopy.py b/src/qibocal/protocols/resonator_spectroscopy.py index 730165769..420b33d6c 100644 --- a/src/qibocal/protocols/resonator_spectroscopy.py +++ b/src/qibocal/protocols/resonator_spectroscopy.py @@ -265,7 +265,7 @@ def _plot( ): """Plotting function for ResonatorSpectroscopy.""" if data.fit_function == "s21": - return resonator_spectroscopy_plot(data, target, fit) + return s21_spectroscopy_plot(data, target, fit) return spectroscopy_plot(data, target, fit) From 88d387861197db6bb0b8355a95dabfa06b8d929d Mon Sep 17 00:00:00 2001 From: Marco Gobbo Date: Tue, 9 Jul 2024 10:29:16 +0200 Subject: [PATCH 18/45] Rename plot method --- src/qibocal/protocols/resonator_spectroscopy.py | 3 ++- src/qibocal/protocols/utils.py | 13 +++---------- 2 files changed, 5 insertions(+), 11 deletions(-) diff --git a/src/qibocal/protocols/resonator_spectroscopy.py b/src/qibocal/protocols/resonator_spectroscopy.py index cc503994e..7fb7bf71e 100644 --- a/src/qibocal/protocols/resonator_spectroscopy.py +++ b/src/qibocal/protocols/resonator_spectroscopy.py @@ -18,6 +18,7 @@ lorentzian_fit, s21, s21_fit, + s21_spectroscopy_plot, spectroscopy_plot, ) @@ -311,7 +312,7 @@ def _plot( ): """Plotting function for ResonatorSpectroscopy.""" if data.fit_function == "s21": - return resonator_spectroscopy_plot(data, target, fit) + return s21_spectroscopy_plot(data, target, fit) return spectroscopy_plot(data, target, fit) diff --git a/src/qibocal/protocols/utils.py b/src/qibocal/protocols/utils.py index 19dfa7b02..d3f001e70 100644 --- a/src/qibocal/protocols/utils.py +++ b/src/qibocal/protocols/utils.py @@ -219,7 +219,7 @@ def s21_fit( """ f_data = data.freq - z_data = data.signal * np.exp(1j * data.phase) + z_data = np.abs(data.signal) * np.exp(1j * data.phase) tau = get_cable_delay(f_data, z_data, 20) z_1 = remove_cable_delay(f_data, z_data, tau) @@ -412,7 +412,7 @@ def spectroscopy_plot(data, qubit, fit: Results = None): return figures, fitting_report -def resonator_spectroscopy_plot(data, qubit, fit: Results = None): +def s21_spectroscopy_plot(data, qubit, fit: Results = None): figures = [] fig_raw = make_subplots( rows=2, @@ -905,7 +905,6 @@ def chi2_reduced( estimated: NDArray, errors: NDArray, dof: float = None, - periodic: bool = False, ): if np.count_nonzero(errors) < len(errors): return EXTREME_CHI @@ -913,13 +912,7 @@ def chi2_reduced( if dof is None: dof = len(observed) - 1 - if not periodic: - chi2 = np.sum(np.square((observed - estimated) / errors)) / dof - else: - delta_phase = np.arctan2( - np.sin(observed - estimated), np.cos(observed - estimated) - ) - chi2 = np.sum(np.square(delta_phase / errors)) / dof + chi2 = np.sum(np.square((observed - estimated) / errors)) / dof return chi2 From a8ff6e605357a6b9b5f229391355fa9b187e9f2f Mon Sep 17 00:00:00 2001 From: Marco Gobbo <44322256+marcogobbo@users.noreply.github.com> Date: Tue, 9 Jul 2024 10:55:34 +0200 Subject: [PATCH 19/45] Update src/qibocal/protocols/utils.py Co-authored-by: Alessandro Candido --- src/qibocal/protocols/utils.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/qibocal/protocols/utils.py b/src/qibocal/protocols/utils.py index d3f001e70..c6098626c 100644 --- a/src/qibocal/protocols/utils.py +++ b/src/qibocal/protocols/utils.py @@ -177,7 +177,7 @@ def s21( """ Full model of the S21 notch resonator based on eq. (1) described in: "Efficient and robust analysis of complex scattering data under noise in microwave resonators" - (https://doi.org/10.1063/1.4907935) by Sebastian Probst. + (https://doi.org/10.1063/1.4907935) by S. Probst et al. The equation is split into two parts describing the ideal resonator and the environment. From 5e8241c6366fbeb30e52c197761bcd6f1673b731 Mon Sep 17 00:00:00 2001 From: Marco Gobbo Date: Tue, 9 Jul 2024 15:42:19 +0200 Subject: [PATCH 20/45] Add DELAY_FIT_PERCENTAGE to fit the cable delay --- src/qibocal/protocols/resonator_utils.py | 2 +- src/qibocal/protocols/utils.py | 5 ++++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/qibocal/protocols/resonator_utils.py b/src/qibocal/protocols/resonator_utils.py index 68fb9a447..65eb7bd3e 100644 --- a/src/qibocal/protocols/resonator_utils.py +++ b/src/qibocal/protocols/resonator_utils.py @@ -4,7 +4,7 @@ from scipy.optimize import leastsq, newton -def get_cable_delay(frequencies: NDArray, z: NDArray, num_points: int = 10) -> float: +def get_cable_delay(frequencies: NDArray, z: NDArray, num_points: int) -> float: """ Evaluates the cable delay τ caused by the length of the cable and the finite speed of light. Performs a first-grade polynomial fit of the phase and extracts the angular coefficient. diff --git a/src/qibocal/protocols/utils.py b/src/qibocal/protocols/utils.py index c6098626c..d7d6f4666 100644 --- a/src/qibocal/protocols/utils.py +++ b/src/qibocal/protocols/utils.py @@ -42,6 +42,8 @@ """Confidence interval used to mask flux data.""" CONFIDENCE_INTERVAL_SECOND_MASK = 70 """Confidence interval used to clean outliers.""" +DELAY_FIT_PERCENTAGE = 10 +"""Percentage of the first and last points used to fit the cable delay.""" def effective_qubit_temperature( @@ -221,7 +223,8 @@ def s21_fit( f_data = data.freq z_data = np.abs(data.signal) * np.exp(1j * data.phase) - tau = get_cable_delay(f_data, z_data, 20) + num_points = int(len(f_data) * DELAY_FIT_PERCENTAGE / 100) + tau = get_cable_delay(f_data, z_data, num_points) z_1 = remove_cable_delay(f_data, z_data, tau) x_c, y_c, r_0 = circle_fit(z_1) From dae3b64bf2043a9d7e27dc8a67fe19bb447177ca Mon Sep 17 00:00:00 2001 From: Marco Gobbo Date: Tue, 9 Jul 2024 16:00:58 +0200 Subject: [PATCH 21/45] Fix get_cable_delay() --- src/qibocal/protocols/resonator_utils.py | 7 +++---- src/qibocal/protocols/utils.py | 2 +- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/src/qibocal/protocols/resonator_utils.py b/src/qibocal/protocols/resonator_utils.py index 65eb7bd3e..03b4d4448 100644 --- a/src/qibocal/protocols/resonator_utils.py +++ b/src/qibocal/protocols/resonator_utils.py @@ -4,22 +4,21 @@ from scipy.optimize import leastsq, newton -def get_cable_delay(frequencies: NDArray, z: NDArray, num_points: int) -> float: +def get_cable_delay(frequencies: NDArray, phases: NDArray, num_points: int) -> float: """ Evaluates the cable delay τ caused by the length of the cable and the finite speed of light. Performs a first-grade polynomial fit of the phase and extracts the angular coefficient. Args: frequencies (NDArray[float]): frequencies (Hz) at which the measurement was taken. - z (NDArray[complex]): S21 scattering matrix element. + phases (NDArray[complex]): Phase of the S21 scattering matrix element. num_points (int): number of points selected from both the start and the end of the frequencies array to perform the linear fit. Returns: The value (float) of the cable delay τ in seconds. """ - phases = np.unwrap(np.angle(z)) - + phases = np.unwrap(phases) frequencies_selected = np.concatenate( (frequencies[:num_points], frequencies[-num_points:]) ) diff --git a/src/qibocal/protocols/utils.py b/src/qibocal/protocols/utils.py index d7d6f4666..5c31b5725 100644 --- a/src/qibocal/protocols/utils.py +++ b/src/qibocal/protocols/utils.py @@ -224,7 +224,7 @@ def s21_fit( z_data = np.abs(data.signal) * np.exp(1j * data.phase) num_points = int(len(f_data) * DELAY_FIT_PERCENTAGE / 100) - tau = get_cable_delay(f_data, z_data, num_points) + tau = get_cable_delay(f_data, data.phase, num_points) z_1 = remove_cable_delay(f_data, z_data, tau) x_c, y_c, r_0 = circle_fit(z_1) From df77517ab6d7f714c0a9294b7d52bf9d0245f52b Mon Sep 17 00:00:00 2001 From: Marco Gobbo Date: Tue, 9 Jul 2024 16:04:59 +0200 Subject: [PATCH 22/45] Rename get_cable_delay method to cable_delay --- src/qibocal/protocols/resonator_utils.py | 2 +- src/qibocal/protocols/utils.py | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/qibocal/protocols/resonator_utils.py b/src/qibocal/protocols/resonator_utils.py index 03b4d4448..8e74b42fb 100644 --- a/src/qibocal/protocols/resonator_utils.py +++ b/src/qibocal/protocols/resonator_utils.py @@ -4,7 +4,7 @@ from scipy.optimize import leastsq, newton -def get_cable_delay(frequencies: NDArray, phases: NDArray, num_points: int) -> float: +def cable_delay(frequencies: NDArray, phases: NDArray, num_points: int) -> float: """ Evaluates the cable delay τ caused by the length of the cable and the finite speed of light. Performs a first-grade polynomial fit of the phase and extracts the angular coefficient. diff --git a/src/qibocal/protocols/utils.py b/src/qibocal/protocols/utils.py index 5c31b5725..2d26f1451 100644 --- a/src/qibocal/protocols/utils.py +++ b/src/qibocal/protocols/utils.py @@ -15,8 +15,8 @@ from qibocal.config import log from qibocal.fitting.classifier import run from qibocal.protocols.resonator_utils import ( + cable_delay, circle_fit, - get_cable_delay, periodic_boundary, phase_fit, remove_cable_delay, @@ -224,7 +224,7 @@ def s21_fit( z_data = np.abs(data.signal) * np.exp(1j * data.phase) num_points = int(len(f_data) * DELAY_FIT_PERCENTAGE / 100) - tau = get_cable_delay(f_data, data.phase, num_points) + tau = cable_delay(f_data, data.phase, num_points) z_1 = remove_cable_delay(f_data, z_data, tau) x_c, y_c, r_0 = circle_fit(z_1) From 25a75d7e8825e2960f905b137fa3cd53b9a31751 Mon Sep 17 00:00:00 2001 From: Marco Gobbo <44322256+marcogobbo@users.noreply.github.com> Date: Tue, 9 Jul 2024 16:09:28 +0200 Subject: [PATCH 23/45] Update src/qibocal/protocols/resonator_utils.py Co-authored-by: Alessandro Candido --- src/qibocal/protocols/resonator_utils.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/qibocal/protocols/resonator_utils.py b/src/qibocal/protocols/resonator_utils.py index 03b4d4448..5de27fded 100644 --- a/src/qibocal/protocols/resonator_utils.py +++ b/src/qibocal/protocols/resonator_utils.py @@ -16,7 +16,7 @@ def get_cable_delay(frequencies: NDArray, phases: NDArray, num_points: int) -> f frequencies array to perform the linear fit. Returns: - The value (float) of the cable delay τ in seconds. + The value (float) of the cable delay :math:`\tau` in seconds. """ phases = np.unwrap(phases) frequencies_selected = np.concatenate( From 2a1362f7ddfe08e51629ad5edc80fe0cd7210923 Mon Sep 17 00:00:00 2001 From: Marco Gobbo <44322256+marcogobbo@users.noreply.github.com> Date: Tue, 9 Jul 2024 16:11:38 +0200 Subject: [PATCH 24/45] Update src/qibocal/protocols/resonator_utils.py Co-authored-by: Alessandro Candido --- src/qibocal/protocols/resonator_utils.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/qibocal/protocols/resonator_utils.py b/src/qibocal/protocols/resonator_utils.py index 5de27fded..de2e73f47 100644 --- a/src/qibocal/protocols/resonator_utils.py +++ b/src/qibocal/protocols/resonator_utils.py @@ -5,8 +5,9 @@ def get_cable_delay(frequencies: NDArray, phases: NDArray, num_points: int) -> float: - """ - Evaluates the cable delay τ caused by the length of the cable and the finite speed of light. + """Evaluates the cable delay :math:`\tau`. + + This delay is caused by the length of the cable and the finite speed of light. Performs a first-grade polynomial fit of the phase and extracts the angular coefficient. Args: From e55f814f7f31c9a731ace30bd3b21b241ee2554e Mon Sep 17 00:00:00 2001 From: Marco Gobbo Date: Wed, 10 Jul 2024 14:51:39 +0200 Subject: [PATCH 25/45] Add better docstrings --- src/qibocal/protocols/resonator_utils.py | 69 ++++++------------------ 1 file changed, 16 insertions(+), 53 deletions(-) diff --git a/src/qibocal/protocols/resonator_utils.py b/src/qibocal/protocols/resonator_utils.py index 0dd324308..6808d770c 100644 --- a/src/qibocal/protocols/resonator_utils.py +++ b/src/qibocal/protocols/resonator_utils.py @@ -7,17 +7,13 @@ def cable_delay(frequencies: NDArray, phases: NDArray, num_points: int) -> float: """Evaluates the cable delay :math:`\tau`. - This delay is caused by the length of the cable and the finite speed of light. - Performs a first-grade polynomial fit of the phase and extracts the angular coefficient. + The cable delay :math:`tau` is caused by the length of the cable and the finite speed of light. + This is estimated fitting a first-grade polynomial fit of the `phases` as a function of the + `frequencies` (in Hz), and extracting the angular coefficient, which is then expressed + in seconds. - Args: - frequencies (NDArray[float]): frequencies (Hz) at which the measurement was taken. - phases (NDArray[complex]): Phase of the S21 scattering matrix element. - num_points (int): number of points selected from both the start and the end of the - frequencies array to perform the linear fit. - - Returns: - The value (float) of the cable delay :math:`\tau` in seconds. + The `num_points` is used to select how manu points should be fitted, from both the + start and the end of the frequency range. """ phases = np.unwrap(phases) frequencies_selected = np.concatenate( @@ -31,31 +27,22 @@ def cable_delay(frequencies: NDArray, phases: NDArray, num_points: int) -> float def remove_cable_delay(frequencies: NDArray, z: NDArray, tau: float) -> NDArray: - """ - Corrects the S21 scattering matrix element array from the cable delay. + """Corrects the cable delay :math:`\tau`. - Args: - frequencies (NDArray[float]): frequencies (Hz) at which the measurement was taken. - z (NDArray[complex]): S21 scattering matrix element. - tau (float): the cable delay τ in seconds. - Returns: - The corrected S21 scattering matrix element (NDArray[complex]). + The cable delay :math:`\tau` (in s) is removed from the scattering matrix element array `z` by performing + an exponential product which also depends from the `frequencies` (in Hz). """ + return z * np.exp(2j * np.pi * frequencies * tau) def circle_fit(z: NDArray) -> tuple[float, float, float]: - """ - Fits the circle of an S21 scattering matrix element array using the algebraic fit described in - "Efficient and robust analysis of complex scattering data under noise in microwave resonators" - (https://doi.org/10.1063/1.4907935) by S. Probst et al. + """Fits the circle of a scattering matrix element array. - Args: - z (NDArray[complex]): S21 scattering matrix element. - tau (float): the cable delay τ in seconds - Returns: - (tuple[float, float, float]): the (x,y) coordinates of the circle's center and - the radius of the circle. + The circle fit exploits the algebraic fit described in + "Efficient and robust analysis of complex scattering data under noise in microwave resonators" + (https://doi.org/10.1063/1.4907935) by S. Probst et al. The function, from the scattering matrix + element array, evaluates the center coordinates `x_c` and `y_c` and the radius of the circle `r_0`. """ z = z.copy() x_norm = 0.5 * (np.max(z.real) + np.min(z.real)) @@ -199,26 +186,9 @@ def circle_fit(z: NDArray) -> tuple[float, float, float]: a_4 = -4 def pol_func(x: float) -> float: - """ - Polynomio for find a root of a real or complex function using the Newton-Raphson method. - - Args: - x (float): independent variable. - Returns: - Evaluated polynomial (float). - """ return a_0 + a_1 * x + a_2 * x**2 + a_3 * x**3 + a_4 * x**4 def der_pol_func(x: float) -> float: - """ - Derivative of the polynomio for find a root of a real or complex function using the - Newton-Raphson method. - - Args: - x (float): independent variable. - Returns: - Evaluated derivative of the polynomial (float). - """ return a_1 + 2 * a_2 * x + 3 * a_3 * x**2 + 4 * a_4 * x**3 eta = newton(pol_func, 0.0, fprime=der_pol_func) @@ -309,14 +279,7 @@ def residuals_full(params): def phase_dist(angle: float) -> float: - """ - Maps angle [-2pi, 2pi] to phase distance on circle [0, pi]. - - Args: - angle (float): angle to be mapped. - Returns: - Mapped angle (float). - """ + """Maps angle [-2pi, 2pi] to phase distance on circle [0, pi].""" return np.pi - np.abs(np.pi - np.abs(angle)) From 8520c3320b8cd5e191779f9b623383085f869f37 Mon Sep 17 00:00:00 2001 From: Marco Gobbo Date: Wed, 10 Jul 2024 15:24:34 +0200 Subject: [PATCH 26/45] Refactor of the circle_fit function Now the function is more readable, it follows the Jiansong Gao thesis Appendix E https://thesis.library.caltech.edu/2530/1/thesismain_0610.pdf --- src/qibocal/protocols/resonator_utils.py | 186 +++++------------------ 1 file changed, 35 insertions(+), 151 deletions(-) diff --git a/src/qibocal/protocols/resonator_utils.py b/src/qibocal/protocols/resonator_utils.py index 6808d770c..df5df750d 100644 --- a/src/qibocal/protocols/resonator_utils.py +++ b/src/qibocal/protocols/resonator_utils.py @@ -1,7 +1,7 @@ import numpy as np from numpy.typing import NDArray from scipy.ndimage import gaussian_filter1d -from scipy.optimize import leastsq, newton +from scipy.optimize import leastsq, minimize def cable_delay(frequencies: NDArray, phases: NDArray, num_points: int) -> float: @@ -12,7 +12,7 @@ def cable_delay(frequencies: NDArray, phases: NDArray, num_points: int) -> float `frequencies` (in Hz), and extracting the angular coefficient, which is then expressed in seconds. - The `num_points` is used to select how manu points should be fitted, from both the + The `num_points` is used to select how many points should be fitted, from both the start and the end of the frequency range. """ phases = np.unwrap(phases) @@ -44,6 +44,7 @@ def circle_fit(z: NDArray) -> tuple[float, float, float]: (https://doi.org/10.1063/1.4907935) by S. Probst et al. The function, from the scattering matrix element array, evaluates the center coordinates `x_c` and `y_c` and the radius of the circle `r_0`. """ + z = z.copy() x_norm = 0.5 * (np.max(z.real) + np.min(z.real)) y_norm = 0.5 * (np.max(z.imag) + np.min(z.imag)) @@ -52,162 +53,45 @@ def circle_fit(z: NDArray) -> tuple[float, float, float]: amplitude_norm = np.max(np.abs(z)) z /= amplitude_norm - x_i = z.real - x_i2 = x_i**2 - - y_i = z.imag - y_i2 = y_i**2 - - z_i = x_i2 + y_i2 - z_i2 = z_i**2 - - n = len(x_i) - - x_i_sum = np.sum(x_i) - y_i_sum = np.sum(y_i) - z_i_sum = np.sum(z_i) - x_i_y_i_sum = np.sum(x_i * y_i) - x_i_z_i_sum = np.sum(x_i * z_i) - y_i_z_i_sum = np.sum(y_i * z_i) - z_i2_sum = np.sum(z_i2) - x_i2_sum = np.sum(x_i2) - y_i2_sum = np.sum(y_i2) - - m_matrix = np.array( - [ - [z_i2_sum, x_i_z_i_sum, y_i_z_i_sum, z_i_sum], - [x_i_z_i_sum, x_i2_sum, x_i_y_i_sum, x_i_sum], - [y_i_z_i_sum, x_i_y_i_sum, y_i2_sum, y_i_sum], - [z_i_sum, x_i_sum, y_i_sum, n], - ] + coords = np.stack( + [np.abs(z) ** 2, z.real, z.imag, np.ones_like(z, dtype=np.float64)] ) + m_matrix = np.einsum("in,jn->ij", coords, coords) - a_0 = ( - ( - (m_matrix[2][0] * m_matrix[3][2] - m_matrix[2][2] * m_matrix[3][0]) - * m_matrix[1][1] - - m_matrix[1][2] * m_matrix[2][0] * m_matrix[3][1] - - m_matrix[1][0] * m_matrix[2][1] * m_matrix[3][2] - + m_matrix[1][0] * m_matrix[2][2] * m_matrix[3][1] - + m_matrix[1][2] * m_matrix[2][1] * m_matrix[3][0] - ) - * m_matrix[0][3] - + ( - m_matrix[0][2] * m_matrix[2][3] * m_matrix[3][0] - - m_matrix[0][2] * m_matrix[2][0] * m_matrix[3][3] - + m_matrix[0][0] * m_matrix[2][2] * m_matrix[3][3] - - m_matrix[0][0] * m_matrix[2][3] * m_matrix[3][2] - ) - * m_matrix[1][1] - + ( - m_matrix[0][1] * m_matrix[1][3] * m_matrix[3][0] - - m_matrix[0][1] * m_matrix[1][0] * m_matrix[3][3] - - m_matrix[0][0] * m_matrix[1][3] * m_matrix[3][1] - ) - * m_matrix[2][2] - + ( - -m_matrix[0][1] * m_matrix[1][2] * m_matrix[2][3] - - m_matrix[0][2] * m_matrix[1][3] * m_matrix[2][1] - ) - * m_matrix[3][0] - + ( - (m_matrix[2][3] * m_matrix[3][1] - m_matrix[2][1] * m_matrix[3][3]) - * m_matrix[1][2] - + m_matrix[2][1] * m_matrix[3][2] * m_matrix[1][3] - ) - * m_matrix[0][0] - + ( - m_matrix[1][0] * m_matrix[2][3] * m_matrix[3][2] - + m_matrix[2][0] - * (m_matrix[1][2] * m_matrix[3][3] - m_matrix[1][3] * m_matrix[3][2]) - ) - * m_matrix[0][1] - + ( - (m_matrix[2][1] * m_matrix[3][3] - m_matrix[2][3] * m_matrix[3][1]) - * m_matrix[1][0] - + m_matrix[1][3] * m_matrix[2][0] * m_matrix[3][1] - ) - * m_matrix[0][2] - ) - a_1 = ( - ( - (m_matrix[3][0] - 2.0 * m_matrix[2][2]) * m_matrix[1][1] - - m_matrix[1][0] * m_matrix[3][1] - + m_matrix[2][2] * m_matrix[3][0] - + 2.0 * m_matrix[1][2] * m_matrix[2][1] - - m_matrix[2][0] * m_matrix[3][2] - ) - * m_matrix[0][3] - + ( - 2.0 * m_matrix[2][0] * m_matrix[3][2] - - m_matrix[0][0] * m_matrix[3][3] - - 2.0 * m_matrix[2][2] * m_matrix[3][0] - + 2.0 * m_matrix[0][2] * m_matrix[2][3] - ) - * m_matrix[1][1] - + ( - -m_matrix[0][0] * m_matrix[3][3] - + 2.0 * m_matrix[0][1] * m_matrix[1][3] - + 2.0 * m_matrix[1][0] * m_matrix[3][1] - ) - * m_matrix[2][2] - + ( - -m_matrix[0][1] * m_matrix[1][3] - + 2.0 * m_matrix[1][2] * m_matrix[2][1] - - m_matrix[0][2] * m_matrix[2][3] - ) - * m_matrix[3][0] - + (m_matrix[1][3] * m_matrix[3][1] + m_matrix[2][3] * m_matrix[3][2]) - * m_matrix[0][0] - + (m_matrix[1][0] * m_matrix[3][3] - 2.0 * m_matrix[1][2] * m_matrix[2][3]) - * m_matrix[0][1] - + (m_matrix[2][0] * m_matrix[3][3] - 2.0 * m_matrix[1][3] * m_matrix[2][1]) - * m_matrix[0][2] - - 2.0 * m_matrix[1][2] * m_matrix[2][0] * m_matrix[3][1] - - 2.0 * m_matrix[1][0] * m_matrix[2][1] * m_matrix[3][2] - ) - a_2 = ( - (2.0 * m_matrix[1][1] - m_matrix[3][0] + 2.0 * m_matrix[2][2]) * m_matrix[0][3] - + (2.0 * m_matrix[3][0] - 4.0 * m_matrix[2][2]) * m_matrix[1][1] - - 2.0 * m_matrix[2][0] * m_matrix[3][2] - + 2.0 * m_matrix[2][2] * m_matrix[3][0] - + m_matrix[0][0] * m_matrix[3][3] - + 4.0 * m_matrix[1][2] * m_matrix[2][1] - - 2.0 * m_matrix[0][1] * m_matrix[1][3] - - 2.0 * m_matrix[1][0] * m_matrix[3][1] - - 2.0 * m_matrix[0][2] * m_matrix[2][3] - ) - a_3 = ( - -2.0 * m_matrix[3][0] - + 4.0 * m_matrix[1][1] - + 4.0 * m_matrix[2][2] - - 2.0 * m_matrix[0][3] - ) - a_4 = -4 + b_matrix = np.array([[0, 0, 0, -2], [0, 1, 0, 0], [0, 0, 1, 0], [-2, 0, 0, 0]]) - def pol_func(x: float) -> float: - return a_0 + a_1 * x + a_2 * x**2 + a_3 * x**3 + a_4 * x**4 + coefficients = np.poly(np.linalg.eigvals(np.linalg.inv(b_matrix).dot(m_matrix))) + roots = np.roots(coefficients) + eta = np.min(np.real([root for root in roots if np.isreal(root) and root > 0])) - def der_pol_func(x: float) -> float: - return a_1 + 2 * a_2 * x + 3 * a_3 * x**2 + 4 * a_4 * x**3 - - eta = newton(pol_func, 0.0, fprime=der_pol_func) - - m_matrix[3][0] = m_matrix[3][0] + 2 * eta - m_matrix[0][3] = m_matrix[0][3] + 2 * eta - m_matrix[1][1] = m_matrix[1][1] - eta - m_matrix[2][2] = m_matrix[2][2] - eta + def f_matrix(a_vector, m_matrix, b_matrix, eta): + a_vector = np.array(a_vector) + return a_vector.T @ m_matrix @ a_vector - eta * ( + a_vector.T @ b_matrix @ a_vector - 1 + ) - _, s, vt = np.linalg.svd(m_matrix) - a_vec = vt[np.argmin(s), :] + def constraint(a_vector, b_matrix): + a_vector = np.array(a_vector) + return a_vector.T @ b_matrix @ a_vector - 1 - x_c = -a_vec[1] / (2.0 * a_vec[0]) - y_c = -a_vec[2] / (2.0 * a_vec[0]) + constraints = [{"type": "eq", "fun": constraint, "args": (b_matrix,)}] - r_0 = ( - 1.0 - / (2.0 * np.absolute(a_vec[0])) - * np.sqrt(a_vec[1] * a_vec[1] + a_vec[2] * a_vec[2] - 4.0 * a_vec[0] * a_vec[3]) + a_vector = np.ones(4) + result = minimize( + f_matrix, a_vector, args=(m_matrix, b_matrix, eta), constraints=constraints + ) + a_vector = result.x + + x_c = -a_vector[1] / (2 * a_vector[0]) + y_c = -a_vector[2] / (2 * a_vector[0]) + r_0 = 1 / ( + 2 + * np.abs(a_vector[0]) + * np.sqrt( + a_vector[1] * a_vector[1] + + a_vector[2] * a_vector[2] + - 4 * a_vector[0] * a_vector[3] + ) ) return ( From 0d89efe2fc88aeac3d7728dd48c246e1d6061381 Mon Sep 17 00:00:00 2001 From: Marco Gobbo Date: Sat, 13 Jul 2024 10:05:01 +0200 Subject: [PATCH 27/45] Add chi2_reduced_complex function --- src/qibocal/protocols/utils.py | 34 ++++++++++++++++++++++++++++++++-- 1 file changed, 32 insertions(+), 2 deletions(-) diff --git a/src/qibocal/protocols/utils.py b/src/qibocal/protocols/utils.py index 2d26f1451..59e3b1bd7 100644 --- a/src/qibocal/protocols/utils.py +++ b/src/qibocal/protocols/utils.py @@ -1,6 +1,6 @@ from colorsys import hls_to_rgb from enum import Enum -from typing import Union +from typing import Optional, Union import numpy as np import pandas as pd @@ -907,7 +907,7 @@ def chi2_reduced( observed: NDArray, estimated: NDArray, errors: NDArray, - dof: float = None, + dof: Optional[float] = None, ): if np.count_nonzero(errors) < len(errors): return EXTREME_CHI @@ -920,6 +920,36 @@ def chi2_reduced( return chi2 +def chi2_reduced_complex( + observed: tuple[NDArray, NDArray], + estimated: NDArray, + errors: tuple[NDArray, NDArray], + dof: Optional[float] = None, +): + + observed_complex = np.abs(observed[0] * np.exp(1j * observed[1])) + + observed_real = np.real(observed_complex) + observed_imag = np.imag(observed_complex) + + estimated_real = np.real(estimated) + estimated_imag = np.imag(estimated) + + observed_error_real = np.sqrt( + (np.cos(observed[1]) * errors[0]) ** 2 + + (observed[0] * np.sin(observed[1]) * errors[1]) ** 2 + ) + observed_error_imag = np.sqrt( + (np.sin(observed[1]) * errors[0]) ** 2 + + (observed[0] * np.cos(observed[1]) * errors[1]) ** 2 + ) + + chi2_real = chi2_reduced(observed_real, estimated_real, observed_error_real, dof) + chi2_imag = chi2_reduced(observed_imag, estimated_imag, observed_error_imag, dof) + + return chi2_real + chi2_imag + + def get_color_state0(number): return "rgb" + str(hls_to_rgb((-0.35 - number * 9 / 20) % 1, 0.6, 0.75)) From d87e2472f547ceed49a1657c65c779054b0ebd73 Mon Sep 17 00:00:00 2001 From: Marco Gobbo Date: Sat, 13 Jul 2024 10:06:03 +0200 Subject: [PATCH 28/45] Update circle_fit function --- src/qibocal/protocols/resonator_utils.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/qibocal/protocols/resonator_utils.py b/src/qibocal/protocols/resonator_utils.py index df5df750d..38e3411da 100644 --- a/src/qibocal/protocols/resonator_utils.py +++ b/src/qibocal/protocols/resonator_utils.py @@ -60,8 +60,10 @@ def circle_fit(z: NDArray) -> tuple[float, float, float]: b_matrix = np.array([[0, 0, 0, -2], [0, 1, 0, 0], [0, 0, 1, 0], [-2, 0, 0, 0]]) - coefficients = np.poly(np.linalg.eigvals(np.linalg.inv(b_matrix).dot(m_matrix))) - roots = np.roots(coefficients) + coefficients = np.polynomial.Polynomial.fromroots( + np.linalg.eigvals(np.linalg.inv(b_matrix).dot(m_matrix)) + ) + roots = coefficients.roots() eta = np.min(np.real([root for root in roots if np.isreal(root) and root > 0])) def f_matrix(a_vector, m_matrix, b_matrix, eta): From a8fd3352c56bdfa74b40315cec59b6746332969e Mon Sep 17 00:00:00 2001 From: Marco Gobbo Date: Sat, 13 Jul 2024 10:06:26 +0200 Subject: [PATCH 29/45] Update _fit method Using chi2_reduced_complex function and improved readability for fitting with s21 or lorentzian --- .../protocols/resonator_spectroscopy.py | 62 ++++--------------- 1 file changed, 13 insertions(+), 49 deletions(-) diff --git a/src/qibocal/protocols/resonator_spectroscopy.py b/src/qibocal/protocols/resonator_spectroscopy.py index 7fb7bf71e..6a2d8e085 100644 --- a/src/qibocal/protocols/resonator_spectroscopy.py +++ b/src/qibocal/protocols/resonator_spectroscopy.py @@ -14,6 +14,7 @@ from .utils import ( PowerLevel, chi2_reduced, + chi2_reduced_complex, lorentzian, lorentzian_fit, s21, @@ -210,15 +211,12 @@ def _fit( chi2 = {} amplitudes = {} + fit = s21_fit if data.fit_function == "s21" else lorentzian_fit + for qubit in qubits: - if data.fit_function == "s21": - fit_result = s21_fit( - data[qubit], resonator_type=data.resonator_type, fit="resonator" - ) - else: - fit_result = lorentzian_fit( - data[qubit], resonator_type=data.resonator_type, fit="resonator" - ) + fit_result = fit( + data[qubit], resonator_type=data.resonator_type, fit="resonator" + ) if fit_result is not None: ( frequency[qubit], @@ -232,45 +230,11 @@ def _fit( bare_frequency[qubit] = frequency[qubit] if data.fit_function == "s21": - z_data = np.abs(data[qubit].signal) * np.exp(1j * data[qubit].phase) - z_fit = s21(data[qubit].freq, *fitted_parameters[qubit]) - - z_data_real = np.real(z_data) - z_data_imag = np.imag(z_data) - - z_fit_real = np.real(z_fit) - z_fit_imag = np.imag(z_fit) - - z_data_error_real = np.sqrt( - (np.cos(data[qubit].phase) * data[qubit].error_signal) ** 2 - + ( - data[qubit].signal - * np.sin(data[qubit].phase) - * data[qubit].error_phase - ) - ** 2 - ) - z_data_error_imag = np.sqrt( - (np.sin(data[qubit].phase) * data[qubit].error_signal) ** 2 - + ( - data[qubit].signal - * np.cos(data[qubit].phase) - * data[qubit].error_phase - ) - ** 2 - ) - chi2[qubit] = ( - chi2_reduced( - z_data_real, - z_fit_real, - z_data_error_real, - dof, - ) - + chi2_reduced( - z_data_imag, - z_fit_imag, - z_data_error_imag, + chi2_reduced_complex( + (data[qubit].signal, data[qubit].phase), + s21(data[qubit].freq, *fitted_parameters[qubit]), + (data[qubit].error_signal, data[qubit].error_phase), dof, ), np.sqrt(2 / dof), @@ -281,6 +245,7 @@ def _fit( data[qubit].signal, lorentzian(data[qubit].freq, *fitted_parameters[qubit]), data[qubit].error_signal, + dof, ), np.sqrt(2 / dof), ) @@ -311,9 +276,8 @@ def _plot( data: ResonatorSpectroscopyData, target: QubitId, fit: ResonatorSpectroscopyResults ): """Plotting function for ResonatorSpectroscopy.""" - if data.fit_function == "s21": - return s21_spectroscopy_plot(data, target, fit) - return spectroscopy_plot(data, target, fit) + plot = s21_spectroscopy_plot if data.fit_function == "s21" else spectroscopy_plot + return plot(data, target, fit) def _update(results: ResonatorSpectroscopyResults, platform: Platform, target: QubitId): From e0f329c9e091be55dcc452964634d0abf1ac8588 Mon Sep 17 00:00:00 2001 From: Marco Gobbo Date: Tue, 16 Jul 2024 11:49:57 +0200 Subject: [PATCH 30/45] Minor changes --- src/qibocal/protocols/resonator_utils.py | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/src/qibocal/protocols/resonator_utils.py b/src/qibocal/protocols/resonator_utils.py index 38e3411da..7c28e03bb 100644 --- a/src/qibocal/protocols/resonator_utils.py +++ b/src/qibocal/protocols/resonator_utils.py @@ -60,20 +60,24 @@ def circle_fit(z: NDArray) -> tuple[float, float, float]: b_matrix = np.array([[0, 0, 0, -2], [0, 1, 0, 0], [0, 0, 1, 0], [-2, 0, 0, 0]]) - coefficients = np.polynomial.Polynomial.fromroots( - np.linalg.eigvals(np.linalg.inv(b_matrix).dot(m_matrix)) + coefficients = np.linalg.eigvals(np.linalg.inv(b_matrix).dot(m_matrix)) + + eta = np.min( + np.real( + [ + coefficient + for coefficient in coefficients + if np.isreal(coefficient) and coefficient > 0 + ] + ) ) - roots = coefficients.roots() - eta = np.min(np.real([root for root in roots if np.isreal(root) and root > 0])) def f_matrix(a_vector, m_matrix, b_matrix, eta): - a_vector = np.array(a_vector) return a_vector.T @ m_matrix @ a_vector - eta * ( a_vector.T @ b_matrix @ a_vector - 1 ) def constraint(a_vector, b_matrix): - a_vector = np.array(a_vector) return a_vector.T @ b_matrix @ a_vector - 1 constraints = [{"type": "eq", "fun": constraint, "args": (b_matrix,)}] From 4486c0c50daf9c218d9ae4bbd9e0b151da1082ef Mon Sep 17 00:00:00 2001 From: Marco Gobbo Date: Fri, 26 Jul 2024 15:11:49 +0200 Subject: [PATCH 31/45] Update s21_fit method --- src/qibocal/protocols/resonator_utils.py | 29 ++++++++++++------------ 1 file changed, 14 insertions(+), 15 deletions(-) diff --git a/src/qibocal/protocols/resonator_utils.py b/src/qibocal/protocols/resonator_utils.py index 7c28e03bb..2d772191d 100644 --- a/src/qibocal/protocols/resonator_utils.py +++ b/src/qibocal/protocols/resonator_utils.py @@ -36,7 +36,7 @@ def remove_cable_delay(frequencies: NDArray, z: NDArray, tau: float) -> NDArray: return z * np.exp(2j * np.pi * frequencies * tau) -def circle_fit(z: NDArray) -> tuple[float, float, float]: +def circle_fit(z: NDArray) -> tuple[complex, float]: """Fits the circle of a scattering matrix element array. The circle fit exploits the algebraic fit described in @@ -101,13 +101,12 @@ def constraint(a_vector, b_matrix): ) return ( - x_c * amplitude_norm + x_norm, - y_c * amplitude_norm + y_norm, + complex(x_c * amplitude_norm + x_norm, y_c * amplitude_norm + y_norm), r_0 * amplitude_norm, ) -def phase_fit(frequencies: NDArray, z: NDArray) -> NDArray: +def phase_fit(frequencies: NDArray, phases: NDArray) -> NDArray: """ Fits the phase response of a resonator. @@ -119,20 +118,20 @@ def phase_fit(frequencies: NDArray, z: NDArray) -> NDArray: Resonance frequency, loaded quality factor, offset phase and time delay between output and input signal leading to linearly frequency dependent phase shift (NDArray[float]). """ - phase = np.unwrap(np.angle(z)) + phases = np.unwrap(phases) - if np.max(phase) - np.min(phase) <= 0.8 * 2 * np.pi: - roll_off = np.max(phase) - np.min(phase) + if np.max(phases) - np.min(phases) <= 0.8 * 2 * np.pi: + roll_off = np.max(phases) - np.min(phases) else: roll_off = 2 * np.pi - phase_smooth = gaussian_filter1d(phase, 30) - phase_derivative = np.gradient(phase_smooth) - resonance_guess = frequencies[np.argmax(np.abs(phase_derivative))] + phases_smooth = gaussian_filter1d(phases, 30) + phases_derivative = np.gradient(phases_smooth) + resonance_guess = frequencies[np.argmax(np.abs(phases_derivative))] q_loaded_guess = 2 * resonance_guess / (frequencies[-1] - frequencies[0]) - slope = phase[-1] - phase[0] + roll_off + slope = phases[-1] - phases[0] + roll_off tau_guess = -slope / (2 * np.pi * (frequencies[-1] - frequencies[0])) - theta_guess = 0.5 * (np.mean(phase[:5]) + np.mean(phase[-5:])) + theta_guess = 0.5 * (np.mean(phases[:5]) + np.mean(phases[-5:])) def residuals_q_loaded(params): (q_loaded,) = params @@ -151,7 +150,7 @@ def residuals_resonance_q_loaded(params): return residuals_full((resonance, q_loaded, theta_guess, tau_guess)) def residuals_full(params): - return phase_dist(phase - phase_centered(frequencies, *params)) + return phase_dist(phases - phase_centered(frequencies, *params)) p_final = leastsq(residuals_q_loaded, [q_loaded_guess]) (q_loaded_guess,) = p_final[0] @@ -165,10 +164,10 @@ def residuals_full(params): residuals_full, [resonance_guess, q_loaded_guess, theta_guess, tau_guess] ) - return p_final[0] + return p_final[0][:-1] -def phase_dist(angle: float) -> float: +def phase_dist(angle: NDArray) -> NDArray: """Maps angle [-2pi, 2pi] to phase distance on circle [0, pi].""" return np.pi - np.abs(np.pi - np.abs(angle)) From 9b5e767ce54901cefeceea0fb3d1fecd3cf1af63 Mon Sep 17 00:00:00 2001 From: Marco Gobbo Date: Fri, 26 Jul 2024 15:14:04 +0200 Subject: [PATCH 32/45] Small changes --- src/qibocal/protocols/utils.py | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/src/qibocal/protocols/utils.py b/src/qibocal/protocols/utils.py index 59e3b1bd7..fa6ffa0c8 100644 --- a/src/qibocal/protocols/utils.py +++ b/src/qibocal/protocols/utils.py @@ -227,12 +227,10 @@ def s21_fit( tau = cable_delay(f_data, data.phase, num_points) z_1 = remove_cable_delay(f_data, z_data, tau) - x_c, y_c, r_0 = circle_fit(z_1) - z_c = x_c + 1j * y_c + z_c, r_0 = circle_fit(z_1) z_2 = z_1 - z_c - resonance, q_loaded, theta, _ = phase_fit(f_data, z_2) - theta = periodic_boundary(theta) + resonance, q_loaded, theta = phase_fit(f_data, np.angle(z_2)) beta = periodic_boundary(theta - np.pi) off_resonant_point = z_c + r_0 * np.cos(beta) + 1j * r_0 * np.sin(beta) @@ -592,7 +590,7 @@ def s21_spectroscopy_plot(data, qubit, fit: Results = None): "Fano Interference ϕ [rad]", "Amplitude [a.u.]", "Phase Shift α [rad]", - "Electronic Delay 𝜏 [rad]", + "Electronic Delay 𝜏 [s]", ] values = [ freq[qubit], From 32d8f1e44721ed312432ca4ba9da95a657cb58b8 Mon Sep 17 00:00:00 2001 From: Marco Gobbo Date: Fri, 26 Jul 2024 15:34:12 +0200 Subject: [PATCH 33/45] Add SpectroscopyFit dataclass --- .../protocols/resonator_spectroscopy.py | 70 ++++++++++++------- 1 file changed, 44 insertions(+), 26 deletions(-) diff --git a/src/qibocal/protocols/resonator_spectroscopy.py b/src/qibocal/protocols/resonator_spectroscopy.py index 6a2d8e085..358bbaee8 100644 --- a/src/qibocal/protocols/resonator_spectroscopy.py +++ b/src/qibocal/protocols/resonator_spectroscopy.py @@ -3,6 +3,7 @@ import numpy as np import numpy.typing as npt +from _collections_abc import Callable from qibolab.platform import Platform from qibolab.pulses import PulseSequence from qibolab.qubits import QubitId @@ -35,6 +36,36 @@ """Custom dtype for resonator spectroscopy.""" +@dataclass +class SpectroscopyFit: + function: Callable + fit: Callable + chi2: Callable + values: Callable + errors: Callable + plot: Callable + + +FITS = { + "lorentzian": SpectroscopyFit( + lorentzian, + lorentzian_fit, + chi2_reduced, + lambda z: z.signal, + lambda z: z.error_signal, + spectroscopy_plot, + ), + "s21": SpectroscopyFit( + s21, + s21_fit, + chi2_reduced_complex, + lambda z: (z.signal, z.phase), + lambda z: (z.error_signal, z.error_phase), + s21_spectroscopy_plot, + ), +} + + @dataclass class ResonatorSpectroscopyParameters(Parameters): """ResonatorSpectroscopy runcard inputs.""" @@ -106,7 +137,7 @@ class ResonatorSpectroscopyData(Data): """Resonator type.""" amplitudes: dict[QubitId, float] """Amplitudes provided by the user.""" - fit_function: Optional[str] = "lorentzian" + fit_function: str = "lorentzian" """Fit function (optional) used for the resonance.""" data: dict[QubitId, npt.NDArray[ResSpecType]] = field(default_factory=dict) """Raw data acquired.""" @@ -211,10 +242,10 @@ def _fit( chi2 = {} amplitudes = {} - fit = s21_fit if data.fit_function == "s21" else lorentzian_fit + fit = FITS[data.fit_function] for qubit in qubits: - fit_result = fit( + fit_result = fit.fit( data[qubit], resonator_type=data.resonator_type, fit="resonator" ) if fit_result is not None: @@ -229,27 +260,15 @@ def _fit( if data.power_level is PowerLevel.high: bare_frequency[qubit] = frequency[qubit] - if data.fit_function == "s21": - chi2[qubit] = ( - chi2_reduced_complex( - (data[qubit].signal, data[qubit].phase), - s21(data[qubit].freq, *fitted_parameters[qubit]), - (data[qubit].error_signal, data[qubit].error_phase), - dof, - ), - np.sqrt(2 / dof), - ) - else: - chi2[qubit] = ( - chi2_reduced( - data[qubit].signal, - lorentzian(data[qubit].freq, *fitted_parameters[qubit]), - data[qubit].error_signal, - dof, - ), - np.sqrt(2 / dof), - ) - + chi2[qubit] = ( + fit.chi2( + fit.values(data[qubit]), + fit.function(data[qubit].freq, *fitted_parameters[qubit]), + fit.errors(data[qubit]), + dof, + ), + np.sqrt(2 / dof), + ) amplitudes[qubit] = fitted_parameters[qubit][0] if data.power_level is PowerLevel.high: @@ -276,8 +295,7 @@ def _plot( data: ResonatorSpectroscopyData, target: QubitId, fit: ResonatorSpectroscopyResults ): """Plotting function for ResonatorSpectroscopy.""" - plot = s21_spectroscopy_plot if data.fit_function == "s21" else spectroscopy_plot - return plot(data, target, fit) + return FITS[data.fit_function].plot(data, target, fit) def _update(results: ResonatorSpectroscopyResults, platform: Platform, target: QubitId): From e379ec8b5c0c3059b797b0e56acd9f0c993bc3e2 Mon Sep 17 00:00:00 2001 From: Marco Gobbo Date: Fri, 26 Jul 2024 16:37:19 +0200 Subject: [PATCH 34/45] Fix UnicodeEncodeError --- src/qibocal/protocols/utils.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/qibocal/protocols/utils.py b/src/qibocal/protocols/utils.py index fa6ffa0c8..a84851d77 100644 --- a/src/qibocal/protocols/utils.py +++ b/src/qibocal/protocols/utils.py @@ -587,10 +587,10 @@ def s21_spectroscopy_plot(data, qubit, fit: Results = None): "Loaded Quality Factor", "Internal Quality Factor", "Coupling Quality Factor", - "Fano Interference ϕ [rad]", + "Fano Interference [rad]", "Amplitude [a.u.]", - "Phase Shift α [rad]", - "Electronic Delay 𝜏 [s]", + "Phase Shift [rad]", + "Electronic Delay [s]", ] values = [ freq[qubit], From 35310953121ec3fc048ee61fa34795660c5c9895 Mon Sep 17 00:00:00 2001 From: Marco Gobbo Date: Mon, 29 Jul 2024 14:34:53 +0200 Subject: [PATCH 35/45] Remove phase unwrapping, moved to Qibolab --- src/qibocal/protocols/resonator_utils.py | 2 -- src/qibocal/protocols/utils.py | 4 +++- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/qibocal/protocols/resonator_utils.py b/src/qibocal/protocols/resonator_utils.py index 2d772191d..f9c5da42c 100644 --- a/src/qibocal/protocols/resonator_utils.py +++ b/src/qibocal/protocols/resonator_utils.py @@ -15,7 +15,6 @@ def cable_delay(frequencies: NDArray, phases: NDArray, num_points: int) -> float The `num_points` is used to select how many points should be fitted, from both the start and the end of the frequency range. """ - phases = np.unwrap(phases) frequencies_selected = np.concatenate( (frequencies[:num_points], frequencies[-num_points:]) ) @@ -118,7 +117,6 @@ def phase_fit(frequencies: NDArray, phases: NDArray) -> NDArray: Resonance frequency, loaded quality factor, offset phase and time delay between output and input signal leading to linearly frequency dependent phase shift (NDArray[float]). """ - phases = np.unwrap(phases) if np.max(phases) - np.min(phases) <= 0.8 * 2 * np.pi: roll_off = np.max(phases) - np.min(phases) diff --git a/src/qibocal/protocols/utils.py b/src/qibocal/protocols/utils.py index a84851d77..2dec62d1b 100644 --- a/src/qibocal/protocols/utils.py +++ b/src/qibocal/protocols/utils.py @@ -230,7 +230,9 @@ def s21_fit( z_c, r_0 = circle_fit(z_1) z_2 = z_1 - z_c - resonance, q_loaded, theta = phase_fit(f_data, np.angle(z_2)) + phases = np.unwrap(np.angle(z_2)) + + resonance, q_loaded, theta = phase_fit(f_data, phases) beta = periodic_boundary(theta - np.pi) off_resonant_point = z_c + r_0 * np.cos(beta) + 1j * r_0 * np.sin(beta) From f59cd24033281c03ab006f502b806fa5b44315ba Mon Sep 17 00:00:00 2001 From: Marco Gobbo Date: Mon, 29 Jul 2024 14:48:58 +0200 Subject: [PATCH 36/45] Add constants --- src/qibocal/protocols/resonator_utils.py | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/qibocal/protocols/resonator_utils.py b/src/qibocal/protocols/resonator_utils.py index f9c5da42c..b871c794f 100644 --- a/src/qibocal/protocols/resonator_utils.py +++ b/src/qibocal/protocols/resonator_utils.py @@ -3,6 +3,10 @@ from scipy.ndimage import gaussian_filter1d from scipy.optimize import leastsq, minimize +PHASES_THRESHOLD_PERCENTAGE = 80 +STD_DEV_GAUSSIAN_KERNEL = 30 +PHASE_ELEMENTS = 5 + def cable_delay(frequencies: NDArray, phases: NDArray, num_points: int) -> float: """Evaluates the cable delay :math:`\tau`. @@ -118,18 +122,20 @@ def phase_fit(frequencies: NDArray, phases: NDArray) -> NDArray: and input signal leading to linearly frequency dependent phase shift (NDArray[float]). """ - if np.max(phases) - np.min(phases) <= 0.8 * 2 * np.pi: + if np.max(phases) - np.min(phases) <= PHASES_THRESHOLD_PERCENTAGE / 100 * 2 * np.pi: roll_off = np.max(phases) - np.min(phases) else: roll_off = 2 * np.pi - phases_smooth = gaussian_filter1d(phases, 30) + phases_smooth = gaussian_filter1d(phases, STD_DEV_GAUSSIAN_KERNEL) phases_derivative = np.gradient(phases_smooth) resonance_guess = frequencies[np.argmax(np.abs(phases_derivative))] q_loaded_guess = 2 * resonance_guess / (frequencies[-1] - frequencies[0]) slope = phases[-1] - phases[0] + roll_off tau_guess = -slope / (2 * np.pi * (frequencies[-1] - frequencies[0])) - theta_guess = 0.5 * (np.mean(phases[:5]) + np.mean(phases[-5:])) + theta_guess = 0.5 * ( + np.mean(phases[:PHASE_ELEMENTS]) + np.mean(phases[-PHASE_ELEMENTS:]) + ) def residuals_q_loaded(params): (q_loaded,) = params From 8cace75d0f2463f4df770fb62ef616095c7ddab5 Mon Sep 17 00:00:00 2001 From: Marco Gobbo Date: Mon, 29 Jul 2024 14:53:53 +0200 Subject: [PATCH 37/45] Minor changes --- src/qibocal/protocols/resonator_spectroscopy.py | 4 ++-- tests/runcards/protocols.yml | 12 ++++++------ 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/qibocal/protocols/resonator_spectroscopy.py b/src/qibocal/protocols/resonator_spectroscopy.py index 358bbaee8..1e03e3c62 100644 --- a/src/qibocal/protocols/resonator_spectroscopy.py +++ b/src/qibocal/protocols/resonator_spectroscopy.py @@ -77,8 +77,8 @@ class ResonatorSpectroscopyParameters(Parameters): power_level: Union[PowerLevel, str] """Power regime (low or high). If low the readout frequency will be updated. If high both the readout frequency and the bare resonator frequency will be updated.""" - fit_function: Optional[str] = "lorentzian" - """Fit function (optional) used for the resonance.""" + fit_function: str = "lorentzian" + """Fit function used for the resonance.""" amplitude: Optional[float] = None """Readout amplitude (optional). If defined, same amplitude will be used in all qubits. Otherwise the default amplitude defined on the platform runcard will be used""" diff --git a/tests/runcards/protocols.yml b/tests/runcards/protocols.yml index 760f0b33b..16d68dd2a 100644 --- a/tests/runcards/protocols.yml +++ b/tests/runcards/protocols.yml @@ -33,8 +33,8 @@ actions: - id: resonator high power low attenuation operation: resonator_spectroscopy parameters: - freq_width: 10_000_000 # 20_000_000 - freq_step: 100_000 # 500_00 + freq_width: 10_000_000 + freq_step: 100_000 attenuation: 15 power_level: high nshots: 10 @@ -43,8 +43,8 @@ actions: - id: resonator low power high attenuation operation: resonator_spectroscopy parameters: - freq_width: 10_000_000 # 20_000_000 - freq_step: 100_000 # 500_00 + freq_width: 10_000_000 + freq_step: 100_000 attenuation: 60 power_level: low nshots: 10 @@ -53,8 +53,8 @@ actions: - id: resonator low power high attenuation s21 operation: resonator_spectroscopy parameters: - freq_width: 10_000_000 # 20_000_000 - freq_step: 100_000 # 500_00 + freq_width: 10_000_000 + freq_step: 100_000 attenuation: 60 power_level: low nshots: 10 From 76da7eefc7735db4aa0dc323256ec771e50ff8a8 Mon Sep 17 00:00:00 2001 From: Marco Gobbo Date: Tue, 30 Jul 2024 14:53:30 +0200 Subject: [PATCH 38/45] Update docstrings --- .../protocols/resonator_spectroscopy.py | 17 ++++- src/qibocal/protocols/resonator_utils.py | 76 +++++++++---------- src/qibocal/protocols/utils.py | 7 +- 3 files changed, 53 insertions(+), 47 deletions(-) diff --git a/src/qibocal/protocols/resonator_spectroscopy.py b/src/qibocal/protocols/resonator_spectroscopy.py index 1e03e3c62..f8159207b 100644 --- a/src/qibocal/protocols/resonator_spectroscopy.py +++ b/src/qibocal/protocols/resonator_spectroscopy.py @@ -37,17 +37,25 @@ @dataclass -class SpectroscopyFit: +class ResonatorSpectroscopyFit: + """ResonatorSpectroscopy fit.""" + function: Callable + """Routine function to fit data with a model.""" fit: Callable + """Fit function used for the resonance.""" chi2: Callable + """Chi2 reduced.""" values: Callable + """Extract values from data.""" errors: Callable + """Extract errors from data.""" plot: Callable + """Plotting function for ResonatorSpectroscopy.""" FITS = { - "lorentzian": SpectroscopyFit( + "lorentzian": ResonatorSpectroscopyFit( lorentzian, lorentzian_fit, chi2_reduced, @@ -55,7 +63,7 @@ class SpectroscopyFit: lambda z: z.error_signal, spectroscopy_plot, ), - "s21": SpectroscopyFit( + "s21": ResonatorSpectroscopyFit( s21, s21_fit, chi2_reduced_complex, @@ -64,6 +72,7 @@ class SpectroscopyFit: s21_spectroscopy_plot, ), } +"""Dictionary of available fitting routines for ResonatorSpectroscopy.""" @dataclass @@ -78,7 +87,7 @@ class ResonatorSpectroscopyParameters(Parameters): """Power regime (low or high). If low the readout frequency will be updated. If high both the readout frequency and the bare resonator frequency will be updated.""" fit_function: str = "lorentzian" - """Fit function used for the resonance.""" + """Routine function (lorentzian or s21) to fit data with a model.""" amplitude: Optional[float] = None """Readout amplitude (optional). If defined, same amplitude will be used in all qubits. Otherwise the default amplitude defined on the platform runcard will be used""" diff --git a/src/qibocal/protocols/resonator_utils.py b/src/qibocal/protocols/resonator_utils.py index b871c794f..745af3e20 100644 --- a/src/qibocal/protocols/resonator_utils.py +++ b/src/qibocal/protocols/resonator_utils.py @@ -4,15 +4,18 @@ from scipy.optimize import leastsq, minimize PHASES_THRESHOLD_PERCENTAGE = 80 +r"""Threshold percentage to ensure the phase data covers a significant portion of the full 2 :math:\pi circle.""" STD_DEV_GAUSSIAN_KERNEL = 30 +"""Standard deviation for the Gaussian kernel.""" PHASE_ELEMENTS = 5 +"""Number of values to better guess :math:`\theta` (in rad) in the phase fit function.""" def cable_delay(frequencies: NDArray, phases: NDArray, num_points: int) -> float: - """Evaluates the cable delay :math:`\tau`. + """Evaluates the cable delay :math:`\tau` (in s). - The cable delay :math:`tau` is caused by the length of the cable and the finite speed of light. - This is estimated fitting a first-grade polynomial fit of the `phases` as a function of the + The cable delay :math:`\tau` (in s) is caused by the length of the cable and the finite speed of light. + This is estimated fitting a first-grade polynomial fit of the `phases` (in rad) as a function of the `frequencies` (in Hz), and extracting the angular coefficient, which is then expressed in seconds. @@ -30,7 +33,7 @@ def cable_delay(frequencies: NDArray, phases: NDArray, num_points: int) -> float def remove_cable_delay(frequencies: NDArray, z: NDArray, tau: float) -> NDArray: - """Corrects the cable delay :math:`\tau`. + """Corrects the cable delay :math:`\tau` (in s). The cable delay :math:`\tau` (in s) is removed from the scattering matrix element array `z` by performing an exponential product which also depends from the `frequencies` (in Hz). @@ -44,8 +47,12 @@ def circle_fit(z: NDArray) -> tuple[complex, float]: The circle fit exploits the algebraic fit described in "Efficient and robust analysis of complex scattering data under noise in microwave resonators" - (https://doi.org/10.1063/1.4907935) by S. Probst et al. The function, from the scattering matrix - element array, evaluates the center coordinates `x_c` and `y_c` and the radius of the circle `r_0`. + (https://doi.org/10.1063/1.4907935) by S. Probst et al and + "The physics of superconducting microwave resonators" + (https://doi.org/10.7907/RAT0-VM75) by J. Gao. + + The function, from the scattering matrix element array, evaluates the center coordinates + `x_c` and `y_c` and the radius of the circle `r_0`. """ z = z.copy() @@ -110,16 +117,19 @@ def constraint(a_vector, b_matrix): def phase_fit(frequencies: NDArray, phases: NDArray) -> NDArray: - """ - Fits the phase response of a resonator. - - Args: - frequencies (NDArray[float]): frequencies (Hz) at which the measurement was taken. - z (NDArray[complex]): S21 scattering matrix element. - - Returns: - Resonance frequency, loaded quality factor, offset phase and time delay between output - and input signal leading to linearly frequency dependent phase shift (NDArray[float]). + r"""Fits the phase response of a resonator. + + The phase fit firstly ensure the phase data (in rad) covers a significant portion of the full 2 :math:`\pi` + circle evaluating a `roll_off`. If the data do not cover a full circle it is possible to increase + the frequency span around the resonance. Data are smoothed using a Gaussian filter and the + derivative is evaluated while initial guesses for the parameters (`resonance_guess` (in Hz)), + `q_loaded_guess`, `tau_guess` (in s) and `theta_guess` (in rad) are computed with `frequencies` (in Hz). + + The parameter estimation is done through an iterative least squares process to optimize the model + parameters. The defined functions: `residuals_q_loaded`, `residuals_resonance_theta` + `residuals_resonance_theta`, `residuals_tau`, `residuals_resonance_q_loaded`, `residuals_full` + take the parameters to be fitted and return the residuals calculated by subtracting the phase + centered model from the phase data (in rad). """ if np.max(phases) - np.min(phases) <= PHASES_THRESHOLD_PERCENTAGE / 100 * 2 * np.pi: @@ -171,9 +181,9 @@ def residuals_full(params): return p_final[0][:-1] -def phase_dist(angle: NDArray) -> NDArray: - """Maps angle [-2pi, 2pi] to phase distance on circle [0, pi].""" - return np.pi - np.abs(np.pi - np.abs(angle)) +def phase_dist(phases: NDArray) -> NDArray: + """Maps `phases` (in rad) [-2pi, 2pi] to phase distance on circle [0, pi].""" + return np.pi - np.abs(np.pi - np.abs(phases)) def phase_centered( @@ -183,19 +193,12 @@ def phase_centered( theta: float, tau: float = 0.0, ) -> NDArray: - """ - Evaluates the phase response of a resonator which corresponds to a circle centered around - the origin. Additionally, a linear background slope is accounted for if needed. - - Args: - frequencies (NDArray[float]): frequencies (Hz) at which the measurement was taken. - resonance (float): resonance frequency. - q_loaded (float): loaded quality factor. - theta (float): offset phase. - tau (float): time delay between output and input signal leading to linearly frequency - dependent phase shift. - Returns: - Phase centered array (NDArray[float]). + """Evaluates the phase (in rad) response of a resonator. + + The phase centered evaluates the phase angle (in rad) of a circle centered around the origin accounting + for a phase offset :math:`\theta` (in rad), a linear background slope + :math: 2\\pi `\tau` (in s) (`frequencies` (in Hz) - `resonance` (in Hz)) (if needed) and a dependency on + the `q_loaded`. """ return ( theta @@ -205,12 +208,5 @@ def phase_centered( def periodic_boundary(angle: float) -> float: - """ - Maps arbitrary angle to interval [-np.pi, np.pi). - - Args: - angle (float): angle to be mapped. - Returns: - Mapped angle (float). - """ + """Maps arbitrary `angle` (in rad) to interval [-np.pi, np.pi).""" return (angle + np.pi) % (2 * np.pi) - np.pi diff --git a/src/qibocal/protocols/utils.py b/src/qibocal/protocols/utils.py index 2dec62d1b..fa6c08ffc 100644 --- a/src/qibocal/protocols/utils.py +++ b/src/qibocal/protocols/utils.py @@ -176,10 +176,11 @@ def s21( alpha: float = 0.0, tau: float = 0.0, ) -> NDArray: - """ - Full model of the S21 notch resonator based on eq. (1) described in: + """Full model of the S21 notch resonator based on eq. (1) described in: "Efficient and robust analysis of complex scattering data under noise in microwave resonators" - (https://doi.org/10.1063/1.4907935) by S. Probst et al. + (https://doi.org/10.1063/1.4907935) by S. Probst et al and on eq. (E.1) described in: + "The Physics of Superconducting Microwave Resonators" + (https://doi.org/10.7907/RAT0-VM75) by J. Gao. The equation is split into two parts describing the ideal resonator and the environment. From b59ef87d1343ff94c6d7c3d05b87a81cbe710d7a Mon Sep 17 00:00:00 2001 From: Marco Gobbo Date: Tue, 30 Jul 2024 16:43:38 +0200 Subject: [PATCH 39/45] Remove unwrapping --- src/qibocal/protocols/utils.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/qibocal/protocols/utils.py b/src/qibocal/protocols/utils.py index fa6c08ffc..f7bd0e4b9 100644 --- a/src/qibocal/protocols/utils.py +++ b/src/qibocal/protocols/utils.py @@ -472,7 +472,7 @@ def s21_spectroscopy_plot(data, qubit, fit: Results = None): fig_raw.add_trace( go.Scatter( x=frequencies * HZ_TO_GHZ, - y=np.unwrap(phase), + y=phase, mode="markers", marker=dict( size=4, From 11d74602f45a89e4ad9dac1c7312869d0fe37367 Mon Sep 17 00:00:00 2001 From: Marco Gobbo Date: Mon, 5 Aug 2024 14:40:39 +0200 Subject: [PATCH 40/45] Add phase unwrapping This is a temporary solution before qibolab implements it. --- src/qibocal/protocols/resonator_spectroscopy.py | 1 + src/qibocal/protocols/utils.py | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/qibocal/protocols/resonator_spectroscopy.py b/src/qibocal/protocols/resonator_spectroscopy.py index f8159207b..309acbbe0 100644 --- a/src/qibocal/protocols/resonator_spectroscopy.py +++ b/src/qibocal/protocols/resonator_spectroscopy.py @@ -254,6 +254,7 @@ def _fit( fit = FITS[data.fit_function] for qubit in qubits: + data[qubit].phase = np.unwrap(data[qubit].phase) fit_result = fit.fit( data[qubit], resonator_type=data.resonator_type, fit="resonator" ) diff --git a/src/qibocal/protocols/utils.py b/src/qibocal/protocols/utils.py index f7bd0e4b9..79bf2e364 100644 --- a/src/qibocal/protocols/utils.py +++ b/src/qibocal/protocols/utils.py @@ -432,7 +432,7 @@ def s21_spectroscopy_plot(data, qubit, fit: Results = None): fitting_report = "" frequencies = qubit_data.freq signal = qubit_data.signal - phase = qubit_data.phase + phase = np.unwrap(qubit_data.phase) s21_raw = np.abs(signal) * np.exp(1j * phase) fig_raw.add_trace( From 792f13c532447e1ec1cc043742ecabcd983cb1d9 Mon Sep 17 00:00:00 2001 From: Marco Gobbo Date: Mon, 5 Aug 2024 14:41:59 +0200 Subject: [PATCH 41/45] Update docs --- .../protocols/resonator_spectroscopy.rst | 119 ++++++++++++++---- .../resonator_spectroscopy_simulation.png | Bin 0 -> 117333 bytes doc/source/refs.bib | 36 ++++++ 3 files changed, 128 insertions(+), 27 deletions(-) create mode 100644 doc/source/protocols/resonator_spectroscopy_simulation.png diff --git a/doc/source/protocols/resonator_spectroscopy.rst b/doc/source/protocols/resonator_spectroscopy.rst index 798b84275..fab6fcadf 100644 --- a/doc/source/protocols/resonator_spectroscopy.rst +++ b/doc/source/protocols/resonator_spectroscopy.rst @@ -4,28 +4,15 @@ Resonator spectroscopy ====================== -When calibrating the readout pulse, the first thing to do is finding the resonator frequency. -At this frequency we will be able to observe a clear difference in the transmitted -signal: if the resonator is a 3D cavity we will observe an amplified signal, while for a -2D resonator we will observe a higher absorption. In both cases, we expect to see a -Lorentzian peak (positive for 3D cavity or negative for 2D resonators). - -In the experiment, we send a readout pulse with fixed duration and amplitude and, -after waiting for the time of flight, we acquire a waveform that we average, obtaining a single -point. This experiment is extremely dependent on the amplitude of the pulse. - -Since the objective of this experiment is to find the resonator frequency, without any readout -optimization (something that we will have to do afterwards), we can fix the duration of -the pulse in the order of magnitude of µs. -For the amplitude the discussion is slightly more complex and there are several -elements to take into consideration: - -* higher amplitudes usually correspond to better signal to noise ratio; -* at high amplitudes the signal breaks superconductivity, therefore resonator is not effectively not coupled to the qubit (we talk of bare resonator frequency); -* at intermediate amplitudes the peak could completely disappear and is, in general, not Lorentzian; -* very high amplitudes could damage the components. +When calibrating the readout pulse, the first step is to identify the resonator frequency. +At this frequency, we can observe a clear difference in the transmitted signal: for a 3D cavity resonator, +an amplified signal will be observed, whereas for a 2D resonator, higher absorption will be spotted. +In both cases, a Lorentzian peak is expected, which will be positive for 3D cavities and negative for 2D resonators. -The bare resonator frequency can be found setting a large value for the amplitude, e.g.: +.. image:: resonator_spectroscopy_simulation.png + +In the experiment, we send a readout pulse with a fixed duration and amplitude. +After waiting for the time of flight, we acquire and average a waveform, resulting in a single point. Parameters ^^^^^^^^^^ @@ -33,6 +20,17 @@ Parameters .. autoclass:: qibocal.protocols.resonator_spectroscopy.ResonatorSpectroscopyParameters :noindex: +This experiment is highly dependent on the pulse amplitude. The primary goal is to determine the resonator frequency +without any readout optimization, which will be addressed later. +For this purpose, we can fix the pulse duration to the order of magnitude of microseconds. +The discussion regarding amplitude is more complex and involves several considerations: + +* higher amplitudes usually correspond to a better signal-to-noise ratio; +* at high amplitudes the signal breaks superconductivity, therefore resonator is not effectively not coupled to the qubit (we talk of bare resonator frequency); +* at intermediate amplitudes the peak could completely disappear and is, in general, not Lorentzian; +* very high amplitudes could damage the components. + +The bare resonator frequency can be found by setting a large value for the amplitude, e.g.: Example ^^^^^^^ @@ -53,9 +51,9 @@ Example .. note:: The resonator spectroscopy experiment will be performed by computing the average on hardware. If the user wants to retrieve all the shots - and perform the average afterwards it can be done by specifying the - entry `hardware_average: false` in the experiment parameters. In this - case the fitting procedure will take into account errors and error bands + and perform the average afterward it can be done by specifying the + entry hardware_average: false in the experiment parameters. In this + case, the fitting procedure will consider errors and error bands will be included in the plot. .. image:: resonator_spectroscopy_error_bars.png @@ -84,7 +82,74 @@ Example .. image:: resonator_spectroscopy_low.png Running the ``qibocal`` routines above produces outputs in the reports like the ones shown above. -The peaks are Lorentzian. As we can see, at low power the resonator fequency shifts. +The peaks are Lorentzian. However, a better description for a 2D notch resonator resonance profile is provided by +:cite:p:`Gao2008, Probst2015` where the complex signal is modeled as + +.. math:: + + S_{21}(f) = ae^{i\alpha}e^{-2\pi i f \tau}\left[ 1 - \frac{(Q_l/|Q_c|)e^{i\phi}}{1 + 2iQ_l(f/f_r -1)} \right] + +This description gives insightful information, the first part describes the environment which involves: + +* :math:`a`: amplitude resulting from the attenuation and gain in the measurement system; +* :math:`\alpha`: phase-shift associated with :math:`a`; +* :math:`\tau`: cable delay caused by the length of the cable and the finite speed of light. + +The second part describes the resonance of an ideal 2D notch resonator: + +* :math:`Q_l`: loaded (total) quality factor; +* :math:`Q_c`: coupling (external) quality factor; +* :math:`\phi`: accounts for impedance mismatches or reflections in cables (Fano interferences); +* :math:`f_r`: resonance frequency. + +The routine should be preferred over the Lorentzian fit because it exploits all the information in a signal, including both magnitude and phase. +Nonetheless, performing a direct fit for all seven parameters simultaneously involves handling a nonlinear multi-parameter fitting problem, +which is non-robust and extremely sensitive to the initial values. Therefore, the problem is divided into several independent fitting tasks to +enhance robustness and accuracy: + +* Cable delay correction: the cable delay titls the phase signal by a slope :math:`2\pi\tau` and to get a rough estimate, it is + sufficient to fit a linear function to the phase signal. Without any cable delay, the resonance looks like a circle in the complex + plane but the cable delay deforms this circle to a loop-like curve. +* Circle fit: the center and radius of the circle resulting from the previous step are evaluated. The routine expolits the methods + described in :cite:p:`Chernov2005`. The data are shifted to the found center. +* Phase fit: the phase angle :math:`\theta` of the centered data as a function of frequency is fit with the following profile + +.. math:: + + \theta = \theta_0 - 2\pi \tau (f-f_r) + 2 \arctan \left[2 Q_r \left( 1 - \frac{f}{f_r} \right) \right] + +The linear background slope accounts for an additional residual delay :math:`2\pi\tau(f - f_r)`, introducing an extra degree of freedom to the parameter set. +Parameter estimation is performed through an iterative least squares process to optimize the model parameters. + +Example +^^^^^^^ +.. code-block:: yaml + + - id: resonator_spectroscopy low power + + operation: resonator_spectroscopy + parameters: + freq_width: 20_000_000 + freq_step: 100_000 + amplitude: 0.01 + power_level: low + nshots: 1024 + relaxation_time: 100_000 + fit_function: "s21" + +.. note:: + The `s21` routine provides a comprehensive report of the calibration and parameter estimation process. + In the first row, the raw data are shown in the complex plane, typically distributed as a loop-like curve. + To the right, the magnitude and phase of the signal of interest are presented. In the second row, after removing the environmental effects, + the calibrated data are displayed, which should be approximately distributed as a circle in the complex plane. + + + .. image:: resonator_spectroscopy_error_bars.png + +Example +^^^^^^^ + +As expected, at low power the resonator frequency shifts. This is due to the Hamiltonian of the system :cite:p:`Blais_2004, wallraff2004strong`. Therefore, the dressed resonator frequency is larger than the bare resonator frequency. @@ -99,13 +164,13 @@ down the acquisition. As per the relaxation time, for this experiment in particular we can leave it at zero: since we are not exciting the qubit we do not particularly care about it. However note that, for 3D cavities, we could end up damaging the qubit if we -send too much energy over a small period of time so it could be worth to increase the +send too much energy over a small period of time so it could be worth increasing the relaxation time. However, some electronics do not support zero relaxation times, therefore a relaxation time greater than zero is a safer choice. Last but not least, we have to choose which frequencies are probed during the scan: a very wide scan can be useful if nothing is known about the studied resonator, but in -general we have at least the design parameters. These are often not exact, but can give +general, we have at least the design parameters. These are often not exact but can give an idea of the region to scan (for standard cavities around 7 GHz). Also, a very small step between two subsequent frequency points is not needed and could really slow down the experiment (from seconds to tens of minutes) if chosen incorrectly. Usually, a step diff --git a/doc/source/protocols/resonator_spectroscopy_simulation.png b/doc/source/protocols/resonator_spectroscopy_simulation.png new file mode 100644 index 0000000000000000000000000000000000000000..36c95e120574ef18e8c60218c862c039827a7a46 GIT binary patch literal 117333 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 Date: Mon, 5 Aug 2024 15:12:21 +0200 Subject: [PATCH 42/45] Add phase_sign parameter This is a temporary patch until a standard convention for the sign of the phase is adopted. --- src/qibocal/protocols/resonator_spectroscopy.py | 14 +++++++++++++- src/qibocal/protocols/utils.py | 7 +++++-- 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/src/qibocal/protocols/resonator_spectroscopy.py b/src/qibocal/protocols/resonator_spectroscopy.py index 309acbbe0..0261dea1a 100644 --- a/src/qibocal/protocols/resonator_spectroscopy.py +++ b/src/qibocal/protocols/resonator_spectroscopy.py @@ -88,6 +88,9 @@ class ResonatorSpectroscopyParameters(Parameters): If high both the readout frequency and the bare resonator frequency will be updated.""" fit_function: str = "lorentzian" """Routine function (lorentzian or s21) to fit data with a model.""" + phase_sign: bool = False + """Several instruments have their convention about the sign of the phase. If True, the routine + will apply a minus to the phase data.""" amplitude: Optional[float] = None """Readout amplitude (optional). If defined, same amplitude will be used in all qubits. Otherwise the default amplitude defined on the platform runcard will be used""" @@ -148,6 +151,9 @@ class ResonatorSpectroscopyData(Data): """Amplitudes provided by the user.""" fit_function: str = "lorentzian" """Fit function (optional) used for the resonance.""" + phase_sign: bool = False + """Several instruments have their convention about the sign of the phase. If True, the routine + will apply a minus to the phase data.""" data: dict[QubitId, npt.NDArray[ResSpecType]] = field(default_factory=dict) """Raw data acquired.""" power_level: Optional[PowerLevel] = None @@ -212,6 +218,7 @@ def _acquisition( amplitudes=amplitudes, attenuations=attenuations, fit_function=params.fit_function, + phase_sign=params.phase_sign, ) results = platform.sweep( @@ -254,7 +261,12 @@ def _fit( fit = FITS[data.fit_function] for qubit in qubits: - data[qubit].phase = np.unwrap(data[qubit].phase) + data[qubit].phase = ( + -data[qubit].phase if data.phase_sign else data[qubit].phase + ) # TODO: tmp patch for the sign of the phase + data[qubit].phase = np.unwrap( + data[qubit].phase + ) # TODO: move phase unwrapping in qibolab fit_result = fit.fit( data[qubit], resonator_type=data.resonator_type, fit="resonator" ) diff --git a/src/qibocal/protocols/utils.py b/src/qibocal/protocols/utils.py index 79bf2e364..0a2a7f0ed 100644 --- a/src/qibocal/protocols/utils.py +++ b/src/qibocal/protocols/utils.py @@ -432,9 +432,12 @@ def s21_spectroscopy_plot(data, qubit, fit: Results = None): fitting_report = "" frequencies = qubit_data.freq signal = qubit_data.signal - phase = np.unwrap(qubit_data.phase) + phase = qubit_data.phase + phase = ( + -phase if data.phase_sign else phase + ) # TODO: tmp patch for the sign of the phase + phase = np.unwrap(phase) # TODO: move phase unwrapping in qibolab s21_raw = np.abs(signal) * np.exp(1j * phase) - fig_raw.add_trace( go.Scatter( x=np.real(s21_raw), From b027d632e8dc73b4f1b70e69d57da5c179214891 Mon Sep 17 00:00:00 2001 From: Andrea Date: Mon, 12 Aug 2024 16:27:06 +0400 Subject: [PATCH 43/45] fix: Path for wrong phase stored when running qq auto --- src/qibocal/protocols/resonator_spectroscopy.py | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/qibocal/protocols/resonator_spectroscopy.py b/src/qibocal/protocols/resonator_spectroscopy.py index 0261dea1a..7596eb0b2 100644 --- a/src/qibocal/protocols/resonator_spectroscopy.py +++ b/src/qibocal/protocols/resonator_spectroscopy.py @@ -1,3 +1,4 @@ +from copy import deepcopy from dataclasses import dataclass, field, fields from typing import Optional, Union @@ -261,14 +262,15 @@ def _fit( fit = FITS[data.fit_function] for qubit in qubits: - data[qubit].phase = ( - -data[qubit].phase if data.phase_sign else data[qubit].phase + qubit_data = deepcopy(data[qubit]) + qubit_data.phase = ( + -qubit_data.phase if data.phase_sign else qubit_data.phase ) # TODO: tmp patch for the sign of the phase - data[qubit].phase = np.unwrap( - data[qubit].phase + qubit_data.phase = np.unwrap( + qubit_data.phase ) # TODO: move phase unwrapping in qibolab fit_result = fit.fit( - data[qubit], resonator_type=data.resonator_type, fit="resonator" + qubit_data, resonator_type=data.resonator_type, fit="resonator" ) if fit_result is not None: ( From 298ce257b14834e5ca8e96f58eab59c923e0e5ba Mon Sep 17 00:00:00 2001 From: Andrea Date: Mon, 12 Aug 2024 16:27:34 +0400 Subject: [PATCH 44/45] feat: Change phase_sign default to be True --- src/qibocal/protocols/resonator_spectroscopy.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/qibocal/protocols/resonator_spectroscopy.py b/src/qibocal/protocols/resonator_spectroscopy.py index 7596eb0b2..5835551fc 100644 --- a/src/qibocal/protocols/resonator_spectroscopy.py +++ b/src/qibocal/protocols/resonator_spectroscopy.py @@ -89,7 +89,7 @@ class ResonatorSpectroscopyParameters(Parameters): If high both the readout frequency and the bare resonator frequency will be updated.""" fit_function: str = "lorentzian" """Routine function (lorentzian or s21) to fit data with a model.""" - phase_sign: bool = False + phase_sign: bool = True """Several instruments have their convention about the sign of the phase. If True, the routine will apply a minus to the phase data.""" amplitude: Optional[float] = None From fc3d56248dd12c91aebb1ea95a7dbe069dda884d Mon Sep 17 00:00:00 2001 From: Andrea Date: Mon, 12 Aug 2024 17:10:00 +0400 Subject: [PATCH 45/45] doc: Add plot to documentation --- doc/source/protocols/index.rst | 2 +- .../resonator_spectroscopy.rst | 2 ++ .../resonator_spectroscopy_error_bars.png | Bin .../resonator_spectroscopy_high.png | Bin .../resonator_spectroscopy_low.png | Bin .../resonator_spectroscopy_simulation.png | Bin .../resonator_spectroscopy/s12_fit.png | Bin 0 -> 179493 bytes 7 files changed, 3 insertions(+), 1 deletion(-) rename doc/source/protocols/{ => resonator_spectroscopy}/resonator_spectroscopy.rst (99%) rename doc/source/protocols/{ => resonator_spectroscopy}/resonator_spectroscopy_error_bars.png (100%) rename doc/source/protocols/{ => resonator_spectroscopy}/resonator_spectroscopy_high.png (100%) rename doc/source/protocols/{ => resonator_spectroscopy}/resonator_spectroscopy_low.png (100%) rename doc/source/protocols/{ => resonator_spectroscopy}/resonator_spectroscopy_simulation.png (100%) create mode 100644 doc/source/protocols/resonator_spectroscopy/s12_fit.png diff --git a/doc/source/protocols/index.rst b/doc/source/protocols/index.rst index cdcf1d03c..0a6ff4487 100644 --- a/doc/source/protocols/index.rst +++ b/doc/source/protocols/index.rst @@ -13,7 +13,7 @@ In this section we introduce the basics of all protocols supported by ``qibocal` signal/time_of_flight signal/calibrate_kernel - resonator_spectroscopy + resonator_spectroscopy/resonator_spectroscopy resonator_punchout qubit_spectroscopy/qubit_spectroscopy rabi/rabi diff --git a/doc/source/protocols/resonator_spectroscopy.rst b/doc/source/protocols/resonator_spectroscopy/resonator_spectroscopy.rst similarity index 99% rename from doc/source/protocols/resonator_spectroscopy.rst rename to doc/source/protocols/resonator_spectroscopy/resonator_spectroscopy.rst index fab6fcadf..916e7c507 100644 --- a/doc/source/protocols/resonator_spectroscopy.rst +++ b/doc/source/protocols/resonator_spectroscopy/resonator_spectroscopy.rst @@ -121,6 +121,8 @@ enhance robustness and accuracy: The linear background slope accounts for an additional residual delay :math:`2\pi\tau(f - f_r)`, introducing an extra degree of freedom to the parameter set. Parameter estimation is performed through an iterative least squares process to optimize the model parameters. +.. image:: s12_fit.png + Example ^^^^^^^ .. code-block:: yaml diff --git a/doc/source/protocols/resonator_spectroscopy_error_bars.png b/doc/source/protocols/resonator_spectroscopy/resonator_spectroscopy_error_bars.png similarity index 100% rename from doc/source/protocols/resonator_spectroscopy_error_bars.png rename to doc/source/protocols/resonator_spectroscopy/resonator_spectroscopy_error_bars.png diff --git a/doc/source/protocols/resonator_spectroscopy_high.png b/doc/source/protocols/resonator_spectroscopy/resonator_spectroscopy_high.png similarity index 100% rename from doc/source/protocols/resonator_spectroscopy_high.png rename to doc/source/protocols/resonator_spectroscopy/resonator_spectroscopy_high.png diff --git a/doc/source/protocols/resonator_spectroscopy_low.png b/doc/source/protocols/resonator_spectroscopy/resonator_spectroscopy_low.png similarity index 100% rename from doc/source/protocols/resonator_spectroscopy_low.png rename to doc/source/protocols/resonator_spectroscopy/resonator_spectroscopy_low.png diff --git a/doc/source/protocols/resonator_spectroscopy_simulation.png b/doc/source/protocols/resonator_spectroscopy/resonator_spectroscopy_simulation.png similarity index 100% rename from doc/source/protocols/resonator_spectroscopy_simulation.png rename to doc/source/protocols/resonator_spectroscopy/resonator_spectroscopy_simulation.png diff --git a/doc/source/protocols/resonator_spectroscopy/s12_fit.png b/doc/source/protocols/resonator_spectroscopy/s12_fit.png new file mode 100644 index 0000000000000000000000000000000000000000..f7fd7145ed4e5ba1baeb00c639fe64211974964e GIT binary patch literal 179493 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 E0Je*!oB#j- literal 0 HcmV?d00001