class PRbed::Reader

Attributes

bim[R]
fam[R]

Public Class Methods

new(bfile, &block) click to toggle source
# File lib/PRbed.rb, line 38
def initialize(bfile, &block)
  @bfile = bfile
  @fam = load_fam("#{bfile}.fam")
  @bim = load_bim("#{bfile}.bim")
  each_variants(&block) if block
end

Public Instance Methods

each()
Alias for: each_variants
each_variants() { |v, fam, a| ... } click to toggle source
# File lib/PRbed.rb, line 45
def each_variants
  nsamples = @fam.size
  mod = nsamples % SAMPLES_PER_BYTE
  nread_bytes = nsamples / SAMPLES_PER_BYTE
  nread_bytes += 1 unless mod ==0

  File.open("#{@bfile}.bed", "rb") do |f|
    raise PRBedError.new("not plink bed file") unless f.read(3) == "\x6c\x1b\x01"
    parser = BytesParser.new(nsamples)
    buf = '\x0' * nsamples
    @bim.each do |v|
      b = f.read(nread_bytes, buf)
      raise PRBedError.new("unpxpected file end") unless b
      a = parser.parse(b)
      yield(v, @fam, a)
    end
  end
  self
end
Also aliased as: each
inspect() click to toggle source
# File lib/PRbed.rb, line 67
def inspect
  "#<#{self.class}: @bfile='#{@bfile}' @bim=#{@bim.size} @fam=#{@fam.size}>"
end

Private Instance Methods

load_bim(bim) click to toggle source
# File lib/PRbed.rb, line 85
def load_bim(bim)
  bs = []
  File.open(bim) do |f|
    while s = f.gets
      s.chomp!
      chr, vid, _, bp, a1, a2 = s.split(/\s/)
      bs.push(Bim.new(Integer(chr, 10), vid, Integer(bp, 10), a1, a2))
    end
  end
  bs
end
load_fam(fam) click to toggle source
# File lib/PRbed.rb, line 73
def load_fam(fam)
  fs = []
  File.open(fam) do |f|
    while s = f.gets
      s.chomp!
      fid, iid, _, _, sex, pheno = s.split(/\s/)
      fs.push(Fam.new(fid, iid, Integer(sex, 10), Integer(pheno, 10)))
    end
  end
  fs
end