#let ghl = (u: none, r) => link("https://github.com/" + (if (u == none) { "" } else { u + "/" }) + r.text, r)

Almost all my projects are publicly hosted on GitHub, where my account name is #ghl[`namemcguffin`] (trying to come up with a good one felt like chasing a #link("https://en.wikipedia.org/wiki/MacGuffin")[McGuffin]).
Below is a brief overview of the work I've done recently.

= `usci`: untitled spatial correlation implementation

While working to address reviewer concerns for a publication involving a spatial-transcriptomics dataset, I wanted to quantify levels of spatially biased co-expression between gene programs in different cell sets.
I also used this as an opportunity to learn more about Rust and R interoperability via #link("https://extendr.rs/")[`extendr`] by implementing the core logic in Rust to optimize runtime performance and memory use.
Moreover, using Rust allowed me to introduce multithreaded CPU parallelism via the #link("https://docs.rs/rayon/latest/rayon/")[`rayon`] library with minimal friction.
Finally, I also implemented an approximation routine that can cut down on runtime by orders of magnitude in common use-cases while incurring minimal drifts in accuracy.

Documentation for the package is available at #[https://goeva-lab.ccbr.utoronto.ca/usci].
The package manual is uploaded in each #link("https://github.com/goeva-lab/usci/releases/latest/download/usci.pdf")[latest release].
Source code is available on GitHub under the #ghl[`goeva-lab/usci`] repo.

= `glmGamPoi` performance and memory optimization

#ghl(u: "const-ae")[`glmGamPoi`] is an existing (and excellent) library for differential gene expression analysis.
However, the current version of the library (as of #{ datetime.today().display("[month repr:long] [year]") }) represents gene counts as a dense matrix, even when a sparse representation is initially provided and significantly preferable.
During my work in the #link("https://goeva-lab.ccbr.utoronto.ca")[Goeva lab], we were interested in using #ghl(u: "const-ae")[`glmGamPoi`] with atlas-scale scRNA-seq data, which lead to issues as representing such data in a dense fashion in memory is incredibly prohibitive.
As such, I developed an internal fork which maintains a sparse representation for inputs throughout the model fitting process.
Moreover, I was also interested in unlocking cross-gene parallelism for the beta and overdispersion estimation processes.
To do this, I rewrote the library's `C++` internals to use #link("https://libeigen.gitlab.io/")[`Eigen`] (instead of #link("https://arma.sourceforge.net/")[`Armadillo`]), and enabled parallelization using the #link("https://ltla.github.io/subpar/")[`subpar`] library.
Finally, I reimplemented overdispersion estimation to utilize a #link("https://en.wikipedia.org/wiki/Newton%27s_method_in_optimization")[Newton-Raphson] routine implemented in `C++` to avoid calling back into `R`.

Source code for the fork is available on GitHub under the #ghl[`goeva-lab/glmGamPoi`] repo.
A pull request was filed for merging with upstream under #link("https://github.com/const-ae/glmGamPoi/pull/77")[PR\#77].

= `found`: a HiDDEN implementation

#link("https://www.nature.com/articles/s41467-024-53666-8")[HiDDEN] is a previously published method for refining batch-level labels in scRNA-seq data.
When I joined the #link("https://goeva-lab.ccbr.utoronto.ca")[Goeva lab], I developed a HiDDEN implementation with a focus on extensibility and accessibility, providing both `Python` and `R` bindings as well as extensive documentation.

A preprint discussing this implementation is available on bioRxiv at #link("https://www.biorxiv.org/content/10.64898/2026.04.10.717768v1")[DOI:10.64898/2026.04.10.717768].
Documentation for the `Python` package is available at #[https://goeva-lab.ccbr.utoronto.ca/found/py].
Documentation for the `R` package is available at #[https://goeva-lab.ccbr.utoronto.ca/found/R].
Source code is available on GitHub under the #ghl[`goeva-lab/found`] repo.

= `UAPL`: untitled anndata plotting library

I generally prefer a grammar of graphics style plotting API, but couldn't find anything that allowed for using #link("https://anndata.readthedocs.io/en/latest/generated/anndata.AnnData.html#anndata.AnnData")[`AnnData`] objects ergonomically with #link("https://plotnine.org/")[`plotnine`], which is my plotting library of choice when doing `Python` work.
As such, I decided to make a set of adapters for making `AnnData`-stored data available to `plotnine`, which I've since found very useful for rapid iteration.

Source code is available on GitHub under the #ghl[`goeva-lab/uapl`] repo.

= `UMAT`: untitled MERSCOPE analysis tool

When working with some #link("https://vizgen.com/products/spatial-transcriptomics/")[MERSCOPE] data, I faced many issues with stability and scaling of existing tooling used to conduct initial processing (e.g. segmentation and transcript assignment).
I became frustrated enough that I decided to make my own tool to resolve this, which I've used for all MERSCOPE data processing I have done since.

Source code is available on GitHub under the #ghl[`namemcguffin/umat`] repo.

= `SCS`: spatial cell selector

While procrastinating from writing #link("https://mcgill.scholaris.ca/items/b8140b9d-551a-447b-b4f8-326d31d38752")[my Master's thesis], I decided to write a tool which lets you easily select cells from spatial transcriptomics datasets using arbitrary bounding boxes, since nothing (at the time) allowed me to do this easily.
I'll note that these days, I would recommend checking out the #link("https://spatialdata.scverse.org/projects/napari/en/stable/index.html")[`napari-spatialdata`] or #ghl(u: "broadinstitute")[`celldega`] projects to resolve this problem.

Source code is available on GitHub under the #ghl[`namemcguffin/scs`] repo.

= `UDP`: untitled dataviz project

When I joined the #link("https://www.mcgill.ca/neurology-neurosurgery/jo-anne-stratton-phd")[Stratton lab], I was charged with making a static-site based visualization portal for a couple scRNA-seq datasets.
I'll note that these days, I would recommend out checking out the #link("https://www.kanaverse.org/kana/")[`kana`] project to resolve this problem.

Source code is available on GitHub under the #ghl[`stratton-lab/dataviz`] repo.
