| 1 | #include <stdio.h> |
|---|
| 2 | #include <stdlib.h> |
|---|
| 3 | #include <string.h> |
|---|
| 4 | |
|---|
| 5 | #include <arbdb.h> |
|---|
| 6 | #include <arbdbt.h> |
|---|
| 7 | #include <aw_root.hxx> |
|---|
| 8 | #include <aw_device.hxx> |
|---|
| 9 | #include <aw_window.hxx> |
|---|
| 10 | #include <aw_preset.hxx> |
|---|
| 11 | #include <awt_canvas.hxx> |
|---|
| 12 | #include <awt_tree.hxx> |
|---|
| 13 | #include <awt_seq_dna.hxx> |
|---|
| 14 | #include <awt_seq_protein.hxx> |
|---|
| 15 | |
|---|
| 16 | #include <awt_csp.hxx> |
|---|
| 17 | #include <awt.hxx> |
|---|
| 18 | #include <awt_dtree.hxx> |
|---|
| 19 | #include <awt_sel_boxes.hxx> |
|---|
| 20 | #include "pars_dtree.hxx" |
|---|
| 21 | |
|---|
| 22 | #include "AP_buffer.hxx" |
|---|
| 23 | #include "parsimony.hxx" |
|---|
| 24 | #include "ap_tree_nlen.hxx" |
|---|
| 25 | #include "pars_main.hxx" |
|---|
| 26 | #include "pars_debug.hxx" |
|---|
| 27 | |
|---|
| 28 | extern AWT_csp *awt_csp; |
|---|
| 29 | |
|---|
| 30 | char *AWT_graphic_parsimony_root_changed(void *cd, AP_tree *old, AP_tree *newroot) |
|---|
| 31 | { |
|---|
| 32 | AWT_graphic_tree *agt = (AWT_graphic_tree*)cd; |
|---|
| 33 | if (old == agt->tree_root_display) agt->tree_root_display = newroot; |
|---|
| 34 | if (old == agt->tree_root) agt->tree_root = newroot; |
|---|
| 35 | if (old == GLOBAL_NT->tree->tree_root) GLOBAL_NT->tree->tree_root = newroot; |
|---|
| 36 | return 0; |
|---|
| 37 | } |
|---|
| 38 | |
|---|
| 39 | |
|---|
| 40 | /************************** |
|---|
| 41 | tree_init() |
|---|
| 42 | |
|---|
| 43 | Filter & weights setup |
|---|
| 44 | loads sequences at the leafs and |
|---|
| 45 | initalize filters & weights for the tree |
|---|
| 46 | ( AP_tree_nlen expected ) |
|---|
| 47 | |
|---|
| 48 | **************************/ |
|---|
| 49 | void NT_tree_init(AWT_graphic_tree *agt, adfiltercbstruct *pars_global_filter) { |
|---|
| 50 | |
|---|
| 51 | AP_tree *tree = agt->tree_root; |
|---|
| 52 | GB_transaction dummy(GLOBAL_gb_main); |
|---|
| 53 | |
|---|
| 54 | if (!tree) { |
|---|
| 55 | return; |
|---|
| 56 | } |
|---|
| 57 | char *use = GBT_read_string(GLOBAL_gb_main,AWAR_ALIGNMENT); |
|---|
| 58 | |
|---|
| 59 | long ali_len = GBT_get_alignment_len(GLOBAL_gb_main,use); |
|---|
| 60 | if (ali_len <=1) { |
|---|
| 61 | aw_popup_exit("No valid alignment selected! Try again"); |
|---|
| 62 | } |
|---|
| 63 | |
|---|
| 64 | |
|---|
| 65 | GB_BOOL is_aa = GBT_is_alignment_protein(GLOBAL_gb_main,use); |
|---|
| 66 | // |
|---|
| 67 | // filter & weights setup |
|---|
| 68 | // |
|---|
| 69 | if (!tree->tree_root->sequence_template) { |
|---|
| 70 | AP_tree_root *tr = tree->tree_root; |
|---|
| 71 | AP_sequence *sproto; |
|---|
| 72 | if (is_aa) { |
|---|
| 73 | sproto = (AP_sequence *)new AP_sequence_protein(tr); |
|---|
| 74 | }else{ |
|---|
| 75 | sproto = (AP_sequence *)new AP_sequence_parsimony(tr); |
|---|
| 76 | } |
|---|
| 77 | |
|---|
| 78 | tr->sequence_template = sproto; |
|---|
| 79 | tr->filter = awt_get_filter(agt->aw_root, pars_global_filter); |
|---|
| 80 | tr->weights = new AP_weights(); |
|---|
| 81 | |
|---|
| 82 | awt_csp->go(0); |
|---|
| 83 | int i; |
|---|
| 84 | if (awt_csp->rates){ |
|---|
| 85 | for (i=0;i<ali_len;i++){ |
|---|
| 86 | if (awt_csp->rates[i]>0.0000001){ |
|---|
| 87 | awt_csp->weights[i] *= (int)(2.0/ awt_csp->rates[i]); |
|---|
| 88 | } |
|---|
| 89 | } |
|---|
| 90 | tr->weights->init(awt_csp->weights , tr->filter); |
|---|
| 91 | }else{ |
|---|
| 92 | tr->weights->init(tr->filter); |
|---|
| 93 | } |
|---|
| 94 | tree->load_sequences_rek(use,GB_FALSE,GB_TRUE); // load with sequences |
|---|
| 95 | } |
|---|
| 96 | tree->tree_root->root_changed_cd = (void*)agt; |
|---|
| 97 | tree->tree_root->root_changed = AWT_graphic_parsimony_root_changed; |
|---|
| 98 | |
|---|
| 99 | ap_main->use = use; |
|---|
| 100 | } |
|---|
| 101 | |
|---|
| 102 | static int ap_global_abort_flag; |
|---|
| 103 | |
|---|
| 104 | double funktion_quadratisch(double x,double *param_list,int param_anz) { |
|---|
| 105 | AP_FLOAT ergebnis; |
|---|
| 106 | double wert = (double)x; |
|---|
| 107 | if (param_anz != 3) { |
|---|
| 108 | AW_ERROR("funktion_quadratisch: Falsche Parameteranzahl !"); |
|---|
| 109 | return (AP_FLOAT)0; |
|---|
| 110 | } |
|---|
| 111 | ergebnis = wert * wert * param_list[0] + wert * param_list[1] + param_list[2]; |
|---|
| 112 | return ergebnis; |
|---|
| 113 | } |
|---|
| 114 | |
|---|
| 115 | |
|---|
| 116 | void PARS_kernighan_cb(AP_tree *tree) { |
|---|
| 117 | |
|---|
| 118 | GB_push_transaction(GLOBAL_gb_main); |
|---|
| 119 | |
|---|
| 120 | AP_sequence::global_combineCount = 0; |
|---|
| 121 | |
|---|
| 122 | AP_FLOAT pars_start, pars_prev; |
|---|
| 123 | pars_prev = pars_start = GLOBAL_NT->tree->tree_root->costs(); |
|---|
| 124 | |
|---|
| 125 | int rek_deep_max = *GBT_read_int(GLOBAL_gb_main,"genetic/kh/maxdepth"); |
|---|
| 126 | |
|---|
| 127 | AP_KL_FLAG funktype = (AP_KL_FLAG)*GBT_read_int(GLOBAL_gb_main,"genetic/kh/function_type"); |
|---|
| 128 | |
|---|
| 129 | int param_anz; |
|---|
| 130 | double param_list[3]; |
|---|
| 131 | double f_startx,f_maxy,f_maxx,f_max_deep; |
|---|
| 132 | f_max_deep = (double)rek_deep_max; // x2 |
|---|
| 133 | f_startx = (double)*GBT_read_int(GLOBAL_gb_main,"genetic/kh/dynamic/start"); |
|---|
| 134 | f_maxy = (double)*GBT_read_int(GLOBAL_gb_main,"genetic/kh/dynamic/maxy"); |
|---|
| 135 | f_maxx = (double)*GBT_read_int(GLOBAL_gb_main,"genetic/kh/dynamic/maxx"); |
|---|
| 136 | |
|---|
| 137 | double (*funktion)(double wert,double *param_list,int param_anz); |
|---|
| 138 | switch (funktype) { |
|---|
| 139 | default: |
|---|
| 140 | case AP_QUADRAT_START: |
|---|
| 141 | funktion = funktion_quadratisch; |
|---|
| 142 | param_anz = 3; |
|---|
| 143 | param_list[2] = f_startx; |
|---|
| 144 | param_list[0] = (f_startx - f_maxy) / (f_maxx * f_maxx); |
|---|
| 145 | param_list[1] = -2.0 * param_list[0] * f_maxx; |
|---|
| 146 | break; |
|---|
| 147 | case AP_QUADRAT_MAX: // parameter liste fuer quadratische gleichung (y =ax^2 +bx +c) |
|---|
| 148 | funktion = funktion_quadratisch; |
|---|
| 149 | param_anz = 3; |
|---|
| 150 | param_list[0] = - f_maxy / (( f_max_deep - f_maxx) * ( f_max_deep - f_maxx)); |
|---|
| 151 | param_list[1] = -2.0 * param_list[0] * f_maxx; |
|---|
| 152 | param_list[2] = f_maxy + param_list[0] * f_maxx * f_maxx; |
|---|
| 153 | break; |
|---|
| 154 | } |
|---|
| 155 | |
|---|
| 156 | |
|---|
| 157 | AP_KL_FLAG searchflag=(AP_KL_FLAG)0; |
|---|
| 158 | if (*GBT_read_int(GLOBAL_gb_main,"genetic/kh/dynamic/enable")){ |
|---|
| 159 | searchflag = AP_DYNAMIK; |
|---|
| 160 | } |
|---|
| 161 | if (*GBT_read_int(GLOBAL_gb_main,"genetic/kh/static/enable")){ |
|---|
| 162 | searchflag = (AP_KL_FLAG)(searchflag|AP_STATIC); |
|---|
| 163 | } |
|---|
| 164 | |
|---|
| 165 | int rek_breite[8]; |
|---|
| 166 | rek_breite[0] = *GBT_read_int(GLOBAL_gb_main,"genetic/kh/static/depth0"); |
|---|
| 167 | rek_breite[1] = *GBT_read_int(GLOBAL_gb_main,"genetic/kh/static/depth1"); |
|---|
| 168 | rek_breite[2] = *GBT_read_int(GLOBAL_gb_main,"genetic/kh/static/depth2"); |
|---|
| 169 | rek_breite[3] = *GBT_read_int(GLOBAL_gb_main,"genetic/kh/static/depth3"); |
|---|
| 170 | rek_breite[4] = *GBT_read_int(GLOBAL_gb_main,"genetic/kh/static/depth4"); |
|---|
| 171 | int rek_breite_anz = 5; |
|---|
| 172 | |
|---|
| 173 | int anzahl = (int)(*GBT_read_float(GLOBAL_gb_main,"genetic/kh/nodes")*tree->arb_tree_leafsum2()); |
|---|
| 174 | AP_tree **list; |
|---|
| 175 | list = tree->getRandomNodes(anzahl); |
|---|
| 176 | int i =0; |
|---|
| 177 | |
|---|
| 178 | |
|---|
| 179 | i = 0; |
|---|
| 180 | aw_openstatus("KL Optimizer"); |
|---|
| 181 | { |
|---|
| 182 | char buffer[100]; |
|---|
| 183 | sprintf(buffer,"Old Parsimony: %f",pars_start); |
|---|
| 184 | aw_status(buffer); |
|---|
| 185 | } |
|---|
| 186 | int abort_flag = AP_FALSE; |
|---|
| 187 | |
|---|
| 188 | GB_pop_transaction(GLOBAL_gb_main); |
|---|
| 189 | |
|---|
| 190 | for (i=0;i<anzahl && ! abort_flag; i++) { |
|---|
| 191 | abort_flag |= aw_status(i/(double)anzahl); |
|---|
| 192 | if (abort_flag) break; |
|---|
| 193 | |
|---|
| 194 | AP_tree_nlen *tree_elem = (AP_tree_nlen *)list[i]; |
|---|
| 195 | |
|---|
| 196 | if (tree_elem->gr.hidden || |
|---|
| 197 | (tree_elem->father && tree_elem->father->gr.hidden)){ |
|---|
| 198 | continue; // within a folded group |
|---|
| 199 | } |
|---|
| 200 | { |
|---|
| 201 | AP_BOOL better_tree_found = AP_FALSE; |
|---|
| 202 | ap_main->push(); |
|---|
| 203 | display_clear(funktion,param_list,param_anz,(int)pars_start,(int)rek_deep_max); |
|---|
| 204 | |
|---|
| 205 | tree_elem->kernighan_rek(0, |
|---|
| 206 | rek_breite,rek_breite_anz,rek_deep_max, |
|---|
| 207 | funktion, param_list,param_anz, |
|---|
| 208 | pars_start, pars_start, pars_prev, |
|---|
| 209 | searchflag,&better_tree_found); |
|---|
| 210 | |
|---|
| 211 | if (better_tree_found) { |
|---|
| 212 | ap_main->clear(); |
|---|
| 213 | pars_start = GLOBAL_NT->tree->tree_root->costs(); |
|---|
| 214 | char buffer[100]; |
|---|
| 215 | sprintf(buffer,"New Parsimony: %f",pars_start); |
|---|
| 216 | abort_flag |= aw_status(buffer); |
|---|
| 217 | } else { |
|---|
| 218 | ap_main->pop(); |
|---|
| 219 | } |
|---|
| 220 | } |
|---|
| 221 | } |
|---|
| 222 | aw_closestatus(); |
|---|
| 223 | delete list; |
|---|
| 224 | ap_global_abort_flag |= abort_flag; |
|---|
| 225 | printf("Combines: %li\n", AP_sequence::global_combineCount); |
|---|
| 226 | return; |
|---|
| 227 | } |
|---|
| 228 | |
|---|
| 229 | void PARS_optimizer_cb(AP_tree *tree) { |
|---|
| 230 | AP_tree *oldrootleft = GLOBAL_NT->tree->tree_root->leftson; |
|---|
| 231 | AP_tree *oldrootright = GLOBAL_NT->tree->tree_root->rightson; |
|---|
| 232 | |
|---|
| 233 | for (ap_global_abort_flag = 0;!ap_global_abort_flag;){ |
|---|
| 234 | AP_FLOAT old_pars = GLOBAL_NT->tree->tree_root->costs(); |
|---|
| 235 | |
|---|
| 236 | ((AP_tree_nlen *)tree)->nn_interchange_rek(AP_TRUE,ap_global_abort_flag,-1,AP_BL_NNI_ONLY, GB_TRUE); // only not hidden |
|---|
| 237 | if (ap_global_abort_flag) break; |
|---|
| 238 | PARS_kernighan_cb(tree); |
|---|
| 239 | if (old_pars == GLOBAL_NT->tree->tree_root->costs()) { |
|---|
| 240 | ap_global_abort_flag = 1; |
|---|
| 241 | } |
|---|
| 242 | } |
|---|
| 243 | if (oldrootleft->father == oldrootright) oldrootleft->set_root(); |
|---|
| 244 | else oldrootright->set_root(); |
|---|
| 245 | GLOBAL_NT->tree->tree_root->costs(); |
|---|
| 246 | aw_closestatus(); |
|---|
| 247 | } |
|---|
| 248 | |
|---|
| 249 | AWT_graphic_parsimony::AWT_graphic_parsimony(AW_root *root, GBDATA *gb_maini):AWT_graphic_tree(root,gb_maini) |
|---|
| 250 | {;} |
|---|
| 251 | |
|---|
| 252 | AWT_graphic_tree *PARS_generate_tree(AW_root *root) { |
|---|
| 253 | AWT_graphic_parsimony *apdt = new AWT_graphic_parsimony(root,GLOBAL_gb_main); |
|---|
| 254 | AP_tree_nlen *aptnl = new AP_tree_nlen(0); |
|---|
| 255 | |
|---|
| 256 | apdt->init((AP_tree *)aptnl); |
|---|
| 257 | ap_main->tree_root = &apdt->tree_root; |
|---|
| 258 | |
|---|
| 259 | delete aptnl; |
|---|
| 260 | return apdt; |
|---|
| 261 | } |
|---|
| 262 | |
|---|
| 263 | AW_gc_manager |
|---|
| 264 | AWT_graphic_parsimony::init_devices(AW_window *aww, AW_device *device, AWT_canvas* ntw, AW_CL cd2) |
|---|
| 265 | { |
|---|
| 266 | AW_init_color_group_defaults("arb_pars"); |
|---|
| 267 | |
|---|
| 268 | AW_gc_manager preset_window = |
|---|
| 269 | AW_manage_GC(aww,device,AWT_GC_CURSOR, AWT_GC_MAX, /*AWT_GC_CURSOR+7,*/ AW_GCM_DATA_AREA, |
|---|
| 270 | (AW_CB)AWT_resize_cb, (AW_CL)ntw, cd2, |
|---|
| 271 | true, // uses color groups |
|---|
| 272 | "#AAAA55", |
|---|
| 273 | |
|---|
| 274 | // Important note : |
|---|
| 275 | // Many gc indices are shared between ABR_NTREE and ARB_PARSIMONY |
|---|
| 276 | // e.g. the tree drawing routines use same gc's for drawing both trees |
|---|
| 277 | // (check AWT_dtree.cxx AWT_graphic_tree::init_devices) |
|---|
| 278 | |
|---|
| 279 | "Cursor$#FFFFFF", |
|---|
| 280 | "Branch remarks$#DBE994", |
|---|
| 281 | "+-Bootstrap$#DBE994", "-B.(limited)$white", |
|---|
| 282 | "--unused$#ff0000", |
|---|
| 283 | "Marked$#FFFF00", |
|---|
| 284 | "Some marked$#eeee88", |
|---|
| 285 | "Not marked$black", |
|---|
| 286 | "Zombies etc.$#cc5924", |
|---|
| 287 | |
|---|
| 288 | "--unused", "--unused", // these reserve the numbers which are used for probe colors in ARB_NTREE |
|---|
| 289 | "--unused", "--unused", // (this is necessary because ARB_PARS and ARB_NTREE use the same tree painting routines) |
|---|
| 290 | "--unused", "--unused", |
|---|
| 291 | "--unused", "--unused", |
|---|
| 292 | |
|---|
| 293 | NULL); |
|---|
| 294 | return preset_window; |
|---|
| 295 | } |
|---|
| 296 | |
|---|
| 297 | void AWT_graphic_parsimony::show(AW_device *device) |
|---|
| 298 | { |
|---|
| 299 | long parsval = 0; |
|---|
| 300 | if (GLOBAL_NT->tree->tree_root) parsval = (long)GLOBAL_NT->tree->tree_root->costs(); |
|---|
| 301 | GLOBAL_NT->awr->awar(AWAR_PARSIMONY)->write_int( parsval); |
|---|
| 302 | long best = GLOBAL_NT->awr->awar(AWAR_BEST_PARSIMONY)->read_int(); |
|---|
| 303 | if (parsval < best || 0==best) { |
|---|
| 304 | GLOBAL_NT->awr->awar(AWAR_BEST_PARSIMONY)->write_int( parsval); |
|---|
| 305 | } |
|---|
| 306 | this->AWT_graphic_tree::show(device); |
|---|
| 307 | } |
|---|
| 308 | |
|---|
| 309 | |
|---|
| 310 | void AWT_graphic_parsimony::command(AW_device *device, AWT_COMMAND_MODE cmd, int button, AW_key_mod key_modifier, AW_key_code key_code, char key_char, |
|---|
| 311 | AW_event_type type, AW_pos x, AW_pos y, |
|---|
| 312 | AW_clicked_line *cl, AW_clicked_text *ct) |
|---|
| 313 | { |
|---|
| 314 | static int bl_drag_flag; |
|---|
| 315 | |
|---|
| 316 | AWUSE(ct); |
|---|
| 317 | AP_tree *at; |
|---|
| 318 | |
|---|
| 319 | bool compute_tree = false; |
|---|
| 320 | bool recalc_branch_lengths = false; |
|---|
| 321 | bool beautify_tree = false; |
|---|
| 322 | |
|---|
| 323 | //GBDATA *gb_main = this->tree_static->gb_main; |
|---|
| 324 | switch(cmd){ |
|---|
| 325 | case AWT_MODE_MOVE: // two point commands !!!!! |
|---|
| 326 | if(button==AWT_M_MIDDLE){ |
|---|
| 327 | break; |
|---|
| 328 | } |
|---|
| 329 | switch(type){ |
|---|
| 330 | case AW_Mouse_Press: |
|---|
| 331 | if( !(cl && cl->exists) ){ |
|---|
| 332 | break; |
|---|
| 333 | } |
|---|
| 334 | |
|---|
| 335 | /*** check security level @@@ ***/ |
|---|
| 336 | at = (AP_tree *)cl->client_data1; |
|---|
| 337 | if(at && at->father){ |
|---|
| 338 | bl_drag_flag = 1; |
|---|
| 339 | this->rot_at = at; |
|---|
| 340 | this->rot_cl = *cl; |
|---|
| 341 | this->old_rot_cl = *cl; |
|---|
| 342 | } |
|---|
| 343 | break; |
|---|
| 344 | |
|---|
| 345 | case AW_Mouse_Drag: |
|---|
| 346 | if( bl_drag_flag && this->rot_at && this->rot_at->father){ |
|---|
| 347 | this->rot_show_line(device); |
|---|
| 348 | if (cl->exists) { |
|---|
| 349 | this->rot_cl = *cl; |
|---|
| 350 | }else{ |
|---|
| 351 | rot_cl = old_rot_cl; |
|---|
| 352 | } |
|---|
| 353 | this->rot_show_line(device); |
|---|
| 354 | } |
|---|
| 355 | break; |
|---|
| 356 | case AW_Mouse_Release: |
|---|
| 357 | if( bl_drag_flag && this->rot_at && this->rot_at->father){ |
|---|
| 358 | this->rot_show_line(device); |
|---|
| 359 | AP_tree *dest= 0; |
|---|
| 360 | if (cl->exists) dest = (AP_tree *)cl->client_data1; |
|---|
| 361 | AP_tree *source = rot_at; |
|---|
| 362 | if (!(source && dest)) { |
|---|
| 363 | aw_message("Please Drag Line to a valid branch"); |
|---|
| 364 | break; |
|---|
| 365 | } |
|---|
| 366 | if (source == dest) { |
|---|
| 367 | aw_message("Please drag mouse from source to destination"); |
|---|
| 368 | break; |
|---|
| 369 | } |
|---|
| 370 | // if ( dest->is_son(source)) { |
|---|
| 371 | // aw_message("This operation is only allowed with two independent subtrees"); |
|---|
| 372 | // break; |
|---|
| 373 | // } |
|---|
| 374 | const char *error = 0; |
|---|
| 375 | |
|---|
| 376 | // switch(cmd){ |
|---|
| 377 | // case AWT_MODE_MOVE: |
|---|
| 378 | |
|---|
| 379 | switch(button){ |
|---|
| 380 | case AWT_M_LEFT: |
|---|
| 381 | error = source->cantMoveTo(dest); |
|---|
| 382 | if (!error) { |
|---|
| 383 | source->moveTo(dest,cl->length); |
|---|
| 384 | recalc_branch_lengths = true; |
|---|
| 385 | } |
|---|
| 386 | break; |
|---|
| 387 | case AWT_M_RIGHT: |
|---|
| 388 | error = source->move_group_info(dest); |
|---|
| 389 | break; |
|---|
| 390 | default: |
|---|
| 391 | error = "????? 45338"; |
|---|
| 392 | } |
|---|
| 393 | |
|---|
| 394 | // default: |
|---|
| 395 | // error = "????? 45338"; |
|---|
| 396 | // } |
|---|
| 397 | |
|---|
| 398 | if (error) aw_message(error); |
|---|
| 399 | this->exports.refresh = 1; |
|---|
| 400 | this->exports.save = 1; |
|---|
| 401 | this->exports.resize = 1; |
|---|
| 402 | this->tree_root->test_tree(); |
|---|
| 403 | //this->tree_root->compute_tree(gb_main); |
|---|
| 404 | compute_tree = true; |
|---|
| 405 | } |
|---|
| 406 | break; |
|---|
| 407 | default: |
|---|
| 408 | break; |
|---|
| 409 | } |
|---|
| 410 | break; |
|---|
| 411 | |
|---|
| 412 | #ifdef NNI_MODES |
|---|
| 413 | case AWT_MODE_NNI: |
|---|
| 414 | if(type==AW_Mouse_Press){ |
|---|
| 415 | GB_pop_transaction(gb_main); |
|---|
| 416 | switch(button){ |
|---|
| 417 | case AWT_M_LEFT: |
|---|
| 418 | if (!cl->exists) break; |
|---|
| 419 | at = (AP_tree *)cl->client_data1; |
|---|
| 420 | ap_global_abort_flag = AP_FALSE; |
|---|
| 421 | ((AP_tree_nlen *)at)->nn_interchange_rek(AP_TRUE,ap_global_abort_flag,-1); |
|---|
| 422 | this->exports.refresh = 1; |
|---|
| 423 | this->exports.save = 1; |
|---|
| 424 | this->tree_root->test_tree(); |
|---|
| 425 | recalc_branch_lengths = true; |
|---|
| 426 | break; |
|---|
| 427 | case AWT_M_RIGHT: |
|---|
| 428 | AP_sequence::global_combineCount = 0; |
|---|
| 429 | ap_global_abort_flag = AP_FALSE; |
|---|
| 430 | ((AP_tree_nlen *)this->tree_root)->nn_interchange_rek(AP_TRUE,ap_global_abort_flag,-1); |
|---|
| 431 | printf("Combines: %li\n", AP_sequence::global_combineCount); |
|---|
| 432 | this->exports.refresh = 1; |
|---|
| 433 | this->exports.save = 1; |
|---|
| 434 | this->tree_root->test_tree(); |
|---|
| 435 | recalc_branch_lengths = true; |
|---|
| 436 | break; |
|---|
| 437 | } |
|---|
| 438 | GB_begin_transaction(gb_main); |
|---|
| 439 | } /* if type */ |
|---|
| 440 | break; |
|---|
| 441 | case AWT_MODE_KERNINGHAN: |
|---|
| 442 | if(type==AW_Mouse_Press){ |
|---|
| 443 | GB_pop_transaction(gb_main); |
|---|
| 444 | switch(button){ |
|---|
| 445 | case AWT_M_LEFT: |
|---|
| 446 | if (!cl->exists) break; |
|---|
| 447 | at = (AP_tree *)cl->client_data1; |
|---|
| 448 | PARS_kernighan_cb(at); |
|---|
| 449 | this->exports.refresh = 1; |
|---|
| 450 | this->exports.save = 1; |
|---|
| 451 | this->tree_root->test_tree(); |
|---|
| 452 | recalc_branch_lengths = true; |
|---|
| 453 | break; |
|---|
| 454 | case AWT_M_RIGHT: |
|---|
| 455 | PARS_kernighan_cb(this->tree_root); |
|---|
| 456 | this->exports.refresh = 1; |
|---|
| 457 | this->exports.save = 1; |
|---|
| 458 | this->tree_root->test_tree(); |
|---|
| 459 | recalc_branch_lengths = true; |
|---|
| 460 | break; |
|---|
| 461 | } |
|---|
| 462 | GB_begin_transaction(gb_main); |
|---|
| 463 | } /* if type */ |
|---|
| 464 | break; |
|---|
| 465 | case AWT_MODE_OPTIMIZE: |
|---|
| 466 | if(type==AW_Mouse_Press){ |
|---|
| 467 | GB_pop_transaction(gb_main); |
|---|
| 468 | switch(button){ |
|---|
| 469 | case AWT_M_LEFT: |
|---|
| 470 | if (!cl->exists) break; |
|---|
| 471 | at = (AP_tree *)cl->client_data1; |
|---|
| 472 | if (at) PARS_optimizer_cb(at); |
|---|
| 473 | this->exports.refresh = 1; |
|---|
| 474 | this->exports.save = 1; |
|---|
| 475 | this->tree_root->test_tree(); |
|---|
| 476 | recalc_branch_lengths = true; |
|---|
| 477 | break; |
|---|
| 478 | case AWT_M_RIGHT: |
|---|
| 479 | PARS_optimizer_cb(this->tree_root); |
|---|
| 480 | this->exports.refresh = 1; |
|---|
| 481 | this->exports.save = 1; |
|---|
| 482 | this->tree_root->test_tree(); |
|---|
| 483 | recalc_branch_lengths = true; |
|---|
| 484 | break; |
|---|
| 485 | } |
|---|
| 486 | GB_begin_transaction(gb_main); |
|---|
| 487 | } /* if type */ |
|---|
| 488 | break; |
|---|
| 489 | #endif // NNI_MODES |
|---|
| 490 | |
|---|
| 491 | default: |
|---|
| 492 | AWT_graphic_tree::command(device,cmd,button, key_modifier, key_code, key_char, type, x, y, cl, ct); |
|---|
| 493 | break; |
|---|
| 494 | } |
|---|
| 495 | |
|---|
| 496 | if (recalc_branch_lengths) { |
|---|
| 497 | int abort_flag = AP_FALSE; |
|---|
| 498 | rootEdge()->nni_rek(AP_FALSE,abort_flag,-1, GB_FALSE,AP_BL_BL_ONLY); |
|---|
| 499 | |
|---|
| 500 | beautify_tree = true; // beautify after recalc_branch_lengths |
|---|
| 501 | } |
|---|
| 502 | |
|---|
| 503 | if (beautify_tree) { |
|---|
| 504 | this->resort_tree(0); |
|---|
| 505 | this->exports.save = 1; |
|---|
| 506 | |
|---|
| 507 | compute_tree = true; // compute_tree after beautify_tree |
|---|
| 508 | } |
|---|
| 509 | |
|---|
| 510 | if (compute_tree) { |
|---|
| 511 | this->tree_root->compute_tree(gb_main); |
|---|
| 512 | this->exports.refresh = 1; |
|---|
| 513 | } |
|---|
| 514 | } |
|---|