Skip to content

Commit c9add72

Browse files
committed
add the 'signame' field to MultiRecord objects, and the signalsegments() method to get segments that contain a signal name
1 parent 10c1143 commit c9add72

File tree

2 files changed

+48
-8
lines changed

2 files changed

+48
-8
lines changed

wfdb/readwrite/_headers.py

Lines changed: 38 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -345,7 +345,7 @@ def wrheaderfile(self, writefields):
345345
recordline = recordline + recfieldspecs[field].delimiter + str(getattr(self, field))
346346
headerlines.append(recordline)
347347

348-
# Create segment specification lines
348+
# Create segment specification lines
349349
segmentlines = self.nseg*['']
350350
# For both fields, add each of its elements with the delimiter to the appropriate line
351351
for field in ['segname', 'segname']:
@@ -361,6 +361,43 @@ def wrheaderfile(self, writefields):
361361

362362
linestofile(self.recordname+'.hea', headerlines)
363363

364+
# Get a list of the segment numbers that contain a particular signal
365+
# (or a list of segment numbers for a list of signals)
366+
# Only works if information about the segments has been read in
367+
def signalsegments(self, signame=None):
368+
if self.segments is None:
369+
raise Exception("The MultiRecord's segments must be read in before this method is called. ie. Call rdheader() with rdsegments=True")
370+
371+
# Default value = all signal names.
372+
if signame is None:
373+
signame = self.getsignames()
374+
375+
if type(signame) == list:
376+
return [self.signalsegments(sig) for sig in signame]
377+
elif type(signame) == str:
378+
sigsegs = []
379+
for i in range(self.nseg):
380+
if self.segname[i] != '~' and signame in self.segments[i].signame:
381+
sigsegs.append(i)
382+
return sigsegs
383+
else:
384+
raise TypeError('signame must be a string or a list of strings')
385+
386+
# Get the signal names for the entire record
387+
def getsignames(self):
388+
if self.segments is None:
389+
raise Exception("The MultiRecord's segments must be read in before this method is called. ie. Call rdheader() with rdsegments=True")
390+
391+
if self.layout == 'Fixed':
392+
for i in range(self.nseg):
393+
if self.segname[i] != '~':
394+
signame = self.segments[i].signame
395+
break
396+
else:
397+
signame = self.segments[0].signame
398+
399+
return signame
400+
364401

365402
# Regexp objects for reading headers
366403

wfdb/readwrite/records.py

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ class BaseRecord(object):
2424
def __init__(self, recordname=None, nsig=None,
2525
fs=None, counterfreq=None, basecounter = None,
2626
siglen = None, basetime = None, basedate = None,
27-
comments = None):
27+
comments = None, signame=None):
2828
self.recordname = recordname
2929
self.nsig = nsig
3030
self.fs = fs
@@ -34,7 +34,7 @@ def __init__(self, recordname=None, nsig=None,
3434
self.basetime = basetime
3535
self.basedate = basedate
3636
self.comments = comments
37-
37+
self.signame = signame
3838

3939
# Check whether a single field is valid in its basic form. Does not check compatibility with other fields.
4040
# ch is only used for signal specification fields, specifying the channels to check. Other channels
@@ -359,7 +359,7 @@ def __init__(self, p_signals=None, d_signals=None,
359359

360360
super(Record, self).__init__(recordname, nsig,
361361
fs, counterfreq, basecounter, siglen,
362-
basetime, basedate, comments)
362+
basetime, basedate, comments, signame)
363363

364364
self.p_signals = p_signals
365365
self.d_signals = d_signals
@@ -380,7 +380,6 @@ def __init__(self, p_signals=None, d_signals=None,
380380
self.initvalue=initvalue
381381
self.checksum=checksum
382382
self.blocksize=blocksize
383-
self.signame=signame
384383

385384
# Equal comparison operator for objects of this type
386385
def __eq__(self, other):
@@ -480,7 +479,8 @@ def __init__(self, segments = None, layout = None,
480479
recordname=None, nsig=None, fs=None,
481480
counterfreq=None, basecounter=None,
482481
siglen=None, basetime=None, basedate=None,
483-
segname = None, seglen = None, comments=None)
482+
segname = None, seglen = None, comments=None,
483+
signame = None)
484484
485485
Example Usage:
486486
import wfdb
@@ -496,12 +496,13 @@ def __init__(self, segments = None, layout = None,
496496
recordname=None, nsig=None, fs=None,
497497
counterfreq=None, basecounter=None,
498498
siglen=None, basetime=None, basedate=None,
499-
segname = None, seglen = None, comments=None):
499+
segname = None, seglen = None, comments=None,
500+
signame = None):
500501

501502

502503
super(MultiRecord, self).__init__(recordname, nsig,
503504
fs, counterfreq, basecounter, siglen,
504-
basetime, basedate, comments)
505+
basetime, basedate, comments, signame)
505506

506507
self.layout = layout
507508
self.segments = segments
@@ -978,6 +979,8 @@ def rdheader(recordname, pbdir = None, rdsegments = False):
978979
record.segments.append(None)
979980
else:
980981
record.segments.append(rdheader(os.path.join(dirname,s), pbdir))
982+
# Fill in the signame attribute
983+
record.signame = record.getsignames()
981984

982985
# Set the comments field
983986
record.comments = []

0 commit comments

Comments
 (0)