Example #1
0
    def test_no_inputs(self):
        report = CascadeReport(StringIO())
        expected_report = """\
demultiplexed,v3loop,g2p,prelim_map,remap,aligned
0,0,0,0,0,0
"""

        report.generate()

        self.assertEqual(expected_report, report.cascade_csv.getvalue())
Example #2
0
    def test_no_inputs(self):
        report = CascadeReport(StringIO())
        expected_report = """\
demultiplexed,v3loop,g2p,prelim_map,remap,aligned
0,0,0,0,0,0
"""

        report.generate()

        self.assertEqual(expected_report, report.cascade_csv.getvalue())
Example #3
0
    def test_g2p_inputs(self):
        report = CascadeReport(StringIO())
        report.g2p_summary_csv = StringIO("""\
mapped,valid,X4calls,X4pct,final,validpct
100,90,0,0.00,,90.00
""")
        expected_report = """\
demultiplexed,v3loop,g2p,prelim_map,remap,aligned
0,100,90,0,0,0
"""

        report.generate()

        self.assertEqual(expected_report, report.cascade_csv.getvalue())
Example #4
0
    def test_g2p_inputs(self):
        report = CascadeReport(StringIO())
        report.g2p_summary_csv = StringIO("""\
mapped,valid,X4calls,X4pct,final,validpct
100,90,0,0.00,,90.00
""")
        expected_report = """\
demultiplexed,v3loop,g2p,prelim_map,remap,aligned
100,100,90,0,0,0
"""

        report.generate()

        self.assertEqual(expected_report, report.cascade_csv.getvalue())
Example #5
0
    def test_aligned_inputs(self):
        report = CascadeReport(StringIO())
        report.aligned_csv = StringIO("""\
ignored,count
x,50
9,40
""")
        expected_report = """\
demultiplexed,v3loop,g2p,prelim_map,remap,aligned
0,0,0,0,0,90
"""

        report.generate()

        self.assertEqual(expected_report, report.cascade_csv.getvalue())
Example #6
0
    def test_aligned_inputs(self):
        report = CascadeReport(StringIO())
        report.aligned_csv = StringIO("""\
ignored,count
x,50
9,40
""")
        expected_report = """\
demultiplexed,v3loop,g2p,prelim_map,remap,aligned
0,0,0,0,0,90
"""

        report.generate()

        self.assertEqual(expected_report, report.cascade_csv.getvalue())
Example #7
0
    def test_all_inputs(self):
        report = CascadeReport(StringIO())
        report.g2p_summary_csv = StringIO("""\
mapped,valid,X4calls,X4pct,final,validpct
90,80,0,0.00,,90.00
""")
        report.remap_counts_csv = StringIO("""\
type,count,ignored
raw,300,x
prelim R1-seed,200,99
prelim *,100,
remap-1 R1-seed,220,
remap-final R1-seed,240,
unmapped,60,
""")
        report.aligned_csv = StringIO("""\
ignored,count
x,50
9,40
""")
        expected_report = """\
demultiplexed,v3loop,g2p,prelim_map,remap,aligned
150,90,80,100,120,90
"""

        report.generate()

        self.assertEqual(expected_report, report.cascade_csv.getvalue())
Example #8
0
    def test_remap_inputs(self):
        report = CascadeReport(StringIO())
        report.remap_counts_csv = StringIO("""\
type,count,ignored
raw,300,x
prelim R1-seed,200,99
prelim *,100,
remap-1 R1-seed,220,
remap-final R1-seed,240,
unmapped,60,
""")
        expected_report = """\
demultiplexed,v3loop,g2p,prelim_map,remap,aligned
150,0,0,100,120,0
"""

        report.generate()

        self.assertEqual(expected_report, report.cascade_csv.getvalue())
Example #9
0
    def test_remap_inputs(self):
        report = CascadeReport(StringIO())
        report.remap_counts_csv = StringIO("""\
type,count,ignored
raw,300,x
prelim R1-seed,200,99
prelim *,100,
remap-1 R1-seed,220,
remap-final R1-seed,240,
unmapped,60,
""")
        expected_report = """\
demultiplexed,v3loop,g2p,prelim_map,remap,aligned
150,0,0,100,120,0
"""

        report.generate()

        self.assertEqual(expected_report, report.cascade_csv.getvalue())
Example #10
0
    def test_all_inputs(self):
        report = CascadeReport(StringIO())
        report.g2p_summary_csv = StringIO("""\
mapped,valid,X4calls,X4pct,final,validpct
90,80,0,0.00,,90.00
""")
        report.remap_counts_csv = StringIO("""\
type,count,ignored
raw,300,x
prelim R1-seed,200,99
prelim *,100,
remap-1 R1-seed,220,
remap-final R1-seed,240,
unmapped,60,
""")
        report.aligned_csv = StringIO("""\
ignored,count
x,50
9,40
""")
        expected_report = """\
demultiplexed,v3loop,g2p,prelim_map,remap,aligned
240,90,80,100,120,90
"""

        report.generate()

        self.assertEqual(expected_report, report.cascade_csv.getvalue())
Example #11
0
    def process(self,
                pssm,
                excluded_seeds=(),
                excluded_projects=(),
                force_gzip=False,
                use_denovo=False):
        """ Process a single sample.

        :param pssm: the pssm library for running G2P analysis
        :param excluded_seeds: seeds to exclude from mapping
        :param excluded_projects: project codes to exclude from reporting
        :param bool force_gzip: treat FASTQ files as gzipped, even when they
            don't end in .gz
        :param bool use_denovo: True if de novo assembly should be used,
            instead of bowtie2 mapping against references.
        """
        logger.info('Processing %s (%r).', self, self.fastq1)
        scratch_path = self.get_scratch_path()
        makedirs(scratch_path)
        use_gzip = force_gzip or self.fastq1.endswith('.gz')

        sample_info = self.load_sample_info()

        with open(self.read_summary_csv, 'w') as read_summary:
            trim((self.fastq1, self.fastq2),
                 self.bad_cycles_csv,
                 (self.trimmed1_fastq, self.trimmed2_fastq),
                 summary_file=read_summary,
                 use_gzip=use_gzip,
                 skip=self.skip,
                 project_code=sample_info.get('project'))

        if use_denovo:
            logger.info('Running merge_for_entropy on %s.', self)
            with open(self.read_entropy_csv, 'w') as read_entropy_csv:
                merge_for_entropy(self.trimmed1_fastq,
                                  self.trimmed2_fastq,
                                  read_entropy_csv,
                                  scratch_path)

            write_merge_lengths_plot(self.read_entropy_csv,
                                     self.merge_lengths_svg)

        logger.info('Running fastq_g2p on %s.', self)
        with open(self.trimmed1_fastq) as fastq1, \
                open(self.trimmed2_fastq) as fastq2, \
                open(self.g2p_csv, 'w') as g2p_csv, \
                open(self.g2p_summary_csv, 'w') as g2p_summary_csv, \
                open(self.g2p_unmapped1_fastq, 'w') as g2p_unmapped1, \
                open(self.g2p_unmapped2_fastq, 'w') as g2p_unmapped2, \
                open(self.g2p_aligned_csv, 'w') as g2p_aligned_csv, \
                open(self.merged_contigs_csv, 'w') as merged_contigs_csv:

            fastq_g2p(pssm=pssm,
                      fastq1=fastq1,
                      fastq2=fastq2,
                      g2p_csv=g2p_csv,
                      g2p_summary_csv=g2p_summary_csv,
                      unmapped1=g2p_unmapped1,
                      unmapped2=g2p_unmapped2,
                      aligned_csv=g2p_aligned_csv,
                      min_count=DEFAULT_MIN_COUNT,
                      min_valid=MIN_VALID,
                      min_valid_percent=MIN_VALID_PERCENT,
                      merged_contigs_csv=merged_contigs_csv)

        if use_denovo:
            self.run_denovo(excluded_seeds)
        else:
            self.run_mapping(excluded_seeds)

        logger.info('Running sam2aln on %s.', self)
        with open(self.remap_csv) as remap_csv, \
                open(self.aligned_csv, 'w') as aligned_csv, \
                open(self.conseq_ins_csv, 'w') as conseq_ins_csv, \
                open(self.failed_csv, 'w') as failed_csv, \
                open(self.clipping_csv, 'w') as clipping_csv:

            sam2aln(remap_csv,
                    aligned_csv,
                    conseq_ins_csv,
                    failed_csv,
                    clipping_csv=clipping_csv)

        logger.info('Running aln2counts on %s.', self)
        if use_denovo:
            contigs_path = self.contigs_csv
        else:
            contigs_path = os.devnull
        with open(self.aligned_csv) as aligned_csv, \
                open(self.g2p_aligned_csv) as g2p_aligned_csv, \
                open(self.clipping_csv) as clipping_csv, \
                open(self.conseq_ins_csv) as conseq_ins_csv, \
                open(self.remap_conseq_csv) as remap_conseq_csv, \
                open(contigs_path) as contigs_csv, \
                open(self.nuc_csv, 'w') as nuc_csv, \
                open(self.nuc_detail_csv, 'w') as nuc_detail_csv, \
                open(self.amino_csv, 'w') as amino_csv, \
                open(self.amino_detail_csv, 'w') as amino_detail_csv, \
                open(self.coord_ins_csv, 'w') as coord_ins_csv, \
                open(self.conseq_csv, 'w') as conseq_csv, \
                open(self.conseq_region_csv, 'w') as conseq_region_csv, \
                open(self.failed_align_csv, 'w') as failed_align_csv, \
                open(self.coverage_summary_csv, 'w') as coverage_summary_csv, \
                open(self.genome_coverage_csv, 'w') as genome_coverage_csv, \
                open(self.conseq_all_csv, "w") as conseq_all_csv, \
                open(self.minimap_hits_csv, "w") as minimap_hits_csv:

            if not use_denovo:
                for f in (amino_detail_csv, nuc_detail_csv):
                    f.close()
                    os.remove(f.name)
                amino_detail_csv = nuc_detail_csv = None
            aln2counts(aligned_csv,
                       nuc_csv,
                       amino_csv,
                       coord_ins_csv,
                       conseq_csv,
                       failed_align_csv,
                       coverage_summary_csv=coverage_summary_csv,
                       clipping_csv=clipping_csv,
                       conseq_ins_csv=conseq_ins_csv,
                       g2p_aligned_csv=g2p_aligned_csv,
                       remap_conseq_csv=remap_conseq_csv,
                       conseq_region_csv=conseq_region_csv,
                       amino_detail_csv=amino_detail_csv,
                       nuc_detail_csv=nuc_detail_csv,
                       genome_coverage_csv=genome_coverage_csv,
                       contigs_csv=contigs_csv,
                       conseq_all_csv=conseq_all_csv,
                       minimap_hits_csv=minimap_hits_csv)

        logger.info('Running coverage_plots on %s.', self)
        os.makedirs(self.coverage_maps)
        with open(self.amino_csv) as amino_csv, \
                open(self.coverage_scores_csv, 'w') as coverage_scores_csv:
            coverage_plot(amino_csv,
                          coverage_scores_csv,
                          coverage_maps_path=self.coverage_maps,
                          coverage_maps_prefix=self.name,
                          excluded_projects=excluded_projects)

        with open(self.genome_coverage_csv) as genome_coverage_csv, \
                open(self.minimap_hits_csv) as minimap_hits_csv:
            if not use_denovo:
                minimap_hits_csv = None
            plot_genome_coverage(genome_coverage_csv,
                                 minimap_hits_csv,
                                 self.genome_coverage_svg)

        logger.info('Running cascade_report on %s.', self)
        with open(self.g2p_summary_csv) as g2p_summary_csv, \
                open(self.remap_counts_csv) as remap_counts_csv, \
                open(self.aligned_csv) as aligned_csv, \
                open(self.cascade_csv, 'w') as cascade_csv:
            cascade_report = CascadeReport(cascade_csv)
            cascade_report.g2p_summary_csv = g2p_summary_csv
            cascade_report.remap_counts_csv = remap_counts_csv
            cascade_report.aligned_csv = aligned_csv
            cascade_report.generate()
        logger.info('Finished sample %s.', self)
Example #12
0
    def process(self,
                pssm,
                excluded_seeds=(),
                excluded_projects=(),
                force_gzip=False):
        """ Process a single sample.

        :param pssm: the pssm library for running G2P analysis
        :param excluded_seeds: seeds to exclude from mapping
        :param excluded_projects: project codes to exclude from reporting
        :param bool force_gzip: treat FASTQ files as gzipped, even when they
            don't end in .gz
        """
        logger.info('Processing %s (%r).', self, self.fastq1)
        scratch_path = os.path.dirname(self.prelim_csv)
        os.mkdir(scratch_path)
        use_gzip = force_gzip or self.fastq1.endswith('.gz')

        with open(self.read_summary_csv, 'w') as read_summary:
            trim((self.fastq1, self.fastq2),
                 self.bad_cycles_csv,
                 (self.trimmed1_fastq, self.trimmed2_fastq),
                 summary_file=read_summary,
                 use_gzip=use_gzip)

        logger.info('Running fastq_g2p on %s.', self)
        with open(self.trimmed1_fastq) as fastq1, \
                open(self.trimmed2_fastq) as fastq2, \
                open(self.g2p_csv, 'w') as g2p_csv, \
                open(self.g2p_summary_csv, 'w') as g2p_summary_csv, \
                open(self.g2p_unmapped1_fastq, 'w') as g2p_unmapped1, \
                open(self.g2p_unmapped2_fastq, 'w') as g2p_unmapped2, \
                open(self.g2p_aligned_csv, 'w') as g2p_aligned_csv:

            fastq_g2p(pssm=pssm,
                      fastq1=fastq1,
                      fastq2=fastq2,
                      g2p_csv=g2p_csv,
                      g2p_summary_csv=g2p_summary_csv,
                      unmapped1=g2p_unmapped1,
                      unmapped2=g2p_unmapped2,
                      aligned_csv=g2p_aligned_csv,
                      min_count=DEFAULT_MIN_COUNT,
                      min_valid=MIN_VALID,
                      min_valid_percent=MIN_VALID_PERCENT)

        logger.info('Running prelim_map on %s.', self)
        with open(self.prelim_csv, 'w') as prelim_csv:
            prelim_map(self.g2p_unmapped1_fastq,
                       self.g2p_unmapped2_fastq,
                       prelim_csv,
                       work_path=scratch_path,
                       excluded_seeds=excluded_seeds)

        logger.info('Running remap on %s.', self)
        if self.debug_remap:
            debug_file_prefix = os.path.join(scratch_path, 'debug')
        else:
            debug_file_prefix = None
        with open(self.prelim_csv) as prelim_csv, \
                open(self.remap_csv, 'w') as remap_csv, \
                open(self.remap_counts_csv, 'w') as counts_csv, \
                open(self.remap_conseq_csv, 'w') as conseq_csv, \
                open(self.unmapped1_fastq, 'w') as unmapped1, \
                open(self.unmapped2_fastq, 'w') as unmapped2:

            remap(self.g2p_unmapped1_fastq,
                  self.g2p_unmapped2_fastq,
                  prelim_csv,
                  remap_csv,
                  counts_csv,
                  conseq_csv,
                  unmapped1,
                  unmapped2,
                  scratch_path,
                  debug_file_prefix=debug_file_prefix)

        logger.info('Running sam2aln on %s.', self)
        with open(self.remap_csv) as remap_csv, \
                open(self.aligned_csv, 'w') as aligned_csv, \
                open(self.conseq_ins_csv, 'w') as conseq_ins_csv, \
                open(self.failed_csv, 'w') as failed_csv, \
                open(self.clipping_csv, 'w') as clipping_csv:

            sam2aln(remap_csv,
                    aligned_csv,
                    conseq_ins_csv,
                    failed_csv,
                    clipping_csv=clipping_csv)

        logger.info('Running aln2counts on %s.', self)
        with open(self.aligned_csv) as aligned_csv, \
                open(self.g2p_aligned_csv) as g2p_aligned_csv, \
                open(self.clipping_csv) as clipping_csv, \
                open(self.conseq_ins_csv) as conseq_ins_csv, \
                open(self.remap_conseq_csv) as remap_conseq_csv, \
                open(self.nuc_csv, 'w') as nuc_csv, \
                open(self.amino_csv, 'w') as amino_csv, \
                open(self.coord_ins_csv, 'w') as coord_ins_csv, \
                open(self.conseq_csv, 'w') as conseq_csv, \
                open(self.conseq_region_csv, 'w') as conseq_region_csv, \
                open(self.failed_align_csv, 'w') as failed_align_csv, \
                open(self.coverage_summary_csv, 'w') as coverage_summary_csv:

            aln2counts(aligned_csv,
                       nuc_csv,
                       amino_csv,
                       coord_ins_csv,
                       conseq_csv,
                       failed_align_csv,
                       coverage_summary_csv=coverage_summary_csv,
                       clipping_csv=clipping_csv,
                       conseq_ins_csv=conseq_ins_csv,
                       g2p_aligned_csv=g2p_aligned_csv,
                       remap_conseq_csv=remap_conseq_csv,
                       conseq_region_csv=conseq_region_csv)

        logger.info('Running coverage_plots on %s.', self)
        os.makedirs(self.coverage_maps)
        with open(self.amino_csv) as amino_csv, \
                open(self.coverage_scores_csv, 'w') as coverage_scores_csv:
            coverage_plot(amino_csv,
                          coverage_scores_csv,
                          coverage_maps_path=self.coverage_maps,
                          coverage_maps_prefix=self.name,
                          excluded_projects=excluded_projects)

        logger.info('Running cascade_report on %s.', self)
        with open(self.g2p_summary_csv) as g2p_summary_csv, \
                open(self.remap_counts_csv) as remap_counts_csv, \
                open(self.aligned_csv) as aligned_csv, \
                open(self.cascade_csv, 'w') as cascade_csv:
            cascade_report = CascadeReport(cascade_csv)
            cascade_report.g2p_summary_csv = g2p_summary_csv
            cascade_report.remap_counts_csv = remap_counts_csv
            cascade_report.aligned_csv = aligned_csv
            cascade_report.generate()
        logger.info('Finished sample %s.', self)
Example #13
0
def process_sample(sample_index, run_info, args, pssm):
    """ Process a single sample.

    :param sample_index: which sample to process from the session JSON
    :param run_info: run parameters loaded from the session JSON
    :param args: the command-line arguments
    :param pssm: the pssm library for running G2P analysis
    """
    scratch_path = os.path.join(args.data_path, 'scratch')
    sample_info = run_info.samples[sample_index]
    sample_id = sample_info['Id']
    sample_name = sample_info['Name']
    sample_dir = os.path.join(args.data_path, 'input', 'samples', sample_id,
                              'Data', 'Intensities', 'BaseCalls')
    if not os.path.exists(sample_dir):
        sample_dir = os.path.join(args.data_path, 'input', 'samples',
                                  sample_id)
    sample_path = None
    for root, _dirs, files in os.walk(sample_dir):
        sample_paths = fnmatch.filter(files, '*_R1_*')
        if sample_paths:
            sample_path = os.path.join(root, sample_paths[0])
            break
    if sample_path is None:
        raise RuntimeError(
            'No R1 file found for sample id {}.'.format(sample_id))
    sample_path2 = sample_path.replace('_R1_', '_R2_')
    if not os.path.exists(sample_path2):
        raise RuntimeError('R2 file missing for sample id {}: {!r}.'.format(
            sample_id, sample_path2))
    logger.info('Processing sample %s (%d of %d): %s (%s).', sample_id,
                sample_index + 1, len(run_info.samples), sample_name,
                sample_path)

    sample_qc_path = os.path.join(args.qc_path, sample_name)
    makedirs(sample_qc_path)
    sample_scratch_path = os.path.join(scratch_path, sample_name)
    makedirs(sample_scratch_path)

    bad_cycles_path = os.path.join(scratch_path, 'bad_cycles.csv')
    trimmed_path1 = os.path.join(sample_scratch_path, 'trimmed1.fastq')
    read_summary_path = os.path.join(sample_scratch_path, 'read_summary.csv')
    trimmed_path2 = os.path.join(sample_scratch_path, 'trimmed2.fastq')
    with open(read_summary_path, 'w') as read_summary:
        trim((sample_path, sample_path2),
             bad_cycles_path, (trimmed_path1, trimmed_path2),
             summary_file=read_summary,
             use_gzip=sample_path.endswith('.gz'))

    logger.info('Running fastq_g2p (%d of %d).', sample_index + 1,
                len(run_info.samples))
    g2p_unmapped1_path = os.path.join(sample_scratch_path,
                                      'g2p_unmapped1.fastq')
    g2p_unmapped2_path = os.path.join(sample_scratch_path,
                                      'g2p_unmapped2.fastq')
    with open(os.path.join(sample_scratch_path, 'trimmed1.fastq'), 'r') as fastq1, \
            open(os.path.join(sample_scratch_path, 'trimmed2.fastq'), 'r') as fastq2, \
            open(os.path.join(sample_scratch_path, 'g2p.csv'), 'w') as g2p_csv, \
            open(os.path.join(sample_scratch_path, 'g2p_summary.csv'), 'w') as g2p_summary_csv, \
            open(g2p_unmapped1_path, 'w') as g2p_unmapped1, \
            open(g2p_unmapped2_path, 'w') as g2p_unmapped2, \
            open(os.path.join(sample_scratch_path, 'g2p_aligned.csv'), 'w') as g2p_aligned_csv:

        fastq_g2p(pssm=pssm,
                  fastq1=fastq1,
                  fastq2=fastq2,
                  g2p_csv=g2p_csv,
                  g2p_summary_csv=g2p_summary_csv,
                  unmapped1=g2p_unmapped1,
                  unmapped2=g2p_unmapped2,
                  aligned_csv=g2p_aligned_csv,
                  min_count=DEFAULT_MIN_COUNT,
                  min_valid=MIN_VALID,
                  min_valid_percent=MIN_VALID_PERCENT)

    logger.info('Running prelim_map (%d of %d).', sample_index + 1,
                len(run_info.samples))
    excluded_seeds = [] if args.all_projects else EXCLUDED_SEEDS
    with open(os.path.join(sample_scratch_path, 'prelim.csv'),
              'w') as prelim_csv:
        prelim_map(g2p_unmapped1_path,
                   g2p_unmapped2_path,
                   prelim_csv,
                   work_path=sample_scratch_path,
                   excluded_seeds=excluded_seeds)

    logger.info('Running remap (%d of %d).', sample_index + 1,
                len(run_info.samples))
    if args.debug_remap:
        debug_file_prefix = os.path.join(sample_scratch_path, 'debug')
    else:
        debug_file_prefix = None
    with open(os.path.join(sample_scratch_path, 'prelim.csv'), 'r') as prelim_csv, \
            open(os.path.join(sample_scratch_path, 'remap.csv'), 'w') as remap_csv, \
            open(os.path.join(sample_scratch_path, 'remap_counts.csv'), 'w') as counts_csv, \
            open(os.path.join(sample_scratch_path, 'remap_conseq.csv'), 'w') as conseq_csv, \
            open(os.path.join(sample_qc_path, 'unmapped1.fastq'), 'w') as unmapped1, \
            open(os.path.join(sample_qc_path, 'unmapped2.fastq'), 'w') as unmapped2:

        remap(g2p_unmapped1_path,
              g2p_unmapped2_path,
              prelim_csv,
              remap_csv,
              counts_csv,
              conseq_csv,
              unmapped1,
              unmapped2,
              sample_scratch_path,
              debug_file_prefix=debug_file_prefix)

    logger.info('Running sam2aln (%d of %d).', sample_index + 1,
                len(run_info.samples))
    with open(os.path.join(sample_scratch_path, 'remap.csv'), 'r') as remap_csv, \
            open(os.path.join(sample_scratch_path, 'aligned.csv'), 'w') as aligned_csv, \
            open(os.path.join(sample_scratch_path, 'conseq_ins.csv'), 'w') as conseq_ins_csv, \
            open(os.path.join(sample_scratch_path, 'failed_read.csv'), 'w') as failed_csv, \
            open(os.path.join(sample_scratch_path, 'clipping.csv'), 'w') as clipping_csv:

        sam2aln(remap_csv,
                aligned_csv,
                conseq_ins_csv,
                failed_csv,
                clipping_csv=clipping_csv)

    logger.info('Running aln2counts (%d of %d).', sample_index + 1,
                len(run_info.samples))
    with open(os.path.join(sample_scratch_path, 'aligned.csv'), 'r') as aligned_csv, \
            open(os.path.join(sample_scratch_path, 'g2p_aligned.csv'), 'r') as g2p_aligned_csv, \
            open(os.path.join(sample_scratch_path, 'clipping.csv'), 'r') as clipping_csv, \
            open(os.path.join(sample_scratch_path, 'conseq_ins.csv'), 'r') as conseq_ins_csv, \
            open(os.path.join(sample_scratch_path, 'remap_conseq.csv'), 'r') as remap_conseq_csv, \
            open(os.path.join(sample_scratch_path, 'nuc.csv'), 'w') as nuc_csv, \
            open(os.path.join(sample_scratch_path, 'amino.csv'), 'w') as amino_csv, \
            open(os.path.join(sample_scratch_path, 'coord_ins.csv'), 'w') as coord_ins_csv, \
            open(os.path.join(sample_scratch_path, 'conseq.csv'), 'w') as conseq_csv, \
            open(os.path.join(sample_scratch_path, 'failed_align.csv'), 'w') as failed_align_csv, \
            open(os.path.join(sample_scratch_path, 'coverage_summary.csv'), 'w') as coverage_summary_csv:

        aln2counts(aligned_csv,
                   nuc_csv,
                   amino_csv,
                   coord_ins_csv,
                   conseq_csv,
                   failed_align_csv,
                   coverage_summary_csv=coverage_summary_csv,
                   clipping_csv=clipping_csv,
                   conseq_ins_csv=conseq_ins_csv,
                   g2p_aligned_csv=g2p_aligned_csv,
                   remap_conseq_csv=remap_conseq_csv)

    logger.info('Running coverage_plots (%d of %d).', sample_index + 1,
                len(run_info.samples))
    coverage_maps_path = os.path.join(args.qc_path, 'coverage_maps')
    makedirs(coverage_maps_path)
    excluded_projects = [] if args.all_projects else EXCLUDED_PROJECTS
    with open(os.path.join(sample_scratch_path, 'amino.csv'), 'r') as amino_csv, \
            open(os.path.join(sample_scratch_path, 'coverage_scores.csv'), 'w') as coverage_scores_csv:
        coverage_plot(amino_csv,
                      coverage_scores_csv,
                      coverage_maps_path=coverage_maps_path,
                      coverage_maps_prefix=sample_name,
                      excluded_projects=excluded_projects)

    logger.info('Running hivdb (%d of %d).', sample_index + 1,
                len(run_info.samples))
    with open(os.path.join(sample_scratch_path, 'amino.csv')) as amino_csv, \
            open(os.path.join(sample_scratch_path, 'coverage_scores.csv')) as coverage_scores_csv, \
            open(os.path.join(sample_scratch_path, 'resistance.csv'), 'w') as resistance_csv, \
            open(os.path.join(sample_scratch_path, 'mutations.csv'), 'w') as mutations_csv:
        hivdb(amino_csv, coverage_scores_csv, resistance_csv, mutations_csv,
              run_info.reports)

    logger.info('Running resistance report (%d of %d).', sample_index + 1,
                len(run_info.samples))
    source_path = os.path.dirname(__file__)
    version_filename = os.path.join(source_path, 'version.txt')
    if not os.path.exists(version_filename):
        git_version = 'v0-dev'
    else:
        with open(version_filename) as version_file:
            git_version = version_file.read().strip()
    reports_path = os.path.join(args.qc_path, 'resistance_reports')
    makedirs(reports_path)
    report_filename = os.path.join(reports_path,
                                   sample_name + '_resistance.pdf')
    with open(os.path.join(sample_scratch_path, 'resistance.csv')) as resistance_csv, \
            open(os.path.join(sample_scratch_path, 'mutations.csv')) as mutations_csv, \
            open(report_filename, 'wb') as report_pdf:
        gen_report(resistance_csv,
                   mutations_csv,
                   report_pdf,
                   sample_name,
                   git_version=git_version)

    logger.info('Running cascade_report (%d of %d).', sample_index + 1,
                len(run_info.samples))
    with open(os.path.join(sample_scratch_path, 'g2p_summary.csv'), 'r') as g2p_summary_csv, \
            open(os.path.join(sample_scratch_path, 'remap_counts.csv'), 'r') as remap_counts_csv, \
            open(os.path.join(sample_scratch_path, 'aligned.csv'), 'r') as aligned_csv, \
            open(os.path.join(sample_scratch_path, 'cascade.csv'), 'w') as cascade_csv:
        cascade_report = CascadeReport(cascade_csv)
        cascade_report.g2p_summary_csv = g2p_summary_csv
        cascade_report.remap_counts_csv = remap_counts_csv
        cascade_report.aligned_csv = aligned_csv
        cascade_report.generate()
    logger.info('Finished sample (%d of %d).', sample_index + 1,
                len(run_info.samples))
Example #14
0
    def process(self,
                pssm,
                excluded_seeds=(),
                excluded_projects=(),
                force_gzip=False):
        """ Process a single sample.

        :param pssm: the pssm library for running G2P analysis
        :param excluded_seeds: seeds to exclude from mapping
        :param excluded_projects: project codes to exclude from reporting
        :param bool force_gzip: treat FASTQ files as gzipped, even when they
            don't end in .gz
        """
        logger.info('Processing %s (%r).', self, self.fastq1)
        scratch_path = os.path.dirname(self.prelim_csv)
        os.mkdir(scratch_path)
        use_gzip = force_gzip or self.fastq1.endswith('.gz')

        with open(self.read_summary_csv, 'w') as read_summary:
            trim((self.fastq1, self.fastq2),
                 self.bad_cycles_csv,
                 (self.trimmed1_fastq, self.trimmed2_fastq),
                 summary_file=read_summary,
                 use_gzip=use_gzip)

        logger.info('Running fastq_g2p on %s.', self)
        with open(self.trimmed1_fastq) as fastq1, \
                open(self.trimmed2_fastq) as fastq2, \
                open(self.g2p_csv, 'w') as g2p_csv, \
                open(self.g2p_summary_csv, 'w') as g2p_summary_csv, \
                open(self.g2p_unmapped1_fastq, 'w') as g2p_unmapped1, \
                open(self.g2p_unmapped2_fastq, 'w') as g2p_unmapped2, \
                open(self.g2p_aligned_csv, 'w') as g2p_aligned_csv:

            fastq_g2p(pssm=pssm,
                      fastq1=fastq1,
                      fastq2=fastq2,
                      g2p_csv=g2p_csv,
                      g2p_summary_csv=g2p_summary_csv,
                      unmapped1=g2p_unmapped1,
                      unmapped2=g2p_unmapped2,
                      aligned_csv=g2p_aligned_csv,
                      min_count=DEFAULT_MIN_COUNT,
                      min_valid=MIN_VALID,
                      min_valid_percent=MIN_VALID_PERCENT)

        logger.info('Running prelim_map on %s.', self)
        with open(self.prelim_csv, 'w') as prelim_csv:
            prelim_map(self.g2p_unmapped1_fastq,
                       self.g2p_unmapped2_fastq,
                       prelim_csv,
                       work_path=scratch_path,
                       excluded_seeds=excluded_seeds)

        logger.info('Running remap on %s.', self)
        if self.debug_remap:
            debug_file_prefix = os.path.join(scratch_path, 'debug')
        else:
            debug_file_prefix = None
        with open(self.prelim_csv) as prelim_csv, \
                open(self.remap_csv, 'w') as remap_csv, \
                open(self.remap_counts_csv, 'w') as counts_csv, \
                open(self.remap_conseq_csv, 'w') as conseq_csv, \
                open(self.unmapped1_fastq, 'w') as unmapped1, \
                open(self.unmapped2_fastq, 'w') as unmapped2:

            remap(self.g2p_unmapped1_fastq,
                  self.g2p_unmapped2_fastq,
                  prelim_csv,
                  remap_csv,
                  counts_csv,
                  conseq_csv,
                  unmapped1,
                  unmapped2,
                  scratch_path,
                  debug_file_prefix=debug_file_prefix)

        logger.info('Running sam2aln on %s.', self)
        with open(self.remap_csv) as remap_csv, \
                open(self.aligned_csv, 'w') as aligned_csv, \
                open(self.conseq_ins_csv, 'w') as conseq_ins_csv, \
                open(self.failed_csv, 'w') as failed_csv, \
                open(self.clipping_csv, 'w') as clipping_csv:

            sam2aln(remap_csv,
                    aligned_csv,
                    conseq_ins_csv,
                    failed_csv,
                    clipping_csv=clipping_csv)

        logger.info('Running aln2counts on %s.', self)
        with open(self.aligned_csv) as aligned_csv, \
                open(self.g2p_aligned_csv) as g2p_aligned_csv, \
                open(self.clipping_csv) as clipping_csv, \
                open(self.conseq_ins_csv) as conseq_ins_csv, \
                open(self.remap_conseq_csv) as remap_conseq_csv, \
                open(self.nuc_csv, 'w') as nuc_csv, \
                open(self.amino_csv, 'w') as amino_csv, \
                open(self.coord_ins_csv, 'w') as coord_ins_csv, \
                open(self.conseq_csv, 'w') as conseq_csv, \
                open(self.conseq_region_csv, 'w') as conseq_region_csv, \
                open(self.failed_align_csv, 'w') as failed_align_csv, \
                open(self.coverage_summary_csv, 'w') as coverage_summary_csv:

            aln2counts(aligned_csv,
                       nuc_csv,
                       amino_csv,
                       coord_ins_csv,
                       conseq_csv,
                       failed_align_csv,
                       coverage_summary_csv=coverage_summary_csv,
                       clipping_csv=clipping_csv,
                       conseq_ins_csv=conseq_ins_csv,
                       g2p_aligned_csv=g2p_aligned_csv,
                       remap_conseq_csv=remap_conseq_csv,
                       conseq_region_csv=conseq_region_csv)

        logger.info('Running coverage_plots on %s.', self)
        os.makedirs(self.coverage_maps)
        with open(self.amino_csv) as amino_csv, \
                open(self.coverage_scores_csv, 'w') as coverage_scores_csv:
            coverage_plot(amino_csv,
                          coverage_scores_csv,
                          coverage_maps_path=self.coverage_maps,
                          coverage_maps_prefix=self.name,
                          excluded_projects=excluded_projects)

        logger.info('Running cascade_report on %s.', self)
        with open(self.g2p_summary_csv) as g2p_summary_csv, \
                open(self.remap_counts_csv) as remap_counts_csv, \
                open(self.aligned_csv) as aligned_csv, \
                open(self.cascade_csv, 'w') as cascade_csv:
            cascade_report = CascadeReport(cascade_csv)
            cascade_report.g2p_summary_csv = g2p_summary_csv
            cascade_report.remap_counts_csv = remap_counts_csv
            cascade_report.aligned_csv = aligned_csv
            cascade_report.generate()
        logger.info('Finished sample %s.', self)