From 5c085bead69efdd9fd23446195b87e57a0042855 Mon Sep 17 00:00:00 2001 From: Alexander Rose <alex.rose@rcsb.org> Date: Mon, 11 Feb 2019 17:21:55 -0800 Subject: [PATCH] wip density-server cif loading --- .../volume/formats/density-server.ts | 6 ++-- src/mol-plugin/state/actions/basic.ts | 14 +++++--- src/mol-plugin/state/transforms/model.ts | 35 +++++++++++++++++++ 3 files changed, 47 insertions(+), 8 deletions(-) diff --git a/src/mol-model/volume/formats/density-server.ts b/src/mol-model/volume/formats/density-server.ts index c01282e8e..2f539d379 100644 --- a/src/mol-model/volume/formats/density-server.ts +++ b/src/mol-model/volume/formats/density-server.ts @@ -10,8 +10,8 @@ import { Task } from 'mol-task'; import { SpacegroupCell, Box3D } from 'mol-math/geometry'; import { Tensor, Vec3 } from 'mol-math/linear-algebra'; -function parseDensityServerData(source: DensityServer_Data_Database): Task<VolumeData> { - return Task.create<VolumeData>('Parse Volume Data', async ctx => { +function volumeFromDensityServerData(source: DensityServer_Data_Database): Task<VolumeData> { + return Task.create<VolumeData>('Create Volume Data', async ctx => { const { volume_data_3d_info: info, volume_data_3d: values } = source; const cell = SpacegroupCell.create( info.spacegroup_number.value(0), @@ -47,4 +47,4 @@ function parseDensityServerData(source: DensityServer_Data_Database): Task<Volum }); } -export { parseDensityServerData } \ No newline at end of file +export { volumeFromDensityServerData } \ No newline at end of file diff --git a/src/mol-plugin/state/actions/basic.ts b/src/mol-plugin/state/actions/basic.ts index e2be44425..b2c372fa2 100644 --- a/src/mol-plugin/state/actions/basic.ts +++ b/src/mol-plugin/state/actions/basic.ts @@ -162,7 +162,7 @@ export const UpdateTrajectory = StateAction.build({ // -const VolumeFormats = { 'ccp4': '', 'mrc': '', 'map': '', 'dsn6': '', 'brix': '' } +const VolumeFormats = { 'ccp4': '', 'mrc': '', 'map': '', 'dsn6': '', 'brix': '', 'dscif': '' } type VolumeFormat = keyof typeof VolumeFormats function getVolumeData(format: VolumeFormat, b: StateTreeBuilder.To<PluginStateObject.Data.Binary | PluginStateObject.Data.String>) { @@ -171,6 +171,8 @@ function getVolumeData(format: VolumeFormat, b: StateTreeBuilder.To<PluginStateO return b.apply(StateTransforms.Data.ParseCcp4).apply(StateTransforms.Model.VolumeFromCcp4); case 'dsn6': case 'brix': return b.apply(StateTransforms.Data.ParseDsn6).apply(StateTransforms.Model.VolumeFromDsn6); + case 'dscif': + return b.apply(StateTransforms.Data.ParseCif).apply(StateTransforms.Model.VolumeFromDensityServerCif); } } @@ -200,14 +202,15 @@ export const OpenVolume = StateAction.build({ display: { name: 'Open Volume', description: 'Load a volume from file and create its default visual' }, from: PluginStateObject.Root, params: { - file: PD.File({ accept: '.ccp4,.mrc,.map,.dsn6,.brix'}), + file: PD.File({ accept: '.ccp4,.mrc,.map,.dsn6,.brix,.cif'}), + isBinary: PD.Boolean(true), format: PD.Select('auto', [ - ['auto', 'Automatic'], ['ccp4', 'CCP4'], ['mrc', 'MRC'], ['map', 'MAP'], ['dsn6', 'DSN6'], ['brix', 'BRIX'] + ['auto', 'Automatic'], ['ccp4', 'CCP4'], ['mrc', 'MRC'], ['map', 'MAP'], ['dsn6', 'DSN6'], ['brix', 'BRIX'], ['dscif', 'densityServerCIF'] ]), } })(({ params, state }, ctx: PluginContext) => { const b = state.build(); - const data = b.toRoot().apply(StateTransforms.Data.ReadFile, { file: params.file, isBinary: true }); + const data = b.toRoot().apply(StateTransforms.Data.ReadFile, { file: params.file, isBinary: params.isBinary }); const format = getFileFormat(params.format, params.file) return state.update(createVolumeTree(format, ctx, data)); }); @@ -229,8 +232,9 @@ const DownloadDensity = StateAction.build({ }, { isFlat: true }), 'url': PD.Group({ url: PD.Text(''), + isBinary: PD.Boolean(true), format: PD.Select('auto', [ - ['auto', 'Automatic'], ['ccp4', 'CCP4'], ['mrc', 'MRC'], ['map', 'MAP'], ['dsn6', 'DSN6'], ['brix', 'BRIX'] + ['auto', 'Automatic'], ['ccp4', 'CCP4'], ['mrc', 'MRC'], ['map', 'MAP'], ['dsn6', 'DSN6'], ['brix', 'BRIX'], ['dscif', 'densityServerCIF'] ]), }, { isFlat: true }) }, { diff --git a/src/mol-plugin/state/transforms/model.ts b/src/mol-plugin/state/transforms/model.ts index 958e2ef90..9e697bfc2 100644 --- a/src/mol-plugin/state/transforms/model.ts +++ b/src/mol-plugin/state/transforms/model.ts @@ -19,6 +19,8 @@ import { stringToWords } from 'mol-util/string'; import { volumeFromCcp4 } from 'mol-model/volume/formats/ccp4'; import { Vec3 } from 'mol-math/linear-algebra'; import { volumeFromDsn6 } from 'mol-model/volume/formats/dsn6'; +import { volumeFromDensityServerData } from 'mol-model/volume'; +import CIF from 'mol-io/reader/cif'; export { TrajectoryFromMmCif } type TrajectoryFromMmCif = typeof TrajectoryFromMmCif @@ -259,4 +261,37 @@ const VolumeFromDsn6 = PluginStateTransform.BuiltIn({ return new SO.Volume.Data(volume, props); }); } +}); + +export { VolumeFromDensityServerCif } +type VolumeFromDensityServerCif = typeof VolumeFromDensityServerCif +const VolumeFromDensityServerCif = PluginStateTransform.BuiltIn({ + name: 'volume-from-density-server-cif', + display: { name: 'Volume from density-server CIF', description: 'Identify and create all separate models in the specified CIF data block' }, + from: SO.Format.Cif, + to: SO.Volume.Data, + params(a) { + if (!a) { + return { + blockHeader: PD.makeOptional(PD.Text(void 0, { description: 'Header of the block to parse. If none is specifed, the 1st data block in the file is used.' })) + }; + } + const blocks = a.data.blocks.slice(1); // zero block contains query meta-data + return { + blockHeader: PD.makeOptional(PD.Select(blocks[0] && blocks[0].header, blocks.map(b => [b.header, b.header] as [string, string]), { description: 'Header of the block to parse' })) + }; + } +})({ + isApplicable: a => a.data.blocks.length > 0, + apply({ a, params }) { + return Task.create('Parse density-server CIF', async ctx => { + const header = params.blockHeader || a.data.blocks[1].header; // zero block contains query meta-data + const block = a.data.blocks.find(b => b.header === header); + if (!block) throw new Error(`Data block '${[header]}' not found.`); + const densityServerCif = CIF.schema.densityServer(block) + const volume = await volumeFromDensityServerData(densityServerCif).runInContext(ctx) + const props = { label: densityServerCif.volume_data_3d_info.name.value(0), description: `${densityServerCif.volume_data_3d_info.name.value(0)}` }; + return new SO.Volume.Data(volume, props); + }); + } }); \ No newline at end of file -- GitLab