명령줄에서 규칙 실행 및 대상 선택

Snakemake에서 대상을 지정하는 방식은 간단하지만, 세부 사항에 들어가면 꽤 복잡해질 수 있습니다.

기본 대상(Default targets)

아무런 인자 없이 snakemake -j 1을 실행하면, Snakemake는 파일에서 처음 만나는 규칙을 실행합니다.

일반적인 사용 방식은 Snakefile의 맨 위에 다음과 같은 all 규칙을 제공하는 것입니다.

rule all:
    input:
        ...

보통 이 규칙은 하나 이상의 입력 파일을 포함하며, 다른 블록(shell이나 output)은 가지지 않습니다. 예를 들어 챕터 11의 기본 규칙이 그러합니다.

이렇게 하는 이유는 출력이나 셸 명령이 없는 규칙의 경우, Snakemake가 해당 규칙의 전제 조건(즉, 입력 파일 생성)을 만족시키기 위해 작동하기 때문입니다. 이것이 기본 규칙에 필요한 전부입니다.

따라서 종종 all이라고 이름 붙이는 기본 규칙은 워크플로가 생성해야 할 모든 “기본” 출력 파일 목록을 담은 단일 입력 블록으로 구성되어야 합니다.

구체적 대상: 규칙 이름 vs 파일 이름 사용하기

Snakemake는 명령줄에서 규칙 이름이나 파일 이름, 또는 이 둘의 조합을 기꺼이 받아들입니다. 실행 순서를 특정하게 보장하지는 않지만, 일반적으로 명령줄에 지정된 순서대로 실행하려고 시도합니다.

예를 들어, 챕터 11의 Snakefile에서 snakemake -j 1 compare_genomes를 실행하면 compare_genomes 규칙만 실행할 수 있습니다. 또는 plot_comparison을 추가하여 두 규칙을 모두 실행할 수도 있고, 그냥 plot_comparison만 실행해도 됩니다. plot_comparisoncompare_genomes의 출력에 의존하기 때문에 어차피 compare_genomes가 실행될 것이기 때문입니다.

파일 이름을 사용하여 와일드카드 대상 실행하기

와일드카드가 포함된 규칙은 규칙 이름으로 실행할 수 없습니다. Snakemake가 와일드카드를 채우기에 충분한 정보를 가지고 있지 않기 때문입니다.

따라서 snakemake -j 1 sketch_genomes와 같은 실행은 불가능합니다. 해당 규칙은 와일드카드를 포함하고 있으며, Snakemake가 {accession} 와일드카드를 채우기에는 규칙 이름만으로는 부족하기 때문입니다.

하지만 파일 이름을 사용하여 와일드카드 대상을 실행할 수 있습니다! 만약 snakemake -j 1 GCF_000017325.1.fna.gz.sig를 실행한다면, Snakemake는 해당 형식의 출력 파일을 생성하는 규칙(이 경우 sketch_genome 규칙)을 찾아 지정된 출력 파일 이름으로부터 와일드카드를 채워 실행할 것입니다.

정리하자면, Snakemake는 와일드카드가 없는 한 규칙 이름으로 규칙을 실행할 수 있고, 지정된 파일을 생성하는 데 필요한 규칙을 (와일드카드를 포함하더라도) 찾아서 실행할 수 있습니다.

여러 구체적 대상으로 워크플로 구성하기

특정 파일 세트를 빌드하는 여러 구체적인 대상 이름을 제공할 수 있습니다. 이는 워크플로를 구축하거나 디버깅할 때 유용합니다.

다시 챕터 11의 Snakefile을 생각해 봅시다. sourmash compare를 실행하는 규칙과 결과 플롯을 생성하는 규칙은 있지만, 서명(signature) 파일만 생성하는 규칙은 없습니다.

이러한 규칙은 쉽게 추가할 수 있습니다. all 규칙 아래 어딘가에 다음과 같이 추가하면 됩니다.

rule build_sketches:
    input:
        expand("{acc}.fna.gz.sig", acc=ACCESSIONS)

이제 snakemake -j 1 build_sketches를 실행하면 다른 작업은 하지 않고 네 개의 .sig 파일만 생성됩니다.

이것과 compare_genomes 규칙의 차이점은 compare_genomessourmash compare까지 실행한다는 점입니다.

Snakefile 구조화에 대한 조언

  • 기본 규칙(default rule)을 제공하세요.
  • 이름이 잘 지어진 하나 이상의 구체적인 규칙을 제공하세요.
  • 다른 사람들(미래의 당신 포함)이 문서 없이도 당신의 파일 구조나 규칙 이름을 기억할 것이라고 기대하지 마세요. ;)

관련 링크