From f2ad660b7a857d20dff237079eee8bf2c6900fad Mon Sep 17 00:00:00 2001 From: Roman Rodionov Date: Thu, 9 May 2024 12:30:04 +0200 Subject: [PATCH 1/4] #4530 - Convert Rx connection points created in molecules mode into chem attachment points in macromolecules mode - unblocked rglabels to attachment points conversion for molecules --- .../src/domain/entities/BaseMonomer.ts | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/packages/ketcher-core/src/domain/entities/BaseMonomer.ts b/packages/ketcher-core/src/domain/entities/BaseMonomer.ts index 954e364500..f6566272ed 100644 --- a/packages/ketcher-core/src/domain/entities/BaseMonomer.ts +++ b/packages/ketcher-core/src/domain/entities/BaseMonomer.ts @@ -41,13 +41,11 @@ export abstract class BaseMonomer extends DrawingEntity { super(_position); this.monomerItem = { ...monomerItem }; - if (!this.monomerItem.props.isMicromoleculeFragment) { - this.attachmentPointsToBonds = this.getAttachmentPointDict(); - this.potentialAttachmentPointsToBonds = this.getAttachmentPointDict(); - this.monomerItem.attachmentPoints = - this.monomerItem.attachmentPoints || - this.getMonomerDefinitionAttachmentPoints(); - } + this.attachmentPointsToBonds = this.getAttachmentPointDict(); + this.potentialAttachmentPointsToBonds = this.getAttachmentPointDict(); + this.monomerItem.attachmentPoints = + this.monomerItem.attachmentPoints || + this.getMonomerDefinitionAttachmentPoints(); this.chosenFirstAttachmentPointForBond = null; this.potentialSecondAttachmentPointForBond = null; this.chosenSecondAttachmentPointForBond = null; @@ -447,6 +445,12 @@ export abstract class BaseMonomer extends DrawingEntity { this.leavingGroupsAtoms.forEach(({ rglabel }, _) => { const label = convertAttachmentPointNumberToLabel(Number(rglabel)); + + // handle up to 8 attachment points + if (Number(label.replace('R', '')) > 8) { + return; + } + attachmentPointNameToBond[label] = null; }); From f8d5c0d070cb3649bcbf2c484c708df228437e6f Mon Sep 17 00:00:00 2001 From: Roman Rodionov Date: Thu, 9 May 2024 15:17:38 +0200 Subject: [PATCH 2/4] - added validation for attachment points creation from rglabels --- .../src/domain/entities/BaseMonomer.ts | 27 ++++++++++++++----- .../helpers/attachmentPointCalculations.ts | 2 +- 2 files changed, 22 insertions(+), 7 deletions(-) diff --git a/packages/ketcher-core/src/domain/entities/BaseMonomer.ts b/packages/ketcher-core/src/domain/entities/BaseMonomer.ts index f6566272ed..ee04a1bdda 100644 --- a/packages/ketcher-core/src/domain/entities/BaseMonomer.ts +++ b/packages/ketcher-core/src/domain/entities/BaseMonomer.ts @@ -426,10 +426,10 @@ export abstract class BaseMonomer extends DrawingEntity { }, ); const leavingGroupsAtomsArray: { id: number; rglabel: number }[] = []; - leavingGroupsAtoms.forEach((attachmentAtom, attachmentAtomId) => { + leavingGroupsAtoms.forEach((leavingGroupAtom, leavingGroupAtomId) => { leavingGroupsAtomsArray.push({ - id: attachmentAtomId, - rglabel: Number(attachmentAtom.rglabel), + id: leavingGroupAtomId, + rglabel: Number(leavingGroupAtom.rglabel), }); }); leavingGroupsAtomsArray.sort((atom1, atom2) => @@ -443,11 +443,26 @@ export abstract class BaseMonomer extends DrawingEntity { > { const attachmentPointNameToBond = {}; - this.leavingGroupsAtoms.forEach(({ rglabel }, _) => { + this.leavingGroupsAtoms.forEach(({ rglabel, id }, _) => { const label = convertAttachmentPointNumberToLabel(Number(rglabel)); + const leavingGroupAtomId = id; + const bondsToLeavingGroupAtom = this.monomerItem.struct.bonds.filter( + (_, bond) => { + return ( + bond.begin === leavingGroupAtomId || bond.end === leavingGroupAtomId + ); + }, + ); - // handle up to 8 attachment points - if (Number(label.replace('R', '')) > 8) { + // Do not create attachment point if: + // there are multiple bonds to same leaving group atom + // there are multiple rglabels on same leaving group atom + // rglabel more than 8 (support only 8 attachment points in macromolecules mode) + if ( + bondsToLeavingGroupAtom.size > 1 || + label.length > 2 || + Number(label.replace('R', '')) > 8 + ) { return; } diff --git a/packages/ketcher-core/src/domain/helpers/attachmentPointCalculations.ts b/packages/ketcher-core/src/domain/helpers/attachmentPointCalculations.ts index 6a6dc130e7..f6e82e7307 100644 --- a/packages/ketcher-core/src/domain/helpers/attachmentPointCalculations.ts +++ b/packages/ketcher-core/src/domain/helpers/attachmentPointCalculations.ts @@ -227,7 +227,7 @@ export function convertAttachmentPointNumberToLabel( let attachmentPointLabel = ''; for (let rgi = 0; rgi < 32; rgi++) { if (attachmentPointNumber & (1 << rgi)) { - attachmentPointLabel = 'R' + (rgi + 1).toString(); + attachmentPointLabel += 'R' + (rgi + 1).toString(); } } return attachmentPointLabel; From 240e2839b1bbe0c00db7071f7972a81db660efba Mon Sep 17 00:00:00 2001 From: Roman Rodionov Date: Fri, 10 May 2024 14:03:16 +0200 Subject: [PATCH 3/4] - added tests - fixed issue with pasting molecules with rglabels in macro mode --- .../macro-micro-switcher.spec.ts | 18 + ...mer-attachment-points-1-chromium-linux.png | Bin 0 -> 22176 bytes ...mer-attachment-points-2-chromium-linux.png | Bin 0 -> 15245 bytes ...mer-attachment-points-3-chromium-linux.png | Bin 0 -> 13855 bytes .../test-data/KET/molecules-with-rglabels.ket | 736 ++++++++++++++++++ .../src/domain/entities/BaseMonomer.ts | 65 +- 6 files changed, 802 insertions(+), 17 deletions(-) create mode 100644 ketcher-autotests/tests/Macromolecule-editor/Macro-Micro-Switcher/macro-micro-switcher.spec.ts-snapshots/Macro-Micro-Switcher-R-Group-labels-should-be-converted-to-monomer-attachment-points-1-chromium-linux.png create mode 100644 ketcher-autotests/tests/Macromolecule-editor/Macro-Micro-Switcher/macro-micro-switcher.spec.ts-snapshots/Macro-Micro-Switcher-R-Group-labels-should-be-converted-to-monomer-attachment-points-2-chromium-linux.png create mode 100644 ketcher-autotests/tests/Macromolecule-editor/Macro-Micro-Switcher/macro-micro-switcher.spec.ts-snapshots/Macro-Micro-Switcher-R-Group-labels-should-be-converted-to-monomer-attachment-points-3-chromium-linux.png create mode 100644 ketcher-autotests/tests/test-data/KET/molecules-with-rglabels.ket diff --git a/ketcher-autotests/tests/Macromolecule-editor/Macro-Micro-Switcher/macro-micro-switcher.spec.ts b/ketcher-autotests/tests/Macromolecule-editor/Macro-Micro-Switcher/macro-micro-switcher.spec.ts index f5ba72394e..ac8b62a4bc 100644 --- a/ketcher-autotests/tests/Macromolecule-editor/Macro-Micro-Switcher/macro-micro-switcher.spec.ts +++ b/ketcher-autotests/tests/Macromolecule-editor/Macro-Micro-Switcher/macro-micro-switcher.spec.ts @@ -20,6 +20,7 @@ import { waitForRender, moveMouseToTheMiddleOfTheScreen, selectOptionInDropdown, + selectSingleBondTool, } from '@utils'; const topLeftCorner = { @@ -599,4 +600,21 @@ test.describe('Macro-Micro-Switcher', () => { await turnOnMacromoleculesEditor(page); await takePageScreenshot(page); }); + + test('R-Group labels should be converted to monomer attachment points', async ({ + page, + }) => { + /* + Ticket: #4530 + */ + await turnOnMacromoleculesEditor(page); + await openFileAndAddToCanvasMacro('KET/molecules-with-rglabels.ket', page); + await selectSingleBondTool(page); + await page.getByText('F1').locator('..').hover(); + await takeEditorScreenshot(page); + await page.getByText('F2').locator('..').hover(); + await takeEditorScreenshot(page); + await page.getByText('F3').locator('..').hover(); + await takeEditorScreenshot(page); + }); }); diff --git a/ketcher-autotests/tests/Macromolecule-editor/Macro-Micro-Switcher/macro-micro-switcher.spec.ts-snapshots/Macro-Micro-Switcher-R-Group-labels-should-be-converted-to-monomer-attachment-points-1-chromium-linux.png b/ketcher-autotests/tests/Macromolecule-editor/Macro-Micro-Switcher/macro-micro-switcher.spec.ts-snapshots/Macro-Micro-Switcher-R-Group-labels-should-be-converted-to-monomer-attachment-points-1-chromium-linux.png new file mode 100644 index 0000000000000000000000000000000000000000..0e9fd165cded20d2bd92ff8b62d3cc3610bc3671 GIT binary patch literal 22176 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 z YoX^C!u{!Z6sxFPpS%otxr!U_4KLgSAoB#j- literal 0 HcmV?d00001 diff --git a/ketcher-autotests/tests/Macromolecule-editor/Macro-Micro-Switcher/macro-micro-switcher.spec.ts-snapshots/Macro-Micro-Switcher-R-Group-labels-should-be-converted-to-monomer-attachment-points-2-chromium-linux.png b/ketcher-autotests/tests/Macromolecule-editor/Macro-Micro-Switcher/macro-micro-switcher.spec.ts-snapshots/Macro-Micro-Switcher-R-Group-labels-should-be-converted-to-monomer-attachment-points-2-chromium-linux.png new file mode 100644 index 0000000000000000000000000000000000000000..c3f63492ecf2dce2e194b6dd8807541e9721cae3 GIT binary patch literal 15245 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, + ) { + const label = + typeof rglabel === 'string' + ? rglabel + : convertAttachmentPointNumberToLabel(rglabel); + + // Do not create attachment point if: + // there are multiple bonds to same leaving group atom + // there are multiple rglabels on same leaving group atom + // rglabel more than 8 (support only 8 attachment points in macromolecules mode) + return ( + bondsToRgLabel.size === 1 && + label.length === 2 && + Number(label.replace('R', '')) <= 8 + ); + } + private getMonomerDefinitionAttachmentPoints() { const monomerDefinitionAttachmentPoints: IKetAttachmentPoint[] = []; this.leavingGroupsAtoms.forEach((leavingGroupsAtom) => { - const bondId = this.monomerItem.struct.bonds.find((_, bond) => { - return ( - bond.begin === leavingGroupsAtom.id || - bond.end === leavingGroupsAtom.id - ); - }); + const bondsToLeavingGroupAtom = this.monomerItem.struct.bonds.filter( + (_, bond) => { + return ( + bond.begin === leavingGroupsAtom.id || + bond.end === leavingGroupsAtom.id + ); + }, + ); + + if ( + !this.isRglabelConvertableToAttachmentPoint( + leavingGroupsAtom.rglabel, + bondsToLeavingGroupAtom, + ) + ) { + return; + } + let attachmentAtomId: number; let leavingGroupsAtomId: number | undefined; + const bondToLeavingGroupAtom = bondsToLeavingGroupAtom.get(0); - if (isNumber(bondId)) { - const bond = this.monomerItem.struct.bonds.get(bondId) as Bond; + if (bondToLeavingGroupAtom) { attachmentAtomId = - bond.begin === leavingGroupsAtom.id ? bond.end : bond.begin; + bondToLeavingGroupAtom.begin === leavingGroupsAtom.id + ? bondToLeavingGroupAtom.end + : bondToLeavingGroupAtom.begin; leavingGroupsAtomId = leavingGroupsAtom.id; } else { attachmentAtomId = leavingGroupsAtom.id; @@ -454,14 +488,11 @@ export abstract class BaseMonomer extends DrawingEntity { }, ); - // Do not create attachment point if: - // there are multiple bonds to same leaving group atom - // there are multiple rglabels on same leaving group atom - // rglabel more than 8 (support only 8 attachment points in macromolecules mode) if ( - bondsToLeavingGroupAtom.size > 1 || - label.length > 2 || - Number(label.replace('R', '')) > 8 + !this.isRglabelConvertableToAttachmentPoint( + label, + bondsToLeavingGroupAtom, + ) ) { return; } From fb2ad851e7836454715d5a7bfcdcabfd65e28257 Mon Sep 17 00:00:00 2001 From: Roman Rodionov Date: Fri, 10 May 2024 14:07:43 +0200 Subject: [PATCH 4/4] - fixed test description --- .../Macro-Micro-Switcher/macro-micro-switcher.spec.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/ketcher-autotests/tests/Macromolecule-editor/Macro-Micro-Switcher/macro-micro-switcher.spec.ts b/ketcher-autotests/tests/Macromolecule-editor/Macro-Micro-Switcher/macro-micro-switcher.spec.ts index ac8b62a4bc..318fdb93fb 100644 --- a/ketcher-autotests/tests/Macromolecule-editor/Macro-Micro-Switcher/macro-micro-switcher.spec.ts +++ b/ketcher-autotests/tests/Macromolecule-editor/Macro-Micro-Switcher/macro-micro-switcher.spec.ts @@ -605,7 +605,8 @@ test.describe('Macro-Micro-Switcher', () => { page, }) => { /* - Ticket: #4530 + Ticket: https://github.com/epam/ketcher/issues/4530 + Description: Convert Rx connection points created in molecules mode into chem attachment points in macromolecules mode */ await turnOnMacromoleculesEditor(page); await openFileAndAddToCanvasMacro('KET/molecules-with-rglabels.ket', page);