Brenda应用(2.0) - 构建(酶, 物质, 关系)0-1表格用于NBI推断新关系

本文是《Brenda应用(2) - 构建(酶, 物质, 关系) 0-1表格用于NBI推断新关系》的第一篇:数据获取。

目标

提取Brenda的底物、产物表内容,构建(酶, 物质, 关系)0-1表格用于NBI推断新关系。

输出

得到的文件均放在文件夹里,文件夹是一个二级的文件夹(如下图):
【Product】/【Substrate】-【3.1.1.3】(EC号命名的文件夹)
输出示意图

产出三个表:

  1. [Chemicals.tsv]

Cj name

  1. [Enzymes.tsv]

Ei EC name

  1. [ECIs.tsv]

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中现有的图工具包来做呢?
(未实现)

问题

  1. 需要维护一个合理的tables的取值范围,并且维护提取信息的键名称。如下:
TABLE_SCHEMA = {
     'Product':('product','ecNumber','organism'),
     'Substrate':('substrate', 'ecNumber','organism'),
     'NaturalProduct':('naturalProduct', 'ecNumber','organism'),
     'NaturalSubstrate':('naturalSubstrate', 'ecNumber','organism'),
}
  1. 利用OrderedDict来同时实现Set和List的功能:
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表进行数据清洗以赋予数据意义。

目标
  1. 除去无意义物质记录,如 more 和 ?
  2. 辨识/除去常见底物,如异戊烯基转移酶产物中的 diphosphate等
  3. 频数统计,进行简单分析
实现

在genECI()中加入。

nonsense_chemicals = ['?','more']
	## 略 ##
	if chemical in nonsense_chemicals:
    	continue

在外部同样写了一个函数:

def refineByChem(results, chemicals_list):
	# 删除chemicals_list中的物质和相应关系。
问题

问题在于确定哪些是需要删除的。实际上不是那么明显与好选择。

TODO

网络结构深化

酶空间

类似于DTI中的T空间,之前有从发育学的角度关联的;是否能将其方法引入?

化学空间

类似于DTI中的Drug空间,如何从化学名称出发,对应到【化学物质】,再引入网络关系?

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值