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

src/geometry/contact-utils.js

  1. /**
  2. * @file Contact Utils
  3. * @author Alexander Rose <alexander.rose@weirdbyte.de>
  4. * @private
  5. */
  6.  
  7. import { Vector3 } from '../../lib/three.es6.js'
  8.  
  9. import { radToDeg } from '../math/math-utils.js'
  10. import Contact from './contact.js'
  11. import Selection from '../selection/selection.js'
  12.  
  13. function polarContacts (structure, maxDistance, maxAngle) {
  14. maxDistance = maxDistance || 3.5
  15. maxAngle = maxAngle || 40
  16.  
  17. var donorSelection = new Selection(
  18. '( ARG and ( .NE or .NH1 or .NH2 ) ) or ' +
  19. '( ASP and .ND2 ) or ' +
  20. '( GLN and .NE2 ) or ' +
  21. '( HIS and ( .ND1 or .NE2 ) ) or ' +
  22. '( LYS and .NZ ) or ' +
  23. '( SER and .OG ) or ' +
  24. '( THR and .OG1 ) or ' +
  25. '( TRP and .NE1 ) or ' +
  26. '( TYR and .OH ) or ' +
  27. '( PROTEIN and .N )'
  28. )
  29.  
  30. var acceptorSelection = new Selection(
  31. '( ASN and .OD1 ) or ' +
  32. '( ASP and ( OD1 or .OD2 ) ) or ' +
  33. '( GLN and .OE1 ) or ' +
  34. '( GLU and ( .OE1 or .OE2 ) ) or ' +
  35. '( HIS and ( .ND1 or .NE2 ) ) or ' +
  36. '( SER and .OG ) or ' +
  37. '( THR and .OG1 ) or ' +
  38. '( TYR and .OH ) or ' +
  39. '( PROTEIN and .O )'
  40. )
  41.  
  42. var donorView = structure.getView(donorSelection)
  43. var acceptorView = structure.getView(acceptorSelection)
  44.  
  45. var contact = new Contact(donorView, acceptorView)
  46. var data = contact.within(maxDistance)
  47. var bondStore = data.bondStore
  48.  
  49. var ap1 = structure.getAtomProxy()
  50. var ap2 = structure.getAtomProxy()
  51. var atomCA = structure.getAtomProxy()
  52. var atomC = structure.getAtomProxy()
  53. var rp = structure.getResidueProxy()
  54. var rpPrev = structure.getResidueProxy()
  55. var v1 = new Vector3()
  56. var v2 = new Vector3()
  57.  
  58. var checkAngle = function (atom1, atom2, oName, cName) {
  59. var atomO, atomN
  60.  
  61. if (atom1.atomname === oName) {
  62. atomO = atom1
  63. atomN = atom2
  64. } else {
  65. atomO = atom2
  66. atomN = atom1
  67. }
  68.  
  69. rp.index = atomO.residueIndex
  70. var atomC = rp.getAtomIndexByName(cName)
  71.  
  72. v1.subVectors(atomC, atomO)
  73. v2.subVectors(atomC, atomN)
  74.  
  75. return radToDeg(v1.angleTo(v2)) < maxAngle
  76. }
  77.  
  78. for (var i = 0, il = bondStore.count; i < il; ++i) {
  79. ap1.index = bondStore.atomIndex1[ i ]
  80. ap2.index = bondStore.atomIndex2[ i ]
  81.  
  82. if ((ap1.atomname === 'O' && ap2.atomname === 'N') ||
  83. (ap1.atomname === 'N' && ap2.atomname === 'O')
  84. ) {
  85. // ignore backbone to backbone contacts
  86. data.bondSet.clear(i)
  87. continue
  88. } else if (ap1.atomname === 'N' || ap2.atomname === 'N') {
  89. var atomN, atomX
  90.  
  91. if (ap1.atomname === 'N') {
  92. atomN = ap1
  93. atomX = ap2
  94. } else {
  95. atomN = ap2
  96. atomX = ap1
  97. }
  98.  
  99. rp.index = atomN.residueIndex
  100. atomCA.index = rp.getAtomIndexByName('CA')
  101. if (atomCA.index === undefined) continue
  102.  
  103. var prevRes = rp.getPreviousConnectedResidue(rpPrev)
  104. if (prevRes === undefined) continue
  105.  
  106. atomC.index = prevRes.getAtomIndexByName('C')
  107. if (atomC.index === undefined) continue
  108.  
  109. v1.subVectors(atomN, atomC)
  110. v2.subVectors(atomN, atomCA)
  111. v1.add(v2).multiplyScalar(0.5)
  112. v2.subVectors(atomX, atomN)
  113.  
  114. if (radToDeg(v1.angleTo(v2)) > maxAngle) {
  115. data.bondSet.clear(i)
  116. }
  117. } else if (
  118. (ap1.atomname === 'OH' && ap1.resname === 'TYR') ||
  119. (ap2.atomname === 'OH' && ap2.resname === 'TYR')
  120. ) {
  121. if (!checkAngle(ap1, ap2, 'OH', 'CZ')) {
  122. data.bondSet.clear(i)
  123. }
  124. }
  125. }
  126.  
  127. return {
  128. atomSet: data.atomSet,
  129. bondSet: data.bondSet,
  130. bondStore: data.bondStore
  131. }
  132. }
  133.  
  134. function polarBackboneContacts (structure, maxDistance, maxAngle) {
  135. maxDistance = maxDistance || 3.5
  136. maxAngle = maxAngle || 40
  137.  
  138. var donorSelection = new Selection(
  139. '( PROTEIN and .N )'
  140. )
  141.  
  142. var acceptorSelection = new Selection(
  143. '( PROTEIN and .O )'
  144. )
  145.  
  146. var donorView = structure.getView(donorSelection)
  147. var acceptorView = structure.getView(acceptorSelection)
  148.  
  149. var contact = new Contact(donorView, acceptorView)
  150. var data = contact.within(maxDistance)
  151. var bondStore = data.bondStore
  152.  
  153. var ap1 = structure.getAtomProxy()
  154. var ap2 = structure.getAtomProxy()
  155. var atomCA = structure.getAtomProxy()
  156. var atomC = structure.getAtomProxy()
  157. var rp = structure.getResidueProxy()
  158. var rpPrev = structure.getResidueProxy()
  159. var v1 = new Vector3()
  160. var v2 = new Vector3()
  161.  
  162. for (var i = 0, il = bondStore.count; i < il; ++i) {
  163. ap1.index = bondStore.atomIndex1[ i ]
  164. ap2.index = bondStore.atomIndex2[ i ]
  165.  
  166. var atomN, atomO
  167.  
  168. if (ap1.atomname === 'N') {
  169. atomN = ap1
  170. atomO = ap2
  171. } else {
  172. atomN = ap2
  173. atomO = ap1
  174. }
  175.  
  176. rp.index = atomN.residueIndex
  177.  
  178. atomCA.index = rp.getAtomIndexByName('CA')
  179. if (atomCA.index === undefined) continue
  180.  
  181. var prevRes = rp.getPreviousConnectedResidue(rpPrev)
  182. if (prevRes === undefined) continue
  183.  
  184. atomC.index = prevRes.getAtomIndexByName('C')
  185. if (atomC.index === undefined) continue
  186.  
  187. v1.subVectors(atomN, atomC)
  188. v2.subVectors(atomN, atomCA)
  189. v1.add(v2).multiplyScalar(0.5)
  190. v2.subVectors(atomO, atomN)
  191.  
  192. // Log.log( radToDeg( v1.angleTo( v2 ) ) );
  193.  
  194. if (radToDeg(v1.angleTo(v2)) > maxAngle) {
  195. data.bondSet.clear(i)
  196. }
  197. }
  198.  
  199. return {
  200. atomSet: data.atomSet,
  201. bondSet: data.bondSet,
  202. bondStore: data.bondStore
  203. }
  204. }
  205.  
  206. export {
  207. polarContacts,
  208. polarBackboneContacts
  209. }