基因家族的扩张收缩分析中,基于单个物种的的扩张收缩基因家族可使用该物种的基因集作为背景基因集;但如果分析某个祖先节点的扩张收缩分析情况,背景基因集的选择很重要:CAFE分析时去除了基因数目大于200的基因家族(Orthogroup),而每个Orthogroup里均有多条序列,因此我们只提取特定基因家族里的第一条序列并且合并起来作为背景基因集进行注释。例子如下:
输入文件:OG_id.txt,Orthogroups文件夹
输出文件:Ortho_seq.fa
OG_id.txt:
OG0000001
OG0000003
OG0000006
OG0000009
OG0000010
Orthogroups文件夹如下:
Orthogroups.png
输出结果如下:
Ortho_seq.fa.png
这样我们得到每个Orthogroup就会只有一个对应的基因序列(无冗余基因序列),并且基因名就是Orthogroup的ID名,注释起来也方便了许多,也省去了根据OrthogroupID提取基因名的麻烦,nice!
在pycharm里面debug了许久才写出来的,一开始怎么都有问题,特别是只循环读取第一条序列后暂停读取剩下序列时总出错,后面想到之前写过一个使用文件指针的处理方式的脚本。
这次写的脚本如下:
#!/usr/bin/python
# -*- coding: utf-8 -*-
# conda activate python3
"""
作者:徐诗芬
内容:1.根据OrthogroupID列表提取Orthogroup序列文件;
2.打开该序列文件只读取第一条序列,并重命名序列名
3.将序列名改为OrthogroupID写入输出文件中
日期:2022.5.3
"""
import sys
import os
def usage():
print('Usage: python ortho_seq.py [OGlist.txt] [Orthogroups] [Ortho_seq.fa]')
def main():
OGlist = open("OG_id.txt",'rt')
path = "Orthogroups"
with open("Ortho_seq.fa", 'wt') as ouf:
for OG in OGlist:
OG = OG.strip()
file_name = OG
for root, dirs, files in os.walk(path):
for f in files:
if f == f'{file_name}.fa':
file = os.path.join(root, f)
with open(file, 'rt') as inf:
inf.seek(0, 0)
line = inf.readline()
while line:
if line.startswith('>'):
name = f'>{file_name}'
ouf.write(name + '\n')
else:
ouf.write(line)
line = inf.readline() # 直接继续往下读取下一行
if line.startswith('>'): # 这里再加一个判断条件,第二次遇到“>”时终止循环
break
try:
main()
except IndexError:
usage()
显然这种“清汤挂面式”的脚本很ugly!!!还是要改进,特别是遇到这种无限嵌套式循环,很容易进入死循环啊,哎,以后还是要想办法解决这毛病,比如多使用自定义函数的方式!
网友评论