भाग 2: प्रति-नमूना वेरिएंट कॉलिंग¶
AI-सहायता प्राप्त अनुवाद - अधिक जानें और सुधार सुझाएं
भाग 1 में, तुमने Samtools और GATK कमांड को उनके संबंधित कंटेनर में मैन्युअल रूप से टेस्ट किया। अब, हम उन्हीं कमांड को एक Nextflow workflow में wrap करने जा रहे हैं।
असाइनमेंट¶
कोर्स के इस भाग में, हम एक workflow विकसित करने जा रहे हैं जो निम्नलिखित करता है:
- Samtools का उपयोग करके प्रत्येक BAM इनपुट फ़ाइल के लिए एक इंडेक्स फ़ाइल जेनरेट करना
- प्रत्येक BAM इनपुट फ़ाइल पर GATK HaplotypeCaller चलाना ताकि VCF (Variant Call Format) में प्रति-नमूना वेरिएंट कॉल जेनरेट हो सकें
यह भाग 1: Method overview के पहले सेक्शन के चरणों को automate करता है, जहाँ तुमने इन कमांड को उनके कंटेनर में मैन्युअल रूप से चलाया था।
शुरुआती बिंदु के रूप में, हम तुम्हें एक workflow फ़ाइल, genomics.nf, प्रदान करते हैं, जो workflow के मुख्य भागों की रूपरेखा देती है, साथ ही दो मॉड्यूल फ़ाइलें, samtools_index.nf और gatk_haplotypecaller.nf, जो प्रत्येक प्रोसेस की संरचना की रूपरेखा देती हैं।
Scaffold फ़ाइलें
#!/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
}
ये फ़ाइलें कार्यात्मक नहीं हैं; उनका उद्देश्य केवल scaffolds के रूप में काम करना है जिन्हें तुम कोड के दिलचस्प भागों से भर सकते हो।
पाठ योजना¶
विकास प्रक्रिया को अधिक शैक्षिक बनाने के लिए, हमने इसे चार चरणों में विभाजित किया है:
- एक single-stage workflow लिखो जो BAM फ़ाइल पर Samtools index चलाता है। यह एक मॉड्यूल बनाना, उसे import करना, और workflow में उसे कॉल करना कवर करता है।
- indexed BAM फ़ाइल पर GATK HaplotypeCaller चलाने के लिए दूसरा प्रोसेस जोड़ो। यह प्रोसेस आउटपुट को इनपुट से जोड़ना और accessory फ़ाइलों को हैंडल करना पेश करता है।
- workflow को नमूनों के batch पर चलाने के लिए अनुकूलित करो। यह parallel execution को कवर करता है और संबंधित फ़ाइलों को एक साथ रखने के लिए tuples पेश करता है।
- workflow को इनपुट फ़ाइलों के batch युक्त टेक्स्ट फ़ाइल स्वीकार करने योग्य बनाओ। यह bulk में इनपुट प्रदान करने के लिए एक सामान्य पैटर्न प्रदर्शित करता है।
प्रत्येक चरण workflow विकास के एक विशिष्ट पहलू पर केंद्रित है।
सुझाव
सुनिश्चित करो कि तुम सही working डायरेक्टरी में हो:
cd /workspaces/training/nf4-science/genomics
1. एक single-stage workflow लिखो जो BAM फ़ाइल पर Samtools index चलाता है¶
यह पहला चरण मूल बातों पर केंद्रित है: एक BAM फ़ाइल लोड करना और उसके लिए एक इंडेक्स जेनरेट करना।
भाग 1 से samtools index कमांड याद करो:
कमांड इनपुट के रूप में एक BAM फ़ाइल लेता है और उसके साथ एक .bai इंडेक्स फ़ाइल उत्पन्न करता है।
कंटेनर URI था community.wave.seqera.io/library/samtools:1.20--b5dfbd93de237464।
हम इस जानकारी को लेने जा रहे हैं और इसे तीन चरणों में Nextflow में wrap करने जा रहे हैं:
- इनपुट सेट अप करो
- indexing प्रोसेस लिखो और workflow में उसे कॉल करो
- आउटपुट हैंडलिंग कॉन्फ़िगर करो
1.1. इनपुट सेट अप करो¶
हमें एक इनपुट पैरामीटर घोषित करना होगा, एक सुविधाजनक डिफ़ॉल्ट मान प्रदान करने के लिए एक test profile बनाना होगा, और एक इनपुट चैनल बनाना होगा।
1.1.1. एक इनपुट पैरामीटर घोषणा जोड़ो¶
मुख्य workflow फ़ाइल genomics.nf में, Pipeline parameters सेक्शन के अंतर्गत, input नामक एक CLI पैरामीटर घोषित करो।
यह CLI पैरामीटर सेट अप करता है, लेकिन हम विकास के दौरान हर बार workflow चलाते समय फ़ाइल पथ टाइप नहीं करना चाहते। डिफ़ॉल्ट मान प्रदान करने के लिए कई विकल्प हैं; यहाँ हम एक test profile का उपयोग करते हैं।
1.1.2. nextflow.config में डिफ़ॉल्ट मान के साथ एक test profile बनाओ¶
एक test profile कमांड लाइन पर इनपुट निर्दिष्ट किए बिना workflow को आज़माने के लिए सुविधाजनक डिफ़ॉल्ट मान प्रदान करता है। यह Nextflow ecosystem में एक सामान्य परंपरा है (अधिक विवरण के लिए Hello Config देखो)।
nextflow.config में एक profiles ब्लॉक जोड़ो जिसमें एक test profile हो जो input पैरामीटर को test BAM फ़ाइलों में से एक पर सेट करता है।
यहाँ, हम ${projectDir} का उपयोग कर रहे हैं, एक built-in Nextflow वेरिएबल जो उस डायरेक्टरी की ओर इशारा करता है जहाँ workflow स्क्रिप्ट स्थित है।
यह absolute paths को hardcode किए बिना डेटा फ़ाइलों और अन्य संसाधनों को संदर्भित करना आसान बनाता है।
1.1.3. इनपुट चैनल सेट अप करो¶
workflow ब्लॉक में, .fromPath चैनल फ़ैक्टरी का उपयोग करके पैरामीटर मान से एक इनपुट चैनल बनाओ (Hello Channels में उपयोग किए गए अनुसार)।
अब, हमें इस इनपुट पर indexing चलाने के लिए प्रोसेस बनाना होगा।
1.2. indexing प्रोसेस लिखो और workflow में उसे कॉल करो¶
हमें मॉड्यूल फ़ाइल में प्रोसेस परिभाषा लिखनी होगी, include statement का उपयोग करके इसे workflow में import करना होगा, और इनपुट पर इसे कॉल करना होगा।
1.2.1. indexing प्रोसेस के लिए मॉड्यूल भरो¶
modules/samtools_index.nf खोलो और प्रोसेस परिभाषा की रूपरेखा की जाँच करो।
तुम्हें मुख्य संरचनात्मक तत्वों को पहचानना चाहिए; यदि नहीं, तो refresher के लिए Hello Nextflow पढ़ने पर विचार करो।
आगे बढ़ो और ऊपर दी गई जानकारी का उपयोग करके प्रोसेस परिभाषा को स्वयं भरो, फिर नीचे "बाद में" टैब में समाधान के विरुद्ध अपने काम की जाँच करो।
| modules/samtools_index.nf | |
|---|---|
एक बार जब तुम इसे पूरा कर लो, तो प्रोसेस पूर्ण हो जाता है। इसे workflow में उपयोग करने के लिए, तुम्हें मॉड्यूल import करना होगा और एक प्रोसेस कॉल जोड़नी होगी।
1.2.2. मॉड्यूल include करो¶
genomics.nf में, प्रोसेस को workflow के लिए उपलब्ध कराने के लिए एक include statement जोड़ो:
प्रोसेस अब workflow scope में उपलब्ध है।
1.2.3. इनपुट पर indexing प्रोसेस कॉल करो¶
अब, workflow ब्लॉक में SAMTOOLS_INDEX के लिए एक कॉल जोड़ें, इनपुट चैनल को argument के रूप में पास करते हुए।
workflow अब इनपुट लोड करता है और उस पर indexing प्रोसेस चलाता है। इसके बाद, हमें कॉन्फ़िगर करना होगा कि आउटपुट कैसे publish किया जाए।
1.3. आउटपुट हैंडलिंग कॉन्फ़िगर करो¶
हमें यह घोषित करना होगा कि कौन से प्रोसेस आउटपुट publish करने हैं और निर्दिष्ट करना होगा कि वे कहाँ जाने चाहिए।
1.3.1. publish: सेक्शन में एक आउटपुट घोषित करो¶
workflow ब्लॉक के अंदर publish: सेक्शन घोषित करता है कि कौन से प्रोसेस आउटपुट publish किए जाने चाहिए।
SAMTOOLS_INDEX के आउटपुट को bam_index नामक एक named target को assign करो।
अब, हमें Nextflow को बताना होगा कि published आउटपुट कहाँ रखना है।
1.3.2. output {} ब्लॉक में आउटपुट target कॉन्फ़िगर करो¶
output {} ब्लॉक workflow के बाहर बैठता है और निर्दिष्ट करता है कि प्रत्येक named target कहाँ publish किया जाता है।
चलो bam_index के लिए एक target जोड़ें जो bam/ subdirectory में publish करता है।
नोट
डिफ़ॉल्ट रूप से, Nextflow आउटपुट फ़ाइलों को symbolic links के रूप में publish करता है, जो अनावश्यक duplication से बचता है।
भले ही हम यहाँ जो डेटा फ़ाइलें उपयोग कर रहे हैं वे बहुत छोटी हैं, genomics में वे बहुत बड़ी हो सकती हैं।
जब तुम अपनी work डायरेक्टरी को साफ़ करते हो तो Symlinks टूट जाएंगे, इसलिए production workflows के लिए तुम डिफ़ॉल्ट publish mode को 'copy' में override करना चाह सकते हो।
1.4. workflow चलाओ¶
इस बिंदु पर, हमारे पास एक one-step indexing workflow है जो पूरी तरह से कार्यात्मक होना चाहिए। चलो परीक्षण करें कि यह काम करता है!
हम इसे -profile test के साथ चला सकते हैं ताकि test profile में सेट किए गए डिफ़ॉल्ट मान का उपयोग किया जा सके और कमांड लाइन पर पथ लिखने से बचा जा सके।
कमांड आउटपुट
तुम जाँच सकते हो कि इंडेक्स फ़ाइल सही तरीके से जेनरेट हुई है या नहीं work डायरेक्टरी या results डायरेक्टरी में देखकर।
Work डायरेक्टरी सामग्री
वहाँ है!
सारांश¶
तुम जानते हो कि एक प्रोसेस युक्त मॉड्यूल कैसे बनाएँ, इसे workflow में import करें, इसे इनपुट चैनल के साथ कॉल करें, और परिणाम publish करें।
आगे क्या है?¶
एक दूसरा चरण जोड़ो जो indexing प्रोसेस के आउटपुट को लेता है और इसका उपयोग वेरिएंट कॉलिंग चलाने के लिए करता है।
2. indexed BAM फ़ाइल पर GATK HaplotypeCaller चलाने के लिए दूसरा प्रोसेस जोड़ो¶
अब जब हमारे पास अपनी इनपुट फ़ाइल के लिए एक इंडेक्स है, तो हम वेरिएंट कॉलिंग चरण सेट अप करने के लिए आगे बढ़ सकते हैं।
भाग 1 से gatk HaplotypeCaller कमांड याद करो:
gatk HaplotypeCaller \
-R /data/ref/ref.fasta \
-I /data/bam/reads_mother.bam \
-O reads_mother.vcf \
-L /data/ref/intervals.bed
कमांड एक BAM फ़ाइल (-I), एक reference genome (-R), और एक intervals फ़ाइल (-L) लेता है, और अपने इंडेक्स के साथ एक VCF फ़ाइल (-O) उत्पन्न करता है।
टूल BAM इंडेक्स, reference इंडेक्स, और reference dictionary को उनकी संबंधित फ़ाइलों के साथ co-located होने की भी अपेक्षा करता है।
कंटेनर URI था community.wave.seqera.io/library/gatk4:4.5.0.0--730ee8817e436867।
हम पहले की तरह तीन चरणों का पालन करते हैं:
- इनपुट सेट अप करो
- वेरिएंट कॉलिंग प्रोसेस लिखो और workflow में उसे कॉल करो
- आउटपुट हैंडलिंग कॉन्फ़िगर करो
2.1. इनपुट सेट अप करो¶
वेरिएंट कॉलिंग चरण के लिए कई अतिरिक्त इनपुट फ़ाइलों की आवश्यकता होती है। हमें उनके लिए पैरामीटर घोषित करने होंगे, test profile में डिफ़ॉल्ट मान जोड़ने होंगे, और उन्हें लोड करने के लिए वेरिएबल बनाने होंगे।
2.1.1. accessory इनपुट के लिए पैरामीटर घोषणाएँ जोड़ो¶
चूंकि हमारा नया प्रोसेस कुछ अतिरिक्त फ़ाइलों की अपेक्षा करता है, genomics.nf में Pipeline parameters सेक्शन के अंतर्गत उनके लिए पैरामीटर घोषणाएँ जोड़ो:
पहले की तरह, हम inline के बजाय test profile के माध्यम से डिफ़ॉल्ट मान प्रदान करेंगे।
2.1.2. test profile में accessory फ़ाइल डिफ़ॉल्ट जोड़ो¶
जैसा कि हमने सेक्शन 1.1.2 में input के लिए किया था, nextflow.config में test profile में accessory फ़ाइलों के लिए डिफ़ॉल्ट मान जोड़ो:
| nextflow.config | |
|---|---|
अब, हमें वेरिएबल बनाने होंगे जो workflow में उपयोग के लिए इन फ़ाइल पथों को लोड करते हैं।
2.1.3. accessory फ़ाइलों के लिए वेरिएबल बनाओ¶
workflow ब्लॉक के अंदर accessory फ़ाइल पथों के लिए वेरिएबल जोड़ो:
file() सिंटैक्स Nextflow को स्पष्ट रूप से बताता है कि इन इनपुट को फ़ाइल पथों के रूप में हैंडल करना है।
तुम Side Quest Working with files में इसके बारे में अधिक जान सकते हो।
2.2. वेरिएंट कॉलिंग प्रोसेस लिखो और workflow में उसे कॉल करो¶
हमें मॉड्यूल फ़ाइल में प्रोसेस परिभाषा लिखनी होगी, include statement का उपयोग करके इसे workflow में import करना होगा, और इनपुट reads plus indexing चरण के आउटपुट और accessory फ़ाइलों पर इसे कॉल करना होगा।
2.2.1. वेरिएंट कॉलिंग प्रोसेस के लिए मॉड्यूल भरो¶
modules/gatk_haplotypecaller.nf खोलो और प्रोसेस परिभाषा की रूपरेखा की जाँच करो।
आगे बढ़ो और ऊपर दी गई जानकारी का उपयोग करके प्रोसेस परिभाषा को स्वयं भरो, फिर नीचे "बाद में" टैब में समाधान के विरुद्ध अपने काम की जाँच करो।
तुम देखोगे कि इस प्रोसेस में GATK कमांड की आवश्यकता से अधिक इनपुट हैं। GATK naming conventions के आधार पर BAM इंडेक्स फ़ाइल और reference genome की accessory फ़ाइलों को देखना जानता है, लेकिन Nextflow domain-agnostic है और इन conventions के बारे में नहीं जानता। हमें उन्हें स्पष्ट रूप से सूचीबद्ध करना होगा ताकि Nextflow उन्हें runtime पर working डायरेक्टरी में stage करे; अन्यथा GATK missing फ़ाइलों के बारे में एक error throw करेगा।
इसी तरह, हम आउटपुट VCF की इंडेक्स फ़ाइल ("${input_bam}.vcf.idx") को स्पष्ट रूप से सूचीबद्ध करते हैं ताकि Nextflow बाद के चरणों के लिए इसका ट्रैक रखे।
हम प्रत्येक आउटपुट चैनल को एक नाम assign करने के लिए emit: सिंटैक्स का उपयोग करते हैं, जो तब उपयोगी हो जाएगा जब हम आउटपुट को publish ब्लॉक में wire करेंगे।
एक बार जब तुम इसे पूरा कर लो, तो प्रोसेस पूर्ण हो जाता है। इसे workflow में उपयोग करने के लिए, तुम्हें मॉड्यूल import करना होगा और एक प्रोसेस कॉल जोड़नी होगी।
2.2.2. नया मॉड्यूल import करो¶
नए मॉड्यूल को import करने के लिए genomics.nf को अपडेट करो:
प्रोसेस अब workflow scope में उपलब्ध है।
2.2.3. प्रोसेस कॉल जोड़ो¶
workflow body में, main: के अंतर्गत प्रोसेस कॉल जोड़ो:
तुम्हें Hello Nextflow प्रशिक्षण श्रृंखला से *.out सिंटैक्स को पहचानना चाहिए; हम Nextflow को बता रहे हैं कि SAMTOOLS_INDEX द्वारा आउटपुट किए गए चैनल को लें और उसे GATK_HAPLOTYPECALLER प्रोसेस कॉल में plug करें।
नोट
ध्यान दें कि इनपुट प्रोसेस के कॉल में उसी क्रम में प्रदान किए जाते हैं जिस क्रम में वे प्रोसेस के input ब्लॉक में सूचीबद्ध हैं। Nextflow में, इनपुट positional हैं, जिसका अर्थ है कि तुम्हें उसी क्रम का पालन करना चाहिए; और निश्चित रूप से तत्वों की संख्या समान होनी चाहिए।
2.3. आउटपुट हैंडलिंग कॉन्फ़िगर करो¶
हमें publish घोषणा में नए आउटपुट जोड़ने होंगे और कॉन्फ़िगर करना होगा कि वे कहाँ जाते हैं।
2.3.1. वेरिएंट कॉलिंग आउटपुट के लिए publish targets जोड़ो¶
publish: सेक्शन में VCF और इंडेक्स आउटपुट जोड़ो:
अब, हमें Nextflow को बताना होगा कि नए आउटपुट कहाँ रखने हैं।
2.3.2. नए आउटपुट targets कॉन्फ़िगर करो¶
output {} ब्लॉक में vcf और vcf_idx targets के लिए entries जोड़ो, दोनों को vcf/ subdirectory में publish करते हुए:
VCF और इसका इंडेक्स अलग targets के रूप में publish किए जाते हैं जो दोनों vcf/ subdirectory में जाते हैं।
2.4. workflow चलाओ¶
विस्तारित workflow चलाओ, इस बार -resume जोड़ते हुए ताकि हमें indexing चरण को फिर से चलाना न पड़े।
कमांड आउटपुट
अब यदि हम console आउटपुट को देखें, तो हम दो प्रोसेस सूचीबद्ध देखते हैं।
पहला प्रोसेस caching के कारण skip किया गया था, जैसा कि अपेक्षित था, जबकि दूसरा प्रोसेस चलाया गया क्योंकि यह बिल्कुल नया है।
तुम results डायरेक्टरी में आउटपुट फ़ाइलें पाओगे (work डायरेक्टरी के symbolic links के रूप में)।
डायरेक्टरी सामग्री
यदि तुम VCF फ़ाइल खोलते हो, तो तुम्हें उस फ़ाइल के समान सामग्री दिखनी चाहिए जो तुमने कंटेनर में सीधे GATK कमांड चलाकर जेनरेट की थी।
फ़ाइल सामग्री
यह वह आउटपुट है जिसे हम अपने अध्ययन में प्रत्येक नमूने के लिए जेनरेट करने की परवाह करते हैं।
सारांश¶
तुम जानते हो कि दो-चरणीय modular workflow कैसे बनाएँ जो वास्तविक विश्लेषण कार्य करता है और genomics फ़ाइल format की विशिष्टताओं जैसे accessory फ़ाइलों से निपटने में सक्षम है।
आगे क्या है?¶
workflow को bulk में कई नमूनों को हैंडल करने योग्य बनाओ।
3. workflow को नमूनों के batch पर चलाने के लिए अनुकूलित करो¶
एक workflow होना जो एक single नमूने पर processing को automate कर सकता है, यह सब अच्छा है, लेकिन यदि तुम्हारे पास 1000 नमूने हैं तो क्या होगा? क्या तुम्हें एक bash स्क्रिप्ट लिखने की आवश्यकता है जो तुम्हारे सभी नमूनों के माध्यम से loop करती है?
नहीं, भगवान का शुक्र है! बस कोड में एक minor tweak करो और Nextflow तुम्हारे लिए भी इसे हैंडल करेगा।
3.1. तीन नमूनों को सूचीबद्ध करने के लिए इनपुट अपडेट करो¶
कई नमूनों पर चलाने के लिए, test profile को एक single के बजाय फ़ाइल पथों की एक array प्रदान करने के लिए अपडेट करो। यह multi-sample execution का परीक्षण करने का एक त्वरित तरीका है; अगले चरण में हम इनपुट की एक फ़ाइल का उपयोग करके अधिक scalable दृष्टिकोण पर स्विच करेंगे।
पहले, पैरामीटर घोषणा में type annotation को comment out करो, क्योंकि arrays typed घोषणाओं का उपयोग नहीं कर सकते:
फिर सभी तीन नमूनों को सूचीबद्ध करने के लिए test profile को अपडेट करो:
| nextflow.config | |
|---|---|
workflow body में चैनल फ़ैक्टरी (.fromPath) एक single के साथ-साथ कई फ़ाइल पथों को स्वीकार करती है, इसलिए कोई अन्य परिवर्तन की आवश्यकता नहीं है।
3.2. workflow चलाओ¶
अब workflow चलाने की कोशिश करो जब plumbing सभी तीन test नमूनों पर चलाने के लिए सेट अप है।
मज़ेदार बात: यह काम कर सकता है, या यह fail हो सकता है। उदाहरण के लिए, यहाँ एक run है जो सफल रहा:
कमांड आउटपुट
यदि तुम्हारा workflow run सफल रहा, तो इसे तब तक फिर से चलाओ जब तक तुम्हें इस तरह की error न मिले:
कमांड आउटपुट
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.
...
यदि तुम GATK कमांड error आउटपुट को देखते हो, तो इस तरह की एक लाइन होगी:
A USER ERROR has occurred: Traversal by intervals was requested but some input files are not indexed.
खैर, यह अजीब है, यह देखते हुए कि हमने workflow के पहले चरण में स्पष्ट रूप से BAM फ़ाइलों को indexed किया। क्या plumbing में कुछ गड़बड़ हो सकती है?
3.3. समस्या का निवारण करो¶
हम work डायरेक्टरी का निरीक्षण करेंगे और यह पता लगाने के लिए view() ऑपरेटर का उपयोग करेंगे कि क्या गलत हुआ।
3.3.1. संबंधित कॉल के लिए work डायरेक्टरी की जाँच करो¶
console आउटपुट में सूचीबद्ध failed GATK_HAPLOTYPECALLER प्रोसेस कॉल के लिए work डायरेक्टरी के अंदर देखो।
डायरेक्टरी सामग्री
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
इस डायरेक्टरी में सूचीबद्ध BAM फ़ाइल और BAM इंडेक्स के नामों पर विशेष ध्यान दो: reads_son.bam और reads_father.bam.bai।
क्या बात है? Nextflow ने इस प्रोसेस कॉल की work डायरेक्टरी में एक इंडेक्स फ़ाइल stage की है, लेकिन यह गलत है। यह कैसे हो सकता है?
3.3.2. चैनल सामग्री का निरीक्षण करने के लिए view() ऑपरेटर का उपयोग करो¶
चैनल की सामग्री को देखने के लिए GATK_HAPLOTYPECALLER प्रोसेस कॉल से पहले workflow body में ये दो लाइनें जोड़ो:
फिर workflow कमांड फिर से चलाओ।
एक बार फिर, यह सफल या fail हो सकता है। यहाँ एक failed run के लिए दो .view() कॉल के आउटपुट की तरह दिखता है:
/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
पहली तीन लाइनें इनपुट चैनल से मेल खाती हैं और दूसरी, आउटपुट चैनल से। तुम देख सकते हो कि तीन नमूनों के लिए BAM फ़ाइलें और इंडेक्स फ़ाइलें एक ही क्रम में सूचीबद्ध नहीं हैं!
नोट
जब तुम कई तत्वों वाले चैनल पर Nextflow प्रोसेस कॉल करते हो, तो Nextflow execution को यथासंभव parallelize करने की कोशिश करेगा, और जो भी क्रम में उपलब्ध हो जाएंगे उस क्रम में आउटपुट एकत्र करेगा। परिणाम यह है कि संबंधित आउटपुट मूल इनपुट के दिए गए क्रम से अलग क्रम में एकत्र किए जा सकते हैं।
जैसा कि वर्तमान में लिखा गया है, हमारी workflow स्क्रिप्ट मानती है कि इंडेक्स फ़ाइलें indexing चरण से उसी mother/father/son क्रम में सूचीबद्ध होंगी जैसे इनपुट दिए गए थे। लेकिन यह गारंटी नहीं है कि ऐसा होगा, यही कारण है कि कभी-कभी (हालांकि हमेशा नहीं) दूसरे चरण में गलत फ़ाइलें जोड़ी जाती हैं।
इसे ठीक करने के लिए, हमें यह सुनिश्चित करना होगा कि BAM फ़ाइलें और उनकी इंडेक्स फ़ाइलें चैनलों के माध्यम से एक साथ यात्रा करें।
सुझाव
workflow कोड में view() statements कुछ नहीं करते, इसलिए उन्हें छोड़ना कोई समस्या नहीं है।
हालाँकि वे तुम्हारे console आउटपुट को अव्यवस्थित करेंगे, इसलिए हम अनुशंसा करते हैं कि जब तुम समस्या का निवारण कर लो तो उन्हें हटा दो।
3.4. इंडेक्स फ़ाइलों को सही ढंग से हैंडल करने के लिए workflow अपडेट करो¶
fix यह है कि प्रत्येक BAM फ़ाइल को उसके इंडेक्स के साथ एक tuple में bundle करें, फिर downstream प्रोसेस और workflow plumbing को match करने के लिए अपडेट करें।
3.4.1. SAMTOOLS_INDEX मॉड्यूल के आउटपुट को tuple में बदलो¶
यह सुनिश्चित करने का सबसे सरल तरीका है कि एक BAM फ़ाइल और उसका इंडेक्स निकटता से जुड़े रहें, उन्हें index task से बाहर आने वाले tuple में एक साथ package करना है।
नोट
एक tuple तत्वों की एक finite, ordered list है जो आमतौर पर एक function से कई मान वापस करने के लिए उपयोग की जाती है। Tuples विशेष रूप से उपयोगी हैं जब प्रोसेस के बीच कई इनपुट या आउटपुट पास करते समय उनके association और order को संरक्षित करना हो।
modules/samtools_index.nf में आउटपुट को BAM फ़ाइल शामिल करने के लिए अपडेट करो:
इस तरह, प्रत्येक इंडेक्स फ़ाइल अपनी मूल BAM फ़ाइल के साथ कसकर जुड़ी होगी, और indexing चरण का समग्र आउटपुट फ़ाइलों के जोड़े युक्त एक single चैनल होगा।
3.4.2. GATK_HAPLOTYPECALLER मॉड्यूल के इनपुट को tuple स्वीकार करने के लिए बदलो¶
चूंकि हमने पहले प्रोसेस के आउटपुट के 'shape' को बदल दिया है, हमें दूसरे प्रोसेस की इनपुट परिभाषा को match करने के लिए अपडेट करना होगा।
modules/gatk_haplotypecaller.nf अपडेट करो:
अब, हमें प्रोसेस कॉल और publish targets में नई tuple संरचना को reflect करने के लिए workflow को अपडेट करना होगा।
3.4.3. workflow में GATK_HAPLOTYPECALLER के कॉल को अपडेट करो¶
हमें अब GATK_HAPLOTYPECALLER प्रोसेस को मूल reads_ch प्रदान करने की आवश्यकता नहीं है, क्योंकि BAM फ़ाइल अब SAMTOOLS_INDEX द्वारा आउटपुट किए गए चैनल में bundled है।
genomics.nf में कॉल अपडेट करो:
अंत में, हमें नई आउटपुट संरचना को reflect करने के लिए publish targets को अपडेट करना होगा।
3.4.4. indexed BAM आउटपुट के लिए publish target अपडेट करो¶
चूंकि SAMTOOLS_INDEX आउटपुट अब BAM फ़ाइल और उसके इंडेक्स दोनों युक्त एक tuple है, इसकी सामग्री को बेहतर ढंग से reflect करने के लिए publish target का नाम bam_index से indexed_bam में बदलो:
इन परिवर्तनों के साथ, BAM और उसका इंडेक्स एक साथ यात्रा करने की गारंटी है, इसलिए pairing हमेशा सही होगी।
3.5. सही किए गए workflow को चलाओ¶
आगे बढ़ने के लिए यह सुनिश्चित करने के लिए workflow को फिर से चलाओ कि यह विश्वसनीय रूप से काम करेगा।
इस बार (और हर बार) सब कुछ सही ढंग से चलना चाहिए:
कमांड आउटपुट
results डायरेक्टरी में अब प्रत्येक नमूने के लिए BAM और BAI फ़ाइलें (tuple से) शामिल हैं, साथ ही VCF आउटपुट भी:
Results डायरेक्टरी सामग्री
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 -> ...
संबंधित फ़ाइलों को tuples में bundle करके, हमने सुनिश्चित किया कि सही फ़ाइलें हमेशा workflow के माध्यम से एक साथ यात्रा करती हैं। workflow अब किसी भी संख्या में नमूनों को विश्वसनीय रूप से process करता है, लेकिन उन्हें config में व्यक्तिगत रूप से सूचीबद्ध करना बहुत scalable नहीं है। अगले चरण में, हम एक फ़ाइल से इनपुट पढ़ने पर स्विच करेंगे।
सारांश¶
तुम जानते हो कि अपने workflow को कई नमूनों पर (स्वतंत्र रूप से) चलाने योग्य कैसे बनाएँ।
आगे क्या है?¶
bulk में नमूनों को हैंडल करना आसान बनाओ।
4. workflow को इनपुट फ़ाइलों के batch युक्त टेक्स्ट फ़ाइल स्वीकार करने योग्य बनाओ¶
workflow को कई डेटा इनपुट फ़ाइलें प्रदान करने का एक बहुत सामान्य तरीका फ़ाइल पथों युक्त टेक्स्ट फ़ाइल के साथ करना है। यह एक टेक्स्ट फ़ाइल के रूप में सरल हो सकती है जो प्रति लाइन एक फ़ाइल पथ सूचीबद्ध करती है और कुछ नहीं, या फ़ाइल में अतिरिक्त metadata हो सकता है, जिस स्थिति में इसे अक्सर samplesheet कहा जाता है।
यहाँ हम तुम्हें दिखाने जा रहे हैं कि simple case कैसे करें।
4.1. इनपुट फ़ाइल पथों को सूचीबद्ध करने वाली प्रदान की गई CSV फ़ाइल की जाँच करो¶
हमने पहले से ही इनपुट फ़ाइल पथों को सूचीबद्ध करने वाली एक CSV फ़ाइल बनाई है, जिसे samplesheet.csv कहा जाता है, जिसे तुम 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
यह CSV फ़ाइल में एक header line शामिल है जो columns को नाम देती है।
चेतावनी
CSV में फ़ाइल पथ absolute paths हैं जो तुम्हारे वातावरण से match करने चाहिए। यदि तुम हमारे द्वारा प्रदान किए गए प्रशिक्षण वातावरण में इसे नहीं चला रहे हो, तो तुम्हें अपने सिस्टम से match करने के लिए paths को अपडेट करने की आवश्यकता होगी।
4.2. पैरामीटर और test profile अपडेट करो¶
व्यक्तिगत नमूनों को सूचीबद्ध करने के बजाय samplesheet.csv फ़ाइल की ओर इशारा करने के लिए input पैरामीटर को switch करो।
params ब्लॉक में type annotation restore करो (क्योंकि यह फिर से एक single path है):
फिर टेक्स्ट फ़ाइल की ओर इशारा करने के लिए test profile को अपडेट करो:
| nextflow.config | |
|---|---|
फ़ाइलों की list अब कोड में बिल्कुल नहीं रहती, जो सही दिशा में एक बड़ा कदम है।
4.3. CSV इनपुट को parse करने के लिए चैनल फ़ैक्टरी अपडेट करो¶
वर्तमान में, हमारी इनपुट चैनल फ़ैक्टरी हमें दी गई किसी भी फ़ाइल को डेटा इनपुट के रूप में treat करती है जिसे हम indexing प्रोसेस को feed करना चाहते हैं। चूंकि हम अब इसे एक फ़ाइल दे रहे हैं जो इनपुट फ़ाइल पथों को सूचीबद्ध करती है, हमें फ़ाइल को parse करने और इसमें शामिल फ़ाइल पथों को डेटा इनपुट के रूप में treat करने के लिए इसके व्यवहार को बदलने की आवश्यकता है।
हम उसी पैटर्न का उपयोग करके ऐसा कर सकते हैं जिसका हमने Hello Nextflow के भाग 2 में उपयोग किया था: फ़ाइल को parse करने के लिए splitCsv() ऑपरेटर लागू करना, फिर प्रत्येक row से फ़ाइल पथ extract करने के लिए एक map operation।
एक चीज़ जो नई है जो तुमने Hello Nextflow कोर्स में सामना की थी उसकी तुलना में यह है कि इस CSV में एक header line है, इसलिए हम splitCsv() कॉल में header: true जोड़ते हैं।
यह हमें map operation में columns को नाम से संदर्भित करने की अनुमति देता है: row.reads_bam प्रत्येक row के reads_bam column से फ़ाइल पथ extract करता है।
सुझाव
यदि तुम्हें विश्वास नहीं है कि तुम समझते हो कि ऑपरेटर यहाँ क्या कर रहे हैं, तो यह उन्हें लागू करने से पहले और बाद में चैनल सामग्री कैसी दिखती है यह देखने के लिए .view() ऑपरेटर का उपयोग करने का एक और शानदार अवसर है।
4.4. workflow चलाओ¶
workflow को एक बार और चलाओ।
कमांड आउटपुट
इसे पहले जैसा ही परिणाम उत्पन्न करना चाहिए। हमारे simple वेरिएंट कॉलिंग workflow में अब वे सभी बुनियादी features हैं जो हम चाहते थे।
सारांश¶
तुम जानते हो कि BAM फ़ाइल को index करने और GATK का उपयोग करके प्रति-नमूना वेरिएंट कॉलिंग लागू करने के लिए multi-step modular workflow कैसे बनाएँ।
अधिक सामान्य रूप से, तुमने सीखा है कि genomics फ़ाइल formats और tool requirements की विशिष्टताओं को ध्यान में रखते हुए वास्तविक काम करने वाली एक simple genomics pipeline बनाने के लिए आवश्यक Nextflow components और logic का उपयोग कैसे करें।
आगे क्या है?¶
एक break लो! यह बहुत कुछ था।
जब तुम तरोताज़ा महसूस करो, तो भाग 3 पर जाओ, जहाँ तुम सीखोगे कि डेटा पर joint वेरिएंट कॉलिंग लागू करने के लिए इस simple प्रति-नमूना वेरिएंट कॉलिंग workflow को कैसे transform करें।