From 35cd46648209aedbe00ce36478a635e07d3d5621 Mon Sep 17 00:00:00 2001 From: aproskurnov Date: Mon, 3 Feb 2025 11:26:15 +0100 Subject: [PATCH 1/3] Two sense to antisense connection order problem (#6401) --- .../monomer-chains/ChainsCollection.ts | 125 ++++++++++++++---- 1 file changed, 96 insertions(+), 29 deletions(-) diff --git a/packages/ketcher-core/src/domain/entities/monomer-chains/ChainsCollection.ts b/packages/ketcher-core/src/domain/entities/monomer-chains/ChainsCollection.ts index 94853d2d9b..ec7f36c787 100644 --- a/packages/ketcher-core/src/domain/entities/monomer-chains/ChainsCollection.ts +++ b/packages/ketcher-core/src/domain/entities/monomer-chains/ChainsCollection.ts @@ -117,7 +117,10 @@ export class ChainsCollection { }); }); }); + this.chains = [...reorderedChains.values()]; + + this.reorderChainsPutSenseChainOrderInAccordanceAntisenseConnection(); } public add(chain: Chain) { @@ -420,6 +423,89 @@ export class ChainsCollection { } } + private getComplimentaryChainIfNucleotide(node: SubChainNode) { + const monomerToChain = this.monomerToChain; + + const { monomer, complimentaryMonomer } = + this.getFirstAntisenseMonomerInNode(node) || {}; + const complimentaryNode = + complimentaryMonomer && this.monomerToNode.get(complimentaryMonomer); + const complimentaryChain = + complimentaryMonomer && monomerToChain.get(complimentaryMonomer); + + const isRnaMonomer = + isRnaBaseOrAmbiguousRnaBase(monomer) && + Boolean(getSugarFromRnaBase(monomer)); + const isRnaComplimentaryMonomer = + isRnaBaseOrAmbiguousRnaBase(complimentaryMonomer) && + Boolean(getSugarFromRnaBase(complimentaryMonomer)); + + if ( + !complimentaryNode || + !complimentaryChain || + !(isRnaMonomer || isRnaComplimentaryMonomer) + ) { + return null; + } + return { complimentaryChain, complimentaryNode }; + } + + private reorderChainsPutSenseChainOrderInAccordanceAntisenseConnection() { + const handledChain = new Set(); + const reorderedSenseForSequentialAntisenseChains: Chain[] = new Array( + this.chains.length, + ); + this.chains.forEach((chain) => { + if (!handledChain.has(chain)) { + reorderedSenseForSequentialAntisenseChains[handledChain.size] = chain; + handledChain.add(chain); + } + + if (chain.isAntisense) { + return; + } + + chain.forEachNode(({ node: sNode }) => { + const { + complimentaryChain: antisenseChain, + complimentaryNode: antisenseNode, + } = this.getComplimentaryChainIfNucleotide(sNode) ?? {}; + if (!antisenseChain) { + return; + } + + let isFindCur = false; + antisenseChain.forEachNode(({ node: aNode }) => { + if (aNode === antisenseNode) { + isFindCur = true; + } + if (!isFindCur) { + const { complimentaryChain: anotherSenseChain } = + this.getComplimentaryChainIfNucleotide(aNode) ?? {}; + if (anotherSenseChain && !handledChain.has(anotherSenseChain)) { + const curChainIdx = + reorderedSenseForSequentialAntisenseChains.findIndex( + (v) => v === chain, + ); + let last = anotherSenseChain; + for ( + let i = curChainIdx; + i < reorderedSenseForSequentialAntisenseChains.length; + i++ + ) { + const tmp = reorderedSenseForSequentialAntisenseChains[i]; + reorderedSenseForSequentialAntisenseChains[i] = last; + last = tmp; + } + handledChain.add(anotherSenseChain); + } + } + }); + }); + }); + this.chains = [...reorderedSenseForSequentialAntisenseChains]; + } + // for example // 1 x x x // | @@ -445,36 +531,17 @@ export class ChainsCollection { const { group, chain } = chains.pop() as GrouppedChain; chain.forEachNode(({ node }) => { - node.monomers.forEach((nodeMonomer) => { - const { monomer, complimentaryMonomer } = - this.getFirstComplimentaryMonomer(nodeMonomer) || {}; - const complimentaryNode = - complimentaryMonomer && monomerToNode.get(complimentaryMonomer); - const complimentaryChain = - complimentaryMonomer && monomerToChain.get(complimentaryMonomer); - - const isRnaMonomer = - isRnaBaseOrAmbiguousRnaBase(monomer) && - Boolean(getSugarFromRnaBase(monomer)); - const isRnaComplimentaryMonomer = - isRnaBaseOrAmbiguousRnaBase(complimentaryMonomer) && - Boolean(getSugarFromRnaBase(complimentaryMonomer)); - - if ( - !complimentaryNode || - !complimentaryChain || - !(isRnaMonomer || isRnaComplimentaryMonomer) || - handledChains.has(complimentaryChain) || - cycledComplimentaryChains.has(complimentaryChain) - ) { - return; - } + const { complimentaryChain } = + this.getComplimentaryChainIfNucleotide(node) ?? {}; - handledChains.add(complimentaryChain); - const el = { chain: complimentaryChain, group: Number(!group) }; - chains.push(el); - res.push(el); - }); + if (!complimentaryChain || handledChains.has(complimentaryChain) || cycledComplimentaryChains.has(complimentaryChain)) { + return; + } + + handledChains.add(complimentaryChain); + const el = { chain: complimentaryChain, group: Number(!group) }; + chains.push(el); + res.push(el); }); } From 747d572e50ddf3163cd5a71af66ae0d173f6dca8 Mon Sep 17 00:00:00 2001 From: Roman Rodionov Date: Mon, 10 Feb 2025 16:29:05 +0100 Subject: [PATCH 2/3] - fixed after rebase --- .../monomer-chains/ChainsCollection.ts | 87 +++++++++++++------ 1 file changed, 60 insertions(+), 27 deletions(-) diff --git a/packages/ketcher-core/src/domain/entities/monomer-chains/ChainsCollection.ts b/packages/ketcher-core/src/domain/entities/monomer-chains/ChainsCollection.ts index ec7f36c787..22e403f70c 100644 --- a/packages/ketcher-core/src/domain/entities/monomer-chains/ChainsCollection.ts +++ b/packages/ketcher-core/src/domain/entities/monomer-chains/ChainsCollection.ts @@ -423,35 +423,51 @@ export class ChainsCollection { } } - private getComplimentaryChainIfNucleotide(node: SubChainNode) { - const monomerToChain = this.monomerToChain; + private getComplimentaryChainIfNucleotide( + node: SubChainNode, + monomerToChain: Map, + monomerToNode: Map, + ) { + let complimentaryChain: Chain | undefined; + let complimentaryNode: SubChainNode | undefined; + + for (const monomerToCheck of node.monomers) { + const { monomer, complimentaryMonomer } = + this.getFirstComplimentaryMonomer(monomerToCheck) || {}; + const complimentaryNodeOrUndefined = + complimentaryMonomer && monomerToNode.get(complimentaryMonomer); + const complimentaryChainOrUndefined = + complimentaryMonomer && monomerToChain.get(complimentaryMonomer); + + const isRnaMonomer = + isRnaBaseOrAmbiguousRnaBase(monomer) && + Boolean(getSugarFromRnaBase(monomer)); + const isRnaComplimentaryMonomer = + isRnaBaseOrAmbiguousRnaBase(complimentaryMonomer) && + Boolean(getSugarFromRnaBase(complimentaryMonomer)); + + if ( + !complimentaryNodeOrUndefined || + !complimentaryChainOrUndefined || + !(isRnaMonomer || isRnaComplimentaryMonomer) + ) { + continue; + } - const { monomer, complimentaryMonomer } = - this.getFirstAntisenseMonomerInNode(node) || {}; - const complimentaryNode = - complimentaryMonomer && this.monomerToNode.get(complimentaryMonomer); - const complimentaryChain = - complimentaryMonomer && monomerToChain.get(complimentaryMonomer); - - const isRnaMonomer = - isRnaBaseOrAmbiguousRnaBase(monomer) && - Boolean(getSugarFromRnaBase(monomer)); - const isRnaComplimentaryMonomer = - isRnaBaseOrAmbiguousRnaBase(complimentaryMonomer) && - Boolean(getSugarFromRnaBase(complimentaryMonomer)); - - if ( - !complimentaryNode || - !complimentaryChain || - !(isRnaMonomer || isRnaComplimentaryMonomer) - ) { - return null; + // return first found complimentary chain and node + return { + complimentaryChain: complimentaryChainOrUndefined, + complimentaryNode: complimentaryNodeOrUndefined, + }; } + return { complimentaryChain, complimentaryNode }; } private reorderChainsPutSenseChainOrderInAccordanceAntisenseConnection() { const handledChain = new Set(); + const monomerToChain = this.monomerToChain; + const monomerToNode = this.monomerToNode; const reorderedSenseForSequentialAntisenseChains: Chain[] = new Array( this.chains.length, ); @@ -469,7 +485,12 @@ export class ChainsCollection { const { complimentaryChain: antisenseChain, complimentaryNode: antisenseNode, - } = this.getComplimentaryChainIfNucleotide(sNode) ?? {}; + } = + this.getComplimentaryChainIfNucleotide( + sNode, + monomerToChain, + monomerToNode, + ) ?? {}; if (!antisenseChain) { return; } @@ -481,7 +502,11 @@ export class ChainsCollection { } if (!isFindCur) { const { complimentaryChain: anotherSenseChain } = - this.getComplimentaryChainIfNucleotide(aNode) ?? {}; + this.getComplimentaryChainIfNucleotide( + aNode, + monomerToChain, + monomerToNode, + ) ?? {}; if (anotherSenseChain && !handledChain.has(anotherSenseChain)) { const curChainIdx = reorderedSenseForSequentialAntisenseChains.findIndex( @@ -518,7 +543,6 @@ export class ChainsCollection { // in the picture we have 5 chains, if we pass number 1 it return 1, 2 and 3, if pass 5, return 4, 5 public getAllChainsWithConnectionInBlock(c: Chain) { const chains: GrouppedChain[] = [{ group: 0, chain: c }]; - const monomerToNode = this.monomerToNode; const cycledComplimentaryChains = new Set( this.findCycledComplimentaryChains(c, c), ); @@ -526,15 +550,24 @@ export class ChainsCollection { const res: GrouppedChain[] = [{ group: 0, chain: c }]; const handledChains = new Set([c]); const monomerToChain = this.monomerToChain; + const monomerToNode = this.monomerToNode; while (chains.length) { const { group, chain } = chains.pop() as GrouppedChain; chain.forEachNode(({ node }) => { const { complimentaryChain } = - this.getComplimentaryChainIfNucleotide(node) ?? {}; + this.getComplimentaryChainIfNucleotide( + node, + monomerToChain, + monomerToNode, + ) ?? {}; - if (!complimentaryChain || handledChains.has(complimentaryChain) || cycledComplimentaryChains.has(complimentaryChain)) { + if ( + !complimentaryChain || + handledChains.has(complimentaryChain) || + cycledComplimentaryChains.has(complimentaryChain) + ) { return; } From 8f22cf1853227680eceba0445a98a239bbf9ade4 Mon Sep 17 00:00:00 2001 From: Roman Rodionov Date: Mon, 10 Feb 2025 17:04:07 +0100 Subject: [PATCH 3/3] - updated screenshots --- ...n-for-layout-purposes-1-chromium-linux.png | Bin 13922 -> 13691 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/ketcher-autotests/tests/Macromolecule-editor/Antisense-Chains/antisense-chain-layout.spec.ts-snapshots/9-Check-if-there-is-a-circular-hydrogen-bond--0215f--as-side-chain-connection-for-layout-purposes-1-chromium-linux.png b/ketcher-autotests/tests/Macromolecule-editor/Antisense-Chains/antisense-chain-layout.spec.ts-snapshots/9-Check-if-there-is-a-circular-hydrogen-bond--0215f--as-side-chain-connection-for-layout-purposes-1-chromium-linux.png index 007ee97084d6bfeb7ad70356e254cac8971fbb1b..47d5079d4e72a8485fd711ec4306ec62096f8f81 100644 GIT binary patch literal 13691 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 MS^tDJx$yJ<1~^Ty5C8xG literal 13922 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