Do SCFAs directly modulate α-synuclein aggregation in vivo at physiologically relevant brain concentrations?¶
Notebook ID: nb-SDA-2026-04-12-gap-debate-20260410-113021-6fbc6da4 · Analysis: SDA-2026-04-12-gap-debate-20260410-113021-6fbc6da4 · Generated: 2026-04-21T18:42:04
Research question¶
The debate identified a critical mechanistic gap between SCFA production by gut bacteria and α-synuclein disaggregation. While SCFAs cross the blood-brain barrier, their actual concentrations in brain tissue and direct effects on protein aggregation remain unvalidated, preventing therapeutic development.
Source: Debate session sess_SDA-2026-04-01-gap-20260401-225155 (Analysis: SDA-2026-04-01-gap-20260401-225155)
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.7 · Rounds: 4
1. Target gene annotations (MyGene)¶
import pandas as pd
ann_rows = [{'gene': 'FFAR2', 'name': 'free fatty acid receptor 2', 'summary': 'This gene encodes a member of the GP40 family of G protein-coupled receptors that are clustered together on chromosome 1'}, {'gene': 'FFAR3', 'name': 'free fatty acid receptor 3', 'summary': 'Enables G protein-coupled receptor activity. Involved in adenylate cyclase-inhibiting G protein-coupled receptor signali'}, {'gene': 'HDAC6', 'name': 'histone deacetylase 6', 'summary': 'Histones play a critical role in transcriptional regulation, cell cycle progression, and developmental events. Histone a'}, {'gene': 'HSP90AA1', 'name': 'heat shock protein 90 alpha family class A member 1', 'summary': 'The protein encoded by this gene is an inducible molecular chaperone that functions as a homodimer. The encoded protein '}, {'gene': 'NLRP3', 'name': 'NLR family pyrin domain containing 3', 'summary': 'This gene encodes a pyrin-like protein containing a pyrin domain, a nucleotide-binding site (NBS) domain, and a leucine-'}]
pd.DataFrame(ann_rows)
| gene | name | summary | |
|---|---|---|---|
| 0 | FFAR2 | free fatty acid receptor 2 | This gene encodes a member of the GP40 family ... |
| 1 | FFAR3 | free fatty acid receptor 3 | Enables G protein-coupled receptor activity. I... |
| 2 | HDAC6 | histone deacetylase 6 | Histones play a critical role in transcription... |
| 3 | HSP90AA1 | heat shock protein 90 alpha family class A mem... | The protein encoded by this gene is an inducib... |
| 4 | NLRP3 | NLR family pyrin domain containing 3 | This gene encodes a pyrin-like protein contain... |
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-yxk060zn 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': 'FFAR2', 'n_pathways': 2, 'top_pathway': 'G alpha (q) signalling events'}, {'gene': 'FFAR3', 'n_pathways': 2, 'top_pathway': 'G alpha (q) signalling events'}, {'gene': 'HDAC6', 'n_pathways': 8, 'top_pathway': 'NOTCH1 Intracellular Domain Regulates Transcription'}, {'gene': 'HSP90AA1', 'n_pathways': 8, 'top_pathway': 'Signaling by ERBB2'}, {'gene': 'NLRP3', 'n_pathways': 6, 'top_pathway': 'Metalloprotease DUBs'}]
pd.DataFrame(pw_rows).sort_values('n_pathways', ascending=False)
| gene | n_pathways | top_pathway | |
|---|---|---|---|
| 2 | HDAC6 | 8 | NOTCH1 Intracellular Domain Regulates Transcri... |
| 3 | HSP90AA1 | 8 | Signaling by ERBB2 |
| 4 | NLRP3 | 6 | Metalloprotease DUBs |
| 0 | FFAR2 | 2 | G alpha (q) signalling events |
| 1 | FFAR3 | 2 | G alpha (q) signalling events |
5. Hypothesis ranking (2 hypotheses)¶
hyp_data = [('HDAC6 Activation as SCFA-Mediated Neuroprotective Mecha', 0.682), ("Dissociating SCFA's Dual Signaling Through GPR43/GPR41 ", 0.67)]
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 SCFAs directly modulate α-synuclein aggregation in vivo at physiologically relevant brain concentrations?')
ax.grid(axis='x', alpha=0.3)
plt.tight_layout(); plt.show()
labels = ['HDAC6 Activation as SCFA-Mediated Neurop', "Dissociating SCFA's Dual Signaling Throu"]
matrix = np.array([[0.82, 0.32, 0.65, 0.75, 0.0, 0.55, 0.6, 0.28, 0.42], [0.75, 0.38, 0.6, 0.58, 0.0, 0.48, 0.52, 0.45, 0.55]])
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: HDAC6 Activation as SCFA-Mediated Neuroprotective Mechanism¶
Target genes: HDAC6, HSP90AA1 · Composite score: 0.682
HDAC6 Activation as SCFA-Mediated Neuroprotective Mechanism¶
Enhancing Hsp90 K489 Deacetylation Through Selective HDAC6 Activation to Promote Chaperone-Mediated Autophagy of α-Synuclein Oligomers¶
1. Mechanism of Action¶
The proposed mechanism centers on selective activation of histone
print('No PubMed results for hypothesis h-ca454967')
No PubMed results for hypothesis h-ca454967
Hypothesis 2: Dissociating SCFA's Dual Signaling Through GPR43/GPR41 Biased Agonism¶
Target genes: FFAR2, FFAR3, NLRP3 · Composite score: 0.67
Engineering GPR41-Biased SCFA Analogs to Bypass GPR43-NLRP3 Pro-Aggregation Signaling¶
Mechanism of Action¶
Short-chain fatty acids (SCFAs), principally acetate (C2), propionate (C3), and butyrate (C4), are produced by microbial fermentation of dietary fiber in the gut and reach systemic circul
print('No PubMed results for hypothesis h-ded1734f')
No PubMed results for hypothesis h-ded1734f
7. Knowledge graph edges (2 total)¶
edge_data = [{'source': 'C3', 'relation': 'co_discussed', 'target': 'NLRP3', 'strength': 0.4}, {'source': 'C4', 'relation': 'co_discussed', 'target': 'NLRP3', '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