comparison PsiCLASS-1.0.2/samtools-0.1.19/bam_color.c @ 0:903fc43d6227 draft default tip

Uploaded
author lsong10
date Fri, 26 Mar 2021 16:52:45 +0000
parents
children
comparison
equal deleted inserted replaced
-1:000000000000 0:903fc43d6227
1 #include <ctype.h>
2 #include "bam.h"
3
4 /*!
5 @abstract Get the color encoding the previous and current base
6 @param b pointer to an alignment
7 @param i The i-th position, 0-based
8 @return color
9
10 @discussion Returns 0 no color information is found.
11 */
12 char bam_aux_getCSi(bam1_t *b, int i)
13 {
14 uint8_t *c = bam_aux_get(b, "CS");
15 char *cs = NULL;
16
17 // return the base if the tag was not found
18 if(0 == c) return 0;
19
20 cs = bam_aux2Z(c);
21 // adjust for strandedness and leading adaptor
22 if(bam1_strand(b)) {
23 i = strlen(cs) - 1 - i;
24 // adjust for leading hard clip
25 uint32_t cigar = bam1_cigar(b)[0];
26 if((cigar & BAM_CIGAR_MASK) == BAM_CHARD_CLIP) {
27 i -= cigar >> BAM_CIGAR_SHIFT;
28 }
29 } else { i++; }
30 return cs[i];
31 }
32
33 /*!
34 @abstract Get the color quality of the color encoding the previous and current base
35 @param b pointer to an alignment
36 @param i The i-th position, 0-based
37 @return color quality
38
39 @discussion Returns 0 no color information is found.
40 */
41 char bam_aux_getCQi(bam1_t *b, int i)
42 {
43 uint8_t *c = bam_aux_get(b, "CQ");
44 char *cq = NULL;
45
46 // return the base if the tag was not found
47 if(0 == c) return 0;
48
49 cq = bam_aux2Z(c);
50 // adjust for strandedness
51 if(bam1_strand(b)) {
52 i = strlen(cq) - 1 - i;
53 // adjust for leading hard clip
54 uint32_t cigar = bam1_cigar(b)[0];
55 if((cigar & BAM_CIGAR_MASK) == BAM_CHARD_CLIP) {
56 i -= (cigar >> BAM_CIGAR_SHIFT);
57 }
58 }
59 return cq[i];
60 }
61
62 char bam_aux_nt2int(char a)
63 {
64 switch(toupper(a)) {
65 case 'A':
66 return 0;
67 break;
68 case 'C':
69 return 1;
70 break;
71 case 'G':
72 return 2;
73 break;
74 case 'T':
75 return 3;
76 break;
77 default:
78 return 4;
79 break;
80 }
81 }
82
83 char bam_aux_ntnt2cs(char a, char b)
84 {
85 a = bam_aux_nt2int(a);
86 b = bam_aux_nt2int(b);
87 if(4 == a || 4 == b) return '4';
88 return "0123"[(int)(a ^ b)];
89 }
90
91 /*!
92 @abstract Get the color error profile at the give position
93 @param b pointer to an alignment
94 @return the original color if the color was an error, '-' (dash) otherwise
95
96 @discussion Returns 0 no color information is found.
97 */
98 char bam_aux_getCEi(bam1_t *b, int i)
99 {
100 int cs_i;
101 uint8_t *c = bam_aux_get(b, "CS");
102 char *cs = NULL;
103 char prev_b, cur_b;
104 char cur_color, cor_color;
105
106 // return the base if the tag was not found
107 if(0 == c) return 0;
108
109 cs = bam_aux2Z(c);
110
111 // adjust for strandedness and leading adaptor
112 if(bam1_strand(b)) { //reverse strand
113 cs_i = strlen(cs) - 1 - i;
114 // adjust for leading hard clip
115 uint32_t cigar = bam1_cigar(b)[0];
116 if((cigar & BAM_CIGAR_MASK) == BAM_CHARD_CLIP) {
117 cs_i -= cigar >> BAM_CIGAR_SHIFT;
118 }
119 // get current color
120 cur_color = cs[cs_i];
121 // get previous base. Note: must rc adaptor
122 prev_b = (cs_i == 1) ? "TGCAN"[(int)bam_aux_nt2int(cs[0])] : bam_nt16_rev_table[bam1_seqi(bam1_seq(b), i+1)];
123 // get current base
124 cur_b = bam_nt16_rev_table[bam1_seqi(bam1_seq(b), i)];
125 }
126 else {
127 cs_i=i+1;
128 // get current color
129 cur_color = cs[cs_i];
130 // get previous base
131 prev_b = (0 == i) ? cs[0] : bam_nt16_rev_table[bam1_seqi(bam1_seq(b), i-1)];
132 // get current base
133 cur_b = bam_nt16_rev_table[bam1_seqi(bam1_seq(b), i)];
134 }
135
136 // corrected color
137 cor_color = bam_aux_ntnt2cs(prev_b, cur_b);
138
139 if(cur_color == cor_color) {
140 return '-';
141 }
142 else {
143 return cur_color;
144 }
145 }