Methods & software

Open tools, built for real data.

Every method we publish ships as installable, documented code. From protein variant effects to single-cell drug response and hybrid long/short-read sequencing — five tools, one GitHub organisation.

Python · R · C++ · Docker github.com/gambalab →
01 · Protein variant effects Python Mol Syst Biol 2026

ESMRank

Learning-to-rank prediction of missense variant effects from deep mutational scanning data.

The problem

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.

How it works

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.

protein sequence / variant table ESM-2 + physicochemical features ranked variant scores + profile
~1,100
MAVE datasets fused
>2M
missense variants
0
clinical labels in training
Install & run
# Python ≥ 3.10, CUDA GPU
pip install esmrank
esmrank download-models
esmrank run --input protein.fasta -sub
How to cite

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

02 · Single-cell drug response R · C++ BMC Medicine 2023

DREEP

Drug Response Estimation from single-cell Expression Profiles.

The problem

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.

How it works

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.

scRNA-seq counts GSEA vs drug-sensitivity signatures per-cell drug vulnerability
>200
cancer cell lines in validation
3
drug screens: GDSC · CTRP2 · PRISM
1 cell
resolution of each prediction
Install & run
# 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"))
How to cite

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

03 · Single-cell analysis R · C++ NAR Genom Bioinform 2023

GFICF

Gene Frequency – Inverse Cell Frequency: text-mining normalisation, pathway activity and reference mapping for single-cell data.

The problem

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?

How it works

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.

raw UMI counts gf-icf · NMF / PCA · UMAP clusters · pathway scores · mapped labels

GFICF is also the normalisation layer underneath DREEP.

Install & run
# 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")
How to cite

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

04 · Genome variant calling Docker · Singularity Cell Rep Methods 2025

HONEY DeepVariant

Hybrid Oxford Nanopore + Illumina variant calling with deep learning.

The problem

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.

How it works

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.

ONT + Illumina reads merged BAM · hybrid CNN VCF / gVCF
>100 TB
Nanopore data harmonised
15× + 15×
shallow hybrid coverage
0.998
SNV F1 at that depth
Install & run
# 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/
How to cite

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

05 · Scalable computation R · C++ · OpenMP New · manuscript in preparation

sparseDist

Fast distances, nearest-neighbour search and graphs for large, highly sparse data.

The problem

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.

How it works

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.

sparse matrix (dgCMatrix) blocked kNN SNN graph → clusters
Install & run
# R ≥ 4.0 — CRAN release coming
remotes::install_github("gambalab/sparseDist")
nn  <- sparseKNN(X, k = 15, method = "cosine")
snn <- sparseSNN(nn, prune = 1/15)
GitHub → Paper: in preparation