Skip to content

Commit 6d251bd

Browse files
author
jsdearbo
committed
added LNP figures and notebook
1 parent 61f81e3 commit 6d251bd

7 files changed

Lines changed: 7192 additions & 4 deletions

File tree

.github/workflows/deploy.yml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,13 @@ jobs:
5757
cp assets/images/headshot.jpg ai_studio/public/assets/images/headshot.jpg
5858
cp Dearborn_CV_March_2026.pdf ai_studio/public/Dearborn_CV_March_2026.pdf
5959
60+
- name: Stage LNP analysis assets
61+
run: |
62+
mkdir -p ai_studio/public/assets/images/lnp
63+
cp assets/images/lnp/*.png ai_studio/public/assets/images/lnp/
64+
mkdir -p ai_studio/public/notebooks
65+
cp assets/notebooks/lnp_10x.html ai_studio/public/notebooks/lnp_10x.html
66+
6067
- name: Build
6168
working-directory: ai_studio
6269
run: npm run build

ai_studio/App.tsx

Lines changed: 58 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import React, { useState } from 'react';
33
import Navigation from './components/Navigation';
44
import { COMP_BIO_PROJECTS, ML_PROJECTS, PUBLICATIONS, RESEARCH_AREAS, PORTFOLIO_CASES, PRESENTATIONS, ML_EVIDENCE_SECTIONS } from './constants';
55
import { PortfolioCase } from './types';
6-
import { Github, Linkedin, Mail, FileText, ExternalLink, Code2, Beaker, Cpu, Database, ArrowRight, BarChart2, FlaskConical } from 'lucide-react';
6+
import { Github, Linkedin, Mail, FileText, ExternalLink, Code2, Beaker, Cpu, Database, ArrowRight, BarChart2, FlaskConical, FileCode } from 'lucide-react';
77

88
const accentBorderMap: Record<string, string> = {
99
blue: 'border-l-blue-600',
@@ -215,7 +215,18 @@ const App: React.FC = () => {
215215
<div key={i} className="glass p-8 rounded-3xl border-l-4 border-l-purple-600 space-y-6">
216216
<h3 className="text-2xl font-bold">{c.title}</h3>
217217

218-
<FigurePlaceholderBlock label={c.figurePlaceholderLabel} />
218+
<FigurePlaceholderBlock label={c.figurePlaceholderLabel} imagePath={c.figureImagePath} />
219+
220+
{c.notebookPath && (
221+
<a
222+
href={c.notebookPath}
223+
target="_blank"
224+
rel="noreferrer"
225+
className="inline-flex items-center gap-2 text-sm text-blue-400 hover:text-blue-300 transition-colors"
226+
>
227+
<FileCode size={14} /> View Analysis Notebook <ExternalLink size={12} />
228+
</a>
229+
)}
219230

220231
<div className="grid grid-cols-1 md:grid-cols-2 gap-6">
221232
<div>
@@ -389,8 +400,50 @@ const App: React.FC = () => {
389400
</div>
390401
</div>
391402

392-
{/* Shiny demo — secondary link */}
393-
<div className="glass p-6 rounded-2xl border border-white/10 flex flex-col md:flex-row items-start md:items-center justify-between gap-4">
403+
{/* Published analyses — secondary links */}
404+
<div className="space-y-4">
405+
{/* ACS Nano scRNA-seq */}
406+
<div className="glass p-6 rounded-2xl border border-white/10 flex flex-col md:flex-row items-start md:items-center justify-between gap-4">
407+
<div className="space-y-2">
408+
<div className="flex items-center gap-2 flex-wrap">
409+
<span className="text-[10px] font-bold px-2 py-0.5 rounded uppercase tracking-wider bg-green-500/20 text-green-400">
410+
Published
411+
</span>
412+
<span className="text-[10px] font-bold px-2 py-0.5 rounded uppercase tracking-wider bg-white/10 text-gray-400">
413+
R · Seurat · scRNA-seq · 10x
414+
</span>
415+
</div>
416+
<h4 className="font-semibold text-base">
417+
Single-Cell Transcriptomics — Intramuscular LNP Immune Response
418+
</h4>
419+
<p className="text-sm text-gray-500 max-w-xl">
420+
Identified 9 immune populations in injected muscle. Myeloid infiltrates drive ISG and
421+
inflammasome programs in response to SM-102 eLNP. Figure 3,{' '}
422+
<span className="italic">ACS Nano</span> (2024).
423+
</p>
424+
</div>
425+
<div className="flex items-center gap-3 shrink-0">
426+
<a
427+
href="/notebooks/lnp_10x.html"
428+
target="_blank"
429+
rel="noreferrer"
430+
className="flex items-center gap-2 glass px-4 py-2 rounded-lg text-sm font-medium text-blue-400 hover:text-blue-300 hover:border-blue-500/50 transition-all"
431+
>
432+
<FileCode size={14} /> View Notebook
433+
</a>
434+
<a
435+
href="https://doi.org/10.1021/acsnano.4c08490"
436+
target="_blank"
437+
rel="noreferrer"
438+
className="flex items-center gap-2 glass px-4 py-2 rounded-lg text-sm font-medium text-gray-400 hover:text-gray-300 hover:border-white/20 transition-all"
439+
>
440+
View Paper <ExternalLink size={14} />
441+
</a>
442+
</div>
443+
</div>
444+
445+
{/* Shiny demo — secondary link */}
446+
<div className="glass p-6 rounded-2xl border border-white/10 flex flex-col md:flex-row items-start md:items-center justify-between gap-4">
394447
<div className="space-y-2">
395448
<div className="flex items-center gap-2 flex-wrap">
396449
<span className="text-[10px] font-bold px-2 py-0.5 rounded uppercase tracking-wider bg-green-500/20 text-green-400">
@@ -417,6 +470,7 @@ const App: React.FC = () => {
417470
>
418471
Open app <ExternalLink size={14} />
419472
</a>
473+
</div>
420474
</div>
421475
</section>
422476
);

ai_studio/constants.tsx

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -151,6 +151,27 @@ export const PORTFOLIO_CASES: PortfolioCase[] = [
151151
signalsForML: "Pathway-level summarization of high-dimensional transcriptomic data, statistical pipeline design, DESeq2 normalization and modeling.",
152152
signalsForBio: "Bulk RNA-seq end-to-end, differential expression, GSEA, adipose and cancer biology, published collaborative analysis.",
153153
figurePlaceholderLabel: "Figure: Volcano plot — gWAT DEGs at 3 and 6 weeks"
154+
},
155+
{
156+
title: "Single-Cell Transcriptomics of the Intramuscular mRNA/LNP Immune Response",
157+
problem: "mRNA/LNP vaccines drive adjuvancy through ionizable lipids, but which immune cell types in injected muscle are activated and what gene programs do they execute? Answering this at single-cell resolution required building a complete scRNA-seq pipeline from raw count matrices.",
158+
data: "10x Chromium scRNA-seq of CD45+ immune cells from SM-102 eLNP- and PBS-injected mouse muscle (n=4/group, pooled into 2 samples; 5,511 LNP-treated + 1,189 PBS barcodes after QC). Hashtag demultiplexing via TotalSeq-A.",
159+
whatIBuilt: "Full Seurat pipeline: multi-sample integration, SCTransform normalization with MT% regression, UMAP clustering, automated cell type annotation (scType) cross-validated against manual marker-based annotation, and differential expression across 9 immune populations.",
160+
methodsStack: [
161+
"R / Seurat — multi-sample integration, SCTransform, FindNeighbors, FindClusters",
162+
"UMAP dimensionality reduction (30 PCs)",
163+
"scType automated cell type scoring (immune system reference)",
164+
"Manual annotation using canonical marker panels (Cx3cr1/Ccr2, S100a8/S100a9, Flt3/Xcr1)",
165+
"FindAllMarkers — per-cluster differential expression across 9 cell types",
166+
"Violin and split plots of ISGs, inflammasome, and cytokine genes across PBS vs. LNP conditions"
167+
],
168+
result: "Identified 9 immune populations in injected muscle. Neutrophils and monocytes from SM-102-injected mice upregulate ISGs (Irf7, Isg15), inflammasome components (Nlrp3, Il1b), and cytokines (Tnf, Cxcl2) — published as Figure 3, Dowell et al., ACS Nano 2024 (doi:10.1021/acsnano.4c08490).",
169+
whyItMatters: "Single-cell resolution revealed that myeloid infiltrates — not muscle tissue in bulk — are the source of the LNP-driven inflammatory program. This reframes how vaccine lipid adjuvancy works and provides a design principle distinguishing vaccine-grade (Class A) from therapeutic-grade (Class B) ionizable lipids.",
170+
signalsForML: "Unsupervised clustering of high-dimensional count data, evaluation of automated cell type classification (scType) against manual ground truth, per-cluster differential ranking from FindAllMarkers — analogous to unsupervised representation learning with post-hoc class label assignment and feature attribution.",
171+
signalsForBio: "Multi-sample hashtag demultiplexing, QC filtering (nFeature > 500, MT% < 10%), SCTransform normalization with confounder regression, marker-based cell type validation across monocytes, neutrophils, DCs, NK cells, B cells, T cells, pDCs, and RBCs.",
172+
figurePlaceholderLabel: "UMAP — CD45+ immune infiltrates, PBS vs. SM-102 eLNP (manual annotation)",
173+
figureImagePath: "/assets/images/lnp/umap_split.png",
174+
notebookPath: "/notebooks/lnp_10x.html",
154175
}
155176
];
156177

ai_studio/types.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,4 +48,6 @@ export interface PortfolioCase {
4848
signalsForML: string;
4949
signalsForBio: string;
5050
figurePlaceholderLabel: string;
51+
figureImagePath?: string;
52+
notebookPath?: string;
5153
}

assets/images/lnp/umap_split.png

561 KB
Loading

assets/images/lnp/vln_nlrp3.png

376 KB
Loading

assets/notebooks/lnp_10x.html

Lines changed: 7104 additions & 0 deletions
Large diffs are not rendered by default.

0 commit comments

Comments
 (0)