X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=code_ruby%2Flib%2Fmaasha%2Fsff.rb;h=6b277e39b9c9b0e602c08ec386e56968e64df613;hb=fe96759f8f0cbc43b1b6965ee638c5415ef48c48;hp=0a9d2a1ffce40ccd0ba40f183b84a4e265cc2c74;hpb=494dc53ebd515b1e3e9b91bbebf43059899ca4ce;p=biopieces.git diff --git a/code_ruby/lib/maasha/sff.rb b/code_ruby/lib/maasha/sff.rb index 0a9d2a1..6b277e3 100644 --- a/code_ruby/lib/maasha/sff.rb +++ b/code_ruby/lib/maasha/sff.rb @@ -23,6 +23,7 @@ # >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>><<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< require 'maasha/base36' +require 'maasha/seq' # Error class for all exceptions to do with SFF. class SFFError < StandardError; end @@ -35,8 +36,6 @@ BIT_MASK = (1 << BIT_SHIFT) - 1 class SFF include Enumerable - @@count = 0 - # Class method for opening SFF files. def self.open(*args) ios = File.open(*args) @@ -69,6 +68,7 @@ class SFF @flow_chars = "" @key_sequence = "" @eight_byte_padding = 0 + @count = 0 header_parse end @@ -127,7 +127,7 @@ class SFF # Method to parse a read section of an SFF file. def read_parse - return nil if @number_of_reads == @@count + return nil if @number_of_reads == @count template = "nnNnnnn" @@ -160,7 +160,7 @@ class SFF fast_forward - @@count += 1 + @count += 1 read end @@ -195,7 +195,11 @@ class Read # Method that converts a Read object's data to a Biopiece record (a hash). def to_bp - coordinates_get + # Simulated SFF files may not have coordinates. + begin + coordinates_get + rescue + end hash = {} @@ -206,13 +210,18 @@ class Read hash[:CLIP_QUAL_RIGHT] = self.clip_qual_right - 1 hash[:CLIP_ADAPTOR_LEFT] = self.clip_adapter_left - 1 hash[:CLIP_ADAPTOR_RIGHT] = self.clip_adaptor_right - 1 - hash[:SCORES] = self.quality_scores.map { |i| (i += 64).chr }.join "" + hash[:SCORES] = self.quality_scores.map { |i| (i += Seq::SCORE_BASE).chr }.join "" hash[:X_POS] = self.x_pos hash[:Y_POS] = self.y_pos hash end + # Method that converts a Read object's data to a Seq object. + def to_seq + Seq.new(self.name, self.bases, nil, self.quality_scores.map { |i| (i += Seq::SCORE_BASE).chr }.join("") ) + end + # Method that soft masks the sequence (i.e. lowercases sequence) according to # clip_qual_left and clip_qual_right information. def mask @@ -221,6 +230,8 @@ class Read right = self.bases[self.clip_qual_right ... self.bases.length].downcase self.bases = left + middle + right + + self end # Method that clips sequence (i.e. trims) according to @@ -228,6 +239,8 @@ class Read def clip self.bases = self.bases[self.clip_qual_left - 1 ... self.clip_qual_right] self.quality_scores = self.quality_scores[self.clip_qual_left - 1 ... self.clip_qual_right] + + self end private