Browse Source

fix use of invariant positions when calculation interactions

Alexander Rose 5 years ago
parent
commit
9f7b96c727

+ 5 - 9
src/mol-model-props/computed/interactions/charged.ts

@@ -240,22 +240,18 @@ const tmpVecD = Vec3()
 function getNormal(out: Vec3, info: Features.Info) {
     const { unit, feature, offsets, members } = info
     const { elements } = unit
-    const { x, y, z } = unit.model.atomicConformation
 
     const i = offsets[feature]
-    const aI = elements[members[i]]
-    const bI = elements[members[i + 1]]
-    const cI = elements[members[i + 2]]
-    Vec3.set(tmpVecA, x[aI], y[aI], z[aI])
-    Vec3.set(tmpVecB, x[bI], y[bI], z[bI])
-    Vec3.set(tmpVecC, x[cI], y[cI], z[cI])
+    info.unit.conformation.position(elements[members[i]], tmpVecA)
+    info.unit.conformation.position(elements[members[i + 1]], tmpVecB)
+    info.unit.conformation.position(elements[members[i + 2]], tmpVecC)
 
     return Vec3.triangleNormal(out, tmpVecA, tmpVecB, tmpVecC)
 }
 
 const getOffset = function (infoA: Features.Info, infoB: Features.Info, normal: Vec3) {
-    Vec3.set(tmpVecA, infoA.x[infoA.feature], infoA.y[infoA.feature], infoA.z[infoA.feature])
-    Vec3.set(tmpVecB, infoB.x[infoB.feature], infoB.y[infoB.feature], infoB.z[infoB.feature])
+    Features.position(tmpVecA, infoA)
+    Features.position(tmpVecB, infoB)
 
     Vec3.sub(tmpVecC, tmpVecA, tmpVecB)
 

+ 2 - 8
src/mol-model-props/computed/interactions/contacts.ts

@@ -65,12 +65,6 @@ function isMember(element: StructureElement.UnitIndex, info: Features.Info) {
     return false
 }
 
-function setPosition(out: Vec3, info: Features.Info) {
-    Vec3.set(out, info.x[info.feature], info.y[info.feature], info.z[info.feature])
-    Vec3.transformMat4(out, out, info.unit.conformation.operator.matrix)
-    return out
-}
-
 const tmpVec = Vec3()
 const tmpVecA = Vec3()
 const tmpVecB = Vec3()
@@ -81,8 +75,8 @@ function checkLineOfSight(structure: Structure, infoA: Features.Info, infoB: Fea
     const indexA = infoA.members[infoA.offsets[featureA]]
     const indexB = infoB.members[infoB.offsets[featureB]]
 
-    setPosition(tmpVecA, infoA)
-    setPosition(tmpVecB, infoB)
+    Features.position(tmpVecA, infoA)
+    Features.position(tmpVecB, infoB)
     Vec3.scale(tmpVec, Vec3.add(tmpVec, tmpVecA, tmpVecB), 0.5)
 
     const distMax = distFactor * MAX_LINE_OF_SIGHT_DISTANCE

+ 16 - 0
src/mol-model-props/computed/interactions/features.ts

@@ -161,6 +161,22 @@ namespace Features {
         }
     }
 
+    export function position(out: Vec3, info: Info) {
+        Vec3.set(out, info.x[info.feature], info.y[info.feature], info.z[info.feature])
+        Vec3.transformMat4(out, out, info.unit.conformation.operator.matrix)
+        return out
+    }
+
+    const tmpVecA = Vec3()
+    const tmpVecB = Vec3()
+    export function distance(infoA: Info, infoB: Info) {
+        const elementA = infoA.members[infoA.offsets[infoA.feature]]
+        const elementB = infoB.members[infoB.offsets[infoB.feature]]
+        infoA.unit.conformation.position(infoA.unit.elements[elementA], tmpVecA)
+        infoB.unit.conformation.position(infoB.unit.elements[elementB], tmpVecB)
+        return Vec3.distance(tmpVecA, tmpVecB)
+    }
+
     export interface Provider {
         types: Set<FeatureType>
         add: (structure: Structure, unit: Unit.Atomic, featuresBuilder: FeaturesBuilder) => void

+ 2 - 8
src/mol-model-props/computed/interactions/refine.ts

@@ -8,7 +8,6 @@
 
 import { Interactions } from './interactions';
 import { InteractionType, InteractionFlag, InteractionsIntraContacts, FeatureType, InteractionsInterContacts } from './common';
-import { Vec3 } from '../../../mol-math/linear-algebra';
 import { Unit, Structure } from '../../../mol-model/structure';
 import { Features } from './features';
 
@@ -91,22 +90,17 @@ function hydrophobicRefiner(structure: Structure, interactions: Interactions): C
         }
     }
 
-    const pA = Vec3()
-    const pB = Vec3()
-
     function handleEdge(edge: number, infoA: Features.Info, infoB: Features.Info, map: Map<string, [number, number]>, set: (i: number) => void) {
         const elementA = infoA.members[infoA.offsets[infoA.feature]]
         const elementB = infoB.members[infoB.offsets[infoB.feature]]
         const residueA = infoA.unit.getResidueIndex(elementA)
         const residueB = infoB.unit.getResidueIndex(elementB)
 
-        infoA.unit.conformation.position(infoA.unit.elements[elementA], pA)
-        infoB.unit.conformation.position(infoB.unit.elements[elementB], pB)
-        const dist = Vec3.distance(pA, pB)
-
         const keyA = `${elementA}|${infoA.unit.id}|${residueB}|${infoB.unit.id}|A`
         const keyB = `${elementB}|${infoB.unit.id}|${residueA}|${infoA.unit.id}|B`
 
+        const dist = Features.distance(infoA, infoB)
+
         handleResidueContact(dist, edge, keyA, map, set)
         handleResidueContact(dist, edge, keyB, map, set)
     }