anisotropic.ts 3.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  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, Column } from '../../../mol-data/db';
  7. import { CustomPropertyDescriptor } from '../../../mol-model/custom-property';
  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. import { MmcifFormat } from '../mmcif';
  12. export { AtomSiteAnisotrop };
  13. const Anisotrop = {
  14. U: mmCIF_Schema.atom_site_anisotrop.U,
  15. U_esd: mmCIF_Schema.atom_site_anisotrop.U_esd
  16. };
  17. type Anisotrop = Table<typeof Anisotrop>
  18. interface AtomSiteAnisotrop {
  19. data: Anisotrop
  20. /** maps atom_site-index to atom_site_anisotrop-index */
  21. elementToAnsiotrop: Int32Array
  22. }
  23. namespace AtomSiteAnisotrop {
  24. export const Schema = Anisotrop;
  25. export const Descriptor: CustomPropertyDescriptor = {
  26. name: 'atom_site_anisotrop',
  27. cifExport: {
  28. prefix: '',
  29. categories: [{
  30. name: 'atom_site_anisotrop',
  31. instance(ctx) {
  32. const p = Provider.get(ctx.firstModel);
  33. if (!p) return CifWriter.Category.Empty;
  34. if (!MmcifFormat.is(ctx.firstModel.sourceData)) return CifWriter.Category.Empty;
  35. // TODO filter to write only data for elements that exist in model
  36. return CifWriter.Category.ofTable(ctx.firstModel.sourceData.data.db.atom_site_anisotrop);
  37. }
  38. }]
  39. }
  40. };
  41. export const Provider = FormatPropertyProvider.create<AtomSiteAnisotrop>(Descriptor);
  42. export function getElementToAnsiotrop(atomId: Column<number>, ansioId: Column<number>) {
  43. const atomIdToElement = new Int32Array(atomId.rowCount);
  44. atomIdToElement.fill(-1);
  45. for (let i = 0, il = atomId.rowCount; i < il; i++) {
  46. atomIdToElement[atomId.value(i)] = i;
  47. }
  48. const elementToAnsiotrop = new Int32Array(atomId.rowCount);
  49. elementToAnsiotrop.fill(-1);
  50. for (let i = 0, il = ansioId.rowCount; i < il; ++i) {
  51. const ei = atomIdToElement[ansioId.value(i)];
  52. if (ei !== -1) elementToAnsiotrop[ei] = i;
  53. }
  54. return elementToAnsiotrop;
  55. }
  56. export function getElementToAnsiotropFromLabel(atomLabel: Column<string>, ansioLabel: Column<string>) {
  57. const atomLabelToElement: { [k: string]: number | undefined } = {};
  58. for (let i = 0, il = atomLabel.rowCount; i < il; i++) {
  59. atomLabelToElement[atomLabel.value(i)] = i;
  60. }
  61. const elementToAnsiotrop = new Int32Array(atomLabel.rowCount);
  62. elementToAnsiotrop.fill(-1);
  63. for (let i = 0, il = ansioLabel.rowCount; i < il; ++i) {
  64. const ei = atomLabelToElement[ansioLabel.value(i)];
  65. if (ei !== undefined) elementToAnsiotrop[ei] = i;
  66. }
  67. return elementToAnsiotrop;
  68. }
  69. }