snakemake: есть ли способ указать выходной каталог для каждого правила?

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

Теперь я постоянно сталкиваюсь с этой проблемой выходного каталога, поскольку snakemake, похоже, выводит файлы в каталог, где находится Snakefile. Я мог бы изменить все сценарии, чтобы они принимали дополнительный параметр для выходного каталога, но это стало проблемой для изменения многих сценариев. Мне интересно, есть ли способ указать, куда должны идти выходные данные для каждого конкретного правила?


person olala    schedule 02.12.2016    source источник


Ответы (4)


Один из способов взлома - сначала cd в выходной каталог, то есть "cd $ (dirname {output [0]})". Он должен быть первым в ваших командах оболочки.

Сказав это, было бы лучше изменить сценарий, чтобы он принимал выходной каталог в качестве аргумента.

Андреас

person Andreas    schedule 05.12.2016
comment
не мог заставить его работать легко, я думаю, мне придется изменить мои скрипты .. - person olala; 05.12.2016

Вот пример правила, которое я использую в одном из своих файлов-змей:

rule link_raw_data:
    output:
        OPJ(data_dir, "{lib}_{rep}.fastq.gz"),
    params:
        directory = data_dir,
        shell_command = lib2data,
    message:
        "Making link to raw data {output}."
    shell:
        """
        (
        cd {params.directory}
        {params.shell_command}
        )
        """

Это, вероятно, немного отличается от вашей ситуации, но, надеюсь, некоторые из методов могут помочь. В частности, обратите внимание на круглые скобки в разделе shell и использование раздела params для определения каталога вывода.

Я не уверен, что делаю это самым элегантным способом, но это работает.

data_dir - это параметр, считываемый из файла конфигурации.

lib2data - это функция, которая генерирует команды на основе значений некоторых подстановочных знаков. Конечно, я должен убедиться, что эти команды используют правильные пути к входным файлам (и, в этом случае, также и вывод, согласованный с тем, что говорится в разделе output). В вашем случае возможно, что у вас будут просто «жестко запрограммированные» команды оболочки, возможно, с использованием некоторых входных данных правила.

Более упрощенный пример

rule run_script1:
    input:
        path/to/initial/input
    output:
        script1_out/output1
    shell:
        """"
        cd script1_out
        script1 {input}
        """"

rule run_script2:
    input:
        script1/output1
    output:
        script2/output2
    shell:
        """
        cd script2_out
        script2 {input}
        """

Начиная с этих примеров, при необходимости вы можете использовать функции подстановочных знаков во вводе или выводе.

person bli    schedule 06.12.2016
comment
спасибо, мне интересно, что означают круглые скобки в разделе оболочки? - person olala; 07.12.2016
comment
На самом деле я понимаю, что в данном контексте круглые скобки бесполезны, потому что после них нет других команд. Команды после закрывающей круглой скобки будут располагаться в рабочем каталоге, как и перед cd. - person bli; 07.12.2016
comment
вы имеете в виду, что круглые скобки группируют команды внутри в один блок, и они будут выполняться вместе и, следовательно, в каталоге params.directory? вне скобок другие команды работают в рабочем каталоге? - person olala; 08.12.2016
comment
Да, вот как они могут быть полезны, но мой пример в этом отношении не актуален. - person bli; 08.12.2016

В документации snakemake:

"Все пути в файле snakefile интерпретируются относительно каталога, в котором выполняется snakemake. Это поведение можно изменить, указав рабочий каталог в файле snakefile:"

workdir: "path/to/workdir"

Так что просто поместите это в начало вашего файла змеи, и все входные и выходные данные будут интерпретироваться относительно этого пути.

person Eric C.    schedule 06.12.2016
comment
да, я понимаю это, но это не решает вопрос, который я задаю ... - person olala; 07.12.2016

Вы можете попробовать использовать файл конфигурации либо в YAML, либо в JSON. Затем используйте каталог в качестве параметра в расширении или при вводе / выводе ваших правил.

См. Документацию здесь

person rioualen    schedule 03.12.2016
comment
Я не думаю, что это сработает, так как мне все еще нужно передать параметр в скрипт, а мой скрипт еще не принимает этот параметр - person olala; 04.12.2016
comment
Вы можете использовать параметр в разделе shell, как в моем ответе: stackoverflow.com/a/40998525/1878788. - person bli; 08.12.2016