lib/bio-ucsc/hg18/chaindanrer5.rb in bio-ucsc-api-0.1.0 vs lib/bio-ucsc/hg18/chaindanrer5.rb in bio-ucsc-api-0.2.0

- old
+ new

@@ -1,47 +1,79 @@ -# -*- coding: utf-8 -*- # = hg18/chaindanrer5.rb # Copyright:: -# Copyright (C) 2011 MISHIMA, Hiroyuki -# <missy at be.to / hmishima at nagasaki-u.ac.jp> +# Copyright (C) 2011 MISHIMA, Hiroyuki <missy at be.to / hmishima at nagasaki-u.ac.jp> # License:: The Ruby licence (Ryby's / GPLv2 dual) # -# = Table desfription in UCSC Table Browser -# The chain track shows alignments of human (Feb. 2009 -# (GRCh37/hg18)/hg18) to other genomes using a gap scoring system that -# allows longer gaps than traditional affine gap scoring systems. It -# can also tolerate gaps in both human and the other genome -# simultaneously. These "double-sided" gaps can be caused by local -# inversions and overlapping deletions in both species. -# -# = ommitted dynamic method(s) due to the method name collision -# none +# In the hg18 database, this table is actually separated +# into "chr1_*", "chr2_*", etc. This class dynamically +# define *::Chr1_*, *::Chr2_*, etc. The +# Rmsk.find_by_interval calls an appropreate class automatically. module Bio module Ucsc module Hg18 + class ChainDanRer5 - %w( -ChrM Chr1 Chr2 Chr3 Chr4 Chr5 Chr6 Chr7 Chr8 Chr9 -Chr10 Chr11 Chr12 Chr13 Chr14 Chr15 Chr16 Chr17 Chr18 Chr19 -Chr20 Chr21 Chr22 ChrX ChrY).each do |chr| - klass = Class.new(DBConnection) do - extend Bio::Ucsc::Hg18::QueryUsingTBin - set_table_name "#{chr.downcase}_chainDanRer5" - set_primary_key nil - end - self.const_set("#{chr}_ChainDanRer5", klass) - end + Bio::Ucsc::Hg18::CHROMS.each do |chr| + class_eval %! + class #{chr[0..0].upcase + chr[1..-1]}_ChainDanRer5 < DBConnection + set_table_name "#{chr[0..0].downcase + chr[1..-1]}_chainDanRer5" + set_primary_key nil + set_inheritance_column nil + def self.find_by_interval(interval, opt = {:partial => true}) + find_first_or_all_by_interval(interval, :first, opt) + end + + def self.find_all_by_interval(interval, opt = {:partial => true}) + find_first_or_all_by_interval(interval, :all, opt) + end + + def self.find_first_or_all_by_interval(interval, first_all, opt) + zstart = interval.zero_start + zend = interval.zero_end + if opt[:partial] == true + where = <<-SQL + tName = :chrom +AND bin in (:bins) +AND ((tStart BETWEEN :zstart AND :zend) + OR (tEnd BETWEEN :zstart AND :zend) + OR (tStart <= :zstart AND tEnd >= :zend)) + SQL + else + where = <<-SQL + tName = :chrom +AND bin in (:bins) +AND ((tStart BETWEEN :zstart AND :zend) +AND (tEnd BETWEEN :zstart AND :zend)) + SQL + end + cond = { + :chrom => interval.chrom, + :bins => Bio::Ucsc::UcscBin.bin_all(zstart, zend), + :zstart => zstart, + :zend => zend, + } + self.find(first_all, + :select => "*", + :conditions => [where, cond],) + end + end + ! + end # each chromosome + def self.find_by_interval(interval, opt = {:partial => true}) - chr_klass = self.const_get("#{interval.chrom.capitalize}_ChainDanRer5") + chrom = interval.chrom[0..0].upcase + interval.chrom[1..-1] + chr_klass = self.const_get("#{chrom}_ChainDanRer5") chr_klass.__send__(:find_by_interval, interval, opt) end def self.find_all_by_interval(interval, opt = {:partial => true}) - chr_klass = self.const_get("#{interval.chrom.capitalize}_ChainDanRer5") + chrom = interval.chrom[0..0].upcase + interval.chrom[1..-1] + chr_klass = self.const_get("#{chrom}_ChainDanRer5") chr_klass.__send__(:find_all_by_interval, interval, opt) end - end - end # module Hg18 + end # class + + end # module Hg18 end # module Ucsc -end # Bio +end # module Bio