@nahisaho/satori 0.11.0 → 0.12.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (27) hide show
  1. package/README.md +111 -45
  2. package/package.json +1 -1
  3. package/src/.github/skills/scientific-admet-pharmacokinetics/SKILL.md +1 -0
  4. package/src/.github/skills/scientific-cancer-genomics/SKILL.md +287 -0
  5. package/src/.github/skills/scientific-clinical-decision-support/SKILL.md +2 -0
  6. package/src/.github/skills/scientific-clinical-reporting/SKILL.md +324 -0
  7. package/src/.github/skills/scientific-computational-materials/SKILL.md +4 -4
  8. package/src/.github/skills/scientific-deep-learning/SKILL.md +1 -0
  9. package/src/.github/skills/scientific-epidemiology-public-health/SKILL.md +1 -0
  10. package/src/.github/skills/scientific-grant-writing/SKILL.md +2 -0
  11. package/src/.github/skills/scientific-lab-data-management/SKILL.md +2 -2
  12. package/src/.github/skills/scientific-literature-search/SKILL.md +443 -0
  13. package/src/.github/skills/scientific-meta-analysis/SKILL.md +10 -0
  14. package/src/.github/skills/scientific-metabolomics-databases/SKILL.md +288 -0
  15. package/src/.github/skills/scientific-molecular-docking/SKILL.md +303 -0
  16. package/src/.github/skills/scientific-pathway-enrichment/SKILL.md +449 -0
  17. package/src/.github/skills/scientific-pharmacovigilance/SKILL.md +3 -0
  18. package/src/.github/skills/scientific-population-genetics/SKILL.md +2 -0
  19. package/src/.github/skills/scientific-precision-oncology/SKILL.md +1 -0
  20. package/src/.github/skills/scientific-protein-domain-family/SKILL.md +369 -0
  21. package/src/.github/skills/scientific-protein-interaction-network/SKILL.md +352 -0
  22. package/src/.github/skills/scientific-scientific-schematics/SKILL.md +2 -2
  23. package/src/.github/skills/scientific-single-cell-genomics/SKILL.md +2 -0
  24. package/src/.github/skills/scientific-survival-clinical/SKILL.md +11 -0
  25. package/src/.github/skills/scientific-systematic-review/SKILL.md +361 -0
  26. package/src/.github/skills/scientific-variant-effect-prediction/SKILL.md +325 -0
  27. package/src/.github/skills/scientific-variant-interpretation/SKILL.md +1 -0
@@ -0,0 +1,352 @@
1
+ ---
2
+ name: scientific-protein-interaction-network
3
+ description: |
4
+ タンパク質-タンパク質相互作用 (PPI) ネットワーク解析スキル。STRING、IntAct、
5
+ BioGRID、STITCH (化学-タンパク質) 相互作用データベースを統合した
6
+ ネットワーク構築・解析パイプライン。GO/KEGG 富化、相互作用パートナー発見、
7
+ 組織特異的ネットワーク (HumanBase)、化合物-標的ネットワーク対応。
8
+ 14 の ToolUniverse SMCP ツールと連携。
9
+ ---
10
+
11
+ # Scientific Protein Interaction Network
12
+
13
+ STRING / IntAct / BioGRID / STITCH の 4 大 PPI データベースを統合した
14
+ タンパク質相互作用ネットワーク解析パイプラインを提供する。
15
+
16
+ ## When to Use
17
+
18
+ - DEG や変異遺伝子の PPI ネットワークを構築するとき
19
+ - ハブタンパク質やボトルネックの特定が必要なとき
20
+ - 化合物と標的タンパク質の相互作用を調べるとき
21
+ - 組織特異的な相互作用ネットワークを評価するとき
22
+ - PPI データに基づく GO/KEGG 富化やモジュール解析を行うとき
23
+
24
+ ---
25
+
26
+ ## Quick Start
27
+
28
+ ## 1. STRING PPI ネットワーク取得
29
+
30
+ ```python
31
+ import requests
32
+ import pandas as pd
33
+ import networkx as nx
34
+
35
+
36
+ def string_get_interactions(proteins, species=9606,
37
+ score_threshold=400,
38
+ network_type="functional"):
39
+ """
40
+ STRING API v12 による PPI ネットワーク取得。
41
+
42
+ Parameters:
43
+ proteins: list — タンパク質名/UniProt ID リスト
44
+ species: int — NCBI Taxonomy ID (9606=Homo sapiens)
45
+ score_threshold: int — 信頼スコア閾値 (0-1000)
46
+ network_type: "functional" or "physical"
47
+ """
48
+ base = "https://string-db.org/api/json"
49
+
50
+ # タンパク質 ID 解決
51
+ resolve_url = f"{base}/get_string_ids"
52
+ resolved = []
53
+ for batch in [proteins[i:i+10] for i in range(0, len(proteins), 10)]:
54
+ params = {
55
+ "identifiers": "\r".join(batch),
56
+ "species": species,
57
+ "limit": 1,
58
+ }
59
+ resp = requests.get(resolve_url, params=params)
60
+ for r in resp.json():
61
+ resolved.append(r["stringId"])
62
+
63
+ if not resolved:
64
+ print("No proteins resolved")
65
+ return pd.DataFrame(), nx.Graph()
66
+
67
+ # 相互作用取得
68
+ interaction_url = f"{base}/network"
69
+ params = {
70
+ "identifiers": "\r".join(resolved),
71
+ "species": species,
72
+ "required_score": score_threshold,
73
+ "network_type": network_type,
74
+ }
75
+ resp = requests.get(interaction_url, params=params)
76
+ interactions = resp.json()
77
+
78
+ edges = []
79
+ for i in interactions:
80
+ edges.append({
81
+ "protein_a": i["preferredName_A"],
82
+ "protein_b": i["preferredName_B"],
83
+ "score": i["score"],
84
+ "nscore": i.get("nscore", 0),
85
+ "fscore": i.get("fscore", 0),
86
+ "pscore": i.get("pscore", 0),
87
+ "ascore": i.get("ascore", 0),
88
+ "escore": i.get("escore", 0),
89
+ "dscore": i.get("dscore", 0),
90
+ "tscore": i.get("tscore", 0),
91
+ })
92
+
93
+ df = pd.DataFrame(edges)
94
+
95
+ # NetworkX グラフ構築
96
+ G = nx.Graph()
97
+ for _, row in df.iterrows():
98
+ G.add_edge(row["protein_a"], row["protein_b"],
99
+ weight=row["score"] / 1000.0)
100
+
101
+ print(f"STRING network: {G.number_of_nodes()} nodes, "
102
+ f"{G.number_of_edges()} edges (score ≥ {score_threshold})")
103
+ return df, G
104
+ ```
105
+
106
+ ## 2. IntAct 分子相互作用検索
107
+
108
+ ```python
109
+ def intact_search_interactions(query, species="human",
110
+ interaction_type=None,
111
+ max_results=200):
112
+ """
113
+ IntAct REST API による分子相互作用検索。
114
+
115
+ Parameters:
116
+ query: str — タンパク質名/UniProt ID
117
+ species: str or int — "human" or taxonomy ID
118
+ interaction_type: str — MI term (e.g., "MI:0407" physical association)
119
+ """
120
+ url = "https://www.ebi.ac.uk/intact/ws/interaction/findInteractions"
121
+ params = {
122
+ "query": query,
123
+ "maxResults": max_results,
124
+ }
125
+ if species:
126
+ params["species"] = species
127
+
128
+ resp = requests.get(url, params=params)
129
+ if resp.status_code != 200:
130
+ print(f"IntAct error: {resp.status_code}")
131
+ return pd.DataFrame()
132
+
133
+ data = resp.json()
134
+ interactions = data.get("content", [])
135
+
136
+ results = []
137
+ for ix in interactions:
138
+ interactor_a = ix.get("interactorA", {})
139
+ interactor_b = ix.get("interactorB", {})
140
+ results.append({
141
+ "interactor_a": interactor_a.get("preferredIdentifier", ""),
142
+ "interactor_a_name": interactor_a.get("shortLabel", ""),
143
+ "interactor_b": interactor_b.get("preferredIdentifier", ""),
144
+ "interactor_b_name": interactor_b.get("shortLabel", ""),
145
+ "interaction_type": ix.get("interactionType", ""),
146
+ "detection_method": ix.get("detectionMethod", ""),
147
+ "confidence": ix.get("confidenceValue", 0),
148
+ "publication": ix.get("pubmedId", ""),
149
+ })
150
+
151
+ df = pd.DataFrame(results)
152
+ print(f"IntAct: {len(df)} interactions for '{query}'")
153
+ return df
154
+ ```
155
+
156
+ ## 3. STITCH 化合物-タンパク質相互作用
157
+
158
+ ```python
159
+ def stitch_chemical_protein(chemicals, species=9606,
160
+ score_threshold=400):
161
+ """
162
+ STITCH API による化合物-タンパク質相互作用検索。
163
+
164
+ Parameters:
165
+ chemicals: list — 化合物名/CID リスト
166
+ species: int — NCBI Taxonomy ID
167
+ score_threshold: int — 信頼スコア閾値
168
+ """
169
+ url = "http://stitch.embl.de/api/json/interactionsList"
170
+ params = {
171
+ "identifiers": "\r".join(chemicals),
172
+ "species": species,
173
+ "required_score": score_threshold,
174
+ }
175
+
176
+ resp = requests.get(url, params=params)
177
+ interactions = resp.json()
178
+
179
+ results = []
180
+ for i in interactions:
181
+ results.append({
182
+ "chemical": i.get("preferredName_A", ""),
183
+ "protein": i.get("preferredName_B", ""),
184
+ "score": i.get("score", 0),
185
+ "type_a": "chemical" if i.get("ncbiTaxonId_A") == -1 else "protein",
186
+ })
187
+
188
+ df = pd.DataFrame(results)
189
+ print(f"STITCH: {len(df)} chemical-protein interactions")
190
+ return df
191
+ ```
192
+
193
+ ## 4. PPI ネットワーク解析 (中心性・モジュール)
194
+
195
+ ```python
196
+ def analyze_ppi_network(G, community_method="louvain"):
197
+ """
198
+ PPI ネットワークのトポロジー解析。
199
+
200
+ Parameters:
201
+ G: nx.Graph — PPI ネットワーク
202
+ community_method: "louvain" or "label_propagation"
203
+ """
204
+ if G.number_of_nodes() == 0:
205
+ return {}
206
+
207
+ # 中心性指標
208
+ degree_cent = nx.degree_centrality(G)
209
+ betweenness = nx.betweenness_centrality(G)
210
+ closeness = nx.closeness_centrality(G)
211
+
212
+ # ハブタンパク質 (degree top 10)
213
+ hubs = sorted(degree_cent.items(), key=lambda x: -x[1])[:10]
214
+
215
+ # ボトルネック (betweenness top 10)
216
+ bottlenecks = sorted(betweenness.items(), key=lambda x: -x[1])[:10]
217
+
218
+ # コミュニティ検出
219
+ if community_method == "louvain":
220
+ from community import community_louvain
221
+ partition = community_louvain.best_partition(G)
222
+ else:
223
+ communities = nx.community.label_propagation_communities(G)
224
+ partition = {}
225
+ for i, comm in enumerate(communities):
226
+ for node in comm:
227
+ partition[node] = i
228
+
229
+ n_communities = len(set(partition.values()))
230
+
231
+ stats = {
232
+ "nodes": G.number_of_nodes(),
233
+ "edges": G.number_of_edges(),
234
+ "density": round(nx.density(G), 4),
235
+ "avg_clustering": round(nx.average_clustering(G), 4),
236
+ "connected_components": nx.number_connected_components(G),
237
+ "communities": n_communities,
238
+ "hub_proteins": [h[0] for h in hubs],
239
+ "bottleneck_proteins": [b[0] for b in bottlenecks],
240
+ }
241
+
242
+ centrality_df = pd.DataFrame({
243
+ "protein": list(degree_cent.keys()),
244
+ "degree_centrality": list(degree_cent.values()),
245
+ "betweenness": [betweenness[n] for n in degree_cent.keys()],
246
+ "closeness": [closeness[n] for n in degree_cent.keys()],
247
+ "community": [partition.get(n, -1) for n in degree_cent.keys()],
248
+ }).sort_values("degree_centrality", ascending=False)
249
+
250
+ print(f"PPI analysis: {stats['nodes']} nodes, {stats['edges']} edges, "
251
+ f"{n_communities} communities")
252
+ return stats, centrality_df, partition
253
+ ```
254
+
255
+ ## 5. PPI ネットワーク可視化
256
+
257
+ ```python
258
+ def visualize_ppi_network(G, partition=None, hub_proteins=None,
259
+ output="figures/ppi_network.png",
260
+ layout="spring"):
261
+ """
262
+ PPI ネットワークの可視化。
263
+ """
264
+ import matplotlib.pyplot as plt
265
+ import os
266
+ os.makedirs(os.path.dirname(output), exist_ok=True)
267
+
268
+ fig, ax = plt.subplots(figsize=(14, 14))
269
+
270
+ if layout == "spring":
271
+ pos = nx.spring_layout(G, k=1.5, seed=42)
272
+ elif layout == "kamada_kawai":
273
+ pos = nx.kamada_kawai_layout(G)
274
+
275
+ # ノードサイズ = 次数
276
+ node_sizes = [300 + 100 * G.degree(n) for n in G.nodes()]
277
+
278
+ # コミュニティカラー
279
+ if partition:
280
+ import matplotlib.cm as cm
281
+ n_comm = len(set(partition.values()))
282
+ colors = [cm.Set3(partition.get(n, 0) / max(n_comm, 1)) for n in G.nodes()]
283
+ else:
284
+ colors = "steelblue"
285
+
286
+ nx.draw_networkx_edges(G, pos, alpha=0.2, ax=ax)
287
+ nx.draw_networkx_nodes(G, pos, node_size=node_sizes,
288
+ node_color=colors, alpha=0.8, ax=ax)
289
+
290
+ # ハブタンパク質のラベル
291
+ if hub_proteins:
292
+ labels = {n: n for n in G.nodes() if n in hub_proteins}
293
+ else:
294
+ labels = {n: n for n in G.nodes() if G.degree(n) >= 5}
295
+ nx.draw_networkx_labels(G, pos, labels, font_size=8, ax=ax)
296
+
297
+ ax.set_title(f"PPI Network ({G.number_of_nodes()} proteins, "
298
+ f"{G.number_of_edges()} interactions)")
299
+ ax.axis("off")
300
+ plt.tight_layout()
301
+ plt.savefig(output, dpi=300, bbox_inches="tight")
302
+ plt.close()
303
+ print(f"Saved: {output}")
304
+ ```
305
+
306
+ ## References
307
+
308
+ ### Output Files
309
+
310
+ | ファイル | 形式 |
311
+ |---|---|
312
+ | `results/string_interactions.csv` | CSV |
313
+ | `results/intact_interactions.csv` | CSV |
314
+ | `results/stitch_interactions.csv` | CSV |
315
+ | `results/ppi_centrality.csv` | CSV |
316
+ | `results/ppi_network.graphml` | GraphML |
317
+ | `figures/ppi_network.png` | PNG |
318
+
319
+ ### 利用可能ツール
320
+
321
+ > [ToolUniverse](https://github.com/mims-harvard/ToolUniverse) SMCP 経由で利用可能な外部ツール。
322
+
323
+ | カテゴリ | 主要ツール | 用途 |
324
+ |---|---|---|
325
+ | IntAct | `intact_search_interactions` | 分子相互作用検索 |
326
+ | IntAct | `intact_get_interactions` | 相互作用データ取得 |
327
+ | IntAct | `intact_get_interactor` | 相互作用因子詳細 |
328
+ | IntAct | `intact_get_interaction_details` | 相互作用詳細 |
329
+ | IntAct | `intact_get_interaction_network` | ネットワーク取得 |
330
+ | IntAct | `intact_get_interactions_by_organism` | 生物種別相互作用 |
331
+ | IntAct | `intact_get_interactions_by_complex` | 複合体別相互作用 |
332
+ | IntAct | `intact_get_complex_details` | 複合体詳細 |
333
+ | STRING/BioGRID | `STRING_get_protein_interactions` | STRING PPI 取得 |
334
+ | STRING/BioGRID | `BioGRID_get_interactions` | BioGRID 相互作用取得 |
335
+ | STITCH | `STITCH_get_chemical_protein_interactions` | 化合物-タンパク質相互作用 |
336
+ | STITCH | `STITCH_get_interaction_partners` | 相互作用パートナー |
337
+ | STITCH | `STITCH_resolve_identifier` | 化合物 ID 解決 |
338
+ | HumanBase | `humanbase_ppi_analysis` | 組織特異的 PPI 解析 |
339
+
340
+ ### 参照スキル
341
+
342
+ | スキル | 関連 |
343
+ |---|---|
344
+ | `scientific-drug-target-profiling` | 標的タンパク質 → PPI 拡張 |
345
+ | `scientific-network-analysis` | 汎用ネットワーク解析手法 |
346
+ | `scientific-pathway-enrichment` | PPI モジュール → パスウェイ富化 |
347
+ | `scientific-protein-structure-analysis` | 構造情報 → 相互作用界面 |
348
+ | `scientific-systems-biology` | GRN ↔ PPI 統合 |
349
+
350
+ ### 依存パッケージ
351
+
352
+ `networkx`, `requests`, `pandas`, `matplotlib`, `python-louvain` (community)
@@ -325,11 +325,11 @@ def generate_tikz_figure(tikz_code, output_file="figures/tikz_figure.tex",
325
325
 
326
326
  | スキル | 関連 |
327
327
  |---|---|
328
- | `scientific-visualization` | データ可視化全般 |
328
+ | `scientific-publication-figures` | データ可視化全般 |
329
329
  | `scientific-clinical-trials-analytics` | CONSORT 図のデータソース |
330
330
  | `scientific-grant-writing` | 研究計画図 |
331
331
  | `scientific-network-analysis` | ネットワーク図 |
332
- | `scientific-presentation` | プレゼン素材 |
332
+ | `scientific-presentation-design` | プレゼン素材 |
333
333
 
334
334
  ### 依存パッケージ
335
335
 
@@ -355,6 +355,8 @@ def sc_visualization_panel(adata, deg_df=None, save_dir="figures"):
355
355
  | [scientific-network-analysis](../scientific-network-analysis/SKILL.md) | 遺伝子制御ネットワーク |
356
356
  | [scientific-deep-learning](../scientific-deep-learning/SKILL.md) | scVI / scGPT 等の深層学習モデル |
357
357
  | [scientific-pca-tsne](../scientific-pca-tsne/SKILL.md) | 次元削減手法 |
358
+ | [scientific-gene-expression-transcriptomics](../scientific-gene-expression-transcriptomics/SKILL.md) | バルク RNA-seq 差次発現 |
359
+ | [scientific-epigenomics-chromatin](../scientific-epigenomics-chromatin/SKILL.md) | エピゲノム-発現統合 |
358
360
 
359
361
  #### 依存パッケージ
360
362
 
@@ -245,6 +245,17 @@ def bayesian_sequential_update(successes_list, trials_list,
245
245
  | GDC | `GDC_search_cases` | TCGA 臨床データ |
246
246
  | PubMed | `PubMed_search_articles` | 臨床文献検索 |
247
247
 
248
+ ### 参照スキル
249
+
250
+ | スキル | 連携 |
251
+ |---|---|
252
+ | `scientific-causal-inference` | ← 傾向スコア・因果推論 |
253
+ | `scientific-meta-analysis` | ← 統合解析・エビデンス統合 |
254
+ | `scientific-statistical-testing` | ← 仮説検定・多重比較 |
255
+ | `scientific-clinical-trials-analytics` | ← ClinicalTrials.gov 試験データ |
256
+ | `scientific-pharmacovigilance` | → AE データの安全性解析 |
257
+ | `scientific-clinical-decision-support` | → 生存解析結果の臨床応用 |
258
+
248
259
  #### 参照実験
249
260
 
250
261
  - **Exp-03**: Kaplan-Meier + Cox PH(がん生存解析)