Skip to main content

Known limitations

This page lists the deliberate, documented gaps in the current reader (crates/openszraw) - things investigated and found unrecoverable (or not yet decoded) from the current understanding of the format, not things silently guessed or fabricated. See the sibling readers' equivalent pages (e.g. OpenSXRaw's legacy-TOF calibration gap) for the precedent this follows.

IT-TOF (.lcd TTFL): m/z calibration

The reconstructed index axis from the run-length-encoded payload (see LC-MS IT-TOF) is a raw digitizer/TOF time-bin index. The reader converts it to physical m/z using a per-file calibration parsed from the file's own TTFL Tuning/Tuning Result NN stream: a reference calibrant mass ladder (identified as sodium formate cluster ions, a standard public ESI calibration solution) paired with measured flight times, fit to the standard TOF law time = a*sqrt(mz) + b by least squares. This fits to a residual at the level of floating-point round-trip noise across every IT-TOF file in the local corpus - see the repository's docs/format/03-lcd-ttfl-msdata.md section 3c for the full derivation and evidence.

If a file has no readable calibration table, the reader falls back to the raw, uncalibrated index rather than fabricate one - this has not been observed in the local corpus.

The reconstructed index can reach values well past what might seem like a reasonable upper bound for a time-bin axis (into the hundreds of thousands in some real corpus scans); under calibration this maps to implausibly large m/z, reflecting those positions being electronic noise rather than real ions. The reader does not clamp, filter, or validate the index against any assumed range - that is downstream peak-picking's job.

IT-TOF (.lcd TTFL): per-channel polarity/MS-level is not resolved

Each retention-time entry's Data Index carries 4 interleaved channel subsets. One 64-byte scan-header field is a constant that differs by channel in a way that looks like a coarse mode/polarity flag, but there is no confirmed mapping from that field (or from the channel index itself) to a specific polarity or MS level, despite dataset naming (..._pos-neg_NN.lcd) implying the run alternates ionization polarity across channels.

The reader leaves polarity as None and ms_level as 1 for every IT-TOF spectrum, rather than assign a channel-to-polarity/level mapping it cannot back with decoded evidence.

QTOF (.lcd QTFL): MS2 precursor m/z is not decoded

Centroid Index's segment/event-ID field is a real per-acquisition- cycle counter (MS1 survey scan at event_id == 1, MS2 product-ion scans at event_id > 1), consistent with DDA acquisition selecting a variable number of precursors per cycle. The real per-scan precursor m/z for those MS2 events lives in the separate QTFL RawData/DDA stream, which has not been decoded.

The reader classifies ms_level from event_id since that pattern is well-supported by corpus evidence, but populates MS2 spectra's PrecursorInfo with only a precursor_native_id reference to the most recent MS1 scan, leaving target_mz/selected_mz as None rather than fabricate a value.

GC-MS (.qgd): polarity and exact instrument model are not resolved

No polarity bit has been found in the 32-byte MS Raw Data scan header or the Spectrum Index stream, so .qgd polarity is always None. GC-EI-MS is conventionally positive-ion, but that's a domain convention, not a decoded field, so it's left unpopulated rather than assumed.

No PSI-MS CV term dedicated to the .qgd file format itself exists (unlike .lcd, which has MS:1003009 "Shimadzu Biotech LCD format"), so source_file_format falls back to the generic MS:1000560 "mass spectrometer file format" node. instrument likewise stays at the generic MS:1000124 "Shimadzu instrument model" for all .qgd files, since no per-file instrument-model string has been found decoded anywhere in the corpus.

PDA / chromatogram streams: encoding not decoded, out of scope

.lcd files' chromatogram (LSS Raw Data) and photodiode-array UV (PDA 3D Raw Data) streams use a segment-based encoding, unrelated to the MS run-length scheme above (confirmed by attempting to decode PDA segments with the same RLE decoder used for IT-TOF MS data - it does not decode cleanly). The segment payload appears to be a bit-packed or variable-length delta encoding; plain LEB128 and a fixed-width float interpretation were both tried and ruled out. This encoding is not decoded and is out of scope for the current reader.

See docs/format/06-known-limitations.md and docs/format/04-lcd-chromatogram-pda.md in the repository for the full byte-level record behind each of these.