Skip to main content

Vendor-reader parity matrix

A cross-vendor view of which fields each reader actually populates versus which are hardcoded to None/a placeholder. Each vendor's own doc page (see the Vendors section) covers its format in depth; this page exists so a gap - like a field being None for every spectrum of one vendor while every other vendor populates it - doesn't sit unnoticed the way OpenWRaw#8 did before this table existed.

Last verified: 2026-07-25 (chromatograms and FAIMS rows, by grepping iter_chromatograms/faims_cv across all six vendor crates; all other rows last verified 2026-07-18 (Shimadzu column) / 2026-07-15 (everything else) - see git history for those verifications).

Legend: yes = populated from real decoded data · partial = populated in some cases, see note · no = hardcoded None/placeholder, see note · N/A = the field doesn't apply to this vendor's instrument class.

FieldThermo
(OpenTFRaw)
Bruker
(OpenTimsTDF)
Waters
(OpenWRaw)
Agilent
(OpenARaw)
SCIEX
(OpenSXRaw)
Shimadzu
(OpenSZRaw)
Precursor target/selected m/zyesyes (diaPASEF: target = selected = isolation m/z)no (#8)partial: no selected_mz, format doesn't carry itpartial: DDE-cycle heuristic, "unknown" edge casepartial: .qgd MRM has real target/selected m/z; .lcd QTOF MS2 has none decoded (#1002998 DDA stream undecoded); .lcd IT-TOF has no precursor concept at all
Precursor chargeyespartial: PASEF yes, diaPASEF no (DIA has no single charge)no (no precursor at all, #8)nonono
Precursor CE (NCE vs eV distinguished)yesyes, always eV (correct for the format - ce_is_nce fixed false)N/A (no precursor)partial: value real, NCE/eV never distinguishednono
Polarityyesyesyesno: documented unrecoverable from formatnono: documented unrecoverable from format (no polarity bit found in any of the three on-disk variants)
Filter string / equivalentyesN/AN/AN/AN/AN/A
Raw ion mobility (native units)N/A (no IMS)yes (scalar + per-peak)partial: per-peak drift_time_ms populated for IMS scans, scalar inv_mobility left NoneN/AN/AN/A (no IMS)
Calibrated CCSN/Ano (#14)no (#10)N/AN/AN/A
Chromatograms (iter_chromatograms)yesno overrideyes (closed #9)no overrideno overridepartial: LC detector (UV/RID) channels only, only confirmed populated on IT-TOF .lcd files; PDA 3D Raw Data/LSS Raw Data still not decoded - OpenSZRaw#2
Instrument model / CV resolutionyes, real lookup tableyes, real lookup table (5 of 10 entries had wrong PSI-MS accessions, fixed 2026-07-15)yes for models with a unique CV term; 3 Synapt variants fall back to the generic term rather than guess between HDMS/MS (#11)yes, real lookup + documented fallbackno: hardcoded placeholder, investigated and documented as currently unresolvable from the formatpartial: .lcd IT-TOF and QTOF each resolve a real specific PSI-MS instrument term; .qgd falls back to the generic "Shimadzu instrument model" term - no per-file model string found decoded anywhere in the corpus
Acquisition start timestampyesyes (RFC 3339-validated)yes (format bug fixed 2026-07-15 - previously emitted "14-Jan-2021 16:20:52", not valid RFC 3339)yesyes (OLE SummaryInformation stream, graceful None fallback)no
Ion injection timeyesyesnononono
FAIMS compensation voltageyes: wired into to_msc_record (closed #27, shipped in 1.3.4)N/AN/AN/AN/AN/A (Shimadzu instruments have no FAIMS interface)

Shared-layer gaps (affect every vendor equally)

These aren't per-vendor rows above because they're bugs in openmassspec-core's writer, not in any one reader's decode path.

  • Chromatograms had no path to output at all, regardless of vendor, until write_mzml/write_indexed_mzml were wired to call iter_chromatograms (OpenMassSpecCore#1, fixed in 1.2.0). Thermo, Waters, and Shimadzu now override iter_chromatograms with real data (see the row above); Bruker, Agilent, and SCIEX still don't.
  • start_timestamp was decoded by every vendor but silently dropped by the writer (OpenMassSpecCore#2, fixed in 1.2.0).

Other known gaps not captured by the table above

  • OpenTimsTDF#13 - PRM-PASEF frames (msms_type=10) are decoded but skipped in the mzML projection entirely (not a field-level gap - those spectra never appear in output at all).
  • OpenSXRaw#7 - the ms_level flag is wrong for SWATH/DDA-cycled acquisitions.
  • OpenTFRaw's PrecursorInfo.intensity is hardcoded None in the to_msc_record conversion (crates/opentfraw/src/mzml.rs) even though every other precursor field is populated from real data. Not yet tracked by an issue.

Keeping this current

Update this table (and the two sections above) whenever a linked issue closes, a new gap is found, or a vendor crate gains a feature this table says it lacks. openmassspec-core changes that affect every vendor at once (the "shared-layer gaps" section) are the highest-leverage places to check first.