GencodeGeneRepository — exploración¶
Carga todos los genes con sus transcritos desde el GFF3 de GENCODE v49 (GRCh38).
El repositorio se instancia una sola vez vía get_gencode_repo() (singleton con @cache).
In [1]:
Copied!
%load_ext autoreload
%autoreload 2
%load_ext autoreload
%autoreload 2
In [2]:
Copied!
import time
from collections import Counter
from functools import cache
from pathlib import Path
from iris.adapters.driven.readers.providers.gencode import GencodeGeneRepository
GFF3_PATH = Path(
"/mnt/cephfs/hot_nvme/gencode/GRCh38.14/gencode.v49.basic.annotation.gff3.gz"
)
import time
from collections import Counter
from functools import cache
from pathlib import Path
from iris.adapters.driven.readers.providers.gencode import GencodeGeneRepository
GFF3_PATH = Path(
"/mnt/cephfs/hot_nvme/gencode/GRCh38.14/gencode.v49.basic.annotation.gff3.gz"
)
Singleton¶
@cache garantiza que el archivo se lea solo una vez por sesión del kernel,
aunque la celda se re-ejecute.
In [3]:
Copied!
@cache
def get_gencode_repo() -> GencodeGeneRepository:
return GencodeGeneRepository(
GFF3_PATH,
assembly="GRCh38",
version="v49",
)
@cache
def get_gencode_repo() -> GencodeGeneRepository:
return GencodeGeneRepository(
GFF3_PATH,
assembly="GRCh38",
version="v49",
)
Carga inicial¶
La primera llamada dispara la lectura del GFF3 y construye el índice en memoria.
In [4]:
Copied!
t0 = time.time()
repo = get_gencode_repo()
all_annotations = repo.find_all_annotations()
elapsed = time.time() - t0
print(f"Genes cargados : {len(all_annotations):,}")
print(f"Tiempo : {elapsed:.1f}s")
t0 = time.time()
repo = get_gencode_repo()
all_annotations = repo.find_all_annotations()
elapsed = time.time() - t0
print(f"Genes cargados : {len(all_annotations):,}")
print(f"Tiempo : {elapsed:.1f}s")
Genes cargados : 78,691 Tiempo : 131.6s
Estadísticas generales¶
In [5]:
Copied!
n_transcripts = sum(len(a.transcripts) for a in all_annotations)
biotype_counts = Counter(a.biotype.name for a in all_annotations)
tr_per_gene = [len(a.transcripts) for a in all_annotations]
print(f"Transcritos totales : {n_transcripts:,}")
print(
f"Transcritos/gen : media={sum(tr_per_gene)/len(tr_per_gene):.1f} max={max(tr_per_gene)}"
)
print()
print("Biotipos (top 10):")
for biotype, n in biotype_counts.most_common(10):
print(f" {biotype:<35} {n:>8,}")
n_transcripts = sum(len(a.transcripts) for a in all_annotations)
biotype_counts = Counter(a.biotype.name for a in all_annotations)
tr_per_gene = [len(a.transcripts) for a in all_annotations]
print(f"Transcritos totales : {n_transcripts:,}")
print(
f"Transcritos/gen : media={sum(tr_per_gene)/len(tr_per_gene):.1f} max={max(tr_per_gene)}"
)
print()
print("Biotipos (top 10):")
for biotype, n in biotype_counts.most_common(10):
print(f" {biotype:<35} {n:>8,}")
Transcritos totales : 280,000 Transcritos/gen : media=3.6 max=346 Biotipos (top 10): NON_CODING 41,946 PROTEIN_CODING 20,097 PSEUDOGENE 14,464 TEC 1,019 IMMUNE_RECEPTOR 648 OTHER 517
Búsqueda por gen¶
In [6]:
Copied!
ann = repo.get_annotation("BRCA1")
assert ann is not None
g = ann.gene
print(f"Símbolo : {g.symbol}")
print(f"Posición : {g.position}")
print(f"Biotipo : {ann.biotype.name}")
print(f"Transcritos: {len(ann.transcripts)}")
ann = repo.get_annotation("BRCA1")
assert ann is not None
g = ann.gene
print(f"Símbolo : {g.symbol}")
print(f"Posición : {g.position}")
print(f"Biotipo : {ann.biotype.name}")
print(f"Transcritos: {len(ann.transcripts)}")
Símbolo : BRCA1 Posición : GenomicPosition(chromosome='17', assembly='GRCh38', start=43044292, end=43170245, strand=<Strand.MINUS: '-'>, name=None, markers=()) Biotipo : PROTEIN_CODING Transcritos: 32
Transcritos MANE Select¶
In [7]:
Copied!
mane_select = [
(a.gene.symbol, t)
for a in all_annotations
for t in a.transcripts
if t.is_mane_select
]
print(f"Transcritos MANE Select: {len(mane_select):,}")
print()
print("Ejemplos:")
for symbol, t in mane_select[:10]:
n_exons = len(t.exons)
n_cds = len(t.cds)
print(f" {symbol:<12} {t.name:<20} exones={n_exons:>3} CDS={n_cds:>3}")
mane_select = [
(a.gene.symbol, t)
for a in all_annotations
for t in a.transcripts
if t.is_mane_select
]
print(f"Transcritos MANE Select: {len(mane_select):,}")
print()
print("Ejemplos:")
for symbol, t in mane_select[:10]:
n_exons = len(t.exons)
n_cds = len(t.cds)
print(f" {symbol:<12} {t.name:<20} exones={n_exons:>3} CDS={n_cds:>3}")
Transcritos MANE Select: 19,276 Ejemplos: OR4F5 ENST00000641515.2 exones= 2 CDS= 2 OR4F29 ENST00000426406.4 exones= 0 CDS= 0 OR4F16 ENST00000332831.5 exones= 0 CDS= 0 SAMD11 ENST00000616016.5 exones= 13 CDS= 14 NOC2L ENST00000327044.7 exones= 18 CDS= 19 KLHL17 ENST00000338591.8 exones= 11 CDS= 12 PLEKHN1 ENST00000379410.8 exones= 15 CDS= 16 PERM1 ENST00000433179.4 exones= 3 CDS= 3 HES4 ENST00000304952.11 exones= 3 CDS= 4 ISG15 ENST00000649529.1 exones= 1 CDS= 2
Estructura de un transcrito — BRCA1 MANE Select¶
In [8]:
Copied!
brca1_mane = next(
(t for t in ann.transcripts if t.is_mane_select),
ann.transcripts[0],
)
print(f"Transcrito : {brca1_mane.name}")
print(f"Biotipo : {brca1_mane.biotype.name}")
print(f"Canónico : {brca1_mane.is_canonical}")
print(f"MANE Select: {brca1_mane.is_mane_select}")
print(f"Posición : {brca1_mane.position}")
print(f"Exones : {len(brca1_mane.exons)}")
print(f"CDS : {len(brca1_mane.cds)}")
print(f"UTRs : {len(brca1_mane.utrs)}")
print(f"Start codón: {brca1_mane.start_codon}")
print(f"Stop codón : {brca1_mane.stop_codon}")
print()
print("Primeros 5 exones:")
for e in brca1_mane.exons[:5]:
print(f" {e}")
brca1_mane = next(
(t for t in ann.transcripts if t.is_mane_select),
ann.transcripts[0],
)
print(f"Transcrito : {brca1_mane.name}")
print(f"Biotipo : {brca1_mane.biotype.name}")
print(f"Canónico : {brca1_mane.is_canonical}")
print(f"MANE Select: {brca1_mane.is_mane_select}")
print(f"Posición : {brca1_mane.position}")
print(f"Exones : {len(brca1_mane.exons)}")
print(f"CDS : {len(brca1_mane.cds)}")
print(f"UTRs : {len(brca1_mane.utrs)}")
print(f"Start codón: {brca1_mane.start_codon}")
print(f"Stop codón : {brca1_mane.stop_codon}")
print()
print("Primeros 5 exones:")
for e in brca1_mane.exons[:5]:
print(f" {e}")
Transcrito : ENST00000357654.9 Biotipo : PROTEIN_CODING Canónico : True MANE Select: True Posición : GenomicPosition(chromosome='17', assembly='GRCh38', start=43044295, end=43125364, strand=<Strand.MINUS: '-'>, name=None, markers=()) Exones : 22 CDS : 22 UTRs : 2 Start codón: GenomicPosition(chromosome='17', assembly='GRCh38', start=43124094, end=43124096, strand=<Strand.MINUS: '-'>, name=None, markers=()) Stop codón : GenomicPosition(chromosome='17', assembly='GRCh38', start=43045678, end=43045680, strand=<Strand.MINUS: '-'>, name=None, markers=()) Primeros 5 exones: GenomicPosition(chromosome='17', assembly='GRCh38', start=43047643, end=43047703, strand=<Strand.MINUS: '-'>, name='ENSE00004011552.1', markers=()) GenomicPosition(chromosome='17', assembly='GRCh38', start=43049121, end=43049194, strand=<Strand.MINUS: '-'>, name='ENSE00004011568.1', markers=()) GenomicPosition(chromosome='17', assembly='GRCh38', start=43051063, end=43051117, strand=<Strand.MINUS: '-'>, name='ENSE00004011553.1', markers=()) GenomicPosition(chromosome='17', assembly='GRCh38', start=43057052, end=43057135, strand=<Strand.MINUS: '-'>, name='ENSE00004011551.1', markers=()) GenomicPosition(chromosome='17', assembly='GRCh38', start=43063333, end=43063373, strand=<Strand.MINUS: '-'>, name='ENSE00004011567.1', markers=())
Búsqueda por posición genómica¶
In [9]:
Copied!
from iris.domain.genomics.objects import GenomicPosition
# Posición conocida en BRCA1 (chr17:43,044,295, 1-based)
pos = GenomicPosition(
chromosome="chr17", start=43_044_295, end=43_044_295, assembly="GRCh38"
)
genes_at_pos = repo.find_by_position(pos)
print(f"Genes en {pos}: {[g.symbol for g in genes_at_pos]}")
from iris.domain.genomics.objects import GenomicPosition
# Posición conocida en BRCA1 (chr17:43,044,295, 1-based)
pos = GenomicPosition(
chromosome="chr17", start=43_044_295, end=43_044_295, assembly="GRCh38"
)
genes_at_pos = repo.find_by_position(pos)
print(f"Genes en {pos}: {[g.symbol for g in genes_at_pos]}")
Genes en GenomicPosition(chromosome='chr17', assembly='GRCh38', start=43044295, end=43044295, strand=None, name=None, markers=()): []