mspire 0.7.18 → 0.8.0

Sign up to get free protection for your applications and to get access to all the features.
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