kkonganti@11: #!/usr/bin/env python kkonganti@11: kkonganti@11: import os kkonganti@11: import sys kkonganti@11: from textwrap import dedent kkonganti@11: kkonganti@11: import yaml kkonganti@11: kkonganti@11: kkonganti@11: def main(): kkonganti@11: """ kkonganti@11: Takes a tab-delimited text file with a mandatory header kkonganti@11: column and generates an HTML table. kkonganti@11: """ kkonganti@11: kkonganti@11: args = sys.argv kkonganti@11: if len(args) < 2 or len(args) >= 4: kkonganti@11: print( kkonganti@11: f"\nAt least one argument specifying the *.tblsum file is required.\n" kkonganti@11: + "No more than 2 command-line arguments should be passed.\n" kkonganti@11: ) kkonganti@11: exit(1) kkonganti@11: kkonganti@11: table_sum_on = str(args[1]).lower() kkonganti@11: table_sum_on_file = table_sum_on + ".tblsum.txt" kkonganti@11: cell_colors = f"{table_sum_on}.cellcolors.yml" kkonganti@11: kkonganti@11: if len(args) == 3: kkonganti@11: description = str(args[2]) kkonganti@11: else: kkonganti@11: description = "The results table shown here is a collection from all samples." kkonganti@11: kkonganti@11: if os.path.exists(cell_colors) and os.path.getsize(cell_colors) > 0: kkonganti@11: with open(cell_colors, "r") as cc_yml: kkonganti@11: cell_colors = yaml.safe_load(cc_yml) kkonganti@11: else: kkonganti@11: cell_colors = dict() kkonganti@11: kkonganti@11: if not (os.path.exists(table_sum_on_file) and os.path.getsize(table_sum_on_file) > 0): kkonganti@11: exit(0) kkonganti@11: kkonganti@11: with open(table_sum_on_file, "r") as tbl: kkonganti@11: header = tbl.readline() kkonganti@11: header_cols = header.strip().split("\t") kkonganti@11: kkonganti@11: html = [ kkonganti@11: dedent( kkonganti@11: f""" kkonganti@11:
kkonganti@11: kkonganti@11: kkonganti@11: kkonganti@11: """ kkonganti@11: ) kkonganti@11: ] kkonganti@11: kkonganti@11: for header_col in header_cols: kkonganti@11: html.append( kkonganti@11: dedent( kkonganti@11: f""" kkonganti@11: """ kkonganti@11: ) kkonganti@11: ) kkonganti@11: kkonganti@11: html.append( kkonganti@11: dedent( kkonganti@11: """ kkonganti@11: kkonganti@11: kkonganti@11: """ kkonganti@11: ) kkonganti@11: ) kkonganti@11: kkonganti@11: for row in tbl: kkonganti@11: html.append("\n") kkonganti@11: data_cols = row.strip().split("\t") kkonganti@11: if len(header_cols) != len(data_cols): kkonganti@11: print( kkonganti@11: f"\nWARN: Number of header columns ({len(header_cols)}) and data " kkonganti@11: + f"columns ({len(data_cols)}) are not equal!\nWill append empty columns!\n" kkonganti@11: ) kkonganti@11: if len(header_cols) > len(data_cols): kkonganti@11: data_cols += (len(header_cols) - len(data_cols)) * " " kkonganti@11: print(len(data_cols)) kkonganti@11: else: kkonganti@11: header_cols += (len(data_cols) - len(header_cols)) * " " kkonganti@11: kkonganti@11: html.append( kkonganti@11: dedent( kkonganti@11: f""" kkonganti@11: kkonganti@11: """ kkonganti@11: ) kkonganti@11: ) kkonganti@11: kkonganti@11: for data_col in data_cols[1:]: kkonganti@11: data_col_w_color = f""" kkonganti@11: """ kkonganti@11: if ( kkonganti@11: table_sum_on in cell_colors.keys() kkonganti@11: and data_col in cell_colors[table_sum_on].keys() kkonganti@11: ): kkonganti@11: data_col_w_color = f""" kkonganti@11: """ kkonganti@11: html.append(dedent(data_col_w_color)) kkonganti@11: html.append("\n") kkonganti@11: html.append("\n") kkonganti@11: html.append("
{header_col}
{data_cols[0]}{data_col}{data_col}
\n") kkonganti@11: html.append("
\n") kkonganti@11: kkonganti@11: mqc_yaml = { kkonganti@11: "id": f"{table_sum_on.upper()}_collated_table", kkonganti@11: "section_name": f"{table_sum_on.upper()}", kkonganti@11: "section_href": f"https://github.com/CFSAN-Biostatistics/bettercallsal", kkonganti@11: "plot_type": "html", kkonganti@11: "description": f"{description}", kkonganti@11: "data": ("").join(html), kkonganti@11: } kkonganti@11: kkonganti@11: with open(f"{table_sum_on.lower()}_mqc.yml", "w") as html_mqc: kkonganti@11: yaml.dump(mqc_yaml, html_mqc, default_flow_style=False) kkonganti@11: kkonganti@11: kkonganti@11: if __name__ == "__main__": kkonganti@11: main()