題:
如何修改Snakemake的執行順序?
zhanxw
2020-05-03 19:14:01 UTC
view on stackexchange narkive permalink

我的目標是使用 step1 step2 這兩個規則來處理兩個示例,分別是 S1 S2 Snakemake文件類似於:

  SAMPLES = ['S1','S2']規則全部:輸入:expand(“ {sample} .done”,sample = SAMPLES)規則step1:輸入:“ {sample} .step1”輸出:“ {sample} .step1.done” shell:“ touch {output}”規則step2:輸入:“ {sample} .step1.done”輸出:“ {sample} .done” shell :“ touch {output}”  

當前執行順序是:

  S1上S1上的step1 step2上S2上S1上step2上S2 > 

是否可以將順序更改為:

  S1上的step1 S1上的step1 S2上的S2step2上的step1  

基本上,我想完成 S1 ,然後是 S2 。是否可以在Snakemake中指定執行順序?

二 答案:
dariober
2020-05-05 12:53:14 UTC
view on stackexchange narkive permalink

我認為您應該使用 priority指令優先處理下游規則。

在下面,我將 step2 賦予更高的優先級因此,當第一個示例完成 step1 時,snakemake將對該示例運行step2,而不是將另一個示例提交給step1。

  SAMPLES = ['S1','S2','S3'] wildcard_constraints:sa​​mple ='|'.join([[re.escape(x)for x in SAMPLES]] :輸入:expand(“ {sample} .done”,sample = SAMPLES)規則步驟1:優先級:1輸出:“ {sample} .step1.done” shell:r“”“ sleep 5 touch {output}”“” rule step2:優先級:10輸入:“ {sample} .step1.done”輸出:“ {sample} .done” shell:r“”“ sleep 5觸摸{output}”“”  

(請注意,如果沒有 wildcard_constraints ,則您/此代碼會引發 AmbiguousRuleException

Patrick Magee
2020-05-04 20:24:02 UTC
view on stackexchange narkive permalink

您遇到的問題是,當snakemake確定運行一組規則的順序時,它將首先為所有規則構建一個有向無環圖(DAG)。這顯示了哪些規則相互依賴,以及可以安全地執行它們的順序,而不會破壞下游的依賴關係。

通常,如果要不共享顯式文件依賴關係的任務一個接一個地執行,可以將標記文件用作規則1的輸出,然後將其引用為規則2 中的輸入。

不幸的是,我認為這不會對您有幫助。您將在 SAMPLES 列表上展開並創建一個通配符。在 DAG 中,這將創建兩個相互獨立的相互競爭的執行分支。確保每個樣本依次出現 step1 step2 ,但是在樣本之間沒有保證。

是否存在特定原因,為什麼您需要在 S1 之後運行所有 S2 任務?如果是這樣,那麼最好的選擇是為示例1和示例2創建明確的規則,使用 Flag File 標記 step2 來表示 S1 完成。

在典型的分析中,我們希望看到第一個樣本的一些結果,並確保它是正確的。因此,我希望首先處理S1。感謝您提供標誌文件功能。但是創建它們以確保我的情況下的執行順序似乎很麻煩。
@zhanxw您的需求似乎主要圍繞管道的質量檢查,並確保其產生正確的輸出。我經常必須在運行10或1000樣本之前驗證管道。我發現的最好方法是,不要像您建議的那樣嘗試對管道進行選通,而只需對單個樣本運行一次,然後對所有其餘樣本再次運行即可。
我明白您的意思:一次運行一個樣本。我可以這樣做,但這並不方便,因為我需要編寫另一個腳本來在每個樣本上運行snakemake。我很好奇,如果snakemake已經有了一些解決方案。謝謝。


該問答將自動從英語翻譯而來。原始內容可在stackexchange上找到,我們感謝它分發的cc by-sa 4.0許可。
Loading...