From 9c511fa7e096ebc4a288986133aabd5a2febcabd Mon Sep 17 00:00:00 2001 From: nylander Date: Tue, 16 Apr 2024 17:21:03 +0200 Subject: [PATCH] v1.1 --- .gitignore | 1 + LICENSE | 2 +- README.md | 71 +++---- README.pdf | Bin 46873 -> 45280 bytes replace_taxon_labels_in_newick.pl | 311 +++++++++++++++++------------- translate_fasta_headers.pl | 189 +++++++++--------- 6 files changed, 294 insertions(+), 280 deletions(-) diff --git a/.gitignore b/.gitignore index 079d9e0..4e32199 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ Old/ +tmp/ diff --git a/LICENSE b/LICENSE index eae32ed..eee4f30 100644 --- a/LICENSE +++ b/LICENSE @@ -1,4 +1,4 @@ -Copyright (c) 2013-2022 Johan Nylander +Copyright (c) 2013-2024 Johan Nylander Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/README.md b/README.md index 0bdb9d6..047e628 100644 --- a/README.md +++ b/README.md @@ -9,8 +9,8 @@ Use `translate_fasta_headers.pl` on your fasta file to create short labels and a translation table. Run your program X, and then back-translate your fasta headers by running `translate_fasta_headers.pl` again! -And if you created a tree with the short labels, try to back-translate using -`replace_taxon_labels_in_newick.pl`! +And if you created a tree with the short (or long) labels, try to +back-translate using `replace_taxon_labels_in_newick.pl`! If you only wish to transform your long fasta headers to short, without keeping the information about how they where translated, the quick solution might be to @@ -31,11 +31,13 @@ If you wish, you may choose your own prefix (instead of `Seq_`). This could be handy if, for example, you wish to concatenate files. The script for translating labels in Newick trees is somewhat limited in -capacity due to the restrictions of the Newick tree format. Use with caution. +capacity due to the restrictions and/or peculiarities of the Newick tree +format. Use with caution. ## Usage - $ translate_fasta_headers.pl [options] + $ translate_fasta_headers.pl [options] + $ replace_taxon_labels_in_newick.pl [options] ## Examples @@ -60,6 +62,10 @@ Translate short seq labels in Newick tree to long: $ replace_taxon_labels_in_newick.pl -t long.fas.translation.tab short.fas.phy +Print seq labels in Newick tree: + + $ replace_taxon_labels_in_newick.pl -l short.fas.phy + ## Options ### Script `translate_fasta_headers.pl` @@ -67,75 +73,48 @@ Translate short seq labels in Newick tree to long: - `-t, --tabfile=` -- Specify tab-separated translation file with unique "short" labels to the left, and "long" names to the right. Translation will be from left to right. - - `-o, --out=` -- Specify output file for the fasta sequences. **Note**: If `--out=` is specified, the translation file will be named `.translation.tab`. This simplifies back translation. If, on the other hand, `--out` is not used, the translation file will be named after the infile! - - `-i, --in=` -- Specify name of fasta file. Can be skipped as script reads files from STDIN. - - `-n, --notab` -- Do not create a translation file. - - `-p, --prefix=` -- User your own prefix (default is `Seq_`). A numerical will be added to the labels (e.g. `Own_1`, `Own_2`, ...) - -- `-f, --forceorder` -- [NOT YET IMPLEMENTED!] translate in order of - appearance in the fasta file, and use the same order as in the tabfile -- - without rigid checking of the names! This allows non-unique labels in the - left column. - - `-v, --version` -- Print version number and quit. - - `-h, --help` -- Show this help text and quit. ### Script `replace_taxon_labels_in_newick.pl` - `-t, --tabfile=` -- File with table describing what will be translated with what. - +- `-l,-p, --labels` -- Print taxon labels in tree. Option does not require a + translation table. +- `--no-quotemeta` -- Turn off escaping of special symbols in the replacements. - `-o, --out=` -- Print to outfile `out.file`, else to STDOUT. - - `-v, --version` -- Print version number and quit. - - `-h, --help` -- Help text. ## Author -Johan.Nylander\@nbis.se +Johan.Nylander ## Files -- `translate_fasta_headers.pl` -- Perl script -- `replace_taxon_labels_in_newick.pl` -- Perl script -- `data/long.fas` -- Example file with long fasta headers -- `data/short.fas.translation.tab` -- Example translation table -- `data/short.fas` -- Example output with short fasta headers -- `data/short.fas.phy` -- Example Newick tree with short labels -- `README.md` -- Documentation, markdown format -- `README.pdf` -- Documentation, PDF format +- [`translate_fasta_headers.pl`](translate_fasta_headers.pl) -- Perl script +- [`replace_taxon_labels_in_newick.pl`](replace_taxon_labels_in_newick.pl) -- Perl script +- [`data/long.fas`](data/long.fas) -- Example file with long fasta headers +- [`data/short.fas.translation.tab`](data/short.fas.translation.tab) -- Example translation table +- [`data/short.fas`](data/short.fas) -- Example output with short fasta headers +- [`data/short.fas.phy`](data/short.fas.phy) -- Example Newick tree with short labels +- [`README.md`](README.md) -- Documentation, markdown format +- [`README.pdf`](README.pdf) -- Documentation, PDF format ## License and Copyright -Copyright (c) 2013-2022 Johan Nylander - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. +Copyright (c) 2013-2024 Johan Nylander + +[LICENSE](LICENSE) diff --git a/README.pdf b/README.pdf index 2803e71f40b39d123bc0b9841babfab0376ae0bc..7fdd6551e52354151518de0c16ab800c5a487ae2 100644 GIT binary patch delta 44299 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 AG5`Po diff --git a/replace_taxon_labels_in_newick.pl b/replace_taxon_labels_in_newick.pl index 86c181e..bd02f26 100755 --- a/replace_taxon_labels_in_newick.pl +++ b/replace_taxon_labels_in_newick.pl @@ -2,85 +2,114 @@ #=============================================================================== =pod +=head1 NAME -=head2 +replace_taxon_labels_in_newick.pl - extract or replace taxon labels in Newick - FILE: replace_taxon_labels_in_newick.pl +=head1 SYNOPSIS - USAGE: ./replace_taxon_labels_in_newick.pl -t translation.tab [-o out.file] treefile(s) +B -t F [options] F - DESCRIPTION: Replaces taxon labels in Newick string with new ones as defined in tab separated, - two-column file translation.tab +=head1 DESCRIPTION - OPTIONS: -t, --tabfile translation.tab File with table describing what will be translated - with what. See below for format. +Replaces taxon labels in Newick string with new ones as defined in tab +separated, two-column file F. - -h, --help Help text. +Tree is assumed to be in Newick format and on one single line. If spaces are +discovered in taxon labels, the whole label string is enclosed in single ticks +in order for other software to read the output tree. If, on the other hand, +single ticks are already present in the labels, extra ticks will not be added +and a warning will be issued. Please check the output carefully in that case +(and make sure to remove your single ticks manually if needed). - -v, --version Print version. +If the labels to be replaced contain special symbols, replacement with reqular +expressions can be tricky. The script tries to account for these cases by using +(default) "quotemeta" (L). This +behaviour can be turned off by using B<--no-quote-meta>. Please check the +output carefully in cases where you have non-standard symbols in the labels. - -o, --out file.out Print to outfile file.out, else to STDOUT. +Format for F needs to be tab separated, two columns. +Example: - REQUIREMENTS: perldoc needs to be installed for displaying help. + from_name1 to_name1 + from_name2 to_name2 + from_name3 to_name3 - BUGS: --- +As an alternative to providing the tab separated list as a separate file, you +might add the (tab separated) list to the end of this script! - NOTES: Tree is assumed to be in Newick format and on one single line. - If spaces are discovered in taxon labels, the whole label string is enclosed - in single ticks in order for other software to read the output tree. If, - on the other hand, single ticks are already present in the labels, extra - ticks will not be added and a warning will be issued. Please check the output - carefully in that case (and make sure to remove your single ticks manually). + $ cp replace_taxon_labels_in_newick.pl repl.pl + $ cat translation.tab >> repl.pl + $ ./repl.pl tree.tre - Format for translation.tab needs to be tab separated, two columns. - Example: +=head1 OPTIONS - from_name1 to_name1 - from_name2 to_name2 - from_name3 to_name3 +=over 4 - As an alternative to providing the tab separated list as a separate file, you - might add the (tab separated) list to the end of this script! +=item B<-t, --tabfile> F - $ cp replace_taxon_labels_in_newick.pl repl.pl - $ cat translation.tab >> repl.pl - $ ./repl.pl tree.tre +File with table describing what will be translated with what. See DESCRIPTION below for format. - AUTHOR: Johan Nylander (JN), johan.nylander@nbis.se +=item B<--no-quotemeta> - COMPANY: BILS/NRM +Turn off escaping of special symbols in the replacements. - VERSION: 1.0.2 +=item B<-l,-p, --labels> - CREATED: 08/26/2015 04:14:19 PM +Print taxon labels in tree. Option does not require a translation table. - REVISION: ons 14 dec 2022 16:39:15 +=item B<-v, --version> - LICENSE: Copyright (c) 2019-2022 Johan Nylander +Print version. - Permission is hereby granted, free of charge, to any person - obtaining a copy of this software and associated documentation - files (the "Software"), to deal in the Software without - restriction, including without limitation the rights to use, - copy, modify, merge, publish, distribute, sublicense, and/or - sell copies of the Software, and to permit persons to whom the - Software is furnished to do so, subject to the following - conditions: +=item B<-o, --out> F - The above copyright notice and this permission notice shall be - included in all copies or substantial portions of the Software. +Print to outfile F, else to STDOUT. - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES - OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT - HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - OTHER DEALINGS IN THE SOFTWARE. +=item B<-h, --help> -=cut +Help text. + +=back + +=head1 VERSION + +1.1 + +=head1 AUTHOR + +Johan Nylander, Enylander@E + +=head1 DOWNLOAD + +L + +=head1 COPYRIGHT AND LICENSE + +Copyright (c) 2019-2024 Johan Nylander + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or +sell copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. + +=cut #=============================================================================== @@ -89,33 +118,40 @@ use Getopt::Long; ## Globals -my %header_hash = (); # Key: short, value: long. -my $PRINT; # Print file handle. Using the typeglob notation below -my $IN; # in order to use STDOUT as a variable. -my $tabfile = q{}; -my $out = q{}; -my $version = '1.0.2'; # also in pod +my %header_hash = (); # Key: short, value: long. +my $PRINT; # Print file handle. Using the typeglob notation below +my $IN; # in order to use STDOUT as a variable. +my $tabfile = q{}; +my $out = q{}; +my $labels = q{}; +my $use_quotemeta = 1; +my $version = '1.1'; # also in pod ## Arguments exec("perldoc", $0) unless (@ARGV); GetOptions( "tabfile=s" => \$tabfile, - "out=s" => \$out, - "version" => sub { print "$version\n"; exit(0); }, - "help" => sub { exec("perldoc", $0); exit(0); }, + "out=s" => \$out, + "quotemeta!" => \$use_quotemeta, + "l|print-labels" => \$labels, + "version" => sub { print "$version\n"; exit(0); }, + "help" => sub { exec("perldoc", $0); exit(0); }, ); ## If tabfile, read it assuming "short" labels in the left column -if ($tabfile) { - %header_hash = read_tabfile($tabfile); +if ($labels) { + # print labels } else { - if () { + if ($tabfile) { + %header_hash = read_tabfile($tabfile); + } + elsif () { %header_hash = read_DATA(); } else { - print STDERR "Error! No tabfile specified. See $0 -h for manual.\n"; + print STDERR "Error! No tabfile specified. See $0 -h for usage.\n"; exit(0); } } @@ -138,28 +174,57 @@ if ($line =~ /^\s*\((\S|\s)+\s*;/) { $notree = 0; $line = trim_white_space($line); - my $tree = replace_taxon_labels($line, \%header_hash); - print $PRINT $tree, "\n"; + if ($labels) { + print_taxon_labels($line); + } + else { + my $tree = replace_taxon_labels($line, \%header_hash); + print $PRINT $tree, "\n"; + } } } - close($TREEFILE); + close ($TREEFILE); if ($notree) { - print STDERR "Error: Tried to look for tree in Newick format (tree description on single line) but didn't find it.\n"; + die "Error: Tried to look for tree in Newick format (tree description on single line) but didn't find it.\n"; } } -#=== FUNCTION ================================================================ -# NAME: read_tabfile -# VERSION: 09/18/2015 11:52:22 AM -# DESCRIPTION: read tabfile and return hash. Pad strings if they contain white space. -# PARAMETERS: filename -# RETURNS: hash (key:short, value:long) -# TODO: Handle/replace single ticks? -#=============================================================================== +sub print_taxon_labels { + + #=== FUNCTION ================================================================ + # NAME: print_taxon_labels + # VERSION: Mon 15 apr 2024 09:05:54 + # DESCRIPTION: Print taxon labels in tree to STDOUT + # PARAMETERS: string with newick description + # RETURNS: prints + # TODO: Take into account cases where we have quoted taxon labels with + # commas, parantheses, etc. + #=============================================================================== + + my ($tree) = @_; + my (@arr) = split /,/, $tree; + foreach my $string (@arr) { + $string =~ s/:.*$//; + $string =~ s/^[\(]*//; + print $PRINT $string, "\n"; + } + +} # end of print_taxon_labels + + sub read_tabfile { - my ($file) = @_; + #=== FUNCTION ================================================================ + # NAME: read_tabfile + # VERSION: 09/18/2015 11:52:22 AM + # DESCRIPTION: read tabfile and return hash. Pad strings if they contain white space. + # PARAMETERS: filename + # RETURNS: hash (key:short, value:long) + # TODO: Handle/replace single ticks? + #=============================================================================== + + my ($file) = @_; my $found_space_in_short = 0; my $found_space_in_long = 0; @@ -213,20 +278,20 @@ sub read_tabfile { return(%return_hash); - } # end of read_tabfile -#=== FUNCTION ================================================================ -# NAME: read_DATA -# VERSION: 08/22/2017 01:15:31 PM -# DESCRIPTION: read DATA and return hash. Pad strings if they contain white space. -# PARAMETERS: - -# RETURNS: hash (key:short, value:long) -# TODO: Handle/replace single ticks? -#=============================================================================== sub read_DATA { + #=== FUNCTION ================================================================ + # NAME: read_DATA + # VERSION: 08/22/2017 01:15:31 PM + # DESCRIPTION: read DATA and return hash. Pad strings if they contain white space. + # PARAMETERS: - + # RETURNS: hash (key:short, value:long) + # TODO: Handle/replace single ticks? + #=============================================================================== + my $found_space_in_short = 0; my $found_space_in_long = 0; my %hash = (); # Key: short, value: long @@ -280,16 +345,17 @@ sub read_DATA { } # end of read_DATA -#=== FUNCTION ================================================================ -# NAME: trim_white_space -# VERSION: 03/14/2013 09:44:02 PM -# DESCRIPTION: trim white space from both ends of string -# PARAMETERS: string -# RETURNS: string -# TODO: ???? -#=============================================================================== sub trim_white_space { + #=== FUNCTION ================================================================ + # NAME: trim_white_space + # VERSION: 03/14/2013 09:44:02 PM + # DESCRIPTION: trim white space from both ends of string + # PARAMETERS: string + # RETURNS: string + # TODO: ? + #=============================================================================== + my ($a) = @_; $a =~ s/^\s+//; @@ -300,51 +366,30 @@ sub trim_white_space { } # end of trim_white_space -#=== FUNCTION ================================================================ -# NAME: check_white_space_in_labels -# VERSION: 09/18/2015 10:54:43 AM -# DESCRIPTION: check if white space and/or single ticks in labels. Add single -# ticks to ends if found white spaces, not if found single ticks. -# If found single ticks, warn. -# PARAMETERS: string -# RETURNS: string -# TODO: ???? -#=============================================================================== -sub check_white_space_in_labels { - - my ($string) = @_; - - if ($string =~ /\s/) { - if ($string =~ /'/) { - warn "Caution: found single ticks and spaces in taxon labels. Check output format carefully.\n"; - } - else { - $string = "\'" . $string . "\'"; - } - } - - return($string); - -} # end of check_white_space_in_labels - - -#=== FUNCTION ================================================================ -# NAME: replace_taxon_labels -# VERSION: 08/22/2017 01:45:06 PM -# DESCRIPTION: replaces strings with new sequence (taxon) labels -# PARAMETERS: (newick) tree string and reference to hash holding translation table. -# RETURNS: tree string with seq labels replaced -# NOTE: No spaces between label and separators, and most probably no -# special characters in taxlabels are allowed. -#=============================================================================== sub replace_taxon_labels { + #=== FUNCTION ================================================================ + # NAME: replace_taxon_labels + # VERSION: 08/22/2017 01:45:06 PM + # DESCRIPTION: replaces strings with new sequence (taxon) labels + # PARAMETERS: (newick) tree string and reference to hash holding translation table. + # RETURNS: tree string with seq labels replaced + # NOTE: No spaces between label and separators, and most probably no + # special characters in taxlabels are allowed. + # Quotemeta is mostly untested (tis 16 apr 2024 16:39:50) + #=============================================================================== + my ($tree, $hash_reference) = @_; my $replaced = 0; foreach my $string (keys %$hash_reference) { # $key is number, $value is label my $newlabel = $hash_reference->{$string}; + + if ($use_quotemeta) { + $string = quotemeta($string); + } + if ($tree =~ /,$string:/) { $replaced = $tree =~ s/,$string:/,$newlabel:/; # ',123:' => ',foo:' } diff --git a/translate_fasta_headers.pl b/translate_fasta_headers.pl index fc3ba5f..09ff181 100755 --- a/translate_fasta_headers.pl +++ b/translate_fasta_headers.pl @@ -2,112 +2,98 @@ #=============================================================================== =pod -=head2 +=head1 NAME - FILE: translate_fasta_headers.pl +translate_fasta_headers.pl - translate fasta headers from long to short -- and back! - USAGE: ./translate_fasta_headers.pl [options] +=head1 SYNOPSIS - # From long to short labels: - ./translate_fasta_headers.pl --out=short.fas long.fas +B [options] F - # And back, using a translation table: - ./translate_fasta_headers.pl --tabfile=short.fas.translation.tab short.fas +=head1 DESCRIPTION - # Slightly shorter/different version: - ./translate_fasta_headers.pl long.fas > short.fas - ./translate_fasta_headers.pl -t long.fas.translation.tab short.fas > back.fas +Replace fasta headers with headers taken from tab delimited file. If no tab +file is given, the (potentially long) fasta headers are replaced by short +labels "Seq_1", "Seq_2", etc, and the short and original headers are printed to +a translation file. - # Use your own prefix: - ./translate_fasta_headers.pl --prefix='Own_' long.fas > short.fas +=head1 OPTIONS +=over 4 - DESCRIPTION: Replace fasta headers with headers taken from tab delimited file. - If no tab file is given, the (potentially long) fasta headers are replaced - by short labels "Seq_1", "Seq_2", etc, and the short and original headers - are printed to a translation file. +=item B<-t, --tabfile>=F - OPTIONS: -t, --tabfile= -- Specify tab-separated translation file with - unique "short" labels to the left, and "long" - names to the right. Translation will be from - left to right. +Specify tab-separated translation file with unique "short" labels to the left, +and "long" names to the right. Translation will be from left to right. - -i, --in= -- Specify name of fasta file. Can be skipped as - script reads files from STDIN. +=item B<-i, --in>=F - -o, --out= -- Specify output file for the fasta sequences. - Note: If --out= is specified, the - translation file will be named - .translation.tab. This simplifies - back translation. If '--out' is not used, - the translation file will be named after - the infile! +Specify name of fasta file. Can be skipped as script reads files from STDIN. - -n, --notab -- Do not create a translation file. +=item B<-o, --out>=F - -p, --prefix= -- Prefix for short label. Defaults to 'Seq_'. +Specify output file for the fasta sequences. Note: If b<--out>=F is +specified, the translation file will be named F.translation.tab. This +simplifies back translation. If B<--out> is not used, the translation file will +be named after the infile! - -f, --forceorder -- [NOT IMPLEMENTED] translate in order of - appearance in the fasta file, and use - the same order as in the tabfile - without - rigid checking of the names! This allows - non-unique labels in the left column. +=item B<-n, --notab> - -v, --version -- Print version number and quit. +Do not create a translation file. - -h, --help -- Show this help text and quit. +=item B<-p, --prefix>=I - REQUIREMENTS: --- +Prefix for short label. Defaults to I. - BUGS: --- +=item B<-v, --version> - NOTES: --- +Print version number and quit. - AUTHOR: Johan.Nylander\@nbis.se +=item B<-h, --help> - COMPANY: NBIS/NRM +Show this help text and quit. - VERSION: 1.0.2 +=back - CREATED: 03/13/2013 01:52:28 PM +=head1 VERSION - REVISION: ons 11 maj 2022 16:34:30 +1.1 - TODO: Handle non-unique values in the left tabfile column - (can't use hash): - Test if values in translation table are unique. If so, - use read_tabfile. If not, read into two arrays, check - for same lengths, and then use an iterator while reading - the infile. Warn if number of sequences doesn't match - number of entries in the tab file. Plus give a warning - that labels where not unique. Use the array approach - when '--forceorder'. +=head1 AUTHOR - LICENSE: Copyright (c) 2019-2022 Johan Nylander +Johan Nylander - Permission is hereby granted, free of charge, to any person - obtaining a copy of this software and associated documentation - files (the "Software"), to deal in the Software without - restriction, including without limitation the rights to use, - copy, modify, merge, publish, distribute, sublicense, and/or - sell copies of the Software, and to permit persons to whom the - Software is furnished to do so, subject to the following - conditions: +=head1 DOWNLOAD - The above copyright notice and this permission notice shall be - included in all copies or substantial portions of the Software. +L - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES - OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT - HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - OTHER DEALINGS IN THE SOFTWARE. +=head1 COPYRIGHT AND LICENSE +Copyright (c) 2019-2024 Johan Nylander + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or +sell copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. =cut + #=============================================================================== use strict; @@ -116,7 +102,7 @@ ## Globals my $prefix = 'Seq_'; # Prefix for short names -my $version = '1.0.2'; # Also in pod +my $version = '1.1'; # Also in pod my $tabfile = q{}; my $in = q{}; my $out = q{}; @@ -170,17 +156,18 @@ exit(0); -#=== FUNCTION ================================================================ -# NAME: read_infile -# VERSION: 01/10/2018 01:03:55 PM -# DESCRIPTION: Reads a tab separated file and returns a hash. Expects all values -# in left column ("short") to be unique! -# PARAMETERS: filename, prefix -# RETURNS: hash: key:short, value:long -# TODO: -#=============================================================================== sub read_infile { + #=== FUNCTION ================================================================ + # NAME: read_infile + # VERSION: 01/10/2018 01:03:55 PM + # DESCRIPTION: Reads a tab separated file and returns a hash. Expects all values + # in left column ("short") to be unique! + # PARAMETERS: filename, prefix + # RETURNS: hash: key:short, value:long + # TODO: + #=============================================================================== + my ($file, $shortlabel) = (@_); my @in_headers_array = (); my $counter = 1; @@ -245,16 +232,17 @@ sub read_infile { } # end of read_infile -#=== FUNCTION ================================================================ -# NAME: read_tabfile -# VERSION: 03/14/2013 09:42:47 PM -# DESCRIPTION: read tabfile and return hash -# PARAMETERS: filename -# RETURNS: hash (key:short, value:long) -# TODO: ???? -#=============================================================================== sub read_tabfile { + #=== FUNCTION ================================================================ + # NAME: read_tabfile + # VERSION: 03/14/2013 09:42:47 PM + # DESCRIPTION: read tabfile and return hash + # PARAMETERS: filename + # RETURNS: hash (key:short, value:long) + # TODO: ???? + #=============================================================================== + my ($file) = @_; my %hash = (); # Key: short, value: long @@ -280,16 +268,17 @@ sub read_tabfile { } # end of read_tabfile -#=== FUNCTION ================================================================ -# NAME: trim_white_space -# VERSION: 03/14/2013 09:44:02 PM -# DESCRIPTION: trim white space from both ends of string -# PARAMETERS: string -# RETURNS: string -# TODO: ???? -#=============================================================================== sub trim_white_space { + #=== FUNCTION ================================================================ + # NAME: trim_white_space + # VERSION: 03/14/2013 09:44:02 PM + # DESCRIPTION: trim white space from both ends of string + # PARAMETERS: string + # RETURNS: string + # TODO: ???? + #=============================================================================== + my ($a) = @_; $a =~ s/^\s+//;