生物医学网络科学Biomedical Network Science
Example08 / 09

玩具代谢网络的单基因与双基因敲除——必需基因与合成致死对

所属专题
网络鲁棒性、渗流与级联失效
下载
Notebook · .py

用”网络扩张”(scope)判断可行性:从培养基中的底物出发,反应的全部底物都可得时反应可进行并产生产物; 能合成全部”生物量前体”即视为可存活。每个反应由一个或多个同工酶基因催化(任一基因存在即可)。 单基因敲除不能存活 -> 必需基因;两个单独敲除都存活、同时敲除不能存活 -> 合成致死对。 解读:同工酶(G3/G4)与平行通路(G5 与 G6–G7 两条旁路)提供冗余,因此产生合成致死对,这正是”冗余造就鲁棒、也造就弱点”。

Output输出图

玩具代谢网络的单基因与双基因敲除——必需基因与合成致死对:输出图 1

Output文字输出

必需基因: ['G1', 'G2', 'G8']
合成致死对: [('G3', 'G4'), ('G5', 'G6'), ('G5', 'G7')]

Code代码

# 用"网络扩张"(scope)判断可行性:从培养基中的底物出发,反应的全部底物都可得时反应可进行并产生产物;
# 能合成全部"生物量前体"即视为可存活。每个反应由一个或多个同工酶基因催化(任一基因存在即可)。
# 单基因敲除不能存活 -> 必需基因;两个单独敲除都存活、同时敲除不能存活 -> 合成致死对。
# 解读:同工酶(G3/G4)与平行通路(G5 与 G6–G7 两条旁路)提供冗余,因此产生合成致死对,这正是"冗余造就鲁棒、也造就弱点"。
from itertools import combinations

reactions = {                       # 反应: (底物, 产物, 催化基因)
    "R1": ({"glc"}, {"g6p"}, {"G1"}),
    "R2": ({"g6p"}, {"pyr"}, {"G2"}),
    "R3": ({"pyr"}, {"accoa"}, {"G3", "G4"}),      # 同工酶
    "R4": ({"g6p"}, {"r5p"}, {"G5"}),              # 通路 1
    "R5": ({"pyr"}, {"x"}, {"G6"}),                # 通路 2 的两步旁路
    "R6": ({"x"}, {"r5p"}, {"G7"}),
    "R7": ({"accoa"}, {"lipid"}, {"G8"}),
}
medium = {"glc"}; biomass = {"r5p", "lipid", "pyr"}
genes = sorted(set().union(*[r[2] for r in reactions.values()]))

def viable(knockout):
    avail = set(medium); changed = True
    active = {r for r, (_, _, gs) in reactions.items() if gs - set(knockout)}
    while changed:
        changed = False
        for r in active:
            sub, prod, _ = reactions[r]
            if sub <= avail and not prod <= avail:
                avail |= prod; changed = True
    return biomass <= avail

essential = [g for g in genes if not viable([g])]
sl_pairs = [(a, b) for a, b in combinations([g for g in genes if g not in essential], 2) if not viable([a, b])]
print("必需基因:", essential)
print("合成致死对:", sl_pairs)

import numpy as np
import matplotlib.pyplot as plt
V = np.array([[viable([a] if a == b else [a, b]) for b in genes] for a in genes], float)
fig, ax = plt.subplots(figsize=(6.4, 4.6))
ax.imshow(V, cmap="RdYlGn", vmin=-0.3, vmax=1.3)
ax.set_xticks(range(len(genes)), genes); ax.set_yticks(range(len(genes)), genes)
for i in range(len(genes)):
    for j in range(len(genes)):
        ax.text(j, i, "ok" if V[i, j] else "x", ha="center", va="center", fontsize=8)
ax.set_xlabel("knockout gene"); ax.set_ylabel("knockout gene")
ax.set_title("Knockout viability (diagonal = single; x = lethal)", fontsize=10)
plt.tight_layout(); plt.show()

Run在浏览器中运行

首次加载 Python 环境约需 20–40 秒;可以修改参数后重新运行。

玩具代谢网络的单基因与双基因敲除——必需基因与合成致死对