| 1 | // =============================================================== // |
|---|
| 2 | // // |
|---|
| 3 | // File : EDB_root_bact.cxx // |
|---|
| 4 | // Purpose : // |
|---|
| 5 | // // |
|---|
| 6 | // Institute of Microbiology (Technical University Munich) // |
|---|
| 7 | // http://www.arb-home.de/ // |
|---|
| 8 | // // |
|---|
| 9 | // =============================================================== // |
|---|
| 10 | |
|---|
| 11 | #include <ed4_extern.hxx> |
|---|
| 12 | #include "ed4_class.hxx" |
|---|
| 13 | |
|---|
| 14 | #include <aw_msg.hxx> |
|---|
| 15 | #include <arb_progress.h> |
|---|
| 16 | #include <arbdbt.h> |
|---|
| 17 | #include <arb_strbuf.h> |
|---|
| 18 | #include <ad_config.h> |
|---|
| 19 | |
|---|
| 20 | #define NAME_BUFFERSIZE 100 |
|---|
| 21 | |
|---|
| 22 | void EDB_root_bact::calc_no_of_all(char *string_to_scan, long *group, long *species) |
|---|
| 23 | { |
|---|
| 24 | long i=0; |
|---|
| 25 | |
|---|
| 26 | *group = 0; |
|---|
| 27 | *species = 0; |
|---|
| 28 | |
|---|
| 29 | if (!string_to_scan) |
|---|
| 30 | return; |
|---|
| 31 | |
|---|
| 32 | while (string_to_scan[i]) { |
|---|
| 33 | if (string_to_scan[i] == 1) { |
|---|
| 34 | if (string_to_scan[i+1] == 'L' || string_to_scan[i+1] == 'S') { |
|---|
| 35 | (*species)++; |
|---|
| 36 | i++; |
|---|
| 37 | } |
|---|
| 38 | else if (string_to_scan[i+1] == 'F' || string_to_scan[i+1] == 'G') { |
|---|
| 39 | (*group)++; |
|---|
| 40 | i++; |
|---|
| 41 | } |
|---|
| 42 | } |
|---|
| 43 | i++; |
|---|
| 44 | } |
|---|
| 45 | } |
|---|
| 46 | |
|---|
| 47 | ED4_returncode EDB_root_bact::fill_data(ED4_multi_species_manager *multi_species_manager, |
|---|
| 48 | ED4_sequence_info_terminal *ref_sequence_info_terminal, |
|---|
| 49 | ED4_sequence_terminal *ref_sequence_terminal, |
|---|
| 50 | char *str, |
|---|
| 51 | ED4_index *y, |
|---|
| 52 | ED4_index curr_local_position, |
|---|
| 53 | ED4_index *length_of_terminals, |
|---|
| 54 | int group_depth, |
|---|
| 55 | ED4_datamode datamode) |
|---|
| 56 | { |
|---|
| 57 | ED4_species_manager *species_manager; |
|---|
| 58 | ED4_multi_name_manager *multi_name_manager; |
|---|
| 59 | ED4_name_manager *name_manager; |
|---|
| 60 | ED4_species_name_terminal *species_name_terminal; |
|---|
| 61 | ED4_multi_sequence_manager *multi_sequence_manager; |
|---|
| 62 | char namebuffer[NAME_BUFFERSIZE]; |
|---|
| 63 | int count_too = 0; |
|---|
| 64 | ED4_index name_coords = 0, seq_coords = 0, local_count_position = 0, terminal_height; |
|---|
| 65 | GBDATA *gb_datamode = NULL; |
|---|
| 66 | |
|---|
| 67 | switch (datamode) { |
|---|
| 68 | case ED4_D_EXTENDED: { |
|---|
| 69 | gb_datamode = GBT_find_SAI(GLOBAL_gb_main, str); |
|---|
| 70 | break; |
|---|
| 71 | } |
|---|
| 72 | case ED4_D_SPECIES: { |
|---|
| 73 | gb_datamode = GBT_find_species(GLOBAL_gb_main, str); |
|---|
| 74 | break; |
|---|
| 75 | } |
|---|
| 76 | } |
|---|
| 77 | |
|---|
| 78 | if (!gb_datamode) { // didn't find this species |
|---|
| 79 | char dummy[150]; |
|---|
| 80 | not_found_counter++; |
|---|
| 81 | if (not_found_counter <= MAX_SHOWN_MISSING_SPECIES) { |
|---|
| 82 | sprintf(dummy, "%zu. %s\n", not_found_counter, str); |
|---|
| 83 | GBS_strcat(not_found_message, dummy); |
|---|
| 84 | } |
|---|
| 85 | return ED4_R_BREAK; |
|---|
| 86 | } |
|---|
| 87 | |
|---|
| 88 | // check whether sequence has data in desired alignment |
|---|
| 89 | bool has_alignment = 0 != GB_entry(gb_datamode, ED4_ROOT->alignment_name); |
|---|
| 90 | if (!has_alignment) { |
|---|
| 91 | if (datamode == ED4_D_SPECIES) { // only warn about species w/o data (SAIs are skipped silently) |
|---|
| 92 | char dummy[150]; |
|---|
| 93 | not_found_counter++; |
|---|
| 94 | if (not_found_counter <= MAX_SHOWN_MISSING_SPECIES) { |
|---|
| 95 | sprintf(dummy, "%zu. %s (no data in alignment)\n", not_found_counter, str); |
|---|
| 96 | GBS_strcat(not_found_message, dummy); |
|---|
| 97 | } |
|---|
| 98 | } |
|---|
| 99 | return ED4_R_BREAK; |
|---|
| 100 | } |
|---|
| 101 | |
|---|
| 102 | terminal_height = TERMINALHEIGHT; |
|---|
| 103 | local_count_position = curr_local_position; |
|---|
| 104 | |
|---|
| 105 | sprintf(namebuffer, "Species_Manager.%ld.%d", ED4_counter, count_too); |
|---|
| 106 | |
|---|
| 107 | ED4_species_type spec_type = (datamode == ED4_D_EXTENDED) ? ED4_SP_SAI : ED4_SP_SPECIES; |
|---|
| 108 | species_manager = new ED4_species_manager(spec_type, namebuffer, 0, local_count_position, 0, 0, multi_species_manager); |
|---|
| 109 | |
|---|
| 110 | species_manager->set_property(ED4_P_MOVABLE); |
|---|
| 111 | if (spec_type == ED4_SP_SAI) { |
|---|
| 112 | ED4_abstract_group_manager *group_man = species_manager->get_parent(ED4_level(ED4_L_GROUP|ED4_L_ROOTGROUP))->to_abstract_group_manager(); |
|---|
| 113 | group_man->table().ignore_me(); // ignore SAI tables (does not work - instead ignore SAIs when calculating consensus) |
|---|
| 114 | } |
|---|
| 115 | species_manager->set_species_pointer(gb_datamode); |
|---|
| 116 | multi_species_manager->children->append_member(species_manager); |
|---|
| 117 | |
|---|
| 118 | sprintf(namebuffer, "MultiName_Manager.%ld.%d", ED4_counter, count_too); |
|---|
| 119 | multi_name_manager = new ED4_multi_name_manager(namebuffer, 0, 0, 0, 0, species_manager); |
|---|
| 120 | species_manager->children->append_member(multi_name_manager); |
|---|
| 121 | |
|---|
| 122 | sprintf(namebuffer, "MultiSeq_Manager.%ld.%d", ED4_counter, count_too++); |
|---|
| 123 | multi_sequence_manager = new ED4_multi_sequence_manager(namebuffer, MAXSPECIESWIDTH-(group_depth*BRACKETWIDTH), 0, 0, 0, species_manager); |
|---|
| 124 | species_manager->children->append_member(multi_sequence_manager); |
|---|
| 125 | |
|---|
| 126 | sprintf(namebuffer, "Name_Manager%ld.%d", ED4_counter, count_too ++); // hier fehlt noch y |
|---|
| 127 | name_manager = new ED4_name_manager(namebuffer, 0, 0*terminal_height, 0, 0, multi_name_manager); // hier fehlt noch y |
|---|
| 128 | name_manager->set_property(ED4_P_MOVABLE); // only Speciesname should be movable !!!! |
|---|
| 129 | multi_name_manager->children->append_member(name_manager); |
|---|
| 130 | |
|---|
| 131 | sprintf(namebuffer, "Species_Name_Term%ld.%d", ED4_counter, count_too ++); |
|---|
| 132 | species_name_terminal = new ED4_species_name_terminal(namebuffer, 0, 0, MAXSPECIESWIDTH-(group_depth*BRACKETWIDTH), terminal_height, name_manager); |
|---|
| 133 | species_name_terminal->set_property((ED4_properties) (ED4_P_SELECTABLE | ED4_P_DRAGABLE | ED4_P_IS_HANDLE)); |
|---|
| 134 | species_name_terminal->set_links(NULL, ref_sequence_terminal); |
|---|
| 135 | species_name_terminal->set_species_pointer(GB_entry(gb_datamode, "name")); |
|---|
| 136 | name_manager->children->append_member(species_name_terminal); |
|---|
| 137 | |
|---|
| 138 | name_coords += terminal_height; |
|---|
| 139 | |
|---|
| 140 | search_sequence_data_rek(multi_sequence_manager, ref_sequence_info_terminal, ref_sequence_terminal, gb_datamode, |
|---|
| 141 | count_too, &seq_coords, &max_seq_terminal_length, ED4_A_DEFAULT, datamode == ED4_D_EXTENDED); |
|---|
| 142 | |
|---|
| 143 | local_count_position += max(name_coords, seq_coords); |
|---|
| 144 | name_coords = seq_coords = 0; |
|---|
| 145 | |
|---|
| 146 | if (!(multi_species_manager->flag.hidden)) { |
|---|
| 147 | *length_of_terminals = local_count_position-curr_local_position; |
|---|
| 148 | *y += *length_of_terminals; // needed for global coordinates of manager |
|---|
| 149 | } |
|---|
| 150 | |
|---|
| 151 | return ED4_R_OK; |
|---|
| 152 | } |
|---|
| 153 | |
|---|
| 154 | ED4_returncode EDB_root_bact::search_sequence_data_rek(ED4_multi_sequence_manager *multi_sequence_manager, |
|---|
| 155 | ED4_sequence_info_terminal *ref_sequence_info_terminal, |
|---|
| 156 | ED4_sequence_terminal *ref_sequence_terminal, |
|---|
| 157 | GBDATA *gb_datamode, |
|---|
| 158 | int count_too, |
|---|
| 159 | ED4_index *seq_coords, |
|---|
| 160 | ED4_index *max_sequence_terminal_length, |
|---|
| 161 | ED4_alignment alignment_flag, |
|---|
| 162 | bool isSAI) |
|---|
| 163 | { |
|---|
| 164 | AW_device *device; |
|---|
| 165 | int j = 0; |
|---|
| 166 | int pixel_length; |
|---|
| 167 | GBDATA *gb_ali_xxx = NULL; |
|---|
| 168 | GBDATA *gb_alignment; |
|---|
| 169 | long string_length; |
|---|
| 170 | char namebuffer[NAME_BUFFERSIZE]; |
|---|
| 171 | |
|---|
| 172 | device = ED4_ROOT->first_window->get_device(); |
|---|
| 173 | |
|---|
| 174 | if (alignment_flag == ED4_A_DEFAULT) { |
|---|
| 175 | gb_ali_xxx = GB_entry(gb_datamode, ED4_ROOT->alignment_name); |
|---|
| 176 | } |
|---|
| 177 | else if (alignment_flag == ED4_A_CONTAINER) { |
|---|
| 178 | gb_ali_xxx = gb_datamode; |
|---|
| 179 | } |
|---|
| 180 | if (!gb_ali_xxx) return ED4_R_OK; |
|---|
| 181 | |
|---|
| 182 | j=0; |
|---|
| 183 | for (gb_alignment = GB_child(gb_ali_xxx); gb_alignment; gb_alignment = GB_nextChild(gb_alignment)) { |
|---|
| 184 | GB_TYPES type = GB_read_type(gb_alignment); |
|---|
| 185 | |
|---|
| 186 | if (type == GB_INTS || type == GB_FLOATS) { |
|---|
| 187 | continue; |
|---|
| 188 | } |
|---|
| 189 | |
|---|
| 190 | if (type == GB_DB) { // we have to unpack container |
|---|
| 191 | search_sequence_data_rek(multi_sequence_manager, ref_sequence_info_terminal, ref_sequence_terminal, |
|---|
| 192 | gb_alignment, count_too, seq_coords, max_sequence_terminal_length, ED4_A_CONTAINER, isSAI); |
|---|
| 193 | } |
|---|
| 194 | else { // otherwise we enter the data |
|---|
| 195 | char *key_string = GB_read_key(gb_alignment); |
|---|
| 196 | if (key_string[0] != '_') { // don't show sequences starting with an underscore |
|---|
| 197 | sprintf(namebuffer, "Sequence_Manager.%ld.%d", ED4_counter, count_too++); |
|---|
| 198 | ED4_sequence_manager *seq_manager = new ED4_sequence_manager(namebuffer, 0, j*TERMINALHEIGHT, 0, 0, multi_sequence_manager); |
|---|
| 199 | seq_manager->set_property(ED4_P_MOVABLE); |
|---|
| 200 | multi_sequence_manager->children->append_member(seq_manager); |
|---|
| 201 | |
|---|
| 202 | ED4_sequence_info_terminal *sequence_info_terminal = |
|---|
| 203 | new ED4_sequence_info_terminal(key_string, 0, 0, SEQUENCEINFOSIZE, TERMINALHEIGHT, seq_manager); |
|---|
| 204 | sequence_info_terminal->set_property((ED4_properties) (ED4_P_SELECTABLE | ED4_P_DRAGABLE | ED4_P_IS_HANDLE)); |
|---|
| 205 | sequence_info_terminal->set_links(ref_sequence_info_terminal, ref_sequence_info_terminal); |
|---|
| 206 | sequence_info_terminal->set_species_pointer(gb_alignment); |
|---|
| 207 | seq_manager->children->append_member(sequence_info_terminal); |
|---|
| 208 | |
|---|
| 209 | ED4_text_terminal *text_terminal = 0; |
|---|
| 210 | |
|---|
| 211 | bool is_data = false; |
|---|
| 212 | bool is_data2 = false; |
|---|
| 213 | bool is_bits = false; |
|---|
| 214 | bool is_quality = false; |
|---|
| 215 | |
|---|
| 216 | if (strcmp(key_string, "data") == 0) is_data = true; // SAI or species |
|---|
| 217 | else if (strcmp(key_string, "data2") == 0) is_data2 = true; // used by SAIs with two entries (e.g. first and second digit of 2-digit-numbers) |
|---|
| 218 | else if (strcmp(key_string, "bits") == 0) is_bits = true; // used by binary SAIs (e.g. MARKERLINE) |
|---|
| 219 | else if (strcmp(key_string, "quality") == 0) is_quality = true; // used by "quality" entry written by chimera check; see ../STAT/ST_quality.cxx@chimera_check_quality_string |
|---|
| 220 | |
|---|
| 221 | bool is_aligned = is_data || is_data2 || is_bits || is_quality; |
|---|
| 222 | |
|---|
| 223 | if (is_aligned) { |
|---|
| 224 | bool shall_display_secinfo = is_data; |
|---|
| 225 | |
|---|
| 226 | if (isSAI) { |
|---|
| 227 | GBDATA *gb_sai = GB_get_grandfather(gb_alignment); |
|---|
| 228 | GBDATA *gb_disp_sec = GB_searchOrCreate_int(gb_sai, "showsec", 0); |
|---|
| 229 | shall_display_secinfo = GB_read_int(gb_disp_sec); |
|---|
| 230 | } |
|---|
| 231 | |
|---|
| 232 | sprintf(namebuffer, "Sequence_Term%ld.%d", ED4_counter, count_too++); |
|---|
| 233 | ED4_sequence_terminal *seq_term = new ED4_sequence_terminal(namebuffer, SEQUENCEINFOSIZE, 0, 0, TERMINALHEIGHT, seq_manager, shall_display_secinfo); |
|---|
| 234 | seq_term->species_name = seq_term->get_name_of_species(); |
|---|
| 235 | |
|---|
| 236 | if (is_data) seq_term->set_property(ED4_P_CONSENSUS_RELEVANT); |
|---|
| 237 | seq_term->set_property(ED4_P_ALIGNMENT_DATA); |
|---|
| 238 | |
|---|
| 239 | text_terminal = seq_term; |
|---|
| 240 | } |
|---|
| 241 | else { |
|---|
| 242 | sprintf(namebuffer, "PureText_Term%ld.%d", ED4_counter, count_too++); |
|---|
| 243 | text_terminal = new ED4_pure_text_terminal(namebuffer, SEQUENCEINFOSIZE, 0, 0, TERMINALHEIGHT, seq_manager); |
|---|
| 244 | } |
|---|
| 245 | |
|---|
| 246 | text_terminal->set_property(ED4_P_CURSOR_ALLOWED); |
|---|
| 247 | text_terminal->set_links(ref_sequence_terminal, ref_sequence_terminal); |
|---|
| 248 | seq_manager->children->append_member(text_terminal); |
|---|
| 249 | #if defined(DEBUG) |
|---|
| 250 | // ensure only 1 terminal is consensus-relevant! |
|---|
| 251 | if (is_data) { |
|---|
| 252 | seq_manager->get_consensus_relevant_terminal(); // does an error otherwise! |
|---|
| 253 | } |
|---|
| 254 | #endif // DEBUG |
|---|
| 255 | text_terminal->set_species_pointer(gb_alignment); |
|---|
| 256 | |
|---|
| 257 | if (gb_alignment) { |
|---|
| 258 | string_length = GB_read_count(gb_alignment); |
|---|
| 259 | } |
|---|
| 260 | else { |
|---|
| 261 | string_length = 100; |
|---|
| 262 | } |
|---|
| 263 | |
|---|
| 264 | pixel_length = device->get_string_size(ED4_G_SEQUENCES, NULL, string_length) + 100; |
|---|
| 265 | |
|---|
| 266 | *max_sequence_terminal_length = max(*max_sequence_terminal_length, pixel_length); |
|---|
| 267 | text_terminal->extension.size[WIDTH] = pixel_length; |
|---|
| 268 | |
|---|
| 269 | if (MAXSEQUENCECHARACTERLENGTH < string_length) { |
|---|
| 270 | MAXSEQUENCECHARACTERLENGTH = string_length; |
|---|
| 271 | ref_sequence_terminal->extension.size[WIDTH] = pixel_length; |
|---|
| 272 | } |
|---|
| 273 | |
|---|
| 274 | if (!ED4_ROOT->scroll_links.link_for_hor_slider) { |
|---|
| 275 | ED4_ROOT->scroll_links.link_for_hor_slider = text_terminal; |
|---|
| 276 | } |
|---|
| 277 | else if (*max_sequence_terminal_length > ED4_ROOT->scroll_links.link_for_hor_slider->extension.size[WIDTH]) { |
|---|
| 278 | ED4_ROOT->scroll_links.link_for_hor_slider = text_terminal; |
|---|
| 279 | } |
|---|
| 280 | |
|---|
| 281 | *seq_coords += TERMINALHEIGHT; |
|---|
| 282 | j++; |
|---|
| 283 | } |
|---|
| 284 | free(key_string); |
|---|
| 285 | } |
|---|
| 286 | } |
|---|
| 287 | |
|---|
| 288 | return ED4_R_OK; |
|---|
| 289 | } |
|---|
| 290 | |
|---|
| 291 | |
|---|
| 292 | char* EDB_root_bact::make_string() |
|---|
| 293 | { |
|---|
| 294 | const char *sep_name = "\1"; // Trennzeichen |
|---|
| 295 | char* configstring = new char[500]; |
|---|
| 296 | |
|---|
| 297 | strcpy(configstring, sep_name); |
|---|
| 298 | |
|---|
| 299 | strcat(configstring, "FGruppe1lang"); |
|---|
| 300 | strcat(configstring, sep_name); |
|---|
| 301 | strcat(configstring, "SHELIX_PAIRS"); |
|---|
| 302 | strcat(configstring, sep_name); |
|---|
| 303 | strcat(configstring, "SHELIX_LINE"); |
|---|
| 304 | strcat(configstring, sep_name); |
|---|
| 305 | strcat(configstring, "E"); |
|---|
| 306 | strcat(configstring, sep_name); |
|---|
| 307 | strcat(configstring, "GFltDorot"); // Speciesmark L |
|---|
| 308 | strcat(configstring, sep_name); |
|---|
| 309 | strcat(configstring, "LCasElega"); |
|---|
| 310 | strcat(configstring, sep_name); |
|---|
| 311 | strcat(configstring, "E"); |
|---|
| 312 | strcat(configstring, sep_name); |
|---|
| 313 | strcat(configstring, "LBaeFrag3"); |
|---|
| 314 | strcat(configstring, sep_name); |
|---|
| 315 | strcat(configstring, "LFlaFerr2"); |
|---|
| 316 | strcat(configstring, sep_name); |
|---|
| 317 | strcat(configstring, "LCytLyti3"); |
|---|
| 318 | strcat(configstring, "\0"); |
|---|
| 319 | |
|---|
| 320 | return configstring; |
|---|
| 321 | } |
|---|
| 322 | |
|---|
| 323 | char* EDB_root_bact::make_top_bot_string() // is only called when started manually |
|---|
| 324 | { |
|---|
| 325 | char* configstring; |
|---|
| 326 | configstring = new char[400]; |
|---|
| 327 | sprintf(configstring, "%cFSAI's%cSHELIX_PAIRS%cSHELIX_LINE%cSALI_ERR%cSALI_CON%cSALI_INT%cSALI_BIND%cSantibiot%cSmodnuc%cSelong%cStRNA%cSALI_BOR%cSALI_PRE_I%cSALI_PRE%cSALI_INSERTS%cSinseuca2%cSregaps%cSallr5%cSbacr5%cSarcr5%cSeucr5%cSgplr5%cSinsEuca%cSprimer1%cSprimer2%cSbetar5%cSprimer3%cE", 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1); |
|---|
| 328 | |
|---|
| 329 | strcat(configstring, "\0"); |
|---|
| 330 | |
|---|
| 331 | return configstring; |
|---|
| 332 | } |
|---|
| 333 | |
|---|
| 334 | |
|---|
| 335 | ED4_returncode EDB_root_bact::fill_species(ED4_multi_species_manager *multi_species_manager, |
|---|
| 336 | ED4_sequence_info_terminal *ref_sequence_info_terminal, |
|---|
| 337 | ED4_sequence_terminal *ref_sequence_terminal, |
|---|
| 338 | char *str, |
|---|
| 339 | int *index, |
|---|
| 340 | ED4_index *y, |
|---|
| 341 | ED4_index curr_local_position, |
|---|
| 342 | ED4_index *length_of_terminals, // height of terminals is meant |
|---|
| 343 | int group_depth, |
|---|
| 344 | arb_progress *progress) |
|---|
| 345 | { |
|---|
| 346 | #define SHIPSIZE 1024 |
|---|
| 347 | |
|---|
| 348 | char *ship; |
|---|
| 349 | int lauf = 0; |
|---|
| 350 | ED4_index local_count_position = 0; |
|---|
| 351 | ED4_index height_of_created_terminals = 0; |
|---|
| 352 | bool word = 0; |
|---|
| 353 | ED4_datamode datamode = ED4_D_SPECIES; |
|---|
| 354 | ED4_returncode retCode = ED4_R_OK; |
|---|
| 355 | |
|---|
| 356 | ship = (char*)GB_calloc(SHIPSIZE, sizeof(*ship)); |
|---|
| 357 | local_count_position = curr_local_position; |
|---|
| 358 | |
|---|
| 359 | do { |
|---|
| 360 | if (word == 0) { // word is needed for jump over separator |
|---|
| 361 | if (str[(*index)+1] == 'L') { |
|---|
| 362 | datamode = ED4_D_SPECIES; |
|---|
| 363 | } |
|---|
| 364 | else if (str[(*index)+1] == 'S') { |
|---|
| 365 | datamode = ED4_D_EXTENDED; |
|---|
| 366 | } |
|---|
| 367 | else { |
|---|
| 368 | |
|---|
| 369 | const char *entry = str+*index+1; |
|---|
| 370 | char tag = entry[0]; |
|---|
| 371 | const char *sep = strchr(entry, 1); |
|---|
| 372 | |
|---|
| 373 | if (sep) { |
|---|
| 374 | int len = sep-entry+1; |
|---|
| 375 | char *content = (char*)GB_calloc(len+1, 1); |
|---|
| 376 | memcpy(content, entry+1, len); |
|---|
| 377 | |
|---|
| 378 | char *message = GBS_global_string_copy("Unknown or misplaced tag-id '%c' (with content '%s'). Error in configuration-data!\nTrying to continue..", tag, content); |
|---|
| 379 | fprintf(stderr, "ARB_EDIT4: %s\n", message); |
|---|
| 380 | aw_message(message); |
|---|
| 381 | |
|---|
| 382 | free(message); |
|---|
| 383 | free(content); |
|---|
| 384 | retCode = ED4_R_WARNING; |
|---|
| 385 | |
|---|
| 386 | (*index) += sep-entry+1; // set index to next separator |
|---|
| 387 | continue; |
|---|
| 388 | } |
|---|
| 389 | else { |
|---|
| 390 | fprintf(stderr, "Error reading configuration: Unexpected end of data (at '%s')\n", str+*index); |
|---|
| 391 | |
|---|
| 392 | e4_assert(0); |
|---|
| 393 | retCode = ED4_R_ERROR; |
|---|
| 394 | break; |
|---|
| 395 | } |
|---|
| 396 | e4_assert(0); // never reached! |
|---|
| 397 | } |
|---|
| 398 | |
|---|
| 399 | (*index) += 2; |
|---|
| 400 | } |
|---|
| 401 | |
|---|
| 402 | if (str[*index] != 1) { |
|---|
| 403 | ship[lauf++] = str[*index]; |
|---|
| 404 | word = 1; |
|---|
| 405 | (*index)++; |
|---|
| 406 | } |
|---|
| 407 | |
|---|
| 408 | if (str[*index] == 1 || str[*index] == '\0') { |
|---|
| 409 | ship[lauf] = '\0'; // speciesname-generation is finished |
|---|
| 410 | lauf = 0; |
|---|
| 411 | |
|---|
| 412 | if (progress) { |
|---|
| 413 | progress->inc(); |
|---|
| 414 | if (progress->aborted()) ED4_exit(); |
|---|
| 415 | } |
|---|
| 416 | |
|---|
| 417 | fill_data(multi_species_manager, ref_sequence_info_terminal, ref_sequence_terminal, ship /* species name */, |
|---|
| 418 | y, local_count_position, &height_of_created_terminals, group_depth, datamode); |
|---|
| 419 | |
|---|
| 420 | ED4_counter++; |
|---|
| 421 | local_count_position += height_of_created_terminals; |
|---|
| 422 | *length_of_terminals += height_of_created_terminals; |
|---|
| 423 | word = 0; |
|---|
| 424 | } |
|---|
| 425 | } while (!((str[(*index)] == 1) && (str[(*index)+1] == 'G' || str[(*index)+1]=='E' || str[(*index)+1]=='F')) |
|---|
| 426 | && (str[*index] != '\0')); |
|---|
| 427 | |
|---|
| 428 | free(ship); |
|---|
| 429 | return retCode; |
|---|
| 430 | #undef SHIPSIZE |
|---|
| 431 | } |
|---|
| 432 | |
|---|
| 433 | ED4_index EDB_root_bact::scan_string(ED4_multi_species_manager *parent, |
|---|
| 434 | ED4_sequence_info_terminal *ref_sequence_info_terminal, |
|---|
| 435 | ED4_sequence_terminal *ref_sequence_terminal, |
|---|
| 436 | char *str, |
|---|
| 437 | int *index, |
|---|
| 438 | ED4_index *y, |
|---|
| 439 | arb_progress& progress) |
|---|
| 440 | { |
|---|
| 441 | ED4_multi_species_manager *multi_species_manager = NULL; |
|---|
| 442 | ED4_bracket_terminal *bracket_terminal = NULL; |
|---|
| 443 | ED4_spacer_terminal *group_spacer_terminal = NULL; |
|---|
| 444 | char namebuffer[NAME_BUFFERSIZE]; |
|---|
| 445 | char groupname[GB_GROUP_NAME_MAX]; |
|---|
| 446 | ED4_index y_old = 0; |
|---|
| 447 | ED4_index lauf = 0; |
|---|
| 448 | ED4_index local_count_position = 0; |
|---|
| 449 | ED4_index length_of_terminals = 0; |
|---|
| 450 | static int group_depth = 0; |
|---|
| 451 | bool is_folded = 0; |
|---|
| 452 | |
|---|
| 453 | if (!parent->parent->is_area_manager()) { // add 25 if group is not child of; not the first time! |
|---|
| 454 | local_count_position = TERMINALHEIGHT + SPACERHEIGHT; // a folded group |
|---|
| 455 | } |
|---|
| 456 | |
|---|
| 457 | while (str[(*index)] != '\0' && str[(*index)+1] != 'E') { // E = |
|---|
| 458 | if (str[(*index)+1] == 'L' || str[(*index)+1] == 'S') { // L = species, S = SAI |
|---|
| 459 | length_of_terminals = 0; |
|---|
| 460 | |
|---|
| 461 | fill_species(parent, ref_sequence_info_terminal, ref_sequence_terminal, str, index, |
|---|
| 462 | y, local_count_position, &length_of_terminals, group_depth, &progress); |
|---|
| 463 | |
|---|
| 464 | local_count_position += length_of_terminals; |
|---|
| 465 | ED4_counter ++; // counter is only needed to generate |
|---|
| 466 | } |
|---|
| 467 | |
|---|
| 468 | if (str[(*index)] && (str[(*index)+1] == 'G' || str[(*index)+1] == 'F')) { // Group or folded group |
|---|
| 469 | group_depth++; |
|---|
| 470 | is_folded = str[(*index)+1]=='F'; |
|---|
| 471 | |
|---|
| 472 | for (*index += 2, lauf = 0; str[*index] != 1; (*index)++) { // Jump over 'G' and Blank to get Groupname |
|---|
| 473 | groupname[lauf++] = str[*index]; |
|---|
| 474 | } |
|---|
| 475 | groupname[lauf] = '\0'; |
|---|
| 476 | |
|---|
| 477 | create_group_header(parent, ref_sequence_info_terminal, ref_sequence_terminal, &multi_species_manager, &bracket_terminal, |
|---|
| 478 | y, groupname, group_depth, is_folded, local_count_position); |
|---|
| 479 | |
|---|
| 480 | y_old = local_count_position; |
|---|
| 481 | ED4_counter++; |
|---|
| 482 | |
|---|
| 483 | local_count_position += scan_string(multi_species_manager, ref_sequence_info_terminal, ref_sequence_terminal, str, index, y, progress); |
|---|
| 484 | sprintf(namebuffer, "Group_Spacer_Terminal_End.%ld", ED4_counter); |
|---|
| 485 | |
|---|
| 486 | local_count_position += SPACERHEIGHT; |
|---|
| 487 | |
|---|
| 488 | bracket_terminal->extension.size[HEIGHT] = local_count_position - y_old; |
|---|
| 489 | group_spacer_terminal = new ED4_spacer_terminal(namebuffer, false, 0, local_count_position - y_old + SPACERHEIGHT, 10, SPACERHEIGHT, multi_species_manager); |
|---|
| 490 | bracket_terminal->set_links(NULL, multi_species_manager); |
|---|
| 491 | |
|---|
| 492 | (*y) += SPACERHEIGHT; |
|---|
| 493 | |
|---|
| 494 | multi_species_manager->children->append_member(group_spacer_terminal); |
|---|
| 495 | |
|---|
| 496 | if (is_folded) { |
|---|
| 497 | multi_species_manager->hide_children(); |
|---|
| 498 | is_folded = 0; |
|---|
| 499 | } |
|---|
| 500 | } |
|---|
| 501 | } |
|---|
| 502 | |
|---|
| 503 | if (str[(*index)] && str[(*index)+1] == 'E') { |
|---|
| 504 | (*index)+=2; |
|---|
| 505 | group_depth--; |
|---|
| 506 | } |
|---|
| 507 | |
|---|
| 508 | return local_count_position; |
|---|
| 509 | } |
|---|
| 510 | |
|---|
| 511 | ED4_returncode EDB_root_bact::create_group_header(ED4_multi_species_manager *parent, |
|---|
| 512 | ED4_sequence_info_terminal *ref_sequence_info_terminal, |
|---|
| 513 | ED4_sequence_terminal *ref_sequence_terminal, |
|---|
| 514 | ED4_multi_species_manager **multi_species_manager, |
|---|
| 515 | ED4_bracket_terminal **bracket_terminal, |
|---|
| 516 | ED4_index *y, |
|---|
| 517 | char *groupname, |
|---|
| 518 | int group_depth, |
|---|
| 519 | bool is_folded, |
|---|
| 520 | ED4_index local_count_position) |
|---|
| 521 | { |
|---|
| 522 | ED4_species_manager *species_manager = NULL; |
|---|
| 523 | ED4_species_name_terminal *species_name_terminal = NULL; |
|---|
| 524 | ED4_sequence_manager *sequence_manager = NULL; |
|---|
| 525 | ED4_sequence_info_terminal *sequence_info_terminal = NULL; |
|---|
| 526 | ED4_sequence_terminal *sequence_terminal = NULL; |
|---|
| 527 | ED4_spacer_terminal *group_spacer_terminal = NULL; |
|---|
| 528 | ED4_group_manager *group_manager = NULL; |
|---|
| 529 | |
|---|
| 530 | |
|---|
| 531 | char namebuffer[NAME_BUFFERSIZE]; |
|---|
| 532 | int height_spacer; |
|---|
| 533 | int height_terminal; |
|---|
| 534 | int pixel_length; |
|---|
| 535 | AW_device *device; |
|---|
| 536 | |
|---|
| 537 | |
|---|
| 538 | height_terminal = TERMINALHEIGHT; |
|---|
| 539 | height_spacer = SPACERHEIGHT; |
|---|
| 540 | |
|---|
| 541 | sprintf(namebuffer, "Group_Manager.%ld", ED4_counter); // create new group manager |
|---|
| 542 | group_manager = new ED4_group_manager(namebuffer, 0, local_count_position, 0, 0, parent); |
|---|
| 543 | parent->children->append_member(group_manager); |
|---|
| 544 | |
|---|
| 545 | sprintf(namebuffer, "Bracket_Terminal.%ld", ED4_counter); |
|---|
| 546 | *bracket_terminal = new ED4_bracket_terminal(namebuffer, 0, 0, BRACKETWIDTH, 0, group_manager); |
|---|
| 547 | group_manager->children->append_member(*bracket_terminal); |
|---|
| 548 | |
|---|
| 549 | sprintf(namebuffer, "MultiSpecies_Manager.%ld", ED4_counter); // create new multi_species_manager |
|---|
| 550 | *multi_species_manager = new ED4_multi_species_manager(namebuffer, BRACKETWIDTH, 0, 0, 0, group_manager); // Objekt Gruppen name_terminal noch |
|---|
| 551 | group_manager->children->append_member(*multi_species_manager); // auszeichnen |
|---|
| 552 | |
|---|
| 553 | if (is_folded) // only set FOLDED-flag if group |
|---|
| 554 | { // is folded |
|---|
| 555 | group_manager->set_property((ED4_properties) (ED4_P_IS_FOLDED | ED4_P_MOVABLE)); |
|---|
| 556 | (*multi_species_manager)->set_property((ED4_properties) (ED4_P_IS_FOLDED | ED4_P_IS_HANDLE)); |
|---|
| 557 | (*bracket_terminal)->set_property((ED4_properties) (ED4_P_IS_FOLDED | ED4_P_IS_HANDLE)); |
|---|
| 558 | } |
|---|
| 559 | else |
|---|
| 560 | { |
|---|
| 561 | group_manager->set_property(ED4_P_MOVABLE); |
|---|
| 562 | (*multi_species_manager)->set_property(ED4_P_IS_HANDLE); |
|---|
| 563 | (*bracket_terminal)->set_property(ED4_P_IS_HANDLE); |
|---|
| 564 | } |
|---|
| 565 | |
|---|
| 566 | sprintf(namebuffer, "Group_Spacer_Terminal_Beg.%ld", ED4_counter); // Spacer at beginning of group |
|---|
| 567 | group_spacer_terminal = new ED4_spacer_terminal(namebuffer, false, 0, 0, 10, height_spacer, *multi_species_manager); // For better Overview |
|---|
| 568 | (*multi_species_manager)->children->append_member(group_spacer_terminal); |
|---|
| 569 | |
|---|
| 570 | sprintf(namebuffer, "Consensus_Manager.%ld", ED4_counter); // Create competence terminal |
|---|
| 571 | species_manager = new ED4_species_manager(ED4_SP_CONSENSUS, namebuffer, 0, height_spacer, 0, 0, *multi_species_manager); |
|---|
| 572 | species_manager->set_property(ED4_P_MOVABLE); |
|---|
| 573 | (*multi_species_manager)->children->append_member(species_manager); |
|---|
| 574 | |
|---|
| 575 | species_name_terminal = new ED4_species_name_terminal(groupname, 0, 0, MAXSPECIESWIDTH-(group_depth*BRACKETWIDTH), height_terminal, species_manager); |
|---|
| 576 | species_name_terminal->set_property((ED4_properties) (ED4_P_SELECTABLE | ED4_P_DRAGABLE | ED4_P_IS_HANDLE)); // only some terminals |
|---|
| 577 | species_name_terminal->set_links(NULL, ref_sequence_terminal); |
|---|
| 578 | species_manager->children->append_member(species_name_terminal); // properties |
|---|
| 579 | |
|---|
| 580 | sprintf(namebuffer, "Consensus_Seq_Manager.%ld", ED4_counter); |
|---|
| 581 | sequence_manager = new ED4_sequence_manager(namebuffer, MAXSPECIESWIDTH-(group_depth*BRACKETWIDTH), 0, 0, 0, species_manager); |
|---|
| 582 | sequence_manager->set_property(ED4_P_MOVABLE); |
|---|
| 583 | species_manager->children->append_member(sequence_manager); |
|---|
| 584 | |
|---|
| 585 | sequence_info_terminal = new ED4_sequence_info_terminal("CONS", 0, 0, SEQUENCEINFOSIZE, height_terminal, sequence_manager); // Info fuer Gruppe |
|---|
| 586 | sequence_info_terminal->set_links(ref_sequence_info_terminal, ref_sequence_info_terminal); |
|---|
| 587 | sequence_info_terminal->set_property((ED4_properties) (ED4_P_SELECTABLE | ED4_P_DRAGABLE | ED4_P_IS_HANDLE)); |
|---|
| 588 | sequence_manager->children->append_member(sequence_info_terminal); |
|---|
| 589 | |
|---|
| 590 | device = ED4_ROOT->first_window->get_device(); |
|---|
| 591 | pixel_length = device->get_string_size(ED4_G_SEQUENCES, CONSENSUS, 0); |
|---|
| 592 | |
|---|
| 593 | sequence_terminal = new ED4_consensus_sequence_terminal(CONSENSUS, SEQUENCEINFOSIZE, 0, pixel_length + 10, height_terminal, sequence_manager); |
|---|
| 594 | sequence_terminal->set_property(ED4_P_CURSOR_ALLOWED); |
|---|
| 595 | sequence_terminal->set_links(ref_sequence_terminal, ref_sequence_terminal); |
|---|
| 596 | sequence_manager->children->append_member(sequence_terminal); |
|---|
| 597 | |
|---|
| 598 | (*y) += height_terminal + height_spacer; |
|---|
| 599 | |
|---|
| 600 | return ED4_R_OK; |
|---|
| 601 | } |
|---|
| 602 | |
|---|
| 603 | char *EDB_root_bact::generate_config_string(char *confname) // and save it in database |
|---|
| 604 | { |
|---|
| 605 | int i; |
|---|
| 606 | long string_length; |
|---|
| 607 | char *generated_string = NULL; |
|---|
| 608 | int counter = 0; |
|---|
| 609 | GBDATA *gb_area; |
|---|
| 610 | ED4_device_manager *device_manager = ED4_ROOT->get_device_manager(); |
|---|
| 611 | |
|---|
| 612 | for (i=0; i<device_manager->children->members(); i++) { |
|---|
| 613 | if (device_manager->children->member(i)->is_area_manager()) { |
|---|
| 614 | GB_begin_transaction(GLOBAL_gb_main); |
|---|
| 615 | device_manager->children->member(i)->generate_configuration_string(&generated_string); |
|---|
| 616 | |
|---|
| 617 | string_length = strlen(generated_string); |
|---|
| 618 | if (generated_string[string_length - 1] == 1) |
|---|
| 619 | generated_string[string_length - 1] = '\0'; |
|---|
| 620 | |
|---|
| 621 | GBDATA *gb_configuration = GBT_create_configuration(GLOBAL_gb_main, confname); |
|---|
| 622 | |
|---|
| 623 | if (counter == 0) { |
|---|
| 624 | gb_area = GB_search(gb_configuration, "top_area", GB_STRING); |
|---|
| 625 | counter ++; |
|---|
| 626 | } |
|---|
| 627 | else { |
|---|
| 628 | gb_area = GB_search(gb_configuration, "middle_area", GB_STRING); |
|---|
| 629 | } |
|---|
| 630 | |
|---|
| 631 | GB_ERROR error = 0; |
|---|
| 632 | error = GB_write_string(gb_area, generated_string); |
|---|
| 633 | if (error) aw_message(error); |
|---|
| 634 | |
|---|
| 635 | GB_commit_transaction(GLOBAL_gb_main); |
|---|
| 636 | |
|---|
| 637 | delete [] generated_string; |
|---|
| 638 | generated_string = NULL; |
|---|
| 639 | } |
|---|
| 640 | } |
|---|
| 641 | |
|---|
| 642 | return generated_string; |
|---|
| 643 | } |
|---|