Преглед изворни кода

fix AtomicIndex.findChainAuth

- needs to consider that auth_asym_id can map to multiple label_asym_ids
Alexander Rose пре 5 година
родитељ
комит
c89848dec0

+ 1 - 1
src/mol-model/structure/model/properties/atomic/hierarchy.ts

@@ -205,7 +205,7 @@ export interface AtomicIndex {
 
 export namespace AtomicIndex {
     export interface ChainLabelKey { label_entity_id: string, label_asym_id: string }
-    export interface ChainAuthKey { auth_asym_id: string }
+    export interface ChainAuthKey { auth_asym_id: string, auth_seq_id: number }
 
     export interface ResidueKey { label_entity_id: string, label_asym_id: string, auth_seq_id: number, pdbx_PDB_ins_code?: string }
     export function EmptyResidueKey(): ResidueKey { return { label_entity_id: '', label_asym_id: '', auth_seq_id: 0, pdbx_PDB_ins_code: void 0 }; }

+ 16 - 7
src/mol-model/structure/model/properties/utils/atomic-index.ts

@@ -1,7 +1,8 @@
 /**
- * Copyright (c) 2017 mol* contributors, licensed under MIT, See LICENSE file for more info.
+ * Copyright (c) 2017-2020 mol* contributors, licensed under MIT, See LICENSE file for more info.
  *
  * @author David Sehnal <david.sehnal@gmail.com>
+ * @author Alexander Rose <alexander.rose@weirdbyte.de>
  */
 
 import { AtomicData, AtomicSegments } from '../atomic'
@@ -49,7 +50,7 @@ interface Mapping {
     entity_index_label_asym_id: Map<EntityIndex, Map<string, ChainIndex>>,
     chain_index_label_seq_id: Map<ChainIndex, Map<string | number, ResidueIndex>>,
 
-    auth_asym_id: Map<string, ChainIndex>,
+    auth_asym_id_auth_seq_id: Map<string, Map<number, ChainIndex>>,
     chain_index_auth_seq_id: Map<ChainIndex, Map<string | number, ResidueIndex>>
 }
 
@@ -64,7 +65,7 @@ function createMapping(entities: Entities, data: AtomicData, segments: AtomicSeg
         chain_index_entity_index: new Int32Array(data.chains._rowCount) as any,
         entity_index_label_asym_id: new Map(),
         chain_index_label_seq_id: new Map(),
-        auth_asym_id: new Map(),
+        auth_asym_id_auth_seq_id: new Map(),
         chain_index_auth_seq_id: new Map(),
     };
 }
@@ -87,7 +88,9 @@ class Index implements AtomicIndex {
     }
 
     findChainAuth(key: AtomicIndex.ChainAuthKey): ChainIndex {
-        return this.map.auth_asym_id.has(key.auth_asym_id) ? this.map.auth_asym_id.get(key.auth_asym_id)! : -1 as ChainIndex;
+        if (!this.map.auth_asym_id_auth_seq_id.has(key.auth_asym_id)) return -1 as ChainIndex
+        const rm = this.map.auth_asym_id_auth_seq_id.get(key.auth_asym_id)!
+        return rm.has(key.auth_seq_id) ? rm.get(key.auth_seq_id)! : -1 as ChainIndex
     }
 
     findResidue(label_entity_id: string, label_asym_id: string, auth_seq_id: number, pdbx_PDB_ins_code?: string): ResidueIndex
@@ -202,12 +205,16 @@ export function getAtomicIndex(data: AtomicData, entities: Entities, segments: A
         const chainSegment = chainsIt.move();
         const chainIndex = chainSegment.index;
 
-        let entityIndex = entities.getEntityIndex(label_entity_id.value(chainIndex));
+        const entityIndex = entities.getEntityIndex(label_entity_id.value(chainIndex));
         if (entityIndex < 0) missingEntity(label_entity_id.value(chainIndex));
         map.chain_index_entity_index[chainIndex] = entityIndex;
 
         const authAsymId = auth_asym_id.value(chainIndex);
-        if (!map.auth_asym_id.has(authAsymId)) map.auth_asym_id.set(authAsymId, chainIndex);
+        let auth_asym_id_auth_seq_id = map.auth_asym_id_auth_seq_id.get(authAsymId)
+        if (!auth_asym_id_auth_seq_id) {
+            auth_asym_id_auth_seq_id = new Map<number, ChainIndex>();
+            map.auth_asym_id_auth_seq_id.set(authAsymId, auth_asym_id_auth_seq_id)
+        }
 
         updateMapMapIndex(map.entity_index_label_asym_id, entityIndex, label_asym_id.value(chainIndex), chainIndex);
 
@@ -220,9 +227,11 @@ export function getAtomicIndex(data: AtomicData, entities: Entities, segments: A
         while (residuesIt.hasNext) {
             const residueSegment = residuesIt.move();
             const rI = residueSegment.index;
+            const authSeqId = auth_seq_id.value(rI)
             const insCode = pdbx_PDB_ins_code.value(rI);
             chain_index_label_seq_id.set(getResidueId(label_seq_id.value(rI), insCode), rI);
-            chain_index_auth_seq_id.set(getResidueId(auth_seq_id.value(rI), insCode), rI);
+            chain_index_auth_seq_id.set(getResidueId(authSeqId, insCode), rI);
+            auth_asym_id_auth_seq_id.set(authSeqId, chainIndex)
         }
     }