volume.ts 3.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. /**
  2. * Copyright (c) 2018-2019 mol* contributors, licensed under MIT, See LICENSE file for more info.
  3. *
  4. * @author David Sehnal <david.sehnal@gmail.com>
  5. * @author Alexander Rose <alexander.rose@weirdbyte.de>
  6. */
  7. import CIF from 'mol-io/reader/cif';
  8. import { Vec3 } from 'mol-math/linear-algebra';
  9. import { volumeFromCcp4 } from 'mol-model-formats/volume/ccp4';
  10. import { volumeFromDensityServerData } from 'mol-model-formats/volume/density-server';
  11. import { volumeFromDsn6 } from 'mol-model-formats/volume/dsn6';
  12. import { Task } from 'mol-task';
  13. import { ParamDefinition as PD } from 'mol-util/param-definition';
  14. import { PluginStateObject as SO, PluginStateTransform } from '../objects';
  15. export { VolumeFromCcp4 };
  16. export { VolumeFromDsn6 };
  17. export { VolumeFromDensityServerCif };
  18. type VolumeFromCcp4 = typeof VolumeFromCcp4
  19. const VolumeFromCcp4 = PluginStateTransform.BuiltIn({
  20. name: 'volume-from-ccp4',
  21. display: { name: 'Volume from CCP4/MRC/MAP', description: 'Create Volume from CCP4/MRC/MAP data' },
  22. from: SO.Format.Ccp4,
  23. to: SO.Volume.Data,
  24. params(a) {
  25. return {
  26. voxelSize: PD.Vec3(Vec3.create(1, 1, 1))
  27. };
  28. }
  29. })({
  30. apply({ a, params }) {
  31. return Task.create('Create volume from CCP4/MRC/MAP', async ctx => {
  32. const volume = await volumeFromCcp4(a.data, params).runInContext(ctx)
  33. const props = { label: 'Volume' };
  34. return new SO.Volume.Data(volume, props);
  35. });
  36. }
  37. });
  38. type VolumeFromDsn6 = typeof VolumeFromDsn6
  39. const VolumeFromDsn6 = PluginStateTransform.BuiltIn({
  40. name: 'volume-from-dsn6',
  41. display: { name: 'Volume from DSN6/BRIX', description: 'Create Volume from DSN6/BRIX data' },
  42. from: SO.Format.Dsn6,
  43. to: SO.Volume.Data,
  44. params(a) {
  45. return {
  46. voxelSize: PD.Vec3(Vec3.create(1, 1, 1))
  47. };
  48. }
  49. })({
  50. apply({ a, params }) {
  51. return Task.create('Create volume from DSN6/BRIX', async ctx => {
  52. const volume = await volumeFromDsn6(a.data, params).runInContext(ctx)
  53. const props = { label: 'Volume' };
  54. return new SO.Volume.Data(volume, props);
  55. });
  56. }
  57. });
  58. type VolumeFromDensityServerCif = typeof VolumeFromDensityServerCif
  59. const VolumeFromDensityServerCif = PluginStateTransform.BuiltIn({
  60. name: 'volume-from-density-server-cif',
  61. display: { name: 'Volume from density-server CIF', description: 'Identify and create all separate models in the specified CIF data block' },
  62. from: SO.Format.Cif,
  63. to: SO.Volume.Data,
  64. params(a) {
  65. if (!a) {
  66. return {
  67. 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.' }))
  68. };
  69. }
  70. const blocks = a.data.blocks.slice(1); // zero block contains query meta-data
  71. return {
  72. 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' }))
  73. };
  74. }
  75. })({
  76. isApplicable: a => a.data.blocks.length > 0,
  77. apply({ a, params }) {
  78. return Task.create('Parse density-server CIF', async ctx => {
  79. const header = params.blockHeader || a.data.blocks[1].header; // zero block contains query meta-data
  80. const block = a.data.blocks.find(b => b.header === header);
  81. if (!block) throw new Error(`Data block '${[header]}' not found.`);
  82. const densityServerCif = CIF.schema.densityServer(block)
  83. const volume = await volumeFromDensityServerData(densityServerCif).runInContext(ctx)
  84. const props = { label: densityServerCif.volume_data_3d_info.name.value(0), description: `${densityServerCif.volume_data_3d_info.name.value(0)}` };
  85. return new SO.Volume.Data(volume, props);
  86. });
  87. }
  88. });