Browse Source

BinaryCIF decoding tweaks

David Sehnal 7 years ago
parent
commit
4627b9ada5
2 changed files with 18 additions and 19 deletions
  1. 15 16
      src/mol-io/common/binary-cif/decoder.ts
  2. 3 3
      src/perf-tests/structure.ts

+ 15 - 16
src/mol-io/common/binary-cif/decoder.ts

@@ -137,7 +137,7 @@ function runLength(data: Int32Array, encoding: Encoding.RunLength) {
 function delta(data: (Int8Array | Int16Array | Int32Array), encoding: Encoding.Delta) {
     let n = data.length;
     let output = getIntArray(encoding.srcType, n);
-    if (!n) return output;
+    if (!n) return data;
     output[0] = data[0] + (encoding.origin | 0);
     for (let i = 1; i < n; ++i) {
         output[i] = data[i] + output[i - 1];
@@ -189,26 +189,25 @@ function integerPackingUnsigned(data: (Int8Array | Int16Array), encoding: Encodi
 }
 
 function integerPacking(data: (Int8Array | Int16Array), encoding: Encoding.IntegerPacking) {
+    if (data.length === encoding.srcSize) return data;
     return encoding.isUnsigned ? integerPackingUnsigned(data, encoding) : integerPackingSigned(data, encoding);
 }
 
 function stringArray(data: Uint8Array, encoding: Encoding.StringArray) {
-    let str = encoding.stringData;
-    let offsets = decode({ encoding: encoding.offsetEncoding, data: encoding.offsets });
-    let indices = decode({ encoding: encoding.dataEncoding, data });
-    let cache = [];
-    let result = new Array(indices.length);
+    const offsets = decode({ encoding: encoding.offsetEncoding, data: encoding.offsets });
+    const indices = decode({ encoding: encoding.dataEncoding, data });
+
+    const str = encoding.stringData;
+    const strings = new Array(offsets.length);
+    strings[0] = '';
+    for (let i = 1, _i = offsets.length; i < _i; i++) {
+        strings[i] = str.substring(offsets[i - 1], offsets[i]);
+    }
+
     let offset = 0;
-    for (let i of indices) {
-        if (i < 0) {
-            result[offset++] = '';
-        } else if (i >= cache.length) {
-            const v = str.substring(offsets[i], offsets[i + 1]);
-            cache[i] = v;
-            result[offset++] = v
-        } else {
-            result[offset++] = cache[i];
-        }
+    const result = new Array(indices.length);
+    for (const i of indices) {
+        result[offset++] = strings[i + 1];
     }
     return result;
 }

+ 3 - 3
src/perf-tests/structure.ts

@@ -239,8 +239,8 @@ export namespace PropertyAccess {
 
     export async function run() {
         //const { structures, models } = await readCIF('./examples/1cbs_full.bcif');
-        //const { structures, models } = await readCIF('e:/test/quick/3j3q_full.bcif');
-        const { structures, models } = await readCIF('e:/test/quick/1cbs_updated.cif');
+        const { structures, models } = await readCIF('e:/test/quick/3j3q_full.bcif');
+        //const { structures, models } = await readCIF('e:/test/quick/1cbs_updated.cif');
 
         //const { structures, models } = await readCIF('e:/test/molstar/3j3q.bcif');
 
@@ -287,7 +287,7 @@ export namespace PropertyAccess {
             residueTest: Q.pred.eq(P.residue.auth_comp_id, 'ALA')
         });
         const q0r = q(structures[0]);
-        console.log(to_mmCIF('test', Selection.union(q0r)));
+        //console.log(to_mmCIF('test', Selection.union(q0r)));
 
         console.time('q1')
         q1(structures[0]);