“Know how to solve every problem that has been solved.” “What I cannot create, I do not understand.” — Richard Feynman

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.

  1. base
  2. L1
  3. L2
  4. you are here

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.

read it as

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.

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.

predict
The basis table says water in STO-3G has exactly 10 singlet roots. Reconstruct that count from scratch: how many basis functions does STO-3G put on water, how many are occupied, and what does that make ? Then predict the count for methane, CH, in STO-3G.
why does this work
State 2 of water printed . Numbers that come out of 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?
invariant
For the 1D harmonic oscillator, you can deduce without evaluating a single integral — from two facts stated on this page. Which two, and what do they force? Then: does the same argument pin down from the first excited 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.