Class: Bio::MAF::ParseContext

Inherits:
Object
  • Object
show all
Includes:
MAFParsing
Defined in:
lib/bio/maf/parser.rb

Overview

A MAF parsing context, used for random-access parsing.

Constant Summary

Constants included from MAFParsing

MAFParsing::BLOCK_START, MAFParsing::BLOCK_START_OR_EOS, MAFParsing::COMMENT, MAFParsing::E, MAFParsing::EOL_OR_EOF, MAFParsing::I, MAFParsing::JRUBY_P, MAFParsing::Q, MAFParsing::S, MAFParsing::STRAND_SYM

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods included from MAFParsing

#_parse_block, #gather_leading_fragment, #parse_block_data, #parse_empty_line, #parse_error, #parse_maf_vars, #parse_seq_line, #parse_trailing_fragment, #seq_filter_ok?, #trailing_nl?

Constructor Details

#initialize(fd, chunk_size, parser) ⇒ ParseContext

Returns a new instance of ParseContext



434
435
436
437
438
439
440
# File 'lib/bio/maf/parser.rb', line 434

def initialize(fd, chunk_size, parser)
  @f = fd
  @parser = parser
  @opts = parser.opts
  @cr = parser.base_reader.new(@f, chunk_size)
  @last_block_pos = -1
end

Instance Attribute Details

#at_endObject



432
433
434
# File 'lib/bio/maf/parser.rb', line 432

def at_end
  @at_end
end

#chunk_startObject



432
433
434
# File 'lib/bio/maf/parser.rb', line 432

def chunk_start
  @chunk_start
end

#crObject



431
432
433
# File 'lib/bio/maf/parser.rb', line 431

def cr
  @cr
end

#fObject



431
432
433
# File 'lib/bio/maf/parser.rb', line 431

def f
  @f
end

#last_block_posObject



432
433
434
# File 'lib/bio/maf/parser.rb', line 432

def last_block_pos
  @last_block_pos
end

#optsObject



431
432
433
# File 'lib/bio/maf/parser.rb', line 431

def opts
  @opts
end

#parserObject



431
432
433
# File 'lib/bio/maf/parser.rb', line 431

def parser
  @parser
end

#sObject



431
432
433
# File 'lib/bio/maf/parser.rb', line 431

def s
  @s
end

Instance Method Details

#append_chunks_to(len) ⇒ Object



503
504
505
506
507
# File 'lib/bio/maf/parser.rb', line 503

def append_chunks_to(len)
  while s.string.size < len
    s.string << cr.read_chunk()
  end
end

#fetch_blocks(offset, len, block_offsets) ⇒ Array<Block>

Fetch and parse blocks at given offset and len

Parameters:

  • offset (Integer)

    Offset to start parsing at.

  • len (Integer)

    Number of bytes to read.

  • block_offsets (Array)

    Offsets of blocks to parse.

Returns:



463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
# File 'lib/bio/maf/parser.rb', line 463

def fetch_blocks(offset, len, block_offsets)
  if block_given?
    LOG.debug { "fetching blocks from #{offset} (length #{len}): #{block_offsets.inspect}" }
    start_chunk_read_if_needed(offset, len)
    # read chunks until we have the entire merged set of
    # blocks ready to parse
    # to avoid fragment joining
    append_chunks_to(len)
    # parse the blocks
    block_offsets.each do |expected_offset|
      # skip ahead, in case there is a gap resulting from a
      # block that is not being parsed
      rel_offset = expected_offset - offset
      if s.pos < rel_offset
        s.pos = rel_offset
      end
      # now actually parse the block data
      block = _parse_block
      parse_error("expected a block at offset #{expected_offset} but could not parse one!") unless block
      parse_error("got block with offset #{block.offset}, expected #{expected_offset}!") unless block.offset == expected_offset
      yield block
    end
  else
    enum_for(:fetch_blocks, offset, len, block_offsets)
  end
end

#parse_emptyObject



446
447
448
# File 'lib/bio/maf/parser.rb', line 446

def parse_empty
  parser.parse_empty
end

#parse_extendedObject



450
451
452
# File 'lib/bio/maf/parser.rb', line 450

def parse_extended
  parser.parse_extended
end

#sequence_filterObject



442
443
444
# File 'lib/bio/maf/parser.rb', line 442

def sequence_filter
  parser.sequence_filter
end

#set_last_block_pos!Object



454
455
456
# File 'lib/bio/maf/parser.rb', line 454

def set_last_block_pos!
  @last_block_pos = s.string.rindex(BLOCK_START)
end

#start_chunk_read_if_needed(offset, len) ⇒ Object



490
491
492
493
494
495
496
497
498
499
500
501
# File 'lib/bio/maf/parser.rb', line 490

def start_chunk_read_if_needed(offset, len)
  if chunk_start \
    && (chunk_start <= offset) \
    && (offset < (chunk_start + s.string.size))
    ## the selected offset is in the current chunk
    s.pos = offset - chunk_start
  else
    chunk = cr.read_chunk_at(offset, len)
    @chunk_start = offset
    @s = StringScanner.new(chunk)
  end
end