ms-msrun 0.0.1 → 0.1.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/README +3 -4
- data/Rakefile +20 -5
- data/bin/base64_to_array.rb +3 -4
- data/bin/ms_to_obiwarp.rb +6 -15
- data/bin/ms_to_search.rb +15 -22
- data/lib/lmat.rb +47 -53
- data/lib/ms/msrun.rb +98 -108
- data/lib/ms/msrun/axml/mzxml.rb +6 -8
- data/lib/ms/msrun/index.rb +130 -0
- data/lib/ms/msrun/mzxml.rb +12 -0
- data/lib/ms/msrun/nokogiri.rb +12 -0
- data/lib/ms/msrun/nokogiri/mzxml.rb +168 -0
- data/lib/ms/msrun/regexp/mzxml.rb +126 -0
- data/lib/ms/msrun/search.rb +25 -21
- data/lib/ms/msrun/sha1.rb +36 -0
- data/lib/ms/mzxml.rb +12 -0
- data/lib/ms/precursor.rb +3 -2
- data/lib/ms/precursor/lazy_parent.rb +28 -0
- data/lib/ms/scan.rb +2 -29
- data/lib/ms/spectrum/compare.rb +42 -2
- data/lib/ms/spectrum/filter.rb +1 -1
- data/spec/ms/msrun/index_spec.rb +60 -0
- data/spec/ms/msrun/scan_spec.rb +78 -0
- data/spec/ms/msrun/search_spec.rb +6 -7
- data/spec/ms/msrun/sha1_spec.rb +23 -0
- data/spec/ms/msrun_spec.rb +111 -3
- data/spec/ms/scan_spec.rb +2 -2
- data/spec/ms/spectrum/compare_spec.rb +13 -6
- data/spec/ms/spectrum/filter_spec.rb +3 -3
- metadata +42 -21
- data/lib/bsearch.rb +0 -120
- data/lib/ms/spectrum.rb +0 -373
data/lib/ms/msrun/search.rb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
require 'ms/mass'
|
1
2
|
|
2
3
|
module Ms
|
3
4
|
class Msrun
|
@@ -13,13 +14,12 @@ module Ms
|
|
13
14
|
|
14
15
|
module Search
|
15
16
|
|
16
|
-
|
17
|
-
|
18
|
-
#
|
19
|
-
|
20
|
-
# written
|
21
|
-
def to_mgf(file_or_io=nil, opts={})
|
17
|
+
# returns a string unless :output given (may be a String (filename) or a
|
18
|
+
# writeable IO object in which case the data is written to file or io
|
19
|
+
# and the number of spectra written is returned
|
20
|
+
def to_mgf(opts={})
|
22
21
|
opts = {
|
22
|
+
:output => nil, # an output file or io object
|
23
23
|
:bottom_mh => 0.0,
|
24
24
|
:top_mh => nil,
|
25
25
|
:ms_levels => (2..-1), # range or intger, -1 at end will be substituted for last level
|
@@ -30,8 +30,10 @@ module Ms
|
|
30
30
|
:prec_int_precision => 2,
|
31
31
|
:frag_mz_precision => 5,
|
32
32
|
:frag_int_precision => 1,
|
33
|
+
:charge_states_for_unknowns => [2,3],
|
34
|
+
:determine_plus_ones => false,
|
33
35
|
}.merge(opts)
|
34
|
-
(_first_scan, _last_scan, _bottom_mh, _top_mh, _ms_levels, _min_peaks,
|
36
|
+
(_first_scan, _last_scan, _bottom_mh, _top_mh, _ms_levels, _min_peaks, _charge_states_for_unknowns, _prec_mz_precision, _prec_int_precision, _frag_mz_precision, _frag_int_precision, _determine_plus_ones) = opts.values_at(:first_scan, :last_scan, :bottom_mh, :top_mh, :ms_levels, :min_peaks, :charge_states_for_unknowns, :prec_mz_precision, :prec_int_precision, :frag_mz_precision, :frag_int_precision, :determine_plus_ones)
|
35
37
|
|
36
38
|
sep = ' '
|
37
39
|
|
@@ -40,7 +42,7 @@ module Ms
|
|
40
42
|
end
|
41
43
|
|
42
44
|
if _last_scan.nil? or _last_scan == -1
|
43
|
-
_last_scan =
|
45
|
+
_last_scan = self.scan_nums.last
|
44
46
|
end
|
45
47
|
|
46
48
|
if !_ms_levels.is_a?(Integer) && _ms_levels.last == -1
|
@@ -50,26 +52,30 @@ module Ms
|
|
50
52
|
prec_string = "PEPMASS=%0.#{_prec_mz_precision}f %0.#{_prec_int_precision}f\n"
|
51
53
|
frag_string = "%0.#{_frag_mz_precision}f%s%0.#{_frag_int_precision}f\n"
|
52
54
|
|
53
|
-
|
54
|
-
|
55
|
+
any_output(opts[:output]) do |out, out_type|
|
56
|
+
each_scan(:ms_level => _ms_levels) do |scan|
|
55
57
|
sn = scan.num
|
56
58
|
|
57
|
-
next unless _ms_levels === scan.ms_level
|
58
59
|
next unless sn >= _first_scan and sn <= _last_scan
|
59
60
|
next unless scan.num_peaks >= _min_peaks
|
60
61
|
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
62
|
+
|
63
|
+
if _determine_plus_ones
|
64
|
+
# tic under precursor > 95% and true = save the spectrum info
|
65
|
+
if scan.plus1?(0.95)
|
66
|
+
_charge_states = [1]
|
67
|
+
end
|
65
68
|
end
|
66
69
|
|
67
|
-
|
70
|
+
chrg_sts = scan.precursor.charge_states
|
71
|
+
if chrg_sts.nil? || !chrg_sts.first.is_a?(Integer)
|
72
|
+
chrg_sts = _charge_states_for_unknowns
|
73
|
+
end
|
68
74
|
|
69
75
|
pmz = scan.precursor && scan.precursor.mz
|
70
76
|
|
71
|
-
|
72
|
-
mh = (pmz * z) - (z - 1)*
|
77
|
+
chrg_sts.each do |z|
|
78
|
+
mh = (pmz * z) - (z - 1)*Ms::Mass::PROTON
|
73
79
|
next unless (mh >= _bottom_mh)
|
74
80
|
next unless (mh <= _top_mh) if _top_mh
|
75
81
|
out.puts "BEGIN IONS"
|
@@ -81,8 +87,6 @@ module Ms
|
|
81
87
|
end
|
82
88
|
out.puts "END IONS\n\n"
|
83
89
|
end
|
84
|
-
|
85
|
-
scan.spectrum.flush!
|
86
90
|
end
|
87
91
|
|
88
92
|
if out_type == :string_io
|
@@ -96,7 +100,7 @@ module Ms
|
|
96
100
|
|
97
101
|
|
98
102
|
# yields an IO object and the type input (:io, :filename, :string_io)
|
99
|
-
def
|
103
|
+
def any_output(arg, &block)
|
100
104
|
# this is pretty ugly, can we clean up?
|
101
105
|
if arg.is_a? IO # an IO object passed in
|
102
106
|
block.call(arg, :io)
|
@@ -0,0 +1,36 @@
|
|
1
|
+
require 'digest/sha1'
|
2
|
+
|
3
|
+
module Ms
|
4
|
+
class Msrun
|
5
|
+
# the mzXML digest is from the start of the document to the end of the
|
6
|
+
# first sha1 tag: '...<sha1>'
|
7
|
+
module Sha1
|
8
|
+
module_function
|
9
|
+
|
10
|
+
# returns [calculated digest, recorded digest] for an mzXML file
|
11
|
+
def digest_mzxml_file(file)
|
12
|
+
recorded_digest = nil
|
13
|
+
|
14
|
+
incr_digest = ""
|
15
|
+
#incr_digest = Digest::SHA1.new
|
16
|
+
endpos = nil
|
17
|
+
File.open(file, 'rb') do |io|
|
18
|
+
while line = io.gets
|
19
|
+
if line.include?("<sha1>")
|
20
|
+
incr_digest << line[0, line.index("<sha1>") + 6]
|
21
|
+
if line =~ %r{<sha1>(.*)</sha1>}
|
22
|
+
recorded_digest = $1.dup
|
23
|
+
break
|
24
|
+
else
|
25
|
+
incr_digest << line
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
[Digest::SHA1.hexdigest(incr_digest), recorded_digest]
|
32
|
+
#[incr_digest.hexdigest, recorded_digest]
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
data/lib/ms/mzxml.rb
ADDED
data/lib/ms/precursor.rb
CHANGED
@@ -1,8 +1,9 @@
|
|
1
1
|
|
2
2
|
module Ms
|
3
3
|
# charge_states are the possible charge states of the precursor
|
4
|
-
# parent references a scan
|
5
|
-
|
4
|
+
# parent references a scan and scan references the scan the precursor
|
5
|
+
# belongs to (i.e., the scan holding the precursor information).
|
6
|
+
PrecursorAtts = [:mz, :intensity, :parent, :charge_states, :scan]
|
6
7
|
end
|
7
8
|
|
8
9
|
Ms::Precursor = Struct.new(*Ms::PrecursorAtts)
|
@@ -0,0 +1,28 @@
|
|
1
|
+
require 'ms/precursor'
|
2
|
+
|
3
|
+
module Ms
|
4
|
+
class Precursor
|
5
|
+
class LazyParent
|
6
|
+
undef :parent
|
7
|
+
|
8
|
+
def parent
|
9
|
+
#########################
|
10
|
+
#########################
|
11
|
+
#########################
|
12
|
+
#########################
|
13
|
+
#########################
|
14
|
+
#########################
|
15
|
+
|
16
|
+
WorkingHERE!!
|
17
|
+
|
18
|
+
#########################
|
19
|
+
#########################
|
20
|
+
#########################
|
21
|
+
#########################
|
22
|
+
#########################
|
23
|
+
scan.num
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
data/lib/ms/scan.rb
CHANGED
@@ -2,16 +2,14 @@ require 'ms/precursor'
|
|
2
2
|
|
3
3
|
module Ms ; end
|
4
4
|
|
5
|
-
# 0 1 2 3 4 5 6 7
|
6
|
-
# 8
|
5
|
+
# 0 1 2 3 4 5 6 7 8
|
7
6
|
MsScanAtts = [:num, :ms_level, :time, :start_mz, :end_mz, :num_peaks, :tic, :precursor, :spectrum]
|
8
7
|
|
9
|
-
Ms::Scan = Struct.new(*MsScanAtts)
|
8
|
+
Ms::Scan = Struct.new(*MsScanAtts) do
|
10
9
|
|
11
10
|
# time in seconds
|
12
11
|
# everything else in float/int
|
13
12
|
|
14
|
-
class Ms::Scan
|
15
13
|
|
16
14
|
def to_s
|
17
15
|
"<Scan num=#{num} ms_level=#{ms_level} time=#{time}>"
|
@@ -63,31 +61,6 @@ class Ms::Scan
|
|
63
61
|
arr.join(" ")
|
64
62
|
end
|
65
63
|
|
66
|
-
# adds the attribute parent to each scan with a parent
|
67
|
-
# (level 1 = no parent; level 2 = prev level 1, etc.
|
68
|
-
def self.add_parent_scan(scans)
|
69
|
-
prev_scan = nil
|
70
|
-
parent_stack = [nil]
|
71
|
-
## we want to set the level to be the first mslevel we come to
|
72
|
-
prev_level = 1
|
73
|
-
scans.each do |scan|
|
74
|
-
if scan then prev_level = scan.ms_level; break; end
|
75
|
-
end
|
76
|
-
scans.each do |scan|
|
77
|
-
next unless scan ## the first one is nil, (others?)
|
78
|
-
level = scan.ms_level
|
79
|
-
if prev_level < level
|
80
|
-
parent_stack.unshift prev_scan
|
81
|
-
end
|
82
|
-
if prev_level > level
|
83
|
-
(prev_level - level).times do parent_stack.shift end
|
84
|
-
end
|
85
|
-
scan.parent = parent_stack.first
|
86
|
-
prev_level = level
|
87
|
-
prev_scan = scan
|
88
|
-
end
|
89
|
-
end
|
90
|
-
|
91
64
|
end
|
92
65
|
|
93
66
|
|
data/lib/ms/spectrum/compare.rb
CHANGED
@@ -17,14 +17,54 @@ end
|
|
17
17
|
module Ms
|
18
18
|
class Spectrum
|
19
19
|
module Compare
|
20
|
+
|
21
|
+
# percent ion current score: the percent of total ion current of the
|
22
|
+
# calling object that can be explained by other. Ranges from 0-100
|
23
|
+
def pic_score(other, opts={})
|
24
|
+
opts= {:normalize => true}.merge(opts)
|
25
|
+
(a_spec, b_spec) =
|
26
|
+
if opts[:normalize] == true
|
27
|
+
[self.normalize, other.normalize]
|
28
|
+
else
|
29
|
+
[self, other]
|
30
|
+
end
|
31
|
+
overlapping_current = 0.0
|
32
|
+
a_spec.compare(b_spec, opts.merge( {:yield_diff => false} )) do |sint, oint|
|
33
|
+
overlapping_current += [oint, sint].min
|
34
|
+
end
|
35
|
+
100.0 * (overlapping_current / a_spec.intensities.sum)
|
36
|
+
end
|
37
|
+
|
20
38
|
|
39
|
+
# Zhang Analytical Chemistry. 2004 76(14)
|
40
|
+
# "the ratio between the sum of geometric mean and sum of arithmetic mean
|
41
|
+
# of all ions, after the two spectra are normalized to the same total
|
42
|
+
# ion intensity"
|
43
|
+
# The score will be 1 for identical spectra
|
21
44
|
# (Σ (Ii*Ij)^½) / (ΣIi * ΣIj)^½
|
45
|
+
#
|
46
|
+
# options:
|
47
|
+
#
|
48
|
+
# :normalize => true | false (d: true) normalizes intensities first
|
49
|
+
#
|
50
|
+
# relevant options given for 'compare' will be passed through:
|
51
|
+
#
|
52
|
+
# :radius
|
53
|
+
# :type
|
22
54
|
def sim_score(other, opts={})
|
55
|
+
opts = {:normalize => true}.merge(opts)
|
56
|
+
(a_spec, b_spec) =
|
57
|
+
if opts[:normalize] == true
|
58
|
+
[self.normalize, other.normalize]
|
59
|
+
else
|
60
|
+
[self, other]
|
61
|
+
end
|
23
62
|
numer = 0.0
|
24
|
-
|
63
|
+
|
64
|
+
a_spec.compare(b_spec, opts.merge( {:yield_diff => false} )) do |sint, oint|
|
25
65
|
numer += Math.sqrt(sint * oint)
|
26
66
|
end
|
27
|
-
numer / Math.sqrt(
|
67
|
+
numer / Math.sqrt( a_spec.intensities.sum * b_spec.intensities.sum )
|
28
68
|
end
|
29
69
|
|
30
70
|
# opts[:type] == :mutual_best
|
data/lib/ms/spectrum/filter.rb
CHANGED
@@ -0,0 +1,60 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
|
2
|
+
|
3
|
+
require 'rexml/document'
|
4
|
+
require 'ms/msrun/index'
|
5
|
+
|
6
|
+
class MsMsrunIndexSpec < MiniTest::Spec
|
7
|
+
|
8
|
+
before do
|
9
|
+
@indices = @files.map do |file|
|
10
|
+
indices = Ms::Msrun::Index.new(file)
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
def initialize(*args)
|
15
|
+
@files = %w(000.v1.mzXML 000.v2.1.mzXML 020.v2.0.readw.mzXML).map {|v| TESTFILES + '/opd1/' + v }
|
16
|
+
super *args
|
17
|
+
end
|
18
|
+
|
19
|
+
it 'is indexed by scan num and gives doublets of byte and length' do
|
20
|
+
@files.zip(@indices) do |file, index|
|
21
|
+
index.each_with_index do |pair,i|
|
22
|
+
string = IO.read(file, pair.last, pair.first).strip
|
23
|
+
string[0,5].must_equal '<scan'
|
24
|
+
string[-7..-1].must_match %r{</scan>|/peaks>|/msRun>}
|
25
|
+
string.must_match %r{num="#{i+1}"}
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
it 'gives scan_nums' do
|
31
|
+
@indices.each do |index|
|
32
|
+
index.scan_nums.must_equal((1..20).to_a)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
it 'is enumerable' do
|
37
|
+
@indices.each do |index|
|
38
|
+
scan_nums = index.scan_nums
|
39
|
+
index.each_with_index do |doublet,i|
|
40
|
+
index[scan_nums[i]].must_equal doublet
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
it 'gives header length' do
|
46
|
+
header_lengths = [824, 1138, 1147]
|
47
|
+
@indices.zip(@files, header_lengths) do |index, file, header_length|
|
48
|
+
index.header_length.must_equal header_length
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
it 'gives a scan for #first and #last' do
|
53
|
+
# TODO: fill in with actual data too
|
54
|
+
@indices.each do |index|
|
55
|
+
index.first.wont_equal nil
|
56
|
+
index.last.wont_equal nil
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
end
|
@@ -0,0 +1,78 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
|
2
|
+
|
3
|
+
require 'ms/msrun'
|
4
|
+
|
5
|
+
Scan1 = '<scan num="4"
|
6
|
+
msLevel="2"
|
7
|
+
peaksCount="74"
|
8
|
+
polarity="+"
|
9
|
+
scanType="Full"
|
10
|
+
retentionTime="PT3.64S"
|
11
|
+
collisionEnergy="35"
|
12
|
+
lowMz="325"
|
13
|
+
highMz="2000"
|
14
|
+
basePeakMz="1090.05"
|
15
|
+
basePeakIntensity="789939"
|
16
|
+
totIonCurrent="2.27206e+006">
|
17
|
+
<precursorMz precursorIntensity="1.52022e+006">1222.033203</precursorMz>
|
18
|
+
<peaks precision="32"
|
19
|
+
byteOrder="network"
|
20
|
+
pairOrder="m/z-int">Q7Rw2EUK8ABDuWjORQSgAEO5+NhFHLAAQ8gNTEU10ABD2QKcRLCAAEPcdCJFxBAAQ92bFkZzPABEAIucRSbQAEQJuBJFTyAARAqM7EX9+ABECsPMRT7QAEQPyWRF1LgARBoLhETLoABEHjlsRZQwAEQefjRE3yAARCERUkYvuABEIYiKRMMAAEQh01xFifAARCNEKEYpuABEI3kcRWrgAEQjvPhFHRAARCZm7EZtNABEJpXwRnyMAEQmy+pF4QAARCb/RkWfIABEKY28RZQIAEQ6gGBFyHAARDrIYEVEsABEPLuARXJgAEQ9RdREQ8AARD2BIEaV7ABEP7tcRdzoAERChMxHVPcAREK2gEZQAABEQwDkRa/gAEREyLxE3UAARFDwhEXwKABEUT7uRTPQAERTbZZFhfAARFQQvEaK9gBEVOfcRaDQAERWgBJGY5AARFh4ukcWmgBEWMAqRppEAERZgzhF+SgARFsBakXOKABEW4IiR8GBAERbw5pGUvwARFwJcEUooABEXat2RmUoAERegQRHibgARF7FmkU2AABEY6z2RgBIAERvwkxF/pgARHJ9YEYXEABEcrySRgFkAER0gDJINYsARHTFKEeJloBEdPgURoz8AER3hVhIlXggRHfIAEd2YgBEd/acRuh2AER4IiI/gAAARIW+tEVbkABEhdH8RnqcAESIQXhJQNswRIhimEecEgBEiH0cRvKMAESInkBGguYARIp9kEWm0ABEkUz6RdCQAESR//BFH5AARJQhYkYGbABEmxG2RjnYAA==</peaks>
|
21
|
+
</scan>
|
22
|
+
</scan>
|
23
|
+
'
|
24
|
+
|
25
|
+
Scan2 = '<scan num="4"
|
26
|
+
msLevel="2"
|
27
|
+
peaksCount="74"
|
28
|
+
polarity="+"
|
29
|
+
scanType="Full"
|
30
|
+
retentionTime="PT3.64S"
|
31
|
+
collisionEnergy="35"
|
32
|
+
lowMz="325"
|
33
|
+
highMz="2000"
|
34
|
+
basePeakMz="1090.05"
|
35
|
+
basePeakIntensity="789939"
|
36
|
+
totIonCurrent="2.27206e+006">
|
37
|
+
<precursorMz precursorIntensity="1.52022e+006">1222.033203</precursorMz>
|
38
|
+
<peaks precision="32"
|
39
|
+
byteOrder="network"
|
40
|
+
pairOrder="m/z-int">Q7Rw2EUK8ABDuWjORQSgAEO5+NhFHLAAQ8gNTEU10ABD2QKcRLCAAEPcdCJFxBAAQ92bFkZzPABEAIucRSbQAEQJuBJFTyAARAqM7EX9+ABECsPMRT7QAEQPyWRF1LgARBoLhETLoABEHjlsRZQwAEQefjRE3yAARCERUkYvuABEIYiKRMMAAEQh01xFifAARCNEKEYpuABEI3kcRWrgAEQjvPhFHRAARCZm7EZtNABEJpXwRnyMAEQmy+pF4QAARCb/RkWfIABEKY28RZQIAEQ6gGBFyHAARDrIYEVEsABEPLuARXJgAEQ9RdREQ8AARD2BIEaV7ABEP7tcRdzoAERChMxHVPcAREK2gEZQAABEQwDkRa/gAEREyLxE3UAARFDwhEXwKABEUT7uRTPQAERTbZZFhfAARFQQvEaK9gBEVOfcRaDQAERWgBJGY5AARFh4ukcWmgBEWMAqRppEAERZgzhF+SgARFsBakXOKABEW4IiR8GBAERbw5pGUvwARFwJcEUooABEXat2RmUoAERegQRHibgARF7FmkU2AABEY6z2RgBIAERvwkxF/pgARHJ9YEYXEABEcrySRgFkAER0gDJINYsARHTFKEeJloBEdPgURoz8AER3hVhIlXggRHfIAEd2YgBEd/acRuh2AER4IiI/gAAARIW+tEVbkABEhdH8RnqcAESIQXhJQNswRIhimEecEgBEiH0cRvKMAESInkBGguYARIp9kEWm0ABEkUz6RdCQAESR//BFH5AARJQhYkYGbABEmxG2RjnYAA==</peaks>
|
41
|
+
'
|
42
|
+
|
43
|
+
Scan3 = '<scan num="4"
|
44
|
+
msLevel="2"
|
45
|
+
peaksCount="74"
|
46
|
+
polarity="+"
|
47
|
+
scanType="Full"
|
48
|
+
retentionTime="PT3.64S"
|
49
|
+
collisionEnergy="35"
|
50
|
+
lowMz="325"
|
51
|
+
highMz="2000"
|
52
|
+
basePeakMz="1090.05"
|
53
|
+
basePeakIntensity="789939"
|
54
|
+
totIonCurrent="2.27206e+006">
|
55
|
+
<precursorMz precursorIntensity="1.52022e+006">1222.033203</precursorMz>
|
56
|
+
<peaks precision="32"
|
57
|
+
byteOrder="network"
|
58
|
+
pairOrder="m/z-int">Q7Rw2EUK8ABDuWjORQSgAEO5+NhFHLAAQ8gNTEU10ABD2QKcRLCAAEPcdCJFxBAAQ92bFkZzPABEAIucRSbQAEQJuBJFTyAARAqM7EX9+ABECsPMRT7QAEQPyWRF1LgARBoLhETLoABEHjlsRZQwAEQefjRE3yAARCERUkYvuABEIYiKRMMAAEQh01xFifAARCNEKEYpuABEI3kcRWrgAEQjvPhFHRAARCZm7EZtNABEJpXwRnyMAEQmy+pF4QAARCb/RkWfIABEKY28RZQIAEQ6gGBFyHAARDrIYEVEsABEPLuARXJgAEQ9RdREQ8AARD2BIEaV7ABEP7tcRdzoAERChMxHVPcAREK2gEZQAABEQwDkRa/gAEREyLxE3UAARFDwhEXwKABEUT7uRTPQAERTbZZFhfAARFQQvEaK9gBEVOfcRaDQAERWgBJGY5AARFh4ukcWmgBEWMAqRppEAERZgzhF+SgARFsBakXOKABEW4IiR8GBAERbw5pGUvwARFwJcEUooABEXat2RmUoAERegQRHibgARF7FmkU2AABEY6z2RgBIAERvwkxF/pgARHJ9YEYXEABEcrySRgFkAER0gDJINYsARHTFKEeJloBEdPgURoz8AER3hVhIlXggRHfIAEd2YgBEd/acRuh2AER4IiI/gAAARIW+tEVbkABEhdH8RnqcAESIQXhJQNswRIhimEecEgBEiH0cRvKMAESInkBGguYARIp9kEWm0ABEkUz6RdCQAESR//BFH5AARJQhYkYGbABEmxG2RjnYAA==</peaks>
|
59
|
+
</scan>
|
60
|
+
</scan>
|
61
|
+
</msRun>
|
62
|
+
'
|
63
|
+
|
64
|
+
#class Sha1Spec < MiniTest::Spec
|
65
|
+
#def initialize(*args)
|
66
|
+
#@files = %w(000.v1.mzXML 020.v2.0.readw.mzXML 000.v2.1.mzXML).map do |file|
|
67
|
+
#TESTFILES + "/opd1/#{file}"
|
68
|
+
#end
|
69
|
+
#super(*args)
|
70
|
+
#end
|
71
|
+
|
72
|
+
### NOTE: this does NOT match up to real files yet!
|
73
|
+
#it 'can read xml scans with extra or missing tags' do
|
74
|
+
#Scan.new(from_xml)
|
75
|
+
#end
|
76
|
+
|
77
|
+
|
78
|
+
#end
|