42 #define AWAR_TREE_SAV "ad_tree/"
43 #define AWAR_TREE_TMP "tmp/ad_tree/"
45 #define AWAR_TREE_SECURITY AWAR_TREE_TMP "tree_security"
46 #define AWAR_TREE_REM AWAR_TREE_TMP "tree_rem"
47 #define AWAR_TREE_IMPORT AWAR_TREE_TMP "import_tree"
49 #define AWAR_GROUPXFER_SAV AWAR_TREE_SAV "groupxfer/"
51 #define AWAR_GROUPXFER_SOURCE AWAR_GROUPXFER_SAV "restrict"
52 #define AWAR_GROUPXFER_OVERWRITE_MODE AWAR_GROUPXFER_SAV "overwrite"
53 #define AWAR_GROUPXFER_INGROUP_ABS AWAR_GROUPXFER_SAV "ingroup/abs"
54 #define AWAR_GROUPXFER_INGROUP_REL AWAR_GROUPXFER_SAV "ingroup/rel"
55 #define AWAR_GROUPXFER_INGROUP_LIM AWAR_GROUPXFER_SAV "ingroup/lim"
56 #define AWAR_GROUPXFER_OUTGROUP_ABS AWAR_GROUPXFER_SAV "outgroup/abs"
57 #define AWAR_GROUPXFER_OUTGROUP_REL AWAR_GROUPXFER_SAV "outgroup/rel"
58 #define AWAR_GROUPXFER_OUTGROUP_LIM AWAR_GROUPXFER_SAV "outgroup/lim"
59 #define AWAR_GROUPXFER_UNKNOWN_ABS AWAR_GROUPXFER_SAV "unknown"
60 #define AWAR_GROUPXFER_KEELING AWAR_GROUPXFER_SAV "keeling"
61 #define AWAR_GROUPXFER_ACI AWAR_GROUPXFER_SAV "aci"
63 #define AWAR_TREE_EXPORT_FILEBASE AWAR_TREE_TMP "export_tree"
64 #define AWAR_TREE_EXPORT_FILTER AWAR_TREE_EXPORT_FILEBASE "/filter"
65 #define AWAR_TREE_EXPORT_NAME AWAR_TREE_EXPORT_FILEBASE "/file_name"
67 #define AWAR_TREE_EXPORT_SAV AWAR_TREE_SAV "export_tree/"
69 #define AWAR_TREE_EXPORT_FORMAT AWAR_TREE_EXPORT_SAV "format"
70 #define AWAR_TREE_EXPORT_NDS AWAR_TREE_EXPORT_SAV "NDS"
71 #define AWAR_TREE_EXPORT_INCLUDE_BOOTSTRAPS AWAR_TREE_EXPORT_SAV "bootstraps"
72 #define AWAR_TREE_EXPORT_INCLUDE_BRANCHLENS AWAR_TREE_EXPORT_SAV "branchlens"
73 #define AWAR_TREE_EXPORT_INCLUDE_GROUPNAMES AWAR_TREE_EXPORT_SAV "groupnames"
74 #define AWAR_TREE_EXPORT_HIDE_FOLDED_GROUPS AWAR_TREE_EXPORT_SAV "hide_folded"
75 #define AWAR_TREE_EXPORT_QUOTEMODE AWAR_TREE_EXPORT_SAV "quote_mode"
76 #define AWAR_TREE_EXPORT_NON_ASCII AWAR_TREE_EXPORT_SAV "non_ASCII"
77 #define AWAR_TREE_EXPORT_REPLACE AWAR_TREE_EXPORT_SAV "replace"
80 #define AWAR_TREE_CONSENSE_TMP AWAR_TREE_TMP "consense/"
81 #define AWAR_TREE_CONSENSE_SAV AWAR_TREE_SAV "consense/"
83 #define AWAR_TREE_CONSENSE_TREE AWAR_TREE_CONSENSE_SAV "tree"
84 #define AWAR_TREE_CONSENSE_SELECTED AWAR_TREE_CONSENSE_TMP "selected"
129 char *treename_nopath = strrchr(treename,
'/');
131 if (treename_nopath) {
135 treename_nopath = treename;
138 char *fname =
GBS_string_eval(treename_nopath,
"*.tree=tree_*1:*.ntree=tree_*1:*.xml=tree_*1:.=:-=_: =_");
180 const char *filter_type =
NULp;
263 if (!tree_name || !strlen(tree_name)) {
264 error =
"Please select a tree first";
278 switch (exportType) {
327 AW_window_simple *aws =
new AW_window_simple;
328 aws->init(root,
"SAVETREE",
"TREE SAVE");
333 aws->create_button(
"CLOSE",
"CLOSE",
"C");
337 aws->create_button(
"HELP",
"HELP",
"H");
342 aws->label(
"Tree format");
347 aws->update_option_menu();
350 aws->label(
"Tree labels");
355 aws->update_option_menu();
358 aws->label(
"Label quoting (Newick only)");
365 aws->update_option_menu();
374 aws->label(
"Save edge support values/remarks:");
382 aws->update_option_menu();
385 aws->button_length(10);
387 aws->create_button(
"SAVE",
"SAVE",
"o");
399 char tempFile[] =
"newickXXXXXX";
400 int createTempFile = mkstemp(tempFile);
402 if (createTempFile) {
408 for (
char *tok = strtok(tmpFname,
"/"); tok;) {
410 tok = strtok(
NULp,
"/");
433 printf(
"Failed to create Temporary File to Parse xml file!\n");
449 if (strcmp(pcTreeFormat,
"xml") == 0) {
472 AW_window_simple *aws =
new AW_window_simple;
473 aws->init(root,
"LOAD_TREE",
"TREE LOAD");
478 aws->create_button(
"CLOSE",
"CLOSE",
"C");
482 aws->create_button(
"HELP",
"HELP",
"H");
486 aws->insert_default_option(
"Newick",
"t",
"tree");
487 aws->insert_option(
"XML",
"x",
"xml");
488 aws->update_option_menu();
491 aws->label(
"Tree name");
498 aws->create_button(
"LOAD",
"LOAD",
"o");
508 char *log_file =
NULp;
514 if (transferGroups) {
533 if (transferGroups) {
550 if (!canvas_showing_dest) {
552 "Press the right 'Display' button to view that tree", dst_tree));
601 static bool firstCall =
true;
622 AW_window_simple *aws =
new AW_window_simple;
623 aws->init(root, winId, winTitle);
624 aws->load_xfig(
"ad_one_tree.fig");
627 aws->auto_space(10, 3);
630 aws->create_button(
"CLOSE",
"Close",
"C");
634 aws->create_button(
"HELP",
"Help",
"H");
642 aws->callback(makeWindowCallback(
copy_tree_awar_cb, awar_displayed_tree, awar_other_tree)); aws->create_autosize_button(
"SELECT_DISPLAYED",
"Use");
643 aws->callback(makeWindowCallback(
copy_tree_awar_cb, awar_other_tree, awar_displayed_tree)); aws->create_autosize_button(
"DISPLAY_SELECTED",
"Display");
651 AW_window_simple *aws =
new AW_window_simple;
652 aws->init(root,
"CMP_TOPOLOGY",
"Compare tree topologies");
657 aws->create_button(
"CLOSE",
"Close",
"C");
661 aws->create_button(
"HELP",
"Help",
"H");
667 aws->create_autosize_button(
"CMP_TOPOLOGY",
"Compare topologies");
693 {
"*only_perfect_groups",
"Only copy perfectly matching groups with\n * 100% ingroup ratio and\n * 0% outgroup ratio",
"ingroup_lim='100';outgroup_lim='0'" },
695 {
"*maximize_ingroup_ratio",
"Maximize ingroup ratio \n over outgroup ratio.\n(Note: diff of factor 10 is maybe too strong)",
"ingroup_abs='0';ingroup_rel='100';outgroup_abs='0';outgroup_rel='10'" },
696 {
"*minimize_outgroup_ratio",
"Minimize outgroup ratio \n over ingroup ratio.\n(Note: diff of factor 10 is maybe too strong)",
"ingroup_abs='0';ingroup_rel='10';outgroup_abs='0';outgroup_rel='100'" },
698 {
"*report2name",
"custom target group name:\n * add prefix \"XFRD_\" (allows to distinguish newly transferred from existing groups)\n * add suffix reporting penalty",
"aci='\"XFRD_\";groupname;\" {penalty = \";penalty;\"}\"'" },
706 AW_window_simple *aws =
new AW_window_simple;
707 aws->init(root,
"COPY_NODE_INFO_OF_TREE",
"Move groups");
710 aws->button_length(11);
714 aws->create_button(
"CLOSE",
"Close",
"C");
718 aws->create_button(
"HELP",
"Help",
"H");
720 const int FLOAT_COLUMNS = 10;
721 const int PERCENT_COLUMNS = 5;
738 aws->update_option_menu();
743 aws->insert_option(
"keep \"newname [was: oldname]\"",
"k",
KEEP_OLD_NAMES);
744 aws->update_option_menu();
753 aws->create_button(
"GO",
"GO",
"G");
771 if (!gb_moved_tree) {
772 error =
"No tree selected";
782 if (gb_target_tree)
break;
792 if (gb_target_tree)
break;
800 if (gb_target_tree && gb_target_tree != gb_moved_tree) {
801 error =
GBT_move_tree(gb_moved_tree, move_mode, gb_target_tree);
810 static AW_window_simple *aws =
NULp;
815 aws =
new AW_window_simple;
816 aws->init(aw_root,
"TREE_ADMIN",
"TREE ADMIN");
817 aws->load_xfig(
"ad_tree.fig");
821 aws->create_button(
"CLOSE",
"CLOSE",
"C");
825 aws->create_button(
"HELP",
"HELP",
"H");
827 aws->button_length(40);
834 aws->insert_option(
"0",
"0", 0);
835 aws->insert_option(
"1",
"1", 1);
836 aws->insert_option(
"2",
"2", 2);
837 aws->insert_option(
"3",
"3", 3);
838 aws->insert_option(
"4",
"4", 4);
839 aws->insert_option(
"5",
"5", 5);
840 aws->insert_default_option(
"6",
"6", 6);
841 aws->update_option_menu();
847 aws->button_length(20);
852 aws->help_text(
"treeadm.hlp");
854 aws->create_button(
"DELETE",
"Delete",
"D");
857 aws->help_text(
"treeadm.hlp");
859 aws->create_button(
"RENAME",
"Rename",
"R");
862 aws->help_text(
"treeadm.hlp");
864 aws->create_button(
"COPY",
"Copy",
"C");
867 aws->help_text(
"tr_export.hlp");
869 aws->create_button(
"EXPORT",
"Export",
"E");
872 aws->help_text(
"tr_import.hlp");
874 aws->create_button(
"IMPORT",
"Import",
"I");
876 aws->button_length(0);
897 if (!cons_tree_name || !cons_tree_name[0]) {
898 error =
"No name specified for the consensus tree";
904 if (tree_names.size()<2) {
905 error =
"Not enough trees selected (at least 2 needed)";
915 progress.
subtitle(
"loading input trees");
916 for (
size_t t = 0; t<tree_names.size() && !
error; ++t) {
923 tree_builder.
add(tree, tree_names[t], 1.0);
928 size_t species_count;
929 TreeNode *cons_tree = tree_builder.
get(species_count, error);
931 if (!error && progress.
aborted()) {
932 error =
"user abort";
935 nt_assert(contradicted(cons_tree, error));
944 if (error) progress.
done();
946 error = ta.
close(error);
963 static AW_window_simple *aws =
NULp;
965 aws =
new AW_window_simple;
966 aws->init(aw_root,
"CONSENSE_TREE",
"Consensus Tree");
967 aws->load_xfig(
"ad_cons_tree.fig");
969 aws->auto_space(10, 10);
973 aws->create_button(
"CLOSE",
"CLOSE",
"C");
977 aws->create_button(
"HELP",
"HELP",
"H");
986 aws->button_length(0);
988 aws->create_button(
"USE_AS_TARGET",
"#moveLeft.xpm");
992 aws->create_autosize_button(
"BUILD",
"Build consensus tree",
"B");
1013 : source(c1.source, c2.source),
1014 target(c1.target, c2.target)
1022 return target.
compare(right.target);
1024 return source.
compare(right.source);
1033 static const char *smallest_leafname;
1036 smallest_leafname = node->
name;
1042 const char *smallest_left = smallest_leafname;
1043 CombinedPosInfo rightInfo = reorder_subtree_rec(node->get_rightson());
1044 const char *smallest_right = smallest_leafname;
1046 bool left_leafname_bigger = strcmp(smallest_left, smallest_right)>0;
1047 smallest_leafname = left_leafname_bigger ? smallest_right : smallest_left;
1051 if (cmp>0 || (cmp == 0 && left_leafname_bigger)) {
1065 #if defined(UNIT_TESTS)
1072 reorder_subtree_rec(tree);
1105 aws->create_autosize_button(
"RESORT",
"Sort according to source tree");
1113 #define AWAR_MFURC "tree/multifurc/"
1114 #define AWAR_MFURC_CONSIDER_BOOTSTRAP AWAR_MFURC "use_bs"
1115 #define AWAR_MFURC_CONSIDER_LENGTH AWAR_MFURC "use_len"
1116 #define AWAR_MFURC_CONSIDER_TERMINALS AWAR_MFURC "terminals"
1117 #define AWAR_MFURC_LENGTH_LIMIT AWAR_MFURC "len"
1118 #define AWAR_MFURC_BOOTSTRAP_LIMIT AWAR_MFURC "bs"
1130 float below_bootstrap = 101.0;
1131 float below_length = 1000000.0;
1140 AW_window_simple *aws =
new AW_window_simple;
1144 aws->auto_space(10, 10);
1147 aws->create_button(
"CLOSE",
"CLOSE",
"C");
1150 aws->create_button(
"HELP",
"HELP",
"H");
1152 const int LABEL_LENGTH = 46;
1153 aws->label_length(LABEL_LENGTH);
1156 aws->label(
"Multifurcate branches with branchlength below");
1161 aws->label(
" AND bootstrap below");
1165 aws->label_length(0);
1167 aws->label(
"Also apply to terminal branches");
1172 aws->create_autosize_button(
"MULTIFURCATE",
"Multifurcate",
"M");
1184 static const char *getTreeComment(
GBDATA *
gb_main,
const char *treeName) {
1189 #define TEST_EXPECT_TREE_COMMENT_CONTAINS(treeName,expected) TEST_EXPECT_CONTAINS(getTreeComment(gb_main,treeName),expected)
1190 #define TEST_EXPECT_TREE_COMMENT_DOESNT_CONTAIN(treeName,expected) TEST_EXPECT_DOESNT_CONTAIN(getTreeComment(gb_main,treeName),expected)
1191 #define TEST_EXPECT_TREE_COMMENT_DOESNT_CONTAIN__BROKEN(treeName,expected) TEST_EXPECT_DOESNT_CONTAIN__BROKEN(getTreeComment(gb_main,treeName),expected)
1199 Tree->compute_tree();
1207 void TEST_sort_tree_by_other_tree() {
1212 const char *topo_test =
"(((((((CloTyro3:1.046,CloTyro4:.061):.026,CloTyro2:.017):.017,CloTyrob:.009):.274,CloInnoc:.371):.057,CloBifer:.388):.124,(((CloButy2:.009,CloButyr:0):.564,CloCarni:.12):.01,CloPaste:.179):.131):.081,((((CorAquat:.084,CurCitre:.058):.103,CorGluta:.522):.053,CelBiazo:.059):.207,CytAquat:.711):.081);";
1213 const char *topo_center =
"(((CloPaste:.179,((CloButy2:.009,CloButyr:0):.564,CloCarni:.12):.01):.131,((CloInnoc:.371,((CloTyro2:.017,(CloTyro3:1.046,CloTyro4:.061):.026):.017,CloTyrob:.009):.274):.057,CloBifer:.388):.124):.081,((CelBiazo:.059,((CorAquat:.084,CurCitre:.058):.103,CorGluta:.522):.053):.207,CytAquat:.711):.081);";
1214 const char *topo_bottom =
"((CytAquat:.711,(CelBiazo:.059,(CorGluta:.522,(CorAquat:.084,CurCitre:.058):.103):.053):.207):.081,((CloPaste:.179,(CloCarni:.12,(CloButy2:.009,CloButyr:0):.564):.01):.131,(CloBifer:.388,(CloInnoc:.371,(CloTyrob:.009,(CloTyro2:.017,(CloTyro3:1.046,CloTyro4:.061):.026):.017):.274):.057):.124):.081);";
1216 const char *topo_vs_nj_bs =
"(((((((CloTyro3:1.046,CloTyro4:.061):.026,CloTyro2:.017):.017,CloTyrob:.009):.274,CloInnoc:.371):.057,CloBifer:.388):.124,(((CloButyr:0,CloButy2:.009):.564,CloCarni:.12):.01,CloPaste:.179):.131):.081,(((CorGluta:.522,(CorAquat:.084,CurCitre:.058):.103):.053,CelBiazo:.059):.207,CytAquat:.711):.081);";
1235 const double EPSILON = 0.0001;
1244 TEST_REJECT(sbt.sourcePos(
"Un-Known").is_known());
1263 void TEST_load_trees() {
1271 const char *TREE_NAME;
1273 TREE_NAME =
"tree_loaded";
1275 TEST_EXPECT_ERROR_CLEAR();
1277 TEST_EXPECT_TREE_COMMENT_CONTAINS(TREE_NAME,
"covering most of tree reader code");
1279 TREE_NAME =
"tree_acc_loaded";
1281 TEST_EXPECT_ERROR_CLEAR();
1283 "(((((((CloTyro3:1.046,CloTyro4:.061):.026,CloTyro2:.017):.017,CloTyrob:.009)'test':.274,CloInnoc:.371):.057,CloBifer:.388):.124,"
1284 "(((CloButy2:.009,CloButyr:0):.564,CloCarni:.12):.01,CloPaste:.179):.131):.081,"
1285 "((((CorAquat:.084,CurCitre:.058):.103,CorGluta:.522):.054,CelBiazo:.059):.207,CytAquat:.711):.081);");
1287 TREE_NAME =
"tree_fullname_loaded";
1289 "Encountered duplicated label 'CLOSTRIDIUM TYROBUTYRICUM' in tree");
1290 TEST_EXPECT_ERROR_CLEAR();
1293 "label 'CLOSTRIDIUM TYROBUTYRICUM' is ambiguous (generated for multiple species: CloTyrob,CloTyro2,CloTyro3,CloTyro4)");
1294 TEST_EXPECT_ERROR_CLEAR();
1299 TREE_NAME =
"tree_fullname_unique_loaded";
1301 TEST_EXPECT_ERROR_CLEAR();
1303 "(((CloCarni:.125,CloPaste:.249):.074,(CloBifer:.16,CloInnoc:.58):.149):0,"
1304 "(CytAquat:.33,((CorAquat:.08,CurCitre:.018):.071,(CelBiazo:.001,CorGluta:.326):.127):.061):.073);");
1307 TREE_NAME =
"tree_fullname_unique_loaded";
1309 TEST_EXPECT_ERROR_CLEAR();
1311 "(((CloCarni:.15,CloPaste:.227):.081,(CloBifer:.261,(CloInnoc:.476,CloTyro2:.279):.001):.137):0,"
1312 "(CytAquat:.369,((CorAquat:.048,(CelBiazo:.001,CorGluta:.327):.166):.046,CurCitre:.003):.054):.094);");
1316 #define TRANSLATION_FAILURE_CONTAINS(aci, errorpart) TEST_EXPECT_ERROR_CONTAINS(TREE_load_to_db(gb_main, "trees/acc.tree", "tree_anyname", ACI_LabelTranslator(aci)), errorpart);
1319 TRANSLATION_FAILURE_CONTAINS(
"kajshdui",
"Unknown command 'kajshdui'");
1321 TRANSLATION_FAILURE_CONTAINS(
"readdb(noSuchField)",
"empty identifier generated (for species 'CelBiazo')");
1331 void TEST_move_node_info() {
1335 const char *treeTarget1 =
"tree_removal";
1336 const char *treeTarget2 =
"tree_test";
1337 const char *treeSortby1 =
"tree_removal_copy";
1338 const char *treeSortby2 =
"tree_test_copy";
1340 const char *treeSource1 = treeSortby2;
1341 const char *treeSource2 =
"tree_tree2";
1342 const char *treeSource3 =
"tree_groups";
1344 #define GROUP_TEST "(CloTyrob,(CloTyro2,(CloTyro3,CloTyro4)))"
1345 #define GROUP_TEST_FLIPPED "(((CloTyro3,CloTyro4),CloTyro2),CloTyrob)"
1347 #define NAMED_GROUP_TEST GROUP_TEST "'test'"
1348 #define OVERWRITTEN_GROUP_TEST GROUP_TEST "'g2 [was test]'"
1350 const char *org_topo1 =
"((CloInnoc," GROUP_TEST
"),(CloBifer,((CloCarni,CurCitre),((CloPaste,(Zombie1,(CloButy2,CloButyr))),(CytAquat,(CelBiazo,(CorGluta,(CorAquat,Zombie2))))))));";
1351 const char *org_topo2 =
"((((" GROUP_TEST_FLIPPED
",CloInnoc),CloBifer),(((CloButy2,CloButyr),CloCarni),CloPaste)),((((CorAquat,CurCitre),CorGluta),CelBiazo),CytAquat));";
1354 const char *unwanted_topo11 =
"((CytAquat,(CelBiazo,(CorGluta,(CorAquat,Zombie2)))),((CloPaste,(Zombie1,(CloButy2,CloButyr))),((CloCarni,CurCitre),(CloBifer,(CloInnoc," NAMED_GROUP_TEST
")))));";
1355 const char *unwanted_topo21 =
"((CloButy2,CloButyr),(Zombie1,(CloPaste,((((CloInnoc," OVERWRITTEN_GROUP_TEST
"),CloBifer),(CloCarni,CurCitre)),(CytAquat,(CelBiazo,(CorGluta,(CorAquat,Zombie2)))))))'outer');";
1357 const char *sorted_topo11 =
"(((((CloInnoc," NAMED_GROUP_TEST
"),CloBifer),(CloCarni,CurCitre)),(CloPaste,(Zombie1,(CloButy2,CloButyr)))),(CytAquat,(CelBiazo,(CorGluta,(CorAquat,Zombie2)))));";
1358 const char *sorted_topo21 =
"(((((((CloInnoc," OVERWRITTEN_GROUP_TEST
"),CloBifer),(CloCarni,CurCitre)),(CytAquat,(CelBiazo,(CorGluta,(CorAquat,Zombie2))))),CloPaste),Zombie1)'outer',(CloButy2,CloButyr));";
1359 const char *topo32 =
"((CloButy2,CloButyr)'upper',(((((" GROUP_TEST_FLIPPED
"'low2',CloInnoc),CloBifer),((((CorAquat,CurCitre),CorGluta),CelBiazo),CytAquat)'low1'),CloPaste),CloCarni));";
1360 const char *topo32_rc =
"((CloButy2,CloButyr)'upper',(((((" GROUP_TEST_FLIPPED
"'low2',CloInnoc),CloBifer),((((CorAquat,CurCitre),CorGluta),CelBiazo),CytAquat)'low1'),CloPaste),CloCarni)'lower');";
1361 const char *topo32_rel =
"((CloButy2,CloButyr)" ",(((((" GROUP_TEST_FLIPPED
"'low2 [p=0.250000;ir=100.0%;3->4]',CloInnoc),CloBifer)'low1 [p=0.232222;ir=100.0%;7->6]',((((CorAquat,CurCitre),CorGluta),CelBiazo),CytAquat)'upper [p=0.510000;ir=100.0%;5->5]'),CloPaste),CloCarni)'lower [p=0.230769;ir=100.0%;10->13]');";
1362 const char *topo32_li =
"((CloButy2,CloButyr)" ",(((((" GROUP_TEST_FLIPPED
"'low2',CloInnoc),CloBifer),((((CorAquat,CurCitre),CorGluta),CelBiazo),CytAquat)'low1'),CloPaste),CloCarni)'lower');";
1364 const char *compared_topo =
"(((((((CloInnoc,(CloTyrob,(CloTyro2,(CloTyro3,CloTyro4)))),CloBifer),(CloCarni,CurCitre)'# 2:')'# 2:',(CytAquat,(CelBiazo,(CorGluta,(CorAquat,Zombie2)'# 1:')'# 1:')'# 1:')'# 1:')'# 1:',CloPaste),Zombie1),(CloButy2,CloButyr));";
1366 const char *
LOG =
"move_node_info.log";
1369 #if defined(TEST_AUTO_UPDATE)
1370 # define TEST_LOGS_EXPECTED(expected) TEST_COPY_FILE(LOG, expected)
1372 # define TEST_LOGS_EXPECTED(expected) TEST_EXPECT_TEXTFILES_EQUAL(expected, LOG)
1373 #endif // TEST_AUTO_UPDATE
1381 const char *resetComment =
"<comment reset>";
1397 const char *comment_added =
"Copied node info from tree_test_copy";
1398 TEST_EXPECT_TREE_COMMENT_DOESNT_CONTAIN(treeTarget1, comment_added);
1401 TEST_LOGS_EXPECTED(
"group_xfer_11.log.expected");
1405 TEST_EXPECT_TREE_COMMENT_CONTAINS(treeTarget1, comment_added);
1414 const char *comment_added =
"Copied node info from tree_groups";
1415 TEST_EXPECT_TREE_COMMENT_DOESNT_CONTAIN(treeTarget2, comment_added);
1418 TEST_LOGS_EXPECTED(
"group_xfer_32.log.expected");
1421 TEST_EXPECT_TREE_COMMENT_CONTAINS(treeTarget2, comment_added);
1426 TEST_LOGS_EXPECTED(
"group_xfer_32_rc.log.expected");
1435 "groupname;\" [p=\";penalty;\";ir=\";ingroup;\";\";oldsize;\"->\";newsize;\"]\""));
1436 TEST_LOGS_EXPECTED(
"group_xfer_32_rel.log.expected");
1456 TEST_LOGS_EXPECTED(
"group_xfer_32_li.log.expected");
1463 const char *comment_added =
"Added node info from tree_tree2";
1464 TEST_EXPECT_TREE_COMMENT_DOESNT_CONTAIN(treeTarget1, comment_added);
1467 TEST_LOGS_EXPECTED(
"group_xfer_21.log.expected");
1471 TEST_EXPECT_TREE_COMMENT_CONTAINS(treeTarget1, comment_added);
1483 const char *comment_added =
"Compared topology with tree_test";
1484 TEST_EXPECT_TREE_COMMENT_DOESNT_CONTAIN(treeTarget1, comment_added);
1488 TEST_EXPECT_TREE_COMMENT_CONTAINS(treeTarget1, comment_added);
1493 #define DOESNT_MATTER_ARGS gb_main,treeSource2,treeTarget1,LOG,REMOVE_EXISTING_GROUPS,XFER_ALL_GROUPS
1510 #undef DOESNT_MATTER_ARGS
1569 TEST_EXPECT(brotherUp.counter_next().dest() == grandpa);
1584 TEST_EXPECT(toLeaf.counter_next().dest() == node);
1588 TEST_EXPECT(fromLeaf.counter_previous().dest() == left);
1602 for (
int i = 0; i<EDGES; ++i) {
1608 TEST_EXPECT(e[i].counter_next().counter_previous() == e[i]);
1609 TEST_EXPECT(e[i].counter_previous().counter_next() == e[i]);
1613 TEST_EXPECT(e[i].counter_next().inverse().next() == inv);
1614 TEST_EXPECT(e[i].counter_previous().inverse().previous() == inv);
1615 TEST_EXPECT(e[i].next().inverse().counter_next() == inv);
1616 TEST_EXPECT(e[i].previous().inverse().counter_previous() == inv);
1621 const double EPSILON = 0.000001;
1623 const double NLEN = 0.025806;
1624 const double BLEN = 0.017316;
1625 const double PLEN = 0.017167;
1626 const double LLEN = 1.045690;
1627 const double RLEN = 0.060606;
1644 const double MOD_NLEN = 0.123456;
1645 const double MOD_LLEN = 0.246802;
1647 toLeaf.set_length(MOD_LLEN);
1661 void TEST_remove_bootstraps() {
1671 const char *topo_org =
"(((((((CloTyro3,CloTyro4)'40%',CloTyro2)'0%',CloTyrob)'97%',CloInnoc)'0%',CloBifer)'53%',(((CloButy2,CloButyr),CloCarni)'33%',CloPaste)'97%'),((((CorAquat,CurCitre),CorGluta)'17%',CelBiazo)'40%',CytAquat));";
1672 const char *topo_rem =
"(((((((CloTyro3,CloTyro4)" ",CloTyro2)" ",CloTyrob)" ",CloInnoc)" ",CloBifer)" ",(((CloButy2,CloButyr),CloCarni)" ",CloPaste)" "),((((CorAquat,CurCitre),CorGluta)" ",CelBiazo)" ",CytAquat));";
1685 void TEST_multifurcate_tree() {
1690 const char *topo_test =
"(((((((CloTyro3:1.046,CloTyro4:.061)'40%':.026,CloTyro2:.017)'0%':.017,CloTyrob:.009)'97%:test':.274,CloInnoc:.371)'0%':.057,CloBifer:.388)'53%':.124,(((CloButy2:.009,CloButyr:0):.564" ",CloCarni:.12)'33%':.01" ",CloPaste:.179)'97%':.131):.081,((((CorAquat:.084,CurCitre:.058):.103,CorGluta:.522)'17%':.053,CelBiazo:.059)'40%':.207" ",CytAquat:.711):.081);";
1692 const char *topo_single =
"(((((((CloTyro3:1.046,CloTyro4:.061)'40%':.026,CloTyro2:.017)'0%':.017,CloTyrob:.009)'97%:test':.581,CloInnoc:0" ")'0%':.121,CloBifer:.388)'53%':.124,(((CloButy2:.009,CloButyr:0):.564" ",CloCarni:.12)'33%':.01" ",CloPaste:.179)'97%':.131):.081,((((CorAquat:.084,CurCitre:.058):.103,CorGluta:.522)'17%':.053,CelBiazo:.059)'40%':.207" ",CytAquat:.711):.081);";
1693 const char *topo_bs_less_101_005 =
"(((((((CloTyro3:1.098,CloTyro4:.064)" ":0" ",CloTyro2:0" ")" ":0" ",CloTyrob:0" ")'97%:test':.287,CloInnoc:.371)'0%':.057,CloBifer:.388)'53%':.124,(((CloButy2:0" ",CloButyr:0):.578" ",CloCarni:.121)" ":0" ",CloPaste:.181)'97%':.132):.081,((((CorAquat:.084,CurCitre:.058):.103,CorGluta:.522)'17%':.053,CelBiazo:.059)'40%':.207" ",CytAquat:.711):.081);";
1694 const char *topo_bs_less_101_005_NT =
"(((((((CloTyro3:1.078,CloTyro4:.062)" ":0" ",CloTyro2:.018)" ":0" ",CloTyrob:.009)'97%:test':.282,CloInnoc:.371)'0%':.057,CloBifer:.388)'53%':.124,(((CloButy2:.009,CloButyr:0):.57" ",CloCarni:.121)" ":0" ",CloPaste:.181)'97%':.132):.081,((((CorAquat:.084,CurCitre:.058):.103,CorGluta:.522)'17%':.053,CelBiazo:.059)'40%':.207" ",CytAquat:.711):.081);";
1695 const char *topo_bs_less_30_005 =
"(((((((CloTyro3:1.046,CloTyro4:.061)'40%':.027,CloTyro2:.018)" ":0" ",CloTyrob:.009)'97%:test':.288,CloInnoc:.371)'0%':.057,CloBifer:.388)'53%':.124,(((CloButy2:.009,CloButyr:0):.564" ",CloCarni:.12)'33%':.01" ",CloPaste:.179)'97%':.131):.081,((((CorAquat:.084,CurCitre:.058):.103,CorGluta:.522)'17%':.053,CelBiazo:.059)'40%':.207" ",CytAquat:.711):.081);";
1696 const char *topo_bs_less_30 =
"(((((((CloTyro3:1.046,CloTyro4:.061)'40%':.027,CloTyro2:.018)" ":0" ",CloTyrob:.009)'97%:test':.302,CloInnoc:.39)" ":0" ",CloBifer:.407)'53%':.131,(((CloButy2:.009,CloButyr:0):.564" ",CloCarni:.12)'33%':.01" ",CloPaste:.179)'97%':.131):.081,((((CorAquat:.084,CurCitre:.058):.109,CorGluta:.554)" ":0" ",CelBiazo:.062)'40%':.22" ",CytAquat:.711):.081);";
1697 const char *topo_all =
"(((((((CloTyro3:0" ",CloTyro4:0" ")" ":0" ",CloTyro2:0" ")" ":0" ",CloTyrob:0" ")'" "test':0" ",CloInnoc:0" ")" ":0" ",CloBifer:0" ")" ":0" ",(((CloButy2:0" ",CloButyr:0):0" ",CloCarni:0)" ":0" ",CloPaste:0)" ":0)" ":0" ",((((CorAquat:0" ",CurCitre:0" "):0" ",CorGluta:0)" ":0" ",CelBiazo:0)" ":0" ",CytAquat:0" "):0" ");";
1699 const double STABLE_LENGTH = 5.362750;
1700 const double EPSILON = 0.000001;
1702 for (
int test = 1; test<=6; ++test) {
1759 void TEST_TreeNode_attributes() {
1834 #endif // UNIT_TESTS
GBDATA * GBT_find_bottom_tree(GBDATA *gb_main)
NOT4PERL GB_ERROR GBT_move_tree(GBDATA *gb_moved_tree, GBT_ORDER_MODE mode, GBDATA *gb_target_tree)
GB_ERROR NT_with_displayed_tree_do(TREE_canvas *ntw, bool(*displayed_tree_cb)(TreeNode *tree, GB_ERROR &error))
#define AWAR_TREE_EXPORT_NDS
GBDATA * GB_open(const char *path, const char *opent)
void GB_remove_on_exit(const char *filename)
AW_awar * set_srt(const char *srt)
#define AWAR_TREE_EXPORT_REPLACE
GB_ERROR TREE_write_XML(GBDATA *gb_main, const char *db_name, const char *tree_name, const TreeLabeler &labeler, bool skip_folded, const char *path)
#define TEST_EXPECT_SIMILAR(expr, want, epsilon)
GB_ERROR GBT_write_tree_with_remark(GBDATA *gb_main, const char *tree_name, TreeNode *tree, const char *remark)
#define AWAR_TREE_EXPORT_FILTER
AW_window * NT_create_moveGroupInfo_window(AW_root *root)
TreeNode * findLeafNamed(const char *wantedName)
static void tree_vars_callback(AW_root *aw_root)
void AWT_insert_config_manager(AW_window *aww, AW_default default_file_, const char *id, const StoreConfigCallback &store_cb, const RestoreConfigCallback &load_or_reset_cb, const char *macro_id, const AWT_predefined_config *predef)
#define AWAR_TREE_EXPORT_NAME
void load_xfig(const char *file, bool resize=true)
static void multifurcation_cb(UNFIXED, TREE_canvas *ntw)
static char * readXmlTree(char *fname)
void AW_edit(const char *path)
#define AWAR_GROUPXFER_ACI
void GB_unlink_or_warn(const char *path, GB_ERROR *error)
void reorder_subtree(TreeNode *tree)
GBDATA * GBT_tree_behind(GBDATA *gb_tree)
#define AWAR_GROUPXFER_OUTGROUP_LIM
char * get_tree_remark() const
void AW_create_standard_fileselection(AW_window *aws, const char *awar_prefix)
void AWT_registerTreeAwarSimple(AW_awar *awar)
ARB_edge_type get_type() const
char * ARB_strdup(const char *str)
#define AWAR_GROUPXFER_SOURCE
static void swap_source_dest_cb(AW_window *aww)
TreeNode * GBT_read_tree(GBDATA *gb_main, const char *tree_name, TreeRoot *troot)
AW_window * NT_create_multifurcate_tree_window(AW_root *aw_root, TREE_canvas *ntw)
#define AWAR_MFURC_CONSIDER_LENGTH
#define AWAR_TREE_CONSENSE_TREE
NOT4PERL long * GBT_readOrCreate_int(GBDATA *gb_container, const char *fieldpath, long default_value)
const char * GBS_global_string(const char *templat,...)
#define SRT_AUTOCORRECT_TREENAME
#define AWAR_MFURC_CONSIDER_TERMINALS
char * GBS_string_eval(const char *insource, const char *icommand)
void AW_POPDOWN(AW_window *window)
static void update_default_treename_cb(AW_root *aw_root)
#define AWAR_GROUPXFER_INGROUP_LIM
ARB_edge previous() const
void cat(const char *from)
GBDATA * GBT_get_tree_data(GBDATA *gb_main)
int GB_unlink(const char *path)
void get_values(StrArray &intoArray)
ARB_edge rootEdge(TreeRoot *root)
#define ARRAY_ELEMS(array)
int compare(const CombinedPosInfo &right) const
#define AWAR_GROUPXFER_OUTGROUP_REL
static AWT_config_mapping_def moveGroupInfo_mapping[]
GB_CSTR GB_getenvARBHOME(void)
static void ad_tree_set_security(AW_root *aw_root)
AW_window * NT_create_sort_tree_by_other_tree_window(AW_root *aw_root, TREE_canvas *ntw)
GB_ERROR ARB_system(const char *cmd, XCmdType boundExectype)
#define DOWNCAST(totype, expr)
const char * suffixed_title(const char *primary_title) const
AW_awar * add_callback(const RootCallback &cb)
struct Unfixed_cb_parameter * UNFIXED
ARB_edge parentEdge(TreeNode *son)
void setPerErrorPenalties(double ingroup_pep, double outgroup_pep, double unfound_pep)
GB_ERROR GBT_write_tree_remark(GBDATA *gb_main, const char *tree_name, const char *remark)
#define TEST_EXPECT_SAVED_NEWICK__BROKEN(format, gb_main, treename, expected_newick)
const char * read_char_pntr() const
GB_ERROR GB_await_error()
static AW_root * SINGLETON
#define AWAR_TREE_EXPORT_FORMAT
WindowCallback makeHelpCallback(const char *helpfile)
#define TEST_EXPECT(cond)
char * GB_create_tempfile(const char *name)
static void tree_save_cb(AW_window *aww)
void popup_tree_admin_window(AW_window *awp)
bool in_other_branch_than(const TreeNode *other) const
#define TEST_EXPECT_NEWICK(format, tree, expected_newick)
AW_window * NT_create_consense_window(AW_root *aw_root)
const TreeNode * ancestor_common_with(const TreeNode *other) const
static void reorder_trees_cb(AW_window *aww, awt_reorder_mode dest)
int compare(const TreeRelativePosition &right) const
AW_awar * awar_float(const char *var_name, float default_value=0.0, AW_default default_file=AW_ROOT_DEFAULT)
AW_awar * dest_tree_awar(AW_root *root)
#define AWAR_GROUPXFER_INGROUP_REL
void create_awars(AW_root *root, AW_default aw_def, bool registerTreeAwar)
AW_window * NT_create_compareTopologies_window(AW_root *root)
const char * GBT_tree_info_string(GBDATA *gb_main, const char *tree_name, int maxTreeNameLen)
static void copy_tree_awar_cb(UNFIXED, AW_awar *aw_source, AW_awar *aw_dest)
int GB_read_security_write(GBDATA *gbd)
static void tree_load_cb(AW_window *aww)
static AWT_config_mapping_def tree_export_config_mapping[]
GBDATA * GBT_find_top_tree(GBDATA *gb_main)
void delete_tree_cb(AW_window *aww, const Spec *spec)
void setRelativePenalties(double ingroup_inv_relpen, double outgroup_relpen)
GB_ERROR GBT_write_tree(GBDATA *gb_main, const char *tree_name, TreeNode *tree)
GB_ERROR TREE_write_Newick(GBDATA *gb_main, const char *tree_name, const TreeLabeler &labeler, bool save_branchlengths, BootstrapSaveStyle bootstrap_style, bool save_groupnames, bool pretty, LabelQuoting quoteMode, const char *path)
void add(SizeAwareTree *&tree, const char *treename, double weight)
void setLimits(const RatioLimits &ingroupLimits, const RatioLimits &outgroupLimits)
#define TEST_REJECT(cond)
#define TEST_REJECT_NULL(n)
#define AWAR_TREE_EXPORT_INCLUDE_GROUPNAMES
static void error(const char *msg)
#define AWAR_TREE_EXPORT_QUOTEMODE
void AW_create_fileselection_awars(AW_root *awr, const char *awar_base, const char *directories, const char *filter, const char *file_name)
TreeNode * TREE_load(const char *path, TreeRoot *troot, char **commentPtr, bool allow_length_scaling, char **warningPtr)
static bool sort_dtree_by_other_tree_cb(TreeNode *tree, GB_ERROR &error)
GB_ERROR GBT_copy_tree(GBDATA *gb_main, const char *source_name, const char *dest_name)
void NT_create_twoTreeSelection(AW_window *aws)
static AWT_predefined_config moveGroupInfo_predef[]
bool in_same_branch_as(const TreeNode *other) const
AW_window * create_rename_window(AW_root *root, const Spec *spec, const char *specialized)
TREE_canvas * NT_get_canvas_showing_tree(const char *tree_name, bool forceDisplay)
ARB_edge counter_previous() const
static void update_filter_cb(AW_root *root)
#define AWAR_GROUPXFER_OUTGROUP_ABS
void multifurcate_whole_tree(const multifurc_limits &below)
#define AWAR_GROUPXFER_UNKNOWN_ABS
#define AWAR_MFURC_BOOTSTRAP_LIMIT
bool is_son_of(const TreeNode *Father) const
char * read_string() const
GB_ERROR GB_write_security_write(GBDATA *gbd, unsigned long level)
static void create_consense_tree_cb(AW_window *aww, AW_selection *selected_trees)
AW_awar * awar(const char *awar)
void awt_create_order_buttons(AW_window *aws, awt_orderfun reorder_cb, AW_CL cl_user)
SortByTopo(const TreeNode *by)
AW_selection * awt_create_subset_selection_list(AW_window *aww, AW_selection_list *parent_selection, const char *at_box, const char *at_add, const char *at_sort, bool autocorrect_subselection, SubsetChangedCb subChanged_cb, AW_CL cl_user)
AW_DB_selection * awt_create_TREE_selection_list(GBDATA *gb_main, AW_window *aws, const char *varname)
void AW_refresh_fileselection(AW_root *awr, const char *awar_prefix)
bool is_ancestor_of(const TreeNode *descendant) const
void create_autosize_button(const char *macro_name, AW_label label, const char *mnemonic=NULp, unsigned xtraSpace=1)
#define __ATTR__REDUCED_OPTIMIZE
#define AWAR_TREE_CONSENSE_SELECTED
#define AWAR_MFURC_CONSIDER_BOOTSTRAP
#define AWAR_GROUPXFER_INGROUP_ABS
void NT_create_multifurcate_tree_awars(AW_root *aw_root, AW_default props)
void create_trees_var(AW_root *aw_root, AW_default aw_def)
char * GB_unique_filename(const char *name_prefix, const char *suffix)
int GB_read_security_delete(GBDATA *gbd)
static void ad_move_tree_info(AW_window *aww, bool transferGroups)
AW_awar * awar_int(const char *var_name, long default_value=0, AW_default default_file=AW_ROOT_DEFAULT)
void auto_space(int xspace, int yspace)
GB_ERROR close(GB_ERROR error)
#define AWAR_GROUPXFER_KEELING
static AW_window * create_tree_export_window(AW_root *root)
bool is_inside(const TreeNode *subtree) const
GB_ERROR TREE_load_to_db(GBDATA *gb_main, const char *treefile, const char *tree_name, const LabelTranslator &translator)
AW_awar * source_tree_awar(AW_root *root)
#define AWAR_TREE_EXPORT_INCLUDE_BRANCHLENS
SizeAwareTree * get(size_t &different_species, GB_ERROR &error)
AW_window * create_copy_window(AW_root *root, const Spec *spec)
static AW_window_simple * create_oneTreeSelection(AW_root *root, const char *winId, const char *winTitle, const char *helpFile, AW_awar *awar_displayed_tree)
AW_awar * map(const char *awarn)
void subtitle(const char *stitle)
GB_ERROR GB_write_security_delete(GBDATA *gbd, unsigned long level)
GBT_LEN sum_child_lengths() const
#define TEST_EXPECT_NO_ERROR(call)
void aw_message(const char *msg)
ARB_edge counter_next() const
#define TEST_EXPECT_SAVED_NEWICK(format, gb_main, treename, expected_newick)
static GB_ERROR sort_tree_by_other_tree(GBDATA *gb_main, TreeNode *tree, const char *other_tree)
#define TEST_EXPECT_ERROR_CONTAINS(call, part)
CombinedPosInfo(const CombinedPosInfo &c1, const CombinedPosInfo &c2)
GB_ERROR write_string(const char *aw_string)
#define TEST_EXPECT_DIFFERENT(expr, want)
const char * get_data() const
GB_ERROR NTREE_move_tree_info(GBDATA *gb_main, const char *tree_source, const char *tree_dest, const char *log_file, GroupTransferMode mode, GroupsToTransfer what, const GroupMatchScorer &scorer, const char *aci)
#define AWAR_MFURC_LENGTH_LIMIT
const char * local_id(const char *id) const
GBT_LEN get_branchlength() const
#define AWAR_TREE_EXPORT_INCLUDE_BOOTSTRAPS
GBDATA * GBT_find_tree(GBDATA *gb_main, const char *tree_name)
GB_transaction ta(gb_var)
void callback(const WindowCallback &cb)
#define AWAR_TREE_EXPORT_HIDE_FOLDED_GROUPS
void destroy(TreeNode *that)
AW_awar * awar_string(const char *var_name, const char *default_value="", AW_default default_file=AW_ROOT_DEFAULT)
void set_length(GBT_LEN len)
GBDATA * GB_search(GBDATA *gbd, const char *fieldpath, GB_TYPES create)
#define AWAR_TREE_EXPORT_FILEBASE
void hide_or_notify(const char *error)
void NT_deselect_group(AW_root *awr)
#define AWAR_TREE_SECURITY
static void sort_tree_by_other_tree_cb(UNFIXED, TREE_canvas *ntw)
static void use_selected_as_target_cb(AW_window *aww)
#define AWAR_TREE_EXPORT_NON_ASCII
AW_awar * awar_pointer(const char *var_name, GBDATA *default_value=NULp, AW_default default_file=AW_ROOT_DEFAULT)
static AW_window * create_tree_import_window(AW_root *root)
AW_awar * get_awar_tree() const
CombinedPosInfo(const TreeRelativePosition &s, const TreeRelativePosition &t)
TreeRelativePosition relative(const char *name) const
GBDATA * GB_entry(GBDATA *father, const char *key)
AW_selection_list * get_sellist()
GBDATA * GBT_tree_infrontof(GBDATA *gb_tree)
void aw_message_if(GB_ERROR error)
char * GBS_global_string_copy(const char *templat,...)
void GB_close(GBDATA *gbd)
TreeNode * source() const
void NT_multifurcate_tree(TREE_canvas *ntw, const TreeNode::multifurc_limits &below)
#define AWAR_GROUPXFER_OVERWRITE_MODE
GB_write_int const char s