TL;DR. The adduct string on a spectrum is a label, not a measurement: in public libraries roughly a third of positive-mode entries are something other than [M+H]+, users frequently leave the default "[M+H]+" unchanged, and cleaning pipelines (matchms, MassSpecGym) silently rewrite or drop 5–30 % of entries because adduct, precursor m/z and structure disagree. For the challenge, the adduct string decides which neutral mass the candidate window is drawn around, and five of the ten declared test adducts ([M+NH4]+, [M-H2O+H]+, [M-2H2O+H]+, [M+Cl]-, [M+CH2O2-H]-) are exactly isobaric with "[M'+H]+ / [M'-H]- of a different formula", so a wrong label produces a plausible but wrong candidate pool. The multi-spectrum structure of the hidden test (1–16 spectra per molecule_id) allows a cheap "adduct balance" check: all spectra of one molecule must back-solve to the same neutral mass within ~5 mDa, and in MassSpecGym 93 % of molecules measured as both [M+H]+ and [M+Na]+ do so.
1. Adduct frequencies: what the published statistics actually say
No source gives adduct frequencies specifically for pure natural products infused into a Bruker timsTOF (Apollo II / CaptiveSpray / VIP-HESI); every table below is from Orbitrap/QTOF libraries or from LC-MS extracts, and the timsTOF-specific distribution is unverified (the sibling worker on train-set statistics can measure it on the enveda-180 rows, which are timsTOF). What can be sourced:
| Source (what was counted) | [M+H]+ | [M+Na]+ | [M+NH4]+ | [M+K]+ | in-source fragments (e.g. [M-H2O+H]+) | multimers [2M+X]+ | n | Note |
|---|---|---|---|---|---|---|---|---|
| MassSpecGym v1 full dataset, positive mode only, Orbitrap+QTOF, after cleaning (computed here from the HF TSV) | 84.5 % (195,237) | 15.5 % (35,867) | 0 (filtered) | 0 (filtered) | 0 (filtered) | 0 (filtered) | 231,104 spectra / 28,929 molecules | Only [M+H]+ and [M+Na]+ were retained by design; 88.6 % of the [M+Na]+ spectra are Orbitrap. |
| MassSpecGym metadata-complete subset (simulation challenge) | 98 % | 2 % | – | – | – | – | subset | Supplement §2.3: "98 percent of entries contain the [M+H]+ adduct … removed the other 2 % [M+Na]+". |
| GNPS positive-mode library entries (as reported by the IIMN paper) | 65 % | – | – | – | – | – | – | "GNPS (65 % [M+H]+)"; MoNA LC-MS² positive: "two-thirds … entered as [M+H]+". |
| MoNA + GNPS positive MS/MS (Bittremieux 2023) | ~2/3 | "minimally represented" | idem | idem | idem | idem | GNPS 497,137; MoNA 145,361 (2022-09-08 downloads) | Text says other adducts, ISF, multiply charged and multimers are "minimally represented"; per-adduct percentages are only in their Fig. 3 (not extracted). |
| IIMN-generated library from NP/marine/plant extracts (Schmid 2021) | 24 % | 17 % | 13 % | – | 15 % | 22 % | 2,657 entries | What an LC-MS of real extracts actually contains when all ion species are kept. |
| Ion identities across 24 untargeted LC-MS datasets (Schmid 2021) | 23 ± 6 % | 26 ± 6 % | 10 ± 8 % (marine 24 ± 5 %) | – | – | – | 24 datasets | Sodiated species were as frequent as protonated ones. |
| 540 in-house HRMS samples, methanol, positive ESI (Sugimura 2015) | 17.0 % (92) | 88.9 % (480) | – | – | – | – | 540 | Both detected in 32 (5.9 %). "NO rule": O-containing → [M+Na]+, N-only → [M+H]+. |
| STRIKER audit: entries with missing adduct field | GNPS < 0.05 % (~250), MS-DIAL 0.4 % (~1,400), MoNA 5.9 %, MassBank 11 %, HMDB 48 % (> 31,200) | 5 libraries | Missing ≠ wrong, but a missing adduct is usually defaulted to [M+H]+ downstream. | |||||
| Enveda CASMI26 test set — declared adduct vocabulary (Kaggle data page as mirrored in bobownYAO/Enveda-CASMI-2026 README) | [M+H]+, [M+NH4]+, [M-H2O+H]+, [M-2H2O+H]+, [M+Na]+, [M+K]+ | 10 strings; negative: [M-H]-, [M-H2O-H]-, [M+CH2O2-H]-, [M+Cl]- | Frequencies: unverified (no write-up reports them). |
Two things stand out. First, the "two-thirds [M+H]+" of curated libraries is a curation artefact: library builders target protonated ions; extracts of natural products ionize as Na+/NH4+/K+ adducts and multimers at comparable rates (Schmid 2021). Second, pure-compound libraries measured by flow injection on an Orbitrap (MSnLib: 30,008 compounds; > 12,200 positive-only, > 3,400 negative-only, ~14,300 both) explicitly annotate [M+H]+, [M-H2O+H]+, [M-2H2O+H]+, [M+NH4]+ and [M+Na]+ as separate ion types — the same vocabulary the CASMI26 test uses, which is consistent with Enveda having generated test labels with an mzmine-style ion-identity step rather than by hand.
2. In-source fragmentation: which classes lose water before the quadrupole
- Chen et al. 2023 (RCM 36:e9519), 214 natural-compound standards, LC-Q/Orbitrap ESI: "up to 82 % of tested compounds underwent ISF"; half of the compounds with > 1 fragile moiety showed successive ISF; the ISF-driving moieties were hydroxyl, lactone, glycosyl and ether (losses of H2O, CO, deglycosylation, ether cleavage); "some compounds such as terpenoids underwent severe ISF and less than 1 % parent form can be observed."
- Uritboonthai, Siuzdak et al. 2025 (Anal Sci Adv 6:e70012): mining METLIN MS/MS at 0 eV for 931,000 standards, ISF "could account for over 70 % of the peaks observed in typical LC-MS/MS metabolomic datasets when using a 5 % cutoff threshold", rising below 3 %.
- Guo & Huan 2021 (ISFrag, Anal Chem 93:10243): ISF features recognised by co-elution, presence in MS² of the precursor, and similar MS² patterns; 100 % recognition of level-1 and > 80 % of level-2 ISF on standards; increasing source energies raises ISF counts but "the percentage of ISF features might not necessarily increase."
- Schmid 2021 (IIMN): 15 % of a 2,657-entry extract-derived library were in-source fragments.
- Xu, Rabinowitz et al. 2015 (Anal Chem 87:2273): > 20 in-source fragments mimicking common metabolites in yeast extracts (NTP → NDP, hexose-P → triose-P).
No paper I opened reports the fraction of DDA precursors that are ISF ions; Pedišius 2026 (143-compound NP mix, Orbitrap IQ-X) grouped ISF post-acquisition and found low-energy stepped HCD raised captured MS¹ fragment ions by 55 % (positive) / 16 % (negative) but did not report precursor selection rates. Treat "how often DDA picks [M-H2O+H]+" as unverified; what is verified is that for terpenoid alcohols, glycosides and lactones the dehydrated ion can be the base peak in MS¹, so a DDA scheduler with no ion-identity logic will fragment it.
Empirical proxy from MassSpecGym (computed here): fraction of [M+H]+ spectra containing a [precursor − 18.0106] peak at ≥ 5 % relative intensity, by oxygen count of the formula: O0 0.02 % (n = 12,504); O1–2 12.3 % (52,812); O3–5 14.7 % (74,677); O6–9 10.9 % (37,240); O10+ 4.5 % (18,004). For [M+Na]+ spectra the same numbers are 0 / 1.0 / 3.4 / 5.1 / 1.4 %. Water loss is a protonated-ion phenomenon, and the fall-off at O10+ (glycosides) is because glycosides lose whole sugars (162.05, 146.06, 132.04 Da) rather than one water.
3. Na+ versus H+: what decides it, and what it does to the MS/MS spectrum
Determinants (Kruve et al. 2013, J Mass Spectrom 48:695): a sodium-adduct-formation-efficiency (SAFE) scale spanning > 4 orders of magnitude across 19 compounds; "oxygen bases have higher efficiency of Na+ adduct formation than nitrogen bases because of the higher partial negative charge on oxygen atoms and competition from protonation in the case of nitrogen bases"; "chelating ability strongly increases the Na+ adduct formation efficiency"; and Na+ adduct yield depends on Na+ concentration in solution. Sugimura 2015 reduces this to the "NO rule" (O-containing → [M+Na]+; N-but-no-O → [M+H]+) with [M+H]+ clustering around tPSA ≈ 20 Ų, MW ≈ 250, and [M+Na]+ selectivity rising with tPSA. Macrolides, polyketides, saponins and glycosides are poly-ether/poly-hydroxyl chelators, i.e. the worst case for H+/Na+ competition; alkaloids are the best case.
Fragmentation of sodiated ions (Damont et al. 2025, RCM 39:e10133): sodiated precursors "may produce spectra significantly different from [M+H]+ or [M−H]−", with sodium retained in product ions or neutral losses, and the covalent-bond cleavages occur "when the sodium cation is involved in an ion–ion type interaction within the structure." Their conclusion is that sodiated MS/MS is informative but different, so a protonated library spectrum will not match it.
Numbers (MassSpecGym, computed here; positive mode, cleaned):
| Metric | [M+H]+ (n = 195,237) | [M+Na]+ (n = 35,867) |
|---|---|---|
| Median / mean peaks per spectrum | 21 / 38.7 | 10 / 24.4 |
| Orbitrap only: median peaks | 21 (n = 140,281) | 9 (n = 31,777) |
| QTOF only: median peaks | 21 (n = 50,904) | 46 (n = 2,919; different submitters, probably multi-CE merged — do not over-read) |
| Precursor peak present (±0.01 Da) | 50.6 % | 48.5 % |
| Precursor peak is ≥ 50 % of base peak | 21.7 % | 38.0 % |
| Spectra with ≤ 2 peaks | 3.4 % | 9.8 % |
| Molecules seen only as [M+Na]+ | – | 942 / 28,929 = 3.3 % |
| Molecules seen as both | 5,330 / 28,929 = 18.4 % |
So yes: sodiated spectra carry roughly half the peaks, are nearly twice as likely to be precursor-dominated, and are three times as likely to be near-empty. A spectrum-to-fingerprint model trained mostly on [M+H]+ will be systematically under-informed on [M+Na]+ test rows.
4. The CASMI26 test adduct vocabulary
Declared vocabulary (10 strings; from the Kaggle data description as mirrored in the bobownYAO/Enveda-CASMI-2026 README and in the chiparon/enveda-casmi26 README, which both convert "10 competition adduct types"): [M+H]+, [M+NH4]+, [M-H2O+H]+, [M-2H2O+H]+, [M+Na]+, [M+K]+, [M-H]-, [M-H2O-H]-, [M+CH2O2-H]-, [M+Cl]-. BRIEF.md states the visible test.parquet uses 7 of them; I could not load the parquet locally (no pyarrow/pandas on this box, data dir empty) and no write-up prints value_counts, so which 7 and their frequencies are unverified. The gnshx write-up (public LB 0.420) names [M+H]+, [M+Na]+, [M-H2O+H]+ as the adducts it had to shift reference spectra across, and the ibnmarzuk write-up says "Unknown test adducts stop execution rather than being silently treated as protonated ions" — both consistent with those three dominating. String-format gotcha: the test writes [M-H2O+H]+ (matchms' known-adduct table also uses this ordering; "[M+H-H2O]+" is absent there) and [M+CH2O2-H]- (matchms/Fiehn call it [M+FA-H]-; GNPS often writes [M+HCOO]- or M+FA-H). Any adduct→mass lookup must be built on normalised strings, not on exact matches against a library table.
5. Does the adduct string tell you what was fragmented? Measured mislabelling
| Audit | What was measured | Number |
|---|---|---|
| de Jonge et al. 2024, matchms cleaning of GNPS (J Cheminform 16:88) | GNPS 500,569 spectra → 448,485 after cleaning; 83,843 would be removed without repair functions, 31,758 with; 52,084 spectra had metadata repaired. Explicit statement: "Often the adduct is not changed by users from the default [M+H]+ to the actual adduct." | ~10 % repaired, ~6 % dropped |
same paper, validation of repair_adduct_based_on_smiles |
Failed to derive an adduct for 0.02 % of spectra; of the rest, 0.024 % got a wrong adduct — i.e. SMILES + precursor m/z almost always pins the adduct uniquely. (Tolerance not stated in text.) | 0.024 % residual error |
| MassSpecGym construction (NeurIPS 2024 supplement, Table 2) | derive_adduct_from_name changed 376,859; clean_adduct 8,102; require_adduct_in_list removed 41,049 (+6,596 changed); require_matching_adduct_precursor_mz_parent_mass removed 3,726; require_parent_mass_match_smiles removed 8,694; require_precursor_mz removed 7,291; then SIRIUS formula decomposition removed 135,190 of 414,049 (32.6 %) spectra for < 50 % explained intensity; 14,699 more for sharing no peak with the NIST spectrum. |
roughly one-third of metadata-clean public spectra fail a structure-consistency test |
| STRIKER (Karam et al. 2026, J Cheminform 18) | Missing-adduct rates above; adduct correction accuracy 98.91 % (MLP); "7.4 % mismatch rate in SMILES strings despite identical InChIKeys". | – |
| MassSpecGym neutral-mass residuals (computed here) | precursor_mz − shift vs parent_mass: median −0.001 ppm ([M+H]+), −0.006 ppm ([M+Na]+); 0.001 % beyond 10 ppm | 0 — but only because inconsistent rows were already dropped |
Interpretation: a raw GNPS/MassBank adduct string is wrong or missing in a few percent of rows, and it is wrong in the specific direction of "says [M+H]+, isn't". After matchms-style repair against the SMILES the label is reliable to ~10⁻⁴. In the hidden test there is no SMILES to repair against — the adduct string must be trusted or cross-checked across spectra (Section 7). Note that a "7.21 % of 1,573,871 records inconsistent at 0.05 Da" figure surfaced in a search snippet attributed to STRIKER; the STRIKER full text does not contain it, so it is not usable.
6. Exact mass shifts, electron mass, and tool errors
Monoisotopic masses used: H 1.00782503, N 14.00307400, O 15.99491462, Na 22.98976928, K 38.96370649, Cl 34.96885268, e⁻ 0.00054858. For a singly charged ion, neutral mass M = (m/z − shift) for the n = 1 adducts, with M = (m/z − shift)/2 for 2M dimers. Values agree with the Fiehn calculator and the matchms known_adducts_table.csv to 1 µDa.
| Adduct (test spelling) | z | shift incl. e⁻ (Da) | shift without e⁻ | error if e⁻ omitted |
|---|---|---|---|---|
| [M+H]+ | +1 | +1.007276 | +1.007825 | +0.549 mDa |
| [M+NH4]+ | +1 | +18.033826 | +18.034374 | +0.549 mDa |
| [M+Na]+ | +1 | +22.989221 | +22.989769 | +0.549 mDa |
| [M+K]+ | +1 | +38.963158 | +38.963706 | +0.549 mDa |
| [M-H2O+H]+ | +1 | −17.003288 | −17.002740 | +0.549 mDa |
| [M-2H2O+H]+ | +1 | −35.013853 | −35.013304 | +0.549 mDa |
| [2M+H]+ (n = 2) | +1 | +1.007276 | ||
| [M-H]- | −1 | −1.007276 | −1.007825 | −0.549 mDa |
| [M-H2O-H]- | −1 | −19.017841 | −19.018390 | −0.549 mDa |
| [M+Cl]- (³⁵Cl) | −1 | +34.969401 | +34.968853 | −0.549 mDa |
| [M+CH2O2-H]- (= [M+HCOO]-) | −1 | +44.998203 | +44.997654 | −0.549 mDa |
Inter-adduct deltas for the balance check: Na−H = 21.981944; K−H = 37.955881; K−Na = 15.973937; NH4−H = 17.026549; H2O = 18.010565; 2 H2O = 36.021129; [M+Cl]- − [M−H]- = 35.976678; [M+CH2O2−H]- − [M−H]- = 46.005479.
Electron-mass error: 0.549 mDa is 3.5 ppm at m/z 157, 1.6 ppm at 348 (test median), 0.47 ppm at 1,159 (test maximum). Kind & Fiehn 2010 report "a mass error of up to 3 ppm … if the electron mass is not included" — enough to push low-mass candidates out of a 1-mDa / 5-ppm window. Sign errors are the other classic: mzmine issue #1350 (3.4.27, opened 2023-05-25) reports the formula-prediction module returning 443.23603 for m/z 442.22875 under "[M-H]-", i.e. the [M+H]+ arithmetic applied to a negative ion (a 2.0146 Da miss). matchms stores shifts with the electron included (its "[M]-" row carries 0.00054857990924 explicitly). Several Kaggle write-ups say they use "precise atomic weights" without saying whether the electron is included — unverified; check any borrowed constant against the table above.
7. Forced analogy: stellar ionization balance → "adduct balance"
The analogy stated precisely. In a stellar atmosphere one element appears as Fe I, Fe II, Fe III lines; the ratio is fixed by the Saha equation (temperature, electron pressure) and the spectroscopist uses the ratio to diagnose the atmosphere, while the wavelengths of the lines of each ionization stage are fixed by atomic physics and serve to identify the element regardless of which stage dominates. Map: molecule ↔ element; [M+H]+, [M+Na]+, [M+K]+, [M+NH4]+ ↔ ionization stages; source conditions (Na+/K+ contamination, solvent, pH, temperature) ↔ T and P_e; the precursor m/z of each stage ↔ line wavelengths; adduct abundance ratios ↔ ionization-balance line ratios.
Derived rule (the wavelength half of the analogy). The hidden test gives 1–16 spectra per molecule_id (median 3). For each spectrum i with label a_i and precursor m/z p_i, compute the implied neutral mass M_i = p_i − shift(a_i) (singly charged; use n = 2 if a dimer label ever appears). Then:
- Consensus: M* = median(M_i). Flag any spectrum with |M_i − M*| > max(5 mDa, 10 ppm).
- For a flagged spectrum, search over the 10 declared shifts plus the ISF shifts (−H2O, −2H2O applied on top of any adduct) for an alternative label that brings it within tolerance of M*; if exactly one exists, that is the corrected label (and the corrected neutral mass stays M*).
- If a molecule_id has only one spectrum, no balance is possible; fall back to trusting the label but widen the candidate search to the "isobaric twins" listed in the Gotchas (e.g. candidate neutral = p − 1.007276 and p − 22.989221 if the molecule is O-rich).
- Use M* (not each spectrum's own M_i) for the candidate window, and use the number of agreeing spectra as a confidence feature for the ranker.
Test against published mass-difference rules and data. On MassSpecGym, 5,330 molecules have both [M+H]+ and [M+Na]+ spectra; the median precursor difference is 21.982 Da versus the theoretical 21.981944; 93.0 % agree within 5 mDa and 99.8 % within 20 mDa. So on Orbitrap/QTOF library data the balance holds at the 5-mDa level for the vast majority, and the 7 % tail is where real label or calibration problems live — exactly the rows to flag. For [M-H2O+H]+ the rule is sharper: a molecule_id whose spectra sit at p and p + 18.0106 with labels [M-H2O+H]+ and [M+H]+ is self-consistent; if both are labelled [M+H]+ the rule says one label is wrong and the heavier one is M (water loss adds nothing).
Where the analogy holds, partially holds, and breaks.
- Holds: the "line positions" part. Adduct shifts are exact constants, so a set of spectra of one molecule is over-determined in neutral mass, just as the lines of Fe I and Fe II over-determine the element. This is what makes consensus and mislabel detection possible.
- Partially holds: "the ratio diagnoses the source". Across a batch run under identical source conditions, the [M+Na]+/[M+H]+ ratio is reproducible (Kruve 2013 shows Na+ adduct formation is "quantitative and reproducible if relative measurements are performed"), so a run-level Na+ level is a real nuisance variable. But the ratio for a given compound spans > 4 orders of magnitude with structure (SAFE scale), so a per-molecule ratio tells you about the molecule's chelating oxygens as much as about the source — a confound stars do not have.
- Breaks: ESI adducts are not a thermodynamic equilibrium of one species; Na+ and K+ are contaminants whose concentration is unknown and uncontrolled, droplet fission and charge-residue kinetics (not a Boltzmann population) set the ratio, and there is no Saha-like closed form to invert. More fundamentally, [M-H2O+H]+ is not an ionization stage of M — it is the protonated ion of a different neutral (M − H2O), chemically indistinguishable by mass from a genuine alkene analog; stars never emit lines of "iron minus one oxygen". And the "intensity" half of the analogy fails outright for identification: the relative abundance of adducts carries no information about which candidate is correct, only the positions do.
Second concrete idea from the analogy: stellar spectroscopists do not compare Fe II lines against an Fe I template. Likewise, library/similarity scoring for a [M+Na]+ test spectrum should use (a) [M+Na]+ reference spectra where they exist (3.3 % of MassSpecGym molecules are Na-only, 18 % have both), or (b) neutral-loss-space comparison (shift reference spectra by the precursor delta — the gnshx write-up reports exactly this recovered cross-adduct matches), and the ranker should receive "adduct = Na" as a feature so it learns to lean on mass/formula priors when the spectrum has 10 peaks instead of 21.
Gotchas / what could fool us
- Isobaric adduct/formula twins. [M+NH4]+ of M has the same m/z as [M'+H]+ of M' = M + NH3 (an amide/amine analog); [M+Cl]- ≡ [M'−H]- with M' = M + HCl (chlorinated NPs exist); [M+CH2O2−H]- ≡ [M'−H]- with M' = M + CH2O2; [M-H2O+H]+ ≡ [M'+H]+ of the dehydrated analog. These are exact coincidences — no mass accuracy resolves them. The adduct string is therefore load-bearing for the candidate window, and a mislabel yields a pool of real natural-product analogs that will score well and be wrong.
- Near-isobaric Na/H twin. Na − H = 21.981944 Da versus C2H−2 = 21.984350 Da: a difference of 2.4 mDa (4.8 ppm at m/z 500, 2.1 ppm at 1,159). "[M+Na]+ of A" and "[M+H]+ of B = A + C2 − 2H" fall inside any ±5–10 ppm window. If the test labels are trusted this is harmless; if a pipeline "tries all adducts" it doubles the pool with structurally plausible decoys. (K − H = 37.955881 vs C3H2 = 38.015650 is 60 mDa apart — safe.)
- Default-[M+H]+ bias is directional. Mislabels in public data are overwhelmingly "labelled [M+H]+, actually something else" (de Jonge 2024). Any train-side adduct statistic (e.g. "95 % of training rows are [M+H]+") overstates protonation; Schmid 2021 finds sodiated ≈ protonated in real LC-MS of extracts.
- Library adduct vocabulary ≠ test vocabulary.
[M+CH2O2-H]-/[M+FA-H]-/[M+HCOO]-and[M-H2O+H]+/[M+H-H2O]+are the same ions with different strings; the train set has 121 adduct strings (BRIEF). Normalise before any join or any mass lookup. - Cleaned benchmarks hide the problem. MassSpecGym's residuals are ~0 ppm because 3,726 + 8,694 + 7,291 + 41,049 rows were dropped and 376,859 adducts were derived from names; a model validated there has never seen a mislabelled adduct. The hidden test labels come from Enveda's pipeline, whose error rate is unknown.
- Sodiated spectra are information-poor (median 10 peaks, 38 % precursor-dominated, 9.8 % ≤ 2 peaks). Similarity scores against protonated references are not just lower — they are differently distributed, so a single global threshold mis-calibrates by adduct.
- Water loss is class-dependent and precursor-dependent. 10–15 % of [M+H]+ spectra of O1–O9 compounds show a −18.011 peak ≥ 5 %, vs 1–5 % for [M+Na]+; glycosides (O10+) lose sugars, not water. An MS/MS −18 peak is not evidence of in-source water loss, and its absence in a sodiated spectrum is not evidence against it.
- Electron mass and sign. 0.549 mDa per charge (3.5 ppm at m/z 157); mzmine 3.4.27 had a documented [M−H]- sign error in formula prediction. Borrowed constants must be verified against the table in §6.
- The "7.21 % inconsistent" number circulating in search summaries is not in the STRIKER text; do not cite it.
- Flow-injection pure compounds still fragment in-source. Chen 2023: terpenoids with < 1 % surviving parent ion. "Isolated pure compounds, no weird adducts" (Fiehn's caveat) does not mean "no [M-H2O+H]+ precursors" — the test vocabulary itself contains two water-loss labels.
Implications for the challenge
- Implement the adduct-balance consensus (§7) as a preprocessing pass over test molecule_ids: consensus neutral mass M*, per-spectrum flags at max(5 mDa, 10 ppm), single-alternative relabelling over the 10 shifts ± H2O/2 H2O. Report how many hidden-test spectra get flagged — this is a free data-quality probe via the public LB.
- Build the candidate window around M* with the exact shifts of §6 (electron mass included); never around a per-spectrum mass. Windows: ±5 ppm or ±2 mDa whichever is larger at the test mass range 157–1,159 Da; widen to the isobaric twin only for single-spectrum molecule_ids with [M+NH4]+, [M+Cl]-, [M+CH2O2-H]- or [M-H2O+H]+ labels.
- For every [M-H2O+H]+ / [M-2H2O+H]+ test spectrum also score candidates for the dehydrated neutral (M − 18.0106) with a penalty, and for every [M+H]+ spectrum of an O-rich formula consider M + 18.0106 if a sibling spectrum of the same molecule_id supports it. Keep the better-supported interpretation.
- Give the ranker explicit features: adduct one-hot, number of spectra agreeing with M*, number of peaks, precursor-dominance ratio. Train-time: oversample or re-weight [M+Na]+ / [M+K]+ / [M+NH4]+ rows (15.5 % of MassSpecGym, far less in GNPS-derived rows).
- For similarity-based channels, shift references into neutral-loss space (precursor-delta shift) so [M+Na]+ and [M-H2O+H]+ test spectra can match [M+H]+ references; prefer same-adduct references when they exist.
- Normalise adduct strings in train (121 variants) to the 10 test spellings before any join; derive
adductfromprecursor_mz+normalized_smileswith matchms logic and measure the train-side disagreement rate — it is the best available estimate of Enveda's own labelling error. - Do not validate adduct handling on MassSpecGym or any matchms-cleaned set; hold out train rows before cleaning, or inject the known failure modes (default-[M+H]+ label on Na rows, dehydrated-ion label swaps) into the validation set.
Open questions
- Actual adduct frequencies of the visible (7 strings) and hidden test sets, and of the enveda-180 timsTOF rows (measurable from train.parquet; needs pyarrow on this box or the Kaggle notebook).
- Enveda's adduct-assignment method for test labels (ion-identity networking? isotope/adduct grouping in MetaboScape? manual?) — determines the mislabel prior.
- Does Bruker's source (CaptiveSpray vs VIP-HESI, dry-gas temperature, isCID voltage) make [M-H2O+H]+ more or less prevalent than on the Orbitrap data behind Chen 2023? No timsTOF-specific ISF study was found.
- Per-adduct peak-count statistics on QTOF data (the 2,919 QTOF [M+Na]+ spectra with median 46 peaks look like a submitter artefact; needs stratification by library).
- Whether the hidden test contains any [2M+H]+ or doubly charged ions despite the 10-string vocabulary (the vocabulary says no; the 1,159 Da upper mass makes 2M unlikely).
Sources
- Bushuiev R. et al., "MassSpecGym: A benchmark for the discovery and identification of molecules", NeurIPS 2024 Datasets & Benchmarks; arXiv:2410.23326; supplement PDF (Table 2 cleaning report, §2.3) https://proceedings.neurips.cc/paper_files/paper/2024/file/c6c31413d5c53b7d1c343c1498734b0f-Supplemental-Datasets_and_Benchmarks_Track.pdf ; data https://huggingface.co/datasets/roman-bushuiev/MassSpecGym (MassSpecGym.tsv, 231,104 rows, analysed here 2026-10-07).
- de Jonge N.F., Hecht H., Strobel M., Wang M., van der Hooft J.J.J., Huber F., "Reproducible MS/MS library cleaning pipeline in matchms", J Cheminform 16:88 (2024), doi:10.1186/s13321-024-00878-1, PMC11285329.
- Karam A. et al., "STRIKER: a spectral metadata repairing tool for expanding the comprehensiveness of spectral libraries", J Cheminform 18 (2026), doi:10.1186/s13321-026-01150-4, PMC12918191.
- Schmid R. et al., "Ion identity molecular networking for mass spectrometry-based metabolomics in the GNPS environment", Nat Commun 12:3832 (2021), doi:10.1038/s41467-021-23953-9, PMC8219731.
- Bittremieux W. et al., "The critical role that spectral libraries play in capturing the metabolomics community knowledge", Metabolomics (2022/2023), PMC10284100 (text statements only; Fig. 3 numbers not extracted).
- Brungs C., Schmid R., Heuckeroth S. et al., "MSnLib: efficient generation of open multi-stage fragmentation mass spectral libraries", Nat Methods (2025), doi:10.1038/s41592-025-02813-0, PMC12510872.
- Chen L. et al., "Widespread occurrence of in-source fragmentation in the analysis of natural compounds by LC-ESI-MS", Rapid Commun Mass Spectrom (2023), doi:10.1002/rcm.9519 (abstract via Europe PMC).
- Uritboonthai W., Hoang L., Aisporna A., Giera M., Siuzdak G., "The Dark Metabolome/Lipidome and In-Source Fragmentation", Anal Sci Adv 6:e70012 (2025), doi:10.1002/ansa.70012, PMC12077755.
- Guo J., Huan T., "ISFrag: De Novo Recognition of In-Source Fragments for LC-MS Data", Anal Chem (2021), doi:10.1021/acs.analchem.1c01644 (abstract).
- Xue J., Domingo-Almenara X., … Siuzdak G., "Enhanced in-source fragmentation annotation enables novel DIA and autonomous METLIN molecular identification", Anal Chem 92:6051 (2020), doi:10.1021/acs.analchem.0c00409, PMC8966047 (abstract).
- Domingo-Almenara X. et al., "Autonomous METLIN-Guided In-source Fragment Annotation for Untargeted Metabolomics", Anal Chem (2019), doi:10.1021/acs.analchem.8b03126, PMC6637741 (abstract).
- Xu Y.-F., Lu W., Rabinowitz J.D., "Avoiding misannotation of in-source fragmentation products as cellular metabolites in LC-MS-based metabolomics", Anal Chem 87:2273 (2015), doi:10.1021/ac504118y, PMC4354698 (abstract).
- Pedišius V. et al., "Detecting and Grouping In-Source Fragments with Low-Energy Stepped HCD", Metabolites 16:42 (2026), doi:10.3390/metabo16010042, PMC12843812.
- Kruve A., Kaupmees K., Liigand J., Oss M., Leito I., "Sodium adduct formation efficiency in ESI source", J Mass Spectrom 48:695–702 (2013), doi:10.1002/jms.3218 (abstract).
- Sugimura N., Furuya A., Yatsu T., Shibue T., "Prediction of adducts on positive mode ESI-MS: proton/sodium selectivity in methanol solutions", Eur J Mass Spectrom 21 (2015), doi:10.1255/ejms.1389 (abstract).
- Damont A. et al., "Exploring the Fragmentation of Sodiated Species Involving Covalent-Bond Cleavages for Metabolite Characterization", Rapid Commun Mass Spectrom 39:e10133 (2025), doi:10.1002/rcm.10133 (abstract).
- Kind T., Fiehn O., "Advances in structure elucidation of small molecules using mass spectrometry", Bioanal Rev 2:23–60 (2010), doi:10.1007/s12566-010-0015-9, PMC3015162 (electron-mass statement).
- Fiehn Lab MS Adduct Calculator, https://fiehnlab.ucdavis.edu/staff/kind/metabolomics/ms-adduct-calculator (shift values, electron mass note).
- matchms known adducts table, https://raw.githubusercontent.com/matchms/matchms/master/matchms/data/known_adducts_table.csv.
- mzmine issue #1350 "Formula prediction module fails to calculate correct adduct mass from m/z", https://github.com/mzmine/mzmine/issues/1350.
- Kaggle write-ups (Kaggle pages are JS shells; facts taken from GitHub mirrors): bobownYAO/Enveda-CASMI-2026 README (10-adduct list); chiparon/enveda-casmi26 README ("10 competition adduct types", 20 ppm window); gnshx/Enveda-CASMI-2026 README (cross-adduct precursor-delta shifting, public LB 0.420); ibnmarzuk/casmi26-molecule-id README (15 ppm / 0.003 Da floor, unknown adducts halt); leesirleesirlee-star README (±10 ppm pool, LB 0.418 vs rank-1 0.471); jagjeet-singh-23/kaggle-competitions README (LB 0.213, leader 0.425, visible-test leakage 0.9975).
- Monoisotopic masses: CIAAW/CODATA values as used in the Fiehn calculator and matchms (H 1.00782503, Na 22.98976928, K 38.96370649, Cl 34.96885268, e⁻ 0.00054858).