The Perl and Raku Conference 2025: Greenville, South Carolina - June 27-29 Learn more

#!/usr/bin/env perl
use autodie;
use feature qw(say);
use List::AllUtils qw(pairkeys pairgrep pairmap partition_by sort_by);
use Path::Class qw(file);
my $class = 'Bio::MUST::Core::Tree::Splits';
{
my $infile = "test/lhc-prasino.splits.nex";
my $splits = $class->load_splits($infile);
isa_ok $splits, $class, $infile;
cmp_ok $splits->rep_n, '==', 100, 'got expected rep_n from splits file';
}
{
my $infile = "test/consense.out";
my $splits = $class->load_consense($infile);
isa_ok $splits, $class, $infile;
cmp_ok $splits->rep_n, '==', 100, 'got expected rep_n from consense file';
my @exp_supports = (
[ [ qw(Brachionus Caenorhabd Trichinell Schmidtea) ], 76 ],
[ [ qw(Molgula_te Ciona_inte Xenopus_tr Branchiost) ], 62 ],
# this one requires comp_bp_for
[ [ qw(Strongyloc Amphimedon Acropora_m Nematostel) ], 61 ],
);
my @got_supports = map {
0 + $splits->clan_support( $splits->ids2key($_->[0]) )
} @exp_supports; # 0 + to emulate ==
is_deeply \@got_supports, [ map { $_->[1] } @exp_supports ],
'got expected support for clans';
}
{
my @infiles = (
'mullidae-well-rooted.tre',
'mullidae-unrooted.tre',
'mullidae-unrooted.tpl',
);
for my $infile (@infiles) {
explain $infile;
clan_tests( file('test', $infile) );
}
}
sub clan_tests {
my $infile = shift;
my $tpl = $infile =~ m/\.tpl\z/xms;
my $max = $tpl ? 1 : 100;
my $splits = $class->load_newick($infile);
isa_ok $splits, $class, $infile;
cmp_ok $splits->rep_n, '==', $max, 'got expected rep_n from newick file';
my @exp_clans = map { tr/_/ /r; } qw(
Mulloidichthys_dentatus
Mulloidichthys_flavolineatus
Mullus_auratus
Parupeneus_barberinoides
Parupeneus_barberinus
Parupeneus_chrysopleuron
Parupeneus_crassilabris
Parupeneus_cyclostomus
Parupeneus_forsskali
Parupeneus_indicus
Parupeneus_insularis
Parupeneus_rubescens
Pseudupeneus_maculatus
Pseudupeneus_prayensis
Upeneichthys_lineatus
Upeneus_japonicus
Upeneus_oligospilus
Upeneus_suahelicus
Upeneus_sundaicus
Upeneus_tragula
Upeneus_vittatus
);
my $tree = Bio::MUST::Core::Tree->load($infile);
my %ids_for
= pairmap { $a => [ sort_by { $_->full_id } @$b ] }
partition_by { $_->org } $tree->all_seq_ids
;
my @got_clans = pairkeys
pairgrep { $splits->is_a_clan( $splits->ids2key($b) ) } %ids_for;
cmp_bag \@got_clans, \@exp_clans, 'got expected org lists being clans';
my @exp_bp_vals = (
[ [ qw(Parupeneus_bifasciatus_longo@283070
Parupeneus_multifasciatus_longo@251257
Parupeneus_multifasciatus_stiller@384139
Parupeneus_williamsi_stiller@377438
Parupeneus_margaritatus_stiller@377536
Parupeneus_macronemus_nash@343997
Parupeneus_crassilabris_santa@382724
Parupeneus_crassilabris_stiller@381739
Parupeneus_insularis_santa@382832
Parupeneus_insularis_stiller@380509
Parupeneus_trifasciatus_stiller@383431
Parupeneus_rubescens_longo@311644
Parupeneus_rubescens_stiller@379460
Parupeneus_spilurus_nash@269596
Parupeneus_ciliatus_arbor@359765
Parupeneus_biaculeatus_stiller@383203
Parupeneus_biaculeatus_arbor@304503
Parupeneus_forsskali_santa@345830
Parupeneus_forsskali_stiller@384155
Parupeneus_margaritatus_nash@317842
Parupeneus_cyclostomus_longo@144532
Parupeneus_cyclostomus_1_stiller@381299
Parupeneus_cyclostomus_2_stiller@379819
Parupeneus_chrysopleuron_nash@365245
Parupeneus_chrysopleuron_stiller@378413
Parupeneus_chrysopleuron_2_arbor@362139
Parupeneus_chrysopleuron_1_arbor@272471) ], ($tpl ? 1 : 78) ],
[ [ qw(Upeneus_oligospilus_nash@260328
Upeneus_oligospilus_2_arbor@353819
Upeneus_oligospilus_1_arbor@318514
Upeneus_heemstra_arbor@265512) ], ($tpl ? 1 : 45) ],
[ [ qw(Mullus_auratus_1_stiller@381434
Mullus_auratus_2_stiller@380902) ], ($tpl ? 1 : 98) ],
);
for my $exp_row (@exp_bp_vals) {
my $key = $splits->ids2key($exp_row->[0]);
my $val = $splits->clan_support($key);
cmp_ok $val, '==', $exp_row->[1],
"got expected clan support from ids: $val";
}
my $genus = 'Mulloidichthys';
my @needle = grep { $_->full_id =~ m/$genus/xms } $tree->all_seq_ids;
my $key = $splits->ids2key(\@needle);
ok $splits->is_a_clan($key),
"got expected clan status for $genus";
cmp_ok $splits->clan_support($key), '==', $max,
"got expected BP support for $genus";
my %exp_bp_val_for = (
'Mulloidichthys ayliffe_nash@215468,Mulloidichthys dentatus_longo@321198,Mulloidichthys dentatus_nash@368645,Mulloidichthys flavolineatus_santa@382170,Mulloidichthys flavolineatus_stiller@374330,Mulloidichthys martinicus_longo@312721,Mulloidichthys martinicus_stiller@380523,Mulloidichthys vanicolensis_longo@282366,Mulloidichthys vanicolensis_stiller@385444'
=> [ $max, 'Mulloidichthys pfluegeri_arbor@366817' ],
'Mulloidichthys ayliffe_nash@215468,Mulloidichthys dentatus_longo@321198,Mulloidichthys dentatus_nash@368645,Mulloidichthys martinicus_longo@312721,Mulloidichthys martinicus_stiller@380523,Mulloidichthys vanicolensis_longo@282366'
=> [ $max, 'Mulloidichthys flavolineatus_santa@382170,Mulloidichthys flavolineatus_stiller@374330,Mulloidichthys pfluegeri_arbor@366817,Mulloidichthys vanicolensis_stiller@385444' ],
'Mulloidichthys dentatus_longo@321198,Mulloidichthys dentatus_nash@368645'
=> [ $max, 'Mulloidichthys ayliffe_nash@215468,Mulloidichthys flavolineatus_santa@382170,Mulloidichthys flavolineatus_stiller@374330,Mulloidichthys martinicus_longo@312721,Mulloidichthys martinicus_stiller@380523,Mulloidichthys pfluegeri_arbor@366817,Mulloidichthys vanicolensis_longo@282366,Mulloidichthys vanicolensis_stiller@385444' ],
'Mulloidichthys dentatus_longo@321198,Mulloidichthys dentatus_nash@368645,Mulloidichthys martinicus_longo@312721,Mulloidichthys martinicus_stiller@380523,Mulloidichthys vanicolensis_longo@282366'
=> [ $max, 'Mulloidichthys ayliffe_nash@215468,Mulloidichthys flavolineatus_santa@382170,Mulloidichthys flavolineatus_stiller@374330,Mulloidichthys pfluegeri_arbor@366817,Mulloidichthys vanicolensis_stiller@385444' ],
'Mulloidichthys flavolineatus_santa@382170,Mulloidichthys flavolineatus_stiller@374330'
=> [ $max, 'Mulloidichthys ayliffe_nash@215468,Mulloidichthys dentatus_longo@321198,Mulloidichthys dentatus_nash@368645,Mulloidichthys martinicus_longo@312721,Mulloidichthys martinicus_stiller@380523,Mulloidichthys pfluegeri_arbor@366817,Mulloidichthys vanicolensis_longo@282366,Mulloidichthys vanicolensis_stiller@385444' ],
'Mulloidichthys flavolineatus_santa@382170,Mulloidichthys flavolineatus_stiller@374330,Mulloidichthys vanicolensis_stiller@385444'
=> [ $max, 'Mulloidichthys ayliffe_nash@215468,Mulloidichthys dentatus_longo@321198,Mulloidichthys dentatus_nash@368645,Mulloidichthys martinicus_longo@312721,Mulloidichthys martinicus_stiller@380523,Mulloidichthys pfluegeri_arbor@366817,Mulloidichthys vanicolensis_longo@282366' ],
'Mulloidichthys martinicus_longo@312721,Mulloidichthys martinicus_stiller@380523,Mulloidichthys vanicolensis_longo@282366'
=> [ $max, 'Mulloidichthys ayliffe_nash@215468,Mulloidichthys dentatus_longo@321198,Mulloidichthys dentatus_nash@368645,Mulloidichthys flavolineatus_santa@382170,Mulloidichthys flavolineatus_stiller@374330,Mulloidichthys pfluegeri_arbor@366817,Mulloidichthys vanicolensis_stiller@385444' ],
'Mulloidichthys martinicus_longo@312721,Mulloidichthys vanicolensis_longo@282366'
=> [ ($tpl ? 1 : 89), 'Mulloidichthys ayliffe_nash@215468,Mulloidichthys dentatus_longo@321198,Mulloidichthys dentatus_nash@368645,Mulloidichthys flavolineatus_santa@382170,Mulloidichthys flavolineatus_stiller@374330,Mulloidichthys martinicus_stiller@380523,Mulloidichthys pfluegeri_arbor@366817,Mulloidichthys vanicolensis_stiller@385444' ],
);
my %got_bp_val_for = map {
( join ',', sort map { $_->full_id } @{ $splits->key2ids($_) } )
=> [ $splits->clan_support($_), join ',', sort map { $_->full_id }
@{ $splits->key2ids( $splits->xor_clans($key, $_) ) } ]
} $splits->sub_clans($key);
is_deeply \%got_bp_val_for, \%exp_bp_val_for,
"got expected sub-clans, xor-clans and BP support values for $genus";
}
done_testing;