1 | #include <stdio.h> |
---|
2 | #include <stdlib.h> |
---|
3 | #include <unistd.h> |
---|
4 | #include <string.h> |
---|
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 <awt.hxx> |
---|
11 | #include <awt_sel_boxes.hxx> |
---|
12 | #include "merge.hxx" |
---|
13 | |
---|
14 | #define AWAR1 "tmp/merge1/" |
---|
15 | #define AWAR2 "tmp/merge2/" |
---|
16 | #define AWAR_ALI1 AWAR1"alignment_name" |
---|
17 | #define AWAR_ALI2 AWAR2"alignment_name" |
---|
18 | |
---|
19 | void MG_alignment_vars_callback(AW_root *aw_root,GBDATA *gbd, long ali_nr) |
---|
20 | { |
---|
21 | char buffer[256]; |
---|
22 | |
---|
23 | GB_push_transaction(gbd); |
---|
24 | sprintf(buffer,"tmp/merge%li/alignment_name",ali_nr); |
---|
25 | char *use = aw_root->awar(buffer)->read_string(); |
---|
26 | GBDATA *ali_cont = GBT_get_alignment(gbd,use); |
---|
27 | if (!ali_cont) { |
---|
28 | sprintf(buffer,"tmp/merge%li/alignment_type",ali_nr); |
---|
29 | aw_root->awar(buffer)->unmap(); |
---|
30 | |
---|
31 | sprintf(buffer,"tmp/merge%li/alignment_len",ali_nr); |
---|
32 | aw_root->awar(buffer)->unmap(); |
---|
33 | |
---|
34 | sprintf(buffer,"tmp/merge%li/aligned",ali_nr); |
---|
35 | aw_root->awar(buffer)->unmap(); |
---|
36 | |
---|
37 | sprintf(buffer,"tmp/merge%li/security",ali_nr); |
---|
38 | aw_root->awar(buffer)->unmap(); |
---|
39 | }else{ |
---|
40 | |
---|
41 | GBDATA *ali_len = GB_entry(ali_cont,"alignment_len"); |
---|
42 | GBDATA *ali_aligned = GB_entry(ali_cont,"aligned"); |
---|
43 | GBDATA *ali_type = GB_entry(ali_cont,"alignment_type"); |
---|
44 | GBDATA *ali_security = GB_entry(ali_cont,"alignment_write_security"); |
---|
45 | |
---|
46 | sprintf(buffer,"tmp/merge%li/alignment_type",ali_nr); |
---|
47 | aw_root->awar(buffer)->map(ali_type); |
---|
48 | |
---|
49 | sprintf(buffer,"tmp/merge%li/alignment_len",ali_nr); |
---|
50 | aw_root->awar(buffer)->map(ali_len); |
---|
51 | |
---|
52 | sprintf(buffer,"tmp/merge%li/aligned",ali_nr); |
---|
53 | aw_root->awar(buffer)->map(ali_aligned); |
---|
54 | |
---|
55 | sprintf(buffer,"tmp/merge%li/security",ali_nr); |
---|
56 | aw_root->awar(buffer)->map(ali_security); |
---|
57 | |
---|
58 | } |
---|
59 | GB_pop_transaction(gbd); |
---|
60 | free(use); |
---|
61 | } |
---|
62 | |
---|
63 | |
---|
64 | void MG_create_alignment_awars(AW_root *aw_root,AW_default aw_def) |
---|
65 | { |
---|
66 | aw_root->awar_string( AWAR_ALI1, "" , aw_def); |
---|
67 | aw_root->awar_string( AWAR_ALI2, "" , aw_def); |
---|
68 | |
---|
69 | aw_root->awar_string( AWAR1"alignment_dest", "" , aw_def); |
---|
70 | aw_root->awar_string( AWAR2"alignment_dest", "" , aw_def); |
---|
71 | aw_root->awar_string( AWAR1"alignment_type", "" , aw_def); |
---|
72 | aw_root->awar_string( AWAR2"alignment_type", "" , aw_def); |
---|
73 | aw_root->awar_int( AWAR1"alignment_len", 0 , aw_def); |
---|
74 | aw_root->awar_int( AWAR2"alignment_len", 0 , aw_def); |
---|
75 | aw_root->awar_int( AWAR1"aligned", 0 , aw_def); |
---|
76 | aw_root->awar_int( AWAR2"aligned", 0 , aw_def); |
---|
77 | aw_root->awar_int( AWAR1"security", 0 , aw_def); |
---|
78 | aw_root->awar_int( AWAR2"security", 0 , aw_def); |
---|
79 | |
---|
80 | } |
---|
81 | |
---|
82 | int MG_check_alignment(AW_window *aww,int fast) |
---|
83 | { |
---|
84 | AWUSE(aww); |
---|
85 | // check type and names !!!! |
---|
86 | char result[1024]; |
---|
87 | result[0] = 0; |
---|
88 | if (!fast){ |
---|
89 | aw_openstatus("Checking alignments"); |
---|
90 | sleep(1); |
---|
91 | } |
---|
92 | GB_begin_transaction(GLOBAL_gb_dest); |
---|
93 | GB_begin_transaction(GLOBAL_gb_merge); |
---|
94 | char **names = GBT_get_alignment_names(GLOBAL_gb_merge); |
---|
95 | char **name; |
---|
96 | GBDATA *gb_ali1; |
---|
97 | GBDATA *gb_ali2; |
---|
98 | GBDATA *gb_presets2; |
---|
99 | |
---|
100 | for (name = names; *name; name++) { |
---|
101 | if (! (gb_ali2 = GBT_get_alignment(GLOBAL_gb_dest,*name)) ) { |
---|
102 | gb_ali1 = GBT_get_alignment(GLOBAL_gb_merge,*name); |
---|
103 | gb_presets2 = GB_search(GLOBAL_gb_dest,"presets",GB_CREATE_CONTAINER); |
---|
104 | gb_ali2 = GB_create_container(gb_presets2,"alignment"); |
---|
105 | GB_copy(gb_ali2,gb_ali1); |
---|
106 | GBT_add_new_changekey( GLOBAL_gb_dest, (char *)GBS_global_string("%s/data",*name),GB_STRING); |
---|
107 | } |
---|
108 | char *type1 = GBT_get_alignment_type_string(GLOBAL_gb_merge,*name); |
---|
109 | char *type2 = GBT_get_alignment_type_string(GLOBAL_gb_dest,*name); |
---|
110 | if (strcmp(type1,type2)) { |
---|
111 | sprintf(result,"The alignments '%s' have different types (%s != %s)", *name,type1,type2); |
---|
112 | break; |
---|
113 | } |
---|
114 | delete(type1); |
---|
115 | delete(type2); |
---|
116 | } |
---|
117 | GBT_free_names(names); |
---|
118 | GB_commit_transaction(GLOBAL_gb_dest); |
---|
119 | GB_commit_transaction(GLOBAL_gb_merge); |
---|
120 | if (strlen(result)) aw_message(result); |
---|
121 | if (!fast){ |
---|
122 | aw_closestatus(); |
---|
123 | } |
---|
124 | return strlen(result); |
---|
125 | } |
---|
126 | |
---|
127 | void MG_ad_al_delete_cb(AW_window *aww,AW_CL db_nr) |
---|
128 | { |
---|
129 | if (aw_ask_sure("Are you sure to delete all data belonging to this alignment?")) { |
---|
130 | char buffer[256]; |
---|
131 | sprintf(buffer,"tmp/merge%li/alignment_name",db_nr); |
---|
132 | |
---|
133 | GBDATA *gbd = (db_nr == 1) ? GLOBAL_gb_merge : GLOBAL_gb_dest; |
---|
134 | char *source = aww->get_root()->awar(buffer)->read_string(); |
---|
135 | { |
---|
136 | GB_transaction ta(gbd); |
---|
137 | GB_ERROR error = GBT_rename_alignment(gbd,source,0,0,1); |
---|
138 | |
---|
139 | if (error) { |
---|
140 | error = ta.close(error); |
---|
141 | aw_message(error); |
---|
142 | } |
---|
143 | } |
---|
144 | free(source); |
---|
145 | } |
---|
146 | } |
---|
147 | |
---|
148 | |
---|
149 | void MG_ed_al_check_len_cb(AW_window *aww,AW_CL db_nr) |
---|
150 | { |
---|
151 | char *error = 0; |
---|
152 | char buffer[256]; |
---|
153 | sprintf(buffer,"tmp/merge%li/alignment_name",db_nr); |
---|
154 | |
---|
155 | GBDATA *gbd = (db_nr == 1) ? GLOBAL_gb_merge : GLOBAL_gb_dest; |
---|
156 | char *use = aww->get_root()->awar(buffer)->read_string(); |
---|
157 | |
---|
158 | GB_begin_transaction(gbd); |
---|
159 | if (!error) error = (char *)GBT_check_data(gbd,use); |
---|
160 | GB_commit_transaction(gbd); |
---|
161 | if (error) aw_message(error); |
---|
162 | delete use; |
---|
163 | } |
---|
164 | |
---|
165 | void MG_copy_delete_rename(AW_window * aww, AW_CL db_nr, AW_CL dele) |
---|
166 | { |
---|
167 | GBDATA *gbd = (db_nr == 1) ? GLOBAL_gb_merge : GLOBAL_gb_dest; |
---|
168 | char *source = aww->get_root()->awar(GBS_global_string("tmp/merge%li/alignment_name", db_nr))->read_string(); |
---|
169 | char *dest = aww->get_root()->awar(GBS_global_string("tmp/merge%li/alignment_dest", db_nr))->read_string(); |
---|
170 | GB_ERROR error = GB_begin_transaction(gbd); |
---|
171 | |
---|
172 | if (!error) error = GBT_rename_alignment(gbd, source, dest, (int)1, (int)dele); |
---|
173 | if (!error) error = GBT_add_new_changekey(gbd, GBS_global_string("%s/data", dest), GB_STRING); |
---|
174 | |
---|
175 | error = GB_end_transaction(gbd, error); |
---|
176 | aww->hide_or_notify(error); |
---|
177 | |
---|
178 | free(source); |
---|
179 | free(dest); |
---|
180 | } |
---|
181 | |
---|
182 | |
---|
183 | AW_window *create_alignment_copy_window(AW_root *root,AW_CL db_nr) |
---|
184 | { |
---|
185 | AW_window_simple *aws = new AW_window_simple; |
---|
186 | char header[80]; |
---|
187 | sprintf(header,"ALIGNMENT COPY %li",db_nr); |
---|
188 | aws->init( root, header, header); |
---|
189 | aws->load_xfig("ad_al_si.fig"); |
---|
190 | |
---|
191 | aws->callback( (AW_CB0)AW_POPDOWN); |
---|
192 | aws->at("close"); |
---|
193 | aws->create_button("CLOSE","CLOSE","C"); |
---|
194 | |
---|
195 | aws->at("label"); |
---|
196 | aws->create_autosize_button(0,"Please enter the new name\nof the alignment"); |
---|
197 | |
---|
198 | aws->at("input"); |
---|
199 | char buffer[256]; |
---|
200 | sprintf(buffer,"tmp/merge%li/alignment_dest",db_nr); |
---|
201 | aws->create_input_field(buffer,15); |
---|
202 | |
---|
203 | aws->at("ok"); |
---|
204 | aws->callback(MG_copy_delete_rename,db_nr,0); |
---|
205 | aws->create_button("GO","GO","G"); |
---|
206 | |
---|
207 | return (AW_window *)aws; |
---|
208 | } |
---|
209 | AW_window *MG_create_alignment_rename_window(AW_root *root,AW_CL db_nr) |
---|
210 | { |
---|
211 | AW_window_simple *aws = new AW_window_simple; |
---|
212 | char header[80]; |
---|
213 | sprintf(header,"ALIGNMENT RENAME %li",db_nr); |
---|
214 | aws->init( root, header,header); |
---|
215 | aws->load_xfig("ad_al_si.fig"); |
---|
216 | |
---|
217 | aws->callback( (AW_CB0)AW_POPDOWN); |
---|
218 | aws->at("close"); |
---|
219 | aws->create_button("CLOSE","CLOSE","C"); |
---|
220 | |
---|
221 | aws->at("label"); |
---|
222 | aws->create_autosize_button(0,"Please enter the name\nof the new alignment"); |
---|
223 | |
---|
224 | aws->at("input"); |
---|
225 | char buffer[256]; |
---|
226 | sprintf(buffer,"tmp/merge%li/alignment_dest",db_nr); |
---|
227 | aws->create_input_field(buffer,15); |
---|
228 | |
---|
229 | aws->at("ok"); |
---|
230 | aws->callback(MG_copy_delete_rename,db_nr,1); |
---|
231 | aws->create_button("GO","GO","G"); |
---|
232 | |
---|
233 | return (AW_window *)aws; |
---|
234 | } |
---|
235 | |
---|
236 | void MG_aa_create_alignment(AW_window *aww,AW_CL db_nr) |
---|
237 | { |
---|
238 | GBDATA *gbd = (db_nr == 1) ? GLOBAL_gb_merge : GLOBAL_gb_dest; |
---|
239 | const char *name_field = GBS_global_string("tmp/merge%li/alignment_dest", db_nr); |
---|
240 | char *name = aww->get_root()->awar(name_field)->read_string(); |
---|
241 | GB_ERROR error = GB_begin_transaction(gbd); |
---|
242 | GBDATA *gb_alignment = GBT_create_alignment(gbd,name,0,0,0,"dna"); |
---|
243 | |
---|
244 | if (!gb_alignment) error = GB_await_error(); |
---|
245 | GB_end_transaction_show_error(gbd, error, aw_message); |
---|
246 | free(name); |
---|
247 | } |
---|
248 | |
---|
249 | AW_window *MG_create_alignment_create_window(AW_root *root,AW_CL db_nr) |
---|
250 | { |
---|
251 | AW_window_simple *aws = new AW_window_simple; |
---|
252 | char header[80]; |
---|
253 | sprintf(header,"ALIGNMENT CREATE %li",db_nr); |
---|
254 | aws->init( root, header,header); |
---|
255 | aws->load_xfig("ad_al_si.fig"); |
---|
256 | |
---|
257 | aws->callback( (AW_CB0)AW_POPDOWN); |
---|
258 | aws->at("close"); |
---|
259 | aws->create_button("CLOSE","CLOSE","C"); |
---|
260 | |
---|
261 | aws->at("label"); |
---|
262 | aws->create_autosize_button(0,"Please enter the new name\nof the alignment"); |
---|
263 | |
---|
264 | aws->at("input"); |
---|
265 | char buffer[256]; |
---|
266 | sprintf(buffer,"tmp/merge%li/alignment_dest",db_nr); |
---|
267 | aws->create_input_field(buffer,15); |
---|
268 | |
---|
269 | aws->at("ok"); |
---|
270 | aws->callback(MG_aa_create_alignment,db_nr); |
---|
271 | aws->create_button("GO","GO","G"); |
---|
272 | |
---|
273 | return (AW_window *)aws; |
---|
274 | } |
---|
275 | |
---|
276 | |
---|
277 | |
---|
278 | AW_window *MG_create_alignment_window(AW_root *root,AW_CL db_nr) |
---|
279 | { |
---|
280 | char buffer[256]; |
---|
281 | GBDATA *gbd = (db_nr == 1) ? GLOBAL_gb_merge : GLOBAL_gb_dest; |
---|
282 | AW_window_simple *aws = new AW_window_simple; |
---|
283 | char header[80]; |
---|
284 | |
---|
285 | sprintf(header,"ALIGNMENT CONTROL %li",db_nr); |
---|
286 | aws->init( root, header, header); |
---|
287 | aws->load_xfig("merge/ad_align.fig"); |
---|
288 | |
---|
289 | aws->callback( (AW_CB0)AW_POPDOWN); |
---|
290 | aws->at("close"); |
---|
291 | aws->create_button("CLOSE","CLOSE","C"); |
---|
292 | |
---|
293 | aws->callback( AW_POPUP_HELP,(AW_CL)"ad_align.hlp"); |
---|
294 | aws->at("help"); |
---|
295 | aws->create_button("HELP","HELP","H"); |
---|
296 | |
---|
297 | aws->button_length(13); |
---|
298 | |
---|
299 | aws->at("list"); |
---|
300 | sprintf(buffer,"tmp/merge%li/alignment_name",db_nr); |
---|
301 | awt_create_selection_list_on_ad(gbd,(AW_window *)aws,buffer,"*="); |
---|
302 | |
---|
303 | aws->at("delete"); |
---|
304 | aws->callback(MG_ad_al_delete_cb,db_nr); |
---|
305 | aws->create_button("DELETE","DELETE","D"); |
---|
306 | |
---|
307 | aws->at("rename"); |
---|
308 | aws->callback(AW_POPUP,(AW_CL)MG_create_alignment_rename_window,db_nr); |
---|
309 | aws->create_button("RENAME","RENAME","R"); |
---|
310 | |
---|
311 | aws->at("create"); |
---|
312 | aws->callback(AW_POPUP,(AW_CL)MG_create_alignment_create_window,db_nr); |
---|
313 | aws->create_button("CREATE","CREATE","N"); |
---|
314 | |
---|
315 | aws->at("copy"); |
---|
316 | aws->callback(AW_POPUP,(AW_CL)create_alignment_copy_window,db_nr); |
---|
317 | aws->create_button("COPY","COPY","C"); |
---|
318 | |
---|
319 | aws->at("aligned"); |
---|
320 | sprintf(buffer,"tmp/merge%li/aligned",db_nr); |
---|
321 | aws->create_option_menu(buffer); |
---|
322 | aws->insert_option("justified","j",1); |
---|
323 | aws->insert_default_option("not justified","n",0); |
---|
324 | aws->update_option_menu(); |
---|
325 | |
---|
326 | |
---|
327 | |
---|
328 | aws->at("len"); |
---|
329 | sprintf(buffer,"tmp/merge%li/alignment_len",db_nr); |
---|
330 | aws->create_input_field(buffer,8); |
---|
331 | |
---|
332 | aws->at("type"); |
---|
333 | sprintf(buffer,"tmp/merge%li/alignment_type",db_nr); |
---|
334 | aws->create_option_menu(buffer); |
---|
335 | aws->insert_option("dna","d","dna"); |
---|
336 | aws->insert_option("rna","r","rna"); |
---|
337 | aws->insert_option("pro","p","ami"); |
---|
338 | aws->insert_default_option("???","?","usr"); |
---|
339 | aws->update_option_menu(); |
---|
340 | |
---|
341 | aws->at("security"); |
---|
342 | sprintf(buffer,"tmp/merge%li/security",db_nr); |
---|
343 | // aws->get_root()->awar(buffer)->add_callback(MG_ed_al_check_len_cb,db_nr); |
---|
344 | aws->callback(MG_ed_al_check_len_cb,db_nr); |
---|
345 | aws->create_option_menu(buffer); |
---|
346 | aws->insert_option("0","0",0); |
---|
347 | aws->insert_option("1","1",1); |
---|
348 | aws->insert_option("2","2",2); |
---|
349 | aws->insert_option("3","3",3); |
---|
350 | aws->insert_option("4","4",4); |
---|
351 | aws->insert_option("5","5",5); |
---|
352 | aws->insert_default_option("6","6",6); |
---|
353 | aws->update_option_menu(); |
---|
354 | |
---|
355 | return (AW_window *)aws; |
---|
356 | |
---|
357 | } |
---|
358 | |
---|
359 | AW_window *MG_merge_alignment_cb(AW_root *awr){ |
---|
360 | static AW_window_simple *aws = 0; |
---|
361 | if (aws) return (AW_window *)aws; |
---|
362 | |
---|
363 | awr->awar(AWAR_ALI1)->add_callback( (AW_RCB)MG_alignment_vars_callback,(AW_CL)GLOBAL_gb_merge,1); |
---|
364 | awr->awar(AWAR_ALI2)->add_callback( (AW_RCB)MG_alignment_vars_callback,(AW_CL)GLOBAL_gb_dest,2); |
---|
365 | |
---|
366 | aws = new AW_window_simple; |
---|
367 | aws->init( awr, "MERGE_ALIGNMENTS", "MERGE ALIGNMENTS"); |
---|
368 | aws->load_xfig("merge/alignment.fig"); |
---|
369 | |
---|
370 | aws->at("close");aws->callback((AW_CB0)AW_POPDOWN); |
---|
371 | aws->create_button("CLOSE","CLOSE","C"); |
---|
372 | |
---|
373 | aws->at("help"); |
---|
374 | aws->callback(AW_POPUP_HELP,(AW_CL)"mg_alignment.hlp"); |
---|
375 | aws->create_button("HELP","HELP","H"); |
---|
376 | |
---|
377 | aws->at("check"); |
---|
378 | aws->callback((AW_CB1)MG_check_alignment,0); |
---|
379 | aws->create_button("CHECK","Check"); |
---|
380 | |
---|
381 | aws->at("ali1"); |
---|
382 | awt_create_selection_list_on_ad(GLOBAL_gb_merge,(AW_window *)aws,AWAR_ALI1,"*="); |
---|
383 | |
---|
384 | aws->at("ali2"); |
---|
385 | awt_create_selection_list_on_ad(GLOBAL_gb_dest,(AW_window *)aws,AWAR_ALI2,"*="); |
---|
386 | |
---|
387 | aws->at("modify1"); |
---|
388 | aws->callback(AW_POPUP,(AW_CL)MG_create_alignment_window,1); |
---|
389 | aws->create_button("MODIFY_DB1","MODIFY"); |
---|
390 | |
---|
391 | aws->at("modify2"); |
---|
392 | aws->callback(AW_POPUP,(AW_CL)MG_create_alignment_window,2); |
---|
393 | aws->create_button("MODIFY_DB2","MODIFY"); |
---|
394 | |
---|
395 | |
---|
396 | aws->button_length(0); |
---|
397 | aws->shadow_width(1); |
---|
398 | aws->at("icon"); |
---|
399 | aws->callback(AW_POPUP_HELP,(AW_CL)"mg_alignment.hlp"); |
---|
400 | aws->create_button("HELP_MERGE", "#merge/icon.bitmap"); |
---|
401 | |
---|
402 | return (AW_window *)aws; |
---|
403 | } |
---|