Computational genomics · Pharmacogenomics · Machine learning for precision medicine
MSc candidate in Genomics, Informatics, Mathematics and AI for Health (GENIOMHE) at Université Paris-Saclay. BSc in Cell and Molecular Biology, University of South Florida.
I work on one question: how do you turn genomic data into a decision someone can actually act on? In practice that means building the software a lab needs before it can ask the question at all — and then measuring honestly whether the thing works, including when it doesn't.
Currently seeking a 2027 internship in computational biology or precision medicine.
Repository · Python · research use only
Pharmacogenomic cohort work has a tooling gap. Getting from raw reads to something a researcher can interpret means chaining alignment, several variant callers, annotation and a dozen knowledge bases, then repeating database lookups variant by variant across a whole cohort. Copy-number variants are often skipped entirely, because calling them from exome data is hard — an omission that matters here, since a CNV in a gene like CYP2D6 changes metaboliser status outright.
During a research internship in clinical pharmacogenomics I needed that whole path to exist, be reproducible and run locally. So I built it.
FASTQ → alignment → SNV/indel and CNV calling → VEP annotation → pharmacogenomic database enrichment → cohort analytics → an interactive variant browser
Four entry points (FASTQ, BAM/CRAM, raw VCF, filtered VCF), 19 checkpointed stages with resume and retry, 175 automated tests, and a preflight stage that catches configuration errors before any compute is spent.
Whole-exome benchmark on GIAB HG003 (NovaSeq, IDT capture, 100×), scored with hap.py/vcfeval against GIAB v4.2.1 truth inside the capture territory intersected with the confident regions — 25,279 truth SNVs and 1,051 truth indels across 35.9 Mb. Sixteen selection strategies on an identical variant representation: four individual callers, five rule-based ensembles, six ML model families, and the deployed guarded rescue.
| Small variants | Best strategy | F1 | Best single caller |
|---|---|---|---|
| SNVs (n = 25,279) | Strelka2 + guarded ML rescue | 0.9876 | Strelka2, 0.9875 |
| Indels (n = 1,051) | ML random forest | 0.9225 | Strelka2, 0.9032 |
Differences are tested with an exact McNemar test on paired per-variant decisions, not by comparing decimal places:
- SNVs: Strelka2's advantage is precision — 222 false positives against 340–416 for the other callers, and 1,223–2,337 for union strategies. The guarded ML rescue is a small genuine gain: 9 additional true variants (p = 0.0039) for 5 extra false positives that do not reach significance (p = 0.063).
- Indels: multi-caller fusion does beat the best single caller. A random forest matches Strelka2's recall exactly (p = 0.40) while removing 51 of its false positives (p = 1.5 × 10⁻⁷).
- An earlier single-chromosome pilot found no fusion benefit. That conclusion was correct for its 29 indels and had no power to detect this one — the finding only appeared at 36× the data. Both results are published in the repository.
Copy number, on a synthetic 16-sample cohort with 37 events planted at real pharmacogene coordinates: the five-caller ensemble recovers 35/37 at precision 1.000, F1 0.972, against F1 0.596 for the best individual caller, with no calls in controls. The mechanism is aggregation rather than voting — merging thousands of per-target calls into correctly sized segments.
One sample, one capture kit, one chemistry. Scoring is confined to GIAB confident regions, which deliberately exclude segmental duplications and pseudogene-adjacent sequence — so real CYP2D6 calling is harder than any number above. The CNV results are synthetic throughout: GIAB's GRCh38 structural-variant benchmark contains exactly one deletion large enough and overlapping enough capture targets to be callable from exome data. Not a diagnostic device; not clinically validated.
Repository · Python
Can a cancer model's RNA-expression and genomic profile predict which genes it depends on for survival?
End-to-end machine learning on public DepMap data: predicts CRISPR gene-effect values from RNA expression, damaging mutations, copy number and lineage across 1,066 cancer models, then separates predictions into common-essential genes (used as positive controls) and the selective dependencies that are actually interesting as therapeutic hypotheses.
Precision@10 of 0.965 on held-out models, validated against an independent Sanger screen. The trained model ships with a runnable CLI, so you can pass your own expression and mutation tables and get a ranked dependency list back.
Repository · Python
A dependency-light CLI for auditing panel designs against user-supplied risk tracks. Given a panel BED, it measures the target footprint, quantifies coverage of critical regions, and flags overlap with difficult territory — repeats, low mappability, high GC, homologous genes, pseudogene-like regions.
It also derives empirical GC-extreme, homopolymer and low-complexity risk tracks directly from FASTA, then tests whether those tracks are enriched in assay failures or low-callability benchmark regions — turning "this panel looks fine" into a testable claim. Outputs Markdown, JSON and HTML reports.
Deliberately track-driven: the repo ships small demo tracks only, because a real audit needs curated, versioned tracks chosen for the specific assay.
Repository · R / Bioconductor
A reproducible R Markdown workflow over TCGA-BRCA RNA-seq: TCGAbiolinks retrieval, DESeq2 differential expression between primary tumour and solid tissue normal, volcano plot and heatmap, Kaplan–Meier survival stratified by ERBB2 expression, a LASSO classifier separating tumour from normal, and GO biological-process enrichment with clusterProfiler.
Three things show up in every repository above, and they are the point:
- Negative results are published. PGX ships a document stating that its four-caller fusion did not beat a single caller on the first dataset — and then the whole-exome result that partly reverses it. Both are in the repository.
- Claims are tested, not asserted. Paired McNemar tests where the comparison is paired, Wilson intervals where the sample is small, and the sample size stated next to every metric.
- Limits are written down before someone finds them. Every project has a section saying what its evidence does not support.
LinkedIn · Université Paris-Saclay, GENIOMHE