챕터 2 - Snakemake가 규칙을 연결해 줍니다!

input: 블록으로 규칙 연결하기

Snakemake에게 규칙이 필요로 하는 입력 파일 정보를 알려주면, 규칙들을 자동으로 연결할 수 있습니다. 어떤 규칙을 실행해달라고 요청하면, Snakemake는 그 규칙에 필요한 입력 파일을 어느 규칙이 만들어내는지 자동으로 파악하고 순서에 맞게 실행해 줍니다.

plot_comparisoncompare_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"
    output:
        "compare.mat"
    shell: """
        sourmash compare GCF_000021665.1.fna.gz.sig \
            GCF_000017325.1.fna.gz.sig GCF_000020225.1.fna.gz.sig \
            -o compare.mat
    """

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

이제 마지막 규칙만 실행하도록 요청하면 됩니다:

snakemake -j 1 plot_comparison

그러면 Snakemake는 필요한 입력 파일이 없는 경우에만 앞선 규칙들을 자동으로 실행합니다.

잠깐 한 걸음 물러서서 생각해보기

Snakefile이 많이 길어졌지만, 그렇다고 지나치게 복잡해진 것은 아닙니다. 핵심은 셸 명령어들을 개별 규칙 블록으로 분리하고, 각 규칙이 어떤 파일을 만들어내는지(output)와 어떤 파일이 필요한지(input)를 명시적으로 적어준 것입니다.

이렇게 하면 불필요한 명령 재실행을 피할 수 있습니다. 현재 워크플로에서는 sourmash가 빠르기 때문에 큰 차이가 없지만, 각 단계가 1시간씩 걸리는 작업이라면, 불필요한 단계 건너뛰기가 작업 시간을 크게 단축시켜 줍니다!

또한 뒤에서 배우겠지만, 이렇게 분리된 규칙들은 재사용 가능한 빌딩 블록이 되어 서로 다른 파일을 생성하는 다양한 워크플로에 통합할 수 있습니다. 그것이 셸 명령어를 개별 규칙으로 분리해야 하는 또 다른 좋은 이유입니다!