2020try :
2121 import igor .binarywave as bw
2222 import igor .packed as pxp
23-
23+ from igor . record . wave import WaveRecord
2424 HAVE_IGOR = True
2525except 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