From a81db69edc9e1ce25854156d8b05d515f64da5b1 Mon Sep 17 00:00:00 2001 From: David Sehnal <david.sehnal@gmail.com> Date: Fri, 8 Jun 2018 15:35:50 +0200 Subject: [PATCH] Only keep modified residue name mapping --- src/apps/structure-info/model.ts | 11 ++-- .../structure/model/formats/mmcif.ts | 23 +++---- .../model/formats/mmcif/modified-residues.ts | 65 ------------------- src/mol-model/structure/model/model.ts | 5 +- 4 files changed, 20 insertions(+), 84 deletions(-) delete mode 100644 src/mol-model/structure/model/formats/mmcif/modified-residues.ts diff --git a/src/apps/structure-info/model.ts b/src/apps/structure-info/model.ts index 384758e57..ed012d465 100644 --- a/src/apps/structure-info/model.ts +++ b/src/apps/structure-info/model.ts @@ -128,11 +128,12 @@ export function printSequence(model: Model) { export function printModRes(model: Model) { console.log('\nModified Residues\n============='); - const { residueIndices, keys, data } = model.properties.modifiedResidues; - const { label_comp_id } = model.atomicHierarchy.residues; - for (let i = 0; i < residueIndices.length; i++) { - const rI = residueIndices[i], k = keys[i]; - console.log(`Idx: ${rI} ${data.parent_comp_id.value(k)} -> ${label_comp_id.value(rI)}`); + const map = model.properties.modifiedResidueNameMap; + const { label_comp_id, _rowCount } = model.atomicHierarchy.residues; + for (let i = 0; i < _rowCount; i++) { + const comp_id = label_comp_id.value(i); + if (!map.has(comp_id)) continue; + console.log(`[${i}] ${map.get(comp_id)} -> ${comp_id}`); } console.log(); } diff --git a/src/mol-model/structure/model/formats/mmcif.ts b/src/mol-model/structure/model/formats/mmcif.ts index 7cbaedb7d..48d8c4754 100644 --- a/src/mol-model/structure/model/formats/mmcif.ts +++ b/src/mol-model/structure/model/formats/mmcif.ts @@ -11,7 +11,7 @@ import { Vec3 } from 'mol-math/linear-algebra'; import UUID from 'mol-util/uuid'; import Format from '../format'; import Model from '../model'; -import { AtomicConformation, AtomicData, AtomicSegments, AtomsSchema, ChainsSchema, ResiduesSchema, AtomicHierarchy } from '../properties/atomic'; +import { AtomicConformation, AtomicData, AtomicSegments, AtomsSchema, ChainsSchema, ResiduesSchema } from '../properties/atomic'; import { Entities } from '../properties/common'; import { ModelSymmetry } from '../properties/symmetry'; import { getAtomicKeys } from '../properties/utils/atomic-keys'; @@ -23,7 +23,6 @@ import { getSequence } from './mmcif/sequence'; import mmCIF_Format = Format.mmCIF import { Task } from 'mol-task'; import { getSecondaryStructureMmCif } from './mmcif/secondary-structure'; -import { ModifiedResidues } from './mmcif/modified-residues'; function findModelBounds({ data }: mmCIF_Format, startIndex: number) { const num = data.atom_site.pdbx_PDB_model_num; @@ -119,13 +118,17 @@ function isHierarchyDataEqual(a: AtomicData, b: AtomicData) { && Table.areEqual(a.atoms as Table<AtomsSchema>, b.atoms as Table<AtomsSchema>) } -function modResProvider(format: mmCIF_Format, hierarchy: AtomicHierarchy, entities: Entities) { - let modres: ModifiedResidues | undefined = void 0; - return () => { - if (modres) return modres; - modres = new ModifiedResidues(format.data.pdbx_struct_mod_residue, hierarchy, entities); - return modres; +function modResMap(format: mmCIF_Format) { + const data = format.data.pdbx_struct_mod_residue; + const map = new Map<string, string>(); + const comp_id = data.label_comp_id.isDefined ? data.label_comp_id : data.auth_comp_id; + const parent_id = data.parent_comp_id; + + for (let i = 0; i < data._rowCount; i++) { + map.set(comp_id.value(i), parent_id.value(i)); } + + return map; } function createModel(format: mmCIF_Format, bounds: Interval, previous?: Model): Model { @@ -156,8 +159,6 @@ function createModel(format: mmCIF_Format, bounds: Interval, previous?: Model): ? format.data.entry.id.value(0) : format.data._name; - const modRes = modResProvider(format, atomicHierarchy, entities); - return { id: UUID.create(), label, @@ -171,7 +172,7 @@ function createModel(format: mmCIF_Format, bounds: Interval, previous?: Model): coarseConformation: coarse.conformation, properties: { secondaryStructure: getSecondaryStructureMmCif(format.data, atomicHierarchy), - get modifiedResidues() { return modRes() } + modifiedResidueNameMap: modResMap(format) }, symmetry: getSymmetry(format) }; diff --git a/src/mol-model/structure/model/formats/mmcif/modified-residues.ts b/src/mol-model/structure/model/formats/mmcif/modified-residues.ts deleted file mode 100644 index 64f182b2b..000000000 --- a/src/mol-model/structure/model/formats/mmcif/modified-residues.ts +++ /dev/null @@ -1,65 +0,0 @@ -/** - * Copyright (c) 2018 mol* contributors, licensed under MIT, See LICENSE file for more info. - * - * @author David Sehnal <david.sehnal@gmail.com> - */ - -import { mmCIF_Database } from 'mol-io/reader/cif/schema/mmcif' -import { AtomicHierarchy } from '../../properties/atomic'; -import { Entities } from '../../properties/common'; - -class ModifiedResidues { - private residueIndexMap = new Map<number, number>(); - - /** All residue indices within the given model that are modified. */ - readonly residueIndices: ReadonlyArray<number>; - /** Indexed same as residueIndex and is key to ModifiedResidues.data table */ - readonly keys: ReadonlyArray<number>; - - /** Index into the data table. -1 if the residue is not modified. */ - getKey(residueIndex: number): number { - return this.residueIndexMap.has(residueIndex) ? this.residueIndexMap.get(residueIndex)! : -1; - } - - constructor(public data: mmCIF_Database['pdbx_struct_mod_residue'], hierarchy: AtomicHierarchy, entities: Entities) { - if (data._rowCount === 0) { - this.residueIndices = []; - this.keys = []; - return; - } - - const { PDB_ins_code, auth_seq_id, _rowCount } = data; - - const asym_id = data.label_asym_id.isDefined ? data.label_asym_id : data.auth_asym_id; - const comp_id = data.label_comp_id.isDefined ? data.label_comp_id : data.auth_comp_id; - - const entityIds = entities.data.id.toArray(); - - const residueIndices: number[] = []; - const keys: number[] = []; - - for (let i = 0; i < _rowCount; i++) { - const aId = asym_id.value(i); - const eIdx = getEntityId(hierarchy, entityIds, aId); - if (eIdx < 0) continue; - const key = hierarchy.findResidueKey(entityIds[eIdx], aId, comp_id.value(i), auth_seq_id.value(i), PDB_ins_code.value(i)); - if (key >= 0) { - this.residueIndexMap.set(key, i); - residueIndices[residueIndices.length] = key; - keys[keys.length] = i; - } - } - - this.residueIndices = residueIndices; - this.keys = keys; - } -} - -function getEntityId(hierarchy: AtomicHierarchy, ids: ArrayLike<string>, asym_id: string) { - for (let i = 0, _i = ids.length; i < _i; i++) { - if (hierarchy.findChainKey(ids[i], asym_id) >= 0) return i; - } - return -1; -} - -export { ModifiedResidues } \ No newline at end of file diff --git a/src/mol-model/structure/model/model.ts b/src/mol-model/structure/model/model.ts index 8f60531e6..799bb6643 100644 --- a/src/mol-model/structure/model/model.ts +++ b/src/mol-model/structure/model/model.ts @@ -15,8 +15,6 @@ import { SecondaryStructure } from './properties/seconday-structure'; //import from_gro from './formats/gro' import from_mmCIF from './formats/mmcif' -import { ModifiedResidues } from './formats/mmcif/modified-residues'; - /** * Interface to the "source data" of the molecule. * @@ -40,7 +38,8 @@ interface Model extends Readonly<{ /** Various parts of the code can "cache" custom properties here */ properties: { readonly secondaryStructure: SecondaryStructure, - readonly modifiedResidues: ModifiedResidues, + // maps modified residue name to its parent + readonly modifiedResidueNameMap: Map<string, string>, [customName: string]: any }, -- GitLab