本文是《Brenda应用(2) - 构建(酶, 物质, 关系) 0-1表格用于NBI推断新关系》的第一篇:数据获取。
提取Brenda的底物、产物表内容,构建(酶, 物质, 关系)0-1表格用于NBI推断新关系。
得到的文件均放在文件夹里,文件夹是一个二级的文件夹(如下图):
【Product】/【Substrate】-【3.1.1.3】(EC号命名的文件夹)
产出三个表:
Cj name
Ei EC name
Ei Cj [num]
[num] 表示关系在数据库中的计数
希望实现的效果是,在各级EC等级,如EC3, EC3.1, EC3.1.1, EC3.1.1.3上可以用统一的接口整理出三个表。
def genECI(EC, brenda, table, path):
'''
EC = '3', '3.1', '3.1.1', '3.1.1.3' 等,
table = 'Substrate', 'Product'等,
在os.path.join(path, table)路径下新建名为*EC*的文件夹,其中包含了Chemicals.tsv, Enzymes.tsv 和 ECIs.tsv 文件。
(暂不实现:并且返回对象Chemicals, Enzymes 和 ECIs.)
'''
pass
Substrate表
Substrate
{ 'reactionPartners': "1-(4'-fluorophenyl)ethanol + NAD+ = 1-(4'-fluorophenyl)ethanone + NADH + H+",
'substrate': "1-(4'-fluorophenyl)ethanol",
'organism': 'Thermus thermophilus',
'ecNumber': '1.1.1.1',
'ligandStructureId': 210894
}
Product表
Product
{ 'organism': 'Leifsonia sp.',
'product': '1-(3-chlorophenyl)ethanol',
'reactionPartners': "3'-chloroacetophenone + NADH + H+ = 1-(3-chlorophenyl)ethanol + NAD+",
'ecNumber': '1.1.1.1',
'ligandStructureId': 134094
}
同样的,还有 NaturalSubstrate 和 NaturalProduct 表,内容类似。
从这个表里提取信息并整理的方法是简单的,下面是伪代码:
def genECI(EC, brenda, table, path):
ECs = EC_candidate(EC, brenda, table) # 根据输入的EC str 返回ECs list.
results = _genECI(brenda, table, ECs) # 根据ECs从Brenda中整理相应信息,返回results dict.
writeFiles(results, path) # 将 results 保存到 path 所指定的文件夹中
那么是不是也需要一个文件读入接口呢?
(未实现)
def readFile(EC, path):
_path = _pathjoin(EC, path)
results = _readFile(_path)
return results
那么有必要规定一下results的格式了。既然如此,何不使用python中现有的图工具包来做呢?
(未实现)
TABLE_SCHEMA = {
'Product':('product','ecNumber','organism'),
'Substrate':('substrate', 'ecNumber','organism'),
'NaturalProduct':('naturalProduct', 'ecNumber','organism'),
'NaturalSubstrate':('naturalSubstrate', 'ecNumber','organism'),
}
import collections
'==略=='
results = {}
results['Chemicals'] = collections.OrderedDict()
results['Enzymes'] = collections.OrderedDict()
results['ECIs'] = collections.OrderedDict()
酶名称 | 主要EC号 | 命名 | 主要类型 |
---|---|---|---|
P450酶 | [‘1.1.1.B57’, ‘1.11.2’, ‘1.13’, ‘1.14’] | P450 | 氧化还原酶类 |
卤化酶 | [‘1.14.19’] | O2->2 Water, oxidoreductase | 氧化还原酶类 |
单萜合酶 | [‘4.2.3.118’] | 2-methylisoborneol synthase | 裂合酶类 |
甲基化酶 | [‘2.1.1’] | methyltransferase | 转移酶类 |
异戊烯基转移酶 | [‘2.5.1.112’, ‘2.5.1.27’, ‘2.5.1.75’, ‘2.5.1.8’] | isopentenyltransferase | 转移酶类 |
环化酶 | [‘4.2.1’, ‘4.2.3’] | Hydro-lyases; or Acting on phosphate, C-O lyases | 裂合酶类 |
C-糖基转移酶 | [‘2.4.1’] | hexosyltransferases | 转移酶类 |
β-氨基酸合成酶 | [‘4.3.1’] | ammonia lyase | 裂合酶类 |
氨基转移酶(酰胺水解酶) | [‘3.5.1’] | linear amides hydrolases | 水解酶类 |
延胡索酸酶 | [‘4.2.1.2’] | fumarate hydratase | 裂合酶类 |
漆酶 | [‘1.10.3.2’] | laccase | 氧化还原酶类 |
脂肪酶 | [‘3.1.1’, ‘3.1.1.3’] | carboxylic-ester hydrolases | 水解酶类 |
## 设定用户名,路径 ##
brenda = brenda_soap.Brenda(EMAIL, PASSWORD, PATH)
path_eci = os.path.join(PATH,'ECI')
tables = ['Product', 'Substrate']
ECs = ['1.1.1.B57', '1.11.2', '1.13', '1.14',
'1.14.19',
'4.2.3.118',
'2.1.1',
'2.5.1.112', '2.5.1.27', '2.5.1.75', '2.5.1.8',
'4.2.1', '4.2.3',
'2.4.1',
'4.3.1',
'4.2.1.2',
'1.10.3.2',
'3.1.1','3.1.1.3',
]
for table in ['Product']:
for EC in ECs:
genECI(EC, brenda, table, path_eci)
发现在本地跑的时候,'4.2.1’出了问题,翻阅日志,发现是之前下载Brenda数据的时候,有中间断网的情况,所以对于某几个表,本地数据是不全的。对于Product,3.4.23.20之后的数据不在本地;Substrate/NaturalProduct/NaturalSubstrate的数据是全的。日志文件的记录如下:
对于 table = Product,有如下ECs并未被加入表中:
ecs = [‘2.1.1.B114’,‘2.3.1.97’,‘3.4.23.20’, (略), ‘7.6.2.B1’]
对于 table = RecommendedName,有如下ECs并未被加入表中:
ecs = [‘6.3.2.13’, (略), ‘7.6.2.B1’]
对于 table = Substrate,有如下ECs并未被加入表中:
ecs = [‘2.1.1.B114’,‘2.3.1.97’,‘7.6.2.B1’]
通过设置brenda的模式来解决:
if ec > '3.4.23.20' and table == 'Product':
brenda.mode = 'soap'
## 代码 ##
brenda.mode = 'default'
之后可以抽空把Product表补全。
table = 'Product'
ecs = brenda.getEcNumbers(table)
brenda.mode = 'soap'
for ec in ecs:
if ec > '3.4.23.20':
brenda.getContent(table, ec)
brenda的记录略显粗糙,如之前所述,有些带有计量数的,有些是非常常规的分子,如H2O, more, ? 等。需要对ECI表进行数据清洗以赋予数据意义。
在genECI()中加入。
nonsense_chemicals = ['?','more']
## 略 ##
if chemical in nonsense_chemicals:
continue
在外部同样写了一个函数:
def refineByChem(results, chemicals_list):
# 删除chemicals_list中的物质和相应关系。
问题在于确定哪些是需要删除的。实际上不是那么明显与好选择。
类似于DTI中的T空间,之前有从发育学的角度关联的;是否能将其方法引入?
类似于DTI中的Drug空间,如何从化学名称出发,对应到【化学物质】,再引入网络关系?