1
1
import numpy as np
2
2
import pandas as pd
3
- import sys
4
3
import re
5
4
import os
6
5
from . import _headers
@@ -99,7 +98,7 @@ def checkfields(self):
99
98
for field in ['recordname' , 'annotator' , 'annsamp' , 'anntype' ]:
100
99
if getattr (self , field ) is None :
101
100
print ('The ' , field , ' field is mandatory for writing annotation files' )
102
- sys . exit ( )
101
+ raise Exception ( 'Missing required annotation field' )
103
102
104
103
# Check all set fields
105
104
for field in annfields :
@@ -114,32 +113,30 @@ def checkfield(self, field):
114
113
if field in ['recordname' , 'annotator' , 'fs' ]:
115
114
# Check the field type
116
115
if type (getattr (self , field )) not in annfieldtypes [field ]:
117
- print ('The ' + field + ' field must be one of the following types:' )
118
116
print (annfieldtypes [field ])
119
- sys . exit ( )
117
+ raise TypeError ( 'The ' + field + ' field must be one of the above types.' )
120
118
121
119
# Field specific checks
122
120
if field == 'recordname' :
123
121
# Allow letters, digits, hyphens, and underscores.
124
122
acceptedstring = re .match ('[-\w]+' , self .recordname )
125
123
if not acceptedstring or acceptedstring .string != self .recordname :
126
- sys . exit ('recordname must only comprise of letters, digits, hyphens, and underscores.' )
124
+ raise ValueError ('recordname must only comprise of letters, digits, hyphens, and underscores.' )
127
125
elif field == 'annotator' :
128
126
# Allow letters only
129
127
acceptedstring = re .match ('[a-zA-Z]+' , self .annotator )
130
128
if not acceptedstring or acceptedstring .string != self .annotator :
131
- sys . exit ('annotator must only comprise of letters' )
129
+ raise ValueError ('annotator must only comprise of letters' )
132
130
elif field == 'fs' :
133
131
if self .fs <= 0 :
134
- sys . exit ('The fs field must be a non-negative number' )
132
+ raise ValueError ('The fs field must be a non-negative number' )
135
133
136
134
else :
137
135
fielditem = getattr (self , field )
138
136
139
137
# Ensure the field item is a list or array.
140
138
if type (fielditem ) not in [list , np .ndarray ]:
141
- print ('The ' , field , ' field must be a list or numpy array' )
142
- sys .exit ()
139
+ raise TypeError ('The ' + field + ' field must be a list or numpy array' )
143
140
144
141
# Check the data types of the elements
145
142
# annsamp and anntype may NOT have nones. Others may.
@@ -149,44 +146,44 @@ def checkfield(self, field):
149
146
print ("All elements of the '" , field , "' field must be one of the following types:" )
150
147
print (annfieldtypes [field ])
151
148
print ("All elements must be present" )
152
- sys . exit ()
149
+ raise Exception ()
153
150
else :
154
151
for item in fielditem :
155
152
if item is not None and type (item ) not in annfieldtypes [field ]:
156
153
print ("All elements of the '" , field , "' field must be one of the following types:" )
157
154
print (annfieldtypes [field ])
158
155
print ("Elements may also be set to 'None'" )
159
- sys . exit ()
156
+ raise Exception ()
160
157
161
158
# Field specific checks
162
159
# The C WFDB library stores num/sub/chan as chars.
163
160
if field == 'annsamp' :
164
161
sampdiffs = np .concatenate (([self .annsamp [0 ]], np .diff (self .annsamp )))
165
162
if min (self .annsamp ) < 0 :
166
- sys . exit ("The 'annsamp' field must only contain non-negative integers" )
163
+ raise ValueError ("The 'annsamp' field must only contain non-negative integers" )
167
164
if min (sampdiffs ) < 0 :
168
- sys . exit ("The 'annsamp' field must contain monotonically increasing sample numbers" )
165
+ raise ValueError ("The 'annsamp' field must contain monotonically increasing sample numbers" )
169
166
if max (sampdiffs ) > 2147483648 :
170
- sys . exit ('WFDB annotation files cannot store sample differences greater than 2**31' )
167
+ raise ValueError ('WFDB annotation files cannot store sample differences greater than 2**31' )
171
168
elif field == 'anntype' :
172
169
# Ensure all fields lie in standard WFDB annotation codes
173
170
if set (self .anntype ) - set (annsyms .values ()) != set ():
174
171
print ("The 'anntype' field contains items not encoded in the WFDB annotation library." )
175
172
print ('To see the valid annotation codes call: showanncodes()' )
176
173
print ('To transfer non-encoded anntype items into the aux field call: self.type2aux()' )
177
- sys . exit ()
174
+ raise Exception ()
178
175
elif field == 'subtype' :
179
176
# signed character
180
177
if min (self .subtype ) < 0 or max (self .subtype ) > 127 :
181
- sys . exit ("The 'subtype' field must only contain non-negative integers up to 127" )
178
+ raise ValueError ("The 'subtype' field must only contain non-negative integers up to 127" )
182
179
elif field == 'chan' :
183
180
# unsigned character
184
181
if min (self .chan ) < 0 or max (self .chan ) > 255 :
185
- sys . exit ("The 'chan' field must only contain non-negative integers up to 255" )
182
+ raise ValueErrort ("The 'chan' field must only contain non-negative integers up to 255" )
186
183
elif field == 'num' :
187
184
# signed character
188
185
if min (self .num ) < 0 or max (self .num ) > 127 :
189
- sys . exit ("The 'num' field must only contain non-negative integers up to 127" )
186
+ raise ValueError ("The 'num' field must only contain non-negative integers up to 127" )
190
187
#elif field == 'aux': # No further conditions for aux field.
191
188
192
189
@@ -198,7 +195,7 @@ def checkfieldcohesion(self):
198
195
for field in ['annsamp' , 'anntype' , 'num' , 'subtype' , 'chan' , 'aux' ]:
199
196
if getattr (self , field ) is not None :
200
197
if len (getattr (self , field )) != nannots :
201
- sys . exit ("All written annotation fields: ['annsamp', 'anntype', 'num', 'subtype', 'chan', 'aux'] must have the same length" )
198
+ raise ValueError ("All written annotation fields: ['annsamp', 'anntype', 'num', 'subtype', 'chan', 'aux'] must have the same length" )
202
199
203
200
# Write an annotation file
204
201
def wrannfile (self ):
@@ -260,10 +257,10 @@ def type2aux(self):
260
257
261
258
# Ensure that anntype is a list of strings
262
259
if type (self .anntype )!= list :
263
- sys . exit ('anntype must be a list' )
260
+ raise TypeError ('anntype must be a list' )
264
261
for at in self .anntype :
265
262
if type (at ) != str :
266
- sys . exit ('anntype elements must all be strings' )
263
+ raise TypeError ('anntype elements must all be strings' )
267
264
268
265
external_anntypes = set (self .anntype ) - set (annsyms .values ())
269
266
0 commit comments