def testIntegration3(self): """ Simulations are actually run """ controlFile = "tests/data/3ptb_data/integrationTest3.conf" goldenPath = "tests/data/3ptb_data/originTest3" outputPath = "tests/data/3ptb_data/Test3" elements = [22, 14, 16, 19, 1] goldenClusters = [] metrics = [[1.00000e+00, 0.00000e+00, 0.00000e+00, -5.28675e+02, 6.41969e-03], [1.00000e+00, 0.00000e+00, 0.00000e+00, -5.28657e+02, 1.88599e-02], [1.00000e+00, 0.00000e+00, 0.00000e+00, -5.28675e+02, 6.41969e-03], [1.00000e+00, 0.00000e+00, 0.00000e+00, -5.28665e+02, 1.24213e-02], [1.00000e+00, 5.00000e+00, 5.00000e+00, -5.28660e+02, 1.75149e-02]] for i in range(5): pdb = atomset.PDB() pdb.initialise(goldenPath+"/2/clustering/cluster_%d.pdb" % i, resname="AEN") cluster = clustering.Cluster(pdb, 4, metrics=metrics[i]) cluster.elements = elements[i] cluster.contacts = 0 goldenClusters.append(cluster) # name = socket.gethostname() # if "bsccv" not in name and "login" not in name: # print("Some integration can't be run due to not having PELE installed") # return True # self.integrationTest(controlFile, goldenPath, outputPath, goldenClusters) tmpFolder = "tmp_" + outputPath.replace("/", "_") adaptiveSampling.main(controlFile) self.check_succesful_simulation(outputPath, 3) # cleanup shutil.rmtree(outputPath) shutil.rmtree(tmpFolder)
def test_symmetryContactMapDifference(self): pdb_1 = atomset.PDB() pdb_1.initialise("tests/data/symmetries/cluster_1.pdb", resname='AEN') pdb_1_sym = atomset.PDB() pdb_1_sym.initialise("tests/data/symmetries/cluster_1_sym.pdb", resname='AEN') symmetries3PTB = [{"3230:N1:AEN": "3231:N2:AEN"}] symmetryEvaluator = sym.SymmetryContactMapEvaluator(symmetries3PTB) symmetryEvaluatorEmpty = sym.SymmetryContactMapEvaluator() contactMap1, contacts1 = symmetryEvaluator.buildContactMap( pdb_1, 'AEN', 16) cluster = clustering.Cluster(pdb_1, contactMap=contactMap1) contactMap1Sym, contactsSym = symmetryEvaluator.createContactMap( pdb_1_sym, 'AEN', 16) contactMapNoSym, _ = symmetryEvaluator.createContactMap( pdb_1_sym, 'AEN', 16) goldenDifference = 0.0 DifferenceSym = symmetryEvaluator.evaluateDifferenceDistance( contactMap1Sym, cluster.contactMap) DifferenceNosym = symmetryEvaluatorEmpty.evaluateDifferenceDistance( contactMapNoSym, cluster.contactMap) self.assertEqual(contacts1, contactsSym) self.assertAlmostEqual(goldenDifference, DifferenceSym) self.assertNotAlmostEqual(DifferenceSym, DifferenceNosym)
def test_symmetryContactMapJaccard_XTC(self): xtc_obj = mdtraj.load("tests/data/symmetries/cluster_1.xtc", top="tests/data/symmetries/cluster_1.pdb") topology = utilities.getTopologyFile( "tests/data/symmetries/cluster_1.pdb") pdb_1 = atomset.PDB() pdb_1.initialise(10 * xtc_obj.xyz[0], resname='AEN', topology=topology) topology = utilities.getTopologyFile( "tests/data/symmetries/cluster_1_sym.pdb") xtc_obj = mdtraj.load("tests/data/symmetries/cluster_1_sym.xtc", top="tests/data/symmetries/cluster_1_sym.pdb") pdb_1_sym = atomset.PDB() pdb_1_sym.initialise(10 * xtc_obj.xyz[0], resname='AEN', topology=topology) symmetries3PTB = [{"3230:N1:AEN": "3231:N2:AEN"}] symmetryEvaluator = sym.SymmetryContactMapEvaluator(symmetries3PTB) symmetryEvaluatorEmpty = sym.SymmetryContactMapEvaluator() contactMap1, contacts1 = symmetryEvaluator.buildContactMap( pdb_1, 'AEN', 16) cluster = clustering.Cluster(pdb_1, contactMap=contactMap1) contactMap1Sym, contactsSym = symmetryEvaluator.createContactMap( pdb_1_sym, 'AEN', 16) contactMapNoSym, _ = symmetryEvaluator.createContactMap( pdb_1_sym, 'AEN', 16) goldenJaccard = 0.0 Jaccard = symmetryEvaluator.evaluateJaccard(contactMap1Sym, cluster.contactMap) JaccardNosym = symmetryEvaluatorEmpty.evaluateJaccard( contactMapNoSym, cluster.contactMap) self.assertEqual(contacts1, contactsSym) self.assertAlmostEqual(goldenJaccard, Jaccard) self.assertNotAlmostEqual(Jaccard, JaccardNosym)
def testPeriodicVariableEpsilonCalculator(self): params = spawning.SpawningParams() params.epsilon = 0.5 params.varEpsilonType = "linearVariation" params.maxEpsilon = 0.75 params.minEpsilon = 0.5 params.variationWindow = 20 params.maxEpsilonWindow = 1 params.metricWeights = "linear" params.nclusters = 100 params_test = {"period": 8} params.period = params_test.get("period", params.variationWindow) params.period += np.sign(np.abs(params.variationWindow - params.period)) variable_epsilon = spawning.VariableEpsilonDegeneracyCalculator(params) # rateVariation = (params.maxEpsilon-params.minEpsilon)/3 clusters = clustering.Clusters() sizes = [6, 2, 3, 1] energies = [-4, -2, -2, -1] for size, energy in zip(sizes, energies): cluster = clustering.Cluster(None, None, None, None, metricCol=0) cluster.elements = size cluster.metrics = [energy] clusters.addCluster(cluster) trajs = 20 degeneracy6 = variable_epsilon.calculate(clusters.clusters, trajs, 0) golden6 = np.array([7, 4, 4, 5]) np.testing.assert_array_equal(degeneracy6, golden6) self.assertAlmostEqual(params.epsilon, params.minEpsilon) for i in range(1, params.variationWindow): degeneracy7 = variable_epsilon.calculate(clusters.clusters, trajs, i)
def testEpsilonCalculatorWithDensity(self): params = spawning.SpawningParams() params.epsilon = 0.5 params.metricWeights = "linear" params.nclusters = 100 clusters = clustering.Clusters() sizes = [6, 2, 3, 1] energies = [-4, -2, -2, 0] contacts = [4, 3, 2, 1] for size, energy, ncontacts in zip(sizes, energies, contacts): cluster = clustering.Cluster(None, None, None, None, metricCol=0) cluster.elements = size cluster.metrics = [energy] cluster.contacts = ncontacts clusters.addCluster(cluster) clusteringBlock = { "density": { "type": "heaviside", "params": { "values": [6, 2, 3, 1], "conditions": [3, 2, 1] } } } densityCalculatorBuilder = densitycalculator.DensityCalculatorBuilder() densityCalculator = densityCalculatorBuilder.build(clusteringBlock) epsilon = spawning.EpsilonDegeneracyCalculator(params, densityCalculator) trajs = 16 degeneracy = epsilon.calculate(clusters.clusters, trajs) golden = np.array([6, 4, 4, 2]) np.testing.assert_array_equal(degeneracy, golden)
def testInverselyProportionalToPopulationCalculatorWithDensity(self): # test 3 clusters = clustering.Clusters() sizes = [6, 2, 3, 1] contacts = [4, 3, 2, 1] for size, ncontacts in zip(sizes, contacts): cluster = clustering.Cluster(None, None, None, None) cluster.elements = size cluster.contacts = ncontacts clusters.addCluster(cluster) clusteringBlock = { "density": { "type": "heaviside", "params": { "values": [6, 2, 3, 1], "conditions": [3, 2, 1] } } } densityCalculatorBuilder = densitycalculator.DensityCalculatorBuilder() densityCalculator = densityCalculatorBuilder.build(clusteringBlock) params = spawning.SpawningParams() inverselyProp = spawning.InverselyProportionalToPopulationCalculator( params, densityCalculator) trajs = 8 degeneracy = inverselyProp.calculate(clusters.clusters, trajs) golden = [2, 2, 2, 2] self.assertEqual(degeneracy, golden)
def testInverselyProportionalToPopulationCalculator(self): clusters = clustering.Clusters() sizes = [6, 2, 3, 1] for size in sizes: cluster = clustering.Cluster(None, None, None, None) cluster.elements = size clusters.addCluster(cluster) params = spawning.SpawningParams() inverselyProp = spawning.InverselyProportionalToPopulationCalculator( params) trajs = 10 degeneracy = inverselyProp.calculate(clusters.clusters, trajs) golden = [1, 2, 2, 5] self.assertEqual(degeneracy, golden)
def testUCBCalculator(self): params = spawning.SpawningParams() params.alpha = 8.0 UCB = spawning.UCBCalculator(params) clusters = clustering.Clusters() sizes = [6, 2, 3, 1] energies = [-4, -2, -2, -1] for size, energy in zip(sizes, energies): cluster = clustering.Cluster(None, None, None, None, metricCol=0) cluster.elements = size cluster.metrics = [energy] clusters.addCluster(cluster) trajs = 20 degeneracy = UCB.calculate(clusters.clusters, trajs) golden = np.array([3, 5, 3, 9]) np.testing.assert_array_equal(degeneracy, golden)
def testSameWeightDegeneracyCalculator(self): params = spawning.SpawningParams() sameWeightDegCalculator = spawning.SameWeightDegeneracyCalculator( params) clusters = clustering.Clusters() sizes = [6, 2, 3, 1] for size in sizes: cluster = clustering.Cluster(None, None, None, None) cluster.elements = size clusters.addCluster(cluster) trajs = 10 degeneracy = sameWeightDegCalculator.calculate(clusters.clusters, trajs) golden = [1, 1, 1, 1] self.assertEqual(degeneracy, golden)
def addSnapshotToCluster(self, snapshot, metrics=[], col=None): pdb = atomset.PDB() pdb.initialise(snapshot, resname=self.resname) if not self.initialPDB: self.initialPDB = pdb contacts = pdb.countContacts(self.resname, self.contactThresholdDistance) numberOfLigandAtoms = pdb.getNumberOfAtoms() contactsPerAtom = float(contacts) / numberOfLigandAtoms threshold = self.thresholdCalculator.calculate(contactsPerAtom) threshold2 = threshold**2 threshold2 = 10 initial_scd = atomset.computeSquaredCentroidDifference( self.initialPDB, pdb) snapshotPosition, closerClusterInd, closerClusterRMSD = self.getCloserCluster( initial_scd, threshold2, pdb) try: clusterToAssign = self.clusters.clusters[closerClusterInd] if closerClusterRMSD < clusterToAssign.threshold: clusterToAssign.addElement(metrics) return except TypeError: # When the first snapshot is read the index of the closest cluster # center is set to None pass # if made it here, the snapshot was not added into any cluster cluster = clustering.Cluster(pdb, thresholdRadius=threshold, contacts=contactsPerAtom, metrics=metrics, metricCol=col, density=1) if snapshotPosition is not None: self.clusters.insertCluster(snapshotPosition, cluster) self.distancesList.insert(snapshotPosition, initial_scd) else: self.clusters.addCluster(cluster) self.distancesList.append(initial_scd)
def testEpsilonCalculator(self): params = spawning.SpawningParams() params.epsilon = 0.5 params.metricWeights = "linear" params.nclusters = 100 epsilon = spawning.EpsilonDegeneracyCalculator(params) clusters = clustering.Clusters() sizes = [6, 2, 3, 1] energies = [-4, -2, -2, -1] for size, energy in zip(sizes, energies): cluster = clustering.Cluster(None, None, None, None, metricCol=0) cluster.elements = size cluster.metrics = [energy] clusters.addCluster(cluster) trajs = 20 degeneracy = epsilon.calculate(clusters.clusters, trajs) golden = np.array([7, 4, 4, 5]) np.testing.assert_array_equal(degeneracy, golden)
def test_CMInnerLimit(self): CMEvaluator = clustering.CMClusteringEvaluator(None, None) cluster1_8 = clustering.Cluster(None, contacts=1, contactThreshold=8) cluster2_8 = clustering.Cluster(None, contacts=2.2, contactThreshold=8) cluster2_6 = clustering.Cluster(None, contacts=2.2, contactThreshold=6) cluster1_6 = clustering.Cluster(None, contacts=1.0, contactThreshold=6) cluster1_4 = clustering.Cluster(None, contacts=1.0, contactThreshold=4) cluster2_4 = clustering.Cluster(None, contacts=2.2, contactThreshold=4) # Reduced slope to 8 self.assertAlmostEqual(CMEvaluator.getInnerLimit(cluster1_8), 12) self.assertAlmostEqual(CMEvaluator.getInnerLimit(cluster2_8), 4) self.assertAlmostEqual(CMEvaluator.getInnerLimit(cluster1_6), 12) self.assertAlmostEqual(CMEvaluator.getInnerLimit(cluster2_6), 4) self.assertAlmostEqual(CMEvaluator.getInnerLimit(cluster1_4), 12) self.assertAlmostEqual(CMEvaluator.getInnerLimit(cluster2_4), 4)
def testIntegration1(self): """ Simulations are not run, trajectories and reports are copied """ controlFile = "tests/data/3ptb_data/integrationTest1.conf" goldenPath = "tests/data/3ptb_data/originTest1" outputPath = "tests/data/3ptb_data/Test1" elements = [28, 17, 5, 18, 1, 3] goldenClusters = [] metrics = [[1.00000e+00, 0.00000e+00, 0.00000e+00, -7.49807e+03, 2.01909e+01, 2.16436e-01], [1.00000e+00, 0.00000e+00, 0.00000e+00, -7.49806e+03, 1.85232e+01, 2.29384e-01], [1.00000e+00, 0.00000e+00, 0.00000e+00, -7.49801e+03, 1.82444e+01, 2.53929e-01], [1.00000e+00, 0.00000e+00, 0.00000e+00, -7.49800e+03, 2.24539e+01, 2.66941e-01], [1.00000e+00, 5.00000e+00, 5.00000e+00, -7.49797e+03, 2.23322e+01, 3.08604e-01], [1.00000e+00, 3.00000e+00, 3.00000e+00, -7.49829e+03, 1.48606e+01, 7.32479e-03]] for i in range(6): pdb = atomset.PDB() pdb.initialise(goldenPath+"/2/clustering/cluster_%d.pdb" % i, resname="AEN") cluster = clustering.Cluster(pdb, thresholdRadius=4, metrics=metrics[i]) cluster.elements = elements[i] cluster.contacts = 0 goldenClusters.append(cluster) self.integrationTest(controlFile, goldenPath, outputPath, goldenClusters)
def testIntegration2(self): """ Simulations are not run, trajectories and reports are copied """ controlFile = "tests/data/3ptb_data/integrationTest2.conf" goldenPath = "tests/data/3ptb_data/srcTest2Epsilon" outputPath = "tests/data/3ptb_data/Test2" elements = [35, 14, 8, 14, 1] metrics = [[1.0, 0.0, 0.0, -7498.07, 20.1909, 0.216436], [1.0, 0.0, 0.0, -7498.06, 18.5232, 0.229384], [1.0, 0.0, 0.0, -7498.01, 18.6059, 0.253929], [1.0, 0.0, 0.0, -7498.05, 22.4539, 0.238184], [1.0, 4.0, 4.0, -7498.05, 22.7766, 0.242335]] goldenClusters = [] for i in range(5): pdb = atomset.PDB() pdb.initialise(goldenPath+"/2/clustering/cluster_%d.pdb" % i, resname="AEN") cluster = clustering.Cluster(pdb, 4, metrics=metrics[i]) cluster.elements = elements[i] cluster.contacts = 0 goldenClusters.append(cluster) self.integrationTest(controlFile, goldenPath, outputPath, goldenClusters)