Domanda:
Come modificare gli ordini di esecuzione per Snakemake?
zhanxw
2020-05-03 19:14:01 UTC
view on stackexchange narkive permalink

Il mio obiettivo è elaborare due campioni, S1 e S2 , utilizzando due regole, step1 , step2 .Il file Snakemake è simile a:

  SAMPLES = ['S1', 'S2'] regola tutto: input: expand ("{sample} .done", sample = SAMPLES) rule step1: input: "{sample}" output: "{sample} .step1.done" shell: "touch {output}" regola passaggio2: input: "{sample} .step1.done" output: "{sample} .done" shell : "touch {output}"  

L'ordine di esecuzione corrente è:

  step1 su S1step1 su S2step2 su S1step2 su S2  

Esiste un modo per modificare l'ordine in:

  step1 su S1step2 su S1step1 su S2step2 su S2  

Fondamentalmente, voglio completare S1 , quindi S2 . C'è un modo per specificare l'ordine delle esecuzioni in Snakemake?

Due risposte:
dariober
2020-05-05 12:53:14 UTC
view on stackexchange narkive permalink

Penso che dovresti usare la direttiva priorità per dare la precedenza alle regole a valle.

Qui di seguito dò maggiore priorità a passaggio2 quindi, quando il primo campione ha completato step1 , snakemake eseguirà il passaggio 2 su quel campione anziché inviare un altro campione al passaggio1.

  SAMPLES = ['S1', 'S2', 'S3'] wildcard_constraints: sample = '|' .join ([re.escape (x) for x in SAMPLES]) regola tutti : input: expand ("{sample} .done", sample = SAMPLES) regola passo1: priorità: 1 output: regola "{sample} .step1.done" shell: r "" "sleep 5 touch {output}" "" step2: priorità: 10 input: "{sample} .step1.done" output: "{sample} .done" shell: r "" "sleep 5 touch {output}" ""  

(Nota che senza wildcard_constraints il tuo / questo codice genera AmbiguousRuleException )

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

Il problema che stai riscontrando è che quando snakemake determina l'ordine di esecuzione di un insieme di regole crea prima un Grafico aciclico diretto (DAG) di tutte le regole. Ciò mostra quali regole dipendono l'una dall'altra e in quale ordine possono essere eseguite in sicurezza, senza interrompere le dipendenze a valle.

In generale, se vuoi che le attività vengano eseguite una dopo l'altra che non condividono un'esplicita dipendenza da file, puoi usare un file flag come uscita per regola 1 quindi fai riferimento a esso come input nella regola 2 .

Sfortunatamente, non credo che questo ti aiuterà nel tuo caso. Stai espandendo l'elenco SAMPLES e stai creando un carattere jolly. nel DAG questo crea due rami di esecuzione completamente separati che non hanno dipendenze l'uno con l'altro. È garantito che passaggio1 e passaggio2 avvengano in ordine per ogni campione, tuttavia non ci sono garanzie tra i campioni.

C'è un motivo specifico per cui è necessario che tutte le attività S2 vengano eseguite dopo S1 ? In tal caso, la soluzione migliore sarebbe creare regole esplicite per il campione 1 e il campione 2, utilizzando il Flag File per incidere quando step2 per S1 è fatto.

Nell'analisi tipica, vorremmo vedere alcuni risultati per il primo campione e assicurarci che sia corretto. Quindi vorrei vedere S1 elaborato per primo. Grazie per aver offerto la funzione Flag File. Ma sembra complicato crearli per garantire l'ordine di esecuzione nel mio caso.
@zhanxw le tue necessità sembrano concentrarsi principalmente sul controllo di qualità della pipeline e sull'assicurarsi che produca gli output giusti. Spesso devo convalidare una pipeline prima di eseguire 10 o 1000 di campioni. Il modo migliore che ho trovato è quello di non provare a collegare la pipeline come suggerisci, ma eseguirlo una volta con un singolo campione, quindi eseguirlo di nuovo con tutti i campioni rimanenti una volta che sei soddisfatto.
Vedo i tuoi punti: esegui un campione alla volta. Posso farlo, ma non è conveniente in quanto ho bisogno di scrivere un altro script per eseguire snakemake su ogni campione. Sono curioso di sapere se snakemake ha già alcune soluzioni. Grazie.


Questa domanda e risposta è stata tradotta automaticamente dalla lingua inglese. Il contenuto originale è disponibile su stackexchange, che ringraziamo per la licenza cc by-sa 4.0 con cui è distribuito.
Loading...