Skip to content

Commit e9642aa

Browse files
committed
Add support for IgorIO.read(), read_block(), read_segment() for .pxp files (currently only read_analogsignal() works for such files)
1 parent 39c14da commit e9642aa

File tree

1 file changed

+29
-12
lines changed

1 file changed

+29
-12
lines changed

neo/io/igorproio.py

Lines changed: 29 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222
try:
2323
import igor.binarywave as bw
2424
import igor.packed as pxp
25-
25+
from igor.record.wave import WaveRecord
2626
HAVE_IGOR = True
2727
except ImportError:
2828
HAVE_IGOR = False
@@ -73,6 +73,7 @@ def __init__(self, filename=None, parse_notes=None):
7373
self.filename = filename
7474
self.extension = filename.split('.')[-1]
7575
self.parse_notes = parse_notes
76+
self._filesystem = None
7677

7778
def read_block(self, lazy=False):
7879
assert not lazy, 'Do not support lazy'
@@ -84,11 +85,23 @@ def read_block(self, lazy=False):
8485

8586
def read_segment(self, lazy=False):
8687
assert not lazy, 'Do not support lazy'
87-
8888
segment = Segment(file_origin=self.filename)
89-
segment.analogsignals.append(
90-
self.read_analogsignal(lazy=lazy))
91-
segment.analogsignals[-1].segment = segment
89+
90+
if self.extension == 'pxp':
91+
if not self._filesystem:
92+
_, self.filesystem = pxp.load(self.filename)
93+
94+
def callback(dirpath, key, value):
95+
if isinstance(value, WaveRecord):
96+
signal = self._wave_to_analogsignal(value.wave['wave'])
97+
signal.segment = segment
98+
segment.analogsignals.append(signal)
99+
100+
pxp.walk(self.filesystem, callback)
101+
else:
102+
segment.analogsignals.append(
103+
self.read_analogsignal(lazy=lazy))
104+
segment.analogsignals[-1].segment = segment
92105
return segment
93106

94107
def read_analogsignal(self, path=None, lazy=False):
@@ -106,14 +119,18 @@ def read_analogsignal(self, path=None, lazy=False):
106119
elif self.extension == 'pxp':
107120
assert type(path) is str, \
108121
"A colon-separated Igor-style path must be provided."
109-
_, filesystem = pxp.load(self.filename)
110-
path = path.split(':')
111-
location = filesystem['root']
112-
for element in path:
113-
if element != 'root':
114-
location = location[element.encode('utf8')]
122+
if not self._filesystem:
123+
_, self.filesystem = pxp.load(self.filename)
124+
path = path.split(':')
125+
location = self.filesystem['root']
126+
for element in path:
127+
if element != 'root':
128+
location = location[element.encode('utf8')]
115129
data = location.wave
116-
content = data['wave']
130+
131+
return self._wave_to_analogsignal(data['wave'])
132+
133+
def _wave_to_analogsignal(self, content):
117134
if "padding" in content:
118135
assert content['padding'].size == 0, \
119136
"Cannot handle non-empty padding"

0 commit comments

Comments
 (0)