From d7dd41eb0fc4319e621ddcbd78cd8672d31d653b Mon Sep 17 00:00:00 2001 From: Roman Rodionov Date: Wed, 4 Dec 2024 13:58:47 +0100 Subject: [PATCH] #5317 - Some side chain bonds are not shown in Sequence mode for bases, CHEMs, phosphates and sugars --- .../renderers/sequence/SequenceRenderer.ts | 158 +++++++++--------- 1 file changed, 82 insertions(+), 76 deletions(-) diff --git a/packages/ketcher-core/src/application/render/renderers/sequence/SequenceRenderer.ts b/packages/ketcher-core/src/application/render/renderers/sequence/SequenceRenderer.ts index fc860c59e5..e0641bd8e6 100644 --- a/packages/ketcher-core/src/application/render/renderers/sequence/SequenceRenderer.ts +++ b/packages/ketcher-core/src/application/render/renderers/sequence/SequenceRenderer.ts @@ -206,88 +206,94 @@ export class SequenceRenderer { return; } - if (!handledMonomersToAttachmentPoints.has(node.monomer)) { - handledMonomersToAttachmentPoints.set(node.monomer, new Set()); - } - node.monomer.forEachBond((polymerBond, attachmentPointName) => { - const handledAttachmentPoints = - handledMonomersToAttachmentPoints.get( - node.monomer, - ) as Set; - - if (polymerBond instanceof MonomerToAtomBond) { - const bondRenderer = new MonomerToAtomBondSequenceRenderer( - polymerBond, - node, - ); + node.monomers.forEach((monomer) => { + if (!handledMonomersToAttachmentPoints.has(monomer)) { + handledMonomersToAttachmentPoints.set(monomer, new Set()); + } + monomer.forEachBond((polymerBond, attachmentPointName) => { + const handledAttachmentPoints = + handledMonomersToAttachmentPoints.get( + monomer, + ) as Set; + + if (polymerBond instanceof MonomerToAtomBond) { + const bondRenderer = new MonomerToAtomBondSequenceRenderer( + polymerBond, + node, + ); + + bondRenderer.show(); + polymerBond.setRenderer(bondRenderer); + handledAttachmentPoints.add(attachmentPointName); + + return; + } + + if (!subChain.bonds.includes(polymerBond)) { + subChain.bonds.push(polymerBond); + } + if (!polymerBond.isSideChainConnection) { + polymerBond.setRenderer( + new BackBoneBondSequenceRenderer(polymerBond), + ); + return; + } + + if (handledAttachmentPoints.has(attachmentPointName)) { + return; + } + + const anotherMonomer = polymerBond.getAnotherEntity( + monomer, + ) as BaseMonomer; + + // Skip handling side chains for sugar(R3) + base(R1) connections. + if ( + (monomer instanceof Sugar && + getRnaBaseFromSugar(monomer) === anotherMonomer) || + (anotherMonomer instanceof Sugar && + getRnaBaseFromSugar(anotherMonomer) === monomer) + ) { + return; + } + + let bondRenderer; + + // If side connection comes from rna base then take connected sugar and draw side connection from it + // because for rna we display only one letter instead of three + const connectedSugarToBase = getSugarFromRnaBase(anotherMonomer); + if ( + isRnaBaseOrAmbiguousRnaBase(anotherMonomer) && + connectedSugarToBase + ) { + bondRenderer = new PolymerBondSequenceRenderer( + new PolymerBond(monomer, connectedSugarToBase), + ); + } else { + bondRenderer = new PolymerBondSequenceRenderer(polymerBond); + } bondRenderer.show(); polymerBond.setRenderer(bondRenderer); handledAttachmentPoints.add(attachmentPointName); - return; - } - - if (!subChain.bonds.includes(polymerBond)) { - subChain.bonds.push(polymerBond); - } - if (!polymerBond.isSideChainConnection) { - polymerBond.setRenderer( - new BackBoneBondSequenceRenderer(polymerBond), + if (!handledMonomersToAttachmentPoints.get(anotherMonomer)) { + handledMonomersToAttachmentPoints.set( + anotherMonomer, + new Set(), + ); + } + const anotherMonomerHandledAttachmentPoints = + handledMonomersToAttachmentPoints.get( + anotherMonomer, + ) as Set; + + anotherMonomerHandledAttachmentPoints.add( + anotherMonomer?.getAttachmentPointByBond( + polymerBond, + ) as AttachmentPointName, ); - return; - } - - if (handledAttachmentPoints.has(attachmentPointName)) { - return; - } - - const anotherMonomer = polymerBond.getAnotherEntity( - node.monomer, - ) as BaseMonomer; - - // Skip handling side chains for sugar(R3) + base(R1) connections. - if ( - (node.monomer instanceof Sugar && - getRnaBaseFromSugar(node.monomer) === anotherMonomer) || - (anotherMonomer instanceof Sugar && - getRnaBaseFromSugar(anotherMonomer) === node.monomer) - ) { - return; - } - - let bondRenderer; - - // If side connection comes from rna base then take connected sugar and draw side connection from it - // because for rna we display only one letter instead of three - const connectedSugarToBase = getSugarFromRnaBase(anotherMonomer); - if ( - isRnaBaseOrAmbiguousRnaBase(anotherMonomer) && - connectedSugarToBase - ) { - bondRenderer = new PolymerBondSequenceRenderer( - new PolymerBond(node.monomer, connectedSugarToBase), - ); - } else { - bondRenderer = new PolymerBondSequenceRenderer(polymerBond); - } - bondRenderer.show(); - polymerBond.setRenderer(bondRenderer); - handledAttachmentPoints.add(attachmentPointName); - - if (!handledMonomersToAttachmentPoints.get(anotherMonomer)) { - handledMonomersToAttachmentPoints.set(anotherMonomer, new Set()); - } - const anotherMonomerHandledAttachmentPoints = - handledMonomersToAttachmentPoints.get( - anotherMonomer, - ) as Set; - - anotherMonomerHandledAttachmentPoints.add( - anotherMonomer?.getAttachmentPointByBond( - polymerBond, - ) as AttachmentPointName, - ); + }); }); }); });