module RGFATools::LinearPaths

Methods for the RGFA class, which involve a traversal of the graph following links

Constants

LN
Redefined

@!method merge_linear_paths(**options)

Merge all linear paths in the graph, i.e.
paths of segments without extra-branches
@!macro merge_more
@!macro merge_lim
@!macro merge_options

@return [RGFA] self

Private Instance Methods

add_segment_to_merged_with_rgfatools(merged, segment, reversed, cut, init, options) click to toggle source
# File lib/rgfatools/linear_paths.rb, line 95
def add_segment_to_merged_with_rgfatools(merged, segment, reversed, cut, init,
                                        options)
  if !options[:enable_tracking] and
      (options[:disable_tracking] or !@extensions_enabled)
    return add_segment_to_merged_without_rgfatools(merged, segment, reversed,
                                                  cut, init, options)
  end
  s = (reversed ? segment.sequence.rc[cut..-1] : segment.sequence[cut..-1])
  n = (reversed ? reverse_segment_name(segment.name, "_") : segment.name.to_s)
  rn = (reversed ? reverse_pos_array(segment.rn, segment.LN) : segment.rn)
  mp = (reversed ? reverse_pos_array(segment.mp, segment.LN) : segment.mp)
  mp = [1, segment.LN] if mp.nil? and segment.LN
  if segment.or.nil?
    o = n
  else
    o = (reversed ? reverse_segment_name(segment.or, ",") : segment.or)
  end
  if init
    merged.sequence = s
    merged.name = options[:merged_name].nil? ? n : options[:merged_name]
    merged.LN = segment.LN
    merged.rn = rn
    merged.or = o
    merged.mp = mp
  else
    (segment.sequence == "*") ? (merged.sequence = "*")
                              : (merged.sequence += s)
    merged.name = "#{merged.name}_#{n}" if options[:merged_name].nil?
    if merged.LN
      if rn
        rn = rn.map {|pos| pos - cut + merged.LN}
        merged.rn = merged.rn.nil? ? rn : merged.rn + rn
      end
      if mp and merged.mp
        merged.mp += mp.map {|pos| pos - cut + merged.LN}
      end
      segment.LN ? merged.LN += (segment.LN - cut)
                 : merged.LN = nil
    else
      merged.mp = nil
    end
    merged.or = merged.or.nil? ? o : "#{merged.or},#{o}"
  end
end
reverse_pos_array(pos_array, lastpos) click to toggle source
# File lib/rgfatools/linear_paths.rb, line 90
def reverse_pos_array(pos_array, lastpos)
  return nil if pos_array.nil? or lastpos.nil?
  pos_array.map {|pos| lastpos - pos + 1}.reverse
end
reverse_segment_name(name, separator) click to toggle source
# File lib/rgfatools/linear_paths.rb, line 77
def reverse_segment_name(name, separator)
  name.to_s.split(separator).map do |part|
    openp = part[0] == "("
    part = part[1..-1] if openp
    closep = part[-1] == ")"
    part = part[0..-2] if closep
    part = (part[-1] == "^") ? part[0..-2] : part+"^"
    part += ")" if openp
    part = "(#{part}" if closep
    part
  end.reverse.join(separator)
end