43 namespace population {
54 bool tolerate_deletions
61 nucleotide_count > 0 && nucleotide_count >= min_coverage &&
62 ( max_coverage == 0 || nucleotide_count <= max_coverage )
71 static_assert(
static_cast<int>(
true ) == 1,
"Invalid bool(true) to int(1) conversion." );
72 static_assert(
static_cast<int>(
false ) == 0,
"Invalid bool(false) to int(0) conversion." );
74 al_count +=
static_cast<int>( sample.
a_count > 0 && sample.
a_count >= min_count );
75 al_count +=
static_cast<int>( sample.
c_count > 0 && sample.
c_count >= min_count );
76 al_count +=
static_cast<int>( sample.
g_count > 0 && sample.
g_count >= min_count );
77 al_count +=
static_cast<int>( sample.
t_count > 0 && sample.
t_count >= min_count );
88 if( sample.
d_count > 0 && sample.
d_count >= min_count && !tolerate_deletions ) {
134 throw std::runtime_error(
166 auto indices = std::array<size_t, 4>{ 0, 1, 2, 3 };
167 if( values[indices[0]] < values[indices[1]] ) {
170 if( values[indices[2]] < values[indices[3]] ) {
173 if( values[indices[0]] < values[indices[2]] ) {
176 if( values[indices[1]] < values[indices[3]] ) {
179 if( values[indices[1]] < values[indices[2]] ) {
184 assert( values[indices[0]] >= values[indices[1]] );
185 assert( values[indices[1]] >= values[indices[2]] );
186 assert( values[indices[2]] >= values[indices[3]] );
203 if( result[0].count < result[1].count ) {
206 if( result[2].count < result[3].count ) {
209 if( result[0].count < result[2].count ) {
212 if( result[1].count < result[3].count ) {
215 if( result[1].count < result[2].count ) {
226 auto result = std::pair<SortedBaseCounts, SortedBaseCounts>{};
229 size_t const s1_cnts[] = {
232 double const s1_nt_cnt =
static_cast<double>(
nucleotide_sum( sample_a ));
233 double const s1_freqs[] = {
234 static_cast<double>( sample_a.
a_count ) / s1_nt_cnt,
235 static_cast<double>( sample_a.
c_count ) / s1_nt_cnt,
236 static_cast<double>( sample_a.
g_count ) / s1_nt_cnt,
237 static_cast<double>( sample_a.
t_count ) / s1_nt_cnt
241 size_t const s2_cnts[] = {
244 double const s2_nt_cnt =
static_cast<double>(
nucleotide_sum( sample_b ));
245 double const s2_freqs[] = {
246 static_cast<double>( sample_b.
a_count ) / s2_nt_cnt,
247 static_cast<double>( sample_b.
c_count ) / s2_nt_cnt,
248 static_cast<double>( sample_b.
g_count ) / s2_nt_cnt,
249 static_cast<double>( sample_b.
t_count ) / s2_nt_cnt
255 if( s1_nt_cnt == 0.0 || s2_nt_cnt == 0.0 ) {
260 std::array<double, 4>
const avg_freqs = {
261 ( s1_freqs[0] + s2_freqs[0] ) / 2.0,
262 ( s1_freqs[1] + s2_freqs[1] ) / 2.0,
263 ( s1_freqs[2] + s2_freqs[2] ) / 2.0,
264 ( s1_freqs[3] + s2_freqs[3] ) / 2.0
271 assert( avg_freqs[order[0]] >= avg_freqs[order[1]] );
272 assert( avg_freqs[order[1]] >= avg_freqs[order[2]] );
273 assert( avg_freqs[order[2]] >= avg_freqs[order[3]] );
276 static const char nts[] = {
'A',
'C',
'G',
'T'};
277 result.first[0] = { nts[order[0]], s1_cnts[order[0]] };
278 result.first[1] = { nts[order[1]], s1_cnts[order[1]] };
279 result.first[2] = { nts[order[2]], s1_cnts[order[2]] };
280 result.first[3] = { nts[order[3]], s1_cnts[order[3]] };
281 result.second[0] = { nts[order[0]], s2_cnts[order[0]] };
282 result.second[1] = { nts[order[1]], s2_cnts[order[1]] };
283 result.second[2] = { nts[order[2]], s2_cnts[order[2]] };
284 result.second[3] = { nts[order[3]], s2_cnts[order[3]] };
289 Variant const& variant,
bool reference_first
295 if( reference_first ) {
300 result[0] = {
'A', total.a_count };
301 result[1] = {
'C', total.c_count };
302 result[2] = {
'G', total.g_count };
303 result[3] = {
'T', total.t_count };
308 result[0] = {
'C', total.c_count };
309 result[1] = {
'A', total.a_count };
310 result[2] = {
'G', total.g_count };
311 result[3] = {
'T', total.t_count };
316 result[0] = {
'G', total.g_count };
317 result[1] = {
'A', total.a_count };
318 result[2] = {
'C', total.c_count };
319 result[3] = {
'T', total.t_count };
324 result[0] = {
'T', total.t_count };
325 result[1] = {
'A', total.a_count };
326 result[2] = {
'C', total.c_count };
327 result[3] = {
'G', total.g_count };
331 throw std::runtime_error(
336 if( result[1].count < result[2].count ) {
339 if( result[1].count < result[3].count ) {
342 if( result[2].count < result[3].count ) {
382 for(
auto const& ps : p ) {
404 if( nucleotide_count == 0 ) {
407 assert( nucleotide_count > 0 );
419 if( counts[1] > counts[max_idx] ) {
422 if( counts[2] > counts[max_idx] ) {
425 if( counts[3] > counts[max_idx] ) {
430 static const char nts[] = {
'A',
'C',
'G',
'T'};
432 =
static_cast<double>( counts[max_idx] )
433 /
static_cast<double>( nucleotide_count )
435 return { nts[max_idx], conf };
450 if( ref ==
'A' || ref ==
'C' || ref ==
'G' || ref ==
'T' ) {
454 if( sorted[0].count > 0 ) {
466 if( ! force && ( alt ==
'A' || alt ==
'C' || alt ==
'G' || alt ==
'T' )) {
470 if( ref ==
'A' || ref ==
'C' || ref ==
'G' || ref ==
'T' ) {
472 if( sorted[1].count > 0 ) {