Oscillator Strengths
Quantum Chemistry
What you need to know first 4 concepts, 3 layers
The requisite-knowledge inventory for this page, bottom-up: the primitives at the base, combined upward until you reach what this page assumes. Skim the layers you already own; start wherever the ground gets unfamiliar.
An excited-state calculation hands you two numbers per state: the energy , which says where the line sits, and the oscillator strength , which says whether you will ever see it. The -values turn a list of eigenvalues into a spectrum — and they obey a conservation law strict enough to audit any calculation against: summed over every transition, they count the electrons. Exactly. Five ways in; read the one that lands.
The name is a fossil, and a useful one. Before quantum mechanics, Lorentz modeled each absorption line as an electron on a spring resonating at that line's frequency — and the model fits dispersion data beautifully, except that each line behaved like a fraction of an electron. Spectroscopists in the 1920s bookkept this with a fudge factor per line: this line responds like 0.44 of a classical oscillating electron, that one like 0.01.
Quantum mechanics then explained the fudge factor instead of discarding it: a transition with energy and transition moment responds to light exactly like classical oscillators, with computable from the matrix element. That heritage is why is dimensionless and why it is the right currency for comparing transitions across molecules: an of 1 means "as bright as one whole classical electron," whether the molecule is H2 or a dye with 300 atoms.
In atomic units, for a transition from up to :
Each factor has a job. The squared transition moment is the coupling to light — the antenna strength. The factor weights fast oscillations more (a classical oscillator at higher frequency carries more energy for the same amplitude). The 2/3 averages a 3D vector moment over the orientations of a randomly tumbling molecule — in a strict 1D world the formula is with no 3.
Smallest case, by hand: the harmonic oscillator with . The only allowed absorption from the ground state is 0 → 1, with and , so . One electron, one line, strength exactly one — the harmonic oscillator is the classical oscillator, and the definition is calibrated so it says so. The grid check below reproduces this to seven digits.
The Thomas-Reiche-Kuhn sum rule (1925 — it predates the Schrödinger equation) says the strengths from any state sum to the number of electrons:
The proof is two lines of commutator algebra: evaluate once directly — for any potential that depends only on position the double commutator is a constant, per electron — and once by inserting a complete set of states, which produces exactly the sum of -values. No details of the potential survive. Hydrogen, water, a protein: the total brightness is fixed the moment you count electrons.
So oscillator strength is a budget. A molecule never creates or destroys brightness; it only distributes it among its transitions. The harmonic oscillator posts the entire budget on one line (, everything else zero — forced, since only 0 → 1 is allowed and the total must be 1). The particle in a box spreads it: 0.9607 on the first line, 0.0307 on the next allowed one, a thinning tail above. When a dye's absorption grows, some other transition of that dye got dimmer. And when a computed sum comes out at 3.95 for a 10-electron molecule — see below — the missing 6 is a diagnosis, not a rounding error.
In Casida's equation you diagonalize once and get every excitation of the molecule — but the eigenvector of state is a list of occupied→virtual amplitudes, not yet a spectrum. The bridge is one contraction: assemble the one-particle dipole integrals in the MO basis, dot them with , and you have the many-electron transition dipole,
(The is spin adaptation for a closed shell; the response combination is because the dipole perturbation drives excitation and de-excitation coherently.) That's the entire distance from "diagonalized a matrix" to "predicted a UV-vis spectrum": five lines of einsum, run against water below and validated against PySCF to six digits.
Some states have exactly — not small, zero — because the transition density has a symmetry that no component of the dipole vector can match. Water's second excited state (11.29 eV in the calculation below) is the textbook case: its transition density transforms as in the C2v point group, and none of does, so every component of the transition moment vanishes identically. The state is there — the eigenvalue is real, the wavefunction is real — but one-photon absorption cannot reach it. It is dark.
Dark states are not a curiosity; they run photochemistry. A molecule pumped to a bright state often slides into a nearby dark state and parks there, invisible to your spectrometer, doing chemistry — fluorescence quenching, photoprotection in DNA and sunscreen, the slow phosphorescence of triplets (dark for the stronger reason that a spin flip is required). An absorption spectrum shows what couples to light, not what exists. The -column of a Casida calculation is often the fastest symmetry assignment you can get: zeros label the representations.
The budget, audited on a grid
One electron in 1D, so the budget is 1. Diagonalize on a finite-difference grid, form for the lowest 25 states, and add:
Harmonic oscillator, f(0->n) = 2 (E_n - E_0) |<0|x|n>|^2
f(0->1) = 0.99999944 (exact: 1)
largest other f : 8.90e-14
sum over 24 states : 0.99999944
Particle in a box, f(1->n) from the ground state
f(1->2) = 0.960675
f(1->3) = 0.000000
f(1->4) = 0.030742
f(1->5) = 0.000000
f(1->6) = 0.005445
f(1->7) = 0.000000
sum over 24 states : 0.99993084 The oscillator posts everything on one line, as the algebra forces it to. The box spreads the same total: parity zeros on every even line, then a tail falling like — the exact line strengths are ; plug in and out comes 0.030742, the printed value. After six lines the sum has 0.9999 of the budget. Both audits close to the 6th decimal, and what's missing is grid truncation error, not physics.
A real molecule: water
Now the full machinery: restricted Hartree-Fock on H2O in 6-31G, build the Casida matrices, solve all singlet roots via the Hermitian rewrite, and contract each with the dipole integrals:
# after solving the Casida problem: om = excitation energies,
# xpy = the (X+Y) eigenvectors, columns normalized to (X+Y)^T (X-Y) = 1
dip_ao = mol.intor_symmetric('int1e_r', comp=3) # <mu|r|nu>, 3 x nao x nao
occ, vir = mf.mo_coeff[:, :nocc], mf.mo_coeff[:, nocc:]
d_ov = np.einsum('xuv,ui,va->xia', dip_ao, occ, vir).reshape(3, nocc*nvir)
tdip = np.sqrt(2.0) * d_ov @ xpy # transition dipoles, 3 x nstates
f = (2.0/3.0) * om * (tdip**2).sum(axis=0) # one f per excited state H2O / 6-31G: nocc = 5, nvir = 8 -> 40 singlet roots, E_HF = -75.983974 Ha
state omega (eV) f (by hand) f (PySCF)
1 9.364 0.014539 0.014539
2 11.285 0.000000 0.000000 <- dark by symmetry
3 11.783 0.112487 0.112487
4 13.859 0.097234 0.097234
5 15.482 0.441724 0.441724
max |omega - PySCF| over 5 roots : 3.92e-09 Ha
TRK sum over all 40 roots : 3.9493 (N electrons = 10)
Two things to read off. First, the by-hand column matches PySCF's
oscillator_strength() to every printed digit — the
's and normalizations above are the actual ones.
Second, the intensity ordering is nothing like the energy ordering: the
lowest state is 30× dimmer than state 5, and state 2 is exactly dark.
An experimentalist scanning up from 9 eV sees a weak toe, then nothing
where state 2 lives, then the strong bands. The eigenvalues alone would
have told you none of that.
Where the missing strength went
The audit, though, failed loudly: the 40 roots sum to of the promised 10. TRK holds for the exact spectrum — including core excitations and the ionization continuum. A small Gaussian basis can't express an oxygen 1s electron flying off to infinity, so the strength those transitions carry simply has nowhere to appear. Enlarge the basis and watch the budget fill back in:
TRK sum vs basis (same molecule, still N = 10 electrons):
sto-3g 10 roots sum f = 1.9448
6-31g 40 roots sum f = 3.9493
6-31+g* 85 roots sum f = 8.7623
aug-cc-pvdz 180 roots sum f = 8.2037
aug-cc-pvtz 435 roots sum f = 9.0293 STO-3G finds a fifth of the electrons; adding diffuse functions (the in 6-31+G*) more than doubles the sum in one step — diffuse functions are cheap stand-ins for the continuum, which is where most of the strength lives. The march toward 10 is not monotone (aug-cc-pVDZ dips below 6-31+G*: different basis families spend their functions differently), but the direction is unmistakable, and in a complete basis the sum is 10 to machine precision. This is the practical use of TRK: it is a free, exact diagnostic of how much spectrum your basis is even capable of describing. The valence excitations you usually care about converge much faster than the sum rule does — but the sum tells you which regime you're in.
Try First
Each prompt asks a checkable question about the working code or math above — predict an output, derive a sign, state an invariant, find a bug. Commit to an answer before clicking "reveal." That commitment is the whole point: if your answer matched, you understand the piece you were looking at; if it didn't, that's the part worth re-reading.
eigh plus einsum are never clean zeros — components
cancel to roundoff, say , which squares to
. Why is this zero exact rather than
merely tiny, and what experiment could still reach that state?
Where this goes
Upstream: the matrix element inside is the one-particle
transition moment, with
its selection rules and its two kinds of zero. Downstream:
Casida's equation produces the
's and 's that this page turns into
intensities, and Quantities
of Interest places oscillator strengths in the broader map from
computed wavefunctions to measured spectra. The full validation script —
grid systems, the by-hand water solve against PySCF, and the basis-set
audit — is scripts/gen_oscillator_strengths.py in the repo.