source: tags/arb_5.5/EDIT4/graph_aligner_gui.cxx

Last change on this file was 6169, checked in by westram, 15 years ago
File size: 15.0 KB
Line 
1#include <stdio.h>
2#include <arbdb.h>
3#include <arbdbt.h>
4#include <aw_root.hxx>
5#include <aw_device.hxx>
6#include <aw_window.hxx>
7#include <aw_awars.hxx>
8#include <awt_sel_boxes.hxx>
9#include <servercntrl.h>
10#include <PT_com.h>
11#include <client.h>
12
13#include <sys/types.h>
14#include <sys/wait.h>
15
16#include <unistd.h>
17
18#include <stdlib.h>
19#include <string>
20#include <sstream>
21#include <iostream>
22#include <vector>
23
24#include <string.h>
25
26// need to use AWTC_faligner_cd defined here to get selected species
27#include <fast_aligner.hxx>
28#include "graph_aligner_gui.hxx"
29#include "ed4_defs.hxx"
30
31using std::cerr;
32using std::cout;
33using std::endl;
34
35#define GA_AWAR_ROOT "sina/"
36#define GA_AWAR_CMD GA_AWAR_ROOT "command"
37#define GA_AWAR_TGT GA_AWAR_ROOT "target"
38#define GA_AWAR_SAI GA_AWAR_ROOT "sai"
39#define GA_AWAR_ALIGNMENT GA_AWAR_ROOT "alignment"
40#define GA_AWAR_PROTECTION GA_AWAR_ROOT "protection"
41#define GA_AWAR_TURN_CHECK GA_AWAR_ROOT "turncheck"
42#define GA_AWAR_LOGLEVEL GA_AWAR_ROOT "loglevel"
43#define GA_AWAR_REALIGN GA_AWAR_ROOT "realign"
44#define GA_AWAR_PTLOAD GA_AWAR_ROOT "ptload"
45#define GA_AWAR_COPYMARKREF GA_AWAR_ROOT "copymarkref"
46#define GA_AWAR_GAP_PEN GA_AWAR_ROOT "gap_pen"
47#define GA_AWAR_GAP_EXT GA_AWAR_ROOT "gap_ext"
48#define GA_AWAR_ADVANCED GA_AWAR_ROOT "advanced"
49#define GA_AWAR_FS_MIN GA_AWAR_ROOT "fs_min"
50#define GA_AWAR_FS_MAX GA_AWAR_ROOT "fs_max"
51#define GA_AWAR_FS_MSC GA_AWAR_ROOT "fs_msc"
52#define GA_AWAR_MIN_FULL GA_AWAR_ROOT "min_full"
53#define GA_AWAR_FULL_MINLEN GA_AWAR_ROOT "full_minlen"
54#define GA_AWAR_OVERHANG GA_AWAR_ROOT "overhang"
55#define GA_AWAR_THREADS GA_AWAR_ROOT "threads"
56#define GA_AWAR_QSIZE GA_AWAR_ROOT "qsize"
57
58void create_sina_variables(AW_root *root, AW_default db1) {
59    root->awar_string(GA_AWAR_CMD, "sina", db1);
60    root->awar_int(GA_AWAR_TGT, 2, db1);
61    root->awar_int(AWAR_PT_SERVER, 0, db1);
62    root->awar_string(GA_AWAR_SAI, "none", db1);
63    root->awar_int(GA_AWAR_PROTECTION, 0, db1);
64    root->awar_string(GA_AWAR_LOGLEVEL, "3", db1);
65    root->awar_int(GA_AWAR_TURN_CHECK, 1, db1);
66    root->awar_int(GA_AWAR_REALIGN, 1, db1);
67    root->awar_int(GA_AWAR_PTLOAD, 0, db1);
68    root->awar_int(GA_AWAR_COPYMARKREF, 0, db1);
69    root->awar_float(GA_AWAR_GAP_PEN, 5.0, db1);
70    root->awar_float(GA_AWAR_GAP_EXT, 2.0, db1);
71    root->awar_int(GA_AWAR_ADVANCED, 0, db1);
72    root->awar_int(GA_AWAR_FS_MIN, 15, db1);
73    root->awar_int(GA_AWAR_FS_MAX, 40, db1);
74    root->awar_float(GA_AWAR_FS_MSC, .7, db1);
75    root->awar_int(GA_AWAR_MIN_FULL, 1, db1);
76    root->awar_int(GA_AWAR_FULL_MINLEN, 1400, db1);
77    root->awar_string(GA_AWAR_OVERHANG, "attach", db1);
78    root->awar_int(GA_AWAR_THREADS, 1, db1);
79    root->awar_int(GA_AWAR_QSIZE, 1, db1);
80}
81
82AW_active sina_mask(AW_root *root) {
83    const char *sinaName    = root->awar(GA_AWAR_CMD)->read_char_pntr();
84    char       *sina        = GB_executable(sinaName);
85    const char *fail_reason = 0;
86
87    if (sina) {
88        int exitstatus = system(GBS_global_string("%s --has-cli-vers 1", sina));
89        exitstatus     = WEXITSTATUS(exitstatus);
90
91        switch (exitstatus) {
92        case EXIT_SUCCESS:
93            break;
94           
95        case EXIT_FAILURE:
96            fail_reason = "Incompatible SINA and ARB versions";
97            break;
98
99        case 127:                                   // libs missing
100        default:                                    // unexpected
101            fail_reason = GBS_global_string("Could execute SINA binary '%s' (exitstatus was %i)",
102                                            sinaName, exitstatus);
103            break;
104        }
105        free(sina);
106    }
107    else {
108        fail_reason = GBS_global_string("%s not found", sinaName);
109    }
110
111    if (fail_reason) {
112        fprintf(stderr,
113                "Note: SINA (SILVA Aligner) disabled (Reason: %s)\n"
114                "      Visit http://www.ribocon.com/sina/ for more information.\n",
115                fail_reason);
116    }
117
118    return fail_reason ? AWM_DISABLED : AWM_ALL;
119}
120
121static void sina_start(AW_window *window, AW_CL cd2) {
122    GB_ERROR gb_error;
123    AW_root *root = window->get_root();
124    cerr << "Starting SINA..." << endl;
125
126    // make string from pt server selection
127    int pt = root->awar(AWAR_PT_SERVER)->read_int();
128    const char *pt_server;
129    std::stringstream ptnam;
130    ptnam << "ARB_PT_SERVER" << pt;
131    pt_server = GBS_read_arb_tcp(ptnam.str().c_str());
132    if (!pt_server) {
133        aw_message("Unable to find definition for chosen PT-server");
134        return;
135    }
136    const char *pt_db = pt_server + strlen(pt_server) +1;
137    pt_db += strlen(pt_db)+3;
138
139    // start pt server if necessary
140    gb_error = arb_look_and_start_server(AISC_MAGIC_NUMBER,ptnam.str().c_str(),
141                                         GLOBAL_gb_main);
142    if (gb_error) {
143        std::stringstream tmp;
144        tmp << "Cannot contact PT server. Aborting" << endl
145            << " ID: \"" << tmp.str().c_str()
146            << "\" PORT: \"" << pt_server
147            << "\" DB: \"" << pt_db  << endl
148            << "\" GBERROR: \"" << gb_error << "\"" << endl;
149        aw_message(tmp.str().c_str());
150        return;
151    }
152
153    // create temporary file
154    char* tmpfile_tpl = GB_unique_filename("sina_select","tmp");
155    char* tmpfile;
156    FILE* tmpfile_F = GB_fopen_tempfile(tmpfile_tpl,"w", &tmpfile);
157    if (!tmpfile_F) {
158        std::stringstream tmp;
159        tmp << "Error: Unable to create temporary file \"" << tmpfile << "\"!";
160        aw_message(tmp.str().c_str());
161        return;
162    }
163    GB_remove_on_exit(tmpfile);
164
165    std::vector<std::string> spec_names;
166    switch(root->awar(GA_AWAR_TGT)->read_int()) {
167    case 0: //current
168    {
169        char *spec_name = root->awar(AWAR_SPECIES_NAME)->read_string();
170        if (spec_name) {
171            fwrite(spec_name, strlen(spec_name), 1, tmpfile_F);
172            fwrite("\n", 1, 1, tmpfile_F);
173        } else {
174            aw_message("Unable to get name of currently active species");
175            return;
176        }
177    }
178    break;
179    case 1: //selected
180    {
181        struct AWTC_faligner_cd *cd = (struct AWTC_faligner_cd *)cd2;
182        GB_begin_transaction(GLOBAL_gb_main);
183        int num_selected = 0;
184        for (GBDATA *gb_spec = cd->get_first_selected_species(&num_selected);
185             gb_spec; gb_spec = cd->get_next_selected_species()) {
186            GBDATA *gbd_name = GB_find(gb_spec, "name", down_level);
187            if (gbd_name) {
188                const char *str = GB_read_char_pntr(gbd_name);
189                fwrite(str, strlen(str), 1, tmpfile_F);
190                fwrite("\n", 1, 1, tmpfile_F);
191            }
192        }
193        GB_commit_transaction(GLOBAL_gb_main);
194    }
195    break;
196    case 2: //marked
197    {
198        GB_begin_transaction(GLOBAL_gb_main);
199        for (GBDATA *gb_spec = GBT_first_marked_species(GLOBAL_gb_main);
200             gb_spec; gb_spec = GBT_next_marked_species(gb_spec)) {
201            GBDATA *gbd_name = GB_find(gb_spec, "name", down_level);
202            if (gbd_name) {
203                const char *str = GB_read_char_pntr(gbd_name);
204                fwrite(str, strlen(str), 1, tmpfile_F);
205                fwrite("\n", 1, 1, tmpfile_F);
206            }
207        }
208        GB_commit_transaction(GLOBAL_gb_main);
209    }
210    break;
211    }
212    fclose(tmpfile_F);
213
214    // build command line
215    std::stringstream cmdline;
216    cmdline << root->awar(GA_AWAR_CMD)->read_string()
217        << " -i :"
218        << " --queue-size " << root->awar(GA_AWAR_QSIZE)->read_as_string()
219        << " --ncpu " << root->awar(GA_AWAR_THREADS)->read_as_string()
220        << " --verbosity " << root->awar(GA_AWAR_LOGLEVEL)->read_as_string()
221        << " --ptdb " << (root->awar(GA_AWAR_PTLOAD)->read_int()?pt_db:":")
222        << " --ptport " << pt_server
223        << " --turn " << (root->awar(GA_AWAR_TURN_CHECK)->read_int()?"all":"none")
224        << (root->awar(GA_AWAR_REALIGN)->read_int()?" --realign":"")
225        << " --overhang " <<  root->awar(GA_AWAR_OVERHANG)->read_string()
226        << " --filter " << root->awar(GA_AWAR_SAI)->read_string()
227        << " --fs-min " << root->awar(GA_AWAR_FS_MIN)->read_as_string()
228        << " --fs-msc " << root->awar(GA_AWAR_FS_MSC)->read_as_string()
229        << " --fs-max " << root->awar(GA_AWAR_FS_MAX)->read_as_string()
230        << " --fs-req " << "1"
231        << " --fs-req-full " << root->awar(GA_AWAR_MIN_FULL)->read_as_string()
232        << " --fs-full-len " << root->awar(GA_AWAR_FULL_MINLEN)->read_as_string()
233        << " --pen-gap " <<  root->awar(GA_AWAR_GAP_PEN)->read_as_string()
234        << " --pen-gapext " <<  root->awar(GA_AWAR_GAP_EXT)->read_as_string()
235        << (root->awar(GA_AWAR_COPYMARKREF)->read_int()?" --markcopy":"")
236        << " --prot-level " << root->awar(GA_AWAR_PROTECTION)->read_as_string()
237        << " --select-file " << tmpfile;
238
239    gb_error = GB_xcmd(cmdline.str().c_str(), GB_TRUE, GB_FALSE);
240
241    aw_message("SINA finished aligning.");
242}
243
244
245
246static char* filter_sai(GBDATA *gb_extended, AW_CL /*cd*/) {
247    char   *result = 0;
248    GBDATA *gbd    = GB_search(gb_extended, "ali_16s/_TYPE", GB_FIND);
249    if (gbd) {
250        const char* type = GB_read_char_pntr(gbd);
251        if (type && strncmp("PV", type, 2) == 0) {
252            gbd    = GB_find(gb_extended, "name", down_level);
253            result = GB_read_string(gbd);
254        }
255    }
256    return result;
257}
258
259static AW_window* create_select_sai_window(AW_root *root) {
260    static AW_window_simple *aws = 0;
261    if (aws) return aws;
262
263    aws = new AW_window_simple;
264
265    aws->init(root, "SELECT_SAI", "Select Sai");
266    aws->load_xfig("selectSAI.fig");
267
268    aws->at("selection");
269    aws->callback((AW_CB0)AW_POPDOWN);
270
271    awt_create_selection_list_on_extendeds(GLOBAL_gb_main, (AW_window*) aws,
272                                           GA_AWAR_SAI, filter_sai, (AW_CL)root);
273
274    aws->at("close");
275    aws->callback(AW_POPDOWN);
276    aws->create_button("CLOSE", "CLOSE", "C");
277
278    aws->window_fit();
279    return (AW_window*) aws;
280}
281
282AW_window_simple*
283new_sina_simple(AW_root *root, AW_CL cd2, bool adv) {
284    int closex, closey, startx, starty, winx, winy;
285    const int hgap = 10;
286    AW_window_simple *aws = new AW_window_simple;
287
288    aws->init(root, "SINA", "SINA (SILVA Incremental Aligner)");
289
290    aws->button_length(12);
291    aws->at(10,10);
292    aws->auto_space(5,5);
293
294    aws->callback(AW_POPDOWN);
295    aws->create_button("CLOSE", "CLOSE", "O");
296    aws->get_at_position(&closex, &closey);
297
298    aws->at_shift(10,0);
299    aws->callback(show_sina_window, cd2, 0);
300    aws->label_length(0);
301    aws->label("Show advanced options");
302    aws->create_toggle(GA_AWAR_ADVANCED);
303
304    aws->at_newline();
305    aws->at_shift(0,hgap);
306    aws->label_length(15);
307    aws->create_toggle_field(GA_AWAR_TGT, "Align what?", "A");
308    aws->insert_toggle("Current Species:", "C", 0);
309    aws->insert_toggle("Selected Species", "S", 1);
310    aws->insert_default_toggle("Marked Species", "M", 2);
311    aws->update_toggle_field();
312
313    aws->at_shift(0,3);
314    aws->create_input_field(AWAR_SPECIES_NAME, 20);
315
316    aws->at_newline();
317    aws->at_shift(0,hgap);
318    aws->button_length(24);
319    aws->label("PT Server:");
320    awt_create_selection_list_on_pt_servers(aws, AWAR_PT_SERVER, true);
321
322    aws->at_newline();
323    aws->callback(AW_POPUP, (AW_CL)create_select_sai_window, (AW_CL)0);
324    aws->label("Pos. Var.:");
325    aws->create_button("SELECT_SAI", GA_AWAR_SAI);
326    aws->button_length(12);
327
328
329    aws->at_newline();
330    aws->label_length(0);
331    aws->create_option_menu(GA_AWAR_OVERHANG, "Overhang placement");
332    aws->insert_option("keep attached", 0, "attach");
333    aws->insert_option("move to edge", 0, "edge");
334    aws->insert_option("remove", 0, "remove");
335    aws->update_option_menu();
336
337    if (adv) {
338        aws->at_newline();
339        aws->at_shift(0,hgap);
340
341        aws->label("Turn check");
342        aws->create_toggle(GA_AWAR_TURN_CHECK);
343
344        aws->at_newline();
345        aws->label("Realign");
346        aws->create_toggle(GA_AWAR_REALIGN);
347
348        aws->at_newline();
349        aws->label("Load reference sequences from PT-Server");
350        aws->create_toggle(GA_AWAR_PTLOAD);
351
352        aws->at_newline();
353        aws->label("(Copy and) mark sequences used as reference");
354        aws->create_toggle(GA_AWAR_COPYMARKREF);
355
356        aws->at_newline();
357        aws->at_shift(0,hgap);
358        aws->label_length(0);
359
360        aws->label("Gap insertion/extension penalties");
361        aws->create_input_field(GA_AWAR_GAP_PEN, 5);
362        aws->create_input_field(GA_AWAR_GAP_EXT, 5);
363
364        aws->at_newline();
365        aws->label("Family search min/min_score/max");
366        aws->create_input_field(GA_AWAR_FS_MIN, 3);
367        aws->create_input_field(GA_AWAR_FS_MSC, 3);
368        aws->create_input_field(GA_AWAR_FS_MAX, 3);
369
370        aws->at_newline();
371        aws->label("Use at least");
372        aws->create_input_field(GA_AWAR_MIN_FULL, 3);
373        aws->label("sequences with at least");
374        aws->create_input_field(GA_AWAR_FULL_MINLEN, 5);
375        aws->label("bases as reference");
376
377        aws->at_newline();
378        aws->label("Max threads");
379        aws->create_input_field(GA_AWAR_THREADS,3);
380        aws->label("Queue size");
381        aws->create_input_field(GA_AWAR_QSIZE,3);
382
383        aws->at_newline();
384        aws->label("SINA command");
385        aws->create_input_field(GA_AWAR_CMD,20);
386
387        aws->at_shift(0,hgap);
388    }
389
390    aws->at_newline();
391    aws->at_shift(0,hgap);
392
393    aws->label_length(17);
394    aws->create_option_menu(GA_AWAR_PROTECTION, "Protection Level", "P");
395    aws->insert_option("0", 0, 0);
396    aws->insert_option("1", 0, 1);
397    aws->insert_option("2", 0, 2);
398    aws->insert_option("3", 0, 3);
399    aws->insert_option("4", 0, 4);
400    aws->insert_option("5", 0, 5);
401    aws->insert_option("6", 0, 6);
402    aws->update_option_menu();
403
404    aws->at_newline();
405    aws->create_option_menu(GA_AWAR_LOGLEVEL, "Logging level", "L");
406    aws->insert_option("silent", 0, "1");
407    aws->insert_option("quiet", 0, "2");
408    aws->insert_default_option("normal", 0, "3");
409    aws->insert_option("verbose", 0, "4");
410    aws->insert_option("debug", 0, "5");
411    aws->insert_option("debug more", 0, "6");
412    aws->update_option_menu();
413
414    aws->get_window_size(winx, winy);
415    aws->get_at_position(&startx, &starty);
416
417    aws->at(winx-closex+5,closey);
418    aws->callback(AW_POPUP_HELP, (AW_CL) "sina_main.hlp");
419    aws->create_button("HELP", "HELP");
420
421    aws->at(winx-closex+5, starty);
422    aws->callback(sina_start, cd2);
423    aws->highlight();
424    aws->create_button("Start", "Start", "S");
425
426    return aws;
427}
428
429void show_sina_window(AW_window *aw, AW_CL cd2, AW_CL) {
430    static AW_window_simple *ga_aws = 0;
431    static AW_window_simple *ga_aws_adv = 0;
432
433    AW_root *root = aw->get_root();
434    if (root->awar(GA_AWAR_ADVANCED)->read_int()) {
435        if (!ga_aws_adv) ga_aws_adv = new_sina_simple(root, cd2, true);
436        ga_aws_adv->show();
437        if (ga_aws) ga_aws->hide();
438    }
439    else {
440        if (!ga_aws) ga_aws = new_sina_simple(root, cd2, false);
441        ga_aws->show();
442        if (ga_aws_adv) ga_aws_adv->hide();
443    }
444}
445
446/*
447  Local Variables:
448  mode:c++
449  c-file-style:"stroustrup"
450  c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . 0))
451  indent-tabs-mode:nil
452  fill-column:99
453  End:
454*/
455// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:encoding=utf-8:textwidth=99 :
456
Note: See TracBrowser for help on using the repository browser.