/** enqueue a set of variants */ void VariantCallsOnly::add(Variants const & v) { if (_impl->buffered_variants.size() > 0 && v.chr == _impl->buffered_variants.back().chr && v.pos < _impl->buffered_variants.back().pos) { error("Variant added out of order at %s:%i / %i", v.chr.c_str(), v.pos, _impl->buffered_variants.back().pos); } #ifdef DEBUG_VARIANTCALLSONLY std::cerr << "Variants added: " << v << "\n"; #endif if (v.anyHomref()) { Variants non_hr = v; int n_non_hr = v.calls.size(); for (size_t q = 0; q < v.calls.size(); ++q) { if(v.calls[q].isHomref()) { non_hr.calls[q] = Call(); _impl->homref_ivs.addInterval(v.pos, v.pos + v.len - 1, q); // remember dp if(q >= _impl->homref_dp.size()) { _impl->homref_dp.resize(q+1); } _impl->homref_dp[q].set(v.calls[q].dp, v.pos, v.pos + v.len - 1); // remember gq if(q >= _impl->homref_gq.size()) { _impl->homref_gq.resize(q+1); } _impl->homref_gq[q].set(v.calls[q].gq, v.pos, v.pos + v.len - 1); --n_non_hr; } else if(v.calls[q].isNocall()) { --n_non_hr; } } if (n_non_hr || non_hr.anyAmbiguous()) { #ifdef DEBUG_VARIANTCALLSONLY std::cerr << "non-hr-add: " << v << "\n"; #endif _impl->buffered_variants.push_back(non_hr); } } else { #ifdef DEBUG_VARIANTCALLSONLY std::cerr << "non-hr-pass-on: " << v << "\n"; #endif _impl->buffered_variants.push_back(v); } }
bool test(Variants const & v) { return v.anyHomref(); }