nifti 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,3 +1,4 @@
1
+ require 'rspec'
1
2
  require 'digest/md5'
2
3
 
3
4
  # Source: Matt Wynne; https://gist.github.com/736421
@@ -0,0 +1,76 @@
1
+ require 'spec_helper'
2
+
3
+ describe NIFTI::NImage do
4
+ let!(:image_array) { Array.new(27,0.0) }
5
+ let!(:dim) { [3, 3, 3, 3, 1, 1, 1] }
6
+
7
+ describe 'shape' do
8
+ it 'should disconsider the first (number of dimensions) and three last elements of dim' do
9
+ NImage.new(image_array, dim).shape.should eq([3,3,3])
10
+ end
11
+ end
12
+
13
+ describe '[]' do
14
+ subject { NImage.new(image_array, dim) }
15
+
16
+ context 'with a Fixnum' do
17
+ context 'with a index out of range' do
18
+ it 'should raise a IndexError' do
19
+ expect{ subject[2][2][3] }.to raise_error(IndexError)
20
+ end
21
+ end
22
+
23
+ context 'with a valid index' do
24
+ it 'should return the value' do
25
+ mod_image_array = image_array
26
+ mod_image_array[26] = 1.0
27
+ n_image = NImage.new(mod_image_array, dim)
28
+
29
+ n_image[2][2][2].should eq(1.0)
30
+ end
31
+ end
32
+ end
33
+
34
+ context 'with a Range' do
35
+ context 'with a index out of range' do
36
+ it 'should raise a IndexError' do
37
+ expect{ subject[2][2][0..3] }.to raise_error(IndexError)
38
+ end
39
+ end
40
+
41
+ context 'with a valid index' do
42
+ it 'should return the value' do
43
+ mod_image_array = image_array
44
+ mod_image_array[26] = 1.0
45
+ n_image = NImage.new(mod_image_array, dim)
46
+
47
+ n_image[2][2][0..2].should eq([0.0, 0.0, 1.0])
48
+ end
49
+ end
50
+ end
51
+ end
52
+
53
+ describe '[]=' do
54
+ subject { NImage.new(image_array, dim) }
55
+
56
+ context 'when setting value for a non Fixnum' do
57
+ it 'should raise an error' do
58
+ expect { subject[2]=1.0}.to raise_error(IndexError)
59
+ end
60
+ end
61
+
62
+ context 'with an invalid index' do
63
+ it 'should raise an error' do
64
+ expect { subject[2][2][3]=1.0}.to raise_error(IndexError)
65
+ end
66
+ end
67
+
68
+ context 'with a valid index' do
69
+ it 'should set the value' do
70
+ subject[2][2][2] = 1.0
71
+
72
+ image_array[26].should eq(1.0)
73
+ end
74
+ end
75
+ end
76
+ end
@@ -26,36 +26,36 @@ describe NIFTI::NObject do
26
26
  "intent_p3"=>0.0, "regular"=>"r"
27
27
  }
28
28
  end
29
-
29
+
30
30
  # Think of these more as integration tests, since the actual reading
31
31
  # is done and tested in the NRead spec
32
32
  it "should read a nifti file and correctly initialize header and image" do
33
33
  obj = NObject.new(NIFTI_TEST_FILE1)
34
-
34
+
35
35
  obj.header.should == @valid_header
36
36
  obj.extended_header.should_not be_empty
37
37
  obj.extended_header.first[:esize].should == 5680
38
38
  obj.extended_header.first[:ecode].should == 4
39
39
  obj.extended_header.first[:data].length.should == @fixture_afni_extension_length
40
40
  obj.image.should be_nil
41
-
41
+
42
42
  end
43
43
 
44
44
  it "should read a binary string and correctly initialize header and image" do
45
45
  obj = NObject.new(@string, :bin => true)
46
-
46
+
47
47
  obj.header.should == @valid_header
48
48
  obj.extended_header.should_not be_empty
49
49
  obj.extended_header.first[:esize].should == 5680
50
50
  obj.extended_header.first[:ecode].should == 4
51
51
  obj.extended_header.first[:data].length.should == @fixture_afni_extension_length
52
52
  obj.image.should be_nil
53
-
53
+
54
54
  end
55
-
55
+
56
56
  it "should read a nifti file with image" do
57
57
  obj = NObject.new(NIFTI_TEST_FILE1, :image => true)
58
-
58
+
59
59
  obj.header.should == @valid_header
60
60
  obj.extended_header.should_not be_empty
61
61
  obj.extended_header.first[:esize].should == 5680
@@ -63,12 +63,12 @@ describe NIFTI::NObject do
63
63
  obj.extended_header.first[:data].length.should == @fixture_afni_extension_length
64
64
  obj.image.should_not be_nil
65
65
  obj.image.length.should == @fixture_image_length
66
-
66
+
67
67
  end
68
-
68
+
69
69
  it "should read a nifti file with image as narray" do
70
70
  obj = NObject.new(NIFTI_TEST_FILE1, :image => true, :narray => true)
71
-
71
+
72
72
  obj.header.should == @valid_header
73
73
  obj.extended_header.should_not be_empty
74
74
  obj.extended_header.first[:esize].should == 5680
@@ -77,33 +77,38 @@ describe NIFTI::NObject do
77
77
  obj.image.should_not be_nil
78
78
  obj.image.class.should == NArray
79
79
  obj.image.dim.should == 3
80
-
80
+
81
81
  end
82
-
82
+
83
83
  it "should retrieve image data when requested" do
84
84
  obj = NObject.new(NIFTI_TEST_FILE1)
85
85
  obj.get_image.length.should == @fixture_image_length
86
86
  end
87
-
88
-
87
+
88
+
89
89
  it "should raise an error if initialized with bad argument" do
90
90
  lambda {
91
91
  NObject.new(12345)
92
92
  }.should raise_error ArgumentError, /Invalid argument/
93
93
  end
94
-
94
+
95
95
  it "should sucessfully write a NIfTI file" do
96
96
  obj = NObject.new(NIFTI_TEST_FILE1, :image => true)
97
97
  obj.write(@new_fixture_file_name)
98
98
  File.exist?(@new_fixture_file_name).should be_true
99
99
  obj.write_success.should be_true
100
100
  end
101
-
102
- it "should be able to assign an image" do
101
+
102
+ it "should be able to assign an image" do
103
103
  obj = NObject.new(@string, :bin => true, :image => true)
104
104
  obj.image = [0] * @fixture_image_length
105
105
  end
106
-
106
+
107
+ it 'should retrieve an NImage' do
108
+ obj = NObject.new(NIFTI_TEST_FILE1)
109
+ obj.get_nimage.should be_a(NImage)
110
+ end
111
+
107
112
  after :each do
108
113
  File.delete @new_fixture_file_name if File.exist? @new_fixture_file_name
109
114
  end
@@ -1,9 +1,7 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe NIFTI::NRead do
4
- before :all do
5
- @string = File.open(NIFTI_TEST_FILE1, 'rb').read
6
- @stream = Stream.new(@string, false)
4
+ before do
7
5
  @fixture_image_length = 983040
8
6
  @fixture_afni_extension_length = 5661
9
7
  @valid_header = {
@@ -25,65 +23,133 @@ describe NIFTI::NRead do
25
23
  "cal_max"=>0.0, "vox_offset"=>6032.0, "slice_start"=>0,
26
24
  "intent_p3"=>0.0, "regular"=>"r"
27
25
  }
28
- @n_read_obj = NRead.new(@string, :bin => true)
29
26
  end
30
-
31
- it "should read a binary string and correctly return header variables" do
32
- NRead.new(@string, :bin => true).hdr.should == @valid_header
33
- end
34
-
35
- it "should read a nifti file and correctly return header variables" do
36
- NRead.new(NIFTI_TEST_FILE1).hdr.should == @valid_header
37
- end
38
-
39
- it "should raise IOError if header size != 348." do
40
- str = @string.dup
41
- str[0..4] = [0].pack("N*")
42
- lambda {
43
- NRead.new(str, :bin => true).hdr
44
- }.should raise_error IOError, /Header appears to be malformed/
45
- end
46
-
47
- it "should raise IOError if magic != ni1 or n+1." do
48
- str = @string.dup
49
- str[344..348] = ["NOPE"].pack("a*")
50
- lambda {
51
- NRead.new(str, :bin => true).hdr
52
- }.should raise_error IOError, /Header appears to be malformed/
53
- end
54
-
55
- it "should read image data correctly if :image option is true" do
56
- obj = NRead.new(@string, :bin => true, :image => true)
57
- obj.image_rubyarray.class.should == Array
58
- obj.image_rubyarray.length.should == @fixture_image_length
59
- # Since this is a fixture, we know exactly what the values are.
60
- # Pick some from the middle of the string and test them.
61
- obj.image_rubyarray[(@fixture_image_length / 2)..(@fixture_image_length/2 + 100)].should == [0, 0, 0, 0, 18, 36, 25, 23, 19, 23, 13, 14, 16, 16, 12, 16, 22, 17, 13, 17, 19, 24, 19, 14, 11, 16, 49, 81, 129, 194, 216, 175, 130, 128, 146, 154, 159, 205, 304, 391, 414, 380, 320, 281, 297, 343, 358, 322, 287, 339, 450, 493, 426, 344, 310, 285, 275, 290, 282, 283, 310, 278, 268, 222, 49, 284, 235, 172, 116, 108, 115, 112, 135, 176, 196, 200, 216, 207, 86, 30, 152, 161, 138, 117, 81, 47, 73, 207, 381, 459, 415, 346, 353, 429, 490, 503, 492, 454, 379, 304, 275]
62
- obj.image_narray.should be_nil
63
- end
64
-
65
- it "should return an narray if requested" do
66
- obj = NRead.new(@string, :bin => true, :narray => true)
67
- obj.image_narray.should_not be_nil
27
+
28
+ context 'with an uncompressed file' do
29
+ before do
30
+ @string = File.open(NIFTI_TEST_FILE1, 'rb').read
31
+ @stream = Stream.new(@string, false)
32
+ @n_read_obj = NRead.new(@string, :bin => true)
33
+ end
34
+
35
+ it "should read a binary string and correctly return header variables" do
36
+ NRead.new(@string, :bin => true).hdr.should == @valid_header
37
+ end
38
+
39
+ it "should read a nifti file and correctly return header variables" do
40
+ NRead.new(NIFTI_TEST_FILE1).hdr.should == @valid_header
41
+ end
42
+
43
+ it "should raise IOError if header size != 348." do
44
+ str = @string.dup
45
+ str[0..4] = [0].pack("N*")
46
+ lambda {
47
+ NRead.new(str, :bin => true).hdr
48
+ }.should raise_error IOError, /Header appears to be malformed/
49
+ end
50
+
51
+ it "should raise IOError if magic != ni1 or n+1." do
52
+ str = @string.dup
53
+ str[344..348] = ["NOPE"].pack("a*")
54
+ lambda {
55
+ NRead.new(str, :bin => true).hdr
56
+ }.should raise_error IOError, /Header appears to be malformed/
57
+ end
58
+
59
+ it "should read image data correctly if :image option is true" do
60
+ obj = NRead.new(@string, :bin => true, :image => true)
61
+ obj.image_rubyarray.class.should == Array
62
+ obj.image_rubyarray.length.should == @fixture_image_length
63
+ # Since this is a fixture, we know exactly what the values are.
64
+ # Pick some from the middle of the string and test them.
65
+ obj.image_rubyarray[(@fixture_image_length / 2)..(@fixture_image_length/2 + 100)].should == [0, 0, 0, 0, 18, 36, 25, 23, 19, 23, 13, 14, 16, 16, 12, 16, 22, 17, 13, 17, 19, 24, 19, 14, 11, 16, 49, 81, 129, 194, 216, 175, 130, 128, 146, 154, 159, 205, 304, 391, 414, 380, 320, 281, 297, 343, 358, 322, 287, 339, 450, 493, 426, 344, 310, 285, 275, 290, 282, 283, 310, 278, 268, 222, 49, 284, 235, 172, 116, 108, 115, 112, 135, 176, 196, 200, 216, 207, 86, 30, 152, 161, 138, 117, 81, 47, 73, 207, 381, 459, 415, 346, 353, 429, 490, 503, 492, 454, 379, 304, 275]
66
+ obj.image_narray.should be_nil
67
+ end
68
+
69
+ it "should return an narray if requested" do
70
+ obj = NRead.new(@string, :bin => true, :narray => true)
71
+ obj.image_narray.should_not be_nil
72
+ end
73
+
74
+ it "should add an NArray Install message and not set the image_narray if NArray was not available" do
75
+ Object.expects(:const_defined?).with('NArray').returns(false)
76
+ obj = NRead.new(@string, :bin => true, :narray => true)
77
+ obj.msg.should_not be_empty
78
+ obj.msg.grep(/Please `gem install narray`/).empty?.should be_false
79
+ obj.image_narray.should be_nil
80
+ obj.image_rubyarray.size.should == @fixture_image_length
81
+ end
82
+
83
+ it "should read extended header attributes" do
84
+ @n_read_obj.extended_header.should_not be_empty
85
+ @n_read_obj.extended_header.first[:esize].should == 5680
86
+ @n_read_obj.extended_header.first[:ecode].should == 4
87
+ @n_read_obj.extended_header.first[:data].length.should == @fixture_afni_extension_length
88
+ @n_read_obj.extended_header.first[:data].should == "<?xml version='1.0' ?>\n<AFNI_attributes\n self_idcode=\"XYZ_Fk5B7fY4srOPxYrGolqMIg\"\n NIfTI_nums=\"256,256,15,1,1,4\"\n ni_form=\"ni_group\" >\n<AFNI_atr\n ni_type=\"String\"\n ni_dimen=\"1\"\n atr_name=\"HISTORY_NOTE\" >\n \"[erik@nelson.medicine.wisc.edu: Fri Jan 21 10:24:14 2011] to3d -prefix 3plLoc.nii I0001.dcm I0002.dcm I0003.dcm ... I0014.dcm I0015.dcm\"\n</AFNI_atr>\n\n<AFNI_atr\n ni_type=\"String\"\n ni_dimen=\"1\"\n atr_name=\"TYPESTRING\" >\n \"3DIM_HEAD_ANAT\"\n</AFNI_atr>\n\n<AFNI_atr\n ni_type=\"String\"\n ni_dimen=\"1\"\n atr_name=\"IDCODE_STRING\" >\n \"XYZ_Fk5B7fY4srOPxYrGolqMIg\"\n</AFNI_atr>\n\n<AFNI_atr\n ni_type=\"String\"\n ni_dimen=\"1\"\n atr_name=\"IDCODE_DATE\" >\n \"Fri Jan 21 10:24:15 2011\"\n</AFNI_atr>\n\n<AFNI_atr\n ni_type=\"int\"\n ni_dimen=\"8\"\n atr_name=\"SCENE_DATA\" >\n 0\n 0\n 0\n -999\n -999\n -999\n -999\n -999\n</AFNI_atr>\n\n<AFNI_atr\n ni_type=\"String\"\n ni_dimen=\"1\"\n atr_name=\"LABEL_1\" >\n \"3plLoc.nii+orig\"\n</AFNI_atr>\n\n<AFNI_atr\n ni_type=\"String\"\n ni_dimen=\"1\"\n atr_name=\"LABEL_2\" >\n \"Viggo!\"\n</AFNI_atr>\n\n<AFNI_atr\n ni_type=\"String\"\n ni_dimen=\"1\"\n atr_name=\"DATASET_NAME\" >\n \"./3plLoc.nii+orig\"\n</AFNI_atr>\n\n<AFNI_atr\n ni_type=\"int\"\n ni_dimen=\"3\"\n atr_name=\"ORIENT_SPECIFIC\" >\n 0\n 3\n 4\n</AFNI_atr>\n\n<AFNI_atr\n ni_type=\"float\"\n ni_dimen=\"3\"\n atr_name=\"ORIGIN\" >\n -119.531\n -159.531\n -25\n</AFNI_atr>\n\n<AFNI_atr\n ni_type=\"float\"\n ni_dimen=\"3\"\n atr_name=\"DELTA\" >\n 0.9375\n 0.9375\n 12.5\n</AFNI_atr>\n\n<AFNI_atr\n ni_type=\"float\"\n ni_dimen=\"12\"\n atr_name=\"IJK_TO_DICOM\" >\n 0.9375\n 0.9375\n 0.9375\n -360\n 0\n 0\n 0\n 0\n 0\n 0\n 0\n 0\n</AFNI_atr>\n\n<AFNI_atr\n ni_type=\"float\"\n ni_dimen=\"12\"\n atr_name=\"IJK_TO_DICOM_REAL\" >\n 0.9375\n 0\n 0\n -119.531\n 0\n 0.9375\n 0\n -159.531\n 0\n 0\n 12.5\n -25\n</AFNI_atr>\n\n<AFNI_atr\n ni_type=\"float\"\n ni_dimen=\"30\"\n atr_name=\"MARKS_XYZ\" >\n -999999\n -999999\n -999999\n -999999\n -999999\n -999999\n -999999\n -999999\n -999999\n -999999\n -999999\n -999999\n -999999\n -999999\n -999999\n -999999\n -999999\n -999999\n -999999\n -999999\n -999999\n -999999\n -999999\n -999999\n -999999\n -999999\n -999999\n -999999\n -999999\n -999999\n</AFNI_atr>\n\n<AFNI_atr\n ni_type=\"String\"\n ni_dimen=\"1\"\n atr_name=\"MARKS_LAB\" >\n \"AC superior edge~~~~AC posterior margin~PC inferior edge~~~~First mid-sag pt~~~~Another mid-sag pt~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\"\n</AFNI_atr>\n\n<AFNI_atr\n ni_type=\"String\"\n ni_dimen=\"3\"\n atr_name=\"MARKS_HELP\" >\n \"This is the uppermost point&#x0a;on the anterior commisure,&#x0a;in the mid-sagittal plane.~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~This is the rearmost point&#x0a;on the anterior commisure,&#x0a;in the mid-sagittal plane.&#x0a;[Just a couple mm behind and&#x0a; below the AC superior edge.]~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~This is the bottommost point&#x0a;on the posterior commissure,&#x0a;in the mid-sagittal plane.~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~You must also specify two other points in the&#x0a;mid-sagittal plane, ABOVE the corpus callosum&#x0a;(i.e., in the longitudinal fissure). These&#x0a;points are needed to define the vertical plane.~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\"\n \"~~~~~~~~~~~~~~~~~~~~~~~~You must also specify two other points in the&#x0a;mid-sagittal plane, ABOVE the corpus callosum&#x0a;(i.e., in the longitudinal fissure). These&#x0a;points are needed to define the vertical plane.~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\"\n \"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\"\n</AFNI_atr>\n\n<AFNI_atr\n ni_type=\"int\"\n ni_dimen=\"8\"\n atr_name=\"MARKS_FLAGS\" >\n 1\n 1\n 0\n 0\n 0\n 0\n 0\n 0\n</AFNI_atr>\n\n<AFNI_atr\n ni_type=\"float\"\n ni_dimen=\"2\"\n atr_name=\"BRICK_STATS\" >\n 0\n 2402\n</AFNI_atr>\n\n<AFNI_atr\n ni_type=\"int\"\n ni_dimen=\"8\"\n atr_name=\"DATASET_RANK\" >\n 3\n 1\n 0\n 0\n 0\n 0\n 0\n 0\n</AFNI_atr>\n\n<AFNI_atr\n ni_type=\"int\"\n ni_dimen=\"5\"\n atr_name=\"DATASET_DIMENSIONS\" >\n 256\n 256\n 15\n 0\n 0\n</AFNI_atr>\n\n<AFNI_atr\n ni_type=\"int\"\n ni_dimen=\"1\"\n atr_name=\"BRICK_TYPES\" >\n 1\n</AFNI_atr>\n\n<AFNI_atr\n ni_type=\"float\"\n ni_dimen=\"1\"\n atr_name=\"BRICK_FLOAT_FACS\" >\n 0\n</AFNI_atr>\n\n</AFNI_attributes>\n"
89
+ end
68
90
  end
69
-
70
- it "should add an NArray Install message and not set the image_narray if NArray was not available" do
71
- Object.send(:remove_const, :NArray)
72
- obj = NRead.new(@string, :bin => true, :narray => true)
73
- obj.msg.should_not be_empty
74
- obj.msg.grep(/Please `gem install narray`/).empty?.should be_false
75
- obj.image_narray.should be_nil
76
- obj.image_rubyarray.size.should == @fixture_image_length
77
- require 'narray'
91
+
92
+ context 'with an gzip compressed file' do
93
+ before do
94
+ @string = File.open(NIFTI_TEST_FILE1_GZ, 'rb').read
95
+ @stream = Stream.new(@string, false)
96
+ @n_read_obj = NRead.new(NIFTI_TEST_FILE1_GZ)
97
+ end
98
+
99
+ it "should read a nifti file and correctly return header variables" do
100
+ NRead.new(NIFTI_TEST_FILE1_GZ).hdr.should == @valid_header
101
+ end
102
+
103
+ it "should raise IOError if header size != 348." do
104
+ str = @string.dup
105
+ str[0..4] = [0].pack("N*")
106
+ lambda {
107
+ NRead.new(str, :bin => true).hdr
108
+ }.should raise_error IOError, /Header appears to be malformed/
109
+ end
110
+
111
+ it "should raise IOError if magic != ni1 or n+1." do
112
+ str = @string.dup
113
+ str[344..348] = ["NOPE"].pack("a*")
114
+ lambda {
115
+ NRead.new(str, :bin => true).hdr
116
+ }.should raise_error IOError, /Header appears to be malformed/
117
+ end
118
+
119
+ it "should read image data correctly if :image option is true" do
120
+ obj = NRead.new(NIFTI_TEST_FILE1_GZ, :image => true)
121
+ obj.image_rubyarray.class.should == Array
122
+ obj.image_rubyarray.length.should == @fixture_image_length
123
+ # Since this is a fixture, we know exactly what the values are.
124
+ # Pick some from the middle of the string and test them.
125
+ obj.image_rubyarray[(@fixture_image_length / 2)..(@fixture_image_length/2 + 100)].should == [0, 0, 0, 0, 18, 36, 25, 23, 19, 23, 13, 14, 16, 16, 12, 16, 22, 17, 13, 17, 19, 24, 19, 14, 11, 16, 49, 81, 129, 194, 216, 175, 130, 128, 146, 154, 159, 205, 304, 391, 414, 380, 320, 281, 297, 343, 358, 322, 287, 339, 450, 493, 426, 344, 310, 285, 275, 290, 282, 283, 310, 278, 268, 222, 49, 284, 235, 172, 116, 108, 115, 112, 135, 176, 196, 200, 216, 207, 86, 30, 152, 161, 138, 117, 81, 47, 73, 207, 381, 459, 415, 346, 353, 429, 490, 503, 492, 454, 379, 304, 275]
126
+ obj.image_narray.should be_nil
127
+ end
128
+
129
+ it "should return an narray if requested" do
130
+ obj = NRead.new(NIFTI_TEST_FILE1_GZ, :narray => true)
131
+ obj.image_narray.should_not be_nil
132
+ end
133
+
134
+ it "should add an NArray Install message and not set the image_narray if NArray was not available" do
135
+ Object.expects(:const_defined?).with('NArray').returns(false)
136
+ obj = NRead.new(NIFTI_TEST_FILE1_GZ, :narray => true)
137
+ obj.msg.should_not be_empty
138
+ obj.msg.grep(/Please `gem install narray`/).empty?.should be_false
139
+ obj.image_narray.should be_nil
140
+ obj.image_rubyarray.size.should == @fixture_image_length
141
+ end
142
+
143
+ it "should read extended header attributes" do
144
+ @n_read_obj.extended_header.should_not be_empty
145
+ @n_read_obj.extended_header.first[:esize].should == 5680
146
+ @n_read_obj.extended_header.first[:ecode].should == 4
147
+ @n_read_obj.extended_header.first[:data].length.should == @fixture_afni_extension_length
148
+ @n_read_obj.extended_header.first[:data].should == "<?xml version='1.0' ?>\n<AFNI_attributes\n self_idcode=\"XYZ_Fk5B7fY4srOPxYrGolqMIg\"\n NIfTI_nums=\"256,256,15,1,1,4\"\n ni_form=\"ni_group\" >\n<AFNI_atr\n ni_type=\"String\"\n ni_dimen=\"1\"\n atr_name=\"HISTORY_NOTE\" >\n \"[erik@nelson.medicine.wisc.edu: Fri Jan 21 10:24:14 2011] to3d -prefix 3plLoc.nii I0001.dcm I0002.dcm I0003.dcm ... I0014.dcm I0015.dcm\"\n</AFNI_atr>\n\n<AFNI_atr\n ni_type=\"String\"\n ni_dimen=\"1\"\n atr_name=\"TYPESTRING\" >\n \"3DIM_HEAD_ANAT\"\n</AFNI_atr>\n\n<AFNI_atr\n ni_type=\"String\"\n ni_dimen=\"1\"\n atr_name=\"IDCODE_STRING\" >\n \"XYZ_Fk5B7fY4srOPxYrGolqMIg\"\n</AFNI_atr>\n\n<AFNI_atr\n ni_type=\"String\"\n ni_dimen=\"1\"\n atr_name=\"IDCODE_DATE\" >\n \"Fri Jan 21 10:24:15 2011\"\n</AFNI_atr>\n\n<AFNI_atr\n ni_type=\"int\"\n ni_dimen=\"8\"\n atr_name=\"SCENE_DATA\" >\n 0\n 0\n 0\n -999\n -999\n -999\n -999\n -999\n</AFNI_atr>\n\n<AFNI_atr\n ni_type=\"String\"\n ni_dimen=\"1\"\n atr_name=\"LABEL_1\" >\n \"3plLoc.nii+orig\"\n</AFNI_atr>\n\n<AFNI_atr\n ni_type=\"String\"\n ni_dimen=\"1\"\n atr_name=\"LABEL_2\" >\n \"Viggo!\"\n</AFNI_atr>\n\n<AFNI_atr\n ni_type=\"String\"\n ni_dimen=\"1\"\n atr_name=\"DATASET_NAME\" >\n \"./3plLoc.nii+orig\"\n</AFNI_atr>\n\n<AFNI_atr\n ni_type=\"int\"\n ni_dimen=\"3\"\n atr_name=\"ORIENT_SPECIFIC\" >\n 0\n 3\n 4\n</AFNI_atr>\n\n<AFNI_atr\n ni_type=\"float\"\n ni_dimen=\"3\"\n atr_name=\"ORIGIN\" >\n -119.531\n -159.531\n -25\n</AFNI_atr>\n\n<AFNI_atr\n ni_type=\"float\"\n ni_dimen=\"3\"\n atr_name=\"DELTA\" >\n 0.9375\n 0.9375\n 12.5\n</AFNI_atr>\n\n<AFNI_atr\n ni_type=\"float\"\n ni_dimen=\"12\"\n atr_name=\"IJK_TO_DICOM\" >\n 0.9375\n 0.9375\n 0.9375\n -360\n 0\n 0\n 0\n 0\n 0\n 0\n 0\n 0\n</AFNI_atr>\n\n<AFNI_atr\n ni_type=\"float\"\n ni_dimen=\"12\"\n atr_name=\"IJK_TO_DICOM_REAL\" >\n 0.9375\n 0\n 0\n -119.531\n 0\n 0.9375\n 0\n -159.531\n 0\n 0\n 12.5\n -25\n</AFNI_atr>\n\n<AFNI_atr\n ni_type=\"float\"\n ni_dimen=\"30\"\n atr_name=\"MARKS_XYZ\" >\n -999999\n -999999\n -999999\n -999999\n -999999\n -999999\n -999999\n -999999\n -999999\n -999999\n -999999\n -999999\n -999999\n -999999\n -999999\n -999999\n -999999\n -999999\n -999999\n -999999\n -999999\n -999999\n -999999\n -999999\n -999999\n -999999\n -999999\n -999999\n -999999\n -999999\n</AFNI_atr>\n\n<AFNI_atr\n ni_type=\"String\"\n ni_dimen=\"1\"\n atr_name=\"MARKS_LAB\" >\n \"AC superior edge~~~~AC posterior margin~PC inferior edge~~~~First mid-sag pt~~~~Another mid-sag pt~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\"\n</AFNI_atr>\n\n<AFNI_atr\n ni_type=\"String\"\n ni_dimen=\"3\"\n atr_name=\"MARKS_HELP\" >\n \"This is the uppermost point&#x0a;on the anterior commisure,&#x0a;in the mid-sagittal plane.~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~This is the rearmost point&#x0a;on the anterior commisure,&#x0a;in the mid-sagittal plane.&#x0a;[Just a couple mm behind and&#x0a; below the AC superior edge.]~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~This is the bottommost point&#x0a;on the posterior commissure,&#x0a;in the mid-sagittal plane.~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~You must also specify two other points in the&#x0a;mid-sagittal plane, ABOVE the corpus callosum&#x0a;(i.e., in the longitudinal fissure). These&#x0a;points are needed to define the vertical plane.~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\"\n \"~~~~~~~~~~~~~~~~~~~~~~~~You must also specify two other points in the&#x0a;mid-sagittal plane, ABOVE the corpus callosum&#x0a;(i.e., in the longitudinal fissure). These&#x0a;points are needed to define the vertical plane.~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\"\n \"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\"\n</AFNI_atr>\n\n<AFNI_atr\n ni_type=\"int\"\n ni_dimen=\"8\"\n atr_name=\"MARKS_FLAGS\" >\n 1\n 1\n 0\n 0\n 0\n 0\n 0\n 0\n</AFNI_atr>\n\n<AFNI_atr\n ni_type=\"float\"\n ni_dimen=\"2\"\n atr_name=\"BRICK_STATS\" >\n 0\n 2402\n</AFNI_atr>\n\n<AFNI_atr\n ni_type=\"int\"\n ni_dimen=\"8\"\n atr_name=\"DATASET_RANK\" >\n 3\n 1\n 0\n 0\n 0\n 0\n 0\n 0\n</AFNI_atr>\n\n<AFNI_atr\n ni_type=\"int\"\n ni_dimen=\"5\"\n atr_name=\"DATASET_DIMENSIONS\" >\n 256\n 256\n 15\n 0\n 0\n</AFNI_atr>\n\n<AFNI_atr\n ni_type=\"int\"\n ni_dimen=\"1\"\n atr_name=\"BRICK_TYPES\" >\n 1\n</AFNI_atr>\n\n<AFNI_atr\n ni_type=\"float\"\n ni_dimen=\"1\"\n atr_name=\"BRICK_FLOAT_FACS\" >\n 0\n</AFNI_atr>\n\n</AFNI_attributes>\n"
149
+ end
78
150
  end
79
-
80
- it "should read extended header attributes" do
81
- @n_read_obj.extended_header.should_not be_empty
82
- @n_read_obj.extended_header.first[:esize].should == 5680
83
- @n_read_obj.extended_header.first[:ecode].should == 4
84
- @n_read_obj.extended_header.first[:data].length.should == @fixture_afni_extension_length
85
- @n_read_obj.extended_header.first[:data].should == "<?xml version='1.0' ?>\n<AFNI_attributes\n self_idcode=\"XYZ_Fk5B7fY4srOPxYrGolqMIg\"\n NIfTI_nums=\"256,256,15,1,1,4\"\n ni_form=\"ni_group\" >\n<AFNI_atr\n ni_type=\"String\"\n ni_dimen=\"1\"\n atr_name=\"HISTORY_NOTE\" >\n \"[erik@nelson.medicine.wisc.edu: Fri Jan 21 10:24:14 2011] to3d -prefix 3plLoc.nii I0001.dcm I0002.dcm I0003.dcm ... I0014.dcm I0015.dcm\"\n</AFNI_atr>\n\n<AFNI_atr\n ni_type=\"String\"\n ni_dimen=\"1\"\n atr_name=\"TYPESTRING\" >\n \"3DIM_HEAD_ANAT\"\n</AFNI_atr>\n\n<AFNI_atr\n ni_type=\"String\"\n ni_dimen=\"1\"\n atr_name=\"IDCODE_STRING\" >\n \"XYZ_Fk5B7fY4srOPxYrGolqMIg\"\n</AFNI_atr>\n\n<AFNI_atr\n ni_type=\"String\"\n ni_dimen=\"1\"\n atr_name=\"IDCODE_DATE\" >\n \"Fri Jan 21 10:24:15 2011\"\n</AFNI_atr>\n\n<AFNI_atr\n ni_type=\"int\"\n ni_dimen=\"8\"\n atr_name=\"SCENE_DATA\" >\n 0\n 0\n 0\n -999\n -999\n -999\n -999\n -999\n</AFNI_atr>\n\n<AFNI_atr\n ni_type=\"String\"\n ni_dimen=\"1\"\n atr_name=\"LABEL_1\" >\n \"3plLoc.nii+orig\"\n</AFNI_atr>\n\n<AFNI_atr\n ni_type=\"String\"\n ni_dimen=\"1\"\n atr_name=\"LABEL_2\" >\n \"Viggo!\"\n</AFNI_atr>\n\n<AFNI_atr\n ni_type=\"String\"\n ni_dimen=\"1\"\n atr_name=\"DATASET_NAME\" >\n \"./3plLoc.nii+orig\"\n</AFNI_atr>\n\n<AFNI_atr\n ni_type=\"int\"\n ni_dimen=\"3\"\n atr_name=\"ORIENT_SPECIFIC\" >\n 0\n 3\n 4\n</AFNI_atr>\n\n<AFNI_atr\n ni_type=\"float\"\n ni_dimen=\"3\"\n atr_name=\"ORIGIN\" >\n -119.531\n -159.531\n -25\n</AFNI_atr>\n\n<AFNI_atr\n ni_type=\"float\"\n ni_dimen=\"3\"\n atr_name=\"DELTA\" >\n 0.9375\n 0.9375\n 12.5\n</AFNI_atr>\n\n<AFNI_atr\n ni_type=\"float\"\n ni_dimen=\"12\"\n atr_name=\"IJK_TO_DICOM\" >\n 0.9375\n 0.9375\n 0.9375\n -360\n 0\n 0\n 0\n 0\n 0\n 0\n 0\n 0\n</AFNI_atr>\n\n<AFNI_atr\n ni_type=\"float\"\n ni_dimen=\"12\"\n atr_name=\"IJK_TO_DICOM_REAL\" >\n 0.9375\n 0\n 0\n -119.531\n 0\n 0.9375\n 0\n -159.531\n 0\n 0\n 12.5\n -25\n</AFNI_atr>\n\n<AFNI_atr\n ni_type=\"float\"\n ni_dimen=\"30\"\n atr_name=\"MARKS_XYZ\" >\n -999999\n -999999\n -999999\n -999999\n -999999\n -999999\n -999999\n -999999\n -999999\n -999999\n -999999\n -999999\n -999999\n -999999\n -999999\n -999999\n -999999\n -999999\n -999999\n -999999\n -999999\n -999999\n -999999\n -999999\n -999999\n -999999\n -999999\n -999999\n -999999\n -999999\n</AFNI_atr>\n\n<AFNI_atr\n ni_type=\"String\"\n ni_dimen=\"1\"\n atr_name=\"MARKS_LAB\" >\n \"AC superior edge~~~~AC posterior margin~PC inferior edge~~~~First mid-sag pt~~~~Another mid-sag pt~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\"\n</AFNI_atr>\n\n<AFNI_atr\n ni_type=\"String\"\n ni_dimen=\"3\"\n atr_name=\"MARKS_HELP\" >\n \"This is the uppermost point&#x0a;on the anterior commisure,&#x0a;in the mid-sagittal plane.~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~This is the rearmost point&#x0a;on the anterior commisure,&#x0a;in the mid-sagittal plane.&#x0a;[Just a couple mm behind and&#x0a; below the AC superior edge.]~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~This is the bottommost point&#x0a;on the posterior commissure,&#x0a;in the mid-sagittal plane.~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~You must also specify two other points in the&#x0a;mid-sagittal plane, ABOVE the corpus callosum&#x0a;(i.e., in the longitudinal fissure). These&#x0a;points are needed to define the vertical plane.~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\"\n \"~~~~~~~~~~~~~~~~~~~~~~~~You must also specify two other points in the&#x0a;mid-sagittal plane, ABOVE the corpus callosum&#x0a;(i.e., in the longitudinal fissure). These&#x0a;points are needed to define the vertical plane.~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\"\n \"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\"\n</AFNI_atr>\n\n<AFNI_atr\n ni_type=\"int\"\n ni_dimen=\"8\"\n atr_name=\"MARKS_FLAGS\" >\n 1\n 1\n 0\n 0\n 0\n 0\n 0\n 0\n</AFNI_atr>\n\n<AFNI_atr\n ni_type=\"float\"\n ni_dimen=\"2\"\n atr_name=\"BRICK_STATS\" >\n 0\n 2402\n</AFNI_atr>\n\n<AFNI_atr\n ni_type=\"int\"\n ni_dimen=\"8\"\n atr_name=\"DATASET_RANK\" >\n 3\n 1\n 0\n 0\n 0\n 0\n 0\n 0\n</AFNI_atr>\n\n<AFNI_atr\n ni_type=\"int\"\n ni_dimen=\"5\"\n atr_name=\"DATASET_DIMENSIONS\" >\n 256\n 256\n 15\n 0\n 0\n</AFNI_atr>\n\n<AFNI_atr\n ni_type=\"int\"\n ni_dimen=\"1\"\n atr_name=\"BRICK_TYPES\" >\n 1\n</AFNI_atr>\n\n<AFNI_atr\n ni_type=\"float\"\n ni_dimen=\"1\"\n atr_name=\"BRICK_FLOAT_FACS\" >\n 0\n</AFNI_atr>\n\n</AFNI_attributes>\n"
151
+
152
+ context 'without narray' do
153
+
86
154
  end
87
-
88
-
89
155
  end
@@ -3,7 +3,6 @@ require 'spec_helper'
3
3
  describe NIFTI::NWrite do
4
4
  before :all do
5
5
  @n_object = NObject.new(NIFTI_TEST_FILE1)
6
- @new_fixture_file_name = '5PlLoc.nii'
7
6
  @fixture_image_length = 983040
8
7
  @fixture_afni_extension_length = 5661
9
8
  @valid_header = {
@@ -26,31 +25,77 @@ describe NIFTI::NWrite do
26
25
  "intent_p3"=>0.0, "regular"=>"r"
27
26
  }
28
27
  end
29
-
30
- it "should write a NIfTI file" do
31
- obj = NObject.new(NIFTI_TEST_FILE1, :image => true)
32
- w = NWrite.new(obj, @new_fixture_file_name)
33
- w.write
34
- w.msg.should be_empty
35
- File.exist? @new_fixture_file_name.should be_true
36
- end
37
-
38
- it "should write back an identical file if no changes were made" do
39
- obj = NObject.new(NIFTI_TEST_FILE1, :image => true)
40
- w = NWrite.new(obj, @new_fixture_file_name)
41
- w.write
42
- @new_fixture_file_name.should be_same_file_as NIFTI_TEST_FILE1
43
- end
44
-
45
- it "should write a new image after changing some variables" do
46
- obj = NObject.new(NIFTI_TEST_FILE1, :image => true)
47
- obj.header['qoffset_x'] = obj.header['qoffset_x'] + 1
48
- w = NWrite.new(obj, @new_fixture_file_name)
49
- w.write
50
- @new_fixture_file_name.should_not be_same_file_as NIFTI_TEST_FILE1
28
+
29
+ context 'writing to an uncompressed file' do
30
+ before do
31
+ @new_fixture_file_name = '5PlLoc.nii'
32
+ end
33
+
34
+ it "should write a NIfTI file" do
35
+ obj = NObject.new(NIFTI_TEST_FILE1, :image => true)
36
+ w = NWrite.new(obj, @new_fixture_file_name)
37
+ w.write
38
+ w.msg.should be_empty
39
+ File.exist?(@new_fixture_file_name).should be_true
40
+ end
41
+
42
+ it "should write back an identical file if no changes were made" do
43
+ obj = NObject.new(NIFTI_TEST_FILE1, :image => true)
44
+ w = NWrite.new(obj, @new_fixture_file_name)
45
+ w.write
46
+ @new_fixture_file_name.should be_same_file_as NIFTI_TEST_FILE1
47
+ end
48
+
49
+ it "should write a new image after changing some variables" do
50
+ obj = NObject.new(NIFTI_TEST_FILE1, :image => true)
51
+ obj.header['qoffset_x'] = obj.header['qoffset_x'] + 1
52
+ w = NWrite.new(obj, @new_fixture_file_name)
53
+ w.write
54
+ @new_fixture_file_name.should_not be_same_file_as NIFTI_TEST_FILE1
55
+ end
56
+
57
+ after :each do
58
+ File.delete @new_fixture_file_name if File.exist? @new_fixture_file_name
59
+ end
51
60
  end
52
-
53
- after :each do
54
- File.delete @new_fixture_file_name if File.exist? @new_fixture_file_name
61
+
62
+ context 'writing to a compressed file' do
63
+ before do
64
+ @new_fixture_file_name = '5PlLoc.nii.gz'
65
+ end
66
+
67
+ it "should write a NIfTI file" do
68
+ obj = NObject.new(NIFTI_TEST_FILE1, :image => true)
69
+ w = NWrite.new(obj, @new_fixture_file_name)
70
+ w.write
71
+ w.msg.should be_empty
72
+ File.exist?(@new_fixture_file_name).should be_true
73
+ end
74
+
75
+ it "should write back an identical file if no changes were made" do
76
+ obj = NObject.new(NIFTI_TEST_FILE1, :image => true)
77
+
78
+ w = NWrite.new(obj, @new_fixture_file_name)
79
+ w.write
80
+ writen_obj = NObject.new(@new_fixture_file_name, :image => true)
81
+
82
+ # for some reason be_same_file_as fails for gziped images
83
+ # but we can make sure of it opening the file again and comparing the data
84
+ writen_obj.get_image.should eq(obj.get_image)
85
+ writen_obj.header.should eq(obj.header)
86
+ writen_obj.extended_header.should eq(obj.extended_header)
87
+ end
88
+
89
+ it "should write a new image after changing some variables" do
90
+ obj = NObject.new(NIFTI_TEST_FILE1, :image => true)
91
+ obj.header['qoffset_x'] = obj.header['qoffset_x'] + 1
92
+ w = NWrite.new(obj, @new_fixture_file_name)
93
+ w.write
94
+ @new_fixture_file_name.should_not be_same_file_as NIFTI_TEST_FILE1_GZ
95
+ end
96
+
97
+ after :each do
98
+ File.delete @new_fixture_file_name if File.exist? @new_fixture_file_name
99
+ end
55
100
  end
56
101
  end