molstar
Version:
A comprehensive macromolecular library.
190 lines • 9.08 kB
JavaScript
"use strict";
/**
* Copyright (c) 2018-2020 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.ModelSecondaryStructure = void 0;
var types_1 = require("../../../mol-model/structure/model/types");
var atomic_1 = require("../../../mol-model/structure/model/properties/atomic");
var seconday_structure_1 = require("../../../mol-model/structure/model/properties/seconday-structure");
var property_1 = require("../common/property");
var ModelSecondaryStructure;
(function (ModelSecondaryStructure) {
ModelSecondaryStructure.Descriptor = {
name: 'model_secondary_structure',
};
ModelSecondaryStructure.Provider = property_1.FormatPropertyProvider.create(ModelSecondaryStructure.Descriptor);
function fromStruct(conf, sheetRange, hierarchy) {
var map = new Map();
var elements = [{ kind: 'none' }];
var coordinates = getCoordinateType(conf, sheetRange);
addHelices(conf, coordinates, map, elements);
// must add Helices 1st because of 'key' value assignment.
addSheets(sheetRange, coordinates, map, conf._rowCount, elements);
var n = hierarchy.residues._rowCount;
var getIndex = function (rI) { return rI; };
var secStruct = {
type: new Int32Array(n),
key: new Int32Array(n),
elements: elements
};
if (map.size > 0)
assignSecondaryStructureRanges(hierarchy, coordinates, map, secStruct);
return (0, seconday_structure_1.SecondaryStructure)(secStruct.type, secStruct.key, secStruct.elements, getIndex);
}
ModelSecondaryStructure.fromStruct = fromStruct;
})(ModelSecondaryStructure || (ModelSecondaryStructure = {}));
exports.ModelSecondaryStructure = ModelSecondaryStructure;
function getCoordinateType(conf, sheetRange) {
if (conf._rowCount > 0) {
if (conf.beg_label_seq_id.valueKind(0) !== 0 /* Present */ || conf.end_label_seq_id.valueKind(0) !== 0 /* Present */)
return 'auth';
}
else if (sheetRange) {
if (sheetRange.beg_label_seq_id.valueKind(0) !== 0 /* Present */ || sheetRange.end_label_seq_id.valueKind(0) !== 0 /* Present */)
return 'auth';
}
return 'label';
}
function addHelices(cat, coordinates, map, elements) {
if (!cat._rowCount)
return;
var beg_label_asym_id = cat.beg_label_asym_id, beg_label_seq_id = cat.beg_label_seq_id, beg_auth_seq_id = cat.beg_auth_seq_id, pdbx_beg_PDB_ins_code = cat.pdbx_beg_PDB_ins_code;
var end_label_seq_id = cat.end_label_seq_id, end_auth_seq_id = cat.end_auth_seq_id, pdbx_end_PDB_ins_code = cat.pdbx_end_PDB_ins_code;
var pdbx_PDB_helix_class = cat.pdbx_PDB_helix_class, conf_type_id = cat.conf_type_id, details = cat.details;
var beg_seq_id = coordinates === 'label' ? beg_label_seq_id : beg_auth_seq_id;
var end_seq_id = coordinates === 'label' ? end_label_seq_id : end_auth_seq_id;
for (var i = 0, _i = cat._rowCount; i < _i; i++) {
var type = types_1.SecondaryStructureType.create(pdbx_PDB_helix_class.valueKind(i) === 0 /* Present */
? types_1.SecondaryStructureType.SecondaryStructurePdb[pdbx_PDB_helix_class.value(i)]
: conf_type_id.valueKind(i) === 0 /* Present */
? types_1.SecondaryStructureType.SecondaryStructureMmcif[conf_type_id.value(i)]
: 536870912 /* NA */);
var element = {
kind: 'helix',
flags: type,
type_id: conf_type_id.valueKind(i) === 0 /* Present */ ? conf_type_id.value(i) : 'HELIX_P',
helix_class: pdbx_PDB_helix_class.value(i),
details: details.valueKind(i) === 0 /* Present */ ? details.value(i) : void 0
};
var entry = {
startSeqId: beg_seq_id.value(i),
startInsCode: pdbx_beg_PDB_ins_code.value(i),
endSeqId: end_seq_id.value(i),
endInsCode: pdbx_end_PDB_ins_code.value(i),
type: type,
key: elements.length
};
elements[elements.length] = element;
var asymId = beg_label_asym_id.value(i);
if (map.has(asymId)) {
var entries = map.get(asymId);
if (entries.has(entry.startSeqId)) {
entries.get(entry.startSeqId).push(entry);
}
else {
entries.set(entry.startSeqId, [entry]);
}
}
else {
map.set(asymId, new Map([[entry.startSeqId, [entry]]]));
}
}
}
function addSheets(cat, coordinates, map, sheetCount, elements) {
if (!cat._rowCount)
return;
var beg_label_asym_id = cat.beg_label_asym_id, beg_label_seq_id = cat.beg_label_seq_id, beg_auth_seq_id = cat.beg_auth_seq_id, pdbx_beg_PDB_ins_code = cat.pdbx_beg_PDB_ins_code;
var end_label_seq_id = cat.end_label_seq_id, end_auth_seq_id = cat.end_auth_seq_id, pdbx_end_PDB_ins_code = cat.pdbx_end_PDB_ins_code;
var sheet_id = cat.sheet_id;
var beg_seq_id = coordinates === 'label' ? beg_label_seq_id : beg_auth_seq_id;
var end_seq_id = coordinates === 'label' ? end_label_seq_id : end_auth_seq_id;
var sheet_id_key = new Map();
var currentKey = sheetCount + 1;
for (var i = 0, _i = cat._rowCount; i < _i; i++) {
var id = sheet_id.value(i);
var key = void 0;
if (sheet_id_key.has(id))
key = sheet_id_key.get(id);
else {
key = currentKey++;
sheet_id_key.set(id, key);
}
var type = types_1.SecondaryStructureType.create(4 /* Beta */ | 8388608 /* BetaSheet */);
var element = {
kind: 'sheet',
flags: type,
sheet_id: id,
symmetry: void 0
};
var entry = {
startSeqId: beg_seq_id.value(i),
startInsCode: pdbx_beg_PDB_ins_code.value(i),
endSeqId: end_seq_id.value(i),
endInsCode: pdbx_end_PDB_ins_code.value(i),
type: type,
key: elements.length
};
elements[elements.length] = element;
var asymId = beg_label_asym_id.value(i);
if (map.has(asymId)) {
var entries = map.get(asymId);
if (entries.has(entry.startSeqId)) {
entries.get(entry.startSeqId).push(entry);
}
else {
entries.set(entry.startSeqId, [entry]);
}
}
else {
map.set(asymId, new Map([[entry.startSeqId, [entry]]]));
}
}
return;
}
function assignSecondaryStructureEntry(hierarchy, coordinates, entry, resStart, resEnd, data) {
var _a = hierarchy.residues, auth_seq_id = _a.auth_seq_id, label_seq_id = _a.label_seq_id, pdbx_PDB_ins_code = _a.pdbx_PDB_ins_code;
var endSeqId = entry.endSeqId, endInsCode = entry.endInsCode, key = entry.key, type = entry.type;
var seq_id = coordinates === 'label' ? label_seq_id : auth_seq_id;
var rI = resStart;
while (rI < resEnd) {
var seqNumber = seq_id.value(rI);
data.type[rI] = type;
data.key[rI] = key;
if ((seqNumber > endSeqId) ||
(seqNumber === endSeqId && pdbx_PDB_ins_code.value(rI) === endInsCode)) {
break;
}
rI++;
}
}
function assignSecondaryStructureRanges(hierarchy, coordinates, map, data) {
var chainCount = hierarchy.chainAtomSegments.count;
var label_asym_id = hierarchy.chains.label_asym_id;
var _a = hierarchy.residues, auth_seq_id = _a.auth_seq_id, label_seq_id = _a.label_seq_id, pdbx_PDB_ins_code = _a.pdbx_PDB_ins_code;
var seq_id = coordinates === 'label' ? label_seq_id : auth_seq_id;
for (var cI = 0; cI < chainCount; cI++) {
var resStart = atomic_1.AtomicHierarchy.chainStartResidueIndex(hierarchy, cI), resEnd = atomic_1.AtomicHierarchy.chainEndResidueIndexExcl(hierarchy, cI);
var asymId = label_asym_id.value(cI);
if (map.has(asymId)) {
var entries = map.get(asymId);
for (var rI = resStart; rI < resEnd; rI++) {
var seqId = seq_id.value(rI);
if (entries.has(seqId)) {
var entryList = entries.get(seqId);
for (var _b = 0, entryList_1 = entryList; _b < entryList_1.length; _b++) {
var entry = entryList_1[_b];
var insCode = pdbx_PDB_ins_code.value(rI);
if (entry.startInsCode !== insCode)
continue;
assignSecondaryStructureEntry(hierarchy, coordinates, entry, rI, resEnd, data);
}
}
}
}
}
}
//# sourceMappingURL=secondary-structure.js.map