coordinates.ts 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  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 { UUID } from '../../../mol-util';
  7. import { Cell } from '../../../mol-math/geometry/spacegroup/cell';
  8. import { AtomicConformation } from '../model/properties/atomic';
  9. import { Column } from '../../../mol-data/db';
  10. export interface Frame {
  11. readonly elementCount: number
  12. readonly cell: Cell
  13. readonly time: Time
  14. // positions
  15. readonly x: ArrayLike<number>
  16. readonly y: ArrayLike<number>
  17. readonly z: ArrayLike<number>
  18. // optional velocities
  19. readonly velocities?: {
  20. readonly vx: ArrayLike<number>
  21. readonly vy: ArrayLike<number>
  22. readonly vz: ArrayLike<number>
  23. }
  24. // optional forces
  25. readonly forces?: {
  26. readonly fx: ArrayLike<number>
  27. readonly fy: ArrayLike<number>
  28. readonly fz: ArrayLike<number>
  29. }
  30. }
  31. //
  32. export { Time }
  33. interface Time {
  34. value: number
  35. unit: Time.Unit
  36. }
  37. function Time(value: number, unit: Time.Unit) {
  38. return { value, unit }
  39. }
  40. namespace Time {
  41. export type Unit = 'ps' | 'step'
  42. // TODO: conversion utilities
  43. }
  44. //
  45. export { Coordinates }
  46. interface Coordinates {
  47. readonly id: UUID
  48. readonly frames: Frame[]
  49. /** Number of elements (e.g. atoms) in frames */
  50. readonly elementCount: number
  51. readonly hasVelocities: boolean
  52. readonly hasForces: boolean
  53. readonly deltaTime: Time
  54. readonly timeOffset: Time
  55. }
  56. namespace Coordinates {
  57. export function create(frames: Frame[], deltaTime: Time, timeOffset: Time): Coordinates {
  58. const elementCount = frames[0].elementCount
  59. const hasVelocities = !!frames[0].velocities
  60. const hasForces = !!frames[0].forces
  61. return {
  62. id: UUID.create22(),
  63. frames,
  64. elementCount,
  65. hasVelocities,
  66. hasForces,
  67. deltaTime,
  68. timeOffset
  69. }
  70. }
  71. export function getAtomicConformation(frame: Frame, atomId: Column<number>): AtomicConformation {
  72. return {
  73. id: UUID.create22(),
  74. atomId,
  75. occupancy: Column.ofConst(1, frame.elementCount, Column.Schema.int),
  76. B_iso_or_equiv: Column.ofConst(0, frame.elementCount, Column.Schema.float),
  77. xyzDefined: true,
  78. x: frame.x,
  79. y: frame.y,
  80. z: frame.z,
  81. }
  82. }
  83. }