diff output_report.py @ 0:1d62de03829d draft

"planemo upload commit c6cd06d44dce1eef9136017289d362f144687dc1"
author gregor.m
date Mon, 23 Nov 2020 13:31:47 +0000
parents
children 4d7f30a7e2f6
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/output_report.py	Mon Nov 23 13:31:47 2020 +0000
@@ -0,0 +1,199 @@
+''' Produces plots and a summary html 'headless' '''
+
+import os
+import matplotlib
+# headless plotting and disable latex
+matplotlib.use('Agg')
+matplotlib.rcParams['text.usetex'] = False
+import matplotlib.pyplot as ppl
+
+import logging
+
+import spyboat.plotting as spyplot
+
+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)
+    
+    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)
+
+    spyplot.period_snapshot(results['period'][frame],
+                            Wkwargs,
+                            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)
+    
+    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)
+        
+
+    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, f'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, f'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, f'phase_distr.png')    
+    fig.savefig(out_path, dpi=DPI)
+        
+    logger.info(f'Produced 3 distribution plots..')
+
+    
+def create_html(frame_num, html_fname='OutputReport.html'):
+
+    '''
+    The html generated assumes the respective png's (7 in total)
+    have been created with 'produce_snapshots' and 'produce_distr_plots'
+    and can be found at the cwd (that's how Galaxy works..)
+    '''
+
+    html_string =f'''
+    <html>
+    <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{{
+            display: block;
+            margin-left: auto;
+            margin-right: auto;
+            width: 40%;}}
+
+        /* 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: 25vw;    
+            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;
+        }}
+     </style>
+    </head>
+    <body>
+    <h1 style="text-align:center">SpyBOAT Results Report</h1>
+    <hr style="width:50%"> 
+    <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>
+
+    <h2 style="text-align:center"> Snapshots - Frame {frame_num}</h2>
+    <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>
+    
+
+        <!-- *** Section 1 *** --->
+    </body>
+    </html>
+    '''
+
+    with open(html_fname, 'w') as OUT:
+
+        OUT.write(html_string)
+
+    logger.info(f'Created html report')
+    return html_string
+
+# for local testing
+# create_html(125)