rpipe 0.1.6 → 0.1.7

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.
@@ -4,7 +4,8 @@ require 'default_methods/recon/raw_sequence'
4
4
  # require 'default_methods/recon/physionoise_helper'
5
5
 
6
6
  module DefaultRecon
7
-
7
+ DEFAULT_VOLUME_SKIP = 3 # Default number of volumes to strip from beginning of functional scans.
8
+
8
9
  # Reconstructs, strips, and slice timing corrects all scans specified in the recon_spec.
9
10
  # This function assumes a destination directory is set up in the filesystem and begins writing
10
11
  # to it with no further checking. It will overwrite data if it already exists, be careful.
@@ -16,6 +17,9 @@ module DefaultRecon
16
17
  @scans.each_with_index do |scan_spec, i|
17
18
  outfile = "%s_%s.nii" % [@subid, scan_spec['label']]
18
19
 
20
+ # Set Discarded Acquisitions - Volumes to Skip from Recon Spec, Scan Spec or Default
21
+ @volumes_to_skip = @volume_skip || scan_spec['volume_skip'] || scan_spec['volumes_to_skip'] || DEFAULT_VOLUME_SKIP
22
+
19
23
  reconstruct_scan(scan_spec, outfile)
20
24
 
21
25
  if scan_spec['type'] == "func"
@@ -42,30 +46,16 @@ module DefaultRecon
42
46
  # filenaming, I0002.dcm is second file in series,
43
47
  def reconstruct_scan(scan_spec, outfile)
44
48
  if scan_spec['dir']
45
- sequence = DicomRawSequence.new(scan_spec, @rawdir)
46
- File.delete('tmp.nii') if File.exist? 'tmp.nii'
47
- sequence.prepare('tmp.nii')
48
- strip_leading_volumes('tmp.nii', outfile, @volume_skip, scan_spec['bold_reps'])
49
+ sequence = DicomRawSequence.new(scan_spec, @rawdir, @volumes_to_skip)
49
50
  elsif scan_spec['pfile']
50
- sequence = PfileRawSequence.new(scan_spec, @rawdir)
51
- sequence.prepare(outfile)
52
- else
51
+ sequence = PfileRawSequence.new(scan_spec, @rawdir, @volumes_to_skip)
52
+ else
53
53
  raise ConfigError, "Scan must list either a pfile or a dicom directory."
54
54
  end
55
+
56
+ sequence.prepare(outfile)
55
57
  end
56
-
57
- # Removes the specified number of volumes from the beginning of a 4D functional nifti file.
58
- # In most cases this will be 3 volumes. Writes result in current working directory.
59
- def strip_leading_volumes(infile, outfile, volume_skip, bold_reps)
60
- $Log.info "Stripping #{volume_skip.to_s} leading volumes: #{infile}"
61
- cmd_fmt = "fslroi %s %s %s %s"
62
- cmd_options = [infile, outfile, volume_skip.to_s, bold_reps.to_s]
63
- cmd = cmd_fmt % cmd_options
64
- unless run(cmd)
65
- raise ScriptError, "Failed to strip volumes: #{cmd}"
66
- end
67
- end
68
-
58
+
69
59
  # Uses to3d to slice time correct a 4D functional nifti file. Writes result in the current working directory.
70
60
  def slice_time_correct(infile, alt_direction = "alt+z")
71
61
  $Log.info "Slice Timing Correction: #{infile}"
@@ -4,10 +4,24 @@ module DefaultRecon
4
4
  # them from their raw state (dicoms or pfiles) to Nifti files suitable for
5
5
  # processing.
6
6
  class RawSequence
7
- def initialize(scan_spec, rawdir)
7
+ def initialize(scan_spec, rawdir, volumes_to_skip)
8
8
  @scan_spec = scan_spec
9
9
  @rawdir = rawdir
10
+ @volumes_to_skip = volumes_to_skip
10
11
  end
12
+
13
+ # Removes the specified number of volumes from the beginning of a 4D functional nifti file.
14
+ # In most cases this will be 3 volumes. Writes result in current working directory.
15
+ def strip_leading_volumes(infile, outfile, volume_skip, bold_reps)
16
+ $Log.info "Stripping #{volume_skip.to_s} leading volumes: #{infile}"
17
+ cmd_fmt = "fslroi %s %s %s %s"
18
+ cmd_options = [infile, outfile, volume_skip.to_s, bold_reps.to_s]
19
+ cmd = cmd_fmt % cmd_options
20
+ unless run(cmd)
21
+ raise ScriptError, "Failed to strip volumes: #{cmd}"
22
+ end
23
+ end
24
+
11
25
  end
12
26
 
13
27
  # Manage a folder of Raw Dicoms for Nifti file conversion
@@ -16,9 +30,14 @@ module DefaultRecon
16
30
  def prepare_and_convert_sequence(outfile)
17
31
  @scandir = File.join(@rawdir, @scan_spec['dir'])
18
32
  $Log.info "Dicom Reconstruction: #{@scandir}"
33
+
34
+ File.delete('tmp.nii') if File.exist? 'tmp.nii'
35
+
19
36
  Pathname.new(@scandir).all_dicoms do |dicoms|
20
- convert_sequence(dicoms, outfile)
37
+ convert_sequence(dicoms, 'tmp.nii')
21
38
  end
39
+
40
+ strip_leading_volumes('tmp.nii', outfile, @volumes_to_skip, @scan_spec['bold_reps'])
22
41
  end
23
42
 
24
43
  alias_method :prepare, :prepare_and_convert_sequence
@@ -67,8 +86,8 @@ module DefaultRecon
67
86
  # Reconstucts a PFile from Raw to Nifti File
68
87
  class PfileRawSequence < RawSequence
69
88
  # Create a local unzipped copy of the Pfile and prepare Scanner Reference Data for reconstruction
70
- def initialize(scan_spec, rawdir)
71
- super(scan_spec, rawdir)
89
+ def initialize(scan_spec, rawdir, volumes_to_skip)
90
+ super(scan_spec, rawdir, volumes_to_skip)
72
91
 
73
92
  base_pfile_path = File.join(@rawdir, @scan_spec['pfile'])
74
93
  pfile_path = File.exist?(base_pfile_path) ? base_pfile_path : base_pfile_path + '.bz2'
@@ -86,9 +105,8 @@ module DefaultRecon
86
105
  # Outfile may include a '.nii' extension - a nifti file will be constructed
87
106
  # directly in this case.
88
107
  def reconstruct_sequence(outfile)
89
- volumes_to_skip = @scan_spec['volumes_to_skip'] ||= 3
90
108
  epirecon_cmd_format = "epirecon_ex -f %s -NAME %s -skip %d -scltype=0"
91
- epirecon_cmd_options = [@pfile_data, outfile, volumes_to_skip]
109
+ epirecon_cmd_options = [@pfile_data, outfile, @volumes_to_skip]
92
110
  epirecon_cmd = epirecon_cmd_format % epirecon_cmd_options
93
111
  raise ScriptError, "Problem running #{epirecon_cmd}" unless run(epirecon_cmd)
94
112
  end
@@ -1,5 +1,5 @@
1
- gem 'activeresource', '<=2.3.8'
2
- $LOAD_PATH.unshift('~/projects/metamri/lib').unshift('~/code/metamri/lib')
1
+ # gem 'activeresource', '<=2.3.8'
2
+ # $LOAD_PATH.unshift('~/projects/metamri/lib').unshift('~/code/metamri/lib')
3
3
  require 'metamri'
4
4
  require 'generators/job_generator'
5
5
 
@@ -147,8 +147,6 @@ class Reconstruction < JobStep
147
147
  require 'default_methods/default_recon'
148
148
  include DefaultRecon
149
149
 
150
- VOLUME_SKIP = 3 # number of volumes to strip from beginning of functional scans.
151
-
152
150
  attr_accessor :scans, :volume_skip
153
151
 
154
152
  # Instances are initialized with a properly configured hash containing all the information needed to drive
@@ -156,7 +154,7 @@ class Reconstruction < JobStep
156
154
  def initialize(workflow_spec, recon_spec)
157
155
  super(workflow_spec, recon_spec)
158
156
  raise ScriptError, "At least one scan must be specified." if @scans.nil?
159
- @volume_skip = recon_spec['volume_skip'] || VOLUME_SKIP
157
+ @volume_skip = recon_spec['volume_skip']
160
158
 
161
159
  job_requires 'rawdir', 'origdir', 'scans'
162
160
  end
@@ -1,3 +1,3 @@
1
1
  module Rpipe
2
- VERSION = "0.1.6"
3
- end
2
+ VERSION = "0.1.7"
3
+ end
@@ -13,6 +13,7 @@ Gem::Specification.new do |s|
13
13
  s.homepage = "http://github.com/brainmap/rpipe"
14
14
 
15
15
  s.add_development_dependency "thoughtbot-shoulda", ">= 0"
16
+ s.add_development_dependency "rspec", "~>1.3.2"
16
17
  s.add_dependency "metamri", '~>0.2.9'
17
18
  s.add_dependency "log4r", '~>1.1.9'
18
19
  s.add_dependency "POpen4", '~>0.1.4'
@@ -1,98 +1,98 @@
1
- $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '../../physionoise/lib'))
2
-
3
- require 'helper_spec'
4
- require 'rpipe'
5
- require 'physionoise'
6
-
7
-
8
- describe "Test Phyiosnoise" do
9
- before(:each) do
10
- @runs_dir = File.join($MRI_DATA, 'mrt00000', 'dicoms')
11
- job_params = {
12
- "scans" => [{
13
- "label"=>"task1",
14
- "dir"=>"s07_epi",
15
- "z_slices"=>36,
16
- "rep_time"=>2.0,
17
- "type"=>"func",
18
- "physio_files"=> {
19
- :phys_directory => "../cardiac", # Relative to rawdir
20
- :series_description => "EPI fMRI Task1",
21
- :respiration_signal => "RESPData_epiRT_0211201009_21_22_80",
22
- :respiration_trigger => "RESPTrig_epiRT_0211201009_21_22_80",
23
- :cardiac_signal => "PPGData_epiRT_0211201009_21_22_80",
24
- :cardiac_trigger => "PPGTrig_epiRT_0211201009_21_22_80"
25
- },
26
- "bold_reps"=>167,
27
- "task"=>"Faces3B"
28
- }]
29
- }
30
-
31
- workflow_spec = {
32
- "subid"=>"mrt00000",
33
- "rawdir"=> @runs_dir,
34
- "origdir"=> Dir.mktmpdir('orig_'),
35
- "procdir"=> Dir.mktmpdir('proc_'),
36
- "statsdir"=> Dir.mktmpdir('stats_'),
37
- "collision"=> "destroy"
38
- }
39
-
40
- @valid_physionoise_run_spec = [{
41
- :run_directory=> @runs_dir,
42
- :bold_reps=>167, :respiration_signal=>"RESPData_epiRT_0211201009_21_22_80",
43
- :respiration_trigger=>"RESPTrig_epiRT_0211201009_21_22_80",
44
- :cardiac_signal=>"PPGData_epiRT_0211201009_21_22_80",
45
- :cardiac_trigger=>"PPGTrig_epiRT_0211201009_21_22_80",
46
- :phys_directory=> File.join(@runs_dir, '..', 'cardiac'),
47
- :rep_time=>2.0,
48
- :series_description=>"EPI fMRI Task1"
49
- }]
50
-
51
- @recon_job = Reconstruction.new(workflow_spec, job_params)
52
- @scan_spec = @recon_job.scans.first
53
-
54
- @physionoise_fixture_dir = File.join(File.dirname(__FILE__), 'fixtures', 'physionoise_regressors')
55
-
56
- end
57
-
58
- it "should create physionoise regressors from Cardiac and Respiration Data" # do
59
- # Dir.chdir @recon_job.origdir do
60
- # @recon_job.create_physiosnoise_regressors(@scan_spec)
61
- # end
62
- #
63
- # Dir.compare_directories(@recon_job.origdir, @physionoise_fixture_dir).should be_true
64
-
65
- # end
66
-
67
- it "should correctly build a spec for passing to physionoise" # do
68
- # @recon_job.build_physionoise_run_spec(@scan_spec).should == @valid_physionoise_run_spec
69
- # end
70
-
71
- it "should correctly build a physionoise python command" # do
72
- # @valid_physionoise_run_spec.each do |run|
73
- # puts Physionoise.build_run_cmd(run)
74
- # end
75
- # end
76
-
77
- it "should build a 3dRetroicor string" # do
78
- # valid_cmd = "3dretroicor -prefix ptask1.nii -card #{@runs_dir}/../cardiac/PPGData_epiRT_0211201009_21_22_80 -resp #{@runs_dir}/../cardiac/RESPData_epiRT_0211201009_21_22_80 task1.nii"
79
- # valid_outfile = "p#{@scan_spec['label']}.nii"
80
- # test_cmd, test_outfile = @recon_job.build_retroicor_cmd(@scan_spec['physio_files'], "#{@scan_spec['label']}.nii")
81
- #
82
- # valid_cmd.should == test_cmd
83
- # valid_outfile.should == test_outfile
84
- # end
85
-
86
- it "should raise an error building a 3dRetroicor string if improperly configured" # do
87
- # physio_files = @scan_spec['physio_files']
88
- # physio_files.delete(:cardiac_signal)
89
- #
90
- # lambda {@recon_job.build_retroicor_cmd(physio_files, "#{@scan_spec['label']}.nii") }.should raise_error ScriptError, /Missing .* cardiac/
91
- # end
92
-
93
- it "should raise an IOError building a 3dRetroicor string with bad files"
94
-
95
- after(:each) do
96
- FileUtils.rm_r([@recon_job.origdir, @recon_job.procdir, @recon_job.statsdir])
97
- end
98
- end
1
+ # $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '../../physionoise/lib'))
2
+ #
3
+ # require 'helper_spec'
4
+ # require 'rpipe'
5
+ # require 'physionoise'
6
+ #
7
+ #
8
+ # describe "Test Phyiosnoise" do
9
+ # before(:each) do
10
+ # @runs_dir = File.join($MRI_DATA, 'mrt00000', 'dicoms')
11
+ # job_params = {
12
+ # "scans" => [{
13
+ # "label"=>"task1",
14
+ # "dir"=>"s07_epi",
15
+ # "z_slices"=>36,
16
+ # "rep_time"=>2.0,
17
+ # "type"=>"func",
18
+ # "physio_files"=> {
19
+ # :phys_directory => "../cardiac", # Relative to rawdir
20
+ # :series_description => "EPI fMRI Task1",
21
+ # :respiration_signal => "RESPData_epiRT_0211201009_21_22_80",
22
+ # :respiration_trigger => "RESPTrig_epiRT_0211201009_21_22_80",
23
+ # :cardiac_signal => "PPGData_epiRT_0211201009_21_22_80",
24
+ # :cardiac_trigger => "PPGTrig_epiRT_0211201009_21_22_80"
25
+ # },
26
+ # "bold_reps"=>167,
27
+ # "task"=>"Faces3B"
28
+ # }]
29
+ # }
30
+ #
31
+ # workflow_spec = {
32
+ # "subid"=>"mrt00000",
33
+ # "rawdir"=> @runs_dir,
34
+ # "origdir"=> Dir.mktmpdir('orig_'),
35
+ # "procdir"=> Dir.mktmpdir('proc_'),
36
+ # "statsdir"=> Dir.mktmpdir('stats_'),
37
+ # "collision"=> "destroy"
38
+ # }
39
+ #
40
+ # @valid_physionoise_run_spec = [{
41
+ # :run_directory=> @runs_dir,
42
+ # :bold_reps=>167, :respiration_signal=>"RESPData_epiRT_0211201009_21_22_80",
43
+ # :respiration_trigger=>"RESPTrig_epiRT_0211201009_21_22_80",
44
+ # :cardiac_signal=>"PPGData_epiRT_0211201009_21_22_80",
45
+ # :cardiac_trigger=>"PPGTrig_epiRT_0211201009_21_22_80",
46
+ # :phys_directory=> File.join(@runs_dir, '..', 'cardiac'),
47
+ # :rep_time=>2.0,
48
+ # :series_description=>"EPI fMRI Task1"
49
+ # }]
50
+ #
51
+ # @recon_job = Reconstruction.new(workflow_spec, job_params)
52
+ # @scan_spec = @recon_job.scans.first
53
+ #
54
+ # @physionoise_fixture_dir = File.join(File.dirname(__FILE__), 'fixtures', 'physionoise_regressors')
55
+ #
56
+ # end
57
+ #
58
+ # it "should create physionoise regressors from Cardiac and Respiration Data" # do
59
+ # # Dir.chdir @recon_job.origdir do
60
+ # # @recon_job.create_physiosnoise_regressors(@scan_spec)
61
+ # # end
62
+ # #
63
+ # # Dir.compare_directories(@recon_job.origdir, @physionoise_fixture_dir).should be_true
64
+ #
65
+ # # end
66
+ #
67
+ # it "should correctly build a spec for passing to physionoise" # do
68
+ # # @recon_job.build_physionoise_run_spec(@scan_spec).should == @valid_physionoise_run_spec
69
+ # # end
70
+ #
71
+ # it "should correctly build a physionoise python command" # do
72
+ # # @valid_physionoise_run_spec.each do |run|
73
+ # # puts Physionoise.build_run_cmd(run)
74
+ # # end
75
+ # # end
76
+ #
77
+ # it "should build a 3dRetroicor string" # do
78
+ # # valid_cmd = "3dretroicor -prefix ptask1.nii -card #{@runs_dir}/../cardiac/PPGData_epiRT_0211201009_21_22_80 -resp #{@runs_dir}/../cardiac/RESPData_epiRT_0211201009_21_22_80 task1.nii"
79
+ # # valid_outfile = "p#{@scan_spec['label']}.nii"
80
+ # # test_cmd, test_outfile = @recon_job.build_retroicor_cmd(@scan_spec['physio_files'], "#{@scan_spec['label']}.nii")
81
+ # #
82
+ # # valid_cmd.should == test_cmd
83
+ # # valid_outfile.should == test_outfile
84
+ # # end
85
+ #
86
+ # it "should raise an error building a 3dRetroicor string if improperly configured" # do
87
+ # # physio_files = @scan_spec['physio_files']
88
+ # # physio_files.delete(:cardiac_signal)
89
+ # #
90
+ # # lambda {@recon_job.build_retroicor_cmd(physio_files, "#{@scan_spec['label']}.nii") }.should raise_error ScriptError, /Missing .* cardiac/
91
+ # # end
92
+ #
93
+ # it "should raise an IOError building a 3dRetroicor string with bad files"
94
+ #
95
+ # after(:each) do
96
+ # FileUtils.rm_r([@recon_job.origdir, @recon_job.procdir, @recon_job.statsdir])
97
+ # end
98
+ # end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rpipe
3
3
  version: !ruby/object:Gem::Version
4
- hash: 23
4
+ hash: 21
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
8
  - 1
9
- - 6
10
- version: 0.1.6
9
+ - 7
10
+ version: 0.1.7
11
11
  platform: ruby
12
12
  authors:
13
13
  - Kristopher Kosmatka
@@ -16,8 +16,7 @@ autorequire:
16
16
  bindir: bin
17
17
  cert_chain: []
18
18
 
19
- date: 2011-08-18 00:00:00 -05:00
20
- default_executable:
19
+ date: 2012-02-01 00:00:00 Z
21
20
  dependencies:
22
21
  - !ruby/object:Gem::Dependency
23
22
  name: thoughtbot-shoulda
@@ -34,9 +33,25 @@ dependencies:
34
33
  type: :development
35
34
  version_requirements: *id001
36
35
  - !ruby/object:Gem::Dependency
37
- name: metamri
36
+ name: rspec
38
37
  prerelease: false
39
38
  requirement: &id002 !ruby/object:Gem::Requirement
39
+ none: false
40
+ requirements:
41
+ - - ~>
42
+ - !ruby/object:Gem::Version
43
+ hash: 31
44
+ segments:
45
+ - 1
46
+ - 3
47
+ - 2
48
+ version: 1.3.2
49
+ type: :development
50
+ version_requirements: *id002
51
+ - !ruby/object:Gem::Dependency
52
+ name: metamri
53
+ prerelease: false
54
+ requirement: &id003 !ruby/object:Gem::Requirement
40
55
  none: false
41
56
  requirements:
42
57
  - - ~>
@@ -48,11 +63,11 @@ dependencies:
48
63
  - 9
49
64
  version: 0.2.9
50
65
  type: :runtime
51
- version_requirements: *id002
66
+ version_requirements: *id003
52
67
  - !ruby/object:Gem::Dependency
53
68
  name: log4r
54
69
  prerelease: false
55
- requirement: &id003 !ruby/object:Gem::Requirement
70
+ requirement: &id004 !ruby/object:Gem::Requirement
56
71
  none: false
57
72
  requirements:
58
73
  - - ~>
@@ -64,11 +79,11 @@ dependencies:
64
79
  - 9
65
80
  version: 1.1.9
66
81
  type: :runtime
67
- version_requirements: *id003
82
+ version_requirements: *id004
68
83
  - !ruby/object:Gem::Dependency
69
84
  name: POpen4
70
85
  prerelease: false
71
- requirement: &id004 !ruby/object:Gem::Requirement
86
+ requirement: &id005 !ruby/object:Gem::Requirement
72
87
  none: false
73
88
  requirements:
74
89
  - - ~>
@@ -80,11 +95,11 @@ dependencies:
80
95
  - 4
81
96
  version: 0.1.4
82
97
  type: :runtime
83
- version_requirements: *id004
98
+ version_requirements: *id005
84
99
  - !ruby/object:Gem::Dependency
85
100
  name: ruport
86
101
  prerelease: false
87
- requirement: &id005 !ruby/object:Gem::Requirement
102
+ requirement: &id006 !ruby/object:Gem::Requirement
88
103
  none: false
89
104
  requirements:
90
105
  - - ~>
@@ -96,7 +111,7 @@ dependencies:
96
111
  - 3
97
112
  version: 1.6.3
98
113
  type: :runtime
99
- version_requirements: *id005
114
+ version_requirements: *id006
100
115
  description: Functional MRI Processing Pipeline for the WADRC
101
116
  email: ekk@medicine.wisc.edu
102
117
  executables:
@@ -217,7 +232,6 @@ files:
217
232
  - test/test_rpipe.rb
218
233
  - vendor/output_catcher.rb
219
234
  - vendor/trollop.rb
220
- has_rdoc: true
221
235
  homepage: http://github.com/brainmap/rpipe
222
236
  licenses: []
223
237
 
@@ -247,7 +261,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
247
261
  requirements: []
248
262
 
249
263
  rubyforge_project:
250
- rubygems_version: 1.4.2
264
+ rubygems_version: 1.8.11
251
265
  signing_key:
252
266
  specification_version: 3
253
267
  summary: Neuroimaging preprocessing the Ruby way