@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.
@@ -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`)