第一章

1.0 计算ATP水解的$ \Delta G $

$$ ATP->ADP+P_i $$

​水解ATP中的一个磷酸二酯键会产生$-30.5kj/mol$标准吉布斯自由能($\Delta G^0$)。在生化课本中,真正的$\Delta G$值依赖于化合物浓度,化合物浓度在不同组织之间有着很大的差异(详见下表,引自Berg et al.1

表 1.1 在不同的组织中的化合物浓度

组织[ATP][mM][ADP][mM][$P_i$][mM]
3.51.85.0
肌肉8.00.98.0
2.60.72.7

那么如何计算ATP水解的真正的$\Delta G$值?吉布斯自由能可以用与化合物浓度相关的函数表示:

$$ \Delta G=\Delta G^0+RT*ln([ADP]*[P_i]/[ATP]) $$

import math

ATP = [3.5, 8.0, 2.6]
ADP = [1.8, 0.9, 0.7]
Pi = [5.0, 8.0, 2.7]
R, T, deltaG0 = 0.00831, 298, -30.5
for i in range(3):
    deltaG = deltaG0 + R * T * math.log(ADP[i] * Pi[i] / ATP[i])
    print(deltaG)
-28.161154161098693
-30.76091267376473
-31.289803304260836

1.0.1 计算三种组织中的所有$\Delta G$值
​哪种组织释放的ATP水解能最多?从所有结果的绝对值来看,中释放的水解能最多。
1.0.2 将值转化为千卡
​以$kcal/mol$为单位计算三种组织的$\Delta G$值,单位换算因子是$1kcal/mol=4.184kj/mol$。

print(deltaG/4.184)  # deltaG从上面已知

1.0.3 计算$pH$值
溶液质子浓度[H+]为$0.003162mM$,求溶液$pH$值。

根据pH与[H+]的关系:

$$ pH=-lg[H+] $$

print(-math.log10(0.003162))

1.0.4 指数生长
在最适合的条件下,单个大肠杆菌可以每20分钟分裂一次。保持最佳条件,求6小时后的大肠杆菌数量。
即$2^n$,$n$为分裂次数:

print(math.pow(2, 6 * 60 / 20))

1.0.5 计算单个细菌细胞体积
​已知单个大肠杆菌细胞的平均长度为$2.0\mu m$,直径$0.5\mu m$。假设大肠杆菌为圆柱形,求单个大肠杆菌细胞体积是多少?

print(math.pi * math.pow(0.5/2, 2) * 0.2)

单位$\mu m^3$。

1.1 如何计算两点间的距离?

​三维中的一个点可以通过笛卡儿坐标$ (x,y,z) $来定义,两个点$ p_1 $和$ p_2 $,坐标分别为$ (x_1,y_1,z_1) $和$ (x_2,y_2,z_2) $,它们之间的距离$d$可以用下式给出:

$$ d(p_1,p_2)=\sqrt {(x_1-x_2)^2+(y_1-y_2)^2+(z_1-z_2)^2} $$

from math import *

x1, y1, z1 = 0.1, 0.0, -0.7
x2, y2, z2 = 0.5, -1.0, 2.7
dx = x1 - x2
dy = y1 - y2
dz = z1 - z2
d = sqrt(pow(dx, 2) + pow(dy, 2) + pow(dz, 2))
print(d)

第二章

2.0 如何计算胰岛素序列中的氨基酸频率

​胰岛素是被首先发现的蛋白质之一,Frederick Banting和John Macleod因发现其功能获得了1923年的诺贝尔奖。90年后,人类胰岛素在医学和经济上有着举足轻重的地位,主要影响2.85亿糖尿病人群。在蛋白质水解去掉翻译产物的两个片段后,胰岛素蛋白质的功能型由51个氨基酸组成。在这条蛋白质序列中20种氨基酸出现的频率分别是多少?

​分析蛋白质序列的氨基酸频率可以得出有多少半胱氨酸可以组成二硫键;是否有特殊的非极性残基的数目表明存在可跨膜的结构域;或者是否有大量阳性电荷残基可以参与核酸结合。

2.0.1 如何为半胱氨酸计数?

# insulin [Homo sapiens] GI:386828
# extracted 51 amino acids of A+B chain
insulin = "GIVEQCCTSICSLYQLENYCNFVNQHLCGSHLVEALYLVCGERGFFYTPKT"
for amino_acid in "ACDEFGHIKLMNPQRSTVWY":
    number = insulin.count(amino_acid)
    print(amino_acid, number)
A 1
C 6
D 0
...
Y 4

2.0.2 如何创建随机序列?

import random

alphabet = "AGCT"
sequence = ""
for i in range(10):
    index = random.randint(0, 3)
    sequence += alphabet[index]
print(sequence)
print(''.join(['AGCT'[random.randint(0, 3)] for i in range(10)]))

2.0.3 如何在序列中运行滑动窗口?

​在寻找序列模体(motif)时,通常有必要考虑序列中的所有定长片段。

seq = "PRQTEINSEQWENCE"
for i in range(len(seq)-4):
    print(seq[i:i+5])

变量i从0运行到序列长度减4,len(seq)为15,即range(11)产生0~10的所有数,seq[i, i+5]从序列位置i处提取长度为5的子序列。第一个子序列从索引0到4,最后一个从10到14。

PRQTE
RQTEI
QTEIN
TEINS
...
WENCE

2.0.4 端粒蛋白质序列中氨基酸出现的频率

​2009年,Elizabeth H. Blackburn, Carol W. Greide 和 Jack W. Szostak 因发现端粒酶功能而获得诺贝尔奖,端粒酶负责延伸染色体的末端。通过NCBI的蛋白质数据库检索人类亚型Ⅰ的端粒的1132个残基序列,试问其中哪种氨基酸出现最为频繁?

咕咕

2.0.5 DNA序列中核苷酸碱基出现的频率

更改2.0.4的程序来计算4个DNA碱基频率。用知道输出结果的序列来测试程序,如“AAAACCCGGT”。

咕咕

2.0.6 一次一次残基地输出氨基酸序列

​使用range()和len()写一个打印胰岛素第一个氨基酸的程序,然后是前2个、前3个,依次类推。

咕咕

2.0.7 删除缩进

​对于2.0.1中的氨基酸计数,将print(amino_acid, number)更换为print(amino_acid, number,),再次运行该程序并解释发生了什么。

好像在Python3里没什么变化,不知道Python2里是咋样的

2.0.8 采用20个命令,还是采用1个for循环?

氨基酸计数程序可以简单地不用for循环,而使用20个命令计数:

number = insulin.count("A")
print("A", number)
number = insulin.count("C")
print("C", number)
...

你更倾向于选择哪种?为什么选择其中或为什么不选择另外一个呢?

很明显这是来问Python小白的,我个人更倾向于for循环,毕竟简洁,对于追求Pythonic的人来说毋庸置疑。

第三章

3.0 树突长度

​神经生物学研究领域的问题之一是:什么条件可以使神经细胞生长?神经细胞中的生长可以通过荧光显微镜进行分析。获得的图形可以用来测量树突状轴的复杂性。ImageJ(Java语言的图像处理分析软件)之类的软件能够计算如树突长度之类的参数,并把值写入文本文件。简化后,文件neuron_data.txt是包含一系列神经元长度数据的文本文件:

16.38
139.90
441.46
29.03
40.93
202.07
142.30
346.00
300.00

​如果需要使用这样一组文本文件的数值,开始时就有几个问题:这里有多少测量值?最长的树突长度是多少?最短的是多少?平均长度是多少?标准差是多少?在更详细地分析数据之前,如果有个大概的汇总会更好。

data = []
for line in open('neuron_data.txt'):
    length = float(line.strip())
    data.append(length)
n_items = len(data)
total = sum(data)
shortest = min(data)
longest = max(data)
data.sort()
output = open("results.txt", "w")
output.write("number of dendritic lengths : %4i \n" % (n_items))
output.write("total dendritic length      : %6.1f \n" % (total))
output.write("shortest dendritic length   : %7.2f \n" % (shortest))
output.write("longest dendritic length    : %7.2f \n" % (longest)
output.write("%37.2f\n%37.2f" % (data[-2], data[-3]))
output.close()

3.0.1 如何计算平均数?

​假设已经测得5个树突长度,想知道它们的平均值:

data = [3.53, 3.47, 3.51, 3.72, 3.43]
average = sum(data) / len(data)
print(average)

算数平均值公式:

$$ \mu =\frac{1}{N}\sum_{i=1}^Nx_i $$

data = [1, 2, 3, 4]
average = float(sum(data)) / len(data)
print(average)

3.0.2 如何计算标准差?

​计算标准差有些复杂,因为需要for循环来计算每个值的平方差,必须先有预先计算出的平均值。然后将每个值减去平均值((value-average)**2)。所有平方差要加在一起,除以结果的数量,然后计算结果的平均根。平方差求和可以设置一个变量为0.0,每得到一个平方差就加上去。

标准差公式为:

$$ \sigma=\sqrt{\frac{1}{N}\sum_{i=1}^N(x_i-\mu)^2} $$

import math
data = [3.53, 3.47, 3.51, 3.73, 3.43]
average = sum(data) / len(data)
total = 0.0
for value in data:
    tital += (value - average) ** 2
stddev = math.sqrt(total / len(data))
print(stddev)

3.0.3 如何计算中位数?

​还有一种有用的度量是中位数,该值将一个数据集分成相等的两半。计算数字列表的中位数时,要对数据进行排序。元素个数是计数还是偶数会导致计算略有不同:

data = [3.53, 3.47, 3.51, 3.72, 3.43]
data.sort()
mid = lenz(data) / 2
if len(data) % 2 == 0:
    median = (data[mid - 1] + data[mid]) / 2.0
else:
    median = data[mid]
print(median)

函数data.sort()将数据按升序排序。if...else...用来判断奇数偶数。

3.0.4 读取和写入文件

​读取神经长度文件,并保存一个该文件的独立副本。

3.0.5 计算平均值和标准差

​扩展3.0示例,使其计算神经平均长度和标准差。

3.0.6 核苷酸的频率

​编写一个程序,从纯文本文件中读取DNA序列。计算每个碱基出现的频率。该程序还需要给出最常见碱基的出现频率。不一定需要找出最常见的具体是哪个碱基。

3.0.7 DNA序列的GC含量

​写一个程序,用纯文本文件计算DNA序列的GC含量。

第四章

4.0 整合质谱数据,转化到代谢通路中

​解析数据文件需注意两点:如何用列表收集数据;如何通过在程序中做选择来提取想要的数据。

​假设要识别在特定的癌症细胞中表达的某些特定代谢或调节通路(如细胞周期)中的蛋白质,初始数据集可以表示为:(1)一个参与细胞周期的蛋白质的列表(list_a)(用诸如UniProt AC的形式),该列表可以从文本文件(file_a)中读取;(2)第二个列表(list_b),其中包含癌细胞中检测到的蛋白质,即通过如质谱等方法获取,可以从第二个文本文件(file_b)中读取。该文本文件可以从Reactome等资源中下载或通过实验获得。两种情况下,都需要在进行两个列表的比较之前将数据读入程序。可以由脚本轻松读取的文件格式有CSV(逗号分隔符)或TSV(制表分隔符),有蛋白质标识符的简单文本文件也是不错选择。

4.1 质谱

​质谱(MS)为一种用于测定样本复合物分子的组分的技术,该技术可用于蛋白质的特征识别及测序,基于质谱技术的蛋白质组学可用于获得基因的完整表达图谱。从这个意义上说,基本上质谱实验的最终结果应包含研究样本中检测到的肽(即表达结果)的列表。通过特定的数据分析软件(如Mascot),质谱测定的肽可以与UniProt序列匹配,使得输出列表可以用UniProt ID的形式表示,并通常存储于CSV(逗号分隔符)文本文件中:

protein_hit_num,prot_acc,prot_score,prot_matches
1," P43686",194,15
2," P62333",41,4
...

代谢通路可以从Reactome等免费资源获得。点击Reactome网站上的Browse Pathways链接,可以选择生物体和通路并下载参与所选通路的蛋白质列表,比如,textual格式如下所示:

Uniprot ID
P62258
P62981
P62191
P17980
P43686
P35998
P62333
Q99460
O75832
...

​一旦质谱数据被读取,将数据集成为通路的问题就可以归结为输出list_a和list_b共同包含的蛋白质的问题,而这就会是一个非常简单的任务。

# proteins participating in cell cycle
list_a = []
for line in open("cell_cycle_proteins.txt"):
    list_a.append(line.strip())
print(list_a)
# proteins expressed in a given cancer cell
list_b = []
for line in open("cancer_cell_proteins.txt"):
    list_b.append(line.strip())
print(list_b)
for protein in list_a:
    if protein in list_b:
        print(protein, 'detected in the cancer cell')
    else:
        print(protein, 'not observed')

输出:

P62258 not observed
P61981 not observed
P62191 not observed
P17980 not observed
P43686 detected in the cancer cell
P35998 not observed
P62333 detected in the cancer cell
Q99460 not observed
O75832 not observed

  1. Jeremy M, Berg, John I, Tymoczko, and Lubert Stryer, _Biochemistry_, 5th ed. (New York: W. H. Freeman, 2002).
Last modification:May 5th, 2020 at 05:08 pm
如果觉得我的文章对你有用,请随意赞赏