Show
Ignore:
Timestamp:
09/04/10 17:39:23 (2 years ago)
Author:
westram
Message:
  • species/SAI-references for alignment adaption
    • added buttons to move, delete and test references
    • changed formatting of candidate list
Files:
1 modified

Legend:

Unmodified
Added
Removed
  • trunk/MERGE/MG_preserves.cxx

    r6381 r6587  
    1414 
    1515#include "merge.hxx" 
     16#include "MG_adapt_ali.hxx" 
    1617 
    1718#include <arbdbt.h> 
     
    2728// find species/SAIs to preserve alignment 
    2829 
    29 #define AWAR_REMAP_CANDIDATE    "tmp/merge/remap_candidates" 
    30 #define AWAR_REMAP_ALIGNMENT    "tmp/merge/remap_alignment" 
     30#define AWAR_REMAP_CANDIDATE     "tmp/merge/remap_candidates" 
     31#define AWAR_REMAP_ALIGNMENT     "tmp/merge/remap_alignment" 
     32#define AWAR_REMAP_SEL_REFERENCE "tmp/merge/remap_reference" 
    3133 
    3234struct preserve_para { 
    3335    AW_window         *window; 
    34     AW_selection_list *ali_id; 
    35     AW_selection_list *cand_id; 
     36    AW_selection_list *ali_id;                      // alignments 
     37    AW_selection_list *cand_id;                     // reference candidates 
     38    AW_selection_list *ref_id;                      // used references 
    3639}; 
    3740 
     
    6164} 
    6265 
    63 // initialize the alignment selection list 
    6466static void init_alignments(preserve_para *para) { 
    65     AW_window         *aww = para->window; 
    66     AW_selection_list *id  = para->ali_id; 
    67  
    68     aww->clear_selection_list(id); 
    69     aww->insert_default_selection(id, "All", "All"); 
    70  
    71     // insert alignments available in both databases 
     67    // initialize the alignment selection list 
    7268    char **ali_names = get_global_alignments(); 
    73     for (int i = 0; ali_names[i]; ++i) { 
    74         aww->insert_selection(id, ali_names[i], ali_names[i]); 
    75     } 
     69    para->window->init_selection_list_from_array(para->ali_id, ali_names, "All"); 
    7670    GBT_free_names(ali_names); 
    77  
    78     aww->update_selection_list(id); 
    79     aww->get_root()->awar(AWAR_REMAP_ALIGNMENT)->write_string("All"); // select "All" 
    80 } 
    81  
    82 // clear the candidate list 
     71} 
     72 
    8373static void clear_candidates(preserve_para *para) { 
     74    // clear the candidate list 
    8475    AW_window         *aww = para->window; 
    8576    AW_selection_list *id  = para->cand_id; 
     
    8879    aww->insert_default_selection(id, "????", "????"); 
    8980    aww->update_selection_list(id); 
    90  
    91     aww->get_root()->awar(AWAR_REMAP_CANDIDATE)->write_string(""); // deselect 
    9281} 
    9382 
     
    135124 
    136125public: 
    137     Candidate(bool is_species, const char *name_, GBDATA *gb_src, GBDATA *gb_dst, const char **ali_names) 
     126    Candidate(bool is_species, const char *name_, GBDATA *gb_src, GBDATA *gb_dst, const char *const *ali_names) 
    138127        : name(is_species ? name_ : string("SAI:")+name_) 
    139128    { 
     
    175164    const char *get_name() const { return name.c_str(); } 
    176165    const char *get_entry() const { 
    177         bool isSAI = memcmp(get_name(), "SAI:", 4) == 0; 
    178         return GBS_global_string(isSAI ? "%-24s %i %li %f" : "%-8s %i %li %f", 
    179                                  get_name(), found_alignments, base_count_diff, score); 
     166        return GBS_global_string("%24s  %i %li %f", get_name(), found_alignments, base_count_diff, score); 
    180167    } 
    181168 
    182169    bool operator < (const Candidate& other) const { // sort highest score first 
    183170        int ali_diff = found_alignments-other.found_alignments; 
    184  
    185         if (ali_diff) { 
    186             return ali_diff>0; 
    187         } 
    188  
     171        if (ali_diff) return ali_diff>0; 
    189172        return score > other.score; 
    190173    } 
     
    198181 
    199182// add all candidate species to 'candidates' 
    200 static void find_species_candidates(Candidates& candidates, const char **ali_names) { 
     183static void find_species_candidates(Candidates& candidates, const char *const *ali_names) { 
    201184    aw_status("Examining species (kill to stop)"); 
    202185    aw_status(0.0); 
     
    238221 
    239222// add all candidate SAIs to 'candidates' 
    240 static void find_SAI_candidates(Candidates& candidates, const char **ali_names) { 
     223static void find_SAI_candidates(Candidates& candidates, const char *const *ali_names) { 
    241224    aw_status("Examining SAIs"); 
    242225    aw_status(0.0); 
     
    275258} 
    276259 
    277 // FIND button 
    278 // (rebuild candidates list) 
    279260static void calculate_preserves_cb(AW_window *, AW_CL cl_para) { 
     261    // FIND button (rebuild candidates list) 
     262 
    280263    GB_transaction ta1(GLOBAL_gb_merge); 
    281264    GB_transaction ta2(GLOBAL_gb_dest); 
     
    295278        char **ali_names = get_global_alignments(); 
    296279 
    297         find_SAI_candidates(candidates, const_cast<const char**>(ali_names)); 
    298         find_species_candidates(candidates, const_cast<const char**>(ali_names)); 
     280        find_SAI_candidates(candidates, ali_names); 
     281        find_species_candidates(candidates, ali_names); 
    299282 
    300283        GBT_free_names(ali_names); 
    301284    } 
    302285    else { 
    303         char *ali_names[2] = { ali, 0 }; 
    304         find_SAI_candidates(candidates, const_cast<const char**>(ali_names)); 
    305         find_species_candidates(candidates, const_cast<const char**>(ali_names)); 
     286        const char *ali_names[2] = { ali, 0 }; 
     287        find_SAI_candidates(candidates, ali_names); 
     288        find_species_candidates(candidates, ali_names); 
    306289    } 
    307290 
     
    326309} 
    327310 
    328 // ADD button 
    329 // (add current selected candidate to references) 
     311 
     312 
     313static char **read_references(AW_root *aw_root)  { 
     314    char  *ref_string = aw_root->awar(AWAR_REMAP_SPECIES_LIST)->read_string(); 
     315    char **refs       = GBT_split_string(ref_string, " \n,;", true, NULL); 
     316 
     317    free(ref_string); 
     318    return refs; 
     319} 
     320static void write_references(AW_root *aw_root, const char *const *ref_array) { 
     321    char *ref_string = GBT_join_names(ref_array, '\n'); 
     322    aw_root->awar(AWAR_REMAP_SPECIES_LIST)->write_string(ref_string); 
     323    aw_root->awar(AWAR_REMAP_ENABLE)->write_int(ref_string[0] != 0); 
     324    free(ref_string); 
     325} 
     326static void select_reference(AW_root *aw_root, const char *ref_to_select) { 
     327    aw_root->awar(AWAR_REMAP_SEL_REFERENCE)->write_string(ref_to_select); 
     328} 
     329static char *get_selected_reference(AW_root *aw_root) { 
     330    return aw_root->awar(AWAR_REMAP_SEL_REFERENCE)->read_string(); 
     331} 
     332 
     333static void refresh_reference_list_cb(AW_root *aw_root, AW_CL cl_para) { 
     334    preserve_para  *para = (preserve_para*)cl_para; 
     335    char          **refs = read_references(aw_root); 
     336    para->window->init_selection_list_from_array(para->ref_id, refs, ""); 
     337    GBT_free_names(refs); 
     338} 
     339 
    330340static void add_selected_cb(AW_window *, AW_CL cl_para) { 
    331     preserve_para *para = (preserve_para*)cl_para; 
    332     AW_window     *aww  = para->window; 
    333     AW_root       *awr  = aww->get_root(); 
    334  
    335     char *current    = awr->awar(AWAR_REMAP_CANDIDATE)->read_string(); 
    336     char *references = awr->awar(AWAR_REMAP_SPECIES_LIST)->read_string(); 
    337     if (references && references[0]) { 
    338         string ref = string(references); 
    339         size_t pos = ref.find(current); 
    340         int    len = strlen(current); 
    341  
    342         for (; 
    343              pos != string::npos; 
    344              pos = ref.find(current, pos+1)) 
    345         { 
    346             if (pos == 0 || ref[pos-1] == '\n') { 
    347                 if ((pos+len) == ref.length()) break; // at eos -> skip 
    348                 char behind = ref[pos+len]; 
    349                 if (behind == '\n') break; // already there -> skip 
    350             } 
    351         } 
    352  
    353         if (pos == string::npos) { 
    354             string appended = ref+'\n'+current; 
    355             awr->awar(AWAR_REMAP_SPECIES_LIST)->write_string(appended.c_str()); 
    356         } 
    357     } 
    358     else { 
    359         awr->awar(AWAR_REMAP_SPECIES_LIST)->write_string(current); 
    360     } 
    361  
    362     free(references); 
    363     free(current); 
    364  
    365     awr->awar(AWAR_REMAP_ENABLE)->write_int(1); 
    366 } 
    367  
    368 // CLEAR button 
    369 // (clear references) 
     341    // ADD button (add currently selected candidate to references) 
     342 
     343    preserve_para *para    = (preserve_para*)cl_para; 
     344    AW_root       *aw_root = para->window->get_root(); 
     345     
     346    char **refs       = read_references(aw_root); 
     347    char  *candidate  = aw_root->awar(AWAR_REMAP_CANDIDATE)->read_string(); 
     348    char  *selected   = get_selected_reference(aw_root); 
     349    int    cand_index = GBT_names_index_of(refs, candidate); 
     350    int    sel_index  = GBT_names_index_of(refs, selected); 
     351 
     352    if (cand_index == -1) GBT_names_add(refs, sel_index+1, candidate); 
     353    else                  GBT_names_move(refs, cand_index, sel_index); 
     354 
     355    write_references(aw_root, refs); 
     356    select_reference(aw_root, candidate); 
     357 
     358    free(selected); 
     359    free(candidate); 
     360    GBT_free_names(refs); 
     361 
     362    para->window->move_selection(para->cand_id, 1);  
     363} 
     364 
    370365static void clear_references_cb(AW_window *aww) { 
    371     AW_root *awr = aww->get_root(); 
    372     awr->awar(AWAR_REMAP_SPECIES_LIST)->write_string(""); 
    373     awr->awar(AWAR_REMAP_ENABLE)->write_int(0); 
    374 } 
    375  
    376 // SELECT PRESERVES window 
     366    // CLEAR button (clear references) 
     367    aww->get_root()->awar(AWAR_REMAP_SPECIES_LIST)->write_string(""); 
     368} 
     369 
     370static void del_reference_cb(AW_window *aww) { 
     371    AW_root  *aw_root   = aww->get_root(); 
     372    char    **refs      = read_references(aw_root); 
     373    char     *selected  = get_selected_reference(aw_root); 
     374    int       sel_index = GBT_names_index_of(refs, selected); 
     375 
     376    if (sel_index >= 0) { 
     377        select_reference(aw_root, refs[sel_index+1]); 
     378        GBT_names_erase(refs, sel_index); 
     379        write_references(aw_root, refs); 
     380    } 
     381 
     382    free(selected); 
     383    GBT_free_names(refs); 
     384} 
     385 
     386static void lower_reference_cb(AW_window *aww) { 
     387    AW_root  *aw_root   = aww->get_root(); 
     388    char    **refs      = read_references(aw_root); 
     389    char     *selected  = get_selected_reference(aw_root); 
     390    int       sel_index = GBT_names_index_of(refs, selected); 
     391 
     392    if (sel_index >= 0) { 
     393        GBT_names_move(refs, sel_index, sel_index+1); 
     394        write_references(aw_root, refs); 
     395    } 
     396 
     397    free(selected); 
     398    GBT_free_names(refs); 
     399} 
     400static void raise_reference_cb(AW_window *aww) { 
     401    AW_root  *aw_root   = aww->get_root(); 
     402    char    **refs      = read_references(aw_root); 
     403    char     *selected  = get_selected_reference(aw_root); 
     404    int       sel_index = GBT_names_index_of(refs, selected); 
     405 
     406    if (sel_index > 0) { 
     407        GBT_names_move(refs, sel_index, sel_index-1); 
     408        write_references(aw_root, refs); 
     409    } 
     410 
     411    free(selected); 
     412    GBT_free_names(refs); 
     413} 
     414 
     415static void test_references_cb(AW_window *aww) { 
     416    char           *reference_species_names = aww->get_root()->awar(AWAR_REMAP_SPECIES_LIST)->read_string(); 
     417    GB_transaction  tm(GLOBAL_gb_merge); 
     418    GB_transaction  td(GLOBAL_gb_dest); 
     419     
     420    MG_remaps test_mapping(GLOBAL_gb_merge, GLOBAL_gb_dest, true, reference_species_names); // will raise aw_message's in case of problems 
     421 
     422    free(reference_species_names); 
     423} 
     424 
     425static void init_preserve_awars(AW_root *aw_root) { 
     426    aw_root->awar_string(AWAR_REMAP_ALIGNMENT,     "", GLOBAL_gb_dest); 
     427    aw_root->awar_string(AWAR_REMAP_CANDIDATE,     "", GLOBAL_gb_dest); 
     428    aw_root->awar_string(AWAR_REMAP_SEL_REFERENCE, "", GLOBAL_gb_dest); 
     429} 
     430 
    377431AW_window *MG_select_preserves_cb(AW_root *aw_root) { 
    378     aw_root->awar_string(AWAR_REMAP_ALIGNMENT, "", GLOBAL_gb_dest); 
    379     aw_root->awar_string(AWAR_REMAP_CANDIDATE, "", GLOBAL_gb_dest); 
     432    // SELECT PRESERVES window 
     433    init_preserve_awars(aw_root); 
    380434 
    381435    AW_window_simple *aws = new AW_window_simple; 
     
    391445    aws->create_button("HELP", "HELP", "H"); 
    392446 
     447    // ---------- 
     448 
     449    preserve_para *para = new preserve_para; // do not free (is passed to callback) 
     450    para->window        = aws; 
     451     
     452    aws->at("ali"); 
     453    para->ali_id = aws->create_selection_list(AWAR_REMAP_ALIGNMENT, 0, "", 10, 30); 
     454 
     455    // ---------- 
     456     
    393457    aws->at("adapt"); 
    394458    aws->label("Adapt alignments"); 
     
    396460 
    397461    aws->at("reference"); 
    398     aws->create_text_field(AWAR_REMAP_SPECIES_LIST); 
    399  
    400     preserve_para *para = new preserve_para; // do not free (is passed to callback) 
    401     para->window        = aws; 
    402  
    403     aws->at("candidate"); 
    404     para->cand_id = aws->create_selection_list(AWAR_REMAP_CANDIDATE, 0, "", 10, 30); 
    405  
    406     aws->at("ali"); 
    407     para->ali_id = aws->create_selection_list(AWAR_REMAP_ALIGNMENT, 0, "", 10, 30); 
     462    // aws->create_text_field(AWAR_REMAP_SPECIES_LIST); // @@@ needs to be a selection list! 
     463    para->ref_id = aws->create_selection_list(AWAR_REMAP_SEL_REFERENCE, 0, "", 10, 30); 
     464 
     465    aws->button_length(8); 
     466 
     467    aws->at("clear"); 
     468    aws->callback(clear_references_cb); 
     469    aws->create_button("CLEAR", "Clear", "C"); 
     470 
     471    aws->at("del"); 
     472    aws->callback(del_reference_cb); 
     473    aws->create_button("DEL", "Del", "L"); 
     474 
     475    aws->at("up"); 
     476    aws->callback(raise_reference_cb); 
     477    aws->create_button("UP", "Up", "U"); 
     478 
     479    aws->at("down"); 
     480    aws->callback(lower_reference_cb); 
     481    aws->create_button("DOWN", "Down", "D"); 
     482 
     483    aws->at("test"); 
     484    aws->callback(test_references_cb); 
     485    aws->create_button("TEST", "Test", "T"); 
     486     
     487    // ---------- 
    408488 
    409489    aws->at("find"); 
     
    411491    aws->create_autosize_button("FIND", "Find candidates", "F", 1); 
    412492 
     493    aws->at("add"); 
     494    aws->callback(add_selected_cb, (AW_CL)para); 
     495    aws->create_button("ADD", "Add", "A"); 
     496 
     497    aws->at("candidate"); 
     498    para->cand_id = aws->create_selection_list(AWAR_REMAP_CANDIDATE, 0, "", 10, 30); 
     499 
    413500    { 
    414501        GB_transaction ta1(GLOBAL_gb_merge); 
     
    419506    } 
    420507 
    421     aws->button_length(8); 
    422  
    423     aws->at("add"); 
    424     aws->callback(add_selected_cb, (AW_CL)para); 
    425     aws->create_button("ADD", "Add", "A"); 
    426  
    427     aws->at("clear"); 
    428     aws->callback(clear_references_cb); 
    429     aws->create_button("CLEAR", "Clear", "C"); 
     508    { 
     509        AW_awar *awar_list = aw_root->awar(AWAR_REMAP_SPECIES_LIST); 
     510        awar_list->add_callback(refresh_reference_list_cb, (AW_CL)para); 
     511        awar_list->touch(); // trigger callback 
     512    } 
    430513 
    431514    return aws;