@@ -227,10 +227,51 @@ public Output performAnalysisPerSampleRemote(Readset rs, File inputBam, Referenc
227227 //Create a BED file with all regions of coverage below MIN_COVERAGE:
228228 int minCoverage = getProvider ().getParameterByName ("minCoverage" ).extractValue (getPipelineCtx ().getJob (), getProvider (), getStepIdx (), Integer .class );
229229 int positionsSkipped = 0 ;
230+ int basesRecoveredFromDeletions = 0 ;
230231 int gapIntervals = 0 ;
231232 double avgDepth ;
232233
233- //TODO: rescue pindel?
234+ boolean runPindel = getProvider ().getParameterByName ("runPindel" ).extractValue (getPipelineCtx ().getJob (), getProvider (), getStepIdx (), Boolean .class , false );
235+
236+ List <VariantContext > pindelConsensusVariants = new ArrayList <>();
237+ int totalPindelConsensusVariants = 0 ;
238+ int totalPindelVariants = 0 ;
239+ if (runPindel )
240+ {
241+ Double minFraction = getProvider ().getParameterByName ("minFraction" ).extractValue (getPipelineCtx ().getJob (), getProvider (), getStepIdx (), Double .class , 0.0 );
242+ int minDepth = getProvider ().getParameterByName ("minDepth" ).extractValue (getPipelineCtx ().getJob (), getProvider (), getStepIdx (), Integer .class , 0 );
243+ int minInsertSize = getProvider ().getParameterByName ("minInsertSize" ).extractValue (getPipelineCtx ().getJob (), getProvider (), getStepIdx (), Integer .class , 0 );
244+
245+ PindelAnalysis .PindelSettings settings = new PindelAnalysis .PindelSettings ();
246+
247+ File pindelOutput = PindelAnalysis .runPindel (output , getPipelineCtx (), rs , outputDir , inputBam , referenceGenome .getWorkingFastaFile (), minFraction , minDepth , true , coverageOut , minInsertSize );
248+ File pindelVcf = PindelAnalysis .createVcf (pindelOutput , new File (pindelOutput .getParentFile (), FileUtil .getBaseName (pindelOutput ) + ".all.vcf.gz" ), referenceGenome , settings );
249+
250+ try (VCFFileReader reader = new VCFFileReader (pindelVcf );CloseableIterator <VariantContext > it = reader .iterator ())
251+ {
252+ while (it .hasNext ())
253+ {
254+ VariantContext vc = it .next ();
255+ if (vc .hasAttribute ("IN_CONSENSUS" ))
256+ {
257+ pindelConsensusVariants .add (vc );
258+ totalPindelConsensusVariants ++;
259+ }
260+
261+ totalPindelVariants ++;
262+ }
263+ }
264+
265+ getPipelineCtx ().getLogger ().info ("Total pindel variants: " + totalPindelVariants );
266+ getPipelineCtx ().getLogger ().info ("Total consensus pindel variants: " + totalPindelConsensusVariants );
267+ if (totalPindelConsensusVariants == 0 )
268+ {
269+ getPipelineCtx ().getLogger ().info ("deleting empty pindel VCF: " + pindelVcf .getPath ());
270+ pindelVcf .delete ();
271+ new File (pindelVcf .getPath () + ".tbi" ).delete ();
272+ }
273+ }
274+
234275 File mask = new File (outputDir , "mask.bed" );
235276 Map <String , Integer > gatkDepth = new HashMap <>();
236277 try (CSVReader reader = new CSVReader (Readers .getReader (coverageOut ), '\t' );CSVWriter writer = new CSVWriter (IOUtil .openFileForBufferedUtf8Writing (mask ), '\t' , CSVWriter .NO_QUOTE_CHARACTER ))
@@ -259,40 +300,63 @@ public Output performAnalysisPerSampleRemote(Readset rs, File inputBam, Referenc
259300
260301 if (depth < minCoverage )
261302 {
262- positionsSkipped ++;
303+ //Check if within pindel SNV calls:
304+ Interval currentPosition = new Interval (tokens [0 ], Integer .parseInt (tokens [1 ]), Integer .parseInt (tokens [1 ]));
305+ boolean withinDeletion = false ;
306+ for (VariantContext vc : pindelConsensusVariants )
307+ {
308+ if (vc .isIndel ())
309+ {
310+ // If we overlap the SNV (which should be just deletions (note: the first position of the variant is the non-indel REF base), allow low coverage:
311+ if (currentPosition .overlaps (vc ) && currentPosition .getStart () != vc .getStart ())
312+ {
313+ basesRecoveredFromDeletions ++;
314+
315+ //TODO: enable this once sure:
316+ //withinDeletion = true;
317+ break ;
318+ }
319+ }
320+ }
263321
264- if (intervalOfCurrentGap != null )
322+ if (! withinDeletion )
265323 {
266- if (intervalOfCurrentGap .getContig ().equals (tokens [0 ]))
324+ positionsSkipped ++;
325+
326+ if (intervalOfCurrentGap != null )
267327 {
268- //extend
269- intervalOfCurrentGap = new Interval (intervalOfCurrentGap .getContig (), intervalOfCurrentGap .getStart (), Integer .parseInt (tokens [1 ]));
328+ if (intervalOfCurrentGap .getContig ().equals (tokens [0 ]))
329+ {
330+ //extend
331+ intervalOfCurrentGap = new Interval (intervalOfCurrentGap .getContig (), intervalOfCurrentGap .getStart (), Integer .parseInt (tokens [1 ]));
332+ }
333+ else
334+ {
335+ //switched contigs, write and make new:
336+ writer .writeNext (new String []{intervalOfCurrentGap .getContig (), String .valueOf (intervalOfCurrentGap .getStart () - 1 ), String .valueOf (intervalOfCurrentGap .getEnd ())});
337+ gapIntervals ++;
338+ intervalOfCurrentGap = currentPosition ;
339+ }
270340 }
271341 else
272342 {
273- //switched contigs, write and make new:
274- writer .writeNext (new String []{intervalOfCurrentGap .getContig (), String .valueOf (intervalOfCurrentGap .getStart ()-1 ), String .valueOf (intervalOfCurrentGap .getEnd ())});
275- gapIntervals ++;
276- intervalOfCurrentGap = new Interval (tokens [0 ], Integer .parseInt (tokens [1 ]), Integer .parseInt (tokens [1 ]));
343+ //Not existing gap, just start one:
344+ intervalOfCurrentGap = currentPosition ;
277345 }
278- }
279- else
280- {
281- //Not existing gap, just start one:
282- intervalOfCurrentGap = new Interval (tokens [0 ], Integer .parseInt (tokens [1 ]), Integer .parseInt (tokens [1 ]));
346+
347+ continue ;
283348 }
284349 }
285- else
286- {
287- //We just existed a gap, so write:
288- if (intervalOfCurrentGap != null )
289- {
290- writer .writeNext (new String []{intervalOfCurrentGap .getContig (), String .valueOf (intervalOfCurrentGap .getStart ()-1 ), String .valueOf (intervalOfCurrentGap .getEnd ())});
291- gapIntervals ++;
292- }
293350
294- intervalOfCurrentGap = null ;
351+ //Otherwise this is a valid position to report:
352+ //We just exited a gap, so write:
353+ if (intervalOfCurrentGap != null )
354+ {
355+ writer .writeNext (new String []{intervalOfCurrentGap .getContig (), String .valueOf (intervalOfCurrentGap .getStart ()-1 ), String .valueOf (intervalOfCurrentGap .getEnd ())});
356+ gapIntervals ++;
295357 }
358+
359+ intervalOfCurrentGap = null ;
296360 }
297361
298362 //Ensure we count final gap
@@ -422,43 +486,6 @@ public Output performAnalysisPerSampleRemote(Readset rs, File inputBam, Referenc
422486 Set <String > variantsBcftools = runBcftools (inputBam , referenceGenome , mask , minCoverage );
423487 int variantsBcftoolsTotal = variantsBcftools .size ();
424488
425- boolean runPindel = getProvider ().getParameterByName ("runPindel" ).extractValue (getPipelineCtx ().getJob (), getProvider (), getStepIdx (), Boolean .class , false );
426-
427- List <VariantContext > pindelConsensusVariants = new ArrayList <>();
428- int totalPindelConsensusVariants = 0 ;
429- if (runPindel )
430- {
431- Double minFraction = getProvider ().getParameterByName ("minFraction" ).extractValue (getPipelineCtx ().getJob (), getProvider (), getStepIdx (), Double .class , 0.0 );
432- int minDepth = getProvider ().getParameterByName ("minDepth" ).extractValue (getPipelineCtx ().getJob (), getProvider (), getStepIdx (), Integer .class , 0 );
433- int minInsertSize = getProvider ().getParameterByName ("minInsertSize" ).extractValue (getPipelineCtx ().getJob (), getProvider (), getStepIdx (), Integer .class , 0 );
434-
435- PindelAnalysis .PindelSettings settings = new PindelAnalysis .PindelSettings ();
436-
437- File pindelOutput = PindelAnalysis .runPindel (output , getPipelineCtx (), rs , outputDir , inputBam , referenceGenome .getWorkingFastaFile (), minFraction , minDepth , true , coverageOut , minInsertSize );
438- File pindelVcf = PindelAnalysis .createVcf (pindelOutput , new File (pindelOutput .getParentFile (), FileUtil .getBaseName (pindelOutput ) + ".vcf.gz" ), referenceGenome , settings );
439-
440- try (VCFFileReader reader = new VCFFileReader (pindelVcf );CloseableIterator <VariantContext > it = reader .iterator ())
441- {
442- while (it .hasNext ())
443- {
444- VariantContext vc = it .next ();
445- if (vc .hasAttribute ("IN_CONSENSUS" ))
446- {
447- pindelConsensusVariants .add (vc );
448- totalPindelConsensusVariants ++;
449- }
450- }
451- }
452-
453- getPipelineCtx ().getLogger ().info ("Total consensus pindel variants: " + totalPindelConsensusVariants );
454- if (totalPindelConsensusVariants == 0 )
455- {
456- getPipelineCtx ().getLogger ().info ("deleting empty pindel VCF: " + pindelVcf .getPath ());
457- pindelVcf .delete ();
458- new File (pindelVcf .getPath () + ".tbi" ).delete ();
459- }
460- }
461-
462489 //Create final VCF:
463490 int totalVariants = 0 ;
464491 int totalGT1 = 0 ;
@@ -602,10 +629,11 @@ public Output performAnalysisPerSampleRemote(Readset rs, File inputBam, Referenc
602629 }
603630 }
604631
605- //TODO: add pindel
606632 if (!pindelConsensusVariants .isEmpty ())
607633 {
608-
634+ //TODO: enable once sure:
635+ //pindelConsensusVariants.stream().forEach(consensusVariants::add);
636+ getPipelineCtx ().getLogger ().info ("total consensus variants that would be added: " + pindelConsensusVariants .size ());
609637 }
610638
611639 try (CloseableIterator <VariantContext > iterator = allVariants .iterator ())
@@ -634,6 +662,7 @@ public Output performAnalysisPerSampleRemote(Readset rs, File inputBam, Referenc
634662 double pctNoCover = positionsSkipped / (double )dict .getReferenceLength ();
635663 getPipelineCtx ().getLogger ().info ("Total positions with coverage below threshold (" + minCoverage + "): " + positionsSkipped + "(" + fmt .format (pctNoCover ) + ")" );
636664 getPipelineCtx ().getLogger ().info ("Total # gap intervals: " + gapIntervals );
665+ getPipelineCtx ().getLogger ().info ("Total # of low coverage bases recovered within consensus deletions: " + basesRecoveredFromDeletions );
637666
638667 String description = String .format ("Total Variants: %s\n Total GT 1 PCT: %s\n Total GT 50 PCT: %s\n Total Indel GT 1 PCT: %s\n Positions Below Coverage: %s\n Total In LoFreq Consensus: %s\n Total Indel In LoFreq Consensus: %s\n Total Consensus Variant in PBS: %s" , totalVariants , totalGT1 , totalGT50 , totalIndelGT1 , positionsSkipped , totalGTThreshold , totalIndelGTThreshold , totalConsensusInPBS );
639668 description += "\n " + "Strand Bias Recovered: " + filteredVariantsRecovered ;
0 commit comments