@rcsb/rcsb-saguaro-3d
Version:
RCSB Molstar/Saguaro Web App
83 lines (82 loc) • 5.12 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.FlexibleAlignmentBuiltIn = void 0;
const tslib_1 = require("tslib");
const objects_1 = require("molstar/lib/mol-plugin-state/objects");
const param_definition_1 = require("molstar/lib/mol-util/param-definition");
const structure_1 = require("molstar/lib/mol-model/structure");
const builder_1 = require("molstar/lib/mol-script/language/builder");
const structure_query_1 = require("molstar/lib/mol-plugin-state/helpers/structure-query");
const root_structure_1 = require("molstar/lib/mol-plugin-state/helpers/root-structure");
const mol_task_1 = require("molstar/lib/mol-task");
exports.FlexibleAlignmentBuiltIn = objects_1.PluginStateTransform.BuiltIn({
name: "Flexible Alignment",
display: "Flexible Alignment",
from: objects_1.PluginStateObject.Molecule.Model,
to: objects_1.PluginStateObject.Molecule.Structure,
params: {
pdb: param_definition_1.ParamDefinition.Value(undefined),
transform: param_definition_1.ParamDefinition.Value(undefined)
}
})({
apply({ a, params }, plugin) {
return mol_task_1.Task.create('Build Flexible Chain', (ctx) => tslib_1.__awaiter(this, void 0, void 0, function* () {
var _a, _b, _c, _d;
const base = yield root_structure_1.RootStructureDefinition.create(plugin, ctx, a.data);
const structure = base.data;
const entityId = params.pdb && "entityId" in params.pdb ? (_a = params.pdb) === null || _a === void 0 ? void 0 : _a.entityId : undefined;
const instanceId = params.pdb && "instanceId" in params.pdb ? (_b = params.pdb) === null || _b === void 0 ? void 0 : _b.instanceId : undefined;
const l = structure_1.StructureElement.Location.create(structure);
let alignedAsymId;
let alignedOperatorName;
let alignedType;
for (const unit of structure.units) {
structure_1.StructureElement.Location.set(l, structure, unit, unit.elements[0]);
if (structure_1.StructureProperties.chain.label_entity_id(l) == entityId || structure_1.StructureProperties.chain.label_asym_id(l) == instanceId) {
alignedAsymId = structure_1.StructureProperties.chain.label_asym_id(l);
alignedOperatorName = structure_1.StructureProperties.unit.operator_name(l);
alignedType = structure_1.StructureProperties.entity.type(l);
const alignedOperators = structure_1.StructureProperties.unit.pdbx_struct_oper_list_ids(l);
if (alignedOperators.length == 0)
alignedOperators.push("0");
if (alignedType != "polymer")
throw new Error("");
const builder = structure_1.Structure.Builder({ label: structure.label });
builder.beginChainGroup();
for (const trans of (_c = params.transform) !== null && _c !== void 0 ? _c : []) {
const residues = [];
for (const r of (_d = trans.regions) !== null && _d !== void 0 ? _d : []) {
residues.push(toRange(r[0], r[1]));
}
const expression = builder_1.MolScriptBuilder.struct.generator.atomGroups({
'chain-test': builder_1.MolScriptBuilder.core.logic.and([
builder_1.MolScriptBuilder.core.rel.eq([builder_1.MolScriptBuilder.ammp('label_asym_id'), alignedAsymId]),
builder_1.MolScriptBuilder.core.rel.eq([builder_1.MolScriptBuilder.acp('operatorName'), alignedOperatorName])
]),
'residue-test': builder_1.MolScriptBuilder.core.logic.or((residues.flat()).map(p => builder_1.MolScriptBuilder.struct.atomProperty.ihm.hasSeqId([p])))
});
const { selection } = structure_query_1.StructureQueryHelper.createAndRun(structure, expression);
const s = structure_1.StructureSelection.unionStructure(selection);
const ts = structure_1.Structure.transform(s, trans.transform);
const u = ts.units[0];
builder.addUnit(u.kind, u.model, u.conformation.operator, u.elements, u.traits, u.invariantId);
}
builder.endChainGroup();
const blockStructure = builder.getStructure();
return new objects_1.PluginStateObject.Molecule.Structure(blockStructure, { label: structure.label });
}
}
throw new Error("");
}));
},
dispose({ b }) {
b === null || b === void 0 ? void 0 : b.data.customPropertyDescriptors.dispose();
}
});
function toRange(start, end) {
if (!end)
return [start];
const b = start < end ? start : end;
const e = start < end ? end : start;
return [...Array(e - b + 1)].map((_, i) => b + i);
}