+ # Method to subparse alignment lines.
+ def parse_alignment(line)
+ fields = line.split("\t")
+
+ raise SamError, "Bad number of fields: #{fields.size} < 11" if fields.size < 11
+
+ qname = fields[0]
+ flag = fields[1].to_i
+ rname = fields[2]
+ pos = fields[3].to_i
+ mapq = fields[4].to_i
+ cigar = fields[5]
+ rnext = fields[6]
+ pnext = fields[7].to_i
+ tlen = fields[8].to_i
+ seq = fields[9]
+ qual = fields[10]
+
+ raise SamError, "Bad qname: #{qname}" unless qname =~ /^[!-?A-~]{1,255}$/
+ raise SamError, "Bad flag: #{flag}" unless (0 .. 2**16 - 1).include? flag
+ raise SamError, "Bad rname: #{rname}" unless rname =~ /^(\*|[!-()+-<>-~][!-~]*)$/
+ raise SamError, "Bad pos: #{pos}" unless (0 .. 2**29 - 1).include? pos
+ raise SamError, "Bad mapq: #{mapq}" unless (0 .. 2**8 - 1).include? mapq
+ raise SamError, "Bad cigar: #{cigar}" unless cigar =~ /^(\*|([0-9]+[MIDNSHPX=])+)$/
+ raise SamError, "Bad rnext: #{rnext}" unless rnext =~ /^(\*|=|[!-()+-<>-~][!-~]*)$/
+ raise SamError, "Bad pnext: #{pnext}" unless (0 .. 2**29 - 1).include? pnext
+ raise SamError, "Bad tlen: #{tlen}" unless (-2**29 + 1 .. 2**29 - 1).include? tlen
+ raise SamError, "Bad seq: #{seq}" unless seq =~ /^(\*|[A-Za-z=.]+)$/
+ raise SamError, "Bad qual: #{qual}" unless qual =~ /^[!-~]+$/
+
+ entry = {}
+ entry[:QNAME] = qname
+ entry[:FLAG] = flag
+ entry[:RNAME] = rname
+ entry[:POS] = pos
+ entry[:MAPQ] = mapq
+ entry[:CIGAR] = cigar
+ entry[:RNEXT] = rnext
+ entry[:PNEXT] = pnext
+ entry[:TLEN] = tlen
+ entry[:SEQ] = seq
+ entry[:QUAL] = qual
+
+ entry