41 #define AWAR_TREE_SAV "ad_tree/"
42 #define AWAR_TREE_TMP "tmp/ad_tree/"
44 #define AWAR_TREE_SECURITY AWAR_TREE_TMP "tree_security"
45 #define AWAR_TREE_REM AWAR_TREE_TMP "tree_rem"
46 #define AWAR_TREE_IMPORT AWAR_TREE_TMP "import_tree"
48 #define AWAR_GROUPXFER_SAV AWAR_TREE_SAV "groupxfer/"
50 #define AWAR_GROUPXFER_SOURCE AWAR_GROUPXFER_SAV "restrict"
51 #define AWAR_GROUPXFER_OVERWRITE_MODE AWAR_GROUPXFER_SAV "overwrite"
52 #define AWAR_GROUPXFER_INGROUP_ABS AWAR_GROUPXFER_SAV "ingroup/abs"
53 #define AWAR_GROUPXFER_INGROUP_REL AWAR_GROUPXFER_SAV "ingroup/rel"
54 #define AWAR_GROUPXFER_INGROUP_LIM AWAR_GROUPXFER_SAV "ingroup/lim"
55 #define AWAR_GROUPXFER_OUTGROUP_ABS AWAR_GROUPXFER_SAV "outgroup/abs"
56 #define AWAR_GROUPXFER_OUTGROUP_REL AWAR_GROUPXFER_SAV "outgroup/rel"
57 #define AWAR_GROUPXFER_OUTGROUP_LIM AWAR_GROUPXFER_SAV "outgroup/lim"
58 #define AWAR_GROUPXFER_UNKNOWN_ABS AWAR_GROUPXFER_SAV "unknown"
59 #define AWAR_GROUPXFER_KEELING AWAR_GROUPXFER_SAV "keeling"
60 #define AWAR_GROUPXFER_ACI AWAR_GROUPXFER_SAV "aci"
62 #define AWAR_TREE_EXPORT_FILEBASE AWAR_TREE_TMP "export_tree"
63 #define AWAR_TREE_EXPORT_FILTER AWAR_TREE_EXPORT_FILEBASE "/filter"
64 #define AWAR_TREE_EXPORT_NAME AWAR_TREE_EXPORT_FILEBASE "/file_name"
66 #define AWAR_TREE_EXPORT_SAV AWAR_TREE_SAV "export_tree/"
68 #define AWAR_TREE_EXPORT_FORMAT AWAR_TREE_EXPORT_SAV "format"
69 #define AWAR_TREE_EXPORT_NDS AWAR_TREE_EXPORT_SAV "NDS"
70 #define AWAR_TREE_EXPORT_INCLUDE_BOOTSTRAPS AWAR_TREE_EXPORT_SAV "bootstraps"
71 #define AWAR_TREE_EXPORT_INCLUDE_BRANCHLENS AWAR_TREE_EXPORT_SAV "branchlens"
72 #define AWAR_TREE_EXPORT_INCLUDE_GROUPNAMES AWAR_TREE_EXPORT_SAV "groupnames"
73 #define AWAR_TREE_EXPORT_HIDE_FOLDED_GROUPS AWAR_TREE_EXPORT_SAV "hide_folded"
74 #define AWAR_TREE_EXPORT_QUOTEMODE AWAR_TREE_EXPORT_SAV "quote_mode"
75 #define AWAR_TREE_EXPORT_REPLACE AWAR_TREE_EXPORT_SAV "replace"
78 #define AWAR_TREE_CONSENSE_TMP AWAR_TREE_TMP "consense/"
79 #define AWAR_TREE_CONSENSE_SAV AWAR_TREE_SAV "consense/"
81 #define AWAR_TREE_CONSENSE_TREE AWAR_TREE_CONSENSE_SAV "tree"
82 #define AWAR_TREE_CONSENSE_SELECTED AWAR_TREE_CONSENSE_TMP "selected"
127 char *treename_nopath = strrchr(treename,
'/');
129 if (treename_nopath) {
133 treename_nopath = treename;
136 char *fname =
GBS_string_eval(treename_nopath,
"*.tree=tree_*1:*.ntree=tree_*1:*.xml=tree_*1:.=:-=_: =_");
177 const char *filter_type =
NULp;
254 if (!tree_name || !strlen(tree_name)) {
255 error =
"Please select a tree first";
265 switch (exportType) {
314 AW_window_simple *aws =
new AW_window_simple;
315 aws->init(root,
"SAVE_TREE",
"TREE SAVE");
320 aws->create_button(
"CLOSE",
"CLOSE",
"C");
324 aws->create_button(
"HELP",
"HELP",
"H");
328 aws->auto_space(10, 10);
335 aws->update_option_menu();
338 aws->label(
"Nodetype");
340 aws->insert_default_toggle(
"Species ID ('name')",
"S", 0);
341 aws->insert_toggle(
"NDS",
"N", 1);
342 aws->update_toggle_field();
350 aws->label(
"Name quoting (Newick only)");
357 aws->update_option_menu();
362 aws->button_length(10);
365 aws->create_button(
"SAVE",
"SAVE",
"o");
377 char tempFile[] =
"newickXXXXXX";
378 int createTempFile = mkstemp(tempFile);
380 if (createTempFile) {
386 for (
char *tok = strtok(tmpFname,
"/"); tok;) {
388 tok = strtok(
NULp,
"/");
398 #if defined(WARN_TODO)
414 printf(
"Failed to create Temporary File to Parse xml file!\n");
427 if (strcmp(pcTreeFormat,
"xml") == 0) {
450 AW_window_simple *aws =
new AW_window_simple;
451 aws->init(root,
"LOAD_TREE",
"TREE LOAD");
456 aws->create_button(
"CLOSE",
"CLOSE",
"C");
460 aws->create_button(
"HELP",
"HELP",
"H");
464 aws->insert_default_option(
"Newick",
"t",
"tree");
465 aws->insert_option(
"XML",
"x",
"xml");
466 aws->update_option_menu();
469 aws->label(
"Tree name");
476 aws->create_button(
"LOAD",
"LOAD",
"o");
486 char *log_file =
NULp;
492 if (transferGroups) {
511 if (transferGroups) {
528 if (!canvas_showing_dest) {
530 "Press the right 'Display' button to view that tree", dst_tree));
579 static bool firstCall =
true;
600 AW_window_simple *aws =
new AW_window_simple;
601 aws->init(root, winId, winTitle);
602 aws->load_xfig(
"ad_one_tree.fig");
605 aws->auto_space(10, 3);
608 aws->create_button(
"CLOSE",
"Close",
"C");
612 aws->create_button(
"HELP",
"Help",
"H");
620 aws->callback(makeWindowCallback(
copy_tree_awar_cb, awar_displayed_tree, awar_other_tree)); aws->create_autosize_button(
"SELECT_DISPLAYED",
"Use");
621 aws->callback(makeWindowCallback(
copy_tree_awar_cb, awar_other_tree, awar_displayed_tree)); aws->create_autosize_button(
"DISPLAY_SELECTED",
"Display");
629 AW_window_simple *aws =
new AW_window_simple;
630 aws->init(root,
"CMP_TOPOLOGY",
"Compare tree topologies");
635 aws->create_button(
"CLOSE",
"Close",
"C");
639 aws->create_button(
"HELP",
"Help",
"H");
645 aws->create_autosize_button(
"CMP_TOPOLOGY",
"Compare topologies");
671 {
"*only_perfect_groups",
"Only copy perfectly matching groups with\n * 100% ingroup ratio and\n * 0% outgroup ratio",
"ingroup_lim='100';outgroup_lim='0'" },
673 {
"*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'" },
674 {
"*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'" },
676 {
"*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;\"}\"'" },
684 AW_window_simple *aws =
new AW_window_simple;
685 aws->init(root,
"COPY_NODE_INFO_OF_TREE",
"Move groups");
688 aws->button_length(11);
692 aws->create_button(
"CLOSE",
"Close",
"C");
696 aws->create_button(
"HELP",
"Help",
"H");
698 const int FLOAT_COLUMNS = 10;
699 const int PERCENT_COLUMNS = 5;
716 aws->update_option_menu();
721 aws->insert_option(
"keep \"newname [was: oldname]\"",
"k",
KEEP_OLD_NAMES);
722 aws->update_option_menu();
731 aws->create_button(
"GO",
"GO",
"G");
749 if (!gb_moved_tree) {
750 error =
"No tree selected";
760 if (gb_target_tree)
break;
770 if (gb_target_tree)
break;
778 if (gb_target_tree && gb_target_tree != gb_moved_tree) {
779 error =
GBT_move_tree(gb_moved_tree, move_mode, gb_target_tree);
788 static AW_window_simple *aws =
NULp;
793 aws =
new AW_window_simple;
794 aws->init(aw_root,
"TREE_ADMIN",
"TREE ADMIN");
795 aws->load_xfig(
"ad_tree.fig");
799 aws->create_button(
"CLOSE",
"CLOSE",
"C");
803 aws->create_button(
"HELP",
"HELP",
"H");
805 aws->button_length(40);
812 aws->insert_option(
"0",
"0", 0);
813 aws->insert_option(
"1",
"1", 1);
814 aws->insert_option(
"2",
"2", 2);
815 aws->insert_option(
"3",
"3", 3);
816 aws->insert_option(
"4",
"4", 4);
817 aws->insert_option(
"5",
"5", 5);
818 aws->insert_default_option(
"6",
"6", 6);
819 aws->update_option_menu();
825 aws->button_length(20);
830 aws->help_text(
"treeadm.hlp");
832 aws->create_button(
"DELETE",
"Delete",
"D");
835 aws->help_text(
"treeadm.hlp");
837 aws->create_button(
"RENAME",
"Rename",
"R");
840 aws->help_text(
"treeadm.hlp");
842 aws->create_button(
"COPY",
"Copy",
"C");
845 aws->help_text(
"tr_export.hlp");
847 aws->create_button(
"EXPORT",
"Export",
"E");
850 aws->help_text(
"tr_import.hlp");
852 aws->create_button(
"IMPORT",
"Import",
"I");
854 aws->button_length(0);
875 if (!cons_tree_name || !cons_tree_name[0]) {
876 error =
"No name specified for the consensus tree";
882 if (tree_names.size()<2) {
883 error =
"Not enough trees selected (at least 2 needed)";
893 progress.
subtitle(
"loading input trees");
894 for (
size_t t = 0; t<tree_names.size() && !
error; ++t) {
901 tree_builder.
add(tree, tree_names[t], 1.0);
906 size_t species_count;
907 TreeNode *cons_tree = tree_builder.
get(species_count, error);
909 if (!error && progress.
aborted()) {
910 error =
"user abort";
913 nt_assert(contradicted(cons_tree, error));
922 if (error) progress.
done();
924 error = ta.
close(error);
941 static AW_window_simple *aws =
NULp;
943 aws =
new AW_window_simple;
944 aws->init(aw_root,
"CONSENSE_TREE",
"Consensus Tree");
945 aws->load_xfig(
"ad_cons_tree.fig");
947 aws->auto_space(10, 10);
951 aws->create_button(
"CLOSE",
"CLOSE",
"C");
955 aws->create_button(
"HELP",
"HELP",
"H");
965 aws->create_button(
"USE_AS_TARGET",
"#moveLeft.xpm");
969 aws->create_autosize_button(
"BUILD",
"Build consensus tree",
"B");
990 : source(c1.source, c2.source),
991 target(c1.target, c2.target)
999 return target.
compare(right.target);
1001 return source.
compare(right.source);
1010 static const char *smallest_leafname;
1013 smallest_leafname = node->
name;
1019 const char *smallest_left = smallest_leafname;
1020 CombinedPosInfo rightInfo = reorder_subtree_rec(node->get_rightson());
1021 const char *smallest_right = smallest_leafname;
1023 bool left_leafname_bigger = strcmp(smallest_left, smallest_right)>0;
1024 smallest_leafname = left_leafname_bigger ? smallest_right : smallest_left;
1028 if (cmp>0 || (cmp == 0 && left_leafname_bigger)) {
1042 #if defined(UNIT_TESTS)
1049 reorder_subtree_rec(tree);
1082 aws->create_autosize_button(
"RESORT",
"Sort according to source tree");
1090 #define AWAR_MFURC "tree/multifurc/"
1091 #define AWAR_MFURC_CONSIDER_BOOTSTRAP AWAR_MFURC "use_bs"
1092 #define AWAR_MFURC_CONSIDER_LENGTH AWAR_MFURC "use_len"
1093 #define AWAR_MFURC_CONSIDER_TERMINALS AWAR_MFURC "terminals"
1094 #define AWAR_MFURC_LENGTH_LIMIT AWAR_MFURC "len"
1095 #define AWAR_MFURC_BOOTSTRAP_LIMIT AWAR_MFURC "bs"
1107 float below_bootstrap = 101.0;
1108 float below_length = 1000000.0;
1117 AW_window_simple *aws =
new AW_window_simple;
1119 aws->init(aw_root, ntw->
aww->
local_id(
"multifurcate"),
"Multifurcate tree");
1121 aws->auto_space(10, 10);
1124 aws->create_button(
"CLOSE",
"CLOSE",
"C");
1127 aws->create_button(
"HELP",
"HELP",
"H");
1129 const int LABEL_LENGTH = 46;
1130 aws->label_length(LABEL_LENGTH);
1133 aws->label(
"Multifurcate branches with branchlength below");
1138 aws->label(
" AND bootstrap below");
1142 aws->label_length(0);
1144 aws->label(
"Also apply to terminal branches");
1149 aws->create_autosize_button(
"MULTIFURCATE",
"Multifurcate",
"M");
1161 static const char *getTreeComment(
GBDATA *
gb_main,
const char *treeName) {
1166 #define TEST_EXPECT_TREE_COMMENT_CONTAINS(treeName,expected) TEST_EXPECT_CONTAINS(getTreeComment(gb_main,treeName),expected)
1167 #define TEST_EXPECT_TREE_COMMENT_DOESNT_CONTAIN(treeName,expected) TEST_EXPECT_DOESNT_CONTAIN(getTreeComment(gb_main,treeName),expected)
1168 #define TEST_EXPECT_TREE_COMMENT_DOESNT_CONTAIN__BROKEN(treeName,expected) TEST_EXPECT_DOESNT_CONTAIN__BROKEN(getTreeComment(gb_main,treeName),expected)
1176 Tree->compute_tree();
1184 void TEST_sort_tree_by_other_tree() {
1189 const char *topo_test =
"(((((((CloTyro3:1.046,CloTyro4:0.061):0.026,CloTyro2:0.017):0.017,CloTyrob:0.009):0.274,CloInnoc:0.371):0.057,CloBifer:0.388):0.124,(((CloButy2:0.009,CloButyr:0.000):0.564,CloCarni:0.120):0.010,CloPaste:0.179):0.131):0.081,((((CorAquat:0.084,CurCitre:0.058):0.103,CorGluta:0.522):0.053,CelBiazo:0.059):0.207,CytAquat:0.711):0.081);";
1190 const char *topo_center =
"(((CloPaste:0.179,((CloButy2:0.009,CloButyr:0.000):0.564,CloCarni:0.120):0.010):0.131,((CloInnoc:0.371,((CloTyro2:0.017,(CloTyro3:1.046,CloTyro4:0.061):0.026):0.017,CloTyrob:0.009):0.274):0.057,CloBifer:0.388):0.124):0.081,((CelBiazo:0.059,((CorAquat:0.084,CurCitre:0.058):0.103,CorGluta:0.522):0.053):0.207,CytAquat:0.711):0.081);";
1191 const char *topo_bottom =
"((CytAquat:0.711,(CelBiazo:0.059,(CorGluta:0.522,(CorAquat:0.084,CurCitre:0.058):0.103):0.053):0.207):0.081,((CloPaste:0.179,(CloCarni:0.120,(CloButy2:0.009,CloButyr:0.000):0.564):0.010):0.131,(CloBifer:0.388,(CloInnoc:0.371,(CloTyrob:0.009,(CloTyro2:0.017,(CloTyro3:1.046,CloTyro4:0.061):0.026):0.017):0.274):0.057):0.124):0.081);";
1193 const char *topo_vs_nj_bs =
"(((((((CloTyro3:1.046,CloTyro4:0.061):0.026,CloTyro2:0.017):0.017,CloTyrob:0.009):0.274,CloInnoc:0.371):0.057,CloBifer:0.388):0.124,(((CloButyr:0.000,CloButy2:0.009):0.564,CloCarni:0.120):0.010,CloPaste:0.179):0.131):0.081,(((CorGluta:0.522,(CorAquat:0.084,CurCitre:0.058):0.103):0.053,CelBiazo:0.059):0.207,CytAquat:0.711):0.081);";
1212 const double EPSILON = 0.0001;
1221 TEST_REJECT(sbt.sourcePos(
"Un-Known").is_known());
1240 TEST_EXPECT_ERROR_CLEAR();
1241 TEST_EXPECT_SAVED_NEWICK(
nALL, gb_main,
"tree_loaded",
"(((s1:0.200,s2:0.400):0.600,(s3:0.300,s 4:0.100):0.100):0.000,(s5:0.020,s-6:0.040):0.060);");
1242 TEST_EXPECT_TREE_COMMENT_CONTAINS(
"tree_loaded",
"covering most of tree reader code");
1247 void TEST_move_node_info() {
1251 const char *treeTarget1 =
"tree_removal";
1252 const char *treeTarget2 =
"tree_test";
1253 const char *treeSortby1 =
"tree_removal_copy";
1254 const char *treeSortby2 =
"tree_test_copy";
1256 const char *treeSource1 = treeSortby2;
1257 const char *treeSource2 =
"tree_tree2";
1258 const char *treeSource3 =
"tree_groups";
1260 #define GROUP_TEST "(CloTyrob,(CloTyro2,(CloTyro3,CloTyro4)))"
1261 #define GROUP_TEST_FLIPPED "(((CloTyro3,CloTyro4),CloTyro2),CloTyrob)"
1263 #define NAMED_GROUP_TEST GROUP_TEST "'test'"
1264 #define OVERWRITTEN_GROUP_TEST GROUP_TEST "'g2 [was: test]'"
1266 const char *org_topo1 =
"((CloInnoc," GROUP_TEST
"),(CloBifer,((CloCarni,CurCitre),((CloPaste,(Zombie1,(CloButy2,CloButyr))),(CytAquat,(CelBiazo,(CorGluta,(CorAquat,Zombie2))))))));";
1267 const char *org_topo2 =
"((((" GROUP_TEST_FLIPPED
",CloInnoc),CloBifer),(((CloButy2,CloButyr),CloCarni),CloPaste)),((((CorAquat,CurCitre),CorGluta),CelBiazo),CytAquat));";
1270 const char *unwanted_topo11 =
"((CytAquat,(CelBiazo,(CorGluta,(CorAquat,Zombie2)))),((CloPaste,(Zombie1,(CloButy2,CloButyr))),((CloCarni,CurCitre),(CloBifer,(CloInnoc," NAMED_GROUP_TEST
")))));";
1271 const char *unwanted_topo21 =
"((CloButy2,CloButyr),(Zombie1,(CloPaste,((((CloInnoc," OVERWRITTEN_GROUP_TEST
"),CloBifer),(CloCarni,CurCitre)),(CytAquat,(CelBiazo,(CorGluta,(CorAquat,Zombie2)))))))'outer');";
1273 const char *sorted_topo11 =
"(((((CloInnoc," NAMED_GROUP_TEST
"),CloBifer),(CloCarni,CurCitre)),(CloPaste,(Zombie1,(CloButy2,CloButyr)))),(CytAquat,(CelBiazo,(CorGluta,(CorAquat,Zombie2)))));";
1274 const char *sorted_topo21 =
"(((((((CloInnoc," OVERWRITTEN_GROUP_TEST
"),CloBifer),(CloCarni,CurCitre)),(CytAquat,(CelBiazo,(CorGluta,(CorAquat,Zombie2))))),CloPaste),Zombie1)'outer',(CloButy2,CloButyr));";
1275 const char *topo32 =
"((CloButy2,CloButyr)'upper',(((((" GROUP_TEST_FLIPPED
"'low2',CloInnoc),CloBifer),((((CorAquat,CurCitre),CorGluta),CelBiazo),CytAquat)'low1'),CloPaste),CloCarni));";
1276 const char *topo32_rc =
"((CloButy2,CloButyr)'upper',(((((" GROUP_TEST_FLIPPED
"'low2',CloInnoc),CloBifer),((((CorAquat,CurCitre),CorGluta),CelBiazo),CytAquat)'low1'),CloPaste),CloCarni)'lower');";
1277 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]');";
1278 const char *topo32_li =
"((CloButy2,CloButyr)" ",(((((" GROUP_TEST_FLIPPED
"'low2',CloInnoc),CloBifer),((((CorAquat,CurCitre),CorGluta),CelBiazo),CytAquat)'low1'),CloPaste),CloCarni)'lower');";
1280 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));";
1282 const char *
LOG =
"move_node_info.log";
1285 #if defined(TEST_AUTO_UPDATE)
1286 # define TEST_LOGS_EXPECTED(expected) TEST_COPY_FILE(LOG, expected)
1288 # define TEST_LOGS_EXPECTED(expected) TEST_EXPECT_TEXTFILES_EQUAL(expected, LOG)
1289 #endif // TEST_AUTO_UPDATE
1297 const char *resetComment =
"<comment reset>";
1313 const char *comment_added =
"Copied node info from tree_test_copy";
1314 TEST_EXPECT_TREE_COMMENT_DOESNT_CONTAIN(treeTarget1, comment_added);
1317 TEST_LOGS_EXPECTED(
"group_xfer_11.log.expected");
1321 TEST_EXPECT_TREE_COMMENT_CONTAINS(treeTarget1, comment_added);
1330 const char *comment_added =
"Copied node info from tree_groups";
1331 TEST_EXPECT_TREE_COMMENT_DOESNT_CONTAIN(treeTarget2, comment_added);
1334 TEST_LOGS_EXPECTED(
"group_xfer_32.log.expected");
1337 TEST_EXPECT_TREE_COMMENT_CONTAINS(treeTarget2, comment_added);
1342 TEST_LOGS_EXPECTED(
"group_xfer_32_rc.log.expected");
1351 "groupname;\" [p=\";penalty;\";ir=\";ingroup;\";\";oldsize;\"->\";newsize;\"]\""));
1352 TEST_LOGS_EXPECTED(
"group_xfer_32_rel.log.expected");
1372 TEST_LOGS_EXPECTED(
"group_xfer_32_li.log.expected");
1379 const char *comment_added =
"Added node info from tree_tree2";
1380 TEST_EXPECT_TREE_COMMENT_DOESNT_CONTAIN(treeTarget1, comment_added);
1383 TEST_LOGS_EXPECTED(
"group_xfer_21.log.expected");
1387 TEST_EXPECT_TREE_COMMENT_CONTAINS(treeTarget1, comment_added);
1398 const char *comment_added =
"Compared topology with tree_test";
1399 TEST_EXPECT_TREE_COMMENT_DOESNT_CONTAIN(treeTarget1, comment_added);
1403 TEST_EXPECT_TREE_COMMENT_CONTAINS(treeTarget1, comment_added);
1408 #define DOESNT_MATTER_ARGS gb_main,treeSource2,treeTarget1,LOG,REMOVE_EXISTING_GROUPS,XFER_ALL_GROUPS
1425 #undef DOESNT_MATTER_ARGS
1484 TEST_EXPECT(brotherUp.counter_next().dest() == grandpa);
1499 TEST_EXPECT(toLeaf.counter_next().dest() == node);
1503 TEST_EXPECT(fromLeaf.counter_previous().dest() == left);
1517 for (
int i = 0; i<EDGES; ++i) {
1523 TEST_EXPECT(e[i].counter_next().counter_previous() == e[i]);
1524 TEST_EXPECT(e[i].counter_previous().counter_next() == e[i]);
1528 TEST_EXPECT(e[i].counter_next().inverse().next() == inv);
1529 TEST_EXPECT(e[i].counter_previous().inverse().previous() == inv);
1530 TEST_EXPECT(e[i].next().inverse().counter_next() == inv);
1531 TEST_EXPECT(e[i].previous().inverse().counter_previous() == inv);
1536 const double EPSILON = 0.000001;
1538 const double NLEN = 0.025806;
1539 const double BLEN = 0.017316;
1540 const double PLEN = 0.017167;
1541 const double LLEN = 1.045690;
1542 const double RLEN = 0.060606;
1559 const double MOD_NLEN = 0.123456;
1560 const double MOD_LLEN = 0.246802;
1562 toLeaf.set_length(MOD_LLEN);
1576 void TEST_remove_bootstraps() {
1586 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));";
1587 const char *topo_rem =
"(((((((CloTyro3,CloTyro4)" ",CloTyro2)" ",CloTyrob)" ",CloInnoc)" ",CloBifer)" ",(((CloButy2,CloButyr),CloCarni)" ",CloPaste)" "),((((CorAquat,CurCitre),CorGluta)" ",CelBiazo)" ",CytAquat));";
1600 void TEST_multifurcate_tree() {
1605 const char *topo_test =
"(((((((CloTyro3:1.046,CloTyro4:0.061)'40%':0.026,CloTyro2:0.017)'0%':0.017,CloTyrob:0.009)'97%:test':0.274,CloInnoc:0.371)'0%':0.057,CloBifer:0.388)'53%':0.124,(((CloButy2:0.009,CloButyr:0.000):0.564,CloCarni:0.120)'33%':0.010,CloPaste:0.179)'97%':0.131):0.081,((((CorAquat:0.084,CurCitre:0.058):0.103,CorGluta:0.522)'17%':0.053,CelBiazo:0.059)'40%':0.207,CytAquat:0.711):0.081);";
1607 const char *topo_single =
"(((((((CloTyro3:1.046,CloTyro4:0.061)'40%':0.026,CloTyro2:0.017)'0%':0.017,CloTyrob:0.009)'97%:test':0.581,CloInnoc:0.000)'0%':0.121,CloBifer:0.388)'53%':0.124,(((CloButy2:0.009,CloButyr:0.000):0.564,CloCarni:0.120)'33%':0.010,CloPaste:0.179)'97%':0.131):0.081,((((CorAquat:0.084,CurCitre:0.058):0.103,CorGluta:0.522)'17%':0.053,CelBiazo:0.059)'40%':0.207,CytAquat:0.711):0.081);";
1608 const char *topo_bs_less_101_005 =
"(((((((CloTyro3:1.098,CloTyro4:0.064)" ":0.000,CloTyro2:0.000)" ":0.000,CloTyrob:0.000)'97%:test':0.287,CloInnoc:0.371)'0%':0.057,CloBifer:0.388)'53%':0.124,(((CloButy2:0.000,CloButyr:0.000):0.578,CloCarni:0.121)" ":0.000,CloPaste:0.181)'97%':0.132):0.081,((((CorAquat:0.084,CurCitre:0.058):0.103,CorGluta:0.522)'17%':0.053,CelBiazo:0.059)'40%':0.207,CytAquat:0.711):0.081);";
1609 const char *topo_bs_less_101_005_NT =
"(((((((CloTyro3:1.078,CloTyro4:0.062)" ":0.000,CloTyro2:0.018)" ":0.000,CloTyrob:0.009)'97%:test':0.282,CloInnoc:0.371)'0%':0.057,CloBifer:0.388)'53%':0.124,(((CloButy2:0.009,CloButyr:0.000):0.570,CloCarni:0.121)" ":0.000,CloPaste:0.181)'97%':0.132):0.081,((((CorAquat:0.084,CurCitre:0.058):0.103,CorGluta:0.522)'17%':0.053,CelBiazo:0.059)'40%':0.207,CytAquat:0.711):0.081);";
1610 const char *topo_bs_less_30_005 =
"(((((((CloTyro3:1.046,CloTyro4:0.061)'40%':0.027,CloTyro2:0.018)" ":0.000,CloTyrob:0.009)'97%:test':0.288,CloInnoc:0.371)'0%':0.057,CloBifer:0.388)'53%':0.124,(((CloButy2:0.009,CloButyr:0.000):0.564,CloCarni:0.120)'33%':0.010,CloPaste:0.179)'97%':0.131):0.081,((((CorAquat:0.084,CurCitre:0.058):0.103,CorGluta:0.522)'17%':0.053,CelBiazo:0.059)'40%':0.207,CytAquat:0.711):0.081);";
1611 const char *topo_bs_less_30 =
"(((((((CloTyro3:1.046,CloTyro4:0.061)'40%':0.027,CloTyro2:0.018)" ":0.000,CloTyrob:0.009)'97%:test':0.302,CloInnoc:0.390)" ":0.000,CloBifer:0.407)'53%':0.131,(((CloButy2:0.009,CloButyr:0.000):0.564,CloCarni:0.120)'33%':0.010,CloPaste:0.179)'97%':0.131):0.081,((((CorAquat:0.084,CurCitre:0.058):0.109,CorGluta:0.554)" ":0.000,CelBiazo:0.062)'40%':0.220,CytAquat:0.711):0.081);";
1612 const char *topo_all =
"(((((((CloTyro3:0.000,CloTyro4:0.000)" ":0.000,CloTyro2:0.000)" ":0.000,CloTyrob:0.000)'" "test':0.000,CloInnoc:0.000)" ":0.000,CloBifer:0.000)" ":0.000,(((CloButy2:0.000,CloButyr:0.000):0.000,CloCarni:0.000)" ":0.000,CloPaste:0.000)" ":0.000):0.000,((((CorAquat:0.000,CurCitre:0.000):0.000,CorGluta:0.000)" ":0.000,CelBiazo:0.000)" ":0.000,CytAquat:0.000):0.000);";
1614 const double STABLE_LENGTH = 5.362750;
1615 const double EPSILON = 0.000001;
1617 for (
int test = 1; test<=6; ++test) {
1674 void TEST_TreeNode_attributes() {
1749 #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
AW_window * create_rename_window(AW_root *root, const Spec *spec)
#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)
#define AWAR_TREE_EXPORT_NAME
void load_xfig(const char *file, bool resize=true)
GB_ERROR TREE_write_XML(GBDATA *gb_main, const char *db_name, const char *tree_name, const TREE_node_text_gen *node_gen, bool skip_folded, const char *path)
static void multifurcation_cb(UNFIXED, TREE_canvas *ntw)
static char * readXmlTree(char *fname)
void AWT_registerTreeAwarSimple(AW_awar *awar)
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)
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)
#define AWAR_GROUPXFER_OUTGROUP_LIM
char * get_tree_remark() const
GB_ERROR TREE_load_to_db(GBDATA *gb_main, const char *treefile, const char *tree_name)
void AW_create_standard_fileselection(AW_window *aws, const char *awar_prefix)
ARB_edge_type get_type() const
char * ARB_strdup(const char *str)
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_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
void make_node_text_init(GBDATA *gb_main)
#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)
#define DOWNCAST(totype, expr)
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)
const char * make_node_text_nds(GBDATA *gb_main, GBDATA *gbd, NDS_Type mode, TreeNode *species, const char *tree_name)
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 TREE_write_Newick(GBDATA *gb_main, const char *tree_name, const TREE_node_text_gen *node_gen, bool save_branchlengths, bool save_bootstraps, bool save_groupnames, bool pretty, TREE_node_quoting quoteMode, const char *path)
GB_ERROR GBT_write_tree(GBDATA *gb_main, const char *tree_name, TreeNode *tree)
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
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)
NOT4PERL GB_ERROR GB_xcmd(const char *cmd, XCMD_TYPE exectype) __ATTR__USERESULT_TODO
#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)
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 AW_window_simple * create_select_other_tree_window(AW_root *root, const char *winId, const char *winTitle, const char *helpFile, AW_awar *awar_displayed_tree)
AW_DB_selection * awt_create_TREE_selection_list(GBDATA *gb_main, AW_window *aws, const char *varname, bool fallback2default)
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
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)
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)
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