Learning-to-rank prediction of missense variant effects from deep mutational scanning data.
Deep mutational scans measure thousands of variants per protein, but different assays read out different things on different scales. Partially overlapping datasets are usually treated as noise — so most of that information is never combined.
An overlap-aware rank-fusion score, variant soundness, merges ~1,100 MAVE datasets into a consensus map of mutational tolerance. ESMRank then learns to rank variants on that map from ESM-2 embeddings plus physicochemical descriptors. Under strict protein-level splits it outperforms widely used predictors on abundance, folding and stability benchmarks (ProteinGym, Domainome), and its scores track ClinVar pathogenicity and, in CFTR, folding, channel activity and drug response.
# Python ≥ 3.10, CUDA GPU
pip install esmrank
esmrank download-models
esmrank run --input protein.fasta -sub
Arnese R, Gambardella G. ESMRank: learning-to-rank prediction of missense variant effects from deep mutational scanning data. Molecular Systems Biology (2026). doi:10.1038/s44320-026-00252-3
Drug Response Estimation from single-cell Expression Profiles.
Tumours are mixtures of cells that respond differently to the same drug. Bulk drug screens average this away, so resistant sub-populations go unseen until they take over.
DREEP turns large cell-line viability screens (GDSC, CTRP2, PRISM) into ranked gene signatures of drug sensitivity. For each single cell it runs an enrichment test of the cell's most specific genes (gf-icf) against those signatures, predicting which drugs that cell is vulnerable to — and what fraction of a sample is sensitive. Validated in vitro on independent single-cell datasets covering over 200 cancer cell lines.
# R — requires gficf (below)
devtools::install_github("gambalab/DREEP")
data <- gficf::gficf(M = counts)
res <- DREEP::runDREEP(M = data$gficf,
gpds.signatures = c("CTRP2","GDSC"))
Pellecchia S, Viscido G, Franchini M, Gambardella G. Predicting drug response from single-cell expression profiles of tumours. BMC Medicine 21, 476 (2023). doi:10.1186/s12916-023-03182-1
Gene Frequency – Inverse Cell Frequency: text-mining normalisation, pathway activity and reference mapping for single-cell data.
Single-cell counts are sparse and noisy, so per-gene signals are hard to read. Two questions come up again and again: which pathways is each cell using, and how do new cells map onto a known reference atlas?
GFICF treats each cell like a document and each gene like a word, weighting genes the way search engines weight terms (TF-IDF). Version 2 adds scGSEA, which scores pathway activity in every cell via non-negative matrix factorisation and enrichment analysis, and scMAP, which projects new cells onto a reference atlas and transfers its labels. Clustering (Phenograph/Louvain), PCA/NMF and UMAP/t-SNE are built in.
GFICF is also the normalisation layer underneath DREEP.
# R — see the install guide for system deps
devtools::install_github("gambalab/gficf")
data <- gficf::gficf(M = counts)
data <- gficf::runScGSEA(data, geneID = "symbol",
species = "human", category = "H")
Franchini M, Pellecchia S, Viscido G, Gambardella G. Single-cell gene set enrichment analysis and transfer learning for functional annotation of scRNA-seq data. NAR Genomics and Bioinformatics 5(1), lqad024 (2023). doi:10.1093/nargab/lqad024
Hybrid Oxford Nanopore + Illumina variant calling with deep learning.
Short reads are accurate but miss hard-to-map regions; long reads reach them but carry more errors. Calling each platform separately and merging the results afterwards leaves accuracy on the table — and sequencing both deeply is expensive.
HONEY DeepVariant is a DeepVariant model trained to read Nanopore and Illumina reads jointly, in a single pileup. Two models (R9.4.1 and R10.4.1 chemistry) were trained on over 100 TB of harmonised Nanopore data from the seven Genome in a Bottle individuals. Even a shallow hybrid — about 15× of each platform — reaches SNV F1 0.998, beating single-platform callers. Companion honey_pipes containers handle basecalling, alignment and SV calling.
# GRCh38 only, chr-prefixed contigs
singularity pull docker://gambalab/honey_deepvariant:1.6.1
singularity exec honey_deepvariant_1.6.1.sif \
run_honey_deepvariant.sh -m HYBRID_ONT_R104_ILLUMINA \
-b hybrid.bam -r GRCh38.fa -s SAMPLE -x F -t 32 -o out/
Gambardella G. Joint processing of long- and short-read sequencing data with deep learning improves variant calling. Cell Reports Methods 5(7), 101107 (2025). doi:10.1016/j.crmeth.2025.101107
Fast distances, nearest-neighbour search and graphs for large, highly sparse data.
Single-cell atlases, embeddings and other sparse matrices can have millions of columns. A full pairwise distance matrix grows with the square of that number and quickly stops fitting in memory — yet clustering only needs each point's nearest neighbours.
Parallel C++ kernels (RcppArmadillo + OpenMP) that walk only the stored non-zero entries, so cost follows sparsity rather than matrix size. sparseKNN() searches in blocks and never builds the full matrix; sparseSNN() turns the neighbourhoods into a shared-nearest-neighbour graph ready for community detection. Jaccard, cosine, Euclidean, Manhattan, Pearson, Jensen–Shannon and covariance are supported, with reproducible results regardless of thread count.
# R ≥ 4.0 — CRAN release coming
remotes::install_github("gambalab/sparseDist")
nn <- sparseKNN(X, k = 15, method = "cosine")
snn <- sparseSNN(nn, prune = 1/15)