From eca5dc3b62d51577a42ffda2e57256170904dc93 Mon Sep 17 00:00:00 2001 From: Arnaud Gardelein Date: Sun, 2 Oct 2011 00:15:31 +0200 Subject: [PATCH] Support for Berkeley Spice2G6 raw format --- oscopy/readers/Makefile.am | 3 +- oscopy/readers/detect_reader.py | 4 +- oscopy/readers/spice2raw_reader.py | 104 +++++++++++++++++++++++++++++++++++++ 3 files changed, 109 insertions(+), 2 deletions(-) create mode 100644 oscopy/readers/spice2raw_reader.py diff --git a/oscopy/readers/Makefile.am b/oscopy/readers/Makefile.am index f689e25..b70511d 100644 --- a/oscopy/readers/Makefile.am +++ b/oscopy/readers/Makefile.am @@ -6,4 +6,5 @@ readers_PYTHON = __init__.py\ gnucap_reader.py\ signal_reader.py\ cazm_reader.py\ - nsout_reader.py + nsout_reader.py\ + spice2raw_reader.py diff --git a/oscopy/readers/detect_reader.py b/oscopy/readers/detect_reader.py index 42b5d60..e535568 100644 --- a/oscopy/readers/detect_reader.py +++ b/oscopy/readers/detect_reader.py @@ -6,8 +6,10 @@ from gnucap_reader import GnucapReader from signal_reader import SignalReader from cazm_reader import CazmReader from nsout_reader import NsoutReader +from spice2raw_reader import Spice2rawReader -READERS = [SignalReader, GnucapReader, CazmReader, NsoutReader] +READERS = [SignalReader, GnucapReader, CazmReader, NsoutReader, + Spice2rawReader] def DetectReader(filename): """ Find which Reader can handle the filename diff --git a/oscopy/readers/spice2raw_reader.py b/oscopy/readers/spice2raw_reader.py new file mode 100644 index 0000000..0f19426 --- /dev/null +++ b/oscopy/readers/spice2raw_reader.py @@ -0,0 +1,104 @@ +from __future__ import with_statement + +from oscopy import Signal +from reader import Reader, ReadError +import struct + +class Spice2rawReader(Reader): + """ Read Berkeley Spice2G6 'raw' output files + + Currently support only one dataset per file + Date and Time fields are not processed + + see http://www.rvq.fr/linux/gawfmt.php for format description + """ + _signature = 'rawfile1' + _types_to_unit = {0: 'a.u.', 1: 's', 2: 'V', 3: 'A', 4: 'Hz', 5: 'a.u.'} + def detect(self, fn): + """ Look at the header if it contains the keyword self._signature + + Parameter + --------- + fn: string + Path to the file to test + + Returns + ------- + bool + True if the file can be handled by this reader + """ + self._check(fn) + try: + f = open(fn) + except IOError, e: + return False + s = f.read(8) + f.close() + return s == self._signature + + def _read_signals(self): + """ Read the signals from the file + + Supports only one dataset per file + + Parameter + --------- + fn: string + The filename + + Returns + ------- + Dict of Signals + The list of Signals read from the file + + Raises + ------ + ReaderError + In case of invalid path or unsupported file format + """ + header_fields = ['signature', 'title', 'date', 'time', + 'mode', 'nvars', 'const4'] + with open(self._fn) as f: + # Header + signature = f.read(8) + title = f.read(80).strip('\x00') + res = f.read(22) + (date, t, mode, nvars, const4) = struct.unpack('<2d3h' ,res) + self._info.update(dict(zip(header_fields, (signature, title, date, t, mode, nvars, const4)))) + + names = [] + for i in xrange(nvars): + names.append(f.read(8).strip('#').strip('\x00')) + types = struct.unpack('<%dh' % nvars, f.read(2 * nvars)) + locs = struct.unpack('<%dh' % nvars, f.read(2 * nvars)) + self._info['plottitle'] = f.read(24).strip('\x00') + + # Now we can create the signals + signals = [] + for i in xrange(nvars): + signals.append(Signal(names[i], + self._types_to_unit.get(types[i], 'a.u.'))) + # Data + data = [[] for x in xrange(len(names))] + # optimization: cache the append methods, + # avoiding one dictionary lookup per line + append = [x.append for x in data] + while f: + tmp = f.read(8 * nvars) + if len(tmp) < 8 * nvars: break + values = struct.unpack('<%dd' % nvars, tmp) + for i, v in enumerate(values): + append[i](v) + + ref = signals[0] + ref.data = data[0] + for i, s in enumerate(signals[1:]): + s.ref = ref + s.data = data[i + 1] + + self._signals = dict(zip(names[1:], signals[1:])) + print self._signals + return self._signals + + + -- 2.11.4.GIT