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