예제 #1
0
def runAsMedianMedianProblemTest(medianHistory):
    """Runs AsMedian, requires to be installed. I got it from:
    https://sites.google.com/site/andrewweixu/Home/software/asmedian
    """
    #Dump to disk
    tempFile = os.path.join(os.getcwd(), "simulatedGenomeTempFile.txt")
    fileHandle = open(tempFile, 'w')
    fileHandle.write(medianHistory.getLeafGenomeString())
    fileHandle.close()
    #-cp /Users/benedictpaten/Desktop/ASMedian-1.0
    popenCatch("java BIOMedian %s" % tempFile)
    os.remove(tempFile)
    #Parse in
    fileHandle = open(tempFile + ".rst", 'r')
    input = fileHandle.readlines()
    fileHandle.close()
    os.remove(tempFile + ".rst")
    asMedianMedianGenome = Genome(chromosomeNumber=0, elementNumber=0)
    for line in input[1:]:
        if line[0] == '#':
            break
        asMedianChromosome = Chromosome()
        for element in line.split()[1:]:
            asMedianChromosome.append(int(element))
        asMedianMedianGenome.addChromosome(asMedianChromosome)
    return asMedianMedianGenome
예제 #2
0
def runReferenceMedianProblemTest(medianHistory, greedyIterations, theta):
    """Runs the reference problem for a given median history
    """
    #Make adjacencies
    stubNumber = 2
    nodeNumber = len(
        medianHistory.getMedianGenome().getElements()) * 2 + stubNumber
    weights = {}
    for genome in medianHistory.getLeafGenomes():
        for node1, node2, distance in genome.getTransitiveAdjacencies():
            if (node1, node2) in weights:
                weights[(node1, node2)] += weightFn(distance, theta)
            else:
                weights[(node1, node2)] = weightFn(distance, theta)

    def translateLeftSideOfElementToNode(element):
        assert element != 0
        if element < 0:
            return abs(element) * 2
        return element * 2 + 1

    def translateLeftNodeToElement(node):
        assert node >= stubNumber
        assert node < nodeNumber
        element = node / 2
        if (node % 2) == 0:
            element *= -1
        return element

    #Now print out the
    input = "%i\t%i\t%i\t%i\t%s" % (
        greedyIterations, nodeNumber, stubNumber, len(weights.keys()),
        "\t".join([
            "%i\t%i\t%f" %
            (translateLeftSideOfElementToNode(-node1),
             translateLeftSideOfElementToNode(node2), weights[(node1, node2)])
            for (node1, node2) in weights.keys()
        ]))
    tempPath = getTempFile()
    with open(tempPath, 'w') as tempFile:
        tempFile.write(input)
    #Command
    command = os.path.join(
        os.path.split(
            os.path.abspath(
                matchingAndOrdering.tests.simulatedGenome.__file__))[0],
        "testBin", "referenceMedianProblemTest2")
    output = popenCatch(command + " < %s" % tempPath)
    os.remove(tempPath)
    medianChromosome = Chromosome()
    for adjacency in output.split():
        medianChromosome.append(translateLeftNodeToElement(int(adjacency)))
    medianGenome = Genome(chromosomeNumber=0, elementNumber=0)
    medianGenome.addChromosome(medianChromosome)
    assert medianGenome.getElements() == medianHistory.getMedianGenome(
    ).getElements()
    return medianGenome
예제 #3
0
    def testGenome(self):
        """Test basic functions of a genome
        """
        d = Genome(elementNumber=10, chromosomeNumber=3)
        self.assertEqual(d.getChromosomeNumber(), 3)
        self.assertEqual(d.getElements(), set(range(1, 11)))

        #Test clone
        self.assertEqual(str(d), str(d.clone()))

        #Test inversions
        for i in xrange(100):
            e = d.clone()
            self.assertEquals(d.getOutOfOrderDistance(e), 0)
            self.assertEquals(d.getCircularDcjDistance(e), 0)
            e.permuteByInversion()
            self.assertEquals(e.getChromosomeNumber(), 3)
            self.assertEquals(e.getElements(), d.getElements())
            self.assertTrue(d.getOutOfOrderDistance(e) >= 0)
            self.assertTrue(d.getCircularDcjDistance(e) in [0, 1])

        #Test dcj
        for i in xrange(100):
            e = d.clone()
            self.assertEquals(d.getOutOfOrderDistance(e), 0)
            self.assertEquals(d.getCircularDcjDistance(e), 0)
            e.permuteByDcj()
            self.assertEquals(e.getElements(), d.getElements())
            self.assertTrue(d.getOutOfOrderDistance(e) >= 0)
            self.assertTrue(d.getCircularDcjDistance(e) in [0, 1, 2])

        #Test translocations
        for i in xrange(100):
            e = d.clone()
            self.assertEquals(d.getOutOfOrderDistance(e), 0)
            self.assertEquals(d.getCircularDcjDistance(e), 0)
            e.permuteByTranslocation()
            self.assertEquals(e.getElements(), d.getElements())
            self.assertTrue(d.getOutOfOrderDistance(e) >= 0)
            self.assertTrue(d.getCircularDcjDistance(e) in [0, 1, 2])
예제 #4
0
 def testReferenceAndAsMedianAlgorithms(self):
     """Iterates through a list of simulation variants and prints results
     """
     headerLine = "\t".join(
         ("elementNumber", "chromosomeNumber", "leafGenomeNumber",
          "operationNumber", "totalOperationNumber", "doInversion",
          "doShortInversion", "doDcj", "doTranslocation",
          "doShortTranslocation", "greedyIterations", "theta", "replicate",
          "medianDCJDistance", "medianOutOfOrderDistance",
          "weightedMedianOutOfOrderDistance",
          "medianDCJDistanceForReferenceAlgorithm",
          "medianOutOfOrderDistanceForReferenceAlgorithm",
          "weightedMedianOutOfOrderDistanceForReferenceAlgorithm",
          "dCJDistanceForReferenceAlgorithmFromMedian",
          "outOfOrderDistanceForReferenceAlgorithmFromMedian",
          "weightedOutOfOrderDistanceForReferenceAlgorithmFromMedian",
          "medianDCJDistanceForAsMedian",
          "medianOutOfOrderDistanceForAsMedian",
          "weightedMedianOutOfOrderDistanceForAsMedian",
          "dCJDistanceForAsMedianFromMedian",
          "outOfOrderDistanceForAsMedianFromMedian",
          "weightedOutOfOrderDistanceForAsMedianFromMedian",
          "medianGenomeForReferenceAlgorithm", "medianGenomeForAsMedian"))
     if getLogLevelString() in ("DEBUG", "INFO"):
         print headerLine
     for elementNumber in self.elementNumbers:
         for chromosomeNumber in self.chromosomeNumbers:
             for leafGenomeNumber in self.leafGenomeNumbers:
                 for operationNumber in self.operationNumber:
                     for doInversion, doShortInversion, doDcj, doTranslocation, doShortTranslocation in self.operationType:
                         for greedyIterations in self.greedyIterations:
                             for theta in self.theta:
                                 for replicate in xrange(self.replicates):
                                     medianHistory = MedianHistory(
                                         Genome(elementNumber=elementNumber,
                                                chromosomeNumber=
                                                chromosomeNumber),
                                         leafGenomeNumber=leafGenomeNumber)
                                     medianHistory.permuteLeafGenomes(
                                         operationNumber=operationNumber,
                                         doInversion=doInversion,
                                         doDcj=doDcj,
                                         doTranslocation=doTranslocation,
                                         doShortInversion=doShortInversion,
                                         doShortTranslocation=
                                         doShortTranslocation)
                                     medianDCJDistance = medianHistory.getMedianDcjDistance(
                                         medianHistory.getMedianGenome())
                                     medianOutOfOrderDistance = medianHistory.getMedianOutOfOrderDistance(
                                         medianHistory.getMedianGenome())
                                     weightedMedianOutOfOrderDistance = medianHistory.getWeightedMedianOutOfOrderDistance(
                                         medianHistory.getMedianGenome(),
                                         theta=theta)
                                     #Now run reference problem algorithm
                                     referenceProblemMedianGenome = runReferenceMedianProblemTest(
                                         medianHistory, greedyIterations,
                                         theta)
                                     medianDCJDistanceForReferenceAlgorithm = medianHistory.getMedianDcjDistance(
                                         referenceProblemMedianGenome)
                                     medianOutOfOrderDistanceForReferenceAlgorithm = medianHistory.getMedianOutOfOrderDistance(
                                         referenceProblemMedianGenome)
                                     weightedMedianOutOfOrderDistanceForReferenceAlgorithm = medianHistory.getWeightedMedianOutOfOrderDistance(
                                         referenceProblemMedianGenome,
                                         theta=theta)
                                     dCJDistanceForReferenceAlgorithmFromMedian = medianHistory.getMedianGenome(
                                     ).getCircularDcjDistance(
                                         referenceProblemMedianGenome)
                                     outOfOrderDistanceForReferenceAlgorithmFromMedian = medianHistory.getMedianGenome(
                                     ).getOutOfOrderDistance(
                                         referenceProblemMedianGenome)
                                     weightedOutOfOrderDistanceForReferenceAlgorithmFromMedian = medianHistory.getMedianGenome(
                                     ).getWeightedOutOfOrderDistance(
                                         referenceProblemMedianGenome,
                                         theta=theta)
                                     totalOperationNumber = operationNumber * len(
                                         [
                                             i for i in
                                             (doInversion, doShortInversion,
                                              doDcj, doTranslocation,
                                              doShortTranslocation)
                                             if i == True
                                         ])
                                     #Biomedian comparison turned off
                                     if False and leafGenomeNumber == 3 and doDcj == False and float(
                                             totalOperationNumber
                                     ) / elementNumber <= 0.5:
                                         asMedianProblemMedianGenome = runAsMedianMedianProblemTest(
                                             medianHistory)
                                         medianDCJDistanceForAsMedian = medianHistory.getMedianDcjDistance(
                                             asMedianProblemMedianGenome)
                                         medianOutOfOrderDistanceForAsMedian = medianHistory.getMedianOutOfOrderDistance(
                                             asMedianProblemMedianGenome)
                                         weightedMedianOutOfOrderDistanceForAsMedian = medianHistory.getWeightedMedianOutOfOrderDistance(
                                             asMedianProblemMedianGenome,
                                             theta=theta)
                                         dCJDistanceForAsMedianFromMedian = medianHistory.getMedianGenome(
                                         ).getCircularDcjDistance(
                                             asMedianProblemMedianGenome)
                                         outOfOrderDistanceForAsMedianFromMedian = medianHistory.getMedianGenome(
                                         ).getOutOfOrderDistance(
                                             asMedianProblemMedianGenome)
                                         weightedOutOfOrderDistanceForAsMedianFromMedian = medianHistory.getMedianGenome(
                                         ).getWeightedOutOfOrderDistance(
                                             asMedianProblemMedianGenome,
                                             theta=theta)
                                     else:
                                         asMedianProblemMedianGenome = "n/a"
                                         medianDCJDistanceForAsMedian = "n/a"
                                         medianOutOfOrderDistanceForAsMedian = "n/a"
                                         weightedMedianOutOfOrderDistanceForAsMedian = "n/a"
                                         dCJDistanceForAsMedianFromMedian = "n/a"
                                         outOfOrderDistanceForAsMedianFromMedian = "n/a"
                                         weightedOutOfOrderDistanceForAsMedianFromMedian = "n/a"
                                     #Now prepare line to print
                                     line = "\t".join([
                                         str(i) for i in
                                         (elementNumber, chromosomeNumber,
                                          leafGenomeNumber, operationNumber,
                                          totalOperationNumber, doInversion,
                                          doShortInversion, doDcj,
                                          doTranslocation,
                                          doShortTranslocation,
                                          greedyIterations, theta,
                                          replicate, medianDCJDistance,
                                          medianOutOfOrderDistance,
                                          weightedMedianOutOfOrderDistance,
                                          medianDCJDistanceForReferenceAlgorithm,
                                          medianOutOfOrderDistanceForReferenceAlgorithm,
                                          weightedMedianOutOfOrderDistanceForReferenceAlgorithm,
                                          dCJDistanceForReferenceAlgorithmFromMedian,
                                          outOfOrderDistanceForReferenceAlgorithmFromMedian,
                                          weightedOutOfOrderDistanceForReferenceAlgorithmFromMedian,
                                          medianDCJDistanceForAsMedian,
                                          medianOutOfOrderDistanceForAsMedian,
                                          weightedMedianOutOfOrderDistanceForAsMedian,
                                          dCJDistanceForAsMedianFromMedian,
                                          outOfOrderDistanceForAsMedianFromMedian,
                                          weightedOutOfOrderDistanceForAsMedianFromMedian,
                                          "'%s'" %
                                          str(referenceProblemMedianGenome),
                                          "'%s'" %
                                          str(asMedianProblemMedianGenome))
                                     ])
                                     #Print line
                                     if getLogLevelString() in ("DEBUG",
                                                                "INFO"):
                                         print line