metamri 0.1.4 → 0.1.5

Sign up to get free protection for your applications and to get access to all the features.
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