snakemake通配符或expand命令

时间:2017-08-04 13:49:48

标签: snakemake

我想要一个规则来执行正常和肿瘤之间的重新调整。主要问题是我不知道如何管理这个问题。它是通配符还是扩展我的问题的答案?

这是我的样本清单:

conditions:
   pair1:
        tumor: "432"
        normal: "433"

所以规则必须是这样的

rule gatk_RealignerTargetCreator:
    input:
        expand("mapped_reads/merged_samples/{sample}.sorted.dup.reca.bam",sample=config['conditions']['pair1']['tumor']),
        "mapped_reads/merged_samples/{sample}.sorted.dup.reca.bam",sample=config['conditions']['pair1']['normal']),

    output:
        "mapped_reads/merged_samples/{pair1}.realign.intervals"

如何在条件下对所有按键执行此操作? (我想有更多那一对)

我试过这段代码:

 
    input:
        lambda wildcards: config["conditions"][wildcards.condition],
        tumor= expand("mapped_reads/merged_samples/{tumor}.sorted.dup.reca.bam",tumor=config['conditions'][wildcards.condition]['tumor']),
        normal = expand("mapped_reads/merged_samples/{normal}.sorted.dup.reca.bam",normal=config['conditions'][wildcards.condition]['normal']),

    output:
        "mapped_reads/merged_samples/{tumor}/{tumor}_{normal}.realign.intervals"
  

名称'通配符'未定义

...

2 个答案:

答案 0 :(得分:3)

wildcards未在规则输入中“直接”定义。您需要使用function of wildcards代替。我不确定我到底知道你想做什么,但你可以尝试类似的东西。

def condition2tumorsamples(wildcards):
    return expand(
        "mapped_reads/merged_samples/{sample}.sorted.dup.reca.bam",
        sample=config['conditions'][wildcards.condition]['tumor'])

def condition2normalsamples(wildcards):
    return expand(
        "mapped_reads/merged_samples/{sample}.sorted.dup.reca.bam",
        sample=config['conditions'][wildcards.condition]['normal'])

rule gatk_RealignerTargetCreator:
    input:
        tumor = condition2tumorsamples,
        normal = condition2normalsamples,    
    output:
        "mapped_reads/merged_samples/{condition}.realign.intervals"
    # remainder of the rule here...

答案 1 :(得分:0)

免责声明:您想要从YAML文件中读取配对,但是, 我建议不要这样做。我无法弄清楚如何使用YAML格式优雅地完成它。我有一种特殊的方式来配对我的SNP和INDEL注释,但是,有很多锅炉板代码,所以它可以从YAML写它。这没关系,因为YAML变量可能永远不会被编辑,所以在这种情况下,在一个迂腐格式的字符串中的维护不再重要。

我认为您尝试的代码是正确的。 我认为缺少的是能够"请求"你"规则中的正确配对"输入。我个人更喜欢使用Pandas来做到这一点。它列在Python Software Foundation的主页上,因此它是一个很好的选择。

pandas设置非常易于维护,它是单个文件选项卡或空格分隔。最终用户比格式化嵌套YAML文件更容易(如果通过YAML格式设置,我认为需要什么)。这是我在我的系统中这样做的方式。它无限扩展。我承认访问pandas对象有点棘手,但我已经为你提供了代码。只要知道第一层对象('示例[1] [肿瘤]'调用中的[#]),我认为[0]只是正在读取的文件的元数据。我还没有找到它的用途,否则就忽略它。

工作区的树结构

(CentOS5-Compatible) [tboyarski@login3 Test]$ tree
.
|-- [tboyarsk       620 Aug  4 10:57]  Snakefile
|-- [tboyarsk        47 Aug  4 10:52]  config.yaml
|-- [tboyarsk       512 Aug  4 10:57]  output
|   |-- [tboyarsk         0 Aug  4 10:54]  ABC.bam
|   |-- [tboyarsk         0 Aug  4 10:53]  TimNorm.bam
|   |-- [tboyarsk         0 Aug  4 10:53]  TimTum.bam
|   `-- [tboyarsk         0 Aug  4 10:57]  XYZ.bam
`-- [tboyarsk        36 Aug  4 10:49]  sampleFILEpair.txt

sampleFILEpair.txt(证明样本名称可以不相关)

tumor normal
TimTum TimNorm
XYZ ABC

config.yaml

pathDIR: output
sampleFILE: sampleFILEpair.txt

Snakefile

 from pandas import read_table

 configfile: "config.yaml"

 rule all:
     input:
         expand("{pathDIR}/{sample[1][tumor]}_{sample[1][normal]}.bam", pathDIR=config["pathDIR"], sample=read_table(config["sampleFILE"], " ").iterrows())


 rule gatk_RealignerTargetCreator:
     input:
         "{pathGRTC}/{normal}.bam",
         "{pathGRTC}/{tumor}.bam",
     output:
         "{pathGRTC}/{tumor}_{normal}.bam"
 #    wildcard_constraints:
 #        tumor = '[^_|-|\/][0-9a-zA-Z]*',
 #        normal = '[^_|-|\/][0-9a-zA-Z]*'
     run:
         call('touch ' + str(wildcard.tumor) + '_' + str(wildcard.normal) + '.bam', shell=True)

随着通配符的合并,在过去,我发现它是周期性依赖的来源,因此我在合并时也总是包含wildcard_constraints(基本上就是我们正在做的事情)。它们实际上并不是必需的。 "规则全部"不包含任何通配符,并且它正在调用" gatk",所以在这个确切的示例中,没有模糊性的空间,但如果此规则与其他使用通配符的规则连接,通常它可以生成一些时髦的DAG'第