Source code for sequana.modules_report.pacbio_input_bam

# coding: utf-8
#
#  This file is part of Sequana software
#
#  Copyright (c) 2016 - Sequana Development Team
#
#  File author(s):
#      Thomas Cokelaer <thomas.cokelaer@pasteur.fr>
#      Dimitri Desvillechabrol <dimitri.desvillechabrol@pasteur.fr>,
#          <d.desvillechabrol@gmail.com>
#
#  Distributed under the terms of the 3-clause BSD license.
#  The full license is in the LICENSE file, distributed with this software.
#
#  website: https://github.com/sequana/sequana
#  documentation: http://sequana.readthedocs.io
#
##############################################################################
"""Module to write coverage report"""
import io
import json
import os

from sequana.lazy import pandas
from sequana.lazy import pandas as pd
from sequana.lazy import pylab
from sequana.modules_report.base_module import SequanaBaseModule
from sequana.utils import config
from sequana.utils.datatables_js import DataTable


[docs] class PacbioInputBAMModule(SequanaBaseModule): """Write HTML report of Pacbio input bam. Input summary JSON file must contains these links: - images/hist_read_length - images/hist_gc_content - images/hist_zmw to PNG files and the **stats** dictionary created with :meth:`sequana.pacbio.BAMPacbio.stats`. """ def __init__(self, summary, output_filename=None): """ :param input: """ super().__init__() # Read the data self.title = "Pacbio QC (input BAM)" self.name = "sequana_summary_pacbio_qc" with open(summary, "r") as fh: self.summary = json.load(fh) assert "name" in self.summary.keys() and self.summary["name"] == self.name self.create_report_content() if output_filename: self.create_html(output_filename)
[docs] def create_report_content(self): """Generate the sections list to fill the HTML report.""" self.sections = list() self.add_stats() # we use a list to keep this order self.key_images = [ "hist_read_length", "hist_gc_content", "gc_vs_length", "hist_snr", "hist_zmw", ] for this in self.key_images: self.add_png(this)
[docs] def add_stats(self): df = pd.Series(self.summary["read_stats"]).to_frame().T df.index = ["read length stats"] table = DataTable(df, "table", index=True) table.datatable.datatable_options = { "scrollX": "300px", "pageLength": 30, "scrollCollapse": "true", "dom": "t", "paging": "false", "buttons": ["copy", "csv"], } js = table.create_javascript_function() # IMPORTANT: here conversion to integer with %d # to round and make integer. !! The GC is therefore # converted to integer as well. html_tab = table.create_datatable(float_format="%d") html = "{} {}".format(html_tab, js) self.sections.append({"name": "Basic stats on read length", "anchor": "table", "content": html})
[docs] def add_png(self, key): text = "" if key == "hist_read_length": title = "Histogram read length" elif key == "hist_gc_content": title = "Histogram GC content" elif key == "hist_passes": title = "Histogram Number of Passes" elif key == "gc_vs_length": title = "GC vs length" elif key == "hist_snr": title = "Histogram SNR" text = ( "SNR histogram of A, C, G, T bases from the raw data if " "present in the BAM file, otherwise you will see a 'no " "data' icon" ) else: return html = self.png_to_embedded_png(self.summary["images"][key]) html = """<figure style="float:center; width:89%; padding:0px; margin:0px;"> {} <figcaption style="font-style:italic"></figcaption> </figure>""".format( html, html ) self.sections.append( { "name": title, "anchor": key, "content": "<p>{}</p><br>".format(text) + html, } )