From fc8ef0ecc68487d6346b376d58072bc869b62129 Mon Sep 17 00:00:00 2001
From: Mark Driver <mdd31@cam.ac.uk>
Date: Tue, 18 Jul 2017 22:32:39 +0100
Subject: [PATCH] created script for calculating the fractional occupancy of a
 phase, and corresponding tests.

---
 .../fractionaloccupancycalculator.py          | 36 ++++++++++++++++
 .../fractionaloccupancycalculatortest.py      | 43 +++++++++++++++++++
 .../test/solvationmapcreatortests.py          |  4 +-
 3 files changed, 82 insertions(+), 1 deletion(-)
 create mode 100644 solventmapcreator/solvationcalculation/fractionaloccupancycalculator.py
 create mode 100644 solventmapcreator/test/solvationcalculationtest/fractionaloccupancycalculatortest.py

diff --git a/solventmapcreator/solvationcalculation/fractionaloccupancycalculator.py b/solventmapcreator/solvationcalculation/fractionaloccupancycalculator.py
new file mode 100644
index 0000000..f8be0ae
--- /dev/null
+++ b/solventmapcreator/solvationcalculation/fractionaloccupancycalculator.py
@@ -0,0 +1,36 @@
+#!/usr/bin/env python3
+# -*- coding: utf-8 -*-
+"""
+This calculates the fractional occupancy for a phase. This calculates the
+solvent contribution from the given file containing solvent xml, and adds the
+contribution for the single solute SSIP at the given concentration.
+
+@author: mark
+"""
+
+import logging
+import solventmapcreator.io.solventxmlreader as solventxmlreader
+
+logging.basicConfig()
+LOGGER = logging.getLogger(__name__)
+LOGGER.setLevel(logging.WARN)
+
+def calculate_fractional_occupancy_for_phase(solvent_filename, solvent_id, solute_concentration):
+    """This calculates the fractional occupancy of the phase. This is the sum
+    of the solvent and solute contributions.
+    """
+    solvent_fractional_occupancy = get_fractional_occupancy_for_solvent_from_file(solvent_filename, solvent_id)
+    solute_fractional_occupancy = calculate_fractional_occupancy_contribution_from_solute(solute_concentration)
+    return solute_fractional_occupancy + solvent_fractional_occupancy
+
+def calculate_fractional_occupancy_contribution_from_solute(solute_concentration):
+    """This calculates the fractional occupancy contribution for the
+    solute concentration given. This assumes teh solute is a single SSIP.
+    """
+    return solute_concentration/solventxmlreader.IDEAL_MAX_SSIP_CONCENTRATION_MOLAR
+
+def get_fractional_occupancy_for_solvent_from_file(solvent_filename, solvent_id):
+    """This reads in the file and gets the fractional occupancy contribution
+    from the solvent.
+    """
+    return solventxmlreader.get_fractional_occupancy_for_solvent_from_file(solvent_filename, solvent_id)
diff --git a/solventmapcreator/test/solvationcalculationtest/fractionaloccupancycalculatortest.py b/solventmapcreator/test/solvationcalculationtest/fractionaloccupancycalculatortest.py
new file mode 100644
index 0000000..9669876
--- /dev/null
+++ b/solventmapcreator/test/solvationcalculationtest/fractionaloccupancycalculatortest.py
@@ -0,0 +1,43 @@
+#!/usr/bin/env python3
+# -*- coding: utf-8 -*-
+"""
+Script for testing the fractionaloccupancycalculator
+
+@author: mark
+"""
+
+import logging
+import unittest
+import solventmapcreator.solvationcalculation.fractionaloccupancycalculator as fractionaloccupancycalculator
+
+logging.basicConfig()
+LOGGER = logging.getLogger(__name__)
+LOGGER.setLevel(logging.WARN)
+
+class FractionalOccupancyCalculatorTestCase(unittest.TestCase):
+    """Test case for the fractionaloccupancycalculator script.
+    """
+    def setUp(self):
+        """Set up for tests.
+        """
+    def tearDown(self):
+        """Clean up after tests.
+        """
+    def test_calculate_fractional_occupancy_for_phase(self):
+        """Test to see if expected value is returned.
+        """
+        expected_value = (55.35 * 4.0 /300.0) + (0.001/300)
+        actual_value = fractionaloccupancycalculator.calculate_fractional_occupancy_for_phase("resources/watersolvent.xml",
+                                                                                              "water", 0.001)
+    def test_calculate_fractional_occupancy_contribution_from_solute(self):
+        """Test to see if expected value is returned.
+        """
+        expected_value = 0.001/300
+        actual_value = fractionaloccupancycalculator.calculate_fractional_occupancy_contribution_from_solute(0.001)
+        self.assertAlmostEqual(expected_value, actual_value)
+    def test_get_fractional_occupancy_for_solvent_from_file(self):
+        """Test to see if fractional occupancy is as expected.
+        """
+        expected_value = 55.35 * 4.0 /300.0
+        actual_value = fractionaloccupancycalculator.get_fractional_occupancy_for_solvent_from_file("resources/watersolvent.xml", "water")
+        self.assertAlmostEqual(expected_value, actual_value)
\ No newline at end of file
diff --git a/solventmapcreator/test/solvationmapcreatortests.py b/solventmapcreator/test/solvationmapcreatortests.py
index 9f274dc..d3808dc 100644
--- a/solventmapcreator/test/solvationmapcreatortests.py
+++ b/solventmapcreator/test/solvationmapcreatortests.py
@@ -13,6 +13,7 @@ from solventmapcreator.test.iotest.solventxmlreadertest import SolventXMLReaderT
 from solventmapcreator.test.iotest.polynomialdatawritertest import PolynomialDataWriterTestCase
 from solventmapcreator.test.iotest.polynomialdatareadertest import PolynomialDataReaderTestCase
 from solventmapcreator.test.solvationcalculationtest.solvationcalculatortest import SolvationCalculatorTestCase
+from solventmapcreator.test.solvationcalculationtest.fractionaloccupancycalculatortest import FractionalOccupancyCalculatorTestCase
 from solventmapcreator.test.polynomialanalysistest.polynomialdataanalysistest import PolynomialDataAnalysisTestCase
 from solventmapcreator.test.polynomialanalysistest.polynomialcomparisontest import PolynomialComparisonTestCase
 
@@ -23,7 +24,8 @@ LOGGER.setLevel(logging.WARN)
 IO_TEST_CASES = [SolvationEnergyReaderTestCase, SolventXMLReaderTestCase,
                  PolynomialDataWriterTestCase, PolynomialDataReaderTestCase]
 
-SOLVATION_CALCULATION_TEST_CASES = [SolvationCalculatorTestCase]
+SOLVATION_CALCULATION_TEST_CASES = [SolvationCalculatorTestCase,
+                                    FractionalOccupancyCalculatorTestCase]
 
 POLYNOMIAL_ANALYSIS_TEST_CASES = [PolynomialDataAnalysisTestCase,
                                   PolynomialComparisonTestCase]
-- 
GitLab