/
alignment_codon.rb
67 lines (54 loc) · 1.94 KB
/
alignment_codon.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
class AlignmentCodon < ActiveRecord::Base
include Validatable
include Comparable
belongs_to :alignment
has_one :site_mutation
has_many :amino_acid_frequencies
has_many :alignment_codon_costs
validates_presence_of :alignment_id, :start_position, :codons, :amino_acids, :gaps
validates_true_for :codons, :logic => lambda {
self.alignment != nil and
self.alignment.to_a.at(self.start_position / 3) == self.codons
}, :message => "Codons should match codons in alignment at start position"
validates_true_for :start_position, :logic => lambda {
self.start_position % 3 == 0
}, :message => "Start position should be a multiple of three"
validates_true_for :amino_acids, :logic => lambda {
self.amino_acids == self.codons.collect { |codon| Bio::Sequence::NA.new(codon).translate }
}, :message => "Translated codons should match amino acids"
validates_true_for :gaps, :logic => lambda {
self.gaps == self.codons.include?('---')
}, :message => "Translated codons should match amino acids"
def codons
read_attribute(:codons).split(',')
end
def codons=(codons)
write_attribute(:codons,codons.join(','))
end
def amino_acids
read_attribute(:amino_acids).split(',')
end
def amino_acids=(amino_acids)
write_attribute(:amino_acids,amino_acids.join(','))
end
def <=>(other)
self.start_position <=> other.start_position
end
def self.create_from_alignment(alignment)
alignment.inject(0) do |index, codons|
ac = AlignmentCodon.new(
:alignment_id => alignment.id,
:start_position => index,
:codons => codons,
:amino_acids => codons.map{ |codon| Bio::Sequence::NA.new(codon).translate },
:gaps => codons.include?('---')
)
if ac.valid?
ac.save
else
ac.errors.each {|error| Needle::Registry.instance[:logger].warn "#{alignment.id}, #{index} : #{error}"}
end
index + 3
end
end
end