diff --git a/mapping.py b/mapping.py
index 1f9f8a0d8dd3fbdef03cdab269cfff46db778e47..7e410394753d49b4b2d8cdecdc5538ab80eb07db 100644
--- a/mapping.py
+++ b/mapping.py
@@ -49,6 +49,7 @@ def measurements(program, port):
         images[images < 0] = 0
         if not status:
             raise ValueError("Could not retrieve. Bad status")
+        verbose = 500
         status3, mapping = IR.download_heatflux_scene_model_reference(
             port, program=program, verbose=verbose)
             # testmode=False)
@@ -84,7 +85,7 @@ def measurements_projected(program, port):
         measurements_projected.save(measurements_projected_path)
     else:
         measurements_projected = tfields.Mesh3D.load(measurements_projected_path)
-    return measurments_projected
+    return measurements_projected
 
 
 def strikelines(program, port):
@@ -99,7 +100,6 @@ def strikelines(program, port):
                      '{program}_port_{port}_measurements_mapped.npz'
                      .format(**locals())))
 
-    verbose = 500
     if not os.path.exists(measurements_mapped_path):
         divertor_evaluator = get_divertor_evaluator()
         divertor_evaluator.measurements_projected = measurements_projected(program, port)
@@ -137,7 +137,8 @@ def strikeline_movie(program, port):
                 #     break
 
 
-def plot_strikeline_frame(axes, program, port, time, unit='ns', **kwargs):
+def plot_strikeline_frame(axes, program, port, time, unit='ns',
+        measurements_mapped=None, **kwargs):
     # print(len(measurements_mapped.fields))
     # rna.plotting.use('pyqtgraph')
     # # rna.plotting.backend.set_style()
@@ -163,36 +164,62 @@ def plot_strikeline_frame(axes, program, port, time, unit='ns', **kwargs):
     #     mesh.maps[0].fields[i][np.isnan(mesh.maps[0].fields[i])] = 0
     # mesh.plot(map_index=45, z_index=2)
     if unit == 's':
-        time /= 1e9
+        time *= 1e9
     elif not unit == 'ns':
         raise NotImplementedError("only nano seconds supported")
-    try:
-        measurements_mapped = strikelines(program, port)
-    except Exception as err:
-        print("Error while processing program {program}, port {port}: {err}"
-              .format(**locals()))
-        axes.set_aspect(3)
-        axes.axis('off')
-        axes.text(0.5, 0.5, str(err),
-                  horizontalalignment='center', fontsize=4)
-        return None
+
+    if measurements_mapped is None:
+        try:
+            measurements_mapped = strikelines(program, port)
+        except Exception as err:
+            print("Error while processing program {program}, port {port}: {err}"
+                  .format(**locals()))
+            axes.set_aspect(3)
+            axes.axis('off')
+            axes.text(0.5, 0.5, str(err),
+                      horizontalalignment='center', fontsize=4)
+            return None
     times = np.array(measurements_mapped.names)
     idx = np.searchsorted(times, time, side="left")
+    print(time, idx)
+    values = measurements_mapped.fields[idx]
+    vmax = kwargs.get('vmax', None)
+    if isinstance(vmax, str):
+        if vmax == 'max':
+            vmax = values[~np.isnan(values)].max()
+            print(vmax)
+        else:
+            raise NotImplementedError()
+        kwargs['vmax'] = vmax
     divertor_evaluator = get_divertor_evaluator()
-    artist = divertor_evaluator.plot(measurements_mapped.fields[idx], axes=axes,
-                                     **kwargs)
+    artist = divertor_evaluator.plot(values, axes=axes, **kwargs)
     return artist
 
 
 def plot_strikeline_frame_all_ports(program, time, **kwargs):
+    """
+    python -c "from mapping import plot_strikeline_frame, plot_strikeline_frame_all_ports; import rna; plot_strikeline_frame_all_ports('20180927.007', 'max'); rna.plotting.show()"
+
+    Args:
+        time (float | str):
+            'max': maxima of all frames
+            'max_cumulative': maxima of all frames
+    """
     ports = [10, 11, 20, 21, 30, 31, 40, 41, 50, 51]
+    # ports = [10, 11]
     # ports = [10, 11, 50, 51]
+    data = {}
+    for port in ports:
+        print(port)
+        try:
+            data[port] = strikelines(program, port)
+        except Exception as err:
+            data[port] = None
     if time == 'max':
         max_times = {}
         for port in ports:
-            try:
-                measurements_mapped = strikelines(program, port)
-            except Exception as err:
+            measurements_mapped = data[port]
+            if measurements_mapped is None:
                 continue
             frame_maxima = np.array([f[~np.isnan(f)].max() 
                 for f in measurements_mapped.fields])
@@ -200,8 +227,23 @@ def plot_strikeline_frame_all_ports(program, time, **kwargs):
             max_times[np.max(frame_maxima[idx])] = measurements_mapped.names[idx]
         q_max = max(max_times.keys())
         time = max_times[q_max]
-        kwargs['vmin'] = 0.
-        kwargs['vmax'] = q_max
+    if time == 'max_cumulative':
+        max_times = {}
+        for port in ports:
+            measurements_mapped = data[port]
+            if measurements_mapped is None:
+                continue
+            frame_maxima = np.array([f[~np.isnan(f)].max() 
+                for f in measurements_mapped.fields])
+            frame_sums = np.array([f[~np.isnan(f)].sum() 
+                for f in measurements_mapped.fields])
+            idx = np.argmax(frame_sums, axis=0)
+            max_times[np.max(frame_sums[idx])] = measurements_mapped.names[idx]
+        q_cumulative_max = max(max_times.keys())
+        time = max_times[q_cumulative_max]
+
+    kwargs['vmin'] = 0.
+    # kwargs['vmax'] = q_max
 
     artists = []
     gs = mpl.gridspec.GridSpec(6, 2)
@@ -217,10 +259,13 @@ def plot_strikeline_frame_all_ports(program, time, **kwargs):
         'program {program}\n$t = t_1 + \\SI{{{time_s:3.3f}}}{{\\second}}$'.format(**locals()),
         horizontalalignment='center', fontsize=14)
 
-    if 'vmin' in kwargs and 'vmax' in kwargs:
+    if 'vmin' in kwargs and 'vmax' in kwargs \
+            and not isinstance(kwargs['vmax'], str):
         ax1 = plt.subplot(gs[1])
         cmap = kwargs.get('cmap', plt.get_cmap())
-        norm = mpl.colors.Normalize(vmin=kwargs['vmin'], vmax=kwargs['vmax'])
+        norm = mpl.colors.Normalize(
+            vmin=kwargs['vmin'] * 1e-6,
+            vmax=kwargs['vmax'] * 1e-6)
         from mpl_toolkits.axes_grid1.inset_locator import inset_axes
         axins1 = inset_axes(  # inset axes
             ax1,
@@ -231,17 +276,19 @@ def plot_strikeline_frame_all_ports(program, time, **kwargs):
             axins1,
             cmap=cmap,
             norm=norm,
-            orientation='horizontal')
-        cb.set_label(r'$q [MW/m^2]$')
+            orientation='horizontal',
+            label=r'$q [MW/m^2]$',
+            format=rna.plotting.backend.ScientificFormatter(None, useMathText=False)
+            )
     else:
         ax1 = plt.subplot(gs[1])
     ax1.axis('off')
 
     for i, port in enumerate(ports):
-        print(port)
         ax = plt.subplot(gs[i + 2])
         kwargs['text'] = 'port {port}'.format(**locals())
-        artist = plot_strikeline_frame(ax, program, port, time, **kwargs)
+        artist = plot_strikeline_frame(ax, program, port, time,
+            measurements_mapped=data[port], **kwargs)
         if artist is None:
             continue
         artists.append(artist)
@@ -293,7 +340,7 @@ if __name__ == '__main__':
     # ports = [31]
 
     for port in ports:
-        for program in programs:
+        for program in reversed(programs):
             print("{program}\tAEF{port}".format(**locals()))
             # continue
             try:
diff --git a/plot_standard_case.py b/plot_standard_case.py
new file mode 100644
index 0000000000000000000000000000000000000000..2c987d44d849d7b3b99c2d9fe9293d93d49c6f59
--- /dev/null
+++ b/plot_standard_case.py
@@ -0,0 +1,69 @@
+# -*- coding: utf-8 -*-
+"""
+Created on Wed Mai 3 2019
+@author: dboe
+"""
+import numpy as np
+import datetime
+import tfields
+import mapping
+import rna
+import w7x
+import os
+import loggingTools
+rna.plotting.set_style(upgrade=True)
+
+
+if __name__ == '__main__':
+    # port = 31
+    # program = "20181004.012"
+    ports = [10, 11, 20, 21, 30, 31, 40, 41, 50, 51]
+    # id:XP_* AND tags.value:S53 AND tags.value:ok
+    programs = [
+        'XP_20180927.7 ID1_reference_discharge_@FTM+252_all_gyro_NBI_10s_v2_CTS',
+        'XP_20180927.17 ID11_2MW_ne_3.5_4s',
+        'XP_20180927.22 ID14_2MW_ne_3.5_4s',
+        'XP_20180927.34 ID26_2-4MW_ne_8_NBIblips_21s',
+        'XP_20180927.15 ID7+8_2MW_ne_3.5_4s',
+        'XP_20180927.24 ID17_2MW_ne_3.5_NBIblibs_15s',
+        'XP_20180927.26 ID19_X2_5.5MW_4e19_pellets_NBIblips_CTS_v2',
+        'XP_20180927.32 ID24_X2_5.5MW_4e19_pellets_NBIblips_CTS',
+        'XP_20180927.14 S43_#9_NBI-S7_TC_V2',
+        'XP_20180927.18 ID11_2MW_ne_3.5_4s',
+        'XP_20180927.16 ID9+10_2MW_ne_3.5_4s',
+        'XP_20180927.25 ID18_2-4MW_ne_3.5-6_16.25s',
+        'XP_20180927.28 ID20_2MW_ne_3.5_4s',
+        'XP_20180927.9 ID2_2MW_ne_3.5_NBIblips_30s',
+        'XP_20180927.10 ID3_1.7MW_ne_2.5_NBIblips_40s',
+        'XP_20180927.13 S43_#9_NBI-S7',
+        'XP_20180927.19 ID11_2MW_ne_3.5_4s',
+        'XP_20180927.27 ID20_2MW_ne_3.5_4s',
+        'XP_20180927.31 ID23_4MW_ne_6_3.4s_v2',
+        'XP_20180927.30 ID22_2MW_ne_3.5_4s',
+        'XP_20180927.5 ID1_reference_discharge_@FTM+252_all_gyro_NBI_10s_v2_CTS',
+        'XP_20180927.8 ID1_reference_discharge_@FTM+252_all_gyro_NBI_10s_v2_CTS',
+        'XP_20180927.23 ID16_3.5MW_ne_6_4s',
+        'XP_20180927.21 ID14_2MW_ne_3.5_4s',
+        'XP_20180927.29 ID20_2MW_ne_3.5_4s',
+        'XP_20180927.33 ID25_2MW_ne_3.5_NBIblips_22s',
+    ]
+    for p in range(len(programs)):
+        value = programs[p]
+        value = value[3:]
+        value = value.split(' ')[0]
+        parts = value.split('.')
+        value = parts[0] + ".{:03d}".format(int(parts[1]))
+        programs[p] = value
+
+    # programs = ["20180927.034"]
+    # ports = [31]
+    
+    for port in ports:
+        for program in programs:
+            print("{program}\tAEF{port}".format(**locals()))
+            # continue
+            try:
+                mapping.measurements(program, port)
+            except Exception as err:
+                print(str(err))
+            print("DONE ___________________")