def chk1(obj, fix=True): ret = Report(obj, KeyError) if obj.has_key('testkey'): return ret ret.problem_msg = 'no "testkey"' if fix: obj['testkey'] = 1 ret.fix_msg = 'added "testkey"' else: ret.problem_level = 20 return ret
def chk_error(obj, fix=True): ret = Report(obj, KeyError) if obj.has_key('thirdkey'): return ret ret.problem_msg = 'no "thirdkey"' if fix: obj['anotherkey'] = 'a string' ret.fix_msg = 'added "anotherkey"' else: ret.problem_level = 40 return ret
def _chk_sizeof_hdr(hdr, fix=True): ret = Report(hdr, HeaderDataError) if hdr['sizeof_hdr'] == 348: return ret ret.problem_msg = 'sizeof_hdr should be 348' if fix: hdr['sizeof_hdr'] = 348 ret.fix_msg = 'set sizeof_hdr to 348' else: ret.problem_level = 30 return ret
def _chk_pixdims(hdr, fix=True): ret = Report(hdr, HeaderDataError) if not np.any(hdr['pixdim'][1:4] < 0): return ret ret.problem_msg = 'pixdim[1,2,3] should be positive' if fix: hdr['pixdim'][1:4] = np.abs(hdr['pixdim'][1:4]) ret.fix_msg = 'setting to abs of pixdim values' else: ret.problem_level = 40 return ret
def test_report_strings(): rep = Report() yield assert_not_equal, rep.__str__(), '' yield assert_equal, rep.message, '' str_io = StringIO() rep.write_raise(str_io) yield assert_equal, str_io.getvalue(), '' rep = Report('', ValueError, 20, 'msg', 'fix') rep.write_raise(str_io) yield assert_equal, str_io.getvalue(), '' rep.problem_level = 30 rep.write_raise(str_io) yield assert_equal, str_io.getvalue(), 'Level 30: msg; fix\n' str_io.truncate(0) # No fix string, no fix message rep.fix_msg = '' rep.write_raise(str_io) yield assert_equal, str_io.getvalue(), 'Level 30: msg\n' rep.fix_msg = 'fix' str_io.truncate(0) # If we drop the level, nothing goes to the log rep.problem_level = 20 rep.write_raise(str_io) yield assert_equal, str_io.getvalue(), '' # Unless we set the default log level in the call rep.write_raise(str_io, log_level=20) yield assert_equal, str_io.getvalue(), 'Level 20: msg; fix\n' str_io.truncate(0) # If we set the error level down this low, we raise an error yield assert_raises, ValueError, rep.write_raise, str_io, 20 # But the log level wasn't low enough to do a log entry yield assert_equal, str_io.getvalue(), '' # Error still raised with lower log threshold, but now we do get a # log entry yield assert_raises, ValueError, rep.write_raise, str_io, 20, 20 yield assert_equal, str_io.getvalue(), 'Level 20: msg; fix\n' # If there's no error, we can't raise str_io.truncate(0) rep.error = None rep.write_raise(str_io, 20) yield assert_equal, str_io.getvalue(), ''
def _chk_scale(klass, hdr, fix=True): ret = Report(hdr, HeaderDataError) scale, offset = hdr.get_slope_inter() if not scale is None: return ret ret.problem_msg = "no valid scaling in scalefactor (=%s) " "or cal / gl fields; scalefactor assumed 1.0" % scale if fix: hdr["scl_slope"] = 1 ret.fix_msg = 'setting scalefactor "scl_slope" to 1' else: ret.problem_level = 30 return ret
def _chk_scale(hdr, fix=True): ret = Report(hdr, HeaderDataError) scale = hdr['scl_slope'] if scale and np.isfinite(scale): return ret ret.problem_msg = ('scale slope is %s; should !=0 and be finite' % scale) if fix: hdr['scl_slope'] = 1 ret.fix_msg = 'setting scalefactor "scale" to 1' else: ret.problem_level = 30 return ret
def _chk_origin(hdr, fix=True): ret = Report(hdr, HeaderDataError) origin = hdr['origin'][0:3] dims = hdr['dim'][1:4] if (not np.any(origin) or (np.all(origin > -dims) and np.all(origin < dims*2))): return ret ret.problem_msg = 'very large origin values relative to dims' if fix: ret.fix_msg = 'leaving as set, ignoring for affine' else: ret.problem_level = 20 return ret
def _chk_bitpix(klass, hdr, fix=True): ret = Report(hdr, HeaderDataError) code = int(hdr['datatype']) try: dt = klass._data_type_codes.dtype[code] except KeyError: ret.problem_level = 10 ret.problem_msg = 'no valid datatype to fix bitpix' if fix: ret.fix_msg = 'no way to fix bitpix' return ret bitpix = dt.itemsize * 8 ret = Report(hdr) if bitpix == hdr['bitpix']: return ret ret.problem_msg = 'bitpix does not match datatype' if fix: hdr['bitpix'] = bitpix # inplace modification ret.fix_msg = 'setting bitpix to match datatype' else: ret.problem_level = 10 return ret
def chk2(obj, fix=True): # Can return different codes for different errors in same check ret = Report(obj) try: ok = obj['testkey'] == 0 except KeyError: ret.problem_msg = 'no "testkey"' ret.error = KeyError if fix: obj['testkey'] = 1 ret.fix_msg = 'added "testkey"' else: ret.problem_level = 20 return ret if ok: return ret ret.problem_msg = '"testkey" != 0' ret.error = ValueError if fix: ret.fix_msg = 'set "testkey" to 0' obj['testkey'] = 0 else: ret.problem_level = 10 return ret