Skip to content

Commit

Permalink
#6107 - Create Antisense Strand doesn't work in some cases (#6116) (#…
Browse files Browse the repository at this point in the history
…6120)

- changed implementation of searching first monomers in selection (in this case monomer can be in the middle of the chain and does not have free r1 attachment point)
- changed antisense base for Adenine
  • Loading branch information
rrodionov91 authored Dec 12, 2024
1 parent c7d3f22 commit 6c4a38b
Show file tree
Hide file tree
Showing 3 changed files with 64 additions and 9 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -2647,7 +2647,7 @@ export class DrawingEntitiesManager {

private get antisenseChainBasesMap() {
return {
[RnaDnaNaturalAnaloguesEnum.ADENINE]: RnaDnaNaturalAnaloguesEnum.THYMINE,
[RnaDnaNaturalAnaloguesEnum.ADENINE]: RnaDnaNaturalAnaloguesEnum.URACIL,
[RnaDnaNaturalAnaloguesEnum.CYTOSINE]: RnaDnaNaturalAnaloguesEnum.GUANINE,
[RnaDnaNaturalAnaloguesEnum.GUANINE]: RnaDnaNaturalAnaloguesEnum.CYTOSINE,
[RnaDnaNaturalAnaloguesEnum.THYMINE]: RnaDnaNaturalAnaloguesEnum.ADENINE,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ import {
} from 'domain/entities';
import {
getNextMonomerInChain,
getPreviousMonomerInChain,
getRnaBaseFromSugar,
isMonomerConnectedToR2RnaBase,
isRnaBaseOrAmbiguousRnaBase,
Expand Down Expand Up @@ -128,15 +129,15 @@ export class ChainsCollection {
chainsCollection.add(new Chain(monomer, !!IsChainCycled.CYCLED));
});

if (
firstMonomersInRegularChains.length === 0 &&
firstMonomersInCycledChains.length === 0
) {
const topLeftMonomer = this.getMonomerWithLowerCoordsFromMonomerList(
filteredMonomers.filter((monomer) => !(monomer instanceof RNABase)),
);
const firstMonomersInMiddleOfChains =
this.getFirstMonomersInMiddleOfChains(filteredMonomers);

chainsCollection.add(new Chain(topLeftMonomer));
if (firstMonomersInMiddleOfChains.length) {
firstMonomersInMiddleOfChains.forEach(
(firstMonomerInMiddleOfChain: BaseMonomer) => {
chainsCollection.add(new Chain(firstMonomerInMiddleOfChain));
},
);
}

return chainsCollection;
Expand Down Expand Up @@ -184,6 +185,42 @@ export class ChainsCollection {
return firstMonomersInChains;
}

private static getFirstMonomersInMiddleOfChains(monomers: BaseMonomer[]) {
const initialMonomersSet = new Set(monomers);
const handledMonomers = new Set<BaseMonomer>();
const firstMonomersInMiddleOfChains: BaseMonomer[] = [];

monomers.forEach((monomer) => {
if (handledMonomers.has(monomer)) {
return;
}

handledMonomers.add(monomer);

let previousMonomerInChain = getPreviousMonomerInChain(monomer);

while (
previousMonomerInChain &&
!handledMonomers.has(previousMonomerInChain) &&
!initialMonomersSet.has(previousMonomerInChain)
) {
const previousMonomer = getPreviousMonomerInChain(
previousMonomerInChain,
);

handledMonomers.add(previousMonomerInChain);

if (!previousMonomer) {
firstMonomersInMiddleOfChains.push(previousMonomerInChain);
} else {
previousMonomerInChain = previousMonomer;
}
}
});

return firstMonomersInMiddleOfChains;
}

public get firstNode() {
return this.chains[0]?.subChains[0]?.nodes[0];
}
Expand Down
18 changes: 18 additions & 0 deletions packages/ketcher-core/src/domain/helpers/monomers.ts
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,24 @@ export function isMonomerConnectedToR2RnaBase(monomer?: BaseMonomer) {
);
}

export function getPreviousMonomerInChain(monomer: BaseMonomer) {
const r1PolymerBond = monomer.attachmentPointsToBonds.R1;
const previousMonomer =
r1PolymerBond instanceof PolymerBond
? r1PolymerBond?.getAnotherMonomer(monomer)
: undefined;

if (!previousMonomer || !(r1PolymerBond instanceof PolymerBond)) {
return undefined;
}

return previousMonomer &&
previousMonomer.getAttachmentPointByBond(r1PolymerBond) ===
AttachmentPointName.R2
? previousMonomer
: undefined;
}

export function getNextMonomerInChain(
monomer?: BaseMonomer,
firstMonomer?: BaseMonomer | null,
Expand Down

0 comments on commit 6c4a38b

Please sign in to comment.