molstar
Version:
A comprehensive macromolecular library.
108 lines (107 loc) • 4.93 kB
JavaScript
"use strict";
/**
* Copyright (c) 2018-2019 mol* contributors, licensed under MIT, See LICENSE file for more info.
*
* @author David Sehnal <david.sehnal@gmail.com>
* @author Alexander Rose <alexander.rose@weirdbyte.de>
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.StructureSequence = void 0;
const db_1 = require("../../../../mol-data/db");
const sequence_1 = require("../../../sequence");
var StructureSequence;
(function (StructureSequence) {
const Empty = { byEntityKey: {}, sequences: [] };
function merge(...entitySeqs) {
const sequences = [];
const byEntityKey = {};
for (let i = 0, il = entitySeqs.length; i < il; ++i) {
sequences.push(...entitySeqs[i].sequences);
Object.assign(byEntityKey, entitySeqs[i].byEntityKey);
}
return { sequences, byEntityKey };
}
function fromHierarchy(entities, atomicHierarchy, coarseHierarchy) {
const atomic = fromAtomicHierarchy(entities, atomicHierarchy);
const coarse = coarseHierarchy.isDefined ? fromCoarseHierarchy(entities, coarseHierarchy) : Empty;
return merge(atomic, coarse);
}
StructureSequence.fromHierarchy = fromHierarchy;
function fromAtomicHierarchy(entities, hierarchy) {
const { label_comp_id } = hierarchy.atoms;
const { label_seq_id } = hierarchy.residues;
const { chainAtomSegments, residueAtomSegments } = hierarchy;
const { count, offsets } = chainAtomSegments;
const byEntityKey = {};
const sequences = [];
// check if chain segments are empty
if (count === 1 && offsets[0] === 0 && offsets[1] === 0) {
return { byEntityKey, sequences };
}
for (let cI = 0, _cI = hierarchy.chains._rowCount; cI < _cI; cI++) {
const entityKey = hierarchy.index.getEntityFromChain(cI);
// Only for polymers, trying to mirror _entity_poly_seq
if (byEntityKey[entityKey] !== void 0 || entities.data.type.value(entityKey) !== 'polymer')
continue;
const start = cI;
cI++;
while (cI < _cI && entityKey === hierarchy.index.getEntityFromChain(cI) && entities.data.type.value(entityKey) !== 'polymer') {
cI++;
}
cI--;
const rStart = residueAtomSegments.index[offsets[start]];
const rEnd = residueAtomSegments.index[offsets[cI + 1] - 1] + 1;
const seqId = db_1.Column.window(label_seq_id, rStart, rEnd);
const _compId = [];
for (let rI = rStart; rI < rEnd; ++rI) {
_compId.push(label_comp_id.value(residueAtomSegments.offsets[rI]));
}
const compId = db_1.Column.ofStringArray(_compId);
byEntityKey[entityKey] = {
entityId: entities.data.id.value(entityKey),
sequence: sequence_1.Sequence.ofResidueNames(compId, seqId)
};
sequences.push(byEntityKey[entityKey]);
}
return { byEntityKey, sequences };
}
StructureSequence.fromAtomicHierarchy = fromAtomicHierarchy;
function fromCoarseHierarchy(entities, hierarchy) {
const spheres = fromCoarseElements(entities, hierarchy.spheres);
const gaussians = fromCoarseElements(entities, hierarchy.gaussians);
return merge(spheres, gaussians);
}
StructureSequence.fromCoarseHierarchy = fromCoarseHierarchy;
function fromCoarseElements(entities, elements) {
const { chainElementSegments, seq_id_begin, seq_id_end } = elements;
const { count, offsets } = chainElementSegments;
const byEntityKey = {};
const sequences = [];
// check if chain segments are empty
if (count === 1 && offsets[0] === 0 && offsets[1] === 0) {
return { byEntityKey, sequences };
}
for (let cI = 0, _cI = count; cI < _cI; cI++) {
const eK = elements.getEntityFromChain(cI);
if (byEntityKey[eK] !== void 0)
continue;
const start = cI;
cI++;
while (cI < _cI && eK === elements.getEntityFromChain(cI)) {
cI++;
}
cI--;
const eStart = offsets[start];
const eEnd = offsets[cI + 1] - 1;
const seqIdBegin = db_1.Column.window(seq_id_begin, eStart, eEnd);
const seqIdEnd = db_1.Column.window(seq_id_end, eStart, eEnd);
byEntityKey[eK] = {
entityId: entities.data.id.value(eK),
sequence: sequence_1.Sequence.ofSequenceRanges(seqIdBegin, seqIdEnd)
};
sequences.push(byEntityKey[eK]);
}
return { byEntityKey, sequences };
}
StructureSequence.fromCoarseElements = fromCoarseElements;
})(StructureSequence || (exports.StructureSequence = StructureSequence = {}));