coarse.ts 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  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 { CoarseHierarchy, CoarseConformation, CoarseElementData, CoarseSphereConformation, CoarseGaussianConformation } from '../../../mol-model/structure/model/properties/coarse';
  8. import { Entities } from '../../../mol-model/structure/model/properties/common';
  9. import { Column } from '../../../mol-data/db';
  10. import { getCoarseKeys } from '../../../mol-model/structure/model/properties/utils/coarse-keys';
  11. import { UUID } from '../../../mol-util';
  12. import { Segmentation, Interval } from '../../../mol-data/int';
  13. import { Mat3, Tensor } from '../../../mol-math/linear-algebra';
  14. import { ElementIndex, ChainIndex } from '../../../mol-model/structure/model/indexing';
  15. import { getCoarseRanges } from '../../../mol-model/structure/model/properties/utils/coarse-ranges';
  16. import { IhmSphereObjSite, IhmGaussianObjSite, AtomSite, BasicSchema } from './schema';
  17. import { Model } from '../../../mol-model/structure';
  18. export interface CoarseData {
  19. model_id: number,
  20. model_name: string,
  21. model_group_name: string,
  22. entities: Entities,
  23. atom_site: AtomSite,
  24. atom_site_sourceIndex: Column<number>,
  25. ihm_sphere_obj_site: IhmSphereObjSite,
  26. ihm_gaussian_obj_site: IhmGaussianObjSite
  27. }
  28. export const EmptyCoarse = { hierarchy: CoarseHierarchy.Empty, conformation: void 0 as any };
  29. export function getCoarse(data: CoarseData, chemicalComponentMap: Model['properties']['chemicalComponentMap']): { hierarchy: CoarseHierarchy, conformation: CoarseConformation } {
  30. const { ihm_sphere_obj_site, ihm_gaussian_obj_site } = data;
  31. if (ihm_sphere_obj_site._rowCount === 0 && ihm_gaussian_obj_site._rowCount === 0) return EmptyCoarse;
  32. const sphereData = getData(ihm_sphere_obj_site);
  33. const sphereConformation = getSphereConformation(ihm_sphere_obj_site);
  34. const sphereKeys = getCoarseKeys(sphereData, data.entities);
  35. const sphereRanges = getCoarseRanges(sphereData, chemicalComponentMap);
  36. const gaussianData = getData(ihm_gaussian_obj_site);
  37. const gaussianConformation = getGaussianConformation(ihm_gaussian_obj_site);
  38. const gaussianKeys = getCoarseKeys(gaussianData, data.entities);
  39. const gaussianRanges = getCoarseRanges(gaussianData, chemicalComponentMap);
  40. return {
  41. hierarchy: {
  42. isDefined: true,
  43. spheres: { ...sphereData, ...sphereKeys, ...sphereRanges },
  44. gaussians: { ...gaussianData, ...gaussianKeys, ...gaussianRanges },
  45. },
  46. conformation: {
  47. id: UUID.create22(),
  48. spheres: sphereConformation,
  49. gaussians: gaussianConformation
  50. }
  51. };
  52. }
  53. function getSphereConformation(data: IhmSphereObjSite): CoarseSphereConformation {
  54. return {
  55. x: data.Cartn_x.toArray({ array: Float32Array }),
  56. y: data.Cartn_y.toArray({ array: Float32Array }),
  57. z: data.Cartn_z.toArray({ array: Float32Array }),
  58. radius: data.object_radius.toArray({ array: Float32Array }),
  59. rmsf: data.rmsf.toArray({ array: Float32Array })
  60. };
  61. }
  62. function getGaussianConformation(data: IhmGaussianObjSite): CoarseGaussianConformation {
  63. const matrix_space = BasicSchema.ihm_gaussian_obj_site.covariance_matrix.space;
  64. const covariance_matrix: Mat3[] = [];
  65. const { covariance_matrix: cm } = data;
  66. for (let i = 0, _i = cm.rowCount; i < _i; i++) {
  67. covariance_matrix[i] = Tensor.toMat3(Mat3(), matrix_space, cm.value(i));
  68. }
  69. return {
  70. x: data.mean_Cartn_x.toArray({ array: Float32Array }),
  71. y: data.mean_Cartn_y.toArray({ array: Float32Array }),
  72. z: data.mean_Cartn_z.toArray({ array: Float32Array }),
  73. weight: data.weight.toArray({ array: Float32Array }),
  74. covariance_matrix
  75. };
  76. }
  77. function getSegments(asym_id: Column<string>, seq_id_begin: Column<number>, seq_id_end: Column<number>) {
  78. const chainOffsets = [0 as ElementIndex];
  79. for (let i = 1, _i = asym_id.rowCount; i < _i; i++) {
  80. const newChain = !asym_id.areValuesEqual(i - 1, i);
  81. if (newChain) chainOffsets[chainOffsets.length] = i as ElementIndex;
  82. }
  83. return {
  84. chainElementSegments: Segmentation.ofOffsets<ElementIndex, ChainIndex>(chainOffsets, Interval.ofBounds(0, asym_id.rowCount))
  85. };
  86. }
  87. function getData(data: IhmSphereObjSite | IhmGaussianObjSite): CoarseElementData {
  88. const { entity_id, seq_id_begin, seq_id_end, asym_id } = data;
  89. return { count: entity_id.rowCount, entity_id, asym_id, seq_id_begin, seq_id_end, ...getSegments(asym_id, seq_id_begin, seq_id_end) };
  90. }