怎么⽤python实现序列⽐对_⽣信学习笔记——Python+Mafft
实现批量化多序列⽐对
Mafft介绍⼀提到多重序列⽐对,很多⼈禁不住就想到ClustalW(Clustalx为ClustalW的GUI版),其实有⼀款多重序列⽐对软件-MAFFT,不论从⽐对速度(Muscle>MAFFT>ClustalW>T-Coffee),还是⽐对准确性(MAFFT>Muscle>T-Coffee>ClustalW)来说,其相⽐于ClustalW(或ClustalX)有过之⽽⽆不及,所以这⾥强烈推荐使⽤MAFFT这款多重⽐对软件。
PS: 不同⽐对软件的⽐较,有兴趣的童鞋可以下载这篇⽂章看看:
Wong K M, Suchard M A, Huelsenbeck J P. Alignment uncertainty and genomic analysis. Science, 2008, 319: 473-6.
背景:⽣物学相关专业,2个⽉前wet转dry,学习Python⼤概2个⽉不到的时间。
问题:因为实验需要,要对数百个fasta⽂件分别进⾏多序列⽐对(每个fasta⽂件⾥都是数条待⽐对的序列),⽆奈Mafft软件仅⽀持单个fasta⽂件的分析,⽽且每次都需要输⼊:输⼊⽂件、输出⽂件、输出格式、⽐对策略、额外参数等,最后还需要进⾏⼀次确认。国内外的搜索引擎都查了个遍,都没有到办法⽀持批量化处理。Python软件包Biopython到是可以⽀持对Mafft的调⽤,但是...谁⽤谁知道吧,反正试
了很久没有成功,并且⽹上对Biopython调⽤Mafft的报错结果也都没有相应的解决⽅案,遂放弃此⽅法。
使⽤过Mafft的伙伴应该知道,Windows平台上运⾏Mafft有两个版本的软件,之前对单个⽂件进⾏分析的时候使⽤的Ubuntu版本(毕竟官⽅推荐),但是学习了Biopython包⾥的调⽤⽅法,并且对Ubuntu并不熟悉,所以⼜下了⼀个All-in-on version进⾏琢磨。
Mafft的使⽤:到解压⽂件夹“Mafft-win”,然后打开“mafft.bat”
2. 输⼊“输⼊⽂件”:(不输路径的话默认为同⼀⽂件夹内)
3. 输⼊“输出⽂件”:(给输出⽂件取个名字,不输路径的话默认为同⼀⽂件夹内)
4. 输⼊“输出格式”:(我⼀般选:3. Fasta format / Sorted)
5. 输⼊“⽐对策略”:(我⼀般选:1. --auto)
6. 输⼊“其他参数”:(如果没有直接敲回车)
7. 输⼊“Y”进⾏确认:(其实command命令已经写出来了,但是后⾯还是绕了很⼤的弯)
8. 开始⽐对,结束后的界⾯:
分析:因为使⽤Biopython包没能成功调⽤Mafft,就⼜想到了bat⽂件,然后琢磨了⼤半天以后发现可以start Mafft,却没有办法像上⾯这样⼀步步输⼊命令。然后⽆意间发现Mafft可以⽤单⾏命令,就是图中已经显⽰的command。
思路:于是想到了新的思路:⽤cmd或者Powershell输⼊单⾏命令进⾏单个fasta⽂件的多序列⽐对,再⽤Python做循环。
解决:(为了⽅便看清,⽤的两个空格分割)cmd单⾏命令:
cd C:/Users/Franklin/Mafft-win && mafft -auto test.fasta > test_output.fasta
# 如果输⼊⽂件和输出⽂件不给路径的话默认是“Mafft-win”⽂件夹下,如果给路径的话,路径中的中⽂⽆法识别,另外路径中的空格后的内容会被当做新的参数,所以路径要⽤引号括起来,⽐如:“C:/Users/Franklin/Data Analysis/Input/test.fasta”
2. Python实现循环:
'''Name: Sequence Align with MafftAim: Align the virus sequence in all the fasta filesAuthor: Franklin ZhangDate:
2020/May/21'''
import os
import subprocess
print("\n*** Start: [Sequence Align with Mafft]")
print("*** This program will align the virus sequence in all the fasta files.\n")
# Get the file list
fileList = os.listdir("C:\\Users\\Franklin\\Input")
i = len(fileList)
j = 0
# Align the sequence file by file能运行python的软件
for file in fileList:
j += 1
print("Going to do the alignment:{}[Schedule:{}/{}]".format(file, j, i))
inputFileName = "C:/Users/Franklin/Input/{}".format(file)
inputFileName = '''"{}"'''.format(inputFileName)
outputFileName = "C:/Users/Franklin/Output/" + file[:file.index(".fasta")] + "-align.fasta"
outputFileName = '''"{}"'''.format(outputFileName)
cmd = "cd C:/Users/Franklin/Mafft-win && mafft --auto " + "{}>{}".format(inputFileName, outputFileName)
subprocess.call(cmd, shell=True)
print("*** [newAnalysis_6_alignmentWithMafft] Done.")
总结:程序其实很简单,就是获取Input⽂件夹下所有fasta⽂件,调⽤cmd输⼊命令进⾏⽐对,存到Output⽂件夹内。速度我觉得还⾏,应该也是可以使⽤多线程来做的。总之很⽅便,开始运⾏就丢那
不⽤管了。其实拿到cmd的那句单⾏命令,后⾯做循环就很简单了,有很多⽅法可以做循环,但⽬前只会Python。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论