Do β-amyloid plaques and neurofibrillary tangles cause or result from cholinergic dysfunction?¶
Notebook ID: nb-SDA-2026-04-16-gap-pubmed-20260411-082446-2c1c9e2d · Analysis: SDA-2026-04-16-gap-pubmed-20260411-082446-2c1c9e2d · Generated: 2026-04-21T18:45:58
Research question¶
The abstract explicitly questions whether AD's hallmark pathologies induce cholinergic dysfunction or vice versa. This fundamental causality question is critical for determining therapeutic targets but remains unresolved despite evidence that β-amyloid affects cholinergic receptors.
Gap type: open_question Source paper: The cholinergic system in aging and neuronal degeneration. (2011, Behavioural brain research, PMID:21145918)
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.95 · Rounds: 4
1. Target gene annotations (MyGene)¶
import pandas as pd
ann_rows = [{'gene': 'C1Q', 'name': 'complement C1q like 1', 'summary': 'Predicted to enable signaling receptor binding activity. Predicted to act upstream of or within maintenance of synapse s'}, {'gene': 'NAMPT', 'name': 'nicotinamide phosphoribosyltransferase', 'summary': 'This gene encodes a protein that catalyzes the condensation of nicotinamide with 5-phosphoribosyl-1-pyrophosphate to yie'}, {'gene': 'PGC1A', 'name': 'PPARG coactivator 1 alpha', 'summary': 'The protein encoded by this gene is a transcriptional coactivator that regulates the genes involved in energy metabolism'}, {'gene': 'SIRT1', 'name': 'sirtuin 1', 'summary': 'This gene encodes a member of the sirtuin family of proteins, homologs to the yeast Sir2 protein. Members of the sirtuin'}, {'gene': 'TREM2', 'name': 'triggering receptor expressed on myeloid cells 2', 'summary': 'This gene encodes a membrane protein that forms a receptor signaling complex with the TYRO protein tyrosine kinase bindi'}]
pd.DataFrame(ann_rows)
| gene | name | summary | |
|---|---|---|---|
| 0 | C1Q | complement C1q like 1 | Predicted to enable signaling receptor binding... |
| 1 | NAMPT | nicotinamide phosphoribosyltransferase | This gene encodes a protein that catalyzes the... |
| 2 | PGC1A | PPARG coactivator 1 alpha | The protein encoded by this gene is a transcri... |
| 3 | SIRT1 | sirtuin 1 | This gene encodes a member of the sirtuin fami... |
| 4 | TREM2 | triggering receptor expressed on myeloid cells 2 | This gene encodes a membrane protein that form... |
2. GO Biological Process enrichment (Enrichr)¶
go_bp = [{'rank': 1, 'term': 'Regulation Of Interleukin-6 Production (GO:0032675)', 'p_value': 1.0048399935913338e-12, 'odds_ratio': 162.55373831775702, 'genes': ['SYK', 'IL1B', 'SIRPA', 'PTPN11', 'TREM2', 'PTPN6', 'CD47']}, {'rank': 2, 'term': 'Regulation Of Phagocytosis (GO:0050764)', 'p_value': 5.048610594157601e-10, 'odds_ratio': 188.03773584905662, 'genes': ['SYK', 'IL1B', 'SIRPA', 'TREM2', 'CD47']}, {'rank': 3, 'term': 'Regulation Of ERK1 And ERK2 Cascade (GO:0070372)', 'p_value': 1.415343656859335e-08, 'odds_ratio': 55.31372549019608, 'genes': ['SYK', 'IL1B', 'SIRPA', 'PTPN11', 'TREM2', 'PTPN6']}, {'rank': 4, 'term': 'Synapse Pruning (GO:0098883)', 'p_value': 1.9067019051840425e-08, 'odds_ratio': 999.0, 'genes': ['C1QB', 'TREM2', 'C1QC']}, {'rank': 5, 'term': 'Regulation Of Tumor Necrosis Factor Production (GO:0032680)', 'p_value': 2.7217119623639505e-08, 'odds_ratio': 81.40573770491804, 'genes': ['SYK', 'SIRPA', 'PTPN11', 'PTPN6', 'CD47']}, {'rank': 6, 'term': 'Cellular Response To Cytokine Stimulus (GO:0071345)', 'p_value': 5.6575802607493816e-08, 'odds_ratio': 43.450331125827816, 'genes': ['IL1B', 'SIRPA', 'PTPN11', 'PTPN6', 'CD47', 'SIRT1']}, {'rank': 7, 'term': 'Positive Regulation Of Phagocytosis (GO:0050766)', 'p_value': 9.742769899857603e-08, 'odds_ratio': 129.4090909090909, 'genes': ['IL1B', 'SIRPA', 'TREM2', 'CD47']}, {'rank': 8, 'term': 'Positive Regulation Of Endocytosis (GO:0045807)', 'p_value': 2.9769516535686854e-07, 'odds_ratio': 96.53333333333333, 'genes': ['IL1B', 'SIRPA', 'TREM2', 'CD47']}, {'rank': 9, 'term': 'Cytokine-Mediated Signaling Pathway (GO:0019221)', 'p_value': 9.108569513553911e-07, 'odds_ratio': 39.15277777777778, 'genes': ['SYK', 'IL1B', 'PTPN11', 'PTPN6', 'SIRT1']}, {'rank': 10, 'term': 'Negative Regulation Of Inflammatory Response (GO:0050728)', 'p_value': 1.1700096460875274e-06, 'odds_ratio': 67.55480033984706, 'genes': ['SYK', 'SIRPA', 'TREM2', 'PTPN6']}]
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 | Regulation Of Interleukin-6 Production (GO:003... | 7 | 1.00e-12 | 162.6 | SYK, IL1B, SIRPA, PTPN11, TREM2, PTPN6, CD47 |
| 1 | Regulation Of Phagocytosis (GO:0050764) | 5 | 5.05e-10 | 188.0 | SYK, IL1B, SIRPA, TREM2, CD47 |
| 2 | Regulation Of ERK1 And ERK2 Cascade (GO:0070372) | 6 | 1.42e-08 | 55.3 | SYK, IL1B, SIRPA, PTPN11, TREM2, PTPN6 |
| 3 | Synapse Pruning (GO:0098883) | 3 | 1.91e-08 | 999.0 | C1QB, TREM2, C1QC |
| 4 | Regulation Of Tumor Necrosis Factor Production... | 5 | 2.72e-08 | 81.4 | SYK, SIRPA, PTPN11, PTPN6, CD47 |
| 5 | Cellular Response To Cytokine Stimulus (GO:007... | 6 | 5.66e-08 | 43.5 | IL1B, SIRPA, PTPN11, PTPN6, CD47, SIRT1 |
| 6 | Positive Regulation Of Phagocytosis (GO:0050766) | 4 | 9.74e-08 | 129.4 | IL1B, SIRPA, TREM2, CD47 |
| 7 | Positive Regulation Of Endocytosis (GO:0045807) | 4 | 2.98e-07 | 96.5 | IL1B, SIRPA, TREM2, CD47 |
| 8 | Cytokine-Mediated Signaling Pathway (GO:0019221) | 5 | 9.11e-07 | 39.2 | SYK, IL1B, PTPN11, PTPN6, SIRT1 |
| 9 | Negative Regulation Of Inflammatory Response (... | 4 | 1.17e-06 | 67.6 | SYK, SIRPA, TREM2, PTPN6 |
import matplotlib.pyplot as plt
import numpy as np
go_bp = [{'rank': 1, 'term': 'Regulation Of Interleukin-6 Production (GO:0032675)', 'p_value': 1.0048399935913338e-12, 'odds_ratio': 162.55373831775702, 'genes': ['SYK', 'IL1B', 'SIRPA', 'PTPN11', 'TREM2', 'PTPN6', 'CD47']}, {'rank': 2, 'term': 'Regulation Of Phagocytosis (GO:0050764)', 'p_value': 5.048610594157601e-10, 'odds_ratio': 188.03773584905662, 'genes': ['SYK', 'IL1B', 'SIRPA', 'TREM2', 'CD47']}, {'rank': 3, 'term': 'Regulation Of ERK1 And ERK2 Cascade (GO:0070372)', 'p_value': 1.415343656859335e-08, 'odds_ratio': 55.31372549019608, 'genes': ['SYK', 'IL1B', 'SIRPA', 'PTPN11', 'TREM2', 'PTPN6']}, {'rank': 4, 'term': 'Synapse Pruning (GO:0098883)', 'p_value': 1.9067019051840425e-08, 'odds_ratio': 999.0, 'genes': ['C1QB', 'TREM2', 'C1QC']}, {'rank': 5, 'term': 'Regulation Of Tumor Necrosis Factor Production (GO:0032680)', 'p_value': 2.7217119623639505e-08, 'odds_ratio': 81.40573770491804, 'genes': ['SYK', 'SIRPA', 'PTPN11', 'PTPN6', 'CD47']}, {'rank': 6, 'term': 'Cellular Response To Cytokine Stimulus (GO:0071345)', 'p_value': 5.6575802607493816e-08, 'odds_ratio': 43.450331125827816, 'genes': ['IL1B', 'SIRPA', 'PTPN11', 'PTPN6', 'CD47', 'SIRT1']}, {'rank': 7, 'term': 'Positive Regulation Of Phagocytosis (GO:0050766)', 'p_value': 9.742769899857603e-08, 'odds_ratio': 129.4090909090909, 'genes': ['IL1B', 'SIRPA', 'TREM2', 'CD47']}, {'rank': 8, 'term': 'Positive Regulation Of Endocytosis (GO:0045807)', 'p_value': 2.9769516535686854e-07, 'odds_ratio': 96.53333333333333, 'genes': ['IL1B', 'SIRPA', 'TREM2', 'CD47']}]
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-t0_s5cxu 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': 'CRP', 'protein2': 'FCGR1A', 'score': 0.434, 'nscore': 0, 'fscore': 0, 'pscore': 0, 'ascore': 0, 'escore': 0, 'dscore': 0, 'tscore': 0.434}, {'protein1': 'CRP', 'protein2': 'C1QC', 'score': 0.499, 'nscore': 0, 'fscore': 0, 'pscore': 0, 'ascore': 0, 'escore': 0, 'dscore': 0.5, 'tscore': 0}, {'protein1': 'CRP', 'protein2': 'C1QA', 'score': 0.63, 'nscore': 0, 'fscore': 0, 'pscore': 0, 'ascore': 0, 'escore': 0.292, 'dscore': 0.5, 'tscore': 0}, {'protein1': 'CRP', 'protein2': 'C1QB', 'score': 0.689, 'nscore': 0, 'fscore': 0, 'pscore': 0, 'ascore': 0, 'escore': 0.405, 'dscore': 0.5, 'tscore': 0}, {'protein1': 'C1QB', 'protein2': 'C1QA', 'score': 0.999, 'nscore': 0, 'fscore': 0, 'pscore': 0, 'ascore': 0, 'escore': 0.967, 'dscore': 0.9, 'tscore': 0.981}, {'protein1': 'C1QB', 'protein2': 'C1QC', 'score': 0.999, 'nscore': 0, 'fscore': 0, 'pscore': 0, 'ascore': 0, 'escore': 0.92, 'dscore': 0.9, 'tscore': 0.982}, {'protein1': 'CD47', 'protein2': 'PTPN6', 'score': 0.499, 'nscore': 0, 'fscore': 0, 'pscore': 0, 'ascore': 0, 'escore': 0, 'dscore': 0.5, 'tscore': 0}, {'protein1': 'CD47', 'protein2': 'TREM2', 'score': 0.539, 'nscore': 0, 'fscore': 0, 'pscore': 0, 'ascore': 0, 'escore': 0, 'dscore': 0, 'tscore': 0.539}, {'protein1': 'CD47', 'protein2': 'PTPN11', 'score': 0.674, 'nscore': 0, 'fscore': 0, 'pscore': 0, 'ascore': 0, 'escore': 0, 'dscore': 0.5, 'tscore': 0.375}, {'protein1': 'CD47', 'protein2': 'SIRPA', 'score': 0.999, 'nscore': 0, 'fscore': 0, 'pscore': 0, 'ascore': 0, 'escore': 0.939, 'dscore': 0.9, 'tscore': 0.986}, {'protein1': 'FCGR1A', 'protein2': 'SYK', 'score': 0.964, 'nscore': 0, 'fscore': 0, 'pscore': 0, 'ascore': 0, 'escore': 0.4, 'dscore': 0.9, 'tscore': 0.457}, {'protein1': 'TREM2', 'protein2': 'SIRPA', 'score': 0.91, 'nscore': 0, 'fscore': 0, 'pscore': 0, 'ascore': 0, 'escore': 0, 'dscore': 0.9, 'tscore': 0.141}, {'protein1': 'TREM2', 'protein2': 'SYK', 'score': 0.929, 'nscore': 0, 'fscore': 0, 'pscore': 0, 'ascore': 0, 'escore': 0, 'dscore': 0.9, 'tscore': 0.323}, {'protein1': 'C1QC', 'protein2': 'C1QA', 'score': 0.999, 'nscore': 0, 'fscore': 0, 'pscore': 0, 'ascore': 0, 'escore': 0.96, 'dscore': 0.9, 'tscore': 0.981}, {'protein1': 'SYK', 'protein2': 'PTPN6', 'score': 0.825, 'nscore': 0, 'fscore': 0, 'pscore': 0, 'ascore': 0, 'escore': 0.457, 'dscore': 0.36, 'tscore': 0.538}, {'protein1': 'SYK', 'protein2': 'SIRPA', 'score': 0.9, 'nscore': 0, 'fscore': 0, 'pscore': 0, 'ascore': 0, 'escore': 0, 'dscore': 0.9, 'tscore': 0}, {'protein1': 'SYK', 'protein2': 'PTPN11', 'score': 0.945, 'nscore': 0, 'fscore': 0, 'pscore': 0, 'ascore': 0, 'escore': 0, 'dscore': 0.9, 'tscore': 0.479}, {'protein1': 'PTPN6', 'protein2': 'SIRPA', 'score': 0.845, 'nscore': 0, 'fscore': 0, 'pscore': 0, 'ascore': 0, 'escore': 0.618, 'dscore': 0.5, 'tscore': 0.254}, {'protein1': 'PTPN6', 'protein2': 'PTPN11', 'score': 0.947, 'nscore': 0, 'fscore': 0, 'pscore': 0, 'ascore': 0, 'escore': 0.079, 'dscore': 0.9, 'tscore': 0.474}, {'protein1': 'SIRPA', 'protein2': 'PTPN11', 'score': 0.996, 'nscore': 0, 'fscore': 0, 'pscore': 0, 'ascore': 0, 'escore': 0.677, 'dscore': 0.5, 'tscore': 0.982}]
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)
20 STRING edges
| protein1 | protein2 | score | escore | tscore | |
|---|---|---|---|---|---|
| 13 | C1QC | C1QA | 0.999 | 0.960 | 0.981 |
| 9 | CD47 | SIRPA | 0.999 | 0.939 | 0.986 |
| 5 | C1QB | C1QC | 0.999 | 0.920 | 0.982 |
| 4 | C1QB | C1QA | 0.999 | 0.967 | 0.981 |
| 19 | SIRPA | PTPN11 | 0.996 | 0.677 | 0.982 |
| 10 | FCGR1A | SYK | 0.964 | 0.400 | 0.457 |
| 18 | PTPN6 | PTPN11 | 0.947 | 0.079 | 0.474 |
| 16 | SYK | PTPN11 | 0.945 | 0.000 | 0.479 |
| 12 | TREM2 | SYK | 0.929 | 0.000 | 0.323 |
| 11 | TREM2 | SIRPA | 0.910 | 0.000 | 0.141 |
| 15 | SYK | SIRPA | 0.900 | 0.000 | 0.000 |
| 17 | PTPN6 | SIRPA | 0.845 | 0.618 | 0.254 |
| 14 | SYK | PTPN6 | 0.825 | 0.457 | 0.538 |
| 3 | CRP | C1QB | 0.689 | 0.405 | 0.000 |
| 8 | CD47 | PTPN11 | 0.674 | 0.000 | 0.375 |
| 2 | CRP | C1QA | 0.630 | 0.292 | 0.000 |
| 7 | CD47 | TREM2 | 0.539 | 0.000 | 0.539 |
| 1 | CRP | C1QC | 0.499 | 0.000 | 0.000 |
| 6 | CD47 | PTPN6 | 0.499 | 0.000 | 0.000 |
| 0 | CRP | FCGR1A | 0.434 | 0.000 | 0.434 |
import math
ppi = [{'protein1': 'CRP', 'protein2': 'FCGR1A', 'score': 0.434, 'nscore': 0, 'fscore': 0, 'pscore': 0, 'ascore': 0, 'escore': 0, 'dscore': 0, 'tscore': 0.434}, {'protein1': 'CRP', 'protein2': 'C1QC', 'score': 0.499, 'nscore': 0, 'fscore': 0, 'pscore': 0, 'ascore': 0, 'escore': 0, 'dscore': 0.5, 'tscore': 0}, {'protein1': 'CRP', 'protein2': 'C1QA', 'score': 0.63, 'nscore': 0, 'fscore': 0, 'pscore': 0, 'ascore': 0, 'escore': 0.292, 'dscore': 0.5, 'tscore': 0}, {'protein1': 'CRP', 'protein2': 'C1QB', 'score': 0.689, 'nscore': 0, 'fscore': 0, 'pscore': 0, 'ascore': 0, 'escore': 0.405, 'dscore': 0.5, 'tscore': 0}, {'protein1': 'C1QB', 'protein2': 'C1QA', 'score': 0.999, 'nscore': 0, 'fscore': 0, 'pscore': 0, 'ascore': 0, 'escore': 0.967, 'dscore': 0.9, 'tscore': 0.981}, {'protein1': 'C1QB', 'protein2': 'C1QC', 'score': 0.999, 'nscore': 0, 'fscore': 0, 'pscore': 0, 'ascore': 0, 'escore': 0.92, 'dscore': 0.9, 'tscore': 0.982}, {'protein1': 'CD47', 'protein2': 'PTPN6', 'score': 0.499, 'nscore': 0, 'fscore': 0, 'pscore': 0, 'ascore': 0, 'escore': 0, 'dscore': 0.5, 'tscore': 0}, {'protein1': 'CD47', 'protein2': 'TREM2', 'score': 0.539, 'nscore': 0, 'fscore': 0, 'pscore': 0, 'ascore': 0, 'escore': 0, 'dscore': 0, 'tscore': 0.539}, {'protein1': 'CD47', 'protein2': 'PTPN11', 'score': 0.674, 'nscore': 0, 'fscore': 0, 'pscore': 0, 'ascore': 0, 'escore': 0, 'dscore': 0.5, 'tscore': 0.375}, {'protein1': 'CD47', 'protein2': 'SIRPA', 'score': 0.999, 'nscore': 0, 'fscore': 0, 'pscore': 0, 'ascore': 0, 'escore': 0.939, 'dscore': 0.9, 'tscore': 0.986}, {'protein1': 'FCGR1A', 'protein2': 'SYK', 'score': 0.964, 'nscore': 0, 'fscore': 0, 'pscore': 0, 'ascore': 0, 'escore': 0.4, 'dscore': 0.9, 'tscore': 0.457}, {'protein1': 'TREM2', 'protein2': 'SIRPA', 'score': 0.91, 'nscore': 0, 'fscore': 0, 'pscore': 0, 'ascore': 0, 'escore': 0, 'dscore': 0.9, 'tscore': 0.141}, {'protein1': 'TREM2', 'protein2': 'SYK', 'score': 0.929, 'nscore': 0, 'fscore': 0, 'pscore': 0, 'ascore': 0, 'escore': 0, 'dscore': 0.9, 'tscore': 0.323}, {'protein1': 'C1QC', 'protein2': 'C1QA', 'score': 0.999, 'nscore': 0, 'fscore': 0, 'pscore': 0, 'ascore': 0, 'escore': 0.96, 'dscore': 0.9, 'tscore': 0.981}, {'protein1': 'SYK', 'protein2': 'PTPN6', 'score': 0.825, 'nscore': 0, 'fscore': 0, 'pscore': 0, 'ascore': 0, 'escore': 0.457, 'dscore': 0.36, 'tscore': 0.538}, {'protein1': 'SYK', 'protein2': 'SIRPA', 'score': 0.9, 'nscore': 0, 'fscore': 0, 'pscore': 0, 'ascore': 0, 'escore': 0, 'dscore': 0.9, 'tscore': 0}, {'protein1': 'SYK', 'protein2': 'PTPN11', 'score': 0.945, 'nscore': 0, 'fscore': 0, 'pscore': 0, 'ascore': 0, 'escore': 0, 'dscore': 0.9, 'tscore': 0.479}, {'protein1': 'PTPN6', 'protein2': 'SIRPA', 'score': 0.845, 'nscore': 0, 'fscore': 0, 'pscore': 0, 'ascore': 0, 'escore': 0.618, 'dscore': 0.5, 'tscore': 0.254}, {'protein1': 'PTPN6', 'protein2': 'PTPN11', 'score': 0.947, 'nscore': 0, 'fscore': 0, 'pscore': 0, 'ascore': 0, 'escore': 0.079, 'dscore': 0.9, 'tscore': 0.474}, {'protein1': 'SIRPA', 'protein2': 'PTPN11', 'score': 0.996, 'nscore': 0, 'fscore': 0, 'pscore': 0, 'ascore': 0, 'escore': 0.677, 'dscore': 0.5, 'tscore': 0.982}]
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': 'C1Q', 'n_pathways': 0, 'top_pathway': '—'}, {'gene': 'NAMPT', 'n_pathways': 3, 'top_pathway': 'BMAL1:CLOCK,NPAS2 activates circadian expression'}, {'gene': 'PGC1A', 'n_pathways': 8, 'top_pathway': 'PPARA activates gene expression'}, {'gene': 'SIRT1', 'n_pathways': 8, 'top_pathway': 'Regulation of HSF1-mediated heat shock response'}, {'gene': 'TREM2', 'n_pathways': 4, 'top_pathway': 'Immunoregulatory interactions between a Lymphoid and a non-Lymphoid ce'}]
pd.DataFrame(pw_rows).sort_values('n_pathways', ascending=False)
| gene | n_pathways | top_pathway | |
|---|---|---|---|
| 2 | PGC1A | 8 | PPARA activates gene expression |
| 3 | SIRT1 | 8 | Regulation of HSF1-mediated heat shock response |
| 4 | TREM2 | 4 | Immunoregulatory interactions between a Lympho... |
| 1 | NAMPT | 3 | BMAL1:CLOCK,NPAS2 activates circadian expression |
| 0 | C1Q | 0 | — |
5. Hypothesis ranking (2 hypotheses)¶
hyp_data = [('NAMPT-Centered NAD+ Restoration to Reverse Basal Forebr', 0.616), ('TREM2-C1Q Competitive Binding to Prevent Complement-Med', 0.591)]
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('Do β-amyloid plaques and neurofibrillary tangles cause or result from cholinergic dysfunction?')
ax.grid(axis='x', alpha=0.3)
plt.tight_layout(); plt.show()
labels = ['NAMPT-Centered NAD+ Restoration to Rever', 'TREM2-C1Q Competitive Binding to Prevent']
matrix = np.array([[0.55, 0.55, 0.75, 0.8, 0.0, 0.7, 0.65, 0.6, 0.45], [0.7, 0.45, 0.65, 0.75, 0.0, 0.55, 0.6, 0.4, 0.35]])
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: NAMPT-Centered NAD+ Restoration to Reverse Basal Forebrain Cholinergic¶
Target genes: NAMPT,SIRT1,PGC1A · Composite score: 0.616
Enhancing NAMPT activity using small-molecule activators or NMN supplementation would restore NAD+/SIRT1/PGC1A signaling, mitochondrial biogenesis, and cholinergic phenotype maintenance—potentially reversing the causality direction by restoring metabolic resilience before tau pathology accumulates.
print('No PubMed results for hypothesis h-ba11ca72')
No PubMed results for hypothesis h-ba11ca72
Hypothesis 2: TREM2-C1Q Competitive Binding to Prevent Complement-Mediated Cholinerg¶
Target genes: TREM2,C1Q · Composite score: 0.591
TREM2 on microglia normally binds complement C1q to prevent complement-mediated synaptic pruning of cholinergic terminals. In AD, TREM2 variants reduce this protective binding, leading to C1q-mediated attack on basal forebrain cholinergic synapses. A therapeutic approach using TREM2 agonism or C1q-b
print('No PubMed results for hypothesis h-d3e7e3dd')
No PubMed results for hypothesis h-d3e7e3dd
7. Knowledge graph edges (10 total)¶
edge_data = [{'source': 'h-ba11ca72', 'relation': 'targets', 'target': 'NAMPT,SIRT1,PGC1A', 'strength': 0.5}, {'source': 'h-d3e7e3dd', 'relation': 'targets', 'target': 'TREM2,C1Q', 'strength': 0.5}, {'source': 'NAMPT,SIRT1,PGC1A', 'relation': 'associated_with', 'target': 'neurodegeneration', 'strength': 0.4}, {'source': 'NAMPT,SIRT1,PGC1A', 'relation': 'implicated_in', 'target': 'neurodegeneration', 'strength': 0.4}, {'source': 'TREM2,C1Q', 'relation': 'associated_with', 'target': 'neurodegeneration', 'strength': 0.4}, {'source': 'TREM2,C1Q', 'relation': 'implicated_in', 'target': 'neurodegeneration', 'strength': 0.4}, {'source': 'TREM2,C1Q', 'relation': 'co_associated_with', 'target': 'C1Q', 'strength': 0.3}, {'source': 'NAMPT,SIRT1,PGC1A', 'relation': 'co_associated_with', 'target': 'NAMPT', 'strength': 0.3}, {'source': 'NAMPT,SIRT1,PGC1A', 'relation': 'co_associated_with', 'target': 'NAD', 'strength': 0.3}, {'source': 'TREM2,C1Q', 'relation': 'co_associated_with', 'target': 'TREM2', 'strength': 0.3}]
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