+void bam_template_cigar(bam1_t *b1, bam1_t *b2, kstring_t *str)
+{
+ bam1_t *swap;
+ int i, end;
+ uint32_t *cigar;
+ str->l = 0;
+ if (b1->core.tid != b2->core.tid || b1->core.tid < 0) return; // coordinateless or not on the same chr; skip
+ if (b1->core.pos > b2->core.pos) swap = b1, b1 = b2, b2 = swap; // make sure b1 has a smaller coordinate
+ kputc((b1->core.flag & BAM_FREAD1)? '1' : '2', str); // segment index
+ kputc((b1->core.flag & BAM_FREVERSE)? 'R' : 'F', str); // strand
+ for (i = 0, cigar = bam1_cigar(b1); i < b1->core.n_cigar; ++i) {
+ kputw(bam_cigar_oplen(cigar[i]), str);
+ kputc(bam_cigar_opchr(cigar[i]), str);
+ }
+ end = bam_calend(&b1->core, cigar);
+ kputw(b2->core.pos - end, str);
+ kputc('T', str);
+ kputc((b2->core.flag & BAM_FREAD1)? '1' : '2', str); // segment index
+ kputc((b2->core.flag & BAM_FREVERSE)? 'R' : 'F', str); // strand
+ for (i = 0, cigar = bam1_cigar(b2); i < b2->core.n_cigar; ++i) {
+ kputw(bam_cigar_oplen(cigar[i]), str);
+ kputc(bam_cigar_opchr(cigar[i]), str);
+ }
+ bam_aux_append(b1, "CT", 'Z', str->l+1, (uint8_t*)str->s);
+}
+