Skip to content

Spectral Flow Cytometry

A conventional cytometer puts a bandpass filter in front of each detector and collects a narrow slice of each fluorochrome’s emission. A spectral instrument does the opposite. It records the full emission across every detector and then solves for how much of each fluorochrome was present.

That solve is called unmixing, and it happens before the file is written.

The file leaving a spectral instrument carries one column per fluorochrome, not one column per detector. It has already been unmixed, so there is no spillover matrix to apply and no compensation step to run. A pipeline written for a conventional panel starts at compensation and a spectral one starts at the transform.

The gain is not only convenience. Unmixing uses the whole spectrum rather than one slice, so it separates dyes whose emission peaks sit close together, which is what allows a 35 marker panel to exist at all.

There is a trap here, and it is the kind that produces a wrong answer rather than an error.

The usual way to pick fluorescence channels is to take every channel that carries a marker name, which is the $PnS keyword. That is correct for a conventional panel. On this spectral panel the viability dye has no marker name, so the usual selector drops it, and the viability channel is the one the first gate needs.

# Wrong here: a channel with no $PnS is skipped, and viability has none.
FluorescenceChannels(frame)
# Right: keep every channel that is not scatter and not time.
SpectralChannels(frame)

The failure is silent. The transform runs, the gating runs, and the live gate is applied to an untransformed channel. Nothing raises an error and every number afterwards is wrong.

The deposit belongs to a study of MAIT cells in COVID-19, and it publishes ten claims that can be checked against its own flow data. Reanalysing the deposited files from scratch, eight reproduce and two reproduce partly.

Claim Result
CD161 high falls as severity rises reproduced, rho -0.236, p 0.031, n 83
Healthy females carry more CD161 high than healthy males reproduced, female median 30.06 against male 6.27
Females lose more CD161 high than males reproduced, slope -5.070 against -1.310
CD161 high is higher in females before seroconversion reproduced, 10.27 against 6.86
CD8 memory is higher in males after seroconversion reproduced, 51.39 against 61.41, p 0.042
Naive CD8 T cells do not change with severity reproduced, rho 0.014, p 0.902
The female CD161 advantage is absent early and middle partly reproduced
Male memory predominance holds at every time point partly reproduced

The two partial results are the honest ones to look at. Both are claims that an effect is significant at some time points and not others, and in the reanalysis the pattern of significance does not fall exactly where the paper puts it. The direction is right in every window; the p values move across the 0.05 line in different places.

That is what usually happens when a claim depends on a threshold applied to a subgroup. It is not a refutation, and it is not a clean reproduction either, and a report that rounds it to one or the other is throwing away the interesting part.

None of this is checkable without the raw files. A paper reports the frequency of a population after a gating strategy the reader cannot see, and the only way to ask whether the strategy carries the conclusion is to run a different one on the same events.

That is the argument for depositing FCS files, and it is the same argument the harmonisation page makes from the other end: an analysis nobody can rerun is a claim, not a result.