brainmap-metamri 0.1.1

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.
@@ -0,0 +1,380 @@
1
+ require 'rubygems'
2
+ require 'pathname'
3
+ require 'tempfile'
4
+ require 'yaml'
5
+ require 'tmpdir'
6
+ require 'fileutils'
7
+ require 'raw_image_file'
8
+ require 'raw_image_dataset'
9
+ require 'sqlite3'
10
+
11
+
12
+ # A shared function that displays a message and the date/time to standard output.
13
+ def flash(msg)
14
+ puts
15
+ puts "+" * 120
16
+ printf "\t%s\n", msg
17
+ printf "\t%s\n", Time.now
18
+ puts "+" * 120
19
+ puts
20
+ end
21
+
22
+
23
+
24
+ =begin rdoc
25
+ Encapsulates a directory of data acquired during one participant visit. These
26
+ are the raw data directories that are transfered directly from the scanners and
27
+ archived in the raw data section of the vtrak filesystem. After initializing, the
28
+ visit can be scanned to extract metadata for all of the images acquired during the
29
+ visit. The scanning is done in a fairly naive manner: the visit directory is recursively
30
+ walked and in each subdirectory any and all pfiles will be imported in addition to one single
31
+ dicom if any exist. Thus, only a single dicom file among many in a scan session is used to
32
+ retrieve information. checking the individual files for data integrity must be handled
33
+ elsewhere if at all.
34
+ =end
35
+ class VisitRawDataDirectory
36
+ # The absolute path of the visit directory, as a string.
37
+ attr_reader :visit_directory
38
+ # An array of :RawImageDataset objects acquired during this visit.
39
+ attr_reader :datasets
40
+ # Timestamp for this visit, obtained from the first :RawImageDataset
41
+ attr_reader :timestamp
42
+ # RMR number for this visit.
43
+ attr_reader :rmr_number
44
+ # scan_procedure name
45
+ attr_reader :scan_procedure_name
46
+ # scanner source
47
+ attr_reader :scanner_source
48
+ attr_accessor :db
49
+
50
+ # A new Visit instance needs to know the path to its raw data and scan_procedure name. The scan_procedure
51
+ # name must match a name in the database, if not a new scan_procedure entry will be inserted.
52
+ def initialize(directory, scan_procedure_name=nil)
53
+ raise(IOError, "Visit directory not found: #{directory}") unless File.exist?(File.expand_path(directory))
54
+ @visit_directory = File.expand_path(directory)
55
+ @working_directory = Dir.tmpdir
56
+ @datasets = Array.new
57
+ @timestamp = nil
58
+ @rmr_number = nil
59
+ @scan_procedure_name = scan_procedure_name.nil? ? get_scan_procedure_based_on_raw_directory : scan_procedure_name
60
+ @db = nil
61
+ end
62
+
63
+ # Recursively walks the filesystem inside the visit directory. At each subdirectory, any and all
64
+ # pfiles are scanned and imported in addition to one and only one dicom file. After scanning
65
+ # @datasets will hold an array of ImageDataset instances. Setting the rmr here can raise an
66
+ # exception if no valid rmr is found in the datasets, be prepared to catch it.
67
+ def scan
68
+ flash "Scanning visit raw data directory #{@visit_directory}"
69
+ d = Pathname.new(@visit_directory)
70
+ d.each_subdirectory do |dd|
71
+ dd.each_pfile { |pf| @datasets << import_dataset(pf, dd) }
72
+ dd.first_dicom { |fd| @datasets << import_dataset(fd, dd) }
73
+ end
74
+ @timestamp = get_visit_timestamp
75
+ @rmr_number = get_rmr_number
76
+ @scanner_source = get_scanner_source
77
+ flash "Completed scanning #{@visit_directory}"
78
+ end
79
+
80
+ # use this to initialize Visit objects in the rails app
81
+ def attributes_for_active_record
82
+ {
83
+ :date => @timestamp.to_s,
84
+ :rmr => @rmr_number,
85
+ :path => @visit_directory,
86
+ :scanner_source => get_scanner_source
87
+ }
88
+ end
89
+
90
+ # Inserts each dataset in this visit into the specified database. The specifics
91
+ # of the database insert are handled by the #RawImageDataset class.
92
+ def db_insert!(db_file)
93
+ @db = SQLite3::Database.new(db_file)
94
+ @db.results_as_hash = true
95
+ @db.type_translation = true
96
+
97
+ begin
98
+ # checks scan_procedure in db, inserts if neccessary, returns id
99
+ scan_procedure_id = fetch_or_insert_scan_procedure
100
+
101
+ # insert or update visit as needed
102
+ if visit_is_new? # this is a new visit
103
+ visit_id = insert_new_visit(scan_procedure_id)
104
+ else # visit already exists in DB
105
+ visit_id = get_existing_visit_id
106
+ update_existing_visit(visit_id, scan_procedure_id)
107
+ end
108
+
109
+ # insert each dataset from the visit, also insert an entry in series descriptions table if necessary.
110
+ @datasets.each do |dataset|
111
+ update_series_descriptions_table(dataset.series_description)
112
+ if dataset_is_new?(dataset)
113
+ insert_new_dataset(dataset, visit_id)
114
+ else # dataset is already in DB
115
+ dataset_id = get_existing_dataset_id(dataset)
116
+ update_existing_dataset(dataset, dataset_id)
117
+ end
118
+ end
119
+ rescue Exception => e
120
+ puts e.message
121
+ ensure
122
+ @db.close
123
+ @db = nil
124
+ end
125
+ end
126
+
127
+ private
128
+
129
+ def get_existing_dataset_id(ds)
130
+ @db.execute(ds.db_fetch).first['id']
131
+ end
132
+
133
+ def update_existing_dataset(ds, ds_id)
134
+ @db.execute(ds.db_update(ds_id))
135
+ end
136
+
137
+ def insert_new_dataset(ds, v_id)
138
+ @db.execute(ds.db_insert(v_id))
139
+ end
140
+
141
+ def dataset_is_new?(ds)
142
+ @db.execute(ds.db_fetch).empty?
143
+ end
144
+
145
+ def visit_is_new?
146
+ @db.execute(sql_fetch_visit_matches).empty?
147
+ end
148
+
149
+ def update_series_descriptions_table(sd)
150
+ if @db.execute(sql_fetch_series_description(sd)).empty?
151
+ @db.execute(sql_insert_series_description(sd))
152
+ end
153
+ end
154
+
155
+ def insert_new_visit(p_id)
156
+ puts sql_insert_visit(p_id)
157
+ @db.execute(sql_insert_visit(p_id))
158
+ return @db.last_insert_row_id
159
+ end
160
+
161
+ def get_existing_visit_id
162
+ return @db.execute(sql_fetch_visit_matches).first['id']
163
+ end
164
+
165
+ def update_existing_visit(v_id, p_id)
166
+ puts sql_update_visit(v_id, p_id)
167
+ @db.execute(sql_update_visit(v_id, p_id))
168
+ end
169
+
170
+ def fetch_or_insert_scan_procedure
171
+ # if the scan_procedure already exists in db use it, if not insert a new one
172
+ scan_procedure_matches = @db.execute(sql_fetch_scan_procedure_name)
173
+ if scan_procedure_matches.empty?
174
+ @db.execute(sql_insert_scan_procedure)
175
+ new_scan_procedure_id = @db.last_insert_row_id
176
+ end
177
+ return scan_procedure_matches.empty? ? new_scan_procedure_id : scan_procedure_matches.first['id']
178
+ end
179
+
180
+ def sql_update_visit(v_id, p_id)
181
+ "UPDATE visits SET
182
+ date = '#{@timestamp.to_s}',
183
+ rmr = '#{@rmr_number}',
184
+ path = '#{@visit_directory}',
185
+ scan_procedure_id = '#{p_id.to_s}',
186
+ scanner_source = '#{@scanner_source}'
187
+ WHERE id = '#{v_id}'"
188
+ end
189
+
190
+ def sql_insert_scan_procedure
191
+ "INSERT INTO scan_procedures (codename) VALUES ('#{@scan_procedure_name}')"
192
+ end
193
+
194
+ def sql_insert_series_description(sd)
195
+ "INSERT INTO series_descriptions (long_description) VALUES ('#{sd}')"
196
+ end
197
+
198
+ def sql_fetch_visit_matches
199
+ "SELECT id FROM visits WHERE rmr == '#{@rmr_number}'"
200
+ end
201
+
202
+ def sql_fetch_scan_procedure_name
203
+ "SELECT * FROM scan_procedures WHERE codename = '#{@scan_procedure_name}'"
204
+ end
205
+
206
+ def sql_fetch_series_description(sd)
207
+ "SELECT * FROM series_descriptions WHERE long_description = '#{sd}'"
208
+ end
209
+
210
+ def sql_fetch_dataset_matches(ds)
211
+ "SELECT * FROM image_datasets WHERE rmr = '#{ds.rmr_number}' AND path = '#{ds.directory}' AND timestamp = '#{ds.timestamp}'"
212
+ end
213
+
214
+ # generates an sql insert statement to insert this visit with a given participant id
215
+ def sql_insert_visit(scan_procedure_id=0)
216
+ "INSERT INTO visits
217
+ (date, scan_procedure_id, scan_number, initials, rmr, radiology_outcome, notes, transfer_mri, transfer_pet,
218
+ transfer_behavioral_log, check_imaging, check_np, check_MR5_DVD, burn_DICOM_DVD, first_score, second_score,
219
+ enter_info_in_db, conference, compile_folder, dicom_dvd, user_id, path, scanner_source, created_at, updated_at)
220
+ VALUES
221
+ ('#{@timestamp.to_s}', '#{scan_procedure_id.to_s}', '', '', '#{@rmr_number}', 'no', '', 'no', 'no',
222
+ 'no', 'no', 'no', 'no', 'no', 'no', 'no', 'no', 'no', 'no', 'no', NULL, '#{@visit_directory}', #{@scanner_source}, '#{DateTime.now}', '#{DateTime.now}')"
223
+ end
224
+
225
+ def import_dataset(rawfile, original_parent_directory)
226
+ puts "Importing scan session: #{original_parent_directory.to_s} using raw data file: #{rawfile.basename}"
227
+ return RawImageDataset.new(original_parent_directory.to_s, [RawImageFile.new(rawfile.to_s)])
228
+ end
229
+
230
+ def get_visit_timestamp
231
+ (@datasets.sort_by { |ds| ds.timestamp }).first.timestamp
232
+ end
233
+
234
+ # retrieves a valid rmr number from the visit's collection of datasets. Some datasets out there
235
+ # have "rmr not found" set in the rmr_number attribute because their header info is incomplete.
236
+ # Throws an Exception if no valid rmr is found
237
+ def get_rmr_number
238
+ @datasets.each do |ds|
239
+ return ds.rmr_number unless ds.rmr_number == "rmr not found"
240
+ end
241
+ raise(IOError, "No valid RMR number was found for this visit")
242
+ end
243
+
244
+ # retrieves a scanner source from the collection of datasets, raises Exception of none is found
245
+ def get_scanner_source
246
+ @datasets.each do |ds|
247
+ return ds.scanner_source unless ds.scanner_source.nil?
248
+ end
249
+ raise(IOError, "No valid scanner source found for this visit")
250
+ end
251
+
252
+ def get_scan_procedure_based_on_raw_directory
253
+ case @visit_directory
254
+ when /alz_2000.*_2$/
255
+ return 'johnson.alz.visit2'
256
+ when /alz_2000.*_3$/
257
+ return 'johnson.alz.visit3'
258
+ when /alz_2000.alz...$/
259
+ return 'johnson.alz.visit1'
260
+ when /alz_2000/
261
+ return 'johnson.alz.unk.visit'
262
+
263
+ when /tbi_1000.*_2$/
264
+ return 'johnson.tbi-1000.visit2'
265
+ when /tbi_1000.*_3$/
266
+ return 'johnson.tbi-1000.visit3'
267
+ when /tbi_1000.tbi...$/
268
+ return 'johnson.tbi-1000.visit1'
269
+ when /tbi_1000/
270
+ return 'johnson.tbi-1000.unk.visit'
271
+
272
+ when /tbi_aware.*_2$/
273
+ return 'johnson.tbi-aware.visit2'
274
+ when /tbi_aware.*_3$/
275
+ return 'johnson.tbi-aware.visit3'
276
+ when /tbi_aware.tbi...$/
277
+ return 'johnson.tbi-aware.visit1'
278
+ when /tbi_aware/
279
+ return 'johnson.tbi-aware.unk.visit'
280
+
281
+ when /johnson.tbi-va.visit1/
282
+ return 'johnson.tbi-va.visit1'
283
+
284
+ when /pib_pilot_mri/
285
+ return 'johnson.pibmripilot.visit1.uwmr'
286
+
287
+ when /wrap140/
288
+ return 'johnson.wrap140.visit1'
289
+
290
+ when /cms.uwmr/
291
+ return 'johnson.cms.visit1.uwmr'
292
+ when /cms.wais/
293
+ return 'johnson.cms.visit1.wais'
294
+
295
+ when /esprit.9month/
296
+ return 'carlsson.esprit.visit2.9month'
297
+ when /esprit.baseline/
298
+ return 'carlsson.esprit.visit1.baseline'
299
+
300
+ when /gallagher_pd/
301
+ return 'gallagher.pd.visit1'
302
+
303
+ when /pc_4000/
304
+ return 'johnson.pc4000.visit1'
305
+
306
+ when /ries.aware.visit1/
307
+ return 'ries.aware.visit1'
308
+
309
+ else
310
+ return 'unknown.scan_procedure'
311
+ end
312
+ end
313
+
314
+ end
315
+
316
+
317
+
318
+
319
+
320
+ class Pathname
321
+ MIN_PFILE_SIZE = 10_000_000
322
+
323
+ def each_subdirectory
324
+ each_entry do |leaf|
325
+ next if leaf.to_s =~ /^\./
326
+ branch = self + leaf
327
+ next if not branch.directory?
328
+ next if branch.symlink?
329
+ branch.each_subdirectory { |subbranch| yield subbranch }
330
+ yield branch
331
+ end
332
+ end
333
+
334
+ def each_pfile(min_file_size = MIN_PFILE_SIZE)
335
+ entries.each do |leaf|
336
+ next unless leaf.to_s =~ /^P.*\.7|^P.*\.7\.bz2/
337
+ branch = self + leaf
338
+ next if branch.symlink?
339
+ if branch.size >= min_file_size
340
+ lc = branch.local_copy
341
+ begin
342
+ yield lc
343
+ rescue
344
+ # Do nothing
345
+ ensure
346
+ lc.delete
347
+ end
348
+ end
349
+ end
350
+ end
351
+
352
+ def first_dicom
353
+ entries.each do |leaf|
354
+ branch = self + leaf
355
+ if leaf.to_s =~ /^I\.|\.dcm(\.bz2)?$|\.0[0-9]+(\.bz2)?$/
356
+ lc = branch.local_copy
357
+ begin
358
+ yield lc
359
+ rescue
360
+ # Do nothing
361
+ ensure
362
+ lc.delete
363
+ end
364
+ return
365
+ end
366
+ end
367
+ end
368
+
369
+ def local_copy
370
+ tfbase = self.to_s =~ /\.bz2$/ ? self.basename.to_s.chomp(".bz2") : self.basename.to_s
371
+ tmpfile = File.join(Dir.tmpdir, tfbase)
372
+ if self.to_s =~ /\.bz2$/
373
+ `bunzip2 -k -c #{self.to_s} >> #{tmpfile}`
374
+ else
375
+ FileUtils.cp(self.to_s, tmpfile)
376
+ end
377
+ return Pathname.new(tmpfile)
378
+ end
379
+
380
+ end
data/metamri.gemspec ADDED
@@ -0,0 +1,33 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ Gem::Specification.new do |s|
4
+ s.name = %q{metamri}
5
+ s.version = "0.1.1"
6
+
7
+ s.required_rubygems_version = Gem::Requirement.new(">= 1.2") if s.respond_to? :required_rubygems_version=
8
+ s.authors = ["Kristopher J. Kosmatka"]
9
+ s.date = %q{2009-08-20}
10
+ s.description = %q{Extraction of MRI metadata and insertion into compatible sqlite3 databases.}
11
+ s.email = %q{kk4@medicine.wisc.edu}
12
+ s.executables = ["import_study.rb", "import_visit.rb"]
13
+ s.extra_rdoc_files = ["bin/import_study.rb", "bin/import_visit.rb", "lib/metamri.rb", "lib/mysql_tools.rb", "lib/raw_image_dataset.rb", "lib/raw_image_file.rb", "lib/series_description_parameters.rb", "lib/visit_raw_data_directory.rb", "README.rdoc"]
14
+ s.files = ["bin/import_study.rb", "bin/import_visit.rb", "lib/metamri.rb", "lib/mysql_tools.rb", "lib/raw_image_dataset.rb", "lib/raw_image_file.rb", "lib/series_description_parameters.rb", "lib/visit_raw_data_directory.rb", "Manifest", "Rakefile", "README.rdoc", "test/raw_image_dataset_test.rb", "test/raw_image_file_test.rb", "test/visit_duplication_test.rb", "test/visit_test.rb", "metamri.gemspec"]
15
+ s.has_rdoc = true
16
+ s.homepage = %q{http://github.com/brainmap/metamri}
17
+ s.rdoc_options = ["--line-numbers", "--inline-source", "--title", "Metamri", "--main", "README.rdoc"]
18
+ s.require_paths = ["lib"]
19
+ s.rubyforge_project = %q{metamri}
20
+ s.rubygems_version = %q{1.3.1}
21
+ s.summary = %q{Extraction of MRI metadata and insertion into compatible sqlite3 databases.}
22
+ s.test_files = ["test/raw_image_dataset_test.rb", "test/raw_image_file_test.rb", "test/visit_duplication_test.rb", "test/visit_test.rb"]
23
+
24
+ if s.respond_to? :specification_version then
25
+ current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
26
+ s.specification_version = 2
27
+
28
+ if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
29
+ else
30
+ end
31
+ else
32
+ end
33
+ end
@@ -0,0 +1,46 @@
1
+ # To change this template, choose Tools | Templates
2
+ # and open the template in the editor.
3
+
4
+ $:.unshift File.join(File.dirname(__FILE__),'..','lib')
5
+
6
+ require 'test/unit'
7
+ require 'raw_image_dataset'
8
+ require 'raw_image_file'
9
+
10
+ class RawImageDatasetTest < Test::Unit::TestCase
11
+ DBFILE = 'fixtures/development.sqlite3'
12
+
13
+ def setup
14
+ @aa = RawImageFile.new('fixtures/I.001')
15
+ @bb = RawImageFile.new('fixtures/P27648.7')
16
+ @cc = RawImageFile.new('fixtures/P59392.7')
17
+ @dd = RawImageFile.new('fixtures/S4_EFGRE3D.0001')
18
+ @dset = RawImageDataset.new('/Data/home/kris/NetBeansProjects/ImageData/test/fixtures', [@aa,@bb,@cc,@dd])
19
+ end
20
+
21
+ def test_raw_image_files
22
+ assert_equal 4, @dset.raw_image_files.length
23
+ assert_equal '"I.*"', @dset.glob
24
+ assert_equal "SAG T2 W FSE 1.7 skip 0.3", @dset.series_description
25
+ assert_equal "ALZMRI002", @dset.rmr_number
26
+ assert_equal "2003-01-31T04:39:04+00:00", @dset.timestamp.to_s
27
+ assert_equal "ALZMRI002::2003-01-31T04:39:04+00:00", @dset.dataset_key
28
+ assert_equal "DELETE FROM image_datasets WHERE dataset_key = 'ALZMRI002::2003-01-31T04:39:04+00:00'", @dset.db_remove
29
+ end
30
+
31
+ def test_db_insertion
32
+ assert_raise IndexError do
33
+ @dset.db_insert!(DBFILE)
34
+ @dset.db_insert!(DBFILE)
35
+ end
36
+ end
37
+
38
+ def test_raw_image_insertion
39
+ @dset.db_insert_raw_images!(DBFILE)
40
+ end
41
+
42
+ def teardown
43
+ @dset.db_remove_raw_images!(DBFILE)
44
+ @dset.db_remove!(DBFILE)
45
+ end
46
+ end
@@ -0,0 +1,135 @@
1
+ # To change this template, choose Tools | Templates
2
+ # and open the template in the editor.
3
+
4
+ $:.unshift File.join(File.dirname(__FILE__),'..','lib')
5
+
6
+ require 'test/unit'
7
+ require 'raw_image_file'
8
+
9
+ class RawImageFileTest < Test::Unit::TestCase
10
+ def setup
11
+ @GEDicom = 'fixtures/I.001'
12
+ @DiDicom = 'fixtures/S4_EFGRE3D.0001'
13
+ @EarlyGEPfile = 'fixtures/P59392.7'
14
+ @LateGEPfile = 'fixtures/P27648.7'
15
+ @notafile = 'fixtures/XXX.XXX'
16
+ @ged = RawImageFile.new(@GEDicom)
17
+ @did = RawImageFile.new(@DiDicom)
18
+ @egep = RawImageFile.new(@EarlyGEPfile)
19
+ @lgep = RawImageFile.new(@LateGEPfile)
20
+ end
21
+
22
+ def test_gehdr_dicom_init
23
+ assert_nothing_raised do
24
+ RawImageFile.new(@GEDicom)
25
+ end
26
+ end
27
+ def test_dicomhdr_dicom_init
28
+ assert_nothing_raised do
29
+ RawImageFile.new(@DiDicom)
30
+ end
31
+ end
32
+ def test_early_gehdr_pfile_init
33
+ assert_nothing_raised do
34
+ RawImageFile.new(@EarlyGEPfile)
35
+ end
36
+ end
37
+ def test_late_gehdr_pfile_init
38
+ assert_nothing_raised do
39
+ RawImageFile.new(@LateGEPfile)
40
+ end
41
+ end
42
+ def test_nonfile_init
43
+ assert_raise IOError do
44
+ RawImageFile.new(@notafile)
45
+ end
46
+ end
47
+ def test_pfile?
48
+ assert !@ged.pfile?
49
+ assert !@did.pfile?
50
+ assert @egep.pfile?
51
+ assert @lgep.pfile?
52
+ end
53
+ def test_dicom?
54
+ assert @ged.dicom?
55
+ assert @did.dicom?
56
+ assert !@egep.dicom?
57
+ assert !@lgep.dicom?
58
+ end
59
+ def test_gehdr_dicom_values
60
+ assert_equal "I.001", @ged.filename
61
+ assert_equal "rdgehdr", @ged.hdr_reader
62
+ assert_equal "dicom", @ged.file_type
63
+ assert_equal "2003-01-31T05:02:54+00:00", @ged.timestamp.to_s
64
+ assert_equal "Andys3T", @ged.source
65
+ assert_equal "ALZMRI002", @ged.rmr_number
66
+ assert_equal 1.7, @ged.slice_thickness
67
+ assert_equal 0.3, @ged.slice_spacing
68
+ assert_equal 240.0, @ged.reconstruction_diameter
69
+ assert_equal 256, @ged.acquisition_matrix_x
70
+ assert_equal 256, @ged.acquisition_matrix_y
71
+ assert_equal 9.0, @ged.rep_time
72
+ assert_equal 2, @ged.bold_reps
73
+ end
74
+ def test_dicomhdr_dicom_values
75
+ assert_equal "S4_EFGRE3D.0001", @did.filename
76
+ assert_equal "dicom_hdr", @did.hdr_reader
77
+ assert_equal "dicom", @did.file_type
78
+ assert_equal "2006-11-16T10:59:23+00:00", @did.timestamp.to_s
79
+ assert_equal "Andys3T", @did.source
80
+ assert_equal "RMRRF2267", @did.rmr_number
81
+ assert_equal 1.2, @did.slice_thickness
82
+ assert_equal 1.2, @did.slice_spacing
83
+ assert_equal 240.0, @did.reconstruction_diameter
84
+ assert_equal 256, @did.acquisition_matrix_x
85
+ assert_equal 256, @did.acquisition_matrix_y
86
+ assert_equal 8.364, @did.rep_time
87
+ assert_equal 0, @did.bold_reps
88
+ end
89
+ def test_early_pfile_values
90
+ assert_equal "P59392.7", @egep.filename
91
+ assert_equal "rdgehdr", @egep.hdr_reader
92
+ assert_equal "pfile", @egep.file_type
93
+ assert_equal "2003-01-31T04:39:04+00:00", @egep.timestamp.to_s
94
+ assert_equal "Andys3T", @egep.source
95
+ assert_equal "ALZMRI002", @egep.rmr_number
96
+ assert_equal 4.0, @egep.slice_thickness
97
+ assert_equal 1.0, @egep.slice_spacing
98
+ assert_equal 240.0, @egep.reconstruction_diameter
99
+ assert_equal 64, @egep.acquisition_matrix_x
100
+ assert_equal 64, @egep.acquisition_matrix_y
101
+ assert_equal 1.999996, @egep.rep_time
102
+ assert_equal 124, @egep.bold_reps
103
+ end
104
+ def test_late_pfile_values
105
+ assert_equal "P27648.7", @lgep.filename
106
+ assert_equal "rdgehdr", @lgep.hdr_reader
107
+ assert_equal "pfile", @lgep.file_type
108
+ assert_equal "2006-11-16T04:35:02+00:00", @lgep.timestamp.to_s
109
+ assert_equal "Andys3T", @lgep.source
110
+ assert_equal "RMRRF2267", @lgep.rmr_number
111
+ assert_equal 4.0, @lgep.slice_thickness
112
+ assert_equal 1.0, @lgep.slice_spacing
113
+ assert_equal 240.0, @lgep.reconstruction_diameter
114
+ assert_equal 64, @lgep.acquisition_matrix_x
115
+ assert_equal 64, @lgep.acquisition_matrix_y
116
+ assert_equal 2.000010, @lgep.rep_time
117
+ assert_equal 124, @lgep.bold_reps
118
+ end
119
+
120
+ def test_db_insert
121
+ @ged.db_insert!('fixtures/development.sqlite3')
122
+ @did.db_insert!('fixtures/development.sqlite3')
123
+ @egep.db_insert!('fixtures/development.sqlite3')
124
+ @lgep.db_insert!('fixtures/development.sqlite3')
125
+ end
126
+
127
+
128
+
129
+ def teardown
130
+ @ged.db_remove!('fixtures/development.sqlite3')
131
+ @did.db_remove!('fixtures/development.sqlite3')
132
+ @egep.db_remove!('fixtures/development.sqlite3')
133
+ @lgep.db_remove!('fixtures/development.sqlite3')
134
+ end
135
+ end
@@ -0,0 +1,24 @@
1
+ # To change this template, choose Tools | Templates
2
+ # and open the template in the editor.
3
+
4
+ $:.unshift File.join(File.dirname(__FILE__),'..','lib')
5
+
6
+ require 'test/unit'
7
+ require 'visit'
8
+ require 'pathname'
9
+
10
+
11
+ class RawImageFileTest < Test::Unit::TestCase
12
+ DBFILE = '/Data/home/kris/TextMateProjects/TransferScans/db/development.sqlite3'
13
+
14
+ def setup
15
+ # DO NOTHING
16
+ end
17
+
18
+ def test_scan_and_insert
19
+ @v = Visit.new( '/Data/vtrak1/raw/alz_2000/alz093', 'ALZ' )
20
+ @v.scan
21
+ @v.init_db(DBFILE)
22
+ @v.db_insert!
23
+ end
24
+ end
@@ -0,0 +1,77 @@
1
+ # To change this template, choose Tools | Templates
2
+ # and open the template in the editor.
3
+
4
+ $:.unshift File.join(File.dirname(__FILE__),'..','lib')
5
+
6
+ require 'test/unit'
7
+ require 'visit_raw_data_directory'
8
+ require 'pathname'
9
+ require 'logger'
10
+
11
+ class RawImageFileTest < Test::Unit::TestCase
12
+ DBFILE = '/Users/kris/projects/TransferScans/db/development.sqlite3'
13
+ LOG = Logger.new('visit_test.log', shift_age = 7, shift_size = 1048576)
14
+ STUDIES = [
15
+ # Pathname.new('/Data/vtrak1/raw/alz_2000'),
16
+ # Pathname.new('/Data/vtrak1/raw/alz_2000'),
17
+ # Pathname.new('/Data/vtrak1/raw/pib_pilot_mri'),
18
+ # Pathname.new('/Data/vtrak1/raw/johnson.tbi-va.visit1'),
19
+ # Pathname.new('/Data/vtrak1/raw/wrap140'),
20
+ Pathname.new('/Data/vtrak1/raw/cms/uwmr'),
21
+ Pathname.new('/Data/vtrak1/raw/cms/wais'),
22
+ Pathname.new('/Data/vtrak1/raw/esprit/9month'),
23
+ Pathname.new('/Data/vtrak1/raw/esprit/baseline')
24
+ # Pathname.new('/Data/vtrak1/raw/gallagher_pd'),
25
+ # Pathname.new('/Data/vtrak1/raw/pc_4000'),
26
+ # Pathname.new('/Data/vtrak1/raw/ries.aware.visit1'),
27
+ # Pathname.new('/Data/vtrak1/raw/tbi_1000'),
28
+ # Pathname.new('/Data/vtrak1/raw/tbi_aware')
29
+ ]
30
+ FILTERS = [
31
+ # /^alz...$/,
32
+ # /^alz..._[2AB]$/,
33
+ # /^3..._/,
34
+ # /^tbi/,
35
+ # /^25/,
36
+ /^cms_...$/,
37
+ /^pc...$/,
38
+ /^3.._/,
39
+ /^3.._/
40
+ # /^pd..._/,
41
+ # /^pc...$/,
42
+ # /^awr.*\d$/,
43
+ # /^tbi...$|^tbi..._2$/,
44
+ # /^tbi..._3$/
45
+ ]
46
+ PROTOCOLS = ['ALZ_visit1','ALZ_visit2','PIB_PILOT','TBI_VA','WRAP140','CMS_UWMR','CMS_WAIS','ESPRIT_9month',
47
+ 'ESPRIT_baseline','gallagher_pd','pc_4000','ries.aware.visit1','tbi_1000','tbi_aware']
48
+
49
+ def setup
50
+ # DO NOTHING
51
+ end
52
+
53
+ def test_scan_and_insert
54
+ STUDIES.each_with_index do |study, i|
55
+ filter = FILTERS[i]
56
+ protocol = PROTOCOLS[i]
57
+ study.entries.each do |visit|
58
+ next if visit.to_s =~ /^\./
59
+ next unless visit.to_s =~ filter
60
+ visitdir = study + visit
61
+ v = VisitRawDataDirectory.new( visitdir.to_s )
62
+ begin
63
+ v.scan
64
+ v.db_insert!(DBFILE)
65
+ rescue Exception => e
66
+ puts "There was a problem scanning a dataset in #{visitdir}... skipping."
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}"
70
+ ensure
71
+ v = nil
72
+ end
73
+ end
74
+ end
75
+ end
76
+
77
+ end