A single-page workbench for the quantitative-flow-cytometry family: absolute receptor quantification from calibration beads, MESF/ERF/ABC unit conversion, %positive gating and MFI from event-level data, stain and separation indices, spillover compensation, and FCS-file parsing. Everything runs locally in your browser, and nothing is uploaded or stored. The receptor-quantification and subtype logic are numerically identical to receptor_quantification.py and flow_cytometry_validation.py; the browser and the scripts produce the same numbers on the same input.
Fit a per-date calibration curve (linear or log-log), convert raw MFI into absolute antibody binding capacity (receptors per cell), and compare the protein-level subtype pattern against the RNA-level pattern from the computational screen. Absolute counts require a fitted calibration curve; rows without one are excluded and flagged, never approximated from a raw MFI/isotype ratio.
molecules_per_bead comes from the bead kit's lot-specific certificate of analysis, not measured. Need at least 3 populations per date to fit a curve.
| Date | Bead lot | Population | Molecules / bead | MFI |
|---|
Cell lines are matched against the Lehmann-subtype lookup table (Lehmann et al. 2011, PMID 21633166; cross-checked by Espinosa Fernandez et al. 2020, PMID 32353087). Unrecognized cell line names are flagged, not silently dropped.
| Date | Cell line | Gene | MFI | Isotype MFI | % positive | Replicate | Notes |
|---|
Paste the group_medians block from a gene's results/<gene>/<gene>_analysis_results.json (produced by biomarker_pipeline.py), or upload the whole file. One entry per gene you're testing.
Convert raw fluorescence (MFI) into standardized units: MESF (molecules of equivalent soluble fluorochrome), ERF (equivalent reference fluorophores, the NIST-traceable successor), or PE molecules / ABC via QuantiBRITE-style beads. Enter the bead standard's assigned unit value against its measured MFI, fit the curve, then convert any MFI (or a whole column of them) either way. QuantiBRITE PE with a 1:1 PE:antibody conjugate yields antibody binding capacity directly.
Assigned unit values come from the bead lot's certificate of analysis. For QuantiBRITE PE, enter PE molecules per bead. The log-log model is standard for QuantiBRITE (log10 PE/bead vs. log10 geometric-mean fluorescence).
| Population | Assigned units | MFI |
|---|
Compute percent-positive and summary statistics (median / MFI, geometric mean, arithmetic mean, robust SD) from event-level single-cell data. Paste a CSV or numeric column, or push a channel over from a parsed FCS file (FCS import tab). Set a gate threshold manually, or derive it from a negative-control column as median + k×rSD.
Stain index and separation index quantify how cleanly a positive population separates from background, the standard metric for titrating antibodies and comparing fluorochrome brightness. Stain index = (MFIpos − MFIneg) / (2 × SDneg). The separation index uses the robust SD of the negative population instead, which is more resistant to outliers and the definition used by FCS Express. Compute from raw event data, or from summary statistics you already have.
Spillover compensation. Enter the spillover matrix as percentages. Row i, column j is the fraction of fluorochrome i's signal that appears in detector j. The diagonal is fixed at 100%. Compensation inverts this matrix and applies it to measured values: corrected = measured × spillover−1. Enter one or more measured event/MFI vectors below to get compensated values.
Parse an FCS 3.0 / 3.1 list-mode file entirely in your browser: read the TEXT segment keywords, list the parameters, and decode the event matrix (32-bit float, 64-bit double, or fixed-width integer data types). Once loaded, any channel can be pushed to the Gating tab. Nothing is uploaded; the file is read locally with FileReader.
For each calibration date, ordinary least squares is fit on raw values (linear model) and on log10-transformed values (log-log model); whichever fit has the higher R² is kept, unless a specific model is forced. Implemented as explicit summations, not a stats library, so every step is auditable.
Mean calibrated receptors/cell is averaged per cell line, then per subtype (BL1/BL2/M/LAR, Lehmann classification). Subtypes are ranked low-to-high on the protein side and compared against the same ranking on the RNA side (TCGA medians from biomarker_pipeline.py). Cell lines not in the lookup table, and measurement rows without a calibration curve for their date, are excluded and flagged rather than silently dropped or approximated.