Część 3: Wspólne wywoływanie wariantów dla kohorty¶
Tłumaczenie wspomagane przez AI - dowiedz się więcej i zasugeruj ulepszenia
Wcześniej zbudowałeś pipeline wywoływania wariantów dla pojedynczych próbek, który przetwarzał dane każdej próbki niezależnie. Teraz rozszerzymy go, aby zaimplementować wspólne wywoływanie wariantów, jak opisano w Części 1 (przypadek użycia dla wielu próbek).
Jak zacząć od tej sekcji
Ta sekcja kursu zakłada, że ukończyłeś Część 1: Przegląd metody, Część 2: Wywoływanie wariantów dla pojedynczych próbek i masz działający pipeline genomics.nf.
Jeśli nie ukończyłeś Części 2 lub chcesz zacząć od nowa w tej części, możesz użyć rozwiązania z Części 2 jako punktu wyjścia.
Uruchom te polecenia z katalogu nf4-science/genomics/:
cp solutions/part2/genomics-2.nf genomics.nf
cp solutions/part2/nextflow.config .
cp solutions/part2/modules/* modules/
To da Ci kompletny workflow wywoływania wariantów dla pojedynczych próbek. Możesz sprawdzić, czy działa poprawnie, uruchamiając następujące polecenie:
Zadanie¶
W tej części kursu rozszerzymy workflow'a, aby wykonywał następujące operacje:
- Wygenerować plik indeksu dla każdego pliku BAM wejściowego przy użyciu Samtools
- Uruchomić GATK HaplotypeCaller na każdym pliku BAM wejściowym, aby wygenerować GVCF z wywołaniami wariantów genomowych dla pojedynczej próbki
- Zebrać wszystkie pliki GVCF i połączyć je w magazyn danych GenomicsDB
- Uruchomić wspólne genotypowanie na połączonym magazynie danych GVCF, aby wygenerować plik VCF na poziomie kohorty
Implementuje to metodę opisaną w Części 1: Przegląd metody (druga sekcja dotycząca przypadku użycia dla wielu próbek) i buduje bezpośrednio na workflow'ie stworzonym w Części 2: Wywoływanie wariantów dla pojedynczych próbek.
Plan lekcji¶
Podzieliliśmy to na dwa etapy:
- Zmodyfikować krok wywoływania wariantów dla pojedynczych próbek, aby generował GVCF. Obejmuje to aktualizację poleceń i wyjść procesu.
- Dodać krok wspólnego genotypowania, który łączy i genotypuje pliki GVCF dla pojedynczych próbek.
Wprowadza to operator
collect(), domknięcia Groovy do konstruowania linii poleceń oraz procesy z wieloma poleceniami.
Automatyzuje to kroki z drugiej sekcji Części 1: Przegląd metody, gdzie uruchamiałeś te polecenia ręcznie w ich kontenerach.
Wskazówka
Upewnij się, że jesteś we właściwym katalogu roboczym:
cd /workspaces/training/nf4-science/genomics
1. Zmodyfikuj krok wywoływania wariantów dla pojedynczych próbek, aby generował GVCF¶
Pipeline z Części 2 generuje pliki VCF, ale wspólne wywoływanie wymaga plików GVCF. Musimy włączyć tryb wywoływania wariantów GVCF i zaktualizować rozszerzenie pliku wyjściowego.
Przypomnij sobie polecenie wywoływania wariantów GVCF z Części 1:
gatk HaplotypeCaller \
-R /data/ref/ref.fasta \
-I /data/bam/reads_mother.bam \
-O reads_mother.g.vcf \
-L /data/ref/intervals.bed \
-ERC GVCF
W porównaniu z podstawowym poleceniem HaplotypeCaller, które opakowano w Części 2, różnice to parametr -ERC GVCF i rozszerzenie wyjściowe .g.vcf.
1.1. Powiedz HaplotypeCaller, aby emitował GVCF i zaktualizuj rozszerzenie wyjściowe¶
Otwórz plik modułu modules/gatk_haplotypecaller.nf, aby wprowadzić dwie zmiany:
- Dodaj parametr
-ERC GVCFdo polecenia GATK HaplotypeCaller; - Zaktualizuj ścieżkę pliku wyjściowego, aby używała odpowiadającego rozszerzenia
.g.vcf, zgodnie z konwencją GATK.
Upewnij się, że dodajesz ukośnik odwrotny (\) na końcu poprzedniej linii, gdy dodajesz -ERC GVCF.
Musimy również zaktualizować blok wyjściowy, aby pasował do nowego rozszerzenia pliku.
Ponieważ zmieniliśmy wyjście polecenia z .vcf na .g.vcf, blok output: procesu musi odzwierciedlać tę samą zmianę.
1.2. Zaktualizuj rozszerzenie pliku wyjściowego w bloku wyjść procesu¶
Musimy również zaktualizować konfigurację publikowania i wyjścia workflow'a, aby odzwierciedlała nowe wyjścia GVCF.
1.3. Zaktualizuj cele publikowania dla nowych wyjść GVCF¶
Ponieważ teraz generujemy pliki GVCF zamiast VCF, powinniśmy zaktualizować sekcję publish: workflow'a, aby używała bardziej opisowych nazw.
Zorganizujemy również pliki GVCF w ich własnym podkatalogu dla przejrzystości.
Teraz zaktualizuj blok wyjściowy, aby pasował.
1.4. Zaktualizuj blok wyjściowy dla nowej struktury katalogów¶
Musimy również zaktualizować blok output, aby umieścić pliki GVCF w podkatalogu gvcf.
Po zaktualizowaniu modułu, celów publikowania i bloku wyjściowego możemy przetestować zmiany.
1.5. Uruchom pipeline'a¶
Uruchom workflow'a, aby zweryfikować, że zmiany działają.
Wyjście polecenia
Wyjście Nextflow'a wygląda tak samo jak wcześniej, ale pliki .g.vcf i ich pliki indeksów są teraz zorganizowane w podkatalogach.
Zawartość katalogu (skrócone dowiązania symboliczne)
results/
├── gvcf/
│ ├── reads_father.bam.g.vcf -> */27/0d7eb9*/reads_father.bam.g.vcf
│ ├── reads_father.bam.g.vcf.idx -> */27/0d7eb9*/reads_father.bam.g.vcf.idx
│ ├── reads_mother.bam.g.vcf -> */e4/4ed55e*/reads_mother.bam.g.vcf
│ ├── reads_mother.bam.g.vcf.idx -> */e4/4ed55e*/reads_mother.bam.g.vcf.idx
│ ├── reads_son.bam.g.vcf -> */08/e95962*/reads_son.bam.g.vcf
│ └── reads_son.bam.g.vcf.idx -> */08/e95962*/reads_son.bam.g.vcf.idx
└── indexed_bam/
├── reads_father.bam -> */9a/c7a873*/reads_father.bam
├── reads_father.bam.bai -> */9a/c7a873*/reads_father.bam.bai
├── reads_mother.bam -> */f1/8d8486*/reads_mother.bam
├── reads_mother.bam.bai -> */f1/8d8486*/reads_mother.bam.bai
├── reads_son.bam -> */cc/fbc705*/reads_son.bam
└── reads_son.bam.bai -> */cc/fbc705*/reads_son.bam.bai
Jeśli otworzysz jeden z plików GVCF i przewiniesz go, możesz zweryfikować, że GATK HaplotypeCaller wygenerował pliki GVCF zgodnie z żądaniem.
Podsumowanie¶
Gdy zmieniasz nazwę pliku wyjściowego polecenia narzędzia, blok output: procesu oraz konfiguracja publikowania/wyjścia muszą zostać zaktualizowane, aby pasowały.
Co dalej?¶
Naucz się zbierać zawartość kanału i przekazywać ją do następnego procesu jako pojedyncze wejście.
2. Dodaj krok wspólnego genotypowania¶
Teraz musimy zebrać pliki GVCF dla pojedynczych próbek, połączyć je w magazyn danych GenomicsDB i uruchomić wspólne genotypowanie, aby wygenerować plik VCF na poziomie kohorty.
Jak omówiono w Części 1, jest to operacja dwóch narzędzi: GenomicsDBImport łączy pliki GVCF, a następnie GenotypeGVCFs generuje końcowe wywołania wariantów.
Opakujemy oba narzędzia w jeden proces o nazwie GATK_JOINTGENOTYPING.
Przypomnij sobie dwa polecenia z Części 1:
gatk GenomicsDBImport \
-V reads_mother.g.vcf \
-V reads_father.g.vcf \
-V reads_son.g.vcf \
-L /data/ref/intervals.bed \
--genomicsdb-workspace-path family_trio_gdb
Pierwsze polecenie przyjmuje pliki GVCF dla pojedynczych próbek i plik interwałów, a następnie generuje magazyn danych GenomicsDB.
Drugie przyjmuje ten magazyn danych, genom referencyjny i generuje końcowy plik VCF na poziomie kohorty.
URI kontenera jest taki sam jak dla HaplotypeCaller: community.wave.seqera.io/library/gatk4:4.5.0.0--730ee8817e436867.
2.1. Skonfiguruj wejścia¶
Proces wspólnego genotypowania potrzebuje dwóch rodzajów wejść, których jeszcze nie mamy: dowolnej nazwy kohorty oraz zebranych wyjść GVCF ze wszystkich próbek połączonych razem.
2.1.1. Dodaj parametr cohort_name¶
Musimy podać dowolną nazwę dla kohorty.
Później w serii szkoleń nauczysz się, jak używać metadanych próbek do tego rodzaju rzeczy, ale na razie po prostu deklarujemy parametr CLI używając params.
Użyjemy tego parametru do nazwania końcowego pliku wyjściowego.
2.1.2. Dodaj wartość domyślną dla cohort_name w profilu testowym¶
Dodajemy również wartość domyślną dla parametru cohort_name w profilu testowym:
| nextflow.config | |
|---|---|
Następnie będziemy musieli zebrać wyjścia dla pojedynczych próbek, aby mogły być przetwarzane razem.
2.1.3. Zbierz wyjścia HaplotypeCaller z wszystkich próbek¶
Gdybyśmy podłączyli kanał wyjściowy z GATK_HAPLOTYPECALLER bezpośrednio do nowego procesu, Nextflow wywołałby proces na każdym pliku GVCF próbki osobno.
Chcemy połączyć wszystkie trzy pliki GVCF (i ich pliki indeksów), aby Nextflow przekazał je wszystkie razem do pojedynczego wywołania procesu.
Możemy to zrobić używając operatora kanału collect().
Dodaj następujące linie do ciała workflow, zaraz po wywołaniu GATK_HAPLOTYPECALLER:
Rozbijając to na części:
- Pobieramy kanał wyjściowy z
GATK_HAPLOTYPECALLERużywając właściwości.out. - Ponieważ nazwaliśmy wyjścia używając
emit:w sekcji 1, możemy wybrać pliki GVCF za pomocą.vcf, a pliki indeksów za pomocą.idx. Bez nazwanych wyjść musielibyśmy użyć.out[0]i.out[1]. - Operator
collect()łączy wszystkie pliki w jeden element, więcall_gvcfs_chzawiera wszystkie trzy pliki GVCF razem, aall_idxs_chzawiera wszystkie trzy pliki indeksów razem.
Możemy zbierać pliki GVCF i ich pliki indeksów osobno (w przeciwieństwie do trzymania ich razem w krotkach), ponieważ Nextflow przygotuje wszystkie pliki wejściowe razem do wykonania, więc pliki indeksów będą obecne obok plików GVCF.
Wskazówka
Możesz użyć operatora view(), aby sprawdzić zawartość kanałów przed i po zastosowaniu operatorów kanału.
2.2. Napisz proces wspólnego genotypowania i wywołaj go w workflow'ie¶
Postępując zgodnie z tym samym wzorcem, którego użyliśmy w Części 2, napiszemy definicję procesu w pliku modułu, zaimportujemy ją do workflow'a i wywołamy na wejściach, które właśnie przygotowaliśmy.
2.2.1. Skonstruuj ciąg znaków, aby nadać każdemu GVCF argument -V¶
Zanim zaczniemy wypełniać definicję procesu, jest jedna rzecz do rozwiązania.
Polecenie GenomicsDBImport oczekuje osobnego argumentu -V dla każdego pliku GVCF, w ten sposób:
gatk GenomicsDBImport \
-V reads_mother.bam.g.vcf \
-V reads_father.bam.g.vcf \
-V reads_son.bam.g.vcf \
...
Gdybyśmy napisali -V ${all_gvcfs_ch}, Nextflow po prostu połączyłby nazwy plików i ta część polecenia wyglądałaby tak:
Ale potrzebujemy, aby ciąg wyglądał tak:
Co ważne, musimy skonstruować ten ciąg dynamicznie z dowolnych plików znajdujących się w zebranym kanale. Nextflow (poprzez Groovy) zapewnia zwięzły sposób, aby to zrobić:
Rozbijając to na części:
all_gvcfs.collect { gvcf -> "-V ${gvcf}" }iteruje po każdej ścieżce pliku i dodaje przed nią-V, generując["-V A.g.vcf", "-V B.g.vcf", "-V C.g.vcf"]..join(' ')łączy je spacjami:"-V A.g.vcf -V B.g.vcf -V C.g.vcf".- Wynik jest przypisywany do zmiennej lokalnej
gvcfs_line(zdefiniowanej za pomocądef), którą możemy interpolować w szablonie polecenia.
Ta linia trafia do bloku script: procesu, przed szablonem polecenia.
Możesz umieścić dowolny kod Groovy między script: a otwierającym """ szablonu polecenia.
Następnie będziesz mógł odwoływać się do całego tego ciągu jako gvcfs_line w bloku script: procesu.
2.2.2. Wypełnij moduł dla procesu wspólnego genotypowania¶
Następnie możemy zająć się napisaniem pełnego procesu.
Otwórz modules/gatk_jointgenotyping.nf i przeanalizuj zarys definicji procesu.
Wypełnij definicję procesu używając informacji podanych powyżej, a następnie sprawdź swoją pracę z rozwiązaniem w zakładce "Po" poniżej.
| modules/gatk_jointgenotyping.nf | |
|---|---|
Jest kilka rzeczy wartych uwagi.
Jak wcześniej, kilka wejść jest wymienionych, mimo że polecenia nie odwołują się do nich bezpośrednio: all_idxs, ref_index i ref_dict.
Wymienienie ich zapewnia, że Nextflow przygotuje te pliki w katalogu roboczym obok plików, które pojawiają się w poleceniach, czego GATK oczekuje znaleźć na podstawie konwencji nazewnictwa.
Zmienna gvcfs_line używa domknięcia Groovy opisanego powyżej do skonstruowania argumentów -V dla GenomicsDBImport.
Ten proces uruchamia dwa polecenia szeregowo, tak jak zrobiłbyś to w terminalu.
GenomicsDBImport łączy pliki GVCF dla pojedynczych próbek w magazyn danych, a następnie GenotypeGVCFs odczytuje ten magazyn danych i generuje końcowy plik VCF na poziomie kohorty.
Magazyn danych GenomicsDB (${cohort_name}_gdb) jest artefaktem pośrednim używanym tylko w ramach procesu; nie pojawia się w bloku wyjściowym.
Po ukończeniu tego proces jest gotowy do użycia. Aby użyć go w workflow'ie, musisz zaimportować moduł i dodać wywołanie procesu.
2.2.3. Zaimportuj moduł¶
Dodaj instrukcję importu do genomics.nf, poniżej istniejących instrukcji importu:
Proces jest teraz dostępny w zakresie workflow'a.
2.2.4. Dodaj wywołanie procesu¶
Dodaj wywołanie GATK_JOINTGENOTYPING w ciele workflow'a, po liniach collect():
| genomics.nf | |
|---|---|
| genomics.nf | |
|---|---|
Proces jest teraz w pełni podłączony. Następnie skonfigurujemy sposób publikowania wyjść.
2.3. Skonfiguruj obsługę wyjść¶
Musimy opublikować wyjścia wspólnego VCF. Dodaj cele publikowania i wpisy bloku wyjściowego dla wyników wspólnego genotypowania.
2.3.1. Dodaj cele publikowania dla wspólnego VCF¶
Dodaj wspólny VCF i jego indeks do sekcji publish: workflow'a:
Teraz zaktualizuj blok wyjściowy, aby pasował.
2.3.2. Dodaj wpisy bloku wyjściowego dla wspólnego VCF¶
Dodaj wpisy dla plików wspólnego VCF. Umieścimy je w katalogu głównym katalogu wyników, ponieważ jest to końcowe wyjście.
Mając proces, cele publikowania i blok wyjściowy na miejscu, możemy przetestować kompletny workflow.
2.4. Uruchom workflow'a¶
Uruchom workflow'a, aby zweryfikować, że wszystko działa.
Wyjście polecenia
Pierwsze dwa kroki są zbuforowane z poprzedniego uruchomienia, a nowy krok GATK_JOINTGENOTYPING uruchamia się raz na zebranych wejściach ze wszystkich trzech próbek.
Końcowy plik wyjściowy, family_trio.joint.vcf (i jego indeks), znajduje się w katalogu wyników.
Zawartość katalogu (skrócone dowiązania symboliczne)
results/
├── family_trio.joint.vcf -> */a6/7cc8ed*/family_trio.joint.vcf
├── family_trio.joint.vcf.idx -> */a6/7cc8ed*/family_trio.joint.vcf.idx
├── gvcf/
│ ├── reads_father.bam.g.vcf -> */27/0d7eb9*/reads_father.bam.g.vcf
│ ├── reads_father.bam.g.vcf.idx -> */27/0d7eb9*/reads_father.bam.g.vcf.idx
│ ├── reads_mother.bam.g.vcf -> */e4/4ed55e*/reads_mother.bam.g.vcf
│ ├── reads_mother.bam.g.vcf.idx -> */e4/4ed55e*/reads_mother.bam.g.vcf.idx
│ ├── reads_son.bam.g.vcf -> */08/e95962*/reads_son.bam.g.vcf
│ └── reads_son.bam.g.vcf.idx -> */08/e95962*/reads_son.bam.g.vcf.idx
└── indexed_bam/
├── reads_father.bam -> */9a/c7a873*/reads_father.bam
├── reads_father.bam.bai -> */9a/c7a873*/reads_father.bam.bai
├── reads_mother.bam -> */f1/8d8486*/reads_mother.bam
├── reads_mother.bam.bai -> */f1/8d8486*/reads_mother.bam.bai
├── reads_son.bam -> */cc/fbc705*/reads_son.bam
└── reads_son.bam.bai -> */cc/fbc705*/reads_son.bam.bai
Jeśli otworzysz wspólny plik VCF, możesz zweryfikować, że workflow wygenerował oczekiwane wywołania wariantów.
Masz teraz zautomatyzowany, w pełni odtwarzalny workflow wspólnego wywoływania wariantów!
Uwaga
Pamiętaj, że pliki danych, które Ci przekazaliśmy, obejmują tylko niewielką część chromosomu 20. Rzeczywisty rozmiar zestawu wywołań wariantów byłby liczony w milionach wariantów. Dlatego używamy tylko małych podzbiorów danych do celów szkoleniowych!
Podsumowanie¶
Wiesz, jak zbierać wyjścia z kanału i łączyć je jako pojedyncze wejście do innego procesu. Wiesz również, jak konstruować linię poleceń używając domknięć Groovy oraz jak uruchamiać wiele poleceń w jednym procesie.
Co dalej?¶
Pogratuluj sobie! Ukończyłeś kurs Nextflow dla Genomiki.
Przejdź do końcowego podsumowania kursu, aby przejrzeć to, czego się nauczyłeś i dowiedzieć się, co będzie dalej.