Bio-NEXUS
view release on metacpan or search on metacpan
lib/Bio/NEXUS/Tools/NexModifier.pm view on Meta::CPAN
}
}
=head2 selectbytree
Title : selectbytree
Usage : NA
Function: select a tree
Returns : NA
Args : NA
=cut
sub selectbytree {
my ($nexus, $treename) = @_;
($treename) or die "ERROR: Need to specify a tree to be selected\n";
return $nexus->select_tree($treename);
}
=head2 selectbyinode
Title : selectbyinode
Usage : NA
Function: select a subtree by specifying its root internal node
Returns : NA
Args : NA
=cut
#
sub selectbyinode {
my ($nexus, $nodename, $treename) = @_;
$nodename or die "ERROR: Need to specify an internal node for subtree\n";
return $nexus->select_subtree($nodename, $treename);
}
=head2 selectbycolumn
Title : selectbycolumn
Usage : NA
Function: select ($command=1) or exclude ($command=0) specified column list or file with list
Returns : NA
Args : NA
=cut
# arguments (column numbers) can be of form:
# 1) 1-3 4 5 6-10 or 1-3, 4 5, 6-10
# 2) -f <file name> contains numbers in format as examplified in 1)
sub selectbycolumn {
my ($nexus, $command, @args) = @_;
my $args = "@args";
$args =~ s/title\s*=\s*(\w+)//i;
my $title = $1;
# my $block = $nexus->get_block("characters", $title);
die "need column numbers" unless $args;
my $columns;
if ($args =~ /-f (\S+)/) { # input from file
my $file = $1;
$columns = do{ local(@ARGV, $/) = $file; <>};
$columns =~ s/\n/ /g;
}else { # input from command line separated by comma or space
$columns = $args;
}
my @columns = @{ &parse_number($columns) };
if ($command) {
return $nexus->select_chars(\@columns, $title);
}else {
return $nexus->exclude_chars(\@columns, $title);
}
}
=head2 selectbysets
Title : selectbysets
Usage : NA
Function: NA
Returns : NA
Args : NA
=cut
sub selectbysets {
my ($nexus, $mode, @setnames) = @_;
my @otus;
die "Provide set names as arguments\n" unless (@setnames);
for my $setname (@setnames) {
push(@otus, @{ $nexus->get_block('sets')->get_taxset($setname) } );
}
if ( $mode == 1 ) { # "select" mode
return $nexus->select_otus(\@otus);
} else { # "exclude" mode
return $nexus->exclude_otus(\@otus);
}
}
=head2 parse_number
Title : parse_number
Usage : NA
Function: parse numbers in format "1-3, 4 6 8-10"
Returns : NA
Args : NA
=cut
#
sub parse_number {
my $s = unquote( shift );
if (! $s =~ /^\s*(\d+(-\d+)?)([,\s]\s*\d+(-\d+)?)*\s*$/ ) {
die "Invalid number format. Use 1 or 1-3 or 1, 3, 5-8 or 1 3 5 6-10.\n";
}
$s =~ s/^\s+|\s+$//g;
$s =~ s/,?\s+/,/g; # use ',' as separator
my @cols = split(/,/, $s);
my @arr;
foreach my $item (@cols) {
if ($item =~ /-/) { # eg 1-3
( run in 0.747 second using v1.01-cache-2.11-cpan-98e64b0badf )