Skip to content

多进程运行生信分析流程的一个python类

Notifications You must be signed in to change notification settings

worker000000/bio_pipeline

Repository files navigation

多进程运行生信分析流程的一个python类

示范

请见 demo1.pydemo2.py两个文件 其中demo1.py文件根据GATK4.0和全基因组数据分析实践(上)内容, 用了gatk3和picard,直接可以用

python demo1.py -t0 运行 你可以在 demo/output文件夹下找到记录文件和结果

demo2.py为肿瘤样本外显子mutect2分析的部分代码,需要安装bwa, samtools

场景

我的docker平台上, 即是以这个类为基础,在网页端直接不用nohup启动分析流程,不需要时刻去往脚本里扔参数,会自动记录log,写入运行时间和步骤。

起因

自从配了一个新服务器,就有这样一个问题, 怎么样把机器高效地跑WES/WGS的pipeline。 大家可能看到过很多用perl,shell跑pipeline的示范脚本。但是,一般来说示范脚本都是用一两个样本进行演示,而在实际工作中, 常碰到要处理几十上百样本的情况,本人碰到过的情况是300多例. 在硬件不是计算瓶颈的情况下,需要充分地使用cpu/memory出运算结果用于分析.对于多个样本,多进程并行同时运算是容易想到的方法 perl本人一直不是很喜欢,shell 脚本多进程方法不直观,因此 我用python的multiprocessing里的Pool进程池技术实现了多个样本并行跑, 后来又加入了流程控制,过程记录,内存/CPU分配等功能。

思路

  1. 对于一组数据构建一个pipelinepipleine的一个环节为一个procedure, 如bwasamtools, 把所有的procedure在读入fq.gz文件时,都先计划好 ,然后依次执行。
  2. 用了python里的OrderedDict作为这个计划的主体,以procedurekey,value为运算命令cmd, 计算结果target, 记录文件log
  3. 同时,用了一个csv文件作为记录下已跑流程结果和运算时间,在因为某些原因需要中断,重启后不需要从头再跑,直接运行原命令即可.
  4. 为了调试运行,有一个参数test,默认为1,在此状态下只输出运行代码而不实际运行

使用

wes为例,一个样本可能有bwa_memsamtools sort,markdup,merge,bqsr,applybqsr,haplotypecaller等步骤

  1. 记录文件是否test等初始化Pipeline类pipeline,并用本脚本里提供的函数获取系统cpumemory
  2. 遍历文件夹,读取需要进行vcf call的样本,获得ID,在脚本内形成相应的运行cmd, 和target, log, run_sync等一起append到pipeline里
  3. 最终,run_pipeline
  4. 请仔细观察两个demo文件学习

TODO

  1. 在代码运行过程中,能按ctrl+c结束所有命令。现在能在docker里可以用重启container的方式强制结束所有进程,
  2. 解决好诸如要全部样本先算好,再统计所有样本的分布的多对一依赖问题,在demo2里,只能先把不需要的代码注释掉,等全部基因步骤跑完后再跑后续流程
  3. 能像WDL snakemake一样, 模板化运行脚本,现在用纯python写代码量明显多于perl和shell
  4. 利用消息队列,中心化/分布式运行

About

多进程运行生信分析流程的一个python类

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages