def rax(a, boot, threads, \
            fast = False, run_rax = False, run_iq = False, model = False, cluster = False, node = False):
    """
    run raxml on 'a' (alignment) with 'boot' (bootstraps) and 'threads' (threads)
    store all files in raxml_a_b
    1. give every sequence a short identifier
    2. convert fasta to phylip
    3. run raxml
    4. convert ids in raxml tree to original names
    """
    a = os.path.abspath(a)
    a_base = a.rsplit('/', 1)[1]
    out_dir = '%s/%s_rax_boots_%s' % \
                (a.rsplit('/', 1)[0], a_base.rsplit('.', 1)[0], boot)
    os.system('mkdir -p %s' % (out_dir))
    os.system('ln -sf %s %s/%s' % (os.path.abspath(a), out_dir, a.rsplit('/', 1)[1]))
    os.chdir(out_dir)
    a_id, a_id_lookup = get_ids(a_base)
    a_id_phylip = convert2phylip(a_id)
    rax_out = '%s.raxml.txt' % (a_id_phylip)
    if fast is True:
        final_fast = '%s.fasttree.tree' % (a_id_lookup.rsplit('.', 2)[0])
        fast_tree = run_fast(a_id, threads, cluster, node)
        good_fast = fix_tree(fast_tree, a_id_lookup, final_fast)
        yield '%s/%s' % (out_dir, final_fast)
    # run IQ-Tree or RAxML
    if run_iq is True:
        final_iq = '%s.iq.tree' % (a_id_lookup.rsplit('.', 2)[0])
        iq_out = '%s.iq.out' % (a_id_phylip)
        iq_tree = run_iqtree(a_id_phylip, model, threads, cluster, node)
        good_tree = fix_tree(iq_tree, a_id_lookup, final_iq)
        yield '%s/%s' % (out_dir, final_iq)
    elif run_rax is True:
        final_rax = '%s.raxml.tree' % (a_id_lookup.rsplit('.', 2)[0])
        rax_tree = run_raxml(rax_out, boot, a_id_phylip, threads, a_id, model, cluster, node)
        good_tree = fix_tree(rax_tree, a_id_lookup, final_rax)
        yield '%s/%s' % (out_dir, final_rax)