Mercurial > repos > iuc > spyboat
diff output_report.py @ 0:76733d05d8ef draft
"planemo upload for repository https://github.com/galaxyproject/tools-iuc/tree/master/packages/spyboat commit 5c60a414c785246371beac23ce52d8bbab3602d1"
author | iuc |
---|---|
date | Sat, 28 Nov 2020 13:45:34 +0000 |
parents | |
children | 639d2031d998 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/output_report.py Sat Nov 28 13:45:34 2020 +0000 @@ -0,0 +1,253 @@ +""" Produces plots and a summary html 'headless' """ +import logging +import os + +import matplotlib +import matplotlib.pyplot as ppl +import spyboat.plotting as spyplot + +ppl.switch_backend('Agg') +matplotlib.rcParams["text.usetex"] = False +logger = logging.getLogger(__name__) + +# figure resolution +DPI = 250 + + +def produce_snapshots(input_movie, results, frame, Wkwargs, img_path="."): + """ + Takes the *input_movie* and the *results* dictionary + from spyboat.processing.run_parallel and produces phase, + period and amplitude snapshot png's. + + For the period snapshot also the period range is needed, + hence the analysis dictionary 'Wkwargs' also gets passed. + + The output files name pattern is: + [input, phase, period, amplitude]_frame{frame}.png + and the storage location in *img_path*. + + These get picked up by 'create_html' + """ + + spyplot.input_snapshot(input_movie[frame]) + fig = ppl.gcf() + out_path = os.path.join(img_path, f"input_frame{frame}.png") + fig.savefig(out_path, dpi=DPI) + ppl.close(fig) + + spyplot.phase_snapshot(results["phase"][frame]) + fig = ppl.gcf() + out_path = os.path.join(img_path, f"phase_frame{frame}.png") + fig.savefig(out_path, dpi=DPI) + ppl.close(fig) + + spyplot.period_snapshot( + results["period"][frame], Wkwargs["Tmin"], + Wkwargs["Tmax"], time_unit="a.u." + ) + + fig = ppl.gcf() + out_path = os.path.join(img_path, f"period_frame{frame}.png") + fig.savefig(out_path, dpi=DPI) + ppl.close(fig) + + spyplot.amplitude_snapshot(results["amplitude"][frame]) + fig = ppl.gcf() + out_path = os.path.join(img_path, f"amplitude_frame{frame}.png") + fig.savefig(out_path, dpi=DPI) + ppl.close(fig) + + logger.info(f"Produced 4 snapshots for frame {frame}..") + + +def produce_distr_plots(results, Wkwargs, img_path="."): + """ + Output file names are: + + period_distr.png, power_distr.png and phase_distr.png + """ + + spyplot.period_distr_dynamics(results["period"], Wkwargs) + fig = ppl.gcf() + out_path = os.path.join(img_path, "period_distr.png") + fig.savefig(out_path, dpi=DPI) + + spyplot.power_distr_dynamics(results["power"], Wkwargs) + fig = ppl.gcf() + out_path = os.path.join(img_path, "power_distr.png") + fig.savefig(out_path, dpi=DPI) + + spyplot.phase_coherence_dynamics(results["phase"], Wkwargs) + fig = ppl.gcf() + out_path = os.path.join(img_path, "phase_distr.png") + fig.savefig(out_path, dpi=DPI) + + logger.info("Produced 3 distribution plots..") + + +def create_html(frame_nums, html_fname="OutputReport.html"): + """ + The html generated assumes the respective png's + have been created with 'produce_snapshots' and 'produce_distr_plots' + and can be found at the cwd (that's how Galaxy works..) + """ + + # -- create a gallery for every frame in frame_nums -- + + galleries = "" + for frame_num in frame_nums: + new_gal = f""" + <div class="FrameSlides"> + <h3 style="text-align:center; color=#363333"> + Frame Nr. {frame_num} </h3> + + <div class="snapshot_gallery"> + + <figure class=”snapshot_gallery__item + snapshot_gallery__item--1"> + <img src="input_frame{frame_num}.png" alt="The Input" + class="snapshot_gallery__img"> + </figure> + + <figure class=”snapshot_gallery__item + snapshot_gallery__item--2"> + <img src="phase_frame{frame_num}.png" alt="Phase" + class="snapshot_gallery__img"> + </figure> + + <figure class=”snapshot_gallery__item + snapshot_gallery__item--3"> + <img src="period_frame{frame_num}.png" + alt="Period" class="snapshot_gallery__img"> + </figure> + + <figure class=”snapshot_gallery__item + snapshot_gallery__item--4"> + <img src="amplitude_frame{frame_num}.png" + alt="Amplitude" class="snapshot_gallery__img"> + </figure> + </div> + </div> + """ + galleries += new_gal + + html_string = f""" + <html> + <!-- this file got automatically created by 'output_report.py' --> + <title>SpyBOAT Output Report</title> + <head> + <!-- that doesn't work with galaxy.. --> + <!--link rel="stylesheet" href="styles.css"--> + <style type="text/css"> + body{{ margin:10 100; background:whitesmoke; }} + /*body{{ margin:10 100; background:darkslategrey; }}*/ + .center{{ + text-align: center; + display: block; + margin-left: auto; + margin-right: auto; + width: 100%;}} + + /* matplotlib output at 1600x1200 */ + .distr_gallery {{ + display: grid; + margin: 0 auto; + text-align: center; + /* border: 1px dashed rgba(4, 4, 4, 0.35); */ + grid-template-columns: repeat(3,1fr); + grid-template-rows: 20vw; + grid-gap: 0px; + column-gap: 0px + }} + .distr_gallery__img {{ + width: 100%; + height: 100%; + object-fit: contain; + }} + + + /* matplotlib output at 1600x1200 */ + .snapshot_gallery {{ + display: grid; + margin: 0 auto; + border: 1px dashed rgba(4, 4, 4, 0.35); + text-align: center; + grid-template-columns: repeat(2,1fr); + grid-template-rows: repeat(2,20vw); + grid-gap: 5px; + }} + .snapshot_gallery__img {{ + width: 100%; + height: 100%; + object-fit: contain; + }} + .subheader{{ + text-align:center; + font-size: 160%; + color:#363333;}} + </style> + </head> + <body> + <h1 style="text-align:center; color:#363333">SpyBOAT Results Report</h1> + <hr style="width:50%"> + <h1 class="subheader"> Distribution Dynamics </h1> + <div class="distr_gallery"> + <figure class=”distr_gallery__item distr_gallery__item--1"> + <img src="period_distr.png" alt="Period" class="distr_gallery__img"> + </figure> + + <figure class=”distr_gallery__item distr_gallery__item--2"> + <img src="power_distr.png" alt="Power" class="distr_gallery__img"> + </figure> + + <figure class=”distr_gallery__item distr_gallery__item--3"> + <img src="phase_distr.png" alt="Phase" class="distr_gallery__img"> + </figure> + + </div> + + <h1 class="subheader"> Output Movie Snapshots </h1> + + <!-- trigger the javascript at the end---> + <div class="center"> + <button class="w3-button" onclick="plusDivs(-1)">❮ Prev</button> + <button class="w3-button" onclick="plusDivs(1)">Next ❯</button> + </div> + + <!-- defines all elements of the "FrameSlides" class ---> + {galleries} + </div> + + <!-- javascript with escaped '{{'---> + <script> + var slideIndex = 1; + showDivs(slideIndex); + + function plusDivs(n) {{ + showDivs(slideIndex += n); + }} + + function showDivs(n) {{ + var i; + var x = document.getElementsByClassName("FrameSlides"); + if (n > x.length) {{slideIndex = 1}} + if (n < 1) {{slideIndex = x.length}} ; + for (i = 0; i < x.length; i++) {{ + x[i].style.display = "none"; + }} + x[slideIndex-1].style.display = "block"; + }} + </script> + </body> + </html> + """ + + with open(html_fname, "w") as OUT: + OUT.write(html_string) + + logger.info("Created html report") + return html_string + +# for local testing +# create_html([0,20,40,60,80])