Class: Genomic_Feature
- Inherits:
-
Object
- Object
- Genomic_Feature
- Defined in:
- lib/pets/genomic_features.rb
Constant Summary collapse
- @@ref =
nil
Class Method Summary collapse
- .add_reference(genomic_regions) ⇒ Object
- .array2genomic_feature(arr) ⇒ Object
- .hash2genomic_feature(h) ⇒ Object
Instance Method Summary collapse
- #compute_windows(meth) ⇒ Object
- #each ⇒ Object
- #each_chr ⇒ Object
- #generate_cluster_regions(meth, tag, ids_per_reg = 1, obj = false) ⇒ Object
- #get_chr ⇒ Object
- #get_chr_regs(chr) ⇒ Object
- #get_features(attr_type: nil) ⇒ Object
- #get_reference_overlaps(genomic_ranges, reference) ⇒ Object
- #get_sizes ⇒ Object
- #get_summary_sizes ⇒ Object
-
#initialize(feat_array, annotations: nil) ⇒ Genomic_Feature
constructor
If any method use gen_fet as name is a Genomic_Feature object.
- #length ⇒ Object
- #load_annotations(annotations) ⇒ Object
- #load_features(feat_array) ⇒ Object
- #match(other_gen_feat) ⇒ Object
-
#merge(gen_fet, to = nil) ⇒ Object
‘to’ the regions must be connected “to” given id.
- #region_by_to(to) ⇒ Object
Constructor Details
#initialize(feat_array, annotations: nil) ⇒ Genomic_Feature
If any method use gen_fet as name is a Genomic_Feature object
21 22 23 24 25 26 27 |
# File 'lib/pets/genomic_features.rb', line 21 def initialize(feat_array, annotations: nil) # [[chr1, start1, stop1],[chr1, start1, stop1]] @regions = {} @reg_by_to = {} @reg_id = -1 load_features(feat_array) load_annotations(annotations) if !annotations.nil? end |
Class Method Details
.add_reference(genomic_regions) ⇒ Object
16 17 18 |
# File 'lib/pets/genomic_features.rb', line 16 def self.add_reference(genomic_regions) @@ref = genomic_regions end |
.array2genomic_feature(arr) ⇒ Object
4 5 6 |
# File 'lib/pets/genomic_features.rb', line 4 def self.array2genomic_feature(arr) new(arr.map{|r| yield(r)}) end |
.hash2genomic_feature(h) ⇒ Object
8 9 10 11 12 13 14 |
# File 'lib/pets/genomic_features.rb', line 8 def self.hash2genomic_feature(h) vars = [] h.each do |h, v| vars << yield(h, v) end new(vars) end |
Instance Method Details
#compute_windows(meth) ⇒ Object
167 168 169 170 171 172 173 174 175 176 |
# File 'lib/pets/genomic_features.rb', line 167 def compute_windows(meth) @windows = {} @regions.each do |chr, regs| chr_windows = nil if meth == :reg_overlap chr_windows = compute_region_overlap_windows(regs) end @windows[chr] = chr_windows end end |
#each ⇒ Object
57 58 59 60 61 62 63 |
# File 'lib/pets/genomic_features.rb', line 57 def each() @regions.each do |chr, regs| regs.each do |region| yield(chr, region) end end end |
#each_chr ⇒ Object
51 52 53 54 55 |
# File 'lib/pets/genomic_features.rb', line 51 def each_chr() @regions.each do |chr, regs| yield(chr, regs) end end |
#generate_cluster_regions(meth, tag, ids_per_reg = 1, obj = false) ⇒ Object
144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 |
# File 'lib/pets/genomic_features.rb', line 144 def generate_cluster_regions(meth, tag, ids_per_reg = 1, obj = false) compute_windows(meth) # Get putative genome windows ids_by_cluster = {} annotated_full_ref = [] # All reference windows wit uniq id and chr tagged @regions.each do |chr, regs| reference = @windows[chr] overlaps = get_reference_overlaps(regs, reference) clust_numb = 0 reference.each_with_index do |ref, i| current_ids = overlaps[i] if current_ids.length > ids_per_reg clust_id = "#{chr}.#{clust_numb +=1}.#{tag}.#{current_ids.length}" current_ids.each do |curr_id| add_record(ids_by_cluster, curr_id, clust_id, true) end annotated_full_ref << ref.dup.concat([chr, clust_id]) end end end annotated_full_ref = Genomic_Feature.array2genomic_feature(annotated_full_ref){|r| [r[2], r[0], r[1], r[3]]} if obj return ids_by_cluster, annotated_full_ref end |
#get_chr ⇒ Object
65 66 67 |
# File 'lib/pets/genomic_features.rb', line 65 def get_chr return @regions.keys end |
#get_chr_regs(chr) ⇒ Object
69 70 71 |
# File 'lib/pets/genomic_features.rb', line 69 def get_chr_regs(chr) return @regions[chr] end |
#get_features(attr_type: nil) ⇒ Object
86 87 88 89 90 91 92 93 94 95 |
# File 'lib/pets/genomic_features.rb', line 86 def get_features(attr_type: nil) features = match(@@ref) if !attr_type.nil? features.each do |reg_id, feat_ids| new_feat_ids = feat_ids.map{|fi| @@ref.region_by_to(fi).dig(:attrs, attr_type)} features[reg_id] = new_feat_ids.compact.uniq end end return features end |
#get_reference_overlaps(genomic_ranges, reference) ⇒ Object
131 132 133 134 135 136 137 138 139 140 141 142 |
# File 'lib/pets/genomic_features.rb', line 131 def get_reference_overlaps(genomic_ranges, reference) overlaps = [] reference.each do |start, stop| reg_ids = [] genomic_ranges.each do |reg| overlap = coor_overlap?(start, stop, reg) reg_ids << reg[:to] if overlap end overlaps << reg_ids.uniq end return overlaps end |
#get_sizes ⇒ Object
77 78 79 80 81 82 83 84 |
# File 'lib/pets/genomic_features.rb', line 77 def get_sizes sizes = [] each do |chr, region| size = region[:stop] - region[:start] + 1 sizes << size end return sizes end |
#get_summary_sizes ⇒ Object
115 116 117 118 119 120 121 122 |
# File 'lib/pets/genomic_features.rb', line 115 def get_summary_sizes sizes = Hash.new(0) each do |chr, region| size = region[:stop] - region[:start] + 1 sizes[size] += 1 end return sizes.to_a.sort!{|s| s[1] <=> s[1] } end |
#length ⇒ Object
47 48 49 |
# File 'lib/pets/genomic_features.rb', line 47 def length return @regions.length end |
#load_annotations(annotations) ⇒ Object
40 41 42 43 44 45 |
# File 'lib/pets/genomic_features.rb', line 40 def load_annotations(annotations) each do |chr, reg| annot = annotations[reg[:to]] reg[:attrs] = annot if !annot.nil? end end |
#load_features(feat_array) ⇒ Object
29 30 31 32 33 34 35 36 37 38 |
# File 'lib/pets/genomic_features.rb', line 29 def load_features(feat_array) feat_array.each do |chr, start, stop, to| chr = chr.to_sym @reg_id +=1 id = to.nil? ? @reg_id : to region = {chr: chr, start: start, stop: stop, to: id } @reg_by_to[id] = region add_record(@regions, chr, region) end end |
#match(other_gen_feat) ⇒ Object
97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 |
# File 'lib/pets/genomic_features.rb', line 97 def match(other_gen_feat) all_matches = {} each_chr do |chr, regs| other_regs = other_gen_feat.get_chr_regs(chr) next if other_regs.nil? regs.each do |reg| local_matches = [] start = reg[:start] stop = reg[:stop] other_regs.each do |other_reg| local_matches << other_reg[:to] if coor_overlap?(start, stop, other_reg) end all_matches[reg[:to]] = local_matches if !local_matches.empty? end end return all_matches end |
#merge(gen_fet, to = nil) ⇒ Object
‘to’ the regions must be connected “to” given id
124 125 126 127 128 129 |
# File 'lib/pets/genomic_features.rb', line 124 def merge(gen_fet, to = nil) # 'to' the regions must be connected "to" given id gen_fet.each do |chr, region| to.nil? ? region[:to] = @reg_id +=1 : region[:to] = to # handle id custom or default add_record(@regions, chr, region) end end |
#region_by_to(to) ⇒ Object
73 74 75 |
# File 'lib/pets/genomic_features.rb', line 73 def region_by_to(to) return @reg_by_to[to] end |