Add -p/--plot option so scripts will plot waves.
authorW. Trevor King <wking@tremily.us>
Sat, 21 Jul 2012 15:30:12 +0000 (11:30 -0400)
committerW. Trevor King <wking@tremily.us>
Sat, 21 Jul 2012 15:30:12 +0000 (11:30 -0400)
bin/igorbinarywave.py
bin/igorpackedexperiment.py
igor/script.py

index 6215628..70c1bc3 100755 (executable)
@@ -27,13 +27,16 @@ from igor.binarywave import load
 from igor.script import Script
 
 
-def run(args):
-    wave = load(args.infile)
-    numpy.savetxt(args.outfile, wave['wave']['wData'], fmt='%g', delimiter='\t')
-    if args.verbose > 0:
-        wave['wave'].pop('wData')
-        pprint.pprint(wave)
-
-s = Script(description=__doc__)
-s._run = run
+class WaveScript (Script):
+    def _run(self, args):
+        wave = load(args.infile)
+        numpy.savetxt(
+            args.outfile, wave['wave']['wData'], fmt='%g', delimiter='\t')
+        self.plot_wave(args, wave)
+        if args.verbose > 0:
+            wave['wave'].pop('wData')
+            pprint.pprint(wave)
+
+
+s = WaveScript(description=__doc__)
 s.run()
index 6664a96..af8bafc 100755 (executable)
@@ -23,25 +23,34 @@ import pprint
 
 import numpy
 
-from igor.packed import load
+from igor.packed import load, walk
+from igor.record.wave import WaveRecord
 from igor.script import Script
 
 
-def run(args):
-    records,filesystem = load(args.infile)
-    if hasattr(args.outfile, 'write'):
-        f = args.outfile  # filename is actually a stream object
-    else:
-        f = open(args.outfile, 'w')
-    try:
-        f.write(pprint.pformat(records))
-        f.write('\n')
-    finally:
-        if f != args.outfile:
-            f.close()
-    if args.verbose > 0:
-        pprint.pprint(filesystem)
-
-s = Script(description=__doc__, filetype='IGOR Packed Experiment (.pxp) file')
-s._run = run
+class PackedScript (Script):
+    def _run(self, args):
+        self.args = args
+        records,filesystem = load(args.infile)
+        if hasattr(args.outfile, 'write'):
+            f = args.outfile  # filename is actually a stream object
+        else:
+            f = open(args.outfile, 'w')
+        try:
+            f.write(pprint.pformat(records))
+            f.write('\n')
+        finally:
+            if f != args.outfile:
+                f.close()
+        if args.verbose > 0:
+            pprint.pprint(filesystem)
+        walk(filesystem, self._plot_wave_callback)
+
+    def _plot_wave_callback(self, dirpath, key, value):
+        if isinstance(value, WaveRecord):
+            self.plot_wave(self.args, value.wave, title=dirpath + [key])
+
+
+s = PackedScript(
+    description=__doc__, filetype='IGOR Packed Experiment (.pxp) file')
 s.run()
index cbfd519..e14db5e 100644 (file)
@@ -22,6 +22,12 @@ import argparse as _argparse
 import logging as _logging
 import sys as _sys
 
+try:
+    import matplotlib as _matplotlib
+    import matplotlib.pyplot as _matplotlib_pyplot
+except ImportError as _matplotlib_import_error:
+    _matplotlib = None
+
 from . import __version__
 from . import LOG as _LOG
 
@@ -38,9 +44,13 @@ class Script (object):
         self.parser.add_argument(
             '-o', '--outfile', metavar='FILE', default='-',
             help='file for ASCII output')
+        self.parser.add_argument(
+            '-p', '--plot', action='store_const', const=True,
+            help='use Matplotlib to plot any IGOR waves')
         self.parser.add_argument(
             '-V', '--verbose', action='count', default=0,
             help='increment verbosity')
+        self._num_plots = 0
 
     def run(self, *args, **kwargs):
         args = self.parser.parse_args(*args, **kwargs)
@@ -52,6 +62,24 @@ class Script (object):
             log_level = self.log_levels[min(args.verbose-1, len(self.log_levels)-1)]
             _LOG.setLevel(log_level)
         self._run(args)
+        self.display_plots()
 
     def _run(self, args):
         raise NotImplementedError()
+
+    def plot_wave(self, args, wave, title=None):
+        if not args.plot:
+            return  # no-op
+        if not _matplotlib:
+            raise _matplotlib_import_error
+        if title is None:
+            title = wave['wave']['wave_header']['bname']
+        figure = _matplotlib_pyplot.figure()
+        axes = figure.add_subplot(1, 1, 1)
+        axes.set_title(title)
+        axes.plot(wave['wave']['wData'], 'r.')
+        self._num_plots += 1
+
+    def display_plots(self):
+        if self._num_plots:
+            _matplotlib_pyplot.show()