Bölüm 3: Bir kohort üzerinde ortak çağrı¶
Yapay zeka destekli çeviri - daha fazla bilgi ve iyileştirme önerileri
Daha önce, her örneğin verisini bağımsız olarak işleyen örnek başına varyant çağrı boru hattı oluşturdunuz. Şimdi bunu genişleterek Bölüm 1'de açıklanan ortak varyant çağrısını uygulayacağız (çok örnekli kullanım durumu).
Bu bölümden nasıl başlanır
Kursun bu bölümü, Bölüm 1: Yönteme Genel Bakış, Bölüm 2: Örnek başına varyant çağrısı'nı tamamladığınızı ve çalışan bir genomics.nf boru hattınız olduğunu varsayar.
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.
Bu komutları nf4-science/genomics/ dizininin içinden ç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ğrı iş akışı verir. Aşağıdaki komutu çalıştırarak başarıyla çalıştığını test edebilirsiniz:
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 dizin 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
- Birleştirilmiş GVCF veri deposu üzerinde ortak genotipleme çalıştırarak kohort düzeyinde bir VCF üretin
Bu, Bölüm 1: Yönteme Genel Bakış'ta açıklanan yöntemi uygular (çok örnekli kullanım durumunu kapsayan ikinci bölüm) ve doğrudan Bölüm 2: Örnek başına varyant çağrısı tarafından üretilen iş akışı üzerine inşa edilmiştir.
Ders planı¶
Bunu iki aşamaya ayırdık:
- Örnek başına varyant çağrı 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 genotipleyerek ortak 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.
Bu, Bölüm 1: Yönteme genel bakış'ın ikinci bölümündeki adımları otomatikleştirir; burada bu komutları konteynerlerinde manuel olarak çalıştırmıştınız.
İpucu
Doğru çalışma dizininde olduğunuzdan emin olun:
cd /workspaces/training/nf4-science/genomics
1. Örnek başına varyant çağrı adımını bir GVCF üretecek şekilde değiştirin¶
Bölüm 2'deki boru hattı VCF dosyaları üretir, ancak ortak çağrı GVCF dosyaları gerektirir. GVCF varyant çağrı modunu açmamız ve çıktı dosya uzantısını güncellememiz gerekiyor.
Bölüm 1'deki GVCF varyant çağrı 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 sarmaladığı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 kuralına göre çıktı dosya yolunu karşılık gelen
.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 çıktı bloğunu yeni dosya uzantısıyla eşleşecek şekilde 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ğundaki çı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 çıktı bloğunu eşleşecek şekilde güncelleyin.
1.4. Yeni dizin yapısı için çıktı bloğunu güncelleyin¶
Ayrıca GVCF dosyalarını bir gvcf alt dizinine koymak için output bloğunu güncellememiz gerekiyor.
Modül, yayınlama hedefleri ve çıktı bloğunun tümü güncellendiğinde, 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ı öncekiyle aynı görünüyor, ancak .g.vcf dosyaları ve dizin 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. Ortak genotipleme adımı ekleyin¶
Şimdi örnek başına GVCF'leri toplamamız, bunları bir GenomicsDB veri deposunda birleştirmemiz ve kohort düzeyinde bir VCF üretmek için ortak 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'deki 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 aralıklar dosyasını alır ve bir GenomicsDB veri deposu üretir.
İkincisi bu veri deposunu, bir referans genomu alır ve nihai kohort düzeyinde 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¶
Ortak genotipleme süreci henüz sahip olmadığımız iki tür girdi gerektirir: rastgele bir kohort adı ve tüm örneklerden toplanan GVCF çıktılarının birlikte paketlenmesi.
2.1.1. Bir cohort_name parametresi ekleyin¶
Kohort için rastgele 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.
Bu parametreyi nihai çıktı dosyasını adlandırmak için kullanacağız.
2.1.2. Test profilinde cohort_name için varsayılan değer ekleyin¶
Ayrıca test profilinde cohort_name parametresi için bir varsayılan değer ekliyoruz:
| nextflow.config | |
|---|---|
Ardından, örnek başına çıktıları birlikte işlenebilmeleri için toplamamız gerekecek.
2.1.3. HaplotypeCaller çıktılarını örnekler arasında toplayın¶
GATK_HAPLOTYPECALLER'dan gelen çıktı kanalını doğrudan yeni sürece bağlasaydık, Nextflow süreci her örnek GVCF'si üzerinde ayrı ayrı çağırırdı.
Her üç GVCF'yi (ve dizin 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 parçalara ayıralım:
.outözelliğini kullanarakGATK_HAPLOTYPECALLER'dan çıktı kanalını alıyoruz.- Bölüm 1'de
emit:kullanarak çıktıları adlandırdığımız için, GVCF'leri.vcfile ve dizin dosyalarını.idxile seçebiliriz. Adlandırılmış çıktılar olmadan,.out[0]ve.out[1]kullanmak zorunda kalırdık. collect()operatörü tüm dosyaları tek bir öğede paketler, böyleceall_gvcfs_chüç GVCF'yi birlikte içerir veall_idxs_chüç dizin dosyasını birlikte içerir.
GVCF'leri ve dizin dosyalarını ayrı ayrı toplayabiliriz (bunları demetler halinde birlikte tutmanın aksine) çünkü Nextflow tüm girdi dosyalarını yürütme için birlikte sahneler, bu nedenle dizin dosyaları GVCF'lerin yanında mevcut olacaktır.
İpucu
Kanal operatörlerini uygulamadan önce ve sonra kanalların içeriğini incelemek için view() operatörünü kullanabilirsiniz.
2.2. Ortak genotipleme sürecini yazın ve iş akışında çağırın¶
Bölüm 2'de kullandığımız aynı kalıbı takip ederek, 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 \
...
-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:
Önemli olan, bu string'i toplanan kanaldaki dosyalar ne olursa olsun dinamik olarak oluşturmamız gerekiyor. Nextflow (Groovy aracılığıyla) bunu yapmanın kısa bir yolunu sağlar:
Bunu parçalara ayıralı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 enterpolasyon yapabileceğimiz yerel bir değişken
gvcfs_line'a (defile tanımlanmış) atanır.
Bu satır, sürecin script: bloğunun içine, komut şablonundan önce gider.
script: ile komut şablonunun açılış """ işareti arasına rastgele Groovy kodu yerleştirebilirsiniz.
Ardından sürecin script: bloğunda bu string'in tamamına gvcfs_line olarak başvurabileceksiniz.
2.2.2. Ortak genotipleme süreci için modülü doldurun¶
Ardından, 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.
Devam edin ve yukarıda sağlanan bilgileri kullanarak süreç tanımını doldurun, ardından çalışmanızı aşağıdaki "Sonra" sekmesindeki çözümle karşılaştırın.
Burada belirtmeye değer birkaç şey var.
Daha önce olduğu gibi, komutlar doğrudan referans vermese de birkaç girdi listelenir: all_idxs, ref_index ve ref_dict.
Bunları listelemek, Nextflow'un bu dosyaları GATK'nin adlandırma kurallarına göre bulmayı beklediği komutlarda görünen dosyaların yanında çalışma dizininde sahnelediğinden emin olur.
gvcfs_line değişkeni, GenomicsDBImport için -V argümanlarını oluşturmak üzere yukarıda açıklanan Groovy closure'ını kullanır.
Bu süreç, terminalde yapacağınız gibi seri olarak iki komut çalıştırır.
GenomicsDBImport örnek başına GVCF'leri bir veri deposunda birleştirir, ardından GenotypeGVCFs bu veri deposunu okur ve nihai kohort düzeyinde VCF'yi üretir.
GenomicsDB veri deposu (${cohort_name}_gdb) yalnızca süreç içinde kullanılan bir ara yapıdır; çıktı bloğunda görünmez.
Bunu tamamladığınızda, süreç kullanıma hazırdır. İş 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¶
Mevcut içe aktarma ifadelerinin altına genomics.nf dosyasına içe aktarma 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:
| genomics.nf | |
|---|---|
| genomics.nf | |
|---|---|
Süreç artık tamamen bağlanmış durumda. Ardından, çıktıların nasıl yayınlanacağını yapılandırıyoruz.
2.3. Çıktı işlemeyi yapılandırın¶
Ortak VCF çıktılarını yayınlamamız gerekiyor. Ortak genotipleme sonuçları için yayınlama hedefleri ve çıktı bloğu girdileri ekleyin.
2.3.1. Ortak VCF için yayınlama hedefleri ekleyin¶
İş akışının publish: bölümüne ortak VCF'yi ve dizinini ekleyin:
Şimdi çıktı bloğunu eşleşecek şekilde güncelleyin.
2.3.2. Ortak VCF için çıktı bloğu girdileri ekleyin¶
Ortak VCF dosyaları için girdiler ekleyin. Bu nihai çıktı olduğu için bunları sonuçlar dizininin kök dizinine koyacağız.
Süreç, yayınlama hedefleri ve çıktı bloğunun tümü yerinde olduğunda, 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ış ve yeni GATK_JOINTGENOTYPING adımı üç örnekten toplanan girdiler üzerinde bir kez çalışıyor.
Nihai çıktı dosyası, family_trio.joint.vcf (ve dizini), sonuçlar 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
Ortak VCF dosyasını açarsanız, iş akışının beklenen varyant çağrılarını ürettiğini doğrulayabilirsiniz.
Artık otomatik, tamamen tekrarlanabilir bir ortak varyant çağrı iş akışınız var!
Not
Size verdiğimiz veri dosyalarının yalnızca kromozom 20'nin küçük bir bölümünü kapsadığını unutmayın. Bir varyant çağrı setinin gerçek boyutu milyonlarca varyant olarak sayılır. Bu yüzden eğitim amaçları için yalnızca küçük veri alt kümeleri 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 bir komut satırı oluşturmayı ve tek bir süreçte birden fazla komut çalıştırmayı biliyorsunuz.
Sırada ne var?¶
Kendinize büyük bir alkış verin! Nextflow for Genomics kursunu tamamladınız.
Öğrendiklerinizi gözden geçirmek ve sırada ne olduğunu öğrenmek için son kurs özetine gidin.