根据输入文件的名称

时间:2018-03-10 21:00:47

标签: snakemake

我正在尝试使用Salmon对齐RNA-seq数据,但是因为我使用各种小鼠品系,所需的基因组指数将取决于小鼠的菌株。我将此信息保存在文件名中,因此我的想法是,如果输入文件具有特定名称,则应使用某个索引,否则应使用另一个索引。

此脚本运行完美并返回我需要的所有文件,但是,它将始终使用 else 语句中的shell命令,并完全忽略 if 语句文件名在技术上是相同的。

我尝试了各种各样的事情并且都没有成功,所以我也想知道最好的方法(不一定是最普遍的,因为这个管道只供我使用)来完成我想要的。

代码:

rule salmon_mapping:
        input:
                fastq="data/raw_data/{sample}.fastq.gz",
                c57_index="/gpfs/data01/glasslab/home/cag104/refs/Mus_musculus/Ensemble/C57/Salmon_Index/",
                aj_index="/gpfs/data01/glasslab/home/cag104/refs/Mus_musculus/Ensemble/AJ/Salmon_Index/"
        log:
                "logs/salmon/{sample}_quant.log"
        params:
                prefix="{sample}"
        output:
                "data/processed_data/{sample}/quant.sf",
                "data/processed_data/{sample}/cmd_info.json"
        run:
                if {input.fastq} == "data/raw_data/mouse_AJ_M_Liver_Hepatocyte_RNA_notx_CG_1_VML_s20180131_GTCCGC.fastq.gz" or {input.fastq} == "data/raw_data/mouse_AJ_M_Liver_Hepatocyte_RNA_notx_CG_2_VML_s20180131_GTGAAA.fastq.gz":
                        shell("salmon quant -p 16 -i {input.aj_index} -l A -r <(gunzip -c {input.fastq}) -o data/processed_data/{wildcards.sample} &> {log}")
                else:
                        shell("salmon quant -p 16 -i {input.c57_index} -l A -r <(gunzip -c {input.fastq}) -o data/processed_data/{wildcards.sample} &> {log}"

2 个答案:

答案 0 :(得分:1)

替换{input.fastq}语句中的if,而不是shell语句中的input.fastqinput.fastq。在您的示例中,{input.fastq}是一个字符串,这是您想要的,而set使它成为一个python [JsonConverter(typeof(JsonSubtypes))] [JsonSubtypes.KnownSubTypeWithProperty(typeof(Dog), "HadWalkToday")] [JsonSubtypes.KnownSubTypeWithProperty(typeof(Cat), "ColorOfWhiskers")] public class Animal { public string Name { get; set; } } public class Dog : Animal { public bool HadWalkToday { get; set; } } public class Cat : Animal { public string ColorOfWhiskers { get; set; } } 对象。

答案 1 :(得分:1)

使用一个函数,根据您的通配符定义规则的输入。

def select_fastq_and_index(wildcards):
    fq = "data/raw_data/{sample}.fastq.gz".format(sample = wildcards["sample"])
    idx = ""
    if wildcards["sample"] in [             
    "mouse_AJ_M_Liver_Hepatocyte_RNA_notx_CG_1_VML_s20180131_GTCCGC",
    "mouse_AJ_M_Liver_Hepatocyte_RNA_notx_CG_2_VML_s20180131_GTGAAA"
        ]:
            idx = foo
    else:
            idx = bar
    return fq, idx

然后重写你的规则:

rule salmon_mapping:
        input:
                select_fastq_and_index
        log:
                "logs/salmon/{sample}_quant.log"
        params:
                prefix="{sample}"
        output:
                "data/processed_data/{sample}/quant.sf",
                "data/processed_data/{sample}/cmd_info.json"
        shell: """
            salmon quant -p 16 -i {input[1]} -l A \
            -r <(gunzip -c {input[0]}) \
            -o data/processed_data/{wildcards.sample} \
            &> {log}
            """