Today I'm going to share a tip for how to get better unmixing using single-stained cell controls. When you use cells to identify the spectra for compensation or unmixing in flow cytometry, it's important to remember that these are inherently multi-color controls. Cells contain autofluorescence, and usually we're dealing with either multiple autofluorescence signatures (e.g., tissue samples) or at least different intensities (e.g., PBMCs). This autofluorescence can intrude into our selection of the events we use for determining the fluorescently conjugated antibody spectra, resulting in an incorrect spectral signature and thus inaccuracies in the unmixing. Isolating a single fluorescent signature in one dimensional space (a histogram) is often nearly impossible. We can get cleaner or dirtier results, as detailed in this post.
What we can do to improve the situation is use multiple channels (parameters) in our selection of the events that define our spectra. On the ID7000 and the S8, we can isolate the spectrum using secondary gates on parts of the spectrum, refining it to remove contaminating AF signatures. On the Aurora, we don’t have this option currently in SpectroFlo software, although hopefully this may get added as an advanced feature. How can we deal with this problem? We can use the same approach that formed the basis for the autofluorescence extraction wizard in SpectroFlo: Examine the data in multi-dimensional space, isolated the events we want, and use specifically those events to define our spectrum.
I'm going to show a workflow for this, using examples from data prepared for the Babraham Spectral Symposium. If you'd like, you should be able to access those data with this link. This is not intended to be good data. This is a set of murine samples stained with a large combination of markers and fluorophores in a way that is intended to produce challenging unmixing using cell controls. There are many cases where the cells are rare and in locations where there is a lot of autofluorescence (more signal than noise). That's perfect for today's example.
This data also multiple tissue sources, which can be used for exploring autofluorescence extraction.
Also, I'm not trying to claim invention on this. I know other people use similar approaches for spectral clean up (let me know if you'd like to be mentioned), and variations on this technique have been used in conventional flow for compensation as well.
Right, let's look at some ugly data.
First, let's have a look at what the data looks like with low effort unmixing using cell controls. I'm going to focus on XCR1-BV650. XCR1 is expressed mainly by type 1 conventional dendritic cells (cDC1), which aren't very common, and there's a spike of autofluorescence in the second half of the violet laser array on the Aurora with mouse samples. Here's the gating strategy on a sample of lung cells.
Using these selected CD45+ viable cells, we can see some wonky shapes if we look at XCR1-BV650 versus other channels. Unmixing errors are typically easiest to spot in areas where you get spillover from the fluorophore, so similar wavelengths can be a good starting point.
Clearly, we've got some problems. Not just with BV650, either, as the Spark NIR685 is skewed, as is the BV605, and the fuzz below the axis surrounding the negative indicates this sort of thing is happening in several other channels.
Why is this happening?
If we go through the unmixing process, we can see that scatter and positive gates are reasonable. In the case of XCR1, we can't reduce the scatter gate to just the cleaner lymphocyte area because the cDC1s are mostly a bit larger.
Using this gate, though, gives us a spectrum that looks like this:
There are two traces here, only one of which is really our BV650 signature. The other is the macrophage autofluorescence.
This is actually harder to see on the normalized trace, which looks like a decently sharp fluorophore peak (not quite right for BV650, but close).
Now, let's look at how to clean this up. For this, we're going to be working with the BV650 reference control in the raw space.
First, we need to determine where the autofluorescence is. If you're using the autofluorescence explorer tool, you may already know which channels can be used to isolate it. Alternatively, just have a look at the spectrum where you can see the dual traces. If we pick an area where the two traces diverge, we'll be able to separate out the different components. In this case, we could take something in the middle of the UV, V5-V9, or basically anything across the blue laser. Plot that against the peak channel for the fluorophore.
Here I've selected V7, which is a near-universal channel for detecting autofluorescence.
We can see the real XCR1-BV650 signal going into V11, with the spike of autofluorescence up the middle. Not all channels work well for this. If we'd picked one where the curves are closer, it could look like this:
Now, we just draw gates around the clean events. If there are enough events, you can just gate on the positives, as I've done with "Bright +ve only". For this to work in SpectroFlo, though, you'll need at least 500, and chances are you're doing this because you've got rare cells. So, the other option is to just gate out the autofluorescence spike, including the clean negative (AF-excluded). Right-click and export those events as a new FCS file.
---------------------------------
Note: you can also do this in on the unmixed reference control. This can make it easier to know which are your true positives (they'll be along the correspondingly named axis), but a bit harder to identify the autofluorescence. So, I recommend using a channel that doesn't receive much AF (e.g., BUV395) as the comparator for gating. In this case, export the raw data because that's what you'll need for unmixing.
---------------------------------
We can also create a matching universal negative using the unstained cells, excluding the autofluorescence using the same gate. This isn't necessary if you're exporting the clean negative in the same file as the clean positive (AF-excluded above), but it doesn't hurt as long as you keep the gate the same.
To use this negative, we export it, create a new universal negative in the reference group, and then import the clean-up negative.
Continuing with the data we've cleaned up, we're going to create a new reference control and import these clean-up data in that slot.
In the unmixing process, we can select different control options (as in last week's post) and set the appropriate negatives.
If we just select the gated BV650+ cells from the raw workspace, we get this:
As mentioned, the XCR1+ cells are on the bigger side.
This gives a nice clean spectrum with only a single trace.
Unfortunately, we don't have enough events in P1 to proceed because SpectroFlo currently has a hard-coded limit of 500. So, we're going to use the sample where we've removed the AF, but left the negative.
We can't see the positives, but they're there and the number of cells is a close match to the "positive only" approach.
Again, we get a clean spectrum with no blurring or doubling of the trace. When normalized, the spectrum is much sharper than before.
Before
After
This straightens out the XCR1-BV650 signal. Not perfect, still, but there are similar problems for most of the channels in these data.
Repeating this process (or the simpler clean-up on histograms) for the rest of the markers in the data yields better unmixing.
Initial unmixing
Final result
In this case, I've done the AF-exclusion gating for TCRgd eFluor450, IgE BV605 and Siglec F BUV615.
Notice how the negative becomes more compressed in the final unmixing. We can achieve better resolution if the AF is removed from the fluorophore signatures because we aren't repeatedly trying to unmix an aspect of the AF across multiple channels. Essentially, including the AF in the positives not only causes inaccuracies (skewing), but also imprecision due to the increased similarity of the compound fluorophore signature (BV605 + AF is more similar to BV650 + AF than BV605 is to BV650).
There are still issues. Remember, these data are intended to have lots of problems in order to illustrate how to fix them. In particular, if you look at the XCR1 vs. IgE plot, there's skewed spread. This is partly because of the use of Ly-6C in StarBright Blue 615, which has a high peak in the same place as BV605 (see righthand plot below for splenocytes), and largely because the lung autofluorescence signatures (eosinophils, alveolar macrophages) have not been extracted (see lefthand plot below with F4/80 contrast). We'll look at how to deal with AF in the future.
Now, obviously, this workflow is a clunky, slow process, which is not ideal. Also, it is possible to make a mess if you carve up the sample badly. This process would benefit from standardization using code or software.
Reagents shown here:
The Siglec F BUV615 is a custom prototype produced several years ago by BD. You can purchase this conjugate from ThermoFisher now.
If I get less than 400 cells then I merge same file twice to make it acceptable by Spectraflo.