mzML Chromatogram Viewer
Open mzML and mzXML mass-spectrometry runs inside Visual Studio Code.
- Chromatogram. Total ion current or base peak, by MS level. Click to pick a scan,
drag to zoom, double-click to reset.
- Extracted ion chromatograms. Type an m/z and a tolerance in ppm or Da. Several at once,
with a legend.
- Spectrum. The picked scan, top peaks labelled, with a peak list.
- Scan table. Every scan: level, time, TIC, base peak m/z, precursor m/z, charge,
window. Half a million rows scroll.
- File report. Did the conversion work? Instrument, software, scan counts by level,
polarity, time range, profile or centroid, whether peak picking really reached every
level, whether the file's index was right, how many scans cannot be decoded.
Price
Free. No paid tier, no key, no account. Every command works for everyone.
What it is for, and what it is not
It is for looking: triage after a conversion, a quick check of a run, pulling one ion. It
does not process, integrate, quantify or report, and nothing it shows should enter a
regulated submission. It never writes to a data file.
JCAMP-DX is out of scope. The only JavaScript reader for it is licensed
CC-BY-NC-SA-4.0, terms this extension cannot meet. Vendor formats (.raw, .wiff,
.d) are out of scope too: convert with MSConvert first.
Large files
Nothing the size of the data is ever loaded. A file is indexed — from its own offset
table when that is present and correct, by scanning when it is not — and scans are
read one at a time. A 9 GB run opens with about 200 MB of memory. Whatever the number of
scans, the chart on screen is at most mzml.chromatogramPoints points, reduced by
min/max bucketing so that a one-scan spike survives.
A wrong offset table is common: it happens whenever a file is edited, joined or cut short
after conversion. It is detected and ignored, and the file report says so.
Gzip
Plain gzip cannot be read at random. mzml.gzipPolicy decides what happens:
| Value |
Behaviour |
stream (default) |
Read front to back. Showing a scan inflates the file up to that scan. The viewer says so. |
decompressToCache |
Inflate once into workspace storage and read that copy. |
refuse |
Decline, and say why. |
Things it tells you rather than hides
- A truncated file: every scan before the break is shown, with the byte where parsing stopped.
- A scan that cannot be decoded: named, counted in the report, and the others still work.
- MS-Numpress and other compressions this build does not decode: named, skipped, not fatal.
- A file with chromatograms and no spectra (SRM, MRM): its stored chromatograms are drawn.
- A header that says "peak picking" over spectra that are still profile.
Commands
mzML: Open viewer · mzML: Extract ion chromatogram at m/z… · mzML: Clear extracted chromatograms · mzML: Show scan table · mzML: Go to scan number… · mzML: Export current trace as CSV · mzML: Export current spectrum as CSV · mzML: Rebuild scan index · mzML: File report
Exports are full resolution and in real units, not the downsampled picture.
Settings
mzml.xicToleranceUnit, mzml.xicTolerance, mzml.chromatogramPoints,
mzml.msLevelFilter, mzml.maxInMemoryBytes, mzml.indexCacheEnabled,
mzml.gzipPolicy.
Where it runs
In the extension host: under Remote-SSH that is the machine where the data is. Works
offline. No server, no account, no telemetry. No WebGL: charts are SVG, so it works over
a remote desktop with no GPU. The file is read without an XML parser, so external
entities and entity expansion cannot happen.