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