cobrapy について
COBRApyは、制約ベースの代謝モデルを扱うシステム生物学研究者向けのPythonライブラリです。モデルの構築・入出力に加え、代謝シミュレーションやフラックス解析、ノックアウト解析に対応します。
主な機能
- 01代謝モデルの読み込み・構築・保存
- 02FBAなどのシミュレーション
- 03フラックス変動とサンプリングの解析
- 04遺伝子・反応の欠失試験
- 05培地管理とモデルのギャップフィリング
活用シーン
- 01代謝モデルから増殖を予測
- 02遺伝子ノックアウトをスクリーニング
- 03反応のフラックス範囲を評価
- 04実行可能なフラックス分布を探索
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ ovachiever/ droid-tings --skill cobrapyインストール後、Claude Code で/cobrapyを入力して読み込まれたか確認します。
同梱ファイルreferences/api_quick_reference.mdreferences/workflows.md
詳細
COBRApy - 制約ベース再構築・解析
概要
COBRApy は、代謝モデルの制約ベース再構築・解析(COBRA)のための Python ライブラリであり、システムバイオロジー研究に欠かせないツールです。ゲノムスケールの代謝モデルを扱い、細胞代謝の計算シミュレーションを行い、代謝工学的解析を実施し、表現型の振る舞いを予測できます。
主な機能
COBRApy は、いくつかの主要分野に整理された包括的なツールを提供します:
1. モデル管理
リポジトリまたはファイルから既存のモデルを読み込みます:
from cobra.io import load_model
# Load bundled test models
model = load_model("textbook") # E. coli core model
model = load_model("ecoli") # Full E. coli model
model = load_model("salmonella")
# Load from files
from cobra.io import read_sbml_model, load_json_model, load_yaml_model
model = read_sbml_model("path/to/model.xml")
model = load_json_model("path/to/model.json")
model = load_yaml_model("path/to/model.yml")
さまざまな形式でモデルを保存します:
from cobra.io import write_sbml_model, save_json_model, save_yaml_model
write_sbml_model(model, "output.xml") # Preferred format
save_json_model(model, "output.json") # For Escher compatibility
save_yaml_model(model, "output.yml") # Human-readable
2. モデルの構造とコンポーネント
モデルのコンポーネントにアクセスして確認します:
# Access components
model.reactions # DictList of all reactions
model.metabolites # DictList of all metabolites
model.genes # DictList of all genes
# Get specific items by ID or index
reaction = model.reactions.get_by_id("PFK")
metabolite = model.metabolites[0]
# Inspect properties
print(reaction.reaction) # Stoichiometric equation
print(reaction.bounds) # Flux constraints
print(reaction.gene_reaction_rule) # GPR logic
print(metabolite.formula) # Chemical formula
print(metabolite.compartment) # Cellular location
3. フラックスバランス解析(FBA)
標準的な FBA シミュレーションを実行します:
# Basic optimization
solution = model.optimize()
print(f"Objective value: {solution.objective_value}")
print(f"Status: {solution.status}")
# Access fluxes
print(solution.fluxes["PFK"])
print(solution.fluxes.head())
# Fast optimization (objective value only)
objective_value = model.slim_optimize()
# Change objective
model.objective = "ATPM"
solution = model.optimize()
Parsimonious FBA(総フラックスを最小化):
from cobra.flux_analysis import pfba
solution = pfba(model)
Geometric FBA(中心的な解を見つける):
from cobra.flux_analysis import geometric_fba
solution = geometric_fba(model)
4. フラックス変動解析(FVA)
すべての反応のフラックス範囲を決定します:
from cobra.flux_analysis import flux_variability_analysis
# Standard FVA
fva_result = flux_variability_analysis(model)
# FVA at 90% optimality
fva_result = flux_variability_analysis(model, fraction_of_optimum=0.9)
# Loopless FVA (eliminates thermodynamically infeasible loops)
fva_result = flux_variability_analysis(model, loopless=True)
# FVA for specific reactions
fva_result = flux_variability_analysis(
model,
reaction_list=["PFK", "FBA", "PGI"]
)
5. 遺伝子および反応の欠失解析
ノックアウト解析を実施します:
from cobra.flux_analysis import (
single_gene_deletion,
single_reaction_deletion,
double_gene_deletion,
double_reaction_deletion
)
# Single deletions
gene_results = single_gene_deletion(model)
reaction_results = single_reaction_deletion(model)
# Double deletions (uses multiprocessing)
double_gene_results = double_gene_deletion(
model,
processes=4 # Number of CPU cores
)
# Manual knockout using context manager
with model:
model.genes.get_by_id("b0008").knock_out()
solution = model.optimize()
print(f"Growth after knockout: {solution.objective_value}")
# Model automatically reverts after context exit
6. 増殖培地と最小培地
増殖培地を管理します:
# View current medium
print(model.medium)
# Modify medium (must reassign entire dict)
medium = model.medium
medium["EX_glc__D_e"] = 10.0 # Set glucose uptake
medium["EX_o2_e"] = 0.0 # Anaerobic conditions
model.medium = medium
# Calculate minimal media
from cobra.medium import minimal_medium
# Minimize total import flux
min_medium = minimal_medium(model, minimize_components=False)
# Minimize number of components (uses MILP, slower)
min_medium = minimal_medium(
model,
minimize_components=True,
open_exchanges=True
)
7. フラックスサンプリング
実現可能なフラックス空間をサンプリングします:
from cobra.sampling import sample
# Sample using OptGP (default, supports parallel processing)
samples = sample(model, n=1000, method="optgp", processes=4)
# Sample using ACHR
samples = sample(model, n=1000, method="achr")
# Validate samples
from cobra.sampling import OptGPSampler
sampler = OptGPSampler(model, processes=4)
sampler.sample(1000)
validation = sampler.validate(sampler.samples)
print(validation.value_counts()) # Should be all 'v' for valid
8. 生産エンベロープ
表現型の位相平面を計算します:
from cobra.flux_analysis import production_envelope
# Standard production envelope
envelope = production_envelope(
model,
reactions=["EX_glc__D_e", "EX_o2_e"],
objective="EX_ac_e" # Acetate production
)
# With carbon yield
envelope = production_envelope(
model,
reactions=["EX_glc__D_e", "EX_o2_e"],
carbon_sources="EX_glc__D_e"
)
# Visualize (use matplotlib or pandas plotting)
import matplotlib.pyplot as plt
envelope.plot(x="EX_glc__D_e", y="EX_o2_e", kind="scatter")
plt.show()
9. ギャップ埋め
モデルを実行可能にするために反応を追加します:
from cobra.flux_analysis import gapfill
# Prepare universal model with candidate reactions
universal = load_model("universal")
# Perform gapfilling
with model:
# Remove reactions to create gaps for demonstration
model.remove_reactions([model.reactions.PGI])
# Find reactions needed
solution = gapfill(model, universal)
print(f"Reactions to add: {solution}")
10. モデル構築
ゼロからモデルを構築します:
from cobra import Model, Reaction, Metabolite
# Create model
model = Model("my_model")
# Create metabolites
atp_c = Metabolite("atp_c", formula="C10H12N5O13P3",
name="ATP", compartment="c")
adp_c = Metabolite("adp_c", formula="C10H12N5O10P2",
name="ADP", compartment="c")
pi_c = Metabolite("pi_c", formula="HO4P",
name="Phosphate", compartment="c")
# Create reaction
reaction = Reaction("ATPASE")
reaction.name = "ATP hydrolysis"
reaction.subsystem = "Energy"
reaction.lower_bound = 0.0
reaction.upper_bound = 1000.0
# Add metabolites with stoichiometry
reaction.add_metabolites({
atp_c: -1.0,
adp_c: 1.0,
pi_c: 1.0
})
# Add gene-reaction rule
reaction.gene_reaction_rule = "(gene1 and gene2) or gene3"
# Add to model
model.add_reactions([reaction])
# Add boundary reactions
model.add_boundary(atp_c, type="exchange")
model.add_boundary(adp_c, type="demand")
# Set objective
model.objective = "ATPASE"
一般的なワークフロー
ワークフロー 1: モデルを読み込み増殖を予測する
from cobra.io import load_model
# Load model
model = load_model("ecoli")
# Run FBA
solution = model.optimize()
print(f"Growth rate: {solution.objective_value:.3f} /h")
# Show active pathways
print(solution.fluxes[solution.fluxes.abs() > 1e-6])
ワークフロー 2: 遺伝子ノックアウトスクリーニング
from cobra.io import load_model
from cobra.flux_analysis import single_gene_deletion
# Load model
model = load_model("ecoli")
# Perform single gene deletions
results = single_gene_deletion(model)
# Find essential genes (growth < threshold)
essential_genes = results[results["growth"] < 0.01]
print(f"Found {len(essential_genes)} essential genes")
# Find genes with minimal impact
neutral_genes = results[results["growth"] > 0.9 * solution.objective_value]
ワークフロー 3: 培地の最適化
from cobra.io import load_model
from cobra.medium import minimal_medium
# Load model
model = load_model("ecoli")
# Calculate minimal medium for 50% of max growth
target_growth = model.slim_optimize() * 0.5
min_medium = minimal_medium(
model,
target_growth,
minimize_components=True
)
print(f"Minimal medium components: {len(min_medium)}")
print(min_medium)
ワークフロー 4: フラックスの不確実性解析
from cobra.io import load_model
from cobra.flux_analysis import flux_variability_analysis
from cobra.sampling import sample
# Load model
model = load_model("ecoli")
# First check flux ranges at optimality
fva = flux_variability_analysis(model, fraction_of_optimum=1.0)
# For reactions with large ranges, sample to understand distribution
samples = sample(model, n=1000)
# Analyze specific reaction
reaction_id = "PFK"
import matplotlib.pyplot as plt
samples[reaction_id].hist(bins=50)
plt.xlabel(f"Flux through {reaction_id}")
plt.ylabel("Frequency")
plt.show()
ワークフロー 5: 一時的な変更のためのコンテキストマネージャー
コンテキストマネージャーを使用して、一時的な変更を加えます:
# Model remains unchanged outside context
with model:
# Temporarily change objective
model.objective = "ATPM"
# Temporarily modify bounds
model.reactions.EX_glc__D_e.lower_bound = -5.0
# Temporarily knock out genes
model.genes.b0008.knock_out()
# Optimize with changes
solution = model.optimize()
print(f"Modified growth: {solution.objective_value}")
# All changes automatically reverted
solution = model.optimize()
print(f"Original growth: {solution.objective_value}")
主要な概念
DictList オブジェクト
モデルは、反応、代謝物、遺伝子に DictList オブジェクトを使用します。これはリストと辞書の両方のように振る舞います:
# Access by index
first_reaction = model.reactions[0]
# Access by ID
pfk = model.reactions.get_by_id("PFK")
# Query methods
atp_reactions = model.reactions.query("atp")
フラックス制約
反応の境界が実行可能なフラックス範囲を定義します:
- 非可逆:
lower_bound = 0, upper_bound > 0 - 可逆:
lower_bound < 0, upper_bound > 0 - 不整合を避けるため、
.boundsで両方の境界を同時に設定します
遺伝子-反応規則(GPR)
遺伝子と反応を結び付けるブール論理:
# AND logic (both required)
reaction.gene_reaction_rule = "gene1 and gene2"
# OR logic (either sufficient)
reaction.gene_reaction_rule = "gene1 or gene2"
# Complex logic
reaction.gene_reaction_rule = "(gene1 and gene2) or (gene3 and gene4)"
交換反応
代謝物の取り込みと排出を表す特殊な反応:
- 慣例として接頭辞
EX_で命名されます - 正のフラックスは分泌、負のフラックスは取り込みを意味します
model.medium辞書を通じて管理します
ベストプラクティス
- 一時的な変更にはコンテキストマネージャーを使用し、状態管理の問題を避けます
- 解析の前に
model.slim_optimize()を使ってモデルを検証し、実行可能性を確認します - 最適化後に解のステータスを確認します。
optimalは求解に成功したことを示します - 熱力学的な実行可能性が重要な場合は、ループレス FVA を使用します
- 最適値に劣る空間を探索するため、FVA で
fraction_of_optimumを適切に設定します - 計算負荷の高い処理(サンプリング、二重欠失)は並列化します
- モデルの交換および長期保存には、SBML 形式を優先します
- 性能のために目的関数値だけが必要な場合は slim_optimize() を使用します
- 数値的安定性を確保するため、フラックスサンプルを検証します
トラブルシューティング
解が実行不能な場合: 培地の制約、反応の境界、モデルの整合性を確認します
最適化が遅い場合: model.solver を通じて別のソルバー(GLPK、CPLEX、Gurobi)を試します
解が非有界な場合: 交換反応に適切な上限境界があるかを確認します
インポートエラー: 正しいファイル形式と有効な SBML 識別子であることを確認します
参考資料
詳細なワークフローと API のパターンについては、以下を参照してください:
references/workflows.md- 包括的なステップごとのワークフロー例references/api_quick_reference.md- 一般的な関数シグネチャとパターン