metamri 0.1.4 → 0.1.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/.gitignore CHANGED
@@ -3,4 +3,5 @@
3
3
  ._*
4
4
  .idea
5
5
  *~
6
+ test/fixtures/visit_raw_data_directory
6
7
 
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.1.4
1
+ 0.1.5
@@ -0,0 +1,75 @@
1
+ #!/usr/bin/env ruby
2
+ #
3
+ # == Synopsis
4
+ # A simple utility for converting all the dicom datasets in a directory into niftis. Defaults to the current
5
+ # default preprocessed repository.
6
+ #
7
+ # == Examples
8
+ # convert_visit.rb /Data/vtrak1/raw/ries.aware.visit1/awr001_7854_02102009 ries.aware.visit1
9
+
10
+ #
11
+ # == Usage
12
+ # convert_visit.rb <raw_data_directory> <scan_procedure_codename>
13
+ #
14
+ # For help use: import_visit.rb -h
15
+ #
16
+ # == Options
17
+ # -h, --help Displays help message
18
+ # -v, --visit Visit raw data directory, absolute path
19
+ # -p, --scan_procedure scan_procedure codename, e.g. johnson.alz.visit1
20
+ #
21
+ # == Author
22
+ #
23
+ #
24
+ # == Copyright
25
+ # Copyright (c) 2009 WADRC Imaging Core.
26
+ #
27
+
28
+ $:.unshift File.join(File.dirname(__FILE__),'..','lib')
29
+
30
+ require 'metamri'
31
+ require 'pathname'
32
+ require 'rdoc/usage'
33
+ require 'logger'
34
+
35
+ # == Function
36
+ #
37
+ #
38
+ # == Usage
39
+ #
40
+ #
41
+ # == Example
42
+ #
43
+ #
44
+ def convert_visit(raw_directory, scan_procedure_codename, output_directory = nil)
45
+ log = Logger.new(File.basename(raw_directory))
46
+ v = VisitRawDataDirectory.new(raw_directory, scan_procedure_codename)
47
+ puts "+++ Converting #{v.visit_directory} as part of #{v.scan_procedure_name} +++"
48
+ output_directory = output_directory ||= v.default_preprocess_directory
49
+
50
+ begin
51
+ v.scan
52
+ v.to_nifti!(output_directory)
53
+ rescue Exception => e
54
+ puts "There was a problem scanning a dataset in #{v.visit_directory}... skipping."
55
+ puts "Exception message: #{e.message}"
56
+ log.error "There was a problem scanning a dataset in #{v.visit_directory}... skipping."
57
+ log.error "Exception message: #{e.message}"
58
+ ensure
59
+ v = nil
60
+ end
61
+ end
62
+
63
+
64
+
65
+ if File.basename(__FILE__) == File.basename($PROGRAM_NAME)
66
+ RDoc::usage() if (ARGV[0] == '-h')
67
+ raw_directory = ARGV[0]
68
+
69
+ # This is required for now, will be inferred from path in the future.
70
+ scan_procedure_codename = ARGV[1]
71
+
72
+ output_directory = ARGV[2] ? ARGV[2] : nil
73
+
74
+ convert_visit(raw_directory, scan_procedure_codename, output_directory)
75
+ end
@@ -15,7 +15,6 @@ module UnknownImageDataset
15
15
  else input_files = "#{Dir.tmpdir}/'#{glob}'"
16
16
  end
17
17
 
18
- nifti_output_directory = File.join(nifti_output_directory, 'unknown') if input_options[:append_modality_directory]
19
18
  nifti_output_file = File.join(nifti_output_directory, nifti_filename)
20
19
 
21
20
  File.makedirs(nifti_output_directory) unless File.directory?(nifti_output_directory)
@@ -27,7 +27,7 @@ class RawImageDataset
27
27
  # the file scanned
28
28
  attr_reader :scanned_file
29
29
  # the scanner source
30
- attr_reader :scanner_source
30
+ attr_reader :scanner_source
31
31
 
32
32
  =begin rdoc
33
33
  * dir: The directory containing the files.
@@ -122,7 +122,14 @@ The to3d code is applied as a mixed-in module.
122
122
  Returns the to3d command that creates the specified options.
123
123
  =end
124
124
  def to_nifti(nifti_output_directory, nifti_filename, input_options = {} )
125
- extend(UnknownImageDataset)
125
+
126
+ # Handle the business logic for choosing the right Nifti Builder here.
127
+ # Currently just extend the default unknown builder, since that's the only one that exists.
128
+ if true
129
+ nifti_output_directory = File.join(nifti_output_directory, 'unknown') if input_options[:append_modality_directory]
130
+ extend(UnknownImageDataset)
131
+ end
132
+
126
133
  nifti_conversion_command, nifti_output_file = self.dataset_to_nifti(nifti_output_directory, nifti_filename, input_options)
127
134
  return nifti_conversion_command, nifti_output_file
128
135
  end
@@ -171,10 +178,10 @@ have more component files than shell commands can handle.
171
178
  end
172
179
 
173
180
  =begin rdoc
174
-
181
+ Does same basic string replacements to ensure valid filenames.
175
182
  =end
176
183
  def escape_filename(filename)
177
- filename.gsub(/\s|:/,"-" )
184
+ filename.mgsub([[/[\s\:\)\(]+/, "-"], [/\*/, "star"]])
178
185
  end
179
186
 
180
187
  private
@@ -186,4 +193,13 @@ private
186
193
 
187
194
 
188
195
  end
189
- #### END OF CLASS ####
196
+ #### END OF CLASS ####
197
+
198
+ class String
199
+ def mgsub(key_value_pairs=[].freeze)
200
+ regexp_fragments = key_value_pairs.collect { |k,v| k }
201
+ gsub(Regexp.union(*regexp_fragments)) do |match|
202
+ key_value_pairs.detect { |k,v| k =~ match}[1]
203
+ end
204
+ end
205
+ end
@@ -71,7 +71,7 @@ temporary file.
71
71
  def initialize(pathtofile)
72
72
  # raise an error if the file doesn't exist
73
73
  absfilepath = File.expand_path(pathtofile)
74
- raise(IOError, "File not found.") if not File.exists?(absfilepath)
74
+ raise(IOError, "File not found at #{absfilepath}.") if not File.exists?(absfilepath)
75
75
  @filename = File.basename(absfilepath)
76
76
 
77
77
  # try to read the header, raise an IOError if unsuccessful
@@ -5,14 +5,14 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{metamri}
8
- s.version = "0.1.4"
8
+ s.version = "0.1.5"
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{2009-12-11}
12
+ s.date = %q{2009-12-18}
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
- s.executables = ["import_study.rb", "import_visit.rb", "alz.visit1.scan.log", "wrap140.scan.log"]
15
+ s.executables = ["import_study.rb", "import_visit.rb", "convert_visit.rb"]
16
16
  s.extra_rdoc_files = [
17
17
  "README.rdoc"
18
18
  ]
@@ -22,6 +22,7 @@ Gem::Specification.new do |s|
22
22
  "README.rdoc",
23
23
  "Rakefile",
24
24
  "VERSION",
25
+ "bin/convert_visit.rb",
25
26
  "bin/import_study.rb",
26
27
  "bin/import_visit.rb",
27
28
  "lib/metamri.rb",
@@ -9,16 +9,19 @@ require 'raw_image_file'
9
9
  describe "Convert Unknown Dicoms to Nifti Files" do
10
10
 
11
11
  before(:each) do
12
- @visit = VisitRawDataDirectory.new('/Data/vtrak1/raw/johnson.tbi-va.visit1/tbiva018b_9336_12022009', 'johnson.tbi-va.visit1')
13
- @dataset = RawImageDataset.new('/Data/vtrak1/raw/johnson.tbi-va.visit1/tbiva018b_9336_12022009/001', [RawImageFile.new('/Data/vtrak1/raw/johnson.tbi-va.visit1/tbiva018b_9336_12022009/001/I0001.dcm')])
12
+ @visit = VisitRawDataDirectory.new(File.join(File.dirname(__FILE__), 'fixtures/visit_raw_data_directory/tbiva018b_9336_12022009'), 'johnson.tbi-va.visit1')
13
+ @dataset = RawImageDataset.new(
14
+ File.join(File.dirname(__FILE__), 'fixtures/visit_raw_data_directory/tbiva018b_9336_12022009/001'),
15
+ [RawImageFile.new(File.join(File.dirname(__FILE__), 'fixtures/visit_raw_data_directory/tbiva018b_9336_12022009/001/I0001.dcm'))]
16
+ )
14
17
  @test_niftis = Array.new
15
18
  @output_directories = Array.new
16
19
  end
17
20
 
18
21
  it "should Convert an anatomical from dicom to nifti using original, unzipped files." do
19
- @dataset.to_nifti('/tmp/', 'filename.nii', :input_directory => '/Data/vtrak1/raw/asthana.adrc-clinical-core.visit1/adrc00001_294_12022009/001')[0].should == "to3d -session /tmp/ -prefix filename.nii /Data/vtrak1/raw/asthana.adrc-clinical-core.visit1/adrc00001_294_12022009/001/'*.dcm'"
20
- nifti_conversion_command, nifti_output_file = @dataset.to_nifti!('/tmp/', 'filename.nii', :input_directory => '/Data/vtrak1/raw/asthana.adrc-clinical-core.visit1/adrc00001_294_12022009/001')
21
- nifti_conversion_command.should == "to3d -session /tmp/ -prefix filename.nii /Data/vtrak1/raw/asthana.adrc-clinical-core.visit1/adrc00001_294_12022009/001/'*.dcm'"
22
+ @dataset.to_nifti('/tmp/', 'filename.nii', :input_directory => @dataset.directory)[0].should == "to3d -session /tmp/ -prefix filename.nii #{@dataset.directory}/'*.dcm'"
23
+ nifti_conversion_command, nifti_output_file = @dataset.to_nifti!('/tmp/', 'filename.nii', :input_directory => @dataset.directory)
24
+ nifti_conversion_command.should == "to3d -session /tmp/ -prefix filename.nii #{@dataset.directory}/'*.dcm'"
22
25
  @test_niftis << nifti_output_file
23
26
  @output_directories << '/tmp'
24
27
  end
@@ -29,7 +32,7 @@ describe "Convert Unknown Dicoms to Nifti Files" do
29
32
  @visit.datasets.each do |ds|
30
33
  begin
31
34
  nifti_filename = "#{@visit.scanid}_#{ds.escape_filename(ds.series_description)}_#{File.basename(ds.directory)}.nii"
32
- nifti_conversion_commmand, nifti_output_file = ds.to_nifti!(File.join(Dir.tmpdir, @visit.default_preprocess_directory), nifti_filename, :input_directory => @dataset.directory, :append_modality_directory => true )
35
+ nifti_conversion_commmand, nifti_output_file = ds.to_nifti!(File.join(Dir.tmpdir, @visit.default_preprocess_directory), nifti_filename, :input_directory => ds.directory, :append_modality_directory => true )
33
36
  @test_niftis << nifti_output_file
34
37
  rescue IOError => e
35
38
  puts "-- Error: #{e.message}"
@@ -40,7 +43,7 @@ describe "Convert Unknown Dicoms to Nifti Files" do
40
43
  end
41
44
 
42
45
  it "should convert all anatomicals in a visit raw directory using local copy." do
43
- @test_niftis << @visit.to_nifti!('/tmp')
46
+ @test_niftis << @visit.to_nifti!
44
47
  end
45
48
 
46
49
  it "should create a good to3d command with input directory or dicom files." do
@@ -75,7 +78,7 @@ describe "Convert Unknown Dicoms to Nifti Files" do
75
78
  v.scanid.should == 'adrc00001'
76
79
  end
77
80
 
78
- after do
81
+ after(:each) do
79
82
  @test_niftis.flatten.each { |nifti| File.delete(nifti) } unless @test_niftis.empty?
80
83
  [@output_directories, Dir.tmpdir, '/tmp'].flatten.each do |temp_dir|
81
84
  Dir.foreach(temp_dir) {|f| File.delete(File.join(temp_dir, f)) if File.extname(f) == '.nii'}
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: metamri
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.4
4
+ version: 0.1.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Kristopher J. Kosmatka
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2009-12-11 00:00:00 -06:00
12
+ date: 2009-12-18 00:00:00 -06:00
13
13
  default_executable:
14
14
  dependencies: []
15
15
 
@@ -18,8 +18,7 @@ email: kk4@medicine.wisc.edu
18
18
  executables:
19
19
  - import_study.rb
20
20
  - import_visit.rb
21
- - alz.visit1.scan.log
22
- - wrap140.scan.log
21
+ - convert_visit.rb
23
22
  extensions: []
24
23
 
25
24
  extra_rdoc_files:
@@ -30,6 +29,7 @@ files:
30
29
  - README.rdoc
31
30
  - Rakefile
32
31
  - VERSION
32
+ - bin/convert_visit.rb
33
33
  - bin/import_study.rb
34
34
  - bin/import_visit.rb
35
35
  - lib/metamri.rb