What molecular mechanisms enable functional recovery and muscle re-innervation after motor neuron loss in ALS/FTLD?¶
Notebook ID: nb-SDA-2026-04-14-gap-pubmed-20260410-181356-57d1f917 · Analysis: SDA-2026-04-14-gap-pubmed-20260410-181356-57d1f917 · Generated: 2026-04-21T18:43:09
Research question¶
The study shows dramatic functional recovery and muscle re-innervation after cytoplasmic TDP-43 clearance, even following motor neuron death. The cellular and molecular mechanisms underlying this unexpected regenerative capacity in neurodegenerative disease are not explained.
Gap type: unexplained_observation Source paper: Functional recovery in new mouse models of ALS/FTLD after clearance of pathological cytoplasmic TDP-43. (2015, Acta neuropathologica, PMID:26197969)
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.85 · Rounds: 4
1. Target gene annotations (MyGene)¶
import pandas as pd
ann_rows = [{'gene': 'GDNF', 'name': 'glial cell derived neurotrophic factor', 'summary': 'This gene encodes a secreted ligand of the TGF-beta (transforming growth factor-beta) superfamily of proteins. Ligands o'}, {'gene': 'STMN2', 'name': 'stathmin 2', 'summary': 'This gene encodes a member of the stathmin family of phosphoproteins. Stathmin proteins function in microtubule dynamics'}]
pd.DataFrame(ann_rows)
| gene | name | summary | |
|---|---|---|---|
| 0 | GDNF | glial cell derived neurotrophic factor | This gene encodes a secreted ligand of the TGF... |
| 1 | STMN2 | stathmin 2 | This gene encodes a member of the stathmin fam... |
2. GO Biological Process enrichment (Enrichr)¶
go_bp = [{'rank': 1, 'term': 'Protein Kinase B Signaling (GO:0043491)', 'p_value': 1.3769525171482697e-05, 'odds_ratio': 605.2424242424242, 'genes': ['TYRO3', 'GAS6']}, {'rank': 2, 'term': 'Apoptotic Cell Clearance (GO:0043277)', 'p_value': 1.8850777419928716e-05, 'odds_ratio': 512.025641025641, 'genes': ['TYRO3', 'GAS6']}, {'rank': 3, 'term': 'Phagocytosis (GO:0006909)', 'p_value': 0.00011651719460226656, 'odds_ratio': 198.28855721393035, 'genes': ['TYRO3', 'GAS6']}, {'rank': 4, 'term': 'Positive Regulation Of Kinase Activity (GO:0033674)', 'p_value': 0.0002650830977784653, 'odds_ratio': 130.01960784313727, 'genes': ['TYRO3', 'GAS6']}, {'rank': 5, 'term': 'Endocytosis (GO:0006897)', 'p_value': 0.0008718252945615399, 'odds_ratio': 70.61675579322637, 'genes': ['TYRO3', 'GAS6']}, {'rank': 6, 'term': 'B Cell Chemotaxis (GO:0035754)', 'p_value': 0.0012494733811348967, 'odds_ratio': 1249.4375, 'genes': ['GAS6']}, {'rank': 7, 'term': 'Regulation Of Glomerular Filtration (GO:0003093)', 'p_value': 0.0012494733811348967, 'odds_ratio': 1249.4375, 'genes': ['GAS6']}, {'rank': 8, 'term': 'Positive Regulation Of Phosphorylation (GO:0042327)', 'p_value': 0.0012981262690588075, 'odds_ratio': 57.542940320232894, 'genes': ['TYRO3', 'GAS6']}, {'rank': 9, 'term': 'Receptor-Mediated Virion Attachment To Host Cell (GO:0046813)', 'p_value': 0.0014992198216206949, 'odds_ratio': 999.5, 'genes': ['GAS6']}, {'rank': 10, 'term': 'Negative Regulation Of Dendritic Cell Apoptotic Process (GO:2000669)', 'p_value': 0.0014992198216206949, 'odds_ratio': 999.5, 'genes': ['GAS6']}]
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 | Protein Kinase B Signaling (GO:0043491) | 2 | 1.38e-05 | 605.2 | TYRO3, GAS6 |
| 1 | Apoptotic Cell Clearance (GO:0043277) | 2 | 1.89e-05 | 512.0 | TYRO3, GAS6 |
| 2 | Phagocytosis (GO:0006909) | 2 | 1.17e-04 | 198.3 | TYRO3, GAS6 |
| 3 | Positive Regulation Of Kinase Activity (GO:003... | 2 | 2.65e-04 | 130.0 | TYRO3, GAS6 |
| 4 | Endocytosis (GO:0006897) | 2 | 8.72e-04 | 70.6 | TYRO3, GAS6 |
| 5 | B Cell Chemotaxis (GO:0035754) | 1 | 1.25e-03 | 1249.4 | GAS6 |
| 6 | Regulation Of Glomerular Filtration (GO:0003093) | 1 | 1.25e-03 | 1249.4 | GAS6 |
| 7 | Positive Regulation Of Phosphorylation (GO:004... | 2 | 1.30e-03 | 57.5 | TYRO3, GAS6 |
| 8 | Receptor-Mediated Virion Attachment To Host Ce... | 1 | 1.50e-03 | 999.5 | GAS6 |
| 9 | Negative Regulation Of Dendritic Cell Apoptoti... | 1 | 1.50e-03 | 999.5 | GAS6 |
import matplotlib.pyplot as plt
import numpy as np
go_bp = [{'rank': 1, 'term': 'Protein Kinase B Signaling (GO:0043491)', 'p_value': 1.3769525171482697e-05, 'odds_ratio': 605.2424242424242, 'genes': ['TYRO3', 'GAS6']}, {'rank': 2, 'term': 'Apoptotic Cell Clearance (GO:0043277)', 'p_value': 1.8850777419928716e-05, 'odds_ratio': 512.025641025641, 'genes': ['TYRO3', 'GAS6']}, {'rank': 3, 'term': 'Phagocytosis (GO:0006909)', 'p_value': 0.00011651719460226656, 'odds_ratio': 198.28855721393035, 'genes': ['TYRO3', 'GAS6']}, {'rank': 4, 'term': 'Positive Regulation Of Kinase Activity (GO:0033674)', 'p_value': 0.0002650830977784653, 'odds_ratio': 130.01960784313727, 'genes': ['TYRO3', 'GAS6']}, {'rank': 5, 'term': 'Endocytosis (GO:0006897)', 'p_value': 0.0008718252945615399, 'odds_ratio': 70.61675579322637, 'genes': ['TYRO3', 'GAS6']}, {'rank': 6, 'term': 'B Cell Chemotaxis (GO:0035754)', 'p_value': 0.0012494733811348967, 'odds_ratio': 1249.4375, 'genes': ['GAS6']}, {'rank': 7, 'term': 'Regulation Of Glomerular Filtration (GO:0003093)', 'p_value': 0.0012494733811348967, 'odds_ratio': 1249.4375, 'genes': ['GAS6']}, {'rank': 8, 'term': 'Positive Regulation Of Phosphorylation (GO:0042327)', 'p_value': 0.0012981262690588075, 'odds_ratio': 57.542940320232894, 'genes': ['TYRO3', 'GAS6']}]
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-5p78m2hl 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': 'TYRO3', 'protein2': 'GAS6', 'score': 0.989, 'nscore': 0, 'fscore': 0, 'pscore': 0, 'ascore': 0, 'escore': 0.457, 'dscore': 0, '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)
1 STRING edges
| protein1 | protein2 | score | escore | tscore | |
|---|---|---|---|---|---|
| 0 | TYRO3 | GAS6 | 0.989 | 0.457 | 0.982 |
import math
ppi = [{'protein1': 'TYRO3', 'protein2': 'GAS6', 'score': 0.989, 'nscore': 0, 'fscore': 0, 'pscore': 0, 'ascore': 0, 'escore': 0.457, 'dscore': 0, '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': 'GDNF', 'n_pathways': 4, 'top_pathway': 'NCAM1 interactions'}, {'gene': 'STMN2', 'n_pathways': 1, 'top_pathway': 'RND1 GTPase cycle'}]
pd.DataFrame(pw_rows).sort_values('n_pathways', ascending=False)
| gene | n_pathways | top_pathway | |
|---|---|---|---|
| 0 | GDNF | 4 | NCAM1 interactions |
| 1 | STMN2 | 1 | RND1 GTPase cycle |
5. Hypothesis ranking (2 hypotheses)¶
hyp_data = [('STMN2 Restoration as a Prerequisite for Axon Growth Aft', 0.683), ('GDNF Gradient Establishment by Schwann Cells Enables Mo', 0.61)]
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 molecular mechanisms enable functional recovery and muscle re-innervation after motor neuron loss in ALS/FTLD?')
ax.grid(axis='x', alpha=0.3)
plt.tight_layout(); plt.show()
labels = ['STMN2 Restoration as a Prerequisite for ', 'GDNF Gradient Establishment by Schwann C']
matrix = np.array([[0.7, 0.85, 0.82, 0.8, 0.0, 0.82, 0.75, 0.88, 0.68], [0.45, 0.7, 0.78, 0.82, 0.0, 0.78, 0.72, 0.8, 0.6]])
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: STMN2 Restoration as a Prerequisite for Axon Growth After TDP-43 Clear¶
Target genes: STMN2 · Composite score: 0.683
Stathmin-2-Dependent Microtubule Destabilization Reversal Enables Motor Axon Sprouting. The hypothesis proposes that functional recovery requires restoration of STMN2 levels, which TDP-43 normally sustains through direct transcriptional regulation. TDP-43, an aggregation-prone protein that accumulat
print('No PubMed results for hypothesis h-2ca830cd')
No PubMed results for hypothesis h-2ca830cd
Hypothesis 2: GDNF Gradient Establishment by Schwann Cells Enables Motor Re-innervat¶
Target genes: GDNF · Composite score: 0.61
Glial Cell Line-Derived Neurotrophic Factor Secretion from Denervated Schwann Cells Attracts and Supports Re-innervating Motor Axons. Upon motor neuron loss and TDP-43 clearance, denervated Schwann cells within peripheral nerve segments upregulate GDNF as part of the Wallerian degeneration program,
print('No PubMed results for hypothesis h-6d411c20')
No PubMed results for hypothesis h-6d411c20
7. Knowledge graph edges (2 total)¶
edge_data = [{'source': 'STMN2', 'relation': 'promoted: STMN2 Restorati', 'target': 'neurodegeneration', 'strength': 0.66}, {'source': 'GDNF', 'relation': 'promoted: GDNF Gradient E', 'target': 'neurodegeneration', 'strength': 0.58}]
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