bool hasAnnotatedAlternativeAllele(Variant & variant) {

        for (uint alt_idx = 0; alt_idx < variant.numAlts(); alt_idx++) {

            if (isAlleleAnnotated(variant.alt(alt_idx))) {

                return true;
            }
        }

        return false;
    }
    bool hasMissing(Variant & variant) {

        assert(!(variant.allele(0).isMissing()));

        for (uint alt_idx = 0; alt_idx < variant.numAlts(); alt_idx++) {

            if (variant.alt(alt_idx).isMissing()) {

                return true;
            }
        }

        return false;
    }
    string variantType(Variant & variant) {

        assert(variant.numAlts() > hasMissing(variant));

        if (variant.numAlts() > (1 + static_cast<uint>(hasMissing(variant)))) {

            return "Multi";
        } 

        auto cur_type = alleleAttributes(variant.alt(0), variant.ref());

        assert(cur_type.type != Type::Reference);
        assert(cur_type.type != Type::Missing);

        return cur_type.typeStr();
    }
    bool hasRepeat(Variant & variant) {

        for (uint alt_idx = 0; alt_idx < variant.numAlts(); alt_idx++) {

            auto rma_value = variant.alt(alt_idx).info().getValue<string>("RMA");

            if (rma_value.second) {

                if (rma_value.first != ".") {

                    return true;
                }
            }
        }

        return false;
    }