void bwa_cal_pac_pos(const char *prefix, int n_seqs, bwa_seq_t *seqs, int max_mm, float fnr) { int i, j; char str[1024]; bwt_t *bwt; // load forward SA strcpy(str, prefix); strcat(str, ".bwt"); bwt = bwt_restore_bwt(str,0); strcpy(str, prefix); strcat(str, ".sa"); bwt_restore_sa(str,bwt,0); for (i = 0; i != n_seqs; ++i) { if (seqs[i].strand) bwa_cal_pac_pos_core(bwt, 0, &seqs[i], max_mm, fnr); for (j = 0; j < seqs[i].n_multi; ++j) { bwt_multi1_t *p = seqs[i].multi + j; if (p->strand) p->pos = bwt_sa(bwt, p->pos); } } bwt_destroy(bwt); // load reverse BWT and SA strcpy(str, prefix); strcat(str, ".rbwt"); bwt = bwt_restore_bwt(str,0); strcpy(str, prefix); strcat(str, ".rsa"); bwt_restore_sa(str,bwt,0); for (i = 0; i != n_seqs; ++i) { if (!seqs[i].strand) bwa_cal_pac_pos_core(0, bwt, &seqs[i], max_mm, fnr); for (j = 0; j < seqs[i].n_multi; ++j) { bwt_multi1_t *p = seqs[i].multi + j; if (!p->strand) p->pos = bwt->seq_len - (bwt_sa(bwt, p->pos) + seqs[i].len); } } bwt_destroy(bwt); }
void jigsaw_cal_pac_pos (const bwt_t *bwt, bwa_seq_t *seq, int max_mm, float fnr, const int *g_log_n) { int j; bwa_cal_pac_pos_core(bwt, seq, max_mm, fnr, g_log_n); for (j = 0; j < seq->n_multi; ++j) { bwt_multi1_t *p = seq->multi + j; p->pos = bwt_sa(bwt, p->pos); } }
void bwa_cal_pac_pos(const bntseq_t *bns, const char *prefix, int n_seqs, bwa_seq_t *seqs, int max_mm, float fnr) { int i, j, strand, n_multi; char str[1024]; bwt_t *bwt; // load forward SA strcpy(str, prefix); strcat(str, ".bwt"); bwt = bwt_restore_bwt(str); strcpy(str, prefix); strcat(str, ".sa"); bwt_restore_sa(str, bwt); for (i = 0; i != n_seqs; ++i) { bwa_seq_t *p = &seqs[i]; bwa_cal_pac_pos_core(bns, bwt, p, max_mm, fnr); for (j = n_multi = 0; j < p->n_multi; ++j) { bwt_multi1_t *q = p->multi + j; q->pos = bwa_sa2pos(bns, bwt, q->pos, p->len, &strand); q->strand = strand; if (q->pos != p->pos) p->multi[n_multi++] = *q; } p->n_multi = n_multi; } bwt_destroy(bwt); }
Alignment BWA::generate_final_alignment_from_sequence(bwa_seq_t* sequence) { // Calculate the local coordinate and local alignment. bwa_cal_pac_pos_core(bwts[0],bwts[1],sequence,options.max_diff,options.fnr); bwa_refine_gapped(bns, 1, sequence, reference, NULL); // Copy the local alignment data into the alignment object. Alignment alignment; // Populate basic path info alignment.edit_distance = sequence->nm; alignment.num_mismatches = sequence->n_mm; alignment.num_gap_opens = sequence->n_gapo; alignment.num_gap_extensions = sequence->n_gape; alignment.num_best = sequence->c1; alignment.num_second_best = sequence->c2; // Final alignment position. alignment.type = sequence->type; bns_coor_pac2real(bns, sequence->pos, pos_end(sequence) - sequence->pos, &alignment.contig); alignment.pos = sequence->pos - bns->anns[alignment.contig].offset + 1; alignment.negative_strand = sequence->strand; alignment.mapping_quality = sequence->mapQ; // Cigar step. alignment.cigar = NULL; if(sequence->cigar) { alignment.cigar = new uint16_t[sequence->n_cigar]; memcpy(alignment.cigar,sequence->cigar,sequence->n_cigar*sizeof(uint16_t)); } alignment.n_cigar = sequence->n_cigar; // MD tag with a better breakdown of differences in the cigar alignment.md = strdup(sequence->md); delete[] sequence->md; sequence->md = NULL; return alignment; }