diff --git a/.tests/integration/config/config.yaml b/.tests/integration/config/config.yaml index 046c97e..25d198d 100644 --- a/.tests/integration/config/config.yaml +++ b/.tests/integration/config/config.yaml @@ -80,3 +80,6 @@ reference: generate_pgx_report: report_template: "reference/report_template.txt" + +generate_depth_report: + html_template: "reference/html_template.html" \ No newline at end of file diff --git a/.tests/integration/reference/html_template.html b/.tests/integration/reference/html_template.html new file mode 100644 index 0000000..f80cf74 --- /dev/null +++ b/.tests/integration/reference/html_template.html @@ -0,0 +1,660 @@ + + + + + + + + + Farmakogenomisk analys av {{sample}} + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +

Farmakogenomisk analys av {{sample}}

+ + + +
+
+

Provdetaljer

+ + + + + + + + + + + + + + + + + + + + +
+Prov ID +{{sample}} +
+Sekvenserings ID + +{{ sample_id }} +
+dbSNP + +{{dbsnp}} +
+Referensgenomens sökväg + +{{ref_path}} +
+
+ +
+

Läsdjup för kliniska positioner

+ +{{ table }} + + + + + +
+
+

Läsdjup vid targets

+ + + + + diff --git a/.tests/integration/reference/target_rsid.TPMT.bed b/.tests/integration/reference/target_rsid.TPMT.bed index 16f68f7..d0dd867 100644 --- a/.tests/integration/reference/target_rsid.TPMT.bed +++ b/.tests/integration/reference/target_rsid.TPMT.bed @@ -1,4 +1,4 @@ -chr6 18131012 18131012 rs1800584 TPMT -chr6 18130918 18130918 rs1142345 TPMT -chr6 18143955 18143955 rs1800462 TPMT -chr6 18139228 18139228 rs1800460 TPMT +6 18131012 18131012 rs1800584 TPMT +6 18130918 18130918 rs1142345 TPMT +6 18143955 18143955 rs1800462 TPMT +6 18139228 18139228 rs1800460 TPMT diff --git a/config/config.yaml b/config/config.yaml index cdce1d2..122b020 100644 --- a/config/config.yaml +++ b/config/config.yaml @@ -82,4 +82,7 @@ get_interaction_guidelines: interaction_guidelines: "data/guidelines/interaction_guidelines.csv" generate_pgx_report: - report_template: "data/guidelines/report_template.txt" + report_template: "data/templates/report_template.txt" + +generate_depth_report: + html_template: "data/templates/html_template.html" diff --git a/config/output_files.yaml b/config/output_files.yaml index 0212fe4..e76c40c 100644 --- a/config/output_files.yaml +++ b/config/output_files.yaml @@ -26,3 +26,17 @@ files: types: - T - N + + - name: "_copy_pgx_depth_excel" + input: "pgx/generate_depth_report/{sample}_{type}_pgx_depth.xlsx" + output: "results/dna/pgx/{sample}_{type}.pgx_depth_table.xlsx" + types: + - T + - N + + - name: "_copy_pgx_depth_html" + input: "pgx/generate_depth_report/{sample}_{type}_pgx_depth.html" + output: "results/dna/pgx/{sample}_{type}.pgx_depth_table.html" + types: + - T + - N \ No newline at end of file diff --git a/data/templates/html_template.html b/data/templates/html_template.html new file mode 100644 index 0000000..f80cf74 --- /dev/null +++ b/data/templates/html_template.html @@ -0,0 +1,660 @@ + + + + + + + + + Farmakogenomisk analys av {{sample}} + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +

Farmakogenomisk analys av {{sample}}

+ + + +
+
+

Provdetaljer

+ + + + + + + + + + + + + + + + + + + + +
+Prov ID +{{sample}} +
+Sekvenserings ID + +{{ sample_id }} +
+dbSNP + +{{dbsnp}} +
+Referensgenomens sökväg + +{{ref_path}} +
+
+ +
+

Läsdjup för kliniska positioner

+ +{{ table }} + + + + + +
+
+

Läsdjup vid targets

+ + + + + diff --git a/data/guidelines/report_template.txt b/data/templates/report_template.txt similarity index 100% rename from data/guidelines/report_template.txt rename to data/templates/report_template.txt diff --git a/workflow/Snakefile b/workflow/Snakefile index 5b06195..dd23935 100644 --- a/workflow/Snakefile +++ b/workflow/Snakefile @@ -5,6 +5,7 @@ __license__ = "GPL-3" include: "rules/common.smk" +include: "rules/generate_depth_report.smk" include: "rules/generate_pgx_report.smk" include: "rules/reform_genomic_region.smk" include: "rules/depth_of_coverage.smk" diff --git a/workflow/rules/generate_depth_report.smk b/workflow/rules/generate_depth_report.smk new file mode 100644 index 0000000..f518c80 --- /dev/null +++ b/workflow/rules/generate_depth_report.smk @@ -0,0 +1,37 @@ +__author__ = "Chelsea Ramsin" +__copyright__ = "Copyright 2023, Chelsea Ramsin" +__email__ = "chelsea.ramsin@regionostergotland.se" +__license__ = "GPL-3" + + +rule generate_depth_report: + input: + missed_variants="pgx/append_id_to_gdf/{sample}_{type}.depth_at_missing_annotated.gdf", + output: + html_report=temp("pgx/generate_depth_report/{sample}_{type}_pgx_depth.html"), + excel_report=temp("pgx/generate_depth_report/{sample}_{type}_pgx_depth.xlsx"), + params: + haplotype_definitions=config.get("get_clinical_guidelines", {}).get("haplotype_definitions", ""), + html_template=config.get("generate_depth_report", {}).get("html_template", ""), + dbsnp=config.get("reference", {}).get("dbsnp", ""), + ref=config.get("reference", {}).get("fasta", ""), + log: + "pgx/generate_depth_report/{sample}_{type}.output.log", + benchmark: + repeat( + "pgx/generate_depth_report/{sample}_{type}.output.benchmark.tsv", + config.get("generate_depth_report", {}).get("benchmark_repeats", 1), + ) + threads: config.get("generate_depth_report", {}).get("threads", config["default_resources"]["threads"]) + resources: + mem_mb=config.get("generate_depth_report", {}).get("mem_mb", config["default_resources"]["mem_mb"]), + mem_per_cpu=config.get("generate_depth_report", {}).get("mem_per_cpu", config["default_resources"]["mem_per_cpu"]), + partition=config.get("generate_depth_report", {}).get("partition", config["default_resources"]["partition"]), + threads=config.get("generate_depth_report", {}).get("threads", config["default_resources"]["threads"]), + time=config.get("generate_depth_report", {}).get("time", config["default_resources"]["time"]), + container: + config.get("generate_depth_report", {}).get("container", config["default_container"]) + message: + "{rule}: Generate read depth reports on pgx/{rule}/{wildcards.sample}_{wildcards.type}.input" + script: + "../scripts/generate_depth_report.py" diff --git a/workflow/scripts/generate_depth_report.py b/workflow/scripts/generate_depth_report.py new file mode 100644 index 0000000..1e2b80f --- /dev/null +++ b/workflow/scripts/generate_depth_report.py @@ -0,0 +1,91 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +""" +Created on Wed Dec 6 11:34:29 2023 + +""" + +import pandas as pd +import jinja2 + + +def highlight_greaterthan(s, threshold, column): + is_max = pd.Series(data=False, index=s.index) + is_max[column] = s.loc[column] < threshold + return [ + 'background-color: red ; font-weight: bold ; color: white' + if is_max.any() else '' for v in is_max + ] + + +def create_depth_table(missing, haplotype_definitions): + missing = missing[['ID', 'Locus', 'Total_Depth']] + + depth_table = missing.merge(haplotype_definitions, on=['ID']) + depth_table.rename(columns={ + 'ID': 'rsID', + 'HAPLOTYPE': 'Haplotyp', + 'Locus': 'Position', + 'Total_Depth': 'Läsdjup' + }, + inplace=True) + + new_col_order = ['rsID', 'Haplotyp', 'Position', 'Läsdjup'] + depth_table = depth_table[new_col_order] + + depth_table = depth_table.groupby(['Position', 'Läsdjup', + 'rsID'])['Haplotyp'].apply( + '/'.join).reset_index() + depth_table['sort'] = depth_table['Position'].str.extract( + r'(\d+)', expand=False).astype(int) + depth_table = depth_table.sort_values('sort') + depth_table = depth_table.drop('sort', axis=1) + + styled_depth_table = depth_table.style.apply(highlight_greaterthan, + threshold=100, + column=['Läsdjup'], + axis=1).hide(axis="index") + + return styled_depth_table + + +def generate_html_report(styled_depth_table, missing, template, dbsnp, + ref_path): + sample_column = missing.columns[3] + sample = sample_column.split('_')[2] + sample_id = sample_column.split('_')[3] + + with open(template, 'r') as f: + template = jinja2.Template(source=f.read()) + styled_depth_report = template.render( + sample=sample, + sample_id=sample_id, + dbsnp=dbsnp, + ref_path=ref_path, + table=styled_depth_table.to_html(index=False)) + + return styled_depth_report + + +if __name__ == "__main__": + missed_variants = snakemake.input.missed_variants + dbsnp = snakemake.params.dbsnp + ref = snakemake.params.ref + haplotype_definitions = snakemake.params.haplotype_definitions + html_template = snakemake.params.html_template + excel_report = snakemake.output.excel_report + html_report = snakemake.output.html_report + + haplotype_definitions = pd.read_csv(haplotype_definitions, sep='\t') + missed_variants = pd.read_csv(missed_variants, sep='\t') + + styled_depth_table = create_depth_table(missed_variants, + haplotype_definitions) + styled_depth_report = generate_html_report(styled_depth_table, + missed_variants, html_template, + dbsnp, ref) + + with open(html_report, 'w') as w: + w.write(styled_depth_report) + + styled_depth_table.to_excel(excel_report, index=False)