Pulse Inspector and Bloch Simulator¶
In [ ]:
Copied!
from laboneq.contrib.bloch_simulator_pulse_plotter.inspector.update_inspect import (
pulse_update,
)
from laboneq.dsl.experiment import pulse_library
from laboneq.contrib.bloch_simulator_pulse_plotter.inspector.update_inspect import (
pulse_inspector,
)
from laboneq.contrib.bloch_simulator_pulse_plotter.inspector.update_inspect import (
pulse_update,
)
from laboneq.dsl.experiment import pulse_library
from laboneq.contrib.bloch_simulator_pulse_plotter.inspector.update_inspect import (
pulse_inspector,
)
Inversion with gaussian pulse¶
In [ ]:
Copied!
## define pulse
my_pulse = pulse_library.gaussian(uid="my_pulse", length=100e-9, amplitude=1.0)
## update pulse with spectral window and flip angle and subsequently, peak amplitude
my_pulse = pulse_update(
my_pulse,
spectral_window=200e6,
flip_angle=180,
pulse_parameters=my_pulse.pulse_parameters,
)
## define pulse
my_pulse = pulse_library.gaussian(uid="my_pulse", length=100e-9, amplitude=1.0)
## update pulse with spectral window and flip angle and subsequently, peak amplitude
my_pulse = pulse_update(
my_pulse,
spectral_window=200e6,
flip_angle=180,
pulse_parameters=my_pulse.pulse_parameters,
)
In [ ]:
Copied!
## plot IQ quadratures - is default (corresponds to output of instruments)
pulse_inspector(my_pulse)
## plot IQ quadratures - is default (corresponds to output of instruments)
pulse_inspector(my_pulse)
In [ ]:
Copied!
## plot IQ quadratures - is default (corresponds to output of instruments)
pulse_inspector(my_pulse, iq=True)
## plot IQ quadratures - is default (corresponds to output of instruments)
pulse_inspector(my_pulse, iq=True)
In [ ]:
Copied!
## plot amplitude and phase quadratures
pulse_inspector(my_pulse, amp_phi=True)
## plot amplitude and phase quadratures
pulse_inspector(my_pulse, amp_phi=True)
In [ ]:
Copied!
# plot frequency response / Bloch simulation of pulse
pulse_inspector(my_pulse, response=True)
# plot frequency response / Bloch simulation of pulse
pulse_inspector(my_pulse, response=True)
Inversion with flat-top Gaussian pulse¶
In [ ]:
Copied!
## define pulse
my_pulse = pulse_library.gaussian_square(
uid="my_pulse", width=80e-9, length=100e-9, amplitude=1.0
)
## update pulse with spectral window and flip angle and subsequently, peak amplitude
my_pulse = pulse_update(
my_pulse,
spectral_window=200e6,
flip_angle=180,
pulse_parameters=my_pulse.pulse_parameters,
)
## define pulse
my_pulse = pulse_library.gaussian_square(
uid="my_pulse", width=80e-9, length=100e-9, amplitude=1.0
)
## update pulse with spectral window and flip angle and subsequently, peak amplitude
my_pulse = pulse_update(
my_pulse,
spectral_window=200e6,
flip_angle=180,
pulse_parameters=my_pulse.pulse_parameters,
)
In [ ]:
Copied!
## nothing has been provided
pulse_inspector(my_pulse)
## nothing has been provided
pulse_inspector(my_pulse)
In [ ]:
Copied!
## plot IQ quadratures - is default (corresponds to output of instruments)
pulse_inspector(my_pulse, iq=True)
## plot IQ quadratures - is default (corresponds to output of instruments)
pulse_inspector(my_pulse, iq=True)
In [ ]:
Copied!
## plot amplitude and phase quadratures
pulse_inspector(my_pulse, amp_phi=True)
## plot amplitude and phase quadratures
pulse_inspector(my_pulse, amp_phi=True)
In [ ]:
Copied!
## plot frequency response / Bloch simulation of pulse
pulse_inspector(my_pulse, response=True)
## plot frequency response / Bloch simulation of pulse
pulse_inspector(my_pulse, response=True)
Inversion with higher-order Gaussian pulse (order = 40)¶
In [ ]:
Copied!
## define pulse
my_pulse = pulse_library.gaussian(
uid="my_pulse", order=40, length=100e-9, amplitude=1.0
)
## update pulse with spectral window and flip angle and subsequently, peak amplitude
my_pulse = pulse_update(
my_pulse,
spectral_window=200e6,
flip_angle=180,
pulse_parameters=my_pulse.pulse_parameters,
)
## define pulse
my_pulse = pulse_library.gaussian(
uid="my_pulse", order=40, length=100e-9, amplitude=1.0
)
## update pulse with spectral window and flip angle and subsequently, peak amplitude
my_pulse = pulse_update(
my_pulse,
spectral_window=200e6,
flip_angle=180,
pulse_parameters=my_pulse.pulse_parameters,
)
In [ ]:
Copied!
## nothing has been provided
pulse_inspector(my_pulse)
## nothing has been provided
pulse_inspector(my_pulse)
In [ ]:
Copied!
## plot IQ quadratures - is default (corresponds to output of instruments)
pulse_inspector(my_pulse, iq=True)
## plot IQ quadratures - is default (corresponds to output of instruments)
pulse_inspector(my_pulse, iq=True)
In [ ]:
Copied!
## plot amplitude and phase quadratures
pulse_inspector(my_pulse, amp_phi=True)
## plot amplitude and phase quadratures
pulse_inspector(my_pulse, amp_phi=True)
In [ ]:
Copied!
## plot frequency response / Bloch simulation of pulse
pulse_inspector(my_pulse, response=True)
## plot frequency response / Bloch simulation of pulse
pulse_inspector(my_pulse, response=True)
Inversion with DRAG pulse¶
In [ ]:
Copied!
## define pulse
my_pulse = pulse_library.drag(uid="my_pulse", length=100e-9, amplitude=1.0, beta=0.2)
my_pulse = pulse_update(
my_pulse,
spectral_window=200e6,
flip_angle=180,
pulse_parameters=my_pulse.pulse_parameters,
)
## define pulse
my_pulse = pulse_library.drag(uid="my_pulse", length=100e-9, amplitude=1.0, beta=0.2)
my_pulse = pulse_update(
my_pulse,
spectral_window=200e6,
flip_angle=180,
pulse_parameters=my_pulse.pulse_parameters,
)
In [ ]:
Copied!
## nothing has been provided
pulse_inspector(my_pulse)
## nothing has been provided
pulse_inspector(my_pulse)
In [ ]:
Copied!
## plot IQ quadratures - is default (corresponds to output of instruments)
pulse_inspector(my_pulse, iq=True)
## plot IQ quadratures - is default (corresponds to output of instruments)
pulse_inspector(my_pulse, iq=True)
In [ ]:
Copied!
## plot amplitude and phase quadratures
pulse_inspector(my_pulse, amp_phi=True)
## plot amplitude and phase quadratures
pulse_inspector(my_pulse, amp_phi=True)
In [ ]:
Copied!
## plot I and Q and amplitude and phase quadratures
pulse_inspector(my_pulse, amp_phi=True, iq=True)
## plot I and Q and amplitude and phase quadratures
pulse_inspector(my_pulse, amp_phi=True, iq=True)
In [ ]:
Copied!
## plot frequency response / Bloch simulation of pulse
pulse_inspector(my_pulse, response=True)
## plot frequency response / Bloch simulation of pulse
pulse_inspector(my_pulse, response=True)
Effect of order on flatness of Gaussian pulse¶
In [ ]:
Copied!
import numpy as np
import matplotlib.pyplot as plt
order_values = [2, 4, 8, 16, 64]
sigma = 1 / 3
x = np.linspace(-1, 1, 1000)
plt.figure(figsize=(10, 6))
for order in order_values:
y = np.exp(-((x**order) / (2 * sigma**2)))
plt.plot(x, y, label=f"Order = {order}")
plt.title("Gaussian Pulses with Different Orders")
plt.xlabel("x")
plt.ylabel("y")
plt.legend()
plt.grid(True)
plt.show()
import numpy as np
import matplotlib.pyplot as plt
order_values = [2, 4, 8, 16, 64]
sigma = 1 / 3
x = np.linspace(-1, 1, 1000)
plt.figure(figsize=(10, 6))
for order in order_values:
y = np.exp(-((x**order) / (2 * sigma**2)))
plt.plot(x, y, label=f"Order = {order}")
plt.title("Gaussian Pulses with Different Orders")
plt.xlabel("x")
plt.ylabel("y")
plt.legend()
plt.grid(True)
plt.show()
Flatness (%) vs Order¶
In [ ]:
Copied!
import pandas as pd
import matplotlib.pyplot as plt
from IPython.display import display
order_values = [4, 6, 8, 10, 12, 14, 16, 18, 20, 30, 40, 50, 60, 70, 80, 90, 100]
sigma = 1
x = np.linspace(-1, 1, 1000)
per = np.zeros(len(order_values))
for i in range(len(order_values)):
y = np.exp(-((x ** order_values[i]) / (2 * sigma**2)))
indices = np.where(y >= 0.999)[0]
x_values = x[indices]
per[i] = 100 * (np.max(x_values) - np.min(x_values)) / 2
# Create a DataFrame to display the results in table format
df = pd.DataFrame({"Order": order_values, "Flatness (%)": per})
df.set_index("Order", inplace=True)
display(df)
# Plot
plt.scatter(order_values, per)
plt.title("Order vs Flatness")
plt.xlabel("Order")
plt.ylabel("Flatness (%)")
plt.grid(True)
plt.show()
import pandas as pd
import matplotlib.pyplot as plt
from IPython.display import display
order_values = [4, 6, 8, 10, 12, 14, 16, 18, 20, 30, 40, 50, 60, 70, 80, 90, 100]
sigma = 1
x = np.linspace(-1, 1, 1000)
per = np.zeros(len(order_values))
for i in range(len(order_values)):
y = np.exp(-((x ** order_values[i]) / (2 * sigma**2)))
indices = np.where(y >= 0.999)[0]
x_values = x[indices]
per[i] = 100 * (np.max(x_values) - np.min(x_values)) / 2
# Create a DataFrame to display the results in table format
df = pd.DataFrame({"Order": order_values, "Flatness (%)": per})
df.set_index("Order", inplace=True)
display(df)
# Plot
plt.scatter(order_values, per)
plt.title("Order vs Flatness")
plt.xlabel("Order")
plt.ylabel("Flatness (%)")
plt.grid(True)
plt.show()