Mercurial > repos > jvolkening > nanopore_qc
diff yaml_to_html.pl @ 0:e0006d8bf849 draft
planemo upload for repository https://github.com/jvolkening/galaxy-tools/tree/master/tools/nanopore_qc commit b99a7d95d62b95ececc9d808f5f183b9eb718f80-dirty
author | jvolkening |
---|---|
date | Sat, 02 Mar 2024 03:35:34 +0000 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/yaml_to_html.pl Sat Mar 02 03:35:34 2024 +0000 @@ -0,0 +1,227 @@ +#!/usr/bin/env perl + +use strict; +use warnings; +use 5.012; + +use YAML::XS qw/LoadFile/; +use MIME::Base64; +use autodie; + +my ($fn_yaml, $dir_in, $fn_out) = @ARGV; + +die "Can't find or read input file: $!\n" + if (! -r $fn_yaml); + +# set output filehandle based on arguments +my $fh = \*STDOUT; +if (defined $fn_out) { + open $fh, '>', $fn_out; +} + +my $yaml = LoadFile($fn_yaml); + +convert($yaml, $dir_in); + +sub convert { + + my ($yaml) = @_; + + print {$fh} header(); + + say {$fh} " <h3>Summary statistics</h3>"; + + for my $grp (sort keys %$yaml) { + + my $ref = $yaml->{$grp}; + + next if (! ref $ref); + next if (! defined $ref->{'total.gigabases'}); + + print {$fh} <<"CONTENT" + <table> + <caption>$grp</caption> + <tr> + <td>Total Yield (Gb)</td> + <td>$ref->{'total.gigabases'}</td> + </tr> + <tr> + <td>Total Reads</td> + <td>$ref->{'total.reads'}</td> + </tr> + <tr> + <td>Mean Length</td> + <td>$ref->{'mean.length'}</td> + </tr> + <tr> + <td>Median Length</td> + <td>$ref->{'median.length'}</td> + </tr> + <tr> + <td>Max Length</td> + <td>$ref->{'max.length'}</td> + </tr> + <tr> + <td>Mean Q</td> + <td>$ref->{'mean.q'}</td> + </tr> + <tr> + <td>Median Q</td> + <td>$ref->{'median.q'}</td> + </tr> + </table> +CONTENT + + } + + my %figs = ( + 'length_histogram' => "Read length distribution", + 'q_histogram' => "Mean quality score distribution", + 'reads_per_hour' => "Yield over time", + 'cumulative_yield' => "Cumulative yield over time", + 'yield_summary' => "Yield by read length cutoff", + 'flowcell_overview' => "Median read quality per channel", + 'length_by_hour' => "Read length over time", + 'q_by_hour' => "Read quality over time", + 'length_vs_q' => "Read length vs. quality", + ); + + my @order = qw/ + length_histogram + q_histogram + reads_per_hour + cumulative_yield + yield_summary + flowcell_overview + length_by_hour + q_by_hour + length_vs_q + /; + + + say {$fh} " <h3>QC plots</h3>"; + say {$fh} " <p>(Click on plot for high-resolution version, or in Chrome \"Open link in new tab\")</p>"; + + for my $base (@order) { + + my $caption = $figs{$base} // die "No caption found for $base"; + + # Base64-encode images + my $fn_img_full = "$dir_in/$base.png"; + my $fn_img_screen = "$dir_in/$base.screen.png"; + die "Failed to find or read $fn_img_full" + if (! -r $fn_img_full); + die "Failed to find or read $fn_img_screen" + if (! -r $fn_img_screen); + my $img_full = encode($fn_img_full); + my $img_screen = encode($fn_img_screen); + + print {$fh} <<"CONTENT" + <a href="data:image/png;base64,$img_full"> + <figure> + <img src="data:image/png;base64,$img_screen" alt="$base" /> + <figcaption>$caption</figcaption> + </figure> + </a> +CONTENT + + } + + print {$fh} footer(); + +} + +sub encode { + + my ($fn) = @_; + open my $in, '<:raw', $fn; + local($/) = undef; + return encode_base64(<$in>); + +} + +sub header { + + return <<'HEADER'; +<?xml version="1.0" encoding="utf-8"?> +<!DOCTYPE html> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> +<head> + <title></title> + <meta http-equiv="content-type" content="application/xhtml+xml; charset=utf-8" /> + <style> + h2 { + padding: 0.3em; + background-color: #000000; + color: #ffffff; + margin: 1em 0 2em 0; + } + h3 { + padding: 0em 0.2em 0em 0.2em; + color: #555555; + border: solid 1px black; + border-width: 0px 0px 1px 0px; + margin: 2em 0 0.4em 0; + } + tr { + margin: 0; + } + tr:nth-child(even) { + background-color: #bbbbbb; + } + tr:nth-child(odd) { + background-color: #eeeeee; + } + caption { + text-align: left; + font-weight: bold; + background-color: #550000; + color: #ffffff; + padding: 0.1em 0.2em; + } + table { + margin: 1em; + padding: 0.3em; + } + td { + margin: 0; + padding: 0 0.4em; + } + tr td:nth-child(1) { + color: #550000; + } + figure { + display: table; + margin: 2em 0; + } + figcaption { + display: table-caption; + caption-side: top; + font-size: 1.1em; + text-decoration: none; + text-align: center; + font-weight: bold; + background-color: #550000; + color: #ffffff; + padding: 0.1em 0.2em; + margin: 2em 0 0.7em 0; + } + + </style> +</head> +<body> + + <h2>NanoporeQC Report</h2> +HEADER + +} + +sub footer { + + return <<'FOOTER'; + +</body> +</html> +FOOTER + +}