Mercurial > repos > lsong10 > psiclass
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 } |