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 +1 -0
- data/VERSION +1 -1
- data/bin/convert_visit.rb +75 -0
- data/lib/nifti_builder.rb +0 -1
- data/lib/raw_image_dataset.rb +21 -5
- data/lib/raw_image_file.rb +1 -1
- data/metamri.gemspec +4 -3
- data/test/nifti_builder_spec.rb +11 -8
- metadata +4 -4
data/.gitignore
CHANGED
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.1.
|
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
|
data/lib/nifti_builder.rb
CHANGED
@@ -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)
|
data/lib/raw_image_dataset.rb
CHANGED
@@ -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
|
-
|
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.
|
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
|
data/lib/raw_image_file.rb
CHANGED
@@ -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
|
data/metamri.gemspec
CHANGED
@@ -5,14 +5,14 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{metamri}
|
8
|
-
s.version = "0.1.
|
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-
|
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", "
|
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",
|
data/test/nifti_builder_spec.rb
CHANGED
@@ -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('/
|
13
|
-
@dataset = RawImageDataset.new(
|
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 =>
|
20
|
-
nifti_conversion_command, nifti_output_file = @dataset.to_nifti!('/tmp/', 'filename.nii', :input_directory =>
|
21
|
-
nifti_conversion_command.should == "to3d -session /tmp/ -prefix filename.nii
|
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 =>
|
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!
|
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
|
+
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-
|
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
|
-
-
|
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
|