From a2bf489017f28f5d2863c159883ef85577c60b7f Mon Sep 17 00:00:00 2001
From: David Sehnal <david.sehnal@gmail.com>
Date: Mon, 25 May 2020 03:52:35 +0200
Subject: [PATCH] fix bond ordering when creating structure from Topology

---
 src/mol-model/structure/model/model.ts | 14 ++++++++++++--
 1 file changed, 12 insertions(+), 2 deletions(-)

diff --git a/src/mol-model/structure/model/model.ts b/src/mol-model/structure/model/model.ts
index 68033af3b..0f490fc5c 100644
--- a/src/mol-model/structure/model/model.ts
+++ b/src/mol-model/structure/model/model.ts
@@ -120,16 +120,26 @@ export namespace Model {
         return _trajectoryFromModelAndCoordinates(model, coordinates).trajectory;
     }
 
+    function invertIndex(xs: ArrayLike<number>) {
+        const ret = new Int32Array(xs.length);
+        for (let i = 0, _i = xs.length; i < _i; i++) {
+            ret[xs[i]] = i;
+        }
+        return ret;
+    }
+
     export function trajectoryFromTopologyAndCoordinates(topology: Topology, coordinates: Coordinates): Task<Trajectory> {
         return Task.create('Create Trajectory', async ctx => {
             const model = (await createModels(topology.basic, topology.sourceData, ctx))[0];
             if (!model) throw new Error('found no model');
             const { trajectory, srcIndexArray } = _trajectoryFromModelAndCoordinates(model, coordinates);
 
+            // TODO: cache the inverted index somewhere?
+            const invertedIndex = srcIndexArray ? invertIndex(srcIndexArray) : void 0;
             const pairs = srcIndexArray
                 ? {
-                    indexA: Column.ofIntArray(Column.mapToArray(topology.bonds.indexA, i => srcIndexArray[i], Int32Array)),
-                    indexB: Column.ofIntArray(Column.mapToArray(topology.bonds.indexB, i => srcIndexArray[i], Int32Array)),
+                    indexA: Column.ofIntArray(Column.mapToArray(topology.bonds.indexA, i => invertedIndex![i], Int32Array)),
+                    indexB: Column.ofIntArray(Column.mapToArray(topology.bonds.indexB, i => invertedIndex![i], Int32Array)),
                     order: topology.bonds.order
                 }
                 : topology.bonds;
-- 
GitLab