<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def crossmap(fas, reads, options, no_shrink, keepDB, threads, cluster, nodes):
 """ map all read sets against all fasta files """

    if cluster is True:
        threads = '48'
    btc = []
    for fa in fas:
        btd = bowtiedb(fa, keepDB)
        F, R, U = reads
        if F is not False:
            if U is False:
                u = False
            for i, f in enumerate(F):
                r = R[i]
                if U is not False:
                    u = U[i]
                sam = '%s/%s-vs-%s' % (os.getcwd(), \
                        fa.rsplit('/', 1)[-1], f.rsplit('/', 1)[-1].rsplit('.', 3)[0])
                btc.append(bowtie(sam, btd, f, r, u, options, no_shrink, threads))
        else:
            f = False
            r = False
            for u in U:
                sam = '%s/%s-vs-%s' % (os.getcwd(), \
                        fa.rsplit('/', 1)[-1], u.rsplit('/', 1)[-1].rsplit('.', 3)[0])
                btc.append(bowtie(sam, btd, f, r, u, options, no_shrink, threads))
    if cluster is False:
        for i in btc:
            p = subprocess.Popen(i, shell = True)
            p.communicate()
    else:
        ID = ''.join(random.choice([str(i) for i in range(0, 9)]) for _ in range(5))
        for node, commands in enumerate(chunks(btc, nodes), 1):
            bs = open('%s/crossmap-qsub.%s.%s.sh' % (os.getcwd(), ID, node), 'w')
            print('\n'.join(commands), file=bs)
            bs.close()
            p = subprocess.Popen(\
                    'qsub -V -N crossmap %s' \
                        % (bs.name), \
                    shell = True)
            p.communicate()