28 May 2018: Fixed --file triallelic-variant handling bug which occurred when the .map was unsorted.
26 May (beta 6): --merge-equal-pos bugfixes. If you used --merge-equal-pos with .bed+.bim+.fam filesets where allele order may have differed between .bim files, or with any .ped+.map fileset at all, we recommend redoing that run.
uint32_t equal_pos_bp = 0xffffffffU; // force initial mismatch
uint32_t equal_pos_read_start = 0;
for (; read_pos < chrom_read_end_idx; read_pos++) {
llxx = ll_buf[read_pos];
presort_idx = (uint32_t)llxx;
cur_bp = (uint32_t)(llxx >> 32);
// do not merge chr 0 (unplaced).
if ((prev_bp == cur_bp) && (!unplaced)) {
if (merge_equal_pos && merge_alleles(marker_allele_ptrs, ((uint32_t)ll_buf[read_pos - 1]), presort_idx)) {
LOGERRPRINTFWW("Error: --merge-equal-pos failure. Variants '%s' and '%s' have the same position, but do not share the same alleles.\n", &(marker_ids[max_marker_id_len * presort_idx]), &(marker_ids[max_marker_id_len * ((uint32_t)ll_buf[read_pos - 1])]));
// don't care about position conflicts on chr 0 (unplaced).
if (cur_merge_equal_pos) {
// bugfix (25 May 2018): previous merge_alleles() usage was broken for
// multiple reasons
if (prev_bp == cur_bp) {
if (equal_pos_bp != prev_bp) {
equal_pos_read_start = read_pos - 1;
equal_pos_bp = prev_bp;
equal_pos_allele_ptrs[0] = nullptr;
equal_pos_allele_ptrs[1] = nullptr;
equal_pos_allele_ct = 0;
if (merge_equal_pos_alleles(marker_allele_ptrs, (uint32_t)ll_buf[equal_pos_read_start], &equal_pos_allele_ct, equal_pos_allele_ptrs)) {
LOGERRPRINTFWW("Error: --merge-equal-pos failure: inconsistent alleles at %s:%u.\n", "?", cur_bp);
return 1;
}
}
if (merge_equal_pos_alleles(marker_allele_ptrs, presort_idx, &equal_pos_allele_ct, equal_pos_allele_ptrs)) {
LOGERRPRINTFWW("Error: --merge-equal-pos failure: inconsistent alleles at %s:%u.\n", "?", cur_bp);
return 1;
}
marker_map[presort_idx] = write_pos - 1;
continue;
} else {
if (equal_pos_bp == prev_bp) {
if (save_equal_pos_alleles(ll_buf, equal_pos_read_start, read_pos, equal_pos_allele_ptrs, marker_allele_ptrs)) {
return 1;
}
}
prev_bp = cur_bp;
}
} else if ((prev_bp == cur_bp) && (!unplaced)) {
// shouldn't print warning in --merge-equal-pos case
LOGPREPRINTFWW("Warning: Variants '%s' and '%s' have the same position.\n", &(marker_ids[max_marker_id_len * presort_idx]), &(marker_ids[max_marker_id_len * ((uint32_t)ll_buf[read_pos - 1])]));