bin/fragmenter.rb in rubabel-0.2.1 vs bin/fragmenter.rb in rubabel-0.2.2

- old
+ new

@@ -2,42 +2,66 @@ require 'trollop' require 'rubabel' require 'rubabel/molecule/fragmentable' +default_ph = 2.5 +Fragment = Struct.new(:frag, :id, :title, :mz, :mass, :charge, :smiles, :pairing) + parser = Trollop::Parser.new do banner "usage: #{File.basename($0)} [OPTIONS|RULES] <SMARTS> ..." text "\noptions:" - opt :ph, "the pH to use (experimental option)", :default => Rubabel::Molecule::Fragmentable::DEFAULT_OPTIONS[:ph] + opt :ph, "the pH to use (experimental option)", :default => default_ph + opt :images, "print out svg images of fragments" + opt :format, "format of the molecules", :default => 'smiles' #opt :uniq, "no repeated fragments", :default => false text "\nrules:" Rubabel::Molecule::Fragmentable::RULES.each do |rule| opt rule, rule.to_s.gsub("_",' ') end text "\nexample:" - text "fragmenter.rb -aecsoxn 'CCC(=O)OCCC' 'CCC(=O)OCCC(=O)O'" + text "fragmenter.rb -xeh 'CCC(=O)OCCC' 'CCC(=O)OCCC(=O)O'" end -rules = parser.parse(ARGV) -options = {rules: []} -options[:ph] = rules.delete(:ph) -options[:uniq] = rules.delete(:uniq) -rules.each do |k,v| - options[:rules] << k if v && k.to_s !~ /_given/ -end +options = parser.parse(ARGV) +opts = {rules: []} +opts[:uniq] = options.delete(:uniq) +ph = options.delete(:ph) +opts[:rules] = Rubabel::Molecule::Fragmentable::RULES.map do |rule| + rule if options["#{rule}_given".to_sym] +end.compact if ARGV.size == 0 parser.educate && exit end -ARGV.each do |mol| - mol = Rubabel[mol] +ARGV.each do |smiles| + mol = Rubabel[smiles, options[:format].to_sym] puts "\nmolecule: #{mol.csmiles}" - fragment_sets = mol.fragment(options) - fragment_sets.each do |frag_set| - puts "" - frag_set.each do |frag| - puts "#{frag.mass.round(5)} #{frag.csmiles}" + mol.correct_for_ph!(ph) + puts "at ph #{ph}: #{mol.csmiles}" + fragment_sets = mol.fragment(opts) + puts %w(mz mass charge title smiles pairing).join("\t") + frags = [] + fragment_sets.each_with_index do |frag_set,i| + frag_set.each_with_index do |frag,j| + unless frag.charge == 0 + mz = (frag.mass / frag.charge).round(5) + end + + frag.title = "#{i}-#{j}pair_" + (mz ? "#{mz}_mz" : "#{frag.mass.round(3)}_Mass") + frag_obj = Fragment.new(frag, frag.title, frag.title, mz, frag.exact_mass, frag.charge, frag.csmiles, i) + frags << frag_obj end + end + frags = frags.sort_by {|frag| [-frag.charge, frag.mz] } + if options[:images] + frags.each do |frag| + fn = "#{frag.title}.png" + frag.frag.write(fn) + end + end + frags.each do |frag| + puts [:mz, :mass, :charge, :title, :smiles, :pairing].map {|cat| frag.send(cat) }.join("\t") end end