{ "cells": [ { "cell_type": "markdown", "id": "intro", "metadata": {}, "source": [ "# Two-Level: Two-Pulse Photon Echo\n", "\n", "In an inhomogeneously broadened two-level medium a pair of short pulses\n", "can generate a coherent burst — the **photon echo** — at time $t = +\\tau$\n", "after the second pulse, where $\\tau$ is the separation between the two pulses.\n", "\n", "## Physical mechanism\n", "\n", "1. **π/2 pulse** (at $t = -\\tau$): places all atoms in an equal superposition\n", " of ground and excited state. Each atom begins precessing at its own\n", " transition frequency $\\omega_j$ (set by its Doppler shift).\n", "\n", "2. **Free precession** ($-\\tau < t < 0$): atoms accumulate different phases\n", " $\\phi_j = \\omega_j \\tau$. The macroscopic polarisation\n", " $P \\propto \\sum_j \\rho_{10}^{(j)}$ rapidly *dephases* — the\n", " free-induction decay (FID).\n", "\n", "3. **π pulse** (at $t = 0$): inverts every Bloch vector, reversing the\n", " sense of accumulated phase: $\\phi_j \\to -\\phi_j$.\n", "\n", "4. **Rephasing** ($0 < t < \\tau$): atoms continue precessing in the same\n", " direction. Because the sign of the phase offset was flipped, after\n", " a further $\\tau$ all phase differences cancel simultaneously, giving a\n", " macroscopic polarisation revival — the **photon echo** at $t = +\\tau$.\n", "\n", "The echo amplitude decays as $e^{-2\\tau/T_2}$ where $T_2$ is the\n", "homogeneous coherence time.\n", "\n", "## Hard-pulse condition\n", "\n", "For the echo to form correctly every velocity class must be rotated by\n", "exactly π/2 (or π), regardless of its Doppler detuning. This requires\n", "\n", "$$\\Omega_{\\rm peak} \\gg \\Delta_{\\rm Doppler}$$\n", "\n", "i.e. the pulse must be short and strong enough that the detuning has\n", "negligible effect during the pulse. Here we use $T = 0.025\\,\\gamma^{-1}$,\n", "giving $\\Omega_{\\rm peak}^{(\\pi/2)} = 10\\,{\\rm rad}\\,\\gamma$ and\n", "$\\Omega_{\\rm peak}^{(\\pi)} = 20\\,{\\rm rad}\\,\\gamma$.\n", "The Gaussian Doppler distribution has $\\sigma \\approx 4.2\\,{\\rm rad}\\,\\gamma$\n", "(from `thermal_width = 0.15`; the solver convention is that the\n", "Hamiltonian detuning is $4\\pi^2 \\times$ the `thermal_delta` user value,\n", "so `thermal_width = 0.15` maps to $\\sigma \\approx 4.2\\,{\\rm rad}\\,\\gamma$).\n", "This gives $\\Omega_{\\rm peak}^{(\\pi/2)}/\\sigma \\approx 2.4$, satisfying\n", "the hard-pulse condition for all significantly-weighted velocity classes.\n", "\n", "## Level structure\n", "\n", "```\n", " |1⟩ ════════════════ (excited)\n", " │ decay rate 0.1 → T₂ ≈ 3.18 γ⁻¹\n", " Ω │ π/2 and π sech pulses (hard-pulse limit)\n", " │\n", " |0⟩ ════════════════ (ground)\n", "```\n", "\n", "Inhomogeneous broadening: Gaussian Doppler distribution,\n", "$\\sigma \\approx 4.2\\,{\\rm rad}\\,\\gamma$ (wider than the homogeneous\n", "linewidth $\\Gamma = 2\\pi \\times {\\rm rate} \\approx 0.63\\,\\gamma$, narrower\n", "than the pulse bandwidth $\\sim 1/T = 40\\,\\gamma$).\n", "\n", "## Parameters\n", "\n", "| Quantity | Value | Notes |\n", "|---|---|---|\n", "| Decay `rate` | $0.1$ | $\\Gamma = 2\\pi\\times0.1 \\approx 0.63\\,{\\rm rad}\\,\\gamma$; $T_2 = 2/\\Gamma \\approx 3.18\\,\\gamma^{-1}$ |\n", "| Doppler $\\sigma$ | $4.2\\,{\\rm rad}\\,\\gamma$ | 40 velocity classes over $\\pm 0.75$ (user units) |\n", "| Pulse delay | $\\tau = 1.0\\,\\gamma^{-1}$ | echo at $t = +\\tau = +1.0\\,\\gamma^{-1}$ |\n", "| Pulse width | $T = 0.025\\,\\gamma^{-1}$ | hard-pulse: $\\Omega_{\\rm peak}^{(\\pi/2)} = 10$, $\\Omega_{\\rm peak}^{(\\pi)} = 20\\,{\\rm rad}\\,\\gamma$ |\n", "| Echo amplitude | $e^{-2/3.18} \\approx 53\\%$ | $T_2$ decay at $\\tau = 1.0\\,\\gamma^{-1}$ |" ] }, { "cell_type": "code", "execution_count": 1, "id": "imports", "metadata": { "execution": { "iopub.execute_input": "2026-04-27T07:24:47.155807Z", "iopub.status.busy": "2026-04-27T07:24:47.155684Z", "iopub.status.idle": "2026-04-27T07:24:47.989746Z", "shell.execute_reply": "2026-04-27T07:24:47.989181Z" } }, "outputs": [], "source": [ "import numpy as np\n", "import plotly.graph_objects as go\n", "from maxwellbloch import mb_solve, plot\n", "from maxwellbloch.plot import theme # register Plotly template" ] }, { "cell_type": "code", "execution_count": 2, "id": "solve-main", "metadata": { "execution": { "iopub.execute_input": "2026-04-27T07:24:47.991479Z", "iopub.status.busy": "2026-04-27T07:24:47.991242Z", "iopub.status.idle": "2026-04-27T07:25:05.106168Z", "shell.execute_reply": "2026-04-27T07:25:05.105553Z" } }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/Users/tpo/repos/maxwellbloch/.venv/lib/python3.14/site-packages/qutip/solver/solver_base.py:598: FutureWarning: e_ops will be keyword only from qutip 5.3 for all solver\n", " warnings.warn(\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ " z-step 2/20 (10%)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ " z-step 4/20 (20%)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ " z-step 6/20 (30%)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ " z-step 8/20 (40%)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ " z-step 10/20 (50%)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ " z-step 12/20 (60%)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ " z-step 14/20 (70%)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ " z-step 16/20 (80%)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ " z-step 18/20 (90%)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Saving MBSolve to mbs-two-photon-echo.qu\n", "Done\n" ] } ], "source": [ "tau = 1.0 # delay: π/2 at t=-τ, π at t=0, echo at t=+τ\n", "T = 0.025 # sech half-width — short hard pulses, Ω_peak >> Δ_Doppler\n", "\n", "mb_solve_json = f\"\"\"\n", "{{\n", " \"atom\": {{\n", " \"num_states\": 2,\n", " \"decays\": [\n", " {{\"channels\": [[0, 1]], \"rate\": 0.1}}\n", " ],\n", " \"fields\": [\n", " {{\n", " \"label\": \"pi_half\",\n", " \"coupled_levels\": [[0, 1]],\n", " \"rabi_freq\": 1.0,\n", " \"rabi_freq_t_func\": \"sech\",\n", " \"rabi_freq_t_args\": {{\"n_pi\": 0.5, \"centre\": {-tau}, \"width\": {T}}}\n", " }},\n", " {{\n", " \"label\": \"pi\",\n", " \"coupled_levels\": [[0, 1]],\n", " \"rabi_freq\": 1.0,\n", " \"rabi_freq_t_func\": \"sech\",\n", " \"rabi_freq_t_args\": {{\"n_pi\": 1.0, \"centre\": 0.0, \"width\": {T}}}\n", " }}\n", " ]\n", " }},\n", " \"t_min\": -2.5,\n", " \"t_max\": 2.0,\n", " \"t_steps\": 900,\n", " \"z_min\": 0.0,\n", " \"z_max\": 1.0,\n", " \"z_steps\": 20,\n", " \"z_steps_inner\": 2,\n", " \"interaction_strengths\": [1.0, 1.0],\n", " \"velocity_classes\": {{\n", " \"thermal_width\": 0.15,\n", " \"thermal_delta_min\": -0.75,\n", " \"thermal_delta_max\": 0.75,\n", " \"thermal_delta_steps\": 40\n", " }},\n", " \"savefile\": \"mbs-two-photon-echo\"\n", "}}\n", "\"\"\"\n", "\n", "mbs = mb_solve.MBSolve().from_json_str(mb_solve_json)\n", "mbs.mbsolve(recalc=True)\n", "print(\"Done\")" ] }, { "cell_type": "markdown", "id": "output-section", "metadata": {}, "source": [ "## Output field: photon echo at $t = +\\tau$\n", "\n", "The total transmitted field\n", "$|\\Omega_{\\pi/2}(z_{\\rm max},t)| + |\\Omega_{\\pi}(z_{\\rm max},t)|$\n", "shows three features: the transmitted π/2 pulse (attenuated by Beer-Lambert\n", "absorption), the transmitted π pulse, and the **photon echo** at $t = +\\tau$." ] }, { "cell_type": "code", "execution_count": 3, "id": "plot-output-field", "metadata": { "execution": { "iopub.execute_input": "2026-04-27T07:25:05.107734Z", "iopub.status.busy": "2026-04-27T07:25:05.107640Z", "iopub.status.idle": "2026-04-27T07:25:05.807336Z", "shell.execute_reply": "2026-04-27T07:25:05.806856Z" } }, "outputs": [ { "data": { "text/html": [ " \n", " \n", " " ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "