Bölüm 3: Kohort üzerinde birleşik çağırma¶
Bölüm 2'de, her bir örneğin verisini bağımsız olarak işleyen örnek başına varyant çağırma boru hattı oluşturdunuz. Şimdi bunu genişleterek Bölüm 1'de ele alınan birleşik varyant çağırmayı uygulayacağız.
Görev¶
Kursun bu bölümünde, iş akışını aşağıdakileri yapacak şekilde genişleteceğiz:
- Samtools kullanarak her BAM girdi dosyası için bir indeks dosyası oluşturun
- Her BAM girdi dosyası üzerinde GATK HaplotypeCaller'ı çalıştırarak örnek başına genomik varyant çağrılarının bir GVCF'sini oluşturun
- Tüm GVCF'leri toplayın ve bunları bir GenomicsDB veri deposunda birleştirin
- Kohort seviyesinde bir VCF üretmek için birleştirilmiş GVCF veri deposu üzerinde birleşik genotipleme çalıştırın
Bu bölüm doğrudan Bölüm 2 tarafından üretilen iş akışı üzerine inşa edilir.
Bu bölümden nasıl başlanır
Kursun bu bölümü Bölüm 2: Örnek başına varyant çağırma bölümünü tamamladığınızı ve çalışan bir genomics.nf boru hattınız olduğunu varsayar.
Eğer Bölüm 2'yi tamamlamadıysanız veya bu bölüm için yeni başlamak istiyorsanız, Bölüm 2 çözümünü başlangıç noktanız olarak kullanabilirsiniz.
nf4-science/genomics/ dizini içinden şu komutları çalıştırın:
cp solutions/part2/genomics-2.nf genomics.nf
cp solutions/part2/nextflow.config .
cp solutions/part2/modules/* modules/
Bu size eksiksiz bir örnek başına varyant çağırma iş akışı verir. Aşağıdaki komutu çalıştırarak başarıyla çalıştığını test edebilirsiniz:
Ders planı¶
Bunu iki adıma ayırdık:
- Örnek başına varyant çağırma adımını bir GVCF üretecek şekilde değiştirin. Bu, süreç komutlarını ve çıktılarını güncellemeyi kapsar.
- Örnek başına GVCF'leri birleştiren ve genotipleyenbir birleşik genotipleme adımı ekleyin.
Bu,
collect()operatörünü, komut satırı oluşturma için Groovy closure'larını ve çoklu komutlu süreçleri tanıtır.
Note
Doğru çalışma dizininde olduğunuzdan emin olun:
cd /workspaces/training/nf4-science/genomics
1. Örnek başına varyant çağırma adımını bir GVCF üretecek şekilde değiştirin¶
Bölüm 2'deki boru hattı VCF dosyaları üretir, ancak birleşik çağırma GVCF dosyaları gerektirir. GVCF varyant çağırma modunu açmamız ve çıktı dosya uzantısını güncellememiz gerekiyor.
Bölüm 1'den GVCF varyant çağırma komutunu hatırlayın:
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
Bölüm 2'de sardığımız temel HaplotypeCaller komutuna kıyasla, farklar -ERC GVCF parametresi ve .g.vcf çıktı uzantısıdır.
1.1. HaplotypeCaller'a bir GVCF yayınlamasını söyleyin ve çıktı uzantısını güncelleyin¶
İki değişiklik yapmak için modules/gatk_haplotypecaller.nf modül dosyasını açın:
- GATK HaplotypeCaller komutuna
-ERC GVCFparametresini ekleyin; - GATK konvansiyonuna uygun olarak çıktı dosya yolunu
.g.vcfuzantısını kullanacak şekilde güncelleyin.
-ERC GVCF eklediğinizde önceki satırın sonuna bir ters eğik çizgi (\) eklediğinizden emin olun.
Ayrıca yeni dosya uzantısıyla eşleşmesi için output bloğunu güncellememiz gerekiyor.
Komut çıktısını .vcf'den .g.vcf'ye değiştirdiğimiz için, süreç output: bloğu aynı değişikliği yansıtmalıdır.
1.2. Süreç çıktıları bloğunda çıktı dosya uzantısını güncelleyin¶
Ayrıca iş akışının yayınlama ve çıktı yapılandırmasını yeni GVCF çıktılarını yansıtacak şekilde güncellememiz gerekiyor.
1.3. Yeni GVCF çıktıları için yayınlama hedeflerini güncelleyin¶
Artık VCF'ler yerine GVCF'ler ürettiğimiz için, iş akışının publish: bölümünü daha açıklayıcı isimler kullanacak şekilde güncellememiz gerekir.
Ayrıca netlik için GVCF dosyalarını kendi alt dizinlerinde düzenleyeceğiz.
Şimdi eşleşmesi için output bloğunu güncelleyin.
1.4. Yeni dizin yapısı için output bloğunu güncelleyin¶
GVCF dosyalarını bir gvcf alt dizinine koymak için output bloğunu da güncellememiz gerekiyor.
Modül, yayınlama hedefleri ve output bloğunun tümü güncellendiğine göre, değişiklikleri test edebiliriz.
1.5. Boru hattını çalıştırın¶
Değişikliklerin çalıştığını doğrulamak için iş akışını çalıştırın.
Komut çıktısı
Nextflow çıktısı daha öncekiyle aynı görünüyor, ancak .g.vcf dosyaları ve indeks dosyaları artık alt dizinlerde düzenlenmiş durumda.
Dizin içeriği (sembolik bağlantılar kısaltılmış)
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
GVCF dosyalarından birini açıp içinde gezinirseniz, GATK HaplotypeCaller'ın istendiği gibi GVCF dosyaları ürettiğini doğrulayabilirsiniz.
Özet¶
Bir araç komutunun çıktı dosya adını değiştirdiğinizde, süreç output: bloğu ve yayınlama/çıktı yapılandırması eşleşecek şekilde güncellenmelidir.
Sırada ne var?¶
Bir kanalın içeriğini toplamayı ve bunları bir sonraki sürece tek bir girdi olarak aktarmayı öğrenin.
2. Birleşik genotipleme adımı ekleyin¶
Şimdi örnek başına GVCF'leri toplamamız, bunları bir GenomicsDB veri deposunda birleştirmemiz ve kohort seviyesinde bir VCF üretmek için birleşik genotipleme çalıştırmamız gerekiyor.
Bölüm 1'de ele alındığı gibi, bu iki araçlı bir işlemdir: GenomicsDBImport GVCF'leri birleştirir, ardından GenotypeGVCFs nihai varyant çağrılarını üretir.
Her iki aracı da GATK_JOINTGENOTYPING adlı tek bir süreçte saracağız.
Bölüm 1'den iki komutu hatırlayın:
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
İlk komut örnek başına GVCF'leri ve bir intervals dosyasını alır ve bir GenomicsDB veri deposu üretir.
İkincisi o veri deposunu, bir referans genomu alır ve nihai kohort seviyesi VCF'yi üretir.
Konteyner URI'si HaplotypeCaller ile aynıdır: community.wave.seqera.io/library/gatk4:4.5.0.0--730ee8817e436867.
2.1. Girdileri ayarlayın¶
Birleşik genotipleme süreci henüz sahip olmadığımız iki tür girdi gerektirir: keyfi bir kohort adı ve tüm örneklerden toplanan GVCF çıktıları bir arada paketlenmiş.
2.1.1. Bir cohort_name parametresi ekleyin¶
Kohort için keyfi bir ad sağlamamız gerekiyor.
Eğitim serisinin ilerleyen bölümlerinde bu tür şeyler için örnek meta verilerini nasıl kullanacağınızı öğreneceksiniz, ancak şimdilik sadece params kullanarak bir CLI parametresi bildiriyoruz ve kolaylık için ona varsayılan bir değer veriyoruz.
2.1.2. HaplotypeCaller çıktılarını örnekler arasında toplayın¶
GATK_HAPLOTYPECALLER çıktı kanalını doğrudan yeni sürece bağlarsak, Nextflow süreci her bir örnek GVCF'si üzerinde ayrı ayrı çağırır.
Her üç GVCF'yi (ve indeks dosyalarını) paketlemek istiyoruz, böylece Nextflow hepsini birlikte tek bir süreç çağrısına verir.
Bunu collect() kanal operatörünü kullanarak yapabiliriz.
GATK_HAPLOTYPECALLER çağrısından hemen sonra, workflow gövdesine aşağıdaki satırları ekleyin:
Bunu açıklayalım:
.outözelliğini kullanarakGATK_HAPLOTYPECALLER'dan çıktı kanalını alıyoruz.- Bölüm 1'de
emit:kullanarak çıktıları isimlendirdiğimiz için, GVCF'leri.vcfile ve indeks dosyalarını.idxile seçebiliriz. İsimlendirilmiş çıktılar olmadan,.out[0]ve.out[1]kullanmak zorunda kalırdık. collect()operatörü tüm dosyaları tek bir elemanda paketler, dolayısıylaall_gvcfs_chüç GVCF'yi birlikte içerir veall_idxs_chüç indeks dosyasını birlikte içerir.
GVCF'leri ve indeks dosyalarını ayrı ayrı toplayabiliriz (bunları tuple'larda birlikte tutmanın aksine) çünkü Nextflow tüm girdi dosyalarını yürütme için bir arada hazırlayacak, dolayısıyla indeks dosyaları GVCF'lerin yanında mevcut olacak.
Tip
Kanal operatörleri uygulamadan önce ve sonra kanalların içeriğini incelemek için view() operatörünü kullanabilirsiniz.
2.2. Birleşik genotipleme sürecini yazın ve iş akışında çağırın¶
Bölüm 2'de kullandığımız aynı modeli izleyerek, süreç tanımını bir modül dosyasına yazacağız, iş akışına içe aktaracağız ve hazırladığımız girdiler üzerinde çağıracağız.
2.2.1. Her GVCF'ye bir -V argümanı vermek için bir string oluşturun¶
Süreç tanımını doldurmaya başlamadan önce, çözmemiz gereken bir şey var.
GenomicsDBImport komutu her GVCF dosyası için ayrı bir -V argümanı bekler, şöyle:
gatk GenomicsDBImport \
-V reads_mother.bam.g.vcf \
-V reads_father.bam.g.vcf \
-V reads_son.bam.g.vcf \
...
Eğer -V ${all_gvcfs_ch} yazsaydık, Nextflow sadece dosya adlarını birleştirir ve komutun o kısmı şöyle görünürdü:
Ancak string'in şöyle görünmesi gerekiyor:
Önemlisi, bu string'i toplanan kanaldaki hangi dosyalar olursa olsun dinamik olarak oluşturmamız gerekiyor. Nextflow (Groovy aracılığıyla) bunu yapmanın özet bir yolunu sağlar:
Bunu açıklayalım:
all_gvcfs.collect { gvcf -> "-V ${gvcf}" }her dosya yolu üzerinde yinelenir ve önüne-Vekler,["-V A.g.vcf", "-V B.g.vcf", "-V C.g.vcf"]üretir..join(' ')bunları boşluklarla birleştirir:"-V A.g.vcf -V B.g.vcf -V C.g.vcf".- Sonuç, komut şablonuna interpolasyon yapabileceğimiz yerel bir değişkene (
defile tanımlanan)gvcfs_lineatanır.
Bu satır, sürecin script: bloğunun içine, komut şablonundan önce gider.
script: ile komut şablonunun açılış """ arasına keyfi Groovy kodu yerleştirebilirsiniz.
Ardından sürecin script: bloğunda o string'in tamamına gvcfs_line olarak atıfta bulunabileceksiniz.
2.2.2. Birleşik genotipleme süreci için modülü doldurun¶
Şimdi tam süreci yazmaya başlayabiliriz.
modules/gatk_jointgenotyping.nf dosyasını açın ve süreç tanımının ana hatlarını inceleyin.
Yukarıda verilen bilgileri kullanarak süreç tanımını doldurun, ardından çalışmanızı aşağıdaki "Sonra" sekmesindeki çözümle kontrol edin.
Burada dikkat çekmeye değer birkaç şey var.
Daha önce olduğu gibi, komutlar doğrudan referans vermese de birkaç girdi listelenmiştir: all_idxs, ref_index ve ref_dict.
Bunları listelemek, Nextflow'un bu dosyaları komutlarda görünen dosyaların yanında çalışma dizininde hazırlamasını sağlar, GATK bunları isimlendirme konvansiyonlarına göre bulmayı bekler.
gvcfs_line değişkeni, GenomicsDBImport için -V argümanlarını oluşturmak üzere yukarıda açıklanan Groovy closure'ı kullanır.
Bu süreç terminalde yapacağınız gibi iki komutu seri olarak çalıştırır.
GenomicsDBImport örnek başına GVCF'leri bir veri deposunda birleştirir, ardından GenotypeGVCFs o veri deposunu okur ve nihai kohort seviyesi VCF'yi üretir.
GenomicsDB veri deposu (${cohort_name}_gdb) yalnızca süreç içinde kullanılan bir ara yapıdır; output bloğunda görünmez.
Bunu tamamladıktan sonra, süreç kullanıma hazırdır. Bunu iş akışında kullanmak için modülü içe aktarmanız ve bir süreç çağrısı eklemeniz gerekir.
2.2.3. Modülü içe aktarın¶
genomics.nf dosyasına, mevcut import ifadelerinin altına import ifadesini ekleyin:
Süreç artık iş akışı kapsamında kullanılabilir.
2.2.4. Süreç çağrısını ekleyin¶
collect() satırlarından sonra iş akışı gövdesine GATK_JOINTGENOTYPING çağrısını ekleyin:
Süreç artık tamamen bağlanmış durumda. Şimdi çıktıların nasıl yayınlandığını yapılandırıyoruz.
2.3. Çıktı işlemeyi yapılandırın¶
Birleşik VCF çıktılarını yayınlamamız gerekiyor. Birleşik genotipleme sonuçları için yayınlama hedefleri ve output bloğu girdileri ekleyin.
2.3.1. Birleşik VCF için yayınlama hedefleri ekleyin¶
İş akışının publish: bölümüne birleşik VCF ve indeksini ekleyin:
Şimdi eşleşmesi için output bloğunu güncelleyin.
2.3.2. Birleşik VCF için output bloğu girdileri ekleyin¶
Birleşik VCF dosyaları için girdiler ekleyin. Bu nihai çıktı olduğu için bunları results dizininin kökünde koyacağız.
Süreç, yayınlama hedefleri ve output bloğunun tümü yerinde olduğuna göre, eksiksiz iş akışını test edebiliriz.
2.4. İş akışını çalıştırın¶
Her şeyin çalıştığını doğrulamak için iş akışını çalıştırın.
Komut çıktısı
İlk iki adım önceki çalıştırmadan önbelleğe alınmış durumda ve yeni GATK_JOINTGENOTYPING adımı her üç örnekten toplanan girdiler üzerinde bir kez çalışıyor.
Nihai çıktı dosyası, family_trio.joint.vcf (ve indeksi), results dizinindedir.
Dizin içeriği (sembolik bağlantılar kısaltılmış)
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
Birleşik VCF dosyasını açarsanız, iş akışının beklenen varyant çağrılarını ürettiğini doğrulayabilirsiniz.
Artık otomatik, tamamen yeniden üretilebilir bir birleşik varyant çağırma iş akışına sahipsiniz!
Note
Size verdiğimiz veri dosyalarının kromozom 20'nin yalnızca küçük bir bölümünü kapsadığını unutmayın. Gerçek bir varyant çağrı setinin boyutu milyonlarca varyantla sayılır. Bu yüzden eğitim amaçları için yalnızca verilerin küçük alt kümelerini kullanıyoruz!
Özet¶
Bir kanaldan çıktıları toplamayı ve bunları başka bir sürece tek bir girdi olarak paketlemeyi biliyorsunuz. Ayrıca Groovy closure'ları kullanarak komut satırı oluşturmayı ve tek bir süreçte birden fazla komut çalıştırmayı da biliyorsunuz.
Sırada ne var?¶
Başarınızı kutlayın ve hak ettiğiniz bir ara verin.
Kursun bir sonraki bölümünde, nf-core'dan üretime hazır bir varyant çağırma boru hattı çalıştırmayı ve bunu manuel olarak oluşturduğunuz boru hattıyla karşılaştırmayı öğreneceksiniz.