anisotropic.ts 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  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 { CifField } from '../../../mol-io/reader/cif';
  7. import { mmCIF_Schema } from '../../../mol-io/reader/cif/schema/mmcif';
  8. import { TokenBuilder, Tokenizer } from '../../../mol-io/reader/common/text/tokenizer';
  9. import { guessElementSymbolTokens } from '../util';
  10. import { parseIntSkipLeadingWhitespace as fastParseInt } from '../../../mol-io/reader/common/text/number-parser';
  11. type AnisotropicTemplate = typeof getAnisotropicTemplate extends (...args: any) => infer T ? T : never
  12. export function getAnisotropicTemplate(data: string, count: number) {
  13. const str = () => [] as string[];
  14. const float = () => new Float32Array(count);
  15. const ts = () => TokenBuilder.create(data, 2 * count);
  16. return {
  17. index: 0,
  18. count,
  19. id: str(),
  20. type_symbol: ts(),
  21. pdbx_label_atom_id: ts(),
  22. pdbx_label_alt_id: ts(),
  23. pdbx_label_comp_id: ts(),
  24. pdbx_label_asym_id: ts(),
  25. pdbx_label_seq_id: ts(),
  26. pdbx_PDB_ins_code: ts(),
  27. 'U[1][1]': float(),
  28. 'U[2][2]': float(),
  29. 'U[3][3]': float(),
  30. 'U[1][2]': float(),
  31. 'U[1][3]': float(),
  32. 'U[2][3]': float(),
  33. pdbx_auth_seq_id: ts(),
  34. pdbx_auth_comp_id: ts(),
  35. pdbx_auth_asym_id: ts(),
  36. pdbx_auth_atom_id: ts(),
  37. };
  38. }
  39. export function getAnisotropic(sites: AnisotropicTemplate): { [K in keyof mmCIF_Schema['atom_site_anisotrop']]?: CifField } {
  40. const pdbx_auth_seq_id = CifField.ofTokens(sites.pdbx_auth_seq_id);
  41. const pdbx_auth_comp_id = CifField.ofTokens(sites.pdbx_auth_comp_id);
  42. const pdbx_auth_asym_id = CifField.ofTokens(sites.pdbx_auth_asym_id);
  43. const pdbx_auth_atom_id = CifField.ofTokens(sites.pdbx_auth_atom_id);
  44. const fields: { [K in keyof mmCIF_Schema['atom_site_anisotrop']]?: CifField } = {
  45. id: CifField.ofStrings(sites.id),
  46. type_symbol: CifField.ofTokens(sites.type_symbol),
  47. pdbx_label_atom_id: pdbx_auth_atom_id,
  48. pdbx_label_alt_id: CifField.ofTokens(sites.pdbx_label_alt_id),
  49. pdbx_label_comp_id: pdbx_auth_comp_id,
  50. pdbx_label_asym_id: pdbx_auth_asym_id,
  51. pdbx_label_seq_id: pdbx_auth_seq_id,
  52. pdbx_PDB_ins_code: CifField.ofTokens(sites.pdbx_PDB_ins_code),
  53. pdbx_auth_seq_id,
  54. pdbx_auth_comp_id,
  55. pdbx_auth_asym_id,
  56. pdbx_auth_atom_id,
  57. };
  58. (fields as any)['U[1][1]'] = CifField.ofNumbers(sites['U[1][1]']);
  59. (fields as any)['U[2][2]'] = CifField.ofNumbers(sites['U[2][2]']);
  60. (fields as any)['U[3][3]'] = CifField.ofNumbers(sites['U[3][3]']);
  61. (fields as any)['U[1][2]'] = CifField.ofNumbers(sites['U[1][2]']);
  62. (fields as any)['U[1][3]'] = CifField.ofNumbers(sites['U[1][3]']);
  63. (fields as any)['U[2][3]'] = CifField.ofNumbers(sites['U[2][3]']);
  64. return fields;
  65. }
  66. export function addAnisotropic(sites: AnisotropicTemplate, model: string, data: Tokenizer, s: number, e: number) {
  67. const { data: str } = data;
  68. const length = e - s;
  69. // COLUMNS DATA TYPE FIELD DEFINITION
  70. // -----------------------------------------------------------------
  71. // 1 - 6 Record name "ANISOU"
  72. // 7 - 11 Integer serial Atom serial number.
  73. Tokenizer.trim(data, s + 6, s + 11);
  74. sites.id[sites.index] = str.substring(data.tokenStart, data.tokenEnd);
  75. // 13 - 16 Atom name Atom name.
  76. TokenBuilder.addToken(sites.pdbx_auth_atom_id, Tokenizer.trim(data, s + 12, s + 16));
  77. // 17 Character altLoc Alternate location indicator
  78. if (str.charCodeAt(s + 16) === 32) { // ' '
  79. TokenBuilder.add(sites.pdbx_label_alt_id, 0, 0);
  80. } else {
  81. TokenBuilder.add(sites.pdbx_label_alt_id, s + 16, s + 17);
  82. }
  83. // 18 - 20 Residue name resName Residue name.
  84. TokenBuilder.addToken(sites.pdbx_auth_comp_id, Tokenizer.trim(data, s + 17, s + 20));
  85. // 22 Character chainID Chain identifier.
  86. TokenBuilder.add(sites.pdbx_auth_asym_id, s + 21, s + 22);
  87. // 23 - 26 Integer resSeq Residue sequence number.
  88. TokenBuilder.addToken(sites.pdbx_auth_seq_id, Tokenizer.trim(data, s + 22, s + 26));
  89. // 27 AChar iCode Insertion code.
  90. if (str.charCodeAt(s + 26) === 32) { // ' '
  91. TokenBuilder.add(sites.pdbx_PDB_ins_code, 0, 0);
  92. } else {
  93. TokenBuilder.add(sites.pdbx_PDB_ins_code, s + 26, s + 27);
  94. }
  95. // 29 - 35 Integer u[0][0] U(1,1)
  96. sites['U[1][1]'][sites.index] = fastParseInt(str, s + 28, s + 35) / 10000;
  97. // 36 - 42 Integer u[1][1] U(2,2)
  98. sites['U[2][2]'][sites.index] = fastParseInt(str, s + 35, s + 42) / 10000;
  99. // 43 - 49 Integer u[2][2] U(3,3)
  100. sites['U[3][3]'][sites.index] = fastParseInt(str, s + 42, s + 49) / 10000;
  101. // 50 - 56 Integer u[0][1] U(1,2)
  102. sites['U[1][2]'][sites.index] = fastParseInt(str, s + 49, s + 56) / 10000;
  103. // 57 - 63 Integer u[0][2] U(1,3)
  104. sites['U[1][3]'][sites.index] = fastParseInt(str, s + 56, s + 63) / 10000;
  105. // 64 - 70 Integer u[1][2] U(2,3)
  106. sites['U[2][3]'][sites.index] = fastParseInt(str, s + 63, s + 70) / 10000;
  107. // 77 - 78 LString(2) element Element symbol, right-justified.
  108. if (length >= 78) {
  109. Tokenizer.trim(data, s + 76, s + 78);
  110. if (data.tokenStart < data.tokenEnd) {
  111. TokenBuilder.addToken(sites.type_symbol, data);
  112. } else {
  113. guessElementSymbolTokens(sites.type_symbol, str, s + 12, s + 16);
  114. }
  115. } else {
  116. guessElementSymbolTokens(sites.type_symbol, str, s + 12, s + 16);
  117. }
  118. // 79 - 80 LString(2) charge Charge on the atom.
  119. // TODO
  120. sites.index++;
  121. }