lib/cheripic/contig.rb in cheripic-1.0.0 vs lib/cheripic/contig.rb in cheripic-1.1.0
- old
+ new
@@ -2,57 +2,84 @@
require 'bio'
require 'forwardable'
module Cheripic
+# Custom error handling for Contig class
class ContigError < CheripicError; end
+ # A contig object from assembly that stores positions of
+ # homozygous, heterozygous and hemi-variants
+ #
+ # @!attribute [rw] hm_pos
+ # @return [Hash] a hash of homozygous variant positions as keys and allele frequency as values
+ # @!attribute [rw] ht_pos
+ # @return [Hash] a hash of heterozygous variant positions as keys and allele frequency as values
+ # @!attribute [rw] hemi_pos
+ # @return [Hash] a hash of hemi-variant positions as keys and allele frequency as values
+ # @!attribute [r] id
+ # @return [String] id of the contig in assembly taken from fasta file
+ # @!attribute [r] length
+ # @return [Integer] length of contig in bases
class Contig
- include Enumerable
- extend Forwardable
- # delegate [:size, :length] => :@contig
- # def_delegator :@contig, :entry_id, :id
- attr_accessor :hm_pos, :ht_pos, :hemi_pos, :id, :length
+ attr_accessor :hm_pos, :ht_pos, :hemi_pos
+ attr_reader :id, :length
+ # creates a Contig object using fasta entry
+ # @param fasta [Bio::FastaFormat] an individual fasta entry from input assembly file
def initialize (fasta)
@id = fasta.entry_id
@length = fasta.length
@hm_pos = {}
@ht_pos = {}
@hemi_pos = {}
end
+ # Number of homozygous variants identified in the contig
+ # @return [Integer]
def hm_num
self.hm_pos.length
end
+ # Number of heterozygous variants identified in the contig
+ # @return [Integer]
def ht_num
self.ht_pos.length
end
+ # Homozygosity enrichment score calculated using
+ # hm_num and ht_num of the contig object
+ # @return [Float]
def hme_score
- hmes_adjust = Options.params.hmes_adjust
+ hmes_adjust = Options.hmes_adjust
if self.hm_num == 0 and self.ht_num == 0
0.0
else
(self.hm_num + hmes_adjust) / (self.ht_num + hmes_adjust)
end
end
+ # Number of hemi-variants identified in the contig
+ # @return [Integer]
def hemi_num
self.hemi_pos.length
end
+ # Mean of bulk frequency ratios (bfr) calculated using
+ # bfr values all hemi_pos of the contig
+ # @return [Float]
def bfr_score
if self.hemi_pos.values.empty?
0.0
else
geom_mean(self.hemi_pos.values)
end
end
- # geometric mean of an array of numbers
+ # Calculates mean of an array of numbers
+ # @param array [Array] an array of bfr values from hemi_snp
+ # @return [Float] mean value as float
def geom_mean(array)
return array[0].to_f if array.length == 1
array.reduce(:+) / array.size.to_f
# sum = 0.0
# array.each{ |v| sum += Math.log(v.to_f) }