find ribosomal proteins
    max_hits = maximum number of blast hits to consider for an orf
                  if 1, only consider best blast hit for each ORF
    max_hits_rp = maximum number of hits to consider per ribosomal protein per scaffold
                     if 1, only consider best RP match to contig
    max_errors = maximum number of errors when looking for block of proteins (e.g. out of order or gap)

def ribosomal(scaffolds, DBdir, min_hits, evalue_thresh, bit_thresh, \
                method = 'usearch', threads = 6, \
                max_hits = 1, max_hits_rp = 1, max_errors = 35):
    """
    find ribosomal proteins
    max_hits = maximum number of blast hits to consider for an orf
                  if 1, only consider best blast hit for each ORF
    max_hits_rp = maximum number of hits to consider per ribosomal protein per scaffold
                     if 1, only consider best RP match to contig
    max_errors = maximum number of errors when looking for block of proteins (e.g. out of order or gap)
    """
    # rps = list (in syntenic order) of ribosomal proteins
    # rp_db = dictionary to find the database files
    rps, rp_db = find_databases(DBdir)
    searches = [[rp, search(scaffolds, rp_db[rp], method = method, threads = str(threads), max_hits = 10)]
            for rp in rp_db]
    scaffolds, scaffold2rp = scaffold_hits(searches, scaffolds, max_hits)
    print('# scaffold\t%s' % ('\t'.join(rps)))
    for scaffold, block in \
            find_ribosomal(rps, scaffolds, scaffold2rp, min_hits, max_hits_rp, max_errors):
        id_rps = []
        for rp in rps:
            if rp in block:
                id_rps.append(block[rp][0].split()[0])
            else:
                id_rps.append('-')
        print('%s\t%s' % (scaffold, '\t'.join(id_rps)))