Skip to content

Commit e3d507f

Browse files
authored
Merge pull request #791 from apdavison/igorio-fix
Improvements to support for .pxp files by IgorIO (The test failures seem to have nothing to do with this PR, so merging.)
2 parents 3853c75 + 41bdf66 commit e3d507f

File tree

1 file changed

+33
-15
lines changed

1 file changed

+33
-15
lines changed

neo/io/igorproio.py

Lines changed: 33 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
try:
2121
import igor.binarywave as bw
2222
import igor.packed as pxp
23-
23+
from igor.record.wave import WaveRecord
2424
HAVE_IGOR = True
2525
except ImportError:
2626
HAVE_IGOR = False
@@ -71,26 +71,39 @@ def __init__(self, filename=None, parse_notes=None):
7171
self.filename = filename
7272
self.extension = filename.split('.')[-1]
7373
self.parse_notes = parse_notes
74+
self._filesystem = None
7475

7576
def read_block(self, lazy=False):
76-
assert not lazy, 'Do not support lazy'
77+
assert not lazy, 'This IO does not support lazy mode'
7778

7879
block = Block(file_origin=self.filename)
7980
block.segments.append(self.read_segment(lazy=lazy))
8081
block.segments[-1].block = block
8182
return block
8283

8384
def read_segment(self, lazy=False):
84-
assert not lazy, 'Do not support lazy'
85-
85+
assert not lazy, 'This IO does not support lazy mode'
8686
segment = Segment(file_origin=self.filename)
87-
segment.analogsignals.append(
88-
self.read_analogsignal(lazy=lazy))
89-
segment.analogsignals[-1].segment = segment
87+
88+
if self.extension == 'pxp':
89+
if not self._filesystem:
90+
_, self.filesystem = pxp.load(self.filename)
91+
92+
def callback(dirpath, key, value):
93+
if isinstance(value, WaveRecord):
94+
signal = self._wave_to_analogsignal(value.wave['wave'], dirpath)
95+
signal.segment = segment
96+
segment.analogsignals.append(signal)
97+
98+
pxp.walk(self.filesystem, callback)
99+
else:
100+
segment.analogsignals.append(
101+
self.read_analogsignal(lazy=lazy))
102+
segment.analogsignals[-1].segment = segment
90103
return segment
91104

92105
def read_analogsignal(self, path=None, lazy=False):
93-
assert not lazy, 'Do not support lazy'
106+
assert not lazy, 'This IO does not support lazy mode'
94107

95108
if not HAVE_IGOR:
96109
raise Exception("`igor` package not installed. "
@@ -104,14 +117,18 @@ def read_analogsignal(self, path=None, lazy=False):
104117
elif self.extension == 'pxp':
105118
assert type(path) is str, \
106119
"A colon-separated Igor-style path must be provided."
107-
_, filesystem = pxp.load(self.filename)
108-
path = path.split(':')
109-
location = filesystem['root']
110-
for element in path:
111-
if element != 'root':
112-
location = location[element.encode('utf8')]
120+
if not self._filesystem:
121+
_, self.filesystem = pxp.load(self.filename)
122+
path = path.split(':')
123+
location = self.filesystem['root']
124+
for element in path:
125+
if element != 'root':
126+
location = location[element.encode('utf8')]
113127
data = location.wave
114-
content = data['wave']
128+
129+
return self._wave_to_analogsignal(data['wave'], [])
130+
131+
def _wave_to_analogsignal(self, content, dirpath):
115132
if "padding" in content:
116133
assert content['padding'].size == 0, \
117134
"Cannot handle non-empty padding"
@@ -141,6 +158,7 @@ def read_analogsignal(self, path=None, lazy=False):
141158
annotations = {'note': note}
142159
else:
143160
annotations = {'note': note}
161+
annotations["igor_path"] = ":".join(item.decode('utf-8') for item in dirpath)
144162

145163
signal = AnalogSignal(signal, units=units, copy=False, t_start=t_start,
146164
sampling_period=sampling_period, name=name,

0 commit comments

Comments
 (0)