source: tags/arb-6.0.5/MERGE/MG_alignment.cxx

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