Skip to content
Snippets Groups Projects
Commit 5c085bea authored by Alexander Rose's avatar Alexander Rose
Browse files

wip density-server cif loading

parent 1f3a2c44
No related branches found
No related tags found
No related merge requests found
...@@ -10,8 +10,8 @@ import { Task } from 'mol-task'; ...@@ -10,8 +10,8 @@ import { Task } from 'mol-task';
import { SpacegroupCell, Box3D } from 'mol-math/geometry'; import { SpacegroupCell, Box3D } from 'mol-math/geometry';
import { Tensor, Vec3 } from 'mol-math/linear-algebra'; import { Tensor, Vec3 } from 'mol-math/linear-algebra';
function parseDensityServerData(source: DensityServer_Data_Database): Task<VolumeData> { function volumeFromDensityServerData(source: DensityServer_Data_Database): Task<VolumeData> {
return Task.create<VolumeData>('Parse Volume Data', async ctx => { return Task.create<VolumeData>('Create Volume Data', async ctx => {
const { volume_data_3d_info: info, volume_data_3d: values } = source; const { volume_data_3d_info: info, volume_data_3d: values } = source;
const cell = SpacegroupCell.create( const cell = SpacegroupCell.create(
info.spacegroup_number.value(0), info.spacegroup_number.value(0),
...@@ -47,4 +47,4 @@ function parseDensityServerData(source: DensityServer_Data_Database): Task<Volum ...@@ -47,4 +47,4 @@ function parseDensityServerData(source: DensityServer_Data_Database): Task<Volum
}); });
} }
export { parseDensityServerData } export { volumeFromDensityServerData }
\ No newline at end of file \ No newline at end of file
...@@ -162,7 +162,7 @@ export const UpdateTrajectory = StateAction.build({ ...@@ -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 type VolumeFormat = keyof typeof VolumeFormats
function getVolumeData(format: VolumeFormat, b: StateTreeBuilder.To<PluginStateObject.Data.Binary | PluginStateObject.Data.String>) { 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 ...@@ -171,6 +171,8 @@ function getVolumeData(format: VolumeFormat, b: StateTreeBuilder.To<PluginStateO
return b.apply(StateTransforms.Data.ParseCcp4).apply(StateTransforms.Model.VolumeFromCcp4); return b.apply(StateTransforms.Data.ParseCcp4).apply(StateTransforms.Model.VolumeFromCcp4);
case 'dsn6': case 'brix': case 'dsn6': case 'brix':
return b.apply(StateTransforms.Data.ParseDsn6).apply(StateTransforms.Model.VolumeFromDsn6); 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({ ...@@ -200,14 +202,15 @@ export const OpenVolume = StateAction.build({
display: { name: 'Open Volume', description: 'Load a volume from file and create its default visual' }, display: { name: 'Open Volume', description: 'Load a volume from file and create its default visual' },
from: PluginStateObject.Root, from: PluginStateObject.Root,
params: { 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', [ 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) => { })(({ params, state }, ctx: PluginContext) => {
const b = state.build(); 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) const format = getFileFormat(params.format, params.file)
return state.update(createVolumeTree(format, ctx, data)); return state.update(createVolumeTree(format, ctx, data));
}); });
...@@ -229,8 +232,9 @@ const DownloadDensity = StateAction.build({ ...@@ -229,8 +232,9 @@ const DownloadDensity = StateAction.build({
}, { isFlat: true }), }, { isFlat: true }),
'url': PD.Group({ 'url': PD.Group({
url: PD.Text(''), url: PD.Text(''),
isBinary: PD.Boolean(true),
format: PD.Select('auto', [ 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 }) }, { isFlat: true })
}, { }, {
......
...@@ -19,6 +19,8 @@ import { stringToWords } from 'mol-util/string'; ...@@ -19,6 +19,8 @@ import { stringToWords } from 'mol-util/string';
import { volumeFromCcp4 } from 'mol-model/volume/formats/ccp4'; import { volumeFromCcp4 } from 'mol-model/volume/formats/ccp4';
import { Vec3 } from 'mol-math/linear-algebra'; import { Vec3 } from 'mol-math/linear-algebra';
import { volumeFromDsn6 } from 'mol-model/volume/formats/dsn6'; import { volumeFromDsn6 } from 'mol-model/volume/formats/dsn6';
import { volumeFromDensityServerData } from 'mol-model/volume';
import CIF from 'mol-io/reader/cif';
export { TrajectoryFromMmCif } export { TrajectoryFromMmCif }
type TrajectoryFromMmCif = typeof TrajectoryFromMmCif type TrajectoryFromMmCif = typeof TrajectoryFromMmCif
...@@ -259,4 +261,37 @@ const VolumeFromDsn6 = PluginStateTransform.BuiltIn({ ...@@ -259,4 +261,37 @@ const VolumeFromDsn6 = PluginStateTransform.BuiltIn({
return new SO.Volume.Data(volume, props); 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
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment