NGL@1.0.0-beta.7 Home Manual Reference Source Gallery

src/geometry/helixbundle.js

  1. /**
  2. * @file Helixbundle
  3. * @author Alexander Rose <alexander.rose@weirdbyte.de>
  4. * @private
  5. */
  6.  
  7. import { Vector3 } from '../../lib/three.es6.js'
  8.  
  9. import { ColormakerRegistry } from '../globals.js'
  10. import { AtomPicker } from '../utils/picker.js'
  11. import RadiusFactory from '../utils/radius-factory.js'
  12. import Helixorient from './helixorient.js'
  13. import { calculateMeanVector3, projectPointOnVector } from '../math/vector-utils.js'
  14.  
  15. function Helixbundle (polymer) {
  16. this.polymer = polymer
  17.  
  18. this.helixorient = new Helixorient(polymer)
  19. this.position = this.helixorient.getPosition()
  20. }
  21.  
  22. Helixbundle.prototype = {
  23.  
  24. constructor: Helixbundle,
  25.  
  26. getAxis: function (localAngle, centerDist, ssBorder, colorParams, radius, scale) {
  27. localAngle = localAngle || 30
  28. centerDist = centerDist || 2.5
  29. ssBorder = ssBorder === undefined ? false : ssBorder
  30.  
  31. var polymer = this.polymer
  32. var structure = polymer.structure
  33. var n = polymer.residueCount
  34. var residueIndexStart = polymer.residueIndexStart
  35.  
  36. var pos = this.position
  37.  
  38. var cp = colorParams || {}
  39. cp.structure = structure
  40.  
  41. var colormaker = ColormakerRegistry.getScheme(cp)
  42.  
  43. var radiusFactory = new RadiusFactory(radius, scale)
  44.  
  45. var j = 0
  46. var k = 0
  47.  
  48. var axis = []
  49. var center = []
  50. var beg = []
  51. var end = []
  52. var col = []
  53. var pick = []
  54. var size = []
  55. var residueOffset = []
  56. var residueCount = []
  57.  
  58. var tmpAxis = []
  59. var tmpCenter = []
  60.  
  61. var _axis, _center
  62. var _beg = new Vector3()
  63. var _end = new Vector3()
  64.  
  65. var rp1 = structure.getResidueProxy()
  66. var rp2 = structure.getResidueProxy()
  67. var ap = structure.getAtomProxy()
  68.  
  69. var c1 = new Vector3()
  70. var c2 = new Vector3()
  71.  
  72. var split = false
  73.  
  74. for (var i = 0; i < n; ++i) {
  75. rp1.index = residueIndexStart + i
  76. c1.fromArray(pos.center, i * 3)
  77.  
  78. if (i === n - 1) {
  79. split = true
  80. } else {
  81. rp2.index = residueIndexStart + i + 1
  82. c2.fromArray(pos.center, i * 3 + 3)
  83.  
  84. if (ssBorder && rp1.sstruc !== rp2.sstruc) {
  85. split = true
  86. } else if (c1.distanceTo(c2) > centerDist) {
  87. split = true
  88. } else if (pos.bending[ i ] > localAngle) {
  89. split = true
  90. }
  91. }
  92.  
  93. if (split) {
  94. if (i - j < 4) {
  95. j = i
  96. split = false
  97. continue
  98. }
  99.  
  100. ap.index = rp1.traceAtomIndex
  101.  
  102. // ignore first and last axis
  103. tmpAxis = pos.axis.subarray(j * 3 + 3, i * 3)
  104. tmpCenter = pos.center.subarray(j * 3, i * 3 + 3)
  105.  
  106. _axis = calculateMeanVector3(tmpAxis).normalize()
  107. _center = calculateMeanVector3(tmpCenter)
  108.  
  109. _beg.fromArray(tmpCenter)
  110. projectPointOnVector(_beg, _axis, _center)
  111.  
  112. _end.fromArray(tmpCenter, tmpCenter.length - 3)
  113. projectPointOnVector(_end, _axis, _center)
  114.  
  115. _axis.subVectors(_end, _beg)
  116.  
  117. _axis.toArray(axis, k)
  118. _center.toArray(center, k)
  119. _beg.toArray(beg, k)
  120. _end.toArray(end, k)
  121.  
  122. colormaker.atomColorToArray(ap, col, k)
  123.  
  124. pick.push(ap.index)
  125.  
  126. size.push(radiusFactory.atomRadius(ap))
  127.  
  128. residueOffset.push(residueIndexStart + j)
  129. residueCount.push(residueIndexStart + i + 1 - j)
  130.  
  131. k += 3
  132. j = i
  133. split = false
  134. }
  135. }
  136.  
  137. var picking = new Float32Array(pick)
  138.  
  139. return {
  140. 'axis': new Float32Array(axis),
  141. 'center': new Float32Array(center),
  142. 'begin': new Float32Array(beg),
  143. 'end': new Float32Array(end),
  144. 'color': new Float32Array(col),
  145. 'picking': new AtomPicker(picking, structure),
  146. 'size': new Float32Array(size),
  147. 'residueOffset': residueOffset,
  148. 'residueCount': residueCount
  149. }
  150. }
  151.  
  152. }
  153.  
  154. export default Helixbundle