bio-faster 0.2.2 → 0.4.2

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.
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