dx.ts 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. /**
  2. * Copyright (c) 2020 mol* contributors, licensed under MIT, See LICENSE file for more info.
  3. *
  4. * @author David Sehnal <david.sehnal@gmail.com>
  5. */
  6. import { DxFile } from '../../mol-io/reader/dx/parser';
  7. import { Mat4, Tensor } from '../../mol-math/linear-algebra';
  8. import { VolumeData } from '../../mol-model/volume/data';
  9. import { Task } from '../../mol-task';
  10. import { arrayMax, arrayMean, arrayMin, arrayRms } from '../../mol-util/array';
  11. import { ModelFormat } from '../format';
  12. export function volumeFromDx(source: DxFile, params?: { label?: string }): Task<VolumeData> {
  13. return Task.create<VolumeData>('Create Volume Data', async () => {
  14. const { header, values } = source;
  15. const space = Tensor.Space(header.dim, [0, 1, 2], Float64Array);
  16. const data = Tensor.create(space, Tensor.Data1(values));
  17. const matrix = Mat4.fromTranslation(Mat4(), header.min);
  18. const basis = Mat4.fromScaling(Mat4(), header.h);
  19. Mat4.mul(matrix, matrix, basis);
  20. return {
  21. label: params?.label,
  22. transform: { kind: 'matrix', matrix },
  23. data,
  24. dataStats: {
  25. min: arrayMin(values),
  26. max: arrayMax(values),
  27. mean: arrayMean(values),
  28. sigma: arrayRms(values)
  29. },
  30. sourceData: DxFormat.create(source)
  31. };
  32. });
  33. }
  34. //
  35. export { DxFormat };
  36. type DxFormat = ModelFormat<DxFile>
  37. namespace DxFormat {
  38. export function is(x: ModelFormat): x is DxFormat {
  39. return x.kind === 'dx';
  40. }
  41. export function create(dx: DxFile): DxFormat {
  42. return { kind: 'dx', name: dx.name, data: dx };
  43. }
  44. }