Jupyter Notebook

Gene Ontology (GO)#

Pathways represent interconnected molecular networks of signaling cascades that govern critical cellular processes. They provide understandings cellular behavior mechanisms, insights of disease progression and treatment responses. In an R&D organization, managing pathways across different datasets are crucial for gaining insights of potential therapeutic targets and intervention strategies.

In this notebook we manage a pathway registry based on “2023 GO Biological Process” ontology. We’ll walk you through the steps of registering pathways and link them to genes.

In the following Standardize metadata on-the-fly notebook, we’ll demonstrate how to perform a pathway enrichment analysis and track the dataset with LaminDB.

Setup#

Warning

Please ensure that you have created or loaded a LaminDB instance before running the remaining part of this notebook!

This notebook follows the [CellTypist], which populate the CellType registry.

!lamin init --storage ./use-cases-registries --schema bionty
Hide code cell output
✅ saved: User(uid='DzTjkKse', handle='testuser1', name='Test User1', updated_at=2024-01-18 22:13:24 UTC)
✅ saved: Storage(uid='QmCXLgfw', root='/home/runner/work/lamin-usecases/lamin-usecases/docs/use-cases-registries', type='local', updated_at=2024-01-18 22:13:24 UTC, created_by_id=1)
💡 loaded instance: testuser1/use-cases-registries
💡 did not register local instance on hub
import lamindb as ln
import lnschema_bionty as lb
import gseapy as gp

lb.settings.organism = "human"  # globally set organism
💡 lamindb instance: testuser1/use-cases-registries
2024-01-18 22:13:26,535:INFO - Failed to extract font properties from /usr/share/fonts/truetype/noto/NotoColorEmoji.ttf: In FT2Font: Can not load face (unknown file format; error code 0x2)
2024-01-18 22:13:26,564:INFO - generated new fontManager

Fetch GO pathways annotated with human genes using Enrichr#

First we fetch the “GO_Biological_Process_2023” pathways for humans using GSEApy which wraps GSEA and Enrichr.

go_bp = gp.get_library(name="GO_Biological_Process_2023", organism="Human")
print(f"Number of pathways {len(go_bp)}")
2024-01-18 22:13:28,159:INFO - Downloading and generating Enrichr library gene sets...
2024-01-18 22:13:31,573:INFO - 0001 gene_sets have been filtered out when max_size=2000 and min_size=0
Number of pathways 5406
go_bp["ATF6-mediated Unfolded Protein Response (GO:0036500)"]
['MBTPS1', 'MBTPS2', 'XBP1', 'ATF6B', 'DDIT3', 'CREBZF']

Parse out the ontology_id from keys, convert into the format of {ontology_id: (name, genes)}

def parse_ontology_id_from_keys(key):
    """Parse out the ontology id.

    "ATF6-mediated Unfolded Protein Response (GO:0036500)" -> ("GO:0036500", "ATF6-mediated Unfolded Protein Response")
    """
    id = key.split(" ")[-1].replace("(", "").replace(")", "")
    name = key.replace(f" ({id})", "")
    return (id, name)
go_bp_parsed = {}

for key, genes in go_bp.items():
    id, name = parse_ontology_id_from_keys(key)
    go_bp_parsed[id] = (name, genes)
go_bp_parsed["GO:0036500"]
('ATF6-mediated Unfolded Protein Response',
 ['MBTPS1', 'MBTPS2', 'XBP1', 'ATF6B', 'DDIT3', 'CREBZF'])

Register pathway ontology in LaminDB#

bionty = lb.Pathway.public()
bionty
PublicOntology
Entity: Pathway
Organism: all
Source: go, 2023-05-10
#terms: 47514

📖 .df(): ontology reference table
🔎 .lookup(): autocompletion of terms
🎯 .search(): free text search of terms
✅ .validate(): strictly validate values
🧐 .inspect(): full inspection of values
👽 .standardize(): convert to standardized names
🪜 .diff(): difference between two versions
🔗 .to_pronto(): Pronto.Ontology object

Next, we register all the pathways and genes in LaminDB to finally link pathways to genes.

Register pathway terms#

To register the pathways we make use of .from_values to directly parse the annotated GO pathway ontology IDs into LaminDB.

pathway_records = lb.Pathway.from_values(go_bp_parsed.keys(), lb.Pathway.ontology_id)
lb.Pathway.from_public(ontology_id="GO:0015868")
Pathway(uid='5bQIT2QT', name='purine ribonucleotide transport', ontology_id='GO:0015868', description='The Directed Movement Of A Purine Ribonucleotide, Any Compound Consisting Of A Purine Ribonucleoside (A Purine Organic Base Attached To A Ribose Sugar) Esterified With (Ortho)Phosphate, Into, Out Of Or Within A Cell.', public_source_id=44, created_by_id=1)
ln.save(pathway_records, parents=False)  # not recursing through parents

Register gene symbols#

Similarly, we use .from_values for all Pathway associated genes to register them with LaminDB.

all_genes = {g for genes in go_bp.values() for g in genes}
gene_records = lb.Gene.from_values(all_genes, lb.Gene.symbol)
Hide code cell output
❗ ambiguous validation in Bionty for 1082 records: 'GMFG', 'NMB', 'APEX1', 'IGHE', 'LRTM2', 'AKAP17A', 'HLA-DRB3', 'DAXX', 'RCC2', 'OCLN', 'CCHCR1', 'TBC1D3K', 'PCDHB16', 'GFER', 'NEU4', 'ZBTB9', 'SDCCAG8', 'SMPD4', 'MYOM2', 'MOXD2P', ...
did not create Gene records for 37 non-validated symbols: 'AFD1', 'AZF1', 'CCL4L1', 'DGS2', 'DUX3', 'DUX5', 'FOXL3-OT1', 'IGL', 'LOC100653049', 'LOC102723475', 'LOC102723996', 'LOC102724159', 'LOC107984156', 'LOC112268384', 'LOC122319436', 'LOC122513141', 'LOC122539214', 'LOC344967', 'MDRV', 'MTRNR2L1', ...
gene_records[:3]
[Gene(uid='7PLJNKI9RI8I', symbol='ZC3H14', ensembl_gene_id='ENSG00000100722', ncbi_gene_ids='79882', biotype='protein_coding', description='zinc finger CCCH-type containing 14 ', synonyms='UKP68|NY-REN-37|FLJ11806', organism_id=1, public_source_id=9, created_by_id=1),
 Gene(uid='1967igFAMgiU', symbol='CADM3', ensembl_gene_id='ENSG00000162706', ncbi_gene_ids='57863', biotype='protein_coding', description='cell adhesion molecule 3 ', synonyms='NECL1|NECL-1|SYNCAM3|BIGR|TSLL1|FLJ10698|IGSF4B', organism_id=1, public_source_id=9, created_by_id=1),
 Gene(uid='1NsClJHeUwUn', symbol='VRK3', ensembl_gene_id='ENSG00000105053', ncbi_gene_ids='51231', biotype='protein_coding', description='VRK serine/threonine kinase 3 ', synonyms='', organism_id=1, public_source_id=9, created_by_id=1)]
ln.save(gene_records);