molstar
Version:
A comprehensive macromolecular library.
108 lines (107 loc) • 5.77 kB
JavaScript
/**
* Copyright (c) 2023 mol* contributors, licensed under MIT, See LICENSE file for more info.
*
* @author Adam Midlik <midlik@gmail.com>
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.MVSAnnotationStructureComponent = exports.MVSTransform = exports.MVSAnnotationStructureComponentParams = void 0;
exports.createMVSAnnotationSubstructure = createMVSAnnotationSubstructure;
exports.createMVSAnnotationStructureComponent = createMVSAnnotationStructureComponent;
exports.updateMVSAnnotationStructureComponent = updateMVSAnnotationStructureComponent;
const structure_1 = require("../../../mol-model/structure");
const structure_query_1 = require("../../../mol-plugin-state/helpers/structure-query");
const objects_1 = require("../../../mol-plugin-state/objects");
const mol_state_1 = require("../../../mol-state");
const mol_util_1 = require("../../../mol-util");
const object_1 = require("../../../mol-util/object");
const param_definition_1 = require("../../../mol-util/param-definition");
const selections_1 = require("../helpers/selections");
const annotation_prop_1 = require("./annotation-prop");
/** Parameter definition for `MVSAnnotationStructureComponent` transformer */
exports.MVSAnnotationStructureComponentParams = {
annotationId: param_definition_1.ParamDefinition.Text('', { description: 'Reference to "Annotation" custom model property' }),
fieldName: param_definition_1.ParamDefinition.Text('component', { description: 'Annotation field (column) from which to take component identifier' }),
fieldValues: param_definition_1.ParamDefinition.MappedStatic('all', {
all: param_definition_1.ParamDefinition.EmptyGroup(),
selected: param_definition_1.ParamDefinition.ObjectList({
value: param_definition_1.ParamDefinition.Text(),
}, obj => obj.value),
}),
nullIfEmpty: param_definition_1.ParamDefinition.Optional(param_definition_1.ParamDefinition.Boolean(true, { isHidden: false })),
label: param_definition_1.ParamDefinition.Text('', { isHidden: false }),
};
/** Transformer builder for MVS extension */
exports.MVSTransform = mol_state_1.StateTransformer.builderFactory('mvs');
exports.MVSAnnotationStructureComponent = (0, exports.MVSTransform)({
name: 'mvs-structure-component-from-annotation',
display: { name: 'MVS Annotation Component', description: 'A molecular structure component defined by MVS annotation data.' },
from: objects_1.PluginStateObject.Molecule.Structure,
to: objects_1.PluginStateObject.Molecule.Structure,
params: exports.MVSAnnotationStructureComponentParams,
})({
apply({ a, params }) {
return createMVSAnnotationStructureComponent(a.data, params);
},
update: ({ a, b, oldParams, newParams }) => {
return updateMVSAnnotationStructureComponent(a.data, b, oldParams, newParams);
},
dispose({ b }) {
b === null || b === void 0 ? void 0 : b.data.customPropertyDescriptors.dispose();
}
});
/** Create a substructure based on `MVSAnnotationStructureComponentProps` */
function createMVSAnnotationSubstructure(structure, params) {
const { annotation } = (0, annotation_prop_1.getMVSAnnotationForStructure)(structure, params.annotationId);
if (annotation) {
let rows = annotation.getRows();
if (params.fieldValues.name === 'selected') {
const selectedValues = new Set(params.fieldValues.params.map(obj => obj.value));
rows = rows.filter((row, i) => selectedValues.has(annotation.getValueForRow(i, params.fieldName)));
}
const expression = (0, selections_1.rowsToExpression)(rows);
const { selection } = structure_query_1.StructureQueryHelper.createAndRun(structure, expression);
return structure_1.StructureSelection.unionStructure(selection);
}
else {
return structure_1.Structure.Empty;
}
}
/** Create a substructure PSO based on `MVSAnnotationStructureComponentProps` */
function createMVSAnnotationStructureComponent(structure, params) {
const component = createMVSAnnotationSubstructure(structure, params);
if (params.nullIfEmpty && component.elementCount === 0)
return mol_state_1.StateObject.Null;
let label = params.label;
if (label === undefined || label === '') {
if (params.fieldValues.name === 'selected' && params.fieldValues.params.length > 0) {
const values = params.fieldValues.params;
let valuesStr = `"${values[0].value}"`;
if (values.length === 2) {
valuesStr += ` + "${values[1].value}"`;
}
else if (values.length > 2) {
valuesStr += ` + ${values.length - 1} more values`;
}
label = `MVS Annotation Component (${params.fieldName}: ${valuesStr})`;
}
else {
label = 'MVS Annotation Component';
}
}
const props = { label, description: structure_1.Structure.elementDescription(component) };
return new objects_1.PluginStateObject.Molecule.Structure(component, props);
}
/** Update a substructure PSO based on `MVSAnnotationStructureComponentProps` */
function updateMVSAnnotationStructureComponent(a, b, oldParams, newParams) {
const change = !(0, mol_util_1.deepEqual)(newParams, oldParams);
const needsRecreate = !(0, mol_util_1.deepEqual)((0, object_1.omitObjectKeys)(newParams, ['label']), (0, object_1.omitObjectKeys)(oldParams, ['label']));
if (!change) {
return mol_state_1.StateTransformer.UpdateResult.Unchanged;
}
if (!needsRecreate) {
b.label = newParams.label || b.label;
return mol_state_1.StateTransformer.UpdateResult.Updated;
}
return mol_state_1.StateTransformer.UpdateResult.Recreate;
}
;