cs = bam_aux2Z(c);
// adjust for strandedness and leading adaptor
- if(bam1_strand(b)) i = strlen(cs) - 1 - i;
- else i++;
+ if(bam1_strand(b)) {
+ i = strlen(cs) - 1 - i;
+ // adjust for leading hard clip
+ uint32_t cigar = bam1_cigar(b)[0];
+ if((cigar & BAM_CIGAR_MASK) == BAM_CHARD_CLIP) {
+ i -= cigar >> BAM_CIGAR_SHIFT;
+ }
+ } else { i++; }
return cs[i];
}
cq = bam_aux2Z(c);
// adjust for strandedness
- if(bam1_strand(b)) i = strlen(cq) - 1 - i;
+ if(bam1_strand(b)) {
+ i = strlen(cq) - 1 - i;
+ // adjust for leading hard clip
+ uint32_t cigar = bam1_cigar(b)[0];
+ if((cigar & BAM_CIGAR_MASK) == BAM_CHARD_CLIP) {
+ i -= (cigar >> BAM_CIGAR_SHIFT);
+ }
+ }
return cq[i];
}
// adjust for strandedness and leading adaptor
if(bam1_strand(b)) { //reverse strand
cs_i = strlen(cs) - 1 - i;
+ // adjust for leading hard clip
+ uint32_t cigar = bam1_cigar(b)[0];
+ if((cigar & BAM_CIGAR_MASK) == BAM_CHARD_CLIP) {
+ cs_i -= cigar >> BAM_CIGAR_SHIFT;
+ }
// get current color
cur_color = cs[cs_i];
- // get previous base
- prev_b = (0 == cs_i) ? cs[0] : bam_nt16_rev_table[bam1_seqi(bam1_seq(b), i+1)];
+ // get previous base. Note: must rc adaptor
+ prev_b = (cs_i == 1) ? "TGCAN"[(int)bam_aux_nt2int(cs[0])] : bam_nt16_rev_table[bam1_seqi(bam1_seq(b), i+1)];
// get current base
cur_b = bam_nt16_rev_table[bam1_seqi(bam1_seq(b), i)];
}