Skip to content

Commit

Permalink
Working distance-3 repetition code conditions (Z4-Z2). Includes 0 rou…
Browse files Browse the repository at this point in the history
…nd QEC-cycles
  • Loading branch information
MiniSean committed Feb 2, 2024
1 parent 0b66e15 commit 774c383
Show file tree
Hide file tree
Showing 12 changed files with 1,809 additions and 427 deletions.
72 changes: 48 additions & 24 deletions pycqed/analysis_v2/GBT_analysis.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import os
import warnings
import matplotlib.pyplot as plt
import numpy as np
import pycqed.analysis_v2.base_analysis as ba
Expand Down Expand Up @@ -177,6 +178,17 @@ def extract_data(self):
self.raw_data_dict[q]['t_T2'] = t2.sweep_points[:-4]
self.raw_data_dict[q]['p_T2'] = t2.normalized_data_points
self.raw_data_dict[q]['T2'] = t2.fit_res.params['tau'].value
# Bundle all errors in array so it gets saved in hdf5
self.raw_data_dict[q]['Errors'] = np.array([
self.raw_data_dict[q]['SQG_err'],
self.raw_data_dict[q]['L1_err'],
self.raw_data_dict[q]['RO_err'],
self.raw_data_dict[q]['allxy_err'],
self.raw_data_dict[q]['T1'],
self.raw_data_dict[q]['T2']])

self.proc_data_dict = {}
self.proc_data_dict['quantities_of_interest'] = self.raw_data_dict

def process_data(self):
pass
Expand Down Expand Up @@ -955,30 +967,42 @@ def extract_data(self):
Data_qubits = fp_tomo.split(f'tomography_{stab}_')[-1]
Data_qubits = Data_qubits.split('_sim')[0]
Data_qubits = Data_qubits.split('_')
if stab == 'Z1':
exc_qubits = ['D1']
elif stab == 'Z2':
exc_qubits = ['D3']
elif stab == 'Z3':
exc_qubits = []
elif stab == 'Z4':
exc_qubits = ['D5']
else:
raise ValueError('exception qubits must be given to analysis')
a = ma2.pba.Weight_n_parity_tomography(
label = label_tomo,
sim_measurement=True,
n_rounds=2,
exception_qubits=exc_qubits,
post_selection=False,
extract_only=True)
self.raw_data_dict[stab]['rho_0'] = a.proc_data_dict['rho_0']
self.raw_data_dict[stab]['rho_1'] = a.proc_data_dict['rho_1']
self.raw_data_dict[stab]['fidelity_0'] = a.proc_data_dict['Fid_0']
self.raw_data_dict[stab]['fidelity_1'] = a.proc_data_dict['Fid_1']
self.raw_data_dict[stab]['M1'] = a.proc_data_dict['M1']
self.raw_data_dict[stab]['M2'] = a.proc_data_dict['M2']
self.raw_data_dict[stab]['repeatability'] = a.proc_data_dict['repeatability']
try:
if stab == 'Z1':
exc_qubits = ['D4', 'D5'] # ['D1']
elif stab == 'Z2':
exc_qubits = ['D3']
elif stab == 'Z3':
exc_qubits = ['D7']
elif stab == 'Z4':
exc_qubits = ['D5']
elif stab == 'X1':
exc_qubits = ['D2']
elif stab == 'X2':
exc_qubits = ['D2', 'D3']
elif stab == 'X3':
exc_qubits = ['D8']
elif stab == 'X4':
exc_qubits = []
else:
raise ValueError('exception qubits must be given to analysis')

a = ma2.pba.Weight_n_parity_tomography(
label = label_tomo,
sim_measurement=True,
n_rounds=2,
exception_qubits=exc_qubits,
post_selection=False,
extract_only=True)
self.raw_data_dict[stab]['rho_0'] = a.proc_data_dict['rho_0']
self.raw_data_dict[stab]['rho_1'] = a.proc_data_dict['rho_1']
self.raw_data_dict[stab]['fidelity_0'] = a.proc_data_dict['Fid_0']
self.raw_data_dict[stab]['fidelity_1'] = a.proc_data_dict['Fid_1']
self.raw_data_dict[stab]['M1'] = a.proc_data_dict['M1']
self.raw_data_dict[stab]['M2'] = a.proc_data_dict['M2']
self.raw_data_dict[stab]['repeatability'] = a.proc_data_dict['repeatability']
except Exception as e:
warnings.warn(e)

def process_data(self):
pass
Expand Down
8 changes: 5 additions & 3 deletions pycqed/analysis_v2/Parity_benchmark_analysis.py
Original file line number Diff line number Diff line change
Expand Up @@ -1901,7 +1901,7 @@ def defect_rate_plotn(
axs[0].set_ylabel('error probability')
axs[0].set_xlabel('rounds')
axs[0].legend(frameon=False, bbox_to_anchor = (1.01, 1))
axs[0].set_title('Deffect rate')
axs[0].set_title('defect rate')

axs[1].plot((np.arange(n_rounds)+1), p_0*100, 'C0-', label='Normal')
axs[1].plot((np.arange(n_rounds)+1), p_1*100, 'C1-', label='LRU data')
Expand Down Expand Up @@ -2430,11 +2430,13 @@ def _get_pop_vector(Shots):
# select experiments for which the Pij matrix will be computed
k_of_interest = []
if ('surface_13' in self.experiments) or \
('surface_13_LRU' in self.experiments):
('surface_13_LRU' in self.experiments) or True:
if ('surface_13' in self.experiments):
k_of_interest.append(self.experiments.index('surface_13'))
if ('surface_13_LRU' in self.experiments):
k_of_interest.append(self.experiments.index('surface_13_LRU'))
else:
k_of_interest = [0]
# Calculate defects each stabilizer ancilla qubits
_Ancilla_qubits = [q for q in self.Qubits if 'Z' in q]
Defects = { q : { k:{} for k in range(n_kernels) } for q in _Ancilla_qubits }
Expand Down Expand Up @@ -2598,7 +2600,7 @@ def defect_rate_k_plotfn(
axs[0].grid(ls='--')
axs[0].set_ylabel('error probability')
axs[0].set_xlabel('rounds')
axs[0].set_title('Deffect rate')
axs[0].set_title('defect rate')
axs[0].set_ylim(0, .5)
# axs[0].set_ylim(0, 1)
axs[0].set_yticks([0, .1, .2, .3, .4, .5])
Expand Down
39 changes: 25 additions & 14 deletions pycqed/analysis_v2/Two_qubit_gate_analysis.py
Original file line number Diff line number Diff line change
Expand Up @@ -364,7 +364,7 @@ def get_plot_axis(vals, rang=None):
# Frequency qubit population
vmax = min([1, np.max(Pop)])
vmax = max([vmax, 0.15])
im = ax.pcolormesh(Detunings*1e-6, Times*1e9, Pop, vmax=vmax)
im = ax.pcolormesh(Detunings*1e-6, Times*1e9, Pop, vmax=1)#vmax)
fig.colorbar(im, ax=ax, label='Population')
# plot two-qubit gate frequencies:
if interaction_freqs:
Expand Down Expand Up @@ -3365,7 +3365,8 @@ def CZ_frequency_trajectory_plotfn(
axR.set_position([pos.x0+pos.width*1.005, pos.y0, pos.width*0.2, pos.height])
def get_plot_axis(vals, rang=None):
if len(vals)>1:
dx = vals[1]-vals[0]
n = len(vals)//2
dx = vals[n]-vals[n-1]
X = np.concatenate((vals, [vals[-1]+dx])) - dx/2
else:
X = vals
Expand All @@ -3375,25 +3376,34 @@ def get_plot_axis(vals, rang=None):
Pop = TLS_analysis_dict[qH].proc_data_dict['Pop']
# Frequency qubit population
vmax = min([1, np.max(Pop)])
vmax = max([vmax, 0.15])
vmax = 1#max([vmax, 0.15])
im = axR.pcolormesh(Times*1e9, Detunings*1e-9, Pop.transpose(), vmax=vmax)
axR.text(Times[len(Times)//2]*1e9, Detunings[0]*1e-9-.05, qH, ha='center', va='top', color='w')
axR.set_title('Gate qubits', size=7)
axR.set_title('High qubit', size=7)
if qL in TLS_analysis_dict.keys():
axL = fig.add_subplot(221)
# using previous axis position <pos>
axL.set_position([pos.x0+pos.width*(1.21), pos.y0,
pos.width*0.2, pos.height])
Detunings = data[qL]['frequency'] - get_plot_axis(TLS_analysis_dict[qL].proc_data_dict['Detunings'])
Pop = TLS_analysis_dict[qL].proc_data_dict['Pop']
Pop = TLS_analysis_dict[qL].proc_data_dict['Pop']
# Frequency qubit population
vmax = min([1, np.max(Pop)])
vmax = max([vmax, 0.15])
im = axR.pcolormesh(Times*1e9, Detunings*1e-9, Pop.transpose(), vmax=vmax)
axR.text(Times[len(Times)//2]*1e9, Detunings[0]*1e-9-.05, qL, ha='center', va='top', color='w')
axR.axhline(Detunings[0]*1e-9, color='w')
vmax = 1#max([vmax, 0.15])
im = axL.pcolormesh(Times*1e9, Detunings*1e-9, Pop.transpose(), vmax=vmax)
axL.text(Times[len(Times)//2]*1e9, max(Detunings)*1e-9-.05, qL, ha='center', va='top', color='w')
# axR.axhline(max(Detunings)*1e-9, color='w')
axL.set_title('Low qubit', size=7)
axL.set_ylim(ax.get_ylim())
axL.yaxis.tick_right()
axL.set_xticks([])
axL.axis('off')
axR.set_ylim(ax.get_ylim())
axR.yaxis.tick_right()
axR.set_xticks([])
axR.axis('off')
# Parked qubit plots
i = 0
i = 1
for q in parked_qubits:
if q in TLS_analysis_dict.keys():
axP = fig.add_subplot(221+i)
Expand All @@ -3405,11 +3415,10 @@ def get_plot_axis(vals, rang=None):
Pop = TLS_analysis_dict[q].proc_data_dict['Pop']
# Frequency qubit population
vmax = min([1, np.max(Pop)])
vmax = max([vmax, 0.15])
vmax = 1#max([vmax, 0.15])
im = axP.pcolormesh(Times*1e9, Detunings*1e-9, Pop.transpose(), vmax=vmax)
axP.text(Times[len(Times)//2]*1e9, Detunings[0]*1e-9-.05, q, ha='center', va='top', color='w')

axP.set_title('Park qubits', size=7)
axP.text(Times[len(Times)//2]*1e9, max(Detunings)*1e-9-.05, q, ha='center', va='top', color='w')
axP.set_title('Park qubit', size=7)
axP.set_ylim(ax.get_ylim())
axP.yaxis.tick_right()
axP.set_xticks([])
Expand Down Expand Up @@ -3552,8 +3561,10 @@ def func(x, phi, A, B):
# self.qoi['L_1'] = L_1
self.qoi['P_excited'] = P_excited
self.qoi['Phases'] = {}
self.qoi['Contrast'] = {}
for q in self.Q_target:
self.qoi['Phases'][q] = { c:Fit_res[q][c][0] for c in self.control_cases }
self.qoi['Contrast'][q] = { c:Fit_res[q][c][1] for c in self.control_cases }
if self.solve_for_phase_gate_model:
self.qoi['Phase_model'] = Phase_model

Expand Down
8 changes: 3 additions & 5 deletions pycqed/analysis_v2/cryoscope_v2_analysis.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,6 @@
"""
Created: 2020-07-15
Author: Victor Negirneac
"""

import matplotlib.pyplot as plt
from pycqed.analysis.analysis_toolbox import get_datafilepath_from_timestamp
import pycqed.analysis_v2.cryoscope_v2_tools as cv2_tools
Expand Down Expand Up @@ -738,7 +736,7 @@ def __init__(self,
extract_only: bool = False,
auto=True,
poly_params: dict = None,
derivative_window_length: float=3e-9,
derivative_window_length: float=5e-9,
):
super().__init__(t_start=t_start, t_stop=t_stop,
label=label,
Expand Down Expand Up @@ -1265,8 +1263,8 @@ def skewed_gauss(x, x0, sigma, alpha, a, b):
# Fit exponential to trace
if self.update_IIR:
try:
p0 = [-.01, 100e-9, 1.0085]
popt, pcov = curve_fit(filter_func, Time[:]*1e-9, Trace[:], p0=p0)
p0 = [+.001, 400e-9, 1.0085]
popt, pcov = curve_fit(filter_func, Time[8:]*1e-9, Trace[8:], p0=p0)
except:
print_exception()
print('Fit failed. Trying new initial guess')
Expand Down
Loading

0 comments on commit 774c383

Please sign in to comment.