diffHTS provides reusable methods for large-scale, two-condition high-throughput drug screening (HTS). It compares drug sensitivity between any two experimental conditions — for example irradiated versus non-irradiated cells, cancer versus normal cell lines, or treated versus untreated samples — across many plates and experiments, in a documented and tested toolkit.
Install from a local source checkout:
# install.packages("remotes")
remotes::install_local("diffHTS")
# or, from the built source tarball
install.packages("diffHTS_0.1.0.tar.gz", repos = NULL, type = "source")
Dose-response fitting is implemented in base R, so no external fitting package
is needed. Some visualisation and I/O features use packages that are only
suggested: the Bioconductor packages ComplexHeatmap and circlize
(heatmaps), ggrepel (labelled scatter plots), readxl (Excel import) and
rmarkdown (HTML reports).
diffHTS organises a complete HTS analysis into seven modules that take raw plate readouts all the way to an annotated, ranked hit list. It supports both single-concentration primary screens and gradient secondary (dose-response) confirmation screens. Each module pairs business functions with matching visualisation functions.
| Module | Business functions | Visualisation |
|---|---|---|
| 1. Import & pre-QC |
read_plate_layout(), apply_plate_layout(), read_hts_plate(), summarize_plate_setup(), baseline_subtract(), detect_outlier_wells(), calc_z_prime(), calc_robust_z_prime(), calc_z_factor(), calc_ssmd(), calc_sb_ratio(), calc_sn_ratio(), calc_cv(), calc_plate_qc(), calc_well_zscore(), filter_valid_plates()
|
plot_plate_heatmap_raw(), plot_plate_qc()
|
| 2. Normalisation |
norm_by_control(), merge_plate_data()
|
plot_plate_heatmap_inhibition(), plot_inhibition_hist()
|
| 3. Replicate consistency |
calc_replicate_cv(), calc_replicate_correlation(), filter_bad_replicate()
|
plot_replicate_scatter(), plot_cv_distribution()
|
| 4. Primary hit selection |
select_primary_hit(), select_sigma_hits(), summarize_primary_hit(), summarize_sigma_hits()
|
plot_primary_inhibition_rank(), plot_hit_bar_count(), plot_sigma_hits()
|
| 5. Dose-response & AUC |
import_dose_response(), fit_4pl_curve(), extract_drc_params(), calc_drc_auc(), filter_low_quality_curve()
|
plot_single_drc(), plot_batch_drc_overlay(), plot_ic50_auc_cor()
|
| 6. AUC matrix & clustering |
build_auc_matrix(), cluster_auc_matrix(), extract_cluster_hit()
|
plot_auc_heatmap(), plot_cluster_tree()
|
| 7. Ranking, annotation & report |
rank_hit_compound(), annotate_hit_info(), export_hit_table(), generate_hts_report()
|
plot_hit_stratify_bar(), plot_primary_secondary_cor()
|
Utilities: plate_layout() / plate_layout_384() / plate_layout_1536(),
convert_conc_log10(), check_control_label(), clean_compound_id().
The original two-condition (differential) analysis remains available:
four_pl(), compute_auc(), fit_dose_response(), compute_delta_auc(),
select_hits_cutoff(), select_hits_sigma(), calculate_qc_metrics(),
plot_dose_response_curves(), plot_delta_auc_heatmap(),
plot_condition_scatter() and the QC plots.
library(diffHTS)
## --- Primary screen: raw signals -> hits ---------------------------------
## Author a plate map (which wells are NC / PC / blank / compound) yourself,
## then stamp it onto the instrument readings:
layout <- read_plate_layout(
system.file("extdata", "plate_layout_example.csv", package = "diffHTS"),
plate_id = "P01")
# raw <- apply_plate_layout(signal_export, layout) # merge roles onto readings
raw <- read_hts_plate(hts_primary_raw) # three 96-well plates in one object
summarize_plate_setup(raw) # per-plate layout: controls & compounds
raw <- baseline_subtract(raw)
qc <- calc_plate_qc(raw) # full QC panel: Z'/robust-Z'/SSMD/S:B/S:N/CV%
plot_plate_qc(qc, metric = "ssmd") # one plot fn, choose any metric
good <- filter_valid_plates(raw) # drop failed plates (P03)
norm <- norm_by_control(good) # % inhibition vs NC/PC
hits <- select_primary_hit(norm, threshold = 50)
summarize_primary_hit(hits)
## --- Secondary screen: dose-response -> ranked hits ----------------------
dr <- import_dose_response(hts_dose_response,
response_col = "viability",
group_cols = "cell_line")
drc <- calc_drc_auc(fit_4pl_curve(dr, group_cols = "cell_line"))
params <- merge(extract_drc_params(drc), drc$meta[, c("curve_id", "auc")])
ranked <- rank_hit_compound(params) # Strong/Moderate/Weak
annotate_hit_info(ranked, hts_compound_meta) # add target/MoA
plot_single_drc(drc, drc$meta$curve_id[1]) # one fitted curve
plot_auc_heatmap(build_auc_matrix(drc$meta, zscore = "row"))
hts_primary_raw — simulated 96-well primary screen with raw signals
(plates P01/P02 good, P03 failed).hts_dose_response — simulated gradient dose-response screen (10 compounds,
3 cell lines, 2 replicates).hts_compound_meta — simulated compound annotation table.screen_doseresponse — a small simulated two-condition dose-response screen.screen_delta_auc — a small simulated differential-AUC table.screen_plate_qc, screen_plate_layout — QC / plate-layout demo data.All are fully simulated (see data-raw/make_datasets.R) and do not correspond
to any real compound or cell line.
See vignette("diffHTS") for an end-to-end walkthrough.
GPL-3