Method: Bio::MAF::MAFParsing#parse_block_data

Defined in:
lib/bio/maf/parser.rb

#parse_block_dataBlock

Parse a Block from the current position. Requires that #s and #chunk_start be set correctly.

Returns:

  • (Block)

    the alignment block.



298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
# File 'lib/bio/maf/parser.rb', line 298

def parse_block_data
  block_start_pos = s.pos
  block_offset = chunk_start + block_start_pos
  s.scan(/^a\s*/) || parse_error("bad a line")
  block_vars = parse_maf_vars()
  seqs = []
  payload = s.scan_until(/^(?=a)/)
  unless payload
    payload = s.rest
    s.pos = s.string.size # jump to EOS
  end
  filtered = false
  lines = payload.split("\n")
  until lines.empty?
    line = lines.shift
    first = line.getbyte(0)
    if first == S
      seq = parse_seq_line(line, sequence_filter)
      if seq
        seqs << seq
      else
        filtered = true
      end
    elsif first == E && parse_empty
      e_seq = parse_empty_line(line, sequence_filter)
      if e_seq
        seqs << e_seq
      else
        filtered = true
      end
    elsif first == I && parse_extended
      parts = line.split
      parse_error("wrong i source #{parts[1]}!") unless seqs.last.source == parts[1]
      seqs.last.i_data = parts.slice(2..6)
    elsif first == Q && parse_extended
      _, src, quality = line.split
      parse_error("wrong q source #{src}!") unless seqs.last.source == src
      seqs.last.quality = quality
    elsif [I, E, Q, COMMENT, nil].include? first
      next
    else
      if opts[:strict]
        parse_error "unexpected line: '#{line}'"
      else
        LOG.warn "Ignoring invalid MAF line: '#{line}'"
      end
    end
  end
  b = Block.new(block_vars,
                seqs,
                block_offset,
                s.pos - block_start_pos,
                filtered)
  if opts[:retain_text]
    b.orig_text = s.string.slice(block_start_pos...(s.pos))
  end
  return b
end