mspire 0.7.18 → 0.8.0

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.
Files changed (58) hide show
  1. data/VERSION +1 -1
  2. data/bin/mspire +5 -0
  3. data/lib/core_ext/enumerable.rb +8 -0
  4. data/lib/mspire/commandline.rb +39 -0
  5. data/lib/mspire/cv/paramable.rb +72 -35
  6. data/lib/mspire/imzml/writer/commandline.rb +16 -7
  7. data/lib/mspire/imzml/writer.rb +22 -14
  8. data/lib/mspire/mzml/activation.rb +0 -5
  9. data/lib/mspire/mzml/chromatogram.rb +41 -6
  10. data/lib/mspire/mzml/chromatogram_list.rb +2 -19
  11. data/lib/mspire/mzml/component.rb +28 -4
  12. data/lib/mspire/mzml/cv.rb +1 -0
  13. data/lib/mspire/mzml/data_array.rb +164 -154
  14. data/lib/mspire/mzml/data_array_container_like.rb +6 -13
  15. data/lib/mspire/mzml/data_processing.rb +19 -5
  16. data/lib/mspire/mzml/file_description.rb +22 -4
  17. data/lib/mspire/mzml/index.rb +53 -0
  18. data/lib/mspire/mzml/index_list.rb +64 -55
  19. data/lib/mspire/mzml/instrument_configuration.rb +22 -7
  20. data/lib/mspire/mzml/io_index.rb +79 -0
  21. data/lib/mspire/mzml/io_indexable_list.rb +71 -0
  22. data/lib/mspire/mzml/isolation_window.rb +0 -5
  23. data/lib/mspire/mzml/parser.rb +10 -0
  24. data/lib/mspire/mzml/plms1.rb +14 -24
  25. data/lib/mspire/mzml/precursor.rb +41 -19
  26. data/lib/mspire/mzml/processing_method.rb +34 -7
  27. data/lib/mspire/mzml/product.rb +14 -1
  28. data/lib/mspire/mzml/reader.rb +154 -0
  29. data/lib/mspire/mzml/referenceable_param_group.rb +9 -2
  30. data/lib/mspire/mzml/run.rb +62 -5
  31. data/lib/mspire/mzml/sample.rb +16 -6
  32. data/lib/mspire/mzml/scan.rb +31 -16
  33. data/lib/mspire/mzml/scan_list.rb +18 -5
  34. data/lib/mspire/mzml/scan_settings.rb +4 -5
  35. data/lib/mspire/mzml/scan_window.rb +0 -6
  36. data/lib/mspire/mzml/selected_ion.rb +1 -8
  37. data/lib/mspire/mzml/software.rb +9 -4
  38. data/lib/mspire/mzml/source_file.rb +8 -4
  39. data/lib/mspire/mzml/spectrum.rb +60 -35
  40. data/lib/mspire/mzml/spectrum_list.rb +5 -34
  41. data/lib/mspire/mzml.rb +72 -210
  42. data/lib/mspire/plms1.rb +3 -0
  43. data/spec/mspire/cv/paramable_spec.rb +3 -3
  44. data/spec/mspire/mzml/data_array_spec.rb +19 -6
  45. data/spec/mspire/mzml/file_content_spec.rb +1 -4
  46. data/spec/mspire/mzml/index_list_spec.rb +5 -12
  47. data/spec/mspire/mzml/plms1_spec.rb +5 -9
  48. data/spec/mspire/mzml/referenceable_param_group_spec.rb +3 -3
  49. data/spec/mspire/mzml/source_file_spec.rb +1 -2
  50. data/spec/mspire/mzml/spectrum_list_spec.rb +54 -0
  51. data/spec/mspire/mzml/spectrum_spec.rb +2 -4
  52. data/spec/mspire/mzml_spec.rb +241 -21
  53. data/spec/spec_helper.rb +1 -0
  54. data/spec/testfiles/mspire/mzml/1_BB7_SIM_478.5.mzML +103 -0
  55. data/spec/testfiles/mspire/mzml/j24z.idx_comp.3.mzML +6 -6
  56. metadata +14 -6
  57. data/bin/mzml_to_imzml +0 -9
  58. data/spec/mspire/mzml/file_description_spec.rb +0 -12
data/lib/mspire/mzml.rb CHANGED
@@ -1,25 +1,12 @@
1
+
2
+ # TODO: trim down these require statements to only include upper level
1
3
  require 'mspire'
2
4
  require 'builder'
3
- require 'nokogiri'
4
- require 'io/bookmark'
5
- require 'zlib'
6
- require 'mspire/mzml/index_list'
7
- require 'mspire/mzml/spectrum'
8
- require 'mspire/mzml/file_description'
9
- require 'mspire/mzml/software'
10
- require 'mspire/mzml/scan_list'
11
- require 'mspire/mzml/selected_ion'
12
- require 'mspire/mzml/scan'
5
+ require 'core_ext/enumerable'
6
+
7
+ require 'mspire/mzml/reader'
8
+
13
9
  require 'mspire/mzml/scan_settings'
14
- require 'mspire/mzml/processing_method'
15
- require 'mspire/mzml/run'
16
- require 'mspire/mzml/spectrum_list'
17
- require 'mspire/mzml/chromatogram_list'
18
- require 'mspire/mzml/instrument_configuration'
19
- require 'mspire/mzml/data_processing'
20
- require 'mspire/mzml/referenceable_param_group'
21
- require 'mspire/mzml/cv'
22
- require 'mspire/mzml/sample'
23
10
 
24
11
  module Mspire
25
12
  # Reading an mzml file:
@@ -42,7 +29,8 @@ module Mspire
42
29
  #
43
30
  # Writing an mzml file from scratch:
44
31
  #
45
- # spec1 = Mspire::Mzml::Spectrum.new('scan=1', params: ['MS:1000127', ['MS:1000511', 1]]) do |spec|
32
+ # spec1 = Mspire::Mzml::Spectrum.new('scan=1') do |spec|
33
+ # spec.describe_many! ['MS:1000127', ['MS:1000511', 1]]
46
34
  # spec.data_arrays = [[1,2,3], [4,5,6]]
47
35
  # spec.scan_list = Mspire::Mzml::ScanList.new do |sl|
48
36
  # scan = Mspire::Mzml::Scan.new do |scan|
@@ -60,7 +48,8 @@ module Mspire
60
48
  # fd.file_content = Mspire::Mzml::FileContent.new
61
49
  # fd.source_files << Mspire::Mzml::SourceFile.new
62
50
  # end
63
- # default_instrument_config = Mspire::Mzml::InstrumentConfiguration.new("IC",[], params: ['MS:1000031'])
51
+ # default_instrument_config = Mspire::Mzml::InstrumentConfiguration.new("IC",[])
52
+ # default_instrument_config.describe! 'MS:1000031'
64
53
  # mzml.instrument_configurations << default_instrument_config
65
54
  # software = Mspire::Mzml::Software.new
66
55
  # mzml.software_list << software
@@ -73,6 +62,23 @@ module Mspire
73
62
  # end
74
63
  # end
75
64
  class Mzml
65
+ include Enumerable # each_spectrum
66
+
67
+ class << self
68
+ # read-only right now
69
+ def open(filename, &block)
70
+ File.open(filename) do |io|
71
+ block.call(self.new(io))
72
+ end
73
+ end
74
+
75
+ def foreach(filename, &block)
76
+ block or return enum_for(__method__, filename)
77
+ open(filename) do |mzml|
78
+ mzml.each(&block)
79
+ end
80
+ end
81
+ end
76
82
 
77
83
  module Default
78
84
  NAMESPACE = {
@@ -128,15 +134,17 @@ module Mspire
128
134
  # (required) an Mspire::Mzml::Run object
129
135
  attr_accessor :run
130
136
 
131
- module Parser
132
- NOBLANKS = ::Nokogiri::XML::ParseOptions::DEFAULT_XML | ::Nokogiri::XML::ParseOptions::NOBLANKS
133
- end
134
- include Enumerable
135
-
137
+ # the io object of the mzml file
136
138
  attr_accessor :io
139
+
140
+ # Mspire::Mzml::IndexList object associated with the file (only expected when reading
141
+ # mzml files at the moment)
137
142
  attr_accessor :index_list
143
+
144
+ # xml file encoding
138
145
  attr_accessor :encoding
139
146
 
147
+
140
148
  # arg must be an IO object for automatic index and header parsing to
141
149
  # occur. If arg is a hash, then attributes are set. In addition (or
142
150
  # alternatively) a block called that yields self to setup the object.
@@ -145,211 +153,65 @@ module Mspire
145
153
  # which allows seeking. get_index_list is called to get or create the
146
154
  # index list.
147
155
  def initialize(arg=nil, &block)
148
- %w(cvs software_list instrument_configurations data_processing_list).each {|guy| self.send( guy + '=', [] ) }
156
+ %w(cvs software_list instrument_configurations samples data_processing_list).each {|guy| self.send( guy + '=', [] ) }
149
157
 
150
158
  case arg
151
159
  when IO
152
- @io = arg
153
- begin
154
- @encoding = @io.bookmark(true) {|io| io.readline.match(/encoding=["'](.*?)["']/)[1] }
155
- rescue EOFError
156
- raise RuntimeError, "no encoding present in XML! (Is this even an xml file?)"
157
- end
158
- @index_list = get_index_list
159
- read_header!
160
+ set_from_xml_io!(arg)
160
161
  when Hash
161
162
  arg.each {|k,v| self.send("#{k}=", v) }
162
163
  end
163
- if block
164
- block.call(self)
165
- end
164
+ block.call(self) if block
166
165
  end
167
166
 
168
- def read_header!
169
- @io.rewind
170
- chunk_size = 2**12
171
- loc = 0
172
- string = ''
173
- while chunk = @io.read(chunk_size)
174
- string << chunk
175
- start_looking = ((loc-20) < 0) ? 0 : (loc-20)
176
- break if string[start_looking..-1] =~ /<(spectrum|chromatogram)/
177
- loc += chunk_size
167
+ module Convenience
168
+ def each_chromatogram(&block)
169
+ @run.chromatogram_list.each(&block)
178
170
  end
179
- doc = Nokogiri::XML.parse(string, nil, @encoding, Parser::NOBLANKS)
180
- mzml_n = doc.root
181
- if mzml_n.name == 'indexedmzML'
182
- mzml_n = mzml_n.child
183
- end
184
- cv_list_n = mzml_n.child
185
- file_description_n = cv_list_n.next
186
- self.cvs = cv_list_n.children.map do |cv_n|
187
- Mspire::Mzml::CV.from_xml(cv_n)
188
- end
189
- self.file_description = Mspire::Mzml::FileDescription.from_xml(file_description_n)
190
- next_n = file_description_n.next
191
- loop do
192
- case next_n.name
193
- when 'referenceableParamGroupList'
194
- # get a hash ready
195
- when 'sampleList'
196
- # set objects
197
- when 'softwareList' # required
198
- # set objects
199
- when 'instrumentConfigurationList'
200
- # set objects
201
- when 'dataProcessingList'
202
- # set objects
203
- when 'run'
204
- # get defaults ready
205
- break
206
- end
207
- next_n = next_n.next
208
- end
209
- end
210
-
211
- class << self
212
171
 
213
- # read-only right now
214
- def open(filename, &block)
215
- File.open(filename) do |io|
216
- block.call(self.new(io))
217
- end
172
+ def each_spectrum(&block)
173
+ @run.spectrum_list.each(&block)
218
174
  end
219
175
 
220
- def foreach(filename, &block)
221
- block or return enum_for(__method__, filename)
222
- open(filename) do |mzml|
223
- mzml.each(&block)
224
- end
225
- end
226
- end
176
+ alias_method :each, :each_spectrum
227
177
 
228
- # name can be :spectrum or :chromatogram
229
- def get_xml_string(start_byte, name=:spectrum)
230
- io.seek(start_byte)
231
- data = []
232
- regexp = %r{</#{name}>}
233
- io.each_line do |line|
234
- data << line
235
- #unless (line.index('<binary') && line[-12..-1].include?('</binary>'))
236
- break if regexp.match(line)
237
- #end
178
+ # @param [Object] arg an index number (Integer) or id string (String)
179
+ # @return [Mspire::Mzml::Spectrum] a spectrum object
180
+ def spectrum(arg)
181
+ run.spectrum_list[arg]
238
182
  end
239
- data.join
240
- end
183
+ alias_method :'[]', :spectrum
241
184
 
242
- def each_spectrum(&block)
243
- block or return enum_for(__method__)
244
- (0...@index_list[:spectrum].size).each do |int|
245
- block.call(spectrum(int))
185
+ # @param [Object] arg an index number (Integer) or id string (String)
186
+ # @return [Mspire::Mzml::Chromatogram] a spectrum object
187
+ def chromatogram(arg)
188
+ run.chromatogram_list[arg]
246
189
  end
247
- #block_given? or return enum_for(__method__)
248
- #(0...@index_list[:spectrum].size).each do |int|
249
- # yield spectrum(int)
250
- #end
251
- end
252
190
 
253
- # returns the Nokogiri::XML::Node object associated with each spectrum
254
- def each_spectrum_node(&block)
255
- @index_list[:spectrum].each do |start_byte|
256
- block.call spectrum_node_from_start_byte(start_byte)
191
+ def num_chromatograms
192
+ run.chromatogram_list.size
257
193
  end
258
- end
259
-
260
- alias_method :each, :each_spectrum
261
-
262
- # returns the nokogiri xml node for the spectrum at that index
263
- def spectrum_node(index)
264
- spectrum_node_from_start_byte(@index_list[:spectrum][index])
265
- end
266
194
 
267
- def spectrum_node_from_start_byte(start_byte)
268
- xml = get_xml_string(start_byte, :spectrum)
269
- doc = Nokogiri::XML.parse(xml, nil, @encoding, Parser::NOBLANKS)
270
- doc.root
271
- end
272
-
273
- # @param [Object] arg an index number (Integer) or id string (String)
274
- # @return [Mspire::Spectrum] a spectrum object
275
- def spectrum(arg)
276
- start_byte = index_list[0].start_byte(arg)
277
- spec_n = spectrum_node_from_start_byte(start_byte)
278
- Mspire::Mzml::Spectrum.from_xml(spec_n)
279
- end
280
-
281
- # returns the number of spectra
282
- def size
283
- @index_list[:spectrum].size
284
- end
285
-
286
- alias_method :'[]', :spectrum
287
-
288
- # @param [Integer] scan_num the scan number
289
- # @return [Mspire::Spectrum] a spectrum object, or nil if not found
290
- # @raise [ScanNumbersNotUnique] if scan numbers are not unique
291
- # @raise [ScanNumbersNotFound] if spectra exist but scan numbers were not
292
- # found
293
- def spectrum_from_scan_num(scan_num)
294
- @scan_to_index ||= @index_list[0].create_scan_index
295
- raise ScanNumbersNotUnique if @scan_to_index == false
296
- raise ScanNumbersNotFound if @scan_to_index == nil
297
- spectrum(@scan_to_index[scan_num])
298
- end
299
-
300
- # @return [Mspire::Mzml::IndexList] or nil if there is no indexList in the
301
- # mzML
302
- def read_index_list
303
- if offset=Mspire::Mzml::Index.index_offset(@io)
304
- @io.seek(offset)
305
- xml = Nokogiri::XML.parse(@io.read, nil, @encoding, Parser::NOBLANKS)
306
- index_list = xml.root
307
- num_indices = index_list['count'].to_i
308
- array = index_list.children.map do |index_n|
309
- #index = Index.new(index_n['name'])
310
- index = Index.new
311
- index.name = index_n['name'].to_sym
312
- ids = []
313
- index_n.children.map do |offset_n|
314
- index << offset_n.text.to_i
315
- ids << offset_n['idRef']
316
- end
317
- index.ids = ids
318
- index
319
- end
320
- IndexList.new(array)
321
- end
322
- end
323
- # Reads through and captures start bytes
324
- # @return [Mspire::Mzml::IndexList]
325
- def create_index_list
326
- indices_hash = @io.bookmark(true) do |inner_io| # sets to beginning of file
327
- indices = {:spectrum => {}, :chromatogram => {}}
328
- byte_total = 0
329
- @io.each do |line|
330
- if md=%r{<(spectrum|chromatogram).*?id=['"](.*?)['"][ >]}.match(line)
331
- indices[md[1].to_sym][md[2]] = byte_total + md.pre_match.bytesize
332
- end
333
- byte_total += line.bytesize
334
- end
335
- indices
195
+ # returns the number of spectra
196
+ def length
197
+ run.spectrum_list.size
336
198
  end
337
-
338
- indices = indices_hash.map do |sym, hash|
339
- indices = Index.new ; ids = []
340
- hash.each {|id, startbyte| ids << id ; indices << startbyte }
341
- indices.ids = ids ; indices.name = sym
342
- indices
199
+ alias_method :size, :length
200
+
201
+ # @param [Integer] scan_num the scan number
202
+ # @return [Mspire::Spectrum] a spectrum object, or nil if not found
203
+ # @raise [ScanNumbersNotUnique] if scan numbers are not unique
204
+ # @raise [ScanNumbersNotFound] if spectra exist but scan numbers were not
205
+ # found
206
+ def spectrum_from_scan_num(scan_num)
207
+ @scan_to_index ||= @index_list[0].create_scan_index
208
+ raise ScanNumbersNotUnique if @scan_to_index == false
209
+ raise ScanNumbersNotFound if @scan_to_index == nil
210
+ spectrum(@scan_to_index[scan_num])
343
211
  end
344
- IndexList.new(indices)
345
- end
346
-
347
- # reads or creates an index list
348
- # @return [Array] an array of indices
349
- def get_index_list
350
- read_index_list || create_index_list
351
212
  end
352
-
213
+ include Convenience
214
+
353
215
  # Because mzml files are often very large, we try to avoid storing the
354
216
  # entire object tree in memory before writing.
355
217
  #
@@ -374,7 +236,7 @@ module Mspire
374
236
  if @referenceable_param_groups
375
237
  Mspire::Mzml::ReferenceableParamGroup.list_xml(@referenceable_param_groups, mzml_n)
376
238
  end
377
- if @samples
239
+ if @samples && @samples.size > 0
378
240
  Mspire::Mzml::Sample.list_xml(@samples, mzml_n)
379
241
  end
380
242
  Mspire::Mzml::Software.list_xml(@software_list, mzml_n)
data/lib/mspire/plms1.rb CHANGED
@@ -118,6 +118,9 @@ module Mspire
118
118
  out.puts scan_numbers.join(' ')
119
119
  out.puts times.join(' ')
120
120
  spectra.each do |spectrum|
121
+ puts "HIAYDSFA DSF"
122
+ puts spectrum.class
123
+ p spectrum
121
124
  out.puts spectrum.size
122
125
  if spectrum.size > 0
123
126
  out.puts spectrum.mzs.size
@@ -5,16 +5,16 @@ require 'mspire/cv/param'
5
5
  require 'mspire/user_param'
6
6
  require 'mspire/mzml/referenceable_param_group'
7
7
 
8
- class MockObject
8
+ class ParamableObject
9
9
  include Mspire::CV::Paramable
10
10
  end
11
11
 
12
12
  describe 'Mspire::CV::Paramable' do
13
13
 
14
14
  subject do
15
- paramable = MockObject.new :params => ['MS:1000007', ['MS:1000511', 2]]
15
+ paramable = ParamableObject.new.describe_many!(['MS:1000007', ['MS:1000511', 2]])
16
16
  paramable.user_params << Mspire::UserParam.new('hello', 477)
17
- paramable.ref_param_groups << Mspire::Mzml::ReferenceableParamGroup.new('id1', :params => [['MS:1000512', 'filter string']])
17
+ paramable.ref_param_groups << Mspire::Mzml::ReferenceableParamGroup.new('id1').describe!('MS:1000512', 'filter string')
18
18
  paramable
19
19
  end
20
20
 
@@ -1,16 +1,29 @@
1
1
  require 'spec_helper'
2
2
 
3
+ require 'nokogiri'
4
+ require 'mspire/mzml/parser'
5
+
3
6
  require 'mspire/mzml/data_array'
4
7
 
5
8
  describe Mspire::Mzml::DataArray do
6
9
 
7
- it 'can be created from base64 binary data' do
8
- d_ar = Mspire::Mzml::DataArray.from_binary('eJxjYACBD/YMEOAAoTgcABe3Abg=', :float64, zlib=true)
9
- d_ar.is_a?(Array)
10
- d_ar.should == [1.0, 2.0, 3.0]
11
- d_ar = Mspire::Mzml::DataArray.from_binary('eJxjYACBD/YMEOAAoTgcABe3Abg=', ['MS:1000523', 'MS:1000574'])
10
+ let(:xml_node) do
11
+ string = %Q{<binaryDataArray encodedLength="1588">
12
+ <cvParam cvRef="MS" accession="MS:1000523" name="64-bit float" value=""/>
13
+ <cvParam cvRef="MS" accession="MS:1000574" name="zlib compression" value=""/>
14
+ <cvParam cvRef="MS" accession="MS:1000514" name="m/z array" value="" unitCvRef="MS" unitAccession="MS:1000040" unitName="m/z"/>
15
+ <binary>eJwt0X1MVXUcBvADykoZOi8wFYf9BBFypKi3WWByEi+VMgsFVhhyQtTkomTImyicuLfEq2WG4FvSaQoS2lYCMd7sUIGKtiZXfEnDg8jVFjnjxWkpaz6Pf332PN/v+Z6zeyVJEh0jKbIkSXK+vhpmO1Jh1Iw1TzQeVkO11QWl7si1cHsfNHIC1z1RtERDKX4tdVRD/d3I95EDkqEadhfqpsD1eD54XRq0VVLf01CyuZjHvWHF/r00KCruQG2kOh19XcIG3L2mQ/nBuo3ojWKoplcxL79Ne5Mz0P/QRiNGf4D3hcyB8r1lUNnqtgnvme8Npa12qLtKoNHZDkWzi33IMPfKPD7E3Xu+UIpJgKKjiDqO0IzRmXif1RsqicHQqJpLwy1QDc+GelAN952X2d8f5t4Vt82415AK9aZMqOzuokV/QmPhQyi1z8uCVfFZ/H4FapPyoZpUwZzYBfWp7tn8nXygUhgF5cjlzCPJUIrNhPr+Ss4P1ELNo43z25ehcLvJPPSA+5dMOdgfmA6ltMVQeK6C+p4szhfbOZ/dzv6kExov9nK/6DHnw/656P8wQ/W9OOYhO9SKK6DU3QrlOz305wdQnDfl4f6UWCjXpkDDkQ2VwJ30Qmkef8cjUPOr5/6FVs71PihKH/Hetpgt2Nv4DpR61kNxMwuq+xzQyKuC+ux67rd0Qrm3m/nXQT6/Y0w+bPCGan0wlKeZoXjlNc6fi2e2WqHinkMTHewt+6G28ig0QurYR7bx7oxuqP/9mHt7p27ld4ZRPQqKxhV0osLeP4f5JQdN2QflpEqoJTRD5e5vnBtXoX7jFt0+wHnJqG3YnxYBxeDrzLvSoD6cxTy+CMo5B6Cx6hh11bMfex8qBeMKcGdBBjQ8vqLuDVBp8ymEodOhPstCi9dAzWWjllIotxx9qhOKw8Pcf95bRX9wMjROT6VnotkrsVAvX80+0cpcl898yE6PHoSK+WtmUyWU5BNQ2/wX5wGDzBbvj/C/LfKDxpshUNTMpZ0LOZ+zBMpVb0N9cjLn31vZX93E57/Mg4qws6/4jHlPJffTjz/ta6m1kaY5oXTuCu84bvO5Fr8iPNf+ApQCFkFtYAnt2gCNgM2ciwqoVp7g/HAN+29+4Z3oDqg/ckLF6zr3dvfzzndjbfgeX18b/xd/KHlOt/F3ioBavIW++hZUYnNpYyH7VQ7moDK6oJx9TQPvhHTwPZ5OKBL6+Z7qIe6fGIGG6Vk7vmOMD1TGT4PymdlQk+ez94/jXslK9iYrVL3y2ScXQSPoCPOMRii2nKNev9PcPvr5AH151Me4U+wFjVA/qJUr1NMORdkxzsMaodRzFioFnZyvuMX+5DDUs82fYH7JAo24pVDrWkH/TYJir417X/xE559n730RykHX+Xx5L/PMfqhO8NuO9yWEQuOGGcqzopgvLoeaM5E5ycr5pONQUZvoqTbueXRC0X+Nd38cgvqpgGLk1FA60QyVwHDmJBvU/imGormX8zFTdkBTDJXioLY0EYr/UqHxjIseug/VuTEO7B22QmHOpk12eraJzmzfyXweShPm7UIeWQY1n2+hkhL3qfw/0zSmlA==</binary>
16
+ </binaryDataArray>}
17
+ Nokogiri::XML.parse(string, nil, 'utf-8', Mspire::Mzml::Parser::NOBLANKS).root
18
+ end
19
+
20
+ it 'can be created from base64 binary xml' do
21
+ d_ar = Mspire::Mzml::DataArray.from_xml(xml_node, {})
12
22
  d_ar.is_a?(Array)
13
- d_ar.should == [1.0, 2.0, 3.0]
23
+ # these are just frozen
24
+ d_ar.size.should == 315
25
+ d_ar.first.round(3).should == 151.962
26
+ d_ar.last.round(3).should == 938.548
14
27
  end
15
28
 
16
29
  it "can be initialized like any ol' array" do
@@ -6,7 +6,7 @@ require 'mspire/mzml/file_content'
6
6
  describe Mspire::Mzml::FileContent do
7
7
 
8
8
  it 'can be initialized with params' do
9
- filecontent = Mspire::Mzml::FileContent.new(:params => ['MS:1000579', ['IMS:1000080', "{9D501BDC-5344-4916-B7E9-7E795B02C856}"]])
9
+ filecontent = Mspire::Mzml::FileContent.new.describe_many!(['MS:1000579', ['IMS:1000080', "{9D501BDC-5344-4916-B7E9-7E795B02C856}"]])
10
10
 
11
11
  desc = filecontent.params
12
12
  desc.size.should == 2
@@ -18,9 +18,6 @@ describe Mspire::Mzml::FileContent do
18
18
  xml.should match(regexp)
19
19
  end
20
20
  end
21
-
22
- it 'can be created from xml'
23
-
24
21
  end
25
22
 
26
23
 
@@ -1,7 +1,6 @@
1
1
  require 'spec_helper'
2
2
 
3
- require 'mspire/mzml'
4
- require 'mspire/mzml/index_list'
3
+ require 'mspire/mzml' # require index and index_list
5
4
 
6
5
  describe 'non-indexed uncompressed peaks, mzML file' do
7
6
  subject { TESTFILES + "/mspire/mzml/openms.noidx_nocomp.12.mzML" }
@@ -26,12 +25,7 @@ describe 'non-indexed uncompressed peaks, mzML file' do
26
25
  "scan=10935", "scan=10936", "scan=10937",
27
26
  "scan=10938", "scan=10939", "scan=10940"
28
27
  ]
29
- # right now, the behavior is to expect a chromatogram index, even if
30
- # there are no chromatograms... is that the right behavior???
31
- chromatogram_idx = index_list[:chromatogram]
32
- chromatogram_idx.name.should == :chromatogram
33
- chromatogram_idx.should == []
34
- chromatogram_idx.ids.should == []
28
+ index_list[:chromatogram].should == nil
35
29
  end
36
30
  end
37
31
  end
@@ -52,7 +46,7 @@ describe 'indexed, compressed peaks, mzML file' do
52
46
  correct_index_list = lambda do |index_list|
53
47
  spectrum_idx = index_list[:spectrum]
54
48
  spectrum_idx.name.should == :spectrum
55
- spectrum_idx.should == [4398, 219667, 227895]
49
+ spectrum_idx.should == [4397, 219666, 227894]
56
50
  spectrum_idx.ids.should == [
57
51
  "controllerType=0 controllerNumber=1 scan=1",
58
52
  "controllerType=0 controllerNumber=1 scan=2",
@@ -60,7 +54,7 @@ describe 'indexed, compressed peaks, mzML file' do
60
54
  ]
61
55
  chromatogram_idx = index_list[:chromatogram]
62
56
  chromatogram_idx.name.should == :chromatogram
63
- chromatogram_idx.should == [239184]
57
+ chromatogram_idx.should == [239183]
64
58
  chromatogram_idx.ids.should == ["TIC"]
65
59
  end
66
60
 
@@ -71,8 +65,7 @@ describe 'indexed, compressed peaks, mzML file' do
71
65
  end
72
66
 
73
67
  it 'can create the index manually, if requested' do
74
- mzml = Mspire::Mzml.new(@io)
75
- index_list = mzml.create_index_list
68
+ index_list = Mspire::Mzml::IndexList.create_index_list(@io)
76
69
  correct_index_list.call(index_list)
77
70
  end
78
71
 
@@ -15,14 +15,13 @@ describe 'converting mzml to plms1' do
15
15
  end
16
16
 
17
17
  it 'can be converted into a plms1 object' do
18
- scan_nums = (10929..10940).to_a
19
- times =[6604.58, 6605.5, 6605.91, 6606.48, 6606.98, 6607.53, 6607.93, 6608.49, 6608.92, 6609.49, 6609.94, 6610.53]
18
+ scan_nums = [10929, 10931, 10933, 10935, 10937, 10939, 10940]
19
+ times =[ 6604.58, 6605.91, 6606.98, 6607.93, 6608.92, 6609.94, 6610.53]
20
20
  plms1 = @mzml.to_plms1
21
21
  plms1.spectra.respond_to?(:each).should be_true
22
22
  plms1.times.should == times
23
23
  plms1.scan_numbers.should == scan_nums
24
24
  plms1.spectra.each do |spec|
25
- spec.size.should == 2
26
25
  spec.should be_a_kind_of(Mspire::SpectrumLike)
27
26
  spec.mzs.should == []
28
27
  spec.intensities.should == []
@@ -43,20 +42,17 @@ describe 'converting mzml to plms1' do
43
42
  end
44
43
 
45
44
  it 'can be converted into a plms1 object' do
46
- #scan_nums = ###
47
- #times =[6604.58, 6605.5, 6605.91, 6606.48, 6606.98, 6607.53, 6607.93, 6608.49, 6608.92, 6609.49, 6609.94, 6610.53]
48
45
  plms1 = @mzml.to_plms1
49
46
  plms1.spectra.respond_to?(:each).should be_true
50
- plms1.times.should == [1981.5726, 1982.1077, 1982.4020999999998]
51
- plms1.scan_numbers.should == [1, 2, 3]
52
- sizes = [20168, 315, 634]
47
+ plms1.times.should == [1981.5726]
48
+ plms1.scan_numbers.should == [1]
49
+ sizes = [20168]
53
50
  plms1.spectra.zip(sizes).each do |spec,exp_size|
54
51
  spec.should be_a_kind_of(Mspire::SpectrumLike)
55
52
  spec.size.should == 2
56
53
  spec.mzs.size.should == exp_size
57
54
  spec.intensities.size.should == exp_size
58
55
  end
59
- #plms1.write("tmp.tmp.bin")
60
56
  end
61
57
 
62
58
  end
@@ -8,8 +8,8 @@ describe Mspire::Mzml::ReferenceableParamGroup do
8
8
  it 'is created with an id and params' do
9
9
  # the id is required for these objects
10
10
  # no compression
11
- rfgroup1 = Mspire::Mzml::ReferenceableParamGroup.new("mzArray", params: ['MS:1000576', 'MS:1000514'])
12
- rfgroup2 = Mspire::Mzml::ReferenceableParamGroup.new("intensityArray", params: ['MS:1000576', 'MS:1000515'])
11
+ rfgroup1 = Mspire::Mzml::ReferenceableParamGroup.new("mzArray").describe_many!(['MS:1000576', 'MS:1000514'])
12
+ rfgroup2 = Mspire::Mzml::ReferenceableParamGroup.new("intensityArray").describe_many!(['MS:1000576', 'MS:1000515'])
13
13
 
14
14
  b = Builder::XmlMarkup.new(:indent => 2)
15
15
  z = Mspire::Mzml::ReferenceableParamGroup.list_xml([rfgroup1, rfgroup2], b)
@@ -20,7 +20,7 @@ describe Mspire::Mzml::ReferenceableParamGroup do
20
20
  end
21
21
 
22
22
  it '#to_xml gives a ReferenceableParamGroupRef' do
23
- rfgroup1 = Mspire::Mzml::ReferenceableParamGroup.new("mzArray", params: ['MS:1000576', 'MS:1000514'])
23
+ rfgroup1 = Mspire::Mzml::ReferenceableParamGroup.new("mzArray").describe_many!(['MS:1000576', 'MS:1000514'])
24
24
  builder = Builder::XmlMarkup.new(:indent => 2)
25
25
  rfgroup1.to_xml(builder)
26
26
  xml = builder.to_xml
@@ -5,7 +5,7 @@ require 'builder'
5
5
 
6
6
  describe 'making a SourceFile' do
7
7
  it 'can be generated with params and a block' do
8
- source_file = Mspire::Mzml::SourceFile.new("someFileID", "filename.mzML", "/home/jtprince/tmp", params: ['MS:1000584'])
8
+ source_file = Mspire::Mzml::SourceFile.new("someFileID", "filename.mzML", "/home/jtprince/tmp").describe!('MS:1000584')
9
9
 
10
10
  params = source_file.params
11
11
  params.size.should == 1
@@ -18,7 +18,6 @@ describe 'making a SourceFile' do
18
18
  end
19
19
  end
20
20
 
21
- it 'can be created from xml'
22
21
  end
23
22
 
24
23
 
@@ -0,0 +1,54 @@
1
+ require 'spec_helper'
2
+
3
+ require 'mspire/mzml/spectrum_list'
4
+ require 'builder'
5
+
6
+ class MockSpectrum
7
+ attr_accessor :index
8
+ attr_accessor :id
9
+ attr_accessor :source_file
10
+ attr_accessor :data_processing
11
+ def initialize(id)
12
+ @id = id
13
+ end
14
+ def to_xml(builder, default_ids)
15
+ builder.mockSpectrum {}
16
+ builder
17
+ end
18
+ end
19
+
20
+ MockObject = Struct.new(:id)
21
+
22
+ describe Mspire::Mzml::SpectrumList do
23
+
24
+ let :speclist do
25
+ Mspire::Mzml::SpectrumList.new(MockObject.new(:default_data_processing), [MockSpectrum.new('spec1')], { 'spec1' => 0 })
26
+ end
27
+
28
+ specify '#[Integer]' do
29
+ speclist[0].id.should == 'spec1'
30
+ end
31
+
32
+ specify '#[id]' do
33
+ speclist['spec1'].id.should == 'spec1'
34
+ end
35
+
36
+ specify '#create_id_to_index!' do
37
+ orig_index = speclist.id_to_index
38
+ speclist.create_id_to_index!
39
+ new_index = speclist.id_to_index
40
+ new_index.should == orig_index
41
+ new_index.equal?(orig_index).should be_false
42
+ end
43
+
44
+ specify '#to_xml' do
45
+ require 'stringio'
46
+ st = StringIO.new
47
+ builder = Builder::XmlMarkup.new(:target => st)
48
+ speclist.to_xml(builder, {})
49
+ st.string.should == "<spectrumList count=\"1\" defaultDataProcessingRef=\"default_data_processing\"><mockSpectrum></mockSpectrum></spectrumList>"
50
+ end
51
+
52
+ end
53
+
54
+
@@ -16,8 +16,7 @@ describe Mspire::Mzml::Spectrum do
16
16
  end
17
17
 
18
18
  it 'gathers key data for ms1 spectrum' do
19
- xml_node = @mzml.spectrum_node(0)
20
- spec = Mspire::Mzml::Spectrum.from_xml(xml_node)
19
+ spec = @mzml.run.spectrum_list[0]
21
20
 
22
21
  # convenient access to common attributes
23
22
  spec.retention_time.should == 1981.5726
@@ -36,8 +35,7 @@ describe Mspire::Mzml::Spectrum do
36
35
  end
37
36
 
38
37
  it 'gathers key data for ms2 spectrum' do
39
- xml_node = @mzml.spectrum_node(1)
40
- spec = Mspire::Mzml::Spectrum.from_xml(xml_node)
38
+ spec = @mzml.run.spectrum_list[1]
41
39
 
42
40
  # convenient access to common attributes
43
41
  spec.retention_time.should == 1982.1077