Skip to content

Commit

Permalink
Update of test structure and bug fixes
Browse files Browse the repository at this point in the history
  • Loading branch information
Old-Shatterhand committed Feb 21, 2025
1 parent 1434aa8 commit 5821183
Show file tree
Hide file tree
Showing 10 changed files with 726 additions and 730 deletions.
6 changes: 3 additions & 3 deletions glyles/glycans/mono/monomer.py
Original file line number Diff line number Diff line change
Expand Up @@ -81,12 +81,12 @@ def get_name(self, mode: Literal["name", "full", "slim"] = "name"):
if mode in {"slim", "full"}:
core, mods = [], []
for v, t in self.recipe:
if t in {IUPACLexer.MOD, IUPACLexer.COUNT}:
core.append(v)
if t in {IUPACLexer.MOD}: # , IUPACLexer.COUNT}:
mods.append(v)
else:
if mode == "slim" and t == IUPACLexer.RING:
continue
mods.append(v)
core.append(v)
name = "".join(core) + "".join(mods)
if mode == "slim":
name = name.replace("L-", "").replace("D-", "")
Expand Down
4 changes: 4 additions & 0 deletions glyles/glycans/poly/glycan.py
Original file line number Diff line number Diff line change
Expand Up @@ -408,3 +408,7 @@ def parse(self):
f"Error message: {msg}")
self.glycan_smiles = ""
raise e


if __name__ == "__main__":
print(Glycan("Fuc(a1-2)[GalNAc(a1-3)]Gal(b1-4)GlcNAc(b1-3)[Fuc(a1-2)[GalNAc(a1-3)]Gal(b1-4)GlcNAc(b1-6)]Gal(b1-3)[GlcNAc(a1-4)Gal(b1-4)GlcNAc6S(b1-6)]GalNAc", tree_only=True).summary())
1 change: 0 additions & 1 deletion glyles/glycans/poly/gwb_glycan.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@
from glyles.glycans.poly.merger import Merger
from glyles.glycans.utils import ParseError
from glyles.gwb.GWBLexer import GWBLexer
print(GWBLexer.QMARK)
from glyles.gwb.GWBParser import GWBParser
from glyles.glycans.poly.glycan import Glycan

Expand Down
2 changes: 1 addition & 1 deletion glyles/glycans/poly/gwb_walker.py
Original file line number Diff line number Diff line change
Expand Up @@ -105,7 +105,7 @@ def add_node(self, node, parent, config=""):
# add the node to the network and store the enum of the glycan as attribute
recipe = self.build_recipe(node)
if len(set.intersection({IUPACLexer.SAC, IUPACLexer.COUNT}, set(x for _, x in recipe))) == 0:
self.update_node(parent, recipe)
self.update_recipe(parent, recipe)
return parent
elif len(recipe) > 2 and recipe[-2][0] == ",":
recipe = recipe[:-2] + [recipe[-1]]
Expand Down
236 changes: 117 additions & 119 deletions tests/test_convert.py
Original file line number Diff line number Diff line change
Expand Up @@ -38,122 +38,120 @@ def compare_smiles(computed, solution):
assert c_rdkit == s_rdkit


class TestConverter:

@pytest.mark.parametrize("iupac", [
"Man",
"Man(a1-4)Man",
"Man(a1-4)[Man(a1-3)]Man",
"Man(a1-4)[Man(a1-3)][Man(a1-2)]Man",
])
def test_demo(self, iupac):
output = convert(iupac)

assert len(output) == 1
assert len(output[0]) == 2
assert output[0][0] == iupac
assert all(c in output[0][1] for c in {"C", "O", "[", "]", "@"})

@pytest.mark.parametrize("iupac", [
"Man(?1-4)Man",
"Man(a1-?)Man",
"Man(?1-?)Man",
"{Man(a1-4)}Man(a1-2)Man",
"{Man(?1-4)}Man(a1-?)Man",
"{Man(?1-?)}Man(?1-?)Man",
])
def test_demo_no_resolution(self, iupac):
output = convert(iupac)

assert len(output) == 1
assert len(output[0]) == 2
assert output[0][0] == iupac
assert output[0][1] == ""

def test_file_output(self):
args = setup_test()

convert(args["glycan"], args["glycan_list"], args["glycan_file"], args["glycan_generator"],
output_file="./output.txt")
output = [line.split(",") for line in open("./output.txt", "r").readlines()]
check_results(output)

def test_return_output(self):
args = setup_test()

output = convert(args["glycan"], args["glycan_list"], args["glycan_file"], args["glycan_generator"],
returning=True)
check_results(output)

def test_generator(self):
args = setup_test()

output = convert_generator(args["glycan"], args["glycan_list"], args["glycan_file"], args["glycan_generator"])
check_results(output)

def test_orientation_1(self):
output = convert("Glc a", returning=True)

assert len(output) == 1
assert output[0][0] == "Glc a"
compare_smiles(output[0][1], "OC[C@H]1O[C@H](O)[C@H](O)[C@@H](O)[C@@H]1O")

def test_orientation_2(self):
output = convert("Glc b", returning=True)

assert len(output) == 1
assert output[0][0] == "Glc b"
compare_smiles(output[0][1], "OC[C@H]1O[C@@H](O)[C@H](O)[C@@H](O)[C@@H]1O")

@pytest.mark.slow
def test_parallel_list_input(self):
with open("data/runtime.tsv", "r") as runtime:
glycans = [line.strip().split("\t")[0] for line in runtime.readlines()]
start = time.time()
smiles1 = convert(glycan_list=glycans)
mid = time.time()
smiles2 = convert(glycan_list=glycans, cpu_count=14)
end = time.time()

assert len(smiles1) == len(smiles2) == len(glycans)
assert (end - mid) < (mid - start)

@pytest.mark.slow
def test_parallel_gen_input(self):
with open("data/runtime.tsv", "r") as runtime:
glycans = [line.strip().split("\t")[0] for line in runtime.readlines()]
start = time.time()
smiles1 = convert(glycan_generator=iter(glycans))
mid = time.time()
smiles2 = convert(glycan_generator=iter(glycans), cpu_count=14)
end = time.time()

assert len(smiles1) == len(smiles2) == len(glycans)
assert (end - mid) < (mid - start)

def test_smiles_clean(self):
assert sanitize_smiles("SDJCBPIOUCODJCOBC") == "SDJCBPIOUCODJCOBC"
assert sanitize_smiles("DIC(DONC)WOUC") == "DIC(DONC)WOUC"
assert sanitize_smiles("DPIUCDBPSIDU((CPIDBC)PID)") == "DPIUCDBPSIDU(CPIDBCPID)"
assert sanitize_smiles("SDJC((PSODUCBN))SOD:C") == "SDJC(PSODUCBN)SOD:C"
assert sanitize_smiles("A:DO(C(OPDIC))PODUC") == "A:DO(COPDIC)PODUC"

def test_summary(self):
output = Glycan("Fuc(a1-2)[GalNAc(a1-3)]Gal(b1-4)GlcNAc(b1-3)[Fuc(a1-2)[GalNAc(a1-3)]Gal(b1-4)GlcNAc(b1-6)]"
"Gal(b1-3)[GlcNAc(a1-4)Gal(b1-4)GlcNAc6S(b1-6)]GalNAc", tree_only=True).summary()
assert output["formula"] == "C92H153N7O67S"
assert 2459 < output["weight"] < 2460
assert output["atoms"] == 167
assert output["bonds"] == 179
assert output["rings"] == 13
assert output["monomers"] == 13
assert output["types"]["GalNAc"] == 3
assert output["types"]["GlcNAc6S"] == 1
assert output["types"]["Gal"] == 4
assert output["types"]["GlcNAc"] == 3
assert output["types"]["Fuc"] == 2
assert output["root"] == "GalNAc"
assert output["leaves"].count("GlcNAc") == 1
assert output["leaves"].count("GalNAc") == 2
assert output["leaves"].count("Fuc") == 2
assert output["depth"] == 4
@pytest.mark.parametrize("iupac", [
"Man",
"Man(a1-4)Man",
"Man(a1-4)[Man(a1-3)]Man",
"Man(a1-4)[Man(a1-3)][Man(a1-2)]Man",
])
def test_demo(iupac):
output = convert(iupac)

assert len(output) == 1
assert len(output[0]) == 2
assert output[0][0] == iupac
assert all(c in output[0][1] for c in {"C", "O", "[", "]", "@"})

@pytest.mark.parametrize("iupac", [
"Man(?1-4)Man",
"Man(a1-?)Man",
"Man(?1-?)Man",
"{Man(a1-4)}Man(a1-2)Man",
"{Man(?1-4)}Man(a1-?)Man",
"{Man(?1-?)}Man(?1-?)Man",
])
def test_demo_no_resolution(iupac):
output = convert(iupac)

assert len(output) == 1
assert len(output[0]) == 2
assert output[0][0] == iupac
assert output[0][1] == ""

def test_file_output():
args = setup_test()

convert(args["glycan"], args["glycan_list"], args["glycan_file"], args["glycan_generator"],
output_file="./output.txt")
output = [line.split(",") for line in open("./output.txt", "r").readlines()]
check_results(output)

def test_return_output():
args = setup_test()

output = convert(args["glycan"], args["glycan_list"], args["glycan_file"], args["glycan_generator"],
returning=True)
check_results(output)

def test_generator():
args = setup_test()

output = convert_generator(args["glycan"], args["glycan_list"], args["glycan_file"], args["glycan_generator"])
check_results(output)

def test_orientation_1():
output = convert("Glc a", returning=True)

assert len(output) == 1
assert output[0][0] == "Glc a"
compare_smiles(output[0][1], "OC[C@H]1O[C@H](O)[C@H](O)[C@@H](O)[C@@H]1O")

def test_orientation_2():
output = convert("Glc b", returning=True)

assert len(output) == 1
assert output[0][0] == "Glc b"
compare_smiles(output[0][1], "OC[C@H]1O[C@@H](O)[C@H](O)[C@@H](O)[C@@H]1O")

@pytest.mark.slow
def test_parallel_list_input():
with open("data/runtime.tsv", "r") as runtime:
glycans = [line.strip().split("\t")[0] for line in runtime.readlines()]
start = time.time()
smiles1 = convert(glycan_list=glycans)
mid = time.time()
smiles2 = convert(glycan_list=glycans, cpu_count=14)
end = time.time()

assert len(smiles1) == len(smiles2) == len(glycans)
assert (end - mid) < (mid - start)

@pytest.mark.slow
def test_parallel_gen_input():
with open("data/runtime.tsv", "r") as runtime:
glycans = [line.strip().split("\t")[0] for line in runtime.readlines()]
start = time.time()
smiles1 = convert(glycan_generator=iter(glycans))
mid = time.time()
smiles2 = convert(glycan_generator=iter(glycans), cpu_count=14)
end = time.time()

assert len(smiles1) == len(smiles2) == len(glycans)
assert (end - mid) < (mid - start)

def test_smiles_clean():
assert sanitize_smiles("SDJCBPIOUCODJCOBC") == "SDJCBPIOUCODJCOBC"
assert sanitize_smiles("DIC(DONC)WOUC") == "DIC(DONC)WOUC"
assert sanitize_smiles("DPIUCDBPSIDU((CPIDBC)PID)") == "DPIUCDBPSIDU(CPIDBCPID)"
assert sanitize_smiles("SDJC((PSODUCBN))SOD:C") == "SDJC(PSODUCBN)SOD:C"
assert sanitize_smiles("A:DO(C(OPDIC))PODUC") == "A:DO(COPDIC)PODUC"

def test_summary():
output = Glycan("Fuc(a1-2)[GalNAc(a1-3)]Gal(b1-4)GlcNAc(b1-3)[Fuc(a1-2)[GalNAc(a1-3)]Gal(b1-4)GlcNAc(b1-6)]"
"Gal(b1-3)[GlcNAc(a1-4)Gal(b1-4)GlcNAc6S(b1-6)]GalNAc", tree_only=True).summary()
assert output["formula"] == "C92H153N7O67S"
assert 2459 < output["weight"] < 2460
assert output["atoms"] == 167
assert output["bonds"] == 179
assert output["rings"] == 13
assert output["monomers"] == 13
assert output["types"]["GalNAc"] == 3
assert output["types"]["GlcNAc6S"] == 1
assert output["types"]["Gal"] == 4
assert output["types"]["GlcNAc"] == 3
assert output["types"]["Fuc"] == 2
assert output["root"] == "GalNAc"
assert output["leaves"].count("GlcNAc") == 1
assert output["leaves"].count("GalNAc") == 2
assert output["leaves"].count("Fuc") == 2
assert output["depth"] == 4
Loading

0 comments on commit 5821183

Please sign in to comment.