bio-faster 0.2.2 → 0.4.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (63) hide show
  1. data/.travis.yml +2 -3
  2. data/Gemfile +2 -0
  3. data/Gemfile.lock +2 -0
  4. data/LICENSE.txt +1 -1
  5. data/README.md +2 -3
  6. data/Rakefile +9 -15
  7. data/VERSION +1 -1
  8. data/bio-faster.gemspec +56 -12
  9. data/ext/faster.c +115 -52
  10. data/ext/mkrf_conf.rb +40 -0
  11. data/lib/bio-faster.rb +5 -4
  12. data/lib/bio/faster.rb +57 -0
  13. data/lib/bio/faster/library.rb +26 -0
  14. data/spec/fastq_error_spec.rb +55 -0
  15. data/spec/parser_spec.rb +28 -116
  16. data/test/data/errors/error_header.fastq +20 -0
  17. data/test/data/errors/error_long_qual.fastq +20 -0
  18. data/test/data/errors/error_qual_del.fastq +20 -0
  19. data/test/data/errors/error_qual_escape.fastq +20 -0
  20. data/test/data/errors/error_qual_null.fastq +0 -0
  21. data/test/data/errors/error_qual_space.fastq +20 -0
  22. data/test/data/errors/error_qual_tab.fastq +20 -0
  23. data/test/data/errors/error_qual_unit_sep.fastq +20 -0
  24. data/test/data/errors/error_qual_vtab.fastq +20 -0
  25. data/test/data/errors/error_spaces.fastq +20 -0
  26. data/test/data/errors/error_tabs.fastq +21 -0
  27. data/test/data/errors/error_trunc_at_qual.fastq +19 -0
  28. data/test/data/errors/error_trunc_at_seq.fastq +18 -0
  29. data/test/data/errors/error_trunc_in_qual.fastq +20 -0
  30. data/test/data/errors/error_trunc_in_seq.fastq +18 -0
  31. data/test/data/formats/illumina_full_range_as_illumina.fastq +8 -0
  32. data/test/data/formats/illumina_full_range_as_sanger.fastq +8 -0
  33. data/test/data/formats/illumina_full_range_as_solexa.fastq +8 -0
  34. data/test/data/formats/illumina_full_range_original_illumina.fastq +8 -0
  35. data/test/data/formats/longreads_as_illumina.fastq +40 -0
  36. data/test/data/formats/longreads_as_sanger.fastq +40 -0
  37. data/test/data/formats/longreads_as_solexa.fastq +40 -0
  38. data/test/data/formats/misc_dna_as_illumina.fastq +16 -0
  39. data/test/data/formats/misc_dna_as_sanger.fastq +16 -0
  40. data/test/data/formats/misc_dna_as_solexa.fastq +16 -0
  41. data/test/data/formats/misc_dna_original_sanger.fastq +16 -0
  42. data/test/data/formats/misc_rna_as_illumina.fastq +16 -0
  43. data/test/data/formats/misc_rna_as_sanger.fastq +16 -0
  44. data/test/data/formats/misc_rna_as_solexa.fastq +16 -0
  45. data/test/data/formats/misc_rna_original_sanger.fastq +16 -0
  46. data/test/data/formats/sanger_full_range_as_illumina.fastq +8 -0
  47. data/test/data/formats/sanger_full_range_as_sanger.fastq +8 -0
  48. data/test/data/formats/sanger_full_range_as_solexa.fastq +8 -0
  49. data/test/data/formats/sanger_full_range_original_sanger.fastq +8 -0
  50. data/test/data/formats/solexa_full_range_as_illumina.fastq +8 -0
  51. data/test/data/formats/solexa_full_range_as_sanger.fastq +8 -0
  52. data/test/data/formats/solexa_full_range_as_solexa.fastq +8 -0
  53. data/test/data/formats/solexa_full_range_original_solexa.fastq +8 -0
  54. data/test/data/formats/wrapping_as_illumina.fastq +12 -0
  55. data/test/data/formats/wrapping_as_sanger.fastq +12 -0
  56. data/test/data/formats/wrapping_as_solexa.fastq +12 -0
  57. metadata +88 -24
  58. data/ext/extconf.rb +0 -7
  59. data/ext/kseq.h +0 -223
  60. data/test/data/sample.fasta +0 -10
  61. data/test/data/sample.fastq +0 -24
  62. data/test/data/sample.fastq.gz +0 -0
  63. data/test/data/sff_sample.fastq +0 -16
@@ -1,6 +1,7 @@
1
- #
2
- # Copyright(C) 2011 Francesco Strozzi <francesco.strozzi@gmail.com>
3
- #
4
1
 
5
- require File.expand_path(File.join(File.dirname(__FILE__),'..','ext','faster'))
2
+ require 'ffi'
3
+ require 'bio/faster/library'
4
+ require 'bio/faster'
5
+
6
+
6
7
 
@@ -0,0 +1,57 @@
1
+
2
+ #
3
+ # Copyright(C) 2012 Francesco Strozzi <francesco.strozzi@gmail.com>
4
+ #
5
+
6
+ module Bio
7
+
8
+ class Faster
9
+
10
+ extend FFI::Library
11
+
12
+ ffi_lib Bio::Faster::Library.load
13
+
14
+ attr_accessor :file
15
+ attr_accessor :encoding
16
+ def initialize(file, encoding = :sanger)
17
+ self.file = file
18
+ self.encoding = encoding
19
+ end
20
+
21
+ class FastQRecord < FFI::Struct
22
+ layout :id, :pointer,
23
+ :seq, :pointer,
24
+ :quality, :pointer,
25
+ :raw_quality, :pointer,
26
+ :filename, :pointer,
27
+ :stream, :pointer,
28
+ :line, :pointer,
29
+ :bad_chars, :pointer
30
+
31
+ end
32
+
33
+ attach_function :fastQ_iterator, [FastQRecord, :int], :int
34
+
35
+ def each_record
36
+ raise ArgumentError, "File #{self.file} does not exist" unless File.exists? self.file
37
+ record = FastQRecord.new
38
+ scale_factor = nil
39
+ case self.encoding
40
+ when :sanger then scale_factor = 33
41
+ when :solexa then scale_factor = 64
42
+ end
43
+ record[:filename] = FFI::MemoryPointer.from_string self.file
44
+ while (result = Bio::Faster.fastQ_iterator(record,scale_factor)) == 1
45
+ yield [record[:id].read_string,record[:seq].read_string,record[:quality].read_array_of_int(record[:raw_quality].read_string.length)]
46
+ end
47
+ case result
48
+ when -1 then raise RuntimeError, "Bad formatted FastQ file!"
49
+ when -2 then raise RuntimeError, "Sequence or quality is truncated!"
50
+ end
51
+
52
+
53
+ end
54
+
55
+
56
+ end
57
+ end
@@ -0,0 +1,26 @@
1
+ module Bio
2
+ class Faster
3
+ class Library
4
+
5
+ require 'rbconfig'
6
+
7
+ def self.lib_extension
8
+ case RbConfig::CONFIG['host_os']
9
+ when /linux/ then return 'so'
10
+ when /darwin/ then return 'dylib'
11
+ else raise NotImplementedError, "Native library is not available for Windows platform"
12
+ end
13
+ end
14
+
15
+ # Load the correct library for the OS system in use
16
+ # @return [String] the absolute path for the filename of the shared library
17
+ # @note this method is called automatically when the module is loaded
18
+ def self.load
19
+ path = File.expand_path File.dirname(__FILE__)
20
+ path.gsub!(/lib\/bio\/faster/,'ext')
21
+ File.join(path,"libfaster.#{self.lib_extension}")
22
+ end
23
+
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,55 @@
1
+ require 'helper'
2
+
3
+ describe Bio::Faster do
4
+
5
+ describe "#each_record error handling" do
6
+
7
+ it "should raise an error if the header is wrong" do
8
+ expect {Bio::Faster.new(File.join(TEST_DATA+"/errors/","error_header.fastq")).each_record {|seq|}}.to raise_error(RuntimeError)
9
+ end
10
+
11
+ it "should raise and error if there is a space in the quality string" do
12
+ expect {Bio::Faster.new(File.join(TEST_DATA+"/errors/","error_qual_space.fastq")).each_record {|seq|}}.to raise_error(RuntimeError)
13
+ end
14
+
15
+ it "should raise and error if there is a tab in the quality string" do
16
+ expect {Bio::Faster.new(File.join(TEST_DATA+"/errors/","error_qual_tab.fastq")).each_record {|seq|}}.to raise_error(RuntimeError)
17
+ end
18
+
19
+ it "should raise and error if there is a v-tab in the quality string" do
20
+ expect {Bio::Faster.new(File.join(TEST_DATA+"/errors/","error_qual_vtab.fastq")).each_record {|seq|}}.to raise_error(RuntimeError)
21
+ end
22
+
23
+ it "should raise and error if there is a space in the sequence string" do
24
+ expect {Bio::Faster.new(File.join(TEST_DATA+"/errors/","error_spaces.fastq")).each_record {|seq|}}.to raise_error(RuntimeError)
25
+ end
26
+
27
+ it "should raise and error if there is a tab in the sequence string" do
28
+ expect {Bio::Faster.new(File.join(TEST_DATA+"/errors/","error_tabs.fastq")).each_record {|seq|}}.to raise_error(RuntimeError)
29
+ end
30
+
31
+ it "should raise and error if there is a delete char in the quality string" do
32
+ expect {Bio::Faster.new(File.join(TEST_DATA+"/errors/","error_qual_del.fastq")).each_record {|seq|}}.to raise_error(RuntimeError)
33
+ end
34
+
35
+ it "should raise and error if there is an escape in the quality string" do
36
+ expect {Bio::Faster.new(File.join(TEST_DATA+"/errors/","error_qual_escape.fastq")).each_record {|seq|}}.to raise_error(RuntimeError)
37
+ end
38
+
39
+ it "should raise and error if there is a unit separator char in the quality string" do
40
+ expect {Bio::Faster.new(File.join(TEST_DATA+"/errors/","error_qual_unit_sep.fastq")).each_record {|seq|}}.to raise_error(RuntimeError)
41
+ end
42
+
43
+ it "should raise an error if sequence and quality are truncated or different in length" do
44
+ expect {Bio::Faster.new(File.join(TEST_DATA+"/errors/","error_trunc_at_qual.fastq")).each_record {|seq|}}.to raise_error(RuntimeError)
45
+ expect {Bio::Faster.new(File.join(TEST_DATA+"/errors/","error_trunc_at_seq.fastq")).each_record {|seq|}}.to raise_error(RuntimeError)
46
+ expect {Bio::Faster.new(File.join(TEST_DATA+"/errors/","error_qual_null.fastq")).each_record {|seq|}}.to raise_error(RuntimeError)
47
+ expect {Bio::Faster.new(File.join(TEST_DATA+"/errors/","error_long_qual.fastq")).each_record {|seq|}}.to raise_error(RuntimeError)
48
+ expect {Bio::Faster.new(File.join(TEST_DATA+"/errors/","error_trunc_in_seq.fastq")).each_record {|seq|}}.to raise_error(RuntimeError)
49
+ expect {Bio::Faster.new(File.join(TEST_DATA+"/errors/","error_trunc_in_qual.fastq")).each_record {|seq|}}.to raise_error(RuntimeError)
50
+ end
51
+
52
+
53
+ end
54
+
55
+ end
@@ -2,136 +2,48 @@ require 'helper'
2
2
 
3
3
  describe Bio::Faster do
4
4
 
5
- describe "#parser" do
6
-
7
- it "reads both Fasta and FastQ format files" do
8
- res = Bio::Faster.parse(File.join(TEST_DATA,"sample.fastq")) {|seq|}
9
- res.should == true
10
- res = Bio::Faster.parse(File.join(TEST_DATA,"sample.fasta")) {|seq|}
11
- res.should == true
12
- end
13
-
14
- it "needs a valid block to parse files" do
15
- expect { Bio::Faster.parse(File.join(TEST_DATA,"sample.fastq")) }.to raise_error(ArgumentError)
16
- end
17
-
18
- it "throws an error if file does not exists" do
19
- expect { Bio::Faster.parse(File.join(TEST_DATA,"dummy.fastq")) }.to raise_error(ArgumentError)
20
- end
21
-
22
- it "returns an array with id, comment, sequence and an array with qualities (FastQ only)" do
23
- Bio::Faster.parse(File.join(TEST_DATA,"sample.fastq")) do |seq|
24
- seq.class.should == Array
25
- seq.size.should == 4
26
- seq[-1].class.should == Array
27
- end
28
-
29
- Bio::Faster.parse(File.join(TEST_DATA,"sample.fasta")) do |seq|
5
+ describe "#each_record" do
6
+
7
+ it "should read a FastQ file returning an array with sequence data" do
8
+ Bio::Faster.new(TEST_DATA+"/formats/illumina_full_range_as_illumina.fastq").each_record do |seq|
30
9
  seq.class.should == Array
31
- seq.size.should == 3
32
10
  end
33
-
34
- end
35
-
36
- it "reads gzipped files" do
37
- res = Bio::Faster.parse(File.join(TEST_DATA,"sample.fastq")) {|seq|}
38
- res.should == true
39
- end
40
-
41
- it "parse correctly FastQ files" do
42
- faster_res = []
43
- Bio::Faster.parse(File.join(TEST_DATA,"sample.fastq")) {|seq| faster_res << seq}
44
- faster_res[0][0].should == "HISEQ1:86:D0306ACXX:2:1101:20970:17588"
45
- faster_res[0][1].should == "1:N:0:CTTGTA"
46
- faster_res[0][2].should == "CGGTGCTGTTGTTATGCTGATGCTTATTAGTGCAAGTGTAGCTCCTCCGATTAGATGAATTAACAGGTGTCCTGCAGTAATGTTGGCTGTTAGTCGTAC"
47
-
48
- faster_res[-1][0].should == "HISEQ1:86:D0306ACXX:2:1101:1411:17830"
49
- faster_res[-1][1].should == "1:Y:0:CTTGTA"
50
- faster_res[-1][2].should == "CGGCGGGCGTGGGGAGAGAGCTATGAAGGCCTCAGGGAAGCTTCGAGAGTATAAGGTGTTGGGGTGCTGCCTGCCAACCCCCAAATTCCACACACCACC"
51
11
  end
52
-
53
- it "parse correctly compressed FastQ files" do
54
- faster_res = []
55
- Bio::Faster.parse(File.join(TEST_DATA,"sample.fastq.gz")) {|seq| faster_res << seq}
56
- faster_res[0][0].should == "HISEQ1:86:D0306ACXX:2:1101:20970:17588"
57
- faster_res[0][1].should == "1:N:0:CTTGTA"
58
- faster_res[0][2].should == "CGGTGCTGTTGTTATGCTGATGCTTATTAGTGCAAGTGTAGCTCCTCCGATTAGATGAATTAACAGGTGTCCTGCAGTAATGTTGGCTGTTAGTCGTAC"
59
-
60
- faster_res[-1][0].should == "HISEQ1:86:D0306ACXX:2:1101:1411:17830"
61
- faster_res[-1][1].should == "1:Y:0:CTTGTA"
62
- faster_res[-1][2].should == "CGGCGGGCGTGGGGAGAGAGCTATGAAGGCCTCAGGGAAGCTTCGAGAGTATAAGGTGTTGGGGTGCTGCCTGCCAACCCCCAAATTCCACACACCACC"
63
- end
64
-
65
12
 
66
- it "parse correctly Fasta files" do
67
- faster_res = []
68
- Bio::Faster.parse(File.join(TEST_DATA,"sample.fasta")) {|seq| faster_res << seq}
69
- faster_res[0][0].should == "seq1"
70
- faster_res[0][1].should == "comment1"
71
- faster_res[0][2].should == "AGCAATTTCCCTTTTCCTGTCCTTTTTATAACATTGTGGAGGAAGACGGCAGCATAAAAAGGACAGTATTTGATTAAAAAATGATAAAAATTTTCAAAC"
72
-
73
- faster_res[-1][0].should == "seq4"
74
- faster_res[-1][1].should == nil
75
- faster_res[-1][2].should == "mgltrrealssiaavggekalkdalavlggps"
76
- end
77
-
78
- it "can return the sequence data in a more friendly way" do
79
- Bio::Faster.parse(File.join(TEST_DATA,"sample.fastq")) do |sequence_id, comment, sequence, quality|
80
- sequence_id.should == "HISEQ1:86:D0306ACXX:2:1101:20970:17588"
81
- comment.should == "1:N:0:CTTGTA"
82
- sequence.should == "CGGTGCTGTTGTTATGCTGATGCTTATTAGTGCAAGTGTAGCTCCTCCGATTAGATGAATTAACAGGTGTCCTGCAGTAATGTTGGCTGTTAGTCGTAC"
83
- quality.class.should == Array
84
- break
13
+ it "should handle correctly Phred64 qualities (Solexa)" do
14
+ file = TEST_DATA+"/formats/misc_rna_as_solexa.fastq"
15
+ bioruby_data = []
16
+ Bio::FlatFile.open(File.open(file)).each_entry do |seq|
17
+ seq.format = "fastq-solexa"
18
+ bioruby_data << [seq.entry_id,seq.seq,seq.qualities]
85
19
  end
86
- end
87
-
88
- it "can return the sequence data in a more friendly way (also for FastA)" do
89
- Bio::Faster.parse(File.join(TEST_DATA,"sample.fasta")) do |sequence_id, comment, sequence, quality|
90
- quality.should == nil # it is a Fasta file, so no quality
91
- sequence_id.should == "seq1"
92
- comment.should == "comment1"
93
- sequence.should == "AGCAATTTCCCTTTTCCTGTCCTTTTTATAACATTGTGGAGGAAGACGGCAGCATAAAAAGGACAGTATTTGATTAAAAAATGATAAAAATTTTCAAAC"
94
- break
20
+ faster_data = []
21
+ Bio::Faster.new(file, :solexa).each_record do |seq|
22
+ seq[0] = seq[0].split(" ").first
23
+ faster_data << seq
95
24
  end
25
+ faster_data.should == bioruby_data
96
26
  end
97
-
98
-
99
- describe "quality conversion for FastQ files (Sanger/Phred only)" do
100
27
 
101
- it "converts directly quality scores for Illumina 1.8+ FastQ files" do
102
-
103
- bioruby_quals = []
104
- # standard Quality conversion as done in BioRuby Bio::FastQ
105
- Bio::FlatFile.open(Bio::Fastq,File.open(File.join(TEST_DATA,"sample.fastq"))).each_entry do |seq|
106
- bioruby_quals << seq.qualities
28
+ it "should read different FastQ formats" do
29
+ files = Dir.glob(TEST_DATA+"/formats/*.fastq")
30
+ files.each do |file|
31
+ bioruby_data = []
32
+ Bio::FlatFile.open(Bio::Fastq,File.open(file)).each_entry do |seq|
33
+ bioruby_data << [seq.entry_id,seq.seq,seq.qualities]
107
34
  end
108
-
109
- faster_quals = []
110
- Bio::Faster.parse(File.join(TEST_DATA,"sample.fastq")) do |sequence_id, comment, sequence, quality|
111
- faster_quals << quality
35
+ faster_data = []
36
+ Bio::Faster.new(file).each_record do |seq|
37
+ seq[0] = seq[0].split(" ").first
38
+ faster_data << seq
112
39
  end
113
- faster_quals.should == bioruby_quals
114
-
40
+ faster_data.should == bioruby_data
115
41
  end
116
42
 
117
- it "converts directly quality scores for SFF 454 FastQ files" do
118
-
119
- bioruby_quals = []
120
- # standard Quality conversion as done in BioRuby Bio::FastQ
121
- Bio::FlatFile.open(Bio::Fastq,File.open(File.join(TEST_DATA,"sff_sample.fastq"))).each_entry do |seq|
122
- bioruby_quals << seq.qualities
123
- end
43
+ end
124
44
 
125
- faster_quals = []
126
- Bio::Faster.parse(File.join(TEST_DATA,"sff_sample.fastq")) do |sequence_id, comment, sequence, quality|
127
- faster_quals << quality
128
- end
129
- faster_quals.should == bioruby_quals
130
45
 
131
- end
132
-
133
- end
134
-
135
46
  end
47
+
136
48
 
137
49
  end
@@ -0,0 +1,20 @@
1
+ SLXA-B3_649_FC8437_R1_1_1_610_79
2
+ GATGTGCAATACCTTTGTAGAGGAA
3
+ +SLXA-B3_649_FC8437_R1_1_1_610_79
4
+ YYYYYYYYYYYYYYYYYYWYWYYSU
5
+ @SLXA-B3_649_FC8437_R1_1_1_397_389
6
+ GGTTTGAGAAAGAGAAATGAGATAA
7
+ +SLXA-B3_649_FC8437_R1_1_1_397_389
8
+ YYYYYYYYYWYYYYWWYYYWYWYWW
9
+ @SLXA-B3_649_FC8437_R1_1_1_850_123
10
+ GAGGGTGTTGATCATGATGATGGCG
11
+ +SLXA-B3_649_FC8437_R1_1_1_850_123
12
+ YYYYYYYYYYYYYWYYWYYSYYYSY
13
+ @SLXA-B3_649_FC8437_R1_1_1_362_549
14
+ GGAAACAAAGTTTTTCTCAACATAG
15
+ +SLXA-B3_649_FC8437_R1_1_1_362_549
16
+ YYYYYYYYYYYYYYYYYYWWWWYWYY
17
+ @SLXA-B3_649_FC8437_R1_1_1_183_714
18
+ GTATTATTTAATGGCATACACTCAA
19
+ +SLXA-B3_649_FC8437_R1_1_1_183_714
20
+ YYYYYYYYYYWYYYYWYWWUWWWQQ
@@ -0,0 +1,20 @@
1
+ @SLXA-B3_649_FC8437_R1_1_1_610_79
2
+ GATGTGCAATACCTTTGTAGAGGAA
3
+ +SLXA-B3_649_FC8437_R1_1_1_610_79
4
+ YYYYYYYYYYYYYYYYYYWYWYYSU
5
+ @SLXA-B3_649_FC8437_R1_1_1_397_389
6
+ GGTTTGAGAAAGAGAAATGAGATAA
7
+ +SLXA-B3_649_FC8437_R1_1_1_397_389
8
+ YYYYYYYYYWYYYYWWYYYWYWYWW
9
+ @SLXA-B3_649_FC8437_R1_1_1_850_123
10
+ GAGGGTGTTGATCATGATGATGGCG
11
+ +SLXA-B3_649_FC8437_R1_1_1_850_123
12
+ YYYYYYYYYYYYYWYYWYYSYYYSY
13
+ @SLXA-B3_649_FC8437_R1_1_1_362_549
14
+ GGAAACAAAGTTTTTCTCAACATAG
15
+ +SLXA-B3_649_FC8437_R1_1_1_362_549
16
+ YYYYYYYYYYYYYYYYYYWWWWYWYY
17
+ @SLXA-B3_649_FC8437_R1_1_1_183_714
18
+ GTATTATTTAATGGCATACACTCAA
19
+ +SLXA-B3_649_FC8437_R1_1_1_183_714
20
+ YYYYYYYYYYWYYYYWYWWUWWWQQ
@@ -0,0 +1,20 @@
1
+ @SLXA-B3_649_FC8437_R1_1_1_610_79
2
+ GATGTGCAATACCTTTGTAGAGGAA
3
+ +SLXA-B3_649_FC8437_R1_1_1_610_79
4
+ YYYYYYYYYYYYYYYYYYWYWYYSU
5
+ @SLXA-B3_649_FC8437_R1_1_1_397_389
6
+ GGTTTGAGAAAGAGAAATGAGATAA
7
+ +SLXA-B3_649_FC8437_R1_1_1_397_389
8
+ YYYYYYYYYWYYYYWWYYYWYWYWW
9
+ @SLXA-B3_649_FC8437_R1_1_1_850_123
10
+ GAGGGTGTTGATCATGATGATGGCG
11
+ +SLXA-B3_649_FC8437_R1_1_1_850_123
12
+ YYYYYYYYYYYYYWYYWYYSYYYSY
13
+ @SLXA-B3_649_FC8437_R1_1_1_362_549
14
+ GGAAACAAAGTTTTTCTCAACATAG
15
+ +SLXA-B3_649_FC8437_R1_1_1_362_549
16
+ YYYYYYYYYYYYYYYYYWWWWYWY
17
+ @SLXA-B3_649_FC8437_R1_1_1_183_714
18
+ GTATTATTTAATGGCATACACTCAA
19
+ +SLXA-B3_649_FC8437_R1_1_1_183_714
20
+ YYYYYYYYYYWYYYYWYWWUWWWQQ
@@ -0,0 +1,20 @@
1
+ @SLXA-B3_649_FC8437_R1_1_1_610_79
2
+ GATGTGCAATACCTTTGTAGAGGAA
3
+ +SLXA-B3_649_FC8437_R1_1_1_610_79
4
+ YYYYYYYYYYYYYYYYYYWYWYYSU
5
+ @SLXA-B3_649_FC8437_R1_1_1_397_389
6
+ GGTTTGAGAAAGAGAAATGAGATAA
7
+ +SLXA-B3_649_FC8437_R1_1_1_397_389
8
+ YYYYYYYYYWYYYYWWYYYWYWYWW
9
+ @SLXA-B3_649_FC8437_R1_1_1_850_123
10
+ GAGGGTGTTGATCATGATGATGGCG
11
+ +SLXA-B3_649_FC8437_R1_1_1_850_123
12
+ YYYYYYYYYYYYYWYYWYYSYYYSY
13
+ @SLXA-B3_649_FC8437_R1_1_1_362_549
14
+ GGAAACAAAGTTTTTCTCAACATAG
15
+ +SLXA-B3_649_FC8437_R1_1_1_362_549
16
+ YYYYYYYYYYYYYYYYYYWWWWYWY
17
+ @SLXA-B3_649_FC8437_R1_1_1_183_714
18
+ GTATTATTTAATGGCATACACTCAA
19
+ +SLXA-B3_649_FC8437_R1_1_1_183_714
20
+ YYYYYYYYYWYYYYWYWWUWWWQQ
@@ -0,0 +1,20 @@
1
+ @SLXA-B3_649_FC8437_R1_1_1_610_79
2
+ GATGTGCAATACCTTTGTAGAGGAA
3
+ +SLXA-B3_649_FC8437_R1_1_1_610_79
4
+ YYYYYYYYYYYYYYYYYYWYWYYSU
5
+ @SLXA-B3_649_FC8437_R1_1_1_397_389
6
+ GGTTTGAGAAAGAGAAATGAGATAA
7
+ +SLXA-B3_649_FC8437_R1_1_1_397_389
8
+ YYYYYYYYYWYYYYWWYYYWYWYWW
9
+ @SLXA-B3_649_FC8437_R1_1_1_850_123
10
+ GAGGGTGTTGATCATGATGATGGCG
11
+ +SLXA-B3_649_FC8437_R1_1_1_850_123
12
+ YYYYYYYYYYYYYWYYWYYSYYYSY
13
+ @SLXA-B3_649_FC8437_R1_1_1_362_549
14
+ GGAAACAAAGTTTTTCTCAACATAG
15
+ +SLXA-B3_649_FC8437_R1_1_1_362_549
16
+ YYYYYYYYYYYYYYYYYY WWWYWY
17
+ @SLXA-B3_649_FC8437_R1_1_1_183_714
18
+ GTATTATTTAATGGCATACACTCAA
19
+ +SLXA-B3_649_FC8437_R1_1_1_183_714
20
+ YYYYYYYYYYWYYYYWYWWUWWWQQ
@@ -0,0 +1,20 @@
1
+ @SLXA-B3_649_FC8437_R1_1_1_610_79
2
+ GATGTGCAATACCTTTGTAGAGGAA
3
+ +SLXA-B3_649_FC8437_R1_1_1_610_79
4
+ YYYYYYYYYYYYYYYYYYWYWYYSU
5
+ @SLXA-B3_649_FC8437_R1_1_1_397_389
6
+ GGTTTGAGAAAGAGAAATGAGATAA
7
+ +SLXA-B3_649_FC8437_R1_1_1_397_389
8
+ YYYYYYYYYWYYYYWWYYYWYWYWW
9
+ @SLXA-B3_649_FC8437_R1_1_1_850_123
10
+ GAGGGTGTTGATCATGATGATGGCG
11
+ +SLXA-B3_649_FC8437_R1_1_1_850_123
12
+ YYYYYYYYYYYYYWYYWYYSYYYSY
13
+ @SLXA-B3_649_FC8437_R1_1_1_362_549
14
+ GGAAACAAAGTTTTTCTCAACATAG
15
+ +SLXA-B3_649_FC8437_R1_1_1_362_549
16
+ YYYYYYYYYYYYYYYYYYWWWWYWY
17
+ @SLXA-B3_649_FC8437_R1_1_1_183_714
18
+ GTATTATTTAATGGCATACACTCAA
19
+ +SLXA-B3_649_FC8437_R1_1_1_183_714
20
+ YYYYYYYYYY YYYYWYWWUWWWQQ