Skip to main content

Error and Instrument Logs

Error Log, Instrument Log

29. Error Log​

Array of error entries located at RunHeader.error_log_addr. The number of entries is given by SampleInfo.error_log_length.

29.1 Error Entry​

OrderTypeFieldDescription
1Float32timeRetention time (minutes)
2PascalStringWin32messageError message text

30. Instrument Log​

The instrument status log: temperatures, pressures, voltages, and other instrument operating values, written every few seconds during acquisition. It is a time series, not one record per scan. The number of records is SampleInfo.inst_log_length.

30.1 Stream Layout​

The status log belongs to the MS controller's RunHeader and is laid out directly after it:

OrderTypeDescription
1InstIDInstrument identification (section 11), starting at the end of the RunHeader
2GenericDataHeaderField layout of the records; ends exactly at RunHeader.inst_log_addr
3StatusLogRecord[n]Starts at RunHeader.inst_log_addr; ends exactly at RunHeader.error_log_addr

RunHeader.inst_log_addr addresses the first record, not the header. The header is reached by reading the InstID block that follows the RunHeader. In v57-v63 files the addresses come from the 32-bit SampleInfo fields; in v64+ from the 64-bit RunHeader fields. On all 291 corpus files (v63, v64, v66) the header ends exactly at inst_log_addr and the records end exactly at error_log_addr. No v57, v60 or v62 file is in the corpus.

30.2 StatusLogRecord​

OrderTypeFieldDescription
1Float32timeTime the record was written, in minutes (the scan start-time scale)
2GenericRecordvaluesOne value per GenericDataHeader field

30.3 Time Axis​

Within one acquisition the record times never decrease. Some files also hold records on another clock, where the time drops back towards zero partway through the log:

  • Orbitrap Fusion and Fusion Lumos (21 corpus files): a block of records at the start of the log, with times from an earlier clock (for example 60-72 minutes), followed by the acquisition's records starting near 0. The block's values match an idle instrument.
  • TSQ Quantum (PXD020246): one trailing record with time 0.

OpenTFRaw takes the longest run of records whose times never decrease as the acquisition's time axis (RawFileReader::inst_log_time_axis). A scan sees the last record on that axis written at or before its start time; scans before the first record have no status-log values. The other records stay in inst_log.

30.4 Labels​

Labels and field counts depend on the instrument family and its software version: from 50 fields (Q Exactive) to 251 (Orbitrap Eclipse). Newer Tribrid and TSQ Altis software appends the unit in braces (Spray Voltage {V}) where older software has no unit (Spray Voltage). Some labels name a section rather than a value (type Gap, for example ==== FAIMS Device: ====:) and have no value in the records.

30.5 Decode Failures​

If the header is not found after the InstID block, or either boundary check fails, the status log is not decoded. The file still opens; the reason is in RawFileReader::status_log_error, Python RawFile.status_log_error, and the mzML run-level opentfraw.status_log_error userParam, and Python status_log() raises ValueError.

Source: the record layout (a Float32 time followed by the header's fields) and the InstID-then-header order follow the Finnigan Perl module by Gene Selkov (CPAN, Finnigan-0.0206d: lib/Finnigan/InstrumentLogRecord.pm, bin/uf-log). The time unit, boundaries and time-axis behaviour were measured on the corpus.