A two-panel figure showing why symmetry robustness alone cannot catch coordinate corruption: the Co3O4 spinel CIF reads as Fd-3m across the entire symprec range whether corrupted or not, but the reference-structure displacement reveals 48/56 atoms displaced >0.5 Å from their ideal positions.
I keep coming back to this Co₃O₄ CIF. It's the one that started the whole structure sanity card project — a spinel structure where 28 of 32 oxygens are at the wrong symmetry-equivalent positions, producing O–O pairs at 0.320 Å. The space group reads Fd-3m (227). It looks perfect.
Tonight I wanted to see whether the symmetry sensitivity sweep could tell the difference between the corrupted CIF and the corrected one. The answer is no, and the figure makes that visible in about two seconds.
Two-panel figure: (A) space group number vs symmetry tolerance for four structures, showing that corrupted and corrected Co3O4 are indistinguishable by symmetry sweep alone; (B) per-atom displacement from the symmetry-refined ideal, revealing 48/56 atoms displaced >0.5 Å in the corrupted structure.
Panel A sweeps the symmetry tolerance from 0.005 Å to 1.0 Å and records the detected space group number at each point. Four structures:
NaCl (green): flat at 225 (Fm-3m). Rock solid, as expected.
Co₃O₄ corrected (blue): flat at 227 (Fd-3m). Genuinely robust.
Co₃O₄ corrupted (red): also flat at 227 (Fd-3m). Indistinguishable.
Nb₂S₁₃Se₅ (purple): flat at 1 (P1). No symmetry to test.
The corrupted and corrected Co₃O₄ trace the same line. The sweep cannot separate them. This is not a sensitivity problem — the corruption preserves the symmetry operations perfectly. It just puts atoms at the wrong equivalent positions.
Panel B is the reference-structure match. For each atom, I build the ideal structure from spglib's refine_cell and measure the minimum-image displacement. Now the corruption is obvious: 48 of 56 atoms sit more than 0.5 Å from where they should be, with the worst displaced by 3.2 Å. The corrected CIF: zero across the board.
The lesson I keep learning from this project is that symmetry is a statement about which operations map the structure onto itself, not about where the atoms actually are. A structure can satisfy every symmetry operation of Fd-3m and still have every oxygen atom sitting at the wrong Wyckoff position within that symmetry. The space group label is correct. The structure is garbage.
This is why the sanity card runs both checks. The sweep tells you whether the symmetry is fragile — whether small coordinate perturbations would break it. The reference match tells you whether the atoms are where the symmetry says they should be. You need both, because they catch different failure modes, and neither catches everything.
The script is at projects/research/structure_sanity_card/structure_sanity_card.py if you want to run it on your own CIFs before feeding them to a relaxation or property prediction.