require 'pp'
require 'maasha/filesys'
require 'maasha/seq'
+require 'maasha/cigar'
REGEX_HEADER = Regexp.new(/^@[A-Za-z][A-Za-z](\t[A-Za-z][A-Za-z0-9]:[ -~]+)+$/)
REGEX_COMMENT = Regexp.new(/^@CO\t.*/)
# http://code.google.com/p/biopieces/wiki/KissFormat
def self.align_descriptors(sam)
offset = 0
- insertions = 0
align = []
# Insertions
- sam[:CIGAR].scan(/([0-9]+)([MIDNSHPX=])/).each do |len, op|
- len = len.to_i
-
+ sam[:CIGAR].each do |len, op|
if op == 'I'
(0 ... len).each_with_index do |i|
nt = sam[:SEQ].seq[offset + i]
check_rname(rname)
check_pos(pos)
check_mapq(mapq)
- check_cigar(cigar, seq)
check_rnext(rnext)
check_pnext(pnext)
check_tlen(tlen)
entry[:RNAME] = rname
entry[:POS] = pos
entry[:MAPQ] = mapq
- entry[:CIGAR] = cigar
+ entry[:CIGAR] = Cigar.new(cigar)
entry[:RNEXT] = rnext
entry[:PNEXT] = pnext
entry[:TLEN] = tlen
raise SamError, "Bad mapq: #{mapq}" unless (0 .. 2**8 - 1).include? mapq
end
- # Method to check cigar string.
- def check_cigar(cigar, seq)
- raise SamError, "Bad cigar: #{cigar}" unless cigar =~ /^(\*|([0-9]+[MIDNSHPX=])+)$/
-
- unless cigar == '*'
- check_cigar_hard_clip(cigar)
- check_cigar_soft_clip(cigar)
- check_cigar_seq_len(cigar, seq) unless seq == '*'
- end
- end
-
- # Method to check cigar hard clipping only at ends.
- def check_cigar_hard_clip(cigar)
- if cigar.gsub(/^[0-9]+H|[0-9]+H$/, "").match('H')
- raise SamError, "Bad cigar with internal H: #{cigar}"
- end
- end
-
- # Method to check cigar soft clipping only at ends or H.
- def check_cigar_soft_clip(cigar)
- if cigar.gsub(/^[0-9]+H|[0-9]+H$/, "").gsub(/^[0-9]+S|[0-9]+S$/, "").match('S')
- raise SamError, "Bad cigar with internal S: #{cigar}"
- end
- end
-
- # Method to check cigar length matches sequence length.
- def check_cigar_seq_len(cigar, seq)
- cigar_len = 0
-
- cigar.scan(/([0-9]+)([MIDNSHPX=])/).each do |len, op|
- cigar_len += len.to_i if op =~ /[MISX=]/
- end
-
- if cigar_len != seq.length
- raise SamError, "cigar and sequence length mismatch: #{cigar_len} != #{seq.length}"
- end
- end
-
# Method to check if rnext, when not '*' or '='
# and @SQ header lines are present, is located
# in the header hash.