molstar
Version:
A comprehensive macromolecular library.
327 lines • 17.2 kB
JavaScript
/**
* 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