Find flipped SNPs and flip them in the data1.

def findFlippedSNPs(goldFrqFile1, sourceAlleles, outPrefix):
    """Find flipped SNPs and flip them in the data1."""
    goldAlleles = {}
    with open(goldFrqFile1, "r") as inputFile:
        headerIndex = None
        for i, line in enumerate(inputFile):
            row = createRowFromPlinkSpacedOutput(line)

            if i == 0:
                # This is the header
                headerIndex = dict([
                    (row[j], j) for j in xrange(len(row))
                ])

                # Checking the columns
                for columnName in ["SNP", "A1", "A2"]:
                    if columnName not in headerIndex:
                        msg = "%(fileName)s: no column named " \
                                "%(columnName)s" % locals()
                        raise ProgramError(msg)
            else:
                snpName = row[headerIndex["SNP"]]
                allele1 = row[headerIndex["A1"]]
                allele2 = row[headerIndex["A2"]]

                alleles = set([allele1, allele2])
                if "0" in alleles:
                    alleles.remove("0")

                goldAlleles[snpName] = alleles

    # Finding the SNPs to flip
    toFlipOutputFile = None
    try:
        toFlipOutputFile = open(outPrefix + ".snp_to_flip_in_reference", "w")
    except IOError:
        msg = "%(outPrefix)s.snp_to_flip_in_reference: can't write " \
              "file" % locals()
        raise ProgramError(msg)

    toRemoveOutputFile = None
    try:
        toRemoveOutputFile = open(outPrefix + ".snp_to_remove", "w")
    except IOError:
        msg = "%(outPrefix)s.snp_to_remove: can't write file" % locals()
        raise ProgramError(msg)

    toRemoveOutputFileExplanation = None
    try:
        toRemoveOutputFileExplanation = open(
            outPrefix + ".snp_to_remove.explanation",
            "w",
        )
        print >>toRemoveOutputFileExplanation, "\t".join(["Name", "Reason",
                                                          "Alleles 1",
                                                          "Alleles 2"])
    except IOError:
        msg = "%(outPrefix)s.snp_to_remove: can't write file" % locals()
        raise ProgramError(msg)

    for snpName in goldAlleles.iterkeys():
        alleles1 = goldAlleles[snpName]
        alleles2 = sourceAlleles[snpName]

        if (len(alleles1) == 2) and (len(alleles2) == 2):
            # Both are heterozygous
            if (({"A", "T"} == alleles1 and {"A", "T"} == alleles2) or
                    ({"C", "G"} == alleles1 and {"C", "G"} == alleles2)):
                # We can't flip those..., so we remove them
                print >>toRemoveOutputFile, snpName
                print >>toRemoveOutputFileExplanation, "\t".join([
                    snpName,
                    "Undetermined",
                    "".join(alleles1),
                    "".join(alleles2),
                ])
            else:
                if alleles1 != alleles2:
                    # Let's try the flip one
                    if flipGenotype(alleles1) == alleles2:
                        # We need to flip it
                        print >>toFlipOutputFile, snpName
                    else:
                        # Those SNP are discordant...
                        print >>toRemoveOutputFile, snpName
                        print >>toRemoveOutputFileExplanation, "\t".join([
                            snpName,
                            "Invalid",
                            "".join(alleles1),
                            "".join(alleles2),
                        ])
        else:
            # We want to remove this SNP, because there is at least one
            # homozygous individual
            print >>toRemoveOutputFile, snpName
            tmp_allele1 = "".join(alleles1)
            if len(alleles1) == 1:
                tmp_allele1 += tmp_allele1
            tmp_allele2 = "".join(alleles1)
            if len(alleles1) == 1:
                tmp_allele2 += tmp_allele2
            print >>toRemoveOutputFileExplanation, "\t".join([snpName,
                                                              "Homozygous",
                                                              tmp_allele1,
                                                              tmp_allele2])

    # Closing output files
    toFlipOutputFile.close()
    toRemoveOutputFile.close()
    toRemoveOutputFileExplanation.close()