molstar
Version:
A comprehensive macromolecular library.
94 lines (93 loc) • 4.18 kB
JavaScript
/**
* Copyright (c) 2020 mol* contributors, licensed under MIT, See LICENSE file for more info.
*
* @author Alexander Rose <alexander.rose@weirdbyte.de>
*/
import { Unit } from '../../structure/structure';
import { align } from './alignment';
import { OrderedSet } from '../../../mol-data/int';
export { AlignSequences };
var AlignSequences;
(function (AlignSequences) {
function createSeqIdIndicesMap(element) {
var seqIds = new Map();
if (Unit.isAtomic(element.unit)) {
var label_seq_id = element.unit.model.atomicHierarchy.residues.label_seq_id;
var residueIndex = element.unit.residueIndex;
for (var i = 0, il = OrderedSet.size(element.indices); i < il; ++i) {
var uI = OrderedSet.getAt(element.indices, i);
var eI = element.unit.elements[uI];
var seqId = label_seq_id.value(residueIndex[eI]);
if (seqIds.has(seqId))
seqIds.get(seqId).push(uI);
else
seqIds.set(seqId, [uI]);
}
}
else if (Unit.isCoarse(element.unit)) {
var seq_id_begin = (Unit.isSpheres(element.unit)
? element.unit.model.coarseHierarchy.spheres
: element.unit.model.coarseHierarchy.gaussians).seq_id_begin;
for (var i = 0, il = OrderedSet.size(element.indices); i < il; ++i) {
var uI = OrderedSet.getAt(element.indices, i);
var eI = element.unit.elements[uI];
var seqId = seq_id_begin.value(eI);
seqIds.set(seqId, [uI]);
}
}
return seqIds;
}
function compute(input, options) {
if (options === void 0) { options = {}; }
var seqA = getSequence(input.a.unit);
var seqB = getSequence(input.b.unit);
var seqIdIndicesA = createSeqIdIndicesMap(input.a);
var seqIdIndicesB = createSeqIdIndicesMap(input.b);
var indicesA = [];
var indicesB = [];
var _a = align(seqA.code.toArray(), seqB.code.toArray(), options), aliA = _a.aliA, aliB = _a.aliB, score = _a.score;
var seqIdxA = 0, seqIdxB = 0;
for (var i = 0, il = aliA.length; i < il; ++i) {
if (aliA[i] === '-' || aliB[i] === '-') {
if (aliA[i] !== '-')
seqIdxA += 1;
if (aliB[i] !== '-')
seqIdxB += 1;
continue;
}
var seqIdA = seqA.seqId.value(seqIdxA);
var seqIdB = seqB.seqId.value(seqIdxB);
if (seqIdIndicesA.has(seqIdA) && seqIdIndicesB.has(seqIdB)) {
var iA = seqIdIndicesA.get(seqIdA);
var iB = seqIdIndicesB.get(seqIdB);
// use min length to guard against alternate locations
for (var j = 0, jl = Math.min(iA.length, iB.length); j < jl; ++j) {
indicesA.push(iA[j]);
indicesB.push(iB[j]);
}
}
seqIdxA += 1, seqIdxB += 1;
}
var outA = OrderedSet.intersect(OrderedSet.ofSortedArray(indicesA), input.a.indices);
var outB = OrderedSet.intersect(OrderedSet.ofSortedArray(indicesB), input.b.indices);
return {
a: { unit: input.a.unit, indices: outA },
b: { unit: input.b.unit, indices: outB },
score: score
};
}
AlignSequences.compute = compute;
})(AlignSequences || (AlignSequences = {}));
function entityKey(unit) {
switch (unit.kind) {
case 0 /* Unit.Kind.Atomic */:
return unit.model.atomicHierarchy.index.getEntityFromChain(unit.chainIndex[unit.elements[0]]);
case 1 /* Unit.Kind.Spheres */:
return unit.model.coarseHierarchy.spheres.entityKey[unit.elements[0]];
case 2 /* Unit.Kind.Gaussians */:
return unit.model.coarseHierarchy.gaussians.entityKey[unit.elements[0]];
}
}
function getSequence(unit) {
return unit.model.sequence.byEntityKey[entityKey(unit)].sequence;
}