mzml 0.2.2 → 0.3.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.
data/lib/mzml.rb CHANGED
@@ -1,245 +1,5 @@
1
1
  require 'nokogiri'
2
- require 'base64'
3
- require 'zlib'
4
-
5
- #--
6
- # This program is free software; you can redistribute it and/or modify
7
- # it under the terms of the GNU Library or "Lesser" General Public
8
- # License (LGPL) as published by the Free Software Foundation;
9
- # either version 2 of the License, or (at your option) any later
10
- # version.
11
- # Author: Angel Pizarro
12
- # Date: 12/05/2009
13
- # Copyright: Angel Pizarro, Copyright (c) University of Pennsylvania. All rights reserved.
14
- #
15
-
16
- # == MzML
17
- #
18
- # A non-validating mzML v 1.1.0 parser. Most annotation is left as XML DOM
19
- # objects. See the Nokogiri::XML::Node and Nokogiri::XML::NodeSet
20
- # documentation on how to work with these.
21
- #
22
- # ===USAGE:
23
- #
24
- # require 'mzml'
25
- # mzml = MzML::Doc.new("test.mzXML")
26
-
27
- module MzML
28
-
29
- # An internal module containing useful regular expressions
30
- module RGX
31
- # The file byte offset of the start of the file index
32
- INDEX_OFFSET = /<indexListOffset>(\d+)<\/indexListOffset>/
33
- # The start of a either a spectrumList or chromatographList
34
- DATA_LIST_START = /<(spectrum|chromatogram)List\s.*count\=["'](\d+)/m
35
- # The start spectrum or chromatogram element
36
- DATA_START = /<(spectrum|chromatogram)\s.*id=["']([^'"]+)["']/m
37
- # The end spectrum or chromatogram element
38
- DATA_END = /(<\/(spectrum|chromatogram)>)/
39
- end
40
-
41
- def parse(xml)
42
- Nokogiri::XML.parse(xml).root
43
- end
44
-
45
- class UnsupportedFileFormat < Exception
46
- end
47
- class BadIdentifier < Exception
48
- end
49
-
50
- class Doc < File
51
- attr_reader :index, :fname, :spectrum_count, :chromatogram_count, :node
52
-
53
- def initialize(mz_fname)
54
- unless mz_fname =~ /\.mzML$/
55
- raise MzML::UnsupportedFileFormat.new "File extension must be .\"mzML\""
56
- end
57
- super(mz_fname, "r")
58
- @index = parse_index_list
59
- end
60
-
61
- def chromatogram(chromatogram_id)
62
- if @index[:chromatogram].has_key? chromatogram_id
63
- self.seek @index[:chromatogram][chromatogram_id]
64
- parse_next
65
- else
66
- raise MzML::BadIdentifier.new("Invalid ID '#{chromatogram_id}'")
67
- end
68
- end
69
-
70
- def spectrum(spectrum_id)
71
- if @index[:spectrum].has_key? spectrum_id
72
- self.seek @index[:spectrum][spectrum_id]
73
- return Spectrum.new(parse_next())
74
-
75
- else
76
- raise MzML::BadIdentifier.new("Invalid ID '#{spectrum_id}'")
77
- end
78
- end
79
-
80
- # private
81
- # Parses the IndexList
82
- def parse_index_list
83
- self.seek(self.stat.size - 200)
84
- # parse the index offset
85
- tmp = self.read
86
- tmp =~ MzML::RGX::INDEX_OFFSET
87
- offset = $1
88
- # if I didn't match anything, compute the index and return
89
- unless (offset)
90
- return compute_index_list
91
- end
92
- @index = {}
93
- self.seek(offset.to_i)
94
- tmp = Nokogiri::XML.parse(self.read).root
95
- tmp.css("index").each do |idx|
96
- index_type = idx[:name].to_sym
97
- @index[index_type] = {}
98
- idx.css("offset").each do |o|
99
- @index[index_type][o[:idRef]] = o.text().to_i
100
- end
101
- end
102
- return @index
103
- end
104
-
105
- def compute_index_list
106
- @index = {}
107
- # start at the beginning.
108
- self.rewind
109
- # fast forward to the first spectrum or chromatograph
110
- buffer = ''
111
- while !self.eof
112
- buffer += self.read(1024)
113
- if start_pos = buffer =~ MzML::RGX::DATA_START
114
- self.seek start_pos
115
- break
116
- end
117
- end
118
- # for each particular entity start to fill in the index
119
- buffer = ''
120
- rgx_start = /<(spectrum|chromatogram)\s.*id=["']([^"']+)["']/
121
- while !self.eof
122
- buffer += self.read(1024)
123
- if start_pos = buffer =~ rgx_start
124
- start_pos = self.pos - buffer.length + start_pos
125
- @index[$1.to_sym][$2] = start_pos
126
- buffer = ''
127
- end
128
- end
129
- return @index
130
- end
131
-
132
- def parse_next
133
- buffer = self.read(1024)
134
- end_pos = nil
135
- while(!self.eof)
136
- if end_pos = buffer =~ MzML::RGX::DATA_END
137
- buffer = buffer.slice(0..(end_pos + $1.length))
138
- break
139
- end
140
- buffer += self.read(1024)
141
- end
142
- return Nokogiri::XML.parse(buffer)
143
- end
144
- end
145
-
146
- class Spectrum
147
- attr_accessor :id, :default_array_length, :spot_id, :type,\
148
- :charge, :precursor, :base_peak_mz, :base_peak_intensity, :ms_level, \
149
- :high_mz, :low_mz, :title, :tic, :polarity, :representation, :mz_node, :intensity_node, \
150
- :mz, :intensity, :precursor_list, :scan_list, :retention_time, :precursor_mass, :precursor_intensity
151
-
152
- attr_reader :node, :params
153
-
154
- # mz & intensity arrays will be don by proper methods maybe.
155
- def initialize(spectrum_node)
156
- @node = spectrum_node
157
- @params = {}
158
- @precursor_list = []
159
- parse_element()
160
- end
161
-
162
- protected
163
- # This method pulls out all of the annotation from the XML node
164
- def parse_element
165
- # id
166
- @id = @node.xpath("spectrum")[0][:id]
167
- @default_array_length = @node.xpath("spectrum")[0][:defaultArrayLength]
168
- @spot_id = @node.xpath("spectrum")[0][:spotID]
169
- # now reaching into params
170
- @params = @node.xpath("spectrum/cvParam").inject({}) do |memo,prm|
171
- memo[prm[:name]] = prm[:value]
172
- memo
173
- end
174
- @ms_level = @params["ms level"].to_i
175
- @low_mz = @params["lowest observed m/z"].to_f if @params.has_key?("lowest observed m/z")
176
- @high_mz = @params["highest observed m/z"].to_f if @params.has_key?("highest observed m/z")
177
- @tic = @params["total ion current"].to_i if @params.has_key?("total ion current")
178
- @base_peak_mz = @params["base peak m/z"].to_i if @params.has_key?("base peak m/z")
179
- @base_peak_intensity = @params["base peak intensity"].to_i if @params.has_key?("base peak intensity")
180
- # polarity
181
- # representation
182
- # precursor list
183
- if (! @node.xpath("spectrum/precursorList")[0].nil?)
184
- parse_precursor_list()
185
- get_parent_info()
186
- else
187
- @precursor_list = []
188
- end
189
- # scan list
190
- if (@node.xpath("spectrum/scanList")[0])
191
- @scan_list = parse_scan_list()
192
- else
193
- @scan_list = nil
194
- end
195
- # binary data
196
- parse_binary_data()
197
- end
198
-
199
- def parse_precursor_list
200
- @node.css("precursorList > precursor").each do |p|
201
- [p[:spectrumRef], p]
202
- @precursor_list << p
203
- end
204
- end
205
-
206
- def get_parent_info
207
-
208
- unless @precursor_list.empty?
209
-
210
- @precursor_mass = @precursor_list[0].xpath("selectedIonList/selectedIon/cvParam[@accession='MS:1000744']")[0][:value] unless @precursor_list[0].xpath("selectedIonList/selectedIon/cvParam[@accession='MS:1000744']")[0].nil?
211
- @precursor_intensity = @precursor_list[0].xpath("selectedIonList/selectedIon/cvParam[@accession='MS:1000042']")[0][:value] unless @precursor_list[0].xpath("selectedIonList/selectedIon/cvParam[@accession='MS:1000042']")[0].nil?
212
-
213
- end
214
-
215
-
216
- end
217
-
218
- def parse_scan_list
219
- @scan_list = @node.xpath("spectrum/scanList/scan")
220
- @retention_time = @node.xpath("spectrum/scanList/scan/cvParam[@accession='MS:1000016']")[0][:value] unless @node.xpath("spectrum/scanList/scan/cvParam[@accession='MS:1000016']")[0].nil?
221
- end
222
-
223
- def parse_binary_data
224
- @mz_node = @node.xpath("spectrum/binaryDataArrayList/binaryDataArray/cvParam[@accession='MS:1000514']").first.parent
225
- data = Base64.decode64(@mz_node.xpath("binary").text)
226
- if @mz_node.xpath("cvParam[@accession='MS:1000574']")[0]
227
- # need to uncompress the data
228
- data = Zlib::Inflate.inflate(data)
229
- end
230
- # 64-bit floats? default is 32-bit
231
- dtype = @mz_node.xpath("cvParam[@accession='MS:1000523']")[0] ? "E*" : "e*"
232
- @mz = data.unpack(dtype)
233
-
234
- @intensity_node = @node.xpath("spectrum/binaryDataArrayList/binaryDataArray/cvParam[@accession='MS:1000515']").first.parent
235
- data = Base64.decode64(@intensity_node.xpath("binary").text)
236
- if @intensity_node.xpath("cvParam[@accession='MS:1000574']")[0]
237
- # need to uncompress the data
238
- data = Zlib::Inflate.inflate(data)
239
- end
240
- # 64-bit floats? default is 32-bit
241
- dtype = @intensity_node.xpath("cvParam[@accession='MS:1000523']")[0] ? "E*" : "e*"
242
- @intensity = data.unpack(dtype)
243
- end
244
- end
245
- end
2
+ require 'mzml/doc'
3
+ require 'mzml/chromatogram'
4
+ require 'mzml/spectrum'
5
+ require 'mzml/version'
data/mzml.gemspec CHANGED
@@ -1,65 +1,21 @@
1
- # Generated by jeweler
2
- # DO NOT EDIT THIS FILE DIRECTLY
3
- # Instead, edit Jeweler::Tasks in Rakefile, and run the gemspec command
4
1
  # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+ require "mzml/version"
5
4
 
6
5
  Gem::Specification.new do |s|
7
- s.name = %q{mzml}
8
- s.version = "0.2.2"
9
-
10
- s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
- s.authors = ["Angel Pizarro"]
12
- s.date = %q{2010-10-01}
13
- s.default_executable = %q{mzML2mgf.rb}
14
- s.description = %q{A non-validating mzML parser. MzML is a standard data format for representing mass spectrometry data.}
15
- s.email = %q{angel@delagoya.com}
16
- s.executables = ["mzML2mgf.rb"]
17
- s.extra_rdoc_files = [
18
- "LICENSE",
19
- "README.rdoc"
20
- ]
21
- s.files = [
22
- ".document",
23
- ".gitignore",
24
- ".yardoc",
25
- "LICENSE",
26
- "README.rdoc",
27
- "Rakefile",
28
- "VERSION",
29
- "bin/mzML2mgf.rb",
30
- "lib/mzml.rb",
31
- "mzml.gemspec",
32
- "spec/mzml_spec.rb",
33
- "spec/sample.compressed.mzML",
34
- "spec/sample.mgf",
35
- "spec/sample.mzML",
36
- "spec/spec.opts",
37
- "spec/spec_helper.rb"
38
- ]
39
- s.homepage = %q{http://github.com/delagoya/mzml}
40
- s.rdoc_options = ["--charset=UTF-8"]
41
- s.require_paths = ["lib"]
42
- s.rubygems_version = %q{1.3.7}
6
+ s.name = "mzml"
7
+ s.version = MzML::VERSION
8
+ s.platform = Gem::Platform::RUBY
9
+ s.authors = ["Angel Pizarro"]
10
+ s.email = ["angel@upenn.edu"]
43
11
  s.summary = %q{A non-validating mzML parser}
44
- s.test_files = [
45
- "spec/mzml_spec.rb",
46
- "spec/spec_helper.rb"
47
- ]
48
-
49
- if s.respond_to? :specification_version then
50
- current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
51
- s.specification_version = 3
12
+ s.description = %q{A non-validating mzML parser. MzML is a standard data format for representing mass spectrometry data.}
13
+ s.homepage = "http://github.com/delagoya/mzml"
52
14
 
53
- if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
54
- s.add_development_dependency(%q<rspec>, ["= 1.3.0"])
55
- s.add_runtime_dependency(%q<nokogiri>, ["= 1.4.1"])
56
- else
57
- s.add_dependency(%q<rspec>, ["= 1.3.0"])
58
- s.add_dependency(%q<nokogiri>, ["= 1.4.1"])
59
- end
60
- else
61
- s.add_dependency(%q<rspec>, ["= 1.3.0"])
62
- s.add_dependency(%q<nokogiri>, ["= 1.4.1"])
63
- end
15
+ s.files = `git ls-files`.split("\n")
16
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
17
+ s.require_paths = ["lib"]
18
+ s.add_dependency("nokogiri", ["~> 1.5"])
19
+ s.add_development_dependency "rake"
20
+ s.add_development_dependency "yard"
64
21
  end
65
-
data/spec/mzml_spec.rb CHANGED
@@ -5,6 +5,7 @@ describe MzML do
5
5
  # set the input file name
6
6
  @file = File.join(File.dirname(__FILE__), "sample.mzML")
7
7
  @compressed = File.join(File.dirname(__FILE__), "sample.compressed.mzML")
8
+ @unindexed = File.join(File.dirname(__FILE__), "sample.unindexed.mzML")
8
9
  @mgf = File.join(File.dirname(__FILE__), "sample.mgf")
9
10
  end
10
11
 
@@ -95,4 +96,19 @@ describe MzML do
95
96
  s.intensity.should_not be_nil
96
97
  end
97
98
  end
99
+
100
+ # TOPPView outputs mzML with no indexedmzML wrapper
101
+ context 'Given a valid mzML file without an index wrapper' do
102
+ it 'should be able to retrieve by index' do
103
+ mz = MzML::Doc.new(@unindexed)
104
+ s = mz.spectrum(mz.index[:spectrum].keys.first)
105
+ s.intensity.should_not be_nil
106
+ end
107
+ it 'does not fail when parsing a spectrum without binary data' do
108
+ mz = MzML::Doc.new(@unindexed)
109
+ s = mz.spectrum(mz.index[:spectrum].keys.last)
110
+ s.should_not be_nil
111
+ s.intensity.should be_nil
112
+ end
113
+ end
98
114
  end
@@ -0,0 +1,221 @@
1
+ <?xml version="1.0" encoding="ISO-8859-1"?>
2
+ <mzML xmlns="http://psi.hupo.org/ms/mzml" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://psi.hupo.org/ms/mzml http://psidev.info/files/ms/mzML/xsd/mzML1.1.0.xsd" accession="" version="1.1.0">
3
+ <cvList count="2">
4
+ <cv id="MS" fullName="Proteomics Standards Initiative Mass Spectrometry Ontology" URI="http://psidev.cvs.sourceforge.net/*checkout*/psidev/psi/psi-ms/mzML/controlledVocabulary/psi-ms.obo"/>
5
+ <cv id="UO" fullName="Unit Ontology" URI="http://obo.cvs.sourceforge.net/obo/obo/ontology/phenotype/unit.obo"/>
6
+ </cvList>
7
+ <fileDescription>
8
+ <fileContent>
9
+ <cvParam cvRef="MS" accession="MS:1000294" name="mass spectrum" />
10
+ </fileContent>
11
+ <sourceFileList count="1">
12
+ <sourceFile id="sf_ru_0" name="file://MSALLY2/S/RAW/HEK_cells/Hek_cells_100904050914.RAW" location="">
13
+ <cvParam cvRef="MS" accession="MS:1000569" name="SHA-1" value="2b6ebe1d5f900a445f82adb40b24cd77ed476ecb" />
14
+ <cvParam cvRef="MS" accession="MS:1000564" name="PSI mzData file" />
15
+ <cvParam cvRef="MS" accession="MS:1000777" name="spectrum identifier nativeID format" />
16
+ </sourceFile>
17
+ </sourceFileList>
18
+ </fileDescription>
19
+ <sampleList count="1">
20
+ <sample id="sa_0" name="">
21
+ <cvParam cvRef="MS" accession="MS:1000004" name="sample mass" value="0" unitAccession="UO:0000021" unitName="gram" unitCvRef="UO" />
22
+ <cvParam cvRef="MS" accession="MS:1000005" name="sample volume" value="0" unitAccession="UO:0000098" unitName="milliliter" unitCvRef="UO" />
23
+ <cvParam cvRef="MS" accession="MS:1000006" name="sample concentration" value="0" unitAccession="UO:0000175" unitName="gram per liter" unitCvRef="UO" />
24
+ </sample>
25
+ </sampleList>
26
+ <softwareList count="4">
27
+ <software id="so_in_0" version="2.5.5" >
28
+ <cvParam cvRef="MS" accession="MS:1000532" name="Xcalibur" />
29
+ </software>
30
+ <software id="so_default" version="" >
31
+ <cvParam cvRef="MS" accession="MS:1000799" name="custom unreleased software tool" value="" />
32
+ </software>
33
+ <software id="so_dp_sp_0_pm_0" version="4.3.1(build Sep 9 2009 12:30:29)" >
34
+ <cvParam cvRef="MS" accession="MS:1000541" name="ReAdW" />
35
+ </software>
36
+ <software id="so_dp_sp_0_pm_1" version="1.7.0" >
37
+ <cvParam cvRef="MS" accession="MS:1000799" name="custom unreleased software tool" value="SpectrumCanvas" />
38
+ </software>
39
+ </softwareList>
40
+ <instrumentConfigurationList count="1">
41
+ <instrumentConfiguration id="ic_0">
42
+ <cvParam cvRef="MS" accession="MS:1000031" name="instrument model" />
43
+ <componentList count="3">
44
+ <source order="0">
45
+ <cvParam cvRef="MS" accession="MS:1000008" name="ionization type" />
46
+ </source>
47
+ <analyzer order="0">
48
+ <cvParam cvRef="MS" accession="MS:1000014" name="accuracy" value="0" unitAccession="UO:0000169" unitName="parts per million" unitCvRef="UO" />
49
+ <cvParam cvRef="MS" accession="MS:1000022" name="TOF Total Path Length" value="0" unitAccession="UO:0000008" unitName="meter" unitCvRef="UO" />
50
+ <cvParam cvRef="MS" accession="MS:1000024" name="final MS exponent" value="0" />
51
+ <cvParam cvRef="MS" accession="MS:1000025" name="magnetic field strength" value="0" unitAccession="UO:0000228" unitName="tesla" unitCvRef="UO" />
52
+ <cvParam cvRef="MS" accession="MS:1000443" name="mass analyzer type" />
53
+ </analyzer>
54
+ <detector order="0">
55
+ <cvParam cvRef="MS" accession="MS:1000028" name="detector resolution" value="0" />
56
+ <cvParam cvRef="MS" accession="MS:1000029" name="sampling frequency" value="0" unitAccession="UO:0000106" unitName="hertz" unitCvRef="UO" />
57
+ <cvParam cvRef="MS" accession="MS:1000026" name="detector type" />
58
+ </detector>
59
+ </componentList>
60
+ <softwareRef ref="so_in_0" />
61
+ </instrumentConfiguration>
62
+ </instrumentConfigurationList>
63
+ <dataProcessingList count="1">
64
+ <dataProcessing id="dp_sp_0">
65
+ <processingMethod order="0" softwareRef="so_dp_sp_0_pm_0">
66
+ <cvParam cvRef="MS" accession="MS:1000035" name="peak picking" />
67
+ <userParam name="#type" type="xsd:string" value="conversion"/>
68
+ </processingMethod>
69
+ <processingMethod order="0" softwareRef="so_dp_sp_0_pm_1">
70
+ <cvParam cvRef="MS" accession="MS:1001486" name="data filtering" />
71
+ <cvParam cvRef="MS" accession="MS:1000747" name="completion time" value="2011-02-07+21:50" />
72
+ </processingMethod>
73
+ </dataProcessing>
74
+ </dataProcessingList>
75
+ <run id="ru_0" defaultInstrumentConfigurationRef="ic_0" sampleRef="sa_0" defaultSourceFileRef="sf_ru_0">
76
+ <spectrumList count="5" defaultDataProcessingRef="dp_sp_0">
77
+ <spectrum id="scan=9033" index="562" defaultArrayLength="75">
78
+ <cvParam cvRef="MS" accession="MS:1000525" name="spectrum representation" />
79
+ <cvParam cvRef="MS" accession="MS:1000511" name="ms level" value="1" />
80
+ <cvParam cvRef="MS" accession="MS:1000294" name="mass spectrum" />
81
+ <cvParam cvRef="MS" accession="MS:1000130" name="positive scan" />
82
+ <scanList count="1">
83
+ <cvParam cvRef="MS" accession="MS:1000795" name="no combination" />
84
+ <scan>
85
+ <cvParam cvRef="MS" accession="MS:1000016" name="scan start time" value="5207.31" unitAccession="UO:0000010" unitName="second" unitCvRef="UO" />
86
+ </scan>
87
+ </scanList>
88
+ <binaryDataArrayList count="2">
89
+ <binaryDataArray encodedLength="800">
90
+ <cvParam cvRef="MS" accession="MS:1000514" name="m/z array" unitAccession="MS:1000040" unitName="m/z" unitCvRef="MS" />
91
+ <cvParam cvRef="MS" accession="MS:1000523" name="64-bit float" />
92
+ <cvParam cvRef="MS" accession="MS:1000576" name="no compression" />
93
+ <binary>AAAAQNHFh0AAAACApsiHQAAAAOAByYdAAAAAIGrNh0AAAABA/s6HQAAAAGD+1YdAAAAA4P3Wh0AAAAAgWtuHQAAAAEAC3odAAAAAoA/mh0AAAAAg3+qHQAAAAMBk64dAAAAAIE3th0AAAAAAbPCHQAAAAGA08YdAAAAAQB3zh0AAAADAxfWHQAAAAEBw+IdAAAAAQPUCiEAAAADAIQeIQAAAAIAyDYhAAAAAAPAgiEAAAACAkyGIQAAAAKAyI4hAAAAAoHIniEAAAADAASiIQAAAACAVLohAAAAAgAwwiEAAAACA9jKIQAAAAMBUNIhAAAAAAJw1iEAAAAAgIDuIQAAAAOAfP4hAAAAAYHVBiEAAAAAA1kKIQAAAAEAmQ4hAAAAAwABGiEAAAABAMUuIQAAAAEA0T4hAAAAAgDFRiEAAAACAGFmIQAAAAAAbX4hAAAAAACBjiEAAAABAa2+IQAAAAKAGc4hAAAAAwCF7iEAAAACAEIWIQAAAAAAVh4hAAAAAgBWJiEAAAAAgEYuIQAAAAKCvi4hAAAAAgBqNiEAAAACg0o2IQAAAAGAbk4hAAAAAQGyYiEAAAAAgdpuIQAAAAAAjnohAAAAAoMWgiEAAAADgV6aIQAAAACDxqIhAAAAA4F+piEAAAADgHq2IQAAAAGAdrohAAAAAoMuwiEAAAACgPLOIQAAAAOB2s4hAAAAA4CG2iEAAAADAG7eIQAAAAODTuIhAAAAAoBW+iEAAAABAhMCIQAAAAOAww4hAAAAA4E7HiEAAAABA5NWIQAAAAIAo44hA</binary>
94
+ </binaryDataArray>
95
+ <binaryDataArray encodedLength="400">
96
+ <cvParam cvRef="MS" accession="MS:1000515" name="intensity array" unitAccession="MS:1000131" unitName="number of counts" unitCvRef="MS"/>
97
+ <cvParam cvRef="MS" accession="MS:1000521" name="32-bit float" />
98
+ <cvParam cvRef="MS" accession="MS:1000576" name="no compression" />
99
+ <binary>CZMLRfdvCEWM1ydFdZ/pRDWvDUapXF5FlQ4eRRgd20W1P3BFe9EqRecTCEWk6gdF1TyQRf3eDEblhfxEGkkWRua92UXCoaVFknjfRD2F80RS3hxFwbDrRHJiRkUUbSBFv2McRTEaQ0VvUwlFi68fRUv5hkVEwIZFBrRRRdTF6UVEzxJF+UYTRd/nH0Ui83tFox8MRUrwG0X3gWpFmtUURQjH20UWMTRFwc8pRTNRCEWsaQlFcrUXRSkJwUWZkBxGrgIxRuMio0WU/etEmWwtReGvbEUa4JZFyoffRPtHlEUI/lBFsW2ARV4xUEWtvS5FBi06RdwJEkWojBJGPIxHRvKcE0UAqGNGzdmkRQ+aFkXsqlpFvtcwRRLkYUV/WFRFSJQLRQy4BkV29CNF</binary>
100
+ </binaryDataArray>
101
+ </binaryDataArrayList>
102
+ </spectrum>
103
+ <spectrum id="scan=9034" index="563" defaultArrayLength="79">
104
+ <cvParam cvRef="MS" accession="MS:1000525" name="spectrum representation" />
105
+ <cvParam cvRef="MS" accession="MS:1000511" name="ms level" value="1" />
106
+ <cvParam cvRef="MS" accession="MS:1000294" name="mass spectrum" />
107
+ <cvParam cvRef="MS" accession="MS:1000130" name="positive scan" />
108
+ <scanList count="1">
109
+ <cvParam cvRef="MS" accession="MS:1000795" name="no combination" />
110
+ <scan>
111
+ <cvParam cvRef="MS" accession="MS:1000016" name="scan start time" value="5208.68" unitAccession="UO:0000010" unitName="second" unitCvRef="UO" />
112
+ </scan>
113
+ </scanList>
114
+ <binaryDataArrayList count="2">
115
+ <binaryDataArray encodedLength="844">
116
+ <cvParam cvRef="MS" accession="MS:1000514" name="m/z array" unitAccession="MS:1000040" unitName="m/z" unitCvRef="MS" />
117
+ <cvParam cvRef="MS" accession="MS:1000523" name="64-bit float" />
118
+ <cvParam cvRef="MS" accession="MS:1000576" name="no compression" />
119
+ <binary>AAAAICHDh0AAAAAAL8uHQAAAAIACzYdAAAAAoPrOh0AAAACAX9CHQAAAAEBd24dAAAAA4Prih0AAAACgCuaHQAAAAGBh6IdAAAAA4Arrh0AAAADASO2HQAAAAMBN74dAAAAAAG3wh0AAAABAGvOHQAAAAMDJ9YdAAAAAYGz4h0AAAACAB/uHQAAAACBC+4dAAAAAgAH/h0AAAADgPxiIQAAAAMCmHYhAAAAAwEwgiEAAAABAkyGIQAAAAKDMJIhAAAAAYGImiEAAAACgeyeIQAAAAMB5K4hAAAAAQAouiEAAAADAdi6IQAAAAKAIMIhAAAAAgAYxiEAAAACg5zSIQAAAAEChNYhAAAAAQCI7iEAAAACgIj+IQAAAAOB0RYhAAAAAgA5JiEAAAADgLUuIQAAAAIByTYhAAAAAYA9QiEAAAACASFWIQAAAACAYW4hAAAAAIBtdiEAAAABAImOIQAAAAEAlZYhAAAAAAPl0iEAAAAAgDneIQAAAAEASeYhAAAAAoBd9iEAAAACgFH+IQAAAAAA8g4hAAAAAgBOFiEAAAAAAFoeIQAAAAMAWiYhAAAAAQA6LiEAAAACgUouIQAAAAOAUjYhAAAAAwBmPiEAAAACAgJCIQAAAAIAdk4hAAAAAoHWbiEAAAAAgH56IQAAAAMB0o4hAAAAAIBipiEAAAADgI6uIQAAAAAAdrohAAAAAgMiwiEAAAACgdrOIQAAAAKAjtohAAAAAoCa7iEAAAACA2L2IQAAAAAAlw4hAAAAAwGfIiEAAAACAusqIQAAAAEC6zYhAAAAAAELPiEAAAACgWtCIQAAAAKBC0YhAAAAAgNPciEA=</binary>
120
+ </binaryDataArray>
121
+ <binaryDataArray encodedLength="424">
122
+ <cvParam cvRef="MS" accession="MS:1000515" name="intensity array" unitAccession="MS:1000131" unitName="number of counts" unitCvRef="MS"/>
123
+ <cvParam cvRef="MS" accession="MS:1000521" name="32-bit float" />
124
+ <cvParam cvRef="MS" accession="MS:1000576" name="no compression" />
125
+ <binary>pb8PRZMGWEVVn1lFubaqRfkR9kQDlm9FT/ACRWNkKEWd/O9Ep2c3RawNg0XKUEtFGxvcRdjRFUZWyWdFw0hhRVb/BkUlNVtFoqkRRZLe+USzSApFXQv6RLsYMkWBsjFFk6OBRXLSNUVydedEVt7jRE/ECkUVMA5FHQ4YRbGREUWA9fZE+j5lRY5hx0UBRAxFY6cBRc2+OkU4JBBFsFsiRcmD+0Q9B4dF327GRZ1oDkVZ1w5FF5sLRfppFEW51lJFmBM4RXZCpEUdjvREDS6TRftxVUY/pL1FGRb1RCPjUEU0HGVFckCBRfDWH0V+wx9FkXcrRlr3bEVTNjdFvosIRVkXc0U5klxGCiYnRt0xHEa/RsVF1IQNRUNWNEXMaftEvNkPRRWB+ETuG19FMOLURL+sQUUdew5FuDkARQ==</binary>
126
+ </binaryDataArray>
127
+ </binaryDataArrayList>
128
+ </spectrum>
129
+ <spectrum id="scan=9035" index="564" defaultArrayLength="0">
130
+ <cvParam cvRef="MS" accession="MS:1000525" name="spectrum representation" />
131
+ <cvParam cvRef="MS" accession="MS:1000511" name="ms level" value="2" />
132
+ <cvParam cvRef="MS" accession="MS:1000294" name="mass spectrum" />
133
+ <cvParam cvRef="MS" accession="MS:1000130" name="positive scan" />
134
+ <scanList count="1">
135
+ <cvParam cvRef="MS" accession="MS:1000795" name="no combination" />
136
+ <scan>
137
+ <cvParam cvRef="MS" accession="MS:1000016" name="scan start time" value="5209.18" unitAccession="UO:0000010" unitName="second" unitCvRef="UO" />
138
+ </scan>
139
+ </scanList>
140
+ <precursorList count="1">
141
+ <precursor>
142
+ <isolationWindow>
143
+ <cvParam cvRef="MS" accession="MS:1000827" name="isolation window target m/z" value="868.46765137" unitAccession="MS:1000040" unitName="m/z" unitCvRef="MS" />
144
+ <cvParam cvRef="MS" accession="MS:1000828" name="isolation window lower offset" value="0" unitAccession="MS:1000040" unitName="m/z" unitCvRef="MS" />
145
+ <cvParam cvRef="MS" accession="MS:1000829" name="isolation window upper offset" value="0" unitAccession="MS:1000040" unitName="m/z" unitCvRef="MS" />
146
+ </isolationWindow>
147
+ <selectedIonList count="1">
148
+ <selectedIon>
149
+ <cvParam cvRef="MS" accession="MS:1000744" name="selected ion m/z" value="868.46765137" unitAccession="MS:1000040" unitName="m/z" unitCvRef="MS" />
150
+ <cvParam cvRef="MS" accession="MS:1000041" name="charge state" value="3" />
151
+ <cvParam cvRef="MS" accession="MS:1000042" name="peak intensity" value="12840.7001953125" unitAccession="MS:1000132" unitName="percent of base peak" unitCvRef="MS" />
152
+ </selectedIon>
153
+ </selectedIonList>
154
+ <activation>
155
+ <cvParam cvRef="MS" accession="MS:1000509" name="activation energy" value="0" unitAccession="UO:0000266" unitName="electronvolt" unitCvRef="UO" />
156
+ <cvParam cvRef="MS" accession="MS:1000044" name="dissociation method" />
157
+ </activation>
158
+ </precursor>
159
+ </precursorList>
160
+ </spectrum>
161
+ <spectrum id="scan=9036" index="565" defaultArrayLength="83">
162
+ <cvParam cvRef="MS" accession="MS:1000525" name="spectrum representation" />
163
+ <cvParam cvRef="MS" accession="MS:1000511" name="ms level" value="1" />
164
+ <cvParam cvRef="MS" accession="MS:1000294" name="mass spectrum" />
165
+ <cvParam cvRef="MS" accession="MS:1000130" name="positive scan" />
166
+ <scanList count="1">
167
+ <cvParam cvRef="MS" accession="MS:1000795" name="no combination" />
168
+ <scan>
169
+ <cvParam cvRef="MS" accession="MS:1000016" name="scan start time" value="5209.63" unitAccession="UO:0000010" unitName="second" unitCvRef="UO" />
170
+ </scan>
171
+ </scanList>
172
+ <binaryDataArrayList count="2">
173
+ <binaryDataArray encodedLength="888">
174
+ <cvParam cvRef="MS" accession="MS:1000514" name="m/z array" unitAccession="MS:1000040" unitName="m/z" unitCvRef="MS" />
175
+ <cvParam cvRef="MS" accession="MS:1000523" name="64-bit float" />
176
+ <cvParam cvRef="MS" accession="MS:1000576" name="no compression" />
177
+ <binary>AAAAICXDh0AAAADgMMyHQAAAAOD5zIdAAAAAYLzNh0AAAAAARc+HQAAAAOC60IdAAAAA4PnQh0AAAADgCdWHQAAAAMCq2IdAAAAAwAXah0AAAAAAB96HQAAAAKC74IdAAAAAgAPjh0AAAABgGOOHQAAAACAQ5odAAAAAAFHvh0AAAAAgb/CHQAAAAEBK8YdAAAAAABrzh0AAAAAgyfWHQAAAAIBn+IdAAAAAIL0CiEAAAAAArQ+IQAAAAMA+GIhAAAAAgAAbiEAAAACgmx2IQAAAAIBhJohAAAAAwBwriEAAAADgHjCIQAAAAEACM4hAAAAAwKI1iEAAAABgHjuIQAAAACAmP4hAAAAAgCtBiEAAAADgMk2IQAAAAMAUWYhAAAAAIB1biEAAAACARluIQAAAAKAfXYhAAAAAYIJhiEAAAAAgyGSIQAAAAKBBc4hAAAAAwFxziEAAAAAAFXiIQAAAAGAYfYhAAAAAgCCEiEAAAAAgEoWIQAAAAAAVh4hAAAAAwMuHiEAAAADAdIiIQAAAAGATiYhAAAAAQBqLiEAAAACAFI2IQAAAAOACjohAAAAAgBqPiEAAAACgU4+IQAAAAKARkYhAAAAAABOTiEAAAADgIp6IQAAAAEDMoIhAAAAAYBGjiEAAAADgOqmIQAAAACD3qohAAAAAQCqriEAAAACgHK6IQAAAAIDJsIhAAAAAwDaxiEAAAAAAdrOIQAAAAEAktohAAAAAYAi3iEAAAAAA3bmIQAAAAEAxu4hAAAAAoMG9iEAAAABg1r2IQAAAACA3w4hAAAAAYNfKiEAAAACgnsyIQAAAAECo0IhAAAAA4MfWiEAAAABA6dqIQAAAAADP4ohAAAAAIA7jiEAAAADgqeWIQA==</binary>
178
+ </binaryDataArray>
179
+ <binaryDataArray encodedLength="444">
180
+ <cvParam cvRef="MS" accession="MS:1000515" name="intensity array" unitAccession="MS:1000131" unitName="number of counts" unitCvRef="MS"/>
181
+ <cvParam cvRef="MS" accession="MS:1000521" name="32-bit float" />
182
+ <cvParam cvRef="MS" accession="MS:1000576" name="no compression" />
183
+ <binary>Q4ImReexMkXWN0VF1fbbRA9nB0Xe/Q1Fa/urRX8rTEWmbiRFiZoORfixFUUuPEZFPmYCRftqzURuxC9FfZg1RbgrYEYmLB5FsK+FRoIRlEUDV4NF+TAaRecZNUW5phhFoIsjRa5JBUU+ezVFC3PqRNAl80TsNepE+vMgRfW5hEVv6VxFHYMFRV2NEUXvJCpFvHYNRQXMUUVMBFBFvGrvRLUEBEXs2OpEd8n6RBYJJkWzmyhFEaklRXVEp0UrKVtGKosjRUYeJEUJ8FVGN5knRjHQ7kX6AUNFxeEpRdmiD0V8QjpFpaUaRSSwn0UBmPZFtF8TRYJfB0VugzZF+AwJRf/G8EWjC4hGhv0sRYyvq0XuxoxFuKYdRaJqBEWvwCFFaZYgRdncL0W/dR1FrHL4REkECkUJ8lJFRDYXRatv+0Tha01Fr8E2RWCNDkU=</binary>
184
+ </binaryDataArray>
185
+ </binaryDataArrayList>
186
+ </spectrum>
187
+ <spectrum id="scan=9037" index="566" defaultArrayLength="0">
188
+ <cvParam cvRef="MS" accession="MS:1000525" name="spectrum representation" />
189
+ <cvParam cvRef="MS" accession="MS:1000511" name="ms level" value="2" />
190
+ <cvParam cvRef="MS" accession="MS:1000294" name="mass spectrum" />
191
+ <cvParam cvRef="MS" accession="MS:1000130" name="positive scan" />
192
+ <scanList count="1">
193
+ <cvParam cvRef="MS" accession="MS:1000795" name="no combination" />
194
+ <scan>
195
+ <cvParam cvRef="MS" accession="MS:1000016" name="scan start time" value="5210.17" unitAccession="UO:0000010" unitName="second" unitCvRef="UO" />
196
+ </scan>
197
+ </scanList>
198
+ <precursorList count="1">
199
+ <precursor>
200
+ <isolationWindow>
201
+ <cvParam cvRef="MS" accession="MS:1000827" name="isolation window target m/z" value="1045.84021" unitAccession="MS:1000040" unitName="m/z" unitCvRef="MS" />
202
+ <cvParam cvRef="MS" accession="MS:1000828" name="isolation window lower offset" value="0" unitAccession="MS:1000040" unitName="m/z" unitCvRef="MS" />
203
+ <cvParam cvRef="MS" accession="MS:1000829" name="isolation window upper offset" value="0" unitAccession="MS:1000040" unitName="m/z" unitCvRef="MS" />
204
+ </isolationWindow>
205
+ <selectedIonList count="1">
206
+ <selectedIon>
207
+ <cvParam cvRef="MS" accession="MS:1000744" name="selected ion m/z" value="1045.84021" unitAccession="MS:1000040" unitName="m/z" unitCvRef="MS" />
208
+ <cvParam cvRef="MS" accession="MS:1000041" name="charge state" value="3" />
209
+ <cvParam cvRef="MS" accession="MS:1000042" name="peak intensity" value="17405.5" unitAccession="MS:1000132" unitName="percent of base peak" unitCvRef="MS" />
210
+ </selectedIon>
211
+ </selectedIonList>
212
+ <activation>
213
+ <cvParam cvRef="MS" accession="MS:1000509" name="activation energy" value="0" unitAccession="UO:0000266" unitName="electronvolt" unitCvRef="UO" />
214
+ <cvParam cvRef="MS" accession="MS:1000044" name="dissociation method" />
215
+ </activation>
216
+ </precursor>
217
+ </precursorList>
218
+ </spectrum>
219
+ </spectrumList>
220
+ </run>
221
+ </mzML>