class Mspire::Plms1

Prince Lab MS 1: a simple format for reading and writing MS1 level mass spec data

see Mspire::Plms1::SPECIFICATION for the file specification

Constants

SPECIFICATION

Attributes

scan_numbers[RW]

an array of scan numbers

spectra[RW]

an array that contains spectrum objects

times[RW]

an array of time data

Public Class Methods

new(_scan_numbers=[], _times=[], _spectra=[]) click to toggle source
# File lib/mspire/plms1.rb, line 71
def initialize(_scan_numbers=[], _times=[], _spectra=[])
  (@scan_numbers, @times, @spectra) = [_scan_numbers, _times, _spectra]
end

Public Instance Methods

read(io_or_filename) click to toggle source

returns self for chaining

# File lib/mspire/plms1.rb, line 86
def read(io_or_filename)
  openany(io_or_filename) do |io|
    num_scans = read_uint32(io)[0]
    @scan_numbers = read_uint32(io, num_scans)
    @times = read_float64(io, num_scans)
    @spectra = num_scans.times.map do
      data = read_uint32(io)[0].times.map do
        read_float64(io, read_uint32(io)[0])
      end
      Mspire::Spectrum.new(data)
    end
  end
  self
end
read_float64(io, cnt=1) click to toggle source

returns an array of Floats

# File lib/mspire/plms1.rb, line 81
def read_float64(io, cnt=1)
  io.read(cnt*8).unpack("E*")
end
read_uint32(io, cnt=1) click to toggle source

returns an array of Integers

# File lib/mspire/plms1.rb, line 76
def read_uint32(io, cnt=1)
  io.read(cnt*4).unpack("V*")
end
write(filename=nil, ascii=false) click to toggle source

returns the string if no filename given

# File lib/mspire/plms1.rb, line 136
def write(filename=nil, ascii=false)
  if ascii
    write_ascii(filename)
  else
    write_file_or_string(filename) do |out|
      write_uint32(out, spectra.size)
      write_uint32(out, scan_numbers)
      write_float64(out, times)
      spectra.each do |spectrum|
        write_uint32(out, spectrum.size)  # number of rows
        if spectrum.size > 0
          mzs = spectrum.mzs
          write_uint32(out, mzs.size)
          write_float64(out, mzs)
          intensities = spectrum.intensities
          write_uint32(out, intensities.size)
          write_float64(out, intensities)
        end
      end
    end
  end
end
write_ascii(filename=nil) click to toggle source

writes an ascii version of the format It is the same as the binary format, except a newline follows each length indicator or array of data. An empty line represents an empty array.

# File lib/mspire/plms1.rb, line 115
def write_ascii(filename=nil)
  write_file_or_string(filename) do |out|
    out.puts scan_numbers.size
    out.puts scan_numbers.join(' ')
    out.puts times.join(' ')
    spectra.each do |spectrum|
      puts "HIAYDSFA DSF"
      puts spectrum.class
      p spectrum
      out.puts spectrum.size
      if spectrum.size > 0
        out.puts spectrum.mzs.size
        out.puts spectrum.mzs.join(' ')
        out.puts spectrum.intensities.size
        out.puts spectrum.intensities.join(' ')
      end
    end
  end
end
write_float64(out, data) click to toggle source
# File lib/mspire/plms1.rb, line 106
def write_float64(out, data)
  to_pack = data.is_a?(Array) ? data : [data]
  out << to_pack.pack('E*')
end
write_uint32(out, data) click to toggle source
# File lib/mspire/plms1.rb, line 101
def write_uint32(out, data)
  to_pack = data.is_a?(Array) ? data : [data]
  out << to_pack.pack('V*')
end