xyz.ts 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. /**
  2. * Copyright (c) 2021 mol* contributors, licensed under MIT, See LICENSE file for more info.
  3. *
  4. * @author David Sehnal <david.sehnal@gmail.com>
  5. */
  6. import { Column, Table } from '../../mol-data/db';
  7. import { XyzFile } from '../../mol-io/reader/xyz/parser';
  8. import { Trajectory } from '../../mol-model/structure';
  9. import { MoleculeType } from '../../mol-model/structure/model/types';
  10. import { RuntimeContext, Task } from '../../mol-task';
  11. import { ModelFormat } from '../format';
  12. import { createModels } from './basic/parser';
  13. import { BasicSchema, createBasic } from './basic/schema';
  14. import { ComponentBuilder } from './common/component';
  15. import { EntityBuilder } from './common/entity';
  16. function getModels(mol: XyzFile, ctx: RuntimeContext) {
  17. const { molecules } = mol;
  18. let count = 0;
  19. for (const m of molecules) count += m.count;
  20. const type_symbols = new Array<string>(count);
  21. const id = new Int32Array(count);
  22. const x = new Float32Array(count);
  23. const y = new Float32Array(count);
  24. const z = new Float32Array(count);
  25. const model_num = new Int32Array(count);
  26. let offset = 0;
  27. for (let i = 0; i < molecules.length; i++) {
  28. const m = molecules[i];
  29. for (let j = 0; j < m.count; j++) {
  30. type_symbols[offset] = m.type_symbol.value(j);
  31. x[offset] = m.x.value(j);
  32. y[offset] = m.y.value(j);
  33. z[offset] = m.z.value(j);
  34. id[offset] = j;
  35. model_num[offset] = i;
  36. offset++;
  37. }
  38. }
  39. const MOL = Column.ofConst('MOL', count, Column.Schema.str);
  40. const A = Column.ofConst('A', count, Column.Schema.str);
  41. const seq_id = Column.ofConst(1, count, Column.Schema.int);
  42. const type_symbol = Column.ofStringArray(type_symbols);
  43. const atom_site = Table.ofPartialColumns(BasicSchema.atom_site, {
  44. auth_asym_id: A,
  45. auth_atom_id: type_symbol,
  46. auth_comp_id: MOL,
  47. auth_seq_id: seq_id,
  48. Cartn_x: Column.ofFloatArray(x),
  49. Cartn_y: Column.ofFloatArray(y),
  50. Cartn_z: Column.ofFloatArray(z),
  51. id: Column.ofIntArray(id),
  52. label_asym_id: A,
  53. label_atom_id: type_symbol,
  54. label_comp_id: MOL,
  55. label_seq_id: seq_id,
  56. label_entity_id: Column.ofConst('1', count, Column.Schema.str),
  57. occupancy: Column.ofConst(1, count, Column.Schema.float),
  58. type_symbol,
  59. pdbx_PDB_model_num: Column.ofIntArray(model_num),
  60. }, count);
  61. const entityBuilder = new EntityBuilder();
  62. entityBuilder.setNames([['MOL', 'Unknown Entity']]);
  63. entityBuilder.getEntityId('MOL', MoleculeType.Unknown, 'A');
  64. const componentBuilder = new ComponentBuilder(seq_id, type_symbol);
  65. componentBuilder.setNames([['MOL', 'Unknown Molecule']]);
  66. componentBuilder.add('MOL', 0);
  67. const basics = createBasic({
  68. entity: entityBuilder.getEntityTable(),
  69. chem_comp: componentBuilder.getChemCompTable(),
  70. atom_site
  71. });
  72. return createModels(basics, MolFormat.create(mol), ctx);
  73. }
  74. //
  75. export { XyzFormat };
  76. type XyzFormat = ModelFormat<XyzFile>
  77. namespace MolFormat {
  78. export function is(x?: ModelFormat): x is XyzFormat {
  79. return x?.kind === 'mol';
  80. }
  81. export function create(mol: XyzFile): XyzFormat {
  82. return { kind: 'xyz', name: 'xyz', data: mol };
  83. }
  84. }
  85. export function trajectoryFromXyz(mol: XyzFile): Task<Trajectory> {
  86. return Task.create('Parse XYZ', ctx => getModels(mol, ctx));
  87. }