我正在尝试使用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}"
答案 0 :(得分:1)
替换{input.fastq}
语句中的if
,而不是shell
语句中的input.fastq
。input.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}
"""