source: tags/arb_5.3/GENOM/EXP_interface.cxx

Last change on this file was 6143, checked in by westram, 15 years ago
  • backport [6141] (parts changing code, but only strings and comments)
  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 19.7 KB
Line 
1//  ==================================================================== //
2//                                                                       //
3//    File      : EXP_interface.cxx                                      //
4//    Purpose   :                                                        //
5//                                                                       //
6//                                                                       //
7//  Coded by Ralf Westram (coder@reallysoft.de) in September 2001        //
8//  Copyright Department of Microbiology (Technical University Munich)   //
9//                                                                       //
10//  Visit our web site at: http://www.arb-home.de/                       //
11//                                                                       //
12//                                                                       //
13//  ==================================================================== //
14
15#include <awt.hxx>
16#include <awt_canvas.hxx>
17#include <awt_item_sel_list.hxx>
18#include <awt_sel_boxes.hxx>
19#include <arbdbt.h>
20#include <aw_awars.hxx>
21#include <db_scanner.hxx>
22
23#include "EXP.hxx"
24#include "EXP_interface.hxx"
25#include "EXP_local.hxx"
26
27#include "GEN.hxx"
28#include "GEN_local.hxx"
29#include "GEN_interface.hxx"
30
31#include "../NTREE/ad_spec.hxx"
32#include <../NTREE/nt_internal.h>
33
34#include <cstdlib>
35#include <cstring>
36
37using namespace std;
38
39extern GBDATA *GLOBAL_gb_main;
40
41#define AD_F_ALL (AW_active)(-1)
42
43GBDATA* EXP_get_current_experiment_data(GBDATA *gb_main, AW_root *aw_root) {
44    GBDATA *gb_species         = GEN_get_current_organism(gb_main, aw_root);
45    GBDATA *gb_experiment_data = 0;
46
47    if (gb_species) gb_experiment_data = EXP_get_experiment_data(gb_species);
48
49    return gb_experiment_data;
50}
51
52static void EXP_select_experiment(GBDATA* /*gb_main*/, AW_root *aw_root, const char *item_name) {
53    char *name  = strdup(item_name);
54    char *slash = strchr(name, '/');
55
56    if (slash) {
57        slash[0] = 0;
58        aw_root->awar(AWAR_ORGANISM_NAME)->write_string(name);
59        aw_root->awar(AWAR_EXPERIMENT_NAME)->write_string(slash+1);
60    }
61    free(name);
62}
63
64static char *EXP_get_experiment_id(GBDATA */*gb_main*/, GBDATA *gb_experiment) {
65    GBDATA *gb_species = GB_get_grandfather(gb_experiment);
66    return GBS_global_string_copy("%s/%s", GBT_read_name(gb_species), GBT_read_name(gb_experiment));
67}
68
69static GBDATA *EXP_find_experiment_by_id(GBDATA *gb_main, const char *id) {
70    char   *organism = strdup(id);
71    char   *exp     = strchr(organism, '/');
72    GBDATA *result   = 0;
73
74    if (exp) {
75        *exp++ = 0;
76        GBDATA *gb_organism = GEN_find_organism(gb_main, organism);
77        if (gb_organism) {
78            result = EXP_find_experiment(gb_organism, exp);
79        }
80    }
81
82    free(organism);
83    return result;   
84}
85
86static char *old_species_marks = 0; // configuration storing marked species
87
88// extern "C" {
89//     typedef  GB_ERROR (*species_callback)(GBDATA *gb_species, int *clientdata);
90//     GB_ERROR GBT_with_stored_species(GBDATA *gb_main, const char *stored, species_callback doit, int *clientdata);
91// }
92
93inline void exp_restore_old_species_marks() {
94    if (old_species_marks) {
95        GBT_restore_marked_species(GLOBAL_gb_main, old_species_marks);
96        freeset(old_species_marks, 0);
97    }
98}
99
100static GBDATA *EXP_get_first_experiment_data(GBDATA *gb_main, AW_root *aw_root, AWT_QUERY_RANGE range) {
101    GBDATA   *gb_organism = 0;
102    GB_ERROR  error      = 0;
103
104    exp_restore_old_species_marks();
105
106    switch (range) {
107        case AWT_QUERY_CURRENT_SPECIES: {
108            char *species_name = aw_root->awar(AWAR_ORGANISM_NAME)->read_string();
109            gb_organism         = GBT_find_species(gb_main, species_name);
110            free(species_name);
111            break;
112        }
113        case AWT_QUERY_MARKED_SPECIES: {
114            GBDATA *gb_pseudo = GEN_first_marked_pseudo_species(gb_main);
115
116            if (gb_pseudo) {    // there are marked pseudo-species..
117                old_species_marks = GBT_store_marked_species(gb_main, 1); // store and unmark marked species
118                error             = GBT_with_stored_species(gb_main, old_species_marks, GEN_mark_organism_or_corresponding_organism, 0); // mark organisms related with stored
119
120                if (!error) gb_organism = GEN_first_marked_organism(gb_main);
121            }
122            else {
123                gb_organism = GEN_first_marked_organism(gb_main);
124            }
125
126            break;
127        }
128        case AWT_QUERY_ALL_SPECIES: {
129            gb_organism = GBT_first_species(gb_main);
130            break;
131        }
132        default: {
133            gen_assert(0);
134            break;
135        }
136    }
137
138    if (error) GB_export_error(error);
139    return gb_organism ? EXP_get_experiment_data(gb_organism) : 0;
140}
141
142static GBDATA *EXP_get_next_experiment_data(GBDATA *gb_experiment_data, AWT_QUERY_RANGE range) {
143    GBDATA *gb_organism = 0;
144    switch (range) {
145        case AWT_QUERY_CURRENT_SPECIES: {
146            break;
147        }
148        case AWT_QUERY_MARKED_SPECIES: {
149            GBDATA *gb_last_species = GB_get_father(gb_experiment_data);
150            gb_organism             = GEN_next_marked_organism(gb_last_species);
151
152            if (!gb_organism) exp_restore_old_species_marks(); // got all -> clean up
153
154            break;
155        }
156        case AWT_QUERY_ALL_SPECIES: {
157            GBDATA *gb_last_species = GB_get_father(gb_experiment_data);
158            gb_organism             = GBT_next_species(gb_last_species);
159            break;
160        }
161        default: {
162            gen_assert(0);
163            break;
164        }
165    }
166
167    return gb_organism ? EXP_get_experiment_data(gb_organism) : 0;
168}
169
170struct ad_item_selector EXP_item_selector = {
171    AWT_QUERY_ITEM_EXPERIMENTS,
172    EXP_select_experiment,
173    EXP_get_experiment_id,
174    EXP_find_experiment_by_id,
175    (AW_CB)awt_experiment_field_selection_list_update_cb,
176    -1, // unknown
177    CHANGE_KEY_PATH_EXPERIMENTS,
178    "experiment",
179    "experiments",
180    "name", 
181    EXP_get_first_experiment_data,
182    EXP_get_next_experiment_data,
183    EXP_first_experiment_rel_exp_data,
184    EXP_next_experiment,
185    EXP_get_current_experiment,
186    &AWT_organism_selector, GB_get_grandfather, 
187};
188
189ad_item_selector *EXP_get_selector() { return &EXP_item_selector; }
190
191GBDATA *EXP_get_current_experiment(GBDATA *gb_main, AW_root *aw_root) {
192    GBDATA *gb_organism    = GEN_get_current_organism(gb_main, aw_root);
193    GBDATA *gb_experiment = 0;
194
195    if (gb_organism) {
196        char *experiment_name = aw_root->awar(AWAR_EXPERIMENT_NAME)->read_string();
197        gb_experiment         = EXP_find_experiment(gb_organism,experiment_name);
198        free(experiment_name);
199    }
200
201    return gb_experiment;
202}
203
204static AW_CL    ad_global_scannerid   = 0;
205static AW_root *ad_global_scannerroot = 0;
206AW_CL           experiment_query_global_cbs = 0;
207
208AW_window *EXP_create_experiment_query_window(AW_root *aw_root) {
209
210    static AW_window_simple_menu *aws = 0;
211    if (aws){
212        return (AW_window *)aws;
213    }
214    aws = new AW_window_simple_menu;
215    aws->init( aw_root, "EXPERIMENT_QUERY", "Experiment SEARCH and QUERY");
216    aws->create_menu("More functions","f");
217    aws->load_xfig("ad_query.fig");
218
219    awt_query_struct awtqs;
220
221    awtqs.gb_main             = GLOBAL_gb_main;
222    awtqs.species_name        = AWAR_SPECIES_NAME;
223    awtqs.tree_name           = AWAR_TREE;
224    //     awtqs.query_genes  = true;
225    //     awtqs.gene_name    = AWAR_GENE_NAME;
226    awtqs.select_bit          = 1;
227    awtqs.use_menu            = 1;
228    awtqs.ere_pos_fig         = "ere3";
229    awtqs.where_pos_fig       = "where3";
230    awtqs.by_pos_fig          = "by3";
231    awtqs.qbox_pos_fig        = "qbox";
232    awtqs.rescan_pos_fig      = 0;
233    awtqs.key_pos_fig         = 0;
234    awtqs.query_pos_fig       = "content";
235    awtqs.result_pos_fig      = "result";
236    awtqs.count_pos_fig       = "count";
237    awtqs.do_query_pos_fig    = "doquery";
238    awtqs.config_pos_fig      = "doconfig";
239    awtqs.do_mark_pos_fig     = "domark";
240    awtqs.do_unmark_pos_fig   = "dounmark";
241    awtqs.do_delete_pos_fig   = "dodelete";
242    awtqs.do_set_pos_fig      = "doset";
243    awtqs.do_refresh_pos_fig  = "dorefresh";
244    awtqs.open_parser_pos_fig = "openparser";
245    awtqs.create_view_window  = (AW_CL)EXP_create_experiment_window;
246    awtqs.selector            = &EXP_item_selector;
247
248    AW_CL cbs                   = (AW_CL)awt_create_query_box((AW_window*)aws, &awtqs, "exp");
249    experiment_query_global_cbs = cbs;
250
251    aws->create_menu("More search",     "s" );
252    aws->insert_menu_topic("exp_search_equal_fields_within_db","Search For Equal Fields and Mark Duplicates",               "E", "search_duplicates.hlp", AWM_ALL, (AW_CB)awt_search_equal_entries, cbs, 0);
253    aws->insert_menu_topic("exp_search_equal_words_within_db", "Search For Equal Words Between Fields and Mark Duplicates", "W", "search_duplicates.hlp", AWM_ALL, (AW_CB)awt_search_equal_entries, cbs, 1);
254
255    aws->button_length(7);
256
257    aws->at("close");
258    aws->callback( (AW_CB0)AW_POPDOWN);
259    aws->create_button("CLOSE","CLOSE","C");
260    aws->at("help");
261    aws->callback( AW_POPUP_HELP,(AW_CL)"experiment_search.hlp");
262    aws->create_button("HELP","HELP","H");
263
264    return (AW_window *)aws;
265
266}
267
268void experiment_delete_cb(AW_window *aww){
269    if (aw_ask_sure("Are you sure to delete the experiment")) {
270        GB_transaction  ta(GLOBAL_gb_main);
271        GB_ERROR        error         = 0;
272        GBDATA         *gb_experiment = EXP_get_current_experiment(GLOBAL_gb_main, aww->get_root());
273
274        error = gb_experiment ? GB_delete(gb_experiment) : "Please select a experiment first";
275        if (error) {
276            error = ta.close(error);
277            aw_message(error);
278        }
279    }
280}
281
282void experiment_create_cb(AW_window *aww) {
283    AW_root  *aw_root = aww->get_root();
284    char     *dest    = aw_root->awar(AWAR_EXPERIMENT_DEST)->read_string();
285    GB_ERROR  error   = GB_begin_transaction(GLOBAL_gb_main);
286
287    if (!error) {
288        GBDATA *gb_experiment_data = EXP_get_current_experiment_data(GLOBAL_gb_main, aw_root);
289
290        if (!gb_experiment_data) {
291            error = "Please select a species";
292        }
293        else {
294            GBDATA *gb_dest = EXP_find_experiment_rel_exp_data(gb_experiment_data, dest);
295
296            if (gb_dest) {
297                error  = GB_export_errorf("Experiment '%s' already exists", dest);
298            }
299            else {
300                gb_dest             = EXP_find_or_create_experiment_rel_exp_data(gb_experiment_data, dest);
301                if (!gb_dest) error = GB_await_error();
302                else aww->get_root()->awar(AWAR_EXPERIMENT_NAME)->write_string(dest);
303            }
304        }
305    }
306   
307    GB_end_transaction_show_error(GLOBAL_gb_main, error, aw_message);
308    free(dest);
309}
310
311void experiment_rename_cb(AW_window *aww){
312    AW_root *aw_root = aww->get_root();
313    char    *source  = aw_root->awar(AWAR_EXPERIMENT_NAME)->read_string();
314    char    *dest    = aw_root->awar(AWAR_EXPERIMENT_DEST)->read_string();
315
316    if (strcmp(source, dest) != 0) {
317        GB_ERROR error = GB_begin_transaction(GLOBAL_gb_main);
318
319        if (!error) {
320            GBDATA *gb_experiment_data = EXP_get_current_experiment_data(GLOBAL_gb_main, aww->get_root());
321
322            if (!gb_experiment_data) error = "Please select a species first";
323            else {
324                GBDATA *gb_source = EXP_find_experiment_rel_exp_data(gb_experiment_data, source);
325                GBDATA *gb_dest   = EXP_find_experiment_rel_exp_data(gb_experiment_data, dest);
326
327                if (!gb_source) error   = "Please select an experiment";
328                else if (gb_dest) error = GB_export_errorf("Experiment '%s' already exists", dest);
329                else {
330                    GBDATA *gb_name     = GB_search(gb_source, "name", GB_STRING);
331                    if (!gb_name) error = GB_await_error();
332                    else {
333                        error = GB_write_string(gb_name, dest);
334                        if (!error) aww->get_root()->awar(AWAR_EXPERIMENT_NAME)->write_string(dest);
335                    }
336                }
337            }
338        }
339        error = GB_end_transaction(GLOBAL_gb_main, error);
340        aww->hide_or_notify(error);
341    }
342
343    free(source);
344    free(dest);
345}
346
347void experiment_copy_cb(AW_window *aww) {
348    char     *source = aww->get_root()->awar(AWAR_EXPERIMENT_NAME)->read_string();
349    char     *dest   = aww->get_root()->awar(AWAR_EXPERIMENT_DEST)->read_string();
350    GB_ERROR  error  = GB_begin_transaction(GLOBAL_gb_main);
351
352    if (!error) {
353        GBDATA *gb_experiment_data = EXP_get_current_experiment_data(GLOBAL_gb_main, aww->get_root());
354
355        if (!gb_experiment_data) {
356            error = "Please select a species first.";
357        }
358        else {
359            GBDATA *gb_source = EXP_find_experiment_rel_exp_data(gb_experiment_data, source);
360            GBDATA *gb_dest   = EXP_find_experiment_rel_exp_data(gb_experiment_data, dest);
361
362            if (!gb_source) error   = "Please select a experiment";
363            else if (gb_dest) error = GB_export_errorf("Experiment '%s' already exists", dest);
364            else {
365                gb_dest             = GB_create_container(gb_experiment_data,"experiment");
366                if (!gb_dest) error = GB_await_error();
367                else error          = GB_copy(gb_dest, gb_source);
368
369                if (!error) {
370                    error = GBT_write_string(gb_dest, "name", dest);
371                    if (!error) aww->get_root()->awar(AWAR_EXPERIMENT_NAME)->write_string(dest);
372                }
373            }
374        }
375    }
376
377    error = GB_end_transaction(GLOBAL_gb_main, error);
378    aww->hide_or_notify(error);
379   
380    free(source);
381    free(dest);
382}
383
384AW_window *create_experiment_rename_window(AW_root *root)
385{
386    AW_window_simple *aws = new AW_window_simple;
387    aws->init( root, "RENAME_EXPERIMENT", "EXPERIMENT RENAME");
388    aws->load_xfig("ad_al_si.fig");
389
390    aws->callback( (AW_CB0)AW_POPDOWN);
391    aws->at("close");
392    aws->create_button("CLOSE","CLOSE","C");
393
394    aws->at("label");
395    aws->create_autosize_button(0,"Please enter the new name\nof the experiment");
396
397    aws->at("input");
398    aws->create_input_field(AWAR_EXPERIMENT_DEST,15);
399    aws->at("ok");
400    aws->callback(experiment_rename_cb);
401    aws->create_button("GO","GO","G");
402
403    return (AW_window *)aws;
404}
405
406AW_window *create_experiment_copy_window(AW_root *root)
407{
408    AW_window_simple *aws = new AW_window_simple;
409    aws->init( root, "COPY_EXPERIMENT", "EXPERIMENT COPY");
410    aws->load_xfig("ad_al_si.fig");
411
412    aws->callback( (AW_CB0)AW_POPDOWN);
413    aws->at("close");
414    aws->create_button("CLOSE","CLOSE","C");
415
416    aws->at("label");
417    aws->create_autosize_button(0,"Please enter the name\nof the new experiment");
418
419    aws->at("input");
420    aws->create_input_field(AWAR_EXPERIMENT_DEST,15);
421
422    aws->at("ok");
423    aws->callback(experiment_copy_cb);
424    aws->create_button("GO","GO","G");
425
426    return (AW_window *)aws;
427}
428
429AW_window *create_experiment_create_window(AW_root *root)
430{
431    AW_window_simple *aws = new AW_window_simple;
432    aws->init( root, "CREATE_EXPERIMENT","EXPERIMENT CREATE");
433    aws->load_xfig("ad_al_si.fig");
434
435    aws->callback( (AW_CB0)AW_POPDOWN);
436    aws->at("close");
437    aws->create_button("CLOSE","CLOSE","C");
438
439    aws->at("label"); aws->create_autosize_button(0,"Please enter the name\nof the new experiment");
440    aws->at("input"); aws->create_input_field(AWAR_EXPERIMENT_DEST,15);
441
442    aws->at("ok");
443    aws->callback(experiment_create_cb);
444    aws->create_button("GO","GO","G");
445
446    return (AW_window *)aws;
447}
448
449void EXP_map_experiment(AW_root *aw_root, AW_CL scannerid)
450{
451    GB_transaction  dummy(GLOBAL_gb_main);
452    GBDATA         *gb_experiment = EXP_get_current_experiment(GLOBAL_gb_main, aw_root);
453
454    if (gb_experiment) awt_map_arbdb_scanner(scannerid, gb_experiment, 0, CHANGE_KEY_PATH_EXPERIMENTS);
455}
456
457void EXP_create_field_items(AW_window *aws) {
458    aws->insert_menu_topic("exp_reorder_fields", "Reorder fields ...",    "R", "spaf_reorder.hlp", AD_F_ALL, AW_POPUP, (AW_CL)NT_create_ad_list_reorder, (AW_CL)&EXP_item_selector); 
459    aws->insert_menu_topic("exp_delete_field",   "Delete/Hide Field ...", "D", "spaf_delete.hlp",  AD_F_ALL, AW_POPUP, (AW_CL)NT_create_ad_field_delete, (AW_CL)&EXP_item_selector); 
460    aws->insert_menu_topic("exp_create_field",   "Create fields ...",     "C", "spaf_create.hlp",  AD_F_ALL, AW_POPUP, (AW_CL)NT_create_ad_field_create, (AW_CL)&EXP_item_selector); 
461    aws->insert_separator();
462    aws->insert_menu_topic("exp_unhide_fields", "Show all hidden fields", "S", "scandb.hlp", AD_F_ALL, (AW_CB)awt_experiment_field_selection_list_unhide_all_cb, (AW_CL)GLOBAL_gb_main, AWT_NDS_FILTER); 
463    aws->insert_separator();
464    aws->insert_menu_topic("exp_scan_unknown_fields", "Scan unknown fields",   "u", "scandb.hlp", AD_F_ALL, (AW_CB)awt_experiment_field_selection_list_scan_unknown_cb,  (AW_CL)GLOBAL_gb_main, AWT_NDS_FILTER); 
465    aws->insert_menu_topic("exp_del_unused_fields",   "Remove unused fields",  "e", "scandb.hlp", AD_F_ALL, (AW_CB)awt_experiment_field_selection_list_delete_unused_cb, (AW_CL)GLOBAL_gb_main, AWT_NDS_FILTER); 
466    aws->insert_menu_topic("exp_refresh_fields",      "Refresh fields (both)", "f", "scandb.hlp", AD_F_ALL, (AW_CB)awt_experiment_field_selection_list_update_cb,        (AW_CL)GLOBAL_gb_main, AWT_NDS_FILTER); 
467}
468
469AW_window *EXP_create_experiment_window(AW_root *aw_root) {
470    static AW_window_simple_menu *aws = 0;
471    if (aws) return (AW_window *)aws;
472
473    aws = new AW_window_simple_menu;
474    aws->init( aw_root, "EXPERIMENT_INFORMATION", "EXPERIMENT INFORMATION");
475    aws->load_xfig("ad_spec.fig");
476
477    aws->button_length(8);
478
479    aws->at("close");
480    aws->callback( (AW_CB0)AW_POPDOWN);
481    aws->create_button("CLOSE","CLOSE","C");
482
483    aws->at("search");
484    aws->callback(AW_POPUP, (AW_CL)EXP_create_experiment_query_window, 0);
485    aws->create_button("SEARCH","SEARCH","S");
486
487    aws->at("help");
488    aws->callback(AW_POPUP_HELP, (AW_CL)"experiment_info.hlp");
489    aws->create_button("HELP","HELP","H");
490
491
492    AW_CL scannerid       = awt_create_arbdb_scanner(GLOBAL_gb_main, aws, "box",0,"field","enable",AWT_VIEWER,0,"mark",AWT_NDS_FILTER, &EXP_item_selector);
493    ad_global_scannerid   = scannerid;
494    ad_global_scannerroot = aws->get_root();
495
496    aws->create_menu("EXPERIMENT",     "E", "spa_experiment.hlp",  AD_F_ALL );
497    aws->insert_menu_topic("experiment_delete", "Delete",     "D","spa_delete.hlp",       AD_F_ALL,   (AW_CB)experiment_delete_cb, 0, 0);
498    aws->insert_menu_topic("experiment_rename", "Rename ...", "R","spa_rename.hlp",   AD_F_ALL,   AW_POPUP, (AW_CL)create_experiment_rename_window, 0);
499    aws->insert_menu_topic("experiment_copy",   "Copy ...",   "y","spa_copy.hlp",         AD_F_ALL,   AW_POPUP, (AW_CL)create_experiment_copy_window, 0);
500    aws->insert_menu_topic("experiment_create", "Create ...", "C","spa_create.hlp",   AD_F_ALL,   AW_POPUP, (AW_CL)create_experiment_create_window, 0);
501    aws->insert_separator();
502
503    aws->create_menu("FIELDS",     "F", "experiment_fields.hlp",  AD_F_ALL );
504    EXP_create_field_items(aws);
505
506    {
507        Awar_Callback_Info    *cb_info     = new Awar_Callback_Info(aws->get_root(), AWAR_EXPERIMENT_NAME, EXP_map_experiment, scannerid); // do not delete!
508        AW_detach_information *detach_info = new AW_detach_information(cb_info); // do not delete!
509        cb_info->add_callback();
510
511        aws->at("detach");
512        aws->callback(NT_detach_information_window, (AW_CL)&aws, (AW_CL)cb_info);
513        aws->create_button("DETACH", "DETACH", "D");
514
515        detach_info->set_detach_button(aws->get_last_widget());
516    }
517
518    //     aws->get_root()->awar(AWAR_EXPERIMENT_NAME)->add_callback(EXP_map_experiment,scannerid);
519
520    aws->show();
521    EXP_map_experiment(aws->get_root(),scannerid);
522    return (AW_window *)aws;
523}
524
525void EXP_popup_experiment_window(AW_window *aww, AW_CL, AW_CL) {
526    AW_window *aws = EXP_create_experiment_window(aww->get_root());
527    aws->activate();
528}
529
Note: See TracBrowser for help on using the repository browser.