diff --git a/packages/ketcher-core/src/domain/entities/monomer-chains/Chain.ts b/packages/ketcher-core/src/domain/entities/monomer-chains/Chain.ts index 5cde5140a1..1cfc96b189 100644 --- a/packages/ketcher-core/src/domain/entities/monomer-chains/Chain.ts +++ b/packages/ketcher-core/src/domain/entities/monomer-chains/Chain.ts @@ -20,13 +20,11 @@ import { LinkerSequenceNode } from 'domain/entities/LinkerSequenceNode'; export class Chain { public subChains: BaseSubChain[] = []; - public firstMonomer: BaseMonomer | null; + public firstMonomer?: BaseMonomer; public isCyclic = false; constructor(firstMonomer?: BaseMonomer, isCyclic?: boolean) { - this.firstMonomer = null; - if (firstMonomer) { this.firstMonomer = firstMonomer; @@ -53,10 +51,16 @@ export class Chain { const nextMonomer = getNextMonomerInChain(monomer); - if (monomer instanceof Sugar && isValidNucleoside(monomer)) { - this.lastSubChain.add(Nucleoside.fromSugar(monomer)); - } else if (monomer instanceof Sugar && isValidNucleotide(monomer)) { - this.lastSubChain.add(Nucleotide.fromSugar(monomer)); + if ( + monomer instanceof Sugar && + isValidNucleoside(monomer, this.firstMonomer) + ) { + this.lastSubChain.add(Nucleoside.fromSugar(monomer, false)); + } else if ( + monomer instanceof Sugar && + isValidNucleotide(monomer, this.firstMonomer) + ) { + this.lastSubChain.add(Nucleotide.fromSugar(monomer, false)); } else if (monomer instanceof Peptide) { this.lastSubChain.add(new MonomerSequenceNode(monomer)); } else if ( diff --git a/packages/ketcher-core/src/domain/helpers/monomers.ts b/packages/ketcher-core/src/domain/helpers/monomers.ts index 9400fc0315..734b7708c4 100644 --- a/packages/ketcher-core/src/domain/helpers/monomers.ts +++ b/packages/ketcher-core/src/domain/helpers/monomers.ts @@ -86,22 +86,32 @@ export function isMonomerBeginningOfChain( ); } -export function isValidNucleotide(sugar: Sugar) { +export function isValidNucleotide( + sugar: Sugar, + firstMonomerInCyclicChain?: BaseMonomer, +) { const phosphate = getPhosphateFromSugar(sugar); const nextMonomerAfterPhosphate = getNextMonomerInChain(phosphate); return Boolean( getRnaBaseFromSugar(sugar) && getPhosphateFromSugar(sugar) && - nextMonomerAfterPhosphate, + nextMonomerAfterPhosphate && + phosphate !== firstMonomerInCyclicChain, ); } -export function isValidNucleoside(sugar: Sugar) { +export function isValidNucleoside( + sugar: Sugar, + firstMonomerInCyclicChain?: BaseMonomer, +) { const phosphate = getPhosphateFromSugar(sugar); const nextMonomerAfterPhosphate = getNextMonomerInChain(phosphate); return ( - getRnaBaseFromSugar(sugar) && (!phosphate || !nextMonomerAfterPhosphate) + getRnaBaseFromSugar(sugar) && + (!phosphate || + !nextMonomerAfterPhosphate || + phosphate === firstMonomerInCyclicChain) ); }