anisotropic.ts 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. /**
  2. * Copyright (c) 2019-2020 mol* contributors, licensed under MIT, See LICENSE file for more info.
  3. *
  4. * @author Alexander Rose <alexander.rose@weirdbyte.de>
  5. */
  6. import { Table } from '../../../mol-data/db';
  7. import { Model, CustomPropertyDescriptor } from '../../../mol-model/structure';
  8. import { mmCIF_Schema } from '../../../mol-io/reader/cif/schema/mmcif';
  9. import { CifWriter } from '../../../mol-io/writer/cif';
  10. import { FormatPropertyProvider } from '../common/property';
  11. export { AtomSiteAnisotrop }
  12. type Anisotrop = Table<mmCIF_Schema['atom_site_anisotrop']>
  13. interface AtomSiteAnisotrop {
  14. data: Anisotrop
  15. /** maps atom_site-index to atom_site_anisotrop-index */
  16. elementToAnsiotrop: Int32Array
  17. }
  18. namespace AtomSiteAnisotrop {
  19. export const Descriptor: CustomPropertyDescriptor = {
  20. name: 'atom_site_anisotrop',
  21. cifExport: {
  22. prefix: '',
  23. categories: [{
  24. name: 'atom_site_anisotrop',
  25. instance(ctx) {
  26. const p = Provider.get(ctx.firstModel);
  27. if (!p) return CifWriter.Category.Empty;
  28. // TODO filter to write only data for elements that exist in model
  29. return CifWriter.Category.ofTable(p.data);
  30. }
  31. }]
  32. }
  33. };
  34. export const Provider = FormatPropertyProvider.create<AtomSiteAnisotrop>(Descriptor)
  35. export function getElementToAnsiotrop(model: Model, data: Anisotrop) {
  36. const { atomId } = model.atomicConformation
  37. const atomIdToElement = new Int32Array(atomId.rowCount)
  38. atomIdToElement.fill(-1)
  39. for (let i = 0, il = atomId.rowCount; i < il; i++) {
  40. atomIdToElement[atomId.value(i)] = i
  41. }
  42. const { id } = data
  43. const elementToAnsiotrop = new Int32Array(atomId.rowCount)
  44. elementToAnsiotrop.fill(-1)
  45. for (let i = 0, il = id.rowCount; i < il; ++i) {
  46. const ei = atomIdToElement[id.value(i)]
  47. if (ei !== -1) elementToAnsiotrop[ei] = i
  48. }
  49. return elementToAnsiotrop
  50. }
  51. }