Browse Source

added AtomicIndex.findEntity

Alexander Rose 5 years ago
parent
commit
296bea1b88

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

@@ -139,6 +139,8 @@ export interface AtomicSegments {
 export interface AtomicIndex {
     /** @returns index or -1 if not present. */
     getEntityFromChain(cI: ChainIndex): EntityIndex,
+    /** @returns index or -1 if not present. */
+    findEntity(label_asym_id: string): EntityIndex
 
     /**
      * Find chain using label_ mmCIF properties

+ 12 - 2
src/mol-model/structure/model/properties/utils/atomic-index.ts

@@ -51,7 +51,9 @@ interface Mapping {
     chain_index_label_seq_id: Map<ChainIndex, Map<string | number, ResidueIndex>>,
 
     auth_asym_id_auth_seq_id: Map<string, Map<number, ChainIndex>>,
-    chain_index_auth_seq_id: Map<ChainIndex, Map<string | number, ResidueIndex>>
+    chain_index_auth_seq_id: Map<ChainIndex, Map<string | number, ResidueIndex>>,
+
+    label_asym_id: Map<string, EntityIndex>,
 }
 
 function createMapping(entities: Entities, data: AtomicData, segments: AtomicSegments): Mapping {
@@ -67,6 +69,7 @@ function createMapping(entities: Entities, data: AtomicData, segments: AtomicSeg
         chain_index_label_seq_id: new Map(),
         auth_asym_id_auth_seq_id: new Map(),
         chain_index_auth_seq_id: new Map(),
+        label_asym_id: new Map(),
     };
 }
 
@@ -79,6 +82,11 @@ class Index implements AtomicIndex {
         return this.map.chain_index_entity_index[cI];
     }
 
+    findEntity(label_asym_id: string): EntityIndex {
+        const entityIndex = this.map.label_asym_id.get(label_asym_id)
+        return entityIndex !== undefined ? entityIndex : -1 as EntityIndex
+    }
+
     findChainLabel(key: AtomicIndex.ChainLabelKey): ChainIndex {
         const eI = this.entityIndex(key.label_entity_id);
         if (eI < 0 || !this.map.entity_index_label_asym_id.has(eI)) return -1 as ChainIndex;
@@ -216,7 +224,9 @@ export function getAtomicIndex(data: AtomicData, entities: Entities, segments: A
             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);
+        const labelAsymId = label_asym_id.value(chainIndex)
+        if (!map.label_asym_id.has(labelAsymId)) map.label_asym_id.set(labelAsymId, entityIndex);
+        updateMapMapIndex(map.entity_index_label_asym_id, entityIndex, labelAsymId, chainIndex);
 
         const chain_index_label_seq_id = new Map<string | number, ResidueIndex>();
         const chain_index_auth_seq_id = new Map<string | number, ResidueIndex>();