drugflow-molstar
Version:
Molstar implementation for DrugFlow
119 lines (118 loc) • 6.74 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.ContactRepresentation = exports.contactLabel = exports.ContactParams = void 0;
var tslib_1 = require("tslib");
// contact.ts
var loci_1 = require("molstar/lib/mol-model/loci");
var text_1 = require("molstar/lib/mol-geo/geometry/text/text");
var param_definition_1 = require("molstar/lib/mol-util/param-definition");
var names_1 = require("molstar/lib/mol-util/color/names");
var representation_1 = require("molstar/lib/mol-repr/shape/representation");
var representation_2 = require("molstar/lib/mol-repr/representation");
var shape_1 = require("molstar/lib/mol-model/shape");
var text_builder_1 = require("molstar/lib/mol-geo/geometry/text/text-builder");
var linear_algebra_1 = require("molstar/lib/mol-math/linear-algebra");
var marker_action_1 = require("molstar/lib/mol-util/marker-action");
var label_1 = require("molstar/lib/mol-theme/label");
var common_1 = require("molstar/lib/mol-repr/shape/loci/common");
var geometry_1 = require("molstar/lib/mol-math/geometry");
var cylinders_builder_1 = require("molstar/lib/mol-geo/geometry/cylinders/cylinders-builder");
var cylinders_1 = require("molstar/lib/mol-geo/geometry/cylinders/cylinders");
var label_2 = require("molstar/lib/mol-theme/label");
var SharedParams = {
unitLabel: param_definition_1.ParamDefinition.Text('\u212B', { isEssential: true }),
};
var CylinderParams = tslib_1.__assign(tslib_1.__assign(tslib_1.__assign({}, cylinders_1.Cylinders.Params), SharedParams), { lineSizeAttenuation: param_definition_1.ParamDefinition.Boolean(true), linesSize: param_definition_1.ParamDefinition.Numeric(0.075, { min: 0.01, max: 5, step: 0.01 }), dashLength: param_definition_1.ParamDefinition.Numeric(0.12, { min: 0.01, max: 0.2, step: 0.01 }), interactionType: param_definition_1.ParamDefinition.Text('', { isEssential: true }), cylinderColor: param_definition_1.ParamDefinition.Color(names_1.ColorNames.lightgreen, { isEssential: true }) });
var TextParams = tslib_1.__assign(tslib_1.__assign({}, common_1.LociLabelTextParams), SharedParams);
var ContactVisuals = {
cylinder: function (ctx, getParams) {
return (0, representation_1.ShapeRepresentation)(getCylindersShape, cylinders_1.Cylinders.Utils, {
modifyState: function (s) { return (tslib_1.__assign(tslib_1.__assign({}, s), { markerActions: marker_action_1.MarkerActions.Highlighting })); },
});
},
text: function (ctx, getParams) {
return (0, representation_1.ShapeRepresentation)(getTextShape, text_1.Text.Utils, {
modifyState: function (s) { return (tslib_1.__assign(tslib_1.__assign({}, s), { markerActions: marker_action_1.MarkerAction.None })); },
});
},
};
exports.ContactParams = tslib_1.__assign(tslib_1.__assign(tslib_1.__assign({}, CylinderParams), TextParams), { visuals: param_definition_1.ParamDefinition.MultiSelect(['cylinder', 'text'], param_definition_1.ParamDefinition.objectToOptions(ContactVisuals)) });
//
function contactLabel(pair, options) {
var _a;
if (options === void 0) { options = {}; }
var o = tslib_1.__assign(tslib_1.__assign({}, label_2.DefaultLabelOptions), options);
var label = (0, label_2.bundleLabel)(pair, o);
return "".concat((_a = o === null || o === void 0 ? void 0 : o.interactionType) !== null && _a !== void 0 ? _a : 'Distance', "</br>").concat(label);
}
exports.contactLabel = contactLabel;
function getContactState() {
return {
sphereA: (0, geometry_1.Sphere3D)(),
sphereB: (0, geometry_1.Sphere3D)(),
center: (0, linear_algebra_1.Vec3)(),
distance: 0,
};
}
function setContactState(pair, state) {
var sphereA = state.sphereA, sphereB = state.sphereB, center = state.center;
var _a = pair.loci, lociA = _a[0], lociB = _a[1];
loci_1.Loci.getBoundingSphere(lociA, sphereA);
loci_1.Loci.getBoundingSphere(lociB, sphereB);
linear_algebra_1.Vec3.add(center, sphereA.center, sphereB.center);
linear_algebra_1.Vec3.scale(center, center, 0.5);
state.distance = linear_algebra_1.Vec3.distance(sphereA.center, sphereB.center);
return state;
}
var tmpState = getContactState();
function getContactName(data, unitLabel) {
return data.pairs.length === 1
? "Contact ".concat((0, label_1.distanceLabel)(data.pairs[0], {
unitLabel: unitLabel,
measureOnly: true,
}))
: "".concat(data.pairs.length, " Contacts");
}
//
function buildCylinders(data, props, cylinders) {
var builder = cylinders_builder_1.CylindersBuilder.create(128, 64, cylinders);
for (var i = 0, il = data.pairs.length; i < il; ++i) {
setContactState(data.pairs[i], tmpState);
// TODO: radiusScale: number, topCap: boolean, bottomCap: boolean
builder.addFixedLengthDashes(tmpState.sphereA.center, tmpState.sphereB.center, props.dashLength, 1, true, true, i);
}
return builder.getCylinders();
}
function getCylindersShape(ctx, data, props, shape) {
var cylinders = buildCylinders(data, props, shape && shape.geometry);
var name = getContactName(data, props.unitLabel);
var getLabel = function (groupId) {
return contactLabel(data.pairs[groupId], props);
};
return shape_1.Shape.create(name, data, cylinders, function () { return props.cylinderColor; }, function () { return props.linesSize; }, getLabel);
}
//
function buildText(data, props, text) {
var builder = text_builder_1.TextBuilder.create(props, 128, 64, text);
for (var i = 0, il = data.pairs.length; i < il; ++i) {
setContactState(data.pairs[i], tmpState);
var center = tmpState.center, distance = tmpState.distance, sphereA = tmpState.sphereA, sphereB = tmpState.sphereB;
var label = props.customText || "".concat(distance.toFixed(2), " ").concat(props.unitLabel);
var radius = Math.max(2, sphereA.radius, sphereB.radius);
var scale = radius / 2;
builder.add(label, center[0], center[1], center[2], 1, scale, i);
}
return builder.getText();
}
function getTextShape(ctx, data, props, shape) {
var text = buildText(data, props, shape && shape.geometry);
var name = getContactName(data, props.unitLabel);
var getLabel = function (groupId) {
return (0, label_1.distanceLabel)(data.pairs[groupId], props);
};
return shape_1.Shape.create(name, data, text, function () { return props.textColor; }, function () { return props.textSize; }, getLabel);
}
function ContactRepresentation(ctx, getParams) {
return representation_2.Representation.createMulti('Contact', ctx, getParams, representation_2.Representation.StateBuilder, ContactVisuals);
}
exports.ContactRepresentation = ContactRepresentation;