Część 2: Wywoływanie wariantów dla poszczególnych próbek¶
Tłumaczenie wspomagane przez AI - dowiedz się więcej i zasugeruj ulepszenia
W Części 1 przetestowałeś polecenia Samtools i GATK ręcznie w ich odpowiednich kontenerach. Teraz opakujemy te same polecenia w workflow Nextflow'a.
Zadanie¶
W tej części kursu stworzymy workflow'a, który wykonuje następujące czynności:
- Generuje plik indeksu dla każdego wejściowego pliku BAM przy użyciu Samtools
- Uruchamia GATK HaplotypeCaller na każdym wejściowym pliku BAM, aby wygenerować wywołania wariantów dla poszczególnych próbek w formacie VCF (Variant Call Format)
To automatyzuje kroki z pierwszej sekcji Części 1: Przegląd metody, gdzie uruchamiałeś te polecenia ręcznie w kontenerach.
Jako punkt wyjścia dostarczamy Ci plik workflow'a, genomics.nf, który przedstawia główne części workflow'a, oraz dwa pliki modułów, samtools_index.nf i gatk_haplotypecaller.nf, które przedstawiają strukturę każdego procesu.
Pliki szkieletowe
#!/usr/bin/env nextflow
// Module INCLUDE statements
/*
* Pipeline parameters
*/
// Primary input
workflow {
main:
// Create input channel
// Call processes
publish:
// Declare outputs to publish
}
output {
// Configure publish targets
}
Te pliki nie są funkcjonalne; ich celem jest jedynie służenie jako szkielety, które wypełnisz interesującymi fragmentami kodu.
Plan lekcji¶
Aby proces tworzenia był bardziej edukacyjny, podzieliliśmy to na cztery etapy:
- Napisz jednokrokowy workflow'a, który uruchamia Samtools index na pliku BAM. Obejmuje to tworzenie modułu, importowanie go i wywoływanie w workflow.
- Dodaj drugi proces, aby uruchomić GATK HaplotypeCaller na zaindeksowanym pliku BAM. Wprowadza to łączenie wyjść procesów z wejściami oraz obsługę plików pomocniczych.
- Dostosuj workflow'a do uruchamiania na zestawie próbek. Obejmuje to równoległe wykonywanie i wprowadza krotki, aby utrzymać powiązane pliki razem.
- Spraw, aby workflow akceptował plik tekstowy zawierający zestaw plików wejściowych. Demonstruje to powszechny wzorzec dostarczania wejść zbiorczo.
Każdy etap koncentruje się na konkretnym aspekcie tworzenia workflow'a.
Wskazówka
Upewnij się, że jesteś we właściwym katalogu roboczym:
cd /workspaces/training/nf4-science/genomics
1. Napisz jednokrokowy workflow'a, który uruchamia Samtools index na pliku BAM¶
Ten pierwszy krok koncentruje się na podstawach: wczytywaniu pliku BAM i generowaniu dla niego indeksu.
Przypomnij sobie polecenie samtools index z Części 1:
Polecenie przyjmuje plik BAM jako wejście i tworzy plik indeksu .bai obok niego.
URI kontenera to community.wave.seqera.io/library/samtools:1.20--b5dfbd93de237464.
Opakujemy te informacje w Nextflow'a w trzech etapach:
- Skonfiguruj wejście
- Napisz proces indeksowania i wywołaj go w workflow
- Skonfiguruj obsługę wyjścia
1.1. Skonfiguruj wejście¶
Musimy zadeklarować parametr wejściowy, utworzyć profil testowy, aby zapewnić wygodną wartość domyślną, oraz utworzyć kanał wejściowy.
1.1.1. Dodaj deklarację parametru wejściowego¶
W głównym pliku workflow'a genomics.nf, w sekcji Pipeline parameters, zadeklaruj parametr CLI o nazwie input.
To konfiguruje parametr CLI, ale nie chcemy wpisywać ścieżki pliku za każdym razem, gdy uruchamiamy workflow'a podczas tworzenia. Istnieje wiele opcji dostarczania wartości domyślnej; tutaj używamy profilu testowego.
1.1.2. Utwórz profil testowy z wartością domyślną w nextflow.config¶
Profil testowy zapewnia wygodne wartości domyślne do wypróbowania workflow'a bez określania wejść w wierszu poleceń. Jest to powszechna konwencja w ekosystemie Nextflow'a (zobacz Hello Config po więcej szczegółów).
Dodaj blok profiles do nextflow.config z profilem test, który ustawia parametr input na jeden z testowych plików BAM.
Tutaj używamy ${projectDir}, wbudowanej zmiennej Nextflow'a, która wskazuje na katalog, w którym znajduje się skrypt workflow'a.
Ułatwia to odwoływanie się do plików danych i innych zasobów bez kodowania bezwzględnych ścieżek na stałe.
1.1.3. Skonfiguruj kanał wejściowy¶
W bloku workflow utwórz kanał wejściowy z wartości parametru, używając fabryki kanałów .fromPath (jak w Hello Channels).
Następnie będziemy musieli utworzyć proces do uruchomienia indeksowania na tym wejściu.
1.2. Napisz proces indeksowania i wywołaj go w workflow¶
Musimy napisać definicję procesu w pliku modułu, zaimportować go do workflow'a za pomocą instrukcji include oraz wywołać go na wejściu.
1.2.1. Wypełnij moduł dla procesu indeksowania¶
Otwórz modules/samtools_index.nf i przeanalizuj zarys definicji procesu.
Powinieneś rozpoznać główne elementy strukturalne; jeśli nie, rozważ przeczytanie Hello Nextflow dla przypomnienia.
Wypełnij definicję procesu samodzielnie, używając informacji podanych powyżej, a następnie sprawdź swoją pracę z rozwiązaniem w zakładce "Po" poniżej.
| modules/samtools_index.nf | |
|---|---|
Po ukończeniu tego proces jest gotowy. Aby użyć go w workflow, musisz zaimportować moduł i dodać wywołanie procesu.
1.2.2. Dołącz moduł¶
W genomics.nf dodaj instrukcję include, aby udostępnić proces workflow'owi:
Proces jest teraz dostępny w zakresie workflow'a.
1.2.3. Wywołaj proces indeksowania na wejściu¶
Teraz dodajmy wywołanie SAMTOOLS_INDEX w bloku workflow, przekazując kanał wejściowy jako argument.
Workflow teraz wczytuje wejście i uruchamia na nim proces indeksowania. Następnie musimy skonfigurować sposób publikowania wyjścia.
1.3. Skonfiguruj obsługę wyjścia¶
Musimy zadeklarować, które wyjścia procesów publikować i określić, gdzie powinny trafić.
1.3.1. Zadeklaruj wyjście w sekcji publish:¶
Sekcja publish: wewnątrz bloku workflow deklaruje, które wyjścia procesów powinny być publikowane.
Przypisz wyjście SAMTOOLS_INDEX do nazwanego celu o nazwie bam_index.
Następnie będziemy musieli powiedzieć Nextflow'owi, gdzie umieścić opublikowane wyjście.
1.3.2. Skonfiguruj cel wyjściowy w bloku output {}¶
Blok output {} znajduje się poza workflow'em i określa, gdzie publikowany jest każdy nazwany cel.
Dodajmy cel dla bam_index, który publikuje do podkatalogu bam/.
Uwaga
Domyślnie Nextflow publikuje pliki wyjściowe jako dowiązania symboliczne, co pozwala uniknąć niepotrzebnego duplikowania.
Mimo że pliki danych, których tutaj używamy, są bardzo małe, w genomice mogą być bardzo duże.
Dowiązania symboliczne przestaną działać po wyczyszczeniu katalogu work, więc w przypadku workflow'ów produkcyjnych możesz chcieć nadpisać domyślny tryb publikowania na 'copy'.
1.4. Uruchom workflow'a¶
W tym momencie mamy jednokrokowy workflow indeksowania, który powinien być w pełni funkcjonalny. Sprawdźmy, czy działa!
Możemy go uruchomić z -profile test, aby użyć wartości domyślnej ustawionej w profilu testowym i uniknąć konieczności wpisywania ścieżki w wierszu poleceń.
Wyjście polecenia
Możesz sprawdzić, czy plik indeksu został wygenerowany poprawnie, zaglądając do katalogu roboczego lub do katalogu wyników.
Zawartość katalogu roboczego
Oto on!
Podsumowanie¶
Wiesz, jak utworzyć moduł zawierający proces, zaimportować go do workflow'a, wywołać go z kanałem wejściowym i opublikować wyniki.
Co dalej?¶
Dodaj drugi krok, który pobiera wyjście procesu indeksowania i używa go do uruchomienia wywoływania wariantów.
2. Dodaj drugi proces, aby uruchomić GATK HaplotypeCaller na zaindeksowanym pliku BAM¶
Teraz, gdy mamy indeks dla naszego pliku wejściowego, możemy przejść do konfiguracji kroku wywoływania wariantów.
Przypomnij sobie polecenie gatk HaplotypeCaller z Części 1:
gatk HaplotypeCaller \
-R /data/ref/ref.fasta \
-I /data/bam/reads_mother.bam \
-O reads_mother.vcf \
-L /data/ref/intervals.bed
Polecenie przyjmuje plik BAM (-I), genom referencyjny (-R) i plik interwałów (-L), a następnie tworzy plik VCF (-O) wraz z jego indeksem.
Narzędzie oczekuje również, że indeks BAM, indeks referencji i słownik referencji będą zlokalizowane razem z odpowiednimi plikami.
URI kontenera to community.wave.seqera.io/library/gatk4:4.5.0.0--730ee8817e436867.
Postępujemy według tych samych trzech etapów co wcześniej:
- Skonfiguruj wejścia
- Napisz proces wywoływania wariantów i wywołaj go w workflow
- Skonfiguruj obsługę wyjścia
2.1. Skonfiguruj wejścia¶
Krok wywoływania wariantów wymaga kilku dodatkowych plików wejściowych. Musimy zadeklarować dla nich parametry, dodać wartości domyślne do profilu testowego i utworzyć zmienne do ich wczytania.
2.1.1. Dodaj deklaracje parametrów dla plików pomocniczych¶
Ponieważ nasz nowy proces oczekuje kilku dodatkowych plików, dodaj deklaracje parametrów dla nich w genomics.nf w sekcji Pipeline parameters:
Jak poprzednio, dostarczymy wartości domyślne przez profil testowy, a nie bezpośrednio.
2.1.2. Dodaj wartości domyślne plików pomocniczych do profilu testowego¶
Tak jak zrobiliśmy dla input w sekcji 1.1.2, dodaj wartości domyślne dla plików pomocniczych do profilu testowego w nextflow.config:
| nextflow.config | |
|---|---|
Następnie będziemy musieli utworzyć zmienne, które wczytują te ścieżki plików do użycia w workflow.
2.1.3. Utwórz zmienne dla plików pomocniczych¶
Dodaj zmienne dla ścieżek plików pomocniczych wewnątrz bloku workflow:
Składnia file() mówi Nextflow'owi jawnie, aby obsługiwał te wejścia jako ścieżki plików.
Możesz dowiedzieć się więcej na ten temat w Side Quest Working with files.
2.2. Napisz proces wywoływania wariantów i wywołaj go w workflow¶
Musimy napisać definicję procesu w pliku modułu, zaimportować go do workflow'a za pomocą instrukcji include oraz wywołać go na wejściowych odczytach plus wyjściu kroku indeksowania i plikach pomocniczych.
2.2.1. Wypełnij moduł dla procesu wywoływania wariantów¶
Otwórz modules/gatk_haplotypecaller.nf i przeanalizuj zarys definicji procesu.
Wypełnij definicję procesu samodzielnie, używając informacji podanych powyżej, a następnie sprawdź swoją pracę z rozwiązaniem w zakładce "Po" poniżej.
Zauważysz, że ten proces ma więcej wejść niż wymaga samo polecenie GATK. GATK wie, gdzie szukać pliku indeksu BAM i plików pomocniczych genomu referencyjnego na podstawie konwencji nazewnictwa, ale Nextflow jest niezależny od dziedziny i nie zna tych konwencji. Musimy wymienić je jawnie, aby Nextflow umieścił je w katalogu roboczym w czasie wykonywania; w przeciwnym razie GATK zgłosi błąd o brakujących plikach.
Podobnie wymieniamy plik indeksu wyjściowego VCF ("${input_bam}.vcf.idx") jawnie, aby Nextflow śledził go dla kolejnych kroków.
Używamy składni emit:, aby przypisać nazwę do każdego kanału wyjściowego, co stanie się przydatne, gdy podłączymy wyjścia do bloku publish.
Po ukończeniu tego proces jest gotowy. Aby użyć go w workflow, musisz zaimportować moduł i dodać wywołanie procesu.
2.2.2. Zaimportuj nowy moduł¶
Zaktualizuj genomics.nf, aby zaimportować nowy moduł:
Proces jest teraz dostępny w zakresie workflow'a.
2.2.3. Dodaj wywołanie procesu¶
Dodaj wywołanie procesu w treści workflow, pod main::
Powinieneś rozpoznać składnię *.out ze szkolenia Hello Nextflow; mówimy Nextflow'owi, aby wziął kanał wyjściowy z SAMTOOLS_INDEX i podłączył go do wywołania procesu GATK_HAPLOTYPECALLER.
Uwaga
Zauważ, że wejścia są podawane w dokładnie tej samej kolejności w wywołaniu procesu, jak są wymienione w bloku wejściowym procesu. W Nextflow'ie wejścia są pozycyjne, co oznacza, że musisz zachować tę samą kolejność; i oczywiście musi być taka sama liczba elementów.
2.3. Skonfiguruj obsługę wyjścia¶
Musimy dodać nowe wyjścia do deklaracji publish i skonfigurować, gdzie mają trafić.
2.3.1. Dodaj cele publikacji dla wyjść wywoływania wariantów¶
Dodaj wyjścia VCF i indeksu do sekcji publish::
Następnie będziemy musieli powiedzieć Nextflow'owi, gdzie umieścić nowe wyjścia.
2.3.2. Skonfiguruj nowe cele wyjściowe¶
Dodaj wpisy dla celów vcf i vcf_idx w bloku output {}, publikując oba do podkatalogu vcf/:
VCF i jego indeks są publikowane jako oddzielne cele, które oba trafiają do podkatalogu vcf/.
2.4. Uruchom workflow'a¶
Uruchom rozszerzony workflow, tym razem dodając -resume, abyśmy nie musieli ponownie uruchamiać kroku indeksowania.
Wyjście polecenia
Teraz, jeśli spojrzymy na wyjście konsoli, widzimy wymienione dwa procesy.
Pierwszy proces został pominięty dzięki buforowaniu, zgodnie z oczekiwaniami, podczas gdy drugi proces został uruchomiony, ponieważ jest zupełnie nowy.
Pliki wyjściowe znajdziesz w katalogu wyników (jako dowiązania symboliczne do katalogu roboczego).
Zawartość katalogu
Jeśli otworzysz plik VCF, powinieneś zobaczyć tę samą zawartość co w pliku wygenerowanym przez bezpośrednie uruchomienie polecenia GATK w kontenerze.
Zawartość pliku
To jest wyjście, które zależy nam na wygenerowaniu dla każdej próbki w naszym badaniu.
Podsumowanie¶
Wiesz, jak stworzyć dwukrokowy modularny workflow, który wykonuje rzeczywistą pracę analityczną i jest w stanie radzić sobie z osobliwościami formatów plików genomicznych, takimi jak pliki pomocnicze.
Co dalej?¶
Spraw, aby workflow obsługiwał wiele próbek zbiorczo.
3. Dostosuj workflow'a do uruchamiania na zestawie próbek¶
To wszystko jest w porządku, aby mieć workflow'a, który może zautomatyzować przetwarzanie pojedynczej próbki, ale co jeśli masz 1000 próbek? Czy musisz napisać skrypt bash, który przechodzi przez wszystkie Twoje próbki?
Nie, dzięki Bogu! Po prostu wprowadź drobną zmianę w kodzie, a Nextflow również to dla Ciebie obsłuży.
3.1. Zaktualizuj wejście, aby wymieniało trzy próbki¶
Aby uruchomić na wielu próbkach, zaktualizuj profil testowy, aby dostarczał tablicę ścieżek plików zamiast pojedynczej. To szybki sposób na przetestowanie wykonywania wielopróbkowego; w następnym kroku przejdziemy na bardziej skalowalny sposób przy użyciu pliku wejść.
Najpierw zakomentuj adnotację typu w deklaracji parametru, ponieważ tablice nie mogą używać deklaracji typowanych:
Następnie zaktualizuj profil testowy, aby wymieniał wszystkie trzy próbki:
| nextflow.config | |
|---|---|
Fabryka kanałów w treści workflow'a (.fromPath) akceptuje wiele ścieżek plików tak samo dobrze jak pojedynczą, więc nie są potrzebne żadne inne zmiany.
3.2. Uruchom workflow'a¶
Spróbuj teraz uruchomić workflow'a, gdy instalacja jest skonfigurowana do uruchamiania na wszystkich trzech próbkach testowych.
Zabawna rzecz: to może zadziałać LUB może się nie udać. Na przykład, oto uruchomienie, które się powiodło:
Wyjście polecenia
Jeśli Twoje uruchomienie workflow'a się powiodło, uruchom je ponownie, aż otrzymasz błąd taki jak ten:
Wyjście polecenia
N E X T F L O W ~ version 25.10.2
┃ Launching `genomics.nf` [loving_pasteur] DSL2 - revision: d2a8e63076
executor > local (4)
[01/eea165] SAMTOOLS_INDEX (2) | 3 of 3, cached: 1 ✔
[a5/fa9fd0] GATK_HAPLOTYPECALLER (3) | 1 of 3, cached: 1
ERROR ~ Error executing process > 'GATK_HAPLOTYPECALLER (2)'
Caused by:
Process `GATK_HAPLOTYPECALLER (2)` terminated with an error exit status (2)
Command executed:
gatk HaplotypeCaller -R ref.fasta -I reads_father.bam -O reads_father.bam.vcf -L intervals.bed
Command exit status:
2
Command error:
...
A USER ERROR has occurred: Traversal by intervals was requested but some input files are not indexed.
...
Jeśli spojrzysz na wyjście błędu polecenia GATK, będzie tam linia taka jak ta:
A USER ERROR has occurred: Traversal by intervals was requested but some input files are not indexed.
Cóż, to dziwne, biorąc pod uwagę, że jawnie zaindeksowaliśmy pliki BAM w pierwszym kroku workflow'a. Czy może być coś nie tak z instalacją?
3.3. Rozwiąż problem¶
Sprawdzimy katalogi robocze i użyjemy operatora view(), aby dowiedzieć się, co poszło nie tak.
3.3.1. Sprawdź katalogi robocze dla odpowiednich wywołań¶
Zajrzyj do katalogu roboczego dla nieudanego wywołania procesu GATK_HAPLOTYPECALLER wymienionego w wyjściu konsoli.
Zawartość katalogu
work/a5/fa9fd0994b6beede5fb9ea073596c2
├── intervals.bed -> /workspaces/training/nf4-science/genomics/data/ref/intervals.bed
├── reads_father.bam.bai -> /workspaces/training/nf4-science/genomics/work/01/eea16597bd6e810fb4cf89e60f8c2d/reads_father.bam.bai
├── reads_son.bam -> /workspaces/training/nf4-science/genomics/data/bam/reads_son.bam
├── reads_son.bam.vcf
├── reads_son.bam.vcf.idx
├── ref.dict -> /workspaces/training/nf4-science/genomics/data/ref/ref.dict
├── ref.fasta -> /workspaces/training/nf4-science/genomics/data/ref/ref.fasta
└── ref.fasta.fai -> /workspaces/training/nf4-science/genomics/data/ref/ref.fasta.fai
Zwróć szczególną uwagę na nazwy pliku BAM i indeksu BAM, które są wymienione w tym katalogu: reads_son.bam i reads_father.bam.bai.
Co do diabła? Nextflow umieścił plik indeksu w katalogu roboczym tego wywołania procesu, ale jest to niewłaściwy. Jak to mogło się stać?
3.3.2. Użyj operatora view() do sprawdzenia zawartości kanału¶
Dodaj te dwie linie w treści workflow'a przed wywołaniem procesu GATK_HAPLOTYPECALLER, aby wyświetlić zawartość kanału:
Następnie uruchom ponownie polecenie workflow'a.
Ponownie, to może się udać lub nie. Oto jak wygląda wyjście dwóch wywołań .view() dla nieudanego uruchomienia:
/workspaces/training/nf4-science/genomics/data/bam/reads_mother.bam
/workspaces/training/nf4-science/genomics/data/bam/reads_father.bam
/workspaces/training/nf4-science/genomics/data/bam/reads_son.bam
/workspaces/training/nf4-science/genomics/work/9c/53492e3518447b75363e1cd951be4b/reads_father.bam.bai
/workspaces/training/nf4-science/genomics/work/cc/37894fffdf6cc84c3b0b47f9b536b7/reads_son.bam.bai
/workspaces/training/nf4-science/genomics/work/4d/dff681a3d137ba7d9866e3d9307bd0/reads_mother.bam.bai
Pierwsze trzy linie odpowiadają kanałowi wejściowemu, a drugie - kanałowi wyjściowemu. Widać, że pliki BAM i pliki indeksów dla trzech próbek nie są wymienione w tej samej kolejności!
Uwaga
Gdy wywołujesz proces Nextflow'a na kanale zawierającym wiele elementów, Nextflow będzie próbował zrównoleglić wykonywanie tak bardzo, jak to możliwe, i będzie zbierał wyjścia w jakiejkolwiek kolejności staną się dostępne. Konsekwencją jest to, że odpowiednie wyjścia mogą być zbierane w innej kolejności niż oryginalne wejścia zostały podane.
Jak obecnie napisany, nasz skrypt workflow'a zakłada, że pliki indeksów wyjdą z kroku indeksowania wymienione w tej samej kolejności matka/ojciec/syn, jak podano wejścia. Ale nie ma gwarancji, że tak będzie, dlatego czasami (choć nie zawsze) niewłaściwe pliki są sparowane w drugim kroku.
Aby to naprawić, musimy upewnić się, że pliki BAM i ich pliki indeksów podróżują razem przez kanały.
Wskazówka
Instrukcje view() w kodzie workflow'a nic nie robią, więc nie ma problemu, aby je zostawić.
Jednak będą zaśmiecać Twoje wyjście konsoli, więc zalecamy ich usunięcie, gdy skończysz rozwiązywać problem.
3.4. Zaktualizuj workflow'a, aby poprawnie obsługiwał pliki indeksów¶
Poprawka polega na spakowaniu każdego pliku BAM z jego indeksem w krotkę, a następnie zaktualizowaniu procesu downstream i instalacji workflow'a, aby pasowały.
3.4.1. Zmień wyjście modułu SAMTOOLS_INDEX na krotkę¶
Najprostszym sposobem zapewnienia, że plik BAM i jego indeks pozostają ściśle powiązane, jest spakowanie ich razem w krotkę wychodzącą z zadania indeksowania.
Uwaga
Krotka to skończona, uporządkowana lista elementów, która jest powszechnie używana do zwracania wielu wartości z funkcji. Krotki są szczególnie przydatne do przekazywania wielu wejść lub wyjść między procesami przy zachowaniu ich powiązania i kolejności.
Zaktualizuj wyjście w modules/samtools_index.nf, aby uwzględnić plik BAM:
W ten sposób każdy plik indeksu będzie ściśle powiązany z oryginalnym plikiem BAM, a ogólne wyjście kroku indeksowania będzie pojedynczym kanałem zawierającym pary plików.
3.4.2. Zmień wejście modułu GATK_HAPLOTYPECALLER, aby akceptował krotkę¶
Ponieważ zmieniliśmy "kształt" wyjścia pierwszego procesu, musimy zaktualizować definicję wejścia drugiego procesu, aby pasowała.
Zaktualizuj modules/gatk_haplotypecaller.nf:
Następnie będziemy musieli zaktualizować workflow, aby odzwierciedlał nową strukturę krotki w wywołaniu procesu i celach publikacji.
3.4.3. Zaktualizuj wywołanie GATK_HAPLOTYPECALLER w workflow¶
Nie musimy już dostarczać oryginalnego reads_ch do procesu GATK_HAPLOTYPECALLER, ponieważ plik BAM jest teraz spakowany w kanał wyjściowy przez SAMTOOLS_INDEX.
Zaktualizuj wywołanie w genomics.nf:
Na koniec musimy zaktualizować cele publikacji, aby odzwierciedlały nową strukturę wyjścia.
3.4.4. Zaktualizuj cel publikacji dla wyjścia zaindeksowanego BAM¶
Ponieważ wyjście SAMTOOLS_INDEX jest teraz krotką zawierającą zarówno plik BAM, jak i jego indeks, zmień nazwę celu publikacji z bam_index na indexed_bam, aby lepiej odzwierciedlić jego zawartość:
Dzięki tym zmianom BAM i jego indeks mają gwarancję podróżowania razem, więc parowanie zawsze będzie poprawne.
3.5. Uruchom poprawiony workflow'a¶
Uruchom workflow'a ponownie, aby upewnić się, że będzie działał niezawodnie w przyszłości.
Tym razem (i za każdym razem) wszystko powinno działać poprawnie:
Wyjście polecenia
Katalog wyników zawiera teraz zarówno pliki BAM, jak i BAI dla każdej próbki (z krotki), wraz z wyjściami VCF:
Zawartość katalogu wyników
results/
├── bam/
│ ├── reads_father.bam -> ...
│ ├── reads_father.bam.bai -> ...
│ ├── reads_mother.bam -> ...
│ ├── reads_mother.bam.bai -> ...
│ ├── reads_son.bam -> ...
│ └── reads_son.bam.bai -> ...
└── vcf/
├── reads_father.bam.vcf -> ...
├── reads_father.bam.vcf.idx -> ...
├── reads_mother.bam.vcf -> ...
├── reads_mother.bam.vcf.idx -> ...
├── reads_son.bam.vcf -> ...
└── reads_son.bam.vcf.idx -> ...
Pakując powiązane pliki w krotki, zapewniliśmy, że właściwe pliki zawsze podróżują razem przez workflow'a. Workflow teraz przetwarza dowolną liczbę próbek niezawodnie, ale wymienianie ich indywidualnie w konfiguracji nie jest zbyt skalowalne. W następnym kroku przejdziemy na odczytywanie wejść z pliku.
Podsumowanie¶
Wiesz, jak sprawić, aby Twój workflow działał na wielu próbkach (niezależnie).
Co dalej?¶
Ułatw obsługę próbek zbiorczo.
4. Spraw, aby workflow akceptował plik tekstowy zawierający zestaw plików wejściowych¶
Bardzo powszechnym sposobem dostarczania wielu plików danych wejściowych do workflow'a jest zrobienie tego za pomocą pliku tekstowego zawierającego ścieżki plików. Może to być tak proste, jak plik tekstowy wymieniający jedną ścieżkę pliku na linię i nic więcej, lub plik może zawierać dodatkowe metadane, w którym to przypadku jest często nazywany arkuszem próbek.
Tutaj pokażemy Ci, jak zrobić prosty przypadek.
4.1. Przeanalizuj dostarczony plik CSV wymieniający ścieżki plików wejściowych¶
Już stworzyliśmy plik CSV wymieniający ścieżki plików wejściowych, nazwany samplesheet.csv, który możesz znaleźć w katalogu data/.
sample_id,reads_bam
NA12878,/workspaces/training/nf4-science/genomics/data/bam/reads_mother.bam
NA12877,/workspaces/training/nf4-science/genomics/data/bam/reads_father.bam
NA12882,/workspaces/training/nf4-science/genomics/data/bam/reads_son.bam
Ten plik CSV zawiera linię nagłówka, która nazywa kolumny.
Ostrzeżenie
Ścieżki plików w pliku CSV są ścieżkami bezwzględnymi, które muszą pasować do Twojego środowiska. Jeśli nie uruchamiasz tego w środowisku szkoleniowym, które dostarczamy, będziesz musiał zaktualizować ścieżki, aby pasowały do Twojego systemu.
4.2. Zaktualizuj parametr i profil testowy¶
Przełącz parametr input, aby wskazywał na plik samplesheet.csv zamiast wymieniać poszczególne próbki.
Przywróć adnotację typu w bloku params (ponieważ to znowu pojedyncza ścieżka):
Następnie zaktualizuj profil testowy, aby wskazywał na plik tekstowy:
| nextflow.config | |
|---|---|
Lista plików nie znajduje się już w kodzie w ogóle, co jest dużym krokiem we właściwym kierunku.
4.3. Zaktualizuj fabrykę kanałów, aby parsowała wejście CSV¶
Obecnie nasza fabryka kanałów wejściowych traktuje wszystkie pliki, które jej dajemy, jako wejścia danych, które chcemy przekazać do procesu indeksowania. Ponieważ teraz dajemy jej plik, który wymienia ścieżki plików wejściowych, musimy zmienić jej zachowanie, aby parsowała plik i traktowała ścieżki plików, które zawiera, jako wejścia danych.
Możemy to zrobić, używając tego samego wzorca, którego użyliśmy w Części 2 Hello Nextflow: stosując operator splitCsv() do parsowania pliku, a następnie operację map, aby wyodrębnić ścieżkę pliku z każdego wiersza.
Jedną rzeczą, która jest nowa w porównaniu z tym, co napotkałeś w kursie Hello Nextflow, jest to, że ten plik CSV ma linię nagłówka, więc dodajemy header: true do wywołania splitCsv().
To pozwala nam odwoływać się do kolumn po nazwie w operacji map: row.reads_bam wyodrębnia ścieżkę pliku z kolumny reads_bam każdego wiersza.
Wskazówka
Jeśli nie jesteś pewien, że rozumiesz, co robią operatory tutaj, to kolejna świetna okazja do użycia operatora .view(), aby zobaczyć, jak wygląda zawartość kanału przed i po ich zastosowaniu.
4.4. Uruchom workflow'a¶
Uruchom workflow'a jeszcze raz.
Wyjście polecenia
Powinno to dać taki sam wynik jak poprzednio. Nasz prosty workflow wywoływania wariantów ma teraz wszystkie podstawowe funkcje, których chcieliśmy.
Podsumowanie¶
Wiesz, jak stworzyć wielokrokowy modularny workflow do indeksowania pliku BAM i zastosowania wywoływania wariantów dla poszczególnych próbek przy użyciu GATK.
Bardziej ogólnie, nauczyłeś się, jak używać podstawowych komponentów i logiki Nextflow'a do budowania prostego pipeline'u genomicznego, który wykonuje rzeczywistą pracę, biorąc pod uwagę osobliwości formatów plików genomicznych i wymagań narzędzi.
Co dalej?¶
Weź przerwę! To było sporo.
Gdy poczujesz się odświeżony, przejdź do Części 3, gdzie nauczysz się, jak przekształcić ten prosty workflow wywoływania wariantów dla poszczególnych próbek, aby zastosować wspólne wywoływanie wariantów do danych.