dsn6.ts 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. /**
  2. * Copyright (c) 2019 mol* contributors, licensed under MIT, See LICENSE file for more info.
  3. *
  4. * @author Alexander Rose <alexander.rose@weirdbyte.de>
  5. */
  6. import { VolumeData } from '../../mol-model/volume/data';
  7. import { Task } from '../../mol-task';
  8. import { SpacegroupCell, Box3D } from '../../mol-math/geometry';
  9. import { Tensor, Vec3 } from '../../mol-math/linear-algebra';
  10. import { degToRad } from '../../mol-math/misc';
  11. import { Dsn6File } from '../../mol-io/reader/dsn6/schema';
  12. import { arrayMin, arrayMax, arrayMean, arrayRms } from '../../mol-util/array';
  13. import { ModelFormat } from '../format';
  14. export function volumeFromDsn6(source: Dsn6File, params?: { voxelSize?: Vec3, label?: string }): Task<VolumeData> {
  15. return Task.create<VolumeData>('Create Volume Data', async ctx => {
  16. const { header, values } = source;
  17. const size = Vec3.create(header.xlen, header.ylen, header.zlen);
  18. if (params && params.voxelSize) Vec3.mul(size, size, params.voxelSize);
  19. const angles = Vec3.create(degToRad(header.alpha), degToRad(header.beta), degToRad(header.gamma));
  20. const cell = SpacegroupCell.create('P 1', size, angles);
  21. const grid = [header.xRate, header.yRate, header.zRate];
  22. const extent = [header.xExtent, header.yExtent, header.zExtent];
  23. const gridOrigin = [header.xStart, header.yStart, header.zStart];
  24. const origin_frac = Vec3.create(gridOrigin[0] / grid[0], gridOrigin[1] / grid[1], gridOrigin[2] / grid[2]);
  25. const dimensions_frac = Vec3.create(extent[0] / grid[0], extent[1] / grid[1], extent[2] / grid[2]);
  26. const space = Tensor.Space(extent, [0, 1, 2], Float32Array);
  27. const data = Tensor.create(space, Tensor.Data1(values));
  28. return {
  29. label: params?.label,
  30. transform: { kind: 'spacegroup', cell, fractionalBox: Box3D.create(origin_frac, Vec3.add(Vec3.zero(), origin_frac, dimensions_frac)) },
  31. data,
  32. dataStats: {
  33. min: arrayMin(values),
  34. max: arrayMax(values),
  35. mean: arrayMean(values),
  36. sigma: header.sigma !== undefined ? header.sigma : arrayRms(values)
  37. },
  38. sourceData: Dsn6Format.create(source)
  39. };
  40. });
  41. }
  42. //
  43. export { Dsn6Format };
  44. type Dsn6Format = ModelFormat<Dsn6File>
  45. namespace Dsn6Format {
  46. export function is(x: ModelFormat): x is Dsn6Format {
  47. return x.kind === 'dsn6';
  48. }
  49. export function create(dsn6: Dsn6File): Dsn6Format {
  50. return { kind: 'dsn6', name: dsn6.name, data: dsn6 };
  51. }
  52. }