diff --git a/solventmapcreator/io/solventxmlreader.py b/solventmapcreator/io/solventxmlreader.py index 8b3798987d65a5f0879482646fd1653fc7d3c4e4..eac539d4c0a90509c505cde0d5682c4ba7408a4b 100644 --- a/solventmapcreator/io/solventxmlreader.py +++ b/solventmapcreator/io/solventxmlreader.py @@ -21,14 +21,26 @@ PHASE_NAMESPACE_DICT = {"phase":"http://www-hunter.ch.cam.ac.uk/PhaseSchema", "ssip":"http://www-hunter.ch.cam.ac.uk/SSIP", 'cml':'http://www.xml-cml.org/schema'} -def calculate_freactional_occupancy_for_solvent(solvent_element): - """ +IDEAL_MAX_SSIP_CONCENTRATION_MOLAR = 300.0 + +def calculate_fractional_occupancy_for_solvent(solvent_element): + """This calculates the contribution to the fractional occupancy from the solvent. """ + xpath_expression = "phase:Molecule" + molecule_element_list = solvent_element.xpath(xpath_expression, namespaces=PHASE_NAMESPACE_DICT) + solvent_fractional_occupancy = 0.0 + for molecule_element in molecule_element_list: + fractional_occupancy_contribution = calculate_fractional_occupancy_contribution(molecule_element) + solvent_fractional_occupancy += fractional_occupancy_contribution + return solvent_fractional_occupancy def calculate_fractional_occupancy_contribution(molecule_element): + """This calculates the contribution to the fractional occupancy for this species. """ - """ - + concentration_value = get_concentration_value(molecule_element) + number_of_ssips = get_number_of_ssips_in_molecule(molecule_element) + return (concentration_value * number_of_ssips)/IDEAL_MAX_SSIP_CONCENTRATION_MOLAR + def get_concentration_value(molecule_element): """This extracts the concentration. """ @@ -38,14 +50,14 @@ def get_concentration_value(molecule_element): return float(concentration_element_list[0].text) else: LOGGER.debug("len:") - LOGGER.debug(len(solvent_element_list)) - LOGGER.debug(solvent_element_list) + LOGGER.debug(len(concentration_element_list)) + LOGGER.debug(concentration_element_list) raise ValueError("Wrong number of Concentration Elements.") def get_number_of_ssips_in_molecule(molecule_element): """This extracts the SSIP elements and return the number. """ - xpath_expression = "ssip:SSIP" + xpath_expression = "ssip:SSIPList/ssip:SSIP" ssip_element_list = molecule_element.xpath(xpath_expression, namespaces=PHASE_NAMESPACE_DICT) return len(ssip_element_list) @@ -66,7 +78,7 @@ def create_solvent_xpath_expression(solvent_id): """This creates the xpath expression to extract the solvent Element based on solventID. """ - return "phase:Solvent[@phase:solventID={:s}]".format(solvent_id) + return 'phase:Solvent[@phase:solventID="{:s}"]'.format(solvent_id) def read_element_tree(filename): """This reads in an xml file to an element tree. diff --git a/solventmapcreator/test/iotest/solventxmlreadertest.py b/solventmapcreator/test/iotest/solventxmlreadertest.py new file mode 100644 index 0000000000000000000000000000000000000000..e88530e571a723228911516be5a039f44c286ba1 --- /dev/null +++ b/solventmapcreator/test/iotest/solventxmlreadertest.py @@ -0,0 +1,114 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +""" +Script containing tests for the solventxmlreader. + +@author: mark +""" + +import logging +import unittest +from lxml import etree +import solventmapcreator.io.solventxmlreader as solventxmlreader + +logging.basicConfig() +LOGGER = logging.getLogger(__name__) +LOGGER.setLevel(logging.WARN) + +class SolventXMLReaderTestCase(unittest.TestCase): + """Test case for solventxmlreader script tests. + """ + def setUp(self): + """Set up for tests. + """ + self.solvent_list_xml = solventxmlreader.read_element_tree("resources/watersolvent.xml") + self.water_solvent_element = self.solvent_list_xml.xpath("phase:Solvent", namespaces=solventxmlreader.PHASE_NAMESPACE_DICT)[0] + self.water_molecule_element = self.water_solvent_element.xpath("phase:Molecule", namespaces=solventxmlreader.PHASE_NAMESPACE_DICT)[0] + self.maxDiff=None + def tearDown(self): + """Tear down after tests. + """ + del self.solvent_list_xml + del self.water_solvent_element + del self.water_molecule_element + def test_calculate_fractional_occupancy_for_solvent(self): + """Test to see if expected value is returned for the fractional + occupancy. + """ + expected_value = 55.35 * 4.0 /300.0 + actual_value = solventxmlreader.calculate_fractional_occupancy_for_solvent(self.water_solvent_element) + self.assertAlmostEqual(expected_value, actual_value) + def test_calculate_fractional_occupancy_contribution(self): + """Test to see if expected contribution to fractional occupancy is returned. + """ + expected_value = 55.35* 4.0 / 300.0 + actual_value = solventxmlreader.calculate_fractional_occupancy_contribution(self.water_molecule_element) + self.assertAlmostEqual(expected_value, actual_value) + def test_get_concentration_value(self): + """Test to see if expected concentration is returned + """ + expected_value = 55.3500 + actual_value = solventxmlreader.get_concentration_value(self.water_molecule_element) + self.assertAlmostEqual(expected_value, actual_value) + def test_get_number_of_ssips_in_molecule(self): + """Test to see if expected number of SSIPs is returned. + """ + expected_value = 4 + actual_value = solventxmlreader.get_number_of_ssips_in_molecule(self.water_molecule_element) + self.assertEqual(expected_value, actual_value) + def test_get_solvent_element_by_id(self): + """Test to see if expected solvent element is returned. + """ + expected_xml = ('<phase:Solvent xmlns:phase="http://www-hunter.ch.cam.ac.uk/PhaseSchema" xmlns:cml="http://www.xml-cml.org/schema" xmlns:ssip="http://www-hunter.ch.cam.ac.uk/SSIP" phase:solventID="water" phase:solven' + + 'tName="water" phase:numberOfMolecules="1">\n' + + ' <phase:Molecule phase:stdInChIKey="XLYOFNOQVPJJNP-UHFFFAOYSA-N">\n' + + ' <ssip:SSIPList>\n' + + '\t\t\t<ssip:SurfaceInformation numberOfPoints="1000">\n' + + '\t\t\t\t<ssip:IsosurfaceDensity>0.002</ssip:IsosurfaceDensity>\n' + + '\t\t\t\t<ssip:TotalSurfaceArea>10.0</ssip:TotalSurfaceArea>\n' + + '\t\t\t\t<ssip:NegativeSurfaceArea>5.0</ssip:NegativeSurfaceArea>\n' + + '\t\t\t\t<ssip:PositiveSurfaceArea>5.0</ssip:PositiveSurfaceArea>\n' + + '\t\t\t</ssip:SurfaceInformation>\n' + + '\t\t\t<ssip:SSIP x3="1.0" y3="0.0" z3="0.0" nearestAtomID="a1">2.8</ssip:SSIP>\n' + + '\t\t\t<ssip:SSIP x3="1.0" y3="1.0" z3="1.0" nearestAtomID="a1">2.8</ssip:SSIP>\n' + + '\t\t\t<ssip:SSIP x3="0.0" y3="1.0" z3="1.0" nearestAtomID="a1">-4.5</ssip:SSIP>\n' + + '\t\t\t<ssip:SSIP x3="0.0" y3="1.0" z3="0.0" nearestAtomID="a1">-4.5</ssip:SSIP>\n' + + '\t\t</ssip:SSIPList>\n' + + ' <phase:Concentration phase:units="MOLAR">55.350000</phase:Concentration>\n' + + ' </phase:Molecule>\n' + + ' </phase:Solvent>\n') + actual_xml = solventxmlreader.get_solvent_element_by_id(self.solvent_list_xml, "water") + self.assertEqual(expected_xml, etree.tounicode(actual_xml)) + def test_create_solvent_xpath_expression(self): + """Test to seeif expected xpath expression is created. + """ + expected_expression = 'phase:Solvent[@phase:solventID="water"]' + actual_expression = solventxmlreader.create_solvent_xpath_expression("water") + self.assertEqual(expected_expression, actual_expression) + def test_read_element_tree(self): + """Test to see if expected file is read in. + """ + expected_xml = ('<phase:SolventList xmlns:cml="http://www.xml-cml.org/sch' + + 'ema" xmlns:phase="http://www-hunter.ch.cam.ac.uk/PhaseSc' + + 'hema" xmlns:ssip="http://www-hunter.ch.cam.ac.uk/SSIP">' + + '\n <phase:Solvent phase:solventID="water" phase:solven' + + 'tName="water" phase:numberOfMolecules="1">\n' + + ' <phase:Molecule phase:stdInChIKey="XLYOFNOQVPJJNP-UHFFFAOYSA-N">\n' + + ' <ssip:SSIPList>\n' + + '\t\t\t<ssip:SurfaceInformation numberOfPoints="1000">\n' + + '\t\t\t\t<ssip:IsosurfaceDensity>0.002</ssip:IsosurfaceDensity>\n' + + '\t\t\t\t<ssip:TotalSurfaceArea>10.0</ssip:TotalSurfaceArea>\n' + + '\t\t\t\t<ssip:NegativeSurfaceArea>5.0</ssip:NegativeSurfaceArea>\n' + + '\t\t\t\t<ssip:PositiveSurfaceArea>5.0</ssip:PositiveSurfaceArea>\n' + + '\t\t\t</ssip:SurfaceInformation>\n' + + '\t\t\t<ssip:SSIP x3="1.0" y3="0.0" z3="0.0" nearestAtomID="a1">2.8</ssip:SSIP>\n' + + '\t\t\t<ssip:SSIP x3="1.0" y3="1.0" z3="1.0" nearestAtomID="a1">2.8</ssip:SSIP>\n' + + '\t\t\t<ssip:SSIP x3="0.0" y3="1.0" z3="1.0" nearestAtomID="a1">-4.5</ssip:SSIP>\n' + + '\t\t\t<ssip:SSIP x3="0.0" y3="1.0" z3="0.0" nearestAtomID="a1">-4.5</ssip:SSIP>\n' + + '\t\t</ssip:SSIPList>\n' + + ' <phase:Concentration phase:units="MOLAR">55.350000</phase:Concentration>\n' + + ' </phase:Molecule>\n' + + ' </phase:Solvent>\n' + + '</phase:SolventList>') + actual_xml = solventxmlreader.read_element_tree("resources/watersolvent.xml") + self.assertEqual(expected_xml, etree.tounicode(actual_xml)) diff --git a/solventmapcreator/test/solvationmapcreatortests.py b/solventmapcreator/test/solvationmapcreatortests.py index 3b64ce011c1059b050c68584f0be3318d144e9bf..9f274dc6b15477900713bedb29c7789dc99dcc40 100644 --- a/solventmapcreator/test/solvationmapcreatortests.py +++ b/solventmapcreator/test/solvationmapcreatortests.py @@ -9,6 +9,7 @@ Script for running the tests. import logging import unittest from solventmapcreator.test.iotest.solvationenergyreadertest import SolvationEnergyReaderTestCase +from solventmapcreator.test.iotest.solventxmlreadertest import SolventXMLReaderTestCase from solventmapcreator.test.iotest.polynomialdatawritertest import PolynomialDataWriterTestCase from solventmapcreator.test.iotest.polynomialdatareadertest import PolynomialDataReaderTestCase from solventmapcreator.test.solvationcalculationtest.solvationcalculatortest import SolvationCalculatorTestCase @@ -19,8 +20,8 @@ logging.basicConfig() LOGGER = logging.getLogger(__name__) LOGGER.setLevel(logging.WARN) -IO_TEST_CASES = [SolvationEnergyReaderTestCase, PolynomialDataWriterTestCase, - PolynomialDataReaderTestCase] +IO_TEST_CASES = [SolvationEnergyReaderTestCase, SolventXMLReaderTestCase, + PolynomialDataWriterTestCase, PolynomialDataReaderTestCase] SOLVATION_CALCULATION_TEST_CASES = [SolvationCalculatorTestCase]