From e02fefa6b45e128abeb774ec5abe66779e3153f9 Mon Sep 17 00:00:00 2001
From: Sebastian Bittrich <bittrich@hs-mittweida.de>
Date: Fri, 22 Mar 2019 14:45:02 -0700
Subject: [PATCH] 4x speedup by limiting # of sphere points to original value

---
 .../unit/accessible-surface-area/compute.ts   | 40 +++++++++++++++----
 .../color/accessible-surface-area.ts          |  2 +-
 src/tests/browser/render-structure.ts         |  4 +-
 3 files changed, 37 insertions(+), 9 deletions(-)

diff --git a/src/mol-model/structure/structure/unit/accessible-surface-area/compute.ts b/src/mol-model/structure/structure/unit/accessible-surface-area/compute.ts
index 4fa2225a7..e456b4abb 100644
--- a/src/mol-model/structure/structure/unit/accessible-surface-area/compute.ts
+++ b/src/mol-model/structure/structure/unit/accessible-surface-area/compute.ts
@@ -42,8 +42,12 @@ function normalizeAccessibleSurfaceArea(ctx: AccessibleSurfaceAreaContext) {
 
 }
 
-// TODO compare performance of lookup and naive approach
-function computePerResidue(ctx: AccessibleSurfaceAreaContext) {
+/**
+ * notes on performance - scenario: compute for first 10 units of 3j3q
+ * lookup3d + refinement: ~5000ms
+ * naive approach: ~5600ms - higher variance
+ */
+function computePerResidue(ctx: AccessibleSurfaceAreaContext) { // runs at roughly 5000 ms
     const { atomRadius, accessibleSurfaceArea, maxLookupRadius, spherePoints, cons } = ctx;
     const { probeSize } = ctx.params;
     const { elements: atoms, residueIndex } = ctx.unit;
@@ -201,12 +205,34 @@ function initialize(unit: Unit.Atomic, params: AccessibleSurfaceAreaComputationP
     }
 }
 
+class Count {
+    static count = 10;
+    get count(): number {
+        return Count.count;
+    }
+    set count(v: number) {
+        Count.count = v;
+    }
+}
+
 function computeAccessibleSurfaceArea(unit: Unit.Atomic, params?: Partial<AccessibleSurfaceAreaComputationParameters>): AccessibleSurfaceArea {
-    console.log(`computing accessible surface area for unit #${ unit.id + 1 }`);
-    return _computeAccessibleSurfaceArea(unit, {
-        numberOfSpherePoints: (params && params.numberOfSpherePoints) || 960,
-        probeSize: (params && params.probeSize) || 1.4
-    });
+    const count = new Count();
+    count.count = count.count - 1;
+    if (count.count > 0) {
+        console.log(`computing accessible surface area for unit #${ unit.id + 1 }`);
+        return _computeAccessibleSurfaceArea(unit, {
+            numberOfSpherePoints: (params && params.numberOfSpherePoints) || 92 /* original value Shrake, A. & Rupley, J. A. (1973) J. Mol. Biol. 79: 92, BioJava: 960, EPPIC: 3000 */ ,
+            /** 92: 1600ms, 960: 5000ms, 3000: 13000ms */
+            probeSize: (params && params.probeSize) || 1.4
+        });
+    } else {
+        return {
+            atomRadius: [],
+            accessibleSurfaceArea: [],
+            relativeAccessibleSurfaceArea: [],
+            buried: void 0
+        }
+    }
 }
 
 /** Creates a collection of points on a sphere by the Golden Section Spiral algorithm. */
diff --git a/src/mol-theme/color/accessible-surface-area.ts b/src/mol-theme/color/accessible-surface-area.ts
index 3593c7b76..b77fbc551 100644
--- a/src/mol-theme/color/accessible-surface-area.ts
+++ b/src/mol-theme/color/accessible-surface-area.ts
@@ -39,7 +39,7 @@ export function AccessibleSurfaceAreaColorTheme(ctx: ThemeDataContext, props: PD
         color = (location: Location): Color => {
             if (StructureElement.isLocation(location)) {
                 if (Unit.isAtomic(location.unit)) {
-                    const value = location.unit.accessibleSurfaceArea.relativeAccessibleSurfaceArea[location.unit.residueIndex[location.element]];
+                    const value = location.unit.accessibleSurfaceArea.accessibleSurfaceArea[location.unit.residueIndex[location.element]];
                     return value !== missingAccessibleSurfaceAreaValue ? scaleColor(value) : DefaultColor;
                 }
             }
diff --git a/src/tests/browser/render-structure.ts b/src/tests/browser/render-structure.ts
index c2b761936..82beabb01 100644
--- a/src/tests/browser/render-structure.ts
+++ b/src/tests/browser/render-structure.ts
@@ -61,17 +61,19 @@ function getCartoonRepr() {
 }
 
 async function init() {
-    const cif = await downloadFromPdb('1brr')
+    const cif = await downloadFromPdb('3j3q')
     const models = await getModels(cif)
 
     const structure = await getStructure(models[0])
     const cartoonRepr = getCartoonRepr()
 
+    console.time('ASA');
     cartoonRepr.setTheme({
         color: reprCtx.colorThemeRegistry.create('accessible-surface-area', { structure }),
         size: reprCtx.sizeThemeRegistry.create('uniform', { structure })
     })
     await cartoonRepr.createOrUpdate({ ...CartoonRepresentationProvider.defaultValues, quality: 'auto' }, structure).run()
+    console.timeEnd('ASA');
 
     // console.time('computeModelDSSP')
     // const secondaryStructure = computeModelDSSP(models[0].atomicHierarchy, models[0].atomicConformation)
-- 
GitLab