Snakemake несколько входных файлов с расширением, но без повторений - PullRequest
0 голосов
/ 05 марта 2020

Я новичок в Snakemake и не знаю, как решить эту проблему.

У меня есть правило, которое имеет два входа:

rule test
    input_file1=f1
    input_file2=f2

f1 is в [A {1} $, A {2} £, B {1} €, B {2} ¥]

f2 в [C {1}, C {2}]

Числа являются символами подстановки, полученными при расширенном вызове. Мне нужно найти способ передать в файл f1 и f2 пару файлов, точно совпадающих с номером. Например:

f1 = A1

f2 = C1

или

f1 = B1

f2 = C1

Я должен избегать комбинаций, таких как:

f1 = A1

f2 = C2

Я бы создал функцию, которая делает этот вид совпадения между файлами, но одно и то же должно одновременно управлять input_file1 и input_file2. Я подумал сделать функцию, которая создает словарь с различными допустимыми комбинациями, но как бы я «перебрал» его во время раскрытия?

Спасибо

1 Ответ

1 голос
/ 05 марта 2020

Предполагая, что правило test дает в выходной файл с именем {f1}.{f2}.txt, вам нужен механизм, который правильно соединяет пары f1 и f2 и создает список файлов {f1}.{f2}.txt.

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

Вот очень простой пример:

fin1 = ['A1$', 'A2£', 'B1€', 'B2¥']
fin2 = ['C1', 'C2']

outfiles = []
for x in fin1:
    for y in fin2:
        ## Here you pair f1 and f2. This is a very trivial way of doing it:
        if y[1] in x:
            outfiles.append('%s.%s.txt' % (x, y))

wildcard_constraints:
    f1 = '|'.join([re.escape(x) for x in fin1]),
    f2 = '|'.join([re.escape(x) for x in fin2]),

rule all:
    input:
        outfiles,        

rule test: 
    input:
        input_f1 = '{f1}.txt',
        input_f2 = '{f2}.txt',
    output:
        '{f1}.{f2}.txt',
    shell:
        r"""
        cat {input} > {output}
        """

Этот конвейер будет выполнять следующие команды

cat A2£.txt C2.txt > A2£.C2.txt
cat A1$.txt C1.txt > A1$.C1.txt
cat B1€.txt C1.txt > B1€.C1.txt
cat B2¥.txt C2.txt > B2¥.C2.txt

Если вы коснетесь начальных входных файлов с помощью touch 'A1$.txt' 'A2£.txt' 'B1€.txt' 'B2¥.txt' 'C1.txt' 'C2.txt', вам следует быть в состоянии запустить этот пример.

...