Headed to AACR? Schedule time to connect with us at bd@ozette.com

Blog

Ozette Resolve: Filtering Out Contaminants from Single-Stain Controls

Evan Greene, Chief Officer Applied Sciences

Introduction

Generating single-stain controls is a critical step for the correct unmixing of spectral cytometry datasets. This is because unmixing relies on the fundamental assumption that the measured performance of fluorochromes in control samples accurately represents the performance of those same dyes when they stain experimental samples as part of a complete panel.

One common way this assumption is violated is cross-contamination of control samples. Whether it is caused by pipetting error or carryover during acquisition, if not corrected, contamination can compromise outputs for all samples that use the afflicted control(s) for unmixing.

How do you know if a control is contaminated? Opportunities for detection are provided by the visualizations produced in a given workflow. In this post, we will compare the Resolve workflow to a conventional workflow, and demonstrate tooling built into Resolve that helps identify and remediate contamination in controls so that they may still be used for the correct unmixing of full stained samples.

Contamination in Conventional Workflows

Before we built Resolve, our lab would follow a conventional workflow and use the instrument-provided unmixing tool. In this workflow, we’d typically set a lineage gate followed by a positive gate on each control file, and then examine the provided ribbon plots and estimated spectra for evidence of problems.

A typical control would produce a visualization like the following, where we see data from a control stained by BUV737 conjugated to anti-CD127.

Figure 1: Single-stain control for BUV737 in conventional workflow
Figure 1: Single-stain control for BUV737 in conventional workflow
To many trained operators, this view is unremarkable: the fluorophore-conjugated antibody has labelled events in the file, and this plot is within expectation. Contrast this to the plot produced by a control for BV570 conjugated to anti-CD56 that has been contaminated by events stained with BV480 conjugated to anti-CD45RA.
Figure 2: Single-stain control for BV570 in conventional workflow
Figure 2: Single-stain control for BV570 in conventional workflow

Here, the range of intensities on detectors UV7, V6, YG1 (and their neighbors) indicate a serious problem has occurred. When observed, experienced operators may recognize one likely cause is contamination, and attempt to remediate it via gating. Gating as remediation is only possible when the contaminating dye is dissimilar: one needs to select a detector where the contaminant emits light and the intended fluor does not in order to set a remediation gate.

As panels expand, however, the fluorophores used in a panel increasingly crowd the emissions range, and the chance of similar dyes contaminating one another increases. Consider the following plot generated by a control for BV605 conjugated to anti-CD25.

Figure 3: Single-stain control for BV605 in conventional workflow
Figure 3: Single-stain control for BV605 in conventional workflow

Is this control capturing the performance of the fluorophore when stained at the panel’s titre? Or do problems lurk beneath the surface? If one doesn’t know there are problems to fix, and one doesn’t know how to implement a fix when problems are detected, they are left in the position of having to unmix full stained data with the controls at hand. In these data, we can infer problems are present by looking at N x 1 plots of the conventionally unmixed outputs, where we can see odd patterns like the following emerge.

Figure 4: Unmixed outputs seen from the root of each file, produced by the conventional workflow for an anti-CD56 BV570 FMO and full stained sample from the same subject. In the FMO plot, the arrow identifies a double negative peak, and the red rectangle identifies the top end of unmixed outputs in the FMO. In the full stain sample, the arrow identifies an upward-tilting expression distribution within the red rectangle.
Figure 4: Unmixed outputs seen from the root of each file, produced by the conventional workflow for an anti-CD56 BV570 FMO and full stained sample from the same subject. In the FMO plot, the arrow identifies a double negative peak, and the red rectangle identifies the top end of unmixed outputs in the FMO. In the full stain sample, the arrow identifies an upward-tilting expression distribution within the red rectangle.

The Problem

When an analyst encounters these kinds of patterns in their unmixed outputs, they are put in a difficult position: are the double peaks and the upward-tilting expression tail in the full-stain sample biological signals or artifacts of the unmixing process? By generating FMOs, we can interpret the double peak as an unmixing artifact (though this would not be possible if you are unable to routinely generate FMOs). But if the upward tail seen in the full stain plot is an unmixing artifact, it can cause problems in downstream analysis: if you aim to characterize NKT cells, for example, this kind of pattern can inflate false-positive or false-negative rates.

Because of this risk, analysts often attempt to address such artifacts through manual compensation: they apply a ‘correction matrix’ to the unmixed files. This is not recommended for many reasons. Among them, compensation introduces subjective bias into the analysis, and can introduce errors into other parameters. The ideal way to address this kind of artifact is in the unmixing step itself, but this also places analysts in a difficult spot: which controls caused the problems, and can the controls be salvaged?

The Resolve Solution

The Resolve “control set” workflow is designed to make identification and remediation of contaminated control files easy. A “control set” is simply a collection of single stained and unstained control files that can be used to unmix fully stained experimental samples. The workflow is flexible (and its flexibility will be explored in follow-on posts), but in its simplest incarnation a control set is defined by a single unstained control and one control per fluorophore in a panel. We will use this type of control set to illustrate the workflow in this post.

The workflow begins with a template gating tree being applied to each control. This gating tree allows users to identify events within each control file that are profiled by the panel (the system can be used for open-ended gating if needed).

Figure 5: Lineage identification gates in the Ozette Resolve workflow
Figure 5: Lineage identification gates in the Ozette Resolve workflow

Once you have gated down to events within the targeted lineages, users are then provided a view of their unstained controls. They may apply gates in this step to remove contaminants from their unstained files, or to gate “internal negatives” within their single stained controls. This latter capability is particularly useful when a user has exclusively generated synthetic mixed bead controls.

Figure 6: Viewing unstained controls in Ozette Resolve
Figure 6: Viewing unstained controls in Ozette Resolve
In the final step of the workflow, users identify events in each control that have been labelled with the fluorophore-conjugated antibody or fluorescent dye. Resolve provides several tools to help with this task. First, it provides event-level views of the spectra measured in your single stained controls in a purpose-built spectral plot. Here’s what the default view looks like for the anti-CD127 BUV737 control.
Figure 7: The default spectra plot for the BUV737 control in Ozette Resolve
Figure 7: The default spectra plot for the BUV737 control in Ozette Resolve

In the first component labelled “Positive”, the plot shows the gated lymphocytes and monocytes in this control file, with side scatter on the x-axis, and the peak detector on the y-axis. In the second component labeled “Source of Background”, the plot shows data from the unstained control on the same parameters, to help users interpret which events are above the unstained background.

The third component labelled “Spectra” is the spectral plot, which shows the estimated spectra for the events within the positive gate. By default it shows a random sample of 500 events among the ~242k measured in the file (the plot can be updated to show more or all events). The gray background color saturates the plot, which indicates that there are events in this dataset with fluorescence emission that peak across the entire detector array. Since by default we include negative events, this makes sense: those events are unlabelled, and their spectra (produced by autofluorescence) can fluctuate randomly across the device.

We can update the gate on the positives to only capture bright (presumably stained) events, and we see that the spectral plot updates to reflect this data.

Figure 8: The spectra plot for the BUV737 control after updating the gate on the positive events
Figure 8: The spectra plot for the BUV737 control after updating the gate on the positive events

Now we can see that among events that have likely been labelled, the gray background showing the span of spectra is more centrally concentrated among the expected emission region (the white background indicates no events have spectra with normalized emission at that level within the gate). On some detectors, however, there are still visible outliers among these events. Resolve provides several tools to help further purify the signals measured in the control.

One powerful tool is the ability to compare the gated events in the control to a reference spectrum. The reference spectra in Resolve were generated by the Ozette lab team in Seattle. Our lab team has generated references for a large number of fluorophores, and you can have Resolve find the events in your file that are most similar to this reference by clicking the button at the top of the spectral plot.

After clicking this button, the plot updates to show the shape of the reference spectrum on the plot, and further shows a filtration of events within the gate: it now shows the subset of events in the sample that are close to the reference spectrum in blue, and excluded events in gray tones.

Figure 9: The spectra plot for the BUV737 control after matching gated events to the Ozette fluorophore database
Figure 9: The spectra plot for the BUV737 control after matching gated events to the Ozette fluorophore database

The filtered plot now shows several hundred events within the gate that have similar shapes to the reference spectrum. It’s important to note that the reference spectrum is only a starting point: experimental conditions can produce changes in the shape and relative height of secondary (and tertiary, etc.) emission peaks in controls. In such cases, the reference spectrum is still helpful to help start the workflow, but users are encouraged to manually select a positive empirical reference in their data and then filter against that selection in such cases. This is because the empirical evidence in the control offers the best information about the emission profile of each fluorophore on their device in their experimental conditions.

After the spectral filtering is carried out, outliers in gray are still visible on the spectral plot. These can be removed from the view by clicking the funnel icon in the upper-left corner of the plot.

After clicking this button, the spectral plot only shows the positive filtered events.
Figure 10: The spectra plot for the BUV737 control after updating view to only show similar events
Figure 10: The spectra plot for the BUV737 control after updating view to only show similar events
These positive filtered events shown in this final plot are the events from this control that will be used by Resolve to unmix fully-stained experimental files.

Rescuing Contaminated Controls with Resolve

Now that we’ve seen the workflow carried out for an uncontaminated file, let’s examine how Resolve helps identify and remediate contamination within a single stain control. We return to the control labelled with anti-CD56 conjugated to BV570, where earlier we noted it has been contaminated by events labelled with anti-CD45RA conjugated to BV480. After gating positives in this workflow we can see the clear mixture of the BV570 and BV480 emission patterns among events in the positive gate.

Figure 11: The spectra plot for the BV570 control after gating positive events
Figure 11: The spectra plot for the BV570 control after gating positive events

By selecting and filtering relative to a BV570 positive event, we can easily exclude the contaminating BV480 signal.

Figure 12: The spectra plot for the BV570 control after filtering spectra
Figure 12: The spectra plot for the BV570 control after filtering spectra

We can confirm BV480 is excluded by updating the plot to show only the positive events.

Figure 13: The spectra plot for the BV570 control after updating view to show only similar spectra
Figure 13: The spectra plot for the BV570 control after updating view to show only similar spectra

The events in this last view are the BV570 positive events that will be used to unmix full stained data. 

As a final example, we return to the control labelled with anti-CD25 conjugated to BV605. The spectral plot in Resolve makes it clear that there are two similar but distinct spectral patterns in the control file.

Figure 14: The spectra plot for the BV605 control after gating positive events
Figure 14: The spectra plot for the BV605 control after gating positive events

This control has in fact been contaminated by events labelled with anti-CD4 conjugated to cFluor V610. These are similar fluorophores, but in Resolve you can see distinct patterns of emission across the violet detectors contaminating the file.

Figure 15: The staining BV605 spectra (red arrow) and contaminating cFluor V610 spectra (purple arrow)
Figure 15: The staining BV605 spectra (red arrow) and contaminating cFluor V610 spectra (purple arrow)
By filtering the events relative to Ozette’s fluorophore database, we can easily disentangle this mixture to identify the events stained by BV605.
Figure 16: The spectra plot for the BV605 control after filtering spectra
Figure 16: The spectra plot for the BV605 control after filtering spectra
We can confirm that the contamination is fully removed by updating the view to only show the filtered events.
Figure 17: The spectra plot for the BV605 control after updating view to show only similar spectra
Figure 17: The spectra plot for the BV605 control after updating view to show only similar spectra
When fully stained experimental files are unmixed, they will only use the BV605 positive events identified by the spectral filtration process.

Maximizing Quality with Resolve

The three examples discussed above show how the Resolve spectral filtering workflow identifies true positive events in both contaminated and uncontaminated files. It is the same workflow in all cases, and it makes it easy to find and fix contamination errors by filtering the contaminants out. The cumulative effect of filtering down to true positive events becomes clear when we unmix fully stained data and re-examine the earlier pair plot showing all events in each file.

Figure 18: Unmixed outputs produced by both the conventional workflow and Ozette Resolve for an anti-CD56 BV570 FMO and full stained sample from the same subject
Figure 18: Unmixed outputs produced by both the conventional workflow and Ozette Resolve for an anti-CD56 BV570 FMO and full stained sample from the same subject

Where before we saw an artifactual double peak and expression tail curving upwards, in the Resolve outputs these unmixing artifacts are eliminated. We know these are artifacts because we see them in the conventionally unmixed FMO control. Resolve spectral filtering is one reason these errors are absent. Another reason is the mathematical model Resolve uses to carry out unmixing itself, which we will explore in the next post on this blog. Here, it suffices to note that the Resolve model will only produce non-negative outputs, and that the scale of the output differs by design: the model is specified so the unmixed output for an event recovers the total raw measured signal across all detectors (on average) for that event. Because of this, the scale of Resolve output typically differs across parameters from conventional approaches (which you can see in the above plot).

Concluding Remarks

In this post we have seen how the Resolve spectral filtering workflow can automatically surface and fix cross-contamination errors that occur in cytometry experiments. As this kind of error is inevitable (despite best efforts, every team will make occasional mistakes at the bench if they perform experiments regularly), it’s a particularly powerful component of Resolve since it prevents these mistakes from introducing error into the unmixed outputs. This also can save costs at the bench: users can use contaminated controls they’ve already generated for optimal unmixing by filtering out contaminants in Resolve, so they don’t have to go back to the lab to generate another set of reference controls.

In our next post, we will discuss how the mathematical model used by Ozette Resolve takes advantage of the spectral filtering workflow to generate high-quality outputs. In the meantime, if you’d like to try the spectral filtering workflow with Resolve today, try our 30-day free demo at https://ozette.com/biological-insights/.

Ozette Resolve: Filtering Out Contaminants from Single-Stain Controls

This article focuses on how contamination of single-stained controls affects the quality of unmixed outputs, and discusses tools in Resolve that help you easily identify and remove contaminants from controls to maximize the quality of unmixed outputs.

Ozette Resolve: Why We Built It and Optimizing Use (Part 1)

Unmixing spectral cytometry data is a complex process that combines both wet- and dry-lab workflows. Errors introduced in either part can propagate and compromise downstream analysis. Here we describe Ozette Resolve Spectral Unmixing, a solution that improves unmixing through quality evaluation of controls and adaptive, event-level unmixing, with guidance on optimizing results using appropriate unstained controls.