diff --git a/ippisite/ippidb/tests.py b/ippisite/ippidb/tests.py index 99a7153907df1dda3466970230b8e84b23a926bb..95dffa7b60aa971324fa30bb6bc1725fb082a875 100644 --- a/ippisite/ippidb/tests.py +++ b/ippisite/ippidb/tests.py @@ -404,3 +404,42 @@ class TestGetPDBUniProtMapping(TestCase): def test_entry_not_found(self): self.assertRaises(ws.EntryNotFoundError, ws.get_pdb_uniprot_mapping, 'Xu85') + + +class TestConvertIUPACToSMILESAndMore(TestCase): + """ + Test converting a IUPAC to smiles and inchi with opsin web service + """ + + def test_valid(self): + pairs = [ + ( + '2,4,6-trinitrotoluene', + { + "inchi": "InChI=1/C7H5N3O6/c1-4-6(9(13)14)2-5(8(11)12)3-7(4)10(15)16/h2-3H,1H3", + "stdinchi": "InChI=1S/C7H5N3O6/c1-4-6(9(13)14)2-5(8(11)12)3-7(4)10(15)16/h2-3H,1H3", + "stdinchikey": "SPSSULHKWOKEEL-UHFFFAOYSA-N", + "smiles": "[N+](=O)([O-])C1=C(C)C(=CC(=C1)[N+](=O)[O-])[N+](=O)[O-]", + } + ), + ( + '3-{1-oxo-6-[4-(piperidin-4-yl)butanamido]-2,3-dihydro-1H-isoindol-2-yl}propanoic acid', + { + "inchi": "InChI=1/C20H27N3O4/c24-18(3-1-2-14-6-9-21-10-7-14)22-16-5-4-15-13-23(11-8-19(25)26)20(27)17(15)12-16/h4-5,12,14,21H,1-3,6-11,13H2,(H,22,24)(H,25,26)/f/h22,25H", + "stdinchi": "InChI=1S/C20H27N3O4/c24-18(3-1-2-14-6-9-21-10-7-14)22-16-5-4-15-13-23(11-8-19(25)26)20(27)17(15)12-16/h4-5,12,14,21H,1-3,6-11,13H2,(H,22,24)(H,25,26)", + "stdinchikey": "HWRXVANHVCXVHA-UHFFFAOYSA-N", + "smiles": "O=C1N(CC2=CC=C(C=C12)NC(CCCC1CCNCC1)=O)CCC(=O)O" + } + + ) + ] + for iupac, dict_expected in pairs: + dict_returned = ws.convert_iupac_to_smiles_and_inchi(iupac) + self.assertEqual(dict_expected, dict_returned) + self.assertEqual(dict_expected["smiles"], ws.convert_iupac_to_smiles(iupac)) + + + def test_invalide_entry(self): + self.assertRaises(ws.EntryNotFoundError, ws.convert_iupac_to_smiles_and_inchi, '3-{1-oxo-6-[4-(piperid') + self.assertRaises(ws.EntryNotFoundError, ws.convert_iupac_to_smiles_and_inchi, None) + diff --git a/ippisite/ippidb/ws.py b/ippisite/ippidb/ws.py index f982fa6e6a149c598644936d0cf2324b579c1810..8448e7c2c72d54a25aa48a916bc8b406a236c5c3 100644 --- a/ippisite/ippidb/ws.py +++ b/ippisite/ippidb/ws.py @@ -4,6 +4,7 @@ iPPI-DB web-service client utility functions import json import xml.etree.ElementTree as ET +from urllib import parse as urllib_parse import requests from bioservices.eutils import EUtils @@ -363,3 +364,20 @@ def pdb_entry_exists(pdb_id): return False else: return True + + +def convert_iupac_to_smiles(iupac): + return convert_iupac_to_smiles_and_inchi(iupac)["smiles"] + + +def convert_iupac_to_smiles_and_inchi(iupac): + if iupac is None: + raise EntryNotFoundError(iupac, 422) + resp = requests.get( + 'https://opsin.ch.cam.ac.uk/opsin/{}'.format(urllib_parse.quote(iupac, safe=''))) + if resp.status_code != 200: + raise EntryNotFoundError(iupac, resp.status_code) + ret = resp.json() + ret.pop("cml") + ret.pop("message") + return ret