@nahisaho/satori 0.10.0 → 0.11.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.
- package/README.md +73 -43
- package/package.json +1 -1
- package/src/.github/skills/scientific-clinical-trials-analytics/SKILL.md +340 -0
- package/src/.github/skills/scientific-computational-materials/SKILL.md +353 -0
- package/src/.github/skills/scientific-epigenomics-chromatin/SKILL.md +567 -0
- package/src/.github/skills/scientific-gene-expression-transcriptomics/SKILL.md +330 -0
- package/src/.github/skills/scientific-lab-data-management/SKILL.md +334 -0
- package/src/.github/skills/scientific-neuroscience-electrophysiology/SKILL.md +400 -0
- package/src/.github/skills/scientific-pharmacogenomics/SKILL.md +342 -0
- package/src/.github/skills/scientific-proteomics-mass-spectrometry/SKILL.md +401 -0
- package/src/.github/skills/scientific-regulatory-science/SKILL.md +256 -0
- package/src/.github/skills/scientific-scientific-schematics/SKILL.md +336 -0
|
@@ -0,0 +1,330 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: scientific-gene-expression-transcriptomics
|
|
3
|
+
description: |
|
|
4
|
+
遺伝子発現・トランスクリプトミクス解析スキル。GEO (Gene Expression Omnibus) からの
|
|
5
|
+
公開データセット取得・前処理、DESeq2 (PyDESeq2) による差次発現解析、
|
|
6
|
+
GTEx 組織発現参照・eQTL 解析、Expression Atlas (EBI GXA) 統合照会、
|
|
7
|
+
遺伝子セット濃縮解析 (GSEA)、バルク RNA-seq カウントデータの
|
|
8
|
+
標準解析パイプライン。
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
# Scientific Gene Expression & Transcriptomics
|
|
12
|
+
|
|
13
|
+
バルク RNA-seq / マイクロアレイの遺伝子発現データを対象に、
|
|
14
|
+
GEO データセット取得→前処理→差次発現→GSEA→組織発現参照の
|
|
15
|
+
統合トランスクリプトミクスパイプラインを提供する。
|
|
16
|
+
|
|
17
|
+
## When to Use
|
|
18
|
+
|
|
19
|
+
- GEO からバルク RNA-seq/マイクロアレイデータセットを取得・前処理するとき
|
|
20
|
+
- DESeq2 による差次発現遺伝子 (DEG) 解析が必要なとき
|
|
21
|
+
- GTEx 組織発現プロファイル・eQTL データを照会するとき
|
|
22
|
+
- 遺伝子セット濃縮解析 (GSEA/ORA) を行うとき
|
|
23
|
+
- Expression Atlas でベースライン/差次発現実験を検索するとき
|
|
24
|
+
|
|
25
|
+
---
|
|
26
|
+
|
|
27
|
+
## Quick Start
|
|
28
|
+
|
|
29
|
+
## 1. GEO データセット取得
|
|
30
|
+
|
|
31
|
+
```python
|
|
32
|
+
import pandas as pd
|
|
33
|
+
import GEOparse
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
def fetch_geo_dataset(accession, output_dir="data/geo"):
|
|
37
|
+
"""
|
|
38
|
+
GEO (Gene Expression Omnibus) データセットの取得・前処理。
|
|
39
|
+
|
|
40
|
+
GEO ID 形式:
|
|
41
|
+
- GSE: Series (発現データセット)
|
|
42
|
+
- GPL: Platform (アレイ/シーケンサー定義)
|
|
43
|
+
- GSM: Sample (個別サンプル)
|
|
44
|
+
- GDS: Dataset (キュレーション済み)
|
|
45
|
+
"""
|
|
46
|
+
import os
|
|
47
|
+
os.makedirs(output_dir, exist_ok=True)
|
|
48
|
+
|
|
49
|
+
gse = GEOparse.get_GEO(geo=accession, destdir=output_dir)
|
|
50
|
+
|
|
51
|
+
print(f" GEO Accession: {accession}")
|
|
52
|
+
print(f" Title: {gse.metadata['title'][0]}")
|
|
53
|
+
print(f" Platform: {list(gse.gpls.keys())}")
|
|
54
|
+
print(f" Samples: {len(gse.gsms)}")
|
|
55
|
+
print(f" Type: {gse.metadata.get('type', ['unknown'])}")
|
|
56
|
+
|
|
57
|
+
# サンプルメタデータ抽出
|
|
58
|
+
metadata = []
|
|
59
|
+
for gsm_name, gsm in gse.gsms.items():
|
|
60
|
+
meta = {"sample_id": gsm_name}
|
|
61
|
+
meta.update({k: v[0] if v else None
|
|
62
|
+
for k, v in gsm.metadata.items()
|
|
63
|
+
if k in ["title", "source_name_ch1", "characteristics_ch1"]})
|
|
64
|
+
metadata.append(meta)
|
|
65
|
+
|
|
66
|
+
metadata_df = pd.DataFrame(metadata)
|
|
67
|
+
|
|
68
|
+
# 発現マトリクス取得
|
|
69
|
+
pivot_df = gse.pivot_samples("VALUE")
|
|
70
|
+
print(f" Expression matrix: {pivot_df.shape[0]} genes × {pivot_df.shape[1]} samples")
|
|
71
|
+
|
|
72
|
+
return gse, metadata_df, pivot_df
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
## 2. DESeq2 差次発現解析 (PyDESeq2)
|
|
76
|
+
|
|
77
|
+
```python
|
|
78
|
+
import numpy as np
|
|
79
|
+
import pandas as pd
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
def deseq2_differential_expression(count_matrix, metadata, design_factor,
|
|
83
|
+
contrast=None, alpha=0.05,
|
|
84
|
+
lfc_threshold=1.0):
|
|
85
|
+
"""
|
|
86
|
+
PyDESeq2 による差次発現解析パイプライン。
|
|
87
|
+
|
|
88
|
+
1. カウントマトリクス入力 (genes × samples)
|
|
89
|
+
2. サイズファクター正規化 (median of ratios)
|
|
90
|
+
3. 分散推定 (shrinkage)
|
|
91
|
+
4. GLM フィッティング (NB 分布)
|
|
92
|
+
5. Wald 検定
|
|
93
|
+
6. LFC 収縮 (apeglm)
|
|
94
|
+
7. FDR 補正 (Benjamini-Hochberg)
|
|
95
|
+
"""
|
|
96
|
+
from pydeseq2.dds import DeseqDataSet
|
|
97
|
+
from pydeseq2.ds import DeseqStats
|
|
98
|
+
|
|
99
|
+
# DeseqDataSet 構築
|
|
100
|
+
dds = DeseqDataSet(
|
|
101
|
+
counts=count_matrix,
|
|
102
|
+
metadata=metadata,
|
|
103
|
+
design_factors=design_factor,
|
|
104
|
+
)
|
|
105
|
+
|
|
106
|
+
# 正規化 + 分散推定 + 統計検定
|
|
107
|
+
dds.deseq2()
|
|
108
|
+
|
|
109
|
+
# 結果取得
|
|
110
|
+
stat_res = DeseqStats(dds, contrast=contrast, alpha=alpha)
|
|
111
|
+
stat_res.summary()
|
|
112
|
+
|
|
113
|
+
results_df = stat_res.results_df.copy()
|
|
114
|
+
|
|
115
|
+
# LFC 収縮
|
|
116
|
+
stat_res.lfc_shrink(coeff=contrast)
|
|
117
|
+
results_df["log2FoldChange_shrunk"] = stat_res.results_df["log2FoldChange"]
|
|
118
|
+
|
|
119
|
+
# フィルタリング
|
|
120
|
+
sig = results_df[
|
|
121
|
+
(results_df["padj"] < alpha) &
|
|
122
|
+
(results_df["log2FoldChange"].abs() > lfc_threshold)
|
|
123
|
+
]
|
|
124
|
+
|
|
125
|
+
sig_up = sig[sig["log2FoldChange"] > 0]
|
|
126
|
+
sig_down = sig[sig["log2FoldChange"] < 0]
|
|
127
|
+
|
|
128
|
+
print(f" DESeq2 results:")
|
|
129
|
+
print(f" Total genes tested: {len(results_df)}")
|
|
130
|
+
print(f" Significant (FDR < {alpha}, |log2FC| > {lfc_threshold}):")
|
|
131
|
+
print(f" UP: {len(sig_up)}")
|
|
132
|
+
print(f" DOWN: {len(sig_down)}")
|
|
133
|
+
|
|
134
|
+
return results_df, sig
|
|
135
|
+
|
|
136
|
+
|
|
137
|
+
def generate_volcano_plot(results_df, alpha=0.05, lfc_threshold=1.0,
|
|
138
|
+
output_file="figures/volcano_rnaseq.png"):
|
|
139
|
+
"""
|
|
140
|
+
Volcano プロット生成。
|
|
141
|
+
"""
|
|
142
|
+
import matplotlib.pyplot as plt
|
|
143
|
+
|
|
144
|
+
fig, ax = plt.subplots(figsize=(8, 6))
|
|
145
|
+
|
|
146
|
+
results_df["-log10_padj"] = -np.log10(results_df["padj"].clip(lower=1e-300))
|
|
147
|
+
|
|
148
|
+
# 色分け
|
|
149
|
+
colors = []
|
|
150
|
+
for _, row in results_df.iterrows():
|
|
151
|
+
if row["padj"] < alpha and row["log2FoldChange"] > lfc_threshold:
|
|
152
|
+
colors.append("red")
|
|
153
|
+
elif row["padj"] < alpha and row["log2FoldChange"] < -lfc_threshold:
|
|
154
|
+
colors.append("blue")
|
|
155
|
+
else:
|
|
156
|
+
colors.append("gray")
|
|
157
|
+
|
|
158
|
+
ax.scatter(results_df["log2FoldChange"], results_df["-log10_padj"],
|
|
159
|
+
c=colors, alpha=0.5, s=5)
|
|
160
|
+
ax.axhline(-np.log10(alpha), color="gray", linestyle="--", lw=0.5)
|
|
161
|
+
ax.axvline(lfc_threshold, color="gray", linestyle="--", lw=0.5)
|
|
162
|
+
ax.axvline(-lfc_threshold, color="gray", linestyle="--", lw=0.5)
|
|
163
|
+
ax.set_xlabel("log2 Fold Change")
|
|
164
|
+
ax.set_ylabel("-log10(adjusted p-value)")
|
|
165
|
+
ax.set_title("Volcano Plot — Differential Expression")
|
|
166
|
+
plt.tight_layout()
|
|
167
|
+
plt.savefig(output_file, dpi=300)
|
|
168
|
+
plt.close()
|
|
169
|
+
|
|
170
|
+
return output_file
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
## 3. GTEx 組織発現・eQTL 照会
|
|
174
|
+
|
|
175
|
+
```python
|
|
176
|
+
import pandas as pd
|
|
177
|
+
|
|
178
|
+
|
|
179
|
+
def query_gtex_expression(gene_name, tissue=None):
|
|
180
|
+
"""
|
|
181
|
+
GTEx (Genotype-Tissue Expression) 組織発現プロファイル照会。
|
|
182
|
+
|
|
183
|
+
GTEx v8: 54 組織, 948 ドナー, 17,382 サンプル。
|
|
184
|
+
TPM (Transcripts Per Million) ベースの発現量。
|
|
185
|
+
"""
|
|
186
|
+
print(f" GTEx gene expression query: {gene_name}")
|
|
187
|
+
if tissue:
|
|
188
|
+
print(f" Tissue: {tissue}")
|
|
189
|
+
else:
|
|
190
|
+
print(" All tissues (54 tissue sites)")
|
|
191
|
+
|
|
192
|
+
return {"gene": gene_name, "tissue": tissue}
|
|
193
|
+
|
|
194
|
+
|
|
195
|
+
def query_gtex_eqtl(gene_name, tissue, pvalue_threshold=1e-5):
|
|
196
|
+
"""
|
|
197
|
+
GTEx eQTL (expression Quantitative Trait Loci) 照会。
|
|
198
|
+
|
|
199
|
+
eQTL = 遺伝子発現量に影響する遺伝的変異
|
|
200
|
+
- cis-eQTL: 遺伝子の ±1 Mb 以内の変異
|
|
201
|
+
- trans-eQTL: 遺伝子から離れた変異
|
|
202
|
+
"""
|
|
203
|
+
print(f" GTEx eQTL query: gene={gene_name}, tissue={tissue}")
|
|
204
|
+
print(f" P-value threshold: {pvalue_threshold}")
|
|
205
|
+
print(" Types: cis-eQTL (primary), trans-eQTL")
|
|
206
|
+
|
|
207
|
+
return {"gene": gene_name, "tissue": tissue}
|
|
208
|
+
```
|
|
209
|
+
|
|
210
|
+
## 4. 遺伝子セット濃縮解析 (GSEA)
|
|
211
|
+
|
|
212
|
+
```python
|
|
213
|
+
import pandas as pd
|
|
214
|
+
import numpy as np
|
|
215
|
+
|
|
216
|
+
|
|
217
|
+
def gsea_preranked(ranked_gene_list, gene_sets="MSigDB_Hallmark_2020",
|
|
218
|
+
n_permutations=1000, min_size=15, max_size=500):
|
|
219
|
+
"""
|
|
220
|
+
GSEA (Gene Set Enrichment Analysis) — Preranked。
|
|
221
|
+
|
|
222
|
+
入力: log2FC × -log10(p) でランク付けされた遺伝子リスト
|
|
223
|
+
遺伝子セットDB:
|
|
224
|
+
- MSigDB Hallmark (H)
|
|
225
|
+
- GO Biological Process (C5:BP)
|
|
226
|
+
- KEGG Pathways (C2:KEGG)
|
|
227
|
+
- Reactome (C2:REACTOME)
|
|
228
|
+
"""
|
|
229
|
+
import gseapy as gp
|
|
230
|
+
|
|
231
|
+
# ランクスコア = sign(log2FC) × -log10(pvalue)
|
|
232
|
+
results = gp.prerank(
|
|
233
|
+
rnk=ranked_gene_list,
|
|
234
|
+
gene_sets=gene_sets,
|
|
235
|
+
processes=4,
|
|
236
|
+
permutation_num=n_permutations,
|
|
237
|
+
min_size=min_size,
|
|
238
|
+
max_size=max_size,
|
|
239
|
+
outdir="results/gsea",
|
|
240
|
+
seed=42,
|
|
241
|
+
)
|
|
242
|
+
|
|
243
|
+
sig_terms = results.res2d[results.res2d["FDR q-val"] < 0.05]
|
|
244
|
+
|
|
245
|
+
print(f" GSEA results ({gene_sets}):")
|
|
246
|
+
print(f" Gene sets tested: {len(results.res2d)}")
|
|
247
|
+
print(f" Significant (FDR < 0.05): {len(sig_terms)}")
|
|
248
|
+
if len(sig_terms) > 0:
|
|
249
|
+
print(f" Top enriched:")
|
|
250
|
+
for _, row in sig_terms.head(5).iterrows():
|
|
251
|
+
direction = "UP" if row["NES"] > 0 else "DOWN"
|
|
252
|
+
print(f" {row['Term']} (NES={row['NES']:.2f}, {direction})")
|
|
253
|
+
|
|
254
|
+
return results
|
|
255
|
+
|
|
256
|
+
|
|
257
|
+
def overrepresentation_analysis(gene_list, background=None,
|
|
258
|
+
gene_sets="GO_Biological_Process_2021"):
|
|
259
|
+
"""
|
|
260
|
+
遺伝子オーバーリプレゼンテーション解析 (ORA)。
|
|
261
|
+
|
|
262
|
+
Fisher exact test ベースの濃縮解析。
|
|
263
|
+
DEG リスト → 機能カテゴリへのマッピング。
|
|
264
|
+
"""
|
|
265
|
+
import gseapy as gp
|
|
266
|
+
|
|
267
|
+
results = gp.enrich(
|
|
268
|
+
gene_list=gene_list,
|
|
269
|
+
gene_sets=gene_sets,
|
|
270
|
+
background=background,
|
|
271
|
+
outdir="results/ora",
|
|
272
|
+
)
|
|
273
|
+
|
|
274
|
+
sig = results.res2d[results.res2d["Adjusted P-value"] < 0.05]
|
|
275
|
+
|
|
276
|
+
print(f" ORA results ({gene_sets}):")
|
|
277
|
+
print(f" Input genes: {len(gene_list)}")
|
|
278
|
+
print(f" Significant terms: {len(sig)}")
|
|
279
|
+
|
|
280
|
+
return results
|
|
281
|
+
```
|
|
282
|
+
|
|
283
|
+
## References
|
|
284
|
+
|
|
285
|
+
### Output Files
|
|
286
|
+
|
|
287
|
+
| ファイル | 形式 |
|
|
288
|
+
|---|---|
|
|
289
|
+
| `results/geo_expression_matrix.csv` | CSV |
|
|
290
|
+
| `results/deseq2_results.csv` | CSV |
|
|
291
|
+
| `results/gsea/` | ディレクトリ |
|
|
292
|
+
| `results/ora/` | ディレクトリ |
|
|
293
|
+
| `figures/volcano_rnaseq.png` | PNG |
|
|
294
|
+
| `figures/ma_plot.png` | PNG |
|
|
295
|
+
| `figures/gsea_dotplot.png` | PNG |
|
|
296
|
+
|
|
297
|
+
### 利用可能ツール
|
|
298
|
+
|
|
299
|
+
> [ToolUniverse](https://github.com/mims-harvard/ToolUniverse) SMCP 経由で利用可能な外部ツール。
|
|
300
|
+
|
|
301
|
+
| カテゴリ | 主要ツール | 用途 |
|
|
302
|
+
|---|---|---|
|
|
303
|
+
| GEO | `geo_search_datasets` | GEO データセット検索 |
|
|
304
|
+
| GEO | `geo_get_dataset_info` | データセット詳細取得 |
|
|
305
|
+
| GEO | `geo_get_sample_info` | サンプル情報取得 |
|
|
306
|
+
| GTEx | `GTEx_get_median_gene_expression` | 組織間中央値発現量 |
|
|
307
|
+
| GTEx | `GTEx_get_gene_expression` | サンプルレベル発現データ |
|
|
308
|
+
| GTEx | `GTEx_get_top_expressed_genes` | 高発現遺伝子取得 |
|
|
309
|
+
| GTEx | `GTEx_get_eqtl_genes` | eQTL 遺伝子 (eGenes) |
|
|
310
|
+
| GTEx | `GTEx_get_single_tissue_eqtls` | 単一組織 eQTL |
|
|
311
|
+
| GTEx | `GTEx_get_multi_tissue_eqtls` | 多組織 eQTL |
|
|
312
|
+
| GTEx | `GTEx_calculate_eqtl` | eQTL 計算 |
|
|
313
|
+
| Expression Atlas | `ExpressionAtlas_search_experiments` | 実験検索 |
|
|
314
|
+
| Expression Atlas | `ExpressionAtlas_get_baseline` | ベースライン発現 |
|
|
315
|
+
| Expression Atlas | `ExpressionAtlas_search_differential` | 差次発現実験 |
|
|
316
|
+
| ArrayExpress | `arrayexpress_search_experiments` | ArrayExpress 実験検索 |
|
|
317
|
+
|
|
318
|
+
### 参照スキル
|
|
319
|
+
|
|
320
|
+
| スキル | 関連 |
|
|
321
|
+
|---|---|
|
|
322
|
+
| `scientific-bioinformatics` | バルク RNA-seq 基盤 |
|
|
323
|
+
| `scientific-single-cell-genomics` | scRNA-seq (単一細胞) |
|
|
324
|
+
| `scientific-epigenomics-chromatin` | 発現-エピゲノム統合 |
|
|
325
|
+
| `scientific-multi-omics` | マルチオミクス統合 |
|
|
326
|
+
| `scientific-network-analysis` | 共発現ネットワーク |
|
|
327
|
+
|
|
328
|
+
### 依存パッケージ
|
|
329
|
+
|
|
330
|
+
`pydeseq2`, `GEOparse`, `gseapy`, `pandas`, `numpy`, `matplotlib`, `scipy`
|
|
@@ -0,0 +1,334 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: scientific-lab-data-management
|
|
3
|
+
description: |
|
|
4
|
+
ラボデータ管理スキル。Benchling (ELN/DNA 設計/レジストリ)、
|
|
5
|
+
DNAnexus (ゲノミクス PaaS)、LatchBio (ワークフロー)、
|
|
6
|
+
OMERO (バイオイメージング)、Protocols.io (プロトコル共有)
|
|
7
|
+
を統合したウェット・ドライラボデータ管理パイプライン。
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
# Scientific Lab Data Management
|
|
11
|
+
|
|
12
|
+
ウェットラボ実験管理からゲノミクスデータ処理まで、
|
|
13
|
+
ラボデータの生成・記録・解析・共有を統合管理するパイプライン。
|
|
14
|
+
|
|
15
|
+
## When to Use
|
|
16
|
+
|
|
17
|
+
- 電子実験ノート (ELN) でプロトコル・結果を記録するとき
|
|
18
|
+
- DNA 配列設計・クローニング計画を管理するとき
|
|
19
|
+
- ゲノミクス大規模データを PaaS 上で解析するとき
|
|
20
|
+
- バイオイメージングデータを構造化管理するとき
|
|
21
|
+
- 実験プロトコルを共有・再現するとき
|
|
22
|
+
|
|
23
|
+
---
|
|
24
|
+
|
|
25
|
+
## Quick Start
|
|
26
|
+
|
|
27
|
+
## 1. Benchling ELN / DNA 設計
|
|
28
|
+
|
|
29
|
+
```python
|
|
30
|
+
import json
|
|
31
|
+
import requests
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
class BenchlingClient:
|
|
35
|
+
"""
|
|
36
|
+
Benchling API クライアント。
|
|
37
|
+
|
|
38
|
+
Benchling 機能:
|
|
39
|
+
- ELN (Electronic Lab Notebook): 実験記録
|
|
40
|
+
- Molecular Biology: DNA 配列設計, プライマー設計, クローニング
|
|
41
|
+
- Registry: サンプル・試薬レジストリ
|
|
42
|
+
- Inventory: 在庫管理
|
|
43
|
+
"""
|
|
44
|
+
|
|
45
|
+
def __init__(self, api_key, tenant_url):
|
|
46
|
+
self.base_url = f"https://{tenant_url}/api/v2"
|
|
47
|
+
self.headers = {
|
|
48
|
+
"Authorization": f"Basic {api_key}",
|
|
49
|
+
"Content-Type": "application/json",
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
def create_dna_sequence(self, name, bases, folder_id,
|
|
53
|
+
annotations=None):
|
|
54
|
+
"""
|
|
55
|
+
DNA 配列の登録。
|
|
56
|
+
|
|
57
|
+
Parameters:
|
|
58
|
+
- name: 配列名
|
|
59
|
+
- bases: 塩基配列 (ATCG)
|
|
60
|
+
- folder_id: 保存先フォルダ
|
|
61
|
+
- annotations: アノテーション [{name, start, end, type, strand}]
|
|
62
|
+
"""
|
|
63
|
+
payload = {
|
|
64
|
+
"name": name,
|
|
65
|
+
"bases": bases,
|
|
66
|
+
"folderId": folder_id,
|
|
67
|
+
"isCircular": False,
|
|
68
|
+
"annotations": annotations or [],
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
print(f" Benchling DNA sequence: {name}")
|
|
72
|
+
print(f" Length: {len(bases)} bp")
|
|
73
|
+
if annotations:
|
|
74
|
+
print(f" Annotations: {len(annotations)}")
|
|
75
|
+
|
|
76
|
+
return payload
|
|
77
|
+
|
|
78
|
+
def search_registry(self, query, schema_id=None, page_size=50):
|
|
79
|
+
"""
|
|
80
|
+
Benchling Registry 検索。
|
|
81
|
+
|
|
82
|
+
レジストリエンティティ:
|
|
83
|
+
- プラスミド, 菌株, 抗体, 細胞株, 化合物
|
|
84
|
+
"""
|
|
85
|
+
params = {
|
|
86
|
+
"query": query,
|
|
87
|
+
"pageSize": page_size,
|
|
88
|
+
}
|
|
89
|
+
if schema_id:
|
|
90
|
+
params["schemaId"] = schema_id
|
|
91
|
+
|
|
92
|
+
print(f" Benchling registry search: '{query}'")
|
|
93
|
+
|
|
94
|
+
return params
|
|
95
|
+
|
|
96
|
+
def create_entry(self, name, folder_id, template_id=None):
|
|
97
|
+
"""
|
|
98
|
+
ELN エントリ (実験ノート) 作成。
|
|
99
|
+
"""
|
|
100
|
+
payload = {
|
|
101
|
+
"name": name,
|
|
102
|
+
"folderId": folder_id,
|
|
103
|
+
}
|
|
104
|
+
if template_id:
|
|
105
|
+
payload["entryTemplateId"] = template_id
|
|
106
|
+
|
|
107
|
+
print(f" Benchling ELN entry: {name}")
|
|
108
|
+
|
|
109
|
+
return payload
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
## 2. DNAnexus ゲノミクス PaaS
|
|
113
|
+
|
|
114
|
+
```python
|
|
115
|
+
import json
|
|
116
|
+
|
|
117
|
+
|
|
118
|
+
class DNAnexusClient:
|
|
119
|
+
"""
|
|
120
|
+
DNAnexus Platform API クライアント。
|
|
121
|
+
|
|
122
|
+
DNAnexus 機能:
|
|
123
|
+
- データストレージ: FASTQ, BAM, VCF 等の大規模ファイル
|
|
124
|
+
- ワークフロー実行: WDL/CWL/Applet ベース
|
|
125
|
+
- コンプライアンス: HIPAA, GxP, FedRAMP
|
|
126
|
+
- コラボレーション: プロジェクト単位のアクセス管理
|
|
127
|
+
"""
|
|
128
|
+
|
|
129
|
+
def __init__(self, token):
|
|
130
|
+
self.token = token
|
|
131
|
+
self.base_url = "https://api.dnanexus.com"
|
|
132
|
+
|
|
133
|
+
def upload_file(self, local_path, project_id, folder="/"):
|
|
134
|
+
"""
|
|
135
|
+
ファイルアップロード。
|
|
136
|
+
|
|
137
|
+
対応形式: FASTQ(.gz), BAM, CRAM, VCF, BED, etc.
|
|
138
|
+
"""
|
|
139
|
+
print(f" DNAnexus upload: {local_path}")
|
|
140
|
+
print(f" Project: {project_id}")
|
|
141
|
+
print(f" Destination: {folder}")
|
|
142
|
+
|
|
143
|
+
return {"local_path": local_path, "project_id": project_id}
|
|
144
|
+
|
|
145
|
+
def run_workflow(self, workflow_id, project_id, inputs):
|
|
146
|
+
"""
|
|
147
|
+
ワークフロー実行。
|
|
148
|
+
|
|
149
|
+
ワークフロー例:
|
|
150
|
+
- GATK Best Practices (germline/somatic)
|
|
151
|
+
- RNA-STAR alignment + featureCounts
|
|
152
|
+
- DeepVariant caller
|
|
153
|
+
- Structural variant calling
|
|
154
|
+
"""
|
|
155
|
+
print(f" DNAnexus workflow: {workflow_id}")
|
|
156
|
+
print(f" Project: {project_id}")
|
|
157
|
+
print(f" Inputs: {len(inputs)} parameters")
|
|
158
|
+
|
|
159
|
+
return {
|
|
160
|
+
"workflow_id": workflow_id,
|
|
161
|
+
"project_id": project_id,
|
|
162
|
+
"inputs": inputs,
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
def list_project_files(self, project_id, folder="/", name_glob=None):
|
|
166
|
+
"""
|
|
167
|
+
プロジェクト内ファイル一覧。
|
|
168
|
+
"""
|
|
169
|
+
params = {"folder": folder}
|
|
170
|
+
if name_glob:
|
|
171
|
+
params["name"] = {"glob": name_glob}
|
|
172
|
+
|
|
173
|
+
print(f" DNAnexus list: {project_id}{folder}")
|
|
174
|
+
|
|
175
|
+
return params
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
## 3. OMERO バイオイメージング管理
|
|
179
|
+
|
|
180
|
+
```python
|
|
181
|
+
import json
|
|
182
|
+
|
|
183
|
+
|
|
184
|
+
class OMEROClient:
|
|
185
|
+
"""
|
|
186
|
+
OMERO (Open Microscopy Environment Remote Objects) クライアント。
|
|
187
|
+
|
|
188
|
+
OMERO 機能:
|
|
189
|
+
- 画像データ管理: 150+ 画像フォーマット (Bio-Formats)
|
|
190
|
+
- メタデータ: Key-Value, タグ, ROI
|
|
191
|
+
- 解析統合: ImageJ/Fiji, CellProfiler, napari
|
|
192
|
+
- アクセス制御: プロジェクト/グループ権限
|
|
193
|
+
"""
|
|
194
|
+
|
|
195
|
+
def __init__(self, host, port=4064):
|
|
196
|
+
self.host = host
|
|
197
|
+
self.port = port
|
|
198
|
+
|
|
199
|
+
def import_images(self, file_paths, dataset_id):
|
|
200
|
+
"""
|
|
201
|
+
画像インポート。
|
|
202
|
+
|
|
203
|
+
対応フォーマット (Bio-Formats):
|
|
204
|
+
- OME-TIFF, ND2 (Nikon), CZI (Zeiss), LIF (Leica)
|
|
205
|
+
- VSI (Olympus), SVS (Aperio), DICOM
|
|
206
|
+
"""
|
|
207
|
+
print(f" OMERO import: {len(file_paths)} images → Dataset {dataset_id}")
|
|
208
|
+
|
|
209
|
+
return {"files": file_paths, "dataset_id": dataset_id}
|
|
210
|
+
|
|
211
|
+
def create_roi(self, image_id, shapes):
|
|
212
|
+
"""
|
|
213
|
+
ROI (Region of Interest) 作成。
|
|
214
|
+
|
|
215
|
+
Shape タイプ:
|
|
216
|
+
- Rectangle, Ellipse, Polygon
|
|
217
|
+
- Line, Polyline, Point
|
|
218
|
+
- Mask (binary mask)
|
|
219
|
+
"""
|
|
220
|
+
print(f" OMERO ROI: Image {image_id}, {len(shapes)} shapes")
|
|
221
|
+
|
|
222
|
+
return {"image_id": image_id, "shapes": shapes}
|
|
223
|
+
|
|
224
|
+
def query_images(self, project=None, dataset=None,
|
|
225
|
+
key_value_pairs=None):
|
|
226
|
+
"""
|
|
227
|
+
画像検索 (メタデータベース)。
|
|
228
|
+
|
|
229
|
+
フィルタ:
|
|
230
|
+
- プロジェクト/データセット階層
|
|
231
|
+
- Key-Value annotation
|
|
232
|
+
- タグ
|
|
233
|
+
- 取得日, 機器名
|
|
234
|
+
"""
|
|
235
|
+
print(f" OMERO query:")
|
|
236
|
+
if project:
|
|
237
|
+
print(f" Project: {project}")
|
|
238
|
+
if key_value_pairs:
|
|
239
|
+
print(f" Key-Value: {key_value_pairs}")
|
|
240
|
+
|
|
241
|
+
return {"project": project, "dataset": dataset}
|
|
242
|
+
```
|
|
243
|
+
|
|
244
|
+
## 4. Protocols.io プロトコル共有
|
|
245
|
+
|
|
246
|
+
```python
|
|
247
|
+
import json
|
|
248
|
+
|
|
249
|
+
|
|
250
|
+
def create_protocol(title, description, steps, reagents=None,
|
|
251
|
+
doi_prefix="dx.doi.org/10.17504"):
|
|
252
|
+
"""
|
|
253
|
+
Protocols.io プロトコル作成。
|
|
254
|
+
|
|
255
|
+
Protocols.io:
|
|
256
|
+
- DOI 付与による引用可能なプロトコル
|
|
257
|
+
- バージョン管理
|
|
258
|
+
- フォーク・改変・派生
|
|
259
|
+
- JOVE, Nature Protocol Exchange 連携
|
|
260
|
+
"""
|
|
261
|
+
protocol = {
|
|
262
|
+
"title": title,
|
|
263
|
+
"description": description,
|
|
264
|
+
"steps": [],
|
|
265
|
+
"reagents": reagents or [],
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
for i, step in enumerate(steps, 1):
|
|
269
|
+
protocol["steps"].append({
|
|
270
|
+
"step_number": i,
|
|
271
|
+
"description": step.get("description", ""),
|
|
272
|
+
"duration": step.get("duration"),
|
|
273
|
+
"temperature": step.get("temperature"),
|
|
274
|
+
"critical_step": step.get("critical", False),
|
|
275
|
+
"expected_result": step.get("expected_result"),
|
|
276
|
+
})
|
|
277
|
+
|
|
278
|
+
print(f" Protocol: {title}")
|
|
279
|
+
print(f" Steps: {len(steps)}")
|
|
280
|
+
if reagents:
|
|
281
|
+
print(f" Reagents: {len(reagents)}")
|
|
282
|
+
print(f" DOI: {doi_prefix}/protocols.io...")
|
|
283
|
+
|
|
284
|
+
return protocol
|
|
285
|
+
|
|
286
|
+
|
|
287
|
+
def fork_protocol(original_protocol_id, modifications):
|
|
288
|
+
"""
|
|
289
|
+
既存プロトコルのフォークと改変。
|
|
290
|
+
|
|
291
|
+
- 変更点の追跡
|
|
292
|
+
- 元プロトコルへのリンク
|
|
293
|
+
- バージョン番号の自動付与
|
|
294
|
+
"""
|
|
295
|
+
print(f" Forking protocol: {original_protocol_id}")
|
|
296
|
+
print(f" Modifications: {len(modifications)}")
|
|
297
|
+
|
|
298
|
+
return {
|
|
299
|
+
"forked_from": original_protocol_id,
|
|
300
|
+
"modifications": modifications,
|
|
301
|
+
}
|
|
302
|
+
```
|
|
303
|
+
|
|
304
|
+
## References
|
|
305
|
+
|
|
306
|
+
### Output Files
|
|
307
|
+
|
|
308
|
+
| ファイル | 形式 |
|
|
309
|
+
|---|---|
|
|
310
|
+
| `results/benchling_sequences.json` | JSON |
|
|
311
|
+
| `results/benchling_registry.json` | JSON |
|
|
312
|
+
| `results/dnanexus_workflow_output.json` | JSON |
|
|
313
|
+
| `results/omero_image_metadata.json` | JSON |
|
|
314
|
+
| `results/protocol.json` | JSON |
|
|
315
|
+
|
|
316
|
+
### 利用可能ツール
|
|
317
|
+
|
|
318
|
+
> [ToolUniverse](https://github.com/mims-harvard/ToolUniverse) SMCP 経由で利用可能な外部ツール。
|
|
319
|
+
|
|
320
|
+
なし — 各プラットフォームの REST API を直接利用。
|
|
321
|
+
|
|
322
|
+
### 参照スキル
|
|
323
|
+
|
|
324
|
+
| スキル | 関連 |
|
|
325
|
+
|---|---|
|
|
326
|
+
| `scientific-bioinformatics` | ゲノミクスデータ解析 |
|
|
327
|
+
| `scientific-imaging-analysis` | 顕微鏡画像解析 |
|
|
328
|
+
| `scientific-gene-expression-transcriptomics` | RNA-seq データ管理 |
|
|
329
|
+
| `scientific-single-cell-genomics` | scRNA-seq データ管理 |
|
|
330
|
+
| `scientific-data-analysis` | データ前処理 |
|
|
331
|
+
|
|
332
|
+
### 依存パッケージ
|
|
333
|
+
|
|
334
|
+
`requests`, `json`, `pandas` (各プラットフォーム SDK: `benchling-sdk`, `dxpy`, `omero-py`)
|