From fcea2c825bfb1ad24682ef7a2b7a1e85e7250cc6 Mon Sep 17 00:00:00 2001 From: Mark Driver <mdd31@cam.ac.uk> Date: Mon, 26 Mar 2018 20:49:34 +0100 Subject: [PATCH] added methods for writing to file after extracting the required values, and updated tests. --- .../io/solvationenergyextraction.py | 27 +++++++++ .../iotest/solvationenergyextractiontest.py | 55 ++++++++++++++++--- 2 files changed, 74 insertions(+), 8 deletions(-) diff --git a/solventmapcreator/io/solvationenergyextraction.py b/solventmapcreator/io/solvationenergyextraction.py index 0291cc8..25606ee 100644 --- a/solventmapcreator/io/solvationenergyextraction.py +++ b/solventmapcreator/io/solvationenergyextraction.py @@ -35,6 +35,33 @@ def get_solvent_id_list(solvent_list_element_tree): LOGGER.info("Solvent IDs found %i", len(solvent_ids)) return solvent_ids +def extract_and_write_energy_values_for_solvent_list(solvent_id_list, energy_xml, energy_type, directory): + """This extracts the energies for each solvent and writes the energies found to a new file per solvent. + """ + for solvent_id in solvent_id_list: + extract_and_write_energy_values_for_solvent(solvent_id, energy_xml, + energy_type, directory) + +def extract_and_write_energy_values_for_solvent(solvent_id, energy_xml, energy_type, directory): + """This extracts the elements and writes the energies found ot a new file. + """ + energy_values_element = generate_energy_values_element_for_solvent(solvent_id, energy_xml, energy_type) + element_tree = create_element_tree(energy_values_element) + outfilename = directory + create_output_filename(solvent_id, energy_type) + write_element_tree_to_file(element_tree, outfilename) + +def generate_energy_values_element_for_solvent(solvent_id, energy_xml, energy_type): + """This extracts the elements for the solvents and creates a new EnergyValues element. + """ + if energy_type == "binding": + xpath_expression = generate_binding_energy_xpath_expression(solvent_id) + energy_elements = get_energy_elements(energy_xml, xpath_expression) + return generate_energy_values_element(energy_elements, energy_type) + elif energy_type == "free": + xpath_expression = generate_free_energy_xpath_expression(solvent_id) + energy_elements = get_energy_elements(energy_xml, xpath_expression) + return generate_energy_values_element(energy_elements, energy_type) + def create_output_filename(to_solvent_id, energy_type): """This creates an output filename based on the solvent id and energy type. """ diff --git a/solventmapcreator/test/iotest/solvationenergyextractiontest.py b/solventmapcreator/test/iotest/solvationenergyextractiontest.py index 0119d9b..ab31087 100644 --- a/solventmapcreator/test/iotest/solvationenergyextractiontest.py +++ b/solventmapcreator/test/iotest/solvationenergyextractiontest.py @@ -22,13 +22,14 @@ class SolvationEnergyExtractionTestCase(unittest.TestCase): def setUp(self): """Set up for tests """ + self.maxDiff=None self.solvent_filename = "resources/watersolvent.xml" self.solvent_xml = solvationenergyextraction.read_xml_file(self.solvent_filename) self.binding_energy_filename = "resources/energyvaluestest.xml" self.free_energy_filename = "resources/energyvaluestest2.xml" self.actual_output_filename = "resources/watersolvation.xml" - self.actual_output_filename2 = "water.xml" - self.actual_output_filename3 = "water.xml" + self.actual_output_filename2 = "waterfree.xml" + self.actual_output_filename3 = "waterbinding.xml" self.binding_energy_xml = solvationenergyextraction.read_xml_file(self.binding_energy_filename) self.free_energy_xml = solvationenergyextraction.read_xml_file(self.free_energy_filename) def tearDown(self): @@ -46,11 +47,6 @@ class SolvationEnergyExtractionTestCase(unittest.TestCase): if os.path.isfile(self.actual_output_filename3): os.remove(self.actual_output_filename3) del self.actual_output_filename3 - - def test_(self): - """ - """ - self.fail("not implemented") def test_read_in_solvent_id_list(self): """Test to see if expected solvent ID list is returned. """ @@ -63,6 +59,39 @@ class SolvationEnergyExtractionTestCase(unittest.TestCase): expected_solvent_list = ["water"] actual_list = solvationenergyextraction.get_solvent_id_list(self.solvent_xml) self.assertListEqual(expected_solvent_list, actual_list) + def test_extract_and_write_energy_values_for_solvent_list(self): + """Test to see if expected files is produced. + """ + solvationenergyextraction.extract_and_write_energy_values_for_solvent_list(["water"], self.binding_energy_xml, "binding", "") + with open(self.actual_output_filename3, "r") as actual_file: + actual_xml = actual_file.read() + with open("resources/energyvaluestest.xml") as expected_file: + expected_xml = expected_file.read() + self.assertEqual(expected_xml, actual_xml) + def test_extract_and_write_energy_values_for_solvent(self): + """Test to see if expected file is produced. + """ + solvationenergyextraction.extract_and_write_energy_values_for_solvent("water", self.free_energy_xml, "free", "") + with open(self.actual_output_filename2, "r") as actual_file: + actual_xml = actual_file.read() + with open("resources/energyvaluestest2.xml") as expected_file: + expected_xml = expected_file.read() + self.assertEqual(expected_xml, actual_xml) + def test_generate_energy_values_element_for_solvent(self): + """Test to see expected energy values is produced. + """ + expected_xml = """<phase:EnergyValues xmlns:phase="http://www-hunter.ch.cam.ac.uk/PhaseSchema"> + <phase:FreeEnergyCollection><phase:FreeEnergy phase:moleculeID="-14.100solute" phase:fromSolventID="" phase:toSolventID="water" phase:valueType="MOLEFRACTION"> + <phase:TotalEnergy>-34.8195308084233</phase:TotalEnergy> + <phase:EnergyContributions> + <phase:EnergyContribution phase:ssipID="1">-34.8195308084233</phase:EnergyContribution> + </phase:EnergyContributions> + </phase:FreeEnergy> + </phase:FreeEnergyCollection> +</phase:EnergyValues> +""" + actual_element = solvationenergyextraction.generate_energy_values_element_for_solvent("water", self.free_energy_xml, "free") + self.assertMultiLineEqual(expected_xml, etree.tounicode(actual_element, pretty_print=True)) def test_create_output_filename(self): """Test to see if expected filename is produced. """ @@ -72,7 +101,17 @@ class SolvationEnergyExtractionTestCase(unittest.TestCase): def test_write_element_tree_to_file(self): """Test to see if expecetd file is written. """ - self.fail("not implemented") + xpath_expression = solvationenergyextraction.generate_free_energy_xpath_expression("water") + free_elements = solvationenergyextraction.get_energy_elements(self.free_energy_xml, + xpath_expression) + energy_values_element = solvationenergyextraction.generate_energy_values_element(free_elements, "free") + energy_values_tree = solvationenergyextraction.create_element_tree(energy_values_element) + solvationenergyextraction.write_element_tree_to_file(energy_values_tree, self.actual_output_filename) + with open(self.actual_output_filename, "r") as actual_file: + actual_xml = actual_file.read() + with open("resources/energyvaluestest2.xml") as expected_file: + expected_xml = expected_file.read() + self.assertEqual(expected_xml, actual_xml) def test_create_element_tree(self): """Test to see if expected element tree is produced. """ -- GitLab