const std::vector<int>& City::get_requests() const { refresh_intermediates(); #if 0 for (auto it = request_indices.begin(); it != request_indices.end(); ++it) { int to = *it; if (get_stop(to)->get_operation() == Store || get_stop(to)->get_operation() == UnStore || get_stop(to)->get_operation() == Dump) { std::cout << "Error" << get_stop(to)->get_operation() << std::endl; die(); } } #endif return request_indices; }
static void menu_draw_row_callback(GContext* ctx, const Layer *cell_layer, MenuIndex *cell_index, void *callback_context) { stop_t *stop; switch (cell_index->section) { case MENU_SECTION_MAIN: stop = get_stop(cell_index->row); if (stop == NULL) { return; } menu_cell_basic_draw(ctx, cell_layer, stop->name, NULL, NULL); break; } }
static void menu_select_click_callback(MenuLayer* menu_layer, MenuIndex* cell_index, void* callback_context) { realtime_transport_type_t *ttype = (realtime_transport_type_t *) callback_context; if (!layer_get_hidden(transport_type_to_loadinglayer_map[*ttype])) { APP_LOG(APP_LOG_LEVEL_DEBUG, "No clicks allowed while loading layer is visible"); return; } stop_t *stop; switch (cell_index->section) { case MENU_SECTION_MAIN: stop = get_stop(cell_index->row); if (stop == NULL) { return; } show_departures_window(stop->id, *ttype, true); break; } }
static int /* O - 0 = success, 1 = fail */ make_subpackage(const char *prodname, /* I - Product short name */ const char *directory, /* I - Directory for distribution files */ const char *platname, /* I - Platform name */ dist_t *dist, /* I - Distribution information */ struct utsname *platform, /* I - Platform information */ const char *subpackage) /* I - Subpackage */ { int i, j; /* Looping vars */ const char *header; /* Dependency header string */ FILE *fp; /* Control file */ char prodfull[255], /* Full name of product */ name[1024], /* Full product name */ filename[1024]; /* Destination filename */ command_t *c; /* Current command */ depend_t *d; /* Current dependency */ file_t *file; /* Current distribution file */ struct passwd *pwd; /* Pointer to user record */ struct group *grp; /* Pointer to group record */ const char *runlevels, /* Run levels */ *rlptr; /* Pointer into runlevels */ static const char *depends[] = /* Dependency names */ { "Depends:", "Conflicts:", "Replaces:", "Provides:" }; /* * Figure out the full name of the distribution... */ if (subpackage) snprintf(prodfull, sizeof(prodfull), "%s-%s", prodname, subpackage); else strlcpy(prodfull, prodname, sizeof(prodfull)); /* * Then the subdirectory name... */ if (dist->release[0]) snprintf(name, sizeof(name), "%s-%s-%s", prodfull, dist->version, dist->release); else snprintf(name, sizeof(name), "%s-%s", prodfull, dist->version); if (platname[0]) { strlcat(name, "-", sizeof(name)); strlcat(name, platname, sizeof(name)); } if (Verbosity) printf("Creating Debian %s distribution...\n", name); /* * Write the control file for DPKG... */ if (Verbosity) puts("Creating control file..."); snprintf(filename, sizeof(filename), "%s/%s", directory, name); mkdir(filename, 0777); strlcat(filename, "/DEBIAN", sizeof(filename)); mkdir(filename, 0777); chmod(filename, 0755); strlcat(filename, "/control", sizeof(filename)); if ((fp = fopen(filename, "w")) == NULL) { fprintf(stderr, "epm: Unable to create control file \"%s\" - %s\n", filename, strerror(errno)); return (1); } fprintf(fp, "Package: %s\n", prodfull); if (dist->release[0]) fprintf(fp, "Version: %s-%s\n", dist->version, dist->release); else fprintf(fp, "Version: %s\n", dist->version); fprintf(fp, "Maintainer: %s\n", dist->vendor); /* * The Architecture attribute needs to match the uname info * (which we change in get_platform to a common name) */ if (!strcmp(platform->machine, "intel")) fputs("Architecture: i386\n", fp); else if (!strcmp(platform->machine, "ppc")) fputs("Architecture: powerpc\n", fp); else fprintf(fp, "Architecture: %s\n", platform->machine); fprintf(fp, "Description: %s\n", dist->product); fprintf(fp, " Copyright: %s\n", dist->copyright); for (i = 0; i < dist->num_descriptions; i ++) if (dist->descriptions[i].subpackage == subpackage) fprintf(fp, " %s\n", dist->descriptions[i].description); for (j = DEPEND_REQUIRES; j <= DEPEND_PROVIDES; j ++) { for (i = dist->num_depends, d = dist->depends; i > 0; i --, d ++) if (d->type == j && d->subpackage == subpackage) break; if (i) { for (header = depends[j]; i > 0; i --, d ++, header = ",") if (d->type == j && d->subpackage == subpackage) { if (!strcmp(d->product, "_self")) fprintf(fp, "%s %s", header, prodname); else fprintf(fp, "%s %s", header, d->product); if (d->vernumber[0] == 0) { if (d->vernumber[1] < INT_MAX) fprintf(fp, " (<= %s)", d->version[1]); } else { if (d->vernumber[1] < INT_MAX) fprintf(fp, " (>= %s, <= %s)", d->version[0], d->version[1]); else fprintf(fp, " (>= %s)", d->version[0]); } } putc('\n', fp); } } fclose(fp); /* * Write the preinst file for DPKG... */ for (i = dist->num_commands, c = dist->commands; i > 0; i --, c ++) if (c->type == COMMAND_PRE_INSTALL && c->subpackage == subpackage) break; if (i) { if (Verbosity) puts("Creating preinst script..."); snprintf(filename, sizeof(filename), "%s/%s/DEBIAN/preinst", directory, name); if ((fp = fopen(filename, "w")) == NULL) { fprintf(stderr, "epm: Unable to create script file \"%s\" - %s\n", filename, strerror(errno)); return (1); } fchmod(fileno(fp), 0755); fputs("#!/bin/sh\n", fp); fputs("# " EPM_VERSION "\n", fp); for (; i > 0; i --, c ++) if (c->type == COMMAND_PRE_INSTALL && c->subpackage == subpackage) fprintf(fp, "%s\n", c->command); fclose(fp); } /* * Write the postinst file for DPKG... */ for (i = dist->num_commands, c = dist->commands; i > 0; i --, c ++) if (c->type == COMMAND_POST_INSTALL && c->subpackage == subpackage) break; if (!i) for (i = dist->num_files, file = dist->files; i > 0; i --, file ++) if (tolower(file->type) == 'i' && file->subpackage == subpackage) break; if (i) { if (Verbosity) puts("Creating postinst script..."); snprintf(filename, sizeof(filename), "%s/%s/DEBIAN/postinst", directory, name); if ((fp = fopen(filename, "w")) == NULL) { fprintf(stderr, "epm: Unable to create script file \"%s\" - %s\n", filename, strerror(errno)); return (1); } fchmod(fileno(fp), 0755); fputs("#!/bin/sh\n", fp); fputs("# " EPM_VERSION "\n", fp); for (i = dist->num_commands, c = dist->commands; i > 0; i --, c ++) if (c->type == COMMAND_POST_INSTALL && c->subpackage == subpackage) fprintf(fp, "%s\n", c->command); for (i = dist->num_files, file = dist->files; i > 0; i --, file ++) if (tolower(file->type) == 'i' && file->subpackage == subpackage) { runlevels = get_runlevels(file, "02345"); fprintf(fp, "update-rc.d %s start %02d", file->dst, get_start(file, 99)); for (rlptr = runlevels; isdigit(*rlptr & 255); rlptr ++) if (*rlptr != '0') fprintf(fp, " %c", *rlptr); if (strchr(runlevels, '0') != NULL) fprintf(fp, " . stop %02d 0", get_stop(file, 0)); fputs(" . >/dev/null\n", fp); fprintf(fp, "/etc/init.d/%s start\n", file->dst); } fclose(fp); } /* * Write the prerm file for DPKG... */ for (i = dist->num_commands, c = dist->commands; i > 0; i --, c ++) if (c->type == COMMAND_PRE_REMOVE && c->subpackage == subpackage) break; if (!i) for (i = dist->num_files, file = dist->files; i > 0; i --, file ++) if (tolower(file->type) == 'i' && file->subpackage == subpackage) break; if (i) { if (Verbosity) puts("Creating prerm script..."); snprintf(filename, sizeof(filename), "%s/%s/DEBIAN/prerm", directory, name); if ((fp = fopen(filename, "w")) == NULL) { fprintf(stderr, "epm: Unable to create script file \"%s\" - %s\n", filename, strerror(errno)); return (1); } fchmod(fileno(fp), 0755); fputs("#!/bin/sh\n", fp); fputs("# " EPM_VERSION "\n", fp); for (i = dist->num_commands, c = dist->commands; i > 0; i --, c ++) if (c->type == COMMAND_PRE_REMOVE && c->subpackage == subpackage) fprintf(fp, "%s\n", c->command); for (i = dist->num_files, file = dist->files; i > 0; i --, file ++) if (tolower(file->type) == 'i' && file->subpackage == subpackage) fprintf(fp, "/etc/init.d/%s stop\n", file->dst); fclose(fp); } /* * Write the postrm file for DPKG... */ for (i = dist->num_commands, c = dist->commands; i > 0; i --, c ++) if (c->type == COMMAND_POST_REMOVE && c->subpackage == subpackage) break; if (!i) for (i = dist->num_files, file = dist->files; i > 0; i --, file ++) if (tolower(file->type) == 'i' && file->subpackage == subpackage) break; if (i) { if (Verbosity) puts("Creating postrm script..."); snprintf(filename, sizeof(filename), "%s/%s/DEBIAN/postrm", directory, name); if ((fp = fopen(filename, "w")) == NULL) { fprintf(stderr, "epm: Unable to create script file \"%s\" - %s\n", filename, strerror(errno)); return (1); } fchmod(fileno(fp), 0755); fputs("#!/bin/sh\n", fp); fputs("# " EPM_VERSION "\n", fp); for (i = dist->num_commands, c = dist->commands; i > 0; i --, c ++) if (c->type == COMMAND_POST_REMOVE && c->subpackage == subpackage) fprintf(fp, "%s\n", c->command); for (i = dist->num_files, file = dist->files; i > 0; i --, file ++) if (tolower(file->type) == 'i' && file->subpackage == subpackage) { fputs("if [ purge = \"$1\" ]; then\n", fp); fprintf(fp, " update-rc.d %s remove >/dev/null\n", file->dst); fputs("fi\n", fp); } fclose(fp); } /* * Write the conffiles file for DPKG... */ if (Verbosity) puts("Creating conffiles..."); snprintf(filename, sizeof(filename), "%s/%s/DEBIAN/conffiles", directory, name); if ((fp = fopen(filename, "w")) == NULL) { fprintf(stderr, "epm: Unable to create script file \"%s\" - %s\n", filename, strerror(errno)); return (1); } for (i = dist->num_files, file = dist->files; i > 0; i --, file ++) if (tolower(file->type) == 'c' && file->subpackage == subpackage) fprintf(fp, "%s\n", file->dst); else if (tolower(file->type) == 'i' && file->subpackage == subpackage) fprintf(fp, "/etc/init.d/%s\n", file->dst); fclose(fp); /* * Copy the files over... */ if (Verbosity) puts("Copying temporary distribution files..."); for (i = dist->num_files, file = dist->files; i > 0; i --, file ++) { if (file->subpackage != subpackage) continue; /* * Find the username and groupname IDs... */ pwd = getpwnam(file->user); grp = getgrnam(file->group); endpwent(); endgrent(); /* * Copy the file or make the directory or make the symlink as needed... */ switch (tolower(file->type)) { case 'c' : case 'f' : snprintf(filename, sizeof(filename), "%s/%s%s", directory, name, file->dst); if (Verbosity > 1) printf("%s -> %s...\n", file->src, filename); if (copy_file(filename, file->src, file->mode, pwd ? pwd->pw_uid : 0, grp ? grp->gr_gid : 0)) return (1); break; case 'i' : snprintf(filename, sizeof(filename), "%s/%s/etc/init.d/%s", directory, name, file->dst); if (Verbosity > 1) printf("%s -> %s...\n", file->src, filename); if (copy_file(filename, file->src, file->mode, pwd ? pwd->pw_uid : 0, grp ? grp->gr_gid : 0)) return (1); break; case 'd' : snprintf(filename, sizeof(filename), "%s/%s%s", directory, name, file->dst); if (Verbosity > 1) printf("Directory %s...\n", filename); make_directory(filename, file->mode, pwd ? pwd->pw_uid : 0, grp ? grp->gr_gid : 0); break; case 'l' : snprintf(filename, sizeof(filename), "%s/%s%s", directory, name, file->dst); if (Verbosity > 1) printf("%s -> %s...\n", file->src, filename); make_link(filename, file->src); break; } } /* * Build the distribution from the spec file... */ if (Verbosity) printf("Building Debian %s binary distribution...\n", name); if (run_command(directory, "dpkg --build %s", name)) return (1); /* * Remove temporary files... */ if (!KeepFiles) { if (Verbosity) printf("Removing temporary %s distribution files...\n", name); snprintf(filename, sizeof(filename), "%s/%s", directory, name); unlink_directory(filename); } return (0); }
static int /* O - 0 on success, -1 on error */ write_spec(int format, /* I - Subformat */ const char *prodname, /* I - Product name */ dist_t *dist, /* I - Distribution */ FILE *fp, /* I - Spec file */ const char *subpackage) /* I - Subpackage name */ { int i; /* Looping var */ char name[1024]; /* Full product name */ const char *product; /* Product to depend on */ file_t *file; /* Current distribution file */ command_t *c; /* Current command */ depend_t *d; /* Current dependency */ const char *runlevels; /* Run levels */ int number; /* Start/stop number */ int have_commands; /* Have commands in current section? */ /* * Get the name we'll use for the subpackage... */ if (subpackage) snprintf(name, sizeof(name), " %s", subpackage); else name[0] = '\0'; /* * Common stuff... */ if (subpackage) { fprintf(fp, "%%package%s\n", name); fprintf(fp, "Summary: %s", dist->product); for (i = 0; i < dist->num_descriptions; i ++) if (dist->descriptions[i].subpackage == subpackage) break; if (i < dist->num_descriptions) { char line[1024], /* First line of description... */ *ptr; /* Pointer into line */ strlcpy(line, dist->descriptions[i].description, sizeof(line)); if ((ptr = strchr(line, '\n')) != NULL) *ptr = '\0'; fprintf(fp, " - %s", line); } fputs("\n", fp); } else fprintf(fp, "Summary: %s\n", dist->product); fputs("Group: Applications\n", fp); /* * List all of the dependencies... */ for (i = dist->num_depends, d = dist->depends; i > 0; i --, d ++) { if (d->subpackage != subpackage) continue; if (!strcmp(d->product, "_self")) product = prodname; else product = d->product; if (d->type == DEPEND_REQUIRES) fprintf(fp, "Requires: %s", product); else if (d->type == DEPEND_PROVIDES) fprintf(fp, "Provides: %s", product); else if (d->type == DEPEND_REPLACES) fprintf(fp, "Obsoletes: %s", product); else fprintf(fp, "Conflicts: %s", product); if (d->vernumber[0] == 0) { if (d->vernumber[1] < INT_MAX) fprintf(fp, " <= %s\n", d->version[1]); else putc('\n', fp); } else if (d->vernumber[0] && d->vernumber[1] < INT_MAX) { if (d->vernumber[0] < INT_MAX && d->vernumber[1] < INT_MAX) fprintf(fp, " >= %s, %s <= %s\n", d->version[0], product, d->version[1]); } else if (d->vernumber[0] != d->vernumber[1]) fprintf(fp, " >= %s\n", d->version[0]); else fprintf(fp, " = %s\n", d->version[0]); } /* * Pre/post install commands... */ for (i = dist->num_commands, c = dist->commands; i > 0; i --, c ++) if (c->type == COMMAND_PRE_INSTALL && c->subpackage == subpackage) break; if (i > 0) { fprintf(fp, "%%pre%s\n", name); for (; i > 0; i --, c ++) if (c->type == COMMAND_PRE_INSTALL && c->subpackage == subpackage) fprintf(fp, "%s\n", c->command); } for (i = dist->num_commands, c = dist->commands; i > 0; i --, c ++) if (c->type == COMMAND_POST_INSTALL && c->subpackage == subpackage) break; if (i > 0) { have_commands = 1; fprintf(fp, "%%post%s\n", name); for (; i > 0; i --, c ++) if (c->type == COMMAND_POST_INSTALL && c->subpackage == subpackage) fprintf(fp, "%s\n", c->command); } else have_commands = 0; for (i = dist->num_commands, c = dist->commands; i > 0; i --, c ++) if (c->type == COMMAND_LITERAL && c->subpackage == subpackage && !strcmp(c->section, "spec")) break; if (i > 0) { for (; i > 0; i --, c ++) if (c->type == COMMAND_LITERAL && c->subpackage == subpackage && !strcmp(c->section, "spec")) fprintf(fp, "%s\n", c->command); } for (i = dist->num_files, file = dist->files; i > 0; i --, file ++) if (tolower(file->type) == 'i' && file->subpackage == subpackage) break; if (i) { if (!have_commands) fprintf(fp, "%%post%s\n", name); fputs("if test \"x$1\" = x1; then\n", fp); fputs(" echo Setting up init scripts...\n", fp); if (format == PACKAGE_LSB) { /* * Use LSB commands to install the init scripts... */ for (; i > 0; i --, file ++) if (tolower(file->type) == 'i' && file->subpackage == subpackage) { fprintf(fp, " /usr/lib/lsb/install_initd /etc/init.d/%s\n", file->dst); fprintf(fp, " /etc/init.d/%s start\n", file->dst); } } else { /* * Find where the frigging init scripts go... */ fputs(" rcdir=\"\"\n", fp); fputs(" for dir in /sbin/rc.d /sbin /etc/rc.d /etc ; do\n", fp); fputs(" if test -d $dir/rc3.d -o -h $dir/rc3.d; then\n", fp); fputs(" rcdir=\"$dir\"\n", fp); fputs(" fi\n", fp); fputs(" done\n", fp); fputs(" if test \"$rcdir\" = \"\" ; then\n", fp); fputs(" echo Unable to determine location of startup scripts!\n", fp); fputs(" else\n", fp); for (; i > 0; i --, file ++) if (tolower(file->type) == 'i' && file->subpackage == subpackage) { fputs(" if test -d $rcdir/init.d; then\n", fp); qprintf(fp, " /bin/rm -f $rcdir/init.d/%s\n", file->dst); qprintf(fp, " /bin/ln -s %s/init.d/%s " "$rcdir/init.d/%s\n", SoftwareDir, file->dst, file->dst); fputs(" else\n", fp); fputs(" if test -d /etc/init.d; then\n", fp); qprintf(fp, " /bin/rm -f /etc/init.d/%s\n", file->dst); qprintf(fp, " /bin/ln -s %s/init.d/%s " "/etc/init.d/%s\n", SoftwareDir, file->dst, file->dst); fputs(" fi\n", fp); fputs(" fi\n", fp); for (runlevels = get_runlevels(dist->files + i, "0123456"); isdigit(*runlevels & 255); runlevels ++) { if (*runlevels == '0') number = get_stop(file, 0); else number = get_start(file, 99); qprintf(fp, " /bin/rm -f $rcdir/rc%c.d/%c%02d%s\n", *runlevels, (*runlevels == '0' || *runlevels == '1' || *runlevels == '6') ? 'K' : 'S', number, file->dst); qprintf(fp, " /bin/ln -s %s/init.d/%s " "$rcdir/rc%c.d/%c%02d%s\n", SoftwareDir, file->dst, *runlevels, (*runlevels == '0' || *runlevels == '1' || *runlevels == '6') ? 'K' : 'S', number, file->dst); } qprintf(fp, " %s/init.d/%s start\n", SoftwareDir, file->dst); } fputs(" fi\n", fp); } fputs("fi\n", fp); } for (i = dist->num_files, file = dist->files; i > 0; i --, file ++) if (tolower(file->type) == 'i' && file->subpackage == subpackage) break; if (i) { have_commands = 1; fprintf(fp, "%%preun%s\n", name); fputs("if test \"x$1\" = x0; then\n", fp); fputs(" echo Cleaning up init scripts...\n", fp); if (format == PACKAGE_LSB) { /* * Use LSB commands to remove the init scripts... */ for (; i > 0; i --, file ++) if (tolower(file->type) == 'i' && file->subpackage == subpackage) { fprintf(fp, " /etc/init.d/%s stop\n", file->dst); fprintf(fp, " /usr/lib/lsb/remove_initd /etc/init.d/%s\n", file->dst); } } else { /* * Find where the frigging init scripts go... */ fputs(" rcdir=\"\"\n", fp); fputs(" for dir in /sbin/rc.d /sbin /etc/rc.d /etc ; do\n", fp); fputs(" if test -d $dir/rc3.d -o -h $dir/rc3.d; then\n", fp); fputs(" rcdir=\"$dir\"\n", fp); fputs(" fi\n", fp); fputs(" done\n", fp); fputs(" if test \"$rcdir\" = \"\" ; then\n", fp); fputs(" echo Unable to determine location of startup scripts!\n", fp); fputs(" else\n", fp); for (; i > 0; i --, file ++) if (tolower(file->type) == 'i' && file->subpackage == subpackage) { qprintf(fp, " %s/init.d/%s stop\n", SoftwareDir, file->dst); fputs(" if test -d $rcdir/init.d; then\n", fp); qprintf(fp, " /bin/rm -f $rcdir/init.d/%s\n", file->dst); fputs(" else\n", fp); fputs(" if test -d /etc/init.d; then\n", fp); qprintf(fp, " /bin/rm -f /etc/init.d/%s\n", file->dst); fputs(" fi\n", fp); fputs(" fi\n", fp); for (runlevels = get_runlevels(dist->files + i, "0123456"); isdigit(*runlevels & 255); runlevels ++) { if (*runlevels == '0') number = get_stop(file, 0); else number = get_start(file, 99); qprintf(fp, " /bin/rm -f $rcdir/rc%c.d/%c%02d%s\n", *runlevels, (*runlevels == '0' || *runlevels == '1' || *runlevels == '6') ? 'K' : 'S', number, file->dst); } } fputs(" fi\n", fp); } fputs("fi\n", fp); } else have_commands = 0; for (i = dist->num_commands, c = dist->commands; i > 0; i --, c ++) if (c->type == COMMAND_PRE_REMOVE && c->subpackage == subpackage) break; if (i > 0) { if (!have_commands) fprintf(fp, "%%preun%s\n", name); for (; i > 0; i --, c ++) if (c->type == COMMAND_PRE_REMOVE && c->subpackage == subpackage) fprintf(fp, "%s\n", c->command); } for (i = dist->num_commands, c = dist->commands; i > 0; i --, c ++) if (c->type == COMMAND_POST_REMOVE && c->subpackage == subpackage) break; if (i > 0) { fprintf(fp, "%%postun%s\n", name); for (; i > 0; i --, c ++) if (c->type == COMMAND_POST_REMOVE && c->subpackage == subpackage) fprintf(fp, "%s\n", c->command); } /* * Description... */ for (i = 0; i < dist->num_descriptions; i ++) if (dist->descriptions[i].subpackage == subpackage) break; if (i < dist->num_descriptions) { fprintf(fp, "%%description %s\n", name); for (; i < dist->num_descriptions; i ++) if (dist->descriptions[i].subpackage == subpackage) fprintf(fp, "%s\n", dist->descriptions[i].description); } /* * Files... */ fprintf(fp, "%%files%s\n", name); for (i = dist->num_files, file = dist->files; i > 0; i --, file ++) if (file->subpackage == subpackage) switch (tolower(file->type)) { case 'c' : fprintf(fp, "%%attr(%04o,%s,%s) %%config(noreplace) \"%s\"\n", file->mode, file->user, file->group, file->dst); break; case 'd' : fprintf(fp, "%%attr(%04o,%s,%s) %%dir \"%s\"\n", file->mode, file->user, file->group, file->dst); break; case 'f' : case 'l' : fprintf(fp, "%%attr(%04o,%s,%s) \"%s\"\n", file->mode, file->user, file->group, file->dst); break; case 'i' : if (format == PACKAGE_LSB) fprintf(fp, "%%attr(0555,root,root) \"/etc/init.d/%s\"\n", file->dst); else fprintf(fp, "%%attr(0555,root,root) \"%s/init.d/%s\"\n", SoftwareDir, file->dst); break; } return (0); }
Haplotype* generate_haplotype(Region& str_region, int32_t max_ref_flank_len, std::string& chrom_seq, std::vector< std::vector<Alignment> >& alignments, std::vector<std::string>& vcf_alleles, StutterModel* stutter_model, bool search_bams_for_alleles, std::vector<HapBlock*>& blocks, std::vector<bool>& call_sample, std::ostream& logger){ assert(blocks.size() == 0); assert(call_sample.size() == 0); std::map<std::string, int> seqs; // Determine the minimum and maximum alignment boundaries int32_t min_start = INT_MAX, max_stop = INT_MIN; for (auto vec_iter = alignments.begin(); vec_iter != alignments.end(); vec_iter++){ for (auto aln_iter = vec_iter->begin(); aln_iter != vec_iter->end(); aln_iter++){ min_start = std::min(min_start, aln_iter->get_start()); max_stop = std::max(max_stop, aln_iter->get_stop()); seqs[aln_iter->get_sequence()]++; } } logger << "# Seqs = " << seqs.size() << std::endl; // Extract candidate STR sequences (use some padding to ensure indels near STR ends are included) std::vector<std::string> str_seqs; int32_t left_padding = 5, right_padding = 5; int32_t rep_region_start = str_region.start() < left_padding ? 0 : str_region.start()-left_padding; int32_t rep_region_end = str_region.stop() + right_padding; std::string ref_seq = uppercase(chrom_seq.substr(rep_region_start, rep_region_end-rep_region_start)); int ideal_min_length = 3*str_region.period(); // Would ideally have at least 3 repeat units in each allele after trimming // TO DO: Use frequency of deletions not contained within window to // i) Identify problematic regions // ii) Retry with increased window padding? int32_t min_del_start, max_del_stop, flank_del_start, flank_del_stop, min_ins_pos, max_ins_pos; std::vector<bool> flank_del_call_sample, flank_ins_call_sample; int num_ext_del = check_deletion_bounds(alignments, rep_region_start, rep_region_end, min_del_start, max_del_stop, call_sample); int num_flank_del = check_flanking_deletions(alignments, rep_region_start, rep_region_end, flank_del_start, flank_del_stop, flank_del_call_sample); int num_flank_ins = check_flanking_insertions(alignments, rep_region_start, rep_region_end, min_ins_pos, max_ins_pos, flank_ins_call_sample); int nfail = std::max(num_ext_del, std::max(num_flank_del, num_flank_ins)); // Recheck deletions after expanding the STR window if(1.0*nfail/alignments.size() <= MAX_FRAC_SAMPLE_DEL_FAIL){ logger << "PASS SAMPLE DEL STATS: " << rep_region_start << "\t" << rep_region_end << "\t" << num_ext_del << "\t" << min_del_start << "\t" << max_del_stop << "\t" << std::endl; } else { logger << "FAIL SAMPLE DEL STATS: " << rep_region_start << "\t" << rep_region_end << "\t" << num_ext_del << "\t" << min_del_start << "\t" << max_del_stop << "\t" << std::endl; int32_t min_s = std::min(min_del_start, std::min(flank_del_start, min_ins_pos)); int32_t max_e = std::max(max_del_stop, std::max(flank_del_stop, max_ins_pos)); call_sample.clear(); flank_del_call_sample.clear(); flank_ins_call_sample.clear(); rep_region_start = std::min(rep_region_start, std::max(rep_region_start-10, min_s-5)); rep_region_end = std::max(rep_region_end, std::min(rep_region_end+10, max_e+5)); left_padding = str_region.start() - rep_region_start; right_padding = rep_region_end - str_region.stop(); ref_seq = uppercase(chrom_seq.substr(rep_region_start, rep_region_end-rep_region_start)); num_ext_del = check_deletion_bounds(alignments, rep_region_start, rep_region_end, min_del_start, max_del_stop, call_sample); num_flank_del = check_flanking_deletions(alignments, rep_region_start, rep_region_end, flank_del_start, flank_del_stop, flank_del_call_sample); num_flank_ins = check_flanking_insertions(alignments, rep_region_start, rep_region_end, min_ins_pos, max_ins_pos, flank_ins_call_sample); /* if(1.0*sample_fail_count/alignments.size() <= MAX_FRAC_SAMPLE_DEL_FAIL){ logger << "REDONE_PASS SAMPLE DEL STATS: " << rep_region_start << "\t" << rep_region_end << "\t" << sample_fail_count << "\t" << min_del_start << "\t" << max_del_stop << "\t" << std::endl; } else { logger << "REDONE_FAIL SAMPLE DEL STATS: " << rep_region_start << "\t" << rep_region_end << "\t" << sample_fail_count << "\t" << min_del_start << "\t" << max_del_stop << "\t" << std::endl; } */ } /* logger << "# Flank deletions = " << num_flank_del << ", # Flank insertions = " << num_flank_ins << std::endl; for (unsigned int i = 0; i < call_sample.size(); i++) call_sample[i] = call_sample[i] && flank_del_call_sample[i] && flank_ins_call_sample[i]; */ // Trim boundaries so that the reference flanks aren't too long if (rep_region_start > max_ref_flank_len) min_start = std::max(rep_region_start-max_ref_flank_len, min_start); max_stop = std::min(rep_region_end+max_ref_flank_len, max_stop); // Extend each VCF allele by padding size std::vector<std::string> ext_vcf_alleles; if (vcf_alleles.size() != 0){ std::string lflank = uppercase(chrom_seq.substr(rep_region_start, str_region.start()-rep_region_start)); std::string rflank = uppercase(chrom_seq.substr(str_region.stop(), rep_region_end-str_region.stop())); for (unsigned int i = 0; i < vcf_alleles.size(); i++){ ext_vcf_alleles.push_back(lflank + vcf_alleles[i] + rflank); logger << ext_vcf_alleles.back() << std::endl; } logger << ext_vcf_alleles[0] << std::endl << ref_seq << std::endl; assert(ext_vcf_alleles[0].compare(ref_seq) == 0); } generate_candidate_str_seqs(ref_seq, chrom_seq, left_padding, right_padding, ideal_min_length, alignments, ext_vcf_alleles, search_bams_for_alleles, rep_region_start, rep_region_end, str_seqs, logger); // Create a set of haplotype regions, consisting of STR sequence block flanked by two reference sequence stretches assert(rep_region_start > min_start && rep_region_end < max_stop); assert(str_seqs[0].compare(uppercase(chrom_seq.substr(rep_region_start, rep_region_end-rep_region_start))) == 0); blocks.clear(); blocks.push_back(new HapBlock(min_start, rep_region_start, uppercase(chrom_seq.substr(min_start, rep_region_start-min_start)))); // Ref sequence preceding STRS blocks.push_back(new RepeatBlock(rep_region_start, rep_region_end, uppercase(chrom_seq.substr(rep_region_start, rep_region_end-rep_region_start)), str_region.period(), stutter_model)); blocks.push_back(new HapBlock(rep_region_end, max_stop, uppercase(chrom_seq.substr(rep_region_end, max_stop-rep_region_end)))); // Ref sequence following STRs for (unsigned int j = 1; j < str_seqs.size(); j++) blocks[1]->add_alternate(str_seqs[j]); // Initialize each block's data structures, namely the homopolymer length information for (unsigned int i = 0; i < blocks.size(); i++) blocks[i]->initialize(); logger << "Constructing haplotype" << std::endl; Haplotype* haplotype = new Haplotype(blocks); haplotype->print_block_structure(30, 100, logger); return haplotype; }