19 #define AWAR_BRANCH_ANALYSIS "branch_analysis"
20 #define AWAR_BRANCH_ANALYSIS_TMP "tmp/" AWAR_BRANCH_ANALYSIS
22 #define AWAR_BA_MIN_REL_DIFF AWAR_BRANCH_ANALYSIS "/min_rel_diff"
23 #define AWAR_BA_MIN_ABS_DIFF AWAR_BRANCH_ANALYSIS "/min_abs_diff"
24 #define AWAR_BA_MIN_DEPTH AWAR_BRANCH_ANALYSIS "/min_depth"
25 #define AWAR_BA_MIN_ROOTDIST AWAR_BRANCH_ANALYSIS "/min_rootdist"
26 #define AWAR_BA_DEGENERATION AWAR_BRANCH_ANALYSIS "/degeneration"
28 #define AWAR_BA_AUTOMARK_FORMAT AWAR_BRANCH_ANALYSIS_TMP "/auto_%s"
36 AW_window_simple *aws;
43 const char *local_awar_name (
const char *prefix,
const char *name) {
return GBS_global_string(
"%s%s/%s", prefix, suffix, name); }
45 void create_awars(
AW_root *aw_root);
46 void create_window(
AW_root *aw_root);
53 suffix(get_suffix(ntw))
55 create_awars(aw_root);
56 create_window(aw_root);
70 AW_awar *awar(
const char *name) {
return get_awroot()->
awar(name); }
72 void postmark_action()
const {
78 if (get_tree())
return true;
83 static void adapt_intawar_max(
AW_awar *awar,
int val,
int extra) {
88 if (max<val || ((val*2) < max && awar->
get_min()<val)) {
92 static void adapt_floatawar_max(
AW_awar *awar,
double val,
double extra) {
97 if (max<val || ((val*2) < max && awar->
get_min()<val)) {
114 double degeneration_factor = awar_degen->
read_float();
120 adapt_floatawar_max(awar_degen, found_max_degeneration, 1.0);
131 int min_depth = awar_min_depth->
read_int();
132 double min_rootdist = awar_min_rootdist->
read_float();
134 double found_max_rootdist;
137 set_info(get_tree()->mark_deep_leafs(min_depth, min_rootdist, found_max_depth, found_max_rootdist));
138 adapt_intawar_max(awar_min_depth, found_max_depth, 1);
139 adapt_floatawar_max(awar_min_rootdist, found_max_rootdist, 0.1);
149 double min_abs_diff = awar_abs_diff->
read_float();
150 double found_max_abs_diff;
153 set_info(get_tree()->mark_long_branches(min_rel_diff, min_abs_diff, found_max_abs_diff));
154 adapt_floatawar_max(awar_abs_diff, found_max_abs_diff, 0.1);
162 set_info(get_tree()->analyse_distances());
203 static bool avoid_recursion =
false;
204 if (!avoid_recursion) {
217 void BranchWindow::create_awars(
AW_root *aw_root) {
240 void BranchWindow::create_window(
AW_root *aw_root) {
241 aws =
new AW_window_simple;
243 aws->init(aw_root,
GBS_global_string(
"BRANCH_ANALYSIS_%s", suffix),
"Branch analysis");
244 aws->load_xfig(
"ad_branch.fig");
246 aws->auto_space(5, 5);
250 aws->create_button(
"CLOSE",
"CLOSE",
"C");
254 aws->create_button(
"HELP",
"HELP",
"H");
258 aws->label(
"Auto mark?");
259 aws->create_toggle(awar_automark->
awar_name);
266 aws->create_text_field(awar_info->
awar_name);
268 aws->button_length(28);
270 aws->at(
"dist_analyse");
272 aws->create_button(
"ANALYSE",
"Analyse distances in tree");
276 aws->create_button(
"UNMARK",
"Unmark all species");
278 const int FIELDWIDTH = 10;
279 const int SCALERWIDTH = 250;
281 aws->at(
"mark_long");
283 aws->create_button(
"MARK_LONG",
"Mark long branches");
289 aws->at(
"mark_deep");
291 aws->create_button(
"MARK_DEEP",
"Mark deep leafs");
296 aws->at(
"mark_degen");
298 aws->create_button(
"MARK_DEGENERATED",
"Mark degenerated branches");
308 if (!existingBranchWindow[ntw_id]) {
309 existingBranchWindow[ntw_id] =
new BranchWindow(aw_root, ntw);
312 return existingBranchWindow[ntw_id]->
get_window();
#define AWAR_BRANCH_ANALYSIS_TMP
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)
static void mark_long_branches_cb(AW_window *, BranchWindow *bw)
static void automark_changed_cb(AW_root *, BranchWindow *bw)
void NT_mark_all_cb(UNFIXED, TREE_canvas *ntw, int mark_mode)
AW_window * get_window() const
static AWT_config_mapping_def branch_analysis_config_mapping[]
#define AWAR_BA_MIN_ROOTDIST
AW_awar * set_minmax(float min, float max)
const char * GBS_global_string(const char *templat,...)
void AW_POPDOWN(AW_window *window)
#define AWAR_BA_MIN_REL_DIFF
BranchWindow(AW_root *aw_root, TREE_canvas *ntw_)
static void mark_long_branches_automark_cb()
static void mark_degenerated_branches_cb(AW_window *, BranchWindow *bw)
AW_VARIABLE_TYPE get_type() const
#define MAX_NT_WINDOWS_NULLINIT
AW_awar * set_max(float max)
AW_awar * add_callback(const RootCallback &cb)
static BranchWindow * findAutomarkingBranchWindow()
WindowCallback makeHelpCallback(const char *helpfile)
#define AWAR_BA_AUTOMARK_FORMAT
static void distance_analysis_cb(AW_window *, BranchWindow *bw)
AW_awar * awar_float(const char *var_name, float default_value=0.0, AW_default default_file=AW_ROOT_DEFAULT)
AW_awar * automark_awar() const
void markDegeneratedBranches()
static void unmark_branches_cb(AW_window *, BranchWindow *bw)
#define AWAR_BA_MIN_DEPTH
AW_awar * awar(const char *awar)
double mark_degenerated_branches(double degeneration_factor)
AW_awar * awar_int(const char *var_name, long default_value=0, AW_default default_file=AW_ROOT_DEFAULT)
void request_structure_update()
static void tree_changed_cb(AW_root *, BranchWindow *bw)
void set_info(const char *msg) const
GB_ERROR write_string(const char *aw_string)
#define AWAR_BA_DEGENERATION
static BranchWindow * existingBranchWindow[MAX_NT_WINDOWS]
bool has_automark_set() const
GB_transaction ta(gb_var)
AW_awar * awar_string(const char *var_name, const char *default_value="", AW_default default_file=AW_ROOT_DEFAULT)
AW_window * NT_create_branch_analysis_window(AW_root *aw_root, TREE_canvas *ntw)
static void mark_deep_leafs_automark_cb()
static void mark_deep_leafs_cb(AW_window *, BranchWindow *bw)
static void mark_degenerated_branches_automark_cb()
AW_awar * get_awar_tree() const
#define AWAR_BA_MIN_ABS_DIFF
GB_ERROR write_int(long aw_int)
char * GBS_global_string_copy(const char *templat,...)