UNPKG

biojs-vis-pdbviewer

Version:

A BioJS 2.0 component to view protein structures

250 lines (245 loc) 10 kB
Clazz.declarePackage ("JM"); Clazz.load (["JM.AlphaPolymer"], "JM.AminoPolymer", ["JU.Measure", "$.P3", "$.V3", "J.c.STR", "JM.HBond", "JU.Logger"], function () { c$ = Clazz.decorateAsClass (function () { this.structureList = null; Clazz.instantialize (this, arguments); }, JM, "AminoPolymer", JM.AlphaPolymer); Clazz.makeConstructor (c$, function (monomers) { Clazz.superConstructor (this, JM.AminoPolymer, [monomers]); this.type = 1; for (var i = 0; i < this.monomerCount; ++i) if (!(monomers[i]).hasOAtom ()) return; this.hasWingPoints = true; }, "~A"); Clazz.overrideMethod (c$, "resetHydrogenPoints", function () { var ps; var psLast = null; for (var i = 0; i < this.monomerCount; i++) { if ((ps = this.getProteinStructure (i)) != null && ps !== psLast) (psLast = ps).resetAxes (); (this.monomers[i]).resetHydrogenPoint (); } }); Clazz.overrideMethod (c$, "calcPhiPsiAngles", function () { for (var i = 0; i < this.monomerCount - 1; ++i) this.calcPhiPsiAngles2 (this.monomers[i], this.monomers[i + 1]); return true; }); Clazz.defineMethod (c$, "calcPhiPsiAngles2", function (residue1, residue2) { var nitrogen1 = residue1.getNitrogenAtom (); var alphacarbon1 = residue1.getLeadAtom (); var carbon1 = residue1.getCarbonylCarbonAtom (); var nitrogen2 = residue2.getNitrogenAtom (); var alphacarbon2 = residue2.getLeadAtom (); var carbon2 = residue2.getCarbonylCarbonAtom (); residue2.setGroupParameter (1112539145, JU.Measure.computeTorsion (carbon1, nitrogen2, alphacarbon2, carbon2, true)); residue1.setGroupParameter (1112539146, JU.Measure.computeTorsion (nitrogen1, alphacarbon1, carbon1, nitrogen2, true)); residue1.setGroupParameter (1112539144, JU.Measure.computeTorsion (alphacarbon1, carbon1, nitrogen2, alphacarbon2, true)); }, "JM.AminoMonomer,JM.AminoMonomer"); Clazz.overrideMethod (c$, "calculateRamachandranHelixAngle", function (m, qtype) { var psiLast = (m == 0 ? NaN : this.monomers[m - 1].getGroupParameter (1112539146)); var psi = this.monomers[m].getGroupParameter (1112539146); var phi = this.monomers[m].getGroupParameter (1112539145); var phiNext = (m == this.monomerCount - 1 ? NaN : this.monomers[m + 1].getGroupParameter (1112539145)); var psiNext = (m == this.monomerCount - 1 ? NaN : this.monomers[m + 1].getGroupParameter (1112539146)); switch (qtype) { default: case 'p': case 'r': case 'P': var dPhi = ((phiNext - phi) / 2 * 3.141592653589793 / 180); var dPsi = ((psiNext - psi) / 2 * 3.141592653589793 / 180); return (57.29577951308232 * 2 * Math.acos (Math.cos (dPsi) * Math.cos (dPhi) - Math.sin (dPsi) * Math.sin (dPhi) / 3)); case 'c': case 'C': return (psi - psiLast + phiNext - phi); } }, "~N,~S"); Clazz.overrideMethod (c$, "calcRasmolHydrogenBonds", function (polymer, bsA, bsB, vHBonds, nMaxPerResidue, min, checkDistances, dsspIgnoreHydrogens) { if (polymer == null) polymer = this; if (!(Clazz.instanceOf (polymer, JM.AminoPolymer))) return; var pt = new JU.P3 (); var vNH = new JU.V3 (); var source; var min1 = (min == null ? Clazz.newIntArray (2, 3, 0) : null); for (var i = 1; i < this.monomerCount; ++i) { if (min == null) { min1[0][0] = min1[1][0] = this.bioPolymerIndexInModel; min1[0][1] = min1[1][1] = -2147483648; min1[0][2] = min1[1][2] = 0; } else { min1 = min[i]; }if ((source = (this.monomers[i])).getNHPoint (pt, vNH, checkDistances, dsspIgnoreHydrogens)) { var isInA = (bsA == null || bsA.get (source.getNitrogenAtom ().i)); if (!isInA) continue; if (!checkDistances && source.getCarbonylOxygenAtom () == null) continue; this.checkRasmolHydrogenBond (source, polymer, i, pt, (isInA ? bsB : bsA), vHBonds, min1, checkDistances); }} }, "JM.BioPolymer,JU.BS,JU.BS,JU.Lst,~N,~A,~B,~B"); Clazz.defineMethod (c$, "checkRasmolHydrogenBond", function (source, polymer, indexDonor, hydrogenPoint, bsB, vHBonds, min, checkDistances) { var sourceAlphaPoint = source.getLeadAtom (); var sourceNitrogenPoint = source.getNitrogenAtom (); var nitrogen = source.getNitrogenAtom (); var m; for (var i = polymer.monomerCount; --i >= 0; ) { if (polymer === this && (i == indexDonor || i + 1 == indexDonor)) continue; var target = polymer.monomers[i]; var oxygen = target.getCarbonylOxygenAtom (); if (oxygen == null || bsB != null && !bsB.get (oxygen.i)) continue; var targetAlphaPoint = target.getLeadAtom (); var dist2 = sourceAlphaPoint.distanceSquared (targetAlphaPoint); if (dist2 >= 81.0) continue; var energy = this.calcHbondEnergy (sourceNitrogenPoint, hydrogenPoint, target, checkDistances); if (energy < min[0][2]) { m = min[1]; min[1] = min[0]; min[0] = m; } else if (energy < min[1][2]) { m = min[1]; } else { continue; }m[0] = polymer.bioPolymerIndexInModel; m[1] = (energy < -500 ? i : -1 - i); m[2] = energy; } if (vHBonds != null) for (var i = 0; i < 2; i++) if (min[i][1] >= 0) this.addResidueHydrogenBond (nitrogen, ((polymer).monomers[min[i][1]]).getCarbonylOxygenAtom (), (polymer === this ? indexDonor : -99), min[i][1], min[i][2] / 1000, vHBonds); }, "JM.AminoMonomer,JM.BioPolymer,~N,JU.P3,JU.BS,JU.Lst,~A,~B"); Clazz.defineMethod (c$, "calcHbondEnergy", function (nitrogenPoint, hydrogenPoint, target, checkDistances) { var targetOxygenPoint = target.getCarbonylOxygenAtom (); if (targetOxygenPoint == null) return 0; var distON2 = targetOxygenPoint.distanceSquared (nitrogenPoint); if (distON2 < 0.25) return 0; var distOH2 = targetOxygenPoint.distanceSquared (hydrogenPoint); if (distOH2 < 0.25) return 0; var targetCarbonPoint = target.getCarbonylCarbonAtom (); var distCH2 = targetCarbonPoint.distanceSquared (hydrogenPoint); if (distCH2 < 0.25) return 0; var distCN2 = targetCarbonPoint.distanceSquared (nitrogenPoint); if (distCN2 < 0.25) return 0; var distOH = Math.sqrt (distOH2); var distCH = Math.sqrt (distCH2); var distCN = Math.sqrt (distCN2); var distON = Math.sqrt (distON2); var energy = JM.HBond.getEnergy (distOH, distCH, distCN, distON); var isHbond = (energy < -500 && (!checkDistances || distCN > distCH && distOH <= 3.0)); return (!isHbond && checkDistances || energy < -9900 ? 0 : energy); }, "JU.P3,JU.P3,JM.AminoMonomer,~B"); Clazz.defineMethod (c$, "addResidueHydrogenBond", function (nitrogen, oxygen, indexAminoGroup, indexCarbonylGroup, energy, vHBonds) { var order; switch (indexAminoGroup - indexCarbonylGroup) { case 2: order = 6144; break; case 3: order = 8192; break; case 4: order = 10240; break; case 5: order = 12288; break; case -3: order = 14336; break; case -4: order = 16384; break; default: order = 4096; } vHBonds.addLast ( new JM.HBond (nitrogen, oxygen, order, 1, 0, energy)); }, "JM.Atom,JM.Atom,~N,~N,~N,JU.Lst"); Clazz.overrideMethod (c$, "calculateStructures", function (alphaOnly) { if (alphaOnly) return; if (this.structureList == null) this.structureList = this.model.getModelSet ().getStructureList (); var structureTags = Clazz.newCharArray (this.monomerCount, '\0'); for (var i = 0; i < this.monomerCount - 1; ++i) { var leadingResidue = this.monomers[i]; var trailingResidue = this.monomers[i + 1]; var phi = trailingResidue.getGroupParameter (1112539145); var psi = leadingResidue.getGroupParameter (1112539146); if (this.isHelix (psi, phi)) { structureTags[i] = (phi < 0 && psi < 25 ? '4' : '3'); } else if (this.isSheet (psi, phi)) { structureTags[i] = 's'; } else if (this.isTurn (psi, phi)) { structureTags[i] = 't'; } else { structureTags[i] = 'n'; }if (JU.Logger.debugging) JU.Logger.debug ((0 + this.monomers[0].getChainID ()) + " aminopolymer:" + i + " " + trailingResidue.getGroupParameter (1112539145) + "," + leadingResidue.getGroupParameter (1112539146) + " " + structureTags[i]); } for (var start = 0; start < this.monomerCount; ++start) { if (structureTags[start] == '4') { var end; for (end = start + 1; end < this.monomerCount && structureTags[end] == '4'; ++end) { } end--; if (end >= start + 3) { this.addStructureProtected (J.c.STR.HELIX, null, 0, 0, start, end); }start = end; }} for (var start = 0; start < this.monomerCount; ++start) { if (structureTags[start] == '3') { var end; for (end = start + 1; end < this.monomerCount && structureTags[end] == '3'; ++end) { } end--; if (end >= start + 3) { this.addStructureProtected (J.c.STR.HELIX, null, 0, 0, start, end); }start = end; }} for (var start = 0; start < this.monomerCount; ++start) { if (structureTags[start] == 's') { var end; for (end = start + 1; end < this.monomerCount && structureTags[end] == 's'; ++end) { } end--; if (end >= start + 2) { this.addStructureProtected (J.c.STR.SHEET, null, 0, 0, start, end); }start = end; }} for (var start = 0; start < this.monomerCount; ++start) { if (structureTags[start] == 't') { var end; for (end = start + 1; end < this.monomerCount && structureTags[end] == 't'; ++end) { } end--; if (end >= start + 2) { this.addStructureProtected (J.c.STR.TURN, null, 0, 0, start, end); }start = end; }} }, "~B"); Clazz.defineMethod (c$, "isTurn", function (psi, phi) { return JM.AminoPolymer.checkPhiPsi (this.structureList.get (J.c.STR.TURN), psi, phi); }, "~N,~N"); Clazz.defineMethod (c$, "isSheet", function (psi, phi) { return JM.AminoPolymer.checkPhiPsi (this.structureList.get (J.c.STR.SHEET), psi, phi); }, "~N,~N"); Clazz.defineMethod (c$, "isHelix", function (psi, phi) { return JM.AminoPolymer.checkPhiPsi (this.structureList.get (J.c.STR.HELIX), psi, phi); }, "~N,~N"); c$.checkPhiPsi = Clazz.defineMethod (c$, "checkPhiPsi", function (list, psi, phi) { for (var i = 0; i < list.length; i += 4) if (phi >= list[i] && phi <= list[i + 1] && psi >= list[i + 2] && psi <= list[i + 3]) return true; return false; }, "~A,~N,~N"); Clazz.overrideMethod (c$, "setStructureList", function (structureList) { this.structureList = structureList; }, "java.util.Map"); Clazz.defineStatics (c$, "maxHbondAlphaDistance", 9, "maxHbondAlphaDistance2", 81.0, "minimumHbondDistance2", 0.25); });