mzml 0.2.2 → 0.3.0

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