Chapter 3
12 min read
Section 27 of 70

Systematic Absences

Reciprocal Space and Diffraction

Learning Objectives

Section 3.6 derived the structure factor and showed that diffraction intensity is proportional to F(G)2|F(\mathbf{G})|^2. That formula contains a small surprise: some reciprocal-lattice vectors G\mathbf{G}, even though they satisfy Bragg's law geometrically, give F(G)=0F(\mathbf{G}) = 0. Their Bragg peaks are invisible. These "missing" reflections are called systematic absences, and they are not a bug — they are a fingerprint of the symmetry inside the cell.

By the end of this section you will be able to:

  1. Explain, in one breath, why a reflection allowed by the Bravais lattice can still vanish — namely, that the basis atoms inside the cell add complex phasors that cancel.
  2. Read off the centring rules for SC, BCC, FCC, and diamond by inspection, and recognise them as the visible consequence of basis symmetry in reciprocal space.
  3. Identify systematic absences in a 2-D slice of reciprocal space and understand why iron's (100) peak is absent while its (110) peak is one of the brightest in the pattern.
  4. Recognise glide planes and screw axes as the next layer of symmetry that produces its own absence patterns — one notch deeper than centring.
  5. Compute F(hkl)F(hkl) for any cubic basis with a 15-line Python script, and connect that calculation to what VASP writes to OUTCAR for structure-factor analysis.
One-line preview. Bragg's law tells you which directions the lattice can scatter into. The structure factor tells you which of those directions actually carry intensity once the basis atoms inside the cell add up their contributions. Systematic absences are the directions where that sum is exactly zero.

The Puzzle — Geometry Said Yes, Intensity Said No

Imagine you have a cube of α-iron, the BCC phase of iron, mounted on an X-ray diffractometer. You run a powder scan. The first six peaks come out at the angles 2θ2\theta predicted by Bragg's law for the reflections (110), (200), (211), (220), (310), (222) — and only those reflections. The simple cubic peaks (100), (111), (210), (300) are not there. Not weak. Gone.

And yet, geometrically, those reciprocal-lattice vectors are perfectly legal. The Bravais lattice of BCC iron is a cubic lattice with Ghkl=hb1+kb2+lb3\mathbf{G}_{hkl} = h\mathbf{b}_1 + k\mathbf{b}_2 + l\mathbf{b}_3 for every triple of integers — including (100). Bragg's law does not forbid (100). What is killing it?

The answer in one sentence

The Bravais lattice of BCC has two atoms per conventional cell — one at the corner, one at the body centre. Their two scattered phasors are exactly opposite at G100\mathbf{G}_{100} and they add to zero. The geometry was right; the basis cancelled the intensity.

This is the seed of the entire section. Systematic absences are cancellations inside the unit cell, written into the structure factor by the symmetry of the basis. They are not measurement noise. They are the signal — the part of the diffraction pattern that tells you whether your sample is BCC or simple cubic, FCC or BCC, NaCl or diamond, even when all four would give peaks at exactly the same Bragg angles.


Quick Recap — The Structure Factor

From Section 3.6, the amplitude scattered into the reflection labelled G=hb1+kb2+lb3\mathbf{G} = h\mathbf{b}_1 + k\mathbf{b}_2 + l\mathbf{b}_3 is

F(hkl)  =  j=1Nbasisfje2πi(hxj+kyj+lzj)F(hkl) \;=\; \sum_{j=1}^{N_{\text{basis}}} f_j \, e^{2\pi i\,(h\,x_j + k\,y_j + l\,z_j)}

where the sum runs over the NbasisN_{\text{basis}} atoms of the basis, (xj,yj,zj)(x_j, y_j, z_j) are their fractional coordinates inside the conventional cell, and fjf_j is the atomic form factor — how strongly atom jj scatters. The Bragg intensity is

I(hkl)    F(hkl)2I(hkl) \;\propto\; |F(hkl)|^2

Two things to notice. First, the geometry of the Bravais lattice has already been spent in choosing G\mathbf{G}; the structure factor only knows about what is inside one cell. Second, each basis atom contributes a unit phasor of magnitude fjf_j at angle ϕj=2π(hxj+kyj+lzj)\phi_j = 2\pi(h x_j + k y_j + l z_j). If those phasors happen to sum to zero, the reflection vanishes — no matter how loud Bragg's law is shouting.

Why the 2π?

The factor 2π2\pi is the price of using fractional coordinates. A whole lattice translation moves xjx_j by 1, and we want the phasor to come back to itself — which happens only when the angle is a multiple of 2π2\pi. The same 2π2\pi showed up in the duality condition biaj=2πδij\mathbf{b}_i \cdot \mathbf{a}_j = 2\pi \delta_{ij} back in Section 3.2.


Atoms as Complex Phasors

The structure-factor sum has the perfect mental picture: every basis atom is a unit arrow on the complex plane, pointing at an angle that depends on where the atom sits inside the cell, and which reflection we are asking about. Add the arrows tip-to-tail. Where the last arrow ends is F(hkl)F(hkl).

If the path closes back to the origin, the reflection is forbidden.

If the path stops far from the origin, the reflection is bright.

That is the whole physics. Let's try it on the easiest case. For BCC there are two atoms per conventional cell, at fractional positions (0,0,0)(0,0,0) and (12,12,12)(\tfrac{1}{2},\tfrac{1}{2},\tfrac{1}{2}). Their phases for a reflection (h,k,l)(h,k,l) are ϕ1=0\phi_1 = 0 and ϕ2=π(h+k+l)\phi_2 = \pi(h+k+l). The sum collapses to a single neat formula:

FBCC(hkl)  =  f[1+eiπ(h+k+l)]  =  {2fh+k+l even0h+k+l oddF_{\text{BCC}}(hkl) \;=\; f\left[1 + e^{i\pi(h+k+l)}\right] \;=\; \begin{cases} 2f & h+k+l \text{ even} \\ 0 & h+k+l \text{ odd} \end{cases}

The (100) peak of α-iron has h+k+l=1h+k+l=1: forbidden. The (110) peak has h+k+l=2h+k+l=2: allowed, F2=4f2|F|^2=4f^2. Mystery solved by a single sum of two complex numbers.


Interactive — Watch the Phasors Cancel

Time to feel it. The widget below draws every basis atom as a unit phasor on the complex plane. Pick a lattice (SC, BCC, FCC, Diamond), choose a reflection (h,k,l)(h,k,l), and watch the arrows add up tip-to-tail. The thick green or red arrow is the resultant FF from the origin to the end of the path.

Atomic phasors adding to F(hkl)

choose a lattice and pick (h, k, l)

Each atom in the basis contributes a unit phasor e^(2πi(h·x + k·y + l·z)) on the complex plane. The structure factor F(hkl) is the tip-to-tail sum of these arrows. When the path closes back to the origin, the reflection is forbidden; when it stops far from the origin, the reflection is allowed.

h1
k0
l0
Quick picks:
ReIm|z|=1F = 0 (forbidden)
thin arrows: per-atom phasors • thick red arrow: resultant F
Basis atoms and their phases
atomposition2π(h·x+k·y+l·z)e^iθ
#1(0, 0, 0)0π1.000 + 0i
#2(½, ½, ½)1.000π-1.000 + 0i
ΣF(1, 0, 0)0 + 0i
Reflection (1 0 0) on BCCFORBIDDEN
|F| = 0    |F|² = 0
All atomic phasors cancel exactly. No Bragg peak appears, even though Bragg's law is satisfied.

What to play with

  • Set the lattice to BCC and click the (100) preset. You will see two arrows pointing exactly opposite. The path returns to the origin — forbidden. Now click (110): the two arrows align — allowed.
  • Switch to FCC and try (100): four arrows form a closed loop. Try (111): all four align in the same direction → F=4f|F|=4f.
  • Switch to Diamond and try (222). All eight phasors pair off into opposing twos — forbidden — even though FCC alone allows (222). This is the extra absence rule that diamond adds on top of the FCC centring; we'll see why below.

The intuitive rule

A reflection is forbidden whenever the basis atoms split into two subsets whose phasors are exactly out of phase by π\pi. Centring puts the second atom at a half-vector; that half-vector is exactly the geometric symmetry that creates the cancellation. Systematic absences and centring symmetry are two views of the same fact.


Centring Rules — SC, BCC, FCC at a Glance

Repeat the phasor-sum exercise for each cubic Bravais lattice and the rules collapse into a small table. Memorise this — every working crystallographer can reproduce it from a back-of-envelope phasor argument.

LatticeBasis atoms (fractional)F(hkl)Selection rule (allowed when…)
Simple cubic (P)(0, 0, 0)falways — every (h, k, l) is allowed
Body-centered (I)(0, 0, 0), (½, ½, ½)f [1 + e^{iπ(h+k+l)}]h + k + l = even
Face-centered (F)(0, 0, 0), (½, ½, 0), (½, 0, ½), (0, ½, ½)f [1 + e^{iπ(h+k)} + e^{iπ(h+l)} + e^{iπ(k+l)}]h, k, l all even or all odd (no mixed parity)
Diamond (Fd̄3m)FCC + same shifted by (¼, ¼, ¼)F_FCC × [1 + e^{iπ(h+k+l)/2}]FCC rule AND not (h+k+l = 4n+2)

A historical aside

These rules are why the very first crystal structure ever solved — NaCl, by W. L. Bragg in 1913 — was solvable at all. NaCl is FCC with a two-atom basis (Na at (0,0,0), Cl at (½,½,½) of the FCC cell). The allowed (h,k,l) pattern showed Bragg, before he had a single atom-by-atom map, that the lattice was face-centred. The absences were the diagnostic before the structure was.


Interactive — Allowed vs Forbidden Reflections

The next widget shows a slice of reciprocal space at fixed ll: a 9×9 grid of integer reflections (h,k,l)(h,k,l). Bright cyan dots are allowed peaks (radius proportional to F|F|); faint red crosses are systematically absent. Toggle between SC, BCC, FCC, Diamond and watch the forbidden zones snap into different patterns.

Allowed and forbidden reflections in the (hk0) plane

hover any spot

A reciprocal-lattice slice at fixed l = 0. Bright cyan circles are allowed Bragg peaks (radius proportional to |F|, the diffraction amplitude). Faint red crosses are systematically absent reflections — they obey Bragg's law geometrically but their structure factor is exactly zero.

l0
41 allowed40 forbidden
h →k ↑
Hover a spot for details
Move the cursor across the reciprocal-lattice grid to read each reflection.
Selection rule for BCC
h + k + l even → allowed; h + k + l odd → forbidden

Three things to notice as you switch lattice. SC has no absences — every spot is bright. BCC kills exactly half of them on a checkerboard: h+k+lh+k+l odd disappears. FCC keeps only the "all-same-parity" reflections, leaving a much sparser pattern. Diamond starts from the FCC pattern and additionally extinguishes the even-only reflections with h+k+l=4n+2h+k+l=4n+2 — most famously, (200) and (222) vanish in silicon and diamond even though FCC admits them.

The reverse problem. Looking at a powder X-ray pattern, an experimentalist works backwards: which (h,k,l) peaks are present and which are missing? That pattern of presences and absences uniquely identifies the centring of the Bravais lattice. The widget above is, almost literally, what they are reading.

Why It Looks the Way It Does — Cells in 3D

The selection rules feel less mysterious once you can see, in real space, where the "extra" atom or atoms sit. Below: BCC on the left has one extra atom at the body centre; FCC on the right has three extra atoms on the face centres of one cell (six face atoms shown, each shared with a neighbour). Drag to rotate.

Loading 3D visualisation…
Loading 3D visualisation…

Compare these visually against the SC cell — just eight corner atoms and nothing in the middle. The BCC body-centre atom is what creates the eiπ(h+k+l)e^{i\pi(h+k+l)} phasor that cancels odd-sum reflections. The FCC face-centre atoms create three different phasors that cancel any reflection where h,k,lh, k, l have mixed parity. The symmetry of the basis is, quite literally, the reason for the absence pattern.


The Diamond Twist — When (222) Goes Missing

Diamond, silicon, and germanium all share the diamond-cubic structure: an FCC lattice with a two-atom basis, the second atom shifted by (14,14,14)(\tfrac{1}{4}, \tfrac{1}{4}, \tfrac{1}{4}). That fractional quarter is what makes diamond stiff, semiconducting, and… diffractometrically peculiar. Its structure factor factorises cleanly:

Fdiamond(hkl)  =  FFCC(hkl)[1+eiπ(h+k+l)/2]F_{\text{diamond}}(hkl) \;=\; F_{\text{FCC}}(hkl) \cdot \left[1 + e^{i\pi(h+k+l)/2}\right]

The first factor enforces the FCC rule; the second factor adds an extra penalty for some of the reflections that FCC would otherwise allow. Walk through the cases:

(h, k, l)F_FCCh + k + l1 + e^{iπ(h+k+l)/2}F_diamondverdict
(1, 1, 1)4f3 (odd)1 − i4f(1 − i)ALLOWED, |F|² = 32 f²
(2, 0, 0)4f2 (= 4n+2)1 + e^{iπ} = 00FORBIDDEN
(2, 2, 0)4f4 (= 4n)1 + 1 = 28fALLOWED, |F|² = 64 f²
(2, 2, 2)4f6 (= 4n+2)00FORBIDDEN
(3, 1, 1)4f5 (odd)1 + i4f(1 + i)ALLOWED, |F|² = 32 f²
(4, 0, 0)4f4 (= 4n)28fALLOWED, |F|² = 64 f²

Why this matters

The forbidden (200) and (222) reflections of silicon and diamond are not just textbook curiosities. Every powder XRD pattern of silicon shows the same fingerprint: (111), (220), (311), (400), (331), (422) present; (200), (222), (420) absent. If you ever see intensity at (200) of a silicon sample, it is either an instrumental artefact or a sign that your "silicon" has lost the diamond (14,14,14)(\tfrac{1}{4},\tfrac{1}{4},\tfrac{1}{4}) symmetry — which would be a major structural finding.


Glide Planes and Screw Axes — Beyond Centring

Centring is the simplest source of systematic absences, but the space groups of Chapter 1 contain richer symmetries: glide planes (mirror + half-translation) and screw axes (rotation + half-translation). Each leaves its own footprint in reciprocal space.

The mechanism is identical to what we just saw. A glide plane forces atoms to come in pairs related by a half-translation; that half translation generates a phasor of eiπ=1e^{i\pi}=-1 for certain reflections and they cancel. A two-fold screw axis along c\mathbf{c} with translation 12c\tfrac{1}{2}\mathbf{c} kills all (00ll) reflections with ll odd, in exactly the same way BCC kills the odd h+k+lh+k+l.

The symmetry-to-absence dictionary the experimentalists use:

Symmetry elementReflection classAbsence rule
I-centring (BCC)(h k l)h + k + l = odd → absent
F-centring (FCC)(h k l)h, k, l of mixed parity → absent
A-centring(h k l)k + l = odd → absent
c-glide plane ⊥ a(0 k l)l = odd → absent
n-glide plane ⊥ a(0 k l)k + l = odd → absent
2_1 screw along a(h 0 0)h = odd → absent
4_1 screw along c(0 0 l)l ≠ 4n → absent
6_1 screw along c(0 0 l)l ≠ 6n → absent

The big picture

Every space group has a deterministic table of which reflections it forbids. Conversely, the pattern of absences in an experimental diffraction pattern narrows the space group down to a short list. The International Tables for Crystallography contain these tables for all 230 space groups; they are how a crystallographer turns a handful of missing peaks into a structural identification.


Computing F(hkl) from a VASP Cell

For a custom basis — say, a Mn-doped CdSe supercell where the symmetry-rule tables no longer apply directly — you compute F(hkl)F(hkl) straight from the structure-factor sum. Fifteen lines of Python suffice.

Click any line in the panel below to see the values flowing through it. The script reproduces the SC, BCC, FCC, diamond rules from first principles and prints whether each reflection is allowed:

Python — Structure factor and centring rules
🐍structure_factor.py
1import numpy as np

NumPy supplies fast complex arithmetic and the exponential. We use np.exp(1j * phase) to compute e^{iφ} as one complex number — the natural representation of an atomic phasor on the unit circle.

EXECUTION STATE
numpy = Numerical library with complex arithmetic, np.exp() for complex exponentials, and arrays. Aliased to np by convention.
1j = Python's imaginary unit (i = √−1). 1j * 3.14 produces 3.14i. We will write phases as 1j * angle.
3Comment — basis atoms in fractional coordinates

Every crystal = Bravais lattice + basis. The Bravais lattice handles translation; the basis enumerates which atoms sit inside one cell, written in fractional coordinates so they ride along when the cell is stretched or rotated.

5LATTICES = { ... }

A dictionary mapping a lattice name to its list of basis-atom positions. Each tuple (x, y, z) is a fractional coordinate inside the conventional cubic cell. We will call structure_factor() once per (lattice, reflection) pair.

EXECUTION STATE
SC basis = [(0, 0, 0)] — one atom at the corner. Simple cubic.
BCC basis = [(0, 0, 0), (0.5, 0.5, 0.5)] — corner + body center. 2 atoms per cell.
FCC basis = Corner + 3 face centers: (0,0,0), (½,½,0), (½,0,½), (0,½,½). 4 atoms per cell.
Diamond basis = FCC atoms PLUS the same 4 atoms shifted by (¼,¼,¼). 8 atoms per cell. This is silicon, germanium, and carbon (diamond) structure.
16def structure_factor(basis, hkl, f=1.0)

Computes F(hkl) for one reflection given a list of basis atoms. We use a uniform atomic form factor f = 1 (point scatterers) so the result depends only on geometry — exactly the regime where systematic absences live. With real f_j values (heavier atoms scatter more) the magnitudes change, but the zeros stay zero.

EXECUTION STATE
⬇ input: basis = List of (x, y, z) fractional coordinates inside one cell. e.g. BCC = [(0,0,0), (0.5,0.5,0.5)].
⬇ input: hkl = A 3-tuple of integers (h, k, l) labelling the reflection — equivalently, the reciprocal lattice vector G = h b₁ + k b₂ + l b₃.
⬇ input: f (default 1.0) = Atomic form factor. Set to 1 for a uniform basis (every atom scatters the same). With element-specific f values, F = Σ f_j exp(2πi G·r_j).
⬆ returns = A complex number F = Σ_j f_j e^{2πi(h·x_j + k·y_j + l·z_j)}. |F|² is proportional to the diffraction intensity.
17Docstring — F(hkl) = sum_j ...

Short reminder of the formula derived in Section 6: every atom contributes a phasor whose phase is set by the atom's position dotted with the reciprocal vector. The function is just that sum, written in code.

18h, k, l = hkl

Tuple unpacking. Splits the (h, k, l) tuple into three named integers we will use inside the loop.

EXECUTION STATE
Example = If hkl = (1, 1, 0): then h = 1, k = 1, l = 0.
19F = 0 + 0j

Initialise F as the complex number zero. We will accumulate into F by adding one phasor per basis atom. Writing 0+0j (not just 0) makes Python keep F as a complex type from the start.

EXECUTION STATE
F (initial) = 0 + 0i → the empty sum
20for (x, y, z) in basis:

Loop over every atom in the basis. For BCC this runs 2 times, for FCC 4 times, for diamond 8 times. Each pass adds one phasor to F.

LOOP TRACE · 4 iterations
BCC, hkl=(1,0,0): atom 1 = (0,0,0)
phase = 2π(1·0 + 0·0 + 0·0) = 0
exp(i·0) = 1 + 0i
F (running) = 1 + 0i
BCC, hkl=(1,0,0): atom 2 = (½,½,½)
phase = 2π(1·½ + 0·½ + 0·½) = π
exp(i·π) = −1 + 0i
F (running) = 0 + 0i → cancellation!
BCC, hkl=(1,1,0): atom 1
phase = 0
exp(i·0) = 1 + 0i
F (running) = 1 + 0i
BCC, hkl=(1,1,0): atom 2
phase = 2π(½ + ½ + 0) = 2π
exp(i·2π) = +1 + 0i
F (running) = 2 + 0i → reinforcement
21phase = 2 * np.pi * (h * x + k * y + l * z)

Compute the phase angle (in radians) for this atom and reflection. The dot product h·x + k·y + l·z is a pure number; multiplied by 2π it becomes the rotation angle of the unit phasor.

EXECUTION STATE
📚 np.pi = NumPy's value of π = 3.14159265… The factor of 2π converts the dimensionless dot product h·x+k·y+l·z into an angle in radians, because lattice translations live on a 2π-periodic phase circle.
h * x + k * y + l * z = The dot product G·r between the reciprocal vector G=(h,k,l) and the fractional position r=(x,y,z). When this number is an integer, the phase is a multiple of 2π and the phasor lands at +1.
Example: BCC atom 2 at (1,0,0) = h·x + k·y + l·z = 1·½ + 0·½ + 0·½ = 0.5 → phase = 2π·0.5 = π
22F += f * np.exp(1j * phase)

Add this atom's phasor to the running total. np.exp(1j*φ) returns the complex number cos(φ) + i·sin(φ) — the unit-magnitude vector at angle φ on the complex plane. With f=1 each phasor has length 1.

EXECUTION STATE
📚 np.exp(1j * phase) = Complex exponential: e^{iφ} = cos(φ) + i sin(φ). Returns a unit-magnitude complex number that points at angle φ from the real axis. Example: np.exp(1j*0) = 1+0j; np.exp(1j*np.pi) = −1+0j; np.exp(1j*np.pi/2) = 0+1j.
1j * phase = Multiplies the phase by Python's imaginary unit 1j. e^{1j*phase} is the only place in this whole calculation where complex numbers actually appear — the rest is bookkeeping.
+= operator = Augmented assignment — equivalent to F = F + f * np.exp(1j * phase). Accumulates the running sum.
Example: BCC, hkl=(1,0,0) = Atom 1: F += e^{i·0} = +1. Atom 2: F += e^{iπ} = −1. Final F = 0 → systematic absence.
23return F

Return the complex structure factor. Callers interpret abs(F)**2 as ∝ Bragg intensity, and treat |F| ≈ 0 as a forbidden reflection.

EXECUTION STATE
⬆ return: F = A single Python complex number. Real example outputs: BCC F(1,0,0) = 0; BCC F(1,1,0) = 2+0i; FCC F(1,1,1) = 4+0i; Diamond F(2,2,2) = 0.
25reflections = [(1,0,0), (1,1,0), ...]

A short list of test reflections that probes every selection rule we care about: low-index forbidden ones (100), low-index allowed ones (110, 111), and the diamond surprise (222 forbidden in diamond but allowed in BCC/FCC).

EXECUTION STATE
reflections (length 7) = [(1,0,0), (1,1,0), (1,1,1), (2,0,0), (2,2,0), (2,2,2), (3,1,1)]
27for name, basis in LATTICES.items():

Outer loop: iterate over the four lattice types. .items() yields (key, value) pairs, so name is the string ('SC', 'BCC', ...) and basis is the list of atom positions.

LOOP TRACE · 4 iterations
iter 1
name = 'SC'
len(basis) = 1
iter 2
name = 'BCC'
len(basis) = 2
iter 3
name = 'FCC'
len(basis) = 4
iter 4
name = 'Diamond'
len(basis) = 8
28print(f'--- {name} ({len(basis)} atoms / cell) ---')

Header line for each lattice. The f-string substitutes name and atom count into the template.

29for hkl in reflections:

Inner loop: every reflection in our test list, applied to the current lattice. 4 lattices × 7 reflections = 28 structure-factor evaluations total.

30F = structure_factor(basis, hkl)

Call the function defined above. Returns one complex number per reflection.

EXECUTION STATE
BCC F(1,0,0) = 0+0i → forbidden (h+k+l = 1 odd)
BCC F(1,1,0) = 2+0i → allowed (h+k+l = 2 even)
FCC F(1,0,0) = 0+0i → forbidden (mixed parity)
FCC F(1,1,1) = 4+0i → allowed (all odd)
Diamond F(2,2,2) = 0+0i → forbidden (allowed by FCC rule but cancelled by the (¼,¼,¼) shift)
Diamond F(1,1,1) = 4 − 4i → allowed, |F|² = 32
31tag = 'ALLOWED' if abs(F) > 1e-6 else 'FORBIDDEN'

Inline conditional. abs(F) is the modulus |F|. We use a tiny tolerance 1e-6 instead of strict ==0 because floating-point arithmetic almost never returns exactly zero — phases like 2π·½ accumulate µ-level rounding error.

EXECUTION STATE
abs(F) = Built-in: for a Python complex, abs() returns √(re² + im²). abs(0+0j) = 0; abs(2+0j) = 2; abs(4-4j) = √32 ≈ 5.657.
Why 1e-6? = Numerical tolerance. e^{iπ} computed in IEEE-754 is −1.0 + 1.22e-16i, not exactly −1. Summing many such terms can leave |F| ~ 1e-15 even for a true absence. 1e-6 is safely below any physical |F|.
32print(f' F{hkl} = {F.real:+5.2f}...')

Formatted output. F.real and F.imag pull the real and imaginary parts of the complex number. The format spec +5.2f forces a sign, 5 total characters wide, 2 decimal places — keeps columns aligned in the printout.

EXECUTION STATE
Sample line = F(1, 0, 0) = +0.00+0.00i |F|^2= 0.00 [FORBIDDEN]
Sample line = F(1, 1, 1) = +4.00+0.00i |F|^2= 16.00 [ALLOWED]
16 lines without explanation
1import numpy as np
2
3# Fractional coordinates of the basis atoms in each
4# conventional cubic cell. (Bravais lattice + basis.)
5LATTICES = {
6    "SC":      [(0, 0, 0)],
7    "BCC":     [(0, 0, 0), (0.5, 0.5, 0.5)],
8    "FCC":     [(0, 0, 0), (0.5, 0.5, 0),
9                (0.5, 0, 0.5), (0, 0.5, 0.5)],
10    "Diamond": [(0, 0, 0),     (0.5, 0.5, 0),
11                (0.5, 0, 0.5), (0, 0.5, 0.5),
12                (0.25, 0.25, 0.25), (0.75, 0.75, 0.25),
13                (0.75, 0.25, 0.75), (0.25, 0.75, 0.75)],
14}
15
16def structure_factor(basis, hkl, f=1.0):
17    """F(hkl) = sum_j f_j * exp(2 pi i (h*x_j + k*y_j + l*z_j))"""
18    h, k, l = hkl
19    F = 0 + 0j
20    for (x, y, z) in basis:
21        phase = 2 * np.pi * (h * x + k * y + l * z)
22        F += f * np.exp(1j * phase)
23    return F
24
25reflections = [(1, 0, 0), (1, 1, 0), (1, 1, 1),
26               (2, 0, 0), (2, 2, 0), (2, 2, 2), (3, 1, 1)]
27
28for name, basis in LATTICES.items():
29    print(f"--- {name} ({len(basis)} atoms / cell) ---")
30    for hkl in reflections:
31        F = structure_factor(basis, hkl)
32        tag = "ALLOWED" if abs(F) > 1e-6 else "FORBIDDEN"
33        print(f"  F{hkl} = {F.real:+5.2f}{F.imag:+5.2f}i"
34              f"  |F|^2={abs(F)**2:6.2f}  [{tag}]")

Running the script prints (truncated):

📝text
1--- SC (1 atoms / cell) ---
2  F(1, 0, 0) = +1.00+0.00i  |F|^2=  1.00  [ALLOWED]
3  F(1, 1, 1) = +1.00+0.00i  |F|^2=  1.00  [ALLOWED]
4--- BCC (2 atoms / cell) ---
5  F(1, 0, 0) = +0.00+0.00i  |F|^2=  0.00  [FORBIDDEN]
6  F(1, 1, 0) = +2.00+0.00i  |F|^2=  4.00  [ALLOWED]
7  F(1, 1, 1) = +0.00+0.00i  |F|^2=  0.00  [FORBIDDEN]
8  F(2, 2, 2) = +2.00+0.00i  |F|^2=  4.00  [ALLOWED]
9--- FCC (4 atoms / cell) ---
10  F(1, 0, 0) = +0.00+0.00i  |F|^2=  0.00  [FORBIDDEN]
11  F(1, 1, 1) = +4.00+0.00i  |F|^2= 16.00  [ALLOWED]
12  F(2, 0, 0) = +4.00+0.00i  |F|^2= 16.00  [ALLOWED]
13--- Diamond (8 atoms / cell) ---
14  F(1, 1, 1) = +4.00-4.00i  |F|^2= 32.00  [ALLOWED]
15  F(2, 0, 0) = +0.00+0.00i  |F|^2=  0.00  [FORBIDDEN]
16  F(2, 2, 2) = +0.00+0.00i  |F|^2=  0.00  [FORBIDDEN]
17  F(3, 1, 1) = +4.00+4.00i  |F|^2= 32.00  [ALLOWED]

For a real VASP POSCAR, replace the hand-typed (x,y,z)(x, y, z) tuples with the fractional coordinates VASP wrote, and weight each phasor by the element-specific atomic form factor fj(G)f_j(\mathbf{G}) (a known function of the reciprocal vector's magnitude — tabulated for every element in the International Tables, Vol. C). The forbidden / allowed verdict does not change for centring absences; only the magnitudes do.

Reading VASP's structure factor output

When you run a calculation with LSORBIT\texttt{LSORBIT} off and ask for X-ray diffraction analysis (post-processing tool vaspkit\texttt{vaspkit} task 251 or external pymatgen\texttt{pymatgen} XRDCalculator), the tools internally call exactly this sum, multiplied by element form factors. Their output table — columns (h,k,l)(h, k, l), dhkld_{hkl}, 2θ2\theta, F2|F|^2, multiplicity, intensity — drops any row with F2<106|F|^2 < 10^{-6}: those rows are your systematic absences.


Reverse-Reading a Powder Pattern

The most common practical use of systematic absences is identification. Imagine you have a powder pattern of an unknown cubic phase. The first seven Bragg peaks come out at 2θ2\theta values that satisfy dhkl1/h2+k2+l2d_{hkl} \propto 1/\sqrt{h^2+k^2+l^2} with sums-of-squares

h2+k2+l2    {2,4,6,8,10,12,14}h^2+k^2+l^2 \;\in\; \{2, 4, 6, 8, 10, 12, 14\}

versus a different sample where the sums are

h2+k2+l2    {3,8,11,16,19,24,27}.h^2+k^2+l^2 \;\in\; \{3, 8, 11, 16, 19, 24, 27\}.

These two sequences come from the same Bragg geometry but different centring. The first is BCC: the only allowed squared-sums are even (110, 200, 211, 220, 310, 222, 321 → 2, 4, 6, 8, 10, 12, 14). The second is FCC: only all-same-parity triplets, so 111, 220, 311, 400, 331, 422, 511 → 3, 8, 11, 16, 19, 24, 27. The list of sum-of-squares is the lattice fingerprint.

From peak positions to lattice type: compute sin2θ\sin^2\theta for each peak, divide by the first one, look at the integer sequence. BCC gives 1, 2, 3, 4, 5, 6, 7. FCC gives the spaced-out 3, 4, 8, 11, 12 (modulo a common factor). Every undergraduate XRD lab discovers this trick on day one.

Common Pitfalls

  1. Confusing the conventional cell with the primitive cell. BCC has 1 atom per primitive cell, but 2 per conventional cubic cell. The structure factor formula uses whichever cell you wrote your bi\mathbf{b}_i in. Mixing them produces phantom or missing absences. The phasor visualiser above uses the conventional cubic basis; translate carefully if your software does something else.
  2. Treating a weak peak as forbidden. Different atomic form factors mean a near-extinguished reflection can have small but nonzero intensity. NaCl's "forbidden" (111) is only forbidden when fNa=fClf_{\text{Na}} = f_{\text{Cl}}; in reality fCl>fNaf_{\text{Cl}} > f_{\text{Na}} by a few electrons, so (111) appears as a weak — but real — peak. Systematic absences from centring are exact; absences arising only from equal form factors are not.
  3. Forgetting that the Diamond rule is multiplicative, not additive. Diamond is FCC times an extra factor. A reflection forbidden by FCC (e.g. (210)) stays forbidden in diamond — even though h+k+l=3h+k+l=3 is odd, which would suggest "allowed" on the diamond-only rule. Always apply both factors, or use the formula FFCC[1+eiπ(h+k+l)/2]F_{\text{FCC}} \cdot [1 + e^{i\pi(h+k+l)/2}].
  4. Numerical zero ≠ true zero. When you compute FF with floating-point arithmetic, eiπe^{i\pi} is 1+1.22 ⁣× ⁣1016i-1 + 1.22\!\times\!10^{-16}\,i, not exactly 1-1. Use a tolerance — typically F<106|F| < 10^{-6} — instead of strict equality when classifying allowed vs forbidden.
  5. Assuming absences disappear in supercells. A supercell's reciprocal lattice is denser than the primitive one's, so more reflections seem to appear. They are mostly the original-cell reflections re-indexed; the underlying selection rules still hold. When VASP prints structure factors for a 2×2×2 cell, divide the indices by 2 to recover the conventional-cell labelling before checking against the centring rules.

Summary

  • A systematic absence is a reflection allowed by the Bravais lattice but extinguished by destructive interference among the basis atoms inside the cell — F(hkl)=0F(hkl) = 0.
  • Each basis atom contributes a unit phasor at angle 2π(hxj+kyj+lzj)2\pi(h x_j + k y_j + l z_j) on the complex plane. The sum is the structure factor; if the phasors close into a loop, the reflection vanishes.
  • The cubic centring rules: SC allows everything, BCC requires h+k+lh+k+l even, FCC requires all h,k,lh, k, l the same parity, diamond adds the further requirement that h+k+l4n+2h+k+l \neq 4n+2.
  • Glide planes and screw axes generate their own absence rules — each symmetry operation that involves a half-translation will, somewhere in reciprocal space, force a phasor to eiπ=1e^{i\pi}=-1 and cancel a class of reflections. The pattern of absences is the experimental signature of the space group.
  • The 15-line Python script implements the structure-factor sum directly. With a real basis (CdSe, Mn:CdSe) and element-specific fj(G)f_j(\mathbf{G}), it gives the same numbers that vaspkit\texttt{vaspkit} or pymatgen\texttt{pymatgen} would print after a VASP run.
  • Reading absences backwards from a powder XRD pattern is how experimentalists identify the centring of an unknown cubic phase. The BCC sequence h2+k2+l2{2,4,6,8,10,12,14}h^2+k^2+l^2 \in \{2,4,6,8,10,12,14\} and the FCC sequence {3,8,11,16,19,24,27}\{3,8,11,16,19,24,27\} are the two most recognised fingerprints in materials science.
Section 3.7 Core Insight
"Bragg's law decides which directions can scatter. The structure factor decides which of those directions are switched off by symmetry inside the cell. Every missing peak is a clue to the basis."
Coming next: Section 3.8 — k-Point Grids and Convergence — where we leave diffraction behind and return to electronic-structure mode. The same Brillouin zone we have been navigating now becomes the integration domain for total energies; how finely we sample it (the 8×8×88\times8\times8 in your KPOINTS file) controls every number VASP prints.
Loading comments...