示例#1
0
/** 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);
    }
}
示例#2
0
 bool test(Variants const & v) { return v.anyHomref(); }