Linux下实现 psi"/>
Linux下实现 psi
0. 说明:
在 Linux 通过 Python 的多进程模块实现 psi-blast 的并行,批量生成 pssm 文件。
1. 代码:
import subprocess
import multiprocessing
import time
import osdef runPsiBlast(args):queryFile, dbFile, outFile = args[0], args[1], args[2]cmd = f"./psiblast -query {queryFile} -db {dbFile} -out_ascii_pssm {outFile} -num_iterations 3 -evalue 0.001"subprocess.run(cmd, shell=True)def main(queryPath, outPath, dbFile, cpu):"""queryPath: query fasta文件所在的绝对路径;outPath: 生成的 pssm 文件所在的绝对路径;dbFile: 库文件(需要绝对路径);cpu: 并行所需的 cpu 数目;"""queryFileList = [x.split(".")[0] for x in os.listdir(queryPath) if x.endswith(".fasta")] ## 全部的目标fasta文件alreadyFileList = [x.split(".")[0] for x in os.listdir(outPath) if x.endswith(".pssm")] ## 输出目录中已经存在的pssm结果文件(主要是如果程序中止,后续可以接着将没有pssm结果的fasta继续进行psiblast比对,不需要全部重新运行)needFileList = list(set(queryFileList) - set(alreadyFileList))print("全部的fasta文件的总数: %s\t已经有pssm结果的文件数目: %s\t还需要生成pssm的fasta文件的数目: %s" % (len(queryFileList), len(alreadyFileList), len(needFileList))) ## 全部的,已完成的,未完成的needFileList.sort()queryFastaList = [queryPath+x+".fasta" for x in needFileList]outPSSMList = [outPath+x+".pssm" for x in needFileList]dbFileList = [dbFile,]*len(queryFastaList)## 多进程pool = multiprocessing.Pool(processes=int(cpu))pool.map(runPsiBlast, list(zip(queryFastaList, dbFileList, outPSSMList)))pool.close()pool.join()if __name__ == "__main__":print("开始时间: ",time.ctime())queryPath = "/home/zzy/QueryFastaFiles/" ## fasta 文件所在目录outPath = "/home/zzy/ResPSSMFiles/" ## 输出的 pssm 文件所在目录dbFile = "/home/zzy/Uniref90/uniref90.fasta" ## 库文件所在目录main(queryPath=queryPath,outPath=outPath,dbFile=dbFile,cpu=4) ## 默认4个cpuprint("结束时间: ",time.ctime())
更多推荐
Linux下实现 psi
发布评论