前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >​宏转录组学习笔记(三)--通过脚本和snakemake实现自动化

​宏转录组学习笔记(三)--通过脚本和snakemake实现自动化

作者头像
用户1075469
发布2020-03-31 15:17:47
1.6K0
发布2020-03-31 15:17:47
举报
文章被收录于专栏:科技记者科技记者

还是接上次的教程翻译,宏转录组学习笔记(二)宏转录组学习笔记(一)

通过脚本和snakemake实现自动化

到目前为止,我们已经完成了所有工作,并复制并粘贴了许多命令来完成所需的操作。这可行!但是也可能很耗时,并且更容易出错。接下来,我们将向你展示如何将所有这些命令放入Shell脚本中。

一个「shell脚本」是一个文本文件的完整的shell命令,运行时就如同你在命令行交互方式运行它们。

在这里,我们将创建一个从中获取并一次运行它们全部的命令。

编写shell脚本

让我们将质量控制过程中的所有命令放入一个脚本中。

我们称之为run_qc.sh。该sh在的结尾告诉你,这是一个bash脚本。

使用nano(编辑器)编辑文件run-qc.sh,并将以下内容放在其中:

代码语言:javascript
复制
cd ${PROJECT}
mkdir -p quality
cd quality

ln -s ../data/*.fq.gz ./

printf "I see $(ls -1 *.fq.gz | wc -l) files here.\n"

fastqc *.fq.gz -t 4

multiqc .

现在,这是一个shell脚本,您可以使用一个命令来执行所有这些命令的去-试试跑下吧!:

代码语言:javascript
复制
cd ~/
bash run-qc.sh

重新运行shell脚本

假设您想重新运行脚本。你要怎么做?

好吧,请注意,quality目录是在脚本开始创建的,所有内容都在该目录中执行。因此,要像这样删除quality目录,

代码语言:javascript
复制
rm -fr quality

然后你可以运行

代码语言:javascript
复制
bash run-qc.sh

编写Shell脚本的一些技巧

1.使它可执行

您可以bash通过一些magic来摆脱上面的命令部分:

代码语言:javascript
复制
#! /bin/bash

放在文件顶部,然后运行

代码语言:javascript
复制
chmod +x ~/run-qc.sh

您现在可以运行

代码语言:javascript
复制
./run-qc.sh

代替bash run-rnaseq.sh

您可能会想,好吧,为什么这很重要?好的,您可以对R脚本和Python脚本执行相同的操作(但是放在/usr/bin/env Rscript/usr/bin/env python放在顶部,而不是/bin/bash)。这基本上用脚本的编写语言来注释脚本,因此您不必自己了解或记住。

所以:这不是必须的,但这是一个很好的技巧。

您也可以始终通过指定或来强制脚本以特定语言运行。bash ``Rscript

2.另一个很好的补充:使它很好地报错

Shell脚本的一个怪异的方面是(默认情况下)即使有错误,它们也可以继续运行。这是不好的行为,我们应该将其关闭。

您可以通过重新运行上面的脚本而不删除目录来观察此行为rnaseq/-该mkdir命令将打印错误,因为目录仍然存在,但是每个shell脚本的一个很好的补充就是使它在第一个错误时失败。通过放

代码语言:javascript
复制
set -e

在顶部-告诉bash在第一个错误时退出,而不是勇敢地继续前进。

3.最后一个不错的补充:使shell脚本打印出它们正在运行的命令!

你可能会注意到,shell脚本为您提供了它的运行命令的输出,但不告诉你的运行命令。

如果添加

代码语言:javascript
复制
set -x

在Shell脚本的顶部,然后重新运行它,

代码语言:javascript
复制
cd ~/
rm -fr quality
./run-qc.sh

然后您将看到正在运行的全部命令!

关于shell脚本的最后说明:

set -e并且set -x仅在shell脚本中起作用-它们是bash命令。您需要在Python和R中使用其他方法。

Snakemake自动化!

通过shell脚本实现自动化非常棒,但是这里存在一些问题。

首先,您必须每次都运行整个工作流程,并且每次都要重新计算所有内容。如果您运行的工作流需要4天,并且在最后更改了命令,则必须手动进入,然后运行依赖于已更改命令的内容。

其次,它是非常明确的,并且不是很通用。如果要在其他RNAseq数据集上运行,则必须更改许多命令。

snakemake是帮助解决这些问题的几种工作流程系统之一。(您可以在此处阅读文档。)[1]让我们看一下!

首先,让我们激活我们的snakemake环境

代码语言:javascript
复制
source deactivate
source activate snake

我们将自动化相同的脚本进行修剪,但是使用snakemake。

代码语言:javascript
复制
rule all:
    input:
        "trim/TARA_135_SRF_5-20_rep1_1m_1.qc.fq.gz",
        "trim/TARA_135_SRF_5-20_rep1_1m_2.qc.fq.gz"

rule trim_reads:
    input:
        r1="data/TARA_135_SRF_5-20_rep1_1m_1.fq.gz",
        r2="data/TARA_135_SRF_5-20_rep1_1m_2.fq.gz",
        adapters="trim/combined.fa"
    ouput:
        p1="trim/TARA_135_SRF_5-20_rep1_1m_1.qc.fq.gz",
        p2="trim/TARA_135_SRF_5-20_rep1_1m_2.qc.fq.gz",
        s1="trim/TARA_135_SRF_5-20_rep1_1m_1_s1.qc.fq.gz",
        s2="trim/TARA_135_SRF_5-20_rep1_1m_2_s2.qc.fq.gz"
    shell:'''
    trimmomatic PE {input.r1} \
              {input.r2} \
     {output.p1} {output.s1} \
     {output.p2} {output.s2} \
     ILLUMINACLIP:{input.adapters}:2:40:15 \
     LEADING:2 TRAILING:2 \
     SLIDINGWINDOW:4:2 \
     MINLEN:25
    '''

现在我们可以运行

代码语言:javascript
复制
cd $PROJECT
snakemake

您应该看到“什么都没做”。那是因为修剪的文件已经存在!让我们修复一下:

代码语言:javascript
复制
rm trim/TARA_135_SRF_5-20_rep1*

现在,当您运行时snakemake,您应该看到正在运行Trimmomatic。是的!然后,如果snakemake再次运行,您将发现它不需要执行任何操作-所有文件都是“最新的”。

添加环境

在整个研讨会中,我们一直在使用conda环境。我们展示了您必须使用来在Bioconda课程中导出塔拉环境 conda env export -n tara -f $PROJECT/tara_conda_environment.yaml我们也可以在snakemake规则中使用此环境!

代码语言:javascript
复制
rule all:
    input:
        "trim/TARA_135_SRF_5-20_rep1_1m_1.qc.fq.gz",
        "trim/TARA_135_SRF_5-20_rep1_1m_2.qc.fq.gz"

rule trim_reads:
    input:
        r1="data/TARA_135_SRF_5-20_rep1_1m_1.fq.gz",
        r2="data/TARA_135_SRF_5-20_rep1_1m_2.fq.gz",
        adapters="trim/combined.fa"
    ouput:
        p1="trim/TARA_135_SRF_5-20_rep1_1m_1.qc.fq.gz",
        p2="trim/TARA_135_SRF_5-20_rep1_1m_2.qc.fq.gz",
        s1="trim/TARA_135_SRF_5-20_rep1_1m_1_s1.qc.fq.gz",
        s2="trim/TARA_135_SRF_5-20_rep1_1m_2_s2.qc.fq.gz"
    conda: "tara_conda_environment.yaml"
    shell:'''
    trimmomatic PE {input.r1} \
              {input.r2} \
     {output.p1} {output.s1} \
     {output.p2} {output.s2} \
     ILLUMINACLIP:{input.adapters}:2:40:15 \
     LEADING:2 TRAILING:2 \
     SLIDINGWINDOW:4:2 \
     MINLEN:25
     '''

我们现在不打算在集群上运行它,因为它要求您能够下载内容,而我们不能执行此操作。但是,这是将来执行此操作的语法。

其他资源

今天,我们已经介绍了snakemake的一些基础知识,但是,如果您需要其他教程,可以在这里[2]添加一个。

Reference

[1]https://snakemake.readthedocs.io/en/stable/

[2]https://ngs-docs.github.io/2018-cicese-metatranscriptomics/automation/

(教程结束!)

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-03-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 科技记者 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 还是接上次的教程翻译,宏转录组学习笔记(二)和宏转录组学习笔记(一)。
  • 通过脚本和snakemake实现自动化
  • 编写shell脚本
    • 重新运行shell脚本
      • 编写Shell脚本的一些技巧
        • 1.使它可执行
        • 2.另一个很好的补充:使它很好地报错
        • 3.最后一个不错的补充:使shell脚本打印出它们正在运行的命令!
        • 关于shell脚本的最后说明:
    • Snakemake自动化!
      • 添加环境
        • 其他资源
          • Reference
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档