molstar
Version:
A comprehensive macromolecular library.
215 lines • 10.9 kB
JavaScript
/**
* Copyright (c) 2020 mol* contributors, licensed under MIT, See LICENSE file for more info.
*
* @author David Sehnal <david.sehnal@gmail.com>
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.G3dLabelProvider = exports.g3dRegionQuery = exports.g3dChromosomeQuery = exports.g3dHaplotypeQuery = exports.G3dInfoDataProperty = exports.G3dSymbols = exports.trajectoryFromG3D = void 0;
var tslib_1 = require("tslib");
var db_1 = require("../../mol-data/db");
var int_1 = require("../../mol-data/int");
var linear_algebra_1 = require("../../mol-math/linear-algebra");
var parser_1 = require("../../mol-model-formats/structure/basic/parser");
var schema_1 = require("../../mol-model-formats/structure/basic/schema");
var entity_1 = require("../../mol-model-formats/structure/common/entity");
var loci_1 = require("../../mol-model/loci");
var structure_1 = require("../../mol-model/structure");
var builder_1 = require("../../mol-script/language/builder");
var symbol_1 = require("../../mol-script/language/symbol");
var type_1 = require("../../mol-script/language/type");
var base_1 = require("../../mol-script/runtime/query/base");
var mol_task_1 = require("../../mol-task");
var object_1 = require("../../mol-util/object");
var property_1 = require("../../mol-model-formats/structure/common/property");
function getColumns(block) {
var data = block.data;
var size = 0;
(0, object_1.objectForEach)(data, function (h) { return (0, object_1.objectForEach)(h, function (g) { return size += g.start.length; }); });
var normalized = {
entity_id: new Array(size),
chromosome: new Array(size),
seq_id_begin: new Int32Array(size),
seq_id_end: new Int32Array(size),
start: new Int32Array(size),
x: new Float32Array(size),
y: new Float32Array(size),
z: new Float32Array(size),
r: new Float32Array(size),
haplotype: new Array(size)
};
var p = [(0, linear_algebra_1.Vec3)(), (0, linear_algebra_1.Vec3)(), (0, linear_algebra_1.Vec3)()];
var o = 0;
(0, object_1.objectForEach)(data, function (hs, h) {
(0, object_1.objectForEach)(hs, function (chs, ch) {
var entity_id = ch + "-" + h;
var l = chs.start.length;
if (l === 0)
return;
var x = chs.x[0];
var y = chs.y[0];
var z = chs.z[0];
linear_algebra_1.Vec3.set(p[0], x, y, z);
linear_algebra_1.Vec3.set(p[2], x, y, z);
for (var i = 0; i < l; i++) {
normalized.entity_id[o] = entity_id;
normalized.chromosome[o] = ch;
normalized.start[o] = chs.start[i];
normalized.seq_id_begin[o] = o;
normalized.seq_id_end[o] = o;
x = chs.x[i];
y = chs.y[i];
z = chs.z[i];
linear_algebra_1.Vec3.set(p[1], x, y, z);
if (i + 1 < l)
linear_algebra_1.Vec3.set(p[2], chs.x[i + 1], chs.y[i + 1], chs.z[i + 1]);
else
linear_algebra_1.Vec3.set(p[2], x, y, z);
normalized.x[o] = x;
normalized.y[o] = y;
normalized.z[o] = z;
normalized.r[o] = 2 / 3 * Math.min(linear_algebra_1.Vec3.distance(p[0], p[1]), linear_algebra_1.Vec3.distance(p[1], p[2]));
normalized.haplotype[o] = h;
var _p = p[0];
p[0] = p[1];
p[1] = _p;
o++;
}
if (l === 1) {
normalized.r[o - 1] = 1;
}
});
});
return normalized;
}
function getTraj(ctx, data) {
return (0, tslib_1.__awaiter)(this, void 0, void 0, function () {
var normalized, rowCount, entityIds, entityBuilder, eName, i, e, entityId, ihm_sphere_obj_site, basic, models;
return (0, tslib_1.__generator)(this, function (_a) {
switch (_a.label) {
case 0:
normalized = getColumns(data);
rowCount = normalized.seq_id_begin.length;
entityIds = new Array(rowCount);
entityBuilder = new entity_1.EntityBuilder();
eName = { customName: '' };
for (i = 0; i < rowCount; ++i) {
e = normalized.entity_id[i];
eName.customName = e;
entityId = entityBuilder.getEntityId(e, 7 /* DNA */, e, eName);
entityIds[i] = entityId;
}
ihm_sphere_obj_site = db_1.Table.ofPartialColumns(schema_1.BasicSchema.ihm_sphere_obj_site, {
id: db_1.Column.range(0, rowCount),
entity_id: db_1.Column.ofStringArray(entityIds),
seq_id_begin: db_1.Column.ofIntArray(normalized.seq_id_begin),
seq_id_end: db_1.Column.ofIntArray(normalized.seq_id_end),
asym_id: db_1.Column.ofStringArray(normalized.chromosome),
Cartn_x: db_1.Column.ofFloatArray(normalized.x),
Cartn_y: db_1.Column.ofFloatArray(normalized.y),
Cartn_z: db_1.Column.ofFloatArray(normalized.z),
object_radius: db_1.Column.ofFloatArray(normalized.r),
rmsf: db_1.Column.ofConst(0, rowCount, db_1.Column.Schema.float),
model_id: db_1.Column.ofConst(1, rowCount, db_1.Column.Schema.int),
}, rowCount);
basic = (0, schema_1.createBasic)({
entity: entityBuilder.getEntityTable(),
ihm_model_list: db_1.Table.ofPartialColumns(schema_1.BasicSchema.ihm_model_list, {
model_id: db_1.Column.ofIntArray([1]),
model_name: db_1.Column.ofStringArray(['G3D Model']),
}, 1),
ihm_sphere_obj_site: ihm_sphere_obj_site
});
return [4 /*yield*/, (0, parser_1.createModels)(basic, { kind: 'g3d', name: 'G3D', data: data }, ctx)];
case 1:
models = _a.sent();
exports.G3dInfoDataProperty.set(models.representative, {
haplotypes: Object.keys(data.data),
haplotype: normalized.haplotype,
resolution: data.resolution,
start: normalized.start,
chroms: normalized.chromosome,
});
return [2 /*return*/, models];
}
});
});
}
function trajectoryFromG3D(data) {
var _this = this;
return mol_task_1.Task.create('Parse G3D', function (ctx) { return (0, tslib_1.__awaiter)(_this, void 0, void 0, function () {
return (0, tslib_1.__generator)(this, function (_a) {
return [2 /*return*/, getTraj(ctx, data)];
});
}); });
}
exports.trajectoryFromG3D = trajectoryFromG3D;
exports.G3dSymbols = {
haplotype: base_1.QuerySymbolRuntime.Dynamic((0, symbol_1.CustomPropSymbol)('g3d', 'haplotype', type_1.Type.Str), function (ctx) {
if (structure_1.Unit.isAtomic(ctx.element.unit))
return '';
var info = exports.G3dInfoDataProperty.get(ctx.element.unit.model);
if (!info)
return '';
var seqId = ctx.element.unit.model.coarseHierarchy.spheres.seq_id_begin.value(ctx.element.element);
return info.haplotype[seqId] || '';
}),
chromosome: base_1.QuerySymbolRuntime.Dynamic((0, symbol_1.CustomPropSymbol)('g3d', 'chromosome', type_1.Type.Str), function (ctx) {
if (structure_1.Unit.isAtomic(ctx.element.unit))
return '';
var asym_id = ctx.element.unit.model.coarseHierarchy.spheres.asym_id;
return asym_id.value(ctx.element.element) || '';
}),
region: base_1.QuerySymbolRuntime.Dynamic((0, symbol_1.CustomPropSymbol)('g3d', 'region', type_1.Type.Num), function (ctx) {
if (structure_1.Unit.isAtomic(ctx.element.unit))
return '';
var info = exports.G3dInfoDataProperty.get(ctx.element.unit.model);
if (!info)
return 0;
var seqId = ctx.element.unit.model.coarseHierarchy.spheres.seq_id_begin.value(ctx.element.element);
return info.start[seqId] || 0;
})
};
exports.G3dInfoDataProperty = property_1.FormatPropertyProvider.create({ name: 'g3d_info' });
function g3dHaplotypeQuery(haplotype) {
return builder_1.MolScriptBuilder.struct.generator.atomGroups({
'chain-test': builder_1.MolScriptBuilder.core.rel.eq([exports.G3dSymbols.haplotype.symbol(), haplotype]),
});
}
exports.g3dHaplotypeQuery = g3dHaplotypeQuery;
function g3dChromosomeQuery(chr) {
return builder_1.MolScriptBuilder.struct.generator.atomGroups({
'chain-test': builder_1.MolScriptBuilder.core.logic.and([
builder_1.MolScriptBuilder.core.rel.eq([builder_1.MolScriptBuilder.ammp('objectPrimitive'), 'sphere']),
builder_1.MolScriptBuilder.core.rel.eq([exports.G3dSymbols.chromosome.symbol(), chr])
])
});
}
exports.g3dChromosomeQuery = g3dChromosomeQuery;
function g3dRegionQuery(chr, start, end) {
return builder_1.MolScriptBuilder.struct.generator.atomGroups({
'chain-test': builder_1.MolScriptBuilder.core.logic.and([
builder_1.MolScriptBuilder.core.rel.eq([builder_1.MolScriptBuilder.ammp('objectPrimitive'), 'sphere']),
builder_1.MolScriptBuilder.core.rel.eq([exports.G3dSymbols.chromosome.symbol(), chr])
]),
'residue-test': builder_1.MolScriptBuilder.core.rel.inRange([exports.G3dSymbols.region.symbol(), start, end])
});
}
exports.g3dRegionQuery = g3dRegionQuery;
;
exports.G3dLabelProvider = {
label: function (e) {
if (e.kind !== 'element-loci' || loci_1.Loci.isEmpty(e))
return;
var first = e.elements[0];
if (e.elements.length !== 1 || structure_1.Unit.isAtomic(first.unit))
return;
var info = exports.G3dInfoDataProperty.get(first.unit.model);
if (!info)
return;
var eI = first.unit.elements[int_1.OrderedSet.getAt(first.indices, 0)];
var seqId = first.unit.model.coarseHierarchy.spheres.seq_id_begin.value(eI);
return "<b>Start:</b> " + info.start[seqId] + " <small>| resolution " + info.resolution + "<small>";
}
};
//# sourceMappingURL=model.js.map
;