How to use CHASE
CHASE (Chemotype-Hit Analysis of Screening Experiments) turns raw single-concentration screening reads into a % response for each compound. It plots them by compound number,
sorts compounds into activity classes and groups them into chemotypes, so biochemists and chemists can see which structural series are active and decide together
what to follow up. This is the Python edition: it runs locally from a conda environment, needs no internet connection, and uses RDKit for all chemistry.
Input files
Screening data (.xlsx, .xls, .csv, .tsv)
One row per well with at least these four columns. Header names need not match exactly; reassign them under Columns in step 1.
| Column | Example | Notes |
| Raw Data | 1031 | Numeric readout (signal, RFU, counts). |
| Plate Number | 1 | Used for per-plate normalization and QC. |
| 384 well ID | A08 | Plate maps read IDs such as A01, A1 or AF48 (96, 384 and 1536 wells). |
| Batch ID | 310480c04 | Compound batch, or the control name (e.g. DMSO, CTRL). |
- Rows without a numeric readout or a plate are skipped, so summary rows such as
Average at the bottom of a sheet are ignored.
- Wells with a signal but no Batch ID are treated as empty and left out.
- Format the Batch ID column as text in Excel; otherwise IDs such as
274E06 become numbers and no longer match the structures file. Data checks flags IDs that look affected.
Structures (.csv, .tsv, .smi, .xlsx)
One row per compound: an ID column matching the Batch IDs and a SMILES column, optionally a display name. CHASE picks the ID column that matches the most Batch IDs; matching ignores case and also tries IDs without leading zeros.
Step by step
- Load files in step 1 (or Load example data). Check the column assignments.
- Controls & normalization: choose the positive control (100%) and negative control (0%) Batch IDs, per-plate or all-plate normalization and mean or median, then press Normalize & plot.
- Activity classes: k-means (k = 2-4), fixed thresholds or a robust z cut-off. Changes apply immediately.
- Chemotypes: Butina clustering at a Tanimoto cut-off, or Bemis-Murcko scaffolds.
The plot
- Each point is a sample well: x is its compound number (plate order, then file order), y its % response, colour its compound's class. Hover for the structure; click to pin the compound.
- Drag to zoom, double-click to reset. Shaded bands mark alternate plates; dashed lines are class borders; open diamonds and squares are negative and positive control wells.
- The narrow panel is a histogram of compound % response on a log count scale.
- Z' per plate: the strip above the plot shows one bar per plate, spanning that plate's compounds: green for Z' >= 0.5, amber for 0-0.5, red below 0 (values below -1 are drawn at -1). The dotted line marks 0.5; hover a bar for the exact Z' and S/B. Untick Z' per plate to hide it.
- Colors opens colour pickers for each activity class and both control types. The colours apply to the plots, chips and chemotype strips, are remembered in your browser, and are saved in session files. Reset colours restores the defaults.
- Save JPEG exports the current view (with your colours) at 3x resolution. Save data (.csv) writes every point of the plot: compound number, plot position, plate, well, well type, Batch ID, name, raw signal, % response, the compound's mean, class, chemotype, plate Z' and SMILES.
Chemotypes
- Active lists chemotypes with at least one non-inactive compound; Inactive those where every member is inactive.
- Cards show the representative structure, hits, hit rate, maximum % response, a strip of member responses (-20 to 120%), and for active chemotypes the enrichment factor and p-value. A green enriched chip marks q < 0.05.
- Click a card to list its members and ring them on the plot.
Triage board
Pin a compound and choose Confirm, Resynthesize, Buy analogues or Discard, then add a note (saved when you leave the text box). Click the active decision again to clear it. In a chemotype's panel, one click applies a decision to its undecided members, or to all of them when every member already has one.
- Nothing is stored in a database. Decisions live only in the open browser tab; CHASE writes nothing to disk. Keep them with Save session (everything) or Export triage (.csv) (the board only), and bring them back with Open session or Import triage (.csv). The status line above the board shows how many changes are unsaved, and the browser warns you before closing a tab with unsaved decisions.
- Each decision records your name (set it above the board; the browser remembers it) and the time. The campaign name (by default the screening file name) labels the exported files.
- To work on a board together, pass the session file or the triage CSV: importing adds the decisions to the board, and for a compound that is already decided the newer decision wins. Clear board empties the board after asking.
- The triage CSV has the columns campaign, batch_id, compound_name, decision, note, pct_response, activity_class, chemotype, decided_by and decided_at; only batch_id and decision are required when you import a file prepared elsewhere.
PAINS and covalent flags
Every compound with a structure is checked against two sets of substructure alerts:
- PAINS: the 480 pan-assay interference patterns of Baell & Holloway,1 as implemented in RDKit's FilterCatalog (families A, B and C). These substructures (rhodanines, catechols, quinones, Mannich bases ...) often give false positives through aggregation, redox cycling, metal chelation or reactivity.
- Covalent warheads: electrophiles that can react with protein nucleophiles: acrylamides and other Michael acceptors, haloacetamides, epoxides, aziridines, sulfonyl fluorides, aldehydes, boronic acids, beta-lactams, activated esters, SNAr-prone arenes and more (31 SMARTS). The list is a plain text file you can edit: copy
chase/core/covalent_alerts.tsv to ~/.chase/covalent_alerts.tsv (or set CHASE_COVALENT to a file) and CHASE uses your version.
Flags appear as red PAINS and violet Covalent chips in tooltips, the compound panel, chemotype members, cards, cliffs and the triage board. On the plot, PAINS hits are marked with an x, covalent hits with an open triangle; the selector in the plot header shows the marks on hits only (default), on all compounds, or not at all. The compound panel names each alert and highlights the matching atoms in the structure. The Flagged hits tile counts hits with any flag. A flag is a prompt to look more closely, not a verdict: some approved drugs carry PAINS substructures, and covalent warheads may be exactly what a campaign is looking for.
Activity cliffs
Pairs of very similar compounds (Tanimoto at or above the cut-off) whose % response differs by at least the chosen number of points, ranked by SALI. Pairs flagged same compound, other batch are two batches of one structure; a large difference there usually means a batch problem rather than SAR.
Plates & replicates
- Plate maps: every plate in its layout, coloured violet (below 0) - neutral (0) - orange (100+). Click a plate to open it large; hover a well for its structure. The header compares edge and interior wells.
- Replicates: replicate 1 against replicate 2 (first two wells in plate order) with Pearson r, Spearman rho and the median difference; ringed points differ by more than the threshold.
- QC table: controls, CVs, S/B and Z' per plate.
Sessions
Save session writes one .json file with the screening rows, structures, all settings, the pinned selection and the triage decisions. Open session restores everything and reruns the analysis; the session's decisions join the board (newer decision wins per compound). Session files are interchangeable with the HTML version of CHASE. A session file contains your structures, so share it like the original data.
Privacy: what CHASE keeps
CHASE stores nothing on the computer or server it runs on. Your data exist only in memory while your browser tab is open:
- Uploaded files are read and their temporary copies deleted at once. On Linux, Shiny's upload folder is placed in RAM (
/dev/shm), so uploads never touch the disk.
- Data, results, structure drawings and the triage board belong to your session alone. They are never shared with other users of the same server, and they are discarded when you close the tab.
- No database and no log of your data. Requests are not logged.
- What leaves CHASE is only what you download: session files, CSV exports and JPEGs. Your browser remembers your plot colours and your name in its own local storage, on your computer.
Methods
Normalization (% response)
% response = 100 * (raw - neg) / (pos - neg)
raw is the signal of a well, pos and neg are the signal of the positive and negative controls (their mean or median, as chosen under Control statistic). With Per plate the controls of the same plate are used, with All plates the controls of the whole screen. A well that reads like the negative control gets 0%, one that reads like the positive control gets 100%. This works whether the positive control gives a higher or a lower signal than the negative one. A plate that is missing one of its controls is normalized with the all-plate values and is marked in the QC table.
Plate quality (Z', S/B, CV)
Z' = 1 - 3 * (SDpos + SDneg) / |mean pos - mean neg|
S/B = mean pos / mean neg
CV = 100 * SD / mean
All three are calculated from each plate's own control wells (SD is the sample standard deviation).
- Z' tells how well the assay separates the two controls: it compares the gap between their means with their spread. 1 would be a perfect assay with no noise. 0.5 or more is excellent, between 0 and 0.5 the controls are close or noisy, and below 0 they overlap, so the plate can't reliably tell actives from inactives.
- S/B (signal to background) is how many times stronger the positive control's signal is than the negative control's.
- CV (coefficient of variation) is the spread of a control's wells as a percentage of their mean. Low values mean the control wells agree with each other.
Activity classes
k-means: borders halfway between the k cluster centres
Robust z: border = median + n * 1.4826 * MAD
- k-means groups the compound means (the average % response of each compound's wells) into k clusters along the % response axis. CHASE runs it from several starting points and keeps the solution with the tightest clusters. A class border sits halfway between two neighbouring cluster centres.
- Robust z uses one border. The median and the MAD (median absolute deviation: the median distance of the values from their median) describe the bulk of inactive compounds without being pulled up by the few actives. Multiplied by 1.4826, the MAD equals the standard deviation for normally distributed data, so the border is "n standard deviations above the median".
Chemotypes
Tanimoto = bits set in both fingerprints / bits set in either fingerprint
- Fingerprints: RDKit Morgan fingerprints, radius 3 (similar to ECFP6), 2048 bits. Each bit stands for a small atom environment in the molecule.
- Similarity: Tanimoto similarity runs from 0 (nothing in common) to 1 (identical fingerprints). Taylor-Butina clustering, as described by Taylor2 and Butina,3 compares all pairs. The compound with the most neighbours at or above the cut-off becomes the centre of the first chemotype and takes those neighbours with it, then the next compound with the most remaining neighbours, and so on. This is done for up to 20,000 compounds; larger sets are grouped by scaffold.
- Scaffold: the molecular frameworks of Bemis & Murcko,4 computed with RDKit: ring systems and the linkers between them, without side chains and without stereochemistry. When chemotypes are made by scaffold, all compounds with the same scaffold form one chemotype.
Enrichment of hits in a chemotype
EF = (hits in chemotype / n) / (hits in library / N)
p = P(X >= hits in chemotype), X ~ Hypergeometric(N, hits in library, n)
q = Benjamini-Hochberg adjusted p
"Hits" are compounds in any class above Inactive. n is the number of compounds in the chemotype and N the number of compounds with a readable structure.
- EF (enrichment factor) compares the chemotype's hit rate with the hit rate of the whole library. EF = 3 means hits are three times more common in this chemotype than on average.
- p is the chance of getting at least this many hits if n compounds were picked at random from the library. A small p means the hits are unlikely to cluster in this chemotype by chance.
- q corrects p for testing many chemotypes at once (Benjamini-Hochberg false discovery rate). Chemotypes with q < 0.05 are marked enriched.
Activity cliffs
SALI(a,b) = |Response_a - Response_b| / (1 - Tanimoto(a,b))
Response_a and Response_b are the % responses of compounds a and b, and Tanimoto(a,b) is their fingerprint similarity. SALI, the structure-activity landscape index of Guha & Van Drie,5 is large when two very similar compounds differ a lot in activity, which points to a small structural change with a big effect. Pairs with identical fingerprints (Tanimoto 1) would divide by zero, so 1 - Tanimoto is never allowed below 0.01. Only pairs at or above both thresholds (Tanimoto and the difference in % response) are listed, sorted by SALI.
Guha and Van Drie defined SALI with potency values such as pIC50. CHASE uses the % response of a single-concentration screen instead, so its SALI values are useful for ranking pairs within one screen but can't be compared with SALI values reported in the literature.
Edge effect
Edge Delta = mean % (outer ring of sample wells) - mean % (interior sample wells)
The outer rows and columns of a plate can behave differently, for example through evaporation or temperature differences. A Delta far from 0 means the edge wells read systematically higher (positive) or lower (negative) than the rest of the plate.
Export
Export results (.csv): one row per compound with Batch ID, name, SMILES, wells, mean and SD % response, class and chemotype statistics. Export triage (.csv): the board's decisions, re-importable with Import triage (.csv). Plots and plate maps save as JPEG; the whole analysis saves as a session file.
Software versions
CHASE: 3.5.0 (2026-11-06)
Python: 3.12.16
RDKit: 2026.9.2
Shiny for Python: 1.9.0
Plotly: 7.1.0
pandas: 3.1.1
NumPy: 2.5.4
SciPy: 1.18.1
openpyxl: 3.1.5
PAINS filters: RDKit FilterCatalog PAINS A/B/C (480 patterns)
Covalent alerts: 31 SMARTS
Acknowledgments
Thanks to Dr. Francesco Massai, Chemical Biology Consortium Sweden (CBCS-KI), Karolinska Institutet, for valuable scientific input and feedback during the development of CHASE.
References
(1) Baell, J. B.; Holloway, G. A. New Substructure Filters for Removal of Pan Assay Interference Compounds (PAINS) from Screening Libraries and for Their Exclusion in Bioassays. J. Med. Chem. 2010, 53, 2719-2740. DOI: 10.1021/jm901137j
(2) Taylor, R. Simulation Analysis of Experimental Design Strategies for Screening Random Compounds as Potential New Drugs and Agrochemicals. J. Chem. Inf. Comput. Sci. 1995, 35, 59-67. DOI: 10.1021/ci00023a009
(3) Butina, D. Unsupervised Data Base Clustering Based on Daylight's Fingerprint and Tanimoto Similarity: A Fast and Automated Way To Cluster Small and Large Data Sets. J. Chem. Inf. Comput. Sci. 1999, 39, 747-750. DOI: 10.1021/ci9803381
(4) Bemis, G. W.; Murcko, M. A. The Properties of Known Drugs. 1. Molecular Frameworks. J. Med. Chem. 1996, 39, 2887-2893. DOI: 10.1021/jm9602928
(5) Guha, R.; Van Drie, J. H. Structure-Activity Landscape Index: Identifying and Quantifying Activity Cliffs. J. Chem. Inf. Model. 2008, 48, 646-658. DOI: 10.1021/ci7004093