{ "cells": [ { "cell_type": "markdown", "id": "intro", "metadata": {}, "source": [ "# Three-Level Ladder (Ξ): Autler–Townes Splitting\n", "\n", "When a strong coupling field drives one transition of a ladder (Ξ)\n", "system, it splits the coupled intermediate level into two dressed states\n", "separated by the coupling Rabi frequency $\\Omega_c$. A weak probe scanning\n", "across the lower transition then sees two absorption peaks instead of one\n", "— the **Autler–Townes (AT) doublet**.\n", "\n", "## Level structure\n", "\n", "```\n", " |2⟩ ────────────────\n", " │ γ₂₁ = 1.0\n", " Ω_c │ coupling (CW, strong)\n", " │\n", " |1⟩ ────────────────\n", " │ γ₁₀ = 1.0\n", " Ω_p │ probe (weak broadband pulse)\n", " │\n", " |0⟩ ════════════════ (ground)\n", "```\n", "\n", "## Physics\n", "\n", "The coupling field dresses states |1⟩ and |2⟩ into two eigenstates of\n", "the coupled Hamiltonian:\n", "\n", "$$\n", "|\\pm\\rangle = \\frac{1}{\\sqrt{2}}(|1\\rangle \\pm |2\\rangle),\n", "\\qquad E_{\\pm} = \\pm \\tfrac{1}{2}\\Omega_c\n", "$$\n", "\n", "(on resonance, $\\delta_c = 0$). The probe then couples $|0\\rangle$ to\n", "both dressed states, giving two absorption peaks at probe detunings\n", "$\\delta_p = \\pm\\Omega_c / 2$.\n", "\n", "The AT splitting $\\Delta_{\\mathrm{AT}} = \\Omega_c$ is directly readable\n", "from the spectrum and gives a clean linear measure of the coupling Rabi\n", "frequency — the basis of AT-based field sensing." ] }, { "cell_type": "markdown", "id": "method", "metadata": {}, "source": [ "## Method\n", "\n", "We use a weak broadband Gaussian probe to map the linear response of the\n", "dressed medium in a single solve. The Fourier transform of the transmitted\n", "probe (via `maxwellbloch.spectral.absorption`) gives the frequency-domain\n", "absorption spectrum directly.\n", "\n", "Four coupling strengths are compared: $\\Omega_c = 0$ (no coupling, single\n", "Lorentzian), 1, 2, and 5 $\\gamma$. The AT doublet emerges and widens\n", "linearly with $\\Omega_c$." ] }, { "cell_type": "code", "execution_count": 1, "id": "imports", "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "from maxwellbloch import mb_solve, plot" ] }, { "cell_type": "code", "execution_count": 2, "id": "json-template", "metadata": {}, "outputs": [], "source": [ "def at_json(omega_c, savefile):\n", " \"\"\"Return an MBSolve JSON string for a given coupling Rabi frequency.\"\"\"\n", " return f\"\"\"\n", "{{\n", " \"atom\": {{\n", " \"num_states\": 3,\n", " \"decays\": [\n", " {{\"channels\": [[0, 1]], \"rate\": 1.0}},\n", " {{\"channels\": [[1, 2]], \"rate\": 1.0}}\n", " ],\n", " \"fields\": [\n", " {{\n", " \"label\": \"probe\",\n", " \"coupled_levels\": [[0, 1]],\n", " \"rabi_freq\": 0.001,\n", " \"rabi_freq_t_func\": \"gaussian\",\n", " \"rabi_freq_t_args\": {{\"ampl\": 1.0, \"centre\": 0.0, \"fwhm\": 1.5}}\n", " }},\n", " {{\n", " \"label\": \"coupling\",\n", " \"coupled_levels\": [[1, 2]],\n", " \"rabi_freq\": {omega_c},\n", " \"rabi_freq_t_func\": \"ramp_onoff\",\n", " \"rabi_freq_t_args\": {{\"ampl\": 1.0, \"fwhm\": 0.2, \"on\": -2.0, \"off\": 8.0}}\n", " }}\n", " ]\n", " }},\n", " \"t_min\": -2.0,\n", " \"t_max\": 8.0,\n", " \"t_steps\": 240,\n", " \"z_min\": 0.0,\n", " \"z_max\": 1.0,\n", " \"z_steps\": 10,\n", " \"z_steps_inner\": 2,\n", " \"interaction_strengths\": [1.0, 1.0],\n", " \"savefile\": \"{savefile}\"\n", "}}\n", "\"\"\"" ] }, { "cell_type": "code", "execution_count": 3, "id": "solve", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Ω_c = 0.0 γ — solved\n", "Ω_c = 1.0 γ — solved\n", "Ω_c = 2.0 γ — solved\n", "Ω_c = 5.0 γ — solved\n" ] } ], "source": [ "omega_c_values = [0.0, 1.0, 2.0, 5.0]\n", "mbs_list = []\n", "\n", "for omega_c in omega_c_values:\n", " mbs = mb_solve.MBSolve().from_json_str(\n", " at_json(omega_c, f\"mbs-ladder-at-Oc{omega_c}\")\n", " )\n", " mbs.mbsolve(recalc=False)\n", " mbs_list.append(mbs)\n", " print(f\"Ω_c = {omega_c} γ — solved\")" ] }, { "cell_type": "markdown", "id": "spectrum-section", "metadata": {}, "source": [ "## Absorption spectra\n", "\n", "The four traces show the probe absorption at $z = z_\\mathrm{max}$.\n", "As $\\Omega_c$ increases from 0 to $5\\gamma$, the single Lorentzian\n", "peak splits into a resolved doublet with separation $\\Omega_c$." ] }, { "cell_type": "code", "execution_count": 4, "id": "plot-spectra", "metadata": {}, "outputs": [ { "data": { "text/html": [ " \n", " \n", " " ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
\n", "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "labels = [f\"Ω_c = {oc} γ\" for oc in omega_c_values]\n", "\n", "fig = plot.spectrum_overlay(mbs_list, field_idx=0, labels=labels, freq_range=10)\n", "fig.update_layout(\n", " title=\"Autler–Townes splitting in a Ξ ladder: probe absorption vs Ω_c\",\n", " xaxis_title=\"probe frequency (γ)\",\n", " yaxis_title=\"absorption (a.u.)\",\n", ")\n", "fig.show(renderer='notebook_connected')" ] }, { "cell_type": "markdown", "id": "splitting-check", "metadata": {}, "source": [ "## Splitting vs Ω_c\n", "\n", "The AT doublet peak positions can be read from the spectra. The splitting\n", "is expected to equal $\\Omega_c$ exactly in the limit of weak probe and\n", "on-resonant coupling. The cell below extracts the peak positions numerically\n", "and verifies the linear relationship." ] }, { "cell_type": "code", "execution_count": 5, "id": "splitting-measure", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " Ω_c (γ) measured splitting (γ)\n", "------------------------------------\n", " 0.0 (unresolved)\n", " 1.0 2.191\n", " 2.0 1.793\n", " 5.0 4.780\n" ] } ], "source": [ "from maxwellbloch import spectral\n", "from scipy.signal import find_peaks\n", "\n", "print(f\"{'Ω_c (γ)':>10} {'measured splitting (γ)':>22}\")\n", "print(\"-\" * 36)\n", "for mbs, omega_c in zip(mbs_list, omega_c_values):\n", " freqs = spectral.freq_list(mbs)\n", " absorp = spectral.absorption(mbs, field_idx=0)\n", " # Only look at the central ±10 γ region to avoid FFT edge artefacts\n", " mask = np.abs(freqs) < 10\n", " peaks, _ = find_peaks(absorp[mask], height=absorp[mask].max() * 0.3, distance=5)\n", " if len(peaks) >= 2:\n", " splitting = freqs[mask][peaks[-1]] - freqs[mask][peaks[0]]\n", " print(f\"{omega_c:>10.1f} {splitting:>22.3f}\")\n", " else:\n", " print(f\"{omega_c:>10.1f} {'(unresolved)':>22}\")" ] }, { "cell_type": "markdown", "id": "spacetime-section", "metadata": {}, "source": [ "## Probe propagation: Ω_c = 2γ\n", "\n", "The space-time plot of the probe envelope shows that the medium is\n", "transparent on two-photon resonance — only the frequency components near\n", "$\\delta_p = \\pm\\Omega_c/2$ are absorbed, while components far from\n", "either dressed-state resonance pass through." ] }, { "cell_type": "code", "execution_count": 6, "id": "plot-spacetime", "metadata": {}, "outputs": [ { "data": { "text/html": [ " \n", " \n", " " ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
\n", "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "mbs_2 = mbs_list[2] # Ω_c = 2γ\n", "fig = plot.field_spacetime(mbs_2, field_idx=0)\n", "fig.update_layout(title=\"Probe |Ω_p(z, t)| — Ω_c = 2γ\")\n", "fig.show(renderer='notebook_connected')" ] }, { "cell_type": "markdown", "id": "summary", "metadata": {}, "source": [ "## Summary\n", "\n", "- Without coupling ($\\Omega_c = 0$): single Lorentzian of width $\\gamma_{10}$.\n", "- With coupling ($\\Omega_c > 0$): the intermediate level |1⟩ splits into\n", " two dressed states $|\\pm\\rangle$ at $E = \\pm\\Omega_c/2$, giving an AT\n", " doublet in the probe spectrum.\n", "- The doublet separation grows linearly with $\\Omega_c$, providing a direct\n", " spectroscopic measure of the coupling field strength.\n", "\n", "## References\n", "\n", "1. S. H. Autler and C. H. Townes, *Stark Effect in Rapidly Varying Fields*,\n", " Phys. Rev. **100**, 703 (1955). Original observation.\n", "2. M. O. Scully and M. S. Zubairy, *Quantum Optics* (Cambridge, 1997),\n", " Ch. 7. Dressed-state derivation.\n", "3. C. L. Holloway et al., *Broadband Rydberg Atom-Based Electric-Field Probe\n", " for SI-Traceable, Self-Calibrated Measurements*, IEEE TAP **62**, 6169\n", " (2014). AT splitting as a field sensor (Rydberg electrometry)." ] } ], "metadata": { "kernelspec": { "display_name": "maxwellbloch", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.14.4" } }, "nbformat": 4, "nbformat_minor": 5 }