princelab/mspire

View on GitHub
lib/mspire/ident/peptide_hit/qvalue.rb

Summary

Maintainability
A
0 mins
Test Coverage
require 'mspire/ident/search'
require 'mspire/ident/peptide_hit'

module Mspire ; end
module Mspire::Ident ; end

class Mspire::Ident::PeptideHit
  module Qvalue
    FILE_EXTENSION = '.phq.tsv'
    FILE_DELIMITER = "\t"
    HEADER = %w(run_id id aaseq charge qvalue)

    class << self

      # writes to the file, adding an extension. returns the filename
      def to_phq(base, hits, qvalues=[])
        to_file(base + FILE_EXTENSION, hits, qvalues)
      end

      # writes the peptide hits to a phq.tsv file. qvalues is a parallel array
      # to hits that can provide qvalues if not inherent to the hits
      # returns the filename.  Expects each hit to implement #search_id, #id,
      # #aaseq and #charge. returns the filename
      def to_file(filename, hits, qvalues=[])
        File.open(filename,'w') do |out|
          out.puts HEADER.join(FILE_DELIMITER)
          hits.zip(qvalues) do |hit, qvalue|
            out.puts [hit.search_id, hit.id, hit.aaseq, hit.charge, qvalue || hit.qvalue].join(FILE_DELIMITER)
          end
        end
        filename
      end

      # returns an array of PeptideHit objects from a phq.tsv
      def from_file(filename)
        searches = Hash.new {|h,id|  h[id] = Mspire::Ident::Search.new(id) }
        peptide_hits = []
        File.open(filename) do |io|
          header = io.readline.chomp.split(FILE_DELIMITER)
          raise "bad headers" unless header == HEADER 
          io.each do |line|
            line.chomp!
            (run_id, id, aaseq, charge, qvalue) = line.split(FILE_DELIMITER)
            ph = Mspire::Ident::PeptideHit.new
            ph.search = searches[run_id]
            ph.id = id; ph.aaseq = aaseq ; ph.charge = charge.to_i ; ph.qvalue = qvalue.to_f
            peptide_hits << ph
          end
        end
        peptide_hits
      end

      alias_method :from_phq, :from_file

    end
  end # Qvalue
end # Peptide Hit