TL;DR. The grader's identity is InChIKey[:14] of TautomerEnumerator().Canonicalize(mol). On the real training set that key is almost the stored inchikey14: all 277,566 distinct normalized_smiles reproduce their stored key exactly (0 label noise), none carries stereo, and canonicalisation changes the key for only 1.6 % of them (0.5 % of enveda-180, 7–8 % of the NP-rich public libraries) — but it also merges 1,541 pairs/groups of train structures that the dataset labels as different (3,167 skeletons → 1,541 keys; 58,954 spectra) and splits 11 skeletons whose two drawings land on different keys. In COCONUT (Oct-2026 dump, 738,794 isomeric entries) 35 % of entries are stereo/tautomer "spellings" of 479,690 skeletons (steroids 54 %, macrolides 59 %, flavonoid glycosides ~68 % at the formula level), so a raw candidate list wastes a third of its slots unless deduplicated by the metric key; conversely the typical skeleton in the test mass window has a median of 35 other COCONUT skeletons with the same formula ("semitone neighbours"), which MS/MS can separate only by intensity patterns, so ranking among positional isomers — not stereo — is where slots 2–25 must go.
1. What the metric sees (measured, not assumed)
Scoring key K(s) = InChIKey(Canonicalize(MolFromSmiles(s)))[:14]. Standard InChI's first block hashes only the main layer (formula + connectivity + mobile-H); stereo, isotopes and fixed-H go to block 2 and the proton count to the final character (InChI Technical Manual, "InChIKey has five distinct components", and "The first block is always the same for the same molecular skeleton. All isotopic substitutions, changes in stereoconfiguration, tautomerism and protonization are reflected in the second block"). The manual also states which H-migrations InChI does not treat as mobile: "keto-enol tautomerism and 1,5-tautomerism, for instance". RDKit's TautomerEnumerator (37 SMIRKS transforms derived from Sitzmann, Ihlenfeldt & Nicklaus 2010, who enumerated 680 M tautomers for 103.5 M records and found >2/3 of unique structures tautomerisable) is the layer that closes exactly that keto-enol gap.
1.1 Pair tests on NP chemotypes (RDKit 2026.03.6; re-run bit-identical on the pinned 2026.03.3 venv; 60 pairs, full table in the .json)
| Chemotype (A vs B) | Raw InChI block-1 | After Canonicalize |
Verdict |
|---|---|---|---|
| quercetin 3-OH flavonol vs 3-keto flavan-3,4-dione | differ | same (REFJWTPEDVJJIY) | merged only by RDKit; 363 tautomers, MaxTransformsReached, 261–283 ms |
| kaempferol / galangin vs their 3-keto forms | differ | same | merged only by RDKit (126 / 24 tautomers) |
| isoliquiritigenin (chalcone) vs liquiritigenin (flavanone); naringenin chalcone vs naringenin | differ | differ | split — ring-chain isomerisation is not a tautomer rule for either InChI or RDKit; they are two valid answers |
| 2-hydroxypyridine vs 2-pyridone; 4-hydroxypyridine vs 4-pyridone | same | same | merged by InChI alone |
| 4-hydroxy-2-quinolone vs 2,4-dihydroxyquinoline | same | same | InChI alone |
| 4-hydroxy-2-quinolone vs quinoline-2,4(1H,3H)-dione (CH2 form) | differ | same | RDKit only |
| theophylline N7-H vs N9-H; xanthine 3H,7H vs 2,6-diol; guanine keto vs enol; caffeine aromatic vs Kekulé | same | same | InChI alone (purine N-H and amide/imidol are mobile-H) |
| curcumin diketo vs keto-enol | differ | same (VFLDPWHFBUODDF) | RDKit only, 51 tautomers, ~80 ms |
| tetracycline PubChem enol vs A-ring diketo | differ | same (MUHBBHLZPHKTTR) | RDKit only, MaxTransformsReached, 460–480 ms |
| usnic acid enol vs triketo | differ | same | RDKit only, 147 tautomers, 290–350 ms |
| triacetic acid lactone 4-OH-pyrone vs 2,4-dione; 4-hydroxycoumarin vs chroman-2,4-dione | differ | same | RDKit only |
| chrysophanol anthrone vs anthranol (9-anthrol) | differ | same | RDKit only, 202 tautomers, MaxTransformsReached |
| 1-hydroxyanthraquinone vs 9-hydroxy-1,10-anthraquinone | differ | same | RDKit only |
| hinokitiol: OH on C2 vs H moved to the carbonyl O | same | same | InChI alone (tropolone O–H···O is mobile-H) |
| hinokitiol vs 3-isopropyltropolone | differ | differ | split (positional isomer, correct) |
| 3,4-dihydro-β-carboline imine vs enamine; 1-methyl-3,4-dihydroisoquinoline vs 1-methylene; 2-methyl-1-pyrroline vs 2-methylenepyrrolidine | differ | same | RDKit only (InChI has no imine/enamine rule: Dhaked et al. report 0.00 % recapitulation for simple imines) |
| lawsone vs 4-hydroxy-1,2-naphthoquinone; juglone vs its 1,5-shift tautomer | differ | same | RDKit only |
| phenol vs cyclohexa-2,4-dienone; 1-naphthol vs naphthalen-1(4H)-one; acetone vs propen-2-ol; hydroxyacetone vs lactaldehyde | differ | same | RDKit only (acyloin merge = positional merge of the carbonyl) |
| daidzein vs dihydrodaidzein; quercetin vs morin; luteolin vs kaempferol; acacetin vs genkwanin; kaempferol 3-O- vs 7-O-glucoside | differ | differ | split — these are the "semitones" the metric hears |
| D-glucose open chain vs β-D-glucopyranose | differ | differ | split (ring-chain), but open-chain key is changed (q2 finding) |
Totals: 37 chemotype pairs → 8 merged by InChI alone, 20 merged only after RDKit, 9 correctly split. Confirmation: chalcone/flavanone is not a tautomer pair under the metric; 3-hydroxyflavone keto/enol is; all N-H heteroaromatic tautomers were already merged by standard InChI, so the RDKit step matters only for C-H acidic systems (keto-enol, imine-enamine, acyloin, quinone-methide).
1.2 Edge cases that can change the key (Q6)
| Case | Key same? | Note |
|---|---|---|
protonated amine [NH+], pyridinium [nH+], carboxylate [O-], zwitterion vs neutral (L-DOPA), betaine zwitterion vs cationic acid (trigonelline) |
same | protons live in /p → last character only |
nitro [N+](=O)[O-] vs N(=O)=O; N-oxide [n+][O-] vs n=O; explicit-H SMILES |
same | drawing conventions normalised by RDKit before InChI |
| caffeine vs caffeine-d3 / -13C3 | same | isotopes are block 2; train holds 19 isotopically labelled SMILES (17 IK14 groups) that share keys with the unlabelled compound |
| E/Z resveratrol; (R)/(S)-naringenin | same | stereo ignored |
berberine cation vs berberine chloride (.[Cl-]) |
different | counter-ion is a second component in the formula layer (YBHILYKTIRIUTE vs VKJGBAJNNALVAF-type) |
| berberine vs dihydroberberine or the 8-OH pseudobase | different | there is no "neutral form" of a quaternary cation with the same atoms; COCONUT stores berberine as the cation (CNP entry, formal_charge 1, YBHILYKTIRIUTE-UHFFFAOYSA-N) |
oleanolic acid vs sodium oleanolate; aryl sulfate vs its K salt; caffeine vs caffeine·H2O; caffeine vs caffeine.[Na+] |
different | any .-separated fragment changes the key; train has 0 multi-fragment SMILES, COCONUT has 4,247 |
| phenol vs phenoxyl radical | different | formula differs by H |
| Mg-porphine (ionic or covalent drawing) vs porphine | different | metal becomes a disconnected component; COCONUT has ~2,385 metal-containing entries (regex count, upper bound) |
| oleanolic vs ursolic acid | different | not stereoisomers — methyl position; a true semitone |
COCONUT charge census (Oct-2026 lite CSV): 10,757 entries with non-zero formal charge (9,916 +1, 706 +2, 59 −1, 37 +3), 30,359 SMILES containing a charged atom (zwitterions included), 128 isotopically labelled. Train: 4,826 of 277,566 SMILES contain a charged atom; 301 of 275,950 InChIKeys end in the protonation flag O.
2. train.parquet census (script q1_train_census.py, 82.7 s wall on 16 processes; q1b_full_canon.py, 382 s wall / 4,847 CPU-s)
Columns loaded: normalized_smiles, inchikey, inchikey14, ingest_lib; 2,539,608 rows → 277,566 distinct SMILES, 275,950 distinct InChIKeys, 275,810 distinct IK14 (matches the official EDA).
(a) Collapses. 1,612 IK14 groups contain >1 distinct normalized_smiles (1,494 with 2, 97 with 3, 16 with 4, 5 with 5); only 139 groups contain >1 full InChIKey. Within a single library the collapse is almost nil for the big source: enveda-180 182,941 SMILES = 182,941 IK14; gnps 46,367 → 45,750 (563 groups), riken 16,454 → 15,892 (528), msdial 9,417 → 9,127 (277), massbank 9,400 → 9,180 (207), mona 11,711 → 11,681 (24), pluskal_ms2 4, spectraverse 12, enveda-np-examples 1, masaryk 1, drug_plus 0. 1,574 of the 1,612 multi-SMILES groups (97.6 %) span ≥2 libraries (top combination: mona|riken 165; the seven-library drug set 161) — collapses are different sources drawing the same compound differently, not within-source duplicates.
(b) Classification of the 1,612 groups (flat canonical SMILES, formal charge, isotope and Uncharger comparison): tautomer drawings with identical formula 1,477 (91.6 %); charge/protonation state 118 (carnitines, phosphocholines, anthocyanins drawn as [o+]…[O-] vs [o+]…OH, NAD-type pyridiniums); isotope labels 17 (d5-glycerol lipids); stereo-only 0. The last number is structural: no train SMILES contains @, / or \ (0 of 277,566), and block 2 is UHFFFAOYSA for 275,928 of 275,950 keys — train is stereo-flat by construction, so the hidden answers almost certainly are too. The tautomer groups are overwhelmingly amide/imidic-acid (C(=O)N vs C(O)=N), lactam/lactim, guanidine and tetrazole N-H drawings that standard InChI already merges. Testing 400 of them: Canonicalize leaves 396 on one key but splits 4 — a bilin, a cyclic lipopeptide, a thiopeptide and a depsipeptide, all cap-limited — i.e. for large molecules the RDKit step can undo a merge InChI had made.
(c) Label noise. Recomputing InChIKey14 from every distinct SMILES with RDKit 2026.03.6 (16.9 s): 0 mismatches, 0 parse failures, in every library; inchikey[:14] == inchikey14 on all 2,539,608 rows. The stored keys are trustworthy; the only "noise" is the semantic kind in (d).
(d) Effect of Canonicalize on the key — full set, not a sample (all 277,566 SMILES; status ok for all; median 2.4 ms, mean 17.5 ms, p95 33 ms, p99 428 ms, max 5.2 s):
| ingest_lib | distinct SMILES | key changed | % | mean ms |
|---|---|---|---|---|
| riken | 16,454 | 1,266 | 7.69 | 74 |
| drug_plus | 2,539 | 191 | 7.52 | 35 |
| msdial | 9,417 | 657 | 6.98 | 126 |
| mona | 11,711 | 763 | 6.52 | 68 |
| enveda-np-examples | 251 | 16 | 6.37 | 45 |
| massbank | 9,400 | 442 | 4.70 | 31 |
| gnps | 46,367 | 2,082 | 4.49 | 45 |
| masaryk | 417 | 18 | 4.32 | 5 |
| pluskal_ms2 | 46,825 | 1,303 | 2.78 | 18 |
| enveda-180 | 182,941 | 908 | 0.50 | 6 |
| spectraverse | 9,643 | 4 | 0.04 | 22 |
| all | 277,566 | 4,467 | 1.61 | 17.5 |
Structures that are in COCONUT change at 6.9 % vs 1.2 % for the rest; q2's 12–17 % on Wikidata/LOTUS drawings is higher because those SMILES were never passed through a normaliser. Which NPs change (COCONUT NPClassifier join, n ≥ 40): ansa macrolides 79 % (rifamycin naphthohydroquinone/quinone), dihydroflavonols 52 %, estrane 47 % / pregnane 41 % / androstane 17 % steroids (Δ4-3-ketone is moved to the β,γ-enone — progesterone RJKFOVLPORLFTN → MNRHZPCIEGLWGK), taxanes 42 %, naphthoquinones 41 %, guaianolides 32 %, monosaccharides 32 %, anthraquinones/anthrones 26 %, open-chain polyketides 25 %; flavones/flavonols themselves ~0 % (the aromatic 3-OH form already wins the +100 aromatic-ring score). Substructure enrichment among changed SMILES: explicit enol C=C–OH 28×, quinone 14×, enone 7.9×, anthraquinone 7.7×, 1,3-dicarbonyl 6.7×, α-hydroxy-carbonyl 6.6×, imine 2.8×. Ten example pairs (raw → canonical SMILES): progesterone (enone deconjugated); COC1=C(OC)C(=O)C(CCCCCCCCCCO)=C(C)C1=O (a 2,3-dimethoxy-benzoquinone → its hydroquinone-methide COc1c(O)c(C)c(C=CCCCCCCCCO)c(O)c1OC); 2'-hydroxy-dibenzoyl acylphloroglucinol …CC2=C(O)C(C)(C)C(O)=C(C(C)=O)C2=O → triketone; 1-methyl-3,4-dihydro-isoquinolinone-type O=C1NC(Cc2c[nH]c3ccccc23)C(=O)N2CCC=C12 → aromatic pyrazinol O=c1c(…)nc(O)c2n1CCC2; adenine N-methyl Cn1cnc(N)c2ncnc1-2 → imino Cn1cnc(=N)c2[nH]cnc21; 2-hydroxy-3-ene-steroid CC12CCC(=O)C(O)=C1CCC… → 2,3-dione; a hydroxy-naphthoquinone enol C1=C(O)C(=O)c2ccccc2C1=O → naphthalene-triol; a cholic-acid glucose ester open-chain aldose → 2-ketose (…OC(CO)C(O)C(O)C(O)C=O → …OC(CO)C(=O)C(O)C(O)CO); dehydroacetic-type pyranone CC1=CC(=O)CC(=O)O1; thiazolidinedione (pioglitazone) CC3SC(=O)NC3=O → c3sc(=O)[nH]c3O.
The metric merges distinct train labels. Mapping every raw IK14 to its metric key: 275,810 raw keys → 274,195 metric keys. 1,541 metric keys absorb ≥2 train skeletons (1,467 pairs, 67 triples, 4 quadruples, 2 quintuples, 1 sextuple = 3,167 skeletons), affecting 58,954 spectra (2.3 %); by library (IK14 in such groups): spectraverse 1,410, gnps 1,246, riken 871, mona 725, pluskal_ms2 662, msdial 549, massbank 356, drug_plus 209, enveda-np-examples 14, enveda-180 1. The groups are tetracyclines (five IK14 → MUHBBHLZPHKTTR; six → TUEWQXNXQFRUTK for oxytetracycline-type), rifamycins, hypericin (three aromatic drawings), dihydropyridine drugs (nifedipine-type drawn as 1,4-DHP vs 4H-pyridine), sugar phosphates (four pentose/hexulose phosphates → one key). Conversely 11 raw IK14 map to two metric keys (one drawing's canonicalisation ends elsewhere than the other's) — the non-idempotence q2 saw at 0.3 %, now counted exactly.
3. COCONUT: how many spellings per skeleton (script q2q4_coconut.py, 42 s, local Oct-2026 lite CSV; no download performed)
738,794 isomeric entries → 728,390 distinct full InChIKeys → 479,690 IK14 skeletons: 35.1 % redundancy (the brief's ≈31 % used the NAR paper's 695,133; the Oct-2026 dump is larger). 82.8 % of entries carry a non-trivial stereo/isotope block. Chandrasekhar et al. 2025 (NAR, COCONUT 2.0): 695,133 unique structures = 82,220 without stereocentres + 539,350 with preserved stereo + 73,563 with centres but undefined; uniqueness by "canonical isomeric kekulized SMILES". Sorokina et al. 2021 (J Cheminform, COCONUT 1): 406,076 unique flat NPs vs 730,441 with stereo (44 % redundancy) — the ratio has not changed much. THEOBROMA (bioRxiv 10.64898/2026.06.12.731585, June 2026; abstract only via search snippet, page rate-limited — low confidence) reports 1.13 M NPs in 486,215 stereoisomer families by full 27-character key.
Group-size distribution of IK14 in COCONUT: 1 entry 345,074 (71.9 %); 2: 84,668; 3: 21,144; 4: 14,484; 5: 5,831; 6: 2,736; 7: 1,585; 8: 1,428; 9–10: 1,195; ≥11: ~1,545; max 72 (a C29H48O Δ22-stigmastenol skeleton, HCXVJBMSMIARIN), then 68 (C29H50O sitostanol-type), 66 (sitosterol glucoside C35H60O6), 66 (a corynanthe alkaloid C20H26N2O2), 55 (a spirostanol C27H44O3), 49 (ursolic-acid skeleton C30H48O3), 46 (a disaccharide C12H22O11), 45 (rutin IKGXIBQEEMLURG). By NPClassifier pathway: terpenoids 46.7 % redundant (mean 3.9 entries per skeleton, 34.8 % of entries in groups ≥4), carbohydrates 45.1 %, peptides 39.4 %, polyketides 34.2 %, fatty acids 33.4 %, shikimates 29.4 %, alkaloids 26.6 %. By superclass: macrolides 59.0 %, steroids 54.5 % (mean 5.3), linear polyketides 53.5 %, monoterpenoids 49.7 %, sesquiterpenoids 46.0 %, triterpenoids 45.7 %, diterpenoids 44.1 %, flavonoids 37.4 %; glycosides 46.9 % vs non-glycosides 32.8 %. Group size vs stereocentre count (30 k sample): 0 centres → mean 1.14 (9 % still in groups ≥2: E/Z and residual tautomer drawings); 1–2 → 1.9; 3–4 → 3.1; 5–7 → 3.7; 8–10 → 4.7 (69 % of entries in groups ≥2, 39 % in groups ≥4); >10 → 3.7 (saturation: with many centres each entry tends to be a unique natural diastereomer, and large saponins are rarer).
4. Semitone neighbours: positional-isomer density per formula (Q4)
98,691 formulas; IK14 per formula: median 1, mean 4.9, p90 8, p99 63, max 1,761. Seen from a structure (what a hit experiences): other skeletons with the same formula — mean 74, median 20, p75 71, p90 185; 11.1 % have none, 61.6 % have ≥10, 46.1 % ≥25, 18.9 % ≥100. Restricted to neutral mass 244–459 Da (the test's precursor window): 234,711 skeletons, median 35, mean 76, p75 96, p90 198; only 5.9 % have no neighbour; 73.6 % have ≥10, 58.0 % ≥25, 24.0 % ≥100. So for more than half of plausible hits the 25 slots cannot even enumerate the formula's COCONUT skeletons; ranking inside the formula is the whole game, and the hidden molecules are "none previously published", so the true answer is usually not among those neighbours but structurally adjacent to them.
| formula | COCONUT entries | distinct IK14 | stereo redundancy | main classes among skeletons |
|---|---|---|---|---|
| C15H10O7 (quercetin) | 61 | 59 | 3 % | flavonols 15, anthraquinones 13, flavones 9, coumarins 4 |
| C15H10O6 (kaempferol/luteolin/fisetin) | 111 | 109 | 2 % | anthraquinones 24, flavones 18, flavonols 15, isoflavones 11 |
| C16H12O5 (acacetin/genkwanin) | 215 | 204 | 5 % | anthraquinones 54, isoflavones 27, flavones 25 |
| C15H12O5 (naringenin) | 186 | 165 | 11 % | chalcones, flavanones, … |
| C21H20O11 (kaempferol hexosides) | 449 | 142 | 68 % | flavonols 48, flavones 46, isoflavones 12 |
| C21H20O12 (quercetin hexosides) | 275 | 93 | 66 % | flavonols 53, flavones 23 |
| C27H30O16 (rutin) | 495 | 157 | 68 % | flavonols 92, flavones 44 |
| C22H22O9 (ononin-type) | 134 | 68 | 49 % | — |
| C30H48O3 (oleanolic/ursolic/betulinic) | 890 | 385 | 57 % | lanostane/tirucallane 82, oleanane 69, cycloartane 42, lupane 37 |
| C30H48O4 (maslinic-type) | 809 | 333 | 59 % | — |
| C20H30O (diterpene alcohols) | 305 | 143 | 53 % | abietane 24, labdane 9, dolabellane 7 |
| C20H28O2 (abietic-type acids) | 414 | 237 | 43 % | — |
| C21H26N2O3 (yohimbine-type) | 290 | 137 | 53 % | — |
| C17H19NO3 (morphine-type) | 132 | 79 | 40 % | — |
| C10H12O2 (eugenol-size) | 156 | 138 | 12 % | — |
| C8H10N4O2 (caffeine) | 13 | 13 | 0 % | — |
Read across: aglycones are nearly all semitones (59 distinct quercetin-formula skeletons, essentially no stereo), whereas glycosides and triterpenoids are two-thirds enharmonic (glucoside = galactoside = mannoside under the key; every sugar epimer and anomer is one answer).
Can MS/MS hear the semitone? Literature, all consistent with "yes, by intensity, not by m/z":
- Cuyckens & Claeys 2005 (J Mass Spectrom 40:364, DOI 10.1002/jms.794; 18 standards): "the radical aglycone ions are very abundant for deprotonated flavonol 3-O-glycosides"; 3-, 7- and 4'-O positions assigned from ion ratios of [M−H]− and [M+Na]+ CID.
- Ablajan et al. 2006 (J Mass Spectrom 41:352, DOI 10.1002/jms.995): [Y3₀−H]•− from homolytic 3-O cleavage "with high abundance points to 3-O glycosylation"; [Y₀−2H]− signals 3,7-di-O.
- Kachlicki et al. 2016 review (Molecules 21:1494, PMC6273528): 7-O vs 4'-O from ¹,³B₀− vs ¹,³A₀− dominance; 1→2 vs 1→6 interglycosidic links from Z₁− ions; 6-C vs 8-C from ⁰,³X₀−/⁰,²X₀− ratio and water losses; but "it is not possible to distinguish isomers of sugars", malonyl position and anomeric configuration "problematic or even impossible … without NMR".
- Vision-transformer classifier on 17,615 GNPS flavonoid-glycoside spectra (PMC11644359, 2024): 3-O / 7-O / 6-C / 8-C / 4'-O classes at 84.7 % test accuracy (n = 1,745; F1 3-O 0.92, 7-O 0.90, 8-C 0.72), 96 % on standards (Xevo G2 QTOF, 20 eV).
- Jiang & Gates 2024 (Molecules 29:5246, PMID 39598635; 30 flavonoids, CID ramped 0–50 eV): rhamnetin vs isorhamnetin (7-OMe vs 3'-OMe) separated because m/z 302 "is almost four times more intense for isorhamnetin"; kaempferol vs fisetin and chrysin vs daidzein separated only by energy-breakdown curves; "separating these structural isomers is challenging".
- MassSpecGym (Bushuiev et al. 2024, arXiv 2410.23326) evaluates with the 2D InChIKey because MS/MS cannot resolve stereo, caps retrieval candidates at 256 per spectrum; the June-2026 audit (Liu, Bushuiev, Lightheart … Coley, arXiv 2606.19624) shows how fragile isomer-level evaluation is: a SMILES-format shortcut inflated Hit@1 from 6.70 % to 82.41 % (ChemBERTa 8.2 % → 99.66 %), formula filtering alone lifts a random baseline from 0.43 % to 12.98 %, and §6.2 mandates 14-character matching.
5. What the metric cannot see vs what MS2 cannot see (Q5)
| metric sees? | MS/MS sees? | consequence | |
|---|---|---|---|
| enantiomers, diastereomers (sugar epimers, anomers, ring-fusion), E/Z | no | no (diastereomers: intensity only) | never spend two slots |
| tautomers (keto-enol, imine-enamine, acyloin, N-H) | no (after canonicalisation) | no (interconvert in solution/gas phase) | one slot; but see Gotcha 2 |
| protonation state, counter-ion, hydrate, isotope label | no (protonation/isotope) / yes (counter-ion, solvate) | n/a | submit the bare, neutral, single-fragment parent |
| positional isomers (OH/OMe/glycosyl position), regioisomers, ring-size and ring-chain isomers (chalcone/flavanone), C- vs O-glycoside, oleanane vs ursane | yes | weakly (intensity ratios, CE dependence); C- vs O-glycoside and ring-chain strongly | this is what slots 2–25 are for |
Practical rule: two stereoisomers of one skeleton in a submission are a guaranteed wasted slot (the grader sees one answer twice, and a duplicate cannot raise MRR); positional isomers of a confident scaffold are the correct hedge, ordered by prior frequency (COCONUT/LOTUS occurrence of the substitution pattern) and by the few intensity cues above.
Forced analogy: music theory — enharmonic equivalents vs one semitone
(a) Statement. A pitch class is a metric key. F♯ and G♭ are two spellings of one pitch: stereoisomers and tautomer drawings are two spellings of one key; the grader is a listener who cannot read notation, only hear pitch. F and F♯ are a semitone apart: positional isomers are different keys, which the grader hears perfectly — but the spectrum is an instrument whose tuning is coarse: it plays F and F♯ with nearly the same fundamental and differs only in overtones (intensity pattern). The canonicalisation step is the temperament: it decides which spellings collapse to which pitch, and re-tuning it (RDKit 2026.09's tie-break change) moves a few pitches.
(b) Derived, testable ideas.
(i) Slot-allocation rule. Compute K(s) for every candidate with flat, single-fragment, neutral SMILES and the pinned RDKit; keep one representative per key (never two spellings). Then allocate slots per "chord" (scaffold with the same formula): if the model's posterior mass on a scaffold is p, give it round(25·p) slots filled with its highest-prior positional isomers; because the median hit has 35 semitone neighbours in the window and 58 % have ≥25, a single-scaffold formula can legitimately consume all 25 slots, whereas glycoside and triterpenoid formulas (two-thirds enharmonic) need far fewer slots than their raw COCONUT count suggests (C21H20O11: 449 entries → 142 keys; C30H48O3: 890 → 385). Test: re-score any existing submission after key-dedup and refill; MRR cannot drop and, on glycoside/terpenoid-rich hidden molecules, recall@25 should rise by roughly the redundancy fraction (≈35 %) of the slots previously wasted.
(ii) Quantitative neighbour count (§4): median 35, mean 76, p90 198 same-formula skeletons in COCONUT for 244–459 Da; 5.9 % of skeletons are "alone" in their formula.
(iii) Overtones that hear the semitone. Negative-mode radical aglycone [Y₀−H]•− intensity (3-O vs 7-O), ¹,³A₀−/¹,³B₀− ratio (7-O vs 4'-O), ⁰,²X/⁰,³X (6-C vs 8-C), Z₁− (1→2 vs 1→6), CH₃• vs CH₄ loss competition and m/z 302 intensity for methoxy position, and CE-breakdown curves. The test gives merged multi-CE spectra (per-row collision_energy_ev is a list), which blurs breakdown curves, and no CCS column, so ion mobility — the instrument that does play the semitone cleanly on a timsTOF — is unavailable. Testable: train a positional-isomer re-ranker on train pairs that share a formula and a Murcko scaffold but differ in key (e.g. the 142 C21H20O11 skeletons), using intensity-ratio features; evaluate as pairwise accuracy; the ViT result (85 %) is the ceiling to beat.
(c) Does it hold? It holds for stereo (same pitch, different timbre: saponin diastereomers change intensities, never m/z) and for the big keto-enol/N-H classes. It partially holds for tautomers: a tautomer whose proton sits on a different heteroatom can fragment differently in the gas phase, and ring-chain "tautomers" (chalcone/flavanone, open/closed sugars) are different pitches to both grader and instrument. It breaks where the listener mis-hears spelling: 11 train skeletons whose two drawings land on two metric keys, and cap-limited large molecules (status MaxTransformsReached) whose canonical key depends on enumeration order — there the grader is a listener with inconsistent temperament, and the only defence is to submit the drawing the answer most likely used (a database-canonical, flat SMILES) rather than an exotic tautomer.
Gotchas / what could fool us
- Train is stereo-flat. 0/277,566 SMILES carry stereo; answers were produced by the same normaliser. If we submit COCONUT isomeric SMILES, q2's stereo-dependent tie-break (0.45 % of stereo-bearing NPs; RDKit issue #9518, fixed only in 2026.09) can flip a correct answer to wrong. Strip stereo (
RemoveStereochemistry) before canonicalising and before submitting. - The metric splits identical molecules. 4/400 of train's InChI-merged tautomer-drawing groups and 11/275,810 skeletons overall get two metric keys from two drawings (large peptides, bilins, thiopeptides, rifamycins). For candidates > 40 heavy atoms with
Enumerate().status != Completed, the key is enumeration-order dependent; prefer the source database's drawing. - The metric merges distinct training labels. 1,541 metric keys cover 3,167 train skeletons (58,954 spectra). Models trained on raw
inchikey14as class labels see tetracycline, its three enol drawings and anhydro-forms as distinct classes; evaluation does not. Relabel train withK(s)before training and before any train/test overlap or CV split, or leakage/duplicate-label metrics will be off by ~2 %. - Raw candidate pools are 35 % spellings. COCONUT 738,794 → 479,690 keys; steroids 54 %, macrolides 59 %, flavonoid hexosides 68 % redundant at the formula level. A top-25 taken from raw COCONUT entries can contain 8–17 distinct keys.
- Counter-ions, hydrates and metals change the key; protonation and isotopes do not. COCONUT holds 4,247 multi-fragment SMILES and ~2,400 metal-containing entries; train has none. Keep the largest organic fragment, neutralise only by removing/adding protons (never by changing heavy-atom bonds), and leave quaternary cations charged (berberine is stored and keyed as the cation).
- Acyloin/open-chain-sugar merging (q2): a carbonyl drawn on the wrong carbon of an open-chain polyol scores correct; the ring form scores wrong. Pentose/hexulose phosphates in train collapse 4 → 1.
- Δ4-3-keto steroids, dihydropyridines and quinones are re-drawn by the canonicaliser (progesterone-type 41 %, naphthoquinones 41 %, ansa-macrolides 79 %). Harmless for scoring (both sides are transformed) but it means a fingerprint computed on the canonical tautomer differs from one computed on the database drawing — pick one convention for training and candidates and never mix.
- Positional-isomer density makes recall@25 the ceiling. 58 % of skeletons in the test window have ≥25 same-formula neighbours in COCONUT; with a 1-mDa window multiple formulas also enter. Any score that cannot order positional isomers cannot exceed roughly MRR ≈ 1/(median rank among ~35) unless the scaffold prior is sharp.
- Version drift. 60 pairs and all q2 sets identical between RDKit 2026.03.3 and 2026.03.6; 2026.09.1 changes the tie-break and speeds canonicalisation (#9134), so results will differ on an unknown fraction. Pin.
- Cost. Full-train canonicalisation = 4,847 CPU-s (17.5 ms mean, 5.2 s max); COCONUT at the same mean ≈ 3.6 CPU-h, dominated by a p99 tail of >0.4 s per molecule. Precompute keys offline; never canonicalise inside the scoring loop of the notebook.
- **Literature on "MS2 cannot distinguish isomers" is mostly flavonoid-glycoside and low-resolution; the timsTOF multi-CE merge in the test erases the energy-breakdown dimension that Jiang & Gates needed. Treat 85 % positional accuracy as an optimistic ceiling.
Implications for the challenge
- Implement
K(s)exactly once (flat, largest-fragment, proton-neutralised SMILES →TautomerEnumerator().Canonicalize→MolToInchiKey[:14], rdkit==2026.3.3) and use it for everything: train labels, candidate-pool dedup, CV grouping, submission dedup. Expected: no wasted slots; ~2 % label consolidation in train; stereo-flip risk removed. - Re-key COCONUT (479,690 keys) and any PubChem/LOTUS additions offline on Explorer; store
key → representative flat SMILESand the per-formula key count; ship as a Kaggle dataset. - Slot policy: one slot per key; fill by scaffold posterior × positional-isomer prior; cap enharmonic-heavy formulas (glycosides, triterpenoids) at their distinct-key count; use spare slots for formula-adjacent scaffolds within the ppm window.
- Train a positional-isomer re-ranker on same-formula/same-scaffold train pairs with intensity-ratio features (radical-aglycone, A/B-ring RDA ratios, methyl-loss competition); validate on the 142 C21H20O11 and 385 C30H48O3 COCONUT skeleton sets against train spectra.
- For hits with
Enumerate().status != Completed(large NPs), submit the database drawing, not a re-drawn tautomer; optionally hedge with both drawings only if they give two different keys (they then cost two slots but cover the grader's inconsistency). - Use canonical-tautomer SMILES consistently for fingerprints (or consistently raw) — do not train on raw drawings and predict on canonical ones (steroid/quinone/dihydropyridine fingerprints change).
- Report local MRR both with and without key-dedup of the candidate list; the gap measures how many slots the pool wastes on spellings.
Open questions
- Does the hidden-test answer key come from the same normaliser as train (flat, single-fragment)? Train says yes with high probability; only the official metric notebook settles it.
- What fraction of hidden molecules are glycosides/triterpenoids (enharmonic-heavy) vs aglycone/alkaloid (semitone-heavy)? The visible decoy test cannot tell.
- Is RDKit 2026.09's tie-break fix going to be adopted by the grader before December (it would remove Gotcha 1 but change Gotcha 2 cases)?
- How much positional-isomer signal survives the timsTOF multi-CE merge? Needs an experiment on train pairs with per-CE rows (enveda-180 has
collision_energy_evlists too). - THEOBROMA's family-size distribution (full text not reachable today) would give an independent check on the COCONUT group-size curve.
Sources
- InChI Technical Manual (InChI Trust, v1.04 PDF, https://www.inchi-trust.org/download/104/InChI_TechMan.pdf) — sections "InChIKey has five distinct components", "Mobile H-Atoms (Tautomers)".
- Dhaked DK, Ihlenfeldt WD, Patel H, Delannée V, Nicklaus MC. Toward a Comprehensive Treatment of Tautomerism in Chemoinformatics Including in InChI V2 (PMC8459712) — Standard InChI recapitulation 37.39 % overall / 15.63 % strict vs 77.94 % / 23.64 % with 15T+KET; imine 0 %; ring-chain 0 %; PT_06_00 affects 73.64 % of 400 M structures.
- Sitzmann M, Ihlenfeldt WD, Nicklaus MC. Tautomerism in large databases. J Comput Aided Mol Des 2010;24:521, DOI 10.1007/s10822-010-9346-4 (Europe PMC abstract, PMID 20512400).
- RDKit rdMolStandardize documentation, https://www.rdkit.org/docs/source/rdkit.Chem.MolStandardize.rdMolStandardize.html (defaults maxTautomers/maxTransforms 1000; status enum).
- Chandrasekhar V et al. COCONUT 2.0. Nucleic Acids Res 2025;53:D634, DOI 10.1093/nar/gkae1063.
- Sorokina M et al. COCONUT online. J Cheminform 2021 (PMC7798278) — 406,076 flat vs 730,441 stereo NPs.
- THEOBROMA, bioRxiv 10.64898/2026.06.12.731585 (search snippet only; page returned HTTP 429 — low confidence).
- Bushuiev R et al. MassSpecGym, arXiv 2410.23326 (HTML).
- Liu H, Bushuiev R, Lightheart I, … Coley CW. MassSpecGym in the Wild, arXiv 2606.19624 (17 Jun 2026; HTML §4.3, §5.1, §6.2).
- Cuyckens F, Claeys M. J Mass Spectrom 2005;40:364, DOI 10.1002/jms.794, PMID 15674860 (Europe PMC).
- Ablajan K et al. J Mass Spectrom 2006;41:352, DOI 10.1002/jms.995, PMID 16432803 (Europe PMC).
- Kachlicki P et al. Structural characterization of flavonoid glycoconjugates… Molecules 2016;21:1494 (PMC6273528).
- Determination of flavonoid glycoside isomers using vision transformer and tandem MS, 2024 (PMC11644359).
- Jiang C, Gates PJ. Molecules 2024;29:5246, DOI 10.3390/molecules29225246, PMID 39598635 (Europe PMC full text).
- Hoffmann MA et al. COSMIC. Nat Biotechnol 2022, DOI 10.1038/s41587-021-01045-9, PMID 34650271 (abstract; no isomer statistics extracted).
- Internal:
research/q2_data_forensics/metric_mrr25_inchikey14_tautomer_canonicalisation_rdkit.md;research/q7_compute_execution/_queen_measurements.json(Q7-M7–M9);research/_meta/train_eda.md. - Local computation:
q1_train_census.py,q1b_full_canon.py,q2q4_coconut.py,q3q6_pairs.py(session scratchpad), Python 3.14, RDKit 2026.03.6 (+ 2026.03.3 venv for the pair table), dataC:\Temp\casmi26\data\train.parquetandC:\Temp\casmi26\npdb\coconut\coconut_csv_lite-10-2026.csv(pre-existing local copy).