챕터 3 - Snakemake가 중복 작업을 줄여줍니다!

{input}{output}으로 파일 이름 반복 피하기

이전 Snakefile을 보면 반복되는 파일 이름이 눈에 띕니다. 특히 compare_genomes 규칙에서 input: 블록에 세 파일 이름이 있고, shell: 블록에도 동일한 파일 이름이 반복됩니다. 또한 compare.matcompare_genomesplot_genomes 양쪽에 여러 번 등장합니다.

{input}{output}을 사용하면 Snakemake에게 파일 이름을 재사용하도록 지시할 수 있습니다. {}는 Snakemake에게 이것이 리터럴 문자열이 아니라 inputoutput의 값으로 치환되어야 하는 템플릿 변수임을 알려줍니다.

직접 해봅시다!

rule sketch_genomes:
    output:
        "GCF_000017325.1.fna.gz.sig",
        "GCF_000020225.1.fna.gz.sig",
        "GCF_000021665.1.fna.gz.sig"
    shell: """
        sourmash sketch dna -p k=31 genomes/*.fna.gz --name-from-first
    """

rule compare_genomes:
    input:
        "GCF_000017325.1.fna.gz.sig",
        "GCF_000020225.1.fna.gz.sig",
        "GCF_000021665.1.fna.gz.sig"
    output:
        "compare.mat"
    shell: """
        sourmash compare {input} -o {output}
    """

rule plot_comparison:
    message: "sourmash로 모든 입력 게놈을 비교합니다"
    input:
        "compare.mat"
    output:
        "compare.mat.matrix.png"
    shell: """
        sourmash plot {input}
    """

이 방식은 입력량을 줄여줄 뿐만 아니라, 파일 이름을 한 곳에서만 수정하면 되도록 만들어 줍니다. 한 곳에서 파일 이름을 추가하거나 변경하면서 다른 곳에서는 놓치는 실수를 방지할 수 있습니다. 저도 과거에 이런 실수를 많이 했습니다!

Snakemake로 워크플로를 쉽게 재실행하기!

최신 데이터 파일과 소프트웨어를 사용하고 있는지 확인하기 위해 처음부터 전체 워크플로를 다시 실행하고 싶을 때가 종종 있습니다. Snakemake는 이것을 쉽게 만들어 줍니다!

Snakemake가 생성 방법을 아는 파일들만 정확히 삭제하도록 요청할 수 있습니다:

snakemake -j 1 plot_comparison --delete-all-output

그런 다음 결과를 다시 생성하도록 요청하면 됩니다:

snakemake -j 1 plot_comparison 

Snakemake가 없는 파일을 만들 수 없을 때 알려줍니다!

compare_genomes에 존재하지 않는 새 파일을 추가한다고 가정해 봅시다:

rule sketch_genomes:
    output:
        "GCF_000017325.1.fna.gz.sig",
        "GCF_000020225.1.fna.gz.sig",
        "GCF_000021665.1.fna.gz.sig"
    shell: """
        sourmash sketch dna -p k=31 genomes/*.fna.gz --name-from-first
    """

rule compare_genomes:
    input:
        "GCF_000017325.1.fna.gz.sig",
        "GCF_000020225.1.fna.gz.sig",
        "GCF_000021665.1.fna.gz.sig",
        "does-not-exist.sig"
    output:
        "compare.mat"
    shell: """
        sourmash compare {input} GCF_000021665.1.sig -o {output}
    """

rule plot_comparison:
    message: "sourmash로 모든 입력 게놈을 비교합니다"
    input:
        "compare.mat"
    output:
        "compare.mat.matrix.png"
    shell: """
        sourmash plot {input}
    """

여기서 does-not-exist.sig는 존재하지 않으며, Snakemake에게 이 파일을 만드는 규칙도 없습니다. Snakemake는 어떻게 반응할까요?

크고 명확하게 오류를 표시합니다! 그것도 아무것도 실행하기 전에 말이죠.

먼저 출력 파일을 강제로 삭제합니다:

rm compare.mat

그런 다음 snakemake -j 1을 실행하면 다음과 같은 메시지를 볼 수 있습니다:

Missing input files for rule compare_genomes:
    output: compare.mat
    affected files:
        does-not-exist.sig

이것이 바로 원하는 것입니다. 워크플로가 실행되기 전에 무엇이 빠져 있는지 명확하게 알 수 있습니다.

다음 단계

기본적인 Snakemake 워크플로를 소개했습니다. 이는 셸 명령을 올바른 순서로 실행하는 간단한 방법을 제공합니다. Snakemake는 직접 명령을 실행하거나 셸 스크립트를 사용하는 것보다 이미 몇 가지 장점이 있습니다:

  • 필요한 파일이 이미 있으면 셸 명령을 실행하지 않습니다.
  • 같은 파일 이름을 반복해서 입력할 필요가 없습니다.
  • 실패 시 간단하고 명확한 오류 메시지를 제공합니다.

이 기능들이 유용하긴 하지만, 생물정보학의 효율성을 개선하기 위해 할 수 있는 것이 훨씬 더 많이 있습니다!

다음 섹션에서는 다음 내용을 살펴보겠습니다:

  • 와일드카드를 사용하여 더 범용적인 규칙 작성하기
  • 더 많은 템플릿을 사용하여 파일 이름 입력 줄이기
  • 기본 출력 파일 목록 제공하기
  • 단일 컴퓨터에서 병렬로 명령 실행하기
  • 스프레드시트에서 파일 이름 목록 불러오기
  • 입력 파일로 워크플로 설정하기