47
Experimentos
scRNA-seq
scRNA-seq
3TB
Datos
migrables
migrables
8
Donantes
(tumor)
(tumor)
12
Condiciones
tratamiento
tratamiento
6
Ontologías
biológicas
biológicas
100%
Trazabilidad
lineage
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
→
Transform
cellranger_count.nf
→
Artifact
MEL-003.h5ad
→
Transform
annotate_celltypes.py
→
Artifact
MEL-003_annotated.h5ad
→
Transform
train_drug_resp.py
→
Model
bnv042_response_v3.pkl
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
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
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
4
Semana 4 — Collections + dashboards + formación equipo
ln.Collection para dataset atlas pan-tumor | Queries avanzadas por wet lab | Documentación interna BioNova
Integraciones activas y principios clave
Stack de integraciones BioNova
Nextflow
nf-lamin plugin
cellranger pipeline
cellranger pipeline
W&B
Drug response
model tracking
model tracking
GCS
gs://bionova-
lamindb-prod
lamindb-prod
PostgreSQL
Cloud SQL
us-central1
us-central1
Hugging Face
Publicar atlas
pan-tumor (v2)
pan-tumor (v2)
scVI-tools
Anotación
celular auto (v2)
celular auto (v2)
DuckDB
SQL en Parquet
bulk RNA-seq
bulk RNA-seq
Vitessce
Viz espacial
interactiva (v3)
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.