@@ -487,25 +487,39 @@ def _create_consensus_writer(self, conseq_file):
487487 def write_consensus_header (self , conseq_file ):
488488 self ._create_consensus_writer (conseq_file ).writeheader ()
489489
490- def write_consensus (self , conseq_file ):
490+ def write_consensus (self , conseq_file , min_coverage = 100 ):
491+ """
492+ Generate nucleotide consensus sequences at varying mixture
493+ cutoffs, and write to user-specified file.
494+ :param conseq_file: csv.DictWriter object
495+ :param min_coverage: depth of coverage below which the nucleotide
496+ will be reported in lower-case.
497+ :return:
498+ """
491499 conseq_writer = self ._create_consensus_writer (conseq_file )
500+
492501 for mixture_cutoff in self .conseq_mixture_cutoffs :
493502 consensus = ''
494503 offset = None
495504 for seed_amino in self .seed_aminos [0 ]:
496505 if offset is None :
497506 if not seed_amino .counts :
498507 continue
499- offset = seed_amino .consensus_index * 3
508+ offset = seed_amino .consensus_index * 3
509+
500510 for seed_nuc in seed_amino .nucleotides :
501- consensus += seed_nuc .get_consensus (mixture_cutoff )
511+ cnuc = seed_nuc .get_consensus (mixture_cutoff )
512+ coverage = sum (seed_nuc .counts .values ())
513+ consensus += cnuc .upper () if (coverage >= min_coverage ) else cnuc .lower ()
514+
502515 if offset is not None :
503- conseq_writer .writerow (
504- {'region' : self .seed ,
505- 'q-cutoff' : self .qcut ,
506- 'consensus-percent-cutoff' : format_cutoff (mixture_cutoff ),
507- 'offset' : offset ,
508- 'sequence' : consensus })
516+ conseq_writer .writerow ({
517+ 'region' : self .seed ,
518+ 'q-cutoff' : self .qcut ,
519+ 'consensus-percent-cutoff' : format_cutoff (mixture_cutoff ),
520+ 'offset' : offset ,
521+ 'sequence' : consensus
522+ })
509523
510524 def _create_nuc_variants_writer (self , nuc_variants_file ):
511525 return csv .DictWriter (nuc_variants_file ,
@@ -813,7 +827,8 @@ def aln2counts(aligned_csv,
813827 failed_align_csv = None ,
814828 nuc_variants_csv = None ,
815829 callback = None ,
816- coverage_summary_csv = None ):
830+ coverage_summary_csv = None ,
831+ json = None ):
817832 """
818833 Analyze aligned reads for nucleotide and amino acid frequencies.
819834 Generate consensus sequences.
@@ -827,11 +842,15 @@ def aln2counts(aligned_csv,
827842 @param nuc_variants_csv: Open file handle to write the most frequent nucleotide sequence
828843 variants.
829844 @param callback: a function to report progress with three optional
830- parameters - callback(message, progress, max_progress)
831- @param coverage_summary_csv Open file handle to write coverage depth.
845+ parameters - callback(message, progress, max_progress)
846+ @param coverage_summary_csv: Open file handle to write coverage depth.
847+ @param json: specify a custom JSON project file; None loads the default file.
832848 """
833849 # load project information
834- projects = project_config .ProjectConfig .loadDefault ()
850+ if json is None :
851+ projects = project_config .ProjectConfig .loadDefault ()
852+ else :
853+ projects = project_config .ProjectConfig .load (json )
835854
836855 # initialize reporter classes
837856 insert_writer = InsertionWriter (coord_ins_csv )
0 commit comments