]> git.donarmstrong.com Git - biopieces.git/commitdiff
added xy-coord extraction code to sff.rb
authormartinahansen <martinahansen@74ccb610-7750-0410-82ae-013aeee3265d>
Fri, 11 Feb 2011 10:52:22 +0000 (10:52 +0000)
committermartinahansen <martinahansen@74ccb610-7750-0410-82ae-013aeee3265d>
Fri, 11 Feb 2011 10:52:22 +0000 (10:52 +0000)
git-svn-id: http://biopieces.googlecode.com/svn/trunk@1266 74ccb610-7750-0410-82ae-013aeee3265d

code_ruby/Maasha/lib/sff.rb

index 3e0fc377ff7a8fc20020df952a08ea53a6370519..cb1fa2360da133ac83b290a083079056bc207179 100644 (file)
 
 # >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>><<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
 
+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
@@ -185,10 +190,13 @@ end
 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
@@ -199,6 +207,8 @@ class Read
     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
@@ -219,6 +229,18 @@ class Read
     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__