33 #include <sys/types.h>
47 #define ga_assert(cond) arb_assert(cond)
49 #define GA_AWAR_ROOT "sina/"
50 #define GA_AWAR_TEMP "tmp/" GA_AWAR_ROOT
52 #define GA_AWAR_CMD GA_AWAR_ROOT "cmd"
53 #define GA_AWAR_TGT GA_AWAR_ROOT "target"
54 #define GA_AWAR_SAI GA_AWAR_ROOT "sai"
55 #define GA_AWAR_ALIGNMENT GA_AWAR_ROOT "alignment"
56 #define GA_AWAR_PROTECTION GA_AWAR_ROOT "protection"
57 #define GA_AWAR_TURN_CHECK GA_AWAR_ROOT "turncheck"
58 #define GA_AWAR_REALIGN GA_AWAR_ROOT "realign"
59 #define GA_AWAR_MATCH_SCORE GA_AWAR_ROOT "match_score"
60 #define GA_AWAR_MISMATCH_SCORE GA_AWAR_ROOT "mismatch_score"
61 #define GA_AWAR_GAP_PEN GA_AWAR_ROOT "gap_pen"
62 #define GA_AWAR_GAP_EXT GA_AWAR_ROOT "gap_ext"
63 #define GA_AWAR_ADVANCED GA_AWAR_ROOT "advanced"
64 #define GA_AWAR_FS_MIN GA_AWAR_ROOT "fs_min"
65 #define GA_AWAR_FS_MAX GA_AWAR_ROOT "fs_max"
66 #define GA_AWAR_FS_MSC GA_AWAR_ROOT "fs_msc"
67 #define GA_AWAR_MIN_FULL GA_AWAR_ROOT "min_full"
68 #define GA_AWAR_FULL_MINLEN GA_AWAR_ROOT "full_minlen"
69 #define GA_AWAR_OVERHANG GA_AWAR_ROOT "overhang"
70 #define GA_AWAR_THREADS GA_AWAR_ROOT "threads"
71 #define GA_AWAR_QSIZE GA_AWAR_ROOT "qsize"
72 #define GA_AWAR_KMER_LEN GA_AWAR_ROOT "kmer_len"
73 #define GA_AWAR_KMER_MM GA_AWAR_ROOT "kmer_mm"
74 #define GA_AWAR_MIN_LEN GA_AWAR_ROOT "min_len"
75 #define GA_AWAR_WEIGHT GA_AWAR_ROOT "weight"
76 #define GA_AWAR_INSERT GA_AWAR_ROOT "insert"
77 #define GA_AWAR_LOWERCASE GA_AWAR_ROOT "lowercase"
78 #define GA_AWAR_AUTOFILTER GA_AWAR_ROOT "autofilter"
79 #define GA_AWAR_KMER_NOREL GA_AWAR_ROOT "kmer_norel"
80 #define GA_AWAR_KMER_NOFAST GA_AWAR_ROOT "kmer_nofast"
81 #define GA_AWAR_SHOW_DIST GA_AWAR_ROOT "show_dist"
82 #define GA_AWAR_SHOW_DIFF GA_AWAR_ROOT "show_diff"
83 #define GA_AWAR_COLOR GA_AWAR_ROOT "color"
84 #define GA_AWAR_GENE_START GA_AWAR_ROOT "gene_start"
85 #define GA_AWAR_GENE_END GA_AWAR_ROOT "gene_end"
86 #define GA_AWAR_FS_COVER_GENE GA_AWAR_ROOT "fs_cover_gene"
87 #define GA_AWAR_USED_RELS GA_AWAR_ROOT "write_used_rels"
88 #define GA_AWAR_CALC_IDENTITY GA_AWAR_ROOT "calc_idty"
89 #define GA_AWAR_NOWARN_START GA_AWAR_ROOT "nowarn_start"
90 #define GA_AWAR_REFDB_MODE GA_AWAR_ROOT "refdb_mode"
91 #define GA_AWAR_REFDB GA_AWAR_ROOT "refdb"
92 #define GA_AWAR_REFDB_SELECT GA_AWAR_TEMP "refdb"
106 const char *refdb = awar_refdb->read_char_pntr();
110 awar_refdb->write_string(refdb_sel);
113 aw_message(
"Please select a reference database");
120 if (db_name[0] == 0) {
121 aw_message(
"Failed to detect name of current database - please select manually");
123 awar_refdb->write_string(db_name);
127 awar_refdb->write_string(
":");
146 const char *sinaCmd =
"arb_sina.sh";
215 for (
int v = 0; ; ++v) {
217 if (sina_interface.
version == version) {
218 return sina_interface.
id;
229 const char *fail_reason =
NULp;
237 "- gui property '%s' and\n"
238 "- environment variable PATH", sinaName);
243 for (
int v = 0; ; ++v) {
247 if (fail_reason) fail_reason =
GBS_global_string(
"%s (this ARB supports these interface versions: %s)", fail_reason, tested_interfaces.c_str());
251 int exitstatus = system(
GBS_global_string(
"%s --has-cli-vers %s", sina, sina_interface.
id));
252 exitstatus = WEXITSTATUS(exitstatus);
255 fail_reason =
"Incompatible SINA and ARB versions";
257 if (!tested_interfaces.empty()) tested_interfaces +=
' ';
258 tested_interfaces += sina_interface.
id;
265 fprintf(stdout,
"Using SINA-ARB interface version '%s'%s\n", sina_interface.
id, v>0 ?
" (old)" :
"");
268 fail_reason =
GBS_global_string(
"Could not execute SINA binary '%s' (exitstatus was %i)",
269 sinaName, exitstatus);
288 fprintf(stderr,
"Note: SINA (SILVA Aligner) disabled (Reason: %s)\n", fail_reason);
300 if (sainame && !sainame[0]) sainame =
"none";
305 cerr <<
"Starting SINA..." << endl;
311 const char *pt_server =
NULp;
316 gb_error =
"internal SINA family search is not available with your SINA version";
320 std::stringstream ptnam;
321 ptnam <<
"ARB_PT_SERVER" << pt;
328 const char *pt_db = pt_server + strlen(pt_server) + 1;
329 pt_db += strlen(pt_db)+3;
334 std::stringstream tmp;
335 tmp <<
"Cannot contact PT server. Aborting" << endl
336 <<
" ID: \"" << tmp.str().c_str()
337 <<
"\" PORT: \"" << pt_server
338 <<
"\" DB: \"" << pt_db << endl
339 <<
"\" GBERROR: \"" << gb_error <<
"\"" << endl;
357 std::stringstream tmp;
358 tmp <<
"Error: Unable to create temporary file \"" << tmpfile <<
"\"!";
365 std::vector<std::string> spec_names;
370 fwrite(spec_name, strlen(spec_name), 1, tmpfile_F);
371 fwrite(
"\n", 1, 1, tmpfile_F);
374 gb_error =
"Unable to get name of currently active species";
381 int num_selected = 0;
389 fwrite(str, strlen(str), 1, tmpfile_F);
390 fwrite(
"\n", 1, 1, tmpfile_F);
403 fwrite(str, strlen(str), 1, tmpfile_F);
404 fwrite(
"\n", 1, 1, tmpfile_F);
432 cl.
cat(
" --ptport "); cl.
cat(pt_server);
434 cl.
cat(
" --fs-engine "); cl.
cat(
"pt-server");
439 cl.
cat(
" --fs-engine "); cl.
cat(
"internal");
448 cl.
cat(
" --fs-req 1");
460 cl.
cat(
" --select-file "); cl.
cat(tmpfile);
480 if (!gb_error)
aw_message(
"SINA finished aligning.");
496 if (type && strncmp(
"PV", type, 2) == 0) {
560 static char *awar_name =
NULp;
563 "SINA reference database",
564 ".",
"arb", &awar_name,
570 static AW_window *aw_ref_db_selection = NULL;
572 if (!aw_ref_db_selection) {
591 aw_message(
"The GUI does not match the used sina version!\n"
592 "Please save properties and restart the editor.");
600 AW_window_simple *aws =
new AW_window_simple;
607 aws->reset_layout(
"20220422");
608 aws->init(root, adv ?
"XSINA" :
"SINA",
"SINA (SILVA Incremental Aligner)");
610 aws->button_length(12);
612 aws->auto_space(5, 5);
614 int closex, closey; aws->get_at_position(&closex, &closey);
617 aws->create_button(
"CLOSE",
"CLOSE",
"O");
619 int closex2 = aws->get_at_xposition();
625 aws->label_length(0);
626 aws->label(
"SINA command\nError: Failed to find or identify sina version!");
632 aws->at_shift(10, 0);
633 aws->label_length(0);
634 aws->label(
"Show advanced options");
637 bool cbInstalled =
false;
644 aws->at_shift(0, hgap);
645 int y_col2 = aws->get_at_yposition();
646 aws->label_length(15);
647 aws->create_toggle_field(
GA_AWAR_TGT,
"Align what?");
648 aws->insert_toggle(
"Current Species:",
"C", 0);
649 aws->insert_toggle(
"Selected Species",
"S", 1);
650 aws->insert_default_toggle(
"Marked Species",
"M", 2);
651 aws->update_toggle_field();
657 aws->at_shift(0, hgap);
658 aws->button_length(24);
660 aws->label(
"PT Server:");
663 aws->label_length(20);
664 aws->label(
"PT Server\n"
665 "undefined => sina kmer");
669 aws->label_length(0);
676 aws->insert_default_toggle(
"Current",
"C",
REF_CURRENT);
677 aws->update_toggle_field();
681 aws->create_autosize_button(
"selected",
"selected",
"s");
688 aws->label(
"Overhang placement");
690 aws->insert_option(
"keep attached",
NULp,
"attach");
691 aws->insert_option(
"move to edge",
NULp,
"edge");
692 aws->insert_option(
"remove",
NULp,
"remove");
693 aws->update_option_menu();
696 aws->label(
"Handling of unmappable insertions");
698 aws->insert_option(
"Shift surrounding bases",
NULp,
"shift");
699 aws->insert_option(
"Forbid during DP alignment",
NULp,
"forbid");
700 aws->insert_option(
"Delete bases",
NULp,
"remove");
701 aws->update_option_menu();
703 int x_col2 = aws->get_at_xposition();
706 aws->label(
"Character Case");
708 aws->insert_option(
"Do not modify",
NULp,
"original");
709 aws->insert_option(
"Show unaligned bases as lower case",
NULp,
"unaligned");
710 aws->insert_option(
"Uppercase all",
NULp,
"none");
711 aws->update_option_menu();
714 aws->label(
"Family conservation weight (0-1)");
718 aws->label(
"Size of full-length sequences");
722 aws->label_length(17);
723 aws->label(
"Protection Level");
725 aws->insert_option(
"0",
NULp, 0);
726 aws->insert_option(
"1",
NULp, 1);
727 aws->insert_option(
"2",
NULp, 2);
728 aws->insert_option(
"3",
NULp, 3);
729 aws->insert_option(
"4",
NULp, 4);
730 aws->insert_option(
"5",
NULp, 5);
731 aws->insert_option(
"6",
NULp, 6);
732 aws->update_option_menu();
736 aws->label_length(21);
737 aws->label(
"Show changed sections");
739 aws->label_length(11);
740 aws->label(
"color bases");
744 aws->label_length(21);
745 aws->label(
"Show statistics");
750 int startx, starty; aws->get_at_position(&startx, &starty);
752 aws->button_length(12);
753 aws->at(closex, starty);
754 aws->callback(makeWindowCallback(
sina_start, alignData));
756 aws->create_button(
"Start",
"Start",
"S");
758 aws->at(closex2+200, starty-10);
762 aws->at(x_col2, y_col2);
763 aws->auto_space(5, 5);
765 aws->label_length(0);
766 aws->label(
"Pos. Var.:");
770 aws->label(
"Field used for automatic\nfilter selection");
778 aws->at_shift(0, hgap);
780 aws->label(
"Gap insertion/extension penalties");
785 aws->label(
"Match score");
787 aws->label(
"Mismatch score");
791 aws->label(
"Family search min/min_score/max");
797 aws->label(
"Minimal number of full length sequences");
801 aws->label(
"Family search oligo length / mismatches");
806 aws->label(
"Minimal reference sequence length");
810 aws->label(
"Alignment bounds: start");
816 aws->label(
"Number of references required to touch bounds");
820 aws->label(
"Save used references in 'used_rels'");
824 aws->label(
"Store highest identity in 'align_ident_slv'");
828 aws->label(
"Disable fast search");
832 aws->label(
"Score search results by absolute oligo match count");
837 aws->label(
"Suppress warnings about missing 'start' field");
842 aws->label(
"SINA command");
846 int winx, winy; aws->get_window_size(winx, winy);
848 aws->button_length(12);
849 aws->at(winx-closex2+5, closey);
851 aws->create_button(
"HELP",
"HELP");
859 static AW_window_simple *ga_aws =
NULp;
860 static AW_window_simple *ga_aws_adv =
NULp;
866 if (ga_aws) ga_aws->hide();
872 if (ga_aws_adv) ga_aws_adv->hide();
875 static bool refdb_mode_refreshed =
false;
876 if (!refdb_mode_refreshed) {
879 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)
#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[]
NOT4PERL GB_ERROR GB_xcmd(const char *cmd, XCMD_TYPE exectype) __ATTR__USERESULT_TODO
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)