From b8d233714b37ec863e9fa97f94b7137d06be183f Mon Sep 17 00:00:00 2001 From: Aliaksandr Dziarkach <18146690+AliaksandrDziarkach@users.noreply.github.com> Date: Mon, 22 Jan 2024 16:36:32 +0300 Subject: [PATCH] #1534 Presence of stand alone H2 molecule on the canvas breaks Add explicit hydrogens feature (it stops working) Fix code. Update UTs --- api/wasm/indigo-ketcher/indigo-ketcher.cpp | 2 +- api/wasm/indigo-ketcher/test/test.js | 21 +++++++++++ .../backend/service/tests/api/indigo_test.py | 37 +++++++++++++++++-- .../backend/service/v2/indigo_api.py | 3 +- 4 files changed, 58 insertions(+), 5 deletions(-) diff --git a/api/wasm/indigo-ketcher/indigo-ketcher.cpp b/api/wasm/indigo-ketcher/indigo-ketcher.cpp index 9b3d43ef17..2e2276e4ef 100644 --- a/api/wasm/indigo-ketcher/indigo-ketcher.cpp +++ b/api/wasm/indigo-ketcher/indigo-ketcher.cpp @@ -449,7 +449,7 @@ namespace indigo IndigoObject atom(_checkResult(indigoNext(iatoms.id))); // indigoAtomicNumber can return -1 for non-standard atoms // just skip these atoms - if (indigoAtomicNumber(atom.id) == 1) // hydrogen + if (indigoAtomicNumber(atom.id) == 1 && indigoDegree(atom.id) > 0) // hydrogen { fold = true; break; diff --git a/api/wasm/indigo-ketcher/test/test.js b/api/wasm/indigo-ketcher/test/test.js index 5dc6d0a1f9..6814dafa5a 100644 --- a/api/wasm/indigo-ketcher/test/test.js +++ b/api/wasm/indigo-ketcher/test/test.js @@ -558,6 +558,27 @@ M END assert.equal(unfold_smiles, '{"struct":"C([H])([H])([H])C([H])([H])[H]","format":"smiles","original_format":"chemical/x-daylight-smiles"}'); options.delete(); }); + + test("convert_explicit_hydrogens", "auto_with_single_h", () => { + let options = new indigo.MapStringString(); + options.set("output-content-type", "application/json"); + const unfold_smiles = indigo.convert_explicit_hydrogens("CC.[HH]", "auto", "smiles", options); + assert.equal(unfold_smiles, '{"struct":"C([H])([H])([H])C([H])([H])[H].[H][H]","format":"smiles","original_format":"chemical/x-daylight-smiles"}'); + const fold_smiles = indigo.convert_explicit_hydrogens("C([H])([H])([H])C([H])([H])[H].[H][H]", "auto", "smiles", options); + assert.equal(fold_smiles, '{"struct":"CC.[HH]","format":"smiles","original_format":"chemical/x-daylight-smiles"}'); + options.delete(); + }); + + test("convert_explicit_hydrogens", "auto_single_h", () => { + let options = new indigo.MapStringString(); + options.set("output-content-type", "application/json"); + const unfold_smiles = indigo.convert_explicit_hydrogens("[HH]", "auto", "smiles", options); + assert.equal(unfold_smiles, '{"struct":"[H][H]","format":"smiles","original_format":"chemical/x-daylight-smiles"}'); + const fold_smiles = indigo.convert_explicit_hydrogens("[H][H]", "auto", "smiles", options); + assert.equal(fold_smiles, '{"struct":"[HH]","format":"smiles","original_format":"chemical/x-daylight-smiles"}'); + options.delete(); + }); + } // Dearomatize diff --git a/utils/indigo-service/backend/service/tests/api/indigo_test.py b/utils/indigo-service/backend/service/tests/api/indigo_test.py index c962934d0f..6d39f4381b 100644 --- a/utils/indigo-service/backend/service/tests/api/indigo_test.py +++ b/utils/indigo-service/backend/service/tests/api/indigo_test.py @@ -2979,7 +2979,7 @@ def test_convert_cdxml(self): def test_convert_explicit_hydrogens_auto(self): params = { - "struct": "CC", + "struct": "CC.[HH]", "mode": "auto", "output_format": "chemical/x-daylight-smiles", "input_format": "chemical/x-daylight-smiles", @@ -2993,7 +2993,7 @@ def test_convert_explicit_hydrogens_auto(self): self.assertEqual(200, result.status_code) result_data = json.loads(result.text) self.assertEqual( - "C([H])([H])([H])C([H])([H])[H]", result_data["struct"] + "C([H])([H])([H])C([H])([H])[H].[H][H]", result_data["struct"] ) params = { "struct": result_data["struct"], @@ -3008,7 +3008,7 @@ def test_convert_explicit_hydrogens_auto(self): ) self.assertEqual(200, result.status_code) result_data = json.loads(result.text) - self.assertEqual("CC", result_data["struct"]) + self.assertEqual("CC.[HH]", result_data["struct"]) def test_convert_explicit_hydrogens_fold(self): params = { @@ -3046,6 +3046,37 @@ def test_convert_explicit_hydrogens_unfold(self): "C([H])([H])([H])C([H])([H])[H]", result_data["struct"] ) + def test_convert_explicit_hydrogens_auto_h(self): + params = { + "struct": "[HH]", + "mode": "auto", + "output_format": "chemical/x-daylight-smiles", + "input_format": "chemical/x-daylight-smiles", + } + headers, data = self.get_headers(params) + result = requests.post( + self.url_prefix + "/convert_explicit_hydrogens", + headers=headers, + data=data, + ) + self.assertEqual(200, result.status_code) + result_data = json.loads(result.text) + self.assertEqual("[H][H]", result_data["struct"]) + params = { + "struct": result_data["struct"], + "output_format": "chemical/x-daylight-smiles", + "input_format": "chemical/x-daylight-smiles", + } + headers, data = self.get_headers(params) + result = requests.post( + self.url_prefix + "/convert_explicit_hydrogens", + headers=headers, + data=data, + ) + self.assertEqual(200, result.status_code) + result_data = json.loads(result.text) + self.assertEqual("[HH]", result_data["struct"]) + def test_convert_sequences(self): headers, data = self.get_headers( { diff --git a/utils/indigo-service/backend/service/v2/indigo_api.py b/utils/indigo-service/backend/service/v2/indigo_api.py index 2525898084..35cb2c0b0f 100644 --- a/utils/indigo-service/backend/service/v2/indigo_api.py +++ b/utils/indigo-service/backend/service/v2/indigo_api.py @@ -985,7 +985,8 @@ def convert_explicit_hydrogens(): while iatoms.hasNext(): atom = iatoms.next() try: - if atom.atomicNumber() == 1: # Hydrogen + if atom.atomicNumber() == 1 and atom.degree() > 0: + # Hydrogen connected to something - fold fold = True break except IndigoException: