metamri 0.2.2 → 0.2.3

Sign up to get free protection for your applications and to get access to all the features.
data/.rspec ADDED
@@ -0,0 +1 @@
1
+ --color
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.2.2
1
+ 0.2.3
@@ -74,8 +74,7 @@ class Pathname
74
74
  def all_dicoms
75
75
  local_copies = []
76
76
  Dir.mktmpdir do |tempdir|
77
- begin
78
-
77
+ # begin
79
78
  entries.each do |leaf|
80
79
  branch = self + leaf
81
80
  if leaf.to_s =~ /^I\.(\.bz2)?$|\.dcm(\.bz2)?$|\.[0-9]+(\.bz2)?$/
@@ -85,9 +84,10 @@ class Pathname
85
84
 
86
85
  yield local_copies
87
86
 
88
- ensure
89
- local_copies.each { |lc| lc.delete }
90
- end
87
+ # ensure
88
+ # No ensure needed since Dir.mktmpdir will implode after a block.
89
+ # local_copies.each { |lc| lc.delete if lc.exist? }
90
+ # end
91
91
  end
92
92
 
93
93
  return
@@ -147,6 +147,62 @@ class Pathname
147
147
 
148
148
  end
149
149
 
150
+ # Find hash differences.
151
+ class Hash
152
+ def diff(other)
153
+ self.keys.inject({}) do |memo, key|
154
+ unless self[key] == other[key]
155
+ memo[key] = [self[key], other[key]]
156
+ end
157
+ memo
158
+ end
159
+ end
160
+
161
+ def similar(other)
162
+ self.keys.inject({}) do |memo, key|
163
+ if self[key] == other[key]
164
+ memo[key] = self[key]
165
+ end
166
+ memo
167
+ end
168
+ end
169
+ end
170
+
171
+ # Method from ftools - requiring fileutils instead for Ruby 1.9 compatibility
172
+ # and explicitly adding this single method.
173
+ class File
174
+ BUFSIZE = 8 * 1024
175
+ def self.compare(from, to, verbose = false)
176
+ $stderr.print from, " <=> ", to, "\n" if verbose
177
+
178
+ return false if stat(from).size != stat(to).size
179
+
180
+ from = open(from, "rb")
181
+ to = open(to, "rb")
182
+
183
+ ret = false
184
+ fr = tr = ''
185
+
186
+ begin
187
+ while fr == tr
188
+ fr = from.read(BUFSIZE)
189
+ if fr
190
+ tr = to.read(fr.size)
191
+ else
192
+ ret = to.read(BUFSIZE)
193
+ ret = !ret || ret.length == 0
194
+ break
195
+ end
196
+ end
197
+ rescue
198
+ ret = false
199
+ ensure
200
+ to.close
201
+ from.close
202
+ end
203
+ ret
204
+ end
205
+ end
150
206
  # =begin rdoc
151
207
  # Monkey-patch Float to avoid rounding errors.
152
208
  # For more in-depth discussion, see: http://www.ruby-forum.com/topic/179361
@@ -0,0 +1,63 @@
1
+ # Dicom Additions is a test extension of DICOM to allow for gathering common tags
2
+ class DicomGroup
3
+ # Array of DObjects to aggregate
4
+ attr_accessor :dobjects
5
+ # Hash of tags shared by all DICOMs in Directory
6
+ attr_reader :tags
7
+ # DICOM::DObject containing all common tags of the group
8
+ attr_reader :common
9
+
10
+ # Initialize with an array of strings or DICOM::DObjects to aggregate
11
+ def initialize(dicomgroup)
12
+ if dicomgroup.select {|dcm| dcm.is_a? DICOM::DObject }.empty?
13
+ @dobjects = dicomgroup.collect {|dcm| DICOM::DObject.new(dcm)}
14
+ else
15
+ @dobjects = dicomgroup
16
+ end
17
+ end
18
+
19
+ # Return a hash of tags and values of elements common to all DICOMs in the group.
20
+ def find_common_tags
21
+ @dobjects.inject(@dobjects.first.to_hash) do |memo, dobj|
22
+ memo = memo.similar(dobj.to_hash)
23
+ end
24
+ end
25
+
26
+ # Return a new DICOM::DObject containing elements common (identical tags and values) to all DICOMs in the group.
27
+ def find_common_elements
28
+ @dobjects.inject do |memo, dobj|
29
+ memo.remove_elements_that_differ_from dobj
30
+ memo
31
+ end
32
+ end
33
+
34
+ end
35
+
36
+ # Reopen DObject to make tag hash
37
+ class DICOM::DObject
38
+ # Return hash of {tags => values}
39
+ def to_hash
40
+ taghash = {}
41
+ @tags.each_key {|k| taghash[k] = value(k) }
42
+ return taghash
43
+ end
44
+
45
+ # Remove elements from a dobj that aren't identical to self's tags.
46
+ def remove_elements_that_differ_from(other_dobj)
47
+ @tags.each_key do |k|
48
+ unless @tags[k].eql? other_dobj[k]
49
+ # pp k, [@tags[k].value, other_dobj[k].value]
50
+ remove k
51
+ end
52
+ end
53
+ end
54
+
55
+ end
56
+
57
+ # Reopen DataElement to compare
58
+ class DICOM::DataElement
59
+ # Compare data elements on their tag and value
60
+ def eql?(other)
61
+ @tag == other.instance_eval("@tag") && @value == other.value && @bin == other.instance_eval("@bin")
62
+ end
63
+ end
@@ -1,6 +1,6 @@
1
1
  require 'rubygems'
2
2
  require 'sqlite3'
3
- require 'ftools'
3
+ require 'fileutils'
4
4
  require 'metamri/nifti_builder'
5
5
 
6
6
 
@@ -42,8 +42,11 @@ class RawImageDataset
42
42
  attr_reader :dicom_series_uid
43
43
  # DICOM Study UID
44
44
  attr_reader :dicom_study_uid
45
+ # Tag Hash of DICOM Keys
46
+ attr_reader :dicom_taghash
45
47
  # Array of Read Error Strings
46
48
  attr_reader :read_errors
49
+
47
50
 
48
51
  # * dir: The directory containing the files.
49
52
  # * files: An array of #RawImageFile objects that compose the complete data set.
@@ -102,7 +105,10 @@ class RawImageDataset
102
105
  validates_metainfo_for :dicom_series_uid if dicom?
103
106
 
104
107
  @dicom_study_uid = @raw_image_files.first.dicom_study_uid
105
- validates_metainfo_for :dicom_study_uid if dicom?
108
+ validates_metainfo_for :dicom_study_uid if dicom?
109
+
110
+ @dicom_taghash = @raw_image_files.first.dicom_taghash
111
+ validates_metainfo_for :dicom_taghash if dicom?
106
112
 
107
113
  $LOG ||= Logger.new(STDOUT)
108
114
  end
@@ -154,15 +160,14 @@ class RawImageDataset
154
160
  AND timestamp LIKE '#{@timestamp.to_s.split(/\+|Z/).first}%'"
155
161
  end
156
162
 
157
- =begin rdoc
158
- Returns a hash of attributes used for insertion into active record.
159
- Options: :thumb => FileHandle to thumbnail includes a thumbnail.
160
- =end
163
+
164
+ # Returns a hash of attributes used for insertion into active record.
165
+ # Options: :thumb => FileHandle to thumbnail includes a thumbnail.
161
166
  def attributes_for_active_record(options = {})
162
167
  thumbnail = options.has_key?(:thumb) ? options[:thumb] : nil
163
168
 
164
169
  unless (thumbnail.class == File || thumbnail == nil)
165
- raise(IOError, "Thumbnail #{options[:thumb]} must be a #File.")
170
+ raise(IOError, "Thumbnail #{options[:thumb]} must be a #File instead of #{thumbnail.class}.")
166
171
  end
167
172
  { :rmr => @rmr_number,
168
173
  :series_description => @series_description,
@@ -173,7 +178,9 @@ Options: :thumb => FileHandle to thumbnail includes a thumbnail.
173
178
  :bold_reps => @raw_image_files.first.bold_reps,
174
179
  :slices_per_volume => @raw_image_files.first.num_slices,
175
180
  :scanned_file => @scanned_file,
176
- :thumbnail => thumbnail
181
+ :thumbnail => thumbnail,
182
+ :dicom_series_uid => @dicom_series_uid,
183
+ :dicom_taghash => @dicom_taghash
177
184
  }
178
185
  end
179
186
 
@@ -338,11 +345,29 @@ private
338
345
  end
339
346
 
340
347
  # Ensure that metadata is present in instance variables.
341
- # validates_metainfo_for :study_description, :msg => "No study description found"
348
+ #
349
+ # Raises an IndexError if supplied instance variable is nil unless :optional,
350
+ # and adds a message to the @read_errors array.
351
+ #
352
+ # === Parameters
353
+ #
354
+ # * <tt>info_variable</tt> -- A string (not including the @ sign) to check to ensure not blank and not empty.
355
+ #
356
+ # === Options
357
+ #
358
+ # * <tt>:msg</tt> -- An optional message to be added to @read_errors (defaults to "Couldn't find <info_variable>")
359
+ # * <tt>:optional</tt> -- A boolean to allow adding the error to the array as a warning but not breaking with an error.
360
+ #
361
+ # === Examples
362
+ #
363
+ # validates_metainfo_for :study_description, :msg => "No study description found", :optional => true
364
+ #
342
365
  def validates_metainfo_for(info_variable, options = {})
343
366
  raise StandardError, "#{info_variable} must be a symbol" unless info_variable.kind_of? Symbol
344
- if self.instance_variable_get("@" + info_variable.to_s).nil?
345
- @read_errors << options[:msg] ||= "Couldn't find #{info_variable.to_s}"
367
+ data = self.instance_variable_get("@" + info_variable.to_s)
368
+ if data.nil? || data.empty?
369
+ message = options[:msg] || "Couldn't find #{info_variable.to_s}"
370
+ @read_errors << message
346
371
  raise IndexError, message unless options[:optional]
347
372
  end
348
373
  end
@@ -132,7 +132,7 @@ class RawImageDatasetResource < ActiveResource::Base
132
132
  :headers => { :relative_dataset_path => 'Dataset', :series_description => 'Series Details', :file_count => "File Count", :image_dataset_quality_checks_tablerow => "Quality Checks"},
133
133
  :fields => [:relative_dataset_path, :series_description, :file_count, :image_dataset_quality_checks_tablerow],
134
134
  :description => false, # Turn off rendering row count description at bottom.
135
- :resize => false
135
+ :resize => true
136
136
  )
137
137
  rescue NameError => e
138
138
  raise e
@@ -56,6 +56,8 @@ class VisitRawDataDirectory
56
56
  attr_accessor :scanid
57
57
  # The id of the visit to be used when doing reverse-lookup in data panda.
58
58
  attr_accessor :database_id
59
+ # DICOM Study UID (Visit/Study Unique Identifier)
60
+ attr_reader :dicom_study_uid
59
61
 
60
62
  PREPROCESS_REPOSITORY_DIRECTORY = '/Data/vtrak1/preprocessed/visits'
61
63
  # DATAPANDA_SERVER = 'http://localhost:3000'
@@ -88,7 +90,9 @@ class VisitRawDataDirectory
88
90
  flash "Scanning visit raw data directory #{@visit_directory}" if $LOG.level <= Logger::INFO
89
91
  default_options = {:ignore_patterns => []}
90
92
  options = default_options.merge(options)
91
- puts "Ignoring directories matching: #{options[:ignore_patterns].join(", ")}" unless options[:ignore_patterns].empty?
93
+ unless options[:ignore_patterns].empty?
94
+ puts "Ignoring directories matching: #{options[:ignore_patterns].join(", ")}" if $LOG.level <= Logger::INFO
95
+ end
92
96
 
93
97
  d = Pathname.new(@visit_directory)
94
98
  d.each_subdirectory do |dd|
@@ -107,6 +111,7 @@ class VisitRawDataDirectory
107
111
  @rmr_number = get_rmr_number
108
112
  @scanner_source = get_scanner_source
109
113
  @study_id = get_study_id
114
+ @dicom_study_uid = get_dicom_study_uid
110
115
  flash "Completed scanning #{@visit_directory}" if $LOG.level <= Logger::DEBUG
111
116
  else
112
117
  raise(IndexError, "No datasets could be scanned for directory #{@visit_directory}")
@@ -120,7 +125,8 @@ class VisitRawDataDirectory
120
125
  :rmr => @rmr_number,
121
126
  :path => @visit_directory,
122
127
  :scanner_source => @scanner_source ||= get_scanner_source,
123
- :scan_number => @study_id
128
+ :scan_number => @study_id,
129
+ :dicom_study_uid => @dicom_study_uid
124
130
  }
125
131
  end
126
132
 
@@ -393,6 +399,14 @@ Returns an array of the created nifti files.
393
399
  # raise(IOError, "No valid study id / exam number found.")
394
400
  end
395
401
 
402
+ # retrieves exam number / scan id from first #RawImageDataset
403
+ def get_dicom_study_uid
404
+ @datasets.each do |ds|
405
+ return ds.dicom_study_uid unless ds.dicom_study_uid.nil?
406
+ end
407
+ raise(IOError, "No valid study uid found from DICOMS.")
408
+ end
409
+
396
410
  def get_scan_procedure_based_on_raw_directory
397
411
  case @visit_directory
398
412
  when /alz_2000.*_2$/
data/lib/metamri.rb CHANGED
@@ -1,10 +1,10 @@
1
1
  $: << File.dirname(__FILE__)
2
2
 
3
- begin
4
- require 'rubygems'
5
- gem 'activeresource', '<= 2.3.8'
3
+ # begin
4
+ # require 'rubygems'
5
+ # gem 'activeresource', '<= 2.3.8'
6
6
  require 'active_resource'
7
- end
7
+ # end
8
8
 
9
9
 
10
10
  require 'metamri/core_additions'
@@ -14,6 +14,7 @@ require 'metamri/visit_raw_data_directory'
14
14
  require 'metamri/raw_image_dataset_resource'
15
15
  require 'metamri/visit_raw_data_directory_resource'
16
16
  require 'metamri/image_dataset_quality_check_resource'
17
+ require 'metamri/dicom_additions'
17
18
 
18
19
  # require 'metamri/raw_image_dataset_thumbnail'
19
20
  # TODO Move raw_image_dataset_thumbnail out of metamri.
@@ -24,5 +25,4 @@ rescue LoadError
24
25
  puts "Hirb must be installed for pretty output. Use 'sudo gem install hirb'"
25
26
  end
26
27
 
27
- module Metamri
28
- end
28
+ # module Metamri; end
data/metamri.gemspec CHANGED
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{metamri}
8
- s.version = "0.2.2"
8
+ s.version = "0.2.3"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Kristopher J. Kosmatka"]
12
- s.date = %q{2011-01-18}
12
+ s.date = %q{2011-02-25}
13
13
  s.description = %q{Extraction of MRI metadata and insertion into compatible sqlite3 databases.}
14
14
  s.email = %q{kk4@medicine.wisc.edu}
15
15
  s.executables = ["convert_visit.rb", "import_visit.rb", "import_respiratory_files.rb", "import_study.rb", "list_visit"]
@@ -17,6 +17,7 @@ Gem::Specification.new do |s|
17
17
  "README.rdoc"
18
18
  ]
19
19
  s.files = [
20
+ ".rspec",
20
21
  "Manifest",
21
22
  "README.rdoc",
22
23
  "Rakefile",
@@ -28,6 +29,7 @@ Gem::Specification.new do |s|
28
29
  "bin/list_visit",
29
30
  "lib/metamri.rb",
30
31
  "lib/metamri/core_additions.rb",
32
+ "lib/metamri/dicom_additions.rb",
31
33
  "lib/metamri/image_dataset_quality_check_resource.rb",
32
34
  "lib/metamri/mysql_tools.rb",
33
35
  "lib/metamri/nifti_builder.rb",
@@ -40,6 +42,7 @@ Gem::Specification.new do |s|
40
42
  "lib/metamri/visit_raw_data_directory_resource.rb",
41
43
  "metamri.gemspec",
42
44
  "spec/helper_spec.rb",
45
+ "spec/unit/dicom_additions_spec.rb",
43
46
  "spec/unit/nifti_builder_spec.rb",
44
47
  "spec/unit/raw_image_dataset_spec.rb",
45
48
  "spec/unit/raw_image_dataset_thumbnail_spec.rb",
@@ -57,10 +60,11 @@ Gem::Specification.new do |s|
57
60
  ]
58
61
  s.homepage = %q{http://github.com/brainmap/metamri}
59
62
  s.require_paths = ["lib"]
60
- s.rubygems_version = %q{1.4.1}
63
+ s.rubygems_version = %q{1.4.2}
61
64
  s.summary = %q{MRI metadata}
62
65
  s.test_files = [
63
66
  "spec/helper_spec.rb",
67
+ "spec/unit/dicom_additions_spec.rb",
64
68
  "spec/unit/nifti_builder_spec.rb",
65
69
  "spec/unit/raw_image_dataset_spec.rb",
66
70
  "spec/unit/raw_image_dataset_thumbnail_spec.rb",
data/spec/helper_spec.rb CHANGED
@@ -1,10 +1,10 @@
1
- begin
2
- require 'spec'
3
- rescue LoadError
4
- require 'rubygems' unless ENV['NO_RUBYGEMS']
5
- gem 'rspec'
6
- require 'spec'
7
- end
1
+ # begin
2
+ # require 'spec'
3
+ # rescue LoadError
4
+ # require 'rubygems' unless ENV['NO_RUBYGEMS']
5
+ # gem 'rspec'
6
+ # require 'spec'
7
+ # end
8
8
 
9
9
  require 'tmpdir'
10
10
  require 'fileutils'
@@ -0,0 +1,68 @@
1
+ require 'helper_spec'
2
+ require 'metamri'
3
+
4
+ describe 'DicomGroup' do
5
+ before(:each) do
6
+ @group_array = Dir.glob('/tmp/s01_assetcal/s01_assetcal.0*')[0..1]
7
+ @group = DicomGroup.new(@group_array)
8
+ @common = DicomGroup.new(@group_array).find_common_elements
9
+ @test_output_file = File.join(Dir.tmpdir, 'test.dcm')
10
+ end
11
+ it 'should initialize a DicomGroup' do
12
+ grp = DicomGroup.new(@group_array)
13
+ grp.should be_an_instance_of DicomGroup
14
+ grp.dobjects.length.should == 2
15
+ end
16
+
17
+ it 'should convert files in array to DICOM::DObjects' do
18
+ @group.dobjects.first.should be_an_instance_of DICOM::DObject
19
+ end
20
+
21
+ it 'should generate a hash of tags with common values' do
22
+ tags = @group.find_common_tags
23
+ tags.length.should == 310
24
+ tags.should be_a_kind_of Hash
25
+ tags.should_not be_empty
26
+ end
27
+
28
+ it 'should remove differing tags' do
29
+ object_lengths = @group.dobjects.map{|dobj| dobj.to_hash.length}
30
+ common_dobj = @group.find_common_elements
31
+ common_dobj.to_hash.length.should be < @group.dobjects.map { |dobj| dobj.to_hash.length }.max
32
+ # @group.dobjects.map {|dobj| dobj.to_hash.length }.should == object_lengths
33
+ end
34
+
35
+ it 'should set the DICOM string of common tags' do
36
+ # Create a dicom object to test to make sure that we can read the string.
37
+ # segments = @common.encode_segments(4*1024)
38
+ # @common.send(:insert_missing_meta)
39
+ # File.open('/tmp/dcmstring', 'wb') {|f| f.puts segments}
40
+ # puts dcm = DICOM::DObject.new(segments, :bin => true)
41
+ # puts dcm.errors
42
+ # dcm.read_success.should be_true
43
+ # dcm.print_all
44
+
45
+ @common.write(@test_output_file)
46
+ @common.write_success.should be_true
47
+ File.exist?(@test_output_file).should be_true
48
+ d = DICOM::DObject.new(@test_output_file)
49
+ d.stream.string.should == 'a'
50
+ end
51
+
52
+ # after(:each) do
53
+ # File.delete(@test_output_file) if File.exist?(@test_output_file)
54
+ # end
55
+
56
+ end
57
+
58
+ describe 'DICOM::DObject' do
59
+ before(:all) do
60
+ @group_array = Dir.glob('/tmp/s01_assetcal/s01_assetcal.0*')[0..1]
61
+ end
62
+
63
+ it "should respond to to_hash" do
64
+ tags = DICOM::DObject.new(@group_array.first).to_hash
65
+ tags.should be_a_kind_of Hash
66
+ tags.should have_key '0019,1081'
67
+ end
68
+ end
@@ -1,9 +1,8 @@
1
1
  $:.unshift File.join(File.dirname(__FILE__),'..','lib')
2
2
 
3
+ require 'helper_spec'
4
+
3
5
  require 'rubygems'
4
- require 'spec'
5
- require 'fileutils'
6
- require 'tmpdir'
7
6
  require 'metamri'
8
7
 
9
8
  VISIT_FIXTURE_SRC = '/Data/vtrak1/raw/johnson.tbi-va.visit1/tbiva034_10019_04212010'
@@ -48,8 +47,8 @@ describe "Convert Unknown Dicoms to Nifti Files" do
48
47
  @dataset_unzipped.to_nifti('/tmp/', 'filename.nii', :input_directory => @dataset_unzipped.directory)[0].should == "to3d -session /tmp/ -prefix filename.nii #{@dataset_unzipped.directory}/'*.dcm'"
49
48
  nifti_conversion_command, nifti_output_file = @dataset_unzipped.to_nifti!('/tmp/', 'filename.nii', :input_directory => @dataset_unzipped.directory)
50
49
  nifti_conversion_command.should == "to3d -session /tmp/ -prefix filename.nii #{@dataset_unzipped.directory}/'*.dcm'"
50
+ File.exist?(nifti_output_file).should be_true
51
51
  @test_niftis << nifti_output_file
52
- @output_directories << '/tmp'
53
52
  end
54
53
 
55
54
  it "should convert all anatomicals in a visit raw directory using original, unzipped files." do
@@ -106,7 +105,7 @@ describe "Convert Unknown Dicoms to Nifti Files" do
106
105
  end
107
106
 
108
107
  after(:each) do
109
- @test_niftis.flatten.each { |nifti| File.delete(nifti) } unless @test_niftis.empty?
108
+ @test_niftis.flatten.each { |nifti| File.delete(nifti) if File.exist?(nifti) } unless @test_niftis.empty?
110
109
  [@output_directories, Dir.tmpdir, '/tmp'].flatten.each do |temp_dir|
111
110
  Dir.foreach(temp_dir) {|f| File.delete(File.join(temp_dir, f)) if File.extname(f) == '.nii'}
112
111
  end
@@ -20,7 +20,7 @@ describe RawImageDataset, "for a single valid DICOM file" do
20
20
  ds.raw_image_files.first.should == @valid_raw_image_file
21
21
  ds.rmr_number.should == "ID"
22
22
  ds.scanned_file.should == @valid_dicom_basename
23
- ds.scanner_source.should == "Station"
23
+ ds.scanner_source.should == "Institution"
24
24
  ds.series_description.should == "Ax FSPGR BRAVO T1"
25
25
  ds.study_id.should == "1405"
26
26
  ds.timestamp.should == DateTime.parse("Wed, 10 Nov 2010 00:00:00 +0000")
@@ -1,7 +1,7 @@
1
1
  $:.unshift File.join(File.dirname(__FILE__),'..','..','lib')
2
2
  $:.unshift File.join(File.dirname(__FILE__))
3
3
 
4
- require 'spec'
4
+
5
5
  require 'escoffier'
6
6
  require 'metamri/core_additions'
7
7
  require 'metamri/raw_image_dataset'
@@ -35,7 +35,7 @@ describe RawImageFile, "reads a dicom header and extracts metadata" do
35
35
  image.series_description.should == "Ax FSPGR BRAVO T1"
36
36
  image.slice_spacing.should == "1"
37
37
  image.slice_thickness.should == "1"
38
- image.source.should == "Station"
38
+ image.source.should == "Institution"
39
39
  # Don't compare floats due to rounding errors, but compare all the other tags in dicom_taghash
40
40
  image.dicom_taghash.reject{|k,v| v[:value].kind_of? Float }.should == valid_dicom_taghash.reject{|k,v| v[:value].kind_of? Float }
41
41
  image.dicom_study_uid.should == "1.2.840.113619.6.260.4.1294724594.737.1289407877.724"
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: metamri
3
3
  version: !ruby/object:Gem::Version
4
- hash: 19
4
+ hash: 17
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
8
  - 2
9
- - 2
10
- version: 0.2.2
9
+ - 3
10
+ version: 0.2.3
11
11
  platform: ruby
12
12
  authors:
13
13
  - Kristopher J. Kosmatka
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2011-01-18 00:00:00 -06:00
18
+ date: 2011-02-25 00:00:00 -06:00
19
19
  default_executable:
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
@@ -73,6 +73,7 @@ extensions: []
73
73
  extra_rdoc_files:
74
74
  - README.rdoc
75
75
  files:
76
+ - .rspec
76
77
  - Manifest
77
78
  - README.rdoc
78
79
  - Rakefile
@@ -84,6 +85,7 @@ files:
84
85
  - bin/list_visit
85
86
  - lib/metamri.rb
86
87
  - lib/metamri/core_additions.rb
88
+ - lib/metamri/dicom_additions.rb
87
89
  - lib/metamri/image_dataset_quality_check_resource.rb
88
90
  - lib/metamri/mysql_tools.rb
89
91
  - lib/metamri/nifti_builder.rb
@@ -96,6 +98,7 @@ files:
96
98
  - lib/metamri/visit_raw_data_directory_resource.rb
97
99
  - metamri.gemspec
98
100
  - spec/helper_spec.rb
101
+ - spec/unit/dicom_additions_spec.rb
99
102
  - spec/unit/nifti_builder_spec.rb
100
103
  - spec/unit/raw_image_dataset_spec.rb
101
104
  - spec/unit/raw_image_dataset_thumbnail_spec.rb
@@ -140,12 +143,13 @@ required_rubygems_version: !ruby/object:Gem::Requirement
140
143
  requirements: []
141
144
 
142
145
  rubyforge_project:
143
- rubygems_version: 1.4.1
146
+ rubygems_version: 1.4.2
144
147
  signing_key:
145
148
  specification_version: 3
146
149
  summary: MRI metadata
147
150
  test_files:
148
151
  - spec/helper_spec.rb
152
+ - spec/unit/dicom_additions_spec.rb
149
153
  - spec/unit/nifti_builder_spec.rb
150
154
  - spec/unit/raw_image_dataset_spec.rb
151
155
  - spec/unit/raw_image_dataset_thumbnail_spec.rb