Logo

A physics toolbox for laser spectroscopy.

Static Badge Static Badge Static Badge

Static Badge Static Badge

© 2025 Patrick Müller. All rights reserved.

Time evolution of quantum interference in fluorescence spectra

In this tutorial, the photon scattering rate of 7Li is calculated using different coherent and perturbative solvers included in qspec.simulate. The resulting scattering rates reproduce the simulated fluorescence spectra shown in Fig. 2 by Brown et al. [1]. This tutorial is also part of qspec's publication.

import numpy as np
import qspec.simulate as sim

f_sp = 446810183.163  # Transition frequency (MHz)
a_sp = 36.891  # Einstein coefficient (rad MHz)

s_hyper = [401.75825]  # HFS constants (MHz)
p_hyper = [-3.055038, -0.29670]

s = sim.construct_electronic_state(
    0., s=0.5, l=0, j=0.5, i=1.5, hyper_const=s_hyper, label='s')
p = sim.construct_electronic_state(
    f_sp, s=0.5, l=1, j=1.5, i=1.5, hyper_const=p_hyper, label='p')

decay = sim.DecayMap(labels=[('s', 'p')], a=[a_sp])
li7 = sim.Atom(s + p, decay)

intensity = 1.  # uW /mm**2
polarization = sim.Polarization([0, 1, 0])  # Linear polarization
laser = sim.Laser(f_sp, intensity, polarization)

inter = sim.Interaction(li7, [laser])
inter.controlled = True  # Error controlled integrator

t = 0.2  # Integration time (us)
delta = np.linspace(-325, -275, 201)  # Frequency detunings (MHz)
theta, phi = 0., 0.  # Angles from z-axis in x- and y-direction (rad)

n = inter.rates(t, delta)  # Rate equations, 0.2 us
y_rates = li7.scattering_rate(n, theta, phi, as_density_matrix=False)

rho = inter.master(t, delta)  # Master equation, 0.2 us
y_master = li7.scattering_rate(rho, theta, phi)

rho = inter.master(0.4, delta)  # Master equation, 0.4 us
y4_master = li7.scattering_rate(rho, theta, phi)

sr = sim.ScatteringRate(li7, laser=laser)
y_brown = sr.generate_y(delta, theta, phi)[:, 0, 0]  # Brown et al.

Using matplotlib, we can generate the plot from the publication.

import matplotlib.pyplot as plt

scale = 1e3
x_lim = delta[0], delta[-1]

fig, (m, r) = plt.subplots(
    2, 1, sharex='all', height_ratios=[3, 1], figsize=(6, 5))

m.plot(delta, y_brown * scale, '-k',
       label=r'Brown $et\,al.$', zorder=20)
m.plot(delta, y_rates[:, -1] * scale, '-C0',
       label=r'rates, $t = 0.2\,\mu$s', zorder=0)
m.plot(delta, y_master[:, -1] * scale, '-C1',
       label=r'master, $t = 0.2\,\mu$s', zorder=60)
m.plot(delta, y4_master[:, -1] * scale, '--C3',
       label=r'master, $t = 0.4\,\mu$s', linewidth=1.5, zorder=30)


r.plot(delta, (y_brown - y_rates[:, -1]) * scale,
       '-k', zorder=20)
r.plot(delta, (y_master[:, -1] - y_rates[:, -1]) * scale,
       '-C1', zorder=60)
r.plot(delta, (y4_master[:, -1] - y_rates[:, -1]) * scale,
       '--C3', linewidth=1.5, zorder=10)
r.hlines(0, *x_lim, 'C0', '-', zorder=0)

m.legend()
m.set_ylabel(r'$\mathrm{d}\Gamma / \mathrm{d}\Omega$ (kHz)')
m.set_xlim(*x_lim)
r.set_xlabel('Relative frequency (MHz)')
r.set_ylabel('Residuals (kHz)')

y_lim = m.get_ylim()
r.set_ylim(-(y_lim[1] - y_lim[0]) / 6, (y_lim[1] - y_lim[0]) / 6)

plt.subplots_adjust(left=0.09, bottom=0.1, right=0.99, top=0.99, hspace=0.05)
plt.show()

References