What is the actual quantitative contribution of FcRn-mediated transcytosis to BBB antibody transport in humans?¶
Notebook ID: nb-SDA-2026-04-12-gap-debate-20260410-112908-13c403ee · Analysis: SDA-2026-04-12-gap-debate-20260410-112908-13c403ee · Generated: 2026-04-21T18:48:06
Research question¶
The debate revealed conflicting estimates ranging from <5% to 20% for FcRn's role in BBB transport, with species differences unresolved. This fundamental uncertainty undermines rational design of FcRn-targeted therapeutics and dosing strategies.
Source: Debate session sess_SDA-2026-04-01-gap-008 (Analysis: SDA-2026-04-01-gap-008)
Approach¶
This notebook is generated programmatically from real Forge tool calls and SciDEX debate data. Forge tools used: PubMed Search, MyGene, STRING PPI, Reactome pathways, Enrichr.
Debate Summary¶
Quality score: 0.91 · Rounds: 6
1. Target gene annotations (MyGene)¶
import pandas as pd
ann_rows = [{'gene': 'LDLR', 'name': 'low density lipoprotein receptor', 'summary': 'The low density lipoprotein receptor (LDLR) gene family consists of cell surface proteins involved in receptor-mediated '}]
pd.DataFrame(ann_rows)
| gene | name | summary | |
|---|---|---|---|
| 0 | LDLR | low density lipoprotein receptor | The low density lipoprotein receptor (LDLR) ge... |
2. GO Biological Process enrichment (Enrichr)¶
go_bp = [{'rank': 1, 'term': 'Cholesterol Import (GO:0070508)', 'p_value': 0.0002499917995416556, 'odds_ratio': 19995.0, 'genes': ['LDLR']}, {'rank': 2, 'term': 'Negative Regulation Of Astrocyte Differentiation (GO:0048712)', 'p_value': 0.0002499917995416556, 'odds_ratio': 19995.0, 'genes': ['LDLR']}, {'rank': 3, 'term': 'Positive Regulation Of Protein Catabolic Process In The Vacuole (GO:1904352)', 'p_value': 0.0002499917995416556, 'odds_ratio': 19995.0, 'genes': ['LDLR']}, {'rank': 4, 'term': 'Negative Regulation Of Lipoprotein Particle Clearance (GO:0010985)', 'p_value': 0.0002999905873105514, 'odds_ratio': 19994.0, 'genes': ['LDLR']}, {'rank': 5, 'term': 'Negative Regulation Of Microglial Cell Activation (GO:1903979)', 'p_value': 0.00034998943191536045, 'odds_ratio': 19993.0, 'genes': ['LDLR']}, {'rank': 6, 'term': 'Regulation Of Lysosomal Protein Catabolic Process (GO:1905165)', 'p_value': 0.0003999883241497325, 'odds_ratio': 19992.0, 'genes': ['LDLR']}, {'rank': 7, 'term': 'Intestinal Cholesterol Absorption (GO:0030299)', 'p_value': 0.0004499872571388355, 'odds_ratio': 19991.0, 'genes': ['LDLR']}, {'rank': 8, 'term': 'Regulation Of Low-Density Lipoprotein Particle Clearance (GO:0010988)', 'p_value': 0.0004999862257578379, 'odds_ratio': 19990.0, 'genes': ['LDLR']}, {'rank': 9, 'term': 'Negative Regulation Of Nitrogen Compound Metabolic Process (GO:0051172)', 'p_value': 0.0005499852259717758, 'odds_ratio': 19989.0, 'genes': ['LDLR']}, {'rank': 10, 'term': 'Intestinal Lipid Absorption (GO:0098856)', 'p_value': 0.0005499852259717758, 'odds_ratio': 19989.0, 'genes': ['LDLR']}]
go_df = pd.DataFrame(go_bp)[['term','p_value','odds_ratio','genes']]
go_df['p_value'] = go_df['p_value'].apply(lambda p: f'{p:.2e}')
go_df['odds_ratio'] = go_df['odds_ratio'].round(1)
go_df['term'] = go_df['term'].str[:60]
go_df['n_hits'] = go_df['genes'].apply(len)
go_df['genes'] = go_df['genes'].apply(lambda g: ', '.join(g))
go_df[['term','n_hits','p_value','odds_ratio','genes']]
| term | n_hits | p_value | odds_ratio | genes | |
|---|---|---|---|---|---|
| 0 | Cholesterol Import (GO:0070508) | 1 | 2.50e-04 | 19995.0 | LDLR |
| 1 | Negative Regulation Of Astrocyte Differentiati... | 1 | 2.50e-04 | 19995.0 | LDLR |
| 2 | Positive Regulation Of Protein Catabolic Proce... | 1 | 2.50e-04 | 19995.0 | LDLR |
| 3 | Negative Regulation Of Lipoprotein Particle Cl... | 1 | 3.00e-04 | 19994.0 | LDLR |
| 4 | Negative Regulation Of Microglial Cell Activat... | 1 | 3.50e-04 | 19993.0 | LDLR |
| 5 | Regulation Of Lysosomal Protein Catabolic Proc... | 1 | 4.00e-04 | 19992.0 | LDLR |
| 6 | Intestinal Cholesterol Absorption (GO:0030299) | 1 | 4.50e-04 | 19991.0 | LDLR |
| 7 | Regulation Of Low-Density Lipoprotein Particle... | 1 | 5.00e-04 | 19990.0 | LDLR |
| 8 | Negative Regulation Of Nitrogen Compound Metab... | 1 | 5.50e-04 | 19989.0 | LDLR |
| 9 | Intestinal Lipid Absorption (GO:0098856) | 1 | 5.50e-04 | 19989.0 | LDLR |
import matplotlib.pyplot as plt
import numpy as np
go_bp = [{'rank': 1, 'term': 'Cholesterol Import (GO:0070508)', 'p_value': 0.0002499917995416556, 'odds_ratio': 19995.0, 'genes': ['LDLR']}, {'rank': 2, 'term': 'Negative Regulation Of Astrocyte Differentiation (GO:0048712)', 'p_value': 0.0002499917995416556, 'odds_ratio': 19995.0, 'genes': ['LDLR']}, {'rank': 3, 'term': 'Positive Regulation Of Protein Catabolic Process In The Vacuole (GO:1904352)', 'p_value': 0.0002499917995416556, 'odds_ratio': 19995.0, 'genes': ['LDLR']}, {'rank': 4, 'term': 'Negative Regulation Of Lipoprotein Particle Clearance (GO:0010985)', 'p_value': 0.0002999905873105514, 'odds_ratio': 19994.0, 'genes': ['LDLR']}, {'rank': 5, 'term': 'Negative Regulation Of Microglial Cell Activation (GO:1903979)', 'p_value': 0.00034998943191536045, 'odds_ratio': 19993.0, 'genes': ['LDLR']}, {'rank': 6, 'term': 'Regulation Of Lysosomal Protein Catabolic Process (GO:1905165)', 'p_value': 0.0003999883241497325, 'odds_ratio': 19992.0, 'genes': ['LDLR']}, {'rank': 7, 'term': 'Intestinal Cholesterol Absorption (GO:0030299)', 'p_value': 0.0004499872571388355, 'odds_ratio': 19991.0, 'genes': ['LDLR']}, {'rank': 8, 'term': 'Regulation Of Low-Density Lipoprotein Particle Clearance (GO:0010988)', 'p_value': 0.0004999862257578379, 'odds_ratio': 19990.0, 'genes': ['LDLR']}]
terms = [t['term'][:45] for t in go_bp][::-1]
neglogp = [-np.log10(max(t['p_value'], 1e-300)) for t in go_bp][::-1]
fig, ax = plt.subplots(figsize=(9, 4.5))
ax.barh(terms, neglogp, color='#4fc3f7')
ax.set_xlabel('-log10(p-value)')
ax.set_title('Top GO:BP enrichment (Enrichr)')
ax.grid(axis='x', alpha=0.3)
plt.tight_layout(); plt.show()
/home/ubuntu/.config/matplotlib is not a writable directory
Matplotlib created a temporary cache directory at /tmp/matplotlib-a2gjqcl2 because there was an issue with the default path (/home/ubuntu/.config/matplotlib); it is highly recommended to set the MPLCONFIGDIR environment variable to a writable directory, in particular to speed up the import of Matplotlib and to better support multiprocessing.
3. STRING protein interaction network¶
ppi = [{'protein1': 'CETP', 'protein2': 'LDLR', 'score': 0.54, 'nscore': 0, 'fscore': 0, 'pscore': 0, 'ascore': 0, 'escore': 0, 'dscore': 0.54, 'tscore': 0}, {'protein1': 'CETP', 'protein2': 'APOE', 'score': 0.72, 'nscore': 0, 'fscore': 0, 'pscore': 0, 'ascore': 0, 'escore': 0, 'dscore': 0.72, 'tscore': 0}, {'protein1': 'CETP', 'protein2': 'APOH', 'score': 0.72, 'nscore': 0, 'fscore': 0, 'pscore': 0, 'ascore': 0, 'escore': 0, 'dscore': 0.72, 'tscore': 0}, {'protein1': 'CETP', 'protein2': 'APOB', 'score': 0.72, 'nscore': 0, 'fscore': 0, 'pscore': 0, 'ascore': 0, 'escore': 0, 'dscore': 0.72, 'tscore': 0}, {'protein1': 'CETP', 'protein2': 'HPR', 'score': 0.72, 'nscore': 0, 'fscore': 0, 'pscore': 0, 'ascore': 0, 'escore': 0, 'dscore': 0.72, 'tscore': 0}, {'protein1': 'CETP', 'protein2': 'CLU', 'score': 0.749, 'nscore': 0, 'fscore': 0, 'pscore': 0, 'ascore': 0, 'escore': 0, 'dscore': 0.72, 'tscore': 0.142}, {'protein1': 'CETP', 'protein2': 'PON1', 'score': 0.816, 'nscore': 0, 'fscore': 0, 'pscore': 0, 'ascore': 0, 'escore': 0, 'dscore': 0.72, 'tscore': 0.371}, {'protein1': 'APOH', 'protein2': 'LDLR', 'score': 0.693, 'nscore': 0, 'fscore': 0, 'pscore': 0, 'ascore': 0, 'escore': 0.362, 'dscore': 0.54, 'tscore': 0}, {'protein1': 'APOH', 'protein2': 'HPR', 'score': 0.72, 'nscore': 0, 'fscore': 0, 'pscore': 0, 'ascore': 0, 'escore': 0, 'dscore': 0.72, 'tscore': 0}, {'protein1': 'APOH', 'protein2': 'PON1', 'score': 0.72, 'nscore': 0, 'fscore': 0, 'pscore': 0, 'ascore': 0, 'escore': 0, 'dscore': 0.72, 'tscore': 0}, {'protein1': 'APOH', 'protein2': 'CLU', 'score': 0.738, 'nscore': 0, 'fscore': 0, 'pscore': 0, 'ascore': 0, 'escore': 0, 'dscore': 0.72, 'tscore': 0.106}, {'protein1': 'APOH', 'protein2': 'APOE', 'score': 0.775, 'nscore': 0, 'fscore': 0, 'pscore': 0, 'ascore': 0, 'escore': 0, 'dscore': 0.72, 'tscore': 0.231}, {'protein1': 'APOH', 'protein2': 'APOB', 'score': 0.839, 'nscore': 0, 'fscore': 0, 'pscore': 0, 'ascore': 0, 'escore': 0, 'dscore': 0.72, 'tscore': 0.451}, {'protein1': 'PON1', 'protein2': 'LDLR', 'score': 0.54, 'nscore': 0, 'fscore': 0, 'pscore': 0, 'ascore': 0, 'escore': 0, 'dscore': 0.54, 'tscore': 0}, {'protein1': 'PON1', 'protein2': 'HPR', 'score': 0.72, 'nscore': 0, 'fscore': 0, 'pscore': 0, 'ascore': 0, 'escore': 0, 'dscore': 0.72, 'tscore': 0}, {'protein1': 'PON1', 'protein2': 'APOB', 'score': 0.788, 'nscore': 0, 'fscore': 0, 'pscore': 0, 'ascore': 0, 'escore': 0, 'dscore': 0.72, 'tscore': 0.277}, {'protein1': 'PON1', 'protein2': 'APOE', 'score': 0.867, 'nscore': 0, 'fscore': 0, 'pscore': 0, 'ascore': 0, 'escore': 0, 'dscore': 0.72, 'tscore': 0.545}, {'protein1': 'PON1', 'protein2': 'CLU', 'score': 0.984, 'nscore': 0, 'fscore': 0, 'pscore': 0, 'ascore': 0, 'escore': 0.292, 'dscore': 0.72, 'tscore': 0.927}, {'protein1': 'APOB', 'protein2': 'DAB2', 'score': 0.499, 'nscore': 0, 'fscore': 0, 'pscore': 0, 'ascore': 0, 'escore': 0, 'dscore': 0.5, 'tscore': 0}, {'protein1': 'APOB', 'protein2': 'LDLRAP1', 'score': 0.499, 'nscore': 0, 'fscore': 0, 'pscore': 0, 'ascore': 0, 'escore': 0, 'dscore': 0.5, 'tscore': 0}, {'protein1': 'APOB', 'protein2': 'PCSK9', 'score': 0.649, 'nscore': 0, 'fscore': 0, 'pscore': 0, 'ascore': 0, 'escore': 0, 'dscore': 0, 'tscore': 0.649}, {'protein1': 'APOB', 'protein2': 'HPR', 'score': 0.72, 'nscore': 0, 'fscore': 0, 'pscore': 0, 'ascore': 0, 'escore': 0, 'dscore': 0.72, 'tscore': 0}, {'protein1': 'APOB', 'protein2': 'CLU', 'score': 0.72, 'nscore': 0, 'fscore': 0, 'pscore': 0, 'ascore': 0, 'escore': 0, 'dscore': 0.72, 'tscore': 0}, {'protein1': 'APOB', 'protein2': 'LDLR', 'score': 0.937, 'nscore': 0, 'fscore': 0, 'pscore': 0, 'ascore': 0, 'escore': 0.405, 'dscore': 0.9, 'tscore': 0}, {'protein1': 'APOB', 'protein2': 'APOE', 'score': 0.997, 'nscore': 0, 'fscore': 0, 'pscore': 0, 'ascore': 0, 'escore': 0.422, 'dscore': 0.8, 'tscore': 0.982}, {'protein1': 'APOE', 'protein2': 'HPR', 'score': 0.72, 'nscore': 0, 'fscore': 0, 'pscore': 0, 'ascore': 0, 'escore': 0, 'dscore': 0.72, 'tscore': 0}, {'protein1': 'APOE', 'protein2': 'LDLR', 'score': 0.783, 'nscore': 0, 'fscore': 0, 'pscore': 0, 'ascore': 0, 'escore': 0.549, 'dscore': 0.54, 'tscore': 0}, {'protein1': 'APOE', 'protein2': 'CLU', 'score': 0.991, 'nscore': 0, 'fscore': 0, 'pscore': 0, 'ascore': 0, 'escore': 0, 'dscore': 0.72, 'tscore': 0.971}, {'protein1': 'PCSK9', 'protein2': 'LDLR', 'score': 0.995, 'nscore': 0, 'fscore': 0, 'pscore': 0, 'ascore': 0, 'escore': 0.96, 'dscore': 0.9, 'tscore': 0}, {'protein1': 'DAB2', 'protein2': 'LDLRAP1', 'score': 0.8, 'nscore': 0, 'fscore': 0, 'pscore': 0, 'ascore': 0, 'escore': 0, 'dscore': 0.8, 'tscore': 0}]
ppi_df = pd.DataFrame(ppi).sort_values('score', ascending=False)
display_cols = [c for c in ['protein1','protein2','score','escore','tscore'] if c in ppi_df.columns]
print(f'{len(ppi_df)} STRING edges')
ppi_df[display_cols].head(20)
30 STRING edges
| protein1 | protein2 | score | escore | tscore | |
|---|---|---|---|---|---|
| 24 | APOB | APOE | 0.997 | 0.422 | 0.982 |
| 28 | PCSK9 | LDLR | 0.995 | 0.960 | 0.000 |
| 27 | APOE | CLU | 0.991 | 0.000 | 0.971 |
| 17 | PON1 | CLU | 0.984 | 0.292 | 0.927 |
| 23 | APOB | LDLR | 0.937 | 0.405 | 0.000 |
| 16 | PON1 | APOE | 0.867 | 0.000 | 0.545 |
| 12 | APOH | APOB | 0.839 | 0.000 | 0.451 |
| 6 | CETP | PON1 | 0.816 | 0.000 | 0.371 |
| 29 | DAB2 | LDLRAP1 | 0.800 | 0.000 | 0.000 |
| 15 | PON1 | APOB | 0.788 | 0.000 | 0.277 |
| 26 | APOE | LDLR | 0.783 | 0.549 | 0.000 |
| 11 | APOH | APOE | 0.775 | 0.000 | 0.231 |
| 5 | CETP | CLU | 0.749 | 0.000 | 0.142 |
| 10 | APOH | CLU | 0.738 | 0.000 | 0.106 |
| 1 | CETP | APOE | 0.720 | 0.000 | 0.000 |
| 14 | PON1 | HPR | 0.720 | 0.000 | 0.000 |
| 25 | APOE | HPR | 0.720 | 0.000 | 0.000 |
| 9 | APOH | PON1 | 0.720 | 0.000 | 0.000 |
| 3 | CETP | APOB | 0.720 | 0.000 | 0.000 |
| 2 | CETP | APOH | 0.720 | 0.000 | 0.000 |
import math
ppi = [{'protein1': 'CETP', 'protein2': 'LDLR', 'score': 0.54, 'nscore': 0, 'fscore': 0, 'pscore': 0, 'ascore': 0, 'escore': 0, 'dscore': 0.54, 'tscore': 0}, {'protein1': 'CETP', 'protein2': 'APOE', 'score': 0.72, 'nscore': 0, 'fscore': 0, 'pscore': 0, 'ascore': 0, 'escore': 0, 'dscore': 0.72, 'tscore': 0}, {'protein1': 'CETP', 'protein2': 'APOH', 'score': 0.72, 'nscore': 0, 'fscore': 0, 'pscore': 0, 'ascore': 0, 'escore': 0, 'dscore': 0.72, 'tscore': 0}, {'protein1': 'CETP', 'protein2': 'APOB', 'score': 0.72, 'nscore': 0, 'fscore': 0, 'pscore': 0, 'ascore': 0, 'escore': 0, 'dscore': 0.72, 'tscore': 0}, {'protein1': 'CETP', 'protein2': 'HPR', 'score': 0.72, 'nscore': 0, 'fscore': 0, 'pscore': 0, 'ascore': 0, 'escore': 0, 'dscore': 0.72, 'tscore': 0}, {'protein1': 'CETP', 'protein2': 'CLU', 'score': 0.749, 'nscore': 0, 'fscore': 0, 'pscore': 0, 'ascore': 0, 'escore': 0, 'dscore': 0.72, 'tscore': 0.142}, {'protein1': 'CETP', 'protein2': 'PON1', 'score': 0.816, 'nscore': 0, 'fscore': 0, 'pscore': 0, 'ascore': 0, 'escore': 0, 'dscore': 0.72, 'tscore': 0.371}, {'protein1': 'APOH', 'protein2': 'LDLR', 'score': 0.693, 'nscore': 0, 'fscore': 0, 'pscore': 0, 'ascore': 0, 'escore': 0.362, 'dscore': 0.54, 'tscore': 0}, {'protein1': 'APOH', 'protein2': 'HPR', 'score': 0.72, 'nscore': 0, 'fscore': 0, 'pscore': 0, 'ascore': 0, 'escore': 0, 'dscore': 0.72, 'tscore': 0}, {'protein1': 'APOH', 'protein2': 'PON1', 'score': 0.72, 'nscore': 0, 'fscore': 0, 'pscore': 0, 'ascore': 0, 'escore': 0, 'dscore': 0.72, 'tscore': 0}, {'protein1': 'APOH', 'protein2': 'CLU', 'score': 0.738, 'nscore': 0, 'fscore': 0, 'pscore': 0, 'ascore': 0, 'escore': 0, 'dscore': 0.72, 'tscore': 0.106}, {'protein1': 'APOH', 'protein2': 'APOE', 'score': 0.775, 'nscore': 0, 'fscore': 0, 'pscore': 0, 'ascore': 0, 'escore': 0, 'dscore': 0.72, 'tscore': 0.231}, {'protein1': 'APOH', 'protein2': 'APOB', 'score': 0.839, 'nscore': 0, 'fscore': 0, 'pscore': 0, 'ascore': 0, 'escore': 0, 'dscore': 0.72, 'tscore': 0.451}, {'protein1': 'PON1', 'protein2': 'LDLR', 'score': 0.54, 'nscore': 0, 'fscore': 0, 'pscore': 0, 'ascore': 0, 'escore': 0, 'dscore': 0.54, 'tscore': 0}, {'protein1': 'PON1', 'protein2': 'HPR', 'score': 0.72, 'nscore': 0, 'fscore': 0, 'pscore': 0, 'ascore': 0, 'escore': 0, 'dscore': 0.72, 'tscore': 0}, {'protein1': 'PON1', 'protein2': 'APOB', 'score': 0.788, 'nscore': 0, 'fscore': 0, 'pscore': 0, 'ascore': 0, 'escore': 0, 'dscore': 0.72, 'tscore': 0.277}, {'protein1': 'PON1', 'protein2': 'APOE', 'score': 0.867, 'nscore': 0, 'fscore': 0, 'pscore': 0, 'ascore': 0, 'escore': 0, 'dscore': 0.72, 'tscore': 0.545}, {'protein1': 'PON1', 'protein2': 'CLU', 'score': 0.984, 'nscore': 0, 'fscore': 0, 'pscore': 0, 'ascore': 0, 'escore': 0.292, 'dscore': 0.72, 'tscore': 0.927}, {'protein1': 'APOB', 'protein2': 'DAB2', 'score': 0.499, 'nscore': 0, 'fscore': 0, 'pscore': 0, 'ascore': 0, 'escore': 0, 'dscore': 0.5, 'tscore': 0}, {'protein1': 'APOB', 'protein2': 'LDLRAP1', 'score': 0.499, 'nscore': 0, 'fscore': 0, 'pscore': 0, 'ascore': 0, 'escore': 0, 'dscore': 0.5, 'tscore': 0}, {'protein1': 'APOB', 'protein2': 'PCSK9', 'score': 0.649, 'nscore': 0, 'fscore': 0, 'pscore': 0, 'ascore': 0, 'escore': 0, 'dscore': 0, 'tscore': 0.649}, {'protein1': 'APOB', 'protein2': 'HPR', 'score': 0.72, 'nscore': 0, 'fscore': 0, 'pscore': 0, 'ascore': 0, 'escore': 0, 'dscore': 0.72, 'tscore': 0}, {'protein1': 'APOB', 'protein2': 'CLU', 'score': 0.72, 'nscore': 0, 'fscore': 0, 'pscore': 0, 'ascore': 0, 'escore': 0, 'dscore': 0.72, 'tscore': 0}, {'protein1': 'APOB', 'protein2': 'LDLR', 'score': 0.937, 'nscore': 0, 'fscore': 0, 'pscore': 0, 'ascore': 0, 'escore': 0.405, 'dscore': 0.9, 'tscore': 0}, {'protein1': 'APOB', 'protein2': 'APOE', 'score': 0.997, 'nscore': 0, 'fscore': 0, 'pscore': 0, 'ascore': 0, 'escore': 0.422, 'dscore': 0.8, 'tscore': 0.982}, {'protein1': 'APOE', 'protein2': 'HPR', 'score': 0.72, 'nscore': 0, 'fscore': 0, 'pscore': 0, 'ascore': 0, 'escore': 0, 'dscore': 0.72, 'tscore': 0}, {'protein1': 'APOE', 'protein2': 'LDLR', 'score': 0.783, 'nscore': 0, 'fscore': 0, 'pscore': 0, 'ascore': 0, 'escore': 0.549, 'dscore': 0.54, 'tscore': 0}, {'protein1': 'APOE', 'protein2': 'CLU', 'score': 0.991, 'nscore': 0, 'fscore': 0, 'pscore': 0, 'ascore': 0, 'escore': 0, 'dscore': 0.72, 'tscore': 0.971}, {'protein1': 'PCSK9', 'protein2': 'LDLR', 'score': 0.995, 'nscore': 0, 'fscore': 0, 'pscore': 0, 'ascore': 0, 'escore': 0.96, 'dscore': 0.9, 'tscore': 0}, {'protein1': 'DAB2', 'protein2': 'LDLRAP1', 'score': 0.8, 'nscore': 0, 'fscore': 0, 'pscore': 0, 'ascore': 0, 'escore': 0, 'dscore': 0.8, 'tscore': 0}, {'protein1': 'DAB2', 'protein2': 'LDLR', 'score': 0.926, 'nscore': 0, 'fscore': 0, 'pscore': 0, 'ascore': 0, 'escore': 0.292, 'dscore': 0.9, 'tscore': 0}, {'protein1': 'CLU', 'protein2': 'LDLR', 'score': 0.576, 'nscore': 0, 'fscore': 0, 'pscore': 0, 'ascore': 0, 'escore': 0, 'dscore': 0.54, 'tscore': 0.117}, {'protein1': 'CLU', 'protein2': 'HPR', 'score': 0.72, 'nscore': 0, 'fscore': 0, 'pscore': 0, 'ascore': 0, 'escore': 0, 'dscore': 0.72, 'tscore': 0}, {'protein1': 'LDLRAP1', 'protein2': 'LDLR', 'score': 0.964, 'nscore': 0, 'fscore': 0, 'pscore': 0, 'ascore': 0, 'escore': 0.543, 'dscore': 0.9, 'tscore': 0.288}, {'protein1': 'HPR', 'protein2': 'LDLR', 'score': 0.542, 'nscore': 0, 'fscore': 0, 'pscore': 0, 'ascore': 0, 'escore': 0, 'dscore': 0.54, 'tscore': 0.047}]
if ppi:
nodes = sorted({p for e in ppi for p in (e['protein1'], e['protein2'])})
n = len(nodes)
pos = {n_: (math.cos(2*math.pi*i/n), math.sin(2*math.pi*i/n)) for i, n_ in enumerate(nodes)}
fig, ax = plt.subplots(figsize=(7, 7))
for e in ppi:
x1,y1 = pos[e['protein1']]; x2,y2 = pos[e['protein2']]
ax.plot([x1,x2],[y1,y2], color='#888', alpha=0.3+0.5*e.get('score',0))
for name,(x,y) in pos.items():
ax.scatter([x],[y], s=450, color='#ffd54f', edgecolors='#333', zorder=3)
ax.annotate(name, (x,y), ha='center', va='center', fontsize=8, fontweight='bold', zorder=4)
ax.set_aspect('equal'); ax.axis('off')
ax.set_title(f'STRING PPI network ({len(ppi)} edges)')
plt.tight_layout(); plt.show()
4. Reactome pathway footprint¶
pw_rows = [{'gene': 'LDLR', 'n_pathways': 5, 'top_pathway': 'Cargo recognition for clathrin-mediated endocytosis'}]
pd.DataFrame(pw_rows).sort_values('n_pathways', ascending=False)
| gene | n_pathways | top_pathway | |
|---|---|---|---|
| 0 | LDLR | 5 | Cargo recognition for clathrin-mediated endocy... |
5. Hypothesis ranking (1 hypotheses)¶
hyp_data = [('FcRn Transport Bypass Strategy', 0.583)]
titles = [h[0] for h in hyp_data][::-1]
scores = [h[1] for h in hyp_data][::-1]
fig, ax = plt.subplots(figsize=(10, max(8, len(titles)*0.4)))
colors = ['#ef5350' if s >= 0.6 else '#ffa726' if s >= 0.5 else '#66bb6a' for s in scores]
ax.barh(range(len(titles)), scores, color=colors)
ax.set_yticks(range(len(titles))); ax.set_yticklabels(titles, fontsize=7)
ax.set_xlabel('Composite Score'); ax.set_title('What is the actual quantitative contribution of FcRn-mediated transcytosis to BBB antibody transport in humans?')
ax.grid(axis='x', alpha=0.3)
plt.tight_layout(); plt.show()
labels = ['FcRn Transport Bypass Strategy']
matrix = np.array([[0.6, 0.7, 0.8, 0.85, 0.0, 0.7, 0.75, 0.8, 0.65]])
dims = ['novelty_score', 'feasibility_score', 'impact_score', 'mechanistic_plausibility_score', 'clinical_relevance_score', 'data_availability_score', 'reproducibility_score', 'druggability_score', 'safety_profile_score']
if matrix.size:
fig, ax = plt.subplots(figsize=(10, 5))
im = ax.imshow(matrix, cmap='RdYlGn', aspect='auto', vmin=0, vmax=1)
ax.set_xticks(range(len(dims)))
ax.set_xticklabels([d.replace('_score','').replace('_',' ').title() for d in dims],
rotation=45, ha='right', fontsize=8)
ax.set_yticks(range(len(labels))); ax.set_yticklabels(labels, fontsize=7)
ax.set_title('Score dimensions — hypotheses')
plt.colorbar(im, ax=ax, shrink=0.8)
plt.tight_layout(); plt.show()
else:
print('No score data available')
6. PubMed literature per hypothesis¶
Hypothesis 1: FcRn Transport Bypass Strategy¶
Target genes: LDLR · Composite score: 0.583
FcRn Transport Bypass Strategy: A Novel Approach to CNS Antibody Delivery¶
Introduction¶
The development of therapeutic antibodies for neurodegenerative diseases has been constrained by the blood-brain barrier (BBB), a specialized endothelial structure that restricts the paracellular and transc
lit_data = [{'year': '2024', 'journal': 'Cell Res', 'title': 'LDLR is an entry receptor for Crimean-Congo hemorrhagic fever virus.', 'pmid': '38182887'}, {'year': '2025', 'journal': 'Circulation', 'title': 'PCSK9 Promotes LDLR Degradation by Preventing SNX17-Mediated LDLR Recycling.', 'pmid': '40071387'}, {'year': '2021', 'journal': 'Theranostics', 'title': 'Exosome-based Ldlr gene therapy for familial hypercholesterolemia in a mouse mod', 'pmid': '33456582'}, {'year': '2019', 'journal': 'Atherosclerosis', 'title': 'Impact of LDLR and PCSK9 pathogenic variants in Japanese heterozygous familial h', 'pmid': '31491741'}, {'year': '2021', 'journal': 'Genes (Basel)', 'title': 'The LDLR, APOB, and PCSK9 Variants of Index Patients with Familial Hypercholeste', 'pmid': '33418990'}]
if lit_data:
df = pd.DataFrame(lit_data)
print(f'{len(lit_data)} PubMed results')
display(df)
else:
print('No PubMed results')
5 PubMed results
| year | journal | title | pmid | |
|---|---|---|---|---|
| 0 | 2024 | Cell Res | LDLR is an entry receptor for Crimean-Congo he... | 38182887 |
| 1 | 2025 | Circulation | PCSK9 Promotes LDLR Degradation by Preventing ... | 40071387 |
| 2 | 2021 | Theranostics | Exosome-based Ldlr gene therapy for familial h... | 33456582 |
| 3 | 2019 | Atherosclerosis | Impact of LDLR and PCSK9 pathogenic variants i... | 31491741 |
| 4 | 2021 | Genes (Basel) | The LDLR, APOB, and PCSK9 Variants of Index Pa... | 33418990 |
7. Knowledge graph edges (3 total)¶
edge_data = [{'source': 'h-9d16afa0', 'relation': 'targets', 'target': 'LDLR', 'strength': 0.5}, {'source': 'LDLR', 'relation': 'associated_with', 'target': 'neuropharmacology', 'strength': 0.4}, {'source': 'LDLR', 'relation': 'involved_in', 'target': 'apoe_mediated_cholesterol_lipi', 'strength': 0.4}]
if edge_data:
pd.DataFrame(edge_data).head(25)
else:
print('No KG edge data available')
Caveats¶
This notebook uses real Forge tool calls from live APIs:
- Enrichment is against curated gene-set libraries (Enrichr)
- STRING/Reactome/HPA/MyGene reflect curated knowledge
- PubMed literature is search-relevance ranked, not systematic review