Calculating Rydberg atom transition frequencies

The wavelength of the transition between the $n_1$th and $n_2$th levels is given by,

\begin{equation} \frac{1}{\lambda} = R_{M} \left( \frac{1}{(n_1-\delta_1)^2} - \frac{1}{(n_2-\delta_2)^2} \right) \end{equation}

where $\delta_x$ are the quantum defects, and $R_{M}$ is the reduced mass,

\begin{equation} R_{M} = \frac{R_{\infty}}{1+\frac{m_e}{M}} \end{equation}

where $R_{\infty}$ is the Rydberg constant with an infinite mass nucleus, $m_e$ is the electron mass, and $M$ is the mass of the nucleus. $R_{\infty}$ is given by,

\begin{equation} R_{\infty} = \frac{m_e e^4}{8 \epsilon_0^2 h^3 c} = 1.0973731568508 \times 10^7 m^{-1} \end{equation}

The frequency of the transition is then,

\begin{equation} f = \frac{c}{\lambda} \end{equation}

where $c$ is the speed of light.


In [1]:
import numpy as np
import matplotlib.pyplot as plt

%matplotlib inline

In [2]:
class RydbergHelium:
    def __init__(self):
        self.z = 2
        self.r_inf = 1.0973731568508 * 10**7
        self.c = 2.99792458 * 10**8
        self.h = 6.62607004 * 10**-34
        self.e = 1.60217662 * 10**-19
        self.m_e = 9.10938356 * 10**-31
        self.m_p = 1.6726219 * 10**-27
    
    def energy_level(self, n, l):
        r_m = self.r_inf / (1 + (self.m_e/(2*self.z*self.m_p)))
        defect = self.quantum_defect(n, l)
        wavelength = 1 / ( r_m * ( 1/float(n-defect)**2 ) )
        return self.h * self.c / wavelength
    
    def energy_transition(self, n_from, n_to, l_from=6, l_to=6):
        return np.abs(self.energy_level(n_from, l_from) - self.energy_level(n_to, l_to))
    
    def quantum_defect(self, n, l):
        # Routine to calculate the quantum defects of the triplet Rydberg states of helium
        # From Martin, Phys. Rev. A, vol. 36, pp. 3575-3589 (1987)

        #    s            p            d           f           g           h           +
        a = [0.29665486,  0.06835886,  0.00289043, 0.00043924, 0.00012568, 0.00004756, 0]
        b = [0.03824614, -0.01870111, -0.0064691, -0.0017850, -0.0008992, -0.000552  , 0]
        c = [0.0082574,  -0.0117730,   0.001362,   0.000465,   0.0007,     0.00112   , 0]
        d = [0.000359,   -0.008540,   -0.00325,    0,          0,          0         , 0]

        if l <= 5:
            idx = l;
        else:
            idx = 6
            
        m = n - a[idx];
        return a[idx] + b[idx]*m**(-2) + c[idx]*m**(-4) + d[idx]*m**(-6);
    
    def energy_ionisation(self):
        # E/hc = 1/lambda (cm^-1)
        return (self.h * self.c) * (198310.6663720 * 100)
    
    def energy_1s3p(self):
        # E/hc = 1/lambda (cm^-1)
        return (self.h * self.c) * (185564.561920 * 100) # J = 2
    
    def energy_1s2s(self):
        # E/hc = 1/lambda (cm^-1)
        return (self.h * self.c) * (159855.9743297 * 100)
    
    def energy_1s3p_nl(self, n, l):
        return (self.energy_ionisation() - self.energy_1s3p()) - self.energy_level(n, l)
    
    def frequency(self, E):
        return E / self.h
    
    def wavelength(self, E):
        return self.h * self.c / E

In [3]:
atom = RydbergHelium()
abs_55s = atom.wavelength(atom.energy_1s3p_nl(55, 0)) * 10**9
ref_55s = 786.8166
offset = ref_55s - abs_55s

In [4]:
atom.wavelength(atom.energy_1s3p_nl(70, 0)) * 10**9 + offset


Out[4]:
785.945712823385

In [5]:
atom.frequency(atom.energy_transition(70,72,0,0)) / 10**9


Out[5]:
37.241744902931167

In [ ]: