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