mcpField
C
cobrapy

cobrapy

github.com/ovachieverデータ・データベース5648 回インストール48 週間前に更新
リポジトリ

cobrapy について

COBRApyは、制約ベースの代謝モデルを扱うシステム生物学研究者向けのPythonライブラリです。モデルの構築・入出力に加え、代謝シミュレーションやフラックス解析、ノックアウト解析に対応します。

主な機能

  1. 01代謝モデルの読み込み・構築・保存
  2. 02FBAなどのシミュレーション
  3. 03フラックス変動とサンプリングの解析
  4. 04遺伝子・反応の欠失試験
  5. 05培地管理とモデルのギャップフィリング

活用シーン

  1. 01代謝モデルから増殖を予測
  2. 02遺伝子ノックアウトをスクリーニング
  3. 03反応のフラックス範囲を評価
  4. 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 辞書を通じて管理します

ベストプラクティス

  1. 一時的な変更にはコンテキストマネージャーを使用し、状態管理の問題を避けます
  2. 解析の前に model.slim_optimize() を使ってモデルを検証し、実行可能性を確認します
  3. 最適化後に解のステータスを確認します。optimal は求解に成功したことを示します
  4. 熱力学的な実行可能性が重要な場合は、ループレス FVA を使用します
  5. 最適値に劣る空間を探索するため、FVA で fraction_of_optimum を適切に設定します
  6. 計算負荷の高い処理(サンプリング、二重欠失)は並列化します
  7. モデルの交換および長期保存には、SBML 形式を優先します
  8. 性能のために目的関数値だけが必要な場合は slim_optimize() を使用します
  9. 数値的安定性を確保するため、フラックスサンプルを検証します

トラブルシューティング

解が実行不能な場合: 培地の制約、反応の境界、モデルの整合性を確認します 最適化が遅い場合: model.solver を通じて別のソルバー(GLPK、CPLEX、Gurobi)を試します 解が非有界な場合: 交換反応に適切な上限境界があるかを確認します インポートエラー: 正しいファイル形式と有効な SBML 識別子であることを確認します

参考資料

詳細なワークフローと API のパターンについては、以下を参照してください:

  • references/workflows.md - 包括的なステップごとのワークフロー例
  • references/api_quick_reference.md - 一般的な関数シグネチャとパターン

公式ドキュメント: https://cobrapy.readthedocs.io/en/latest/

コメント