From a0d919c8db41d98f4a1132b72eb73ce72841455d Mon Sep 17 00:00:00 2001 From: dsehnal <david.sehnal@gmail.com> Date: Tue, 9 Nov 2021 21:12:24 +0100 Subject: [PATCH] Viewer.loadTrajectory --- src/apps/viewer/embedded.html | 9 ++++- src/apps/viewer/index.ts | 71 ++++++++++++++++++++++++++++++++++- 2 files changed, 77 insertions(+), 3 deletions(-) diff --git a/src/apps/viewer/embedded.html b/src/apps/viewer/embedded.html index a5869d4e0..80271e1dc 100644 --- a/src/apps/viewer/embedded.html +++ b/src/apps/viewer/embedded.html @@ -35,8 +35,13 @@ pdbProvider: 'rcsb', emdbProvider: 'rcsb', }); - viewer.loadPdb('7bv2'); - viewer.loadEmdb('EMD-30210', { detail: 6 }); + // viewer.loadPdb('7bv2'); + // viewer.loadEmdb('EMD-30210', { detail: 6 }); + + viewer.loadTrajectory({ + model: { kind: 'model-url', url: 'villin.gro', format: 'gro' }, + coordinates: { kind: 'coordinates-url', url: 'villin.xtc', format: 'xtc', isBinary: true } + }); // viewer.loadAllModelsOrAssemblyFromUrl('https://cs.litemol.org/5ire/full', 'mmcif', false, { representationParams: { theme: { globalName: 'operator-name' } } }) </script> diff --git a/src/apps/viewer/index.ts b/src/apps/viewer/index.ts index 84fb6dae8..83d3f5d8a 100644 --- a/src/apps/viewer/index.ts +++ b/src/apps/viewer/index.ts @@ -30,7 +30,7 @@ import { PluginCommands } from '../../mol-plugin/commands'; import { PluginConfig } from '../../mol-plugin/config'; import { PluginSpec } from '../../mol-plugin/spec'; import { PluginState } from '../../mol-plugin/state'; -import { StateObjectSelector } from '../../mol-state'; +import { StateObjectSelector, StateTransformer } from '../../mol-state'; import { Asset } from '../../mol-util/assets'; import { Color } from '../../mol-util/color'; import '../../mol-util/polyfill'; @@ -38,6 +38,13 @@ import { ObjectKeys } from '../../mol-util/type-helpers'; import './embedded.html'; import './favicon.ico'; import './index.html'; +import { ParamDefinition } from '../../mol-util/param-definition'; +import { Task } from '../../mol-task'; +import { Coordinates, Time } from '../../mol-model/structure'; +import { PluginContext } from '../../mol-plugin/context'; +import { TrajectoryFromModelAndCoordinates } from '../../mol-plugin-state/transforms/model'; +import { BuildInStructureFormat } from '../../mol-plugin-state/formats/structure'; +import { PresetTrajectoryHierarchy } from '../../mol-plugin-state/builder/structure/hierarchy-preset'; require('mol-plugin-ui/skin/light.scss'); @@ -328,6 +335,56 @@ export class Viewer { }); } + /** + * @example + * viewer.loadTrajectory({ + * model: { kind: 'model-url', url: 'villin.gro', format: 'gro' }, + * coordinates: { kind: 'coordinates-url', url: 'villin.xtc', format: 'xtc', isBinary: true }, + * preset: 'all-models' // or 'default' + * }); + */ + async loadTrajectory(params: LoadTrajectoryParams) { + const plugin = this.plugin; + + let model: StateObjectSelector, coords: StateObjectSelector; + + if (params.model.kind === 'model-data' || params.model.kind === 'model-url') { + const data = params.model.kind === 'model-data' + ? await plugin.builders.data.rawData({ data: params.model.data, label: params.modelLabel }) + : await plugin.builders.data.download({ url: params.model.url, isBinary: params.model.isBinary, label: params.modelLabel }); + + const trajectory = await plugin.builders.structure.parseTrajectory(data, params.model.format ?? 'mmcif'); + model = await plugin.builders.structure.createModel(trajectory); + } else { + const data = params.model.kind === 'topology-data' + ? await plugin.builders.data.rawData({ data: params.model.data, label: params.modelLabel }) + : await plugin.builders.data.download({ url: params.model.url, isBinary: params.model.isBinary, label: params.modelLabel }); + + const provider = plugin.dataFormats.get(params.model.format); + model = await provider!.parse(plugin, data); + } + + { + const data = params.coordinates.kind === 'coordinates-data' + ? await plugin.builders.data.rawData({ data: params.coordinates.data, label: params.coordinatesLabel }) + : await plugin.builders.data.download({ url: params.coordinates.url, isBinary: params.coordinates.isBinary, label: params.coordinatesLabel }); + + const provider = plugin.dataFormats.get(params.coordinates.format); + coords = await provider!.parse(plugin, data); + } + + const trajectory = await plugin.build().toRoot() + .apply(TrajectoryFromModelAndCoordinates, { + modelRef: model.ref, + coordinatesRef: coords.ref + }, { dependsOn: [model.ref, coords.ref] }) + .commit(); + + const preset = await plugin.builders.structure.hierarchy.applyPreset(trajectory, params.preset ?? 'default'); + + return { model, coords, preset }; + } + handleResize() { this.plugin.layout.events.updated.next(void 0); } @@ -343,4 +400,16 @@ export interface VolumeIsovalueInfo { color: Color, alpha?: number, volumeIndex?: number +} + +export interface LoadTrajectoryParams { + model: { kind: 'model-url', url: string, format?: BuiltInTrajectoryFormat /* mmcif */, isBinary?: boolean } + | { kind: 'model-data', data: string | number[] | ArrayBuffer | Uint8Array, format?: BuiltInTrajectoryFormat /* mmcif */ } + | { kind: 'topology-url', url: string, format: BuildInStructureFormat, isBinary?: boolean } + | { kind: 'topology-data', data: string | number[] | ArrayBuffer | Uint8Array, format: BuildInStructureFormat }, + modelLabel?: string, + coordinates: { kind: 'coordinates-url', url: string, format: BuildInStructureFormat, isBinary?: boolean } + | { kind: 'coordinates-data', data: string | number[] | ArrayBuffer | Uint8Array, format: BuildInStructureFormat }, + coordinatesLabel?: string, + preset?: keyof PresetTrajectoryHierarchy } \ No newline at end of file -- GitLab