<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def processTPEDandTFAM(tped, tfam, prefix):
 """Process the TPED and TFAM files. :param tped: the name of the ``tped`` file. :param tfam: the name of the ``tfam`` file. :param prefix: the prefix of the output files. :type tped: str :type tfam: str :type prefix: str Copies the original ``tfam`` file into ``prefix.tfam``. Then, it reads the ``tped`` file and keeps in memory two sets containing the markers which are all failed or which contains only heterozygous genotypes. It creates two output files, ``prefix.allFailed`` and ``prefix.allHetero``, containing the markers that are all failed and are all heterozygous, respectively. .. note:: All heterozygous markers located on the mitochondrial chromosome are not remove. """

    # Copying the tfam file
    try:
        shutil.copy(tfam, prefix + ".tfam")
    except IOError:
        msg = "%s: can't write file" % prefix + ".tfam"
        raise ProgramError(msg)

    try:
        outputFile = open(prefix + ".tped", "w")
    except IOError:
        msg = "%s: can't write to file" % prefix + ".tped"
        raise ProgramError(msg)

    # The name of the bad SNPs
    allFailed = set()
    allHetero = set()

    with open(tped, 'r') as inputFile:
        for line in inputFile:
            row = line.rstrip("\r\n").split("\t")
            snpInfo = row[:4]
            chromosome = snpInfo[0]
            genotypes = np.array([i.upper() for i in row[4:]])

            # Testing the genotypes
            uniqueGenotypes = np.unique(genotypes)
            if len(uniqueGenotypes) == 1:
                # We have only one kind of genotype, either all homo, all
                # hetero or all no call
                if uniqueGenotypes[0] == "0 0":
                    # This one is a no call
                    allFailed.add(snpInfo[1])
                elif len(set(uniqueGenotypes[0].split(" "))) == 2:
                    # There are two different alleles, hence, hetero
                    if chromosome not in {"26", "MT"}:
                        # The SNP is not on a mitochondrial chromosome
                        # (because we want to keep those)
                        allHetero.add(snpInfo[1])

            # If the SNP is good (neither in allFailed or allHetero), we keep
            # the SNP
            if (snpInfo[1] not in allFailed) and (snpInfo[1] not in allHetero):
                print >>outputFile, "\t".join(row)

    outputFile.close()

    # Now printing the summary files
    # The SNPs with no calls
    fileName = prefix + ".allFailed"
    try:
        with open(fileName, 'w') as outputFile:
            if len(allFailed) > 0:
                print >>outputFile, "\n".join(allFailed)
    except IOError:
        msg = "%(fileName)s: can't write to file" % locals()
        raise ProgramError(msg)

    # The SNPs with only hetero calls
    fileName = prefix + ".allHetero"
    try:
        with open(fileName, 'w') as outputFile:
            if len(allHetero) > 0:
                print >>outputFile, "\n".join(allHetero)
    except IOError:
        msg = "%(fileName)s: can't write to file" % locals()
        raise ProgramError(msg)