source: tags/old_import_filter/MERGE/MG_alignment.cxx

Last change on this file was 9797, checked in by westram, 11 years ago
  • reintegrated branch 'merge'
  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 12.2 KB
Line 
1// =============================================================== //
2//                                                                 //
3//   File      : MG_alignment.cxx                                  //
4//   Purpose   :                                                   //
5//                                                                 //
6//   Institute of Microbiology (Technical University Munich)       //
7//   http://www.arb-home.de/                                       //
8//                                                                 //
9// =============================================================== //
10
11#include "merge.hxx"
12
13#include <awt_sel_boxes.hxx>
14#include <aw_root.hxx>
15#include <aw_question.hxx>
16#include <aw_awar.hxx>
17#include <aw_msg.hxx>
18#include <aw_window.hxx>
19#include <arbdbt.h>
20#include <arb_strarray.h>
21
22#include <unistd.h>
23
24#define AWAR_ALI_NAME(db_nr) awar_name_tmp(db_nr, "alignment_name")
25#define AWAR_ALI_DEST(db_nr) awar_name_tmp(db_nr, "alignment_dest")
26#define AWAR_ALI_TYPE(db_nr) awar_name_tmp(db_nr, "alignment_type")
27#define AWAR_ALI_LEN(db_nr)  awar_name_tmp(db_nr, "alignment_len")
28#define AWAR_ALIGNED(db_nr)  awar_name_tmp(db_nr, "aligned")
29#define AWAR_SECURITY(db_nr) awar_name_tmp(db_nr, "security")
30
31#define AWAR_ALI_SRC AWAR_MERGE_TMP_SRC "alignment_name"
32#define AWAR_ALI_DST AWAR_MERGE_TMP_DST "alignment_name"
33
34static void MG_alignment_vars_callback(AW_root *aw_root, AW_CL db_nr) {
35    GBDATA         *gb_main = get_gb_main(db_nr);
36    GB_transaction  ta(gb_main);
37
38    char   *use      = aw_root->awar(AWAR_ALI_NAME(db_nr))->read_string();
39    GBDATA *ali_cont = GBT_get_alignment(gb_main, use);
40
41    if (!ali_cont) {
42        aw_root->awar(AWAR_ALI_TYPE(db_nr))->unmap();
43        aw_root->awar(AWAR_ALI_LEN (db_nr))->unmap();
44        aw_root->awar(AWAR_ALIGNED (db_nr))->unmap();
45        aw_root->awar(AWAR_SECURITY(db_nr))->unmap();
46    }
47    else {
48        GBDATA *ali_len      = GB_entry(ali_cont, "alignment_len");
49        GBDATA *ali_aligned  = GB_entry(ali_cont, "aligned");
50        GBDATA *ali_type     = GB_entry(ali_cont, "alignment_type");
51        GBDATA *ali_security = GB_entry(ali_cont, "alignment_write_security");
52
53        aw_root->awar(AWAR_ALI_TYPE(db_nr))->map(ali_type);
54        aw_root->awar(AWAR_ALI_LEN (db_nr))->map(ali_len);
55        aw_root->awar(AWAR_ALIGNED (db_nr))->map(ali_aligned);
56        aw_root->awar(AWAR_SECURITY(db_nr))->map(ali_security);
57
58    }
59    free(use);
60}
61
62
63void MG_create_alignment_awars(AW_root *aw_root, AW_default aw_def) {
64    for (int db_nr = 1; db_nr <= 2; ++db_nr) {
65        aw_root->awar_string(AWAR_ALI_NAME(db_nr), "", aw_def);
66        aw_root->awar_string(AWAR_ALI_DEST(db_nr), "", aw_def);
67        aw_root->awar_string(AWAR_ALI_TYPE(db_nr), "", aw_def);
68        aw_root->awar_int   (AWAR_ALI_LEN (db_nr), 0,  aw_def);
69        aw_root->awar_int   (AWAR_ALIGNED (db_nr), 0,  aw_def);
70        aw_root->awar_int   (AWAR_SECURITY(db_nr), 0,  aw_def);
71    }
72}
73
74int MG_copy_and_check_alignments(AW_window */*aww*/) {
75    // returns 0 if alignments are ok for merging.
76    // checks types and names.
77
78    GB_ERROR error = NULL;
79
80    GB_begin_transaction(GLOBAL_gb_dst);
81    GB_begin_transaction(GLOBAL_gb_src);
82
83    ConstStrArray names;
84    GBT_get_alignment_names(names, GLOBAL_gb_src);
85
86    GBDATA *gb_dst_presets = NULL;
87
88    for (int i = 0; names[i] && !error; ++i) {
89        const char *name       = names[i];
90        GBDATA     *gb_dst_ali = GBT_get_alignment(GLOBAL_gb_dst, name);
91
92        if (!gb_dst_ali) {
93            GB_clear_error(); // ignore "alignment not found"
94
95            GBDATA *gb_src_ali = GBT_get_alignment(GLOBAL_gb_src, name);
96            mg_assert(gb_src_ali);
97
98            if (!gb_dst_presets) gb_dst_presets = GBT_get_presets(GLOBAL_gb_dst);
99
100            gb_dst_ali = GB_create_container(gb_dst_presets, "alignment");
101            GB_copy(gb_dst_ali, gb_src_ali);
102            GBT_add_new_changekey(GLOBAL_gb_dst, (char *)GBS_global_string("%s/data", name), GB_STRING);
103        }
104
105        char *src_type = GBT_get_alignment_type_string(GLOBAL_gb_src, name);
106        char *dst_type = GBT_get_alignment_type_string(GLOBAL_gb_dst, name);
107
108        if (strcmp(src_type, dst_type) != 0) {
109            error = GBS_global_string("The alignments '%s' have different types (%s != %s)", name, src_type, dst_type);
110        }
111        free(dst_type);
112        free(src_type);
113    }
114
115    GB_commit_transaction(GLOBAL_gb_dst);
116    GB_commit_transaction(GLOBAL_gb_src);
117
118    if (error) aw_message(error);
119
120    return !!error;
121}
122
123static void MG_ad_al_delete_cb(AW_window *aww, AW_CL db_nr) {
124    if (aw_ask_sure("merge_delete_ali", "Are you sure to delete all data belonging to this alignment?")) {
125        GBDATA *gb_main = get_gb_main(db_nr);
126        char   *source  = aww->get_root()->awar(AWAR_ALI_NAME(db_nr))->read_string();
127        {
128            GB_transaction ta(gb_main);
129            GB_ERROR       error = GBT_rename_alignment(gb_main, source, 0, 0, 1);
130
131            error = ta.close(error);
132            if (error) aw_message(error);
133        }
134        free(source);
135    }
136}
137
138
139static void MG_ed_al_check_len_cb(AW_window *aww, AW_CL db_nr) {
140    GBDATA *gb_main = get_gb_main(db_nr);
141    char   *use     = aww->get_root()->awar(AWAR_ALI_NAME(db_nr))->read_string();
142
143    GB_transaction ta(gb_main);
144
145    GB_ERROR error = GBT_check_data(gb_main, use);
146    error          = ta.close(error);
147
148    aw_message_if(error);
149    free(use);
150}
151
152static void MG_copy_delete_rename(AW_window * aww, AW_CL db_nr, AW_CL dele) {
153    GBDATA *gb_main = get_gb_main(db_nr);
154
155    AW_root *awr    = aww->get_root();
156    char    *source = awr->awar(AWAR_ALI_NAME(db_nr))->read_string();
157    char    *dest   = awr->awar(AWAR_ALI_DEST(db_nr))->read_string();
158
159    GB_ERROR error = GB_begin_transaction(gb_main);
160
161    if (!error) error = GBT_rename_alignment(gb_main, source, dest, (int)1, (int)dele);
162    if (!error) error = GBT_add_new_changekey(gb_main, GBS_global_string("%s/data", dest), GB_STRING);
163
164    error = GB_end_transaction(gb_main, error);
165    aww->hide_or_notify(error);
166
167    free(source);
168    free(dest);
169}
170
171
172static AW_window *create_alignment_copy_window(AW_root *root, AW_CL db_nr)
173{
174    AW_window_simple *aws = new AW_window_simple;
175    char header[80];
176    sprintf(header, "ALIGNMENT COPY %li", db_nr);
177    aws->init(root, header, header);
178    aws->load_xfig("ad_al_si.fig");
179
180    aws->callback((AW_CB0)AW_POPDOWN);
181    aws->at("close");
182    aws->create_button("CLOSE", "CLOSE", "C");
183
184    aws->at("label");
185    aws->create_autosize_button(0, "Please enter the new name\nof the alignment");
186
187    aws->at("input");
188    aws->create_input_field(AWAR_ALI_DEST(db_nr), 15);
189
190    aws->at("ok");
191    aws->callback(MG_copy_delete_rename, db_nr, 0);
192    aws->create_button("GO", "GO", "G");
193
194    return (AW_window *)aws;
195}
196static AW_window *MG_create_alignment_rename_window(AW_root *root, AW_CL db_nr)
197{
198    AW_window_simple *aws = new AW_window_simple;
199    char header[80];
200    sprintf(header, "ALIGNMENT RENAME %li", db_nr);
201    aws->init(root, header, header);
202    aws->load_xfig("ad_al_si.fig");
203
204    aws->callback((AW_CB0)AW_POPDOWN);
205    aws->at("close");
206    aws->create_button("CLOSE", "CLOSE", "C");
207
208    aws->at("label");
209    aws->create_autosize_button(0, "Please enter the name\nof the new alignment");
210
211    aws->at("input");
212    aws->create_input_field(AWAR_ALI_DEST(db_nr), 15);
213
214    aws->at("ok");
215    aws->callback(MG_copy_delete_rename, db_nr, 1);
216    aws->create_button("GO", "GO", "G");
217
218    return (AW_window *)aws;
219}
220
221static void MG_aa_create_alignment(AW_window *aww, AW_CL db_nr) {
222    GBDATA   *gb_main      = get_gb_main(db_nr);
223    char     *name         = aww->get_root()->awar(AWAR_ALI_DEST(db_nr))->read_string();
224    GB_ERROR  error        = GB_begin_transaction(gb_main);
225    GBDATA   *gb_alignment = GBT_create_alignment(gb_main, name, 0, 0, 0, "dna");
226
227    if (!gb_alignment) error = GB_await_error();
228    GB_end_transaction_show_error(gb_main, error, aw_message);
229    free(name);
230}
231
232static AW_window *MG_create_alignment_create_window(AW_root *root, AW_CL db_nr) {
233    AW_window_simple *aws = new AW_window_simple;
234    char header[80];
235    sprintf(header, "ALIGNMENT CREATE %li", db_nr);
236    aws->init(root, header, header);
237    aws->load_xfig("ad_al_si.fig");
238
239    aws->callback((AW_CB0)AW_POPDOWN);
240    aws->at("close");
241    aws->create_button("CLOSE", "CLOSE", "C");
242
243    aws->at("label");
244    aws->create_autosize_button(0, "Please enter the new name\nof the alignment");
245
246    aws->at("input");
247    aws->create_input_field(AWAR_ALI_DEST(db_nr), 15);
248
249    aws->at("ok");
250    aws->callback(MG_aa_create_alignment, db_nr);
251    aws->create_button("GO", "GO", "G");
252
253    return (AW_window *)aws;
254}
255
256
257
258static AW_window *MG_create_alignment_window(AW_root *root, AW_CL db_nr) {
259    GBDATA           *gb_main = get_gb_main(db_nr);
260    AW_window_simple *aws = new AW_window_simple;
261    char              header[80];
262
263    sprintf(header, "ALIGNMENT CONTROL %li", db_nr);
264    aws->init(root, header, header);
265    aws->load_xfig("merge/ad_align.fig");
266
267    aws->callback((AW_CB0)AW_POPDOWN);
268    aws->at("close");
269    aws->create_button("CLOSE", "CLOSE", "C");
270
271    aws->callback(AW_POPUP_HELP, (AW_CL)"ad_align.hlp");
272    aws->at("help");
273    aws->create_button("HELP", "HELP", "H");
274
275    aws->button_length(13);
276
277    aws->at("list");
278    awt_create_selection_list_on_alignments(gb_main, aws, AWAR_ALI_NAME(db_nr), "*=");
279
280    aws->at("delete");
281    aws->callback(MG_ad_al_delete_cb, db_nr);
282    aws->create_button("DELETE", "DELETE", "D");
283
284    aws->at("rename");
285    aws->callback(AW_POPUP, (AW_CL)MG_create_alignment_rename_window, db_nr);
286    aws->create_button("RENAME", "RENAME", "R");
287
288    aws->at("create");
289    aws->callback(AW_POPUP, (AW_CL)MG_create_alignment_create_window, db_nr);
290    aws->create_button("CREATE", "CREATE", "N");
291
292    aws->at("copy");
293    aws->callback(AW_POPUP, (AW_CL)create_alignment_copy_window, db_nr);
294    aws->create_button("COPY", "COPY", "C");
295
296    aws->at("aligned");
297    aws->create_option_menu(AWAR_ALIGNED(db_nr));
298    aws->insert_option("justified", "j", 1);
299    aws->insert_default_option("not justified", "n", 0);
300    aws->update_option_menu();
301
302    aws->at("len");
303    aws->create_input_field(AWAR_ALI_LEN(db_nr), 8);
304
305    aws->at("type");
306    aws->create_option_menu(AWAR_ALI_TYPE(db_nr));
307    aws->insert_option("dna", "d", "dna");
308    aws->insert_option("rna", "r", "rna");
309    aws->insert_option("pro", "p", "ami");
310    aws->insert_default_option("???", "?", "usr");
311    aws->update_option_menu();
312
313    aws->at("security");
314    aws->callback(MG_ed_al_check_len_cb, db_nr);
315    aws->create_option_menu(AWAR_SECURITY(db_nr));
316    aws->insert_option("0", "0", 0);
317    aws->insert_option("1", "1", 1);
318    aws->insert_option("2", "2", 2);
319    aws->insert_option("3", "3", 3);
320    aws->insert_option("4", "4", 4);
321    aws->insert_option("5", "5", 5);
322    aws->insert_default_option("6", "6", 6);
323    aws->update_option_menu();
324
325    return aws;
326}
327
328AW_window *MG_merge_alignment_cb(AW_root *awr) {
329    static AW_window_simple *aws = 0;
330    if (aws) return (AW_window *)aws;
331
332    awr->awar(AWAR_ALI_SRC)->add_callback(MG_alignment_vars_callback, 1);
333    awr->awar(AWAR_ALI_DST)->add_callback(MG_alignment_vars_callback, 2);
334
335    aws = new AW_window_simple;
336    aws->init(awr, "MERGE_ALIGNMENTS", "MERGE ALIGNMENTS");
337    aws->load_xfig("merge/alignment.fig");
338
339    aws->at("close"); aws->callback((AW_CB0)AW_POPDOWN);
340    aws->create_button("CLOSE", "CLOSE", "C");
341
342    aws->at("help");
343    aws->callback(AW_POPUP_HELP, (AW_CL)"mg_alignment.hlp");
344    aws->create_button("HELP", "HELP", "H");
345
346    aws->at("check");
347    aws->callback((AW_CB1)MG_copy_and_check_alignments, 1);
348    aws->create_button("CHECK", "Check");
349
350    aws->at("ali1");
351    awt_create_selection_list_on_alignments(GLOBAL_gb_src, aws, AWAR_ALI_SRC, "*=");
352
353    aws->at("ali2");
354    awt_create_selection_list_on_alignments(GLOBAL_gb_dst, aws, AWAR_ALI_DST, "*=");
355
356    aws->at("modify1");
357    aws->callback(AW_POPUP, (AW_CL)MG_create_alignment_window, 1);
358    aws->create_button("MODIFY_DB1", "MODIFY");
359
360    aws->at("modify2");
361    aws->callback(AW_POPUP, (AW_CL)MG_create_alignment_window, 2);
362    aws->create_button("MODIFY_DB2", "MODIFY");
363
364
365    aws->button_length(0);
366    aws->shadow_width(1);
367    aws->at("icon");
368    aws->callback(AW_POPUP_HELP, (AW_CL)"mg_alignment.hlp");
369    aws->create_button("HELP_MERGE", "#merge/icon.xpm");
370
371    return aws;
372}
Note: See TracBrowser for help on using the repository browser.