🧬

BioNova Therapeutics

CAR-T Oncology Research · Madrid, España

LaminDB 2.5.1 Bionty 2.4.0 Python 3.11 GCP us-central1 PostgreSQL

LaminDB Biological Data Lakehouse

Blueprint de implementación: trazabilidad, validación ontológica y queryabilidad para 3TB de datos scRNA-seq

47
Experimentos
scRNA-seq
3TB
Datos
migrables
8
Donantes
(tumor)
12
Condiciones
tratamiento
6
Ontologías
biológicas
100%
Trazabilidad
lineage
Situación actual vs. Después de LaminDB
Antes — Problemas
Datos dispersos en Drive, Dropbox y discos locales sin versionado
Metadatos inconsistentes: "T cell", "T-cell", "T_cell" = mismo tipo
Notebooks irreproducibles, sin linkaje código-datos
Sin trazabilidad entre experimentos y modelos de clasificación
Cargar 50GB para encontrar 3 muestras tratadas de melanoma
Wet lab y bioinformática con vocabulario separado
Después — Con LaminDB
GCS lakehouse centralizado con keys jerárquicas versionadas
Ontología CL canónica: "T cell" mapeado a CL:0000084
ln.track() + ln.finish() captura linaje automático en cada run
Artifacts linkados a W&B runs y modelos en registry
Query por metadatos en milisegundos, sin cargar archivos
Vocabulario compartido vía Bionty (genes Ensembl, tejidos Uberon)
Setup inicial — Instancia BioNova
Inicializar instancia GCP + PostgreSQL
bash / python # 1. Instalar con extras para GCP y AnnData uv pip install 'lamindb[gcp,zarr-v2,fcs]==2.5.1' uv pip install 'bionty==2.4.0' # 2. Autenticar y crear instancia lamin login alvarogimeno2002@gmail.com lamin init \ --storage gs://bionova-lamindb-prod \ --db "$LAMIN_DB_URL" \ --name bionova-prod \ --modules bionty # settings.json resultante: # storage: gs://bionova-lamindb-prod/ # isec_id: bionova/prod
🔬
Importar ontologías biológicas relevantes
python import lamindb as ln import bionty as bt # Importar ontologías para uso en BioNova bt.CellType.import_source() # CL ontology bt.Gene.import_source( # Ensembl Homo sapiens organism="human" ) bt.Tissue.import_source() # Uberon bt.Disease.import_source() # Mondo bt.ExperimentalFactor.import_source() # EFO bt.Organism.import_source() # NCBItaxon
Validación ontológica — Estandarización de metadatos scRNA-seq
🏷
Términos encontrados en los 47 experimentos → Términos canónicos Bionty
Columna Término original (wet lab) Término canónico Ontología ID Acción Estado
cell_type T cell, T-cell, T_cell, CD3+ T T cell CL:0000084 standardize() ✓ Validado
cell_type NK, natural killer, NK cell, NKcell natural killer cell CL:0000623 standardize() ✓ Validado
tissue PBMC, PBMCs, pbmc peripheral blood mononuclear cell CL:0000476 add_ontology() ✓ Validado
disease melanoma, mel., skin cancer melanoma MONDO:0005105 standardize() ✓ Validado
disease lung ca, LUAD, lung adenocarcinoma lung adenocarcinoma MONDO:0005061 standardize() ✓ Validado
assay 10X, 10x Chromium, CellRanger 10x 3' v3 EFO:0009922 add_ontology() ⚠ Revisar
organism human, Homo sapiens, H. sapiens Homo sapiens NCBItaxon:9606 standardize() ✓ Validado
Pipeline de curación AnnData — scRNA-seq batch
📋
Esquema de validación — BioNovaSingleCellSchema
python import lamindb as ln import bionty as bt # Definir features tipados ln.Feature.get_or_create( name="cell_type", dtype="cat[CellType]") ln.Feature.get_or_create( name="tissue", dtype="cat[Tissue]") ln.Feature.get_or_create( name="disease", dtype="cat[Disease]") ln.Feature.get_or_create( name="donor_id", dtype="str") ln.Feature.get_or_create( name="treatment", dtype="str") # Crear esquema BioNova schema = ln.Schema( name="BioNovaSCRNAseqSchema_v1", features=["cell_type", "tissue", "disease", "donor_id"], dtype="AnnData", coerce_dtype=True, ).save()
Curar y registrar artifact con trazabilidad
python import anndata as ad # Track notebook automáticamente ln.track(params={ "batch": "MEL-003", "pipeline": "cellranger_v7.1" }) # Cargar y curar AnnData adata = ad.read_h5ad("mel003_raw.h5ad") curator = ln.curators.AnnDataCurator( adata, schema) curator.validate() # raise si falla # Guardar con key jerárquica artifact = curator.save_artifact( key="scrna/melanoma/MEL-003.h5ad", description="Melanoma donor MEL-003, treated" ) # Anotar con ontologías artifact.cell_types.set( bt.CellType.from_values( adata.obs["cell_type"])) ln.finish() # cierra run + captura env
Grafo de linaje — Experimento MEL-003 tratamiento BNV-042
🔀
artifact.view_lineage() — De FASTQ raw a modelo de predicción CAR-T
Raw Input
MEL-003_R1.fastq.gz
12.4 GB · 10X Chromium v3
gs://raw/mel003/
Transform
cellranger_count.nf
Nextflow process
nf-lamin plugin
git: abc1234
Artifact
MEL-003.h5ad
1.2 GB · AnnData
48,231 cells
schema: v1 ✓
Transform
annotate_celltypes.py
scVI + CellTypist
notebook tracked
env: requirements.txt
Artifact
MEL-003_annotated.h5ad
48,231 cells
cell_type: CL ✓
tissue: Uberon ✓
Transform
train_drug_resp.py
W&B: run exp-89
RandomForest
accuracy: 0.91
Model
bnv042_response_v3.pkl
models/drug/
W&B linkado
versión: 3
Queries avanzadas — BioNova Lakehouse
🔍
Consultas de producción — Sin cargar archivos
Todos los artefactos de melanoma tratados con BNV-042
artifacts = ln.Artifact.filter( key__startswith="scrna/melanoma/", treatment="BNV-042", condition="treated" ).all()
Datasets con >10k células NK validadas
nk_datasets = ln.Artifact.filter( cell_types__name="natural killer cell", features__n_cells__gt=10000 ).to_dataframe()
Query lógica: PBMC de 2025 ó tumor de melanoma
results = ln.Artifact.filter( ln.Q(tissue="peripheral blood", created_at__year=2025) | ln.Q(disease="melanoma", tissue="tumor") ).all()
Todos los outputs de un Nextflow run específico
run = ln.Run.get( transform__key="cellranger_count.nf") outputs = run.output_artifacts.all()
📊
Registro de artifacts en el lakehouse
Key (GCS) Cells Size Schema Tags
scrna/melanoma/MEL-001.h5ad 52,847 1.4 GB v1 ✓ treated, BNV-042
scrna/melanoma/MEL-002.h5ad 39,124 980 MB v1 ✓ control, day-14
scrna/melanoma/MEL-003.h5ad 48,231 1.2 GB v1 ✓ treated, BNV-042
scrna/pbmc/PBMC-D01.h5ad 8,943 210 MB ⚠ v1 baseline, donor-1
scrna/lung/LUAD-005.h5ad 61,200 1.8 GB v1 ✓ treated, BNV-017
models/drug/bnv042_v3.pkl 45 MB RF, W&B:exp-89
Plan de implementación — 4 semanas
🚀
Roadmap de adopción BioNova (local → cloud)
1
Semana 1 — Setup + Piloto SQLite local
lamin init --storage ./bionova-dev --modules bionty | Registrar 5 experimentos piloto | Validar con AnnDataCurator
✓ Completado
2
Semana 2 — Migración a GCS + PostgreSQL Cloud SQL
lamin init --storage gs://bionova-lamindb-prod --db $LAMIN_DB_URL | Migrar 47 experimentos | Importar ontologías
✓ Completado
3
Semana 3 — Integrar Nextflow + W&B + estandarizar metadatos
nf-lamin plugin en cellranger pipeline | ln.track() en todos los notebooks | bt.CellType.standardize() en 47 datasets
⚡ En curso
4
Semana 4 — Collections + dashboards + formación equipo
ln.Collection para dataset atlas pan-tumor | Queries avanzadas por wet lab | Documentación interna BioNova
● Pendiente
Integraciones activas y principios clave
🔗
Stack de integraciones BioNova
🔬
Nextflow
nf-lamin plugin
cellranger pipeline
📊
W&B
Drug response
model tracking
GCS
gs://bionova-
lamindb-prod
🐘
PostgreSQL
Cloud SQL
us-central1
🤗
Hugging Face
Publicar atlas
pan-tumor (v2)
🐍
scVI-tools
Anotación
celular auto (v2)
🎯
DuckDB
SQL en Parquet
bulk RNA-seq
👁
Vitessce
Viz espacial
interactiva (v3)
💡
10 principios LaminDB aplicados en BioNova
01
Track everything
ln.track() al inicio de cada notebook y script Nextflow
02
Validate early
AnnDataCurator antes de cualquier análisis downstream
03
Use ontologies
CL, Uberon, Mondo, EFO para todo metadato biológico
04
Organize with keys
scrna/disease/donor_batch.h5ad — jerárquico siempre
05
Query meta first
Filtrar por features antes de .load() archivos grandes
06
Version, not dup
artifact.revise() en lugar de nuevas keys para updates
07
Annotate features
features.set_values() con dtype tipado en cada artifact
08
Document fully
Descripciones en artifacts, schemas y transforms
09
Leverage lineage
view_lineage() para entender provenance antes de publicar
10
Start local
SQLite dev → PostgreSQL + GCS prod. Path probado.