molstar
Version:
A comprehensive macromolecular library.
184 lines • 8.77 kB
JavaScript
"use strict";
/**
* 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.updateStructureComponent = exports.createStructureComponent = exports.StructureComponentParams = exports.StaticStructureComponentTypes = void 0;
var param_definition_1 = require("../../mol-util/param-definition");
var builder_1 = require("../../mol-script/language/builder");
var structure_1 = require("../../mol-model/structure");
var structure_query_1 = require("./structure-query");
var objects_1 = require("../objects");
var structure_selection_query_1 = require("./structure-selection-query");
var mol_state_1 = require("../../mol-state");
var script_1 = require("../../mol-script/script");
exports.StaticStructureComponentTypes = [
'all',
'polymer',
'protein',
'nucleic',
'water',
'ion',
'lipid',
'branched',
'ligand',
'non-standard',
'coarse'
];
var StructureComponentParams = function () { return ({
type: param_definition_1.ParamDefinition.MappedStatic('static', {
static: param_definition_1.ParamDefinition.Text('polymer'),
expression: param_definition_1.ParamDefinition.Value(builder_1.MolScriptBuilder.struct.generator.all),
bundle: param_definition_1.ParamDefinition.Value(structure_1.StructureElement.Bundle.Empty),
script: param_definition_1.ParamDefinition.Script({ language: 'mol-script', expression: '(sel.atom.all)' }),
}, { isHidden: true }),
nullIfEmpty: param_definition_1.ParamDefinition.Optional(param_definition_1.ParamDefinition.Boolean(true, { isHidden: true })),
label: param_definition_1.ParamDefinition.Text('', { isHidden: true })
}); };
exports.StructureComponentParams = StructureComponentParams;
function createStructureComponent(a, params, cache) {
cache.source = a;
var component = structure_1.Structure.Empty;
var label = void 0;
switch (params.type.name) {
case 'static': {
var query = void 0;
switch (params.type.params) {
case 'all':
query = structure_selection_query_1.StructureSelectionQueries.all.query;
label = 'All';
break;
case 'polymer':
query = structure_selection_query_1.StructureSelectionQueries.polymer.query;
label = 'Polymer';
break;
case 'protein':
query = structure_selection_query_1.StructureSelectionQueries.protein.query;
label = 'Protein';
break;
case 'nucleic':
query = structure_selection_query_1.StructureSelectionQueries.nucleic.query;
label = 'Nucleic';
break;
case 'water':
query = structure_1.Queries.internal.water();
label = 'Water';
break;
case 'ion':
query = structure_selection_query_1.StructureSelectionQueries.ion.query;
label = 'Ion';
break;
case 'lipid':
query = structure_selection_query_1.StructureSelectionQueries.lipid.query;
label = 'Lipid';
break;
case 'branched':
query = structure_selection_query_1.StructureSelectionQueries.branchedPlusConnected.query;
label = 'Branched';
break;
case 'ligand':
query = structure_selection_query_1.StructureSelectionQueries.ligandPlusConnected.query;
label = 'Ligand';
break;
case 'non-standard':
query = structure_selection_query_1.StructureSelectionQueries.nonStandardPolymer.query;
label = 'Non-standard';
break;
case 'coarse':
query = structure_selection_query_1.StructureSelectionQueries.coarse.query;
label = 'Coarse';
break;
default: throw new Error(params.type + " is a not valid complex element.");
}
var result = query(new structure_1.QueryContext(a));
component = structure_1.StructureSelection.unionStructure(result);
break;
}
case 'script':
case 'expression': {
var _a = structure_query_1.StructureQueryHelper.createAndRun(a, params.type.params), selection = _a.selection, entry = _a.entry;
cache.entry = entry;
component = structure_1.StructureSelection.unionStructure(selection);
break;
}
case 'bundle': {
if (params.type.params.hash !== a.hashCode)
break;
component = structure_1.StructureElement.Bundle.toStructure(params.type.params, a);
break;
}
}
if (params.nullIfEmpty && component.elementCount === 0)
return mol_state_1.StateObject.Null;
var props = { label: "" + (params.label || label || 'Component'), description: structure_1.Structure.elementDescription(component) };
return new objects_1.PluginStateObject.Molecule.Structure(component, props);
}
exports.createStructureComponent = createStructureComponent;
function updateStructureComponent(a, b, oldParams, newParams, cache) {
if (oldParams.type.name !== newParams.type.name)
return mol_state_1.StateTransformer.UpdateResult.Recreate;
var updated = false;
switch (newParams.type.name) {
case 'static': {
if (oldParams.type.params !== newParams.type.params) {
return mol_state_1.StateTransformer.UpdateResult.Recreate;
}
if (!structure_1.Structure.areEquivalent(a, cache.source)) {
return mol_state_1.StateTransformer.UpdateResult.Recreate;
}
if (b.data.model === a.model)
return mol_state_1.StateTransformer.UpdateResult.Unchanged;
if (!structure_1.Model.areHierarchiesEqual(a.model, b.data.model))
return mol_state_1.StateTransformer.UpdateResult.Recreate;
b.data = b.data.remapModel(a.model);
return mol_state_1.StateTransformer.UpdateResult.Updated;
}
case 'script':
if (!script_1.Script.areEqual(oldParams.type.params, newParams.type.params)) {
return mol_state_1.StateTransformer.UpdateResult.Recreate;
}
case 'expression': {
if (oldParams.type.params !== newParams.type.params) {
return mol_state_1.StateTransformer.UpdateResult.Recreate;
}
if (a === cache.source)
break;
var entry = cache.entry;
var selection = structure_query_1.StructureQueryHelper.updateStructure(entry, a);
cache.source = a;
b.data = structure_1.StructureSelection.unionStructure(selection);
structure_query_1.StructureQueryHelper.updateStructureObject(b, selection, newParams.label);
updated = true;
break;
}
case 'bundle': {
if (a === cache.source && structure_1.StructureElement.Bundle.areEqual(oldParams.type.params, newParams.type.params)) {
break;
}
cache.source = a;
if (newParams.type.params.hash !== a.hashCode) {
updated = b.data.elementCount !== 0;
b.data = b.data.elementCount === 0 ? b.data : structure_1.Structure.Empty;
}
else {
updated = true;
b.data = structure_1.StructureElement.Bundle.toStructure(newParams.type.params, a);
}
break;
}
}
if (updated) {
if (newParams.nullIfEmpty && b.data.elementCount === 0)
return mol_state_1.StateTransformer.UpdateResult.Null;
b.description = structure_1.Structure.elementDescription(b.data);
}
if (oldParams.label !== newParams.label) {
updated = true;
b.label = "" + (newParams.label || b.label);
}
return updated ? mol_state_1.StateTransformer.UpdateResult.Updated : mol_state_1.StateTransformer.UpdateResult.Unchanged;
}
exports.updateStructureComponent = updateStructureComponent;
//# sourceMappingURL=structure-component.js.map