metamri 0.1.5 → 0.1.6
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/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
|