UNPKG

biojs-vis-pdbviewer

Version:

A BioJS 2.0 component to view protein structures

575 lines (564 loc) 23.9 kB
Clazz.declarePackage ("JM"); Clazz.load (["JU.V3"], "JM.BioPolymer", ["java.lang.Float", "java.util.Hashtable", "JU.BS", "$.Lst", "$.P3", "$.Quat", "JU.Escape", "$.Logger", "$.Txt"], function () { c$ = Clazz.decorateAsClass (function () { this.monomers = null; this.hasStructure = false; this.model = null; this.leadMidpoints = null; this.leadPoints = null; this.controlPoints = null; this.wingVectors = null; this.leadAtomIndices = null; this.type = 0; this.bioPolymerIndexInModel = 0; this.monomerCount = 0; this.invalidLead = false; this.invalidControl = false; this.sheetSmoothing = 0; this.hasWingPoints = false; this.reversed = null; this.twistedSheets = false; this.unitVectorX = null; this.selectedMonomerCount = 0; this.bsSelectedMonomers = null; this.haveParameters = false; Clazz.instantialize (this, arguments); }, JM, "BioPolymer"); Clazz.prepareFields (c$, function () { this.unitVectorX = JU.V3.new3 (1, 0, 0); }); Clazz.defineMethod (c$, "getGroups", function () { return this.monomers; }); Clazz.makeConstructor (c$, function (monomers) { this.monomers = monomers; this.monomerCount = monomers.length; for (var i = this.monomerCount; --i >= 0; ) monomers[i].setBioPolymer (this, i); this.model = monomers[0].getModel (); }, "~A"); Clazz.defineMethod (c$, "getRange", function (bs) { if (this.monomerCount == 0) return; bs.setBits (this.monomers[0].firstAtomIndex, this.monomers[this.monomerCount - 1].lastAtomIndex + 1); }, "JU.BS"); Clazz.defineMethod (c$, "clearStructures", function () { }); Clazz.defineMethod (c$, "getLeadAtomIndices", function () { if (this.leadAtomIndices == null) { this.leadAtomIndices = Clazz.newIntArray (this.monomerCount, 0); this.invalidLead = true; }if (this.invalidLead) { for (var i = this.monomerCount; --i >= 0; ) this.leadAtomIndices[i] = this.monomers[i].leadAtomIndex; this.invalidLead = false; }return this.leadAtomIndices; }); Clazz.defineMethod (c$, "getIndex", function (chainID, seqcode, istart, iend) { var i; for (i = this.monomerCount; --i >= 0; ) { var m = this.monomers[i]; if (m.chain.chainID == chainID && m.seqcode == seqcode && (istart < 0 || istart == m.firstAtomIndex || iend == m.lastAtomIndex)) break; } return i; }, "~N,~N,~N,~N"); Clazz.defineMethod (c$, "getLeadPoint", function (monomerIndex) { return this.monomers[monomerIndex].getLeadAtom (); }, "~N"); Clazz.defineMethod (c$, "getInitiatorPoint", function () { return this.monomers[0].getInitiatorAtom (); }); Clazz.defineMethod (c$, "getTerminatorPoint", function () { return this.monomers[this.monomerCount - 1].getTerminatorAtom (); }); Clazz.defineMethod (c$, "getLeadMidPoint", function (i, midPoint) { if (i == this.monomerCount) { --i; } else if (i > 0) { midPoint.ave (this.getLeadPoint (i), this.getLeadPoint (i - 1)); return; }midPoint.setT (this.getLeadPoint (i)); }, "~N,JU.P3"); Clazz.defineMethod (c$, "getWingPoint", function (polymerIndex) { return this.monomers[polymerIndex].getWingAtom (); }, "~N"); Clazz.defineMethod (c$, "getConformation", function (bsConformation, conformationIndex) { var atoms = this.model.getModelSet ().at; for (var i = this.monomerCount; --i >= 0; ) this.monomers[i].getConformation (atoms, bsConformation, conformationIndex); this.recalculateLeadMidpointsAndWingVectors (); }, "JU.BS,~N"); Clazz.defineMethod (c$, "setConformation", function (bsSelected) { var atoms = this.model.getModelSet ().at; for (var i = this.monomerCount; --i >= 0; ) this.monomers[i].updateOffsetsForAlternativeLocations (atoms, bsSelected); this.recalculateLeadMidpointsAndWingVectors (); }, "JU.BS"); Clazz.defineMethod (c$, "recalculateLeadMidpointsAndWingVectors", function () { this.invalidLead = this.invalidControl = true; this.getLeadAtomIndices (); this.resetHydrogenPoints (); this.calcLeadMidpointsAndWingVectors (); }); Clazz.defineMethod (c$, "resetHydrogenPoints", function () { }); Clazz.defineMethod (c$, "getLeadMidpoints", function () { if (this.leadMidpoints == null) this.calcLeadMidpointsAndWingVectors (); return this.leadMidpoints; }); Clazz.defineMethod (c$, "getLeadPoints", function () { if (this.leadPoints == null) this.calcLeadMidpointsAndWingVectors (); return this.leadPoints; }); Clazz.defineMethod (c$, "getControlPoints", function (isTraceAlpha, sheetSmoothing, invalidate) { if (invalidate) this.invalidControl = true; return (!isTraceAlpha ? this.leadMidpoints : sheetSmoothing == 0 ? this.leadPoints : this.getControlPoints2 (sheetSmoothing)); }, "~B,~N,~B"); Clazz.defineMethod (c$, "getControlPoints2", function (sheetSmoothing) { if (!this.invalidControl && sheetSmoothing == this.sheetSmoothing) return this.controlPoints; this.getLeadPoints (); var v = new JU.V3 (); if (this.controlPoints == null) this.controlPoints = new Array (this.monomerCount + 1); if (!Float.isNaN (sheetSmoothing)) this.sheetSmoothing = sheetSmoothing; for (var i = 0; i < this.monomerCount; i++) this.controlPoints[i] = this.getControlPoint (i, v); this.controlPoints[this.monomerCount] = this.getTerminatorPoint (); this.invalidControl = false; return this.controlPoints; }, "~N"); Clazz.defineMethod (c$, "getControlPoint", function (i, v) { return this.leadPoints[i]; }, "~N,JU.V3"); Clazz.defineMethod (c$, "getWingVectors", function () { if (this.leadMidpoints == null) this.calcLeadMidpointsAndWingVectors (); return this.wingVectors; }); Clazz.defineMethod (c$, "calcLeadMidpointsAndWingVectors", function () { if (this.leadMidpoints == null) { this.leadMidpoints = new Array (this.monomerCount + 1); this.leadPoints = new Array (this.monomerCount + 1); this.wingVectors = new Array (this.monomerCount + 1); this.sheetSmoothing = 1.4E-45; }if (this.reversed == null) this.reversed = JU.BS.newN (this.monomerCount); else this.reversed.clearAll (); this.twistedSheets = this.model.ms.vwr.getBoolean (603979968); var vectorA = new JU.V3 (); var vectorB = new JU.V3 (); var vectorC = new JU.V3 (); var vectorD = new JU.V3 (); var leadPointPrev; var leadPoint; this.leadMidpoints[0] = this.getInitiatorPoint (); this.leadPoints[0] = leadPoint = this.getLeadPoint (0); var previousVectorD = null; for (var i = 1; i < this.monomerCount; ++i) { leadPointPrev = leadPoint; this.leadPoints[i] = leadPoint = this.getLeadPoint (i); var midpoint = new JU.P3 (); midpoint.ave (leadPoint, leadPointPrev); this.leadMidpoints[i] = midpoint; if (this.hasWingPoints) { vectorA.sub2 (leadPoint, leadPointPrev); vectorB.sub2 (leadPointPrev, this.getWingPoint (i - 1)); vectorC.cross (vectorA, vectorB); vectorD.cross (vectorA, vectorC); vectorD.normalize (); if (!this.twistedSheets && previousVectorD != null && previousVectorD.angle (vectorD) > 1.5707963267948966) { this.reversed.set (i); vectorD.scale (-1); }previousVectorD = this.wingVectors[i] = JU.V3.newV (vectorD); }} this.leadPoints[this.monomerCount] = this.leadMidpoints[this.monomerCount] = this.getTerminatorPoint (); if (!this.hasWingPoints) { if (this.monomerCount < 3) { this.wingVectors[1] = this.unitVectorX; } else { var previousVectorC = null; for (var i = 1; i < this.monomerCount; ++i) { vectorA.sub2 (this.leadMidpoints[i], this.leadPoints[i]); vectorB.sub2 (this.leadPoints[i], this.leadMidpoints[i + 1]); vectorC.cross (vectorA, vectorB); vectorC.normalize (); if (previousVectorC != null && previousVectorC.angle (vectorC) > 1.5707963267948966) vectorC.scale (-1); previousVectorC = this.wingVectors[i] = JU.V3.newV (vectorC); } }}this.wingVectors[0] = this.wingVectors[1]; this.wingVectors[this.monomerCount] = this.wingVectors[this.monomerCount - 1]; }); Clazz.defineMethod (c$, "findNearestAtomIndex", function (xMouse, yMouse, closest, mads, myVisibilityFlag, bsNot) { for (var i = this.monomerCount; --i >= 0; ) { if ((this.monomers[i].shapeVisibilityFlags & myVisibilityFlag) == 0) continue; var a = this.monomers[i].getLeadAtom (); if (!a.checkVisible () || bsNot != null && bsNot.get (a.i)) continue; if (mads[i] > 0 || mads[i + 1] > 0) this.monomers[i].findNearestAtomIndex (xMouse, yMouse, closest, mads[i], mads[i + 1]); } }, "~N,~N,~A,~A,~N,JU.BS"); Clazz.defineMethod (c$, "getSelectedMonomerCount", function () { return this.selectedMonomerCount; }); Clazz.defineMethod (c$, "calcSelectedMonomersCount", function (bsSelected) { this.selectedMonomerCount = 0; if (this.bsSelectedMonomers == null) this.bsSelectedMonomers = new JU.BS (); this.bsSelectedMonomers.clearAll (); for (var i = 0; i < this.monomerCount; i++) { if (this.monomers[i].isSelected (bsSelected)) { ++this.selectedMonomerCount; this.bsSelectedMonomers.set (i); }} }, "JU.BS"); Clazz.defineMethod (c$, "isMonomerSelected", function (i) { return (i >= 0 && this.bsSelectedMonomers.get (i)); }, "~N"); Clazz.defineMethod (c$, "getPolymerPointsAndVectors", function (last, bs, vList, isTraceAlpha, sheetSmoothing) { var points = this.getControlPoints (isTraceAlpha, sheetSmoothing, false); var vectors = this.getWingVectors (); var count = this.monomerCount; for (var j = 0; j < count; j++) if (bs.get (this.monomers[j].leadAtomIndex)) { vList.addLast ([points[j], JU.P3.newP (vectors[j])]); last = j; } else if (last != 2147483646) { vList.addLast ([points[j], JU.P3.newP (vectors[j])]); last = 2147483646; } if (last + 1 < count) vList.addLast ([points[last + 1], JU.P3.newP (vectors[last + 1])]); return last; }, "~N,JU.BS,JU.Lst,~B,~N"); Clazz.defineMethod (c$, "getSequence", function () { var buf = Clazz.newCharArray (this.monomerCount, '\0'); for (var i = 0; i < this.monomerCount; i++) buf[i] = this.monomers[i].getGroup1 (); return String.valueOf (buf); }); Clazz.defineMethod (c$, "getPolymerInfo", function (bs) { var returnInfo = new java.util.Hashtable (); var info = new JU.Lst (); var structureInfo = null; var ps; var psLast = null; var n = 0; var ptTemp = new JU.P3 (); for (var i = 0; i < this.monomerCount; i++) { if (bs.get (this.monomers[i].leadAtomIndex)) { var monomerInfo = this.monomers[i].getMyInfo (ptTemp); monomerInfo.put ("monomerIndex", Integer.$valueOf (i)); info.addLast (monomerInfo); if ((ps = this.getProteinStructure (i)) != null && ps !== psLast) { var psInfo = new java.util.Hashtable (); (psLast = ps).getInfo (psInfo); if (structureInfo == null) { structureInfo = new JU.Lst (); }psInfo.put ("index", Integer.$valueOf (n++)); structureInfo.addLast (psInfo); }}} if (info.size () > 0) { returnInfo.put ("sequence", this.getSequence ()); returnInfo.put ("monomers", info); if (structureInfo != null) returnInfo.put ("structures", structureInfo); }return returnInfo; }, "JU.BS"); Clazz.defineMethod (c$, "getPolymerSequenceAtoms", function (group1, nGroups, bsInclude, bsResult) { for (var i = Math.min (this.monomerCount, group1 + nGroups); --i >= group1; ) this.monomers[i].getMonomerSequenceAtoms (bsInclude, bsResult); }, "~N,~N,JU.BS,JU.BS"); Clazz.defineMethod (c$, "getProteinStructure", function (monomerIndex) { return null; }, "~N"); Clazz.defineMethod (c$, "calcParameters", function () { this.haveParameters = true; return this.calcEtaThetaAngles () || this.calcPhiPsiAngles (); }); Clazz.defineMethod (c$, "calcEtaThetaAngles", function () { return false; }); Clazz.defineMethod (c$, "calcPhiPsiAngles", function () { return false; }); Clazz.defineMethod (c$, "getPdbData", function (vwr, ctype, qtype, mStep, derivType, bsAtoms, bsSelected, bothEnds, isDraw, addHeader, tokens, pdbATOM, pdbCONECT, bsWritten, ptTemp) { var calcRamachandranStraightness = (qtype == 'C' || qtype == 'P'); var isRamachandran = (ctype == 'R' || ctype == 'S' && calcRamachandranStraightness); if (isRamachandran && !this.calcPhiPsiAngles ()) return; var isAmino = (this.type == 1); var isRelativeAlias = (ctype == 'r'); var quaternionStraightness = (!isRamachandran && ctype == 'S'); if (derivType == 2 && isRelativeAlias) ctype = 'w'; if (quaternionStraightness) derivType = 2; var useQuaternionStraightness = (ctype == 'S'); var writeRamachandranStraightness = ("rcpCP".indexOf (qtype) >= 0); if (JU.Logger.debugging && (quaternionStraightness || calcRamachandranStraightness)) { JU.Logger.debug ("For straightness calculation: useQuaternionStraightness = " + useQuaternionStraightness + " and quaternionFrame = " + qtype); }if (addHeader && !isDraw) { pdbATOM.append ("REMARK 6 AT GRP CH RESNO "); switch (ctype) { default: case 'w': pdbATOM.append ("x*10___ y*10___ z*10___ w*10__ "); break; case 'x': pdbATOM.append ("y*10___ z*10___ w*10___ x*10__ "); break; case 'y': pdbATOM.append ("z*10___ w*10___ x*10___ y*10__ "); break; case 'z': pdbATOM.append ("w*10___ x*10___ y*10___ z*10__ "); break; case 'R': if (writeRamachandranStraightness) pdbATOM.append ("phi____ psi____ theta Straightness"); else pdbATOM.append ("phi____ psi____ omega-180 PartialCharge"); break; } pdbATOM.append (" Sym q0_______ q1_______ q2_______ q3_______"); pdbATOM.append (" theta_ aaX_______ aaY_______ aaZ_______"); if (ctype != 'R') pdbATOM.append (" centerX___ centerY___ centerZ___"); if (qtype == 'n') pdbATOM.append (" NHX_______ NHY_______ NHZ_______"); pdbATOM.append ("\n\n"); }var factor = (ctype == 'R' ? 1 : 10); bothEnds = false; for (var j = 0; j < (bothEnds ? 2 : 1); j++, factor *= -1) for (var i = 0; i < (mStep < 1 ? 1 : mStep); i++) this.getData (vwr, i, mStep, this, ctype, qtype, derivType, bsAtoms, bsSelected, isDraw, isRamachandran, calcRamachandranStraightness, useQuaternionStraightness, writeRamachandranStraightness, quaternionStraightness, factor, isAmino, isRelativeAlias, tokens, pdbATOM, pdbCONECT, bsWritten, ptTemp); }, "JV.Viewer,~S,~S,~N,~N,JU.BS,JU.BS,~B,~B,~B,~A,JU.OC,JU.SB,JU.BS,JU.P3"); Clazz.defineMethod (c$, "getData", function (vwr, m0, mStep, p, ctype, qtype, derivType, bsAtoms, bsSelected, isDraw, isRamachandran, calcRamachandranStraightness, useQuaternionStraightness, writeRamachandranStraightness, quaternionStraightness, factor, isAmino, isRelativeAlias, tokens, pdbATOM, pdbCONECT, bsWritten, ptTemp) { if (!this.hasStructure) return; var prefix = (derivType > 0 ? "dq" + (derivType == 2 ? "2" : "") : "q"); var q; var aprev = null; var qprev = null; var dq = null; var dqprev = null; var qref = null; var atomLast = null; var x = 0; var y = 0; var z = 0; var w = 0; var strExtra = ""; var val1 = NaN; var val2 = NaN; var pt = (isDraw ? new JU.P3 () : null); var dm = (mStep <= 1 ? 1 : mStep); for (var m = m0; m < p.monomerCount; m += dm) { var monomer = p.monomers[m]; if (bsAtoms == null || bsAtoms.get (monomer.leadAtomIndex)) { var a = monomer.getLeadAtom (); var id = monomer.getUniqueID (); if (isRamachandran) { if (ctype == 'S') monomer.setGroupParameter (1112539150, NaN); x = monomer.getGroupParameter (1112539145); y = monomer.getGroupParameter (1112539146); z = monomer.getGroupParameter (1112539144); if (z < -90) z += 360; z -= 180; if (Float.isNaN (x) || Float.isNaN (y) || Float.isNaN (z)) { if (bsAtoms != null) bsAtoms.clear (a.i); continue; }var angledeg = (writeRamachandranStraightness ? p.calculateRamachandranHelixAngle (m, qtype) : 0); var straightness = (calcRamachandranStraightness || writeRamachandranStraightness ? JM.BioPolymer.getStraightness (Math.cos (angledeg / 2 / 180 * 3.141592653589793)) : 0); if (ctype == 'S') { monomer.setGroupParameter (1112539150, straightness); continue; }if (isDraw) { if (bsSelected != null && !bsSelected.get (a.getIndex ())) continue; var aa = monomer; pt.set (-x, x, 0.5); pdbATOM.append ("draw ID \"phi").append (id).append ("\" ARROW ARC ").append (JU.Escape.eP (aa.getNitrogenAtom ())).append (JU.Escape.eP (a)).append (JU.Escape.eP (aa.getCarbonylCarbonAtom ())).append (JU.Escape.eP (pt)).append (" \"phi = ").append (String.valueOf (Math.round (x))).append ("\" color ").append (JM.BioPolymer.qColor[2]).append ("\n"); pt.set (0, y, 0.5); pdbATOM.append ("draw ID \"psi").append (id).append ("\" ARROW ARC ").append (JU.Escape.eP (a)).append (JU.Escape.eP (aa.getCarbonylCarbonAtom ())).append (JU.Escape.eP (aa.getNitrogenAtom ())).append (JU.Escape.eP (pt)).append (" \"psi = ").append (String.valueOf (Math.round (y))).append ("\" color ").append (JM.BioPolymer.qColor[1]).append ("\n"); pdbATOM.append ("draw ID \"planeNCC").append (id).append ("\" ").append (JU.Escape.eP (aa.getNitrogenAtom ())).append (JU.Escape.eP (a)).append (JU.Escape.eP (aa.getCarbonylCarbonAtom ())).append (" color ").append (JM.BioPolymer.qColor[0]).append ("\n"); pdbATOM.append ("draw ID \"planeCNC").append (id).append ("\" ").append (JU.Escape.eP ((p.monomers[m - 1]).getCarbonylCarbonAtom ())).append (JU.Escape.eP (aa.getNitrogenAtom ())).append (JU.Escape.eP (a)).append (" color ").append (JM.BioPolymer.qColor[1]).append ("\n"); pdbATOM.append ("draw ID \"planeCCN").append (id).append ("\" ").append (JU.Escape.eP (a)).append (JU.Escape.eP (aa.getCarbonylCarbonAtom ())).append (JU.Escape.eP ((p.monomers[m + 1]).getNitrogenAtom ())).append (" color ").append (JM.BioPolymer.qColor[2]).append ("\n"); continue; }if (Float.isNaN (angledeg)) { strExtra = ""; if (writeRamachandranStraightness) continue; } else { q = JU.Quat.newVA (JU.P3.new3 (1, 0, 0), angledeg); strExtra = JM.BioPolymer.getQInfo (q); if (writeRamachandranStraightness) { z = angledeg; w = straightness; } else { w = a.getPartialCharge (); }}} else { q = monomer.getQuaternion (qtype); if (q != null) { q.setRef (qref); qref = JU.Quat.newQ (q); }if (derivType == 2) monomer.setGroupParameter (1112539150, NaN); if (q == null) { qprev = null; qref = null; } else if (derivType > 0) { var anext = a; var qnext = q; if (qprev == null) { q = null; dqprev = null; } else { if (isRelativeAlias) { dq = qprev.leftDifference (q); } else { dq = q.rightDifference (qprev); }if (derivType == 1) { q = dq; } else if (dqprev == null) { q = null; } else { q = dq.rightDifference (dqprev); val1 = JM.BioPolymer.getQuaternionStraightness (id, dqprev, dq); val2 = JM.BioPolymer.get3DStraightness (id, dqprev, dq); (aprev.getGroup ()).setGroupParameter (1112539150, useQuaternionStraightness ? val1 : val2); }dqprev = dq; }aprev = anext; qprev = qnext; }if (q == null) { atomLast = null; continue; }switch (ctype) { default: x = q.q1; y = q.q2; z = q.q3; w = q.q0; break; case 'x': x = q.q0; y = q.q1; z = q.q2; w = q.q3; break; case 'y': x = q.q3; y = q.q0; z = q.q1; w = q.q2; break; case 'z': x = q.q2; y = q.q3; z = q.q0; w = q.q1; break; } var ptCenter = monomer.getQuaternionFrameCenter (qtype); if (ptCenter == null) ptCenter = new JU.P3 (); if (isDraw) { if (bsSelected != null && !bsSelected.get (a.getIndex ())) continue; var deg = Clazz.doubleToInt (Math.floor (Math.acos (w) * 360 / 3.141592653589793)); if (derivType == 0) { pdbATOM.append (JU.Escape.drawQuat (q, prefix, id, ptCenter, 1)); if (qtype == 'n' && isAmino) { var ptH = (monomer).getNitrogenHydrogenPoint (); if (ptH != null) pdbATOM.append ("draw ID \"").append (prefix).append ("nh").append (id).append ("\" width 0.1 ").append (JU.Escape.eP (ptH)).append ("\n"); }}if (derivType == 1) { pdbATOM.append (monomer.getHelixData (135176, qtype, mStep)).append ("\n"); continue; }pt.set (x * 2, y * 2, z * 2); pdbATOM.append ("draw ID \"").append (prefix).append ("a").append (id).append ("\" VECTOR ").append (JU.Escape.eP (ptCenter)).append (JU.Escape.eP (pt)).append (" \">").append (String.valueOf (deg)).append ("\" color ").append (JM.BioPolymer.qColor[derivType]).append ("\n"); continue; }strExtra = JM.BioPolymer.getQInfo (q) + JU.Txt.sprintf (" %10.5p %10.5p %10.5p", "p", [ptCenter]); if (qtype == 'n' && isAmino) { strExtra += JU.Txt.sprintf (" %10.5p %10.5p %10.5p", "p", [(monomer).getNitrogenHydrogenPoint ()]); } else if (derivType == 2 && !Float.isNaN (val1)) { strExtra += JU.Txt.sprintf (" %10.5f %10.5f", "F", [[val1, val2]]); }}if (pdbATOM == null) continue; bsWritten.set ((a.getGroup ()).leadAtomIndex); pdbATOM.append (vwr.ms.getLabeler ().formatLabelAtomArray (vwr, a, tokens, '\0', null, ptTemp)); pdbATOM.append (JU.Txt.sprintf ("%8.2f%8.2f%8.2f %6.3f %2s %s\n", "ssF", [a.getElementSymbolIso (false).toUpperCase (), strExtra, [x * factor, y * factor, z * factor, w * factor]])); if (atomLast != null && atomLast.getPolymerIndexInModel () == a.getPolymerIndexInModel ()) { pdbCONECT.append ("CONECT").append (JU.Txt.formatStringI ("%5i", "i", atomLast.getAtomNumber ())).append (JU.Txt.formatStringI ("%5i", "i", a.getAtomNumber ())).appendC ('\n'); }atomLast = a; }} }, "JV.Viewer,~N,~N,JM.BioPolymer,~S,~S,~N,JU.BS,JU.BS,~B,~B,~B,~B,~B,~B,~N,~B,~B,~A,JU.OC,JU.SB,JU.BS,JU.P3"); Clazz.defineMethod (c$, "drawQuat", function (q, prefix, id, ptCenter, scale) { var strV = " VECTOR " + JU.Escape.eP (ptCenter) + " "; if (scale == 0) scale = 1; return "draw " + prefix + "x" + id + strV + JU.Escape.eP (q.getVectorScaled (0, scale)) + " color red\n" + "draw " + prefix + "y" + id + strV + JU.Escape.eP (q.getVectorScaled (1, scale)) + " color green\n" + "draw " + prefix + "z" + id + strV + JU.Escape.eP (q.getVectorScaled (2, scale)) + " color blue\n"; }, "JU.Quat,~S,~S,JU.P3,~N"); c$.getQInfo = Clazz.defineMethod (c$, "getQInfo", function (q) { var axis = q.toAxisAngle4f (); return JU.Txt.sprintf ("%10.6f%10.6f%10.6f%10.6f %6.2f %10.5f %10.5f %10.5f", "F", [[q.q0, q.q1, q.q2, q.q3, (axis.angle * 180 / 3.141592653589793), axis.x, axis.y, axis.z]]); }, "JU.Quat"); Clazz.defineMethod (c$, "calculateRamachandranHelixAngle", function (m, qtype) { return NaN; }, "~N,~S"); c$.get3DStraightness = Clazz.defineMethod (c$, "get3DStraightness", function (id, dq, dqnext) { return dq.getNormal ().dot (dqnext.getNormal ()); }, "~S,JU.Quat,JU.Quat"); c$.getQuaternionStraightness = Clazz.defineMethod (c$, "getQuaternionStraightness", function (id, dq, dqnext) { return JM.BioPolymer.getStraightness (dq.dot (dqnext)); }, "~S,JU.Quat,JU.Quat"); c$.getStraightness = Clazz.defineMethod (c$, "getStraightness", function (cosHalfTheta) { return (1 - 2 * Math.acos (Math.abs (cosHalfTheta)) / 3.141592653589793); }, "~N"); Clazz.defineMethod (c$, "isRna", function () { return (this.monomerCount > 0 && this.monomers[0].isRna ()); }); Clazz.defineMethod (c$, "isNucleic", function () { return (this.monomerCount > 0 && (this.monomers[0].isDna () || this.monomers[0].isRna ())); }); Clazz.defineMethod (c$, "getRangeGroups", function (nResidues, bsAtoms, bsResult) { var bsTemp = new JU.BS (); for (var i = 0; i < this.monomerCount; i++) { if (!this.monomers[i].isSelected (bsAtoms)) continue; bsTemp.setBits (Math.max (0, i - nResidues), i + nResidues + 1); i += nResidues - 1; } for (var i = bsTemp.nextSetBit (0); i >= 0 && i < this.monomerCount; i = bsTemp.nextSetBit (i + 1)) this.monomers[i].selectAtoms (bsResult); }, "~N,JU.BS,JU.BS"); Clazz.defineMethod (c$, "calcRasmolHydrogenBonds", function (polymer, bsA, bsB, vHBonds, nMaxPerResidue, min, checkDistances, dsspIgnoreHydrogens) { }, "JM.BioPolymer,JU.BS,JU.BS,JU.Lst,~N,~A,~B,~B"); Clazz.defineMethod (c$, "setStructureList", function (structureList) { }, "java.util.Map"); Clazz.defineMethod (c$, "getType", function () { return this.type; }); Clazz.defineMethod (c$, "calculateStruts", function (modelSet, bs1, bs2, vCA, thresh, delta, allowMultiple) { return null; }, "JM.ModelSet,JU.BS,JU.BS,JU.Lst,~N,~N,~B"); Clazz.defineStatics (c$, "TYPE_NOBONDING", 0, "TYPE_AMINO", 1, "TYPE_NUCLEIC", 2, "TYPE_CARBOHYDRATE", 3, "qColor", ["yellow", "orange", "purple"]); });