bool HitPolicy::compareByQNameScoreTStart(const PacBio::BAM::BamRecord & a, const PacBio::BAM::BamRecord & b) const {
    assert(a.Impl().HasTag(AS) and b.Impl().HasTag(AS));
    const int aScore = a.Impl().TagValue(AS).ToInt32();
    const int bScore = b.Impl().TagValue(AS).ToInt32();
    if (a.FullName() == b.FullName()) {
        if (aScore == bScore)
            return a.ReferenceStart() < b.ReferenceEnd();
        return Score(aScore, _sign).WorseThan(Score(bScore, _sign));
    }
    return (a.FullName() < b.FullName());
}
bool FilterCriteria::Satisfy(const PacBio::BAM::BamRecord& record) const
{
    assert(record.IsMapped() and record.Impl().HasTag(AS));
    DNALength alnLength = static_cast<DNALength>(
        record.Sequence(PacBio::BAM::Orientation::NATIVE, true, true).size());
    PacBio::BAM::Cigar cigar = record.CigarData();

    uint32_t nMatch = 0, nMismatch = 0, nIns = 0, nDel = 0;
    for (auto op : cigar) {
        uint32_t n = op.Length();
        switch (op.Type()) {
            case PacBio::BAM::CigarOperationType::SEQUENCE_MATCH:
                nMatch += n;
                break;
            case PacBio::BAM::CigarOperationType::SEQUENCE_MISMATCH:
                nMismatch += n;
                break;
            case PacBio::BAM::CigarOperationType::ALIGNMENT_MATCH:
                nMismatch += n;
                break;
            case PacBio::BAM::CigarOperationType::INSERTION:
                nIns += n;
                break;
            case PacBio::BAM::CigarOperationType::DELETION:
                nDel += n;
                break;
            default:
                break;
        }
    }
    //TODO: Use = X instead of M in blasr.

    float pctSimilarity = 100 * nMatch / static_cast<float>(alnLength);
    float pctAccuracy = 100 * nMatch / static_cast<float>(nMismatch + nMatch + nIns + nDel);
    Score s(static_cast<float>(record.Impl().TagValue("AS").ToInt32()), ScoreSign::NEGATIVE);
    return Satisfy(alnLength, pctSimilarity, pctAccuracy, s);
}
void FASTASequence::Copy(const PacBio::BAM::BamRecord & record) {
    FASTASequence::Copy(record.Impl().Name(), record.Sequence());
}