Thanks to visit codestin.com
Credit goes to github.com

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)