Część 2: Wywoływanie wariantów dla poszczególnych próbek¶
W Części 1 przetestowałeś polecenia Samtools i GATK ręcznie w ich odpowiednich kontenerach. Teraz opakujemy te same polecenia w workflow'a Nextflow'a.
Zadanie¶
W tej części kursu stworzymy workflow'a, który wykona następujące kroki:
- Wygeneruje plik indeksu dla każdego wejściowego pliku BAM przy użyciu Samtools
- Uruchomi 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 replikuje kroki z Części 1, w których uruchamiałeś te polecenia ręcznie w kontenerach.
Jako punkt wyjścia dostarczamy Ci plik workflow'a, genomics.nf, który zarysowuje główne części workflow'a, a także dwa pliki modułów, samtools_index.nf i gatk_haplotypecaller.nf, które zarysowują strukturę modułów.
Te pliki nie są funkcjonalne; ich celem jest jedynie służenie jako szkielety, które wypełnisz interesującymi częściami kodu.
Plan lekcji¶
Aby uczynić proces tworzenia bardziej edukacyjnym, podzieliliśmy to na cztery kroki:
- Napisz jednostopniowy workflow'a, który uruchamia Samtools index na pliku BAM. Obejmuje to tworzenie modułu, importowanie go i wywoływanie w workflow'u.
- 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 działania na zestawie próbek. Obejmuje to równoległe wykonanie i wprowadza krotki, aby utrzymać powiązane pliki razem.
- Spraw, aby workflow przyjmował plik tekstowy zawierający zestaw plików wejściowych. Demonstruje to powszechny wzorzec dostarczania danych wejściowych w całości.
Każdy krok skupia się na konkretnym aspekcie tworzenia workflow'a.
1. Napisz jednostopniowy workflow'a, który uruchamia Samtools index na pliku BAM¶
Ten pierwszy krok skupia się na podstawach: wczytaniu pliku BAM i wygenerowaniu 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'u
- Skonfiguruj obsługę wyjścia
1.1. Skonfiguruj wejście¶
Musimy zadeklarować parametr wejściowy, utworzyć profil testowy, aby dostarczyć wygodną wartość domyślną, i 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 reads_bam.
To konfiguruje parametr CLI, ale nie chcemy wpisywać ścieżki do pliku za każdym razem, gdy uruchamiamy workflow'a podczas tworzenia. Istnieje wiele opcji dostarczenia 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 dostarcza wygodne wartości domyślne do wypróbowania workflow'a bez podawania danych wejściowych w wierszu poleceń. To powszechna konwencja w ekosystemie Nextflow'a (zobacz Hello Config, aby dowiedzieć się więcej).
Dodaj blok profiles do nextflow.config z profilem test, który ustawia parametr reads_bam 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 na stałe ścieżek bezwzględnych.
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).
Teraz musimy utworzyć proces do uruchomienia indeksowania na tym wejściu.
1.2. Napisz proces indeksowania i wywołaj go w workflow'u¶
Musimy napisać definicję procesu w pliku modułu, zaimportować ją do workflow'a używając instrukcji include i wywołać ją na wejściu.
1.2.1. Wypełnij moduł dla procesu indeksowania¶
Otwórz modules/samtools_index.nf i zbadaj zarys definicji procesu.
Powinieneś rozpoznać główne elementy strukturalne; jeśli nie, rozważ przeczytanie Hello Nextflow, aby odświeżyć wiedzę.
Wypełnij definicję procesu samodzielnie, używając informacji podanych powyżej, następnie sprawdź swoją pracę z rozwiązaniem w zakładce "Po" poniżej.
| modules/samtools_index.nf | |
|---|---|
Po zakończeniu tego proces jest kompletny. Aby użyć go w workflow'u, będziesz musiał zaimportować moduł i dodać wywołanie procesu.
1.2.2. Dołącz moduł¶
W genomics.nf dodaj instrukcję include, aby udostępnić proces w workflow'u:
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.
Teraz musimy 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 każdy nazwany cel jest publikowany.
Dodajmy cel dla bam_index, który publikuje do podkatalogu bam/.
Note
Domyślnie Nextflow publikuje pliki wyjściowe jako dowiązania symboliczne, co pozwala uniknąć niepotrzebnego duplikowania.
Mimo że pliki danych, których używamy tutaj, są bardzo małe, w genomice mogą być bardzo duże.
Dowiązania symboliczne przestaną działać po wyczyszczeniu katalogu work, więc dla produkcyjnych workflow'ów możesz chcieć zastąpić domyślny tryb publikowania na 'copy'.
1.4. Uruchom workflow'a¶
W tym momencie mamy jednostopniowy 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, przeglądając katalog roboczy lub katalog 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 przyjmuje 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) oraz 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 wraz z ich 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'u
- 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 wcześniej, dostarczamy wartości domyślne przez profil testowy, a nie inline.
2.1.2. Dodaj wartości domyślne plików pomocniczych do profilu testowego¶
Tak jak zrobiliśmy dla reads_bam w sekcji 1.1.2, dodaj wartości domyślne dla plików pomocniczych do profilu testowego w nextflow.config:
Teraz musimy utworzyć zmienne, które wczytają te ścieżki plików do użycia w workflow'u.
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'u¶
Musimy napisać definicję procesu w pliku modułu, zaimportować ją do workflow'a używając instrukcji include i wywołać ją 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 zbadaj zarys definicji procesu.
Wypełnij definicję procesu samodzielnie, używając informacji podanych powyżej, 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, aby 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 wypisać je jawnie, aby Nextflow przygotował je w katalogu roboczym w czasie wykonania; w przeciwnym razie GATK zgłosi błąd dotyczący brakujących plików.
Podobnie wypisujemy jawnie plik indeksu wyjściowego VCF ("${input_bam}.vcf.idx"), 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 podczas podłączania wyjść do bloku publish.
Po zakończeniu tego proces jest kompletny. Aby użyć go w workflow'u, będziesz musiał 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, w sekcji main::
Powinieneś rozpoznać składnię *.out ze szkolenia Hello Nextflow; mówimy Nextflow'owi, aby wziął kanał wyjściowy przez SAMTOOLS_INDEX i podłączył go do wywołania procesu GATK_HAPLOTYPECALLER.
Note
Zauważ, że wejścia są dostarczane 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::
Teraz musimy 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, dodając tym razem -resume, abyśmy nie musieli ponownie uruchamiać kroku indeksowania.
Wyjście polecenia
Teraz, gdy spojrzymy na wyjście konsoli, widzimy wymienione dwa procesy.
Pierwszy proces został pominięty dzięki pamięci podręcznej, zgodnie z oczekiwaniami, podczas gdy drugi proces został uruchomiony, ponieważ jest zupełnie nowy.
Znajdziesz pliki wyjściowe 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, który wygenerowałeś, uruchamiając polecenie GATK bezpośrednio w kontenerze.
Zawartość pliku
To jest wyjście, na którego generowaniu zależy nam dla każdej próbki w naszym badaniu.
Podsumowanie¶
Wiesz, jak stworzyć dwuetapowy modułowy workflow, który wykonuje prawdziwą pracę analityczną i jest zdolny do radzenia sobie z idiosynkrazjami formatów plików genomicznych, takimi jak pliki pomocnicze.
Co dalej?¶
Spraw, aby workflow obsługiwał wiele próbek hurtowo.
3. Dostosuj workflow'a do działania na zestawie próbek¶
To dobrze 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ż się tym zajmie.
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 wykonania na wielu próbkach; w następnym kroku przełączymy się na bardziej skalowalne podejście używające 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:
Fabryka kanałów w treści workflow'a (.fromPath) akceptuje wiele ścieżek plików równie 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 działania na wszystkich trzech próbkach testowych.
Zabawna rzecz: to może zadziałać, ALBO może zawieść. Na przykład, oto uruchomienie, które powiodło się:
Wyjście polecenia
Jeśli Twoje uruchomienie workflow'a zakończyło się sukcesem, 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, zobaczysz linię taką 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¶
Zbadamy 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 przygotował plik indeksu w katalogu roboczym tego wywołania procesu, ale jest to niewłaściwy plik. Jak to mogło się stać?
3.3.2. Użyj operatora view() do zbadania zawartości kanału¶
Dodaj te dwie linie w treści workflow przed wywołaniem procesu GATK_HAPLOTYPECALLER, aby zobaczyć zawartość kanału:
Następnie uruchom ponownie polecenie workflow'a.
Ponownie, może to zakończyć się sukcesem lub niepowodzeniem. 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!
Note
Gdy wywołujesz proces Nextflow'a na kanale zawierającym wiele elementów, Nextflow spróbuje zrównoleglić wykonanie tak bardzo, jak to możliwe, i zbierze wyjścia w jakiejkolwiek kolejności staną się dostępne. Konsekwencją jest to, że odpowiednie wyjścia mogą być zebrane w innej kolejności niż oryginalne wejścia zostały podane.
W obecnej formie nasz skrypt workflow'a zakłada, że pliki indeksów wyjdą z kroku indeksowania wymienione w tej samej kolejności matka/ojciec/syn, w jakiej 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.
Tip
Instrukcje view() w kodzie workflow'a nic nie robią, więc nie jest problemem ich pozostawienie.
Jednak zaśmiecą Twoje wyjście konsoli, więc zalecamy ich usunięcie po zakończeniu rozwiązywania problemu.
3.4. Zaktualizuj workflow'a, aby poprawnie obsługiwał pliki indeksów¶
Rozwiązaniem jest zapakowanie każdego pliku BAM z jego indeksem do krotki, a następnie zaktualizowanie 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 pozostaną ściśle powiązane, jest spakowanie ich razem w krotkę wychodzącą z zadania indeksowania.
Note
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 jednoczesnym 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:
Teraz musimy zaktualizować workflow, aby odzwierciedlał nową strukturę krotki w wywołaniu procesu i celach publikacji.
3.4.3. Zaktualizuj wywołanie GATK_HAPLOTYPECALLER w workflow'u¶
Nie musimy już dostarczać oryginalnego reads_ch do procesu GATK_HAPLOTYPECALLER, ponieważ plik BAM jest teraz zapakowany 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 odzwierciedlać jego zawartość:
Dzięki tym zmianom BAM i jego indeks mają gwarancję podróżowania razem, więc parowanie będzie zawsze 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 niezawodnie przetwarza dowolną liczbę próbek, 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 hurtowo.
4. Spraw, aby workflow przyjmował 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 w wierszu i nic więcej, lub plik może zawierać dodatkowe metadane, w takim przypadku jest często nazywany arkuszem próbek.
Tutaj pokażemy Ci, jak zrobić prosty przypadek.
4.1. Zbadaj dostarczony plik tekstowy wymieniający ścieżki plików wejściowych¶
Już stworzyliśmy plik tekstowy wymieniający ścieżki plików wejściowych, o nazwie sample_bams.txt, który możesz znaleźć w katalogu data/.
/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
Jak widać, wymieniliśmy jedną ścieżkę pliku w wierszu i są to ścieżki bezwzględne.
Note
Pliki, których używamy tutaj, znajdują się po prostu w lokalnym systemie plików Twojego GitHub Codespaces, ale moglibyśmy również wskazywać pliki w pamięci chmurowej. Jeśli nie używasz dostarczonego środowiska Codespaces, może być konieczne dostosowanie ścieżek plików, aby pasowały do Twojej lokalnej konfiguracji.
4.2. Zaktualizuj parametr i profil testowy¶
Przełącz parametr reads_bam, aby wskazywał na plik sample_bams.txt 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 ogóle w kodzie, co jest dużym krokiem we właściwym kierunku.
4.3. Zaktualizuj fabrykę kanałów, aby odczytywała linie z pliku¶
Obecnie nasza fabryka kanałów wejściowych traktuje wszystkie pliki, które jej podamy, jako dane wejściowe, które chcemy podać do procesu indeksowania. Ponieważ teraz podajemy jej plik, który wymienia ścieżki plików wejściowych, musimy zmienić jej zachowanie, aby analizowała plik i traktowała zawarte w nim ścieżki plików jako dane wejściowe.
Możemy to zrobić, używając tego samego wzorca, którego użyliśmy w Części 2 Hello Nextflow: zastosowanie operatora splitCsv() do analizy pliku, następnie operacji map, aby wybrać pierwsze pole każdej linii.
Technicznie moglibyśmy zrobić to prościej, używając operatora .splitText(), ponieważ nasz plik wejściowy obecnie zawiera tylko ścieżki plików.
Jednak używając bardziej wszechstronnego operatora splitCsv (uzupełnionego przez map), możemy przyszłościowo zabezpieczyć nasz workflow w przypadku, gdy zdecydujemy się dodać metadane do pliku zawierającego ścieżki plików.
Tip
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. To powinno dać ten sam rezultat co wcześniej, prawda?
Wyjście polecenia
Tak! W rzeczywistości Nextflow poprawnie wykrywa, że wywołania procesów są dokładnie takie same, i nawet nie zadaje sobie trudu ponownego uruchamiania wszystkiego, ponieważ uruchamialiśmy z -resume.
I to wszystko! Nasz prosty workflow wywoływania wariantów ma wszystkie podstawowe funkcje, których chcieliśmy.
Podsumowanie¶
Wiesz, jak stworzyć wieloetapowy modułowy 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 budowy prostego pipeline'u genomicznego, który wykonuje prawdziwą pracę, biorąc pod uwagę idiosynkrazje formatów plików genomicznych i wymagań narzędzi.
Co dalej?¶
Świętuj swój sukces i weź dodatkową długą przerwę!
W następnej części tego kursu 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.