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 char *selected =
aw_file_selection(
"Select SINA reference database", dir,
"", suffix);
579 aw_message(
"The GUI does not match the used sina version!\n"
580 "Please save properties and restart the editor.");
588 AW_window_simple *aws =
new AW_window_simple;
595 aws->reset_layout(
"20220422");
596 aws->init(root, adv ?
"XSINA" :
"SINA",
"SINA (SILVA Incremental Aligner)");
598 aws->button_length(12);
600 aws->auto_space(5, 5);
602 int closex, closey; aws->get_at_position(&closex, &closey);
605 aws->create_button(
"CLOSE",
"CLOSE",
"O");
607 int closex2 = aws->get_at_xposition();
613 aws->label_length(0);
614 aws->label(
"SINA command\nError: Failed to find or identify sina version!");
620 aws->at_shift(10, 0);
621 aws->label_length(0);
622 aws->label(
"Show advanced options");
625 bool cbInstalled =
false;
632 aws->at_shift(0, hgap);
633 int y_col2 = aws->get_at_yposition();
634 aws->label_length(15);
635 aws->create_toggle_field(
GA_AWAR_TGT,
"Align what?");
636 aws->insert_toggle(
"Current Species:",
"C", 0);
637 aws->insert_toggle(
"Selected Species",
"S", 1);
638 aws->insert_default_toggle(
"Marked Species",
"M", 2);
639 aws->update_toggle_field();
645 aws->at_shift(0, hgap);
646 aws->button_length(24);
648 aws->label(
"PT Server:");
651 aws->label_length(20);
652 aws->label(
"PT Server\n"
653 "undefined => sina kmer");
657 aws->label_length(0);
664 aws->insert_default_toggle(
"Current",
"C",
REF_CURRENT);
665 aws->update_toggle_field();
669 aws->create_autosize_button(
"selected",
"selected",
"s");
676 aws->label(
"Overhang placement");
678 aws->insert_option(
"keep attached",
NULp,
"attach");
679 aws->insert_option(
"move to edge",
NULp,
"edge");
680 aws->insert_option(
"remove",
NULp,
"remove");
681 aws->update_option_menu();
684 aws->label(
"Handling of unmappable insertions");
686 aws->insert_option(
"Shift surrounding bases",
NULp,
"shift");
687 aws->insert_option(
"Forbid during DP alignment",
NULp,
"forbid");
688 aws->insert_option(
"Delete bases",
NULp,
"remove");
689 aws->update_option_menu();
691 int x_col2 = aws->get_at_xposition();
694 aws->label(
"Character Case");
696 aws->insert_option(
"Do not modify",
NULp,
"original");
697 aws->insert_option(
"Show unaligned bases as lower case",
NULp,
"unaligned");
698 aws->insert_option(
"Uppercase all",
NULp,
"none");
699 aws->update_option_menu();
702 aws->label(
"Family conservation weight (0-1)");
706 aws->label(
"Size of full-length sequences");
710 aws->label_length(17);
711 aws->label(
"Protection Level");
713 aws->insert_option(
"0",
NULp, 0);
714 aws->insert_option(
"1",
NULp, 1);
715 aws->insert_option(
"2",
NULp, 2);
716 aws->insert_option(
"3",
NULp, 3);
717 aws->insert_option(
"4",
NULp, 4);
718 aws->insert_option(
"5",
NULp, 5);
719 aws->insert_option(
"6",
NULp, 6);
720 aws->update_option_menu();
724 aws->label_length(21);
725 aws->label(
"Show changed sections");
727 aws->label_length(11);
728 aws->label(
"color bases");
732 aws->label_length(21);
733 aws->label(
"Show statistics");
738 int startx, starty; aws->get_at_position(&startx, &starty);
740 aws->button_length(12);
741 aws->at(closex, starty);
742 aws->callback(makeWindowCallback(
sina_start, alignData));
744 aws->create_button(
"Start",
"Start",
"S");
746 aws->at(closex2+200, starty-10);
750 aws->at(x_col2, y_col2);
751 aws->auto_space(5, 5);
753 aws->label_length(0);
754 aws->label(
"Pos. Var.:");
758 aws->label(
"Field used for automatic\nfilter selection");
766 aws->at_shift(0, hgap);
768 aws->label(
"Gap insertion/extension penalties");
773 aws->label(
"Match score");
775 aws->label(
"Mismatch score");
779 aws->label(
"Family search min/min_score/max");
785 aws->label(
"Minimal number of full length sequences");
789 aws->label(
"Family search oligo length / mismatches");
794 aws->label(
"Minimal reference sequence length");
798 aws->label(
"Alignment bounds: start");
804 aws->label(
"Number of references required to touch bounds");
808 aws->label(
"Save used references in 'used_rels'");
812 aws->label(
"Store highest identity in 'align_ident_slv'");
816 aws->label(
"Disable fast search");
820 aws->label(
"Score search results by absolute oligo match count");
825 aws->label(
"Suppress warnings about missing 'start' field");
830 aws->label(
"SINA command");
834 int winx, winy; aws->get_window_size(winx, winy);
836 aws->button_length(12);
837 aws->at(winx-closex2+5, closey);
839 aws->create_button(
"HELP",
"HELP");
847 static AW_window_simple *ga_aws =
NULp;
848 static AW_window_simple *ga_aws_adv =
NULp;
854 if (ga_aws) ga_aws->hide();
860 if (ga_aws_adv) ga_aws_adv->hide();
863 static bool refdb_mode_refreshed =
false;
864 if (!refdb_mode_refreshed) {
867 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)
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
char * ARB_strdup(const char *str)
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
#define GA_AWAR_MISMATCH_SCORE
AW_awar * add_callback(const RootCallback &cb)
struct Unfixed_cb_parameter * UNFIXED
char * aw_file_selection(const char *title, const char *dir, const char *def_name, const char *suffix)
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[]
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)
void GB_split_full_path(const char *fullpath, char **res_dir, char **res_fullname, char **res_name_only, char **res_suffix)
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)