From 747d572e50ddf3163cd5a71af66ae0d173f6dca8 Mon Sep 17 00:00:00 2001 From: Roman Rodionov Date: Mon, 10 Feb 2025 16:29:05 +0100 Subject: [PATCH] - 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; }