@@ -110,9 +110,22 @@ public Provider()
110110 put ("width" , 400 );
111111 put ("allowBlank" , true );
112112 }}, null ),
113+ ToolParameterDescriptor .create ("generateConsensus" , "Generate Consensus" , "If selected, a FASTA with the simple majority consensus will be generated." , "checkbox" , new JSONObject ()
114+ {{
115+
116+ }}, false ),
113117 ToolParameterDescriptor .create ("minCoverage" , "Min Coverage For Consensus" , "If provided, a consensus will only be called over regions with at least this depth" , "ldk-integerfield" , new JSONObject (){{
114118 put ("minValue" , 0 );
115119 }}, 25 ),
120+ ToolParameterDescriptor .create ("generateTable" , "Generate Variant Table" , "If selected, a TSV listing variants above the given threshold will be generated." , "checkbox" , new JSONObject ()
121+ {{
122+
123+ }}, false ),
124+ ToolParameterDescriptor .create ("minFractionForTable" , "Min Fraction for Table" , "If the option to generate a table output is used, only variants with frequency of this threshold will be included" , "ldk-numberfield" , new JSONObject (){{
125+ put ("minValue" , 0 );
126+ put ("maxValue" , 1 );
127+ put ("decimalPrecision" , 3 );
128+ }}, 0.01 ),
116129 ToolParameterDescriptor .createExpDataParam ("primerBedFile" , "Primer Sites (BED File)" , "This is a BED file specifying the primer binding sites, which will be used to flag variants. Strandedness is ignored." , "ldk-expdatafield" , new JSONObject ()
117130 {{
118131 put ("allowBlank" , true );
@@ -470,6 +483,10 @@ public Output performAnalysisPerSampleRemote(Readset rs, File inputBam, Referenc
470483 }
471484
472485 double minFractionForConsensus = getProvider ().getParameterByName ("minFractionForConsensus" ).extractValue (getPipelineCtx ().getJob (), getProvider (), getStepIdx (), Double .class , 0.0 );
486+ boolean generateConsensus = getProvider ().getParameterByName ("generateConsensus" ).extractValue (getPipelineCtx ().getJob (), getProvider (), getStepIdx (), Boolean .class , false );
487+
488+ boolean generateTable = getProvider ().getParameterByName ("generateTable" ).extractValue (getPipelineCtx ().getJob (), getProvider (), getStepIdx (), Boolean .class , false );
489+ double minFractionForTable = getProvider ().getParameterByName ("minFractionForTable" ).extractValue (getPipelineCtx ().getJob (), getProvider (), getStepIdx (), Double .class , 0.0 );
473490
474491 Integer primerDataId = getProvider ().getParameterByName ("primerBedFile" ).extractValue (getPipelineCtx ().getJob (), getProvider (), getStepIdx (), Integer .class );
475492 List <Interval > primerIntervals = new ArrayList <>();
@@ -517,11 +534,12 @@ public Output performAnalysisPerSampleRemote(Readset rs, File inputBam, Referenc
517534
518535 File loFreqConsensusVcf = getConsensusVcf (outputDir , inputBam );
519536 File loFreqAllVcf = getAllVcf (outputDir , inputBam );
537+ File tableFile = getTableFile (outputDir , inputBam );
520538 Double strandBiasRecoveryAF = getProvider ().getParameterByName ("strandBiasRecoveryAF" ).extractValue (getPipelineCtx ().getJob (), getProvider (), getStepIdx (), Double .class , 1.0 );
521539 SAMSequenceDictionary dict = SAMSequenceDictionaryExtractor .extractDictionary (referenceGenome .getSequenceDictionary ().toPath ());
522540 VariantContextWriterBuilder writerBuilderConsensus = new VariantContextWriterBuilder ().setOutputFile (loFreqConsensusVcf ).setReferenceDictionary (dict );
523541 VariantContextWriterBuilder writerBuilderAll = new VariantContextWriterBuilder ().setOutputFile (loFreqAllVcf ).setReferenceDictionary (dict );
524- try (VCFFileReader reader = new VCFFileReader (activeVCF );CloseableIterator <VariantContext > it = reader .iterator ();VariantContextWriter writerConsensus = writerBuilderConsensus .build ();VariantContextWriter writerAll = writerBuilderAll .build ())
542+ try (VCFFileReader reader = new VCFFileReader (activeVCF );CloseableIterator <VariantContext > it = reader .iterator ();VariantContextWriter writerConsensus = writerBuilderConsensus .build ();VariantContextWriter writerAll = writerBuilderAll .build (); CSVWriter variantTableWriter = generateTable ? new CSVWriter ( PrintWriters . getPrintWriter ( tableFile ), '\t' , CSVWriter . NO_QUOTE_CHARACTER ) : null )
525543 {
526544 VCFHeader header = reader .getFileHeader ();
527545
@@ -532,6 +550,11 @@ public Output performAnalysisPerSampleRemote(Readset rs, File inputBam, Referenc
532550 writerConsensus .writeHeader (header );
533551 writerAll .writeHeader (header );
534552
553+ if (generateTable )
554+ {
555+ variantTableWriter .writeNext (new String []{"Contig" , "Start" , "End" , "Reference" , "Alt" , "Frequency" , "AlleleDepth" , "TotalDepth" });
556+ }
557+
535558 SortingCollection <VariantContext > allVariants = getVariantSorter (header );
536559 SortingCollection <VariantContext > consensusVariants = getVariantSorter (header );
537560 while (it .hasNext ())
@@ -571,6 +594,16 @@ public Output performAnalysisPerSampleRemote(Readset rs, File inputBam, Referenc
571594 }
572595 }
573596
597+ if (generateTable )
598+ {
599+ if (vc .hasAttribute ("AF" ) && vc .getAttributeAsDouble ("AF" , 0.0 ) > minFractionForTable )
600+ {
601+ List <Integer > depths = vc .getAttributeAsIntList ("DP4" , 0 );
602+ int alleleDepth = depths .get (2 ) + depths .get (3 );
603+ variantTableWriter .writeNext (new String []{vc .getContig (), String .valueOf (vc .getStart ()), String .valueOf (vc .getEnd ()), vc .getReference ().getBaseString (), vc .getAlternateAllele (0 ).getBaseString (), String .valueOf (vc .getAttributeAsDouble ("AF" , 0.0 )), String .valueOf (alleleDepth ), String .valueOf (vc .getAttributeAsInt ("DP" , 0 ))});
604+ }
605+ }
606+
574607 totalVariants ++;
575608 if (vc .hasAttribute ("AF" ) && vc .getAttributeAsDouble ("AF" , 0.0 ) > 0.01 )
576609 {
@@ -672,6 +705,10 @@ public Output performAnalysisPerSampleRemote(Readset rs, File inputBam, Referenc
672705 }
673706 consensusVariants .cleanup ();
674707 }
708+ catch (IOException e )
709+ {
710+ throw new PipelineJobException (e );
711+ }
675712
676713 NumberFormat fmt = NumberFormat .getPercentInstance ();
677714 fmt .setMaximumFractionDigits (2 );
@@ -720,12 +757,24 @@ public Output performAnalysisPerSampleRemote(Readset rs, File inputBam, Referenc
720757 }
721758
722759 output .addSequenceOutput (coverageOut , "Depth of Coverage: " + rs .getName (), "Depth of Coverage" , rs .getReadsetId (), null , referenceGenome .getGenomeId (), null );
723- output .addSequenceOutput (consensusFastaLoFreq , "Consensus: " + rs .getName (), "Viral Consensus Sequence" , rs .getReadsetId (), null , referenceGenome .getGenomeId (), description );
760+ if (generateConsensus )
761+ {
762+ output .addSequenceOutput (consensusFastaLoFreq , "Consensus: " + rs .getName (), "Viral Consensus Sequence" , rs .getReadsetId (), null , referenceGenome .getGenomeId (), description );
763+ }
724764
725765 boolean runPangolinAndNextClade = getProvider ().getParameterByName ("runPangolin" ).extractValue (getPipelineCtx ().getJob (), getProvider (), getStepIdx (), Boolean .class , false );
726766
727767 output .addSequenceOutput (loFreqAllVcf , "LoFreq: " + rs .getName (), CATEGORY , rs .getReadsetId (), null , referenceGenome .getGenomeId (), description );
728768
769+ if (generateTable )
770+ {
771+ if (!tableFile .exists ())
772+ {
773+
774+ }
775+ output .addSequenceOutput (tableFile , "LoFreq: " + rs .getName (), "LoFreq Variant Table" , rs .getReadsetId (), null , referenceGenome .getGenomeId (), description );
776+ }
777+
729778 Map <String , String > pangolinData = null ;
730779 if (runPangolinAndNextClade )
731780 {
@@ -781,6 +830,11 @@ private File getAllVcf(File outputDir, File inputBam)
781830 return new File (outputDir , FileUtil .getBaseName (inputBam ) + ".lofreq.all.vcf.gz" );
782831 }
783832
833+ private File getTableFile (File outputDir , File inputBam )
834+ {
835+ return new File (outputDir , FileUtil .getBaseName (inputBam ) + ".lofreq.txt" );
836+ }
837+
784838 private Set <String > runBcftools (File inputBam , ReferenceGenome referenceGenome , File mask , int minCoverage ) throws PipelineJobException
785839 {
786840 Set <String > variantsBcftools = new HashSet <>();
0 commit comments