Skip to content

Commit 8b55cc6

Browse files
author
Ben Cipollini
committed
Add back analyze header tests.
1 parent 6206682 commit 8b55cc6

File tree

2 files changed

+74
-3
lines changed

2 files changed

+74
-3
lines changed

nibabel/analyze.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -190,6 +190,7 @@ class AnalyzeHeader(LabeledWrapStruct):
190190
has_data_intercept = False
191191

192192
sizeof_hdr = 348
193+
sniff_size = 348
193194

194195
def __init__(self,
195196
binaryblock=None,
@@ -892,6 +893,16 @@ def _chk_pixdims(hdr, fix=False):
892893
rep.fix_msg = ' and '.join(fmsgs)
893894
return hdr, rep
894895

896+
@classmethod
897+
def is_header(klass, binaryblock):
898+
if len(binaryblock) < klass.sniff_size:
899+
raise ValueError('Must pass a binary block >= %d bytes' % klass.sniff_size)
900+
901+
hdr = np.ndarray(shape=(), dtype=header_dtype,
902+
buffer=binaryblock[:klass.sniff_size])
903+
bs_hdr = hdr.byteswap()
904+
return 348 in (hdr['sizeof_hdr'], bs_hdr['sizeof_hdr'])
905+
895906

896907
class AnalyzeImage(SpatialImage):
897908
""" Class for basic Analyze format image

nibabel/tests/test_image_types.py

Lines changed: 63 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,15 +14,75 @@
1414

1515
import numpy as np
1616

17-
from .. import (Nifti1Image, Nifti1Header, Nifti1Pair, Nifti2Image, Nifti2Pair,
18-
Minc1Image, Minc2Image, Spm2AnalyzeImage, Spm99AnalyzeImage,
19-
AnalyzeImage, MGHImage, all_image_classes)
17+
from .. import (Nifti1Image, Nifti1Header, Nifti1Pair,
18+
Nifti2Image, Nifti2Header, Nifti2Pair,
19+
AnalyzeImage, AnalyzeHeader,
20+
Minc1Image, Minc2Image,
21+
Spm2AnalyzeImage, Spm99AnalyzeImage,
22+
MGHImage, all_image_classes)
2023

2124
from nose.tools import assert_true, assert_equal, assert_false, assert_raises
2225

2326
DATA_PATH = pjoin(dirname(__file__), 'data')
2427

2528

29+
30+
def test_analyze_detection():
31+
# Test detection of Analyze, Nifti1 and Nifti2
32+
# Algorithm is as described in loadsave:which_analyze_type
33+
def wat(hdr):
34+
all_analyze_header_klasses = [Nifti1Header, Nifti2Header,
35+
AnalyzeHeader]
36+
for klass in all_analyze_header_klasses:
37+
try:
38+
if klass.is_header(hdr.binaryblock):
39+
return klass
40+
else:
41+
print('checked completed, but failed.')
42+
except ValueError as ve:
43+
print(ve)
44+
continue
45+
return None
46+
# return nils.which_analyze_type(hdr.binaryblock)
47+
48+
n1_hdr = Nifti1Header(b'\0' * 348, check=False)
49+
n2_hdr = Nifti2Header(b'\0' * 540, check=False)
50+
assert_equal(wat(n1_hdr), None)
51+
52+
n1_hdr['sizeof_hdr'] = 540
53+
n2_hdr['sizeof_hdr'] = 540
54+
assert_equal(wat(n1_hdr), None)
55+
assert_equal(wat(n1_hdr.as_byteswapped()), None)
56+
assert_equal(wat(n2_hdr), Nifti2Header)
57+
assert_equal(wat(n2_hdr.as_byteswapped()), Nifti2Header)
58+
59+
n1_hdr['sizeof_hdr'] = 348
60+
assert_equal(wat(n1_hdr), AnalyzeHeader)
61+
assert_equal(wat(n1_hdr.as_byteswapped()), AnalyzeHeader)
62+
63+
n1_hdr['magic'] = b'n+1'
64+
assert_equal(wat(n1_hdr), Nifti1Header)
65+
assert_equal(wat(n1_hdr.as_byteswapped()), Nifti1Header)
66+
67+
n1_hdr['magic'] = b'ni1'
68+
assert_equal(wat(n1_hdr), Nifti1Header)
69+
assert_equal(wat(n1_hdr.as_byteswapped()), Nifti1Header)
70+
71+
# Doesn't matter what magic is if it's not a nifti1 magic
72+
n1_hdr['magic'] = b'ni2'
73+
assert_equal(wat(n1_hdr), AnalyzeHeader)
74+
75+
n1_hdr['sizeof_hdr'] = 0
76+
n1_hdr['magic'] = b''
77+
assert_equal(wat(n1_hdr), None)
78+
79+
n1_hdr['magic'] = 'n+1'
80+
assert_equal(wat(n1_hdr), Nifti1Header)
81+
82+
n1_hdr['magic'] = 'ni1'
83+
assert_equal(wat(n1_hdr), Nifti1Header)
84+
85+
2686
def test_sniff_and_guessed_image_type(img_klasses=all_image_classes):
2787
"""
2888
Loop over all test cases:

0 commit comments

Comments
 (0)