# encoding: UTF-8 require 'mspire/imzml/writer' require 'trollop' require 'yaml' module Mspire module Imzml class Writer end end end module Mspire::Imzml::Writer::Commandline # generates the Trollop parser def self.parser return @parser if @parser default_config = "config.yaml" scan_patterns = %w(flyback meandering random) scan_types = %w(horizontal vertical) scan_direction = %w(left-right right-left bottom-up top-down none) scan_sequence = %w(top-down bottom-up left-right right-left) default_dims = '800x600' default_pixel_size = '1x1' matrix_application_types = %w(sprayed precoated printed drieddroplet) @parser = Trollop::Parser.new do banner <<-EOS usage: mspire to_imzml [OPTIONS] .mzML ..." output: .imzML and .ibd * imzML docs: http://www.maldi-msi.org/index.php?option=com_content&view=article&id=187&Itemid=67 * explanation of vocabulary (followed here): http://www.maldi-msi.org/index.php?option=com_content&view=article&id=193&Itemid=66 * github repository: https://github.com/princelab/mzml_to_imzml EOS text "\ngeneral:" opt :config, "read a config file for default values. Command line options overide those from the config file ", :type => :string opt :print_config, "print current options to #{default_config} and exit" opt :omit_zeros, "remove zero values" opt :combine, "combine all files and set the base name of resulting imzML and ibd files", :type => String opt :outfile, "use a specific basename for the resulting file. Acts like --combine for multiple files", :type => String text "\nediting:" opt :trim_files, "determines the least number of spectra in a file and shortens all spectra to be the same length" text "\nimaging:" opt :continuous, "assumes m/z values are the same for every scan. The 'processed' storage format is used unless this flag is given." opt :scan_pattern, scan_patterns.join('|'), :default => scan_patterns.first opt :scan_type, scan_types.join('|'), :default => scan_types.first opt :linescan_direction, scan_direction.join('|'), :default => scan_direction.first opt :linescan_sequence, scan_sequence.join('|'), :default => scan_sequence.first opt :max_dimensions_pixels, "maximum X by Y pixels (e.g. 300x100)", :default => default_dims opt :shots_per_position, "number of spectra per position", :default => 1 opt :pixel_size, "X by Y of a single pixel in microns (μm)", :default => default_pixel_size opt :max_dimensions_microns, "maximum X by Y in microns (e.g. 25x20)", :default => default_dims text "\ncontact: " opt :name, "name of the person or organization", :type => :string opt :address, "address of the person or organization", :type => :string opt :url, "url of person or organization", :type => :string opt :email, "email of person or organization", :type => :string opt :organization, "home institution of contact", :type => :string text "\nDESI: " opt :solvent, "the solvent used", :type => :string opt :solvent_flowrate, "flowrate of the solvent (ml/min)", :type => :float opt :spray_voltage, "spray voltage in kV", :type => :float opt :target_material, "the material the target is made of", :type => :string text "\nMALDI: " opt :matrix_application_types, "#{matrix_application_types.join('|')} (comma separated)", :type => :string opt :matrix_solution_concentration, "in grams per liter", :type => :float opt :matrix_solution, "the chemical solution used as matrix (e.g., DHB)", :type => :string # things to add: data types for m/z and intensity # filters (cutoff / max # peaks, etc.) # ms_level, etc. end end def self.run(argv, globalopts) begin opts = parser.parse(argv) rescue Trollop::HelpNeeded return parser.educate end opts = Hash[YAML.load_file(opts[:config]).map {|k,v| [k.to_sym, v]}].merge(opts) if opts[:config] opts[:combine] ||= opts.delete(:outfile) if opts.delete(:print_config) puts "writing defaults to: #{default_config}" string_opts = Hash[ opts.map {|k,v| [k.to_s, v] } ] %w(help).each {|key| string_opts.delete key } string_opts.delete_if {|k,v| k =~ /_given$/ } File.write(default_config, string_opts.to_yaml) exit end if argv.size == 0 return parser.educate end opts[:data_structure] = (opts.delete(:continuous) ? :continuous : :processed) opts[:matrix_application_types] = opts[:matrix_application_types].split(',') if opts[:matrix_application_types] # prep args a little writer = Mspire::Imzml::Writer.new writer.write(argv, opts) end end