:type taxF: file
    :param taxF: The taxonomy output file to parse
    :type level: string
    :param level: The level of the phylogenetic assignment at which to cut off
                   every assigned taxonomic string.

    :rtype: dict
    :return: A dictionary of taxonomy strings keyed on OTU ID

def prune_taxonomy(taxF, level):
    """
    :type taxF: file
    :param taxF: The taxonomy output file to parse
    :type level: string
    :param level: The level of the phylogenetic assignment at which to cut off
                   every assigned taxonomic string.

    :rtype: dict
    :return: A dictionary of taxonomy strings keyed on OTU ID
    """
    uniqueTax = {}
    nuTax = {}  # non-unique taxonomies

    for i, line in enumerate(taxF):
        try:
            otuID, tax, floatVal, otuIDr = line.strip().split('\t')
        except ValueError as ve:
            print "ERROR: incorrect number of fields found on line {} of the input file. Entry skipped.".format(i)
            continue
        tax = split_taxonomy(pad_taxonomy(tax), level)
        if tax not in uniqueTax:
            uniqueTax[tax] = otuID, floatVal, otuIDr
            nuTax[uniqueTax[tax][0]] = []
        else:
            nuTax[uniqueTax[tax][0]].append(otuID)

    ut = {otuID: [tax, floatVal, otuIDr] for tax, (otuID, floatVal, otuIDr) in
          uniqueTax.iteritems()}

    return ut, nuTax