Skip to content

Commit

Permalink
- fixed issues
Browse files Browse the repository at this point in the history
  • Loading branch information
rrodionov91 committed Feb 3, 2025
1 parent e5b1f5e commit 38c32e6
Showing 1 changed file with 47 additions and 40 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -380,6 +380,46 @@ export class ChainsCollection {
return undefined;
}

private findCycledComplimentaryChains(
chain: Chain,
startChain: Chain,
previousChain?: Chain,
): Chain[] {
const complimentaryChainsWithData =
this.getComplimentaryChainsWithData(chain);

if (complimentaryChainsWithData.length === 0) {
return [];
}

const complimentaryChainGoesToStartChain = complimentaryChainsWithData.find(
(complimentaryChainsWithData) =>
complimentaryChainsWithData.complimentaryChain !== previousChain &&
complimentaryChainsWithData.complimentaryChain === startChain,
);

if (complimentaryChainGoesToStartChain) {
return [chain];
} else {
return complimentaryChainsWithData.reduce(
(acc, complimentaryChainWithData) => {
return complimentaryChainWithData.complimentaryChain === startChain ||
complimentaryChainWithData.complimentaryChain === previousChain
? [...acc]
: [
...acc,
...this.findCycledComplimentaryChains(
complimentaryChainWithData.complimentaryChain,
startChain,
chain,
),
];
},
[] as Chain[],
);
}
}

// for example
// 1 x x x
// |
Expand All @@ -392,23 +432,18 @@ 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 cycledComplimentaryChains = new Set<Chain>(
this.findCycledComplimentaryChains(c, c),
);

const res: GrouppedChain[] = [{ group: 0, chain: c }];
const handledChains = new Set<Chain>([c]);
const monomerToChain = this.monomerToChain;

while (chains.length) {
const { group, chain } = chains.pop() as GrouppedChain;
chain.forEachNode(({ node }) => {
const complimentaryChainsWithData =
this.getComplimentaryChainsWithData(chain);

if (complimentaryChainsWithData.length === 0) {
handledChains.add(chain);

return;
}

chain.forEachNode(({ node }) => {
node.monomers.forEach((nodeMonomer) => {
const { monomer, complimentaryMonomer } =
this.getFirstComplimentaryMonomer(nodeMonomer) || {};
Expand All @@ -429,7 +464,8 @@ export class ChainsCollection {
!complimentaryNode ||
!complimentaryChain ||
!(isRnaMonomer || isRnaComplimentaryMonomer) ||
handledChains.has(complimentaryChain)
handledChains.has(complimentaryChain) ||
cycledComplimentaryChains.has(complimentaryChain)
) {
return;
}
Expand All @@ -451,7 +487,6 @@ export class ChainsCollection {

public getComplimentaryChainsWithData(
chain: Chain,
chainsToExclude: Chain[] = [],
): ComplimentaryChainsWithData[] {
const complimentaryChainsWithData: ComplimentaryChainsWithData[] = [];
const handledChains = new Set<Chain>();
Expand Down Expand Up @@ -486,35 +521,7 @@ export class ChainsCollection {
});
});

const filteredComplimentaryChainsWithData =
complimentaryChainsWithData.filter((complimentaryChainWithData) => {
return !chainsToExclude.includes(
complimentaryChainWithData.complimentaryChain,
);
});

return filteredComplimentaryChainsWithData.length === 1 ||
// If there is a cycle from complimentary chains
// (f.e chain1 -> chain2 -> chain3 -> chain1, connected through hydrogen bonds to rna base)
// then method returns 0 complimentary chains.
// It further allows to handle them as separate chains (not sense -> antisense)
!filteredComplimentaryChainsWithData.some(
(complimentaryChainWithData) => {
const complimentaryChainsForComplimentaryChain =
this.getComplimentaryChainsWithData(
complimentaryChainWithData.complimentaryChain,
[...chainsToExclude, chain],
);

return complimentaryChainsForComplimentaryChain.some(
(complimentaryChainForComplimentaryChain) =>
complimentaryChainForComplimentaryChain.complimentaryChain !==
chain,
);
},
)
? filteredComplimentaryChainsWithData
: [];
return complimentaryChainsWithData;
}

public getAntisenseChainsWithData(chain: Chain) {
Expand Down

0 comments on commit 38c32e6

Please sign in to comment.