From 96523e7696cb7305e88894e94aeb27bbdaf368cb Mon Sep 17 00:00:00 2001 From: David Sehnal <david.sehnal@gmail.com> Date: Mon, 30 Jul 2018 17:37:31 +0200 Subject: [PATCH] Updated carbohydrate detection in mol-model --- package-lock.json | Bin 430530 -> 428456 bytes .../structure/carbohydrates/compute.ts | 94 +++++++++++------- 2 files changed, 59 insertions(+), 35 deletions(-) diff --git a/package-lock.json b/package-lock.json index 10f412c6ca50a3948a9b53e7181e5a2d6aea4540..fe9ae5131f7aa0dec8396c1e51568b125de9fc70 100644 GIT binary patch delta 28568 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 delta 27156 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 FE&$JWs4)Nl diff --git a/src/mol-model/structure/structure/carbohydrates/compute.ts b/src/mol-model/structure/structure/carbohydrates/compute.ts index 2e0ac1168..501494553 100644 --- a/src/mol-model/structure/structure/carbohydrates/compute.ts +++ b/src/mol-model/structure/structure/carbohydrates/compute.ts @@ -4,45 +4,57 @@ * @author Alexander Rose <alexander.rose@weirdbyte.de> */ -import Unit from '../unit'; +import { Segmentation } from 'mol-data/int'; +import { combinations } from 'mol-data/util/combination'; +import { areConnected } from 'mol-math/graph'; +import { Vec3 } from 'mol-math/linear-algebra'; +import PrincipalAxes from 'mol-math/linear-algebra/matrix/principal-axes'; +import { fillSerial } from 'mol-util/array'; import { ResidueIndex } from '../../model'; -import { Interval, Segmentation } from 'mol-data/int'; +import { ElementSymbol, MoleculeType } from '../../model/types'; +import { getMoleculeType, getPositionMatrix } from '../../util'; +import StructureElement from '../element'; import Structure from '../structure'; -import { Carbohydrates, CarbohydrateLink, CarbohydrateTerminalLink, CarbohydrateElement } from './data'; +import Unit from '../unit'; import { SaccharideNameMap, UnknownSaccharideComponent } from './constants'; -import { Vec3 } from 'mol-math/linear-algebra'; -import { getMoleculeType, getPositionMatrix } from '../../util'; -import { MoleculeType, ElementSymbol } from '../../model/types'; -import { areConnected } from 'mol-math/graph'; -import { combinations } from 'mol-data/util/combination'; -import { fillSerial } from 'mol-util/array'; -import PrincipalAxes from 'mol-math/linear-algebra/matrix/principal-axes'; +import { CarbohydrateElement, CarbohydrateLink, Carbohydrates, CarbohydrateTerminalLink } from './data'; function getResidueIndex(elementIndex: number, unit: Unit.Atomic) { return unit.model.atomicHierarchy.residueAtomSegments.index[unit.elements[elementIndex]] } -function getRingIndices(unit: Unit.Atomic, rI: ResidueIndex) { - const { offsets } = unit.model.atomicHierarchy.residueAtomSegments - const { elements } = unit - const interval = Interval.ofBounds(offsets[rI], offsets[rI + 1]) - const rings: number[] = [] - rings.push(...unit.rings.byFingerprint.get('C-C-C-C-C-O') || []) - rings.push(...unit.rings.byFingerprint.get('C-C-C-C-O') || []) - const sugarRings: ReadonlyArray<number>[] = [] - for (let i = 0, il = rings.length; i < il; ++i) { - let withinIntervalCount = 0 - const ring = unit.rings.all[rings[i]] - for (let j = 0, jl = ring.length; j < jl; ++j) { - if (Interval.has(interval, elements[ring[j]])) ++withinIntervalCount +function sugarResidueIdx(unit: Unit.Atomic, ring: ArrayLike<StructureElement.UnitIndex>): ResidueIndex { + const { elements } = unit; + const residueIndex = unit.model.atomicHierarchy.residueAtomSegments.index; + const idx = residueIndex[elements[ring[0]]]; + for (let rI = 1, _rI = ring.length; rI < _rI; rI++) { + if (idx !== residueIndex[elements[ring[rI]]]) return -1 as ResidueIndex; + } + return idx; +} + +function addSugarRings(unit: Unit.Atomic, fp: string, sugarResidues: Map<ResidueIndex, number[]>) { + const rings = unit.rings; + const byFp = rings.byFingerprint.get(fp); + if (!byFp) return; + for (const r of byFp) { + const idx = sugarResidueIdx(unit, rings.all[r]); + if (idx >= 0) { + if (sugarResidues.has(idx)) sugarResidues.get(idx)!.push(r); + else sugarResidues.set(idx, [r]); } - if (withinIntervalCount === ring.length) sugarRings.push(ring) } - return sugarRings +} + +function getSugarRingIndices(unit: Unit.Atomic) { + const sugarResidues = new Map<ResidueIndex, number[]>(); + addSugarRings(unit, 'C-C-C-C-C-O', sugarResidues); + addSugarRings(unit, 'C-C-C-C-O', sugarResidues); + return sugarResidues; } const C = ElementSymbol('C') -function getDirection(direction: Vec3, unit: Unit.Atomic, indices: ReadonlyArray<number>, center: Vec3) { +function getDirection(direction: Vec3, unit: Unit.Atomic, indices: ReadonlyArray<StructureElement.UnitIndex>, center: Vec3) { let indexC1 = -1, indexC1X = -1, indexC = -1 const { elements } = unit const { position } = unit.conformation @@ -108,6 +120,8 @@ export function computeCarbohydrates(structure: Structure): Carbohydrates { const chainIt = Segmentation.transientSegments(chainAtomSegments, unit.elements) const residueIt = Segmentation.transientSegments(residueAtomSegments, unit.elements) + let sugarResidueMap: Map<ResidueIndex, number[]> | undefined = void 0; + while (chainIt.hasNext) { residueIt.setSegment(chainIt.move()); @@ -119,14 +133,27 @@ export function computeCarbohydrates(structure: Structure): Carbohydrates { if (getMoleculeType(unit.model, residueIndex) !== MoleculeType.saccharide) continue } - const sugarRings = getRingIndices(unit, residueIndex) + if (!sugarResidueMap) { + sugarResidueMap = getSugarRingIndices(unit); + } + + const sugarRings = sugarResidueMap.get(residueIndex); + + if (!sugarRings || !sugarRings.length) { + console.warn(`No ring found for carbohydrate on residue with index ${residueIndex}, unit ${unit.id}. Residue skipped.`); + continue; + } + + const rings = unit.rings; const ringElements: number[] = [] for (let j = 0, jl = sugarRings.length; j < jl; ++j) { - const pa = new PrincipalAxes(getPositionMatrix(unit, sugarRings[j])) + const ringAtoms = rings.all[sugarRings[j]]; + + const pa = new PrincipalAxes(getPositionMatrix(unit, ringAtoms)) const center = Vec3.copy(Vec3.zero(), pa.center) const normal = Vec3.copy(Vec3.zero(), pa.normVecC) - const direction = getDirection(Vec3.zero(), unit, sugarRings[j], center) + const direction = getDirection(Vec3.zero(), unit, ringAtoms, center) Vec3.orthogonalize(direction, normal, direction) const elementIndex = elements.length @@ -138,8 +165,9 @@ export function computeCarbohydrates(structure: Structure): Carbohydrates { // add carbohydrate links induced by intra-residue bonds const ringCombinations = combinations(fillSerial(new Array(sugarRings.length)), 2) for (let j = 0, jl = ringCombinations.length; j < jl; ++j) { - const rc = ringCombinations[j] - if (areConnected(sugarRings[rc[0]], sugarRings[rc[1]], unit.links, 2)) { + const rc = ringCombinations[j]; + const r0 = rings.all[sugarRings[rc[0]]], r1 = rings.all[sugarRings[rc[1]]]; + if (areConnected(r0, r1, unit.links, 2)) { // fix both directions as it is unlcear where the C1 atom is fixLinkDirection(ringElements[rc[0]], ringElements[rc[1]]) fixLinkDirection(ringElements[rc[1]], ringElements[rc[0]]) @@ -153,10 +181,6 @@ export function computeCarbohydrates(structure: Structure): Carbohydrates { }) } } - - if (!sugarRings.length) { - console.warn('No ring found for carbohydrate') - } } } } -- GitLab