1

Snakemakeを理解するために、従来の Makefile の例と Snakemake を比較したいと思います。前提条件の教育的な例で作成するための優れた紹介ページがあります。

# source: http://www.jfranken.de/homepages/johannes/vortraege/make_inhalt.en.html

# Declaration of a variable
clothes = coat shoes mobile sweater socks\
        trousers shirt pants undershirt

all: $(clothes)

# An explicit rule assigns the commands for several targets
$(clothes):
    @echo put on $@; touch $@

# Implicit rules state the prerequisites
coat:      shoes mobile sweater
shoes:     socks trousers
mobile:    trousers
sweater:   shirt
trousers:  pants shirt
shirt:     undershirt

# Additional feature
.PHONY: naked
naked:      ; @-rm $(clothes)

これを Snakemake ファイルに変換しようとしました。この投稿の最後を参照してください。touch動作しますが、記事ごとにコマンドを繰り返す必要があります。明示的ルールと暗黙的ルールを (ワイルドカードを使用して) 区別することで、make のアプローチをコピーしようとしましたが、成功しませんでした。現在の方法よりもエレガントな方法はありますか?

# Snakemake version of http://www.jfranken.de/homepages/johannes/vortraege/make_inhalt.en.html#ToC6

CLOTHES = ["coat", "shoes", "mobile", "sweater", "socks", "trousers", "shirt", "pants", "undershirt"]

rule all:
    input: CLOTHES

rule coat:
    input: "shoes", "mobile", "sweater"
    output: "coat"
    shell: "touch coat"

rule shoes:
    input: "socks", "trousers"
    output: "shoes"
    shell: "touch shoes"

rule mobile:
    input: "trousers"
    output: "mobile"
    shell: "touch mobile"

rule sweater:
    input: "shirt"
    output: "sweater"
    shell: "touch sweater"

rule trousers:
    input: "pants", "shirt"
    output: "trousers"
    shell: "touch trousers"

rule shirt:
    input: "undershirt"
    output: "shirt"
    shell: "touch shirt"

rule undershirt:
    output: "undershirt"
    shell: "touch undershirt"

rule pants:
    output: "pants"
    shell: "touch pants"

rule socks:
    output: "socks"
    shell: "touch socks"


### Additional feature

rule naked:
    run:
        for ds in CLOTHES:
            shell("rm -f {}".format(ds)) 
4

1 に答える 1

2

Snakemake では、さまざまな依存関係に対して入力関数と構成ファイルを使用します。たとえば、次のようになります。

configfile: "config.yaml"


def get_prereqs(wildcards):
    """Lookup prerequisites in config file."""
    # return prereqs as list of strings
    return config["clothes"][wildcards.type]


# target rule for creating all desired files
rule all:
    input:
        config["clothes"]


rule clothes:
    input:
        # refer to function that will be called with the inferred wildcards as single argument
        get_prereqs
    output:
        # in general, rule output should be more specific than in this example
        "{type}"
    shell:
        "touch {output}"

そして config.yaml:

clothes:
  coat:
    - shoes
    - mobile
    - sweater
  shoes:
    - socks
    - trousers
  mobile:
    - trousers
  sweater:
    - shirt
  trousers:
    - pants
    - shirt
  shirt:
    - undershirt
  pants: []
  undershirt: []
  socks: []
于 2016-11-14T09:11:08.557 に答える