The Dose-Response Curve Analyzer fits the raw readings behind an IC50: a plate of doses and responses, with replicates and control wells. Each compound gets a fitted curve, a value on the p-activity scale with a confidence interval, and quality flags. A curve that cannot support a number gets a flag or a bound, never a made-up value.
How it works
- Normalization: with high and low control wells (DMSO / vehicle and a positive control), each plate is scaled to % of the control window and its Z′ is recorded. Plate-median scaling is the alternative for screens without controls; already-normalized data passes through.
- Robust fit: response against log₁₀ dose, by bounded nonlinear least squares with a robust loss and deterministic starting values, so the same input always gives the same table.
- Outliers: readings whose studentized residual exceeds the threshold (3 by default) are flagged. By default at most one per dose is dropped and the curve refitted; every dropped reading is listed.
- Value: the half-effect dose, with a t-based confidence interval.
| Model | Fits | Use it for |
|---|---|---|
| 4PL | top, bottom, IC50 / EC50, Hill slope | Standard inhibition or activation curves |
| 5PL | 4PL plus an asymmetry term | Curves steeper on one side than the other |
| Morrison | top, bottom, Ki | Tight binders whose IC50 is limited by the enzyme concentration |
With a substrate concentration and Km, a competitive Cheng–Prusoff Ki is reported as Ki = IC50 / (1 + [S]/Km); Morrison applies the same correction to its Ki. Without them, Morrison reports the apparent Ki as Ki_app.
Quality flags and censoring
- Too few doses: a curve with fewer distinct doses than the model can support is flagged
insufficient_pointsand not fitted. - Bounds, not extrapolation: a curve that never reaches half effect in the tested range is reported as
>the top dose (or<the bottom dose), the same relation semantics the Bioactivity Dataset Curator uses. Flat curves are bounds too. - Plateaus and slope:
poor_top_plateau,poor_bottom_plateau, andhill_out_of_windowmark fits that rest on extrapolated plateaus or an implausible Hill slope. - Plate effects: edge-well bias is reported per plate, not corrected.
Inputs
One long-format table (CSV, TSV, JSON, or an artifact): one row per well with a compound ID or SMILES, a dose, and a response. Replicate, plate, well, control, and assay columns are optional, and common header names (ChEMBL's first) are picked up automatically. Mark control wells as high / low or dmso / pos.
Outputs
| File | Contents |
|---|---|
fits.csv | One row per curve in ChEMBL-style columns (standard_type, standard_relation, standard_value, standard_units), plus p_activity, confidence interval, fitted parameters, flags, and whether the curve was accepted |
qc.csv | Every reading with its role, normalized response, prediction, residual, and status |
curves.csv | Sampled fitted curves for plotting |
plots/ | One plot per fitted curve |
summary.json | Normalization, control statistics, flag counts, and edge-effect checks |
Not covered
Wide plate-export layouts, vendor instrument formats, and substrate-inhibition kinetics are out of scope. A fitted IC50 reflects one assay's conditions; comparing assays is a curation question.
Related tools
fits.csv goes straight into the Bioactivity Dataset Curator & Splitter with no column mapping, and from there into QSAR Models or MPNN Models. For reaction rate constants rather than pharmacology, use the Kinetic Parameter Fitter.