RESULT: only illuminate hybridized modes

This commit is contained in:
Valentin Boettcher 2024-07-18 10:49:58 -04:00
parent b7b20d5616
commit 6850fb635f
10 changed files with 159 additions and 2 deletions

View file

@ -60,7 +60,7 @@ def make_params_and_solve(
case "hybrid_to_one_bath":
params.drive_override = (
np.array([params.Ω * (1 - params.δ), params.Ω * params.δ * 2]),
np.array([params.Ω * (1 - params.δ), params.Ω * (1 + params.δ)]),
np.ones(2),
)
@ -163,7 +163,7 @@ def generate_phase_one_data(
ax_realtime.set_title("Photo-diode AC Intensity")
# now we plot the power spectrum
window = (float(params.laser_off_time or 0), t[-1])
window = (float(params.laser_off_time) or 0, t[-1])
# window = (0, float(params.laser_off_time or 0))
ringdown_params = RingdownParams(
@ -260,3 +260,22 @@ if __name__ == "__main__":
""",
)
save_figure(fig, "004_05_11_07_simulation_only_a_drive_on_bath")
fig = generate_phase_one_data(
laser_detuning=13 - 3.25,
g_0=0.3,
drive_mode="hybrid_to_one_bath",
off_factor=0.4,
noise=True,
yscale="log",
extra_title="""
The same as the first simulation, but with the laser at a bath mode and driving at Ω-δ,Ω+δ i.e coupling Bath-Hyb-Hyb-Bath.
From a simple analytical estimate, this can be seen as advantageous!
The log-scale on the spectrum is necessary as the bath mode gets way more excited! However the noise magnitude is the same as in the other simulations.
Timing is /not/ important here *if* the drive amplitude is low engough!
""",
)
save_figure(fig, "004_06_11_07_bhhb_best")

View file

@ -0,0 +1,110 @@
from rabifun.system import *
from rabifun.plots import *
from rabifun.utilities import *
from rabifun.analysis import *
from ringfit.data import ScanData
from ringfit.plotting import *
import gc
path = "../../data/11_07_24/second_signal"
scan = ScanData.from_dir(path, extension="npz")
# %% plot scan
gc.collect()
fig = plt.figure("interactive", constrained_layout=True, figsize=(20, 3 * 5))
fig.clf()
(ax_signal, ax_window, ax_spectrum) = fig.subplot_mosaic("AA;BC").values()
plot_scan(scan, ax=ax_signal, linewidth=0.5, every=1000)
# %% window
# here we select a step that is resonant with a hybridized peak and
# then plot the full photodiode voltage trace and just the window
T_step = 0.0002
N = 100
t_scan_peak = 0.0057815 + 0.1e-6 # T * N_steps
t_scan_peak = 0.0057815 - 0.095e-6 + 28 * T_step # T * N_steps
t_peak = t_scan_peak + N * T_step
win_length = 5e-05
window = t_scan_peak, t_scan_peak + win_length * 0.2
ax_signal.axvline(t_peak, color="r", linestyle="--")
ax_signal.axvline(t_scan_peak, color="r", linestyle="--")
ax_signal.axvspan(*window, color="r", linestyle="--")
ax_signal.set_title("Full photodiode voltage trace")
ax_signal.set_xlabel("Time [s]")
ax_signal.set_ylabel("Voltage [arb]")
mask = (scan.time > window[0]) & (scan.time < window[1])
ax_window.clear()
ax_window.plot(scan.time[mask], scan.output[mask], linewidth=0.1)
ax_window.set_title("Windowed photodiode voltage trace")
ax_window.set_xlabel("Time [s]")
# %% peak analysis
## herein we detect the pertinent peaks and refine them using a lorentzian fit
ringdown_params = RingdownParams(
fω_shift=0,
mode_window=(0, 4),
fΩ_guess=12.9e6,
fδ_guess=0.2 * 12.9e6,
η_guess=0.5e6,
absolute_low_cutoff=5e6,
)
peak_info = find_peaks(scan, ringdown_params, window, prominence=0.1)
peak_info = refine_peaks(peak_info, ringdown_params)
plot_spectrum_and_peak_info(ax_spectrum, peak_info, ringdown_params, annotate=True)
# %% hand-crafted interpretation
b1, b2, b3 = peak_info.peak_freqs[[0, 1, 2]]
Ω = b3 - b2
hyb_freq = b1 - 0.18 * Ω
alt_Ω = b2 - b1
hyb_amp = peak_info.power[peak_info.peaks[1]] / (np.sqrt(2) * 5) ** 2 * 10
hyb_width = peak_info.peak_widths[1] * 5
ax_spectrum.plot(
peak_info.freq,
lorentzian(peak_info.freq, hyb_amp, hyb_freq, hyb_width),
color="C3",
label="hybridized mode?",
)
# %%
ax_spectrum.legend()
fig.suptitle(
f"""
Analysis of the data from the 11/07.
We modulated at the FSR (13MHz) and FSR-δ and 2δ.
*Laser on first bath mode*
Here the laser hits the first bathmode beside the hybidized modes. This is the reason
why the peaks toward higher frequencies are split (we're detuned from the unperturbed spectrum).
The FSR here is {Ω*1e-6:.2f}MHz as ascertained from the bath modes. According to the simulation for driving
on the bath mode, we should see at least one hybridized mode where the red lorentzian is plotted. It's amplitude
is fantasy, but there certainly there seems to be something there!
"""
)
# %% save
if __name__ == "__main__":
save_figure(fig, "005_11_07_analysis_on_bath")
quick_save_pickle(
dict(
window=window,
peak_info=peak_info,
ringdown_parms=ringdown_params,
Ω=Ω,
),
"005_results",
)

View file

@ -0,0 +1,8 @@
change_id: rxrtsmmqspvtqxwvltyzqxntmowrvuxk
commit_id: 27d6a0603bbd5f1af744cecebc9d34e9e817f417
description: ''
extra_meta: null
function: <module>
name: 004_06_11_07_bhhb_best
refers_to: ./figs/004_06_11_07_bhhb_best.pdf
source: scripts/ringdown_spectrum_analysis/004_simulation_11_07.py

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 MiB

View file

@ -0,0 +1,8 @@
change_id: rxrtsmmqspvtqxwvltyzqxntmowrvuxk
commit_id: 79ac3014d82cc3dbecb65c44ae375c44019795d3
description: ''
extra_meta: null
function: <module>
name: 005_11_07_analysis_on_bath
refers_to: ./figs/005_11_07_analysis_on_bath.pdf
source: scripts/ringdown_spectrum_analysis/005_11_07_analysis_on_bath.py

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 MiB

View file

@ -0,0 +1,6 @@
change_id: rxrtsmmqspvtqxwvltyzqxntmowrvuxk
commit_id: e2b1c2a8ffea1ab07e45ab07b0a3a66d4ae6207f
description: ''
function: <module>
refers_to: outputs/005_results.pkl
source: scripts/ringdown_spectrum_analysis/005_11_07_analysis_on_bath.py

View file

@ -136,6 +136,8 @@ def write_meta(path, **kwargs):
@noop_if_interactive
def save_figure(fig, name, extra_meta=None, *args, **kwargs):
import pickle
dir = pathlib.Path(f"./figs/")
dir.mkdir(exist_ok=True)
fig.tight_layout()
@ -146,6 +148,10 @@ def save_figure(fig, name, extra_meta=None, *args, **kwargs):
plt.savefig(f"./figs/{name}.png", *args, dpi=600, **kwargs)
print(f"Figure saved as ./figs/{name}.pdf")
pickle_path = dir / f"{name}.pkl"
with open(pickle_path, "wb") as f:
pickle.dump(fig, f)
@noop_if_interactive