X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=forester%2Fruby%2Fevoruby%2Flib%2Fevo%2Futil%2Futil.rb;h=e4173d326c1aa2fe4e12abcc592866cbff95b734;hb=2044a46819969b8ac56d653aab5729fb782ec40c;hp=234a6250b5b832e1bb7c1f4e34654e0a20160a82;hpb=253a714c2440558d7c70fe30cac5d7b093798968;p=jalview.git diff --git a/forester/ruby/evoruby/lib/evo/util/util.rb b/forester/ruby/evoruby/lib/evo/util/util.rb index 234a625..e4173d3 100644 --- a/forester/ruby/evoruby/lib/evo/util/util.rb +++ b/forester/ruby/evoruby/lib/evo/util/util.rb @@ -12,229 +12,219 @@ require 'lib/evo/util/constants' module Evoruby - class Util - - def Util.normalize_seq_name( name, length ) - if name.length > length - name = name[ 0, length ] - elsif name.length < length - for i in 0 ... length - name.length - name = name + " " - end - end - name - end - - # def Util.normalize_mol_sequence( seq ) - # new_seq = String.new() - # for i in 0 ... seq.length - # c = seq.get_slice( i ) - # if is_aa_gap_character?( c ) - # new_seq = new_seq + "-" - # else - # new_seq = new_seq + c - # end - # end - # new_seq - # end - - - # Returns true if char_code corresponds to: space * - . _ - def Util.is_aa_gap_character?( char_code ) - return ( char_code <= 32 || char_code == 42 || char_code == 45 || char_code == 46 ||char_code == 95 ) - end - - # Deletes *, digits, and whitespace, replaces BJOUZ? with X, and replaces non-(letters, -) with - - def Util.clean_seq_str( seq_str ) - seq_str = seq_str.upcase - seq_str = seq_str.gsub( /\s+/, '' ) - seq_str = seq_str.gsub( /\d+/, '' ) - seq_str = seq_str.gsub( '*', '' ) - seq_str = seq_str.gsub( /[BJOUZ?]/, 'X' ) - seq_str = seq_str.gsub( /[^A-Z\-]/, '-' ) - seq_str - end - - # raises ArgumentError - def Util.check_file_for_readability( path ) - unless ( File.exist?( path ) ) - error_msg = "file [#{path}] does not exist" - raise ArgumentError, error_msg - end - unless ( File.file?( path ) ) - error_msg = "file [#{path}] is not a regular file" - raise ArgumentError, error_msg - end - unless ( File.readable?( path ) ) - error_msg = "file [#{path}] is not a readable file" - raise ArgumentError, error_msg - end - if ( File.zero?( path ) ) - error_msg = "file [#{path}] is empty" - raise ArgumentError, error_msg - end - end - - # raises ArgumentError - def Util.check_file_for_writability( path ) - if File.directory?( path ) - error_msg = "file [#{path}] is an existing directory" - raise ArgumentError, error_msg - elsif File.exist?( path ) - error_msg = "file [#{path}] already exists" - raise ArgumentError, error_msg - elsif File.writable?( path ) - error_msg = "file [#{path}] is not writeable" - raise ArgumentError, error_msg - end - end - - def Util.fatal_error_if_not_writable( prg_name, path ) - begin - Util.check_file_for_writability( path ) - rescue ArgumentError => e - Util.fatal_error( prg_name, e.to_s ) - end - end - - def Util.fatal_error_if_not_readable( prg_name, path ) - begin - Util.check_file_for_readability( path ) - rescue ArgumentError => e - Util.fatal_error( prg_name, e.to_s ) - end - end - - def Util.get_env_variable_value( env_variable ) - value = ENV[env_variable] - if value == nil || value.empty? - error_msg = "apparently environment variable #{env_variable} has not been set" - raise StandardError, error_msg - end - value - end - - - # raises ArgumentError - def Util.file2array( path, split_by_semicolon ) - Util.check_file_for_readability( path ) - a = Array.new() - c = 0 - File.open( path ) do | file | - while line = file.gets - if ( line =~ /^\s*(\S.*?)\s*$/ ) - s = $1 - if ( split_by_semicolon && s =~/;/ ) - sa = s.split( /;/ ) - for i in 0 ... sa.length() - a[ c ] = sa[ i ].strip! - end - else - a[ c ] = s - end - c += 1 - end - end - end - return a - end - - def Util.print_program_information( prg_name, - prg_version, - prg_desc, - date, - copyright, - contact, - www, - io = STDOUT ) - - if RUBY_VERSION !~ /1.9/ - puts( "Your ruby version is #{RUBY_VERSION}, expected 1.9.x " ) - exit( -1 ) - end - - ruby_version = RUBY_VERSION - l = prg_name.length + prg_version.length + date.length + ruby_version.length + 12 - io.print( Evoruby::Constants::LINE_DELIMITER ) - io.print( prg_name + " " + prg_version + " [" + date + "] [ruby " + ruby_version + "]") - io.print( Evoruby::Constants::LINE_DELIMITER ) - l.times { - io.print( "_" ) - } - io.print( Constants::LINE_DELIMITER ) - io.print( Constants::LINE_DELIMITER ) - io.print( prg_desc ) - io.print( Constants::LINE_DELIMITER ) - io.print( Constants::LINE_DELIMITER ) - io.print( "Copyright (C) " + copyright ) - io.print( Constants::LINE_DELIMITER ) - io.print( "Contact: " + contact ) - io.print( Constants::LINE_DELIMITER ) - io.print( " " + www ) - io.print( Constants::LINE_DELIMITER ) - io.print( Constants::LINE_DELIMITER ) - end - - def Util.fatal_error( prg_name, message, io = STDOUT ) - io.print( Constants::LINE_DELIMITER ) - if ( !Util.is_string_empty?( prg_name ) ) - io.print( "[" + prg_name + "] > " + message ) + class Util + + def Util.normalize_seq_name( name, length, exception_if_too_long = false ) + if name.length > length + if exception_if_too_long + error_msg = "sequence name \"#{name}\" is too long (>#{length})" + raise StandardError, error_msg + end + name = name[ 0, length ] + elsif name.length < length + for i in 0 ... length - name.length + name = name + " " + end + end + name + end + + # Returns true if char_code corresponds to: space * - . _ + def Util.is_aa_gap_character?( char_code ) + return ( char_code <= 32 || char_code == 42 || char_code == 45 || char_code == 46 ||char_code == 95 ) + end + + # Deletes *, digits, and whitespace, replaces BJOUZ? with X, and replaces non-(letters, -) with - + def Util.clean_seq_str( seq_str ) + seq_str = seq_str.upcase + seq_str = seq_str.gsub( /\s+/, '' ) + seq_str = seq_str.gsub( /\d+/, '' ) + seq_str = seq_str.gsub( '*', '' ) + seq_str = seq_str.gsub( /[BJOUZ?]/, 'X' ) + seq_str = seq_str.gsub( /[^A-Z\-]/, '-' ) + seq_str + end + + # raises ArgumentError + def Util.check_file_for_readability( path ) + unless ( File.exist?( path ) ) + error_msg = "file [#{path}] does not exist" + raise IOError, error_msg + end + unless ( File.file?( path ) ) + error_msg = "file [#{path}] is not a regular file" + raise IOError, error_msg + end + unless ( File.readable?( path ) ) + error_msg = "file [#{path}] is not a readable file" + raise IOError, error_msg + end + if ( File.zero?( path ) ) + error_msg = "file [#{path}] is empty" + raise IOError, error_msg + end + end + + # raises ArgumentError + def Util.check_file_for_writability( path ) + if File.directory?( path ) + error_msg = "file [#{path}] is an existing directory" + raise IOError, error_msg + elsif File.exist?( path ) + error_msg = "file [#{path}] already exists" + raise IOError, error_msg + elsif File.writable?( path ) + error_msg = "file [#{path}] is not writeable" + raise IOError, error_msg + end + end + + def Util.fatal_error_if_not_writable( prg_name, path ) + begin + Util.check_file_for_writability( path ) + rescue IOError => e + Util.fatal_error( prg_name, e.to_s ) + end + end + + def Util.fatal_error_if_not_readable( prg_name, path ) + begin + Util.check_file_for_readability( path ) + rescue IOError => e + Util.fatal_error( prg_name, e.to_s ) + end + end + + def Util.get_env_variable_value( env_variable ) + value = ENV[env_variable] + if value == nil || value.empty? + error_msg = "apparently environment variable #{env_variable} has not been set" + raise StandardError, error_msg + end + value + end + + + # raises ArgumentError + def Util.file2array( path, split_by_semicolon ) + Util.check_file_for_readability( path ) + a = Array.new() + c = 0 + File.open( path ) do | file | + while line = file.gets + if ( line =~ /^\s*(\S.*?)\s*$/ ) + s = $1 + if ( split_by_semicolon && s =~/;/ ) + sa = s.split( /;/ ) + for i in 0 ... sa.length() + a[ c ] = sa[ i ].strip! + end else - io.print( " > " + message ) - end - io.print( Constants::LINE_DELIMITER ) - io.print( Constants::LINE_DELIMITER ) - exit( -1 ) - end - - def Util.print_message( prg_name, message, io = STDOUT ) - if ( !Util.is_string_empty?( prg_name ) ) - io.print( "[" + prg_name + "] > " + message ) - else - io.print( " > " + message ) - end - io.print( Constants::LINE_DELIMITER ) - end - - def Util.print_warning_message( prg_name, message, io = STDOUT ) - if ( !Util.is_string_empty?( prg_name ) ) - io.print( "[" + prg_name + "] > WARNING: " + message ) - else - io.print( " > " + message ) - end - io.print( Constants::LINE_DELIMITER ) - end - - def Util.is_string_empty?( s ) - return ( s == nil || s.length < 1 ) - end - - # From "Ruby Cookbook" - # counts_hash: key is a "name", value is the count (integer) - def Util.draw_histogram( counts_hash, char = "#" ) - pairs = counts_hash.keys.collect { |x| [ x.to_s, counts_hash[ x ] ] }.sort - largest_key_size = pairs.max { |x, y| x[ 0 ].size <=> y[ 0 ].size }[ 0 ].size - pairs.inject( "" ) do | s, kv | - s << "#{ kv[ 0 ].ljust( largest_key_size ) } | #{ char*kv[ 1 ] }" + Constants::LINE_DELIMITER - end - end - - def Util.looks_like_fasta?( path ) - Util.check_file_for_readability( path ) - File.open( path ) do | file | - while line = file.gets - if ( line !~ /\S/ || line =~ /^\s*#/ ) - elsif line =~ /^\s*>\s*(.+)/ - return true - else - return false - end - end - end - error_msg = "unexpected format" - raise IOError, error_msg - end - - end # class Util + a[ c ] = s + end + c += 1 + end + end + end + return a + end + + def Util.print_program_information( prg_name, + prg_version, + prg_desc, + date, + copyright, + contact, + www, + io = STDOUT ) + + if RUBY_VERSION !~ /1.9/ + puts( "Your ruby version is #{RUBY_VERSION}, expected 1.9.x " ) + exit( -1 ) + end + + ruby_version = RUBY_VERSION + l = prg_name.length + prg_version.length + date.length + ruby_version.length + 12 + io.print( Evoruby::Constants::LINE_DELIMITER ) + io.print( prg_name + " " + prg_version + " [" + date + "] [ruby " + ruby_version + "]") + io.print( Evoruby::Constants::LINE_DELIMITER ) + l.times { + io.print( "_" ) + } + io.print( Constants::LINE_DELIMITER ) + io.print( Constants::LINE_DELIMITER ) + io.print( prg_desc ) + io.print( Constants::LINE_DELIMITER ) + io.print( Constants::LINE_DELIMITER ) + io.print( "Copyright (C) " + copyright ) + io.print( Constants::LINE_DELIMITER ) + io.print( "Contact: " + contact ) + io.print( Constants::LINE_DELIMITER ) + io.print( " " + www ) + io.print( Constants::LINE_DELIMITER ) + io.print( Constants::LINE_DELIMITER ) + end + + def Util.fatal_error( prg_name, message, io = STDOUT ) + io.print( Constants::LINE_DELIMITER ) + if ( !Util.is_string_empty?( prg_name ) ) + io.print( "[" + prg_name + "] > " + message ) + else + io.print( " > " + message ) + end + io.print( Constants::LINE_DELIMITER ) + io.print( Constants::LINE_DELIMITER ) + exit( -1 ) + end + + def Util.print_message( prg_name, message, io = STDOUT ) + if ( !Util.is_string_empty?( prg_name ) ) + io.print( "[" + prg_name + "] > " + message ) + else + io.print( " > " + message ) + end + io.print( Constants::LINE_DELIMITER ) + end + + def Util.print_warning_message( prg_name, message, io = STDOUT ) + if ( !Util.is_string_empty?( prg_name ) ) + io.print( "[" + prg_name + "] > WARNING: " + message ) + else + io.print( " > " + message ) + end + io.print( Constants::LINE_DELIMITER ) + end + + def Util.is_string_empty?( s ) + return ( s == nil || s.length < 1 ) + end + + # From "Ruby Cookbook" + # counts_hash: key is a "name", value is the count (integer) + def Util.draw_histogram( counts_hash, char = "#" ) + pairs = counts_hash.keys.collect { |x| [ x.to_s, counts_hash[ x ] ] }.sort + largest_key_size = pairs.max { |x, y| x[ 0 ].size <=> y[ 0 ].size }[ 0 ].size + pairs.inject( "" ) do | s, kv | + s << "#{ kv[ 0 ].ljust( largest_key_size ) } | #{ char*kv[ 1 ] }" + Constants::LINE_DELIMITER + end + end + + def Util.looks_like_fasta?( path ) + Util.check_file_for_readability( path ) + File.open( path ) do | file | + while line = file.gets + if ( line !~ /\S/ || line =~ /^\s*#/ ) + elsif line =~ /^\s*>\s*(.+)/ + return true + else + return false + end + end + end + error_msg = "unexpected format" + raise IOError, error_msg + end + + end # class Util end # module Evoruby