Используйте разные команды оболочки в зависимости от имени входного файла

Я пытаюсь выровнять данные RNA-seq с помощью Salmon, однако, поскольку я работаю с различными линиями мышей, требуемый индекс генома будет зависеть от линии мыши. Я сохраняю эту информацию в имени файла, поэтому идея состоит в том, что если входной файл имеет определенное имя, то следует использовать определенный индекс, в противном случае следует использовать другой индекс.

Этот сценарий отлично работает и возвращает все файлы, которые мне нужны, однако он всегда будет использовать команду оболочки в операторе else и полностью игнорирует оператор 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}"

person dddxxx    schedule 10.03.2018    source источник


Ответы (2)


Замените {input.fastq} в операторе if, но не в операторе shell, на input.fastq. В вашем примере input.fastq - это строка, которую вы хотите, тогда как {input.fastq} делает ее объектом set python.

person Manavalan Gajapathy    schedule 10.03.2018
comment
Позвольте мне пойти и попробовать. Я где-то читал о том, что {} выводится как установленный объект, и ранее пытался выполнить str ({input.fastq}) в качестве обходного пути, но это не сработало. К сожалению, документация об этом не очень ясна. Отчитаюсь и поставлю вам галочку! Спасибо! - person dddxxx; 11.03.2018
comment
Я бы использовал объект подстановочного знака вместо объекта ввода if wildcards.sample == "mouse_AJ_M_Liver_Hepatocyte_RNA_notx_CG_1_VML_s20180131_GTCCGC" or ... - person Eric C.; 12.03.2018

Используйте функцию, которая определяет входные данные для вашего правила на основе ваших подстановочных знаков.

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
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}
            """
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}
            """
person Russ Hyde    schedule 12.03.2018