# >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>><<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
+require 'base36'
+
# Error class for all exceptions to do with SFF.
class SFFError < StandardError; end
+BIT_SHIFT = 12
+BIT_MASK = (1 << BIT_SHIFT) - 1
+
# Class containing methods to parse SFF files:
# http://www.ncbi.nlm.nih.gov/Traces/trace.cgi?cmd=show&f=formats&m=doc&s=format#sff
class SFF
class Read
attr_accessor :read_header_length, :name_length, :number_of_bases,
:clip_qual_left, :clip_qual_right, :clip_adapter_left, :clip_adaptor_right,
- :name, :flowgram_values, :flow_index_per_base, :bases, :quality_scores
+ :name, :flowgram_values, :flow_index_per_base, :bases, :quality_scores,
+ :x_pos, :y_pos
# Method that converts a Read object's data to a Biopiece record (a hash).
def to_bp
+ coordinates_get
+
hash = {}
hash[:SEQ_NAME] = self.name
hash[:CLIP_ADAPTOR_LEFT] = self.clip_adapter_left
hash[:CLIP_ADAPTOR_RIGHT] = self.clip_adaptor_right
hash[:SCORES] = self.quality_scores.map { |i| (i += 64).chr }.join ""
+ hash[:X_POS] = self.x_pos
+ hash[:Y_POS] = self.y_pos
hash
end
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]
end
+
+ private
+
+ # Method that extracts the X/Y coordinates from a
+ # SFF read name encoded with base36.
+ def coordinates_get
+ base36 = self.name[-5, 5]
+ num = Base36.decode(base36)
+
+ self.x_pos = num >> BIT_SHIFT
+ self.y_pos = num & BIT_MASK
+ end
end
__END__