pride-database について
このスキルはPRIDE ArchiveのREST APIを使い、質量分析プロテオミクスのプロジェクトを検索します。データセットの探索やファイル・メタデータの取得に加え、ファセット確認、類似プロジェクト検索、プロジェクト単位のタンパク質検索に対応します。ペプチドやPSMの結果はファイルを取得して解析する必要があります。
主な機能
- 01キーワードや条件によるプロジェクト検索
- 02プロジェクトのメタデータとファイル取得
- 03SDRFのサンプル・測定対応表取得
- 04類似プロジェクト検索とオートコンプリート
- 05タンパク質からプロジェクトを検索
活用シーン
- 01疾患や装置でデータセットを探索
- 02生データや同定結果ファイルを取得
- 03サンプルと質量分析測定の対応付け
- 04UniProtタンパク質を含むプロジェクトの特定
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ jaechang-hits/ sciagent-skills --skill pride-databaseインストール後、Claude Code で/pride-databaseを入力して読み込まれたか確認します。
詳細
PRIDE データベース
概要
EMBL-EBI の PRIDE Archive(ProteomicsIDEntifications database)は、世界最大の公開質量分析プロテオミクスリポジトリです。2026年時点で、39,000件以上のプロジェクトと340万件以上の登録ファイルがあります。プログラムからは、https://www.ebi.ac.uk/pride/ws/archive/v3/ の JSON REST API を介してアクセスできます。認証は不要です。OpenAPI/Swagger 仕様は https://www.ebi.ac.uk/pride/ws/archive/v3/v3/api-docs にあります。PRIDE v3 のリストエンドポイントは通常の JSON 配列を返します(HAL+JSON の _embedded エンベロープはありません)。また、ペプチド単位または PSM 単位の同定エンドポイントは意図的に公開されていません。スペクトルレベルの同定情報が必要な場合は、プロジェクトの RESULT ファイル(mzIdentML、MaxQuant txt など)をダウンロードし、ローカルで解析してください。
使用する場合
- メタ解析やベンチマークのために、フリーテキストキーワードとファセットフィルター(生物種、組織、疾患、装置、ソフトウェア、PTM)で公開プロテオミクスデータセットを検索する場合
- 特定の PRIDE プロジェクトアクセッションから、生の質量分析データ(RAW、mzML、MGF)または前処理済みの同定データ(RESULT ファイル)をダウンロードする場合
- 特定の UniProt タンパク質アクセッションに言及している PRIDE プロジェクトを調べる場合(プロジェクト単位の出現情報のみ。API では PSM 数やカバレッジ数は取得できません)
- 再解析や研究間比較のために、関心のあるプロジェクトに類似したプロジェクトを探す場合
- サンプルと MS ランの対応関係をプログラムからモデル化できるよう、プロジェクトの SDRF(Sample-Data Relationship Format)ファイルを取得する場合
- 構造化クエリを作成する前に、ファセット検索で有効なフィルター値を確認する場合
- タンパク質配列、Swiss-Prot の注釈、ID マッピングには
uniprot-protein-databaseを使用してください - タンパク質ドメインおよびファミリー分類には
interpro-databaseを使用してください。PRIDE が報告するのはプロジェクト単位の出現情報のみであり、ドメイン単位の特徴ではありません - PRIDE v3 には
/peptides、/psms、/proteins?proteinAccession=エンドポイントはありません。ペプチド単位または PSM 単位のデータが必要な場合は、/projects/{accession}/filesから RESULT ファイルをダウンロードし、pyteomicsまたは検索エンジン固有のリーダーで解析してください
前提条件
- Python パッケージ:
requests、pandas、matplotlib - データ要件:PRIDE プロジェクトアクセッション(
PXD######形式)または検索キーワード。タンパク質の出現情報を検索する場合は、任意で UniProt アクセッションも指定します - 環境:インターネット接続が必要です。API キーは不要です
- レート制限:正式には公開されていません。短時間の連続リクエストは約5リクエスト/秒未満に抑え、ループ内に
time.sleep(0.3)を追加してください
pip install requests pandas matplotlib
クイックスタート
import requests
PRIDE = "https://www.ebi.ac.uk/pride/ws/archive/v3"
# 1) Free-text search for cancer proteomics projects
projects = requests.get(f"{PRIDE}/search/projects",
params={"keyword": "prostate cancer", "pageSize": 5},
timeout=30).json()
print(f"Top {len(projects)} projects:")
for p in projects[:3]:
instr = ", ".join(p.get("instruments", []))[:50]
print(f" {p['accession']} {(p['title'] or '')[:70]} [{instr}]")
# 2) Drill into one project
acc = projects[0]["accession"]
proj = requests.get(f"{PRIDE}/projects/{acc}", timeout=30).json()
print(f"\n{proj['accession']}: {proj['title'][:70]}")
print(f" Submitted: {proj.get('submissionDate')} DOI: {proj.get('doi')}")
print(f" Organisms: {[o['name'] for o in proj.get('organisms', [])]}")
print(f" Instruments: {[i['name'] for i in proj.get('instruments', [])]}")
# 3) List files and total size
files = requests.get(f"{PRIDE}/projects/{acc}/files/all", timeout=60).json()
total_mb = sum(f.get("fileSizeBytes", 0) for f in files) / 1e6
print(f"\n {len(files)} files, {total_mb:.0f} MB total")
コア API
モジュール 1:プロジェクト検索 — /search/projects
任意のファセットベースのフィルタリング、ページネーション、ソートに対応したフリーテキスト検索です。通常の JSON 配列でプロジェクトレコードを返します。HAL+JSON の _embedded/page ラッパーはありません。
import requests, pandas as pd
PRIDE = "https://www.ebi.ac.uk/pride/ws/archive/v3"
def search_projects(keyword=None, organism=None, instrument=None,
disease=None, software=None,
page_size=25, page=0, sort_field="submission_date",
sort_direction="DESC"):
"""Search PRIDE v3 for projects.
Filter syntax (for the `filter` arg) is `field==value, field==value` using `_facet` field names
that are discoverable via /facet/projects."""
filters = []
if organism: filters.append(f"organisms_facet=={organism}")
if instrument: filters.append(f"instruments_facet=={instrument}")
if disease: filters.append(f"diseases_facet=={disease}")
if software: filters.append(f"softwares_facet=={software}")
params = {"pageSize": page_size, "page": page,
"sortFields": sort_field, "sortDirection": sort_direction}
if keyword: params["keyword"] = keyword
if filters: params["filter"] = ",".join(filters)
r = requests.get(f"{PRIDE}/search/projects", params=params, timeout=30)
r.raise_for_status()
return r.json() # plain list[dict]
projects = search_projects(keyword="cancer", organism="Homo sapiens (human)",
instrument="Q Exactive", page_size=5)
df = pd.DataFrame([{
"accession": p["accession"],
"title": (p.get("title") or "")[:70],
"submission_date": p.get("submissionDate"),
"diseases": ", ".join(p.get("diseases", []))[:60],
"instruments": ", ".join(p.get("instruments", []))[:50],
} for p in projects])
print(df.to_string(index=False))
# Paginate through all matches for a keyword. The API doesn't return total counts inline;
# walk pages until the next one is empty.
def search_all_projects(keyword, page_size=100, max_pages=20):
all_records, page = [], 0
while page < max_pages:
batch = search_projects(keyword=keyword, page_size=page_size, page=page)
if not batch:
break
all_records.extend(batch)
if len(batch) < page_size:
break # last page
page += 1
return all_records
results = search_all_projects("phosphoproteomics", page_size=100, max_pages=3)
print(f"Phosphoproteomics projects collected (max 300): {len(results)}")
モジュール 2:ファセットフィルターの確認 — /facet/projects
フィルター付き検索を作成する前にファセットエンドポイントをクエリし、特定のキーワードに対して実際に存在する装置/生物種/疾患/ソフトウェアの値と、それぞれの件数を確認します。レスポンスはファセットグループをまとめた辞書で、各グループは {value: count} の対応関係を持ちます。
import requests, pandas as pd
PRIDE = "https://www.ebi.ac.uk/pride/ws/archive/v3"
def get_facets(keyword=None, facet_page_size=20):
"""Return facet counts for projects matching `keyword`. Keys are facet groups
(instruments, organisms, diseases, softwares, experimentTypes, ...); values are
dicts of {value: count}."""
params = {"facetPageSize": facet_page_size}
if keyword: params["keyword"] = keyword
r = requests.get(f"{PRIDE}/facet/projects", params=params, timeout=30)
r.raise_for_status()
return r.json()
facets = get_facets(keyword="cancer", facet_page_size=10)
print(f"Facet groups: {list(facets.keys())}")
print(f"\nTop instruments for 'cancer':")
for instr, n in sorted(facets.get("instruments", {}).items(), key=lambda kv: -kv[1])[:8]:
print(f" {instr:<35} {n}")
print(f"\nTop diseases:")
for d, n in sorted(facets.get("diseases", {}).items(), key=lambda kv: -kv[1])[:6]:
print(f" {d:<55} {n}")
モジュール 3:プロジェクト詳細 — /projects/{accession}
単一プロジェクトの完全なメタデータです。登録者、labPIs、装置、生物種(CV コード付き)、疾患、実験タイプ、参考文献、DOI、登録日、公開日が含まれます。リストの項目は accession、cvLabel、name、任意の value を持つ CvParam 形式のオブジェクトです。
import requests
PRIDE = "https://www.ebi.ac.uk/pride/ws/archive/v3"
def get_project(accession):
r = requests.get(f"{PRIDE}/projects/{accession}", timeout=30)
r.raise_for_status()
return r.json()
p = get_project("PXD004131")
print(f"Accession : {p['accession']}")
print(f"Title : {p['title'][:80]}")
print(f"Submission : {p.get('submissionDate')}")
print(f"Publication : {p.get('publicationDate')}")
print(f"DOI : {p.get('doi')}")
print(f"License : {p.get('license')}")
print(f"Type : {p.get('submissionType')}")
print(f"Organisms : {[o['name'] for o in p.get('organisms', [])]}")
print(f"Instruments : {[i['name'] for i in p.get('instruments', [])]}")
print(f"Experiment : {[e['name'] for e in p.get('experimentTypes', [])]}")
print(f"PIs : {[pi.get('name') for pi in p.get('labPIs', [])]}")
print(f"References : {[r.get('doi') for r in p.get('references', [])[:3]]}")
モジュール 4:プロジェクトファイル — /projects/{accession}/files + /files/all
プロジェクトに関連するファイルを一覧表示します。大規模なプロジェクトではページネーション対応のエンドポイントを使用してください。/files/all はすべてのファイルを一度に返します。各ファイルレコードには、fileCategory.value(RAW、PEAK、RESULT、FASTA、OTHER のいずれか)、fileSizeBytes(Bytes サフィックスに注意してください。fileSize ではありません)、および FTP Protocol または Aspera Protocol とラベル付けされた publicFileLocations のリストが含まれます。
import requests, pandas as pd
PRIDE = "https://www.ebi.ac.uk/pride/ws/archive/v3"
def get_project_files(accession, file_type=None, page_size=100):
"""Walk paginated /files for a project. Optionally filter by category code
(RAW, PEAK, RESULT, FASTA, OTHER). Returns a DataFrame."""
rows, page = [], 0
while True:
r = requests.get(f"{PRIDE}/projects/{accession}/files",
params={"pageSize": page_size, "page": page},
timeout=30)
r.raise_for_status()
batch = r.json()
if not batch:
break
for f in batch:
cat = f.get("fileCategory") or {}
ftp = next((loc["value"] for loc in f.get("publicFileLocations", [])
if loc.get("name") == "FTP Protocol"), "")
asp = next((loc["value"] for loc in f.get("publicFileLocations", [])
if loc.get("name") == "Aspera Protocol"), "")
rows.append({
"file_name": f.get("fileName"),
"category": cat.get("value"), # RAW/PEAK/RESULT/FASTA/OTHER
"size_mb": round((f.get("fileSizeBytes") or 0) / 1e6, 2),
"ftp_url": ftp,
"aspera_url": asp,
"downloads": f.get("totalDownloads"),
})
if len(batch) < page_size:
break
page += 1
df = pd.DataFrame(rows)
if file_type:
df = df[df["category"] == file_type]
return df
files_df = get_project_files("PXD004131")
print(f"Total files: {len(files_df)}")
print(files_df.groupby("category")["size_mb"].agg(["count", "sum"]).round(1).to_string())
raw_only = files_df[files_df["category"] == "RAW"]
print(f"\nRAW files: {len(raw_only)}; combined {raw_only['size_mb'].sum():.0f} MB")
print(raw_only[["file_name", "size_mb", "downloads"]].head(5).to_string(index=False))
# /files/all returns every file in one response — convenient for small projects
files = requests.get(f"{PRIDE}/projects/PXD000001/files/all", timeout=60).json()
print(f"PXD000001 files (all): {len(files)}")
for f in files[:4]:
print(f" [{f.get('fileCategory',{}).get('value','?'):<6}] {f['fileName']} "
f"{f.get('fileSizeBytes',0)/1e6:.2f} MB")
Module 5: SDRF ファイル — /files/sdrf/{projectAccession}
最新の投稿標準に従う PRIDE プロジェクトには、各 MS ランを生物学的サンプル、処理、ラベル、フラクションなどに対応付ける SDRF(Sample-Data Relationship Format)TSV が含まれています。一度取得し、TSV として解析してください。
import requests, pandas as pd, io
PRIDE = "https://www.ebi.ac.uk/pride/ws/archive/v3"
def get_sdrf(accession):
"""Fetch the SDRF sample-to-run mapping for a project (404 if not provided)."""
r = requests.get(f"{PRIDE}/files/sdrf/{accession}", timeout=30)
if r.status_code == 404:
return None
r.raise_for_status()
return pd.read_csv(io.StringIO(r.text), sep="\t")
# Many older projects have no SDRF — newer ones typically do
sdrf = get_sdrf("PXD000001")
if sdrf is None or sdrf.empty:
print("No SDRF available for this project")
else:
print(f"SDRF rows: {len(sdrf)} cols: {len(sdrf.columns)}")
print(f"First columns: {list(sdrf.columns)[:8]}")
Module 6: タンパク質 → プロジェクトのマッピング — /proteins/{accession}
PRIDE v3 のタンパク質エンドポイントが返すのは、指定された UniProt アクセッションの同定結果を含むプロジェクトアクセッションのリストのみです。PSM 数、ペプチド数、配列カバレッジは返しません。これらは v3 の API では公開されていません。深度の指標を得るには、プロジェクトの RESULT ファイルをダウンロードし、ローカルで解析する必要があります。
import requests
PRIDE = "https://www.ebi.ac.uk/pride/ws/archive/v3"
def get_protein_projects(uniprot_acc):
"""Return the list of PRIDE project accessions that mention this UniProt accession.
No PSM/peptide/coverage counts are available at this endpoint."""
r = requests.get(f"{PRIDE}/proteins/{uniprot_acc}", timeout=30)
if r.status_code == 404:
return None
r.raise_for_status()
data = r.json()
return data.get("projects", [])
tp53 = get_protein_projects("P04637")
print(f"TP53 (P04637) is reported in {len(tp53)} PRIDE projects")
print(f"First 8: {tp53[:8]}")
unknown = get_protein_projects("Q99999")
print(f"\nQ99999 (no real protein): "
f"{'no PRIDE evidence' if not unknown else f'{len(unknown)} projects'}")
Module 7: 検索支援 — 類似プロジェクト、オートコンプリート
/projects/{accession}/similarProjects は、関連するメタデータの特徴(生物種、装置、実験タイプ、タグ)を持つプロジェクトを返します。/search/autocomplete?keyword=... は、プレフィックスで始まるプロジェクトタイトルを返します。検索候補の提示に便利です。
import requests, pandas as pd
PRIDE = "https://www.ebi.ac.uk/pride/ws/archive/v3"
# Find similar projects to one of interest
similar = requests.get(f"{PRIDE}/projects/PXD004131/similarProjects",
params={"pageSize": 5}, timeout=30).json()
print(f"Similar to PXD004131: {len(similar)} projects")
for p in similar[:5]:
print(f" {p['accession']} {(p.get('title') or '')[:70]}")
# Autocomplete suggestions for a project-title prefix
suggestions = requests.get(f"{PRIDE}/search/autocomplete",
params={"keyword": "tp53"}, timeout=30).json()
print(f"\nAutocomplete for 'tp53': {len(suggestions)} suggestions")
for s in suggestions[:5]:
print(f" {s}")
Module 8: リポジトリ全体の件数 — /projects/count、/files/count
リポジトリ全体の合計件数を取得します。ステータス表示や妥当性の確認に便利です。どちらのエンドポイントも、プレーンな整数の本文を返します(JSON オブジェクトのラッパーはありません)。
import requests
PRIDE = "https://www.ebi.ac.uk/pride/ws/archive/v3"
n_projects = int(requests.get(f"{PRIDE}/projects/count", timeout=30).text)
n_files = int(requests.get(f"{PRIDE}/files/count", timeout=30).text)
print(f"PRIDE Archive current scale:")
print(f" Projects: {n_projects:,}")
print(f" Files: {n_files:,}")
重要な概念
プレーンな JSON 配列。HAL エンベロープなし
PRIDE v3 のリストエンドポイントは、プレーンな JSON 配列を返します。たとえば /search/projects は [{...}, {...}, ...] を直接返します。_embedded.compactprojects、page.totalElements/totalPages、_links.next.href はありません。data["_embedded"]["compactprojects"] を解析していた古い PRIDE v2 クライアントは、現在の API に対して空の結果を黙って返します。ページネーションを行うには、空の配列(または pageSize より短い部分ページ)が返されるまで、page=0, 1, 2, ... と順に取得してください。
v3 で削除されたもの
以下のエンドポイント群は v3 には存在しません(v2 は内部的に v3 のエイリアスになっています。/v2/peptides のエラーメッセージには実際に path: "/pride/ws/archive/v3/peptides" と表示されます)。
| 削除されたエンドポイント | v3 での状態 | 代替手段 |
|---|---|---|
GET /peptides?projectAccessions=X | 404 | なし — プロジェクトの RESULT ファイルをダウンロードして解析 |
GET /psms?projectAccessions=X | 404 | なし — RESULT ファイルをダウンロード |
GET /proteins?proteinAccession=X(クエリパラメーター形式) | 404 | GET /proteins/{accession}(パスパラメーター形式) |
HAL+JSON _embedded/page ラッパー | 廃止 | プレーンな JSON 配列 |
/projects?keyword=...&organisms=...&tissues=... フィルター | 黙って無視されます | /search/projects?keyword=...&filter=field==value |
/search/projects のフィルター構文
filter クエリパラメーターは、field==value 制約をカンマ区切りで指定します。フィールド名には _facet サフィックス(基盤となる Solr 形式のフィールド)を使用します。フィルターを作成する前に、/facet/projects で有効なフィールド名と値を確認してください。
# Valid filter forms
"organisms_facet==Homo sapiens (human)"
"instruments_facet==Q Exactive"
"diseases_facet==Prostate adenocarcinoma"
"softwares_facet==MaxQuant"
# Combine with commas
filter="organisms_facet==Homo sapiens (human),instruments_facet==Orbitrap Fusion Lumos"
ファイルカテゴリー
プロジェクト内の各ファイルには fileCategory CV パラメーターがあります。.value はカテゴリーコード、.name は人が読めるラベルです。
value コード | 説明 | 一般的な形式 |
|---|---|---|
RAW | 未処理の装置出力 | .raw(Thermo)、.d(Bruker/Agilent)、.wiff(Sciex) |
PEAK | 重心化/デコンボリューション済みスペクトル | .mzML、.mzXML、.mgf |
RESULT | 同定結果 | .mzid、.mzTab、MaxQuant txt、PRIDE XML |
FASTA | 検索に使用したタンパク質配列データベース | .fasta |
OTHER | 補足資料/スクリプト/表 | .txt、.xlsx、.csv |
再解析パイプラインでは、RESULT が最も手軽な入口です。スペクトルを再検索せずに、同定済みのペプチドを利用できます。PEAK を使うと、別のエンジンで再検索できます。RAW が必要なのは、ベンダー形式のデータを完全に再処理する場合のみです。
アクセッション形式
PRIDE プロジェクトのアクセッションは、ProteomeXchange 形式の PXD###### に従います。これらは PRIDE、MassIVE、jPOST、iProX で共通の固定値です。PRIDE 内のファイルアクセッションは SHA-256 形式のハッシュです(例:5bda360133398f66021c8889e01dce921cb51300c7269e1f2b0f20368ab20af6)。不透明な識別子のため、人が読めるファイル名には fileName を使用してください。
一般的なワークフロー
ワークフロー 1:ファセットによる検索 — 疾患キーワードから絞り込み済みのプロジェクト一覧へ
目的:疾患キーワードから始め、一致するデータセットでよく使われている装置やソフトウェアをファセットの件数で確認し、上位の値を使って絞り込んだプロジェクト一覧を取得します。
import requests, pandas as pd
PRIDE = "https://www.ebi.ac.uk/pride/ws/archive/v3"
disease_kw = "colorectal cancer"
# 1) Inspect facet counts to learn which filter values dominate
facets = requests.get(f"{PRIDE}/facet/projects",
params={"keyword": disease_kw, "facetPageSize": 10},
timeout=30).json()
top_instr = sorted(facets.get("instruments", {}).items(), key=lambda kv: -kv[1])[:5]
top_org = sorted(facets.get("organisms", {}).items(), key=lambda kv: -kv[1])[:3]
print(f"Top instruments for '{disease_kw}':")
for k, v in top_instr: print(f" {k:<35} {v}")
print(f"Top organisms:")
for k, v in top_org: print(f" {k:<35} {v}")
# 2) Build a filtered search using one top instrument
target_instr = top_instr[0][0]
projects = requests.get(f"{PRIDE}/search/projects",
params={"keyword": disease_kw,
"filter": f"organisms_facet==Homo sapiens (human),instruments_facet=={target_instr}",
"pageSize": 50,
"sortFields": "submission_date",
"sortDirection": "DESC"},
timeout=30).json()
df = pd.DataFrame([{
"accession": p["accession"],
"title": (p.get("title") or "")[:70],
"submission_date": p.get("submissionDate"),
"tissues": ", ".join(p.get("organismsPart", []))[:40],
"submitter": (p.get("submitters") or [""])[0] if p.get("submitters") else "",
} for p in projects])
print(f"\nFiltered projects: {len(df)} (target instrument: {target_instr})")
print(df.head(10).to_string(index=False))
df.to_csv(f"{disease_kw.replace(' ', '_')}_{target_instr.replace(' ', '_')}_projects.csv",
index=False)
ワークフロー 2:1 つのプロジェクトのファイルダウンロードマニフェスト
目的:プロジェクトのファイル一覧を取得し、必要なカテゴリ(RAW + RESULT)に絞り込み、並列 FTP ダウンロード用の aria2c 対応 URL リストを出力します。
import requests, pandas as pd
from pathlib import Path
PRIDE = "https://www.ebi.ac.uk/pride/ws/archive/v3"
accession = "PXD004131"
keep_categories = {"RAW", "RESULT"}
output_dir = Path(f"/data/pride/{accession}")
files = requests.get(f"{PRIDE}/projects/{accession}/files/all", timeout=120).json()
manifest = []
for f in files:
cat = (f.get("fileCategory") or {}).get("value")
if cat not in keep_categories:
continue
ftp = next((loc["value"] for loc in f.get("publicFileLocations", [])
if loc.get("name") == "FTP Protocol"), None)
if not ftp:
continue
manifest.append({
"file_name": f["fileName"],
"category": cat,
"size_mb": round((f.get("fileSizeBytes") or 0) / 1e6, 2),
"ftp": ftp,
})
mdf = pd.DataFrame(manifest).sort_values(["category", "file_name"])
print(f"{accession}: keeping {len(mdf)}/{len(files)} files "
f"({mdf['size_mb'].sum():.0f} MB total)")
print(mdf.groupby("category")[["size_mb"]].sum().round(0))
# aria2c -i pride_dl.list -d /data/pride/PXD004131 -x 8 -j 4
with open("pride_dl.list", "w") as fh:
fh.write("\n".join(mdf["ftp"]))
print(f"\nWrote pride_dl.list with {len(mdf)} URLs (use aria2c -i)")
ワークフロー 3:プロジェクトを横断したタンパク質の出現状況
目的:候補タンパク質のパネル(差次的発現解析などで得られたもの)のそれぞれについて、言及している PRIDE プロジェクト数を調べ、根拠が最も多いタンパク質を絞り込みます。注:これはプロジェクト数のみを示す指標です。v3 の API には PSM/ペプチド数がないため、プロジェクト数が多いことは網羅性を示すものであり、深さを示すものではありません。
import requests, time, pandas as pd, matplotlib.pyplot as plt
PRIDE = "https://www.ebi.ac.uk/pride/ws/archive/v3"
candidates = {
"P04637": "TP53", "P38398": "BRCA1", "P31749": "AKT1",
"P40763": "STAT3", "O15530": "PDPK1", "P10275": "AR",
}
rows = []
for acc, sym in candidates.items():
r = requests.get(f"{PRIDE}/proteins/{acc}", timeout=30)
projs = r.json().get("projects", []) if r.status_code == 200 else []
rows.append({"uniprot": acc, "symbol": sym, "n_projects": len(projs)})
time.sleep(0.3)
df = pd.DataFrame(rows).sort_values("n_projects", ascending=False)
print(df.to_string(index=False))
fig, ax = plt.subplots(figsize=(8, 3.5))
bars = ax.bar(df["symbol"], df["n_projects"], color="#3182BD")
ax.bar_label(bars, fmt="%d", fontsize=9, padding=2)
ax.set_ylabel("# PRIDE projects mentioning the protein")
ax.set_title("PRIDE project-level occurrence — candidate panel")
plt.tight_layout()
plt.savefig("pride_protein_occurrence.png", dpi=150, bbox_inches="tight")
print("Saved pride_protein_occurrence.png")
主要なパラメーター
| パラメーター | エンドポイント | デフォルト | 範囲/オプション | 効果 |
|---|---|---|---|---|
keyword | /search/projects, /facet/projects, /search/autocomplete | — | フリーテキスト文字列 | タイトル、説明、タグを対象に全文検索します |
filter | /search/projects | — | field_facet==value, field_facet==value | ファセットフィールド名を使ったサーバー側のフィルター |
pageSize | /search/projects, /projects, /projects/{acc}/files, /projects/{acc}/similarProjects | 100 | 正の整数 | 1 ページあたりの結果数 |
page | 同上 | 0 | 0 始まりの整数 | ページ番号(メタデータは返されないため、結果が空になるまでページを順に取得します) |
sortFields | /search/projects | submission_date | カンマ区切りのフィールド名 | 並べ替えキー |
sortDirection | /search/projects | DESC | ASC または DESC | 並べ替え順 |
facetPageSize | /facet/projects | 20 | 正の整数 | ファセットグループごとに返す値の数 |
dateGap | /search/projects, /facet/projects | — | 例:+1MONTH、+1YEAR | 日付範囲の集計単位 |
(path) accession | /projects/{acc}, /projects/{acc}/files, /projects/{acc}/similarProjects, /proteins/{acc} | 必須 | PXD###### または UniProt acc | リソースを識別します |
ベストプラクティス
-
検索には
/projectsではなく/search/projectsを使います。 通常の/projectsはページネーションされた一覧取得エンドポイントで、キーワード/生物種/疾患のフィルターを黙って無視します。フィルタリングは、filter=field_facet==value構文を使った/search/projectsでのみ機能します。 -
フィルタリングの前に、
/facet/projectsでフィルター値を確認します。 ファセットのフィールド値は完全一致が必要です(例:organisms_facet==Homo sapiens (human)。括弧も含めて完全一致させます)。ファセットエンドポイントでは、存在する値と各値に該当するプロジェクト数がわかるため、試行錯誤を大幅に減らせます。 -
API経由でペプチドレベルやPSMレベルのデータをクエリしようとしないでください。 これらのエンドポイントはv3で削除されました。プロジェクトのRESULTファイルをダウンロードし、
pyteomics、pyOpenMS、または検索エンジンのリーダー(MaxQuant、ProteomeDiscovererなど)を使ってローカルで解析します。 -
ファイルの一括ダウンロードにはFTP URLを優先します。 各ファイルレコードには、
FTP ProtocolとAspera Protocolの両方のURLが含まれています。FTPはより広くサポートされています。並列チャンクにはaria2c -x 8 -j 4を組み合わせます。Asperaクライアントを持っていて、100 Mbitを超える転送速度が必要な場合に限り、Asperaを使用してください。 -
フィールド名
fileSizeBytesに注意してください。 現在のv3のフィールド名はfileSizeではなくfileSizeBytesです(古いv2のドキュメントではfileSizeと記載されている場合があります)。サイズの単位はバイトです。MBにするには1e6で、GBにするには1e9で割ります。 -
ファイルのダウンロードは
fileCategory.valueでフィルタリングします。 プロジェクトには、RAW(GB単位)からOTHER(KB単位)まで、数百個のファイルが含まれることがあります。ダウンロードをキューに追加する前に、必要なカテゴリだけに必ず絞り込んでください。そうしないと、同定テーブルだけが必要だったのに、ベンダーのRAWファイルを数十GBもダウンロードしてしまうことがあります。 -
ページネーションにメタデータはありません。空になるまでページをたどります。 古いPRIDE v2とは異なり、v3 APIは
totalElements/totalPagesを返しません。page=0, 1, 2, ...と順に処理し、ページが空の配列を返したとき、または配列の長さがpageSizeより小さいときに終了します。
よくあるレシピ
レシピ:プロジェクトのファイル概要をすばやく取得
import requests
PRIDE = "https://www.ebi.ac.uk/pride/ws/archive/v3"
def project_file_summary(accession):
files = requests.get(f"{PRIDE}/projects/{accession}/files/all", timeout=60).json()
by_cat = {}
for f in files:
cat = (f.get("fileCategory") or {}).get("value", "OTHER")
by_cat.setdefault(cat, [0, 0])
by_cat[cat][0] += 1
by_cat[cat][1] += (f.get("fileSizeBytes") or 0) / 1e6
print(f"\n{accession} file summary:")
for cat, (n, mb) in sorted(by_cat.items()):
print(f" {cat:<8} {n:>4} file(s) {mb:>10.1f} MB")
total_mb = sum(mb for _, mb in by_cat.values())
total_n = sum(n for n, _ in by_cat.values())
print(f" {'TOTAL':<8} {total_n:>4} file(s) {total_mb:>10.1f} MB")
project_file_summary("PXD000001")
レシピ:タンパク質にPRIDEのエビデンスがあるか確認
import requests
PRIDE = "https://www.ebi.ac.uk/pride/ws/archive/v3"
def pride_evidence(uniprot_acc):
"""Return (has_evidence, n_projects). PRIDE v3 only exposes project list, no PSM counts."""
r = requests.get(f"{PRIDE}/proteins/{uniprot_acc}", timeout=30)
if r.status_code != 200:
return False, 0
projs = r.json().get("projects", [])
return bool(projs), len(projs)
for acc in ["P04637", "Q99999"]:
has, n = pride_evidence(acc)
print(f"{acc}: evidence={has} projects={n}")
レシピ:キーワードによる最近の登録(日時順)
import requests, pandas as pd
PRIDE = "https://www.ebi.ac.uk/pride/ws/archive/v3"
r = requests.get(f"{PRIDE}/search/projects",
params={"keyword": "single-cell proteomics",
"sortFields": "submission_date",
"sortDirection": "DESC",
"pageSize": 15},
timeout=30)
recent = r.json()
df = pd.DataFrame([{
"submission_date": p.get("submissionDate"),
"accession": p["accession"],
"title": (p.get("title") or "")[:80],
} for p in recent]).sort_values("submission_date", ascending=False)
print(df.to_string(index=False))
レシピ:オートコンプリートによる入力中の候補表示
import requests
PRIDE = "https://www.ebi.ac.uk/pride/ws/archive/v3"
for prefix in ["alzheimer", "single cell", "brca"]:
s = requests.get(f"{PRIDE}/search/autocomplete",
params={"keyword": prefix}, timeout=30).json()
print(f"\n'{prefix}' → {len(s)} suggestions:")
for sug in s[:3]:
print(f" · {sug[:80]}")
トラブルシューティング
| 問題 | 原因 | 解決策 |
|---|---|---|
r.json()にデータがあるのに、解析結果が空のリストになる | コードがdata["_embedded"]["compactprojects"]を参照している。これはv3では返されなくなった古いHAL+JSONラッパーです | 応答をリストとして直接解析します:projects = r.json() |
/peptides、/psms、または/proteins?proteinAccession=XでHTTP 404が発生する | これらのエンドポイントはv3で削除されました | ペプチド/PSMデータについては、プロジェクトのRESULTファイルをダウンロードしてローカルで解析します。タンパク質の検索には/proteins/{accession}(パスパラメーター)を使います |
/projects?keyword=cancerが、キーワードなしの/projectsと同じ100件を返す | /projectsエンドポイントが受け付けるのはpageSize/pageのみです。キーワードなどのフィルターは黙って無視されます | 代わりに/search/projects?keyword=...&filter=...を使います |
/projects/{acc}/filesでファイルサイズが0と表示される | fileSizeBytesではなくfileSizeを読み取っている | v3のフィールドはfileSizeBytes(バイト単位)です。fileSizeBytes / 1e6でMBを計算します |
| フィルターを適用しても結果が変わらない | ファセット値が実際の値と完全一致していない | まず/facet/projects?keyword=...を呼び出し、有効な値を列挙します(Homo sapiensではなくHomo sapiens (human)) |
実際の結果数を超えるpageSizeを指定すると、空の配列が返される | 通常のページネーション動作です | 返された配列の長さがpageSizeより小さいとき、または配列が空のときに、ページの反復処理を終了します |
findAllOrganismsCountがHTTP 406 Not Acceptableを返す | エンドポイントがJSON以外のAcceptヘッダーを必要とする | このエンドポイントは使わず、同じ用途を満たす/facet/projects経由のファセット件数を使います |
リクエストが集中するとHTTP 429またはConnectionErrorが発生する | EBIインフラストラクチャを共有しているためです | ループにtime.sleep(0.3)を追加し、5xxエラーの場合は指数バックオフで再試行します |
関連スキル
uniprot-protein-database— UniProt の配列、Swiss-Prot の注釈、ID マッピング。PRIDE のタンパク質検索と組み合わせることで、各 UniProt アクセッションに配列および機能情報を付加できますinterpro-database— PRIDE で報告されたタンパク質のタンパク質ドメイン構造(Pfam、SMART、PANTHER)pdb-database— PRIDE のエビデンスがあるタンパク質の解明済み 3D 構造pyteomics(スキル対象外の Python ライブラリ)—/projects/{accession}/filesからダウンロードした mzIdentML/mzML/mzTab ファイルを解析します。REST API でスペクトルレベルおよび PSM レベルのデータが公開されなくなった現在、これらを分析する方法です
参考資料
- PRIDE Archive v3 REST API のルート — ベース URL
- PRIDE v3 OpenAPI/Swagger 仕様 — エンドポイントの正式な一覧
- PRIDE Archive ウェブポータル — インタラクティブなデータセットブラウザー
- Perez-Riverol ら、Nucleic Acids Research 2022 — リポジトリとアーキテクチャについて説明した PRIDE の 2022 年の更新
- ProteomeXchange Consortium — PRIDE、MassIVE、jPOST、iProX で共通して使われる標準アクセッションシステム
- SDRF-Proteomics 仕様 —
/files/sdrf/{projectAccession}で使用される形式