metamri 0.1.5 → 0.1.6
Sign up to get free protection for your applications and to get access to all the features.
- data/VERSION +1 -1
- data/bin/convert_visit.rb +3 -3
- data/bin/import_respiratory_files.rb +87 -0
- data/lib/nifti_builder.rb +4 -0
- data/lib/raw_image_dataset.rb +1 -1
- data/lib/visit_raw_data_directory.rb +16 -12
- data/metamri.gemspec +8 -6
- data/test/fixtures/respiratory_fixtures.yaml +11 -0
- data/test/nifti_builder_spec.rb +2 -1
- data/test/visit_test.rb +3 -3
- metadata +7 -4
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.1.
|
1
|
+
0.1.6
|
data/bin/convert_visit.rb
CHANGED
@@ -42,7 +42,7 @@ require 'logger'
|
|
42
42
|
#
|
43
43
|
#
|
44
44
|
def convert_visit(raw_directory, scan_procedure_codename, output_directory = nil)
|
45
|
-
|
45
|
+
$LOG = Logger.new(File.join(Dir.tmpdir, File.basename(raw_directory)))
|
46
46
|
v = VisitRawDataDirectory.new(raw_directory, scan_procedure_codename)
|
47
47
|
puts "+++ Converting #{v.visit_directory} as part of #{v.scan_procedure_name} +++"
|
48
48
|
output_directory = output_directory ||= v.default_preprocess_directory
|
@@ -53,8 +53,8 @@ def convert_visit(raw_directory, scan_procedure_codename, output_directory = nil
|
|
53
53
|
rescue Exception => e
|
54
54
|
puts "There was a problem scanning a dataset in #{v.visit_directory}... skipping."
|
55
55
|
puts "Exception message: #{e.message}"
|
56
|
-
|
57
|
-
|
56
|
+
$LOG.error "There was a problem scanning a dataset in #{v.visit_directory}... skipping."
|
57
|
+
$LOG.error "Exception message: #{e.message}"
|
58
58
|
ensure
|
59
59
|
v = nil
|
60
60
|
end
|
@@ -0,0 +1,87 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
#
|
3
|
+
# == Synopsis
|
4
|
+
#
|
5
|
+
# == Examples
|
6
|
+
#
|
7
|
+
# == Usage
|
8
|
+
#
|
9
|
+
# == Options
|
10
|
+
#
|
11
|
+
# == Author
|
12
|
+
#
|
13
|
+
# == Copyright
|
14
|
+
# Copyright (c) 2010 WADRC Imaging Core.
|
15
|
+
#
|
16
|
+
|
17
|
+
$:.unshift File.join(File.dirname(__FILE__),'..','lib')
|
18
|
+
|
19
|
+
require 'metamri'
|
20
|
+
require 'pathname'
|
21
|
+
require 'rdoc/usage'
|
22
|
+
require 'logger'
|
23
|
+
|
24
|
+
# Assumptions: Respiratory files are large and in order.
|
25
|
+
def match_respiratory_files(path)
|
26
|
+
#File.join(Dir.tmpdir, File.basename(path), DateTime.now.to_s)
|
27
|
+
$LOG = Logger.new($stdout)
|
28
|
+
$LOG.level = Logger::INFO
|
29
|
+
path = File.expand_path(path)
|
30
|
+
|
31
|
+
raw_directory = '/tmp/awr001_7854_02102009'
|
32
|
+
visit = VisitRawDataDirectory.new(raw_directory)
|
33
|
+
visit.scan
|
34
|
+
visit_epi_files = Array.new
|
35
|
+
visit.datasets.each do |dataset|
|
36
|
+
$LOG.debug dataset.series_description
|
37
|
+
visit_epi_files << dataset.directory if dataset.series_description =~ /fMRI/i
|
38
|
+
end
|
39
|
+
$LOG.debug visit_epi_files
|
40
|
+
|
41
|
+
large_files = Array.new
|
42
|
+
|
43
|
+
Dir.open(path) do |dir|
|
44
|
+
dir.each do |file|
|
45
|
+
next if File.directory?(file)
|
46
|
+
if file =~ /^ECGData.*/
|
47
|
+
line_count = open(file) { |f| f.readlines}.length
|
48
|
+
large_files << file if line_count >= 1000
|
49
|
+
$LOG.debug "#{file}, #{line_count}"
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
$LOG.debug large_files
|
54
|
+
|
55
|
+
timestamps = Array.new
|
56
|
+
|
57
|
+
large_files.each do |large_file|
|
58
|
+
timestamps << large_file.gsub(/ECGData_epiRT_/, '')
|
59
|
+
end
|
60
|
+
|
61
|
+
$LOG.debug timestamps
|
62
|
+
|
63
|
+
return visit_epi_files.zip(timestamps)
|
64
|
+
end
|
65
|
+
|
66
|
+
def create_spec
|
67
|
+
spec_file = 'respiratory_fixtures.yaml'
|
68
|
+
|
69
|
+
runs = YAML::load_file(spec_file)
|
70
|
+
|
71
|
+
runs.each do |run|
|
72
|
+
options = [['--card', run['cardiac_data']], ['--resp', run['respiratory_data']], ['--ox', run['cardiac_trigger']]]
|
73
|
+
system("PhysioNoise.py #{options.flatten.join(" ")}")
|
74
|
+
end
|
75
|
+
|
76
|
+
end
|
77
|
+
|
78
|
+
|
79
|
+
if File.basename(__FILE__) == File.basename($PROGRAM_NAME)
|
80
|
+
RDoc::usage() if (ARGV[0] == '-h')
|
81
|
+
path = ARGV[0]
|
82
|
+
|
83
|
+
resp_files = match_respiratory_files(path)
|
84
|
+
resp_files.each do |resp_file|
|
85
|
+
puts "#{resp_file[0]}, #{resp_file[1]}"
|
86
|
+
end
|
87
|
+
end
|
data/lib/nifti_builder.rb
CHANGED
@@ -7,6 +7,10 @@ Builds Nifti files from Dicoms.
|
|
7
7
|
TO3D_CMD = 'to3d'
|
8
8
|
|
9
9
|
module UnknownImageDataset
|
10
|
+
# Always set AFNI GE DICOM Fix to "No" before conversion with to3d.
|
11
|
+
ENV['AFNI_SLICE_SPACING_IS_GAP'] == "NO"
|
12
|
+
|
13
|
+
|
10
14
|
def dataset_to_nifti(nifti_output_directory, nifti_filename, input_options = {} )
|
11
15
|
if input_options.has_key?(:dicom_files)
|
12
16
|
input_files = input_options[:dicom_files].each {|file| file.to_s }.join(' ')
|
data/lib/raw_image_dataset.rb
CHANGED
@@ -181,7 +181,7 @@ have more component files than shell commands can handle.
|
|
181
181
|
Does same basic string replacements to ensure valid filenames.
|
182
182
|
=end
|
183
183
|
def escape_filename(filename)
|
184
|
-
filename.mgsub([[/[\s\:\)\(]+/, "-"], [/\*/, "star"]])
|
184
|
+
filename.mgsub([[/[\s\:\)\(\/]+/, "-"], [/\*/, "star"]])
|
185
185
|
end
|
186
186
|
|
187
187
|
private
|
@@ -17,6 +17,7 @@ def flash(msg)
|
|
17
17
|
printf "\t%s\n", Time.now
|
18
18
|
puts "+" * 120
|
19
19
|
puts
|
20
|
+
$LOG.info msg if $LOG
|
20
21
|
end
|
21
22
|
|
22
23
|
|
@@ -159,7 +160,8 @@ Returns an array of the created nifti files.
|
|
159
160
|
nifti_filename = "#{scanid}_#{dataset.escape_filename(dataset.series_description)}_#{File.basename(dataset.directory)}.nii"
|
160
161
|
|
161
162
|
Pathname.new(dataset.directory).all_dicoms do |dicom_files|
|
162
|
-
|
163
|
+
nifti_input_path = File.dirname(dicom_files.first)
|
164
|
+
nifti_conversion_command, nifti_output_file = dataset.to_nifti!(nifti_output_path, nifti_filename, :input_directory => nifti_input_path, :append_modality_directory => true)
|
163
165
|
nifti_output_files << nifti_output_file
|
164
166
|
end
|
165
167
|
end
|
@@ -444,19 +446,21 @@ class Pathname
|
|
444
446
|
|
445
447
|
def all_dicoms
|
446
448
|
local_copies = []
|
447
|
-
|
449
|
+
Dir.mktmpdir do |tempdir|
|
450
|
+
begin
|
448
451
|
|
449
|
-
|
450
|
-
|
451
|
-
|
452
|
-
|
452
|
+
entries.each do |leaf|
|
453
|
+
branch = self + leaf
|
454
|
+
if leaf.to_s =~ /^I\.|\.dcm(\.bz2)?$|\.0[0-9]+(\.bz2)?$/
|
455
|
+
local_copies << branch.local_copy(tempdir)
|
456
|
+
end
|
453
457
|
end
|
454
|
-
end
|
455
458
|
|
456
|
-
|
459
|
+
yield local_copies
|
457
460
|
|
458
|
-
|
459
|
-
|
461
|
+
ensure
|
462
|
+
local_copies.each { |lc| lc.delete }
|
463
|
+
end
|
460
464
|
end
|
461
465
|
|
462
466
|
return
|
@@ -464,9 +468,9 @@ class Pathname
|
|
464
468
|
|
465
469
|
|
466
470
|
|
467
|
-
def local_copy
|
471
|
+
def local_copy(tempdir = Dir.tmpdir)
|
468
472
|
tfbase = self.to_s =~ /\.bz2$/ ? self.basename.to_s.chomp(".bz2") : self.basename.to_s
|
469
|
-
tmpfile = File.join(
|
473
|
+
tmpfile = File.join(tempdir, tfbase)
|
470
474
|
if self.to_s =~ /\.bz2$/
|
471
475
|
`bunzip2 -k -c #{self.to_s} >> #{tmpfile}`
|
472
476
|
else
|
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.6"
|
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{
|
12
|
+
s.date = %q{2010-01-19}
|
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 = ["convert_visit.rb", "import_study.rb", "import_visit.rb", "import_respiratory_files.rb"]
|
16
16
|
s.extra_rdoc_files = [
|
17
17
|
"README.rdoc"
|
18
18
|
]
|
@@ -23,6 +23,7 @@ Gem::Specification.new do |s|
|
|
23
23
|
"Rakefile",
|
24
24
|
"VERSION",
|
25
25
|
"bin/convert_visit.rb",
|
26
|
+
"bin/import_respiratory_files.rb",
|
26
27
|
"bin/import_study.rb",
|
27
28
|
"bin/import_visit.rb",
|
28
29
|
"lib/metamri.rb",
|
@@ -33,6 +34,7 @@ Gem::Specification.new do |s|
|
|
33
34
|
"lib/series_description_parameters.rb",
|
34
35
|
"lib/visit_raw_data_directory.rb",
|
35
36
|
"metamri.gemspec",
|
37
|
+
"test/fixtures/respiratory_fixtures.yaml",
|
36
38
|
"test/nifti_builder_spec.rb",
|
37
39
|
"test/raw_image_dataset_test.rb",
|
38
40
|
"test/raw_image_file_test.rb",
|
@@ -45,11 +47,11 @@ Gem::Specification.new do |s|
|
|
45
47
|
s.rubygems_version = %q{1.3.5}
|
46
48
|
s.summary = %q{MRI metadata}
|
47
49
|
s.test_files = [
|
48
|
-
"test/
|
50
|
+
"test/nifti_builder_spec.rb",
|
51
|
+
"test/raw_image_dataset_test.rb",
|
49
52
|
"test/raw_image_file_test.rb",
|
50
53
|
"test/visit_duplication_test.rb",
|
51
|
-
"test/visit_test.rb"
|
52
|
-
"test/nifti_builder_spec.rb"
|
54
|
+
"test/visit_test.rb"
|
53
55
|
]
|
54
56
|
|
55
57
|
if s.respond_to? :specification_version then
|
@@ -0,0 +1,11 @@
|
|
1
|
+
fMRI ASSET RUN 1:
|
2
|
+
cardiac_data: ECGData_epiRT_0210200914_22_58
|
3
|
+
respiratory_data: RespData_epiRT_0210200914_22_58
|
4
|
+
cardiac_trigger: TrigEcg_epiRT_0210200914_22_58
|
5
|
+
respiratory_trigger: TrigResp_epiRT_0210200914_22_58
|
6
|
+
|
7
|
+
fMRI ASSET RUN 2:
|
8
|
+
cardiac_data: ECGData_epiRT_0210200914_22_58
|
9
|
+
respiratory_data: RespData_epiRT_0210200914_22_58
|
10
|
+
cardiac_trigger: TrigEcg_epiRT_0210200914_22_58
|
11
|
+
respiratory_trigger: TrigResp_epiRT_0210200914_22_58
|
data/test/nifti_builder_spec.rb
CHANGED
@@ -59,8 +59,9 @@ describe "Convert Unknown Dicoms to Nifti Files" do
|
|
59
59
|
nifti_conversion_command.should == "to3d -session /tmp -prefix 001.nii /tmp/'*.dcm'"
|
60
60
|
|
61
61
|
|
62
|
+
nifti_input_path = File.dirname(dicom_files.first)
|
62
63
|
nifti_conversion_command, nifti_output_file = @dataset.to_nifti(nifti_output_path, nifti_filename, :dicom_files => dicom_files)
|
63
|
-
nifti_conversion_command.should == "to3d -session /tmp -prefix 001.nii #{
|
64
|
+
nifti_conversion_command.should == "to3d -session /tmp -prefix 001.nii #{dicom_files.each {|dicom| dicom}.join(" ")}"
|
64
65
|
|
65
66
|
end
|
66
67
|
end
|
data/test/visit_test.rb
CHANGED
@@ -10,7 +10,7 @@ require 'logger'
|
|
10
10
|
|
11
11
|
class RawImageFileTest < Test::Unit::TestCase
|
12
12
|
DBFILE = '/Users/kris/projects/TransferScans/db/development.sqlite3'
|
13
|
-
LOG = Logger.new('visit_test.log', shift_age = 7, shift_size = 1048576)
|
13
|
+
$LOG = Logger.new('visit_test.log', shift_age = 7, shift_size = 1048576)
|
14
14
|
STUDIES = [
|
15
15
|
# Pathname.new('/Data/vtrak1/raw/alz_2000'),
|
16
16
|
# Pathname.new('/Data/vtrak1/raw/alz_2000'),
|
@@ -65,8 +65,8 @@ class RawImageFileTest < Test::Unit::TestCase
|
|
65
65
|
rescue Exception => e
|
66
66
|
puts "There was a problem scanning a dataset in #{visitdir}... skipping."
|
67
67
|
puts "Exception message: #{e.message}"
|
68
|
-
LOG.error "There was a problem scanning a dataset in #{visitdir}... skipping."
|
69
|
-
LOG.error "Exception message: #{e.message}"
|
68
|
+
$LOG.error "There was a problem scanning a dataset in #{visitdir}... skipping."
|
69
|
+
$LOG.error "Exception message: #{e.message}"
|
70
70
|
ensure
|
71
71
|
v = nil
|
72
72
|
end
|
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.6
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Kristopher J. Kosmatka
|
@@ -9,16 +9,17 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date:
|
12
|
+
date: 2010-01-19 00:00:00 -06:00
|
13
13
|
default_executable:
|
14
14
|
dependencies: []
|
15
15
|
|
16
16
|
description: Extraction of MRI metadata and insertion into compatible sqlite3 databases.
|
17
17
|
email: kk4@medicine.wisc.edu
|
18
18
|
executables:
|
19
|
+
- convert_visit.rb
|
19
20
|
- import_study.rb
|
20
21
|
- import_visit.rb
|
21
|
-
-
|
22
|
+
- import_respiratory_files.rb
|
22
23
|
extensions: []
|
23
24
|
|
24
25
|
extra_rdoc_files:
|
@@ -30,6 +31,7 @@ files:
|
|
30
31
|
- Rakefile
|
31
32
|
- VERSION
|
32
33
|
- bin/convert_visit.rb
|
34
|
+
- bin/import_respiratory_files.rb
|
33
35
|
- bin/import_study.rb
|
34
36
|
- bin/import_visit.rb
|
35
37
|
- lib/metamri.rb
|
@@ -40,6 +42,7 @@ files:
|
|
40
42
|
- lib/series_description_parameters.rb
|
41
43
|
- lib/visit_raw_data_directory.rb
|
42
44
|
- metamri.gemspec
|
45
|
+
- test/fixtures/respiratory_fixtures.yaml
|
43
46
|
- test/nifti_builder_spec.rb
|
44
47
|
- test/raw_image_dataset_test.rb
|
45
48
|
- test/raw_image_file_test.rb
|
@@ -74,8 +77,8 @@ signing_key:
|
|
74
77
|
specification_version: 3
|
75
78
|
summary: MRI metadata
|
76
79
|
test_files:
|
80
|
+
- test/nifti_builder_spec.rb
|
77
81
|
- test/raw_image_dataset_test.rb
|
78
82
|
- test/raw_image_file_test.rb
|
79
83
|
- test/visit_duplication_test.rb
|
80
84
|
- test/visit_test.rb
|
81
|
-
- test/nifti_builder_spec.rb
|