Test pI (isoelectric point) result

This commit is contained in:
Thomas Holder
2022-08-08 21:18:30 +02:00
parent ab80128c45
commit 6388e0c4ee
3 changed files with 100 additions and 76 deletions

View File

@@ -1,49 +0,0 @@
5.07
3.11
4.62
2.55
9.28
1.78
4.91
2.13
4.78
3.93
3.65
3.89
4.73
3.36
4.07
3.70
2.08
2.11
6.98
7.11
9.41
11.68
9.82
11.61
9.67
9.54
10.43
10.32
11.41
10.54
10.42
10.92
10.55
11.01
11.43
10.47
10.41
11.07
13.96
12.41
14.39
12.35
12.76
12.42
13.73
12.28
8.96
8.96
4.60

55
tests/results/1HPX.json Normal file
View File

@@ -0,0 +1,55 @@
{
"pI_folded": 9.54,
"pI_unfolded": 8.9,
"pKa": [
5.07,
3.11,
4.62,
2.55,
9.28,
1.78,
4.91,
2.13,
4.78,
3.93,
3.65,
3.89,
4.73,
3.36,
4.07,
3.70,
2.08,
2.11,
6.98,
7.11,
9.41,
11.68,
9.82,
11.61,
9.67,
9.54,
10.43,
10.32,
11.41,
10.54,
10.42,
10.92,
10.55,
11.01,
11.43,
10.47,
10.41,
11.07,
13.96,
12.41,
14.39,
12.35,
12.76,
12.42,
13.73,
12.28,
8.96,
8.96,
4.60
]
}

View File

@@ -2,9 +2,10 @@
import logging import logging
import os import os
import re import re
import json
from pathlib import Path from pathlib import Path
import pytest import pytest
from numpy.testing import assert_almost_equal from pytest import approx
from propka.parameters import Parameters from propka.parameters import Parameters
from propka.molecular_container import MolecularContainer from propka.molecular_container import MolecularContainer
from propka.input import read_parameter_file, read_molecule_file from propka.input import read_parameter_file, read_molecule_file
@@ -18,6 +19,7 @@ _LOGGER = logging.getLogger(__name__)
# decimal places in pKa output as well as need to make unmodified code work # decimal places in pKa output as well as need to make unmodified code work
# on WSL Ubuntu 18.04 # on WSL Ubuntu 18.04
MAX_ERR_DECIMALS = 2 MAX_ERR_DECIMALS = 2
MAX_ERR_ABS = 10**-MAX_ERR_DECIMALS
# This directory # This directory
@@ -82,6 +84,34 @@ def run_propka(options, pdb_path, tmp_path):
os.chdir(cwd) os.chdir(cwd)
def parse_pka(pka_path: Path) -> dict:
"""Parse testable data from a .pka file into a dictionary.
"""
pka_list = []
data = {"pKa": pka_list}
with open(pka_path, "rt") as pka_file:
at_pka = False
for line in pka_file:
if at_pka:
if line.startswith("---"):
at_pka = False
else:
m = re.search(r'\d+\.\d+', line[13:])
pka_list.append(float(m.group()))
elif "model-pKa" in line:
at_pka = True
else:
m = re.match(
r"The pI is *(\d+\.\d+) .folded. and *(\d+\.\d+) .unfolded.",
line)
if m is not None:
data["pI_folded"] = float(m.group(1))
data["pI_unfolded"] = float(m.group(2))
return data
def compare_output(pdb, tmp_path, ref_path): def compare_output(pdb, tmp_path, ref_path):
"""Compare results of test with reference. """Compare results of test with reference.
@@ -92,31 +122,16 @@ def compare_output(pdb, tmp_path, ref_path):
Raises: Raises:
ValueError if results disagree. ValueError if results disagree.
""" """
ref_data = []
with open(ref_path, "rt") as ref_file: with open(ref_path, "rt") as ref_file:
for line in ref_file: if ref_path.name.endswith(".json"):
ref_data.append(float(line)) ref_data = json.load(ref_file)
test_data = []
pka_path = Path(tmp_path) / ("{0:s}.pka".format(pdb))
with open(pka_path, "rt") as pka_file:
at_pka = False
for line in pka_file:
if not at_pka:
if "model-pKa" in line:
at_pka = True
elif line.startswith("---"):
at_pka = False
else: else:
match = re.search(r'([0-9]+\.[0-9]+)', line) ref_data = {"pKa": [float(line) for line in ref_file]}
value = float(match.group(0))
test_data.append(value) test_data = parse_pka(tmp_path / f"{pdb}.pka")
errstr = (
"Error exceeds maximum allowed value ({0:d} decimal places)".format( for key in ref_data:
MAX_ERR_DECIMALS)) assert test_data[key] == approx(ref_data[key], abs=MAX_ERR_ABS), key
assert_almost_equal(
test_data, ref_data, decimal=MAX_ERR_DECIMALS, err_msg=errstr,
verbose=True)
@pytest.mark.parametrize("pdb, options", [ @pytest.mark.parametrize("pdb, options", [
@@ -132,9 +147,12 @@ def compare_output(pdb, tmp_path, ref_path):
def test_regression(pdb, options, tmp_path): def test_regression(pdb, options, tmp_path):
"""Basic regression test of PROPKA functionality.""" """Basic regression test of PROPKA functionality."""
path_dict = get_test_dirs() path_dict = get_test_dirs()
ref_path = path_dict["results"] / ("{0:s}.dat".format(pdb))
for ext in ["json", "dat"]:
ref_path = path_dict["results"] / f"{pdb}.{ext}"
if ref_path.is_file(): if ref_path.is_file():
ref_path = ref_path.resolve() ref_path = ref_path.resolve()
break
else: else:
_LOGGER.warning("Missing results file for comparison: {0:s}".format( _LOGGER.warning("Missing results file for comparison: {0:s}".format(
str(ref_path))) str(ref_path)))