module RGFATools::InvertibleSegments
Methods which edit the graph components without traversal
Public Instance Methods
randomly_orient_invertible(segment)
click to toggle source
Selects a random orientation for an invertible segment @return [RGFA] self @!macro segment_param
# File lib/rgfatools/invertible_segments.rb, line 20 def randomly_orient_invertible(segment) segment_name = segment.kind_of?(RGFA::Line) ? segment.name : segment if !segment_same_links_both_ends?(segment_name) raise "Only segments with links to the same or equivalent segments "+ "at both ends can be randomly oriented" end randomly_orient_proven_invertible_segment(segment_name) self end
randomly_orient_invertibles()
click to toggle source
Selects a random orientation for all invertible segments @return [RGFA] self
# File lib/rgfatools/invertible_segments.rb, line 8 def randomly_orient_invertibles segment_names.each do |sn| if segment_same_links_both_ends?(sn) randomly_orient_proven_invertible_segment(sn) end end self end
Private Instance Methods
annotate_random_orientation(segment_name)
click to toggle source
# File lib/rgfatools/invertible_segments.rb, line 77 def annotate_random_orientation(segment_name) segment = segment!(segment_name) n = segment.name.to_s.split("_") pairs = 0 pos = [1, segment.LN] if segment.or o = segment.or.to_s.split(",") if o.size > 2 while o.last == o.first + "^" or o.last + "^" == o.first pairs += 1 o.pop o.shift end end if segment.mp pos = [segment.mp[pairs*2], segment.mp[-1-pairs*2]] end end rn = segment.rn rn ||= [] rn += pos segment.rn = rn n[pairs] = "(" + n[pairs] n[-1-pairs] = n[-1-pairs] + ")" rename(segment.name, n.join("_")) end
link_targets_for_cmp(segment_end)
click to toggle source
# File lib/rgfatools/invertible_segments.rb, line 50 def link_targets_for_cmp(segment_end) links_of(segment_end).map {|l| l.other_end(segment_end).join} end
partitioned_links_of(segment_end)
click to toggle source
# File lib/rgfatools/invertible_segments.rb, line 69 def partitioned_links_of(segment_end) links_of(segment_end).group_by do |l| other_end = l.other_end(segment_end) sig = segment_signature(other_end) sig end.map {|sig, par| par} end
randomly_orient_proven_invertible_segment(segment_name)
click to toggle source
# File lib/rgfatools/invertible_segments.rb, line 32 def randomly_orient_proven_invertible_segment(segment_name) parts = partitioned_links_of([segment_name, :E]) if parts.size == 2 tokeep1_other_end = parts[0][0].other_end([segment_name, :E]) tokeep2_other_end = parts[1][0].other_end([segment_name, :E]) elsif parts.size == 1 and parts[0].size == 2 tokeep1_other_end = parts[0][0].other_end([segment_name, :E]) tokeep2_other_end = parts[0][1].other_end([segment_name, :E]) else return end return if links_of(tokeep1_other_end).size < 2 return if links_of(tokeep2_other_end).size < 2 delete_other_links([segment_name, :E], tokeep1_other_end) delete_other_links([segment_name, :B], tokeep2_other_end) annotate_random_orientation(segment_name) end
segment_same_links_both_ends?(segment_name)
click to toggle source
# File lib/rgfatools/invertible_segments.rb, line 54 def segment_same_links_both_ends?(segment_name) e_links = link_targets_for_cmp([segment_name, :E]) b_links = link_targets_for_cmp([segment_name, :B]) return e_links == b_links end
segment_signature(segment_end)
click to toggle source
# File lib/rgfatools/invertible_segments.rb, line 60 def segment_signature(segment_end) s = segment!(segment_end[0]) link_targets_for_cmp(segment_end).join(",")+"\t"+ link_targets_for_cmp(segment_end.invert_end_type).join(",")+"\t"+ [:or].map do |field| s.send(field) end.join("\t") end