实现功能:
输入:Uniprot中的accession number
输出:与输入蛋白相关的蛋白交互对(左列是原列表中的蛋白,右侧是查询到的partner)
直接使用代码
https://github.com/JulseJiang/Code_for_blog/blob/main/Python_ExtractPartnerFromIntAct/exTMPnonTMPpiar20201201.py
或者看看处理过程:
数据下载
数据集下载链接:这里下载mitab格式,方便解析
ftp://ftp.ebi.ac.uk/pub/databases/intact/current/psimitab/
下载intact.txt或者intact.zip 自行解压都行
提取IntAct中的全体蛋白对
实现效果
文件中部分蛋白是Uniprot中的,部分蛋白是EBI中的,目前只考虑Uniprot中的
提取到103w对来自uniprot的蛋白,去重之后剩余673577对
20201201 下载的数据,也就是2020 年11月7日发布的数据,里面有673577对的蛋白来自uniprot标注
blog/blob/main/Python_ExtractPartnerFromIntAct/pair_norepeat.txt
输入某个蛋白质accession 列表,查找到8k条相关的蛋白对
相关代码
- 提取intact.txt中用Uniprot ID表示的蛋白对
def extractPPIFromIntAct(finPair,foutPair):
# finPair = r'E:\data\intact\intact.txt'
# foutPair = r'E:\data\intact\pair.txt'
with open(finPair, 'r', encoding='UTF-8') as fi, open(foutPair, 'w') as fo:
line = fi.readline()
while (line):
line = fi.readline()
pair = line.split('\t', maxsplit=2)
try:
a = pair[0]
b = pair[1]
if 'uniprotkb:' in a and 'uniprotkb:' in b:
a = a.replace('uniprotkb:', '')
b = b.replace('uniprotkb:', '')
if '-' in a: a = a.split('-')[0]
if '-' in b: b = b.split('-')[0]
fo.write('%s\t%s\n' % (a, b))
fo.flush()
print(a, b)
else:
continue
except:
print(pair)
- 加载蛋白列表
def readIDlist(filePath,by = '\n'):
fo = open(filePath,'r')
lines = fo.readlines()
# 'P67999\n', 'P0ADV1\n', 'P0A6F5\n',
list = []
for line in lines:
list.append(line.split(by)[0])
fo.close()
# 'P67999', 'P0ADV1', 'P0A6F5'
return list
- 提取给定蛋白列表相关的蛋白对
def findPartner(finPair,foutPair,finList):
# finPair = r'E:\data\intact\pair.txt'
# foutPair = r'E:\data\intact\pair_related.txt'
# finList = r'E:\githubCode\BioDataCoding\Parsers\ttd\TMP_accession_list.csv'
TMPlist = readIDlist(finList)
count = 0
with open(finPair, 'r', encoding='UTF-8') as fi, open(foutPair, 'w') as fo:
line = fi.readline()
while (line):
pair = line[:-1].split('\t', maxsplit=2)
try:
a = pair[0]
b = pair[1]
if a in TMPlist and b in TMPlist:
fo.write('%s\t%s\n' % (a, b))
else:
if a in TMPlist:
fo.write('%s\t%s\n' % (a, b))
if b in TMPlist:
fo.write('%s\t%s\n' % (b, a))
fo.flush()
count = count + 1
print(count)
except:
print(pair)
line = fi.readline()
如果需要更严谨一点的话,需要考虑accession过期的现象
下面这个博客展示了根据accession Id 查询全体accesstion Id的过程,由于涉及到项目内容,这个将来再公开,先把博客地址放在这里
https://blog.youkuaiyun.com/Julse/article/details/110521589