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