Class: Genomic_Feature

Inherits:
Object
  • Object
show all
Defined in:
lib/pets/genomic_features.rb

Constant Summary collapse

@@ref =
nil

Class Method Summary collapse

Instance Method Summary collapse

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

#eachObject



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_chrObject



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_chrObject



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_sizesObject



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_sizesObject



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

#lengthObject



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