UNPKG

@rcsb/rcsb-saguaro-3d

Version:
83 lines (82 loc) 5.12 kB
"use strict"; 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); }