34 #include <sys/types.h>
48 #define ga_assert(cond) arb_assert(cond)
50 #define GA_AWAR_ROOT "sina/"
51 #define GA_AWAR_TEMP "tmp/" GA_AWAR_ROOT
53 #define GA_AWAR_CMD GA_AWAR_ROOT "cmd"
54 #define GA_AWAR_TGT GA_AWAR_ROOT "target"
55 #define GA_AWAR_SAI GA_AWAR_ROOT "sai"
56 #define GA_AWAR_ALIGNMENT GA_AWAR_ROOT "alignment"
57 #define GA_AWAR_PROTECTION GA_AWAR_ROOT "protection"
58 #define GA_AWAR_TURN_CHECK GA_AWAR_ROOT "turncheck"
59 #define GA_AWAR_REALIGN GA_AWAR_ROOT "realign"
60 #define GA_AWAR_MATCH_SCORE GA_AWAR_ROOT "match_score"
61 #define GA_AWAR_MISMATCH_SCORE GA_AWAR_ROOT "mismatch_score"
62 #define GA_AWAR_GAP_PEN GA_AWAR_ROOT "gap_pen"
63 #define GA_AWAR_GAP_EXT GA_AWAR_ROOT "gap_ext"
64 #define GA_AWAR_ADVANCED GA_AWAR_ROOT "advanced"
65 #define GA_AWAR_FS_MIN GA_AWAR_ROOT "fs_min"
66 #define GA_AWAR_FS_MAX GA_AWAR_ROOT "fs_max"
67 #define GA_AWAR_FS_MSC GA_AWAR_ROOT "fs_msc"
68 #define GA_AWAR_MIN_FULL GA_AWAR_ROOT "min_full"
69 #define GA_AWAR_FULL_MINLEN GA_AWAR_ROOT "full_minlen"
70 #define GA_AWAR_OVERHANG GA_AWAR_ROOT "overhang"
71 #define GA_AWAR_THREADS GA_AWAR_ROOT "threads"
72 #define GA_AWAR_QSIZE GA_AWAR_ROOT "qsize"
73 #define GA_AWAR_KMER_LEN GA_AWAR_ROOT "kmer_len"
74 #define GA_AWAR_KMER_MM GA_AWAR_ROOT "kmer_mm"
75 #define GA_AWAR_MIN_LEN GA_AWAR_ROOT "min_len"
76 #define GA_AWAR_WEIGHT GA_AWAR_ROOT "weight"
77 #define GA_AWAR_INSERT GA_AWAR_ROOT "insert"
78 #define GA_AWAR_LOWERCASE GA_AWAR_ROOT "lowercase"
79 #define GA_AWAR_AUTOFILTER GA_AWAR_ROOT "autofilter"
80 #define GA_AWAR_KMER_NOREL GA_AWAR_ROOT "kmer_norel"
81 #define GA_AWAR_KMER_NOFAST GA_AWAR_ROOT "kmer_nofast"
82 #define GA_AWAR_SHOW_DIST GA_AWAR_ROOT "show_dist"
83 #define GA_AWAR_SHOW_DIFF GA_AWAR_ROOT "show_diff"
84 #define GA_AWAR_COLOR GA_AWAR_ROOT "color"
85 #define GA_AWAR_GENE_START GA_AWAR_ROOT "gene_start"
86 #define GA_AWAR_GENE_END GA_AWAR_ROOT "gene_end"
87 #define GA_AWAR_FS_COVER_GENE GA_AWAR_ROOT "fs_cover_gene"
88 #define GA_AWAR_USED_RELS GA_AWAR_ROOT "write_used_rels"
89 #define GA_AWAR_CALC_IDENTITY GA_AWAR_ROOT "calc_idty"
90 #define GA_AWAR_NOWARN_START GA_AWAR_ROOT "nowarn_start"
91 #define GA_AWAR_REFDB_MODE GA_AWAR_ROOT "refdb_mode"
92 #define GA_AWAR_REFDB GA_AWAR_ROOT "refdb"
93 #define GA_AWAR_REFDB_SELECT GA_AWAR_TEMP "refdb"
107 const char *refdb = awar_refdb->read_char_pntr();
111 awar_refdb->write_string(refdb_sel);
114 aw_message(
"Please select a reference database");
121 if (db_name[0] == 0) {
122 aw_message(
"Failed to detect name of current database - please select manually");
124 awar_refdb->write_string(db_name);
128 awar_refdb->write_string(
":");
147 const char *sinaCmd =
"arb_sina.sh";
216 for (
int v = 0; ; ++v) {
218 if (sina_interface.
version == version) {
219 return sina_interface.
id;
230 const char *fail_reason =
NULp;
238 "- gui property '%s' and\n"
239 "- environment variable PATH", sinaName);
244 for (
int v = 0; ; ++v) {
248 if (fail_reason) fail_reason =
GBS_global_string(
"%s (this ARB supports these interface versions: %s)", fail_reason, tested_interfaces.c_str());
252 int exitstatus = system(
GBS_global_string(
"%s --has-cli-vers %s", sina, sina_interface.
id));
253 exitstatus = WEXITSTATUS(exitstatus);
256 fail_reason =
"Incompatible SINA and ARB versions";
258 if (!tested_interfaces.empty()) tested_interfaces +=
' ';
259 tested_interfaces += sina_interface.
id;
266 fprintf(stdout,
"Using SINA-ARB interface version '%s'%s\n", sina_interface.
id, v>0 ?
" (old)" :
"");
269 fail_reason =
GBS_global_string(
"Could not execute SINA binary '%s' (exitstatus was %i)",
270 sinaName, exitstatus);
289 fprintf(stderr,
"Note: SINA (SILVA Aligner) disabled (Reason: %s)\n", fail_reason);
301 if (sainame && !sainame[0]) sainame =
"none";
306 cerr <<
"Starting SINA..." << endl;
312 const char *pt_server =
NULp;
317 gb_error =
"internal SINA family search is not available with your SINA version";
321 std::stringstream ptnam;
322 ptnam <<
"ARB_PT_SERVER" << pt;
329 const char *pt_db = pt_server + strlen(pt_server) + 1;
330 pt_db += strlen(pt_db)+3;
335 std::stringstream tmp;
336 tmp <<
"Cannot contact PT server. Aborting" << endl
337 <<
" ID: \"" << tmp.str().c_str()
338 <<
"\" PORT: \"" << pt_server
339 <<
"\" DB: \"" << pt_db << endl
340 <<
"\" GBERROR: \"" << gb_error <<
"\"" << endl;
358 std::stringstream tmp;
359 tmp <<
"Error: Unable to create temporary file \"" << tmpfile <<
"\"!";
366 std::vector<std::string> spec_names;
371 fwrite(spec_name, strlen(spec_name), 1, tmpfile_F);
372 fwrite(
"\n", 1, 1, tmpfile_F);
375 gb_error =
"Unable to get name of currently active species";
382 int num_selected = 0;
390 fwrite(str, strlen(str), 1, tmpfile_F);
391 fwrite(
"\n", 1, 1, tmpfile_F);
404 fwrite(str, strlen(str), 1, tmpfile_F);
405 fwrite(
"\n", 1, 1, tmpfile_F);
433 cl.
cat(
" --ptport "); cl.
cat(pt_server);
435 cl.
cat(
" --fs-engine "); cl.
cat(
"pt-server");
440 cl.
cat(
" --fs-engine "); cl.
cat(
"internal");
449 cl.
cat(
" --fs-req 1");
461 cl.
cat(
" --select-file "); cl.
cat(tmpfile);
481 if (!gb_error)
aw_message(
"SINA finished aligning.");
497 if (type && strncmp(
"PV", type, 2) == 0) {
561 static char *awar_name =
NULp;
564 "SINA reference database",
565 ".",
"arb", &awar_name,
571 static AW_window *aw_ref_db_selection = NULL;
573 if (!aw_ref_db_selection) {
592 aw_message(
"The GUI does not match the used sina version!\n"
593 "Please save properties and restart the editor.");
601 AW_window_simple *aws =
new AW_window_simple;
608 aws->reset_layout(
"20220422");
609 aws->init(root, adv ?
"XSINA" :
"SINA",
"SINA (SILVA Incremental Aligner)");
611 aws->button_length(12);
613 aws->auto_space(5, 5);
615 int closex, closey; aws->get_at_position(&closex, &closey);
618 aws->create_button(
"CLOSE",
"CLOSE",
"O");
620 int closex2 = aws->get_at_xposition();
626 aws->label_length(0);
627 aws->label(
"SINA command\nError: Failed to find or identify sina version!");
633 aws->at_shift(10, 0);
634 aws->label_length(0);
635 aws->label(
"Show advanced options");
638 bool cbInstalled =
false;
645 aws->at_shift(0, hgap);
646 int y_col2 = aws->get_at_yposition();
647 aws->label_length(15);
648 aws->create_toggle_field(
GA_AWAR_TGT,
"Align what?");
649 aws->insert_toggle(
"Current Species:",
"C", 0);
650 aws->insert_toggle(
"Selected Species",
"S", 1);
651 aws->insert_default_toggle(
"Marked Species",
"M", 2);
652 aws->update_toggle_field();
658 aws->at_shift(0, hgap);
659 aws->button_length(24);
661 aws->label(
"PT Server:");
664 aws->label_length(20);
665 aws->label(
"PT Server\n"
666 "undefined => sina kmer");
670 aws->label_length(0);
677 aws->insert_default_toggle(
"Current",
"C",
REF_CURRENT);
678 aws->update_toggle_field();
682 aws->create_autosize_button(
"selected",
"selected",
"s");
689 aws->label(
"Overhang placement");
691 aws->insert_option(
"keep attached",
NULp,
"attach");
692 aws->insert_option(
"move to edge",
NULp,
"edge");
693 aws->insert_option(
"remove",
NULp,
"remove");
694 aws->update_option_menu();
697 aws->label(
"Handling of unmappable insertions");
699 aws->insert_option(
"Shift surrounding bases",
NULp,
"shift");
700 aws->insert_option(
"Forbid during DP alignment",
NULp,
"forbid");
701 aws->insert_option(
"Delete bases",
NULp,
"remove");
702 aws->update_option_menu();
704 int x_col2 = aws->get_at_xposition();
707 aws->label(
"Character Case");
709 aws->insert_option(
"Do not modify",
NULp,
"original");
710 aws->insert_option(
"Show unaligned bases as lower case",
NULp,
"unaligned");
711 aws->insert_option(
"Uppercase all",
NULp,
"none");
712 aws->update_option_menu();
715 aws->label(
"Family conservation weight (0-1)");
719 aws->label(
"Size of full-length sequences");
723 aws->label_length(17);
724 aws->label(
"Protection Level");
726 aws->insert_option(
"0",
NULp, 0);
727 aws->insert_option(
"1",
NULp, 1);
728 aws->insert_option(
"2",
NULp, 2);
729 aws->insert_option(
"3",
NULp, 3);
730 aws->insert_option(
"4",
NULp, 4);
731 aws->insert_option(
"5",
NULp, 5);
732 aws->insert_option(
"6",
NULp, 6);
733 aws->update_option_menu();
737 aws->label_length(21);
738 aws->label(
"Show changed sections");
740 aws->label_length(11);
741 aws->label(
"color bases");
745 aws->label_length(21);
746 aws->label(
"Show statistics");
751 int startx, starty; aws->get_at_position(&startx, &starty);
753 aws->button_length(12);
754 aws->at(closex, starty);
755 aws->callback(makeWindowCallback(
sina_start, alignData));
757 aws->create_button(
"Start",
"Start",
"S");
759 aws->at(closex2+200, starty-10);
763 aws->at(x_col2, y_col2);
764 aws->auto_space(5, 5);
766 aws->label_length(0);
767 aws->label(
"Pos. Var.:");
771 aws->label(
"Field used for automatic\nfilter selection");
779 aws->at_shift(0, hgap);
781 aws->label(
"Gap insertion/extension penalties");
786 aws->label(
"Match score");
788 aws->label(
"Mismatch score");
792 aws->label(
"Family search min/min_score/max");
798 aws->label(
"Minimal number of full length sequences");
802 aws->label(
"Family search oligo length / mismatches");
807 aws->label(
"Minimal reference sequence length");
811 aws->label(
"Alignment bounds: start");
817 aws->label(
"Number of references required to touch bounds");
821 aws->label(
"Save used references in 'used_rels'");
825 aws->label(
"Store highest identity in 'align_ident_slv'");
829 aws->label(
"Disable fast search");
833 aws->label(
"Score search results by absolute oligo match count");
838 aws->label(
"Suppress warnings about missing 'start' field");
843 aws->label(
"SINA command");
847 int winx, winy; aws->get_window_size(winx, winy);
849 aws->button_length(12);
850 aws->at(winx-closex2+5, closey);
852 aws->create_button(
"HELP",
"HELP");
860 static AW_window_simple *ga_aws =
NULp;
861 static AW_window_simple *ga_aws_adv =
NULp;
867 if (ga_aws) ga_aws->hide();
873 if (ga_aws_adv) ga_aws_adv->hide();
876 static bool refdb_mode_refreshed =
false;
877 if (!refdb_mode_refreshed) {
880 refdb_mode_refreshed =
true;
GB_ERROR GB_begin_transaction(GBDATA *gbd)
#define GA_AWAR_GENE_START
SinaArbInterfaceVersion version
const char * stream2static(const std::stringstream &str)
GB_ERROR GB_commit_transaction(GBDATA *gbd)
void GB_remove_on_exit(const char *filename)
#define AWAR_SAVED_DB_PATH
GBDATA * GBT_first_marked_species(GBDATA *gb_main)
static char * filter_posvar_SAI_for_ali(GBDATA *gb_extended, const char *ali_name)
return string(buffer, length)
#define GA_AWAR_SHOW_DIST
GBDATA * GB_find(GBDATA *gbd, const char *key, GB_SEARCH_TYPE gbs)
AW_window * awt_create_load_box(AW_root *aw_root, const char *action, const char *what, const char *default_directory, const char *file_extension, char **set_file_name_awar, const WindowCallback &ok_cb, const WindowCallback &close_cb, const char *close_button_text)
void ARB_warn_about_unwanted_chars(const char *path, const char *path_description)
Aligner_get_first_selected_species get_first_selected_species
#define GA_AWAR_LOWERCASE
#define GA_AWAR_TURN_CHECK
void AWT_insert_config_manager(AW_window *aww, AW_default default_file_, const char *id, const StoreConfigCallback &store_cb, const RestoreConfigCallback &load_or_reset_cb, const char *macro_id, const AWT_predefined_config *predef)
GB_ERROR arb_look_and_start_server(long magic_number, const char *arb_tcp_env)
const char * GBS_global_string(const char *templat,...)
void AW_POPDOWN(AW_window *window)
std::string alignment_name
static AW_window_simple * new_sina_simple(AW_root *root, const AlignDataAccess *alignData, bool adv)
void cat(const char *from)
Aligner_get_next_selected_species get_next_selected_species
void awt_create_SAI_selection_button(GBDATA *gb_main, AW_window *aws, const char *varname, const SaiSelectionlistFilterCallback &fcb)
GB_ERROR ARB_system(const char *cmd, XCmdType boundExectype)
#define GA_AWAR_SHOW_DIFF
static AW_window * create_ref_db_selection_window(AW_root *aw_root)
#define GA_AWAR_MISMATCH_SCORE
AW_awar * add_callback(const RootCallback &cb)
struct Unfixed_cb_parameter * UNFIXED
const char * empty_as_none(const char *sainame)
const char * read_char_pntr() const
char * ARB_executable(const char *exe_name, const char *path)
GB_ERROR GB_await_error()
#define GA_AWAR_NOWARN_START
static AW_root * SINGLETON
WindowCallback makeHelpCallback(const char *helpfile)
const char * GBS_read_arb_tcp(const char *env)
#define GA_AWAR_KMER_NOFAST
#define GA_AWAR_FULL_MINLEN
void show_sina_window(UNFIXED, const AlignDataAccess *alignData)
AW_awar * awar_float(const char *var_name, float default_value=0.0, AW_default default_file=AW_ROOT_DEFAULT)
#define GA_AWAR_REFDB_SELECT
#define GA_AWAR_REFDB_MODE
#define GA_AWAR_CALC_IDENTITY
FILE * GB_fopen_tempfile(const char *filename, const char *fmode, char **res_fullname)
static GB_ERROR detect_sina_version(AW_root *awr)
GBDATA * GBT_next_marked_species(GBDATA *gb_species)
#define AWAR_SPECIES_NAME
#define GA_AWAR_KMER_NOREL
static AWT_config_mapping_def sina_config_mapping[]
char * read_string() const
static void newRefDbSelected_cb(AW_root *root)
AW_awar * awar(const char *awar)
static sina_arb_interface_def supported_sina_versions[]
static void accept_selected_ref_db(AW_window *aww, const char *const *awar_filename)
void awt_create_PTSERVER_selection_button(AW_window *aws, const char *varname)
GB_CSTR GB_getenv(const char *env)
#define AISC_MAGIC_NUMBER
char * GB_unique_filename(const char *name_prefix, const char *suffix)
#define GA_AWAR_PROTECTION
AW_awar * awar_int(const char *var_name, long default_value=0, AW_default default_file=AW_ROOT_DEFAULT)
char ARB_path_contains_unwanted_chars(const char *path)
char * GB_read_string(GBDATA *gbd)
const SinaArbInterfaceVersion NO_INTERFACE
const char * GBS_static_string(const char *str)
void aw_message(const char *msg)
bool GB_is_readablefile(const char *filename)
static const char * get_interface_id(SinaArbInterfaceVersion version)
GB_ERROR write_string(const char *aw_string)
static void refDbModeChanged_cb(AW_root *root)
const char * get_data() const
#define GA_AWAR_AUTOFILTER
static SinaArbInterfaceVersion used_sina_interface
#define GA_AWAR_USED_RELS
static SinaArbInterfaceVersion gui_sina_interface
#define GA_AWAR_MATCH_SCORE
GB_CSTR GB_read_char_pntr(GBDATA *gbd)
AW_awar * awar_string(const char *var_name, const char *default_value="", AW_default default_file=AW_ROOT_DEFAULT)
GBDATA * GB_search(GBDATA *gbd, const char *fieldpath, GB_TYPES create)
void create_sina_variables(AW_root *root, AW_default db1)
static void sina_select_ref_db(AW_window *aww)
static void sina_cmd_changed_cb(AW_root *awr)
GB_ERROR write_int(long aw_int)
void cat_sQuoted(const char *from)
void aw_message_if(GB_ERROR error)
char * GBS_global_string_copy(const char *templat,...)
#define GA_AWAR_FS_COVER_GENE
static void sina_start(AW_window *window, const AlignDataAccess *data_access)
AW_active sina_mask(AW_root *awr)