Skip to main content

_CHROMS.INF

Binary instrument channel descriptor file. Present when LC/pump/analog channels are recorded alongside the mass spectrometry data (typically on LC-MS systems). Absent in direct-infusion or pure-MS datasets.

Status: Fully Decoded​

Observed in: PXD068881 (CtpA, SYNAPT G2-Si with LC), PXD075602 (DHPR_11257-1.raw, Xevo G2-XS with LC), MTBLS701 (LCT Premier), and MSV000083877 (Xevo G2 QTof, one fluorescence channel).

File Layout​

[32-byte preamble]
[48-byte field descriptor 0: Flags]
[48-byte field descriptor 1: Description]
[85-byte channel record 0]
[85-byte channel record 1]
...

File size = 128 + N_channels * 85. The two field descriptors are inside the 128-byte header. They are not additional channel records after the header. A valid one-channel file is therefore 213 bytes, not at least 298 bytes.

Validated from native public bytes:

  • MSV000083877/ROF_181101_04_IgG.raw: 213 bytes, one fluorescence channel.
  • PSU Data Commons/kt130808_WAS_0179.raw: 213 bytes, one column temperature channel.
  • MTBLS701/1506_SZ_SZ_E01_neg.raw: 468 bytes, four channels.
  • PXD068881/20220517_CtpA_1076_2h_1.raw: 723 bytes, seven channels.
  • PXD075602/DHPR_11257-1.raw: 553 bytes, five channels.

Preamble and Field Descriptors (128 bytes total)​

OffsetTypeValueDescription
0x00u16128Offset of the first channel record
0x02u161Format version
0x04u1685Channel record size in bytes
0x06u162Number of 48-byte field descriptors inside the header
0x08-0x1FbyteszeroesPreamble padding
0x20-0x4Fbytes-Flags descriptor
0x50-0x7Fbytes-Description descriptor

Each field descriptor contains a sequence number (u16 at relative offset 0), encoding code (u16 at 2), record-field offset (u16 at 4), null-padded name (bytes 6..31), and field width (u16 at 32). Observed descriptors are:

FieldSequenceEncoding codeOffset within channel recordWidth
Flags1204
Description25481

Channel Records (85 bytes each)​

Channel records begin at byte 128. Channel record 0 corresponds to _CHRO001.DAT, record 1 to _CHRO002.DAT, and so on.

Each record describes one recorded chromatographic channel.

OffsetTypeConfirmedDescription
0x00u32YesSource device type (4 = BSM pump, 1 = column/sample device)
0x04bytesYesNull-padded ASCII channel name (Windows-1252; may start with 0xB5 = µ)
...strYes$CC$ spec string (null-terminated, at end of record)

The channel name and $CC$ string are packed into bytes 0x04-0x54 in sequence, separated by a null byte between them.

$CC$ Spec String Format​

$CC$,<scale_f>,<type_code>,<lo_limit>,<hi_limit>,<units>
  • scale_f = float scale factor (e.g. 1.0 or 0.1)
  • type_code = integer (always 3 in observed data)
  • lo_limit = lower display limit (float)
  • hi_limit = upper display limit (float)
  • units = ASCII units string (e.g. psi, %, uL/min, % Power, C)

Observed Channels (PXD068881 CtpA.raw - 7 channel records)​

Recordsource_typeChannel Nameunits
04 (BSM)BSM System Pressurepsi
14 (BSM)BSM Composition A%
24 (BSM)BSM Composition B%
34 (BSM)BSM Measured Flow Rate AµL/min
44 (BSM)BSM Measured Flow Rate BµL/min
51 (col/samp)(1) Peltier Engine Power% Power
61 (col/samp)(1) Chamber Temp°C

Flow and Temperature Channels (PXD075602 DHPR_11257-1.raw)​

The following three channels are records 2..4 of the five-channel file.

Recordsource_typeChannel Nameunits
24 (BSM)BSM Measured Flow Rate BµL/min
34 (BSM)Column Temperature°C
44 (BSM)Room Temp°C

Note: BSM channel names are prefixed with 0xB5 (µ in Windows-1252) in the raw bytes. The lo/hi fields in $CC$ are 0,0 in all observed samples (limits may not be stored here). Units encoding is Windows-1252: ° is 0xB0, µ is 0xB5.

source_type is kept on raw::chroms::ChromChannel and exposed by the Python RawReader.channels API (with binding coverage), so callers can already filter or label BSM-pump vs. column/sample channels themselves. It is deliberately not copied into openmassspec_core::ChromatogramRecord: that model has no source-device field, and every channel already carries a human-readable name that spells out its device ("BSM ..." vs. "(1) ..."), so a numeric field would duplicate information the mzML consumer can already get from the name. Inventing a CV annotation or changing chromatogram selection based on the numeric device class would still need a separately established PSI-MS mapping, which the corpus doesn't motivate (Sigilweaver/OpenWRaw#24).

Companion Chromatogram Files​

For each channel record in _CHROMS.INF there is a corresponding _CHROnnn.DAT file numbered 1-based with 3-digit zero-padding (e.g., _CHRO001.DAT for record 0). The .DAT files contain decoded pairs of retention time and channel value; see 08 - _CHROnnn.DAT.

Reference Sources​

  • Empirical hex analysis using re/src/analysis/inspect.py
  • Corpus samples:
    • PXD068881/20220517_CtpA_1076_2h_1.raw (7 channels, 723 bytes)
    • PXD075602/DHPR_11257-1.raw (5 channels, 553 bytes)

The one-channel public sources and the corrected descriptor interpretation are recorded in ATTRIBUTION.md.