【问题标题】:Iterating Over Strings in Shell Commands Using Snakemake使用 Snakemake 在 Shell 命令中迭代字符串
【发布时间】:2019-12-15 08:06:07
【问题描述】:

为了提供一些背景知识,我正在尝试建立一个管道来分析计算机预测 CRISPR 脱靶的深度测序结果。我在 50 个不同位置从基因组中扩增了一个已知序列,每个扩增子都包含一个预测的脱靶位点,我的原始 CRISPR 指南可能会在该位点结合。 我将两个配对末端 NGS 文件连同扩增子序列和脱靶指南一起输入到 CRISPResso 程序中。 50 个位点中的每一个位点的两个配对末端文件、扩增子序列和 gRNA 都不同。我需要使用多个条件、捐助者和复制品来做到这一点,以便数字快速加起来。

我在下面创建了蛇形工作流程:

configfile: "config.yaml"

singularity:
    "docker://pinellolab/crispresso2"

SAMPLES, =glob_wildcards("data/{sample}_L001_R1_001.fastq.gz")

rule all:
    input:
        expand("outfiles/{sample}", sample=SAMPLES)

rule crispresso_run:
    input:
        R1="data/{sample}_L001_R1_001.fastq.gz",
        R2="data/{sample}_L001_R2_001.fastq.gz"

    params:
        AMP=config['AMP'],
        gRNA=config['gRNA']

    output:
        directory("outfiles/{sample}")

    shell:
        "docker run -v ${{PWD}}:/DATA -w /DATA -i pinellolab/crispresso2 \
            CRISPResso -r1 {input.R1} \
            -r2 {input.R2} \
            -a {params.AMP} \
            -g {params.gRNA} \
            -q 30 -s 30 --min_bp_quality_or_N 30 -w 3 -o {output}"

使用配置文件:

AMP:
  - ATAAAAACCATACACATTCAGTGGGAAACCTTCAGCCATAGAGAAGTATAGGCAGGGTGCAGCTGATTGCTCTGTCTTTGGGCAATTTAGCTTTTAGGCCAGAGGCCACAGATGGGTAGCCTGGTGTGTGCCTAGGGTGTTTTTGTTTGGCTGGCGCAATATTTTTTAAAACTGTAAGTTTATTGCCAGCATTTAA
  -GATGTGCTAGAGATGAGAAAGGATGTGGCAGAAGAAGTACCTATCTCTTGAGGGATGAAGTGGCCTCATTTCACCTACTGAGAGTCAGGAAGTGCCCCATCTGCAGCCTCTGGGCTGGTTGGGGTCAGTCTGCAGATTTTCCTTGCTTTCTCCCATGCCCTTGTCTTTCTCTCCCCTGTAGAGAAAGACACTGATGTTGCTGTTGTTCTAGGAACAGTGGAGACAACTG
gRNA:
  - TTAGGCCAGAGGCCACAGATGGG
  - CCAGCCCAGAGGCTGCAGATGGG

shell 命令中的 -a 和 -g 参数分别是应该放置扩增子和 gRNA 的位置。

当我在配置文件中只有一个扩增子和 gRNA 时,一切正常。但是当我在配置文件中包含两个时,snakemake 只是连接两个扩增子或 gRNA,这会引发错误。我猜我错误地使用了 params 函数,但是找不到任何显示如何以这种方式使用它的东西(即在 shell 命令中迭代字符串)。

另外,为了澄清,配对的末端文件需要以与每个相应的 gRNA 和扩增子对相同的顺序运行,否则 CRISPResso 将引发错误。

我对这一切都很陌生,而且对自己解决问题的了解还不够。任何帮助将不胜感激。

谢谢, 爱德华

【问题讨论】:

    标签: snakemake


    【解决方案1】:

    如果您需要将样本与 AMP 和 gRNA 序列配对,您需要了解哪些样本与哪些样本配对的信息,因此您需要知道哪些样本名称是可能的。

    假设样本被命名为“sample1”和“sample2”,您可以按如下方式更改配置文件(未测试):

    {
        "AMP" : {
            "sample1" : "ATAAAAACCATACACATTCAGTGGGAAACCTTCAGCCATAGAGAAGTATAGGCAGGGTGCAGCTGATTGCTCTGTCTTTGGGCAATTTAGCTTTTAGGCCAGAGGCCACAGATGGGTAGCCTGGTGTGTGCCTAGGGTGTTTTTGTTTGGCTGGCGCAATATTTTTTAAAACTGTAAGTTTATTGCCAGCATTTAA",
            "sample2" : "GATGTGCTAGAGATGAGAAAGGATGTGGCAGAAGAAGTACCTATCTCTTGAGGGATGAAGTGGCCTCATTTCACCTACTGAGAGTCAGGAAGTGCCCCATCTGCAGCCTCTGGGCTGGTTGGGGTCAGTCTGCAGATTTTCCTTGCTTTCTCCCATGCCCTTGTCTTTCTCTCCCCTGTAGAGAAAGACACTGATGTTGCTGTTGTTCTAGGAACAGTGGAGACAACTG"
        },
        "gRNA" : {
            "sample1" : "TTAGGCCAGAGGCCACAGATGGG",
            "sample2" : "CCAGCCCAGAGGCTGCAGATGGG"
        }
    }
    

    您可以通过以下方式修改您的蛇文件以使用此配对信息:

    configfile: "config.yaml"
    
    singularity:
        "docker://pinellolab/crispresso2"
    
    # SAMPLES, =glob_wildcards("data/{sample}_L001_R1_001.fastq.gz")
    SAMPLES = config["AMP"].keys()
    
    rule all:
        input:
            expand("outfiles/{sample}", sample=SAMPLES)
    
    def get_AMP(wildcards):
        return config["AMP"][wildcards.sample]
    
    def get_gRNA(wildcards):
        return config["gRNA"][wildcards.sample]
    
    rule crispresso_run:
        input:
            R1="data/{sample}_L001_R1_001.fastq.gz",
            R2="data/{sample}_L001_R2_001.fastq.gz"
    
        params:
            AMP=get_AMP,
            gRNA=get_gRNA
    
        output:
            directory("outfiles/{sample}")
    
        shell:
            "docker run -v ${{PWD}}:/DATA -w /DATA -i pinellolab/crispresso2 \
                CRISPResso -r1 {input.R1} \
                -r2 {input.R2} \
                -a {params.AMP} \
                -g {params.gRNA} \
                -q 30 -s 30 --min_bp_quality_or_N 30 -w 3 -o {output}"
    

    【讨论】:

      【解决方案2】:

      你显示的配置文件应该在连字符后有一个空格,即:

      AMP:
        - ATAAAAACCATACAC...
        -GATGTGCTAGAG... <- should be "- GATGT..." 
      

      但我想这不是问题。

      AMP 和 gRNA 是列表,因此如果您想使用第一项,请使用 AMP=config['AMP'][0]。 (那么我猜你需要一些逻辑来将 fastq 文件对分配给正确的 AMP 和 gRNA。)

      【讨论】:

      • 感谢您的回答。我认为在空间问题上,我在多次删除和阅读这些序列后变得草率。我可以将示例名称添加到字典中或将它们放在 csv 中,但是有没有办法说列表中所有元素的位置 1:n 并在 shell 命令中循环?
      • @ntrope 如果有更好的答案,请查看我的其他答案。
      • @ntrope 如果您想将这些“AMP”或“gRNA”序列中的每一个与其中一个样本相关联,则将样本名称添加到字典中(并可能在基于wildcards.sample 从字典中提取值的params 部分似乎更好。我可能会误解,但是如果您为一个给定的规则“实例”(即处理一个样本)循环这些序列,您还将获得比您想要的更多的输出。
      • @bli 这是我希望使用的解决方案,但我不确定如何将文件与其各自的 amp 和 gRNA 序列配对。
      • @ntrope 我刚刚提出了一些建议(未经测试,但我使用了类似的方法,所以这个想法应该可行)。
      【解决方案3】:

      您在another answer下方评论了以下内容:

      有没有办法为列表的所有元素表示位置 1:n 并在 shell 命令中循环

      假设我了解您想要做什么,您可以执行以下操作:

      rule crispresso_run:
          input:
              R1="data/{sample}_L001_R1_001.fastq.gz",
              ...
          output:
              ...
          params:
              AMP=config['AMP'],
              gRNA=config['gRNA']
          run:
              for i in range(0, len(params.AMP)):
                  AMP = params.AMP[i]
                  gRNA = params.gRNA[i]
                  shell('/path/to/crispresso2 -a %s -g %s -r1 {input.R1}...' % (AMP, gRNA))
      

      (但我怀疑如果您将通配符分配给 AMP 和 gRNA 并让 snakemake 处理循环,可能会有更好的解决方案)

      【讨论】:

      • 我并没有很好地表达这个问题,但我在想像您提供的方法这样的方法会为每对样本尝试 gRNA 和 AMP 的每个实例,但只有 50 个 gRNA 中的一个并且 AMP 序列对于每对序列文件都是正确的。重申一下,我想知道如何让snakemake将两个字符串列表输入到shell命令中,以便顺序与文件输入相同。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-25
      • 2018-12-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多