Clazz.declarePackage ("JM"); Clazz.load (["JM.Structure", "JU.V3"], "JM.BioPolymer", ["java.lang.Float", "JU.BS", "$.P3"], function () { c$ = Clazz.decorateAsClass (function () { this.model = null; this.monomers = null; this.hasStructure = false; 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.cyclicFlag = 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", null, JM.Structure); Clazz.prepareFields (c$, function () { this.unitVectorX = JU.V3.new3 (1, 0, 0); }); Clazz.makeConstructor (c$, function () { }); Clazz.defineMethod (c$, "set", 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.overrideMethod (c$, "setAtomBits", function (bs) { this.getRange (bs, true); }, "JU.BS"); Clazz.overrideMethod (c$, "setAtomBitsAndClear", function (bs, bsOut) { for (var i = this.monomerCount; --i >= 0; ) this.monomers[i].setAtomBitsAndClear (bs, bsOut); }, "JU.BS,JU.BS"); Clazz.defineMethod (c$, "getRange", function (bs, isMutated) { if (this.monomerCount == 0) return; if (isMutated) { for (var i = this.monomerCount; --i >= 0; ) this.monomers[i].setAtomBits (bs); } else { bs.setBits (this.monomers[0].firstAtomIndex, this.monomers[this.monomerCount - 1].lastAtomIndex + 1); }}, "JU.BS,~B"); 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$, "setConformation", function (bsSelected) { var atoms = this.model.ms.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 ( Clazz.newArray (-1, [points[j], JU.P3.newP (vectors[j])])); last = j; } else if (last != 2147483646) { vList.addLast ( Clazz.newArray (-1, [points[j], JU.P3.newP (vectors[j])])); last = 2147483646; } if (last + 1 < count) vList.addLast ( Clazz.newArray (-1, [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$, "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$, "calculateRamachandranHelixAngle", function (m, qtype) { return NaN; }, "~N,~S"); Clazz.defineMethod (c$, "isNucleic", function () { return (this.monomerCount > 0 && Clazz.instanceOf (this, JM.NucleicPolymer)); }); 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].setAtomBits (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$, "getType", function () { return this.type; }); Clazz.defineMethod (c$, "isCyclic", function () { return ((this.cyclicFlag == 0 ? (this.cyclicFlag = (this.monomerCount >= 4 && this.monomers[0].isConnectedAfter (this.monomers[this.monomerCount - 1])) ? 1 : -1) : this.cyclicFlag) == 1); }); Clazz.defineStatics (c$, "TYPE_NOBONDING", 0, "TYPE_AMINO", 1, "TYPE_NUCLEIC", 2, "TYPE_CARBOHYDRATE", 3); });