volume.ts 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190
  1. /**
  2. * Copyright (c) 2018-2020 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 { StateTransforms } from '../transforms';
  8. import { DataFormatProvider, guessCifVariant } from './provider';
  9. import { PluginContext } from '../../mol-plugin/context';
  10. import { StateObjectSelector } from '../../mol-state';
  11. import { PluginStateObject } from '../objects';
  12. import { VolumeRepresentation3DHelpers } from '../transforms/representation';
  13. import { ColorNames } from '../../mol-util/color/names';
  14. import { VolumeIsoValue } from '../../mol-model/volume';
  15. import { createVolumeRepresentationParams } from '../helpers/volume-representation-params';
  16. import { objectForEach } from '../../mol-util/object';
  17. const Category = 'Volume';
  18. async function defaultVisuals(plugin: PluginContext, data: { volume: StateObjectSelector<PluginStateObject.Volume.Data> }) {
  19. const visual = plugin.build().to(data.volume).apply(StateTransforms.Representation.VolumeRepresentation3D);
  20. return [await visual.commit()];
  21. }
  22. export const Ccp4Provider = DataFormatProvider({
  23. label: 'CCP4/MRC/BRIX',
  24. description: 'CCP4/MRC/BRIX',
  25. category: Category,
  26. binaryExtensions: ['ccp4', 'mrc', 'map'],
  27. parse: async (plugin, data) => {
  28. const format = plugin.build()
  29. .to(data)
  30. .apply(StateTransforms.Data.ParseCcp4, {}, { state: { isGhost: true } });
  31. const volume = format.apply(StateTransforms.Volume.VolumeFromCcp4);
  32. await format.commit({ revertOnError: true });
  33. return { format: format.selector, volume: volume.selector };
  34. },
  35. visuals: defaultVisuals
  36. });
  37. export const Dsn6Provider = DataFormatProvider({
  38. label: 'DSN6/BRIX',
  39. description: 'DSN6/BRIX',
  40. category: Category,
  41. binaryExtensions: ['dsn6', 'brix'],
  42. parse: async (plugin, data) => {
  43. const format = plugin.build()
  44. .to(data)
  45. .apply(StateTransforms.Data.ParseDsn6, {}, { state: { isGhost: true } });
  46. const volume = format.apply(StateTransforms.Volume.VolumeFromDsn6);
  47. await format.commit({ revertOnError: true });
  48. return { format: format.selector, volume: volume.selector };
  49. },
  50. visuals: defaultVisuals
  51. });
  52. export const DxProvider = DataFormatProvider({
  53. label: 'DX',
  54. description: 'DX',
  55. category: Category,
  56. stringExtensions: ['dx'],
  57. binaryExtensions: ['dxbin'],
  58. parse: async (plugin, data) => {
  59. const volume = plugin.build()
  60. .to(data)
  61. .apply(StateTransforms.Volume.VolumeFromDx);
  62. await volume.commit({ revertOnError: true });
  63. return { volume: volume.selector };
  64. },
  65. visuals: defaultVisuals
  66. });
  67. export const CubeProvider = DataFormatProvider({
  68. label: 'Cube',
  69. description: 'Cube',
  70. category: Category,
  71. stringExtensions: ['cub', 'cube'],
  72. parse: async (plugin, data) => {
  73. const format = plugin.build()
  74. .to(data)
  75. .apply(StateTransforms.Data.ParseCube, {}, { state: { isGhost: true } });
  76. const volume = format.apply(StateTransforms.Volume.VolumeFromCube);
  77. const structure = format
  78. .apply(StateTransforms.Model.TrajectoryFromCube, void 0, { state: { isGhost: true } })
  79. .apply(StateTransforms.Model.ModelFromTrajectory)
  80. .apply(StateTransforms.Model.StructureFromModel);
  81. await format.commit({ revertOnError: true });
  82. return { format: format.selector, volume: volume.selector, structure: structure.selector };
  83. },
  84. visuals: async (plugin: PluginContext, data: { volume: StateObjectSelector<PluginStateObject.Volume.Data>, structure: StateObjectSelector<PluginStateObject.Molecule.Structure> }) => {
  85. const surfaces = plugin.build();
  86. const volumeData = data.volume.cell?.obj?.data;
  87. const volumePos = surfaces.to(data.volume).apply(StateTransforms.Representation.VolumeRepresentation3D, createVolumeRepresentationParams(plugin, volumeData, {
  88. type: 'isosurface',
  89. typeParams: { isoValue: VolumeIsoValue.relative(1), alpha: 0.4 },
  90. color: 'uniform',
  91. colorParams: { value: ColorNames.red }
  92. }));
  93. const volumeNeg = surfaces.to(data.volume).apply(StateTransforms.Representation.VolumeRepresentation3D, createVolumeRepresentationParams(plugin, volumeData, {
  94. type: 'isosurface',
  95. typeParams: { isoValue: VolumeIsoValue.relative(-1), alpha: 0.4 },
  96. color: 'uniform',
  97. colorParams: { value: ColorNames.blue }
  98. }));
  99. const structure = await plugin.builders.structure.representation.applyPreset(data.structure, 'auto');
  100. await surfaces.commit();
  101. const structureReprs: StateObjectSelector<PluginStateObject.Molecule.Structure.Representation3D>[] = [];
  102. objectForEach(structure?.representations as any, (r: any) => {
  103. if (r) structureReprs.push(r);
  104. });
  105. return [volumePos.selector, volumeNeg.selector, ...structureReprs];
  106. }
  107. });
  108. export const DscifProvider = DataFormatProvider({
  109. label: 'DensityServer CIF',
  110. description: 'DensityServer CIF',
  111. category: Category,
  112. stringExtensions: ['cif'],
  113. binaryExtensions: ['bcif'],
  114. isApplicable: (info, data) => {
  115. return guessCifVariant(info, data) === 'dscif' ? true : false;
  116. },
  117. parse: async (plugin, data) => {
  118. const cifCell = await plugin.build().to(data).apply(StateTransforms.Data.ParseCif).commit();
  119. const b = plugin.build().to(cifCell);
  120. const blocks = cifCell.obj!.data.blocks.slice(1); // zero block contains query meta-data
  121. if (blocks.length !== 1 && blocks.length !== 2) throw new Error('unknown number of blocks');
  122. const volumes: StateObjectSelector<PluginStateObject.Volume.Data>[] = [];
  123. for (const block of blocks) {
  124. volumes.push(b.apply(StateTransforms.Volume.VolumeFromDensityServerCif, { blockHeader: block.header }).selector);
  125. }
  126. await b.commit();
  127. return { volumes };
  128. },
  129. visuals: async (plugin, data: { volumes: StateObjectSelector<PluginStateObject.Volume.Data>[] }) => {
  130. const { volumes } = data;
  131. const tree = plugin.build();
  132. const visuals: StateObjectSelector<PluginStateObject.Volume.Representation3D>[] = [];
  133. if (volumes.length > 0) {
  134. visuals[0] = tree
  135. .to(volumes[0])
  136. .apply(StateTransforms.Representation.VolumeRepresentation3D, VolumeRepresentation3DHelpers.getDefaultParamsStatic(plugin, 'isosurface', { isoValue: VolumeIsoValue.relative(1.5), alpha: 0.3 }, 'uniform', { value: ColorNames.teal }))
  137. .selector;
  138. }
  139. if (volumes.length > 1) {
  140. const posParams = VolumeRepresentation3DHelpers.getDefaultParamsStatic(plugin, 'isosurface', { isoValue: VolumeIsoValue.relative(3), alpha: 0.3 }, 'uniform', { value: ColorNames.green });
  141. const negParams = VolumeRepresentation3DHelpers.getDefaultParamsStatic(plugin, 'isosurface', { isoValue: VolumeIsoValue.relative(-3), alpha: 0.3 }, 'uniform', { value: ColorNames.red });
  142. visuals[visuals.length] = tree.to(volumes[1]).apply(StateTransforms.Representation.VolumeRepresentation3D, posParams).selector;
  143. visuals[visuals.length] = tree.to(volumes[1]).apply(StateTransforms.Representation.VolumeRepresentation3D, negParams).selector;
  144. }
  145. await tree.commit();
  146. return visuals;
  147. }
  148. });
  149. export const BuiltInVolumeFormats = [
  150. ['ccp4', Ccp4Provider] as const,
  151. ['dsn6', Dsn6Provider] as const,
  152. ['cube', CubeProvider] as const,
  153. ['dx', DxProvider] as const,
  154. ['dscif', DscifProvider] as const,
  155. ] as const;
  156. export type BuildInVolumeFormat = (typeof BuiltInVolumeFormats)[number][0]