Sweeps - Impedance, scattering and admittance (Z S Y) matrices

Prerequisite

You need to have a working local installation of Ansys

1. Perform the necessary imports and create a QDesign in Metal first.

[1]:
%load_ext autoreload
%autoreload 2
[2]:
import qiskit_metal as metal
from qiskit_metal import designs, draw
from qiskit_metal import MetalGUI, Dict, Headings
import pyEPR as epr
from qiskit_metal.analyses.simulation import ScatteringImpedanceSim

Create the design in Metal

Set up a design of a given dimension. Create a design by specifying the chip size and open Metal GUI. Dimensions will be respected in the design rendering. Note the chip design is centered at origin (0,0).

[3]:
design = designs.DesignPlanar({}, True)
design.chips.main.size['size_x'] = '2mm'
design.chips.main.size['size_y'] = '2mm'

gui = MetalGUI(design)

# Perform the necessary imports.
from qiskit_metal.qlibrary.couplers.coupled_line_tee import CoupledLineTee
from qiskit_metal.qlibrary.tlines.meandered import RouteMeander
from qiskit_metal.qlibrary.qubits.transmon_pocket import TransmonPocket
from qiskit_metal.qlibrary.tlines.straight_path import RouteStraight
from qiskit_metal.qlibrary.terminations.open_to_ground import OpenToGround
[4]:
# To create plots after geting solution data.
import matplotlib.pyplot as plt
import numpy as np
[5]:
# Add 2 transmons to the design.
options = dict(
    # Some options we want to modify from the deafults
    # (see below for defaults)
    pad_width='425 um',
    pocket_height='650um',
    # Adding 4 connectors (see below for defaults)
    connection_pads=dict(a=dict(loc_W=+1, loc_H=+1),
                         b=dict(loc_W=-1, loc_H=+1, pad_height='30um'),
                         c=dict(loc_W=+1, loc_H=-1, pad_width='200um'),
                         d=dict(loc_W=-1, loc_H=-1, pad_height='50um')))

## Create 2 transmons
q1 = TransmonPocket(design,
                    'Q1',
                    options=dict(pos_x='+1.4mm',
                                 pos_y='0mm',
                                 orientation='90',
                                 **options))
q2 = TransmonPocket(design,
                    'Q2',
                    options=dict(pos_x='-0.6mm',
                                 pos_y='0mm',
                                 orientation='90',
                                 **options))

gui.rebuild()
gui.autoscale()
[6]:
# Add 2 hangers consisting of capacitively coupled transmission lines.
TQ1 = CoupledLineTee(design,
                     'TQ1',
                     options=dict(pos_x='1mm',
                                  pos_y='3mm',
                                  coupling_length='500um',
                                  coupling_space='1um'))
TQ2 = CoupledLineTee(design,
                     'TQ2',
                     options=dict(pos_x='-1mm',
                                  pos_y='3mm',
                                  coupling_length='500um',
                                  coupling_space='1um'))

gui.rebuild()
gui.autoscale()
[7]:
# Add 2 meandered CPWs connecting the transmons to the hangers.
ops = dict(fillet='90um')
design.overwrite_enabled = True

options1 = Dict(total_length='8mm',
                hfss_wire_bonds=True,
                pin_inputs=Dict(start_pin=Dict(component='TQ1',
                                               pin='second_end'),
                                end_pin=Dict(component='Q1', pin='a')),
                lead=Dict(start_straight='0.1mm'),
                **ops)

options2 = Dict(total_length='9mm',
                hfss_wire_bonds=True,
                pin_inputs=Dict(start_pin=Dict(component='TQ2',
                                               pin='second_end'),
                                end_pin=Dict(component='Q2', pin='a')),
                lead=Dict(start_straight='0.1mm'),
                **ops)

meanderQ1 = RouteMeander(design, 'meanderQ1', options=options1)
meanderQ2 = RouteMeander(design, 'meanderQ2', options=options2)

gui.rebuild()
gui.autoscale()
[8]:
# Add 2 open to grounds at the ends of the horizontal CPW.
otg1 = OpenToGround(design, 'otg1', options=dict(pos_x='3mm', pos_y='3mm'))
otg2 = OpenToGround(design,
                    'otg2',
                    options=dict(pos_x='-3mm', pos_y='3mm', orientation='180'))

gui.rebuild()
gui.autoscale()

# Add 3 straight CPWs that comprise the long horizontal CPW.

ops_oR = Dict(hfss_wire_bonds=True,
              pin_inputs=Dict(start_pin=Dict(component='TQ1', pin='prime_end'),
                              end_pin=Dict(component='otg1', pin='open')))
ops_mid = Dict(hfss_wire_bonds=True,
               pin_inputs=Dict(start_pin=Dict(component='TQ1',
                                              pin='prime_start'),
                               end_pin=Dict(component='TQ2', pin='prime_end')))
ops_oL = Dict(hfss_wire_bonds=True,
              pin_inputs=Dict(start_pin=Dict(component='TQ2',
                                             pin='prime_start'),
                              end_pin=Dict(component='otg2', pin='open')))

cpw_openRight = RouteStraight(design, 'cpw_openRight', options=ops_oR)
cpw_middle = RouteStraight(design, 'cpw_middle', options=ops_mid)
cpw_openLeft = RouteStraight(design, 'cpw_openLeft', options=ops_oL)

gui.rebuild()
gui.autoscale()
[9]:
gui.screenshot()
../../_images/tut_4-Analysis_4.23-Impedance-and-scattering-Z-S-Y-matrices_12_0.png

2. Render the qubit from Metal into the HangingResonators design in Ansys. ScatteringImpedanceSim will open the simulation software. Then will connect, activate the design, add a setup.

Review and update the setup. For driven modal you will need to define not only the simulation convergence parameters, but also the frequency sweep.

[10]:
em1 = ScatteringImpedanceSim(design, "hfss")

Customizable parameters and default values for HFSS (driven modal):

freq_ghz=5 (simulation frequency)
name="Setup" (setup name)
max_delta_s=0.1 (absolute value of maximum difference in scattering parameter S)
max_passes=10 (maximum number of passes)
min_passes=1 (minimum number of passes)
min_converged=1 (minimum number of converged passes)
pct_refinement=30 (percent refinement)
basis_order=1 (basis order)
vars (global variables to set in the renderer)
sweep_setup (all the parameters of the sweep)
name="Sweep" (name of sweep)
start_ghz=2.0 (starting frequency)
stop_ghz=8.0 (stopping frequency)
count=101 (total number of frequencies)
step_ghz=None (frequency step size)
type="Fast" (type of sweep)
save_fields=False (whether or not to save fields)
[11]:
# To view the values for defaults.
em1.setup
[11]:
{'name': 'Setup',
 'reuse_selected_design': True,
 'reuse_setup': True,
 'freq_ghz': 5,
 'max_delta_s': 0.1,
 'max_passes': 10,
 'min_passes': 1,
 'min_converged': 1,
 'pct_refinement': 30,
 'basis_order': 1,
 'vars': {'Lj': '10 nH', 'Cj': '0 fF'},
 'sweep_setup': {'name': 'Sweep',
  'start_ghz': 2.0,
  'stop_ghz': 8.0,
  'count': 101,
  'step_ghz': None,
  'type': 'Fast',
  'save_fields': False}}
[12]:
em1.setup.name = "Sweep_DrivenModal_setup"
em1.setup.freq_ghz = 6.0
em1.setup.max_delta_s = 0.05
em1.setup.max_passes = 12
em1.setup.min_passes = 2

Add a frequency sweep to a driven modal setup. From QHFSSRenderer.add_sweep doc_strings. Please go to doc_strings to get the latest information.

Args: setup_name (str, optional): Name of driven modal simulation Sweep. Defaults to “Setup”. start_ghz (float, optional): Starting frequency of sweep in GHz. Defaults to 2.0. stop_ghz (float, optional): Ending frequency of sweep in GHz. Defaults to 8.0. count (int, optional): Total number of frequencies. Defaults to 101. step_ghz (float, optional): Difference between adjacent frequencies. Defaults to None. name (str, optional): Name of sweep. Defaults to “Sweep”. type (str, optional): Type of sweep. Defaults to “Fast”. save_fields (bool, optional): Whether or not to save fields. Defaults to False.

From pyEPR.HfssSetup.insert_sweep(), please go to this method to get the latest documentation.
You should provide either step_ghz or count when inserting an HFSS driven model freq sweep. Do not provide both or neither!
[13]:
# To view the values for defaults.
em1.setup.sweep_setup
[13]:
{'name': 'Sweep',
 'start_ghz': 2.0,
 'stop_ghz': 8.0,
 'count': 101,
 'step_ghz': None,
 'type': 'Fast',
 'save_fields': False}
[14]:
em1.setup.sweep_setup.name="Sweep_options__dm_sweep"
em1.setup.sweep_setup.start_ghz=4.0
em1.setup.sweep_setup.stop_ghz=9.0
em1.setup.sweep_setup.count=5001
em1.setup.sweep_setup.type="Interpolating"


em1.setup
[14]:
{'name': 'Sweep_DrivenModal_setup',
 'reuse_selected_design': True,
 'reuse_setup': True,
 'freq_ghz': 6.0,
 'max_delta_s': 0.05,
 'max_passes': 12,
 'min_passes': 2,
 'min_converged': 1,
 'pct_refinement': 30,
 'basis_order': 1,
 'vars': {'Lj': '10 nH', 'Cj': '0 fF'},
 'sweep_setup': {'name': 'Sweep_options__dm_sweep',
  'start_ghz': 4.0,
  'stop_ghz': 9.0,
  'count': 5001,
  'step_ghz': None,
  'type': 'Interpolating',
  'save_fields': False}}
[15]:
# Set the buffer width at the edge of the design to be 0.5 mm
# in both directions.
em1.setup.renderer.options['x_buffer_width_mm'] = 0.5
em1.setup.renderer.options['y_buffer_width_mm'] = 0.5
[16]:
#     qcomp_name (str): A component that contains the option to be swept.
#     option_name (str): The option within qcomp_name to sweep.
#     option_sweep (list): Each entry in the list is a value for
#                 option_name.
#     qcomp_render (list): The component to render to simulation.
#     open_terminations (list): Identify which kind of pins. Follow the
#                 details from renderer QQ3DRenderer.render_design, or
#                 QHFSSRenderer.render_design.
#     port_list (list): List of tuples of jj's that shouldn't
#                     be rendered.  Follow details from
#                     renderer in QHFSSRenderer.render_design.
#     jj_to_port (list): List of junctions (qcomp, qgeometry_name,
#                         impedance, draw_ind) to render as lumped ports
#                         or as lumped port in parallel with a sheet
#                         inductance.    Follow details from renderer
#                         in QHFSSRenderer.render_design.
#     ignored_jjs (Union[list,None]): This is not used by all renderers,
#                  just hfss.
#     design_name(str): Name of design (workspace) to use in project.
#     box_plus_buffer(bool): Render the entire chip or create a
#                 box_plus_buffer around the components which are rendered.

[17]:

design_name= "Sweep_DrivenModal"
qcomp_render = [] # Means to render everything in qgeometry table.
open_terminations = []

# Here, pin cpw_openRight_end and cpw_openLeft_end are converted into lumped ports,
#           each with an impedance of 50 Ohms. <br>
port_list = [('cpw_openRight', 'end', 50),
                      ('cpw_openLeft', 'end', 50)]
jj_to_port = [('Q1', 'rect_jj', 50, False)]
# Neither of the junctions in Q1 or Q2 are rendered.
ignored_jjs = [('Q2', 'rect_jj')]
box_plus_buffer = True
[18]:
#Note: The method will connect to  Ansys simulation, activate_drivenmodal_design(), add_drivenmodal_setup().

all_sweeps, return_code = em1.run_sweep(meanderQ1.name,
                                        'total_length',
                                        ['9mm', '10mm', '11mm'],
                                        qcomp_render,
                                        open_terminations,
                                        design_name=design_name,
                                        port_list = port_list,
                                        jj_to_port= jj_to_port,
                                        ignored_jjs= ignored_jjs,
                                        box_plus_buffer=box_plus_buffer
                                       )
INFO 08:57AM [connect_project]: Connecting to Ansys Desktop API...
INFO 08:57AM [load_ansys_project]:      Opened Ansys App
INFO 08:57AM [load_ansys_project]:      Opened Ansys Desktop v2020.2.0
INFO 08:57AM [load_ansys_project]:      Opened Ansys Project
        Folder:    C:/Ansoft/
        Project:   Project24
INFO 08:57AM [connect_design]: No active design found (or error getting active design).
INFO 08:57AM [connect]:          Connected to project "Project24". No design detected
INFO 08:57AM [connect_design]:  Opened active design
        Design:    Sweep_DrivenModal_hfss [Solution type: DrivenModal]
WARNING 08:57AM [connect_setup]:        No design setup detected.
WARNING 08:57AM [connect_setup]:        Creating drivenmodal default setup.
INFO 08:57AM [get_setup]:       Opened setup `Setup`  (<class 'pyEPR.ansys.HfssDMSetup'>)
INFO 08:58AM [get_setup]:       Opened setup `Sweep_DrivenModal_setup`  (<class 'pyEPR.ansys.HfssDMSetup'>)
INFO 08:58AM [get_setup]:       Opened setup `Sweep_DrivenModal_setup`  (<class 'pyEPR.ansys.HfssDMSetup'>)
INFO 08:58AM [analyze]: Analyzing setup Sweep_DrivenModal_setup : Sweep_options__dm_sweep
INFO 09:01AM [connect_design]:  Opened active design
        Design:    Sweep_DrivenModal_hfss [Solution type: DrivenModal]
INFO 09:02AM [get_setup]:       Opened setup `Sweep_DrivenModal_setup`  (<class 'pyEPR.ansys.HfssDMSetup'>)
INFO 09:02AM [get_setup]:       Opened setup `Sweep_DrivenModal_setup`  (<class 'pyEPR.ansys.HfssDMSetup'>)
INFO 09:02AM [analyze]: Analyzing setup Sweep_DrivenModal_setup : Sweep_options__dm_sweep
INFO 09:07AM [connect_design]:  Opened active design
        Design:    Sweep_DrivenModal_hfss [Solution type: DrivenModal]
INFO 09:07AM [get_setup]:       Opened setup `Sweep_DrivenModal_setup`  (<class 'pyEPR.ansys.HfssDMSetup'>)
INFO 09:07AM [get_setup]:       Opened setup `Sweep_DrivenModal_setup`  (<class 'pyEPR.ansys.HfssDMSetup'>)
INFO 09:07AM [analyze]: Analyzing setup Sweep_DrivenModal_setup : Sweep_options__dm_sweep

#Note: Sweep again using the arguments from previous run.

all_sweeps_6_7_8, return_code = em1.run_sweep(meanderQ1.name,
                                        'total_length',
                                        ['6.5mm', '7.5mm', '8.5mm']
                                       )
[19]:

if return_code == 0:
    # Each key corresponds to list passed to ['9mm', '8mm', '7mm']
    print(all_sweeps.keys())

    # Each key corresponds to list passed to ['6mm', '5mm', '4mm']
    # print(all_sweeps_6_7_8.keys())
else:
    print('Check warning messages to see why all_sweeps is non-zero.')

dict_keys(['9mm', '10mm', '11mm'])
[20]:
all_sweeps['9mm'].keys()
[20]:
dict_keys(['option_name', 'variables'])
[21]:
all_sweeps['9mm']['variables']
[21]:
{'sim_setup_name': 'Sweep_DrivenModal_setup',
 'sweep_name': 'Sweep_options__dm_sweep'}
[22]:
all_sweeps['9mm']['option_name']

[22]:
'total_length'
[23]:
print(f"""
project_name = {em1.renderer.pinfo.project_name}
design_name  = {em1.renderer.pinfo.design_name}
setup_name   = {em1.renderer.pinfo.setup_name}
""")

project_name = Project24
design_name  = Sweep_DrivenModal_hfss
setup_name   = Sweep_DrivenModal_setup

Note: Results storage is currently being updated to be fully functional with the sweep functionality.

[24]:
em1.get_impedance()                # default: ['Z11', 'Z21']
[24]:
(                        Z11                   Z21
 4.000  -0.000000-11.896548j   0.000000+44.291514j
 4.001   0.000001-11.881640j   0.00000+044.287660j
 4.002   0.000001-11.866735j   0.000000+44.283811j
 4.003   0.000002-11.851833j   0.000000+44.279968j
 4.004   0.000002-11.836933j   0.000000+44.276131j
 ...                     ...                   ...
 8.996  0.000429+233.181228j  0.000398+237.847267j
 8.997  0.000331+233.625173j  0.000307+238.283674j
 8.998  0.000228+234.070780j  0.000211+238.721763j
 8.999  0.000117+234.518060j  0.000109+239.161547j
 9.000 -0.000000+234.967023j -0.000000+239.603035j

 [5001 rows x 2 columns],
 <Figure size 3000x1800 with 2 Axes>)
[25]:
em1.get_admittance()              # default: ['Y11', 'Y21']
[25]:
(                      Y11                 Y21
 4.000  0.000000-0.006633j -0.000000-0.024359j
 4.001  0.000000-0.006625j  0.000000-0.024357j
 4.002  0.000000-0.006617j  0.000000-0.024355j
 4.003  0.000000-0.006609j  0.000000-0.024352j
 4.004  0.000000-0.006600j  0.000000-0.024350j
 ...                   ...                 ...
 8.996 -0.000000+0.086442j  0.000000-0.088951j
 8.997 -0.000000+0.086555j  0.000000-0.089060j
 8.998 -0.000000+0.086669j  0.000000-0.089169j
 8.999 -0.000000+0.086783j  0.000000-0.089279j
 9.000  0.000000+0.086898j -0.000000-0.089390j

 [5001 rows x 2 columns],
 <Figure size 3000x1800 with 2 Axes>)
[26]:
em1.get_scattering(['S11', 'S21', 'S31'])          ## default: ['S11', 'S21', 'S22']
[26]:
(                      S11                 S21                 S31
 4.000 -0.147086-0.038897j -0.264193+0.952394j  0.000055+0.000028j
 4.001 -0.147108-0.038852j -0.263887+0.952478j  0.000055+0.000028j
 4.002 -0.147130-0.038806j -0.263581+0.952561j  0.000055+0.000028j
 4.003 -0.147152-0.038761j -0.263275+0.952644j  0.000055+0.000028j
 4.004 -0.147174-0.038715j -0.262969+0.952727j  0.000055+0.000028j
 ...                   ...                 ...                 ...
 8.996  0.005780-0.006204j  0.976020+0.217516j -0.000039+0.000050j
 8.997  0.005783-0.006260j  0.976093+0.217185j -0.000039+0.000050j
 8.998  0.005786-0.006317j  0.976166+0.216855j -0.000039+0.000050j
 8.999  0.005790-0.006373j  0.976239+0.216524j -0.000039+0.000050j
 9.000  0.005793-0.006430j  0.976312+0.216192j -0.000039+0.000050j

 [5001 rows x 3 columns],
 <Figure size 3000x1800 with 2 Axes>)
[27]:
dataframe_scattering = em1.get_scattering(['S11', 'S21', 'S31'])
df_s = dataframe_scattering[0]
[28]:
s11 = df_s['S11']
s11

s21 = df_s['S21']
s21

s31 = df_s['S31']
s31
[28]:
4.000    0.000055+0.000028j
4.001    0.000055+0.000028j
4.002    0.000055+0.000028j
4.003    0.000055+0.000028j
4.004    0.000055+0.000028j
                ...
8.996   -0.000039+0.000050j
8.997   -0.000039+0.000050j
8.998   -0.000039+0.000050j
8.999   -0.000039+0.000050j
9.000   -0.000039+0.000050j
Name: S31, Length: 5001, dtype: complex128
[29]:
dataframe_scattering[0]['20_log_of_mag_S11']= 20 * np.log10(np.absolute(s11))
dataframe_scattering[0]['20_log_of_mag_S21']= 20 * np.log10(np.absolute(s21))
dataframe_scattering[0]['20_log_of_mag_S31']= 20 * np.log10(np.absolute(s31))
dataframe_scattering[0]
[29]:
S11 S21 S31 20_log_of_mag_S11 20_log_of_mag_S21 20_log_of_mag_S31
4.000 -0.147086-0.038897j -0.264193+0.952394j 0.000055+0.000028j -16.355031 -0.101708 -84.181500
4.001 -0.147108-0.038852j -0.263887+0.952478j 0.000055+0.000028j -16.354476 -0.101722 -84.199503
4.002 -0.147130-0.038806j -0.263581+0.952561j 0.000055+0.000028j -16.353923 -0.101735 -84.217446
4.003 -0.147152-0.038761j -0.263275+0.952644j 0.000055+0.000028j -16.353370 -0.101748 -84.235327
4.004 -0.147174-0.038715j -0.262969+0.952727j 0.000055+0.000028j -16.352819 -0.101761 -84.253149
... ... ... ... ... ... ...
8.996 0.005780-0.006204j 0.976020+0.217516j -0.000039+0.000050j -41.433315 -0.000314 -83.990805
8.997 0.005783-0.006260j 0.976093+0.217185j -0.000039+0.000050j -41.388457 -0.000317 -83.990549
8.998 0.005786-0.006317j 0.976166+0.216855j -0.000039+0.000050j -41.343861 -0.000319 -83.990273
8.999 0.005790-0.006373j 0.976239+0.216524j -0.000039+0.000050j -41.299529 -0.000322 -83.989977
9.000 0.005793-0.006430j 0.976312+0.216192j -0.000039+0.000050j -41.255465 -0.000325 -83.989660

5001 rows × 6 columns

[30]:
# Reference to current axis.
magnitude = plt.figure('Magnitude S11, S21, and S31')
plt.clf()
axis = plt.gca() # Get current axis.
dataframe_scattering[0].plot(kind = 'line', y='20_log_of_mag_S11', color = 'green', ax = axis)
dataframe_scattering[0].plot(kind = 'line', y='20_log_of_mag_S21', color = 'blue', ax = axis)
dataframe_scattering[0].plot(kind = 'line', y='20_log_of_mag_S31', color = 'red', ax = axis)
plt.title(f'S-Parameter Magnitude')
plt.xlabel(f'frequency [GHZ]')
plt.ylabel(f'|S11|,|S21|,|S31| [dB]')
magnitude.show()
[31]:
# Data is shown as degrees.
# However, if you want radians, change value of deg to false, deg=False.
dataframe_scattering[0]['degrees_S11'] = np.angle(s11, deg=True)
dataframe_scattering[0]['degrees_S21'] = np.angle(s21, deg=True)
dataframe_scattering[0]['degrees_S31'] = np.angle(s31, deg=True)
dataframe_scattering[0]
[31]:
S11 S21 S31 20_log_of_mag_S11 20_log_of_mag_S21 20_log_of_mag_S31 degrees_S11 degrees_S21 degrees_S31
4.000 -0.147086-0.038897j -0.264193+0.952394j 0.000055+0.000028j -16.355031 -0.101708 -84.181500 -165.187158 105.503950 27.027756
4.001 -0.147108-0.038852j -0.263887+0.952478j 0.000055+0.000028j -16.354476 -0.101722 -84.199503 -165.205819 105.485570 27.012771
4.002 -0.147130-0.038806j -0.263581+0.952561j 0.000055+0.000028j -16.353923 -0.101735 -84.217446 -165.224480 105.467191 26.997785
4.003 -0.147152-0.038761j -0.263275+0.952644j 0.000055+0.000028j -16.353370 -0.101748 -84.235327 -165.243140 105.448812 26.982800
4.004 -0.147174-0.038715j -0.262969+0.952727j 0.000055+0.000028j -16.352819 -0.101761 -84.253149 -165.261801 105.430433 26.967815
... ... ... ... ... ... ... ... ... ...
8.996 0.005780-0.006204j 0.976020+0.217516j -0.000039+0.000050j -41.433315 -0.000314 -83.990805 -47.027252 12.563626 128.377355
8.997 0.005783-0.006260j 0.976093+0.217185j -0.000039+0.000050j -41.388457 -0.000317 -83.990549 -47.269117 12.544227 128.350189
8.998 0.005786-0.006317j 0.976166+0.216855j -0.000039+0.000050j -41.343861 -0.000319 -83.990273 -47.509012 12.524818 128.322852
8.999 0.005790-0.006373j 0.976239+0.216524j -0.000039+0.000050j -41.299529 -0.000322 -83.989977 -47.746983 12.505400 128.295342
9.000 0.005793-0.006430j 0.976312+0.216192j -0.000039+0.000050j -41.255465 -0.000325 -83.989660 -47.983072 12.485973 128.267657

5001 rows × 9 columns

[32]:
# Reference to current axis.
phase = plt.figure('Phase of S11 and S21')
plt.clf()
axis = plt.gca() # Get current axis.
dataframe_scattering[0].plot(kind = 'line', y='degrees_S11', color = 'green', ax = axis)
dataframe_scattering[0].plot(kind = 'line', y='degrees_S21', color = 'blue', ax = axis)
dataframe_scattering[0].plot(kind = 'line', y='degrees_S31', color = 'red', ax = axis)
plt.title(f'S-Parameter Phase')
plt.xlabel(f'frequency [GHZ]')
plt.ylabel(f'<S11, <S21, <S31 [degrees]')
phase.show()
[33]:
em1.close()
[34]:
# Uncomment next line if you would like to close the gui
# gui.main_window.close()

For more information, review the Introduction to Quantum Computing and Quantum Hardware lectures below

  • Superconducting Qubits I: Quantizing a Harmonic Oscillator, Josephson Junctions Part 1
Lecture Video Lecture Notes Lab
  • Superconducting Qubits I: Quantizing a Harmonic Oscillator, Josephson Junctions Part 2
Lecture Video Lecture Notes Lab
  • Superconducting Qubits I: Quantizing a Harmonic Oscillator, Josephson Junctions Part 3
Lecture Video Lecture Notes Lab
  • Superconducting Qubits II: Circuit Quantum Electrodynamics, Readout and Calibration Methods Part 1
Lecture Video Lecture Notes Lab
  • Superconducting Qubits II: Circuit Quantum Electrodynamics, Readout and Calibration Methods Part 2
Lecture Video Lecture Notes Lab
  • Superconducting Qubits II: Circuit Quantum Electrodynamics, Readout and Calibration Methods Part 3
Lecture Video Lecture Notes Lab