UNPKG

molstar

Version:

A comprehensive macromolecular library.

327 lines 17.2 kB
/** * Copyright (c) 2018-2020 mol* contributors, licensed under MIT, See LICENSE file for more info. * * @author David Sehnal <david.sehnal@gmail.com> * @author Alexander Rose <alexander.rose@weirdbyte.de> */ import { __awaiter, __generator, __spreadArray } from "tslib"; import { StateTransforms } from '../transforms'; import { DataFormatProvider, guessCifVariant } from './provider'; import { VolumeRepresentation3DHelpers } from '../transforms/representation'; import { ColorNames } from '../../mol-util/color/names'; import { Volume } from '../../mol-model/volume'; import { createVolumeRepresentationParams } from '../helpers/volume-representation-params'; import { objectForEach } from '../../mol-util/object'; import { RecommendedIsoValue } from '../../mol-model-formats/volume/property'; import { getContourLevelEmdb } from '../../mol-plugin/behavior/dynamic/volume-streaming/util'; import { Task } from '../../mol-task'; import { DscifFormat } from '../../mol-model-formats/volume/density-server'; export var VolumeFormatCategory = 'Volume'; function tryObtainRecommendedIsoValue(plugin, volume) { return __awaiter(this, void 0, void 0, function () { var entryId; var _this = this; return __generator(this, function (_a) { if (!volume) return [2 /*return*/]; entryId = volume.entryId; if (!entryId || !entryId.toLowerCase().startsWith('emd')) return [2 /*return*/]; return [2 /*return*/, plugin.runTask(Task.create('Try Set Recommended IsoValue', function (ctx) { return __awaiter(_this, void 0, void 0, function () { var absIsoLevel, e_1; return __generator(this, function (_a) { switch (_a.label) { case 0: _a.trys.push([0, 2, , 3]); return [4 /*yield*/, getContourLevelEmdb(plugin, ctx, entryId)]; case 1: absIsoLevel = _a.sent(); RecommendedIsoValue.Provider.set(volume, Volume.IsoValue.absolute(absIsoLevel)); return [3 /*break*/, 3]; case 2: e_1 = _a.sent(); return [3 /*break*/, 3]; case 3: return [2 /*return*/]; } }); }); }))]; }); }); } function tryGetRecomendedIsoValue(volume) { var recommendedIsoValue = RecommendedIsoValue.Provider.get(volume); if (!recommendedIsoValue) return; if (recommendedIsoValue.kind === 'relative') return recommendedIsoValue; var stats = volume.grid.stats; if (DscifFormat.is(volume.sourceData)) { stats = { min: volume.sourceData.data.volume_data_3d_info.min_source.value(0), max: volume.sourceData.data.volume_data_3d_info.max_source.value(0), mean: volume.sourceData.data.volume_data_3d_info.mean_source.value(0), sigma: volume.sourceData.data.volume_data_3d_info.sigma_source.value(0), }; } return Volume.IsoValue.toRelative(recommendedIsoValue, stats); } function defaultVisuals(plugin, data) { return __awaiter(this, void 0, void 0, function () { var typeParams, isoValue, visual; return __generator(this, function (_a) { switch (_a.label) { case 0: typeParams = {}; isoValue = data.volume.data && tryGetRecomendedIsoValue(data.volume.data); if (isoValue) typeParams.isoValue = isoValue; visual = plugin.build().to(data.volume).apply(StateTransforms.Representation.VolumeRepresentation3D, createVolumeRepresentationParams(plugin, data.volume.data, { type: 'isosurface', typeParams: typeParams, })); return [4 /*yield*/, visual.commit()]; case 1: return [2 /*return*/, [_a.sent()]]; } }); }); } export var Ccp4Provider = DataFormatProvider({ label: 'CCP4/MRC/MAP', description: 'CCP4/MRC/MAP', category: VolumeFormatCategory, binaryExtensions: ['ccp4', 'mrc', 'map'], parse: function (plugin, data, params) { return __awaiter(void 0, void 0, void 0, function () { var format, volume; return __generator(this, function (_a) { switch (_a.label) { case 0: format = plugin.build() .to(data) .apply(StateTransforms.Data.ParseCcp4, {}, { state: { isGhost: true } }); volume = format.apply(StateTransforms.Volume.VolumeFromCcp4, { entryId: params === null || params === void 0 ? void 0 : params.entryId }); return [4 /*yield*/, format.commit({ revertOnError: true })]; case 1: _a.sent(); return [4 /*yield*/, tryObtainRecommendedIsoValue(plugin, volume.selector.data)]; case 2: _a.sent(); return [2 /*return*/, { format: format.selector, volume: volume.selector }]; } }); }); }, visuals: defaultVisuals }); export var Dsn6Provider = DataFormatProvider({ label: 'DSN6/BRIX', description: 'DSN6/BRIX', category: VolumeFormatCategory, binaryExtensions: ['dsn6', 'brix'], parse: function (plugin, data, params) { return __awaiter(void 0, void 0, void 0, function () { var format, volume; return __generator(this, function (_a) { switch (_a.label) { case 0: format = plugin.build() .to(data) .apply(StateTransforms.Data.ParseDsn6, {}, { state: { isGhost: true } }); volume = format.apply(StateTransforms.Volume.VolumeFromDsn6, { entryId: params === null || params === void 0 ? void 0 : params.entryId }); return [4 /*yield*/, format.commit({ revertOnError: true })]; case 1: _a.sent(); return [4 /*yield*/, tryObtainRecommendedIsoValue(plugin, volume.selector.data)]; case 2: _a.sent(); return [2 /*return*/, { format: format.selector, volume: volume.selector }]; } }); }); }, visuals: defaultVisuals }); export var DxProvider = DataFormatProvider({ label: 'DX', description: 'DX', category: VolumeFormatCategory, stringExtensions: ['dx'], binaryExtensions: ['dxbin'], parse: function (plugin, data, params) { return __awaiter(void 0, void 0, void 0, function () { var format, volume; return __generator(this, function (_a) { switch (_a.label) { case 0: format = plugin.build() .to(data) .apply(StateTransforms.Data.ParseDx, {}, { state: { isGhost: true } }); volume = format.apply(StateTransforms.Volume.VolumeFromDx, { entryId: params === null || params === void 0 ? void 0 : params.entryId }); return [4 /*yield*/, volume.commit({ revertOnError: true })]; case 1: _a.sent(); return [4 /*yield*/, tryObtainRecommendedIsoValue(plugin, volume.selector.data)]; case 2: _a.sent(); return [2 /*return*/, { volume: volume.selector }]; } }); }); }, visuals: defaultVisuals }); export var CubeProvider = DataFormatProvider({ label: 'Cube', description: 'Cube', category: VolumeFormatCategory, stringExtensions: ['cub', 'cube'], parse: function (plugin, data, params) { return __awaiter(void 0, void 0, void 0, function () { var format, volume, structure; return __generator(this, function (_a) { switch (_a.label) { case 0: format = plugin.build() .to(data) .apply(StateTransforms.Data.ParseCube, {}, { state: { isGhost: true } }); volume = format.apply(StateTransforms.Volume.VolumeFromCube, { entryId: params === null || params === void 0 ? void 0 : params.entryId }); structure = format .apply(StateTransforms.Model.TrajectoryFromCube, void 0, { state: { isGhost: true } }) .apply(StateTransforms.Model.ModelFromTrajectory) .apply(StateTransforms.Model.StructureFromModel); return [4 /*yield*/, format.commit({ revertOnError: true })]; case 1: _a.sent(); return [4 /*yield*/, tryObtainRecommendedIsoValue(plugin, volume.selector.data)]; case 2: _a.sent(); return [2 /*return*/, { format: format.selector, volume: volume.selector, structure: structure.selector }]; } }); }); }, visuals: function (plugin, data) { return __awaiter(void 0, void 0, void 0, function () { var surfaces, volumeReprs, volumeData, volumePos, volumeNeg, volume, structure, structureReprs; var _a, _b; return __generator(this, function (_c) { switch (_c.label) { case 0: surfaces = plugin.build(); volumeReprs = []; volumeData = (_b = (_a = data.volume.cell) === null || _a === void 0 ? void 0 : _a.obj) === null || _b === void 0 ? void 0 : _b.data; if (volumeData && Volume.isOrbitals(volumeData)) { volumePos = surfaces.to(data.volume).apply(StateTransforms.Representation.VolumeRepresentation3D, createVolumeRepresentationParams(plugin, volumeData, { type: 'isosurface', typeParams: { isoValue: Volume.IsoValue.relative(1), alpha: 0.4 }, color: 'uniform', colorParams: { value: ColorNames.blue } })); volumeNeg = surfaces.to(data.volume).apply(StateTransforms.Representation.VolumeRepresentation3D, createVolumeRepresentationParams(plugin, volumeData, { type: 'isosurface', typeParams: { isoValue: Volume.IsoValue.relative(-1), alpha: 0.4 }, color: 'uniform', colorParams: { value: ColorNames.red } })); volumeReprs.push(volumePos.selector, volumeNeg.selector); } else { volume = surfaces.to(data.volume).apply(StateTransforms.Representation.VolumeRepresentation3D, createVolumeRepresentationParams(plugin, volumeData, { type: 'isosurface', typeParams: { isoValue: Volume.IsoValue.relative(2), alpha: 0.4 }, color: 'uniform', colorParams: { value: ColorNames.grey } })); volumeReprs.push(volume.selector); } return [4 /*yield*/, plugin.builders.structure.representation.applyPreset(data.structure, 'auto')]; case 1: structure = _c.sent(); return [4 /*yield*/, surfaces.commit()]; case 2: _c.sent(); structureReprs = []; objectForEach(structure === null || structure === void 0 ? void 0 : structure.representations, function (r) { if (r) structureReprs.push(r); }); return [2 /*return*/, __spreadArray(__spreadArray([], volumeReprs, true), structureReprs, true)]; } }); }); } }); export var DscifProvider = DataFormatProvider({ label: 'DensityServer CIF', description: 'DensityServer CIF', category: VolumeFormatCategory, stringExtensions: ['cif'], binaryExtensions: ['bcif'], isApplicable: function (info, data) { return guessCifVariant(info, data) === 'dscif' ? true : false; }, parse: function (plugin, data, params) { return __awaiter(void 0, void 0, void 0, function () { var cifCell, b, blocks, volumes, i, _i, blocks_1, block, entryId, _a, volumes_1, v; return __generator(this, function (_b) { switch (_b.label) { case 0: return [4 /*yield*/, plugin.build().to(data).apply(StateTransforms.Data.ParseCif).commit()]; case 1: cifCell = _b.sent(); b = plugin.build().to(cifCell); blocks = cifCell.obj.data.blocks.slice(1); if (blocks.length !== 1 && blocks.length !== 2) throw new Error('unknown number of blocks'); volumes = []; i = 0; for (_i = 0, blocks_1 = blocks; _i < blocks_1.length; _i++) { block = blocks_1[_i]; entryId = Array.isArray(params === null || params === void 0 ? void 0 : params.entryId) ? params === null || params === void 0 ? void 0 : params.entryId[i] : params === null || params === void 0 ? void 0 : params.entryId; volumes.push(b.apply(StateTransforms.Volume.VolumeFromDensityServerCif, { blockHeader: block.header, entryId: entryId }).selector); i++; } return [4 /*yield*/, b.commit()]; case 2: _b.sent(); _a = 0, volumes_1 = volumes; _b.label = 3; case 3: if (!(_a < volumes_1.length)) return [3 /*break*/, 6]; v = volumes_1[_a]; return [4 /*yield*/, tryObtainRecommendedIsoValue(plugin, v.data)]; case 4: _b.sent(); _b.label = 5; case 5: _a++; return [3 /*break*/, 3]; case 6: return [2 /*return*/, { volumes: volumes }]; } }); }); }, visuals: function (plugin, data) { return __awaiter(void 0, void 0, void 0, function () { var volumes, tree, visuals, isoValue, posParams, negParams; return __generator(this, function (_a) { switch (_a.label) { case 0: volumes = data.volumes; tree = plugin.build(); visuals = []; if (volumes.length > 0) { isoValue = (volumes[0].data && tryGetRecomendedIsoValue(volumes[0].data)) || Volume.IsoValue.relative(1.5); visuals[0] = tree .to(volumes[0]) .apply(StateTransforms.Representation.VolumeRepresentation3D, VolumeRepresentation3DHelpers.getDefaultParamsStatic(plugin, 'isosurface', { isoValue: isoValue, alpha: 1 }, 'uniform', { value: ColorNames.teal })) .selector; } if (volumes.length > 1) { posParams = VolumeRepresentation3DHelpers.getDefaultParamsStatic(plugin, 'isosurface', { isoValue: Volume.IsoValue.relative(3), alpha: 0.3 }, 'uniform', { value: ColorNames.green }); negParams = VolumeRepresentation3DHelpers.getDefaultParamsStatic(plugin, 'isosurface', { isoValue: Volume.IsoValue.relative(-3), alpha: 0.3 }, 'uniform', { value: ColorNames.red }); visuals[visuals.length] = tree.to(volumes[1]).apply(StateTransforms.Representation.VolumeRepresentation3D, posParams).selector; visuals[visuals.length] = tree.to(volumes[1]).apply(StateTransforms.Representation.VolumeRepresentation3D, negParams).selector; } return [4 /*yield*/, tree.commit()]; case 1: _a.sent(); return [2 /*return*/, visuals]; } }); }); } }); export var BuiltInVolumeFormats = [ ['ccp4', Ccp4Provider], ['dsn6', Dsn6Provider], ['cube', CubeProvider], ['dx', DxProvider], ['dscif', DscifProvider], ]; //# sourceMappingURL=volume.js.map