iVar

call_variants.cpp
1 #include<iostream>
2 #include<fstream>
3 #include<sstream>
4 #include<vector>
5 #include<algorithm>
6 #include<string>
7 #include<regex>
8 #include<cmath>
9 #include<htslib/kfunc.h>
10 #include "htslib/kfunc.h"
11
12 #include "allele_functions.h"
13
14 const char gap='N';
15 const float sig_level = 0.01;
16
17 std::vector<allele>::iterator get_ref_allele(std::vector<allele> &ad, char ref){
18 for(std::vector<allele>::iterator it = ad.begin(); it != ad.end(); ++it) {
19 if(it->nuc[0] == ref)
20 return it;
21 }
22 // print_allele_depths(ad);
23 return ad.end();
24 }
25
26 int call_variants_from_plup(std::istream &cin, std::string out_file, uint8_t min_qual, double min_threshold){
27 std::string line, cell, bases, qualities, region;
28 std::ofstream fout(out_file+".tsv");
29 fout << "REGION\tPOS\tREF\tALT\tAD\tRAD\tDP\tFREQ\tQUAL\tPVAL\tPASS"<<std::endl;
30 int ctr = 0, pos = 0, mdepth = 0;
31 double pval_left, pval_right, pval_twotailed, freq, err;
32 std::stringstream lineStream;
33 char ref;
34 std::vector<allele> ad;
35 std::vector<allele>::iterator ref_it;
36 while (std::getline(cin, line)){
37 lineStream << line;
38 ctr = 0;
39 while(std::getline(lineStream,cell,'\t')){
40 switch(ctr){
41 case 0:
42 region = cell;
43 break;
44 case 1:
45 pos = stoi(cell);
46 break;
47 case 2:
48 ref = cell[0];
49 break;
50 case 3:
51 mdepth = stoi(cell);
52 break;
53 case 4:
54 bases = cell;
55 break;
56 case 5:
57 qualities = cell;
58 break;
59 case 6:
60 break;
61 }
62 ctr++;
63 }
64 ad = update_allele_depth(ref, bases, qualities, min_qual);
65 if(ad.size() == 0){
66 lineStream.clear();
67 continue;
68 }
69 ref_it = get_ref_allele(ad, ref);
70 // Get ungapped coverage
71 mdepth = 0;
72 for(std::vector<allele>::iterator it = ad.begin(); it != ad.end(); ++it) {
73 if(it->nuc[0]=='*' || it->nuc[0] == '+' || it->nuc[0] == '-')
74 continue;
75 mdepth += it->depth;
76 }
77 for(std::vector<allele>::iterator it = ad.begin(); it != ad.end(); ++it) {
78 if((*it == *ref_it) || it->nuc[0]=='*')
79 continue;
80 freq = it->depth/(double)mdepth;
81 if(freq < min_threshold)
82 continue;
83 fout << region << "\t";
84 fout << pos << "\t";
85 fout << ref << "\t";
86 fout << it->nuc << "\t";
87 fout << it->depth << "\t";
88 fout << it->reverse << "\t";
89 fout << mdepth << "\t";
90 fout << freq << "\t";
91 fout << (uint16_t)it->mean_qual << "\t";
92 /*
93 | Var | Ref |
94 Exp | Error | Err free |
95 Obs | AD | RD |
96 */
97 err = pow(10, ( -1 * (it->mean_qual)/10));
98 kt_fisher_exact((err * mdepth), (1-err) * mdepth, it->depth, ref_it->depth, &pval_left, &pval_right, &pval_twotailed);
99 fout << pval_left << "\t";
100 if(pval_left <= sig_level){
101 fout << "TRUE";
102 } else {
103 fout << "FALSE";
104 }
105 fout << std::endl;
106 }
107 lineStream.clear();
108 }
109 fout.close();
110 return 0;
111 }
112
113 // int main_old(int argc, char* argv[]) {
114 // std::string line, cell;
115 // std::string out_file = argv[1];
116 // uint8_t min_qual = 20;
117 // if(argc > 2)
118 // min_qual = atoi(argv[2]);
119 // std::cout << "Min Qual: " << (uint16_t)min_qual << std::endl;
120 // std::ofstream fout(out_file+".tsv");
121 // fout << "POS\tREF\tALT\tAD\tRAD\tDP\tQUAL"<<std::endl;
122 // int ctr = 0, pos = 0, mdepth = 0;
123 // std::stringstream lineStream;
124 // char ref;
125 // std::string bases;
126 // std::string qualities;
127 // std::vector<allele> ad;
128 // while (std::getline(std::cin, line)){
129 // lineStream << line;
130 // ctr = 0;
131 // while(std::getline(lineStream,cell,'\t')){
132 // switch(ctr){
133 // case 0:
134 // break;
135 // case 1:
136 // pos = stoi(cell);
137 // break;
138 // case 2:
139 // ref = cell[0];
140 // break;
141 // case 3:
142 // mdepth = stoi(cell);
143 // break;
144 // case 4:
145 // bases = cell;
146 // break;
147 // case 5:
148 // qualities = cell;
149 // break;
150 // case 6:
151 // break;
152 // }
153 // ctr++;
154 // }
155 // ad = update_allele_depth(ref, bases, qualities, min_qual);
156 // for(std::vector<allele>::iterator it = ad.begin(); it != ad.end(); ++it) {
157 // if((it->nuc[0] == ref && it->nuc.length() == 1) || it->nuc[0]=='*')
158 // continue;
159 // fout << pos << "\t";
160 // fout << ref << "\t";
161 // fout << it->nuc << "\t";
162 // fout << it->depth << "\t";
163 // fout << it->reverse << "\t";
164 // fout << mdepth << "\t";
165 // fout << (uint16_t)it->mean_qual << std::endl;
166 // }
167 // lineStream.clear();
168 // }
169 // fout.close();
170 // return 0;
171 // }