(function(Clazz
,Clazz_getClassName
,Clazz_newLongArray
,Clazz_doubleToByte
,Clazz_doubleToInt
,Clazz_doubleToLong
,Clazz_declarePackage
,Clazz_instanceOf
,Clazz_load
,Clazz_instantialize
,Clazz_decorateAsClass
,Clazz_floatToInt
,Clazz_floatToLong
,Clazz_makeConstructor
,Clazz_defineEnumConstant
,Clazz_exceptionOf
,Clazz_newIntArray
,Clazz_newFloatArray
,Clazz_declareType
,Clazz_prepareFields
,Clazz_superConstructor
,Clazz_newByteArray
,Clazz_declareInterface
,Clazz_newShortArray
,Clazz_innerTypeInstance
,Clazz_isClassDefined
,Clazz_prepareCallback
,Clazz_newArray
,Clazz_castNullAs
,Clazz_floatToShort
,Clazz_superCall
,Clazz_decorateAsType
,Clazz_newBooleanArray
,Clazz_newCharArray
,Clazz_implementOf
,Clazz_newDoubleArray
,Clazz_overrideConstructor
,Clazz_clone
,Clazz_doubleToShort
,Clazz_getInheritedLevel
,Clazz_getParamsType
,Clazz_isAF
,Clazz_isAB
,Clazz_isAI
,Clazz_isAS
,Clazz_isASS
,Clazz_isAP
,Clazz_isAFloat
,Clazz_isAII
,Clazz_isAFF
,Clazz_isAFFF
,Clazz_tryToSearchAndExecute
,Clazz_getStackTrace
,Clazz_inheritArgs
,Clazz_alert
,Clazz_defineMethod
,Clazz_overrideMethod
,Clazz_declareAnonymous
//,Clazz_checkPrivateMethod
,Clazz_cloneFinals
){
var $t$;
//var c$;
Clazz_declarePackage("J.adapter.readers.pdb");
Clazz_load(["J.adapter.smarter.AtomSetCollectionReader", "java.util.Hashtable"], "J.adapter.readers.pdb.PdbReader", ["JU.Lst", "$.M4", "$.P3", "$.PT", "$.SB", "J.adapter.smarter.Atom", "$.Structure", "J.api.JmolAdapter", "J.c.STR", "JU.Escape", "$.Logger"], function(){
var c$ = Clazz_decorateAsClass(function(){
this.serMode = 0;
this.seqMode = 0;
this.serial = 0;
this.lineLength = 0;
this.pdbHeader = null;
this.applySymmetry = false;
this.getTlsGroups = false;
this.isMultiModel = false;
this.haveMappedSerials = false;
this.isConnectStateBug = false;
this.isLegacyModelType = false;
this.gromacsWideFormat = false;
this.htFormul = null;
this.htHetero = null;
this.htSites = null;
this.htElementsInCurrentGroup = null;
this.htMolIds = null;
this.vCompnds = null;
this.vBiomolecules = null;
this.vTlsModels = null;
this.sbTlsErrors = null;
this.biomtChainAtomCounts = null;
this.sbIgnored = null;
this.sbSelected = null;
this.sbConect = null;
this.sb = null;
this.ac = 0;
this.maxSerial = 0;
this.nUNK = 0;
this.nRes = 0;
this.currentCompnd = null;
this.currentGroup3 = null;
this.currentKey = null;
this.currentResno = -2147483648;
this.configurationPtr = -2147483648;
this.resetKey = true;
this.$compnd = null;
this.conformationIndex = 0;
this.fileAtomIndex = 0;
this.lastAltLoc = '\0';
this.lastGroup = -2147483648;
this.lastInsertion = '\0';
this.lastSourceSerial = -2147483648;
this.lastTargetSerial = -2147483648;
this.tlsGroupID = 0;
this.atomTypePt0 = 0;
this.atomTypeLen = 0;
this.isCourseGrained = false;
this.isbiomol = false;
this.$cryst1 = 0;
this.fileSgName = null;
this.htGroup1 = null;
this.maxLength = 80;
this.pdbID = null;
this.haveDoubleBonds = false;
this.dataT = null;
this.tlsU = null;
this.vConnect = null;
this.connectNextAtomIndex = 0;
this.connectNextAtomSet = 0;
this.connectLast = null;
Clazz_instantialize(this, arguments);}, J.adapter.readers.pdb, "PdbReader", J.adapter.smarter.AtomSetCollectionReader);
Clazz_prepareFields (c$, function(){
this.htFormul =  new java.util.Hashtable();
this.dataT =  Clazz_newFloatArray (8, 0);
});
Clazz_overrideMethod(c$, "initializeReader", 
function(){
this.allowPDBFilter = true;
this.pdbHeader = (this.getHeader ?  new JU.SB() : null);
this.applySymmetry = !this.checkFilterKey("NOSYMMETRY");
if (this.isDSSP1) this.asc.setInfo("isDSSP1", Boolean.TRUE);
this.getTlsGroups = this.checkFilterKey("TLS");
if (this.checkFilterKey("ASSEMBLY")) this.filter = JU.PT.rep(this.filter, "ASSEMBLY", "BIOMOLECULE");
this.isbiomol = this.checkFilterKey("BIOMOLECULE");
if (this.isbiomol) this.filter = this.filter.$replace(':', ' ');
var byChain = this.isbiomol && this.checkFilterKey("BYCHAIN");
var bySymop = this.isbiomol && this.checkFilterKey("BYSYMOP");
this.isCourseGrained = byChain || bySymop;
if (!this.isCourseGrained) this.setIsPDB();
this.isConcatenated = new Boolean (this.isConcatenated | this.filePath.endsWith(".dssr")).valueOf();
if (this.htParams.containsKey("vTlsModels")) {
this.vTlsModels = this.htParams.remove("vTlsModels");
}var s = this.getFilter("TYPE ");
if (s != null) {
var tokens = JU.PT.getTokens(s.$replace(',', ' '));
this.atomTypePt0 = Integer.parseInt(tokens[0]) - 1;
var pt = tokens[1].indexOf("=");
if (pt >= 0) {
this.setFilterAtomTypeStr(tokens[1].substring(pt + 1).toUpperCase());
} else {
pt = tokens[1].length;
}this.atomTypeLen = Integer.parseInt(tokens[1].substring(0, pt));
}var conf = this.getFilter("CONF ");
if (conf != null) {
this.configurationPtr = this.parseIntStr(conf);
this.sbIgnored =  new JU.SB();
this.sbSelected =  new JU.SB();
}this.isLegacyModelType = (this.stateScriptVersionInt < 120000);
this.isConnectStateBug = (this.stateScriptVersionInt >= 120151 && this.stateScriptVersionInt <= 120220 || this.stateScriptVersionInt >= 120300 && this.stateScriptVersionInt <= 120320);
});
Clazz_overrideMethod(c$, "checkLine", 
function(){
var ptOption = ((this.lineLength = this.line.length) < 6 ? -1 : "ATOM    HETATM  MODEL   CONECT  HELIX   SHEET   TURN    HET     HETNAM  ANISOU  SITE    CRYST1  SCALE1  SCALE2  SCALE3  EXPDTA  FORMUL  REMARK  HEADER  COMPND  SOURCE  TITLE   SEQADV  ".indexOf(this.line.substring(0, 6))) >> 3;
var isAtom = (ptOption == 0 || ptOption == 1);
var isModel = (ptOption == 2);
this.serial = (isAtom ? this.getSerial(6, 11) : 0);
var forceNewModel = ((this.isTrajectory || this.isSequential) && !this.isMultiModel && isAtom && this.serial == 1);
if (this.getHeader) {
if (isAtom || isModel) this.getHeader = false;
 else this.readHeader(false);
}if (isModel || forceNewModel) {
this.isMultiModel = isModel;
this.getHeader = false;
var modelNo = (forceNewModel ? this.modelNumber + 1 : this.getModelNumber());
var modelName = this.getModelName();
this.modelNumber = (this.useFileModelNumbers ? modelNo : this.modelNumber + 1);
if (!this.doGetModel(this.modelNumber, null)) {
this.handleTlsMissingModels();
var isOK = this.checkLastModel();
if (!isOK && this.isConcatenated) isOK = this.continuing = true;
return isOK;
}if (!this.isCourseGrained) this.connectAll(this.maxSerial, this.isConnectStateBug);
if (this.ac > 0) this.applySymmetryAndSetTrajectory();
this.model(modelNo, modelName);
if (this.isLegacyModelType || !isAtom) return true;
}if (this.isMultiModel && !this.doProcessLines) {
return true;
}if (isAtom) {
this.getHeader = false;
this.atom();
return true;
}switch (ptOption) {
case 3:
this.conect();
return true;
case 4:
case 5:
case 6:
if (!this.ignoreStructure) this.structure();
return true;
case 7:
this.het();
return true;
case 8:
this.hetnam();
return true;
case 9:
this.anisou();
return true;
case 10:
this.site();
return true;
case 11:
this.cryst1();
return true;
case 12:
case 13:
case 14:
this.scale(ptOption - 12 + 1);
return true;
case 15:
this.expdta();
return true;
case 16:
this.formul();
return true;
case 17:
if (this.line.startsWith("REMARK 285")) return this.remark285();
if (this.line.startsWith("REMARK 350")) return this.remark350();
if (this.line.startsWith("REMARK 290")) return this.remark290();
if (this.line.startsWith("REMARK 998")) return this.remark998();
if (this.line.contains("This file does not adhere to the PDB standard")) {
this.gromacsWideFormat = true;
}if (this.getTlsGroups) {
if (this.line.indexOf("TLS DETAILS") > 0) return this.remarkTls();
}this.checkRemark();
return true;
case 18:
this.header();
return true;
case 19:
case 20:
this.compnd(ptOption == 20);
return true;
case 21:
this.title();
return true;
case 22:
this.seqAdv();
return true;
}
return true;
});
Clazz_defineMethod(c$, "checkRemark", 
function(){
this.checkCurrentLineForScript();
});
Clazz_defineMethod(c$, "seqAdv", 
function(){
var g1 = this.line.substring(39, 42).trim().toLowerCase();
if (g1.length != 1) return;
if (this.htGroup1 == null) this.asc.setInfo("htGroup1", this.htGroup1 =  new java.util.Hashtable());
var g3 = this.line.substring(12, 15).trim();
this.htGroup1.put(g3, g1);
});
Clazz_defineMethod(c$, "readHeader", 
function(getLine){
if (getLine) {
this.rd();
if (!this.getHeader) return this.line;
}this.pdbHeader.append(this.line).appendC('\n');
return this.line;
}, "~B");
Clazz_overrideMethod(c$, "finalizeSubclassReader", 
function(){
this.finalizeReaderPDB();
});
Clazz_defineMethod(c$, "finalizeReaderPDB", 
function(){
this.checkNotPDB();
if (this.pdbID != null && this.pdbID.length > 0) {
if (!this.isMultiModel) this.asc.setAtomSetName(this.pdbID);
this.asc.setCurrentModelInfo("pdbID", this.pdbID);
}this.checkUnitCellParams();
if (!this.isCourseGrained) this.connectAll(this.maxSerial, this.isConnectStateBug);
var symmetry;
if (this.vBiomolecules != null && this.vBiomolecules.size() > 0 && this.asc.ac > 0) {
this.asc.setCurrentModelInfo("biomolecules", this.vBiomolecules);
this.setBiomoleculeAtomCounts();
if (this.thisBiomolecule != null && this.applySymmetry) {
this.asc.getXSymmetry().applySymmetryBio(this.thisBiomolecule, this.applySymmetryToBonds, this.filter);
this.vTlsModels = null;
this.asc.xtalSymmetry = null;
}}if (this.vTlsModels != null) {
symmetry = this.asc.newFileSymmetry();
var n = this.asc.atomSetCount;
if (n == this.vTlsModels.size()) {
for (var i = n; --i >= 0; ) this.setTlsGroups(i, i, symmetry);

} else {
JU.Logger.info(n + " models but " + this.vTlsModels.size() + " TLS descriptions");
if (this.vTlsModels.size() == 1) {
JU.Logger.info(" -- assuming all models have the same TLS description -- check REMARK 3 for details.");
for (var i = n; --i >= 0; ) this.setTlsGroups(0, i, symmetry);

}}this.checkForResidualBFactors(symmetry);
}if (this.sbTlsErrors != null) {
this.asc.setInfo("tlsErrors", this.sbTlsErrors.toString());
this.appendLoadNote(this.sbTlsErrors.toString());
}this.doCheckUnitCell = new Boolean (this.doCheckUnitCell &(this.iHaveUnitCell && this.doApplySymmetry)).valueOf();
if (this.doCheckUnitCell && this.isbiomol) {
this.ignoreFileSpaceGroupName = true;
this.sgName = this.fileSgName;
this.fractionalizeCoordinates(true);
this.asc.setModelInfoForSet("bioSymmetry", null, this.asc.iSet);
this.checkNearAtoms = false;
}if (this.latticeCells != null && this.latticeCells[0] != 0) this.addJmolScript("unitcell;axes on;axes unitcell;");
this.finalizeReaderASCR();
if (this.vCompnds != null) {
this.asc.setInfo("compoundSource", this.vCompnds);
for (var i = this.asc.iSet + 1; --i >= 0; ) this.asc.setModelInfoForSet("compoundSource", this.vCompnds, i);

}if (this.htSites != null) {
this.addSites(this.htSites);
}if (this.pdbHeader != null) this.asc.setInfo("fileHeader", this.pdbHeader.toString());
if (this.configurationPtr > 0) {
JU.Logger.info(this.sbSelected.toString());
JU.Logger.info(this.sbIgnored.toString());
}});
Clazz_defineMethod(c$, "checkUnitCellParams", 
function(){
if (this.isbiomol && (this.unitCellParams == null || Double.isNaN(this.unitCellParams[0]))) {
this.setUnitCell(1, 1, 1, 90, 90, 90);
this.addSpaceGroupName("P1");
}if (this.iHaveUnitCell) {
this.asc.setCurrentModelInfo("unitCellParams", this.unitCellParams);
if (this.sgName != null) this.asc.setCurrentModelInfo("spaceGroup", this.sgName);
}});
Clazz_defineMethod(c$, "checkForResidualBFactors", 
function(symmetry){
var atoms = this.asc.atoms;
var isResidual = false;
for (var i = this.asc.ac; --i >= 0; ) {
var anisou = this.tlsU.get(atoms[i]);
if (anisou == null) continue;
var resid = anisou[7] - (anisou[0] + anisou[1] + anisou[2]) / 3;
if (resid < 0 || Float.isNaN(resid)) {
isResidual = true;
break;
}}
JU.Logger.info("TLS analysis suggests Bfactors are " + (isResidual ? "" : "NOT") + " residuals");
for (var entry, $entry = this.tlsU.entrySet().iterator (); $entry.hasNext()&& ((entry = $entry.next ()) || true);) {
var anisou = entry.getValue();
var resid = anisou[7];
if (resid == 0) continue;
if (!isResidual) resid -= (anisou[0] + anisou[1] + anisou[2]) / 3;
anisou[0] += resid;
anisou[1] += resid;
anisou[2] += resid;
entry.getKey().addTensor(symmetry.getTensor(this.vwr, anisou).setType(null), "TLS-R", false);
JU.Logger.info("TLS-U:  " + JU.Escape.eAF(anisou));
anisou = (entry.getKey().anisoBorU);
if (anisou != null) JU.Logger.info("ANISOU: " + JU.Escape.eAF(anisou));
}
this.tlsU = null;
}, "J.adapter.smarter.XtalSymmetry.FileSymmetry");
Clazz_defineMethod(c$, "header", 
function(){
if (this.lineLength < 8) return;
this.appendLoadNote(this.line.substring(7).trim());
if (this.lineLength == 80) this.maxLength = 72;
this.pdbID = (this.lineLength >= 66 ? this.line.substring(62, 66).trim() : "");
if (this.pdbID.length == 4) {
this.asc.setCollectionName(this.pdbID);
this.asc.setInfo("havePDBHeaderName", Boolean.TRUE);
}if (this.lineLength > 50) this.line = this.line.substring(0, 50);
this.asc.setInfo("CLASSIFICATION", this.line.substring(7).trim());
});
Clazz_defineMethod(c$, "title", 
function(){
if (this.lineLength > 10) this.appendLoadNote(this.line.substring(10, Math.min(this.maxLength, this.line.length)).trim());
});
Clazz_defineMethod(c$, "compnd", 
function(isSource){
if (!isSource) {
if (this.$compnd == null) this.$compnd = "";
 else this.$compnd += " ";
var s = this.line;
if (this.lineLength > 62) s = s.substring(0, 62);
this.$compnd += s.substring(10).trim();
this.asc.setInfo("COMPND", this.$compnd);
}if (this.vCompnds == null) {
if (isSource) return;
this.vCompnds =  new JU.Lst();
this.htMolIds =  new java.util.Hashtable();
this.currentCompnd =  new java.util.Hashtable();
this.currentCompnd.put("select", "(*)");
this.currentKey = "MOLECULE";
this.htMolIds.put("", this.currentCompnd);
}if (isSource && this.resetKey) {
this.resetKey = false;
this.currentKey = "SOURCE";
this.currentCompnd = this.htMolIds.get("");
}this.line = this.line.substring(10, Math.min(this.lineLength, 72)).trim();
var pt = this.line.indexOf(":");
if (pt < 0 || pt > 0 && this.line.charAt(pt - 1) == '\\') pt = this.line.length;
var key = this.line.substring(0, pt).trim();
var value = (pt < this.line.length ? this.line.substring(pt + 1).trim() : null);
if (key.equals("MOL_ID")) {
if (value == null) return;
if (isSource) {
this.currentCompnd = this.htMolIds.remove(value);
return;
}this.currentCompnd =  new java.util.Hashtable();
this.vCompnds.addLast(this.currentCompnd);
this.htMolIds.put(value, this.currentCompnd);
}if (this.currentCompnd == null) return;
if (value == null) {
value = this.currentCompnd.get(this.currentKey);
if (value == null) value = "";
value += key;
if (this.vCompnds.size() == 0) this.vCompnds.addLast(this.currentCompnd);
} else {
this.currentKey = key;
}if (value.endsWith(";")) value = value.substring(0, value.length - 1);
this.currentCompnd.put(this.currentKey, value);
if (this.currentKey.equals("CHAIN")) this.currentCompnd.put("select", "(:" + JU.PT.rep(JU.PT.rep(value, ", ", ",:"), " ", "") + ")");
}, "~B");
Clazz_defineMethod(c$, "setBiomoleculeAtomCounts", 
function(){
for (var i = this.vBiomolecules.size(); --i >= 0; ) {
var biomolecule = this.vBiomolecules.get(i);
var biomts = biomolecule.get("biomts");
var biomtchains = biomolecule.get("chains");
var nTransforms = biomts.size();
var nAtoms = 0;
for (var k = nTransforms; --k >= 0; ) {
var chains = biomtchains.get(k);
for (var j = chains.length - 1; --j >= 0; ) if (chains.charAt(j) == ':') nAtoms += this.biomtChainAtomCounts[0 + (chains.charAt(j + 1)).charCodeAt(0)];

}
biomolecule.put("atomCount", Integer.$valueOf(nAtoms));
}
});
Clazz_defineMethod(c$, "remark350", 
function(){
var biomts = null;
var biomtchains = null;
this.vBiomolecules =  new JU.Lst();
this.biomtChainAtomCounts =  Clazz_newIntArray (255, 0);
var title = "";
var chainlist = "";
var id = "";
var needLine = true;
var info = null;
var nBiomt = 0;
var mIdent = JU.M4.newM4(null);
while (true) {
if (needLine) this.readHeader(true);
 else needLine = true;
if (this.line == null || !this.line.startsWith("REMARK 350")) break;
try {
if (this.line.startsWith("REMARK 350 BIOMOLECULE:")) {
if (nBiomt > 0) JU.Logger.info("biomolecule " + id + ": number of transforms: " + nBiomt);
info =  new java.util.Hashtable();
id = this.line.substring(this.line.indexOf(":") + 1).trim();
title = this.line.trim();
info.put("name", "biomolecule " + id);
info.put("molecule", id.length == 3 ? id : Integer.$valueOf(this.parseIntStr(id)));
info.put("title", title);
info.put("chains", biomtchains =  new JU.Lst());
info.put("biomts", biomts =  new JU.Lst());
this.vBiomolecules.addLast(info);
nBiomt = 0;
}if (this.line.indexOf("APPLY THE FOLLOWING TO CHAINS:") >= 0) {
if (info == null) {
needLine = false;
this.line = "REMARK 350 BIOMOLECULE: 1  APPLY THE FOLLOWING TO CHAINS:";
continue;
}var list = this.line.substring(41).trim();
this.appendLoadNote("found biomolecule " + id + ": " + list);
chainlist = ":" + list.$replace(',', ';').$replace(' ', ':');
needLine = false;
while (this.readHeader(true) != null && this.line.indexOf("BIOMT") < 0 && this.line.indexOf("350") == 7) chainlist += ":" + this.line.substring(11).trim().$replace(',', ';').$replace(' ', ':');

chainlist += ";";
if (this.checkFilterKey("BIOMOLECULE " + id + ";") || this.checkFilterKey("BIOMOLECULE=" + id + ";")) {
this.setFilter(this.filterCased + chainlist);
JU.Logger.info("filter set to \"" + this.filter + "\"");
this.thisBiomolecule = info;
this.haveMappedSerials = this.applySymmetry;
}continue;
}if (this.line.startsWith("REMARK 350   BIOMT1 ")) {
nBiomt++;
var mat =  Clazz_newFloatArray (16, 0);
for (var i = 0; i < 12; ) {
var tokens = this.getTokens();
mat[i++] = this.parseFloatStr(tokens[4]);
mat[i++] = this.parseFloatStr(tokens[5]);
mat[i++] = this.parseFloatStr(tokens[6]);
mat[i++] = this.parseFloatStr(tokens[7]);
if (i == 4 || i == 8) this.readHeader(true);
}
mat[15] = 1;
var m4 =  new JU.M4();
m4.setA(mat);
if (m4.equals(mIdent)) {
biomts.add(0, m4);
biomtchains.add(0, chainlist);
} else {
biomts.addLast(m4);
biomtchains.addLast(chainlist);
}continue;
}} catch (e) {
if (Clazz_exceptionOf(e, Exception)){
this.thisBiomolecule = null;
this.vBiomolecules = null;
return false;
} else {
throw e;
}
}
}
if (nBiomt > 0) JU.Logger.info("biomolecule " + id + ": number of transforms: " + nBiomt);
return false;
});
Clazz_defineMethod(c$, "remark285", 
function(){
return true;
});
Clazz_defineMethod(c$, "remark290", 
function(){
while (this.readHeader(true) != null && this.line.startsWith("REMARK 290")) {
if (this.line.indexOf("NNNMMM   OPERATOR") >= 0) {
while (this.readHeader(true) != null) {
var tokens = this.getTokens();
if (tokens.length < 4) break;
if (this.doApplySymmetry || this.isbiomol) this.setSymmetryOperator(tokens[3]);
}
}}
return false;
});
Clazz_defineMethod(c$, "remark998", 
function(){
if (this.asc.isConSurf == null) {
if (this.line.indexOf("ConSurf") >= 0) this.asc.isConSurf = Boolean.TRUE;
}return true;
});
Clazz_defineMethod(c$, "getSerial", 
function(i, j){
var c = this.line.charAt(i);
var isBase10 = (c == ' ' || this.line.charAt(j - 1) == ' ');
switch (this.serMode) {
default:
case 0:
if (isBase10) return this.parseIntRange(this.line, i, j);
try {
return this.serial = Integer.parseInt(this.line.substring(i, j));
} catch (e) {
if (Clazz_exceptionOf(e, Exception)){
this.serMode = (JU.PT.isDigit(c) ? 1 : 2);
return this.getSerial(i, j);
} else {
throw e;
}
}
case 2:
return (isBase10 || JU.PT.isDigit(c) ? this.parseIntRange(this.line, i, j) : JU.PT.parseIntRadix(this.line.substring(i, j), 36) + (JU.PT.isUpperCase(c) ? -16696160 : 26973856));
case 1:
if (!isBase10) return this.serial = JU.PT.parseIntRadix(this.line.substring(i, j), 16);
this.serMode = 0;
return this.getSerial(i, j);
}
}, "~N,~N");
Clazz_defineMethod(c$, "getSeqNo", 
function(i, j){
var c = this.line.charAt(i);
var isBase10 = (c == ' ' || this.line.charAt(j - 1) == ' ');
switch (this.seqMode) {
default:
case 0:
if (isBase10) return this.parseIntRange(this.line, i, j);
try {
return Integer.parseInt(this.line.substring(i, j));
} catch (e) {
if (Clazz_exceptionOf(e, Exception)){
this.seqMode = (JU.PT.isDigit(c) ? 1 : 2);
return this.getSeqNo(i, j);
} else {
throw e;
}
}
case 2:
return (isBase10 || JU.PT.isDigit(c) ? this.parseIntRange(this.line, i, j) : JU.PT.parseIntRadix(this.line.substring(i, j), 36) + (JU.PT.isUpperCase(c) ? -456560 : 756496));
case 1:
if (!isBase10) return JU.PT.parseIntRadix(this.line.substring(i, j), 16);
this.seqMode = 0;
return this.getSeqNo(i, j);
}
}, "~N,~N");
Clazz_defineMethod(c$, "processAtom", 
function(atom, name, altID, group3, chainID, seqNo, insCode, isHetero, sym){
atom.atomName = name;
if (altID != ' ') atom.altLoc = altID;
atom.group3 = (group3 == null ? "UNK" : group3);
atom.chainID = chainID;
if (this.biomtChainAtomCounts != null) this.biomtChainAtomCounts[chainID % 256]++;
atom.sequenceNumber = seqNo;
atom.insertionCode = J.api.JmolAdapter.canonizeInsertionCode(insCode);
atom.isHetero = isHetero;
atom.elementSymbol = sym;
return atom;
}, "J.adapter.smarter.Atom,~S,~S,~S,~N,~N,~S,~B,~S");
Clazz_defineMethod(c$, "processAtom2", 
function(atom, serial, x, y, z, charge){
atom.atomSerial = serial;
if (serial > this.maxSerial) this.maxSerial = serial;
if (atom.group3 == null) {
if (this.currentGroup3 != null) {
this.currentGroup3 = null;
this.currentResno = -2147483648;
this.htElementsInCurrentGroup = null;
}} else if (!atom.group3.equals(this.currentGroup3) || atom.sequenceNumber != this.currentResno) {
this.currentGroup3 = atom.group3;
this.currentResno = atom.sequenceNumber;
this.htElementsInCurrentGroup = this.htFormul.get(atom.group3);
this.nRes++;
if (atom.group3.equals("UNK")) this.nUNK++;
}this.setAtomCoordXYZ(atom, x, y, z);
atom.formalCharge = charge;
if (this.haveMappedSerials) this.asc.addAtomWithMappedSerialNumber(atom);
 else this.asc.addAtom(atom);
this.setAdditionalAtomParameters(atom);
if (this.ac++ == 0 && !this.isCourseGrained) this.setModelPDB(true);
if (atom.isHetero) {
if (this.htHetero != null) {
this.asc.setCurrentModelInfo("hetNames", this.htHetero);
this.htHetero = null;
}}}, "J.adapter.smarter.Atom,~N,~N,~N,~N,~N");
Clazz_defineMethod(c$, "atom", 
function(){
var isHetero = this.line.startsWith("HETATM");
var atom = this.processAtom( new J.adapter.smarter.Atom(), this.line.substring(12, 16).trim(), this.line.charAt(16), this.parseTokenRange(this.line, 17, 20), this.vwr.getChainID(this.line.substring(21, 22), true), this.getSeqNo(22, 26), this.line.charAt(26), isHetero, this.deduceElementSymbol(isHetero));
if (this.atomTypeLen > 0) {
var s = this.line.substring(this.atomTypePt0, this.atomTypePt0 + this.atomTypeLen).trim();
if (s.length > 0) atom.atomName += "\0" + s;
}if (!this.filterPDBAtom(atom, this.fileAtomIndex++)) return;
var charge = 0;
var x;
var y;
var z;
if (this.gromacsWideFormat) {
x = this.parseFloatRange(this.line, 30, 40);
y = this.parseFloatRange(this.line, 40, 50);
z = this.parseFloatRange(this.line, 50, 60);
} else {
if (this.lineLength >= 80) {
var chMagnitude = this.line.charAt(78);
var chSign = this.line.charAt(79);
if (chSign >= '0' && chSign <= '7') {
var chT = chSign;
chSign = chMagnitude;
chMagnitude = chT;
}if ((chSign == '+' || chSign == '-' || chSign == ' ') && chMagnitude >= '0' && chMagnitude <= '7') {
charge = chMagnitude.charCodeAt(0) - 48;
if (chSign == '-') charge = -charge;
}}x = this.parseFloatRange(this.line, 30, 38);
y = this.parseFloatRange(this.line, 38, 46);
z = this.parseFloatRange(this.line, 46, 54);
}this.processAtom2(atom, this.serial, x, y, z, charge);
});
Clazz_defineMethod(c$, "filterPDBAtom", 
function(atom, iAtom){
if (!this.filterAtom(atom, iAtom)) return false;
if (this.configurationPtr > 0) {
if (atom.sequenceNumber != this.lastGroup || atom.insertionCode != this.lastInsertion) {
this.conformationIndex = this.configurationPtr - 1;
this.lastGroup = atom.sequenceNumber;
this.lastInsertion = atom.insertionCode;
this.lastAltLoc = '\0';
}if (atom.altLoc != '\0') {
var msg = " atom [" + atom.group3 + "]" + atom.sequenceNumber + (atom.insertionCode == '\0' ? "" : "^" + atom.insertionCode) + (atom.chainID == 0 ? "" : ":" + this.vwr.getChainIDStr(atom.chainID)) + "." + atom.atomName + "%" + atom.altLoc + "\n";
if (this.conformationIndex >= 0 && atom.altLoc != this.lastAltLoc) {
this.lastAltLoc = atom.altLoc;
this.conformationIndex--;
}if (this.conformationIndex < 0 && atom.altLoc != this.lastAltLoc) {
this.sbIgnored.append("ignoring").append(msg);
return false;
}this.sbSelected.append("loading").append(msg);
}}return true;
}, "J.adapter.smarter.Atom,~N");
Clazz_defineMethod(c$, "setAdditionalAtomParameters", 
function(atom){
var floatOccupancy;
if (this.gromacsWideFormat) {
floatOccupancy = this.parseFloatRange(this.line, 60, 68);
atom.bfactor = J.adapter.readers.pdb.PdbReader.fixRadius(this.parseFloatRange(this.line, 68, 76));
} else {
floatOccupancy = this.parseFloatRange(this.line, 54, 60);
atom.bfactor = this.parseFloatRange(this.line, 60, 66);
}atom.foccupancy = (Float.isNaN(floatOccupancy) ? 1 : floatOccupancy);
}, "J.adapter.smarter.Atom");
Clazz_defineMethod(c$, "deduceElementSymbol", 
function(isHetero){
if (this.lineLength >= 78) {
var ch76 = this.line.charAt(76);
var ch77 = this.line.charAt(77);
if (ch76 == ' ' && J.adapter.smarter.Atom.isValidSym1(ch77)) return "" + ch77;
if (J.adapter.smarter.Atom.isValidSymNoCase(ch76, ch77)) return "" + ch76 + ch77;
}var ch12 = this.line.charAt(12);
var ch13 = this.line.charAt(13);
if ((this.htElementsInCurrentGroup == null || this.htElementsInCurrentGroup.get(this.line.substring(12, 14)) != null) && J.adapter.smarter.Atom.isValidSymNoCase(ch12, ch13)) return (isHetero || ch12 != 'H' ? "" + ch12 + ch13 : "H");
if (ch12 == 'H') return "H";
if ((this.htElementsInCurrentGroup == null || this.htElementsInCurrentGroup.get("" + ch13) != null) && J.adapter.smarter.Atom.isValidSym1(ch13)) return "" + ch13;
if (ch12 != ' ' && (this.htElementsInCurrentGroup == null || this.htElementsInCurrentGroup.get("" + ch12) != null) && J.adapter.smarter.Atom.isValidSym1(ch12)) return "" + ch12;
var ch14 = this.line.charAt(14);
if (ch12 == ' ' && ch13 != 'X' && (this.htElementsInCurrentGroup == null || this.htElementsInCurrentGroup.get(this.line.substring(13, 15)) != null) && J.adapter.smarter.Atom.isValidSymNoCase(ch13, ch14)) return "" + ch13 + ch14;
return "Xx";
}, "~B");
Clazz_defineMethod(c$, "conect", 
function(){
if (this.sbConect == null) {
this.sbConect =  new JU.SB();
this.sb =  new JU.SB();
} else {
this.sb.setLength(0);
}var sourceSerial = this.getSerial(6, 11);
if (sourceSerial < 0) return;
var order = 1;
var pt1 = this.line.trim().length;
if (pt1 > 56) pt1 = this.line.substring(0, 56).trim().length;
for (var pt = 11; pt < pt1; pt += 5) {
switch (pt) {
case 31:
order = 2048;
break;
case 41:
continue;
}
var targetSerial = this.getSerial(pt, pt + 5);
if (targetSerial < 0) continue;
var isDoubleBond = (sourceSerial == this.lastSourceSerial && targetSerial == this.lastTargetSerial);
if (isDoubleBond) this.haveDoubleBonds = true;
this.lastSourceSerial = sourceSerial;
this.lastTargetSerial = targetSerial;
var isSwapped = (targetSerial < sourceSerial);
var i1;
if (isSwapped) {
i1 = targetSerial;
targetSerial = sourceSerial;
} else {
i1 = sourceSerial;
}var st = ";" + i1 + " " + targetSerial + ";";
if (this.sbConect.indexOf(st) >= 0 && !isDoubleBond) continue;
if (this.haveDoubleBonds) {
var st1 = "--" + st;
if (this.sbConect.indexOf(st1) >= 0) continue;
this.sb.append(st1);
}this.sbConect.append(st);
this.addConnection( Clazz_newIntArray(-1, [i1, targetSerial, order]));
}
this.sbConect.appendSB(this.sb);
});
Clazz_defineMethod(c$, "structure", 
function(){
var structureType = J.c.STR.NONE;
var substructureType = J.c.STR.NONE;
var startChainIDIndex;
var startIndex;
var endChainIDIndex;
var endIndex;
var strandCount = 0;
if (this.line.startsWith("HELIX ")) {
structureType = J.c.STR.HELIX;
startChainIDIndex = 19;
startIndex = 21;
endChainIDIndex = 31;
endIndex = 33;
if (this.line.length >= 40) substructureType = J.adapter.smarter.Structure.getHelixType(this.parseIntRange(this.line, 38, 40));
} else if (this.line.startsWith("SHEET ")) {
structureType = J.c.STR.SHEET;
startChainIDIndex = 21;
startIndex = 22;
endChainIDIndex = 32;
endIndex = 33;
strandCount = this.parseIntRange(this.line, 14, 16);
} else if (this.line.startsWith("TURN  ")) {
structureType = J.c.STR.TURN;
startChainIDIndex = 19;
startIndex = 20;
endChainIDIndex = 30;
endIndex = 31;
} else return;
if (this.lineLength < endIndex + 4) return;
var structureID = this.line.substring(11, 15).trim();
var strandID = this.line.substring(7, 10).trim();
var startChainID = this.vwr.getChainID(this.line.substring(startChainIDIndex, startChainIDIndex + 1), true);
var startSequenceNumber = this.parseIntRange(this.line, startIndex, startIndex + 4);
var startInsertionCode = this.line.charAt(startIndex + 4);
var endChainID = this.vwr.getChainID(this.line.substring(endChainIDIndex, endChainIDIndex + 1), true);
var endSequenceNumber = this.parseIntRange(this.line, endIndex, endIndex + 4);
var endInsertionCode = ' ';
if (this.lineLength > endIndex + 4) endInsertionCode = this.line.charAt(endIndex + 4);
if (substructureType === J.c.STR.NONE) substructureType = structureType;
var structure =  new J.adapter.smarter.Structure(-1, structureType, substructureType, structureID, strandID, strandCount, null);
structure.set(startChainID, startSequenceNumber, startInsertionCode, endChainID, endSequenceNumber, endInsertionCode, 0, 0);
this.asc.addStructure(structure);
});
Clazz_defineMethod(c$, "getModelNumber", 
function(){
var startModelColumn = 6;
var endModelColumn = 14;
if (endModelColumn > this.lineLength) endModelColumn = this.lineLength;
var iModel = this.parseIntRange(this.line, startModelColumn, endModelColumn);
return (iModel == -2147483648 ? 0 : iModel);
});
Clazz_defineMethod(c$, "getModelName", 
function(){
if (this.lineLength < 16) return null;
if (this.line.startsWith("ATOM")) return "";
var name = this.line.substring(15, this.lineLength).trim();
return (name.length == 0 ? null : name);
});
Clazz_defineMethod(c$, "model", 
function(modelNumber, name){
this.checkNotPDB();
if (name == null) name = this.pdbID;
this.haveMappedSerials = (this.thisBiomolecule != null && this.applySymmetry);
this.sbConect = null;
this.asc.newAtomSet();
this.asc.setCurrentModelInfo("pdbID", this.pdbID);
if (this.asc.iSet == 0 || this.isTrajectory) this.asc.setAtomSetName(this.pdbID);
this.asc.setCurrentModelInfo("name", name);
this.checkUnitCellParams();
if (!this.isCourseGrained) this.setModelPDB(true);
this.asc.setCurrentAtomSetNumber(modelNumber);
if (this.isCourseGrained) this.asc.setCurrentModelInfo("courseGrained", Boolean.TRUE);
}, "~N,~S");
Clazz_defineMethod(c$, "checkNotPDB", 
function(){
var isPDB = (!this.isCourseGrained && (this.nRes == 0 || this.nUNK != this.nRes));
this.checkNearAtoms = !isPDB;
this.setModelPDB(isPDB);
this.nUNK = this.nRes = 0;
this.currentGroup3 = null;
});
Clazz_defineMethod(c$, "cryst1", 
function(){
var a = this.$cryst1 = this.getFloat(6, 9);
if (a == 1) a = NaN;
this.setUnitCell(a, this.getFloat(15, 9), this.getFloat(24, 9), this.getFloat(33, 7), this.getFloat(40, 7), this.getFloat(47, 7));
this.addSpaceGroupName(JU.PT.parseTrimmedRange(this.line, 55, 66));
});
Clazz_defineMethod(c$, "addSpaceGroupName", 
function(name){
if (this.isbiomol) this.doConvertToFractional = false;
if (this.sgName == null || this.sgName.equals("unspecified!")) this.setSpaceGroupName(name);
this.fileSgName = this.sgName;
}, "~S");
Clazz_defineMethod(c$, "getFloat", 
function(ich, cch){
return this.parseFloatRange(this.line, ich, ich + cch);
}, "~N,~N");
Clazz_defineMethod(c$, "scale", 
function(n){
if (this.unitCellParams == null) return;
var pt = n * 4 + 2;
this.unitCellParams[0] = this.$cryst1;
this.setUnitCellItem(pt++, this.getFloat(10, 10));
this.setUnitCellItem(pt++, this.getFloat(20, 10));
this.setUnitCellItem(pt++, this.getFloat(30, 10));
this.setUnitCellItem(pt++, this.getFloat(45, 10));
if (this.isbiomol) this.doConvertToFractional = false;
}, "~N");
Clazz_defineMethod(c$, "expdta", 
function(){
if (this.line.toUpperCase().indexOf("NMR") >= 0) this.asc.setInfo("isNMRdata", "true");
});
Clazz_defineMethod(c$, "formul", 
function(){
var groupName = this.parseTokenRange(this.line, 12, 15);
var formula = JU.PT.parseTrimmedRange(this.line, 19, 70);
var ichLeftParen = formula.indexOf('(');
if (ichLeftParen >= 0) {
var ichRightParen = formula.indexOf(')');
if (ichRightParen < 0 || ichLeftParen >= ichRightParen || ichLeftParen + 1 == ichRightParen) return;
formula = JU.PT.parseTrimmedRange(formula, ichLeftParen + 1, ichRightParen);
}var htElementsInGroup = this.htFormul.get(groupName);
if (htElementsInGroup == null) this.htFormul.put(groupName, htElementsInGroup =  new java.util.Hashtable());
this.next[0] = 0;
var elementWithCount;
while ((elementWithCount = this.parseTokenNext(formula)) != null) {
if (elementWithCount.length < 2) continue;
var chFirst = elementWithCount.charAt(0);
var chSecond = elementWithCount.charAt(1);
if (J.adapter.smarter.Atom.isValidSymNoCase(chFirst, chSecond)) htElementsInGroup.put("" + chFirst + chSecond, Boolean.TRUE);
 else if (J.adapter.smarter.Atom.isValidSym1(chFirst)) htElementsInGroup.put("" + chFirst, Boolean.TRUE);
}
});
Clazz_defineMethod(c$, "het", 
function(){
if (this.line.length < 30) {
return;
}if (this.htHetero == null) {
this.htHetero =  new java.util.Hashtable();
}var groupName = this.parseTokenRange(this.line, 7, 10);
if (this.htHetero.containsKey(groupName)) {
return;
}var hetName = JU.PT.parseTrimmedRange(this.line, 30, 70);
this.htHetero.put(groupName, hetName);
});
Clazz_defineMethod(c$, "hetnam", 
function(){
if (this.htHetero == null) {
this.htHetero =  new java.util.Hashtable();
}var groupName = this.parseTokenRange(this.line, 11, 14);
var hetName = JU.PT.parseTrimmedRange(this.line, 15, 70);
if (groupName == null) {
JU.Logger.error("ERROR: HETNAM record does not contain a group name: " + this.line);
return;
}var htName = this.htHetero.get(groupName);
if (htName != null) {
hetName = htName + hetName;
}this.htHetero.put(groupName, hetName);
this.appendLoadNote(groupName + " = " + hetName);
});
Clazz_defineMethod(c$, "anisou", 
function(){
var data =  Clazz_newFloatArray (8, 0);
data[6] = 1;
var serial = this.line.substring(6, 11).trim();
if (!this.haveMappedSerials && this.asc.ac > 0) {
for (var i = this.asc.getAtomSetAtomIndex(this.asc.iSet); i < this.asc.ac; i++) {
var atomSerial = this.asc.atoms[i].atomSerial;
if (atomSerial != -2147483648) this.asc.atomSymbolicMap.put("" + atomSerial, this.asc.atoms[i]);
}
this.haveMappedSerials = true;
}var atom = this.asc.getAtomFromName(serial);
if (atom == null) {
return;
}for (var i = 28, pt = 0; i < 70; i += 7, pt++) data[pt] = this.parseFloatRange(this.line, i, i + 7);

for (var i = 0; i < 6; i++) {
if (Float.isNaN(data[i])) {
JU.Logger.error("Bad ANISOU record: " + this.line);
return;
}data[i] /= 10000;
}
this.asc.setAnisoBorU(atom, data, 12);
});
Clazz_defineMethod(c$, "site", 
function(){
if (this.htSites == null) {
this.htSites =  new java.util.Hashtable();
}var nResidues = this.parseIntRange(this.line, 15, 17);
var siteID = JU.PT.parseTrimmedRange(this.line, 11, 14);
var htSite = this.htSites.get(siteID);
if (htSite == null) {
htSite =  new java.util.Hashtable();
htSite.put("nResidues", Integer.$valueOf(nResidues));
htSite.put("groups", "");
this.htSites.put(siteID, htSite);
}var groups = htSite.get("groups");
for (var i = 0; i < 4; i++) {
var pt = 18 + i * 11;
var resName = JU.PT.parseTrimmedRange(this.line, pt, pt + 3);
if (resName.length == 0) break;
var chainID = JU.PT.parseTrimmedRange(this.line, pt + 4, pt + 5);
var seq = JU.PT.parseTrimmedRange(this.line, pt + 5, pt + 9);
var iCode = JU.PT.parseTrimmedRange(this.line, pt + 9, pt + 10);
groups += (groups.length == 0 ? "" : ",") + "[" + resName + "]" + seq;
if (iCode.length > 0) groups += "^" + iCode;
if (chainID.length > 0) groups += ":" + chainID;
htSite.put("groups", groups);
}
});
Clazz_defineMethod(c$, "remarkTls", 
function(){
var nGroups = 0;
var iGroup = 0;
var components = null;
var tlsGroups = null;
var tlsGroup = null;
var ranges = null;
var range = null;
var remark = this.line.substring(0, 11);
while (this.readHeader(true) != null && this.line.startsWith(remark)) {
try {
var tokens = JU.PT.getTokens(this.line.substring(10).$replace(':', ' '));
if (tokens.length < 2) continue;
JU.Logger.info(this.line);
if (tokens[1].equalsIgnoreCase("GROUP")) {
tlsGroup =  new java.util.Hashtable();
ranges =  new JU.Lst();
tlsGroup.put("ranges", ranges);
tlsGroups.addLast(tlsGroup);
this.tlsGroupID = this.parseIntStr(tokens[tokens.length - 1]);
tlsGroup.put("id", Integer.$valueOf(this.tlsGroupID));
} else if (tokens[0].equalsIgnoreCase("NUMBER")) {
if (tokens[2].equalsIgnoreCase("COMPONENTS")) {
} else {
nGroups = this.parseIntStr(tokens[tokens.length - 1]);
if (nGroups < 1) break;
if (this.vTlsModels == null) this.vTlsModels =  new JU.Lst();
tlsGroups =  new JU.Lst();
this.appendLoadNote(this.line.substring(11).trim());
}} else if (tokens[0].equalsIgnoreCase("COMPONENTS")) {
components = this.line;
} else if (tokens[0].equalsIgnoreCase("RESIDUE")) {
range =  new java.util.Hashtable();
var chain1;
var chain2;
var res1;
var res2;
if (tokens.length == 6) {
chain1 = tokens[2].charAt(0);
chain2 = tokens[4].charAt(0);
res1 = this.parseIntStr(tokens[3]);
res2 = this.parseIntStr(tokens[5]);
} else {
var toC = components.indexOf(" C ");
var fromC = components.indexOf(" C ", toC + 4);
chain1 = this.line.charAt(fromC);
chain2 = this.line.charAt(toC);
res1 = this.parseIntRange(this.line, fromC + 1, toC);
res2 = this.parseIntStr(this.line.substring(toC + 1));
}if (chain1 == chain2) {
range.put("chains", "" + chain1 + chain2);
if (res1 <= res2) {
range.put("residues",  Clazz_newIntArray(-1, [res1, res2]));
ranges.addLast(range);
} else {
this.tlsAddError(" TLS group residues are not in order (range ignored)");
}} else {
this.tlsAddError(" TLS group chains are different (range ignored)");
}} else if (tokens[0].equalsIgnoreCase("SELECTION")) {
var chain = '\u0000';
for (var i = 1; i < tokens.length; i++) {
if (tokens[i].toUpperCase().indexOf("CHAIN") >= 0) {
chain = tokens[++i].charAt(0);
continue;
}var resno = this.parseIntStr(tokens[i]);
if (resno == -2147483648) continue;
range =  new java.util.Hashtable();
range.put("residues",  Clazz_newIntArray(-1, [resno, this.parseIntStr(tokens[++i])]));
if (chain != '\0') range.put("chains", "" + chain + chain);
ranges.addLast(range);
}
} else if (tokens[0].equalsIgnoreCase("ORIGIN")) {
var origin =  new JU.P3();
tlsGroup.put("origin", origin);
if (tokens.length == 8) {
origin.set(this.parseFloatStr(tokens[5]), this.parseFloatStr(tokens[6]), this.parseFloatStr(tokens[7]));
} else {
var n = this.line.length;
origin.set(this.parseFloatRange(this.line, n - 27, n - 18), this.parseFloatRange(this.line, n - 18, n - 9), this.parseFloatRange(this.line, n - 9, n));
}if (Float.isNaN(origin.x) || Float.isNaN(origin.y) || Float.isNaN(origin.z)) {
origin.set(NaN, NaN, NaN);
this.tlsAddError("invalid origin: " + this.line);
}} else if (tokens[1].equalsIgnoreCase("TENSOR")) {
var tensorType = tokens[0].charAt(0);
var s = (this.readHeader(true).substring(10) + this.readHeader(true).substring(10) + this.readHeader(true).substring(10)).$replace(tensorType, ' ').$replace(':', ' ');
tokens = JU.PT.getTokens(s);
var data =  Clazz_newFloatArray (3, 3, 0);
tlsGroup.put("t" + tensorType, data);
for (var i = 0; i < tokens.length; i++) {
var ti = (tokens[i].charAt(0)).charCodeAt(0) - 49;
var tj = (tokens[i].charAt(1)).charCodeAt(0) - 49;
data[ti][tj] = this.parseFloatStr(tokens[++i]);
if (ti < tj) data[tj][ti] = data[ti][tj];
}
for (var i = 0; i < 3; i++) for (var j = 0; j < 3; j++) if (Float.isNaN(data[i][j])) this.tlsAddError("invalid tensor: " + JU.Escape.escapeFloatAA(data, false));


if (tensorType == 'S' && ++iGroup == nGroups) {
JU.Logger.info(nGroups + " TLS groups read");
this.readHeader(true);
break;
}}} catch (e) {
if (Clazz_exceptionOf(e, Exception)){
JU.Logger.error(this.line + "\nError in TLS parser: ");
System.out.println(e.getMessage());
tlsGroups = null;
break;
} else {
throw e;
}
}
}
if (tlsGroups != null) {
var tlsModel =  new java.util.Hashtable();
tlsModel.put("groupCount", Integer.$valueOf(nGroups));
tlsModel.put("groups", tlsGroups);
this.vTlsModels.addLast(tlsModel);
}return (nGroups < 1);
});
Clazz_defineMethod(c$, "handleTlsMissingModels", 
function(){
this.vTlsModels = null;
});
Clazz_defineMethod(c$, "setTlsGroups", 
function(iGroup, iModel, symmetry){
JU.Logger.info("TLS model " + (iModel + 1) + " set " + (iGroup + 1));
var tlsGroupInfo = this.vTlsModels.get(iGroup);
var groups = tlsGroupInfo.get("groups");
var index0 = this.asc.getAtomSetAtomIndex(iModel);
var data =  Clazz_newFloatArray (this.asc.getAtomSetAtomCount(iModel), 0);
var indexMax = index0 + data.length;
var atoms = this.asc.atoms;
var nGroups = groups.size();
for (var i = 0; i < nGroups; i++) {
var group = groups.get(i);
var ranges = group.get("ranges");
this.tlsGroupID = (group.get("id")).intValue();
for (var j = ranges.size(); --j >= 0; ) {
var chains = ranges.get(j).get("chains");
var residues = ranges.get(j).get("residues");
var chain0 = 0 + (chains.charAt(0)).charCodeAt(0);
var chain1 = 0 + (chains.charAt(1)).charCodeAt(0);
var res0 = residues[0];
var res1 = residues[1];
var index1 = this.findAtomForRange(index0, indexMax, chain0, res0, false);
var index2 = (index1 >= 0 ? this.findAtomForRange(index1, indexMax, chain1, res1, false) : -1);
if (index2 < 0) {
JU.Logger.info("TLS processing terminated");
return;
}JU.Logger.info("TLS ID=" + this.tlsGroupID + " model atom index range " + index1 + "-" + index2);
var isSameChain = (chain0 == chain1);
for (var iAtom = index0; iAtom < indexMax; iAtom++) {
var atom = atoms[iAtom];
if (isSameChain ? atom.sequenceNumber >= res0 && atom.sequenceNumber <= res1 : atom.chainID > chain0 && atom.chainID < chain1 || atom.chainID == chain0 && atom.sequenceNumber >= res0 || atom.chainID == chain1 && atom.sequenceNumber <= res1) {
data[iAtom - index0] = this.tlsGroupID;
this.setTlsTensor(atom, group, symmetry);
}}
}
}
this.asc.setAtomProperties("tlsGroup", data, iModel, true);
this.asc.setModelInfoForSet("TLS", tlsGroupInfo, iModel);
this.asc.setTensors();
}, "~N,~N,J.adapter.smarter.XtalSymmetry.FileSymmetry");
Clazz_defineMethod(c$, "findAtomForRange", 
function(atom1, atom2, chain, resno, isLast){
var iAtom = this.findAtom(atom1, atom2, chain, resno, true);
return (isLast && iAtom >= 0 ? this.findAtom(iAtom, atom2, chain, resno, false) : iAtom);
}, "~N,~N,~N,~N,~B");
Clazz_defineMethod(c$, "findAtom", 
function(atom1, atom2, chain, resno, isTrue){
var atoms = this.asc.atoms;
for (var i = atom1; i < atom2; i++) {
var atom = atoms[i];
if ((atom.chainID == chain && atom.sequenceNumber == resno) == isTrue) return i;
}
if (isTrue) {
JU.Logger.warn("PdbReader findAtom chain=" + chain + " resno=" + resno + " not found");
this.tlsAddError("atom not found: chain=" + chain + " resno=" + resno);
}return (isTrue ? -1 : atom2);
}, "~N,~N,~N,~N,~B");
Clazz_defineMethod(c$, "setTlsTensor", 
function(atom, group, symmetry){
var origin = group.get("origin");
if (Float.isNaN(origin.x)) return;
var T = group.get("tT");
var L = group.get("tL");
var S = group.get("tS");
if (T == null || L == null || S == null) return;
var x = ((atom.x - origin.x) * 0.017453292519943295);
var y = ((atom.y - origin.y) * 0.017453292519943295);
var z = ((atom.z - origin.z) * 0.017453292519943295);
var xx = x * x;
var yy = y * y;
var zz = z * z;
var xy = x * y;
var xz = x * z;
var yz = y * z;
this.dataT[0] = T[0][0];
this.dataT[1] = T[1][1];
this.dataT[2] = T[2][2];
this.dataT[3] = T[0][1];
this.dataT[4] = T[0][2];
this.dataT[5] = T[1][2];
this.dataT[6] = 12;
var anisou =  Clazz_newFloatArray (8, 0);
var bresidual = (Float.isNaN(atom.bfactor) ? 0 : (atom.bfactor / 78.95683520871486));
anisou[0] = this.dataT[0] + L[1][1] * zz + L[2][2] * yy - 2 * L[1][2] * yz + 2 * S[1][0] * z - 2 * S[2][0] * y;
anisou[1] = this.dataT[1] + L[0][0] * zz + L[2][2] * xx - 2 * L[2][0] * xz - 2 * S[0][1] * z + 2 * S[2][1] * x;
anisou[2] = this.dataT[2] + L[0][0] * yy + L[1][1] * xx - 2 * L[0][1] * xy - 2 * S[1][2] * x + 2 * S[0][2] * y;
anisou[3] = this.dataT[3] - L[2][2] * xy + L[1][2] * xz + L[2][0] * yz - L[0][1] * zz - S[0][0] * z + S[1][1] * z + S[2][0] * x - S[2][1] * y;
anisou[4] = this.dataT[4] - L[1][1] * xz + L[1][2] * xy - L[2][0] * yy + L[0][1] * yz + S[0][0] * y - S[2][2] * y + S[1][2] * z - S[1][0] * x;
anisou[5] = this.dataT[5] - L[0][0] * yz - L[1][2] * xx + L[2][0] * xy + L[0][1] * xz - S[1][1] * x + S[2][2] * x + S[0][1] * y - S[0][2] * z;
anisou[6] = 12;
anisou[7] = bresidual;
if (this.tlsU == null) this.tlsU =  new java.util.Hashtable();
this.tlsU.put(atom, anisou);
atom.addTensor(symmetry.getTensor(this.vwr, this.dataT).setType(null), "TLS-U", false);
}, "J.adapter.smarter.Atom,java.util.Map,J.adapter.smarter.XtalSymmetry.FileSymmetry");
Clazz_defineMethod(c$, "tlsAddError", 
function(error){
if (this.sbTlsErrors == null) this.sbTlsErrors =  new JU.SB();
this.sbTlsErrors.append(this.fileName).appendC('\t').append("TLS group ").appendI(this.tlsGroupID).appendC('\t').append(error).appendC('\n');
}, "~S");
c$.fixRadius = Clazz_defineMethod(c$, "fixRadius", 
function(r){
return (r < 0.9 ? 1 : r);
}, "~N");
Clazz_defineMethod(c$, "addConnection", 
function(is){
if (this.vConnect == null) {
this.connectLast = null;
this.vConnect =  new JU.Lst();
}if (this.connectLast != null) {
if (is[0] == this.connectLast[0] && is[1] == this.connectLast[1] && is[2] != 2048) {
this.connectLast[2]++;
return;
}}this.vConnect.addLast(this.connectLast = is);
}, "~A");
Clazz_defineMethod(c$, "connectAllBad", 
function(maxSerial){
var firstAtom = this.connectNextAtomIndex;
for (var i = this.connectNextAtomSet; i < this.asc.atomSetCount; i++) {
var count = this.asc.getAtomSetAtomCount(i);
this.asc.setModelInfoForSet("PDB_CONECT_firstAtom_count_max",  Clazz_newIntArray(-1, [firstAtom, count, maxSerial]), i);
if (this.vConnect != null) {
this.asc.setModelInfoForSet("PDB_CONECT_bonds", this.vConnect, i);
this.asc.setGlobalBoolean(3);
}firstAtom += count;
}
this.vConnect = null;
this.connectNextAtomSet = this.asc.iSet + 1;
this.connectNextAtomIndex = firstAtom;
}, "~N");
Clazz_defineMethod(c$, "connectAll", 
function(maxSerial, isConnectStateBug){
var a = this.asc;
var index = a.iSet;
if (index < 0) return;
if (isConnectStateBug) {
this.connectAllBad(maxSerial);
return;
}a.setCurrentModelInfo("PDB_CONECT_firstAtom_count_max",  Clazz_newIntArray(-1, [a.getAtomSetAtomIndex(index), a.getAtomSetAtomCount(index), maxSerial]));
if (this.vConnect == null) return;
var firstAtom = this.connectNextAtomIndex;
for (var i = a.atomSetCount; --i >= this.connectNextAtomSet; ) {
a.setModelInfoForSet("PDB_CONECT_bonds", this.vConnect, i);
a.setGlobalBoolean(3);
firstAtom += a.getAtomSetAtomCount(i);
}
this.vConnect = null;
this.connectNextAtomSet = index + 1;
this.connectNextAtomIndex = firstAtom;
}, "~N,~B");
});
;//5.0.1-v7 Mon Aug 17 10:07:10 MDT 2026
Clazz_declarePackage("J.adapter.smarter");
Clazz_load(null, "J.adapter.smarter.Structure", ["J.c.STR"], function(){
var c$ = Clazz_decorateAsClass(function(){
this.structureType = null;
this.substructureType = null;
this.structureID = null;
this.strandID = null;
this.strandCount = 0;
this.startSequenceNumber = 0;
this.startChainID = 0;
this.startInsertionCode = '\0';
this.endSequenceNumber = 0;
this.endChainID = 0;
this.endInsertionCode = '\0';
this.atomStartEnd = null;
this.modelStartEnd = null;
this.bsAll = null;
Clazz_instantialize(this, arguments);}, J.adapter.smarter, "Structure", null, Cloneable);
Clazz_prepareFields (c$, function(){
this.atomStartEnd =  Clazz_newIntArray (2, 0);
this.modelStartEnd =  Clazz_newIntArray(-1, [-1, -1]);
});
Clazz_makeConstructor(c$, 
function(modelIndex, structureType, substructureType, structureID, strandID, strandCount, bsAll){
if (bsAll != null) {
this.modelStartEnd =  Clazz_newIntArray(-1, [0, modelIndex]);
this.bsAll = bsAll;
return;
}this.structureType = structureType;
this.substructureType = substructureType;
if (structureID == null) return;
this.modelStartEnd[0] = this.modelStartEnd[1] = modelIndex;
this.structureID = structureID;
this.strandCount = strandCount;
this.strandID = strandID;
}, "~N,J.c.STR,J.c.STR,~S,~S,~N,~A");
c$.getHelixType = Clazz_defineMethod(c$, "getHelixType", 
function(type){
switch (type) {
case 1:
return J.c.STR.HELIXALPHA;
case 3:
return J.c.STR.HELIXPI;
case 5:
return J.c.STR.HELIX310;
}
return J.c.STR.HELIX;
}, "~N");
Clazz_defineMethod(c$, "set", 
function(startChainID, startSequenceNumber, startInsertionCode, endChainID, endSequenceNumber, endInsertionCode, istart, iend){
this.startChainID = startChainID;
this.startSequenceNumber = startSequenceNumber;
this.startInsertionCode = startInsertionCode;
this.endChainID = endChainID;
this.endSequenceNumber = endSequenceNumber;
this.endInsertionCode = endInsertionCode;
this.atomStartEnd[0] = istart;
this.atomStartEnd[1] = iend;
}, "~N,~N,~S,~N,~N,~S,~N,~N");
Clazz_defineMethod(c$, "clone", 
function(){
var s = null;
try {
s = Clazz_superCall(this, J.adapter.smarter.Structure, "clone", []);
} catch (e) {
if (Clazz_exceptionOf(e,"CloneNotSupportedException")){
} else {
throw e;
}
}
return s;
});
});
;//5.0.1-v7 Mon Aug 17 10:07:10 MDT 2026
Clazz_declarePackage("JM");
Clazz_load(["JM.Group"], "JM.Monomer", ["JU.Measure", "$.P3", "$.Quat", "J.c.STR", "JM.BioResolver", "JU.Escape", "$.Logger", "JV.JC"], function(){
var c$ = Clazz_decorateAsClass(function(){
this.bioPolymer = null;
this.offsets = null;
this.monomerIndex = -1;
this.phi = NaN;
this.psi = NaN;
this.omega = NaN;
this.straightness = NaN;
this.mu = NaN;
this.theta = NaN;
this.backboneBlockVis = false;
Clazz_instantialize(this, arguments);}, JM, "Monomer", JM.Group);
Clazz_makeConstructor(c$, 
function(){
Clazz_superConstructor (this, JM.Monomer, []);
});
c$.have = Clazz_defineMethod(c$, "have", 
function(offsets, n){
return (offsets[n] & 0xFF) != 0xFF;
}, "~A,~N");
Clazz_defineMethod(c$, "set2", 
function(chain, group3, seqcode, firstAtomIndex, lastAtomIndex, interestingAtomOffsets){
this.setGroup(chain, group3, seqcode, firstAtomIndex, lastAtomIndex);
this.offsets = interestingAtomOffsets;
this.setLeadAtomIndex();
return this;
}, "JM.Chain,~S,~N,~N,~N,~A");
Clazz_defineMethod(c$, "setLeadAtomIndex", 
function(){
var offset = this.offsets[0] & 0xFF;
if (offset != 255) this.leadAtomIndex = this.firstAtomIndex + offset;
});
Clazz_defineMethod(c$, "setBioPolymer", 
function(polymer, index){
this.bioPolymer = polymer;
this.monomerIndex = index;
}, "JM.BioPolymer,~N");
Clazz_overrideMethod(c$, "getSelectedMonomerCount", 
function(){
return (this.bioPolymer == null ? 0 : this.bioPolymer.getSelectedMonomerCount());
});
Clazz_overrideMethod(c$, "getSelectedMonomerIndex", 
function(){
return (this.bioPolymer == null || !this.bioPolymer.isMonomerSelected(this.monomerIndex) ? -1 : this.monomerIndex);
});
Clazz_overrideMethod(c$, "getBioPolymerLength", 
function(){
return (this.bioPolymer == null ? 0 : this.bioPolymer.monomerCount);
});
Clazz_defineMethod(c$, "getMonomerIndex", 
function(){
return this.monomerIndex;
});
Clazz_overrideMethod(c$, "getAtomIndex", 
function(name, offset){
if (this.bioPolymer != null) {
var groups = this.bioPolymer.monomers;
var ipt = this.monomerIndex + offset;
if (ipt >= 0 && ipt < groups.length) {
var m = groups[ipt];
if (offset == 1 && !m.isConnectedPrevious()) return -1;
if ("\0".equals(name)) return m.leadAtomIndex;
var atoms = this.chain.model.ms.at;
for (var i = m.firstAtomIndex; i <= m.lastAtomIndex; i++) if (atoms[i] != null && (name == null || name.equalsIgnoreCase(atoms[i].getAtomName()))) return i;

}}return -1;
}, "~S,~N");
Clazz_defineMethod(c$, "getBioPolymerIndexInModel", 
function(){
return (this.bioPolymer == null ? -1 : this.bioPolymer.bioPolymerIndexInModel);
});
c$.scanForOffsets = Clazz_defineMethod(c$, "scanForOffsets", 
function(firstAtomIndex, specialAtomIndexes, interestingAtomIDs){
var interestingCount = interestingAtomIDs.length;
var offsets =  Clazz_newByteArray (interestingCount, 0);
for (var i = interestingCount; --i >= 0; ) {
var atomIndex;
var atomID = interestingAtomIDs[i];
if (atomID < 0) {
atomIndex = specialAtomIndexes[~atomID];
} else {
atomIndex = specialAtomIndexes[atomID];
if (atomIndex < 0) return null;
}var offset;
if (atomIndex < 0) offset = 255;
 else {
offset = atomIndex - firstAtomIndex;
if (offset < 0 || offset > 254) {
JU.Logger.warn("Monomer.scanForOffsets i=" + i + " atomID=" + atomID + " atomIndex:" + atomIndex + " firstAtomIndex:" + firstAtomIndex + " offset out of 0-254 range. Groups aren't organized correctly. Is this really a protein?: " + offset);
if (atomID < 0) {
offset = 255;
} else {
}}}offsets[i] = offset;
}
return offsets;
}, "~N,~A,~A");
Clazz_overrideMethod(c$, "getBioStructureType", 
function(){
return J.c.STR.NONE;
});
Clazz_defineMethod(c$, "isHelix", 
function(){
return false;
});
Clazz_defineMethod(c$, "isSheet", 
function(){
return false;
});
Clazz_overrideMethod(c$, "setStrucNo", 
function(id){
}, "~N");
Clazz_defineMethod(c$, "getAtomFromOffsetIndex", 
function(offsetIndex){
if (offsetIndex > this.offsets.length) return null;
var offset = this.offsets[offsetIndex] & 0xFF;
return (offset == 255 ? null : this.chain.model.ms.at[this.firstAtomIndex + offset]);
}, "~N");
Clazz_defineMethod(c$, "getSpecialAtom", 
function(interestingIDs, specialAtomID){
for (var i = interestingIDs.length; --i >= 0; ) {
var interestingID = interestingIDs[i];
if (interestingID < 0) interestingID = -interestingID;
if (specialAtomID == interestingID) {
var offset = this.offsets[i] & 0xFF;
return (offset == 255 ? null : this.chain.model.ms.at[this.firstAtomIndex + offset]);
}}
return null;
}, "~A,~N");
Clazz_defineMethod(c$, "getSpecialAtomPoint", 
function(interestingIDs, specialAtomID){
for (var i = interestingIDs.length; --i >= 0; ) {
var interestingID = interestingIDs[i];
if (interestingID < 0) interestingID = -interestingID;
if (specialAtomID == interestingID) {
var offset = this.offsets[i] & 0xFF;
return (offset == 255 ? null : this.chain.model.ms.at[this.firstAtomIndex + offset]);
}}
return null;
}, "~A,~N");
Clazz_overrideMethod(c$, "isLeadAtom", 
function(atomIndex){
return atomIndex == this.leadAtomIndex;
}, "~N");
Clazz_overrideMethod(c$, "getLeadAtom", 
function(){
return this.getAtomFromOffsetIndex(0);
});
Clazz_defineMethod(c$, "getWingAtom", 
function(){
return this.getAtomFromOffsetIndex(1);
});
Clazz_defineMethod(c$, "getInitiatorAtom", 
function(){
return this.getLeadAtom();
});
Clazz_defineMethod(c$, "getTerminatorAtom", 
function(){
return this.getLeadAtom();
});
Clazz_defineMethod(c$, "findNearestAtomIndex", 
function(x, y, closest, madBegin, madEnd){
}, "~N,~N,~A,~N,~N");
Clazz_defineMethod(c$, "getMyInfo", 
function(ptTemp){
var info = this.getGroupInfo(this.groupIndex, ptTemp);
info.put("chain", this.chain.getIDStr());
var seqNum = this.getResno();
if (seqNum > 0) info.put("sequenceNumber", Integer.$valueOf(seqNum));
var insCode = this.getInsertionCode();
if (insCode.charCodeAt(0) != 0) info.put("insertionCode", "" + insCode);
var f = this.getGroupParameter(1111490569);
if (!Float.isNaN(f)) info.put("phi", Float.$valueOf(f));
f = this.getGroupParameter(1111490570);
if (!Float.isNaN(f)) info.put("psi", Float.$valueOf(f));
f = this.getGroupParameter(1111490565);
if (!Float.isNaN(f)) info.put("mu", Float.$valueOf(f));
f = this.getGroupParameter(1111490576);
if (!Float.isNaN(f)) info.put("theta", Float.$valueOf(f));
var structure = this.getStructure();
if (Clazz_instanceOf(structure,"JM.ProteinStructure")) {
info.put("structureId", Integer.$valueOf((structure).strucNo));
info.put("structureType", (structure).type.getBioStructureTypeName(false));
}info.put("shapeVisibilityFlags", Integer.$valueOf(this.shapeVisibilityFlags));
return info;
}, "JU.P3");
Clazz_overrideMethod(c$, "getStructureId", 
function(){
var structure = this.getStructure();
return (Clazz_instanceOf(structure,"JM.ProteinStructure") ? (structure).type.getBioStructureTypeName(false) : "");
});
Clazz_defineMethod(c$, "updateOffsetsForAlternativeLocations", 
function(atoms, bsSelected){
var updated = false;
for (var offsetIndex = this.offsets.length; --offsetIndex >= 0; ) {
var offset = this.offsets[offsetIndex] & 0xFF;
if (offset == 255) continue;
var iThis = this.firstAtomIndex + offset;
var atom = atoms[iThis];
var thisID = atom.atomID;
if (atom.altloc.charCodeAt(0) == 0) continue;
var nScan = this.lastAtomIndex - this.firstAtomIndex;
for (var i = 1; i <= nScan; i++) {
var iNew = iThis + i;
if (iNew > this.lastAtomIndex) iNew -= nScan + 1;
var offsetNew = iNew - this.firstAtomIndex;
if (offsetNew < 0 || offsetNew > 255 || iNew == iThis || !bsSelected.get(iNew)) continue;
var atomID = atoms[iNew].atomID;
if (atomID != thisID || atomID == 0 && !atoms[iNew].getAtomName().equals(atom.getAtomName())) continue;
this.offsets[offsetIndex] = offsetNew;
atoms[iNew].nBackbonesDisplayed = atom.nBackbonesDisplayed;
updated = true;
break;
}
}
this.setLeadAtomIndex();
return updated;
}, "~A,JU.BS");
Clazz_defineMethod(c$, "getMonomerSequenceAtoms", 
function(bsInclude, bsResult){
this.setAtomBits(bsResult);
bsResult.and(bsInclude);
}, "JU.BS,JU.BS");
c$.checkOptional = Clazz_defineMethod(c$, "checkOptional", 
function(offsets, atom, firstAtomIndex, index){
if (JM.Monomer.have(offsets, atom)) return true;
if (index < 0) return false;
offsets[atom] = (index - firstAtomIndex);
return true;
}, "~A,~N,~N,~N");
Clazz_defineMethod(c$, "getQuaternionFrameCenter", 
function(qtype){
return null;
}, "~S");
Clazz_defineMethod(c$, "getHelixData2", 
function(tokType, qType, mStep){
if (this.monomerIndex < 0) return null;
var iPrev = this.monomerIndex - mStep;
var prev = (mStep < 1 || this.monomerIndex <= 0 ? null : this.bioPolymer.monomers[iPrev]);
var q2 = this.getQuaternion(qType);
var q1 = (mStep < 1 ? JU.Quat.getQuaternionFrameV(JV.JC.axisX, JV.JC.axisY, JV.JC.axisZ, false) : prev == null ? null : prev.getQuaternion(qType));
if (q1 == null || q2 == null) return Clazz_superCall(this, JM.Monomer, "getHelixData", [tokType, qType, mStep]);
var a = (mStep < 1 ? JU.P3.new3(0, 0, 0) : prev.getQuaternionFrameCenter(qType));
var b = this.getQuaternionFrameCenter(qType);
return (a == null || b == null ? this.getHelixData(tokType, qType, mStep) : JU.Escape.escapeHelical((tokType == 135176 ? "helixaxis" + this.getUniqueID() : null), tokType, a, b, JU.Measure.computeHelicalAxis(a, b, q2.div(q1))));
}, "~N,~S,~N");
Clazz_defineMethod(c$, "getUniqueID", 
function(){
var cid = this.chain.chainID;
var a = this.getLeadAtom();
var id = (a == null ? "" : "_" + a.mi) + "_" + this.getResno() + (cid == 0 ? "" : "_" + cid);
var aid = (a == null ? '\0' : this.getLeadAtom().altloc);
if (aid != '\0') id += "_" + aid;
return id;
});
Clazz_overrideMethod(c$, "isCrossLinked", 
function(g){
for (var i = this.firstAtomIndex; i <= this.lastAtomIndex; i++) if (this.getCrossLinkGroup(i, null, g, true, true, false)) return true;

return false;
}, "JM.Group");
Clazz_overrideMethod(c$, "getCrossLinkVector", 
function(vReturn, crosslinkCovalent, crosslinkHBond){
var isNotCheck = (vReturn == null);
for (var i = this.firstAtomIndex; i <= this.lastAtomIndex; i++) if (this.getCrossLinkGroup(i, vReturn, null, crosslinkCovalent, crosslinkHBond, isNotCheck) && isNotCheck) return true;

return !isNotCheck && vReturn.size() > 0;
}, "JU.Lst,~B,~B");
Clazz_defineMethod(c$, "getCrossLinkGroup", 
function(i, vReturn, group, crosslinkCovalent, crosslinkHBond, isNotCheck){
var atom = this.chain.model.ms.at[i];
var bonds = atom.bonds;
var ibp = this.getBioPolymerIndexInModel();
if (ibp < 0 || bonds == null) return false;
var haveCrossLink = false;
var checkPrevious = (!isNotCheck && vReturn == null && group == null);
for (var j = 0; j < bonds.length; j++) {
var b = bonds[j];
if (b.isCovalent() ? !crosslinkCovalent : !crosslinkHBond) continue;
var a = b.getOtherAtom(atom);
var g = a.group;
if (group != null && g !== group) continue;
var iPolymer = g.getBioPolymerIndexInModel();
var igroup = g.getMonomerIndex();
if (checkPrevious) {
if (iPolymer == ibp && igroup == this.monomerIndex - 1) return true;
} else if (iPolymer >= 0 && igroup >= 0 && (iPolymer != ibp || igroup < this.monomerIndex - 1 || igroup > this.monomerIndex + 1)) {
haveCrossLink = true;
if (group != null || vReturn == null) break;
vReturn.addLast(Integer.$valueOf(i));
vReturn.addLast(Integer.$valueOf(a.i));
vReturn.addLast(Integer.$valueOf(g.leadAtomIndex));
}}
return haveCrossLink;
}, "~N,JU.Lst,JM.Group,~B,~B,~B");
Clazz_defineMethod(c$, "isConnectedPrevious", 
function(){
return true;
});
Clazz_defineMethod(c$, "setGroupParameter", 
function(tok, f){
switch (tok) {
case 1111490569:
this.phi = f;
break;
case 1111490570:
this.psi = f;
break;
case 1111490568:
this.omega = f;
break;
case 1111490565:
this.mu = f;
break;
case 1111490576:
this.theta = f;
break;
case 1111490574:
this.straightness = f;
break;
}
}, "~N,~N");
Clazz_overrideMethod(c$, "getGroupParameter", 
function(tok){
if (this.bioPolymer == null) return 0;
if (!this.bioPolymer.haveParameters) this.bioPolymer.calcParameters();
switch (tok) {
case 1094713361:
return 1;
case 1111490568:
return this.omega;
case 1111490569:
return this.phi;
case 1111490570:
return this.psi;
case 1111490565:
return this.mu;
case 1111490576:
return this.theta;
case 1111490574:
return this.straightness;
}
return NaN;
}, "~N");
Clazz_overrideMethod(c$, "getGroup1", 
function(){
return (this.groupID < JM.BioResolver.predefinedGroup1Names.length ? JM.BioResolver.predefinedGroup1Names[this.groupID] : this.group1.charCodeAt(0) > 1 ? this.group1 : this.group1.charCodeAt(0) == 1 ? '?' : (this.group1 = this.getGroup1b()));
});
Clazz_defineMethod(c$, "getGroup1b", 
function(){
return '?';
});
Clazz_overrideMethod(c$, "setGroupID", 
function(group3){
this.groupID = JM.BioResolver.getGroupIdFor(group3);
}, "~S");
Clazz_overrideMethod(c$, "toString", 
function(){
return "[" + this.getGroup3() + "-" + this.getSeqcodeString() + " " + this.getStructure() + "]";
});
});
;//5.0.1-v7 Mon Aug 17 10:07:10 MDT 2026
Clazz_declarePackage("JM");
Clazz_load(["JM.Monomer"], "JM.AlphaMonomer", ["JU.Quat", "$.V3", "J.c.STR", "JM.Helix", "$.Sheet", "$.Turn"], function(){
var c$ = Clazz_decorateAsClass(function(){
this.proteinStructure = null;
this.nitrogenHydrogenPoint = null;
Clazz_instantialize(this, arguments);}, JM, "AlphaMonomer", JM.Monomer);
Clazz_overrideConstructor(c$, 
function(){
});
Clazz_overrideMethod(c$, "isProtein", 
function(){
return true;
});
c$.validateAndAllocateA = Clazz_defineMethod(c$, "validateAndAllocateA", 
function(chain, group3, seqcode, firstIndex, lastIndex, specialAtomIndexes){
return (specialAtomIndexes[2] != firstIndex ? null :  new JM.AlphaMonomer().set2(chain, group3, seqcode, firstIndex, lastIndex,  Clazz_newByteArray (1, 0)));
}, "JM.Chain,~S,~N,~N,~N,~A");
Clazz_defineMethod(c$, "isAlphaMonomer", 
function(){
return true;
});
Clazz_overrideMethod(c$, "getStructure", 
function(){
return this.proteinStructure;
});
Clazz_defineMethod(c$, "setStructure", 
function(ps){
if ((this.proteinStructure = ps) == null) this.nitrogenHydrogenPoint = null;
}, "JM.ProteinStructure");
Clazz_overrideMethod(c$, "setStrucNo", 
function(n){
if (this.proteinStructure != null) this.proteinStructure.strucNo = n;
}, "~N");
Clazz_overrideMethod(c$, "getBioStructureType", 
function(){
return this.proteinStructure == null ? J.c.STR.NONE : this.proteinStructure.type;
});
Clazz_overrideMethod(c$, "getBioStructureSubType", 
function(dssx){
switch (dssx) {
case 1111490651:
if (this.proteinStructure != null) return this.proteinStructure.subtype;
break;
}
return J.c.STR.NONE;
}, "~N");
Clazz_overrideMethod(c$, "getStrucNo", 
function(){
return this.proteinStructure != null ? this.proteinStructure.strucNo : 0;
});
Clazz_overrideMethod(c$, "isHelix", 
function(){
return this.proteinStructure != null && this.proteinStructure.type === J.c.STR.HELIX;
});
Clazz_overrideMethod(c$, "isSheet", 
function(){
return this.proteinStructure != null && this.proteinStructure.type === J.c.STR.SHEET;
});
Clazz_overrideMethod(c$, "setProteinStructureType", 
function(type, monomerIndexCurrent){
if (this.proteinStructure != null) this.proteinStructure.removeMonomer(this.monomerIndex);
if (monomerIndexCurrent < 0 || monomerIndexCurrent > 0 && this.monomerIndex == 0) {
switch (type) {
case J.c.STR.HELIX:
case J.c.STR.HELIXALPHA:
case J.c.STR.HELIX310:
case J.c.STR.HELIXPI:
this.setStructure( new JM.Helix(this.bioPolymer, this.monomerIndex, 1, type));
break;
case J.c.STR.SHEET:
this.setStructure( new JM.Sheet(this.bioPolymer, this.monomerIndex, 1, type));
break;
case J.c.STR.TURN:
this.setStructure( new JM.Turn(this.bioPolymer, this.monomerIndex, 1));
break;
case J.c.STR.NONE:
this.setStructure(null);
}
} else {
this.setStructure(this.bioPolymer.getProteinStructure(monomerIndexCurrent));
if (this.proteinStructure != null) this.proteinStructure.addMonomer(this.monomerIndex);
}return this.monomerIndex;
}, "J.c.STR,~N");
Clazz_defineMethod(c$, "getAtom", 
function(specialAtomID){
return (specialAtomID == 2 ? this.getLeadAtom() : null);
}, "~N");
Clazz_defineMethod(c$, "getAtomPoint", 
function(specialAtomID){
return (specialAtomID == 2 ? this.getLeadAtom() : null);
}, "~N");
Clazz_overrideMethod(c$, "isConnectedAfter", 
function(possiblyPreviousMonomer){
if (possiblyPreviousMonomer == null) return true;
var atom1 = this.getLeadAtom();
var atom2 = possiblyPreviousMonomer.getLeadAtom();
return atom1.isBonded(atom2) || atom1.distance(atom2) <= 4.5;
}, "JM.Monomer");
Clazz_overrideMethod(c$, "getQuaternionFrameCenter", 
function(qType){
return this.getQuaternionFrameCenterAlpha(qType);
}, "~S");
Clazz_overrideMethod(c$, "isWithinStructure", 
function(type){
return (this.proteinStructure != null && this.proteinStructure.type === type && this.proteinStructure.isWithin(this.monomerIndex));
}, "J.c.STR");
Clazz_defineMethod(c$, "getQuaternionFrameCenterAlpha", 
function(qType){
switch ((qType).charCodeAt(0)) {
case 98:
case 99:
case 67:
case 120:
return this.getLeadAtom();
default:
case 97:
case 110:
case 112:
case 80:
case 113:
return null;
}
}, "~S");
Clazz_overrideMethod(c$, "getHelixData", 
function(tokType, qType, mStep){
return this.getHelixData2(tokType, qType, mStep);
}, "~N,~S,~N");
Clazz_overrideMethod(c$, "getQuaternion", 
function(qType){
return this.getQuaternionAlpha(qType);
}, "~S");
Clazz_defineMethod(c$, "getQuaternionAlpha", 
function(qType){
if (this.monomerIndex < 0) return null;
var vA =  new JU.V3();
var vB =  new JU.V3();
var vC = null;
switch ((qType).charCodeAt(0)) {
default:
case 97:
case 110:
case 112:
case 113:
return null;
case 98:
case 99:
case 120:
if (this.monomerIndex == 0 || this.monomerIndex == this.bioPolymer.monomerCount - 1) return null;
var ptCa = this.getLeadAtom();
var ptCaNext = this.bioPolymer.getLeadPoint(this.monomerIndex + 1);
var ptCaPrev = this.bioPolymer.getLeadPoint(this.monomerIndex - 1);
vA.sub2(ptCaNext, ptCa);
vB.sub2(ptCaPrev, ptCa);
break;
}
return JU.Quat.getQuaternionFrameV(vA, vB, vC, false);
}, "~S");
});
;//5.0.1-v7 Mon Aug 17 10:07:10 MDT 2026
Clazz_declarePackage("JM");
Clazz_load(["JM.Structure"], "JM.ProteinStructure", ["java.util.Hashtable", "JU.P3", "$.V3", "JU.Logger"], function(){
var c$ = Clazz_decorateAsClass(function(){
this.type = null;
this.subtype = null;
this.structureID = null;
this.strucNo = 0;
this.serialID = null;
this.strandCount = 1;
this.id = 0;
this.nRes = 0;
this.apolymer = null;
this.monomerIndexFirst = 0;
this.monomerIndexLast = 0;
this.axisA = null;
this.axisB = null;
this.axisUnitVector = null;
this.vectorProjection = null;
this.segments = null;
this.resMap = null;
Clazz_instantialize(this, arguments);}, JM, "ProteinStructure", null, JM.Structure);
Clazz_makeConstructor(c$, 
function(){
this.incrementID();
});
Clazz_defineMethod(c$, "incrementID", 
function(){
this.id = ++JM.ProteinStructure.ids;
});
Clazz_defineMethod(c$, "setupPS", 
function(apolymer, type, monomerIndex, monomerCount){
this.strucNo = ++JM.ProteinStructure.globalStrucNo;
this.apolymer = apolymer;
this.type = type;
this.vectorProjection =  new JU.V3();
this.monomerIndexFirst = monomerIndex;
this.addMonomer(monomerIndex + monomerCount - 1);
if (JU.Logger.debugging) JU.Logger.info("Creating ProteinStructure " + this.strucNo + " " + type.getBioStructureTypeName(false) + " from " + apolymer.monomers[this.monomerIndexFirst] + " through " + apolymer.monomers[this.monomerIndexLast] + " in polymer " + apolymer);
}, "JM.AlphaPolymer,J.c.STR,~N,~N");
Clazz_defineMethod(c$, "addMonomer", 
function(index){
this.resMap = null;
this.resetAxes();
this.monomerIndexFirst = Math.min(this.monomerIndexFirst, index);
this.monomerIndexLast = Math.max(this.monomerIndexLast, index);
this.nRes = this.monomerIndexLast - this.monomerIndexFirst + 1;
}, "~N");
Clazz_defineMethod(c$, "removeMonomer", 
function(index){
this.resMap = null;
this.resetAxes();
if (index > this.monomerIndexLast || index < this.monomerIndexFirst) return;
if (index == this.monomerIndexFirst) {
this.monomerIndexFirst++;
this.nRes--;
} else if (index == this.monomerIndexLast) {
this.monomerIndexLast--;
this.nRes--;
} else {
var n = this.monomerIndexLast - index;
this.monomerIndexLast = index - 1;
this.nRes = index - this.monomerIndexFirst;
var monomers = this.apolymer.monomers;
var type = monomers[++index].getBioStructureType();
var mLast = -1;
for (var i = 0, pt = index; i < n; i++, pt++) {
(monomers[pt]).setStructure(null);
mLast = monomers[pt].setProteinStructureType(type, mLast);
}
}}, "~N");
Clazz_defineMethod(c$, "calcAxis", 
function(){
});
Clazz_defineMethod(c$, "isWithin", 
function(monomerIndex){
return (monomerIndex > this.monomerIndexFirst && monomerIndex < this.monomerIndexLast);
}, "~N");
Clazz_defineMethod(c$, "getIndex", 
function(monomer){
if (this.resMap == null) {
this.resMap =  new java.util.Hashtable();
for (var i = this.nRes; --i >= 0; ) this.resMap.put(this.apolymer.monomers[this.monomerIndexFirst + i], Integer.$valueOf(i));

}var ii = this.resMap.get(monomer);
return (ii == null ? -1 : ii.intValue());
}, "JM.Monomer");
Clazz_defineMethod(c$, "getSegments", 
function(){
if (this.segments == null) this.calcSegments();
return this.segments;
});
Clazz_defineMethod(c$, "getStructureMidPoint", 
function(index){
if (this.segments == null) this.calcSegments();
return this.segments[index];
}, "~N");
Clazz_defineMethod(c$, "calcSegments", 
function(){
if (this.segments != null) return;
this.calcAxis();
this.segments =  new Array(this.nRes + 1);
this.segments[this.nRes] = this.axisB;
this.segments[0] = this.axisA;
var axis = JU.V3.newV(this.axisUnitVector);
axis.scale(this.axisB.distance(this.axisA) / this.nRes);
for (var i = 1; i < this.nRes; i++) {
var point = this.segments[i] =  new JU.P3();
point.add2(this.segments[i - 1], axis);
}
});
Clazz_defineMethod(c$, "getAxisStartPoint", 
function(){
this.calcAxis();
return this.axisA;
});
Clazz_defineMethod(c$, "getAxisEndPoint", 
function(){
this.calcAxis();
return this.axisB;
});
Clazz_defineMethod(c$, "resetAxes", 
function(){
this.axisA = null;
this.segments = null;
});
Clazz_overrideMethod(c$, "setAtomBits", 
function(bs){
var ms = this.apolymer.monomers;
for (var i = this.monomerIndexFirst; i <= this.monomerIndexLast; i++) ms[i].setAtomBits(bs);

}, "JU.BS");
Clazz_overrideMethod(c$, "setAtomBitsAndClear", 
function(bs, bsOut){
var ms = this.apolymer.monomers;
for (var i = this.monomerIndexFirst; i <= this.monomerIndexLast; i++) ms[i].setAtomBitsAndClear(bs, bsOut);

}, "JU.BS,JU.BS");
Clazz_defineMethod(c$, "findMonomer", 
function(bsAtoms, isFirst){
var ms = this.apolymer.monomers;
if (this.monomerIndexFirst < 0) return null;
if (isFirst) {
for (var i = this.monomerIndexFirst; i <= this.monomerIndexLast; i++) if (bsAtoms == null || bsAtoms.get(ms[i].leadAtomIndex)) return ms[i];

} else {
for (var i = this.monomerIndexLast; i >= this.monomerIndexFirst; --i) if (bsAtoms == null || bsAtoms.get(ms[i].leadAtomIndex)) return ms[i];

}return null;
}, "JU.BS,~B");
Clazz_overrideMethod(c$, "toString", 
function(){
return "[" + this.id + " " + this.type + (this.subtype == null ? "" : " " + this.subtype) + " (" + this.monomerIndexFirst + "-" + this.monomerIndexLast + ")]";
});
c$.ids = 0;
c$.globalStrucNo = 1000;
});
;//5.0.1-v7 Mon Aug 17 10:07:10 MDT 2026
Clazz_declarePackage("JM");
Clazz_load(["JM.ProteinStructure"], "JM.Helix", ["JU.Measure", "$.P3", "$.V3", "J.c.STR"], function(){
var c$ = Clazz_declareType(JM, "Helix", JM.ProteinStructure);
Clazz_makeConstructor(c$, 
function(apolymer, monomerIndex, monomerCount, subtype){
Clazz_superConstructor (this, JM.Helix, []);
this.setupPS(apolymer, J.c.STR.HELIX, monomerIndex, monomerCount);
this.subtype = subtype;
}, "JM.AlphaPolymer,~N,~N,J.c.STR");
Clazz_overrideMethod(c$, "calcAxis", 
function(){
if (this.axisA != null) return;
var points =  new Array(this.nRes + 1);
for (var i = 0; i <= this.nRes; i++) this.apolymer.getLeadMidPoint(this.monomerIndexFirst + i, points[i] =  new JU.P3());

this.axisA =  new JU.P3();
this.axisUnitVector =  new JU.V3();
JU.Measure.calcBestAxisThroughPoints(points, points.length, this.axisA, this.axisUnitVector, this.vectorProjection, 4);
this.axisB = JU.P3.newP(points[this.nRes]);
JU.Measure.projectOntoAxis(this.axisB, this.axisA, this.axisUnitVector, this.vectorProjection);
});
});
;//5.0.1-v7 Mon Aug 17 10:07:10 MDT 2026
Clazz_declarePackage("JM");
Clazz_load(["JM.ProteinStructure"], "JM.Sheet", ["JU.Measure", "$.P3", "$.V3", "J.c.STR"], function(){
var c$ = Clazz_decorateAsClass(function(){
this.widthUnitVector = null;
this.heightUnitVector = null;
Clazz_instantialize(this, arguments);}, JM, "Sheet", JM.ProteinStructure);
Clazz_makeConstructor(c$, 
function(apolymer, monomerIndex, monomerCount, subtype){
Clazz_superConstructor (this, JM.Sheet, []);
this.incrementID();
this.setupPS(apolymer, J.c.STR.SHEET, monomerIndex, monomerCount);
this.subtype = subtype;
}, "JM.AlphaPolymer,~N,~N,J.c.STR");
Clazz_overrideMethod(c$, "calcAxis", 
function(){
if (this.axisA != null) return;
if (this.nRes == 2) {
this.axisA = this.apolymer.getLeadPoint(this.monomerIndexFirst);
this.axisB = this.apolymer.getLeadPoint(this.monomerIndexFirst + 1);
} else {
this.axisA =  new JU.P3();
this.apolymer.getLeadMidPoint(this.monomerIndexFirst + 1, this.axisA);
this.axisB =  new JU.P3();
this.apolymer.getLeadMidPoint(this.monomerIndexFirst + this.nRes - 1, this.axisB);
}this.axisUnitVector =  new JU.V3();
this.axisUnitVector.sub2(this.axisB, this.axisA);
this.axisUnitVector.normalize();
var tempA =  new JU.P3();
this.apolymer.getLeadMidPoint(this.monomerIndexFirst, tempA);
if (this.notHelixOrSheet(this.monomerIndexFirst - 1)) JU.Measure.projectOntoAxis(tempA, this.axisA, this.axisUnitVector, this.vectorProjection);
var tempB =  new JU.P3();
this.apolymer.getLeadMidPoint(this.monomerIndexFirst + this.nRes, tempB);
if (this.notHelixOrSheet(this.monomerIndexFirst + this.nRes)) JU.Measure.projectOntoAxis(tempB, this.axisA, this.axisUnitVector, this.vectorProjection);
this.axisA = tempA;
this.axisB = tempB;
});
Clazz_defineMethod(c$, "notHelixOrSheet", 
function(i){
return (i < 0 || i >= this.apolymer.monomerCount || !this.apolymer.monomers[i].isHelix() && !this.apolymer.monomers[i].isSheet());
}, "~N");
Clazz_defineMethod(c$, "calcSheetUnitVectors", 
function(){
if (!(Clazz_instanceOf(this.apolymer,"JM.AminoPolymer"))) return;
if (this.widthUnitVector == null) {
var vectorCO =  new JU.V3();
var vectorCOSum =  new JU.V3();
var amino = this.apolymer.monomers[this.monomerIndexFirst];
vectorCOSum.sub2(amino.getCarbonylOxygenAtom(), amino.getCarbonylCarbonAtom());
for (var i = this.nRes; --i > this.monomerIndexFirst; ) {
amino = this.apolymer.monomers[i];
vectorCO.sub2(amino.getCarbonylOxygenAtom(), amino.getCarbonylCarbonAtom());
if (vectorCOSum.angle(vectorCO) < 1.5707964) vectorCOSum.add(vectorCO);
 else vectorCOSum.sub(vectorCO);
}
this.heightUnitVector = vectorCO;
this.heightUnitVector.cross(this.axisUnitVector, vectorCOSum);
this.heightUnitVector.normalize();
this.widthUnitVector = vectorCOSum;
this.widthUnitVector.cross(this.axisUnitVector, this.heightUnitVector);
}});
Clazz_defineMethod(c$, "setBox", 
function(w, h, pt, vW, vH, ptC, scale){
if (this.heightUnitVector == null) this.calcSheetUnitVectors();
vW.setT(this.widthUnitVector);
vW.scale(scale * w);
vH.setT(this.heightUnitVector);
vH.scale(scale * h);
ptC.ave(vW, vH);
ptC.sub2(pt, ptC);
}, "~N,~N,JU.P3,JU.V3,JU.V3,JU.P3,~N");
});
;//5.0.1-v7 Mon Aug 17 10:07:10 MDT 2026
Clazz_declarePackage("JM");
Clazz_load(["JM.ProteinStructure"], "JM.Turn", ["J.c.STR"], function(){
var c$ = Clazz_declareType(JM, "Turn", JM.ProteinStructure);
Clazz_makeConstructor(c$, 
function(apolymer, monomerIndex, monomerCount){
Clazz_superConstructor (this, JM.Turn, []);
this.setupPS(apolymer, J.c.STR.TURN, monomerIndex, monomerCount);
this.subtype = J.c.STR.TURN;
}, "JM.AlphaPolymer,~N,~N");
});
;//5.0.1-v7 Mon Aug 17 10:07:10 MDT 2026
Clazz_declarePackage("JM");
Clazz_load(["JM.Structure", "JU.V3"], "JM.BioPolymer", ["JU.BS", "$.P3"], function(){
var 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(monomers, hasStructure){
this.monomers = monomers;
this.hasStructure = hasStructure;
this.monomerCount = monomers.length;
for (var i = this.monomerCount; --i >= 0; ) monomers[i].setBioPolymer(this, i);

this.model = monomers[0].getModel();
}, "~A,~B");
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;
var updated = false;
for (var i = this.monomerCount; --i >= 0; ) if (this.monomers[i].updateOffsetsForAlternativeLocations(atoms, bsSelected)) updated = true;

if (updated) {
this.recalculateLeadMidpointsAndWingVectors();
for (var i = 9; i < 16; i++) {
var s = this.model.ms.vwr.shm.shapes[i];
if (s == null) continue;
for (var b = s.bioShapes.length; --b >= 0; ) {
var bi = s.bioShapes[b];
if (bi.bioPolymer === this) bi.falsifyMesh();
}
}
}}, "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;
leadPoint = this.getLeadPoint(i);
if (leadPoint == null) {
return;
}this.leadPoints[i] = leadPoint;
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]);
if (vectorB.length() == 0) {
vectorC = previousVectorC;
} else {
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_overrideMethod(c$, "toString", 
function(){
return "[Polymer type " + this.type + " n=" + this.monomerCount + " " + (this.monomerCount > 0 ? this.monomers[0] + " " + this.monomers[this.monomerCount - 1] : "") + "]";
});
});
;//5.0.1-v7 Mon Aug 17 10:07:10 MDT 2026
Clazz_declarePackage("JM");
Clazz_load(["java.lang.Enum", "JM.BioPolymer"], "JM.AlphaPolymer", ["JU.Measure", "$.P3", "J.c.STR", "JM.Helix", "$.Sheet", "$.Turn", "JU.Logger"], function(){
var c$ = Clazz_decorateAsClass(function(){
this.pt0 = 0;
Clazz_instantialize(this, arguments);}, JM, "AlphaPolymer", JM.BioPolymer);
Clazz_makeConstructor(c$, 
function(monomers, pt0){
Clazz_superConstructor(this, JM.AlphaPolymer, [monomers, true]);
this.pt0 = pt0;
}, "~A,~N");
Clazz_overrideMethod(c$, "getProteinStructure", 
function(monomerIndex){
return this.monomers[monomerIndex].getStructure();
}, "~N");
Clazz_overrideMethod(c$, "getControlPoint", 
function(i, v){
if (!this.monomers[i].isSheet()) return this.leadPoints[i];
v.sub2(this.leadMidpoints[i], this.leadPoints[i]);
v.scale(this.sheetSmoothing);
var pt = JU.P3.newP(this.leadPoints[i]);
pt.add(v);
return pt;
}, "~N,JU.V3");
Clazz_defineMethod(c$, "addStructure", 
function(type, structureID, serialID, strandCount, startChainID, startSeqcode, endChainID, endSeqcode, istart, iend, bsAssigned){
var i0 = -1;
var i1 = -1;
if (istart < iend) {
if (this.monomers[0].firstAtomIndex > iend || this.monomers[this.monomerCount - 1].lastAtomIndex < istart) return;
i0 = istart;
i1 = iend;
}var indexStart;
var indexEnd;
if ((indexStart = this.getIndex(startChainID, startSeqcode, i0, i1)) == -1 || (indexEnd = this.getIndex(endChainID, endSeqcode, i0, i1)) == -1) return;
if (istart >= 0) {
istart = this.monomers[indexStart].firstAtomIndex;
iend = this.monomers[indexEnd].lastAtomIndex;
var pt = bsAssigned.nextSetBit(istart);
if (pt >= 0 && pt < iend) return;
}if (this.addStructureProtected(type, structureID, serialID, strandCount, indexStart, indexEnd) && istart >= 0) bsAssigned.setBits(istart, iend + 1);
}, "J.c.STR,~S,~S,~N,~N,~N,~N,~N,~N,~N,JU.BS");
Clazz_defineMethod(c$, "addStructureProtected", 
function(type, structureID, serialID, strandCount, indexStart, indexEnd){
if (indexEnd < indexStart) {
JU.Logger.error("AlphaPolymer:addSecondaryStructure error:  indexStart:" + indexStart + " indexEnd:" + indexEnd);
return false;
}var structureCount = indexEnd - indexStart + 1;
var ps = null;
switch (type) {
case J.c.STR.HELIX:
case J.c.STR.HELIXALPHA:
case J.c.STR.HELIX310:
case J.c.STR.HELIXPI:
ps =  new JM.Helix(this, indexStart, structureCount, type);
break;
case J.c.STR.SHEET:
ps =  new JM.Sheet(this, indexStart, structureCount, type);
break;
case J.c.STR.TURN:
ps =  new JM.Turn(this, indexStart, structureCount);
break;
default:
JU.Logger.error("unrecognized secondary structure type");
return false;
}
ps.structureID = structureID;
ps.serialID = serialID;
ps.strandCount = strandCount;
for (var i = indexStart; i <= indexEnd; ++i) (this.monomers[i]).setStructure(ps);

return true;
}, "J.c.STR,~S,~S,~N,~N,~N");
Clazz_overrideMethod(c$, "clearStructures", 
function(){
for (var i = 0; i < this.monomerCount; i++) (this.monomers[i]).setStructure(null);

});
Clazz_defineMethod(c$, "calculateStructures", 
function(alphaOnly){
if (this.monomerCount < 4) return;
var angles = this.calculateAnglesInDegrees();
var codes = this.calculateCodes(angles);
this.checkBetaSheetAlphaHelixOverlap(codes, angles);
var tags = this.calculateRunsFourOrMore(codes);
this.extendRuns(tags);
this.searchForTurns(codes, angles, tags);
this.addStructuresFromTags(tags);
}, "~B");
Clazz_defineMethod(c$, "calculateAnglesInDegrees", 
function(){
var angles =  Clazz_newFloatArray (this.monomerCount, 0);
for (var i = this.monomerCount - 1; --i >= 2; ) angles[i] = JU.Measure.computeTorsion(this.monomers[i - 2].getLeadAtom(), this.monomers[i - 1].getLeadAtom(), this.monomers[i].getLeadAtom(), this.monomers[i + 1].getLeadAtom(), true);

return angles;
});
Clazz_defineMethod(c$, "calculateCodes", 
function(angles){
var codes =  new Array(this.monomerCount);
for (var i = this.monomerCount - 1; --i >= 2; ) {
var degrees = angles[i];
codes[i] = ((degrees >= 10 && degrees < 120) ? JM.AlphaPolymer.Code.RIGHT_HELIX : ((degrees >= 120 || degrees < -90) ? JM.AlphaPolymer.Code.BETA_SHEET : ((degrees >= -90 && degrees < 0) ? JM.AlphaPolymer.Code.LEFT_HELIX : JM.AlphaPolymer.Code.NADA)));
}
return codes;
}, "~A");
Clazz_defineMethod(c$, "checkBetaSheetAlphaHelixOverlap", 
function(codes, angles){
for (var i = this.monomerCount - 2; --i >= 2; ) if (codes[i] === JM.AlphaPolymer.Code.BETA_SHEET && angles[i] <= 140 && codes[i - 2] === JM.AlphaPolymer.Code.RIGHT_HELIX && codes[i - 1] === JM.AlphaPolymer.Code.RIGHT_HELIX && codes[i + 1] === JM.AlphaPolymer.Code.RIGHT_HELIX && codes[i + 2] === JM.AlphaPolymer.Code.RIGHT_HELIX) codes[i] = JM.AlphaPolymer.Code.RIGHT_HELIX;

}, "~A,~A");
Clazz_defineMethod(c$, "calculateRunsFourOrMore", 
function(codes){
var tags =  new Array(this.monomerCount);
var tag = J.c.STR.NONE;
var code = JM.AlphaPolymer.Code.NADA;
var runLength = 0;
for (var i = 0; i < this.monomerCount; ++i) {
if (codes[i] === code && code !== JM.AlphaPolymer.Code.NADA) {
++runLength;
if (runLength == 4) {
tag = (code === JM.AlphaPolymer.Code.BETA_SHEET ? J.c.STR.SHEET : J.c.STR.HELIX);
for (var j = 4; --j >= 0; ) tags[i - j] = tag;

} else if (runLength > 4) tags[i] = tag;
} else {
runLength = 1;
code = codes[i];
}}
return tags;
}, "~A");
Clazz_defineMethod(c$, "extendRuns", 
function(tags){
for (var i = 1; i < this.monomerCount - 4; ++i) if (tags[i] === J.c.STR.NONE && tags[i + 1] !== J.c.STR.NONE) tags[i] = tags[i + 1];

tags[0] = tags[1];
tags[this.monomerCount - 1] = tags[this.monomerCount - 2];
}, "~A");
Clazz_defineMethod(c$, "searchForTurns", 
function(codes, angles, tags){
for (var i = this.monomerCount - 1; --i >= 2; ) {
codes[i] = JM.AlphaPolymer.Code.NADA;
if (tags[i] == null || tags[i] === J.c.STR.NONE) {
var angle = angles[i];
if (angle >= -90 && angle < 0) codes[i] = JM.AlphaPolymer.Code.LEFT_TURN;
 else if (angle >= 0 && angle < 90) codes[i] = JM.AlphaPolymer.Code.RIGHT_TURN;
}}
for (var i = this.monomerCount - 1; --i >= 0; ) {
if (codes[i] !== JM.AlphaPolymer.Code.NADA && codes[i + 1] === codes[i] && tags[i] === J.c.STR.NONE) tags[i] = J.c.STR.TURN;
}
}, "~A,~A,~A");
Clazz_defineMethod(c$, "addStructuresFromTags", 
function(tags){
var i = 0;
while (i < this.monomerCount) {
var tag = tags[i];
if (tag == null || tag === J.c.STR.NONE) {
++i;
continue;
}var iMax;
for (iMax = i + 1; iMax < this.monomerCount && tags[iMax] === tag; ++iMax) {
}
this.addStructureProtected(tag, null, null, 0, i, iMax - 1);
i = iMax;
}
}, "~A");
Clazz_defineMethod(c$, "setStructureBS", 
function(count, dsspType, type, bs, doOffset){
var offset = (doOffset ? this.pt0 : 0);
for (var pt = 0, i = bs.nextSetBit(offset), i2 = 0, n = this.monomerCount + offset; i >= 0 && i < n; i = bs.nextSetBit(i2 + 1)) {
if ((i2 = bs.nextClearBit(i)) < 0 || i2 > n) i2 = n;
this.addStructureProtected(type, JM.AlphaPolymer.dsspTypes[dsspType] + (++pt), "" + count++, (dsspType == 3 ? 1 : 0), i - offset, i2 - 1 - offset);
}
return count;
}, "~N,~N,J.c.STR,JU.BS,~B");
/*if2*/;(function(){
var c$ = Clazz_declareType(JM.AlphaPolymer, "Code", Enum);
Clazz_defineEnumConstant(c$, "NADA", 0, []);
Clazz_defineEnumConstant(c$, "RIGHT_HELIX", 1, []);
Clazz_defineEnumConstant(c$, "BETA_SHEET", 2, []);
Clazz_defineEnumConstant(c$, "LEFT_HELIX", 3, []);
Clazz_defineEnumConstant(c$, "LEFT_TURN", 4, []);
Clazz_defineEnumConstant(c$, "RIGHT_TURN", 5, []);
/*eoif2*/})();
c$.dsspTypes =  Clazz_newArray(-1, ["H", null, "H", "S", "H", null, "T"]);
});
;//5.0.1-v7 Mon Aug 17 10:07:10 MDT 2026
Clazz_declarePackage("JM");
Clazz_load(["JM.AlphaMonomer"], "JM.AminoMonomer", ["JU.A4", "$.BS", "$.M3", "$.P3", "$.PT", "$.Quat", "$.V3", "J.c.STR", "JU.Escape", "$.Logger"], function(){
var c$ = Clazz_decorateAsClass(function(){
this.nhChecked = false;
this.ptTemp = null;
Clazz_instantialize(this, arguments);}, JM, "AminoMonomer", JM.AlphaMonomer);
Clazz_overrideConstructor(c$, 
function(){
});
c$.validateAndAllocate = Clazz_defineMethod(c$, "validateAndAllocate", 
function(chain, group3, seqcode, firstAtomIndex, lastAtomIndex, specialAtomIndexes, atoms){
var offsets = JM.Monomer.scanForOffsets(firstAtomIndex, specialAtomIndexes, JM.AminoMonomer.interestingAminoAtomIDs);
if (offsets == null) return null;
JM.Monomer.checkOptional(offsets, 1, firstAtomIndex, specialAtomIndexes[5]);
if (atoms[firstAtomIndex].isHetero() && !JM.AminoMonomer.isBondedCorrectly(firstAtomIndex, offsets, atoms)) return null;
return  new JM.AminoMonomer().set2(chain, group3, seqcode, firstAtomIndex, lastAtomIndex, offsets);
}, "JM.Chain,~S,~N,~N,~N,~A,~A");
c$.isBondedCorrectlyRange = Clazz_defineMethod(c$, "isBondedCorrectlyRange", 
function(offset1, offset2, firstAtomIndex, offsets, atoms){
var atomIndex1 = firstAtomIndex + (offsets[offset1] & 0xFF);
var atomIndex2 = firstAtomIndex + (offsets[offset2] & 0xFF);
return (atomIndex1 != atomIndex2 && atoms[atomIndex1].isBonded(atoms[atomIndex2]));
}, "~N,~N,~N,~A,~A");
c$.isBondedCorrectly = Clazz_defineMethod(c$, "isBondedCorrectly", 
function(firstAtomIndex, offsets, atoms){
return (JM.AminoMonomer.isBondedCorrectlyRange(2, 0, firstAtomIndex, offsets, atoms) && JM.AminoMonomer.isBondedCorrectlyRange(0, 3, firstAtomIndex, offsets, atoms) && (!JM.Monomer.have(offsets, 1) || JM.AminoMonomer.isBondedCorrectlyRange(3, 1, firstAtomIndex, offsets, atoms)));
}, "~N,~A,~A");
Clazz_overrideMethod(c$, "getNitrogenAtom", 
function(){
return this.getAtomFromOffsetIndex(2);
});
Clazz_defineMethod(c$, "getCarbonylCarbonAtom", 
function(){
return this.getAtomFromOffsetIndex(3);
});
Clazz_overrideMethod(c$, "getCarbonylOxygenAtom", 
function(){
return this.getWingAtom();
});
Clazz_overrideMethod(c$, "getInitiatorAtom", 
function(){
return this.getNitrogenAtom();
});
Clazz_overrideMethod(c$, "getTerminatorAtom", 
function(){
return this.getAtomFromOffsetIndex(JM.Monomer.have(this.offsets, 4) ? 4 : 3);
});
Clazz_defineMethod(c$, "hasOAtom", 
function(){
return JM.Monomer.have(this.offsets, 1);
});
Clazz_overrideMethod(c$, "isConnectedAfter", 
function(possiblyPreviousMonomer){
if (possiblyPreviousMonomer == null) return true;
var other = possiblyPreviousMonomer;
return other.getCarbonylCarbonAtom().isBonded(this.getNitrogenAtom());
}, "JM.Monomer");
Clazz_overrideMethod(c$, "findNearestAtomIndex", 
function(x, y, closest, madBegin, madEnd){
var competitor = closest[0];
var nitrogen = this.getNitrogenAtom();
var marBegin = (Clazz_doubleToInt(madBegin / 2));
if (marBegin < 1200) marBegin = 1200;
if (nitrogen.sZ == 0) return;
var radiusBegin = Clazz_floatToInt(this.scaleToScreen(nitrogen.sZ, marBegin));
if (radiusBegin < 4) radiusBegin = 4;
var ccarbon = this.getCarbonylCarbonAtom();
var marEnd = (Clazz_doubleToInt(madEnd / 2));
if (marEnd < 1200) marEnd = 1200;
var radiusEnd = Clazz_floatToInt(this.scaleToScreen(nitrogen.sZ, marEnd));
if (radiusEnd < 4) radiusEnd = 4;
var alpha = this.getLeadAtom();
if (this.isCursorOnTopOf(alpha, x, y, Clazz_doubleToInt((radiusBegin + radiusEnd) / 2), competitor) || this.isCursorOnTopOf(nitrogen, x, y, radiusBegin, competitor) || this.isCursorOnTopOf(ccarbon, x, y, radiusEnd, competitor)) closest[0] = alpha;
}, "~N,~N,~A,~N,~N");
Clazz_defineMethod(c$, "resetHydrogenPoint", 
function(){
this.nhChecked = false;
this.nitrogenHydrogenPoint = null;
});
Clazz_defineMethod(c$, "getNitrogenHydrogenPoint", 
function(){
if (this.nitrogenHydrogenPoint == null && !this.nhChecked) {
this.nhChecked = true;
this.nitrogenHydrogenPoint = this.getExplicitNH();
}return this.nitrogenHydrogenPoint;
});
Clazz_defineMethod(c$, "getExplicitNH", 
function(){
var nitrogen = this.getNitrogenAtom();
var h = null;
var bonds = nitrogen.bonds;
if (bonds != null) for (var i = 0; i < bonds.length; i++) if ((h = bonds[i].getOtherAtom(nitrogen)).getElementNumber() == 1) return h;

return null;
});
Clazz_defineMethod(c$, "getNHPoint", 
function(aminoHydrogenPoint, vNH, jmolHPoint, dsspIgnoreHydrogens){
if (this.monomerIndex <= 0 || this.groupID == 15) return false;
var nitrogenPoint = this.getNitrogenAtom();
var nhPoint = this.getNitrogenHydrogenPoint();
if (nhPoint != null && !dsspIgnoreHydrogens) {
vNH.sub2(nhPoint, nitrogenPoint);
aminoHydrogenPoint.setT(nhPoint);
return true;
}var prev = this.bioPolymer.monomers[this.monomerIndex - 1];
if (jmolHPoint) {
vNH.sub2(nitrogenPoint, this.getLeadAtom());
vNH.normalize();
var v = JU.V3.newVsub(nitrogenPoint, prev.getCarbonylCarbonAtom());
v.normalize();
vNH.add(v);
} else {
var oxygen = prev.getCarbonylOxygenAtom();
if (oxygen == null) return false;
vNH.sub2(prev.getCarbonylCarbonAtom(), oxygen);
}vNH.normalize();
aminoHydrogenPoint.add2(nitrogenPoint, vNH);
this.nitrogenHydrogenPoint = JU.P3.newP(aminoHydrogenPoint);
if (JU.Logger.debugging) JU.Logger.debug("draw ID \"pta" + this.monomerIndex + "_" + nitrogenPoint.i + "\" " + JU.Escape.eP(nitrogenPoint) + JU.Escape.eP(aminoHydrogenPoint) + " # " + nitrogenPoint);
return true;
}, "JU.P3,JU.V3,~B,~B");
Clazz_overrideMethod(c$, "getQuaternionFrameCenter", 
function(qType){
if (this.monomerIndex < 0) return null;
switch ((qType).charCodeAt(0)) {
default:
case 97:
case 98:
case 99:
case 67:
return this.getQuaternionFrameCenterAlpha(qType);
case 110:
return this.getNitrogenAtom();
case 112:
case 80:
return this.getCarbonylCarbonAtom();
case 113:
if (this.monomerIndex == this.bioPolymer.monomerCount - 1) return null;
var mNext = (this.bioPolymer.monomers[this.monomerIndex + 1]);
var pt =  new JU.P3();
pt.ave(this.getCarbonylCarbonAtom(), mNext.getNitrogenAtom());
return pt;
}
}, "~S");
Clazz_overrideMethod(c$, "getQuaternion", 
function(qType){
if (this.monomerIndex < 0) return null;
var ptC = this.getCarbonylCarbonAtom();
var ptCa = this.getLeadAtom();
var vA =  new JU.V3();
var vB =  new JU.V3();
var vC = null;
switch ((qType).charCodeAt(0)) {
case 97:
case 110:
if (this.monomerIndex == 0 || this.groupID == 15) return null;
vC =  new JU.V3();
if (this.ptTemp == null) this.ptTemp =  new JU.P3();
this.getNHPoint(this.ptTemp, vC, true, false);
vB.sub2(ptCa, this.getNitrogenAtom());
vB.cross(vC, vB);
 new JU.M3().setAA(JU.A4.newVA(vB, -0.29670596)).rotate(vC);
vA.cross(vB, vC);
break;
case 98:
return this.getQuaternionAlpha('b');
case 99:
vA.sub2(ptC, ptCa);
vB.sub2(this.getNitrogenAtom(), ptCa);
break;
case 112:
case 120:
if (this.monomerIndex == this.bioPolymer.monomerCount - 1) return null;
vA.sub2(ptCa, ptC);
vB.sub2((this.bioPolymer.monomers[this.monomerIndex + 1]).getNitrogenAtom(), ptC);
break;
case 113:
if (this.monomerIndex == this.bioPolymer.monomerCount - 1) return null;
var mNext = (this.bioPolymer.monomers[this.monomerIndex + 1]);
vB.sub2(mNext.getLeadAtom(), mNext.getNitrogenAtom());
vA.sub2(ptCa, ptC);
break;
default:
return null;
}
return JU.Quat.getQuaternionFrameV(vA, vB, vC, false);
}, "~S");
Clazz_overrideMethod(c$, "getStructureId", 
function(){
if (this.proteinStructure == null || this.proteinStructure.structureID == null) return "";
return this.proteinStructure.structureID;
});
Clazz_overrideMethod(c$, "getProteinStructureTag", 
function(){
if (this.proteinStructure == null || this.proteinStructure.structureID == null) return null;
var tag = "%3N %3ID";
tag = JU.PT.formatStringS(tag, "N", this.proteinStructure.serialID);
tag = JU.PT.formatStringS(tag, "ID", this.proteinStructure.structureID);
if (this.proteinStructure.type === J.c.STR.SHEET) tag += JU.PT.formatStringI("%2SC", "SC", this.proteinStructure.strandCount);
return tag;
});
Clazz_overrideMethod(c$, "getBSSideChain", 
function(){
var bs =  new JU.BS();
this.setAtomBits(bs);
this.clear(bs, this.getLeadAtom(), true);
this.clear(bs, this.getCarbonylCarbonAtom(), false);
this.clear(bs, this.getCarbonylOxygenAtom(), false);
this.clear(bs, this.getNitrogenAtom(), true);
return bs;
});
Clazz_defineMethod(c$, "clear", 
function(bs, a, andH){
if (a == null) return;
bs.clear(a.i);
if (!andH) return;
var b = a.bonds;
var h;
for (var j = b.length; --j >= 0; ) if ((h = b[j].getOtherAtom(a)).getElementNumber() == 1) bs.clear(h.i);

}, "JU.BS,JM.Atom,~B");
c$.interestingAminoAtomIDs =  Clazz_newByteArray(-1, [2, -5, 1, 3, -65]);
});
;//5.0.1-v7 Mon Aug 17 10:07:10 MDT 2026
Clazz_declarePackage("JM");
Clazz_load(["JM.AlphaPolymer"], "JM.AminoPolymer", ["JU.Measure", "$.P3", "$.V3", "J.c.STR", "JM.HBond", "JU.Logger"], function(){
var c$ = Clazz_decorateAsClass(function(){
this.structureList = null;
Clazz_instantialize(this, arguments);}, JM, "AminoPolymer", JM.AlphaPolymer);
Clazz_makeConstructor(c$, 
function(monomers, pt0){
Clazz_superConstructor(this, JM.AminoPolymer, [monomers, pt0]);
this.type = 1;
for (var i = 0; i < this.monomerCount; ++i) if (!(monomers[i]).hasOAtom()) return;

this.hasWingPoints = true;
}, "~A,~N");
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(1111490569, JU.Measure.computeTorsion(carbon1, nitrogen2, alphacarbon2, carbon2, true));
residue1.setGroupParameter(1111490570, JU.Measure.computeTorsion(nitrogen1, alphacarbon1, carbon1, nitrogen2, true));
residue1.setGroupParameter(1111490568, 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(1111490570));
var psi = this.monomers[m].getGroupParameter(1111490570);
var phi = this.monomers[m].getGroupParameter(1111490569);
var phiNext = (m == this.monomerCount - 1 ? NaN : this.monomers[m + 1].getGroupParameter(1111490569));
var psiNext = (m == this.monomerCount - 1 ? NaN : this.monomers[m + 1].getGroupParameter(1111490570));
switch ((qtype).charCodeAt(0)) {
default:
case 112:
case 114:
case 80:
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 99:
case 67:
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.calcEnergy(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.ms.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(1111490569);
var psi = leadingResidue.getGroupParameter(1111490570);
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].chain.chainID) + " aminopolymer:" + i + " " + trailingResidue.getGroupParameter(1111490569) + "," + leadingResidue.getGroupParameter(1111490570) + " " + 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, null, 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, null, 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, null, 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, null, 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_defineMethod(c$, "setStructureList", 
function(structureList){
this.structureList = structureList;
}, "java.util.Map");
});
;//5.0.1-v7 Mon Aug 17 10:07:10 MDT 2026
Clazz_declarePackage("JM");
Clazz_load(null, "JM.BioModelSet", ["java.util.Hashtable", "JU.AU", "$.BS", "$.Lst", "$.PT", "$.SB", "J.api.Interface", "J.c.STR", "JM.Group", "$.ModelSet", "JM.BioResolver", "JS.T", "JU.BSUtil", "$.Escape", "$.Logger"], function(){
var c$ = Clazz_decorateAsClass(function(){
this.haveDSSR = false;
this.vwr = null;
this.ms = null;
this.ext = null;
this.unitIdSets = null;
this.dssrDataMap = null;
Clazz_instantialize(this, arguments);}, JM, "BioModelSet", null);
Clazz_defineMethod(c$, "getBioExt", 
function(){
return (this.ext == null ? (this.ext = (J.api.Interface.getInterface("JM.BioExt", this.vwr, "script"))).set(this.vwr, this.vwr.ms) : this.ext);
});
Clazz_defineMethod(c$, "set", 
function(vwr, ms){
this.vwr = vwr;
this.ms = ms;
System.err.println("BioModelset need to delete the DataList map");
this.unitIdSets = null;
if (this.ext != null) this.ext.set(vwr, ms);
return this;
}, "JV.Viewer,JM.ModelSet");
Clazz_defineMethod(c$, "calcAllRasmolHydrogenBonds", 
function(bsA, bsB, vHBonds, nucleicOnly, nMax, dsspIgnoreHydrogens, bsHBonds, dsspVersion){
var am = this.ms.am;
if (vHBonds == null) {
var bsAtoms = bsA;
if (bsB != null && !bsA.equals(bsB)) (bsAtoms = JU.BSUtil.copy(bsA)).or(bsB);
var bsDelete =  new JU.BS();
var bsOK =  new JU.BS();
var models = this.ms.am;
var bonds = this.ms.bo;
for (var i = this.ms.bondCount; --i >= 0; ) {
var bond = bonds[i];
if (bond == null || (bond.order & 28672) == 0) continue;
if (bsAtoms.get(bond.atom1.i)) bsDelete.set(i);
 else bsOK.set(models[bond.atom1.mi].trajectoryBaseIndex);
}
for (var i = this.ms.mc; --i >= 0; ) if (models[i].isBioModel) models[i].hasRasmolHBonds = bsOK.get(i);

if (bsDelete.nextSetBit(0) >= 0) this.ms.deleteBonds(bsDelete, false);
}for (var i = this.ms.mc; --i >= 0; ) if (am[i].isBioModel && !this.ms.isTrajectorySubFrame(i)) (am[i]).getRasmolHydrogenBonds(bsA, bsB, vHBonds, nucleicOnly, nMax, dsspIgnoreHydrogens, bsHBonds, dsspVersion);

}, "JU.BS,JU.BS,JU.Lst,~B,~N,~B,JU.BS,~N");
Clazz_defineMethod(c$, "calcSelectedMonomersCount", 
function(){
var bsSelected = this.vwr.bsA();
for (var i = this.ms.mc; --i >= 0; ) if (this.ms.am[i].isBioModel) {
var m = this.ms.am[i];
for (var j = m.bioPolymerCount; --j >= 0; ) m.bioPolymers[j].calcSelectedMonomersCount(bsSelected);

}
});
Clazz_defineMethod(c$, "calculateAllPolymers", 
function(groups, groupCount, baseGroupIndex, modelsExcluded){
var checkConnections = !this.vwr.getBoolean(603979896);
if (groupCount < 0) groupCount = groups.length;
if (modelsExcluded != null) for (var j = 0; j < groupCount; ++j) {
var group = groups[j];
if (Clazz_instanceOf(group,"JM.Monomer")) {
if ((group).bioPolymer != null && (!modelsExcluded.get(group.chain.model.modelIndex))) (group).setBioPolymer(null, -1);
}}
for (var i = 0, mc = this.ms.mc; i < mc; i++) if ((modelsExcluded == null || !modelsExcluded.get(i)) && this.ms.am[i].isBioModel) {
for (var pt = 0, j = baseGroupIndex; j < groupCount; ++j, pt++) {
var g = groups[j];
var model = g.getModel();
if (!model.isBioModel || !(Clazz_instanceOf(g,"JM.Monomer")) || g.getLeadAtom() == null) continue;
var doCheck = checkConnections && !this.ms.isJmolDataFrame(this.ms.at[g.getLeadAtom().i].mi);
var bp = ((g).bioPolymer == null ? JM.BioResolver.allocateBioPolymer(groups, j, doCheck, pt) : null);
if (bp == null || bp.monomerCount == 0) continue;
var n = (model).addBioPolymer(bp);
j += n - 1;
pt += n - 1;
}
}
}, "~A,~N,~N,JU.BS");
Clazz_defineMethod(c$, "calculateAllStructuresExcept", 
function(alreadyDefined, asDSSP, doReport, dsspIgnoreHydrogen, setStructure, includeAlpha, version){
var ret = "";
var bsModels = JU.BSUtil.copyInvert(alreadyDefined, this.ms.mc);
if (setStructure) this.setAllDefaultStructure(bsModels);
for (var i = bsModels.nextSetBit(0); i >= 0; i = bsModels.nextSetBit(i + 1)) if (this.ms.am[i].isBioModel) ret += (this.ms.am[i]).calculateStructures(asDSSP, doReport, dsspIgnoreHydrogen, setStructure, includeAlpha, version);

if (setStructure) this.ms.setStructureIndexes();
return ret;
}, "JU.BS,~B,~B,~B,~B,~B,~N");
Clazz_defineMethod(c$, "calculateAllStuctures", 
function(bsAtoms, asDSSP, doReport, dsspIgnoreHydrogen, setStructure, version){
if (version <= 0) version = 2;
var bsAllAtoms =  new JU.BS();
var bsModelsExcluded = JU.BSUtil.copyInvert(this.modelsOf(bsAtoms, bsAllAtoms), this.ms.mc);
if (!setStructure) return this.ms.calculateStructuresAllExcept(bsModelsExcluded, asDSSP, doReport, dsspIgnoreHydrogen, false, false, version);
this.ms.recalculatePolymers(bsModelsExcluded);
var ret = this.ms.calculateStructuresAllExcept(bsModelsExcluded, asDSSP, doReport, dsspIgnoreHydrogen, true, false, version);
this.vwr.shm.resetBioshapes(bsAllAtoms);
this.ms.setStructureIndexes();
return ret;
}, "JU.BS,~B,~B,~B,~B,~N");
Clazz_defineMethod(c$, "calculateStraightnessAll", 
function(){
this.getBioExt().calculateStraightnessAll();
});
Clazz_defineMethod(c$, "calculateStruts", 
function(bs1, bs2){
return this.getBioExt().calculateAllstruts(this.vwr, this.ms, bs1, bs2);
}, "JU.BS,JU.BS");
Clazz_defineMethod(c$, "getAllDefaultStructures", 
function(bsAtoms, bsModified){
var bsModels = this.modelsOf(bsAtoms, bsModified);
var ret =  new JU.SB();
for (var i = bsModels.nextSetBit(0); i >= 0; i = bsModels.nextSetBit(i + 1)) if (this.ms.am[i].isBioModel && (this.ms.am[i]).defaultStructure != null) ret.append((this.ms.am[i]).defaultStructure);

return ret.toString();
}, "JU.BS,JU.BS");
Clazz_defineMethod(c$, "getAllHeteroList", 
function(modelIndex){
var htFull =  new java.util.Hashtable();
var ok = false;
for (var i = this.ms.mc; --i >= 0; ) if (modelIndex < 0 || i == modelIndex) {
var ht = this.ms.getInfo(i, "hetNames");
if (ht == null) continue;
ok = true;
for (var entry, $entry = ht.entrySet().iterator (); $entry.hasNext()&& ((entry = $entry.next ()) || true);) {
var key = entry.getKey();
htFull.put(key, entry.getValue());
}
}
return (ok ? htFull : null);
}, "~N");
Clazz_defineMethod(c$, "getAllPolymerInfo", 
function(bs, info){
this.getBioExt().getAllPolymerInfo(bs, info);
}, "JU.BS,java.util.Map");
Clazz_defineMethod(c$, "getAllPolymerPointsAndVectors", 
function(bs, vList, isTraceAlpha, sheetSmoothing){
for (var i = 0; i < this.ms.mc; ++i) if (this.ms.am[i].isBioModel) {
var m = this.ms.am[i];
var last = 2147483646;
for (var ip = 0; ip < m.bioPolymerCount; ip++) last = m.bioPolymers[ip].getPolymerPointsAndVectors(last, bs, vList, isTraceAlpha, sheetSmoothing);

}
}, "JU.BS,JU.Lst,~B,~N");
Clazz_defineMethod(c$, "getAllSequenceBits", 
function(specInfo, bsAtoms, bsResult){
if (specInfo.length > 0) {
if (bsAtoms == null) bsAtoms = this.vwr.getAllAtoms();
if (specInfo.indexOf('|') < specInfo.lastIndexOf('|')) return this.getAllUnitIds(specInfo, bsAtoms, bsResult);
var am = this.ms.am;
for (var i = this.ms.mc; --i >= 0; ) if (am[i].isBioModel) {
var m = am[i];
var lenInfo = specInfo.length;
for (var ip = 0; ip < m.bioPolymerCount; ip++) {
var sequence = m.bioPolymers[ip].getSequence();
var j = -1;
while ((j = sequence.indexOf(specInfo, ++j)) >= 0) m.bioPolymers[ip].getPolymerSequenceAtoms(j, lenInfo, bsAtoms, bsResult);

}
}
}return bsResult;
}, "~S,JU.BS,JU.BS");
Clazz_defineMethod(c$, "getAtomBitsBS", 
function(tokType, bsInfo, bs){
var at = this.ms.at;
var ac = this.ms.ac;
var i = 0;
var g;
switch (tokType) {
case 136314895:
case 2097184:
var type = (tokType == 136314895 ? J.c.STR.HELIX : J.c.STR.SHEET);
for (i = ac; --i >= 0; ) {
if (at[i] == null) continue;
if ((g = at[i].group).isWithinStructure(type)) g.setAtomBits(bs);
i = g.firstAtomIndex;
}
break;
case 2097188:
for (i = ac; --i >= 0; ) {
if (at[i] == null) continue;
if ((g = at[i].group).isCarbohydrate()) g.setAtomBits(bs);
i = g.firstAtomIndex;
}
break;
case 2097156:
for (i = ac; --i >= 0; ) {
if (at[i] == null) continue;
if ((g = at[i].group).isDna()) g.setAtomBits(bs);
i = g.firstAtomIndex;
}
break;
case 2097166:
for (i = ac; --i >= 0; ) {
if (at[i] == null) continue;
if ((g = at[i].group).isNucleic()) g.setAtomBits(bs);
i = g.firstAtomIndex;
}
break;
case 2097168:
for (i = ac; --i >= 0; ) {
if (at[i] == null) continue;
if ((g = at[i].group).isProtein()) g.setAtomBits(bs);
i = g.firstAtomIndex;
}
break;
case 2097170:
for (i = ac; --i >= 0; ) {
if (at[i] == null) continue;
if ((g = at[i].group).isPurine()) g.setAtomBits(bs);
i = g.firstAtomIndex;
}
break;
case 2097172:
for (i = ac; --i >= 0; ) {
if (at[i] == null) continue;
if ((g = at[i].group).isPyrimidine()) g.setAtomBits(bs);
i = g.firstAtomIndex;
}
break;
case 2097174:
for (i = ac; --i >= 0; ) {
if (at[i] == null) continue;
if ((g = at[i].group).isRna()) g.setAtomBits(bs);
i = g.firstAtomIndex;
}
break;
}
if (i < 0) return bs;
var i0 = bsInfo.nextSetBit(0);
if (i0 < 0) return bs;
i = 0;
switch (tokType) {
case 1094713362:
for (i = i0; i >= 0; i = bsInfo.nextSetBit(i + 1)) {
var iPolymer = at[i].group.getBioPolymerIndexInModel();
if (iPolymer >= 0) (at[i].group).bioPolymer.setAtomBitsAndClear(bs, bsInfo);
}
break;
case 1639976963:
for (i = i0; i >= 0; i = bsInfo.nextSetBit(i + 1)) {
var structure = at[i].group.getStructure();
if (structure != null) structure.setAtomBitsAndClear(bs, bsInfo);
}
break;
}
if (i == 0) JU.Logger.error("MISSING getAtomBits entry for " + JS.T.nameOf(tokType));
return bs;
}, "~N,JU.BS,JU.BS");
Clazz_defineMethod(c$, "getAtomBitsStr", 
function(tokType, specInfo, bs){
switch (tokType) {
default:
return  new JU.BS();
case 1073741925:
return this.getAnnotationBits("domains", 1073741925, specInfo, null);
case 1073742189:
return this.getAnnotationBits("validation", 1073742189, specInfo, null);
case 1073742128:
return this.getAnnotationBits("rna3d", 1073742128, specInfo, null);
case 1073741863:
var s = specInfo;
bs =  new JU.BS();
return (s.length % 2 != 0 ? bs : this.ms.getAtomBitsMDa(1086324742, this.getAllBasePairBits(s), bs));
case 1111490587:
return this.getAnnotationBits("dssr", 1111490587, specInfo, null);
case 1086324744:
return this.getAllSequenceBits(specInfo, null, bs);
}
}, "~N,~S,JU.BS");
Clazz_defineMethod(c$, "getBioPolymerCountInModel", 
function(modelIndex){
if (modelIndex < 0) {
var polymerCount = 0;
for (var i = this.ms.mc; --i >= 0; ) if (!this.ms.isTrajectorySubFrame(i) && this.ms.am[i].isBioModel) polymerCount += (this.ms.am[i]).getBioPolymerCount();

return polymerCount;
}return (this.ms.isTrajectorySubFrame(modelIndex) || !this.ms.am[modelIndex].isBioModel ? 0 : (this.ms.am[modelIndex]).getBioPolymerCount());
}, "~N");
Clazz_defineMethod(c$, "getFullProteinStructureState", 
function(bsAtoms, mode){
var taintedOnly = (mode == 1073742327);
if (taintedOnly && !this.ms.proteinStructureTainted) return "";
var scriptMode = (mode == 1073742158 || mode == 1073742327);
var atoms = this.ms.at;
var at0 = (bsAtoms == null ? this.vwr.getAllAtoms() : bsAtoms).nextSetBit(0);
if (at0 < 0) return "";
if (bsAtoms != null && mode == 4138) {
bsAtoms = JU.BSUtil.copy(bsAtoms);
for (var i = this.ms.ac; --i >= 0; ) if (atoms[i] == null || Float.isNaN(atoms[i].group.getGroupParameter(1111490569)) || Float.isNaN(atoms[i].group.getGroupParameter(1111490570))) bsAtoms.clear(i);

}var at1 = (bsAtoms == null ? this.vwr.getAllAtoms() : bsAtoms).length() - 1;
var im0 = atoms[at0].mi;
var im1 = atoms[at1].mi;
var lstStr =  new JU.Lst();
var map =  new java.util.Hashtable();
var cmd =  new JU.SB();
for (var im = im0; im <= im1; im++) {
if (!this.ms.am[im].isBioModel) continue;
var m = this.ms.am[im];
if (taintedOnly && !m.structureTainted) continue;
var bsA =  new JU.BS();
bsA.or(m.bsAtoms);
bsA.andNot(m.bsAtomsDeleted);
var i0 = bsA.nextSetBit(0);
if (i0 < 0) continue;
if (scriptMode) {
cmd.append("  structure none ").append(JU.Escape.eBS(this.ms.getModelAtomBitSetIncludingDeleted(im, false))).append("    \t# model=" + this.ms.getModelNumberDotted(im)).append(";\n");
}var ps;
for (var i = i0; i >= 0; i = bsA.nextSetBit(i + 1)) {
var a = atoms[i];
if (a == null || !(Clazz_instanceOf(a.group,"JM.AlphaMonomer")) || (ps = (a.group).proteinStructure) == null || map.containsKey(ps)) continue;
lstStr.addLast(ps);
map.put(ps, Boolean.TRUE);
}
}
this.getStructureLines(bsAtoms, cmd, lstStr, J.c.STR.HELIX, scriptMode, mode);
this.getStructureLines(bsAtoms, cmd, lstStr, J.c.STR.SHEET, scriptMode, mode);
this.getStructureLines(bsAtoms, cmd, lstStr, J.c.STR.TURN, scriptMode, mode);
return cmd.toString();
}, "JU.BS,~N");
Clazz_defineMethod(c$, "getGroupsWithinAll", 
function(nResidues, bs){
var bsResult =  new JU.BS();
var bsCheck = this.ms.getIterativeModels(false);
for (var iModel = this.ms.mc; --iModel >= 0; ) if (bsCheck.get(iModel) && this.ms.am[iModel].isBioModel) {
var m = this.ms.am[iModel];
for (var i = m.bioPolymerCount; --i >= 0; ) m.bioPolymers[i].getRangeGroups(nResidues, bs, bsResult);

}
return bsResult;
}, "~N,JU.BS");
Clazz_defineMethod(c$, "getIdentifierOrNull", 
function(identifier){
var len = identifier.length;
var pt = 0;
while (pt < len && JU.PT.isLetter(identifier.charAt(pt))) ++pt;

var bs = this.ms.getSpecNameOrNull(identifier.substring(0, pt), false);
if (pt == len) return bs;
if (bs == null) bs =  new JU.BS();
var pt0 = pt;
while (pt < len && JU.PT.isDigit(identifier.charAt(pt))) ++pt;

if (pt == pt0) return null;
var seqNumber = 0;
try {
seqNumber = Integer.parseInt(identifier.substring(pt0, pt));
} catch (nfe) {
if (Clazz_exceptionOf(nfe,"NumberFormatException")){
return null;
} else {
throw nfe;
}
}
var insertionCode = ' ';
if (pt < len && identifier.charAt(pt) == '^') if (++pt < len) insertionCode = identifier.charAt(pt);
var seqcode = JM.Group.getSeqcodeFor(seqNumber, insertionCode);
var bsInsert = this.ms.getSeqcodeBits(seqcode, false);
if (bsInsert == null) {
if (insertionCode != ' ') bsInsert = this.ms.getSeqcodeBits(Character.toUpperCase(identifier.charAt(pt)).charCodeAt(0), false);
if (bsInsert == null) return null;
pt++;
}bs.and(bsInsert);
if (pt >= len) return bs;
if (pt != len - 1) return null;
bs.and(this.ms.getChainBits(identifier.charAt(pt).charCodeAt(0)));
return bs;
}, "~S");
Clazz_defineMethod(c$, "mutate", 
function(bs, group, sequence, alphaType, phipsi){
return this.getBioExt().mutate(this.vwr, bs, group, sequence, alphaType, phipsi);
}, "JU.BS,~S,~A,~S,~A");
Clazz_defineMethod(c$, "recalculateAllPolymers", 
function(bsModelsExcluded, groups){
for (var i = 0; i < this.ms.mc; i++) if (this.ms.am[i].isBioModel && !bsModelsExcluded.get(i)) (this.ms.am[i]).clearBioPolymers();

this.calculateAllPolymers(groups, -1, 0, bsModelsExcluded);
}, "JU.BS,~A");
Clazz_defineMethod(c$, "recalculatePoints", 
function(modelIndex){
if (modelIndex < 0) {
for (var i = this.ms.mc; --i >= 0; ) if (!this.ms.isTrajectorySubFrame(i) && this.ms.am[i].isBioModel) (this.ms.am[i]).recalculateLeadMidpointsAndWingVectors();

return;
}if (!this.ms.isTrajectorySubFrame(modelIndex) && this.ms.am[modelIndex].isBioModel) (this.ms.am[modelIndex]).recalculateLeadMidpointsAndWingVectors();
}, "~N");
Clazz_defineMethod(c$, "setAllConformation", 
function(bsAtoms){
this.vwr.ms.recalculatePositionDependentQuantities(bsAtoms, null);
var bsModels = this.ms.getModelBS(bsAtoms, false);
for (var i = bsModels.nextSetBit(0); i >= 0; i = bsModels.nextSetBit(i + 1)) if (this.ms.am[i].isBioModel) {
var m = this.ms.am[i];
if (m.altLocCount > 0) for (var j = m.bioPolymerCount; --j >= 0; ) m.bioPolymers[j].setConformation(bsAtoms);

}
}, "JU.BS");
Clazz_defineMethod(c$, "setAllProteinType", 
function(bs, type){
var monomerIndexCurrent = -1;
var bsModels = this.ms.getModelBS(bs, false);
this.setAllDefaultStructure(bsModels);
var groups = this.ms.getGroups();
var lastStrucNo = 0;
var lastResNo = -2147483648;
var lastPolymer = null;
var lastModel = null;
var isNone = (type === J.c.STR.NONE);
for (var i = 0; i < groups.length; i++) {
var g = groups[i];
if (g.getBioPolymerLength() == 0 || !bs.get(g.firstAtomIndex)) continue;
var m = g.getModel();
if (!isNone) {
if (m !== lastModel) {
lastModel = m;
lastStrucNo = 0;
lastPolymer = null;
}if (lastPolymer !== (g).bioPolymer) {
lastResNo = -2147483648;
lastPolymer = (g).bioPolymer;
}var resno = g.getResno();
if (resno != lastResNo + 1) {
monomerIndexCurrent = -1;
}lastResNo = resno;
}monomerIndexCurrent = g.setProteinStructureType(type, monomerIndexCurrent);
if (g.getStrucNo() > 1000) g.setStrucNo(++lastStrucNo);
this.ms.proteinStructureTainted = m.structureTainted = true;
}
}, "JU.BS,J.c.STR");
Clazz_defineMethod(c$, "setAllStructureList", 
function(structureList){
for (var iModel = this.ms.mc; --iModel >= 0; ) if (this.ms.am[iModel].isBioModel) {
var m = this.ms.am[iModel];
m.bioPolymers = JU.AU.arrayCopyObject(m.bioPolymers, m.bioPolymerCount);
for (var i = m.bioPolymerCount; --i >= 0; ) {
var bp = m.bioPolymers[i];
if (Clazz_instanceOf(bp,"JM.AminoPolymer")) (bp).setStructureList(structureList);
}
}
}, "java.util.Map");
Clazz_defineMethod(c$, "getAllBasePairBits", 
function(specInfo){
var bsA = null;
var bsB = null;
var vHBonds =  new JU.Lst();
if (specInfo.length == 0) {
bsA = bsB = this.vwr.getAllAtoms();
this.calcAllRasmolHydrogenBonds(bsA, bsB, vHBonds, true, 1, false, null, 0);
} else {
for (var i = 0; i < specInfo.length; ) {
bsA = this.ms.getSequenceBits(specInfo.substring(i, ++i), null,  new JU.BS());
if (bsA.nextSetBit(0) < 0) continue;
bsB = this.ms.getSequenceBits(specInfo.substring(i, ++i), null,  new JU.BS());
if (bsB.nextSetBit(0) < 0) continue;
this.calcAllRasmolHydrogenBonds(bsA, bsB, vHBonds, true, 1, false, null, 0);
}
}var bsAtoms =  new JU.BS();
for (var i = vHBonds.size(); --i >= 0; ) {
var b = vHBonds.get(i);
bsAtoms.set(b.atom1.i);
bsAtoms.set(b.atom2.i);
}
return bsAtoms;
}, "~S");
Clazz_defineMethod(c$, "getAllUnitIds", 
function(specInfo, bsSelected, bsResult){
var maps = this.unitIdSets;
if (maps == null) {
maps = this.unitIdSets =  new Array(7);
for (var i = 0; i < 7; i++) maps[i] =  new java.util.Hashtable();

for (var i = this.ms.mc; --i >= 0; ) {
var m = this.ms.am[i];
if (!m.isBioModel) continue;
if (this.ms.isTrajectory(i)) m = this.ms.am[i = m.trajectoryBaseIndex];
var num = "|" + this.ms.getInfo(i, "modelNumber");
this.checkMap(maps[0], this.ms.getInfo(i, "modelName") + num, m.bsAtoms);
this.checkMap(maps[0], num, m.bsAtoms);
}
}var bsModelChain = null;
var lastModelChain = null;
var bsTemp =  new JU.BS();
var units = JU.PT.getTokens(JU.PT.replaceAllCharacters(specInfo, ", \t\n[]\"=", " "));
var ptrs =  Clazz_newIntArray (8, 0);
for (var i = units.length; --i >= 0; ) {
var unit = units[i] + "|";
if (unit.length < 5) continue;
var bsPtr = 0;
for (var j = 0, n = 0, pt = unit.lastIndexOf('|') + 1; j < pt && n < 8; j++) {
if (unit.charAt(j) == '|') ptrs[n++] = j;
 else bsPtr |= 1 << n;
}
if ((bsPtr & 0x16) != 0x16) continue;
bsTemp.clearAll();
bsTemp.or(bsSelected);
var mchain = unit.substring(0, ptrs[2]);
if (lastModelChain != null && lastModelChain.equals(mchain)) {
bsTemp.and(bsModelChain);
} else {
if (!this.addUnit(1094717454, unit.substring(0, ptrs[1]).toUpperCase(), bsTemp, maps[0]) || !this.addUnit(1073742357, unit.substring(ptrs[1] + 1, ptrs[2]), bsTemp, maps[1])) continue;
bsModelChain = JU.BSUtil.copy(bsTemp);
lastModelChain = mchain;
}var haveAtom = ((bsPtr & (32)) != 0);
var haveAlt = ((bsPtr & (64)) != 0);
if (!this.addUnit(1094715412, unit.substring(ptrs[3] + 1, ptrs[4]), bsTemp, maps[2]) || !this.addUnit(5, ((bsPtr & (128)) == 0 ? "\0" : unit.substring(ptrs[6] + 1, ptrs[7])), bsTemp, maps[3]) || (haveAtom ? !this.addUnit(1086326786, unit.substring(ptrs[4] + 1, ptrs[5]).toUpperCase(), bsTemp, maps[4]) || !this.addUnit(1073742355, unit.substring(ptrs[5] + 1, ptrs[6]), bsTemp, maps[5]) : haveAlt && !this.addUnit(1094717448, unit.substring(ptrs[5] + 1, ptrs[6]), bsTemp, maps[6]))) continue;
bsResult.or(bsTemp);
}
return bsResult;
}, "~S,JU.BS,JU.BS");
Clazz_defineMethod(c$, "checkMap", 
function(map, key, bsAtoms){
var bs = JU.BSUtil.copy(bsAtoms);
var bs0 = map.get(key);
if (bs0 == null) map.put(key, bs0 = bs);
 else bs0.or(bs);
return bs0;
}, "java.util.Map,~S,JU.BS");
Clazz_defineMethod(c$, "addUnit", 
function(tok, key, bsTemp, map){
var bs = map.get(key);
if (bs == null) {
var o;
switch (tok) {
default:
return false;
case 1073742357:
o = Integer.$valueOf(this.vwr.getChainID(key, false));
break;
case 1094715412:
o = Integer.$valueOf(JU.PT.parseInt(key));
break;
case 5:
o = Integer.$valueOf(key.charAt(0).charCodeAt(0));
break;
case 1094717448:
bs = this.ms.getAtomBitsMDa(tok = 1073742355, null,  new JU.BS());
case 1086326786:
o = key;
break;
case 1073742355:
o = (key.length == 0 ? null : key);
break;
}
map.put(key, bs = this.ms.getAtomBitsMDa(tok, o, (bs == null ?  new JU.BS() : bs)));
}bsTemp.and(bs);
return (bsTemp.nextSetBit(0) >= 0);
}, "~N,~S,JU.BS,java.util.Map");
Clazz_defineMethod(c$, "getAnnotationBits", 
function(key, tok, specInfo, type){
var bs =  new JU.BS();
if (tok == 1111490587 && !this.haveDSSR) return bs;
var pa = this.vwr.getAnnotationParser(tok);
var ann;
var keyV = key + " V ";
for (var i = this.ms.mc; --i >= 0; ) {
if ((ann = this.ms.getInfo(i, key)) != null) {
var b = pa.getAtomBits(this.vwr, specInfo, (this.ms.am[i]).getCachedAnnotationMap(keyV, ann), this.ms.am[i].annotationCache, tok, i, this.ms.am[i].bsAtoms);
bs.or(b);
}}
if (tok == 1111490587 && type != null) {
var groups = this.ms.getGroupsForAtoms(bs);
for (var i = groups.size(); --i >= 0; ) {
groups.get(i).setDSSRStructureSubType(type);
}
}return bs;
}, "~S,~N,~S,J.c.STR");
Clazz_defineMethod(c$, "getStructureLines", 
function(bsAtoms, cmd, lstStr, type, scriptMode, mode){
var showMode = (mode == 134222350);
var nHelix = 0;
var nSheet = 0;
var nTurn = 0;
var sid = null;
var bs =  new JU.BS();
var n = 0;
for (var i = 0, ns = lstStr.size(); i < ns; i++) {
var ps = lstStr.get(i);
if (ps.type !== type) continue;
var m1 = ps.findMonomer(bsAtoms, true);
var m2 = ps.findMonomer(bsAtoms, false);
if (m1 == null || m2 == null) continue;
var iModel = ps.apolymer.model.modelIndex;
var comment = (scriptMode ? "    \t# model=" + this.ms.getModelNumberDotted(iModel) : null);
var res1 = m1.getResno();
var res2 = m2.getResno();
var subtype = ps.subtype;
switch (type) {
case J.c.STR.HELIX:
case J.c.STR.TURN:
case J.c.STR.SHEET:
n++;
if (scriptMode) {
bs.clearAll();
ps.setAtomBits(bs);
var stype = subtype.getBioStructureTypeName(false);
cmd.append("  structure ").append(stype).append(" ").append(JU.Escape.eBS(bs)).append(comment).append(" & (" + res1 + " - " + res2 + ")").append(";\n");
} else {
var str;
var nx;
switch (type) {
case J.c.STR.HELIX:
nx = ++nHelix;
sid = JU.PT.formatStringI("%3N %3N", "N", nx);
str = "HELIX  %ID %3GROUPA %1CA %4RESA  %3GROUPB %1CB %4RESB";
var stype = null;
switch (subtype) {
case J.c.STR.HELIX:
case J.c.STR.HELIXALPHA:
stype = "  1";
break;
case J.c.STR.HELIX310:
stype = "  5";
break;
case J.c.STR.HELIXPI:
stype = "  3";
break;
}
if (stype != null) str += stype;
break;
case J.c.STR.SHEET:
nx = ++nSheet;
sid = JU.PT.formatStringI("%3N %3A 0", "N", nx);
sid = JU.PT.formatStringS(sid, "A", "S" + nx);
str = "SHEET  %ID %3GROUPA %1CA%4RESA  %3GROUPB %1CB%4RESB";
break;
case J.c.STR.TURN:
default:
nx = ++nTurn;
sid = JU.PT.formatStringI("%3N %3N", "N", nx);
str = "TURN   %ID %3GROUPA %1CA%4RESA  %3GROUPB %1CB%4RESB";
break;
}
str = JU.PT.formatStringS(str, "ID", sid);
str = JU.PT.formatStringS(str, "GROUPA", m1.getGroup3());
str = JU.PT.formatStringS(str, "CA", m1.getLeadAtom().getChainIDStr());
str = JU.PT.formatStringI(str, "RESA", res1);
str = JU.PT.formatStringS(str, "GROUPB", m2.getGroup3());
str = JU.PT.formatStringS(str, "CB", m2.getLeadAtom().getChainIDStr());
str = JU.PT.formatStringI(str, "RESB", res2);
cmd.append(str);
if (showMode) cmd.append(" strucno= ").appendI(ps.strucNo);
cmd.append("\n");
}}
}
if (n > 0) cmd.append("\n");
return n;
}, "JU.BS,JU.SB,JU.Lst,J.c.STR,~B,~N");
Clazz_defineMethod(c$, "modelsOf", 
function(bsAtoms, bsAtomsRet){
var bsModels = JU.BS.newN(this.ms.mc);
var isAll = (bsAtoms == null);
var i0 = (isAll ? this.ms.ac - 1 : bsAtoms.nextSetBit(0));
for (var i = i0; i >= 0; i = (isAll ? i - 1 : bsAtoms.nextSetBit(i + 1))) {
if (this.ms.at[i] == null) continue;
var modelIndex = this.ms.am[this.ms.at[i].mi].trajectoryBaseIndex;
if (this.ms.isJmolDataFrame(modelIndex)) continue;
bsModels.set(modelIndex);
bsAtomsRet.set(i);
}
return bsModels;
}, "JU.BS,JU.BS");
Clazz_defineMethod(c$, "setAllDefaultStructure", 
function(bsModels){
for (var i = bsModels.nextSetBit(0); i >= 0; i = bsModels.nextSetBit(i + 1)) if (this.ms.am[i].isBioModel) {
var m = this.ms.am[i];
if (m.defaultStructure == null) m.defaultStructure = this.getFullProteinStructureState(m.bsAtoms, 1073742158);
}
}, "JU.BS");
Clazz_defineMethod(c$, "getAminoAcidValenceAndCharge", 
function(s, atomName, aaRet){
return this.getBioExt().getAminoAcidValenceAndCharge(s, atomName, aaRet);
}, "~S,~S,~A");
Clazz_defineMethod(c$, "getStructureDSSRAssignments", 
function(){
if (!this.haveDSSR) return;
this.getAnnotationBits("dssr", 1111490587, "iloops", J.c.STR.DSSRINTERNALLOOP);
this.getAnnotationBits("dssr", 1111490587, "hairpins", J.c.STR.DSSRHAIRPINLOOP);
this.getAnnotationBits("dssr", 1111490587, "bulges", J.c.STR.DSSRBULGELOOP);
this.getAnnotationBits("dssr", 1111490587, "junctions", J.c.STR.DSSRJUNCTIONLOOP);
this.getAnnotationBits("dssr", 1111490587, "stems", J.c.STR.DSSRSTEM);
});
Clazz_defineMethod(c$, "setHaveDSSR", 
function(b){
this.haveDSSR = b;
}, "~B");
Clazz_defineMethod(c$, "getDSSRProperties", 
function(dataType){
if (!this.haveDSSR || dataType == null) return null;
var dataPath = (dataType.indexOf('.') < 0 ? "dssr" + "." + dataType : dataType);
if (this.dssrDataMap == null) {
this.dssrDataMap =  new java.util.Hashtable();
}var dataList = this.dssrDataMap.get(dataType);
if (dataList == null) {
this.dssrDataMap.put(dataType, dataList =  new JM.ModelSet.DataList(dataPath));
}for (var i = this.ms.mc; --i >= 0; ) if (this.ms.am[i].isBioModel && (this.ms.am[i]).haveDSSR) this.vwr.getAnnotationParser(1111490587).getAtomicDSSRData(this.ms, i, dataList);

return dataList;
}, "~S");
Clazz_defineMethod(c$, "getAtomicDSSRDataFloat", 
function(dataType, atomIndex){
var dl = (this.dssrDataMap == null ? null : this.dssrDataMap.get(dataType));
return (dl != null && dl.floatData != null && dl.floatData.length > atomIndex ? dl.floatData[atomIndex] : NaN);
}, "~S,~N");
Clazz_defineMethod(c$, "getAtomicDSSRDataString", 
function(dataType, atomIndex){
var dl = (this.dssrDataMap == null ? null : this.dssrDataMap.get(dataType));
return (dl != null && dl.stringData != null && dl.stringData.length > atomIndex ? dl.stringData[atomIndex] : null);
}, "~S,~N");
Clazz_defineMethod(c$, "releaseModelSet", 
function(){
System.err.println("can't remove ms here??");
});
Clazz_defineMethod(c$, "clearDSSR", 
function(){
this.dssrDataMap = null;
});
});
;//5.0.1-v7 Mon Aug 17 10:07:10 MDT 2026
Clazz_declarePackage("JM");
Clazz_load(["JM.Model"], "JM.BioModel", ["java.util.Hashtable", "JU.AU", "$.BS", "$.Lst", "$.SB", "J.api.Interface", "JU.Escape"], function(){
var c$ = Clazz_decorateAsClass(function(){
this.vwr = null;
this.bioPolymerCount = 0;
this.bioPolymers = null;
this.isMutated = false;
this.defaultStructure = null;
this.haveDSSR = false;
Clazz_instantialize(this, arguments);}, JM, "BioModel", JM.Model);
Clazz_defineMethod(c$, "setBioModel", 
function(modelSet, modelIndex, trajectoryBaseIndex, jmolData, properties, auxiliaryInfo){
this.setupArrays();
this.vwr = modelSet.vwr;
this.set(modelSet, modelIndex, trajectoryBaseIndex, jmolData, properties, auxiliaryInfo);
this.isBioModel = true;
this.vwr.getJBR().getBioModelSet(modelSet);
this.clearBioPolymers();
modelSet.am[modelIndex] = this;
this.pdbID = auxiliaryInfo.get("name");
return this;
}, "JM.ModelSet,~N,~N,java.util.Map,java.util.Properties,java.util.Map");
Clazz_defineMethod(c$, "addBioPolymer", 
function(polymer){
if (this.bioPolymers.length == 0) this.clearBioPolymers();
if (this.bioPolymerCount == this.bioPolymers.length) this.bioPolymers = JU.AU.doubleLength(this.bioPolymers);
polymer.bioPolymerIndexInModel = this.bioPolymerCount;
this.bioPolymers[this.bioPolymerCount++] = polymer;
return polymer.monomerCount;
}, "JM.BioPolymer");
Clazz_defineMethod(c$, "addSecondaryStructure", 
function(type, structureID, serialID, strandCount, startChainID, startSeqcode, endChainID, endSeqcode, istart, iend, bsAssigned){
for (var i = this.bioPolymerCount; --i >= 0; ) if (Clazz_instanceOf(this.bioPolymers[i],"JM.AlphaPolymer")) (this.bioPolymers[i]).addStructure(type, structureID, serialID, strandCount, startChainID, startSeqcode, endChainID, endSeqcode, istart, iend, bsAssigned);

}, "J.c.STR,~S,~S,~N,~N,~N,~N,~N,~N,~N,JU.BS");
Clazz_defineMethod(c$, "addStructureByBS", 
function(count, dsspType, type, bs){
for (var i = this.bioPolymerCount; --i >= 0; ) {
var b = this.bioPolymers[i];
if (Clazz_instanceOf(b,"JM.AlphaPolymer")) count = (this.bioPolymers[i]).setStructureBS(++count, dsspType, type, bs, true);
}
}, "~N,~N,J.c.STR,JU.BS");
Clazz_defineMethod(c$, "calculateDssx", 
function(vHBonds, doReport, dsspIgnoreHydrogen, setStructure, version){
var haveProt = false;
var haveNucl = false;
for (var i = 0; i < this.bioPolymerCount && !(haveProt && haveNucl); i++) {
if (this.bioPolymers[i].isNucleic()) haveNucl = true;
 else if (Clazz_instanceOf(this.bioPolymers[i],"JM.AminoPolymer")) haveProt = true;
}
var s = "";
if (haveProt) s += (J.api.Interface.getOption("dssx.DSSP", this.vwr, "ms")).calculateDssp(this.bioPolymers, this.bioPolymerCount, vHBonds, doReport, dsspIgnoreHydrogen, setStructure, version);
if (haveNucl && this.haveDSSR && vHBonds != null) s += this.vwr.getAnnotationParser(1111490587).getHBonds(this.ms, this.modelIndex, vHBonds, doReport);
return s;
}, "JU.Lst,~B,~B,~B,~N");
Clazz_defineMethod(c$, "calculateStructures", 
function(asDSSP, doReport, dsspIgnoreHydrogen, setStructure, includeAlpha, version){
if (this.bioPolymerCount == 0 || !setStructure && !asDSSP) return "";
this.ms.proteinStructureTainted = this.structureTainted = true;
if (setStructure) for (var i = this.bioPolymerCount; --i >= 0; ) if (!asDSSP || this.bioPolymers[i].monomers[0].getNitrogenAtom() != null) this.bioPolymers[i].clearStructures();

if (!asDSSP || includeAlpha) for (var i = this.bioPolymerCount; --i >= 0; ) if (Clazz_instanceOf(this.bioPolymers[i],"JM.AlphaPolymer")) (this.bioPolymers[i]).calculateStructures(includeAlpha);

return (asDSSP ? this.calculateDssx(null, doReport, dsspIgnoreHydrogen, setStructure, version) : "");
}, "~B,~B,~B,~B,~B,~N");
Clazz_defineMethod(c$, "clearBioPolymers", 
function(){
this.bioPolymers =  new Array(8);
this.bioPolymerCount = 0;
});
Clazz_overrideMethod(c$, "fixIndices", 
function(modelIndex, nAtomsDeleted, bsDeleted){
this.fixIndicesM(modelIndex, nAtomsDeleted, bsDeleted);
this.recalculateLeadMidpointsAndWingVectors();
}, "~N,~N,JU.BS");
Clazz_overrideMethod(c$, "freeze", 
function(){
this.freezeM();
this.bioPolymers = JU.AU.arrayCopyObject(this.bioPolymers, this.bioPolymerCount);
return true;
});
Clazz_defineMethod(c$, "getBioBranches", 
function(biobranches){
var bsBranch;
for (var j = 0; j < this.bioPolymerCount; j++) {
bsBranch =  new JU.BS();
this.bioPolymers[j].getRange(bsBranch, this.isMutated);
var iAtom = bsBranch.nextSetBit(0);
if (iAtom >= 0) {
if (biobranches == null) biobranches =  new JU.Lst();
biobranches.addLast(bsBranch);
}}
return biobranches;
}, "JU.Lst");
Clazz_defineMethod(c$, "getBioPolymerCount", 
function(){
return this.bioPolymerCount;
});
Clazz_defineMethod(c$, "getCachedAnnotationMap", 
function(key, ann){
var cache = (this.annotationCache == null && ann != null ? this.annotationCache =  new java.util.Hashtable() : this.annotationCache);
if (cache == null) return null;
var annotv = cache.get(key);
if (annotv == null && ann != null) {
annotv = (Clazz_instanceOf(ann,"JS.SV") || Clazz_instanceOf(ann,"java.util.Hashtable") ? ann : this.vwr.parseJSONMap(ann));
cache.put(key, annotv);
}return (Clazz_instanceOf(annotv,"JS.SV") || Clazz_instanceOf(annotv,"java.util.Hashtable") ? annotv : null);
}, "~S,~O");
Clazz_defineMethod(c$, "getConformation", 
function(conformationIndex0, doSet, bsAtoms, bsRet){
var isConfig0 = (conformationIndex0 == 0);
if (this.altLocCount == 0) {
if (isConfig0) bsRet.or(bsAtoms);
return;
}var isFirst = (conformationIndex0 <= 0);
var atoms = this.ms.at;
var isSpace = (conformationIndex0 == -32);
var thisAltLoc = (isFirst && !isSpace ? String.fromCharCode(-conformationIndex0) : '\0');
if (isFirst) {
var lastChain = -2147483648;
var lastIns = '\u0000';
var lastRes = -2147483648;
var map =  new java.util.Hashtable();
for (var i = bsAtoms.nextSetBit(0); i >= 0; i = bsAtoms.nextSetBit(i + 1)) {
var atom = atoms[i];
var chain = atom.getChainID();
var res = atom.getResno();
var ins = atom.getInsertionCode();
if (res != lastRes || ins != lastIns || chain != lastChain) {
lastChain = chain;
lastRes = res;
lastIns = ins;
map.clear();
}var name = atom.getAtomName();
var locs = map.get(name);
if (locs == null) map.put(name, locs =  Clazz_newIntArray (1, 0));
var i0 = locs[0] - 1;
if (i0 < 0) {
if (i0 == -2) {
bsAtoms.clear(i);
continue;
}if (isSpace) {
if (atom.altloc != '\0') {
bsAtoms.clear(i);
}} else {
locs[0] = i + 1;
}continue;
}if (isConfig0) {
bsAtoms.clear(i);
locs[0] = -1;
} else if (atom.altloc == thisAltLoc) {
locs[0] = -1;
} else {
i0 = i;
}bsAtoms.clear(i0);
}
} else {
conformationIndex0--;
var g = null;
var ch = '\u0000';
var conformationIndex = conformationIndex0;
var bsFound =  new JU.BS();
for (var i = bsAtoms.nextSetBit(0); i >= 0; i = bsAtoms.nextSetBit(i + 1)) {
var atom = atoms[i];
var altloc = atom.altloc;
if (altloc == '\0') continue;
if (atom.group !== g) {
g = atom.group;
ch = '\0';
conformationIndex = conformationIndex0;
bsFound.clearAll();
}if (conformationIndex >= 0 && altloc != ch && !bsFound.get(altloc.charCodeAt(0))) {
ch = altloc;
conformationIndex--;
bsFound.set(altloc.charCodeAt(0));
}if (conformationIndex >= 0 || altloc != ch) bsAtoms.clear(i);
}
}if (bsAtoms.nextSetBit(0) >= 0) {
bsRet.or(bsAtoms);
if (doSet) for (var j = this.bioPolymerCount; --j >= 0; ) this.bioPolymers[j].setConformation(bsAtoms);

}}, "~N,~B,JU.BS,JU.BS");
Clazz_defineMethod(c$, "getDefaultLargePDBRendering", 
function(sb, maxAtoms){
var bs =  new JU.BS();
if (this.getBondCount() == 0) bs = this.bsAtoms;
if (bs !== this.bsAtoms) for (var i = 0; i < this.bioPolymerCount; i++) this.bioPolymers[i].getRange(bs, this.isMutated);

if (bs.nextSetBit(0) < 0) return;
var bs2 =  new JU.BS();
if (bs === this.bsAtoms) {
bs2 = bs;
} else {
for (var i = 0; i < this.bioPolymerCount; i++) if (this.bioPolymers[i].getType() == 0) this.bioPolymers[i].getRange(bs2, this.isMutated);

}if (bs2.nextSetBit(0) >= 0) sb.append("select ").append(JU.Escape.eBS(bs2)).append(";backbone only;");
if (this.act <= maxAtoms) return;
sb.append("select ").append(JU.Escape.eBS(bs)).append(" & connected; wireframe only;");
if (bs !== this.bsAtoms) {
bs2.clearAll();
bs2.or(this.bsAtoms);
bs2.andNot(bs);
if (bs2.nextSetBit(0) >= 0) sb.append("select " + JU.Escape.eBS(bs2) + " & !connected;stars 0.5;spacefill off;");
}}, "JU.SB,~N");
Clazz_defineMethod(c$, "getFullPDBHeader", 
function(){
if (this.modelIndex < 0) return "";
var info = this.auxiliaryInfo.get("fileHeader");
if (info != null) return info;
return this.ms.bioModelset.getBioExt().getFullPDBHeader(this.auxiliaryInfo);
});
Clazz_defineMethod(c$, "getPdbData", 
function(type, ctype, isDraw, bsSelected, out, tokens, pdbCONECT, bsWritten){
this.ms.bioModelset.getBioExt().getPdbDataM(this, this.vwr, type, ctype, isDraw, bsSelected, out, tokens, pdbCONECT, bsWritten);
}, "~S,~S,~B,JU.BS,JU.OC,~A,JU.SB,JU.BS");
Clazz_defineMethod(c$, "getRasmolHydrogenBonds", 
function(bsA, bsB, vHBonds, nucleicOnly, nMax, dsspIgnoreHydrogens, bsHBonds, version){
var doAdd = (vHBonds == null);
if (doAdd) vHBonds =  new JU.Lst();
if (nMax < 0) nMax = 2147483647;
var asDSSX = (bsB == null);
var bp;
var bp1;
if (asDSSX && this.bioPolymerCount > 0) {
this.calculateDssx(vHBonds, false, dsspIgnoreHydrogens, false, version);
} else {
for (var i = this.bioPolymerCount; --i >= 0; ) {
bp = this.bioPolymers[i];
if (bp.monomerCount == 0) continue;
var type = bp.getType();
var isRNA = false;
switch (type) {
case 1:
if (nucleicOnly) continue;
bp.calcRasmolHydrogenBonds(null, bsA, bsB, vHBonds, nMax, null, true, false);
break;
case 2:
isRNA = bp.monomers[0].isRna();
break;
default:
continue;
}
for (var j = this.bioPolymerCount; --j >= 0; ) {
if ((bp1 = this.bioPolymers[j]) != null && (isRNA || i != j) && type == bp1.getType()) {
bp1.calcRasmolHydrogenBonds(bp, bsA, bsB, vHBonds, nMax, null, true, false);
}}
}
}if (vHBonds.size() == 0 || !doAdd) return;
this.hasRasmolHBonds = true;
for (var i = 0; i < vHBonds.size(); i++) {
var bond = vHBonds.get(i);
var atom1 = bond.atom1;
var atom2 = bond.atom2;
if (atom1.isBonded(atom2)) continue;
var index = this.ms.addHBond(atom1, atom2, bond.order, bond.getEnergy());
if (bsHBonds != null) bsHBonds.set(index);
}
}, "JU.BS,JU.BS,JU.Lst,~B,~N,~B,JU.BS,~N");
Clazz_defineMethod(c$, "getUnitID", 
function(atom, flags){
var sb =  new JU.SB();
var m = atom.group;
var noTrim = ((flags & 16) != 16);
var ch = ((flags & 8) == 8 ? m.getInsertionCode() : '\0');
var isAll = (ch != '\0');
if ((flags & 1) == 1 && (this.pdbID != null)) sb.append(this.pdbID);
sb.append("|").appendO(this.ms.getInfo(this.modelIndex, "modelNumber")).append("|").append(this.vwr.getChainIDStr(m.chain.chainID)).append("|").append(m.getGroup3()).append("|").appendI(m.getResno());
if ((flags & 4) == 4) {
sb.append("|").append(atom.getAtomName());
if (atom.altloc != '\0') sb.append("|").appendC(atom.altloc);
 else if (noTrim || isAll) sb.append("|");
} else if (noTrim || isAll) {
sb.append("||");
}if (isAll) sb.append("|").appendC(ch);
 else if (noTrim) sb.append("|");
if (noTrim) sb.append("|");
return sb.toString();
}, "JM.Atom,~N");
Clazz_defineMethod(c$, "recalculateLeadMidpointsAndWingVectors", 
function(){
for (var ip = 0; ip < this.bioPolymerCount; ip++) this.bioPolymers[ip].recalculateLeadMidpointsAndWingVectors();

});
Clazz_defineMethod(c$, "resetRasmolBonds", 
function(bs, dsspVersion){
var bsDelete =  new JU.BS();
this.hasRasmolHBonds = false;
var am = this.ms.am;
var bo = this.ms.bo;
for (var i = this.ms.bondCount; --i >= 0; ) {
var bond = bo[i];
if (bond != null && (bond.order & 28672) != 0 && am[bond.atom1.mi].trajectoryBaseIndex == this.modelIndex) bsDelete.set(i);
}
if (bsDelete.nextSetBit(0) >= 0) this.ms.deleteBonds(bsDelete, false);
this.getRasmolHydrogenBonds(bs, bs, null, false, 2147483647, false, null, dsspVersion);
}, "JU.BS,~N");
});
;//5.0.1-v7 Mon Aug 17 10:07:10 MDT 2026
Clazz_declarePackage("JM");
Clazz_load(["java.util.Hashtable", "J.c.STR"], "JM.BioResolver", ["java.util.Arrays", "JU.AU", "$.BS", "$.Measure", "$.P3", "$.P4", "$.PT", "$.SB", "$.V3", "JM.Group", "JM.AlphaMonomer", "$.AlphaPolymer", "$.AminoMonomer", "$.AminoPolymer", "$.BioModel", "$.BioModelSet", "$.CarbohydrateMonomer", "$.CarbohydratePolymer", "$.NucleicMonomer", "$.NucleicPolymer", "$.PhosphorusMonomer", "$.PhosphorusPolymer", "JU.BSUtil", "$.Logger", "JV.JC"], function(){
var c$ = Clazz_decorateAsClass(function(){
this.vwr = null;
this.vAB = null;
this.vNorm = null;
this.plane = null;
this.ml = null;
this.ms = null;
this.bsAddedMask = null;
this.haveHsAlready = false;
this.bsAddedHydrogens = null;
this.bsAtomsForHs = null;
this.htBondMap = null;
this.htGroupBonds = null;
this.hNames = null;
this.baseBondIndex = 0;
this.hasCONECT = false;
this.bsAssigned = null;
this.carbohydrates = null;
Clazz_instantialize(this, arguments);}, JM, "BioResolver", null, java.util.Comparator);
/*LV!1824 unnec constructor*/Clazz_defineMethod(c$, "setLoader", 
function(modelLoader){
this.ml = modelLoader;
this.bsAddedMask = null;
this.haveHsAlready = false;
if (modelLoader == null) {
this.ms = null;
this.bsAddedHydrogens = this.bsAtomsForHs = this.bsAssigned = null;
this.htBondMap = null;
this.htGroupBonds = null;
this.hNames = null;
} else {
JM.Group.specialAtomNames = JM.BioResolver.specialAtomNames;
this.ms = modelLoader.ms;
this.vwr = modelLoader.ms.vwr;
modelLoader.specialAtomIndexes =  Clazz_newIntArray (JM.BioResolver.ATOMID_MAX, 0);
this.hasCONECT = (this.ms.getInfoM(JV.JC.getBoolName(3)) === Boolean.TRUE);
}return this;
}, "JM.ModelLoader");
Clazz_defineMethod(c$, "setViewer", 
function(vwr){
this.vwr = vwr;
if (JM.Group.standardGroupList == null) {
var s =  new JU.SB();
for (var i = 1; i < 42; i++) s.append(",[").append(JM.BioResolver.predefinedGroup3Names[i]).append("]");

s.append(",[AHR],[ALL],[AMU],[ARA],[ARB],[BDF],[BDR],[BGC],[BMA],[FCA],[FCB],[FRU],[FUC],[FUL],[GAL],[GLA],[GLC],[GXL],[GUP],[LXC],[MAN],[RAM],[RIB],[RIP],[XYP],[XYS],[CBI],[CT3],[CTR],[CTT],[LAT],[MAB],[MAL],[MLR],[MTT],[SUC],[TRE],[GCU],[MTL],[NAG],[NDG],[RHA],[SOR],[SOL],[SOE],[XYL],[A2G],[LBT],[NGA],[SIA],[SLB],[AFL],[AGC],[GLB],[NAN],[RAA]");
JM.BioResolver.group3Count = Clazz_doubleToInt(s.length() / 6);
JM.Group.standardGroupList = s.toString();
for (var i = 0, n = JM.BioResolver.predefinedGroup3Names.length; i < n; ++i) JM.BioResolver.addGroup3Name(JM.BioResolver.predefinedGroup3Names[i].trim());

}return this;
}, "JV.Viewer");
Clazz_defineMethod(c$, "getBioModel", 
function(modelIndex, trajectoryBaseIndex, jmolData, modelProperties, modelAuxiliaryInfo){
return  new JM.BioModel().setBioModel(this.ms, modelIndex, trajectoryBaseIndex, jmolData, modelProperties, modelAuxiliaryInfo);
}, "~N,~N,java.util.Map,java.util.Properties,java.util.Map");
Clazz_defineMethod(c$, "distinguishAndPropagateGroup", 
function(chain, group3, seqcode, firstAtomIndex, lastAtomIndex, specialAtomIndexes, atoms){
var mask = 0;
for (var i = JM.BioResolver.ATOMID_MAX; --i >= 0; ) specialAtomIndexes[i] = -2147483648;

for (var i = lastAtomIndex; i >= firstAtomIndex; --i) {
var specialAtomID = atoms[i].atomID;
if (specialAtomID <= 0) continue;
if (specialAtomID < 14) {
mask |= (1 << specialAtomID);
}specialAtomIndexes[specialAtomID] = i;
}
var m = null;
if ((mask & 14) == 14) m = JM.AminoMonomer.validateAndAllocate(chain, group3, seqcode, firstAtomIndex, lastAtomIndex, specialAtomIndexes, atoms);
 else if (mask == 4) m = JM.AlphaMonomer.validateAndAllocateA(chain, group3, seqcode, firstAtomIndex, lastAtomIndex, specialAtomIndexes);
 else if (((mask & 8128) == 8128)) m = JM.NucleicMonomer.validateAndAllocate(chain, group3, seqcode, firstAtomIndex, lastAtomIndex, specialAtomIndexes);
 else if (mask == 8192) m = JM.PhosphorusMonomer.validateAndAllocateP(chain, group3, seqcode, firstAtomIndex, lastAtomIndex, specialAtomIndexes);
 else if (this.checkCarbohydrate(group3)) m = JM.CarbohydrateMonomer.validateAndAllocate(chain, group3, seqcode, firstAtomIndex, lastAtomIndex);
return (m != null && m.leadAtomIndex >= 0 ? m : null);
}, "JM.Chain,~S,~N,~N,~N,~A,~A");
Clazz_defineMethod(c$, "setHaveHsAlready", 
function(b){
this.haveHsAlready = b;
}, "~B");
Clazz_defineMethod(c$, "initializeHydrogenAddition", 
function(){
this.baseBondIndex = this.ms.bondCount;
this.bsAddedHydrogens =  new JU.BS();
this.bsAtomsForHs =  new JU.BS();
this.htBondMap =  new java.util.Hashtable();
this.htGroupBonds =  new java.util.Hashtable();
this.hNames =  new Array(3);
this.vAB =  new JU.V3();
this.vNorm =  new JU.V3();
this.plane =  new JU.P4();
});
Clazz_defineMethod(c$, "addImplicitHydrogenAtoms", 
function(adapter, iGroup, nH){
var group3 = this.ml.getGroup3(iGroup);
var nH1;
if (this.haveHsAlready && this.hasCONECT || group3 == null || (nH1 = JM.BioResolver.getStandardPdbHydrogenCount(group3)) == 0) return;
nH = (nH1 < 0 ? -1 : nH1 + nH);
var model = null;
var iFirst = this.ml.getFirstAtomIndex(iGroup);
var ac = this.ms.ac;
if (nH < 0) {
if (ac - iFirst == 1) return;
model = this.vwr.getLigandModel(group3, "ligand_", "_data", null);
if (model == null) return;
nH = adapter.getHydrogenAtomCount(model);
if (nH < 1) return;
}this.getBondInfo(adapter, group3, model);
this.ms.am[this.ms.at[iFirst].mi].isPdbWithMultipleBonds = true;
if (this.haveHsAlready) return;
this.bsAtomsForHs.setBits(iFirst, ac);
this.bsAddedHydrogens.setBits(ac, ac + nH);
var isHetero = this.ms.at[iFirst].isHetero();
var xyz = JU.P3.new3(NaN, NaN, NaN);
var a = this.ms.at[iFirst];
for (var i = 0; i < nH; i++) this.ms.addAtom(a.mi, a.group, 1, "H", null, 0, a.getSeqID(), 0, xyz, NaN, null, 0, 0, 1, 0, null, isHetero, false, 0, null, NaN).$delete(null);

}, "J.api.JmolAdapter,~N,~N");
Clazz_defineMethod(c$, "getBondInfo", 
function(adapter, group3, model){
if (this.htGroupBonds.get(group3) != null) return;
var bondInfo = (model == null ? this.getPdbBondInfo(group3, this.vwr.getBoolean(603979873)) : this.getLigandBondInfo(adapter, model, group3));
if (bondInfo == null) return;
this.htGroupBonds.put(group3, Boolean.TRUE);
for (var i = 0; i < bondInfo.length; i++) {
if (bondInfo[i] == null) continue;
if (bondInfo[i][1].charAt(0) == 'H') this.htBondMap.put(group3 + "." + bondInfo[i][0], bondInfo[i][1]);
 else this.htBondMap.put(group3 + ":" + bondInfo[i][0] + ":" + bondInfo[i][1], bondInfo[i][2]);
}
}, "J.api.JmolAdapter,~S,~O");
Clazz_defineMethod(c$, "getLigandBondInfo", 
function(adapter, model, group3){
var dataIn = adapter.getBondList(model);
var htAtoms =  new java.util.Hashtable();
var iterAtom = adapter.getAtomIterator(model);
while (iterAtom.hasNext()) htAtoms.put(iterAtom.getAtomName(), iterAtom.getXYZ());

var bondInfo =  new Array(dataIn.length * 2);
var n = 0;
for (var i = 0; i < dataIn.length; i++) {
var b = dataIn[i];
if (b[0].charAt(0) != 'H') bondInfo[n++] =  Clazz_newArray(-1, [b[0], b[1], b[2], b[1].startsWith("H") ? "0" : "1"]);
if (b[1].charAt(0) != 'H') bondInfo[n++] =  Clazz_newArray(-1, [b[1], b[0], b[2], b[0].startsWith("H") ? "0" : "1"]);
}
java.util.Arrays.sort(bondInfo, this);
var t;
for (var i = 0; i < n; ) {
t = bondInfo[i];
var a1 = t[0];
var nH = 0;
var nC = 0;
for (; i < n && (t = bondInfo[i])[0].equals(a1); i++) {
if (t[3].equals("0")) {
nH++;
continue;
}if (t[3].equals("1")) nC++;
}
var pt = i - nH - nC;
if (nH == 1) continue;
switch (nC) {
case 1:
var sep = (nH == 2 ? '@' : '|');
for (var j = 1; j < nH; j++) {
bondInfo[pt][1] += sep + bondInfo[pt + j][1];
bondInfo[pt + j] = null;
}
continue;
case 2:
if (nH != 2) continue;
var name = bondInfo[pt][0];
var name1 = bondInfo[pt + nH][1];
var name2 = bondInfo[pt + nH + 1][1];
var factor = name1.compareTo(name2);
JU.Measure.getPlaneThroughPoints(htAtoms.get(name1), htAtoms.get(name), htAtoms.get(name2), this.vNorm, this.vAB, this.plane);
var d = JU.Measure.distanceToPlane(this.plane, htAtoms.get(bondInfo[pt][1])) * factor;
bondInfo[pt][1] = (d > 0 ? bondInfo[pt][1] + "@" + bondInfo[pt + 1][1] : bondInfo[pt + 1][1] + "@" + bondInfo[pt][1]);
bondInfo[pt + 1] = null;
}
}
for (var i = 0; i < n; i++) {
if ((t = bondInfo[i]) != null && t[1].charAt(0) != 'H' && t[0].compareTo(t[1]) > 0) {
bondInfo[i] = null;
continue;
}if (t != null) JU.Logger.info(" ligand " + group3 + ": " + bondInfo[i][0] + " - " + bondInfo[i][1] + " order " + bondInfo[i][2]);
}
return bondInfo;
}, "J.api.JmolAdapter,~O,~S");
Clazz_overrideMethod(c$, "compare", 
function(a, b){
return (b == null ? (a == null ? 0 : -1) : a == null ? 1 : a[0].compareTo(b[0]) < 0 ? -1 : a[0].compareTo(b[0]) > 0 ? 1 : a[3].compareTo(b[3]) < 0 ? -1 : a[3].compareTo(b[3]) > 0 ? 1 : a[1].compareTo(b[1]) < 0 ? -1 : a[1].compareTo(b[1]) > 0 ? 1 : 0);
}, "~A,~A");
Clazz_defineMethod(c$, "finalizeHydrogens", 
function(){
this.vwr.getLigandModel(null, null, null, null);
this.finalizePdbMultipleBonds();
this.addHydrogens();
});
Clazz_defineMethod(c$, "addHydrogens", 
function(){
if (this.bsAddedHydrogens.nextSetBit(0) < 0) return;
this.bsAddedMask = JU.BSUtil.copy(this.bsAddedHydrogens);
this.finalizePdbCharges();
var nTotal =  Clazz_newIntArray (1, 0);
var pts = this.ms.calculateHydrogens(this.bsAtomsForHs, nTotal, null, 256);
var groupLast = null;
var ipt = 0;
var atom;
for (var i = 0; i < pts.length; i++) {
if (pts[i] == null || (atom = this.ms.at[i]) == null) continue;
var g = atom.group;
if (g !== groupLast) {
groupLast = g;
ipt = g.lastAtomIndex;
while (this.bsAddedHydrogens.get(ipt)) ipt--;

}var gName = atom.getGroup3(false);
var aName = atom.getAtomName();
var hName = this.htBondMap.get(gName + "." + aName);
if (hName == null) continue;
var isChiral = hName.contains("@");
var isMethyl = (hName.endsWith("?") || hName.indexOf("|") >= 0);
var n = pts[i].length;
if (n == 3 && !isMethyl && hName.equals("H@H2")) {
hName = "H|H2|H3";
isMethyl = true;
isChiral = false;
}if (isChiral && n == 3 || isMethyl != (n == 3)) {
JU.Logger.info("Error adding H atoms to " + gName + g.getResno() + ": " + pts[i].length + " atoms should not be added to " + aName);
continue;
}var pt = hName.indexOf("@");
switch (pts[i].length) {
case 1:
if (pt > 0) hName = hName.substring(0, pt);
this.setHydrogen(i, ++ipt, hName, pts[i][0]);
break;
case 2:
var hName1;
var hName2;
var d = -1;
var bonds = atom.bonds;
if (bonds != null) switch (bonds.length) {
case 2:
var atom1 = bonds[0].getOtherAtom(atom);
var atom2 = bonds[1].getOtherAtom(atom);
var factor = atom1.getAtomName().compareTo(atom2.getAtomName());
d = JU.Measure.distanceToPlane(JU.Measure.getPlaneThroughPoints(atom1, atom, atom2, this.vNorm, this.vAB, this.plane), pts[i][0]) * factor;
break;
}
if (pt < 0) {
JU.Logger.info("Error adding H atoms to " + gName + g.getResno() + ": expected to only need 1 H but needed 2");
hName1 = hName2 = "H";
} else if (d < 0) {
hName2 = hName.substring(0, pt);
hName1 = hName.substring(pt + 1);
} else {
hName1 = hName.substring(0, pt);
hName2 = hName.substring(pt + 1);
}this.setHydrogen(i, ++ipt, hName1, pts[i][0]);
this.setHydrogen(i, ++ipt, hName2, pts[i][1]);
break;
case 3:
var pt1 = hName.indexOf('|');
if (pt1 >= 0) {
var pt2 = hName.lastIndexOf('|');
this.hNames[0] = hName.substring(0, pt1);
this.hNames[1] = hName.substring(pt1 + 1, pt2);
this.hNames[2] = hName.substring(pt2 + 1);
} else {
this.hNames[0] = hName.$replace('?', '1');
this.hNames[1] = hName.$replace('?', '2');
this.hNames[2] = hName.$replace('?', '3');
}this.setHydrogen(i, ++ipt, this.hNames[0], pts[i][0]);
this.setHydrogen(i, ++ipt, this.hNames[1], pts[i][2]);
this.setHydrogen(i, ++ipt, this.hNames[2], pts[i][1]);
break;
}
}
this.deleteUnneededAtoms();
this.ms.fixFormalCharges(JU.BSUtil.newBitSet2(this.ml.baseAtomIndex, this.ml.ms.ac));
});
Clazz_defineMethod(c$, "deleteUnneededAtoms", 
function(){
var bsBondsDeleted =  new JU.BS();
for (var i = this.bsAtomsForHs.nextSetBit(0); i >= 0; i = this.bsAtomsForHs.nextSetBit(i + 1)) {
var atom = this.ms.at[i];
if (!atom.isHetero() || atom.getElementNumber() != 8 || atom.getFormalCharge() != 0 || atom.getCovalentBondCount() != 2) continue;
var bonds = atom.bonds;
var atom1 = bonds[0].getOtherAtom(atom);
var atomH = bonds[1].getOtherAtom(atom);
if (atom1.getElementNumber() == 1) {
var a = atom1;
atom1 = atomH;
atomH = a;
}if (atomH.getElementNumber() != 1) continue;
var bonds1 = atom1.bonds;
for (var j = 0; j < bonds1.length; j++) {
if (bonds1[j].order == 2) {
var atomO = bonds1[j].getOtherAtom(atom1);
if (atomO.getElementNumber() == 8) {
this.bsAddedHydrogens.set(atomH.i);
atomH.$delete(bsBondsDeleted);
break;
}}}
}
this.ms.deleteBonds(bsBondsDeleted, true);
this.deleteAtoms(this.bsAddedHydrogens);
});
Clazz_defineMethod(c$, "deleteAtoms", 
function(bsDeletedAtoms){
var mapOldToNew =  Clazz_newIntArray (this.ms.ac, 0);
var mapNewToOld =  Clazz_newIntArray (this.ms.ac - bsDeletedAtoms.cardinality(), 0);
var n = this.ml.baseAtomIndex;
var models = this.ms.am;
var atoms = this.ms.at;
for (var i = this.ml.baseAtomIndex; i < this.ms.ac; i++) {
var a = atoms[i];
if (a == null) continue;
models[a.mi].bsAtoms.clear(i);
models[a.mi].bsAtomsDeleted.clear(i);
if (bsDeletedAtoms.get(i)) {
mapOldToNew[i] = n - 1;
models[atoms[i].mi].act--;
} else {
mapNewToOld[n] = i;
mapOldToNew[i] = n++;
}}
this.ms.msInfo.put("bsDeletedAtoms", bsDeletedAtoms);
for (var i = this.ml.baseGroupIndex; i < this.ml.groups.length; i++) {
var g = this.ml.groups[i];
if (g.firstAtomIndex >= this.ml.baseAtomIndex) {
g.firstAtomIndex = mapOldToNew[g.firstAtomIndex];
g.lastAtomIndex = mapOldToNew[g.lastAtomIndex];
if (g.leadAtomIndex >= 0) g.leadAtomIndex = mapOldToNew[g.leadAtomIndex];
}}
this.ms.adjustAtomArrays(mapNewToOld, this.ml.baseAtomIndex, n);
this.ms.calcBoundBoxDimensions(null, 1);
this.ms.resetMolecules();
this.ms.validateBspf(false);
this.bsAddedMask = JU.BSUtil.deleteBits(this.bsAddedMask, bsDeletedAtoms);
for (var i = this.ml.baseModelIndex; i < this.ms.mc; i++) {
this.fixAnnotations(i, 1073741925);
this.fixAnnotations(i, 1073742189);
this.fixAnnotations(i, 1111490587);
}
}, "JU.BS");
Clazz_defineMethod(c$, "fixAnnotations", 
function(modelIndex, type){
var parser = this.vwr.getAnnotationParserIfPresent(type);
if (parser == null) return;
var key = null;
switch (type) {
case 1111490587:
this.vwr.ms.bioModelset.clearDSSR();
return;
case 1073742189:
key = "validation";
break;
case 1073741925:
key = "domains";
break;
}
var o = this.ml.ms.getInfo(modelIndex, key);
if (o != null) {
var dbObj = (this.ms.am[modelIndex]).getCachedAnnotationMap(key, o);
if (dbObj != null) parser.fixAtoms(modelIndex, dbObj, this.bsAddedMask, type, 20);
}}, "~N,~N");
Clazz_defineMethod(c$, "finalizePdbCharges", 
function(){
var atoms = this.ms.at;
for (var i = this.bsAtomsForHs.nextSetBit(0); i >= 0; i = this.bsAtomsForHs.nextSetBit(i + 1)) {
var a = atoms[i];
if (a.group.getNitrogenAtom() === a && a.getCovalentBondCount() == 1) a.setFormalCharge(1);
if ((i = this.bsAtomsForHs.nextClearBit(i + 1)) < 0) break;
}
});
Clazz_defineMethod(c$, "finalizePdbMultipleBonds", 
function(){
var htKeysUsed =  new java.util.Hashtable();
var bondCount = this.ms.bondCount;
var bonds = this.ms.bo;
for (var i = this.baseBondIndex; i < bondCount; i++) {
if (bonds[i] == null) continue;
var a1 = bonds[i].atom1;
var a2 = bonds[i].atom2;
var g = a1.group;
if (g !== a2.group) continue;
var key =  new JU.SB().append(g.getGroup3());
key.append(":");
var n1 = a1.getAtomName();
var n2 = a2.getAtomName();
if (n1.compareTo(n2) > 0) key.append(n2).append(":").append(n1);
 else key.append(n1).append(":").append(n2);
var skey = key.toString();
var type = this.htBondMap.get(skey);
if (type == null) continue;
htKeysUsed.put(skey, Boolean.TRUE);
bonds[i].setOrder(JU.PT.parseInt(type));
}
for (var key, $key = this.htBondMap.keySet().iterator (); $key.hasNext()&& ((key = $key.next ()) || true);) {
if (htKeysUsed.get(key) != null) continue;
if (key.indexOf(":") < 0) {
htKeysUsed.put(key, Boolean.TRUE);
continue;
}var value = this.htBondMap.get(key);
JU.Logger.info("bond " + key + " was not used; order=" + value);
if (this.htBondMap.get(key).equals("1")) {
htKeysUsed.put(key, Boolean.TRUE);
continue;
}}
var htKeysBad =  new java.util.Hashtable();
for (var key, $key = this.htBondMap.keySet().iterator (); $key.hasNext()&& ((key = $key.next ()) || true);) {
if (htKeysUsed.get(key) != null) continue;
htKeysBad.put(key.substring(0, key.lastIndexOf(":")), this.htBondMap.get(key));
}
if (htKeysBad.isEmpty()) return;
for (var i = 0; i < bondCount; i++) {
var a1 = bonds[i].atom1;
var a2 = bonds[i].atom2;
if (a1.group === a2.group) continue;
var value;
if ((value = htKeysBad.get(a1.getGroup3(false) + ":" + a1.getAtomName())) == null && ((value = htKeysBad.get(a2.getGroup3(false) + ":" + a2.getAtomName())) == null)) continue;
bonds[i].setOrder(JU.PT.parseInt(value));
JU.Logger.info("assigning order " + bonds[i].order + " to bond " + bonds[i]);
}
});
Clazz_defineMethod(c$, "setHydrogen", 
function(iTo, iAtom, name, pt){
if (!this.bsAddedHydrogens.get(iAtom)) return;
var atoms = this.ms.at;
this.bsAddedHydrogens.clear(iAtom);
this.ms.setAtomName(iAtom, name, false);
atoms[iAtom].setT(pt);
atoms[iAtom].atomSymmetry = atoms[iTo].atomSymmetry;
this.ml.undeleteAtom(iAtom);
this.ms.bondAtoms(atoms[iTo], atoms[iAtom], 1, this.ms.getDefaultMadFromOrder(1), null, 0, true, false);
}, "~N,~N,~S,JU.P3");
Clazz_defineMethod(c$, "fixPropertyValue", 
function(bsAtoms, data, toHydrogens){
var atoms = this.ms.at;
var fData = data;
var newData =  Clazz_newFloatArray (bsAtoms.cardinality(), 0);
var lastData = 0;
for (var pt = 0, iAtom = 0, i = bsAtoms.nextSetBit(0); i >= 0; i = bsAtoms.nextSetBit(i + 1), iAtom++) {
if (atoms[i].getElementNumber() == 1) {
if (!toHydrogens) continue;
} else {
lastData = fData[pt++];
}newData[iAtom] = lastData;
}
return newData;
}, "JU.BS,~O,~B");
c$.allocateBioPolymer = Clazz_defineMethod(c$, "allocateBioPolymer", 
function(groups, firstGroupIndex, checkConnections, pt0){
var previous = null;
var count = 0;
for (var i = firstGroupIndex; i < groups.length; ++i) {
var group = groups[i];
var current;
if (!(Clazz_instanceOf(group,"JM.Monomer")) || (current = group).bioPolymer != null || previous != null && previous.getClass() !== current.getClass() || checkConnections && !current.isConnectedAfter(previous)) break;
previous = current;
count++;
}
if (count < 2) return null;
var monomers =  new Array(count);
for (var j = 0; j < count; ++j) monomers[j] = groups[firstGroupIndex + j];

if (Clazz_instanceOf(previous,"JM.AminoMonomer")) return  new JM.AminoPolymer(monomers, pt0);
if (Clazz_instanceOf(previous,"JM.AlphaMonomer")) return  new JM.AlphaPolymer(monomers, pt0);
if (Clazz_instanceOf(previous,"JM.NucleicMonomer")) return  new JM.NucleicPolymer(monomers);
if (Clazz_instanceOf(previous,"JM.PhosphorusMonomer")) return  new JM.PhosphorusPolymer(monomers);
if (Clazz_instanceOf(previous,"JM.CarbohydrateMonomer")) return  new JM.CarbohydratePolymer(monomers);
JU.Logger.error("Polymer.allocatePolymer() ... no matching polymer for monomor " + previous);
throw  new NullPointerException();
}, "~A,~N,~B,~N");
Clazz_defineMethod(c$, "iterateOverAllNewStructures", 
function(adapter, atomSetCollection){
var iterStructure = adapter.getStructureIterator(atomSetCollection);
if (iterStructure == null) return;
var bs = iterStructure.getStructuredModels();
if (bs != null) for (var i = bs.nextSetBit(0); i >= 0; i = bs.nextSetBit(i + 1)) this.ml.structuresDefinedInFile.set(this.ml.baseModelIndex + i);

while (iterStructure.hasNext()) if (iterStructure.getStructureType() !== J.c.STR.TURN) this.setStructure(iterStructure);

iterStructure = adapter.getStructureIterator(atomSetCollection);
while (iterStructure.hasNext()) if (iterStructure.getStructureType() === J.c.STR.TURN) this.setStructure(iterStructure);

}, "J.api.JmolAdapter,~O");
Clazz_defineMethod(c$, "setStructure", 
function(iterStructure){
var t = iterStructure.getSubstructureType();
var id = iterStructure.getStructureID();
var serID = iterStructure.getStrandID();
var count = iterStructure.getStrandCount();
var atomRange = iterStructure.getAtomIndices();
var modelRange = iterStructure.getModelIndices();
var bsAll = iterStructure.getBSAll();
var m0;
var m1;
var models = this.ms.am;
if (this.ml.isTrajectory) {
m0 = m1 = modelRange[0];
} else {
m0 = modelRange[0] + this.ml.baseModelIndex;
m1 = modelRange[1] + this.ml.baseModelIndex;
}this.ml.structuresDefinedInFile.setBits(m0, m1 + 1);
var bs;
var m;
if (bsAll != null) {
for (var i = m0, t0; i <= m1; i++) if (Clazz_instanceOf((m = models[i]),"JM.BioModel")) for (var j = 0; j < 5; j++) if ((bs = bsAll[t0 = JM.BioResolver.mytypes[j]]) != null && !bs.isEmpty()) (m).addStructureByBS(0, t0, JM.BioResolver.types[j], bs);


return;
}var startChainID = iterStructure.getStartChainID();
var startSequenceNumber = iterStructure.getStartSequenceNumber();
var startInsertionCode = iterStructure.getStartInsertionCode();
var endSequenceNumber = iterStructure.getEndSequenceNumber();
var endChainID = iterStructure.getEndChainID();
var endInsertionCode = iterStructure.getEndInsertionCode();
var type = (t === J.c.STR.NOT ? J.c.STR.NONE : t);
var startSeqCode = JM.Group.getSeqcodeFor(startSequenceNumber, startInsertionCode);
var endSeqCode = JM.Group.getSeqcodeFor(endSequenceNumber, endInsertionCode);
if (this.bsAssigned == null) this.bsAssigned =  new JU.BS();
for (var i = m0, i0 = 0; i <= m1; i++) if (Clazz_instanceOf((m = models[i]),"JM.BioModel")) (m).addSecondaryStructure(type, id, serID, count, startChainID, startSeqCode, endChainID, endSeqCode, (i0 = m.firstAtomIndex) + atomRange[0], i0 + atomRange[1], this.bsAssigned);

}, "J.api.JmolAdapterStructureIterator");
Clazz_defineMethod(c$, "setGroupLists", 
function(ipt){
this.ml.group3Lists[ipt + 1] = JM.Group.standardGroupList;
this.ml.group3Counts[ipt + 1] =  Clazz_newIntArray (JM.BioResolver.group3Count + 10, 0);
if (this.ml.group3Lists[0] == null) {
this.ml.group3Lists[0] = JM.Group.standardGroupList;
this.ml.group3Counts[0] =  Clazz_newIntArray (JM.BioResolver.group3Count + 10, 0);
}}, "~N");
Clazz_defineMethod(c$, "isKnownPDBGroup", 
function(g3, max){
var pt = JM.BioResolver.knownGroupID(g3);
return (pt > 0 ? pt < max : max == 2147483647 && this.checkCarbohydrate(g3));
}, "~S,~N");
Clazz_defineMethod(c$, "lookupSpecialAtomID", 
function(name){
if (JM.BioResolver.htSpecialAtoms == null) {
JM.BioResolver.htSpecialAtoms =  new java.util.Hashtable();
for (var i = JM.BioResolver.specialAtomNames.length; --i >= 0; ) {
var specialAtomName = JM.BioResolver.specialAtomNames[i];
if (specialAtomName != null) JM.BioResolver.htSpecialAtoms.put(specialAtomName, Byte.$valueOf(i));
}
}var boxedAtomID = JM.BioResolver.htSpecialAtoms.get(name);
return (boxedAtomID == null ? 0 : boxedAtomID.byteValue());
}, "~S");
Clazz_defineMethod(c$, "getPdbBondInfo", 
function(group3, isLegacy){
if (JM.BioResolver.htPdbBondInfo == null) JM.BioResolver.htPdbBondInfo =  new java.util.Hashtable();
var info = JM.BioResolver.htPdbBondInfo.get(group3);
if (info != null) return info;
var pt = JM.BioResolver.knownGroupID(group3);
if (pt < 0 || pt > JM.BioResolver.pdbBondInfo.length) return null;
var s = JM.BioResolver.pdbBondInfo[pt];
if (isLegacy && (pt = s.indexOf("O3'")) >= 0) s = s.substring(0, pt);
var temp = JU.PT.getTokens(s);
info =  new Array(Clazz_doubleToInt(temp.length / 2));
for (var i = 0, p = 0; i < info.length; i++) {
var source = temp[p++];
var target = temp[p++];
if (target.length == 1) switch ((target.charAt(0)).charCodeAt(0)) {
case 78:
target = "H@H2";
break;
case 66:
target = "HB3@HB2";
break;
case 68:
target = "HD3@HD2";
break;
case 71:
target = "HG3@HG2";
break;
case 50:
target = "H2'@H2''";
break;
case 53:
target = "H5''@H5'";
break;
}
if (target.charAt(0) != 'H' && source.compareTo(target) > 0) {
s = target;
target = source;
source = s;
}info[i] =  Clazz_newArray(-1, [source, target, (target.startsWith("H") ? "1" : "2")]);
}
JM.BioResolver.htPdbBondInfo.put(group3, info);
return info;
}, "~S,~B");
c$.knownGroupID = Clazz_defineMethod(c$, "knownGroupID", 
function(group3){
if (group3 == null || group3.length == 0) return 0;
var boxedGroupID = JM.BioResolver.htGroup.get(group3);
return (boxedGroupID == null ? -1 : boxedGroupID.shortValue());
}, "~S");
Clazz_defineMethod(c$, "checkCarbohydrate", 
function(group3){
if (group3 == null) return false;
var key = "[" + group3.toUpperCase() + "]";
return (",[AHR],[ALL],[AMU],[ARA],[ARB],[BDF],[BDR],[BGC],[BMA],[FCA],[FCB],[FRU],[FUC],[FUL],[GAL],[GLA],[GLC],[GXL],[GUP],[LXC],[MAN],[RAM],[RIB],[RIP],[XYP],[XYS],[CBI],[CT3],[CTR],[CTT],[LAT],[MAB],[MAL],[MLR],[MTT],[SUC],[TRE],[GCU],[MTL],[NAG],[NDG],[RHA],[SOR],[SOL],[SOE],[XYL],[A2G],[LBT],[NGA],[SIA],[SLB],[AFL],[AGC],[GLB],[NAN],[RAA]".indexOf(key) >= 0 || this.carbohydrates != null && this.carbohydrates.indexOf(key) >= 0);
}, "~S");
Clazz_defineMethod(c$, "isHetero", 
function(group3){
switch (group3.length) {
case 1:
group3 += "  ";
break;
case 2:
group3 += " ";
break;
case 3:
break;
default:
return true;
}
var pt = JM.Group.standardGroupList.indexOf(group3);
return (pt < 0 || Clazz_doubleToInt(pt / 6) + 1 >= 42);
}, "~S");
Clazz_defineMethod(c$, "toStdAmino3", 
function(g1){
if (g1.length == 0) return "";
var s =  new JU.SB();
var pt = JM.BioResolver.knownGroupID("==A");
if (pt < 0) {
for (var i = 1; i <= 20; i++) {
pt = JM.BioResolver.knownGroupID(JM.BioResolver.predefinedGroup3Names[i]);
JM.BioResolver.htGroup.put("==" + JM.BioResolver.predefinedGroup1Names[i], Short.$valueOf(pt));
}
}for (var i = 0, n = g1.length; i < n; i++) {
var ch = g1.charAt(i);
pt = JM.BioResolver.knownGroupID("==" + ch);
if (pt < 0) pt = 23;
s.append(" ").append(JM.BioResolver.predefinedGroup3Names[pt]);
}
return s.toString().substring(1);
}, "~S");
Clazz_defineMethod(c$, "getGroupID", 
function(g3){
return JM.BioResolver.getGroupIdFor(g3);
}, "~S");
c$.getGroupIdFor = Clazz_defineMethod(c$, "getGroupIdFor", 
function(group3){
if (group3 != null) group3 = group3.trim();
var groupID = JM.BioResolver.knownGroupID(group3);
return (groupID == -1 ? JM.BioResolver.addGroup3Name(group3) : groupID);
}, "~S");
c$.addGroup3Name = Clazz_defineMethod(c$, "addGroup3Name", 
function(group3){
if (JM.BioResolver.group3NameCount == JM.Group.group3Names.length) JM.Group.group3Names = JU.AU.doubleLengthS(JM.Group.group3Names);
var groupID = JM.BioResolver.group3NameCount++;
JM.Group.group3Names[groupID] = group3;
JM.BioResolver.htGroup.put(group3, Short.$valueOf(groupID));
return groupID;
}, "~S");
c$.getStandardPdbHydrogenCount = Clazz_defineMethod(c$, "getStandardPdbHydrogenCount", 
function(group3){
var pt = JM.BioResolver.knownGroupID(group3);
return (pt < 0 || pt >= JM.BioResolver.pdbHydrogenCount.length ? -1 : JM.BioResolver.pdbHydrogenCount[pt]);
}, "~S");
c$.getSpecialAtomName = Clazz_defineMethod(c$, "getSpecialAtomName", 
function(atomID){
return JM.BioResolver.specialAtomNames[atomID];
}, "~N");
Clazz_defineMethod(c$, "getArgbs", 
function(tok){
switch (tok) {
case 2097166:
return JM.BioResolver.argbsNucleic;
case 2097154:
return JM.BioResolver.argbsAmino;
case 1073742144:
return JM.BioResolver.argbsShapely;
case 1153433601:
return JM.BioResolver.argbsChainAtom;
case 1612709894:
return JM.BioResolver.argbsChainHetero;
}
return null;
}, "~N");
Clazz_defineMethod(c$, "getBioModelSet", 
function(modelSet){
if (modelSet.bioModelset == null) modelSet.bioModelset =  new JM.BioModelSet().set(this.vwr, modelSet);
return modelSet.bioModelset;
}, "JM.ModelSet");
c$.htGroup =  new java.util.Hashtable();
c$.types =  Clazz_newArray(-1, [J.c.STR.HELIXPI, J.c.STR.HELIXALPHA, J.c.STR.SHEET, J.c.STR.HELIX310, J.c.STR.TURN]);
c$.mytypes =  Clazz_newIntArray(-1, [0, 2, 3, 4, 6]);
c$.htPdbBondInfo = null;
c$.pdbBondInfo =  Clazz_newArray(-1, ["", "N N CA HA C O CB HB?", "N N CA HA C O CB B CG G CD D NE HE CZ NH1 NH1 HH11@HH12 NH2 HH22@HH21", "N N CA HA C O CB B CG OD1 ND2 HD21@HD22", "N N CA HA C O CB B CG OD1", "N N CA HA C O CB B SG HG", "N N CA HA C O CB B CG G CD OE1 NE2 HE22@HE21", "N N CA HA C O CB B CG G CD OE1", "N N CA HA2@HA3 C O", "N N CA HA C O CB B CG CD2 ND1 CE1 ND1 HD1 CD2 HD2 CE1 HE1 NE2 HE2", "N N CA HA C O CB HB CG1 HG13@HG12 CG2 HG2? CD1 HD1?", "N N CA HA C O CB B CG HG CD1 HD1? CD2 HD2?", "N N CA HA C O CB B CG G CD HD2@HD3 CE HE3@HE2 NZ HZ?", "N N CA HA C O CB B CG G CE HE?", "N N CA HA C O CB B CG CD1 CD1 HD1 CD2 CE2 CD2 HD2 CE1 CZ CE1 HE1 CE2 HE2 CZ HZ", "N H CA HA C O CB B CG G CD D", "N N CA HA C O CB B OG HG", "N N CA HA C O CB HB OG1 HG1 CG2 HG2?", "N N CA HA C O CB B CG CD1 CD1 HD1 CD2 CE2 NE1 HE1 CE3 CZ3 CE3 HE3 CZ2 CH2 CZ2 HZ2 CZ3 HZ3 CH2 HH2", "N N CA HA C O CB B CG CD1 CD1 HD1 CD2 CE2 CD2 HD2 CE1 CZ CE1 HE1 CE2 HE2 OH HH", "N N CA HA C O CB HB CG1 HG1? CG2 HG2?", "N N CA HA C O CB B", "N N CA HA C O CB B CG G", "", "P OP1 C5' 5 C4' H4' C3' H3' C2' H2' O2' HO2' C1' H1' C8 N7 C8 H8 C5 C4 C6 O6 N1 H1 C2 N3 N2 H22@H21 O3' HO3' O5' HO5'", "P OP1 C5' 5 C4' H4' C3' H3' C2' H2' O2' HO2' C1' H1' C2 O2 N3 C4 N4 H41@H42 C5 C6 C5 H5 C6 H6 O3' HO3' O5' HO5'", "P OP1 C5' 5 C4' H4' C3' H3' C2' H2' O2' HO2' C1' H1' C8 N7 C8 H8 C5 C4 C6 N1 N6 H61@H62 C2 N3 C2 H2 O3' HO3' O5' HO5'", "P OP1 C5' 5 C4' H4' C3' H3' C2' 2 C1' H1' C2 O2 N3 H3 C4 O4 C5 C6 C7 H7? C6 H6 O3' HO3' O5' HO5'", "P OP1 C5' 5 C4' H4' C3' H3' C2' H2' O2' HO2' C1' H1' C2 O2 N3 H3 C4 O4 C5 C6 C5 H5 C6 H6 O3' HO3' O5' HO5'", "P OP1 C5' 5 C4' H4' C3' H3' C2' H2' O2' HO2' C1' H1' C8 N7 C8 H8 C5 C4 C6 O6 N1 H1 C2 N3 C2 H2 O3' HO3' O5' HO5'", "P OP1 C5' 5 C4' H4' C3' H3' C2' 2 C1' H1' C8 N7 C8 H8 C5 C4 C6 O6 N1 H1 C2 N3 N2 H22@H21 O3' HO3' O5' HO5'", "P OP1 C5' 5 C4' H4' C3' H3' C2' 2 C1' H1' C2 O2 N3 C4 N4 H41@H42 C5 C6 C5 H5 C6 H6 O3' HO3' O5' HO5'", "P OP1 C5' 5 C4' H4' C3' H3' C2' 2 C1' H1' C8 N7 C8 H8 C5 C4 C6 N1 N6 H61@H62 C2 N3 C2 H2 O3' HO3' O5' HO5'", "P OP1 C5' 5 C4' H4' C3' H3' C2' 2 C1' H1' C2 O2 N3 H3 C4 O4 C5 C6 C7 H7? C6 H6 O3' HO3' O5' HO5'", "P OP1 C5' 5 C4' H4' C3' H3' C2' 2 C1' H1' C2 O2 N3 H3 C4 O4 C5 C6 C5 H5 C6 H6 O3' HO3' O5' HO5'", "P OP1 C5' 5 C4' H4' C3' H3' C2' 2 C1' H1' C8 N7 C8 H8 C5 C4 C6 O6 N1 H1 C2 N3 C2 H2 O3' HO3' O5' HO5'"]);
c$.pdbHydrogenCount =  Clazz_newIntArray(-1, [0, 6, 16, 7, 6, 6, 9, 8, 4, 9, 12, 12, 14, 10, 10, 8, 6, 8, 11, 10, 10, 3, 5, 0, 13, 13, 13, -1, 12, 12, 13, 13, 13, 14, 12, 12]);
c$.group3Count = 0;
c$.predefinedGroup1Names =  Clazz_newCharArray(-1, ['\0', 'A', 'R', 'N', 'D', 'C', 'Q', 'E', 'G', 'H', 'I', 'L', 'K', 'M', 'F', 'P', 'S', 'T', 'W', 'Y', 'V', 'A', 'G', '?', 'G', 'C', 'A', 'T', 'U', 'I', 'G', 'C', 'A', 'T', 'U', 'I', 'G', 'C', 'A', 'T', 'U', 'I']);
c$.group3NameCount = 0;
c$.predefinedGroup3Names =  Clazz_newArray(-1, ["   ", "ALA", "ARG", "ASN", "ASP", "CYS", "GLN", "GLU", "GLY", "HIS", "ILE", "LEU", "LYS", "MET", "PHE", "PRO", "SER", "THR", "TRP", "TYR", "VAL", "ASX", "GLX", "UNK", "G  ", "C  ", "A  ", "T  ", "U  ", "I  ", "DG ", "DC ", "DA ", "DT ", "DU ", "DI ", "+G ", "+C ", "+A ", "+T ", "+U ", "+I ", "HOH", "DOD", "WAT", "UREA", "PO4", "SO4", "UNL"]);
c$.specialAtomNames =  Clazz_newArray(-1, [null, "N", "CA", "C", "O", "O1", "O5'", "C5'", "C4'", "C3'", "O3'", "C2'", "C1'", "P", "OD1", "OD2", "OE1", "OE2", "SG", null, null, null, null, null, null, null, null, null, null, null, null, null, "N1", "C2", "N3", "C4", "C5", "C6", "O2", "N7", "C8", "N9", "N4", "N2", "N6", "C5M", "O6", "O4", "S4", "C7", "H1", "H2", "H3", null, null, null, null, null, null, null, null, null, null, null, "OXT", "H", "1H", "2H", "3H", "HA", "1HA", "2HA", "H5T", "O5T", "O1P", "OP1", "O2P", "OP2", "O4'", "O2'", "1H5'", "2H5'", "H4'", "H3'", "1H2'", "2H2'", "2HO'", "H1'", "H3T", "HO3'", "HO5'", "HA2", "HA3", "HA2", "H5'", "H5''", "H2'", "H2''", "HO2'", "O3P", "OP3"]);
c$.ATOMID_MAX = JM.BioResolver.specialAtomNames.length;
c$.htSpecialAtoms = null;
c$.argbsAmino =  Clazz_newIntArray(-1, [0xFFBEA06E, 0xFFC8C8C8, 0xFF145AFF, 0xFF00DCDC, 0xFFE60A0A, 0xFFE6E600, 0xFF00DCDC, 0xFFE60A0A, 0xFFEBEBEB, 0xFF8282D2, 0xFF0F820F, 0xFF0F820F, 0xFF145AFF, 0xFFE6E600, 0xFF3232AA, 0xFFDC9682, 0xFFFA9600, 0xFFFA9600, 0xFFB45AB4, 0xFF3232AA, 0xFF0F820F, 0xFFFF69B4, 0xFFFF69B4, 0xFFBEA06E]);
c$.argbsNucleic =  Clazz_newIntArray(-1, [0xFFBEA06E, 0xFFA0A0A0, 0xFF0F820F, 0xFFE6E600, 0xFFE60A0A, 0xFF145AFF, 0xFF00DCDC, 0xFF00DCDC, 0xFF0F820F, 0xFFE6E600, 0xFFE60A0A, 0xFF145AFF, 0xFF00DCDC, 0xFF00DCDC, 0xFF0F820F, 0xFFE6E600, 0xFFE60A0A, 0xFF145AFF, 0xFF00DCDC, 0xFF00DCDC]);
c$.argbsChainAtom =  Clazz_newIntArray(-1, [0xFFffffff, 0xFFC0D0FF, 0xFFB0FFB0, 0xFFFFC0C8, 0xFFFFFF80, 0xFFFFC0FF, 0xFFB0F0F0, 0xFFFFD070, 0xFFF08080, 0xFFF5DEB3, 0xFF00BFFF, 0xFFCD5C5C, 0xFF66CDAA, 0xFF9ACD32, 0xFFEE82EE, 0xFF00CED1, 0xFF00FF7F, 0xFF3CB371, 0xFF00008B, 0xFFBDB76B, 0xFF006400, 0xFF800000, 0xFF808000, 0xFF800080, 0xFF008080, 0xFFB8860B, 0xFFB22222]);
c$.argbsChainHetero =  Clazz_newIntArray(-1, [0xFFffffff, -7298865, -8335464, -3174224, -3158160, -3174193, -8339264, -3170208, -4173712, -3821949, -16734257, -4895668, -11094638, -7686870, -4296002, -16730463, -16724113, -13329567, -16777029, -5922981, -16739328, -5242880, -5197824, -5242704, -16731984, -1526253, -4050382]);
c$.argbsShapely =  Clazz_newIntArray(-1, [0xFFFF00FF, 0xFF00007C, 0xFFFF7C70, 0xFF8CFF8C, 0xFFA00042, 0xFFFFFF70, 0xFFFF4C4C, 0xFF660000, 0xFFFFFFFF, 0xFF7070FF, 0xFF004C00, 0xFF455E45, 0xFF4747B8, 0xFF534C52, 0xFFB8A042, 0xFF525252, 0xFFFF7042, 0xFFB84C00, 0xFF4F4600, 0xFF8C704C, 0xFFFF8CFF, 0xFFFF00FF, 0xFFFF00FF, 0xFFFF00FF, 0xFFFF7070, 0xFFFF8C4B, 0xFFA0A0FF, 0xFFA0FFA0, 0xFFFF8080, 0xFF80FFFF, 0xFFFF7070, 0xFFFF8C4B, 0xFFA0A0FF, 0xFFA0FFA0, 0xFFFF8080, 0xFF80FFFF, 0xFFFF7070, 0xFFFF8C4B, 0xFFA0A0FF, 0xFFA0FFA0, 0xFFFF8080, 0xFF80FFFF]);
{
{
}}});
;//5.0.1-v7 Mon Aug 17 10:07:10 MDT 2026
Clazz_declarePackage("JM");
Clazz_load(["JM.Monomer"], "JM.CarbohydrateMonomer", ["J.c.STR"], function(){
var c$ = Clazz_declareType(JM, "CarbohydrateMonomer", JM.Monomer);
Clazz_overrideConstructor(c$, 
function(){
});
c$.validateAndAllocate = Clazz_defineMethod(c$, "validateAndAllocate", 
function(chain, group3, seqcode, firstIndex, lastIndex){
return  new JM.CarbohydrateMonomer().set2(chain, group3, seqcode, firstIndex, lastIndex,  Clazz_newByteArray (1, 0));
}, "JM.Chain,~S,~N,~N,~N");
Clazz_overrideMethod(c$, "isCarbohydrate", 
function(){
return true;
});
Clazz_overrideMethod(c$, "getBioStructureType", 
function(){
return J.c.STR.CARBOHYDRATE;
});
Clazz_overrideMethod(c$, "isConnectedAfter", 
function(possiblyPreviousMonomer){
if (possiblyPreviousMonomer == null) return true;
for (var i = this.firstAtomIndex; i <= this.lastAtomIndex; i++) for (var j = possiblyPreviousMonomer.firstAtomIndex; j <= possiblyPreviousMonomer.lastAtomIndex; j++) {
var a = this.chain.model.ms.at[i];
var b = this.chain.model.ms.at[j];
if (a != null && b != null && a.getElementNumber() + b.getElementNumber() == 14 && a.distanceSquared(b) < 3.24) return true;
}

return false;
}, "JM.Monomer");
Clazz_overrideMethod(c$, "findNearestAtomIndex", 
function(x, y, closest, madBegin, madEnd){
var competitor = closest[0];
var anomericO = this.getLeadAtom();
var marBegin = (Clazz_doubleToInt(madBegin / 2));
if (marBegin < 1200) marBegin = 1200;
if (anomericO.sZ == 0) return;
var radiusBegin = Clazz_floatToInt(this.scaleToScreen(anomericO.sZ, marBegin));
if (radiusBegin < 4) radiusBegin = 4;
if (this.isCursorOnTopOf(anomericO, x, y, radiusBegin, competitor)) closest[0] = anomericO;
}, "~N,~N,~A,~N,~N");
Clazz_overrideMethod(c$, "isConnectedPrevious", 
function(){
if (this.monomerIndex <= 0) return false;
for (var i = this.firstAtomIndex; i <= this.lastAtomIndex; i++) if (this.getCrossLinkGroup(i, null, null, true, false, false)) return true;

return false;
});
});
;//5.0.1-v7 Mon Aug 17 10:07:10 MDT 2026
Clazz_declarePackage("JM");
Clazz_load(["JM.BioPolymer"], "JM.CarbohydratePolymer", null, function(){
var c$ = Clazz_declareType(JM, "CarbohydratePolymer", JM.BioPolymer);
Clazz_makeConstructor(c$, 
function(monomers){
Clazz_superConstructor(this, JM.CarbohydratePolymer, [monomers, false]);
this.type = 3;
}, "~A");
});
;//5.0.1-v7 Mon Aug 17 10:07:10 MDT 2026
Clazz_declarePackage("JM");
Clazz_load(["JM.Monomer", "J.c.STR"], "JM.PhosphorusMonomer", ["JU.Quat", "$.V3"], function(){
var c$ = Clazz_decorateAsClass(function(){
this.dssrSubType = null;
this.basepairSubType = null;
Clazz_instantialize(this, arguments);}, JM, "PhosphorusMonomer", JM.Monomer);
Clazz_prepareFields (c$, function(){
this.dssrSubType = J.c.STR.NONE;
this.basepairSubType = J.c.STR.NONE;
});
Clazz_makeConstructor(c$, 
function(){
Clazz_superConstructor (this, JM.PhosphorusMonomer, []);
});
Clazz_overrideMethod(c$, "isNucleic", 
function(){
return true;
});
c$.validateAndAllocateP = Clazz_defineMethod(c$, "validateAndAllocateP", 
function(chain, group3, seqcode, firstIndex, lastIndex, specialAtomIndexes){
return (firstIndex != lastIndex || specialAtomIndexes[13] != firstIndex ? null :  new JM.PhosphorusMonomer().set2(chain, group3, seqcode, firstIndex, lastIndex,  Clazz_newByteArray (1, 0)));
}, "JM.Chain,~S,~N,~N,~N,~A");
Clazz_overrideMethod(c$, "isDna", 
function(){
return this.isDnaByID();
});
Clazz_overrideMethod(c$, "isRna", 
function(){
return this.isRnaByID();
});
Clazz_overrideMethod(c$, "isPurine", 
function(){
return this.isPurineByID();
});
Clazz_overrideMethod(c$, "isPyrimidine", 
function(){
return this.isPyrimidineByID();
});
Clazz_overrideMethod(c$, "getStructure", 
function(){
return this.chain;
});
Clazz_overrideMethod(c$, "getBioStructureType", 
function(){
return J.c.STR.NONE;
});
Clazz_overrideMethod(c$, "isConnectedAfter", 
function(possiblyPreviousMonomer){
return this.isCA2(possiblyPreviousMonomer);
}, "JM.Monomer");
Clazz_defineMethod(c$, "isCA2", 
function(possiblyPreviousMonomer){
if (possiblyPreviousMonomer == null) return true;
var distance = this.getLeadAtom().distance(possiblyPreviousMonomer.getLeadAtom());
return distance <= JM.PhosphorusMonomer.MAX_ADJACENT_PHOSPHORUS_DISTANCE;
}, "JM.Monomer");
Clazz_overrideMethod(c$, "getQuaternion", 
function(qType){
return this.getQuaternionP();
}, "~S");
Clazz_defineMethod(c$, "getQuaternionP", 
function(){
var i = this.monomerIndex;
if (i <= 0 || i >= this.bioPolymer.monomerCount - 1) return null;
var ptP = this.bioPolymer.monomers[i].getAtomFromOffsetIndex(0);
var ptA;
var ptB;
ptA = this.bioPolymer.monomers[i + 1].getAtomFromOffsetIndex(0);
ptB = this.bioPolymer.monomers[i - 1].getAtomFromOffsetIndex(0);
if (ptP == null || ptA == null || ptB == null) return null;
var vA =  new JU.V3();
var vB =  new JU.V3();
vA.sub2(ptA, ptP);
vB.sub2(ptB, ptP);
return JU.Quat.getQuaternionFrameV(vA, vB, null, false);
});
Clazz_overrideMethod(c$, "getQuaternionFrameCenter", 
function(qType){
return this.getAtomFromOffsetIndex(0);
}, "~S");
Clazz_overrideMethod(c$, "getHelixData", 
function(tokType, qType, mStep){
return this.getHelixData2(tokType, qType, mStep);
}, "~N,~S,~N");
Clazz_overrideMethod(c$, "getBioStructureSubType", 
function(dssx){
switch (dssx) {
case 1111490651:
return this.dssrSubType;
case 1073741863:
return this.basepairSubType;
}
return J.c.STR.NONE;
}, "~N");
Clazz_overrideMethod(c$, "setDSSRStructureSubType", 
function(type){
this.dssrSubType = type;
}, "J.c.STR");
c$.MAX_ADJACENT_PHOSPHORUS_DISTANCE = 8.0;
});
;//5.0.1-v7 Mon Aug 17 10:07:10 MDT 2026
Clazz_declarePackage("JM");
(function(){
var c$ = Clazz_decorateAsClass(function(){
this.info = null;
this.g1 = null;
this.g2 = null;
Clazz_instantialize(this, arguments);}, JM, "BasePair", null);
/*LV!1824 unnec constructor*/c$.add = Clazz_defineMethod(c$, "add", 
function(info, g1, g2){
if (g1 == null || g2 == null) return null;
var bp =  new JM.BasePair();
bp.info = info;
(bp.g1 = g1).addBasePair(bp);
(bp.g2 = g2).addBasePair(bp);
return bp;
}, "java.util.Map,JM.NucleicMonomer,JM.NucleicMonomer");
Clazz_defineMethod(c$, "getPartnerAtom", 
function(g){
return (g === this.g1 ? this.g2 : this.g1).getLeadAtom().i;
}, "JM.NucleicMonomer");
Clazz_defineMethod(c$, "toString", 
function(){
return this.info.toString();
});
})();
;//5.0.1-v7 Mon Aug 17 10:07:10 MDT 2026
Clazz_declarePackage("JM");
Clazz_load(["JM.PhosphorusMonomer"], "JM.NucleicMonomer", ["JU.A4", "$.Lst", "$.M3", "$.P3", "$.Quat", "$.V3", "J.c.STR", "JM.Group", "JM.NucleicPolymer"], function(){
var c$ = Clazz_decorateAsClass(function(){
this.$isPurine = false;
this.$isPyrimidine = false;
this.hasRnaO2Prime = false;
this.baseCenter = null;
this.bps = null;
this.dssrBox = null;
this.dssrBoxHeight = 0;
this.dssrFrame = null;
Clazz_instantialize(this, arguments);}, JM, "NucleicMonomer", JM.PhosphorusMonomer);
Clazz_makeConstructor(c$, 
function(){
Clazz_superConstructor (this, JM.NucleicMonomer, []);
});
c$.validateAndAllocate = Clazz_defineMethod(c$, "validateAndAllocate", 
function(chain, group3, seqcode, firstAtomIndex, lastAtomIndex, specialAtomIndexes){
var offsets = JM.Monomer.scanForOffsets(firstAtomIndex, specialAtomIndexes, JM.NucleicMonomer.interestingNucleicAtomIDs);
if (offsets == null) return null;
if (!JM.Monomer.checkOptional(offsets, 19, firstAtomIndex, specialAtomIndexes[73])) return null;
JM.Monomer.checkOptional(offsets, 20, firstAtomIndex, specialAtomIndexes[89]);
JM.Monomer.checkOptional(offsets, 18, firstAtomIndex, specialAtomIndexes[90]);
JM.Monomer.checkOptional(offsets, 23, firstAtomIndex, specialAtomIndexes[75]);
JM.Monomer.checkOptional(offsets, 24, firstAtomIndex, specialAtomIndexes[77]);
return ( new JM.NucleicMonomer()).set4(chain, group3, seqcode, firstAtomIndex, lastAtomIndex, offsets);
}, "JM.Chain,~S,~N,~N,~N,~A");
Clazz_defineMethod(c$, "set4", 
function(chain, group3, seqcode, firstAtomIndex, lastAtomIndex, offsets){
this.set2(chain, group3, seqcode, firstAtomIndex, lastAtomIndex, offsets);
if (!JM.Monomer.have(offsets, 15)) {
offsets[0] = offsets[19];
this.setLeadAtomIndex();
}this.hasRnaO2Prime = JM.Monomer.have(offsets, 2);
this.$isPyrimidine = JM.Monomer.have(offsets, 8);
this.$isPurine = JM.Monomer.have(offsets, 9) && JM.Monomer.have(offsets, 10) && JM.Monomer.have(offsets, 11);
return this;
}, "JM.Chain,~S,~N,~N,~N,~A");
Clazz_overrideMethod(c$, "isNucleicMonomer", 
function(){
return true;
});
Clazz_overrideMethod(c$, "isDna", 
function(){
return !this.hasRnaO2Prime;
});
Clazz_overrideMethod(c$, "isRna", 
function(){
return this.hasRnaO2Prime;
});
Clazz_overrideMethod(c$, "isPurine", 
function(){
return this.$isPurine || !this.$isPyrimidine && this.isPurineByID();
});
Clazz_overrideMethod(c$, "isPyrimidine", 
function(){
return this.$isPyrimidine || !this.$isPurine && this.isPyrimidineByID();
});
Clazz_defineMethod(c$, "isGuanine", 
function(){
return JM.Monomer.have(this.offsets, 17);
});
Clazz_overrideMethod(c$, "getBioStructureType", 
function(){
return (this.hasRnaO2Prime ? J.c.STR.RNA : J.c.STR.DNA);
});
Clazz_defineMethod(c$, "getP", 
function(){
return this.getAtomFromOffsetIndex(0);
});
Clazz_defineMethod(c$, "getC1P", 
function(){
return this.getAtomFromOffsetIndex(25);
});
Clazz_defineMethod(c$, "getC2", 
function(){
return this.getAtomFromOffsetIndex(5);
});
Clazz_defineMethod(c$, "getC5", 
function(){
return this.getAtomFromOffsetIndex(3);
});
Clazz_defineMethod(c$, "getC6", 
function(){
return this.getAtomFromOffsetIndex(1);
});
Clazz_defineMethod(c$, "getC8", 
function(){
return this.getAtomFromOffsetIndex(10);
});
Clazz_defineMethod(c$, "getC4P", 
function(){
return this.getAtomFromOffsetIndex(27);
});
Clazz_defineMethod(c$, "getN1", 
function(){
return this.getAtomFromOffsetIndex(4);
});
Clazz_defineMethod(c$, "getN3", 
function(){
return this.getAtomFromOffsetIndex(6);
});
Clazz_defineMethod(c$, "getN2", 
function(){
return this.getAtomFromOffsetIndex(17);
});
Clazz_defineMethod(c$, "getN4", 
function(){
return this.getAtomFromOffsetIndex(14);
});
Clazz_defineMethod(c$, "getN6", 
function(){
return this.getAtomFromOffsetIndex(16);
});
Clazz_defineMethod(c$, "getO2", 
function(){
return this.getAtomFromOffsetIndex(8);
});
Clazz_defineMethod(c$, "getO4", 
function(){
return this.getAtomFromOffsetIndex(12);
});
Clazz_defineMethod(c$, "getO6", 
function(){
return this.getAtomFromOffsetIndex(13);
});
Clazz_overrideMethod(c$, "getTerminatorAtom", 
function(){
return this.getAtomFromOffsetIndex(JM.Monomer.have(this.offsets, 20) ? 20 : 21);
});
Clazz_defineMethod(c$, "getBaseRing6Points", 
function(pts){
this.getPoints(JM.NucleicMonomer.ring6OffsetIndexes, pts);
}, "~A");
Clazz_defineMethod(c$, "getPoints", 
function(a, pts){
for (var i = a.length; --i >= 0; ) pts[i] = this.getAtomFromOffsetIndex(a[i]);

}, "~A,~A");
Clazz_defineMethod(c$, "maybeGetBaseRing5Points", 
function(pts){
if (this.$isPurine) this.getPoints(JM.NucleicMonomer.ring5OffsetIndexes, pts);
return this.$isPurine;
}, "~A");
Clazz_defineMethod(c$, "getRiboseRing5Points", 
function(pts){
this.getPoints(JM.NucleicMonomer.riboseOffsetIndexes, pts);
}, "~A");
Clazz_overrideMethod(c$, "isConnectedAfter", 
function(possiblyPreviousMonomer){
if (possiblyPreviousMonomer == null) return true;
var myPhosphorusAtom = this.getAtomFromOffsetIndex(15);
if (myPhosphorusAtom == null) return false;
return ((possiblyPreviousMonomer).getAtomFromOffsetIndex(21).isBonded(myPhosphorusAtom) || this.isCA2(possiblyPreviousMonomer));
}, "JM.Monomer");
Clazz_overrideMethod(c$, "findNearestAtomIndex", 
function(x, y, closest, madBegin, madEnd){
var competitor = closest[0];
var lead = this.getLeadAtom();
var o5prime = this.getAtomFromOffsetIndex(19);
var c3prime = this.getAtomFromOffsetIndex(22);
var mar = (Clazz_doubleToInt(madBegin / 2));
if (mar < 1900) mar = 1900;
var radius = Clazz_floatToInt(this.scaleToScreen(lead.sZ, mar));
if (radius < 4) radius = 4;
if (this.isCursorOnTopOf(lead, x, y, radius, competitor) || this.isCursorOnTopOf(o5prime, x, y, radius, competitor) || this.isCursorOnTopOf(c3prime, x, y, radius, competitor)) closest[0] = lead;
}, "~N,~N,~A,~N,~N");
Clazz_defineMethod(c$, "setRingsVisible", 
function(isVisible){
for (var i = 6; --i >= 0; ) this.getAtomFromOffsetIndex(JM.NucleicMonomer.ring6OffsetIndexes[i]).setShapeVisibility(32768, isVisible);

if (this.$isPurine) for (var i = 4; --i >= 1; ) this.getAtomFromOffsetIndex(JM.NucleicMonomer.ring5OffsetIndexes[i]).setShapeVisibility(32768, isVisible);

}, "~B");
Clazz_defineMethod(c$, "setRingsClickable", 
function(){
for (var i = 6; --i >= 0; ) this.getAtomFromOffsetIndex(JM.NucleicMonomer.ring6OffsetIndexes[i]).setClickable(32768);

if (this.$isPurine) for (var i = 4; --i >= 1; ) this.getAtomFromOffsetIndex(JM.NucleicMonomer.ring5OffsetIndexes[i]).setClickable(32768);

});
Clazz_defineMethod(c$, "getN0", 
function(){
return (this.getAtomFromOffsetIndex(this.$isPurine ? 11 : 4));
});
Clazz_overrideMethod(c$, "getHelixData", 
function(tokType, qType, mStep){
return this.getHelixData2(tokType, qType, mStep);
}, "~N,~S,~N");
Clazz_overrideMethod(c$, "getQuaternionFrameCenter", 
function(qType){
switch ((qType).charCodeAt(0)) {
case 120:
case 97:
case 98:
case 112:
return this.getP();
case 99:
if (this.baseCenter == null) {
var n = 0;
this.baseCenter =  new JU.P3();
for (var i = 0; i < JM.NucleicMonomer.heavyAtomIndexes.length; i++) {
var a = this.getAtomFromOffsetIndex(JM.NucleicMonomer.heavyAtomIndexes[i]);
if (a == null) continue;
this.baseCenter.add(a);
n++;
}
this.baseCenter.scale(1 / n);
}return this.baseCenter;
case 110:
default:
return this.getN0();
}
}, "~S");
Clazz_overrideMethod(c$, "getQuaternion", 
function(qType){
if (this.bioPolymer == null) return null;
var ptA = null;
var ptB = null;
var ptNorP;
var yBased = false;
var reverseY = false;
switch ((qType).charCodeAt(0)) {
case 97:
ptNorP = this.getP();
if (this.monomerIndex == 0 || ptNorP == null) return null;
yBased = true;
ptA = (this.bioPolymer.monomers[this.monomerIndex - 1]).getC4P();
ptB = this.getC4P();
break;
case 120:
ptNorP = this.getP();
if (this.monomerIndex == this.bioPolymer.monomerCount - 1 || ptNorP == null) return null;
ptA = (this.bioPolymer.monomers[this.monomerIndex + 1]).getP();
ptB = this.getC4P();
break;
case 98:
return this.getQuaternionP();
case 99:
case 110:
ptNorP = this.getN0();
if (ptNorP == null) return null;
yBased = true;
reverseY = true;
ptA = this.getAtomFromOffsetIndex(5);
ptB = this.getAtomFromOffsetIndex(25);
break;
case 112:
ptNorP = this.getP();
if (ptNorP == null) return null;
var p1 = this.getAtomFromOffsetIndex(23);
var p2 = this.getAtomFromOffsetIndex(24);
var bonds = ptNorP.bonds;
if (bonds == null) return null;
var g = ptNorP.group;
for (var i = 0; i < bonds.length; i++) {
var atom = bonds[i].getOtherAtom(ptNorP);
if (p1 != null && atom.i == p1.i) continue;
if (p2 != null && atom.i == p2.i) continue;
if (atom.group === g) ptB = atom;
 else ptA = atom;
}
break;
case 113:
return null;
default:
ptNorP = this.getN0();
if (ptNorP == null) return null;
if (this.$isPurine) {
ptA = this.getAtomFromOffsetIndex(5);
ptB = this.getAtomFromOffsetIndex(9);
} else {
ptA = this.getAtomFromOffsetIndex(6);
ptB = this.getAtomFromOffsetIndex(1);
}break;
}
if (ptA == null || ptB == null) return null;
var vA = JU.V3.newVsub(ptA, ptNorP);
var vB = JU.V3.newVsub(ptB, ptNorP);
if (reverseY) vB.scale(-1);
return JU.Quat.getQuaternionFrameV(vA, vB, null, yBased);
}, "~S");
Clazz_overrideMethod(c$, "isCrossLinked", 
function(g){
if (!(Clazz_instanceOf(g,"JM.NucleicMonomer")) || this.$isPurine == g.isPurine()) return false;
var otherNucleotide = (this.$isPurine ? g : this);
var myNucleotide = (this.$isPurine ? this : g);
var myN1 = myNucleotide.getN1();
var otherN3 = otherNucleotide.getN3();
return (myN1.isBonded(otherN3));
}, "JM.Group");
Clazz_overrideMethod(c$, "getCrossLinkVector", 
function(vReturn, crosslinkCovalent, crosslinkHBond){
if (!crosslinkHBond) return false;
var N = (this.$isPurine ? this.getN1() : this.getN3());
var bonds = N.bonds;
if (bonds == null) return false;
for (var i = 0; i < bonds.length; i++) {
if (bonds[i].isHydrogen()) {
var N2 = bonds[i].getOtherAtom(N);
var g = N2.group;
if (!(Clazz_instanceOf(g,"JM.NucleicMonomer"))) continue;
var m = g;
if ((this.$isPurine ? m.getN3() : m.getN1()) === N2) {
if (vReturn == null) return true;
vReturn.addLast(Integer.$valueOf(N.i));
vReturn.addLast(Integer.$valueOf(N2.i));
vReturn.addLast(Integer.$valueOf(m.leadAtomIndex));
}}}
return vReturn != null && vReturn.size() > 0;
}, "JU.Lst,~B,~B");
Clazz_defineMethod(c$, "getEdgePoints", 
function(pts){
pts[0] = this.getLeadAtom();
pts[1] = this.getC4P();
pts[2] = pts[5] = this.getC1P();
switch ((this.getGroup1()).charCodeAt(0)) {
case 67:
pts[3] = this.getO2();
pts[4] = this.getN4();
return true;
case 65:
pts[3] = this.getC2();
pts[4] = this.getN6();
return true;
case 71:
case 73:
pts[3] = this.getC2();
pts[4] = this.getO6();
return true;
case 84:
case 85:
pts[3] = this.getO2();
pts[4] = this.getO4();
return true;
default:
return false;
}
}, "~A");
Clazz_defineMethod(c$, "addBasePair", 
function(bp){
if (this.bps == null) this.bps =  new JU.Lst();
this.bps.addLast(bp);
}, "JM.BasePair");
Clazz_defineMethod(c$, "setGroup1", 
function(g){
if (this.group1 == '\0') this.group1 = g;
}, "~S");
Clazz_defineMethod(c$, "getBasePairs", 
function(){
if (this.bioPolymer != null && !(this.bioPolymer).isDssrSet) this.bioPolymer.model.ms.vwr.getAnnotationParser(1111490587).getBasePairs(this.bioPolymer.model.ms.vwr, this.bioPolymer.model.modelIndex);
return this.bps;
});
Clazz_overrideMethod(c$, "getGroup1b", 
function(){
var g3 = JM.Group.group3Names[this.groupID];
var g1 = (JM.NucleicPolymer.htGroup1 == null ? null : JM.NucleicPolymer.htGroup1.get(g3));
return (g1 == null ? Character.toLowerCase(g3.charAt(g3.length - 1)) : g1.charAt(0));
});
Clazz_defineMethod(c$, "getDSSRFrame", 
function(vwr){
if (this.dssrFrame != null) return this.dssrFrame;
if (this.dssrNT != null) return this.dssrFrame = vwr.getAnnotationParser(1111490587).getDSSRFrame(this.dssrNT);
var oxyz = this.dssrFrame =  new Array(4);
for (var i = 4; --i >= 0; ) oxyz[i] =  new JU.P3();

if (this.isPurine()) {
var v85 = JU.P3.newP(this.getC5());
v85.sub(this.getC8());
v85.normalize();
oxyz[2].setT(v85);
oxyz[2].scale(-1);
oxyz[0].scaleAdd2(4.9, v85, this.getC8());
var v89 = JU.P3.newP(this.getN0());
v89.sub(this.getC8());
oxyz[3].cross(v89, v85);
oxyz[3].normalize();
} else {
var v61 = JU.P3.newP(this.getN0());
v61.sub(this.getC6());
var v65 = JU.P3.newP(this.getC5());
v65.sub(this.getC6());
oxyz[3].cross(v61, v65);
oxyz[3].normalize();
oxyz[2].setT(v61);
oxyz[2].normalize();
var aa = JU.A4.new4(oxyz[3].x, oxyz[3].y, oxyz[3].z, (1.1623892818282233));
var m3 =  new JU.M3();
m3.setAA(aa);
m3.rotate(oxyz[2]);
oxyz[0].scaleAdd2(5.1, oxyz[2], this.getC6());
oxyz[2].scale(-1);
}oxyz[1].cross(oxyz[2], oxyz[3]);
return this.dssrFrame;
}, "JV.Viewer");
c$.interestingNucleicAtomIDs =  Clazz_newByteArray(-1, [-14, 37, -80, 36, 32, 33, 34, 35, -39, -40, -41, -42, -48, -47, -43, -14, -45, -44, -73, -7, -89, 10, 9, -75, -77, -13, -12, -9, -79, -8]);
c$.ring6OffsetIndexes =  Clazz_newByteArray(-1, [3, 1, 4, 5, 6, 7]);
c$.ring5OffsetIndexes =  Clazz_newByteArray(-1, [3, 9, 10, 11, 7]);
c$.riboseOffsetIndexes =  Clazz_newByteArray(-1, [25, 26, 22, 27, 28, 21, 29, 19, 0]);
c$.heavyAtomIndexes =  Clazz_newByteArray(-1, [3, 1, 4, 5, 6, 7, 11, 10, 9, 16, 14, 8, 12, 17, 13]);
});
;//5.0.1-v7 Mon Aug 17 10:07:10 MDT 2026
Clazz_declarePackage("JM");
Clazz_load(["JM.PhosphorusPolymer"], "JM.NucleicPolymer", ["JU.Measure", "$.P4", "$.V3", "JM.HBond"], function(){
var c$ = Clazz_decorateAsClass(function(){
this.isDssrSet = false;
Clazz_instantialize(this, arguments);}, JM, "NucleicPolymer", JM.PhosphorusPolymer);
Clazz_makeConstructor(c$, 
function(monomers){
Clazz_superConstructor(this, JM.NucleicPolymer, [monomers]);
this.type = 2;
this.hasWingPoints = true;
}, "~A");
Clazz_defineMethod(c$, "getNucleicPhosphorusAtom", 
function(monomerIndex){
return this.monomers[monomerIndex].getLeadAtom();
}, "~N");
Clazz_overrideMethod(c$, "calcEtaThetaAngles", 
function(){
var eta = NaN;
for (var i = 0; i < this.monomerCount - 2; ++i) {
var m1 = this.monomers[i];
var m2 = this.monomers[i + 1];
var p1 = m1.getP();
var c41 = m1.getC4P();
var p2 = m2.getP();
var c42 = m2.getC4P();
if (i > 0) {
var m0 = this.monomers[i - 1];
var c40 = m0.getC4P();
eta = JU.Measure.computeTorsion(c40, p1, c41, p2, true);
}var theta = JU.Measure.computeTorsion(p1, c41, p2, c42, true);
if (eta < 0) eta += 360;
if (theta < 0) theta += 360;
m1.setGroupParameter(1111490565, eta);
m1.setGroupParameter(1111490576, theta);
}
return true;
});
Clazz_overrideMethod(c$, "calcRasmolHydrogenBonds", 
function(polymer, bsA, bsB, vAtoms, nMaxPerResidue, min, checkDistances, dsspIgnoreHydrogens){
var other = polymer;
var vNorm =  new JU.V3();
var vAB =  new JU.V3();
for (var i = this.monomerCount; --i >= 0; ) {
var myNucleotide = this.monomers[i];
if (!myNucleotide.isPurine()) continue;
var myN3 = myNucleotide.getN3();
var isInA = bsA.get(myN3.i);
if (!isInA && !bsB.get(myN3.i)) continue;
var myN1 = myNucleotide.getN1();
var myN9 = myNucleotide.getN0();
var plane = JU.Measure.getPlaneThroughPoints(myN3, myN1, myN9, vNorm, vAB,  new JU.P4());
var bestN3 = null;
var minDist2 = 25;
var bestNucleotide = null;
for (var j = other.monomerCount; --j >= 0; ) {
var otherNucleotide = other.monomers[j];
if (!otherNucleotide.$isPyrimidine) continue;
var otherN3 = otherNucleotide.getN3();
if (isInA ? !bsB.get(otherN3.i) : !bsA.get(otherN3.i)) continue;
var otherN1 = otherNucleotide.getN0();
var dist2 = myN1.distanceSquared(otherN3);
if (dist2 < minDist2 && myN9.distanceSquared(otherN1) > 50 && Math.abs(JU.Measure.distanceToPlane(plane, otherN3)) < 1) {
bestNucleotide = otherNucleotide;
bestN3 = otherN3;
minDist2 = dist2;
}}
var n = 0;
if (bestN3 != null) {
n += JM.NucleicPolymer.addHydrogenBond(vAtoms, myN1, bestN3);
if (n >= nMaxPerResidue) continue;
if (myNucleotide.isGuanine()) {
n += JM.NucleicPolymer.addHydrogenBond(vAtoms, myNucleotide.getN2(), bestNucleotide.getO2());
if (n >= nMaxPerResidue) continue;
n += JM.NucleicPolymer.addHydrogenBond(vAtoms, myNucleotide.getO6(), bestNucleotide.getN4());
if (n >= nMaxPerResidue) continue;
} else {
n += JM.NucleicPolymer.addHydrogenBond(vAtoms, myNucleotide.getN6(), bestNucleotide.getO4());
}}}
}, "JM.BioPolymer,JU.BS,JU.BS,JU.Lst,~N,~A,~B,~B");
c$.addHydrogenBond = Clazz_defineMethod(c$, "addHydrogenBond", 
function(vAtoms, atom1, atom2){
if (atom1 == null || atom2 == null) return 0;
vAtoms.addLast( new JM.HBond(atom1, atom2, 18432, 1, 0, 0));
return 1;
}, "JU.Lst,JM.Atom,JM.Atom");
c$.htGroup1 = null;
});
;//5.0.1-v7 Mon Aug 17 10:07:10 MDT 2026
Clazz_declarePackage("JM");
(function(){
var c$ = Clazz_decorateAsClass(function(){
this.info = null;
this.g1 = null;
this.g2 = null;
Clazz_instantialize(this, arguments);}, JM, "BasePair", null);
/*LV!1824 unnec constructor*/c$.add = Clazz_defineMethod(c$, "add", 
function(info, g1, g2){
if (g1 == null || g2 == null) return null;
var bp =  new JM.BasePair();
bp.info = info;
(bp.g1 = g1).addBasePair(bp);
(bp.g2 = g2).addBasePair(bp);
return bp;
}, "java.util.Map,JM.NucleicMonomer,JM.NucleicMonomer");
Clazz_defineMethod(c$, "getPartnerAtom", 
function(g){
return (g === this.g1 ? this.g2 : this.g1).getLeadAtom().i;
}, "JM.NucleicMonomer");
Clazz_defineMethod(c$, "toString", 
function(){
return this.info.toString();
});
})();
;//5.0.1-v7 Mon Aug 17 10:07:10 MDT 2026
Clazz_declarePackage("JM");
Clazz_load(["JM.BioPolymer"], "JM.PhosphorusPolymer", null, function(){
var c$ = Clazz_declareType(JM, "PhosphorusPolymer", JM.BioPolymer);
Clazz_makeConstructor(c$, 
function(monomers){
Clazz_superConstructor(this, JM.PhosphorusPolymer, [monomers, true]);
}, "~A");
});
;//5.0.1-v7 Mon Aug 17 10:07:10 MDT 2026
Clazz_declarePackage("J.dssx");
Clazz_load(null, "J.dssx.Bridge", ["JU.Escape"], function(){
var c$ = Clazz_decorateAsClass(function(){
this.a = null;
this.b = null;
this.ladder = null;
this.isAntiparallel = false;
Clazz_instantialize(this, arguments);}, J.dssx, "Bridge", null);
Clazz_makeConstructor(c$, 
function(a, b, htLadders){
this.a = a;
this.b = b;
this.ladder =  Clazz_newIntArray (2, 2, 0);
this.ladder[0][0] = this.ladder[0][1] = Math.min(a.i, b.i);
this.ladder[1][0] = this.ladder[1][1] = Math.max(a.i, b.i);
this.addLadder(htLadders);
}, "JM.Atom,JM.Atom,java.util.Map");
Clazz_defineMethod(c$, "addBridge", 
function(bridge, htLadders){
if (bridge.isAntiparallel != this.isAntiparallel || !this.canAdd(bridge) || !bridge.canAdd(this)) return false;
this.extendLadder(bridge.ladder[0][0], bridge.ladder[1][0]);
this.extendLadder(bridge.ladder[0][1], bridge.ladder[1][1]);
bridge.ladder = this.ladder;
if (bridge.ladder !== this.ladder) {
htLadders.remove(bridge.ladder);
this.addLadder(htLadders);
}return true;
}, "J.dssx.Bridge,java.util.Map");
Clazz_defineMethod(c$, "addLadder", 
function(htLadders){
htLadders.put(this.ladder, (this.isAntiparallel ? Boolean.TRUE : Boolean.FALSE));
}, "java.util.Map");
Clazz_defineMethod(c$, "canAdd", 
function(bridge){
var index1 = bridge.a.i;
var index2 = bridge.b.i;
return (this.isAntiparallel ? (index1 >= this.ladder[0][1] && index2 <= this.ladder[1][0] || index1 <= this.ladder[0][0] && index2 >= this.ladder[1][1]) : (index1 <= this.ladder[0][0] && index2 <= this.ladder[1][0] || index1 >= this.ladder[0][1] && index2 >= this.ladder[1][1]));
}, "J.dssx.Bridge");
Clazz_defineMethod(c$, "extendLadder", 
function(index1, index2){
if (this.ladder[0][0] > index1) this.ladder[0][0] = index1;
if (this.ladder[0][1] < index1) this.ladder[0][1] = index1;
if (this.ladder[1][0] > index2) this.ladder[1][0] = index2;
if (this.ladder[1][1] < index2) this.ladder[1][1] = index2;
}, "~N,~N");
Clazz_overrideMethod(c$, "toString", 
function(){
return (this.isAntiparallel ? "a " : "p ") + this.a + " - " + this.b + "\t" + JU.Escape.e(this.ladder);
});
});
;//5.0.1-v7 Mon Aug 17 10:07:10 MDT 2026
Clazz_declarePackage("J.dssx");
Clazz_load(null, "J.dssx.DSSP", ["java.util.Hashtable", "JU.AU", "$.BS", "$.Lst", "$.PT", "$.SB", "J.c.STR", "J.dssx.Bridge", "J.i18n.GT", "JM.HBond", "JU.Escape", "$.Logger", "JV.Viewer"], function(){
var c$ = Clazz_decorateAsClass(function(){
this.bioPolymers = null;
this.vHBonds = null;
this.done = null;
this.doReport = false;
this.dsspIgnoreHydrogens = false;
this.setStructure = false;
this.labels = null;
this.bsBad = null;
this.bioPolymerCount = 0;
this.htBridges = null;
this.htLadders = null;
this.bridgesA = null;
this.bridgesP = null;
this.isDSSP2 = false;
this.sheetOffsets = null;
Clazz_instantialize(this, arguments);}, J.dssx, "DSSP", null);
Clazz_prepareFields (c$, function(){
this.sheetOffsets =  Clazz_newArray(-1, [ Clazz_newIntArray(-1, [0, -1, 1, 0, 1, 0, 0, -1]),  Clazz_newIntArray(-1, [0, 0, 0, 0, 1, -1, 1, -1])]);
});
Clazz_makeConstructor(c$, 
function(){
});
Clazz_defineMethod(c$, "calculateDssp", 
function(objBioPolymers, bioPolymerCount, objVHBonds, doReport, dsspIgnoreHydrogens, setStructure, version){
this.bioPolymers = objBioPolymers;
this.bioPolymerCount = bioPolymerCount;
this.vHBonds = objVHBonds;
this.doReport = doReport;
this.dsspIgnoreHydrogens = dsspIgnoreHydrogens;
this.setStructure = setStructure;
this.isDSSP2 = (version > 1);
var bsAmino =  new JU.BS();
for (var i = 0; i < bioPolymerCount; i++) if (Clazz_instanceOf(this.bioPolymers[i],"JM.AminoPolymer")) bsAmino.set(i);

if (bsAmino.isEmpty()) return "";
var m = this.bioPolymers[0].model;
var sb =  new JU.SB();
sb.append("Jmol ").append(JV.Viewer.getJmolVersion()).append(" DSSP analysis for model ").append(m.ms.getModelNumberDotted(m.modelIndex)).append(" - ").append(m.ms.getModelTitle(m.modelIndex)).append("\n");
if (m.modelIndex == 0) sb.append("\nW. Kabsch and C. Sander, Biopolymers, vol 22, 1983, pp 2577-2637\n\nWe thank Wolfgang Kabsch and Chris Sander for writing the DSSP software,\nand we thank the CMBI for maintaining it to the extent that it was easy to\nre-engineer in Java for our purposes. \n\nSecond generation DSSP 2.0 is ").append(this.isDSSP2 ? "" : "NOT ").append("used in this analysis. See Int. J. Mol. Sci. 2014, 15, 7841-7864; doi:10.3390/ijms15057841.\n");
if (setStructure && m.modelIndex == 0) sb.append("\nAll bioshapes have been deleted and must be regenerated.\n");
if (m.altLocCount > 0) sb.append("\nNote: This model contains alternative locations. Use  'CONFIGURATION 1' to be consistent with CMBI DSSP.\n");
this.labels =  Clazz_newCharArray (bioPolymerCount, '\0');
this.done =  new Array(bioPolymerCount);
this.bsBad =  new JU.BS();
var haveWarned = false;
for (var i = bsAmino.nextSetBit(0); i >= 0; i = bsAmino.nextSetBit(i + 1)) {
var ap = this.bioPolymers[i];
if (!haveWarned && (ap.monomers[0]).getExplicitNH() != null) {
if (dsspIgnoreHydrogens) sb.append(J.i18n.GT.o(J.i18n.GT.$("NOTE: Backbone amide hydrogen positions are present and will be ignored. Their positions will be approximated, as in standard DSSP analysis.\nUse {0} to not use this approximation.\n\n"), "SET dsspCalculateHydrogenAlways FALSE"));
 else sb.append(J.i18n.GT.o(J.i18n.GT.$("NOTE: Backbone amide hydrogen positions are present and will be used. Results may differ significantly from standard DSSP analysis.\nUse {0} to ignore these hydrogen positions.\n\n"), "SET dsspCalculateHydrogenAlways TRUE"));
haveWarned = true;
}ap.recalculateLeadMidpointsAndWingVectors();
var n = ap.monomerCount;
this.labels[i] =  Clazz_newCharArray (n, '\0');
this.done[i] =  new JU.BS();
for (var j = 0; j < n; j++) if ((ap.monomers[j]).getCarbonylOxygenAtom() == null) this.bsBad.set(ap.monomers[j].leadAtomIndex);

}
var min = this.getDualHydrogenBondArray();
this.bridgesA =  new JU.Lst();
this.bridgesP =  new JU.Lst();
this.htBridges =  new java.util.Hashtable();
this.htLadders =  new java.util.Hashtable();
this.getBridges(min);
this.getSheetStructures();
var reports =  new Array(bioPolymerCount);
for (var i = bsAmino.nextSetBit(0); i >= 0; i = bsAmino.nextSetBit(i + 1)) if (min[i] != null) reports[i] = this.findHelixes(i, min[i]);

if (doReport) {
var sbSummary =  new JU.SB();
sb.append("\n------------------------------\n");
for (var i = bsAmino.nextSetBit(0); i >= 0; i = bsAmino.nextSetBit(i + 1)) if (this.labels[i] != null) {
var ap = this.bioPolymers[i];
sbSummary.append(this.dumpSummary(ap, this.labels[i]));
sb.append(reports[i]).append(this.dumpTags(ap, "$.1: " + String.valueOf(this.labels[i]), this.bsBad, 2));
}
if (this.bsBad.nextSetBit(0) >= 0) sb.append("\nNOTE: '!' indicates a residue that is missing a backbone carbonyl oxygen atom.\n");
sb.append("\n").append("SUMMARY:" + sbSummary);
}return sb.toString();
}, "~A,~N,~O,~B,~B,~B,~N");
Clazz_defineMethod(c$, "getDualHydrogenBondArray", 
function(){
var min = JU.AU.newInt4(this.bioPolymerCount);
for (var i = 0; i < this.bioPolymerCount; i++) {
if (!(Clazz_instanceOf(this.bioPolymers[i],"JM.AminoPolymer"))) continue;
var n = this.bioPolymers[i].monomerCount;
min[i] =  Clazz_newIntArray (n, 2, 3, 0);
for (var j = 0; j < n; ++j) {
min[i][j][0][1] = min[i][j][1][1] = -2147483648;
min[i][j][0][2] = min[i][j][1][2] = 0;
}
}
for (var i = 0; i < this.bioPolymerCount; i++) if (min[i] != null) for (var j = 0; j < this.bioPolymerCount; j++) if (min[j] != null) this.bioPolymers[i].calcRasmolHydrogenBonds(this.bioPolymers[j], null, null, null, 2, min[i], false, this.dsspIgnoreHydrogens);


return min;
});
Clazz_defineMethod(c$, "getBridges", 
function(min){
var atoms = this.bioPolymers[0].model.ms.at;
var bridge = null;
var htTemp =  new java.util.Hashtable();
for (var p1 = 0; p1 < min.length; p1++) if (Clazz_instanceOf(this.bioPolymers[p1],"JM.AminoPolymer")) {
var ap1 = (this.bioPolymers[p1]);
var n = min[p1].length - 1;
for (var a = 1; a < n; a++) {
var ia = ap1.monomers[a].leadAtomIndex;
if (this.bsBad.get(ia)) continue;
for (var p2 = p1; p2 < min.length; p2++) if (Clazz_instanceOf(this.bioPolymers[p2],"JM.AminoPolymer")) for (var b = (p1 == p2 ? a + 3 : 1); b < min[p2].length - 1; b++) {
var ap2 = this.bioPolymers[p2];
var ib = ap2.monomers[b].leadAtomIndex;
if (this.bsBad.get(ib)) continue;
if ((bridge = this.getBridge(min, p1, a, p2, b, this.bridgesP, atoms[ia], atoms[ib], ap1, ap2, htTemp, false)) != null) {
} else if ((bridge = this.getBridge(min, p1, a, p2, b, this.bridgesA, atoms[ia], atoms[ib], ap1, ap2, htTemp, true)) != null) {
bridge.isAntiparallel = true;
} else {
continue;
}if (JU.Logger.debugging) JU.Logger.debug("Bridge found " + bridge);
this.done[p1].set(a);
this.done[p2].set(b);
this.htBridges.put(ia + "-" + ib, bridge);
}

}
}
}, "~A");
Clazz_defineMethod(c$, "getBridge", 
function(min, p1, a, p2, b, bridges, atom1, atom2, ap1, ap2, htTemp, isAntiparallel){
var b1 = null;
var b2 = null;
var ipt = 0;
var offsets = (isAntiparallel ? this.sheetOffsets[1] : this.sheetOffsets[0]);
if ((b1 = this.isHbonded(a + offsets[0], b + offsets[1], p1, p2, min)) != null && (b2 = this.isHbonded(b + offsets[2], a + offsets[3], p2, p1, min)) != null || (b1 = this.isHbonded(a + offsets[ipt = 4], b + offsets[5], p1, p2, min)) != null && (b2 = this.isHbonded(b + offsets[6], a + offsets[7], p2, p1, min)) != null) {
var bridge =  new J.dssx.Bridge(atom1, atom2, this.htLadders);
bridges.addLast(bridge);
if (this.vHBonds != null) {
var type = (isAntiparallel ? 14336 : 6144);
this.addHbond(ap1.monomers[a + offsets[ipt]], ap2.monomers[b + offsets[++ipt]], b1[2], type, htTemp);
this.addHbond(ap2.monomers[b + offsets[++ipt]], ap1.monomers[a + offsets[++ipt]], b2[2], type, htTemp);
}return bridge;
}return null;
}, "~A,~N,~N,~N,~N,JU.Lst,JM.Atom,JM.Atom,JM.AminoPolymer,JM.AminoPolymer,java.util.Map,~B");
Clazz_defineMethod(c$, "addHbond", 
function(donor, acceptor, iEnergy, type, htTemp){
var nitrogen = (donor).getNitrogenAtom();
var oxygen = (acceptor).getCarbonylOxygenAtom();
if (htTemp != null) {
var key = nitrogen.i + " " + oxygen.i;
if (htTemp.containsKey(key)) return;
htTemp.put(key, Boolean.TRUE);
}this.vHBonds.addLast( new JM.HBond(nitrogen, oxygen, type, 1, 0, iEnergy / 1000));
}, "JM.Monomer,JM.Monomer,~N,~N,java.util.Map");
Clazz_defineMethod(c$, "getSheetStructures", 
function(){
if (this.bridgesA.size() == 0 && this.bridgesP.size() == 0) return;
this.createLadders(this.bridgesA, true);
this.createLadders(this.bridgesP, false);
var bsEEE =  new JU.BS();
var bsB =  new JU.BS();
for (var ladder, $ladder = this.htLadders.keySet().iterator (); $ladder.hasNext()&& ((ladder = $ladder.next ()) || true);) {
if (ladder[0][0] == ladder[0][1] && ladder[1][0] == ladder[1][1]) {
bsB.set(ladder[0][0]);
bsB.set(ladder[1][0]);
} else {
bsEEE.setBits(ladder[0][0], ladder[0][1] + 1);
bsEEE.setBits(ladder[1][0], ladder[1][1] + 1);
}}
var bsSheet =  new JU.BS();
var bsBridge =  new JU.BS();
for (var i = this.bioPolymers.length; --i >= 0; ) {
if (!(Clazz_instanceOf(this.bioPolymers[i],"JM.AminoPolymer"))) continue;
bsSheet.clearAll();
bsBridge.clearAll();
var ap = this.bioPolymers[i];
for (var iStart = 0; iStart < ap.monomerCount; ) {
var index = ap.monomers[iStart].leadAtomIndex;
if (bsEEE.get(index)) {
var iEnd = iStart + 1;
while (iEnd < ap.monomerCount && bsEEE.get(ap.monomers[iEnd].leadAtomIndex)) iEnd++;

bsSheet.setBits(iStart, iEnd);
iStart = iEnd;
} else {
if (bsB.get(index)) bsBridge.set(iStart);
++iStart;
}}
if (this.doReport) {
this.setTag(this.labels[i], bsBridge, 'B');
this.setTag(this.labels[i], bsSheet, 'E');
}if (this.setStructure) {
ap.setStructureBS(0, 3, J.c.STR.SHEET, bsSheet, false);
}this.done[i].or(bsSheet);
this.done[i].or(bsBridge);
}
});
Clazz_defineMethod(c$, "createLadders", 
function(bridges, isAntiparallel){
var dir = (isAntiparallel ? -1 : 1);
var n = bridges.size();
for (var i = 0; i < n; i++) this.checkBridge(bridges.get(i), isAntiparallel, 1, dir);

for (var i = 0; i < n; i++) this.checkBulge(bridges.get(i), isAntiparallel, 1);

}, "JU.Lst,~B");
Clazz_defineMethod(c$, "checkBridge", 
function(bridge, isAntiparallel, n1, n2){
var b = this.htBridges.get(bridge.a.getOffsetResidueAtom("\0", n1) + "-" + bridge.b.getOffsetResidueAtom("\0", n2));
return (b != null && bridge.addBridge(b, this.htLadders));
}, "J.dssx.Bridge,~B,~N,~N");
Clazz_defineMethod(c$, "checkBulge", 
function(bridge, isAntiparallel, dir){
var dir1 = (isAntiparallel ? -1 : 1);
for (var i = 0; i < 3; i++) for (var j = (i == 0 ? 1 : 0); j < 6; j++) {
this.checkBridge(bridge, isAntiparallel, i * dir, j * dir1);
if (j > i) this.checkBridge(bridge, isAntiparallel, j * dir, i * dir1);
}

}, "J.dssx.Bridge,~B,~N");
Clazz_defineMethod(c$, "dumpSummary", 
function(ap, labels){
var a = ap.monomers[0].getLeadAtom();
var id = a.getChainID();
var prefix = (id == 0 ? "" : a.getChainIDStr() + ":");
var sb =  new JU.SB();
var lastChar = '\u0000';
var insCode1 = '\u0000';
var insCode2 = '\u0000';
var firstResno = -1;
var lastResno = -1;
var n = ap.monomerCount;
var m = ap.monomers;
for (var i = 0; i <= n; i++) {
if (i == n || labels[i] != lastChar) {
if (lastChar != '\0') sb.appendC('\n').appendC(lastChar).append(" : ").append(prefix).appendI(firstResno).append(insCode1 == '\0' ? "" : String.valueOf(insCode1)).append("_").append(prefix).appendI(lastResno).append(insCode2 == '\0' ? "" : String.valueOf(insCode2));
if (i == n) break;
lastChar = labels[i];
firstResno = m[i].getResno();
insCode1 = m[i].getInsertionCode();
}lastResno = m[i].getResno();
insCode2 = m[i].getInsertionCode();
}
return sb.toString();
}, "JM.AminoPolymer,~A");
Clazz_defineMethod(c$, "dumpTags", 
function(ap, lines, bsBad, mode){
var prefix = ap.monomers[0].getLeadAtom().getChainID() + "." + (ap.bioPolymerIndexInModel + 1);
lines = JU.PT.rep(lines, "$", prefix);
var iFirst = ap.monomers[0].getResno();
var pre = "\n" + prefix;
var sb =  new JU.SB();
var sb0 =  new JU.SB().append(pre + ".8: ");
var sb1 =  new JU.SB().append(pre + ".7: ");
var sb2 =  new JU.SB().append(pre + ".6: ");
var sb3 =  new JU.SB().append(pre + ".0: ");
var i = iFirst;
var n = ap.monomerCount;
for (var ii = 0; ii < n; ii++) {
i = ap.monomers[ii].getResno();
sb0.append(i % 100 == 0 ? "" + ((Clazz_doubleToInt(i / 100)) % 100) : " ");
sb1.append(i % 10 == 0 ? "" + ((Clazz_doubleToInt(i / 10)) % 10) : " ");
sb2.appendI(i % 10);
sb3.appendC(bsBad.get(ap.monomers[ii].leadAtomIndex) ? '!' : ap.monomers[ii].getGroup1());
}
if ((mode & 1) == 1) sb.appendSB(sb0).appendSB(sb1).appendSB(sb2);
sb.append("\n");
sb.append(lines);
if ((mode & 2) == 2) {
sb.appendSB(sb3);
sb.append("\n\n");
}return sb.toString().$replace('\0', '.');
}, "JM.AminoPolymer,~S,JU.BS,~N");
Clazz_defineMethod(c$, "isHbonded", 
function(indexDonor, indexAcceptor, pDonor, pAcceptor, min){
if (indexDonor < 0 || indexAcceptor < 0) return null;
var min1 = min[pDonor];
var min2 = min[pAcceptor];
if (indexDonor >= min1.length || indexAcceptor >= min2.length) return null;
return (min1[indexDonor][0][0] == pAcceptor && min1[indexDonor][0][1] == indexAcceptor ? min1[indexDonor][0] : min1[indexDonor][1][0] == pAcceptor && min1[indexDonor][1][1] == indexAcceptor ? min1[indexDonor][1] : null);
}, "~N,~N,~N,~N,~A");
Clazz_defineMethod(c$, "findHelixes", 
function(iPolymer, min){
var ap = this.bioPolymers[iPolymer];
if (JU.Logger.debugging) for (var j = 0; j < ap.monomerCount; j++) JU.Logger.debug(iPolymer + "." + ap.monomers[j].getResno() + "\t" + JU.Escape.e(min[j]));

var bsTurn =  new JU.BS();
var line3;
var line4;
var line5;
if (this.isDSSP2) {
line5 = this.findHelixes2(0, iPolymer, 5, min, J.c.STR.HELIXPI, 12288, bsTurn, true);
line4 = this.findHelixes2(2, iPolymer, 4, min, J.c.STR.HELIXALPHA, 10240, bsTurn, false);
line3 = this.findHelixes2(4, iPolymer, 3, min, J.c.STR.HELIX310, 8192, bsTurn, false);
} else {
line4 = this.findHelixes2(2, iPolymer, 4, min, J.c.STR.HELIXALPHA, 10240, bsTurn, true);
line3 = this.findHelixes2(4, iPolymer, 3, min, J.c.STR.HELIX310, 8192, bsTurn, false);
line5 = this.findHelixes2(0, iPolymer, 5, min, J.c.STR.HELIXPI, 12288, bsTurn, false);
}if (this.setStructure) ap.setStructureBS(0, 6, J.c.STR.TURN, bsTurn, false);
if (this.doReport) {
this.setTag(this.labels[iPolymer], bsTurn, 'T');
return this.dumpTags(ap, "$.5: " + line5 + "\n" + "$.4: " + line4 + "\n" + "$.3: " + line3, this.bsBad, 1);
}return "";
}, "~N,~A");
Clazz_defineMethod(c$, "findHelixes2", 
function(mmtfType, iPolymer, pitch, min, subtype, type, bsTurn, isFirst){
var ap = this.bioPolymers[iPolymer];
var bsStart =  new JU.BS();
var bsNNN =  new JU.BS();
var bsX =  new JU.BS();
var bsStop =  new JU.BS();
var bsHelix =  new JU.BS();
var bsDone = this.done[iPolymer];
var warning = "";
var n = ap.monomerCount;
for (var i = pitch; i < n; ++i) {
var i0 = i - pitch;
var bpt = 0;
if (min[i][0][0] == iPolymer && min[i][0][1] == i0 || min[i][bpt = 1][0] == iPolymer && min[i][1][1] == i0) {
var ia = ap.monomers[i0].leadAtomIndex;
var ipt = this.bsBad.nextSetBit(ia);
var m = ap.monomers[i];
if (ipt >= ia && ipt <= m.leadAtomIndex) continue;
bsStart.set(i0);
bsNNN.setBits(i0 + 1, i);
bsStop.set(i);
ipt = bsDone.nextSetBit(i0);
var isClear = (ipt < 0 || ipt >= i);
var addH = false;
if (i0 > 0 && bsStart.get(i0 - 1) && (isFirst || isClear)) {
bsHelix.setBits(i0, i);
if (!isClear) warning += "  WARNING! Bridge to helix at " + ap.monomers[ipt];
addH = true;
} else if (isClear || bsDone.nextClearBit(ipt) < i) {
addH = true;
}if (bsStop.get(i0)) bsX.set(i0);
if (addH && this.vHBonds != null) {
this.addHbond(m, ap.monomers[i0], min[i][bpt][2], type, null);
}}}
var taglines;
if (this.doReport) {
taglines =  Clazz_newCharArray (n, '\0');
this.setTag(taglines, bsNNN, String.fromCharCode(48 + pitch));
this.setTag(taglines, bsStart, '>');
this.setTag(taglines, bsStop, '<');
this.setTag(taglines, bsX, 'X');
} else {
taglines = null;
}bsDone.or(bsHelix);
bsNNN.andNot(bsDone);
bsTurn.or(bsNNN);
bsTurn.andNot(bsHelix);
if (this.setStructure) ap.setStructureBS(0, mmtfType, subtype, bsHelix, false);
if (this.doReport) {
this.setTag(this.labels[iPolymer], bsHelix, String.fromCharCode(68 + pitch));
return String.valueOf(taglines) + warning;
}return "";
}, "~N,~N,~N,~A,J.c.STR,~N,JU.BS,~B");
Clazz_defineMethod(c$, "setTag", 
function(tags, bs, ch){
for (var i = bs.nextSetBit(0); i >= 0; i = bs.nextSetBit(i + 1)) tags[i] = ch;

}, "~A,JU.BS,~S");
});
;//5.0.1-v7 Mon Aug 17 10:07:10 MDT 2026
Clazz_declarePackage("J.g3d");
Clazz_load(["J.g3d.G3DRenderer", "JU.P3", "$.V3"], "J.g3d.HermiteRenderer", ["JU.Lst", "$.P3i"], function(){
var c$ = Clazz_decorateAsClass(function(){
this.g3d = null;
this.gdata = null;
this.pLeft = null;
this.pRight = null;
this.sLeft = null;
this.sRight = null;
this.pTopLeft = null;
this.pTopRight = null;
this.pBotLeft = null;
this.pBotRight = null;
this.a1 = null;
this.a2 = null;
this.b1 = null;
this.b2 = null;
this.c1 = null;
this.c2 = null;
this.d1 = null;
this.d2 = null;
this.T1 = null;
this.T2 = null;
this.depth1 = null;
this.needToFill = null;
Clazz_instantialize(this, arguments);}, J.g3d, "HermiteRenderer", null, J.g3d.G3DRenderer);
Clazz_prepareFields (c$, function(){
this.pLeft =  new Array(16);
this.pRight =  new Array(16);
this.sLeft =  Clazz_newFloatArray (16, 0);
this.sRight =  Clazz_newFloatArray (16, 0);
this.pTopLeft =  new Array(16);
this.pTopRight =  new Array(16);
this.pBotLeft =  new Array(16);
this.pBotRight =  new Array(16);
{
for (var i = 16; --i >= 0; ) {
this.pLeft[i] =  new JU.P3i();
this.pRight[i] =  new JU.P3i();
this.pTopLeft[i] =  new JU.P3();
this.pTopRight[i] =  new JU.P3();
this.pBotLeft[i] =  new JU.P3();
this.pBotRight[i] =  new JU.P3();
}
}this.a1 =  new JU.P3();
this.a2 =  new JU.P3();
this.b1 =  new JU.P3();
this.b2 =  new JU.P3();
this.c1 =  new JU.P3();
this.c2 =  new JU.P3();
this.d1 =  new JU.P3();
this.d2 =  new JU.P3();
this.T1 =  new JU.V3();
this.T2 =  new JU.V3();
this.depth1 =  new JU.V3();
this.needToFill =  Clazz_newBooleanArray(16, false);
});
Clazz_makeConstructor(c$, 
function(){
});
Clazz_overrideMethod(c$, "set", 
function(g3d, gdata){
this.g3d = g3d;
this.gdata = gdata;
return this;
}, "J.api.JmolRendererInterface,JU.GData");
Clazz_defineMethod(c$, "renderHermiteRope", 
function(fill, tension, diameterBeg, diameterMid, diameterEnd, p0, p1, p2, p3){
var z1 = Clazz_floatToInt(p1.z);
var z2 = Clazz_floatToInt(p2.z);
if (p0.z == 1 || z1 == 1 || z2 == 1 || p3.z == 1) return;
if (this.gdata.isClippedZ(z1) || this.gdata.isClippedZ(z2)) return;
var x1 = Clazz_floatToInt(p1.x);
var y1 = Clazz_floatToInt(p1.y);
var x2 = Clazz_floatToInt(p2.x);
var y2 = Clazz_floatToInt(p2.y);
var xT1 = Clazz_doubleToInt(((x2 - Clazz_floatToInt(p0.x)) * tension) / 8);
var yT1 = Clazz_doubleToInt(((y2 - Clazz_floatToInt(p0.y)) * tension) / 8);
var zT1 = Clazz_doubleToInt(((z2 - Clazz_floatToInt(p0.z)) * tension) / 8);
var xT2 = Clazz_doubleToInt(((Clazz_floatToInt(p3.x) - x1) * tension) / 8);
var yT2 = Clazz_doubleToInt(((Clazz_floatToInt(p3.y) - y1) * tension) / 8);
var zT2 = Clazz_doubleToInt(((Clazz_floatToInt(p3.z) - z1) * tension) / 8);
this.sLeft[0] = 0;
this.pLeft[0].set(x1, y1, z1);
this.sRight[0] = 1;
this.pRight[0].set(x2, y2, z2);
var sp = 0;
var dDiameterFirstHalf = 0;
var dDiameterSecondHalf = 0;
if (fill) {
dDiameterFirstHalf = 2 * (diameterMid - diameterBeg);
dDiameterSecondHalf = 2 * (diameterEnd - diameterMid);
}do {
var a = this.pLeft[sp];
var b = this.pRight[sp];
var dx = b.x - a.x;
if (dx >= -1 && dx <= 1) {
var dy = b.y - a.y;
if (dy >= -1 && dy <= 1) {
var s = this.sLeft[sp];
if (fill) {
var d = (s < 0.5 ? diameterBeg + Clazz_floatToInt(dDiameterFirstHalf * s) : diameterMid + Clazz_floatToInt(dDiameterSecondHalf * (s - 0.5)));
this.g3d.fillSphereI(d, a);
} else {
this.g3d.plotPixelClippedP3i(a);
}--sp;
continue;
}}var s = (this.sLeft[sp] + this.sRight[sp]) / 2;
var s2 = s * s;
var s3 = s2 * s;
var h1 = 2 * s3 - 3 * s2 + 1;
var h2 = -2 * s3 + 3 * s2;
var h3 = s3 - 2 * s2 + s;
var h4 = s3 - s2;
if (sp >= 15) break;
var pMid = this.pRight[sp + 1];
pMid.x = Clazz_doubleToInt(h1 * x1 + h2 * x2 + h3 * xT1 + h4 * xT2);
pMid.y = Clazz_doubleToInt(h1 * y1 + h2 * y2 + h3 * yT1 + h4 * yT2);
pMid.z = Clazz_doubleToInt(h1 * z1 + h2 * z2 + h3 * zT1 + h4 * zT2);
this.pRight[sp + 1] = this.pRight[sp];
this.sRight[sp + 1] = this.sRight[sp];
this.pRight[sp] = pMid;
this.sRight[sp] = s;
++sp;
this.pLeft[sp].setT(pMid);
this.sLeft[sp] = s;
} while (sp >= 0);
}, "~B,~N,~N,~N,~N,JU.P3,JU.P3,JU.P3,JU.P3");
Clazz_defineMethod(c$, "renderHermiteRibbon", 
function(fill, border, tension, p0, p1, p2, p3, p4, p5, p6, p7, aspectRatio, fillType){
if (p0.z == 1 || p1.z == 1 || p2.z == 1 || p3.z == 1 || p4.z == 1 || p5.z == 1 || p6.z == 1 || p7.z == 1) return;
if (!fill) {
tension = Math.abs(tension);
this.renderParallelPair(fill, tension, p0, p1, p2, p3, p4, p5, p6, p7);
return;
}var isRev = (tension < 0);
if (isRev) tension = -tension;
var ratio = 1 / aspectRatio;
var x1 = Clazz_floatToInt(p1.x);
var y1 = Clazz_floatToInt(p1.y);
var z1 = Clazz_floatToInt(p1.z);
var x2 = Clazz_floatToInt(p2.x);
var y2 = Clazz_floatToInt(p2.y);
var z2 = Clazz_floatToInt(p2.z);
var xT1 = Clazz_doubleToInt(((x2 - Clazz_floatToInt(p0.x)) * tension) / 8);
var yT1 = Clazz_doubleToInt(((y2 - Clazz_floatToInt(p0.y)) * tension) / 8);
var zT1 = Clazz_doubleToInt(((z2 - Clazz_floatToInt(p0.z)) * tension) / 8);
var xT2 = Clazz_doubleToInt(((Clazz_floatToInt(p3.x) - x1) * tension) / 8);
var yT2 = Clazz_doubleToInt(((Clazz_floatToInt(p3.y) - y1) * tension) / 8);
var zT2 = Clazz_doubleToInt(((Clazz_floatToInt(p3.z) - z1) * tension) / 8);
this.pTopLeft[0].set(x1, y1, z1);
this.pTopRight[0].set(x2, y2, z2);
var x5 = Clazz_floatToInt(p5.x);
var y5 = Clazz_floatToInt(p5.y);
var z5 = Clazz_floatToInt(p5.z);
var x6 = Clazz_floatToInt(p6.x);
var y6 = Clazz_floatToInt(p6.y);
var z6 = Clazz_floatToInt(p6.z);
var xT5 = Clazz_doubleToInt(((x6 - Clazz_floatToInt(p4.x)) * tension) / 8);
var yT5 = Clazz_doubleToInt(((y6 - Clazz_floatToInt(p4.y)) * tension) / 8);
var zT5 = Clazz_doubleToInt(((z6 - Clazz_floatToInt(p4.z)) * tension) / 8);
var xT6 = Clazz_doubleToInt(((Clazz_floatToInt(p7.x) - x5) * tension) / 8);
var yT6 = Clazz_doubleToInt(((Clazz_floatToInt(p7.y) - y5) * tension) / 8);
var zT6 = Clazz_doubleToInt(((Clazz_floatToInt(p7.z) - z5) * tension) / 8);
this.pBotLeft[0].set(x5, y5, z5);
this.pBotRight[0].set(x6, y6, z6);
this.sLeft[0] = 0;
this.sRight[0] = 1;
this.needToFill[0] = true;
var sp = 0;
var closeEnd = false;
do {
var a = this.pTopLeft[sp];
var b = this.pTopRight[sp];
var dxTop = b.x - a.x;
var dxTop2 = dxTop * dxTop;
if (dxTop2 < 10) {
var dyTop = b.y - a.y;
var dyTop2 = dyTop * dyTop;
if (dyTop2 < 10) {
var c = this.pBotLeft[sp];
var d = this.pBotRight[sp];
var dxBot = d.x - c.x;
var dxBot2 = dxBot * dxBot;
if (dxBot2 < 8) {
var dyBot = d.y - c.y;
var dyBot2 = dyBot * dyBot;
if (dyBot2 < 8) {
if (border) {
this.g3d.fillSphereBits(3, a);
this.g3d.fillSphereBits(3, c);
}if (this.needToFill[sp]) {
if (aspectRatio > 0) {
this.T1.sub2(a, c);
this.T1.scale(ratio);
this.T2.sub2(a, b);
this.depth1.cross(this.T1, this.T2);
this.depth1.scale(this.T1.length() / this.depth1.length());
this.a1.add2(a, this.depth1);
this.a2.sub2(a, this.depth1);
this.b1.add2(b, this.depth1);
this.b2.sub2(b, this.depth1);
this.c1.add2(c, this.depth1);
this.c2.sub2(c, this.depth1);
this.d1.add2(d, this.depth1);
this.d2.sub2(d, this.depth1);
this.g3d.fillQuadrilateral(this.a1, this.b1, this.d1, this.c1, false);
this.g3d.fillQuadrilateral(this.a2, this.b2, this.d2, this.c2, false);
this.g3d.fillQuadrilateral(this.a1, this.b1, this.b2, this.a2, false);
this.g3d.fillQuadrilateral(this.c1, this.d1, this.d2, this.c2, false);
closeEnd = true;
} else {
if (fillType == 0) {
if (isRev) this.g3d.fillQuadrilateral(c, d, b, a, false);
 else this.g3d.fillQuadrilateral(a, b, d, c, false);
} else {
if (isRev) {
if (fillType != J.g3d.HermiteRenderer.isFront(a, b, d)) this.g3d.fillTriangle3f(a, b, d, false);
if (fillType != J.g3d.HermiteRenderer.isFront(a, d, c)) this.g3d.fillTriangle3f(a, d, c, false);
} else {
if (fillType == J.g3d.HermiteRenderer.isFront(a, b, d)) this.g3d.fillTriangle3f(a, b, d, false);
if (fillType == J.g3d.HermiteRenderer.isFront(a, d, c)) this.g3d.fillTriangle3f(a, d, c, false);
}}}this.needToFill[sp] = false;
}if (dxTop2 + dyTop2 < 2 && dxBot2 + dyBot2 < 2) {
--sp;
continue;
}}}}}var s = (this.sLeft[sp] + this.sRight[sp]) / 2;
var s2 = s * s;
var s3 = s2 * s;
var h1 = 2 * s3 - 3 * s2 + 1;
var h2 = -2 * s3 + 3 * s2;
var h3 = s3 - 2 * s2 + s;
var h4 = s3 - s2;
if (sp >= 15) break;
var spNext = sp + 1;
var pMidTop = this.pTopRight[spNext];
pMidTop.x = (h1 * x1 + h2 * x2 + h3 * xT1 + h4 * xT2);
pMidTop.y = (h1 * y1 + h2 * y2 + h3 * yT1 + h4 * yT2);
pMidTop.z = (h1 * z1 + h2 * z2 + h3 * zT1 + h4 * zT2);
var pMidBot = this.pBotRight[spNext];
pMidBot.x = (h1 * x5 + h2 * x6 + h3 * xT5 + h4 * xT6);
pMidBot.y = (h1 * y5 + h2 * y6 + h3 * yT5 + h4 * yT6);
pMidBot.z = (h1 * z5 + h2 * z6 + h3 * zT5 + h4 * zT6);
this.pTopRight[spNext] = this.pTopRight[sp];
this.pTopRight[sp] = pMidTop;
this.pBotRight[spNext] = this.pBotRight[sp];
this.pBotRight[sp] = pMidBot;
this.sRight[spNext] = this.sRight[sp];
this.sRight[sp] = s;
this.needToFill[spNext] = this.needToFill[sp];
this.pTopLeft[spNext].setT(pMidTop);
this.pBotLeft[spNext].setT(pMidBot);
this.sLeft[spNext] = s;
++sp;
} while (sp >= 0);
if (closeEnd) {
this.a1.z += 1;
this.c1.z += 1;
this.c2.z += 1;
this.a2.z += 1;
this.g3d.fillQuadrilateral(this.a1, this.c1, this.c2, this.a2, false);
}}, "~B,~B,~N,JU.P3,JU.P3,JU.P3,JU.P3,JU.P3,JU.P3,JU.P3,JU.P3,~N,~N");
c$.isFront = Clazz_defineMethod(c$, "isFront", 
function(a, b, c){
J.g3d.HermiteRenderer.vAB.sub2(b, a);
J.g3d.HermiteRenderer.vAC.sub2(c, a);
J.g3d.HermiteRenderer.vAB.cross(J.g3d.HermiteRenderer.vAB, J.g3d.HermiteRenderer.vAC);
return (J.g3d.HermiteRenderer.vAB.z < 0 ? -1 : 1);
}, "JU.P3,JU.P3,JU.P3");
Clazz_defineMethod(c$, "renderParallelPair", 
function(fill, tension, p0, p1, p2, p3, p4, p5, p6, p7){
var endPoints =  Clazz_newArray(-1, [p2, p1, p6, p5]);
var points =  new JU.Lst();
var whichPoint = 0;
var numTopStrandPoints = 2;
var numPointsPerSegment = 5.0;
var interval = (1.0 / numPointsPerSegment);
var currentInt = 0.0;
var x1 = Clazz_floatToInt(p1.x);
var y1 = Clazz_floatToInt(p1.y);
var z1 = Clazz_floatToInt(p1.z);
var x2 = Clazz_floatToInt(p2.x);
var y2 = Clazz_floatToInt(p2.y);
var z2 = Clazz_floatToInt(p2.z);
var xT1 = Clazz_doubleToInt(((x2 - Clazz_floatToInt(p0.x)) * tension) / 8);
var yT1 = Clazz_doubleToInt(((y2 - Clazz_floatToInt(p0.y)) * tension) / 8);
var zT1 = Clazz_doubleToInt(((z2 - Clazz_floatToInt(p0.z)) * tension) / 8);
var xT2 = Clazz_doubleToInt(((Clazz_floatToInt(p3.x) - x1) * tension) / 8);
var yT2 = Clazz_doubleToInt(((Clazz_floatToInt(p3.y) - y1) * tension) / 8);
var zT2 = Clazz_doubleToInt(((Clazz_floatToInt(p3.z) - z1) * tension) / 8);
this.sLeft[0] = 0;
this.pLeft[0].set(x1, y1, z1);
this.sRight[0] = 1;
this.pRight[0].set(x2, y2, z2);
var sp = 0;
for (var strands = 2; strands > 0; strands--) {
if (strands == 1) {
x1 = Clazz_floatToInt(p5.x);
y1 = Clazz_floatToInt(p5.y);
z1 = Clazz_floatToInt(p5.z);
x2 = Clazz_floatToInt(p6.x);
y2 = Clazz_floatToInt(p6.y);
z2 = Clazz_floatToInt(p6.z);
xT1 = Clazz_doubleToInt(((x2 - Clazz_floatToInt(p4.x)) * tension) / 8);
yT1 = Clazz_doubleToInt(((y2 - Clazz_floatToInt(p4.y)) * tension) / 8);
zT1 = Clazz_doubleToInt(((z2 - Clazz_floatToInt(p4.z)) * tension) / 8);
xT2 = Clazz_doubleToInt(((Clazz_floatToInt(p7.x) - x1) * tension) / 8);
yT2 = Clazz_doubleToInt(((Clazz_floatToInt(p7.y) - y1) * tension) / 8);
zT2 = Clazz_doubleToInt(((Clazz_floatToInt(p7.z) - z1) * tension) / 8);
this.sLeft[0] = 0;
this.pLeft[0].set(x1, y1, z1);
this.sRight[0] = 1;
this.pRight[0].set(x2, y2, z2);
sp = 0;
}points.addLast(endPoints[whichPoint++]);
currentInt = interval;
do {
var a = this.pLeft[sp];
var b = this.pRight[sp];
var dx = b.x - a.x;
var dy = b.y - a.y;
var dist2 = dx * dx + dy * dy;
if (dist2 <= 2) {
var s = this.sLeft[sp];
this.g3d.fillSphereI(3, a);
if (s < 1.0 - currentInt) {
var temp =  new JU.P3();
temp.set(a.x, a.y, a.z);
points.addLast(temp);
currentInt += interval;
if (strands == 2) {
numTopStrandPoints++;
}}--sp;
} else {
var s = (this.sLeft[sp] + this.sRight[sp]) / 2;
var s2 = s * s;
var s3 = s2 * s;
var h1 = 2 * s3 - 3 * s2 + 1;
var h2 = -2 * s3 + 3 * s2;
var h3 = s3 - 2 * s2 + s;
var h4 = s3 - s2;
if (sp >= 15) break;
var pMid = this.pRight[sp + 1];
pMid.x = Clazz_doubleToInt(h1 * x1 + h2 * x2 + h3 * xT1 + h4 * xT2);
pMid.y = Clazz_doubleToInt(h1 * y1 + h2 * y2 + h3 * yT1 + h4 * yT2);
pMid.z = Clazz_doubleToInt(h1 * z1 + h2 * z2 + h3 * zT1 + h4 * zT2);
this.pRight[sp + 1] = this.pRight[sp];
this.sRight[sp + 1] = this.sRight[sp];
this.pRight[sp] = pMid;
this.sRight[sp] = s;
++sp;
this.pLeft[sp].setT(pMid);
this.sLeft[sp] = s;
}} while (sp >= 0);
points.addLast(endPoints[whichPoint++]);
}
var size = points.size();
for (var top = 0; top < numTopStrandPoints && (top + numTopStrandPoints) < size; top++) this.g3d.drawLineAB(points.get(top), points.get(top + numTopStrandPoints));

}, "~B,~N,JU.P3,JU.P3,JU.P3,JU.P3,JU.P3,JU.P3,JU.P3,JU.P3");
c$.vAB =  new JU.V3();
c$.vAC =  new JU.V3();
});
;//5.0.1-v7 Mon Aug 17 10:07:10 MDT 2026
Clazz_declarePackage("J.shapebio");
Clazz_load(["J.shape.AtomShape"], "J.shapebio.BioShape", ["JU.AU", "$.BS", "$.PT", "J.c.PAL", "$.STR", "JU.BSUtil", "$.C", "$.Logger"], function(){
var c$ = Clazz_decorateAsClass(function(){
this.modelIndex = 0;
this.modelVisibilityFlags = 0;
this.shape = null;
this.bioPolymer = null;
this.meshes = null;
this.meshReady = null;
this.colixesBack = null;
this.monomers = null;
this.wingVectors = null;
this.leadAtomIndices = null;
this.hasBfactorRange = false;
this.bfactorMin = 0;
this.bfactorMax = 0;
this.range = 0;
this.floatRange = 0;
Clazz_instantialize(this, arguments);}, J.shapebio, "BioShape", J.shape.AtomShape);
Clazz_makeConstructor(c$, 
function(shape, modelIndex, bioPolymer){
Clazz_superConstructor (this, J.shapebio.BioShape, []);
this.shape = shape;
this.modelIndex = modelIndex;
this.bioPolymer = bioPolymer;
this.isActive = shape.isActive;
this.bsSizeDefault =  new JU.BS();
this.monomerCount = bioPolymer.monomerCount;
if (this.monomerCount > 0) {
this.colixes =  Clazz_newShortArray (this.monomerCount, 0);
this.paletteIDs =  Clazz_newByteArray (this.monomerCount, 0);
this.mads =  Clazz_newShortArray (this.monomerCount + 1, 0);
this.monomers = bioPolymer.monomers;
this.meshReady =  Clazz_newBooleanArray(this.monomerCount, false);
this.meshes =  new Array(this.monomerCount);
this.wingVectors = bioPolymer.getWingVectors();
this.leadAtomIndices = bioPolymer.getLeadAtomIndices();
}}, "J.shapebio.BioShapeCollection,~N,JM.BioPolymer");
Clazz_overrideMethod(c$, "setProperty", 
function(propertyName, value, bsSelected){
this.setPropAS(propertyName, value, bsSelected);
}, "~S,~O,JU.BS");
Clazz_defineMethod(c$, "calcBfactorRange", 
function(){
this.bfactorMin = this.bfactorMax = this.monomers[0].getLeadAtom().getBfactor100();
for (var i = this.monomerCount; --i > 0; ) {
var bfactor = this.monomers[i].getLeadAtom().getBfactor100();
if (bfactor < this.bfactorMin) this.bfactorMin = bfactor;
 else if (bfactor > this.bfactorMax) this.bfactorMax = bfactor;
}
this.range = this.bfactorMax - this.bfactorMin;
this.floatRange = this.range;
this.hasBfactorRange = true;
});
Clazz_defineMethod(c$, "calcMeanPositionalDisplacement", 
function(bFactor100){
return Clazz_doubleToShort(Math.sqrt(bFactor100 / 7895.6835208714865) * 1000);
}, "~N");
Clazz_overrideMethod(c$, "findNearestAtomIndex", 
function(xMouse, yMouse, closest, bsNot){
this.bioPolymer.findNearestAtomIndex(xMouse, yMouse, closest, this.mads, this.shape.vf, bsNot);
}, "~N,~N,~A,JU.BS");
Clazz_defineMethod(c$, "setMad", 
function(mad, bsSelected, values){
if (this.monomerCount < 2) return;
this.isActive = true;
if (this.bsSizeSet == null) this.bsSizeSet =  new JU.BS();
var flag = this.shape.vf;
var setRingVis = (flag == 32768 && Clazz_instanceOf(this.bioPolymer,"JM.NucleicPolymer"));
for (var i = this.monomerCount; --i >= 0; ) {
var leadAtomIndex = this.leadAtomIndices[i];
if (bsSelected.get(leadAtomIndex)) {
if (values != null && leadAtomIndex < values.length) {
if (Float.isNaN(values[leadAtomIndex])) continue;
mad = Clazz_floatToShort(values[leadAtomIndex] * 2000);
}var isVisible = ((this.mads[i] = this.getMad(i, mad)) > 0);
this.bsSizeSet.setBitTo(i, isVisible);
this.monomers[i].setShapeVisibility(flag, isVisible);
this.shape.atoms[leadAtomIndex].setShapeVisibility(flag, isVisible);
if (setRingVis) (this.monomers[i]).setRingsVisible(isVisible);
this.falsifyNearbyMesh(i);
}}
if (this.monomerCount > 1) this.mads[this.monomerCount] = this.mads[this.monomerCount - 1];
}, "~N,JU.BS,~A");
Clazz_defineMethod(c$, "getMad", 
function(groupIndex, mad){
this.bsSizeDefault.setBitTo(groupIndex, mad == -1 || mad == -2);
if (mad >= 0) return mad;
switch (mad) {
case -1:
case -2:
if (mad == -1 && this.shape.madOn >= 0) return this.shape.madOn;
switch (this.monomers[groupIndex].getBioStructureType()) {
case J.c.STR.SHEET:
case J.c.STR.HELIX:
return this.shape.madHelixSheet;
case J.c.STR.DNA:
case J.c.STR.RNA:
return this.shape.madDnaRna;
default:
return this.shape.madTurnRandom;
}
case -3:
{
if (!this.hasBfactorRange) this.calcBfactorRange();
var atom = this.monomers[groupIndex].getLeadAtom();
var bfactor100 = atom.getBfactor100();
var scaled = bfactor100 - this.bfactorMin;
if (this.range == 0) return 0;
var percentile = scaled / this.floatRange;
if (percentile < 0 || percentile > 1) JU.Logger.error("Que ha ocurrido? " + percentile);
return Clazz_floatToShort((1750 * percentile) + 250);
}case -4:
{
var atom = this.monomers[groupIndex].getLeadAtom();
return (2 * this.calcMeanPositionalDisplacement(atom.getBfactor100()));
}}
JU.Logger.error("unrecognized setMad(" + mad + ")");
return 0;
}, "~N,~N");
Clazz_defineMethod(c$, "falsifyMesh", 
function(){
if (this.meshReady == null) return;
for (var i = 0; i < this.monomerCount; i++) this.meshReady[i] = false;

});
Clazz_defineMethod(c$, "falsifyNearbyMesh", 
function(index){
if (this.meshReady == null) return;
this.meshReady[index] = false;
if (index > 0) this.meshReady[index - 1] = false;
if (index < this.monomerCount - 1) this.meshReady[index + 1] = false;
}, "~N");
Clazz_defineMethod(c$, "setColixBS", 
function(colix, pid, bsSelected){
this.isActive = true;
if (this.bsColixSet == null) this.bsColixSet = JU.BS.newN(this.monomerCount);
for (var i = this.monomerCount; --i >= 0; ) {
var atomIndex = this.leadAtomIndices[i];
if (bsSelected.get(atomIndex)) {
this.colixes[i] = this.shape.getColixI(colix, pid, atomIndex);
if (this.colixesBack != null && this.colixesBack.length > i) this.colixesBack[i] = 0;
this.paletteIDs[i] = pid;
this.bsColixSet.setBitTo(i, this.colixes[i] != 0);
}}
}, "~N,~N,JU.BS");
Clazz_defineMethod(c$, "setColixBack", 
function(colix, bsSelected){
if (this.colixesBack == null) this.colixesBack =  Clazz_newShortArray (this.colixes.length, 0);
if (this.colixesBack.length < this.colixes.length) this.colixesBack = JU.AU.ensureLengthShort(this.colixesBack, this.colixes.length);
for (var i = this.monomerCount; --i >= 0; ) if (bsSelected.get(this.leadAtomIndices[i])) this.colixesBack[i] = colix;

}, "~N,JU.BS");
Clazz_defineMethod(c$, "setColixes", 
function(atomColixes, bsSelected){
this.isActive = true;
if (this.bsColixSet == null) this.bsColixSet = JU.BS.newN(this.monomerCount);
for (var i = this.monomerCount; --i >= 0; ) {
var atomIndex = this.leadAtomIndices[i];
if (bsSelected.get(atomIndex) && i < this.colixes.length && atomIndex < atomColixes.length) {
this.colixes[i] = this.shape.getColixI(atomColixes[atomIndex], J.c.PAL.UNKNOWN.id, atomIndex);
if (this.colixesBack != null && i < this.colixesBack.length) this.colixesBack[i] = 0;
this.paletteIDs[i] = J.c.PAL.UNKNOWN.id;
this.bsColixSet.set(i);
}}
}, "~A,JU.BS");
Clazz_defineMethod(c$, "setParams", 
function(data, atomMap, bsSelected){
if (this.monomerCount == 0) return;
var c = data[0];
var atrans = data[1];
this.isActive = true;
if (this.bsColixSet == null) this.bsColixSet = JU.BS.newN(this.monomerCount);
var n = atomMap.length;
for (var i = this.monomerCount; --i >= 0; ) {
var atomIndex = this.leadAtomIndices[i];
if (bsSelected.get(atomIndex) && i < this.colixes.length && atomIndex < n) {
var pt = atomMap[atomIndex];
var colix = (c == null ? 0 : c[pt]);
var f = (atrans == null ? 0 : atrans[pt]);
if (f > 0.01) colix = JU.C.getColixTranslucent3(colix, true, f);
this.colixes[i] = this.shape.getColixI(colix, J.c.PAL.UNKNOWN.id, atomIndex);
if (this.colixesBack != null && i < this.colixesBack.length) this.colixesBack[i] = 0;
this.paletteIDs[i] = J.c.PAL.UNKNOWN.id;
this.bsColixSet.set(i);
}}
}, "~A,~A,JU.BS");
Clazz_defineMethod(c$, "setTranslucent", 
function(isTranslucent, bsSelected, translucentLevel){
this.isActive = true;
if (this.bsColixSet == null) this.bsColixSet = JU.BS.newN(this.monomerCount);
for (var i = this.monomerCount; --i >= 0; ) if (bsSelected.get(this.leadAtomIndices[i])) {
this.colixes[i] = JU.C.getColixTranslucent3(this.colixes[i], isTranslucent, translucentLevel);
if (this.colixesBack != null && this.colixesBack.length > i) this.colixesBack[i] = JU.C.getColixTranslucent3(this.colixesBack[i], isTranslucent, translucentLevel);
this.bsColixSet.setBitTo(i, this.colixes[i] != 0);
}
}, "~B,JU.BS,~N");
Clazz_overrideMethod(c$, "setAtomClickability", 
function(){
if (!this.isActive || this.wingVectors == null || this.monomerCount == 0) return;
var setRingsClickable = (Clazz_instanceOf(this.bioPolymer,"JM.NucleicPolymer") && this.shape.shapeID == 11);
var setAlphaClickable = (Clazz_instanceOf(this.bioPolymer,"JM.AlphaPolymer") || this.shape.shapeID != 15);
var ms = this.monomers[0].chain.model.ms;
for (var i = this.monomerCount; --i >= 0; ) {
if (this.mads[i] <= 0) continue;
var iAtom = this.leadAtomIndices[i];
if (ms.isAtomHidden(iAtom)) continue;
if (setAlphaClickable) ms.at[iAtom].setClickable(1040384);
if (setRingsClickable) (this.monomers[i]).setRingsClickable();
}
});
Clazz_defineMethod(c$, "getBioShapeState", 
function(type, translucentAllowed, temp, temp2){
if (this.monomerCount > 0) {
if (!this.isActive || this.bsSizeSet == null && this.bsColixSet == null) return;
for (var i = 0; i < this.monomerCount; i++) {
var atomIndex1 = this.monomers[i].firstAtomIndex;
var atomIndex2 = this.monomers[i].lastAtomIndex;
if (this.bsSizeSet != null && (this.bsSizeSet.get(i) || this.bsColixSet != null && this.bsColixSet.get(i))) {
if (this.bsSizeDefault.get(i)) {
JU.BSUtil.setMapBitSet(temp, atomIndex1, atomIndex2, type + (this.bsSizeSet.get(i) ? " on" : " off"));
} else {
JU.BSUtil.setMapBitSet(temp, atomIndex1, atomIndex2, type + " " + JU.PT.escF(this.mads[i] / 2000));
}}if (this.bsColixSet == null || !this.bsColixSet.get(i)) continue;
var s = J.shape.Shape.getColorCommand(type, this.paletteIDs[i], this.colixes[i], translucentAllowed);
if (this.colixesBack != null && this.colixesBack.length > i && this.colixesBack[i] != 0) s += " " + JU.C.getHexCode(this.colixesBack[i]);
JU.BSUtil.setMapBitSet(temp2, atomIndex1, atomIndex2, s);
}
}}, "~S,~B,java.util.Map,java.util.Map");
Clazz_overrideMethod(c$, "getShapeState", 
function(){
return null;
});
});
;//5.0.1-v7 Mon Aug 17 10:07:10 MDT 2026
Clazz_declarePackage("J.shapebio");
Clazz_load(["J.shape.Shape"], "J.shapebio.BioShapeCollection", ["java.util.Hashtable", "JU.AU", "J.c.PAL", "J.shapebio.BioShape", "JU.BSUtil", "$.C", "JV.JC"], function(){
var c$ = Clazz_decorateAsClass(function(){
this.atoms = null;
this.madOn = -2;
this.madHelixSheet = 3000;
this.madTurnRandom = 800;
this.madDnaRna = 5000;
this.isActive = false;
this.bioShapes = null;
Clazz_instantialize(this, arguments);}, J.shapebio, "BioShapeCollection", J.shape.Shape);
Clazz_overrideMethod(c$, "initModelSet", 
function(){
this.isBioShape = true;
this.atoms = this.ms.at;
this.initialize();
});
Clazz_overrideMethod(c$, "initShape", 
function(){
});
Clazz_overrideMethod(c$, "getSizeG", 
function(group){
var m = group;
var groupIndex = m.groupIndex;
var leadAtomIndex = m.getLeadAtom().i;
for (var i = this.bioShapes.length; --i >= 0; ) {
var bioShape = this.bioShapes[i];
for (var j = 0; j < bioShape.monomerCount; j++) {
if (bioShape.monomers[j].groupIndex == groupIndex && bioShape.monomers[j].getLeadAtom().i == leadAtomIndex) return bioShape.mads[j];
}
}
return 0;
}, "JM.Group");
Clazz_overrideMethod(c$, "replaceGroup", 
function(g0, g1){
for (var i = this.bioShapes.length; --i >= 0; ) {
var bioShape = this.bioShapes[i];
for (var j = 0; j < bioShape.monomerCount; j++) if (bioShape.monomers[j] === g0) {
bioShape.monomers[j] = g1;
break;
}
}
}, "JM.Group,JM.Group");
Clazz_overrideMethod(c$, "setShapeSizeRD", 
function(size, rd, bsSelected){
var mad = size;
this.initialize();
for (var i = this.bioShapes.length; --i >= 0; ) {
var bioShape = this.bioShapes[i];
if (bioShape.monomerCount > 0) bioShape.setMad(mad, bsSelected, (rd == null ? null : rd.values));
}
}, "~N,J.atomdata.RadiusData,JU.BS");
Clazz_overrideMethod(c$, "setProperty", 
function(propertyName, value, bsSelected){
this.setPropBSC(propertyName, value, bsSelected);
}, "~S,~O,JU.BS");
Clazz_defineMethod(c$, "setPropBSC", 
function(propertyName, value, bsSelected){
if (propertyName === "refreshTrajectories") {
var modelIndex = ((value)[0]).intValue();
for (var i = this.bioShapes.length; --i >= 0; ) {
var b = this.bioShapes[i];
if (b.modelIndex == modelIndex) b.falsifyMesh();
}
return;
}if (propertyName === "deleteModelAtoms") {
this.atoms = (value)[1];
var modelIndex = ((value)[2])[0];
for (var i = this.bioShapes.length; --i >= 0; ) {
var b = this.bioShapes[i];
if (b.modelIndex > modelIndex) {
b.modelIndex--;
b.leadAtomIndices = b.bioPolymer.getLeadAtomIndices();
} else if (b.modelIndex == modelIndex) {
this.bioShapes = JU.AU.deleteElements(this.bioShapes, i, 1);
}}
return;
}this.initialize();
if ("color" === propertyName) {
var pid = J.c.PAL.pidOf(value);
var colix = JU.C.getColixO(value);
for (var i = this.bioShapes.length; --i >= 0; ) {
var bioShape = this.bioShapes[i];
if (bioShape.monomerCount > 0) bioShape.setColixBS(colix, pid, bsSelected);
}
return;
}if ("pymolparams" === propertyName) {
var n = bsSelected.length();
var atomMap =  Clazz_newIntArray (n, 0);
for (var pt = 0, i = bsSelected.nextSetBit(0); i >= 0; i = bsSelected.nextSetBit(i + 1), pt++) atomMap[i] = pt;

for (var i = this.bioShapes.length; --i >= 0; ) this.bioShapes[i].setParams(value, atomMap, bsSelected);

return;
}if ("colorPhase" === propertyName) {
var twoColors = value;
var colixBack = JU.C.getColixO(twoColors[0]);
var colix = JU.C.getColixO(twoColors[1]);
for (var i = this.bioShapes.length; --i >= 0; ) {
var bioShape = this.bioShapes[i];
if (bioShape.monomerCount > 0) {
bioShape.setColixBS(colix, 64, bsSelected);
bioShape.setColixBack(colixBack, bsSelected);
}}
return;
}if ("translucency" === propertyName) {
var isTranslucent = ("translucent".equals(value));
for (var i = this.bioShapes.length; --i >= 0; ) {
var bioShape = this.bioShapes[i];
if (bioShape.monomerCount > 0) bioShape.setTranslucent(isTranslucent, bsSelected, this.translucentLevel);
}
return;
}this.setPropS(propertyName, value, bsSelected);
}, "~S,~O,JU.BS");
Clazz_overrideMethod(c$, "getShapeState", 
function(){
var temp =  new java.util.Hashtable();
var temp2 =  new java.util.Hashtable();
var type = JV.JC.shapeClassBases[this.shapeID];
for (var iShape = this.bioShapes.length; --iShape >= 0; ) this.bioShapes[iShape].getBioShapeState(type, this.translucentAllowed, temp, temp2);

var s = "\n" + this.vwr.getCommands(temp, temp2, this.shapeID == 9 ? "Backbone" : "select");
return s;
});
Clazz_defineMethod(c$, "initialize", 
function(){
var modelCount = this.ms.mc;
var models = this.ms.am;
var n = this.ms.getBioPolymerCountInModel(-1);
var shapes =  new Array(n--);
for (var i = modelCount; --i >= 0; ) for (var j = this.ms.getBioPolymerCountInModel(i); --j >= 0; n--) {
var bp = (models[i]).bioPolymers[j];
shapes[n] = (this.bioShapes == null || this.bioShapes.length <= n || this.bioShapes[n] == null || this.bioShapes[n].bioPolymer !== bp ?  new J.shapebio.BioShape(this, i, bp) : this.bioShapes[n]);
}

this.bioShapes = shapes;
});
Clazz_overrideMethod(c$, "findNearestAtomIndex", 
function(xMouse, yMouse, closest, bsNot){
for (var i = this.bioShapes.length; --i >= 0; ) this.bioShapes[i].findNearestAtomIndex(xMouse, yMouse, closest, bsNot);

}, "~N,~N,~A,JU.BS");
Clazz_overrideMethod(c$, "setModelVisibilityFlags", 
function(bsModels){
if (this.bioShapes == null) return;
bsModels = JU.BSUtil.copy(bsModels);
if (this.ms.trajectory != null) this.ms.trajectory.setBaseModels(bsModels);
for (var i = this.bioShapes.length; --i >= 0; ) {
var b = this.bioShapes[i];
b.modelVisibilityFlags = (bsModels.get(b.modelIndex) ? this.vf : 0);
}
}, "JU.BS");
Clazz_overrideMethod(c$, "setAtomClickability", 
function(){
if (this.bioShapes == null) return;
for (var i = this.bioShapes.length; --i >= 0; ) this.bioShapes[i].setAtomClickability();

});
Clazz_defineMethod(c$, "getMpsShapeCount", 
function(){
return this.bioShapes.length;
});
Clazz_defineMethod(c$, "getBioShape", 
function(i){
return this.bioShapes[i];
}, "~N");
});
;//5.0.1-v7 Mon Aug 17 10:07:10 MDT 2026
Clazz_declarePackage("J.shapebio");
Clazz_load(["J.shapebio.BioShapeCollection"], "J.shapebio.Rockets", null, function(){
var c$ = Clazz_declareType(J.shapebio, "Rockets", J.shapebio.BioShapeCollection);
Clazz_overrideMethod(c$, "initShape", 
function(){
this.setTurn();
});
Clazz_defineMethod(c$, "setTurn", 
function(){
this.madTurnRandom = 500;
});
});
;//5.0.1-v7 Mon Aug 17 10:07:10 MDT 2026
Clazz_declarePackage("J.shapebio");
Clazz_load(["J.shapebio.Rockets"], "J.shapebio.Cartoon", null, function(){
var c$ = Clazz_declareType(J.shapebio, "Cartoon", J.shapebio.Rockets);
Clazz_overrideMethod(c$, "initShape", 
function(){
this.setTurn();
this.madDnaRna = 1000;
});
});
;//5.0.1-v7 Mon Aug 17 10:07:10 MDT 2026
Clazz_declarePackage("J.shapebio");
Clazz_load(["J.shapebio.BioShapeCollection"], "J.shapebio.Backbone", ["JU.BS"], function(){
var c$ = Clazz_decorateAsClass(function(){
this.bsSelected = null;
Clazz_instantialize(this, arguments);}, J.shapebio, "Backbone", J.shapebio.BioShapeCollection);
Clazz_overrideMethod(c$, "initShape", 
function(){
this.madOn = 1;
this.madHelixSheet = 1500;
this.madTurnRandom = 500;
this.madDnaRna = 2000;
this.isActive = true;
});
Clazz_overrideMethod(c$, "setProperty", 
function(propertyName, value, bsSelected){
if ("bitset" === propertyName) {
this.bsSelected = value;
return;
}this.setPropBSC(propertyName, value, bsSelected);
}, "~S,~O,JU.BS");
Clazz_overrideMethod(c$, "setShapeSizeRD", 
function(size, rd, bsSelected){
var mad = size;
this.initialize();
var useThisBsSelected = (this.bsSelected != null);
if (useThisBsSelected) bsSelected = this.bsSelected;
for (var iShape = this.bioShapes.length; --iShape >= 0; ) {
var bioShape = this.bioShapes[iShape];
if (bioShape.monomerCount == 0) continue;
var bondSelectionModeOr = this.vwr.getBoolean(603979812);
var atomIndices = bioShape.bioPolymer.getLeadAtomIndices();
var isVisible = (mad != 0);
if (bioShape.bsSizeSet == null) bioShape.bsSizeSet =  new JU.BS();
bioShape.isActive = true;
var n = bioShape.monomerCount;
for (var i = n - (bioShape.bioPolymer.isCyclic() ? 0 : 1); --i >= 0; ) {
var index1 = atomIndices[i];
var index2 = atomIndices[(i + 1) % n];
var isAtom1 = bsSelected.get(index1);
var isAtom2 = bsSelected.get(index2);
if (isAtom1 && isAtom2 || useThisBsSelected && isAtom1 || bondSelectionModeOr && (isAtom1 || isAtom2)) {
bioShape.monomers[i].setShapeVisibility(this.vf, isVisible);
var atomA = this.ms.at[index1];
if (rd != null) {
if (Float.isNaN(rd.values[index1]) || Float.isNaN(rd.values[index2])) continue;
mad = Clazz_floatToShort((rd.values[index1] + rd.values[index2]) * 1000);
isVisible = (mad != 0);
}var atomB = this.ms.at[index2];
var wasVisible = (bioShape.mads[i] != 0);
if (wasVisible != isVisible) {
this.addDisplayedBackbone(atomA, isVisible);
this.addDisplayedBackbone(atomB, isVisible);
}bioShape.mads[i] = mad;
bioShape.bsSizeSet.setBitTo(i, isVisible);
bioShape.bsSizeDefault.setBitTo(i, mad == -1);
}}
}
if (useThisBsSelected) this.bsSelected = null;
}, "~N,J.atomdata.RadiusData,JU.BS");
Clazz_defineMethod(c$, "addDisplayedBackbone", 
function(a, isVisible){
a.nBackbonesDisplayed += (isVisible ? 1 : -1);
a.setShapeVisibility(this.vf, isVisible);
}, "JM.Atom,~B");
Clazz_overrideMethod(c$, "setAtomClickability", 
function(){
if (this.bioShapes == null) return;
for (var iShape = this.bioShapes.length; --iShape >= 0; ) {
var bioShape = this.bioShapes[iShape];
var atomIndices = bioShape.bioPolymer.getLeadAtomIndices();
for (var i = bioShape.monomerCount; --i >= 0; ) {
var atom = this.ms.at[atomIndices[i]];
if (atom.nBackbonesDisplayed > 0 && !this.ms.isAtomHidden(atom.i)) atom.setClickable(this.vf);
}
}
});
});
;//5.0.1-v7 Mon Aug 17 10:07:10 MDT 2026
Clazz_declarePackage("J.shapebio");
Clazz_load(["J.shapebio.BioShapeCollection"], "J.shapebio.Strands", null, function(){
var c$ = Clazz_decorateAsClass(function(){
this.isMesh = false;
Clazz_instantialize(this, arguments);}, J.shapebio, "Strands", J.shapebio.BioShapeCollection);
});
;//5.0.1-v7 Mon Aug 17 10:07:10 MDT 2026
Clazz_declarePackage("J.shapebio");
Clazz_load(["J.shapebio.BioShapeCollection"], "J.shapebio.Ribbons", null, function(){
var c$ = Clazz_declareType(J.shapebio, "Ribbons", J.shapebio.BioShapeCollection);
});
;//5.0.1-v7 Mon Aug 17 10:07:10 MDT 2026
Clazz_declarePackage("J.shapebio");
Clazz_load(["J.shapebio.Strands"], "J.shapebio.MeshRibbon", null, function(){
var c$ = Clazz_declareType(J.shapebio, "MeshRibbon", J.shapebio.Strands);
Clazz_overrideMethod(c$, "initShape", 
function(){
this.isMesh = true;
});
});
;//5.0.1-v7 Mon Aug 17 10:07:10 MDT 2026
Clazz_declarePackage("J.shapebio");
Clazz_load(["J.shapebio.BioShapeCollection"], "J.shapebio.Trace", ["J.atomdata.RadiusData", "J.c.VDW"], function(){
var c$ = Clazz_declareType(J.shapebio, "Trace", J.shapebio.BioShapeCollection);
Clazz_overrideMethod(c$, "initShape", 
function(){
this.madOn = 600;
this.madHelixSheet = 1500;
this.madTurnRandom = 500;
this.madDnaRna = 1500;
});
Clazz_overrideMethod(c$, "setProperty", 
function(propertyName, value, bsSelected){
if (propertyName === "putty") {
this.setPutty(value, bsSelected);
return;
}this.setPropBSC(propertyName, value, bsSelected);
}, "~S,~O,JU.BS");
Clazz_defineMethod(c$, "setPutty", 
function(info, bsAtoms){
var n = bsAtoms.cardinality();
if (n == 0) return;
var data =  Clazz_newFloatArray (bsAtoms.length(), 0);
var sum = 0.0;
var sumsq = 0.0;
var min = 3.4028235E38;
var max = 0;
for (var i = bsAtoms.nextSetBit(0); i >= 0; i = bsAtoms.nextSetBit(i + 1)) {
var value = this.atoms[i].atomPropertyFloat(null, 1111492620, null);
sum += value;
sumsq += (value * value);
if (value < min) min = value;
if (value > max) max = value;
}
var mean = (sum / n);
var stdev = Math.sqrt((sumsq - (sum * sum / n)) / n);
var rad = info[1];
var range = info[2];
var scale_min = info[3];
var scale_max = info[4];
var power = info[5];
var transform = Clazz_floatToInt(info[6]);
var data_range = max - min;
var nonlinear = false;
switch (transform) {
case 0:
case 1:
case 2:
case 3:
nonlinear = true;
break;
}
for (var i = bsAtoms.nextSetBit(0); i >= 0; i = bsAtoms.nextSetBit(i + 1)) {
var scale = this.atoms[i].atomPropertyFloat(null, 1111492620, null);
switch (transform) {
case 3:
case 7:
default:
break;
case 0:
case 4:
scale = 1 + (scale - mean) / range / stdev;
break;
case 1:
case 5:
scale = (scale - min) / data_range / range;
break;
case 2:
case 6:
scale /= range;
break;
case 8:
if (scale < 0.0) scale = 0.0;
scale = (Math.sqrt(scale / 8.0) / 3.141592653589793);
break;
}
if (scale < 0.0) scale = 0.0;
if (nonlinear) scale = Math.pow(scale, power);
if ((scale < scale_min) && (scale_min >= 0.0)) scale = scale_min;
if ((scale > scale_max) && (scale_max >= 0.0)) scale = scale_max;
data[i] = scale * rad;
}
var rd =  new J.atomdata.RadiusData(data, 0, J.atomdata.RadiusData.EnumType.ABSOLUTE, J.c.VDW.AUTO);
this.setShapeSizeRD(0, rd, bsAtoms);
}, "~A,JU.BS");
});
;//5.0.1-v7 Mon Aug 17 10:07:10 MDT 2026
Clazz_declarePackage("J.renderbio");
Clazz_load(["J.render.ShapeRenderer", "JU.BS", "$.P3"], "J.renderbio.BioShapeRenderer", ["javajs.api.Interface", "J.c.STR", "JU.C", "$.Point3fi"], function(){
var c$ = Clazz_decorateAsClass(function(){
this.invalidateMesh = false;
this.invalidateSheets = false;
this.isTraceAlpha = false;
this.ribbonBorder = false;
this.haveControlPointScreens = false;
this.aspectRatio = 0;
this.hermiteLevel = 0;
this.sheetSmoothing = 0;
this.cartoonsFancy = false;
this.monomerCount = 0;
this.monomers = null;
this.isNucleic = false;
this.isPhosphorusOnly = false;
this.isCarbohydrate = false;
this.bsVisible = null;
this.ribbonTopScreens = null;
this.ribbonBottomScreens = null;
this.controlPoints = null;
this.controlPointScreens = null;
this.leadAtomIndices = null;
this.wingVectors = null;
this.mads = null;
this.colixes = null;
this.colixesBack = null;
this.structureTypes = null;
this.isHighRes = false;
this.wireframeOnly = false;
this.needTranslucent = false;
this.renderStruts = false;
this.meshRenderer = null;
this.bioShape = null;
this.pointT = null;
this.iPrev = 0;
this.iNext = 0;
this.iNext2 = 0;
this.iNext3 = 0;
this.diameterBeg = 0;
this.diameterMid = 0;
this.diameterEnd = 0;
this.madBeg = 0;
this.madMid = 0;
this.madEnd = 0;
this.colixBack = 0;
this.reversed = null;
this.isCyclic = false;
this.screenArrowTop = null;
this.screenArrowTopPrev = null;
this.screenArrowBot = null;
this.screenArrowBotPrev = null;
Clazz_instantialize(this, arguments);}, J.renderbio, "BioShapeRenderer", J.render.ShapeRenderer);
Clazz_prepareFields (c$, function(){
this.bsVisible =  new JU.BS();
this.pointT =  new JU.P3();
this.screenArrowTop =  new JU.P3();
this.screenArrowTopPrev =  new JU.P3();
this.screenArrowBot =  new JU.P3();
this.screenArrowBotPrev =  new JU.P3();
});
Clazz_overrideMethod(c$, "render", 
function(){
if (this.shape == null) return false;
this.setGlobals();
this.renderShapes();
return this.needTranslucent;
});
Clazz_defineMethod(c$, "setGlobals", 
function(){
this.invalidateMesh = false;
this.needTranslucent = false;
this.g3d.addRenderer(553648143);
var TF = (!this.isExport && !this.vwr.checkMotionRendering(1112152066));
if (TF != this.wireframeOnly) this.invalidateMesh = true;
this.wireframeOnly = TF;
TF = (this.isExport || !this.wireframeOnly && this.vwr.getBoolean(603979863));
if (TF != this.isHighRes) this.invalidateMesh = true;
this.isHighRes = TF;
TF = !this.wireframeOnly && (this.vwr.getBoolean(603979816) || this.isExport);
if (this.cartoonsFancy != TF) {
this.invalidateMesh = true;
this.cartoonsFancy = TF;
}var val1 = this.vwr.getHermiteLevel();
val1 = (val1 <= 0 ? -val1 : this.vwr.getInMotion(true) ? 0 : val1);
if (this.cartoonsFancy && !this.wireframeOnly) val1 = Math.max(val1, 3);
if (val1 != this.hermiteLevel) this.invalidateMesh = true;
this.hermiteLevel = Math.min(val1, 8);
var val = this.vwr.getInt(553648166);
val = Math.min(Math.max(0, val), 20);
if (this.cartoonsFancy && val >= 16) val = 4;
if (this.wireframeOnly || this.hermiteLevel == 0) val = 0;
if (val != this.aspectRatio && val != 0 && val1 != 0) this.invalidateMesh = true;
this.aspectRatio = val;
if (this.aspectRatio > 0) {
if (this.meshRenderer == null) {
this.meshRenderer = javajs.api.Interface.getInterface("J.renderbio.BioMeshRenderer");
this.meshRenderer.setViewerG3dShapeID(this.vwr, this.shape.shapeID);
}this.meshRenderer.setup(this.g3d, this.ms, this.shape);
}TF = this.vwr.getBoolean(603979966);
if (TF != this.isTraceAlpha) this.invalidateMesh = true;
this.isTraceAlpha = TF;
this.invalidateSheets = false;
var fval = this.vwr.getFloat(570425392);
if (fval != this.sheetSmoothing && this.isTraceAlpha) {
this.sheetSmoothing = fval;
this.invalidateMesh = true;
this.invalidateSheets = true;
}this.renderStruts = (this.vwr.shm.getShape(1)).haveStrutPoints;
});
Clazz_defineMethod(c$, "renderShapes", 
function(){
var mps = this.shape;
for (var c = mps.bioShapes.length; --c >= 0; ) {
this.bioShape = mps.getBioShape(c);
if ((this.bioShape.modelVisibilityFlags & this.myVisibilityFlag) == 0) continue;
if (this.bioShape.monomerCount >= 2 && this.initializePolymer(this.bioShape)) {
if (this.meshRenderer != null) this.meshRenderer.initBS();
this.isCyclic = this.bioShape.bioPolymer.isCyclic();
this.renderBioShape(this.bioShape);
if (this.meshRenderer != null) this.meshRenderer.renderMeshes();
this.freeTempArrays();
}}
});
Clazz_defineMethod(c$, "setBioColix", 
function(colix){
if (this.g3d.setC(colix)) return true;
this.needTranslucent = true;
return false;
}, "~N");
Clazz_defineMethod(c$, "freeTempArrays", 
function(){
if (this.haveControlPointScreens) this.vwr.freeTempPoints(this.controlPointScreens);
this.vwr.freeTempEnum(this.structureTypes);
});
Clazz_defineMethod(c$, "initializePolymer", 
function(bioShape){
var bsDeleted = this.vwr.slm.bsDeleted;
if (this.ms.isJmolDataFrame(bioShape.modelIndex)) {
this.controlPoints = bioShape.bioPolymer.getControlPoints(true, 0, false);
} else {
this.controlPoints = bioShape.bioPolymer.getControlPoints(this.isTraceAlpha, this.sheetSmoothing, this.invalidateSheets);
}this.monomerCount = bioShape.monomerCount;
this.monomers = bioShape.monomers;
this.reversed = bioShape.bioPolymer.reversed;
this.leadAtomIndices = bioShape.bioPolymer.getLeadAtomIndices();
this.bsVisible.clearAll();
var haveVisible = false;
if (this.invalidateMesh) bioShape.falsifyMesh();
for (var i = this.monomerCount; --i >= 0; ) {
if ((this.monomers[i].shapeVisibilityFlags & this.myVisibilityFlag) == 0 || this.ms.isAtomHidden(this.leadAtomIndices[i]) || bsDeleted != null && bsDeleted.get(this.leadAtomIndices[i])) continue;
var lead = this.ms.at[this.leadAtomIndices[i]];
if (!this.g3d.isInDisplayRange(lead.sX, lead.sY)) continue;
this.bsVisible.set(i);
haveVisible = true;
}
if (!haveVisible) return false;
this.ribbonBorder = this.vwr.getBoolean(603979901);
this.isNucleic = Clazz_instanceOf(bioShape.bioPolymer,"JM.NucleicPolymer");
this.isPhosphorusOnly = !this.isNucleic && Clazz_instanceOf(bioShape.bioPolymer,"JM.PhosphorusPolymer");
this.isCarbohydrate = Clazz_instanceOf(bioShape.bioPolymer,"JM.CarbohydratePolymer");
this.haveControlPointScreens = false;
this.wingVectors = bioShape.wingVectors;
if (this.meshRenderer != null) this.meshRenderer.initialize(this, bioShape, this.monomerCount);
this.mads = bioShape.mads;
this.colixes = bioShape.colixes;
this.colixesBack = bioShape.colixesBack;
this.setStructureTypes();
return true;
}, "J.shapebio.BioShape");
Clazz_defineMethod(c$, "setStructureTypes", 
function(){
var types = this.structureTypes = this.vwr.allocTempEnum(this.monomerCount + 1);
for (var i = this.monomerCount; --i >= 0; ) if ((types[i] = this.monomers[i].getBioStructureType()) === J.c.STR.TURN) types[i] = J.c.STR.NONE;

types[this.monomerCount] = types[this.monomerCount - 1];
});
Clazz_defineMethod(c$, "calcScreenControlPoints", 
function(){
var count = this.monomerCount + 1;
var scr = this.controlPointScreens = this.vwr.allocTempPoints(count);
var points = this.controlPoints;
for (var i = count; --i >= 0; ) this.tm.transformPtScrT3(points[i], scr[i]);

this.haveControlPointScreens = true;
});
Clazz_defineMethod(c$, "calcScreens", 
function(offsetFraction, mads){
var count = this.controlPoints.length;
var screens = this.vwr.allocTempPoints(count);
if (offsetFraction == 0) {
for (var i = count; --i >= 0; ) this.tm.transformPtScrT3(this.controlPoints[i], screens[i]);

} else {
var offset_1000 = offsetFraction / 1000;
for (var i = count; --i >= 0; ) this.calc1Screen(this.controlPoints[i], this.wingVectors[i], (mads[i] == 0 && i > 0 ? mads[i - 1] : mads[i]), offset_1000, screens[i]);

}return screens;
}, "~N,~A");
Clazz_defineMethod(c$, "calc1Screen", 
function(center, vector, mad, offset_1000, screen){
this.pointT.scaleAdd2(mad * offset_1000, vector, center);
this.tm.transformPtScrT3(this.pointT, screen);
}, "JU.P3,JU.V3,~N,~N,JU.P3");
Clazz_defineMethod(c$, "getLeadColix", 
function(i){
return JU.C.getColixInherited(this.colixes[i], this.monomers[i].getLeadAtom().colixAtom);
}, "~N");
Clazz_defineMethod(c$, "getLeadColixBack", 
function(i){
return (this.colixesBack == null || this.colixesBack.length <= i ? 0 : this.colixesBack[i]);
}, "~N");
Clazz_defineMethod(c$, "setNeighbors", 
function(i){
if (this.isCyclic) {
i += this.monomerCount;
this.iPrev = (i - 1) % this.monomerCount;
this.iNext = (i + 1) % this.monomerCount;
this.iNext2 = (i + 2) % this.monomerCount;
this.iNext3 = (i + 3) % this.monomerCount;
} else {
this.iPrev = Math.max(i - 1, 0);
this.iNext = Math.min(i + 1, this.monomerCount);
this.iNext2 = Math.min(i + 2, this.monomerCount);
this.iNext3 = Math.min(i + 3, this.monomerCount);
}}, "~N");
Clazz_defineMethod(c$, "setColix", 
function(colix){
this.colix = colix;
return this.g3d.setC(colix);
}, "~N");
Clazz_defineMethod(c$, "setMads", 
function(i, thisTypeOnly){
this.madMid = this.madBeg = this.madEnd = this.mads[i];
if (this.isTraceAlpha) {
if (!thisTypeOnly || this.structureTypes[i] === this.structureTypes[this.iNext]) {
this.madEnd = this.mads[this.iNext];
if (this.madEnd == 0) {
if (Clazz_instanceOf(this,"J.renderbio.TraceRenderer")) {
this.madEnd = this.madBeg;
} else {
this.madEnd = this.madBeg;
}}this.madMid = ((this.madBeg + this.madEnd) >> 1);
}} else {
if (!thisTypeOnly || this.structureTypes[i] === this.structureTypes[this.iPrev]) this.madBeg = (((this.mads[this.iPrev] == 0 ? this.madMid : this.mads[this.iPrev]) + this.madMid) >> 1);
if (!thisTypeOnly || this.structureTypes[i] === this.structureTypes[this.iNext]) this.madEnd = (((this.mads[this.iNext] == 0 ? this.madMid : this.mads[this.iNext]) + this.madMid) >> 1);
}this.diameterBeg = Clazz_floatToInt(this.vwr.tm.scaleToScreen(Clazz_floatToInt(this.controlPointScreens[i].z), this.madBeg));
this.diameterMid = Clazz_floatToInt(this.vwr.tm.scaleToScreen(this.monomers[i].getLeadAtom().sZ, this.madMid));
this.diameterEnd = Clazz_floatToInt(this.vwr.tm.scaleToScreen(Clazz_floatToInt(this.controlPointScreens[this.iNext].z), this.madEnd));
var doCap0 = (i == this.iPrev || !this.bsVisible.get(this.iPrev) || thisTypeOnly && this.structureTypes[i] !== this.structureTypes[this.iPrev]);
var doCap1 = (this.iNext == this.iNext2 || this.iNext2 == this.iNext3 || !this.bsVisible.get(this.iNext) || thisTypeOnly && this.structureTypes[i] !== this.structureTypes[this.iNext]);
return (this.aspectRatio > 0 && this.meshRenderer != null && this.meshRenderer.check(doCap0, doCap1));
}, "~N,~B");
Clazz_defineMethod(c$, "renderHermiteCylinder", 
function(screens, i){
this.colix = this.getLeadColix(i);
if (!this.setBioColix(this.colix)) return;
this.setNeighbors(i);
this.g3d.drawHermite4(this.isNucleic ? 4 : 7, screens[this.iPrev], screens[i], screens[this.iNext], screens[this.iNext2]);
}, "~A,~N");
Clazz_defineMethod(c$, "renderHermiteConic", 
function(i, thisTypeOnly, tension){
this.setNeighbors(i);
this.colix = this.getLeadColix(i);
this.checkStruts(i);
if (!this.setBioColix(this.colix)) return;
if (this.setMads(i, thisTypeOnly) || this.isExport) {
if (!this.meshRenderer.setFancyConic(i, tension)) return;
} else {
if (this.diameterBeg == 0 && this.diameterEnd == 0 || this.wireframeOnly) {
this.g3d.drawLineAB(this.controlPointScreens[i], this.controlPointScreens[this.iNext]);
} else {
this.g3d.fillHermite(this.isNucleic ? 4 : 7, this.diameterBeg, this.diameterMid, this.diameterEnd, this.controlPointScreens[this.iPrev], this.controlPointScreens[i], this.controlPointScreens[this.iNext], this.controlPointScreens[this.iNext2]);
}}}, "~N,~B,~N");
Clazz_defineMethod(c$, "checkStruts", 
function(i){
if (this.renderStruts && this.monomers[i].isSheet() && this.monomers[i].strutPoint != null) {
var p =  new JU.Point3fi();
p.add2(this.controlPoints[i], this.controlPoints[i + 1]);
p.scale(0.5);
this.setStrutPoint(this.monomers[i].getLeadAtom(), p);
}}, "~N");
Clazz_defineMethod(c$, "renderHermiteRibbon", 
function(doFill, i, thisTypeOnly){
this.setNeighbors(i);
this.checkStruts(i);
var c0 = this.colix = this.getLeadColix(i);
if (!this.setBioColix(this.colix)) return;
var cb = this.colixBack = this.getLeadColixBack(i);
if (doFill && (this.aspectRatio != 0 || this.isExport)) {
if (this.setMads(i, thisTypeOnly) || this.isExport) {
this.meshRenderer.setFancyRibbon(i);
return;
}}var isReversed = this.reversed.get(i);
if (isReversed && this.colixBack != 0) {
this.setColix(this.colixBack);
cb = c0;
}this.g3d.drawHermite7(doFill, this.ribbonBorder, (isReversed ? -1 : 1) * (this.isNucleic ? 4 : 7), this.ribbonTopScreens[this.iPrev], this.ribbonTopScreens[i], this.ribbonTopScreens[this.iNext], this.ribbonTopScreens[this.iNext2], this.ribbonBottomScreens[this.iPrev], this.ribbonBottomScreens[i], this.ribbonBottomScreens[this.iNext], this.ribbonBottomScreens[this.iNext2], Clazz_floatToInt(this.aspectRatio), cb);
if (isReversed && this.colixBack != 0) {
this.setColix(c0);
cb = this.colixBack;
}}, "~B,~N,~B");
Clazz_defineMethod(c$, "renderHermiteArrowHead", 
function(i){
this.colix = this.getLeadColix(i);
if (!this.setBioColix(this.colix)) return;
this.colixBack = this.getLeadColixBack(i);
this.setNeighbors(i);
if (this.setMads(i, false) || this.isExport) {
this.meshRenderer.setFancyArrowHead(i);
return;
}var cp = this.controlPoints[i];
var wv = this.wingVectors[i];
this.calc1Screen(cp, wv, this.madBeg, .0007, this.screenArrowTop);
this.calc1Screen(cp, wv, this.madBeg, -7.0E-4, this.screenArrowBot);
this.calc1Screen(cp, wv, this.madBeg, 0.001, this.screenArrowTopPrev);
this.calc1Screen(cp, wv, this.madBeg, -0.001, this.screenArrowBotPrev);
this.g3d.drawHermite7(true, this.ribbonBorder, this.isNucleic ? 4 : 7, this.screenArrowTopPrev, this.screenArrowTop, this.controlPointScreens[this.iNext], this.controlPointScreens[this.iNext2], this.screenArrowBotPrev, this.screenArrowBot, this.controlPointScreens[this.iNext], this.controlPointScreens[this.iNext2], Clazz_floatToInt(this.aspectRatio), this.colixBack);
this.g3d.setC(this.colix);
if (this.ribbonBorder && this.aspectRatio == 0) {
this.g3d.fillCylinderBits(3, 3, this.screenArrowTop, this.screenArrowBot);
}}, "~N");
Clazz_defineMethod(c$, "drawSegmentAB", 
function(atomA, atomB, colixA, colixB, max){
var xA = atomA.sX;
var yA = atomA.sY;
var zA = atomA.sZ;
var xB = atomB.sX;
var yB = atomB.sY;
var zB = atomB.sZ;
var mad = this.mad;
if (max == 1000) mad = mad >> 1;
if (mad < 0) {
this.g3d.drawLine(colixA, colixB, xA, yA, zA, xB, yB, zB);
} else {
var width = Clazz_floatToInt(this.isExport ? mad : this.vwr.tm.scaleToScreen(Clazz_doubleToInt((zA + zB) / 2), mad));
this.g3d.fillCylinderXYZ(colixA, colixB, 3, width, xA, yA, zA, xB, yB, zB);
}}, "JM.Atom,JM.Atom,~N,~N,~N");
Clazz_defineMethod(c$, "getStrutPointIfNeeded", 
function(a){
var p = a.group.strutPoint;
return (p != null && p.sX == -2147483648 ? p : null);
}, "JM.Atom");
Clazz_defineMethod(c$, "setStrutPoint", 
function(a, newPt){
var p = this.getStrutPointIfNeeded(a);
if (p == null) return;
if (newPt == null) newPt = a;
p.setP(newPt);
p.sX = newPt.sX;
p.sY = newPt.sY;
p.sZ = newPt.sZ;
}, "JM.Atom,JU.Point3fi");
});
;//5.0.1-v7 Mon Aug 17 10:07:10 MDT 2026
Clazz_declarePackage("J.renderbio");
Clazz_load(["J.renderbio.BioShapeRenderer"], "J.renderbio.StrandsRenderer", null, function(){
var c$ = Clazz_decorateAsClass(function(){
this.strandCount = 1;
this.strandSeparation = 0;
this.baseStrandOffset = 0;
Clazz_instantialize(this, arguments);}, J.renderbio, "StrandsRenderer", J.renderbio.BioShapeRenderer);
Clazz_overrideMethod(c$, "renderBioShape", 
function(bioShape){
this.renderStrandShape();
}, "J.shapebio.BioShape");
Clazz_defineMethod(c$, "renderStrandShape", 
function(){
if (!this.setStrandCount()) return;
this.renderStrands();
});
Clazz_defineMethod(c$, "setStrandCount", 
function(){
if (this.wingVectors == null) return false;
this.strandCount = (Clazz_instanceOf(this.shape,"J.shapebio.Strands") ? this.vwr.getStrandCount((this.shape).shapeID) : 10);
this.strandSeparation = (this.strandCount <= 1) ? 0 : 1 / (this.strandCount - 1);
this.baseStrandOffset = ((this.strandCount & 1) == 0 ? this.strandSeparation / 2 : this.strandSeparation);
return true;
});
Clazz_defineMethod(c$, "renderStrands", 
function(){
var screens;
for (var i = this.strandCount >> 1; --i >= 0; ) {
var f = (i * this.strandSeparation) + this.baseStrandOffset;
screens = this.calcScreens(f, this.mads);
this.renderStrand(screens);
this.vwr.freeTempPoints(screens);
screens = this.calcScreens(-f, this.mads);
this.renderStrand(screens);
this.vwr.freeTempPoints(screens);
}
if (this.strandCount % 2 == 1) {
screens = this.calcScreens(0, this.mads);
this.renderStrand(screens);
this.vwr.freeTempPoints(screens);
}});
Clazz_defineMethod(c$, "renderStrand", 
function(screens){
for (var i = this.bsVisible.nextSetBit(0); i >= 0; i = this.bsVisible.nextSetBit(i + 1)) this.renderHermiteCylinder(screens, i);

}, "~A");
});
;//5.0.1-v7 Mon Aug 17 10:07:10 MDT 2026
Clazz_declarePackage("J.renderbio");
Clazz_load(["J.renderbio.MeshRibbonRenderer"], "J.renderbio.RibbonsRenderer", null, function(){
var c$ = Clazz_declareType(J.renderbio, "RibbonsRenderer", J.renderbio.MeshRibbonRenderer);
Clazz_overrideMethod(c$, "renderBioShape", 
function(bioShape){
if (this.wingVectors == null) return;
if (this.wireframeOnly) this.renderStrands();
 else this.render2Strand(true, this.isNucleic ? 1 : 0.5, this.isNucleic ? 0 : 0.5);
}, "J.shapebio.BioShape");
});
;//5.0.1-v7 Mon Aug 17 10:07:10 MDT 2026
Clazz_declarePackage("J.renderbio");
Clazz_load(["J.renderbio.StrandsRenderer"], "J.renderbio.MeshRibbonRenderer", null, function(){
var c$ = Clazz_declareType(J.renderbio, "MeshRibbonRenderer", J.renderbio.StrandsRenderer);
Clazz_overrideMethod(c$, "renderBioShape", 
function(bioShape){
if (this.wireframeOnly) this.renderStrands();
 else this.renderMeshRibbon();
}, "J.shapebio.BioShape");
Clazz_defineMethod(c$, "renderMeshRibbon", 
function(){
if (!this.setStrandCount()) return;
var offset = ((this.strandCount >> 1) * this.strandSeparation) + this.baseStrandOffset;
this.render2Strand(false, offset, offset);
this.renderStrands();
});
Clazz_defineMethod(c$, "render2Strand", 
function(doFill, offsetTop, offsetBottom){
this.calcScreenControlPoints();
this.ribbonTopScreens = this.calcScreens(offsetTop, this.mads);
this.ribbonBottomScreens = this.calcScreens(-offsetBottom, this.mads);
for (var i = this.bsVisible.nextSetBit(0); i >= 0; i = this.bsVisible.nextSetBit(i + 1)) this.renderHermiteRibbon(doFill, i, false);

this.vwr.freeTempPoints(this.ribbonTopScreens);
this.vwr.freeTempPoints(this.ribbonBottomScreens);
}, "~B,~N,~N");
});
;//5.0.1-v7 Mon Aug 17 10:07:10 MDT 2026
Clazz_declarePackage("J.renderbio");
Clazz_load(null, "J.renderbio.NucleicRenderer", ["JU.P3", "JU.C"], function(){
var c$ = Clazz_decorateAsClass(function(){
this.cartoonBaseEdges = false;
this.cartoonBlocks = false;
this.blockHeight = 0;
this.cartoonLadders = false;
this.cartoonRibose = false;
this.rPt = null;
this.rPt5 = null;
this.rScr = null;
this.rScr5 = null;
this.basePt = null;
this.backbonePt = null;
this.baseScreen = null;
this.backboneScreen = null;
this.ptTemp = null;
this.vwr = null;
this.tm = null;
this.g3d = null;
this.bsr = null;
this.colix = 0;
this.cartoonSteps = false;
this.scrBox = null;
this.triangles = null;
Clazz_instantialize(this, arguments);}, J.renderbio, "NucleicRenderer", null);
Clazz_prepareFields (c$, function(){
this.triangles =  Clazz_newIntArray(-1, [1, 0, 3, 1, 3, 2, 0, 4, 7, 0, 7, 3, 4, 5, 6, 4, 6, 7, 5, 1, 2, 5, 2, 6, 2, 3, 7, 2, 7, 6, 0, 1, 5, 0, 5, 4]);
});
Clazz_makeConstructor(c$, 
function(){
});
Clazz_defineMethod(c$, "renderNucleic", 
function(renderer){
if (this.vwr == null) {
this.rPt =  new Array(10);
this.rScr =  new Array(10);
this.rPt5 =  new Array(5);
this.rScr5 =  new Array(5);
this.backboneScreen =  new JU.P3();
this.backbonePt =  new JU.P3();
this.bsr = renderer;
this.tm = renderer.vwr.tm;
this.vwr = renderer.vwr;
}this.g3d = renderer.g3d;
var screens = renderer.controlPointScreens;
var pts = renderer.controlPoints;
this.cartoonBlocks = this.vwr.getBoolean(603979810);
this.cartoonBaseEdges = this.vwr.getBoolean(603979815);
this.cartoonSteps = this.vwr.getBoolean(603979811);
this.cartoonLadders = this.vwr.getBoolean(603979817);
this.cartoonRibose = this.vwr.getBoolean(603979818);
this.blockHeight = this.vwr.getFloat(570425347);
var isTraceAlpha = this.vwr.getBoolean(603979966);
var bsVisible = this.bsr.bsVisible;
for (var i = bsVisible.nextSetBit(0); i >= 0; i = bsVisible.nextSetBit(i + 1)) {
var scr = screens[i + 1];
if (isTraceAlpha) {
this.backboneScreen.ave(screens[i], scr);
this.backbonePt.ave(pts[i], pts[i + 1]);
} else {
this.backboneScreen.setT(scr);
this.backbonePt.setT(pts[i + 1]);
}this.bsr.renderHermiteConic(i, false, 4);
this.colix = this.bsr.getLeadColix(i);
if (this.bsr.setBioColix(this.colix)) {
if (this.cartoonRibose && bsVisible.get(i + 1)) this.renderNucleicBaseStep(i, pts[i + 1], screens[i + 1]);
 else this.renderNucleicBaseStep(i, null, null);
}}
}, "J.renderbio.BioShapeRenderer");
Clazz_defineMethod(c$, "renderNucleicBaseStep", 
function(im, ptPnext, scrPnext){
if (this.bsr.isPhosphorusOnly) return;
var nucleotide = this.bsr.monomers[im];
var thisMad = this.bsr.mad = this.bsr.mads[im];
if (this.rScr[0] == null) {
for (var i = 10; --i >= 0; ) this.rScr[i] =  new JU.P3();

for (var i = 5; --i >= 0; ) this.rScr5[i] =  new JU.P3();

this.baseScreen =  new JU.P3();
this.basePt =  new JU.P3();
this.rPt[9] =  new JU.P3();
}if (this.cartoonBlocks) {
this.renderBlock(nucleotide);
return;
}if (this.cartoonBaseEdges) {
this.renderLeontisWesthofEdges(nucleotide);
return;
}if (this.cartoonSteps) {
this.renderSteps(nucleotide, im);
return;
}nucleotide.getBaseRing6Points(this.rPt);
this.transformPoints(6, this.rPt, this.rScr);
if (!this.cartoonLadders) this.renderRing6();
var stepScreen;
var stepPt;
var pt;
var hasRing5 = nucleotide.maybeGetBaseRing5Points(this.rPt5);
if (hasRing5) {
if (this.cartoonLadders) {
stepScreen = this.rScr[2];
stepPt = this.rPt[2];
} else {
this.transformPoints(5, this.rPt5, this.rScr5);
this.renderRing5();
stepScreen = this.rScr5[3];
stepPt = this.rPt5[3];
}} else {
pt = (this.cartoonLadders ? 4 : 2);
stepScreen = this.rScr[pt];
stepPt = this.rPt[pt];
}var mad = (thisMad > 1 ? Clazz_doubleToInt(thisMad / 2) : thisMad);
var r = mad / 2000;
var w = Clazz_floatToInt(this.vwr.tm.scaleToScreen(Clazz_floatToInt(this.backboneScreen.z), mad));
if (this.cartoonLadders || !this.cartoonRibose) this.g3d.fillCylinderScreen3I(3, w, this.backboneScreen, stepScreen, this.backbonePt, stepPt, r);
if (this.cartoonLadders) return;
this.drawEdges(this.rScr, this.rPt, 6);
if (hasRing5) this.drawEdges(this.rScr5, this.rPt5, 5);
 else this.renderEdge(this.rScr, this.rPt, 0, 5);
if (this.cartoonRibose) {
this.baseScreen.setT(stepScreen);
this.basePt.setT(stepPt);
nucleotide.getRiboseRing5Points(this.rPt);
var c = this.rPt[9];
c.set(0, 0, 0);
for (var i = 0; i < 5; i++) c.add(this.rPt[i]);

c.scale(0.2);
this.transformPoints(10, this.rPt, this.rScr);
this.renderRibose();
this.renderEdge(this.rScr, this.rPt, 2, 5);
this.renderEdge(this.rScr, this.rPt, 3, 6);
this.renderEdge(this.rScr, this.rPt, 6, 7);
this.renderEdge(this.rScr, this.rPt, 7, 8);
this.renderEdge(this.rScr, this.rPt, 0, 4);
this.renderCyl(this.rScr[0], this.baseScreen, this.rPt[0], this.basePt);
if (ptPnext != null) this.renderCyl(this.rScr[5], scrPnext, this.rPt[5], ptPnext);
this.drawEdges(this.rScr, this.rPt, 5);
}}, "~N,JU.T3,JU.T3");
Clazz_defineMethod(c$, "renderSteps", 
function(g, i){
var bps = g.getBasePairs();
var atomA = g.getLeadAtom();
var cA = JU.C.getColixInherited(this.colix, atomA.colixAtom);
if (bps != null) {
var checkPass2 = (!this.bsr.isExport && !this.vwr.gdata.isPass2);
var atoms = this.vwr.ms.at;
for (var j = bps.size(); --j >= 0; ) {
var iAtom = bps.get(j).getPartnerAtom(g);
if (iAtom > i) {
var atomB = atoms[iAtom];
var cB = JU.C.getColixInherited(this.colix, atomB.colixAtom);
if (!checkPass2 || this.bsr.setBioColix(cA) || this.bsr.setBioColix(cB)) this.bsr.drawSegmentAB(atomA, atomB, cA, cB, 1000);
}}
}}, "JM.NucleicMonomer,~N");
Clazz_defineMethod(c$, "transformPoints", 
function(count, angstroms, screens){
for (var i = count; --i >= 0; ) this.tm.transformPtScrT3(angstroms[i], screens[i]);

}, "~N,~A,~A");
Clazz_defineMethod(c$, "drawEdges", 
function(scr, pt, n){
for (var i = n; --i >= 0; ) scr[i].z--;

for (var i = n; --i > 0; ) this.renderEdge(scr, pt, i, i - 1);

}, "~A,~A,~N");
Clazz_defineMethod(c$, "renderBlock", 
function(g){
var atomA = g.getLeadAtom();
var cA = this.colix;
if (this.scrBox == null) {
this.scrBox =  new Array(8);
for (var j = 0; j < 8; j++) this.scrBox[j] =  new JU.P3();

}var oxyz = g.getDSSRFrame(this.vwr);
var box = g.dssrBox;
var lastHeight = g.dssrBoxHeight;
var isPurine = g.isPurine();
if (box == null || lastHeight != this.blockHeight) {
g.dssrBoxHeight = this.blockHeight;
if (box == null) {
box =  new Array(8);
for (var j = 8; --j >= 0; ) box[j] =  new JU.P3();

g.dssrBox = box;
}var uc = this.vwr.getSymTemp().getUnitCell(oxyz, false, null);
if (this.ptTemp == null) this.ptTemp =  new JU.P3();
this.ptTemp.setT(oxyz[0]);
uc.toFractional(this.ptTemp, true);
uc.setOffsetPt(JU.P3.new3(this.ptTemp.x - 2.25, this.ptTemp.y + 5, this.ptTemp.z - this.blockHeight / 2));
var x = 4.5;
var y = (isPurine ? -4.5 : -3.0);
var z = this.blockHeight;
uc.toCartesian(box[0] = JU.P3.new3(0, 0, 0), false);
uc.toCartesian(box[1] = JU.P3.new3(x, 0, 0), false);
uc.toCartesian(box[2] = JU.P3.new3(x, y, 0), false);
uc.toCartesian(box[3] = JU.P3.new3(0, y, 0), false);
uc.toCartesian(box[4] = JU.P3.new3(0, 0, z), false);
uc.toCartesian(box[5] = JU.P3.new3(x, 0, z), false);
uc.toCartesian(box[6] = JU.P3.new3(x, y, z), false);
uc.toCartesian(box[7] = JU.P3.new3(0, y, z), false);
}for (var j = 0; j < 8; j++) this.vwr.tm.transformPt3f(box[j], this.scrBox[j]);

for (var j = 0; j < 36; ) this.g3d.fillTriangle3f(this.scrBox[this.triangles[j++]], this.scrBox[this.triangles[j++]], this.scrBox[this.triangles[j++]], false);

var atomB = g.getC1P();
var atomC = g.getN0();
if (atomB != null && atomC != null) {
this.bsr.drawSegmentAB(atomA, atomB, cA, cA, 1000);
this.bsr.drawSegmentAB(atomB, atomC, cA, cA, 1000);
}}, "JM.NucleicMonomer");
Clazz_defineMethod(c$, "renderLeontisWesthofEdges", 
function(nucleotide){
if (!nucleotide.getEdgePoints(this.rPt)) return;
this.transformPoints(6, this.rPt, this.rScr);
this.renderTriangle(this.rScr, this.rPt, 2, 3, 4, true);
this.renderEdge(this.rScr, this.rPt, 0, 1);
this.renderEdge(this.rScr, this.rPt, 1, 2);
var isTranslucent = JU.C.isColixTranslucent(this.colix);
var tl = JU.C.getColixTranslucencyLevel(this.colix);
var colixSugarEdge = JU.C.getColixTranslucent3(10, isTranslucent, tl);
var colixWatsonCrickEdge = JU.C.getColixTranslucent3(11, isTranslucent, tl);
var colixHoogsteenEdge = JU.C.getColixTranslucent3(7, isTranslucent, tl);
this.g3d.setC(colixSugarEdge);
this.renderEdge(this.rScr, this.rPt, 2, 3);
this.g3d.setC(colixWatsonCrickEdge);
this.renderEdge(this.rScr, this.rPt, 3, 4);
this.g3d.setC(colixHoogsteenEdge);
this.renderEdge(this.rScr, this.rPt, 4, 5);
}, "JM.NucleicMonomer");
Clazz_defineMethod(c$, "renderEdge", 
function(scr, pt, i, j){
this.renderCyl(scr[i], scr[j], pt[i], pt[j]);
}, "~A,~A,~N,~N");
Clazz_defineMethod(c$, "renderCyl", 
function(s1, s2, p1, p2){
this.g3d.fillCylinderScreen3I(3, 3, s1, s2, p1, p2, 0.005);
}, "JU.P3,JU.P3,JU.P3,JU.P3");
Clazz_defineMethod(c$, "renderTriangle", 
function(scr, pt, i, j, k, doShade){
this.g3d.fillTriangle3i(scr[i], scr[j], scr[k], pt[i], pt[j], pt[k], doShade);
}, "~A,~A,~N,~N,~N,~B");
Clazz_defineMethod(c$, "renderRing6", 
function(){
this.renderTriangle(this.rScr, this.rPt, 0, 2, 4, true);
this.renderTriangle(this.rScr, this.rPt, 0, 1, 2, false);
this.renderTriangle(this.rScr, this.rPt, 0, 4, 5, false);
this.renderTriangle(this.rScr, this.rPt, 2, 3, 4, false);
});
Clazz_defineMethod(c$, "renderRing5", 
function(){
this.renderTriangle(this.rScr5, this.rPt5, 0, 1, 2, false);
this.renderTriangle(this.rScr5, this.rPt5, 0, 2, 3, false);
this.renderTriangle(this.rScr5, this.rPt5, 0, 3, 4, false);
});
Clazz_defineMethod(c$, "renderRibose", 
function(){
this.renderTriangle(this.rScr, this.rPt, 0, 1, 9, true);
this.renderTriangle(this.rScr, this.rPt, 1, 2, 9, true);
this.renderTriangle(this.rScr, this.rPt, 2, 3, 9, true);
this.renderTriangle(this.rScr, this.rPt, 3, 4, 9, true);
this.renderTriangle(this.rScr, this.rPt, 4, 0, 9, true);
});
});
;//5.0.1-v7 Mon Aug 17 10:07:10 MDT 2026
Clazz_declarePackage("J.renderbio");
Clazz_load(["J.renderbio.StrandsRenderer"], "J.renderbio.RocketsRenderer", ["javajs.api.Interface", "JU.P3", "J.c.STR"], function(){
var c$ = Clazz_decorateAsClass(function(){
this.isRockets = false;
this.helixRockets = true;
this.renderArrowHeads = false;
this.cordMidPoints = null;
this.rr = null;
Clazz_instantialize(this, arguments);}, J.renderbio, "RocketsRenderer", J.renderbio.StrandsRenderer);
Clazz_overrideMethod(c$, "renderBioShape", 
function(bioShape){
if (!this.setupRR(bioShape, true)) return;
this.calcRopeMidPoints();
this.renderRockets();
this.vwr.freeTempPoints(this.cordMidPoints);
}, "J.shapebio.BioShape");
Clazz_defineMethod(c$, "renderRockets", 
function(){
if (this.rr == null) this.rr = (javajs.api.Interface.getInterface("J.renderbio.RocketRenderer")).set(this);
this.rr.renderRockets();
});
Clazz_defineMethod(c$, "setupRR", 
function(bioShape, isRockets){
this.isRockets = isRockets;
if (this.wireframeOnly) {
this.renderStrands();
} else if (this.wingVectors != null && !this.isCarbohydrate && !(isRockets && this.isNucleic)) {
var val = !this.vwr.getBoolean(603979902);
if (!this.isNucleic && this.renderArrowHeads != val) {
bioShape.falsifyMesh();
this.renderArrowHeads = val;
}return true;
}return false;
}, "J.shapebio.BioShape,~B");
Clazz_defineMethod(c$, "calcRopeMidPoints", 
function(){
var midPointCount = this.monomerCount + 1;
this.cordMidPoints = this.vwr.allocTempPoints(midPointCount);
var proteinstructurePrev = null;
var point;
var ptLastRocket = -10;
var pt1 =  new JU.P3();
var pt2 =  new JU.P3();
for (var i = 0; i <= this.monomerCount; ++i) {
point = this.cordMidPoints[i];
if (i < this.monomerCount && (this.helixRockets && this.structureTypes[i] === J.c.STR.HELIX || this.isRockets && this.structureTypes[i] === J.c.STR.SHEET)) {
var proteinstructure = this.monomers[i].getStructure();
if (proteinstructure === proteinstructurePrev) {
pt1.add(pt2);
ptLastRocket = i;
} else {
proteinstructurePrev = proteinstructure;
pt1.setT(proteinstructure.getAxisStartPoint());
pt2.sub2(proteinstructure.getAxisEndPoint(), pt1);
pt2.scale(1 / (proteinstructure.nRes - 1));
if (ptLastRocket == i - 3) {
this.cordMidPoints[i - 1].ave(this.cordMidPoints[i - 2], pt1);
}}point.setT(pt1);
} else {
if (ptLastRocket == i - 1 && i > 1) this.cordMidPoints[i - 1].setT(this.cordMidPoints[i > 2 ? i - 3 : i - 2]);
point.setT(proteinstructurePrev == null ? this.controlPoints[i] : proteinstructurePrev.getAxisEndPoint());
proteinstructurePrev = null;
}}
this.controlPoints = this.cordMidPoints;
this.calcScreenControlPoints();
});
Clazz_defineMethod(c$, "adjustStrut", 
function(segments, start, end, offset){
for (var i = start; i <= end; i++) {
var a = this.monomers[i + offset].getLeadAtom();
var pt = this.getStrutPointIfNeeded(a);
if (pt != null) {
pt.setT(segments[i]);
pt.sX = 0;
}}
}, "~A,~N,~N,~N");
});
;//5.0.1-v7 Mon Aug 17 10:07:10 MDT 2026
Clazz_declarePackage("J.renderbio");
Clazz_load(["J.renderbio.RocketsRenderer"], "J.renderbio.CartoonRenderer", ["J.api.Interface", "J.c.STR"], function(){
var c$ = Clazz_decorateAsClass(function(){
this.nucleicRenderer = null;
Clazz_instantialize(this, arguments);}, J.renderbio, "CartoonRenderer", J.renderbio.RocketsRenderer);
Clazz_overrideMethod(c$, "renderBioShape", 
function(bioShape){
if (!this.setupRR(bioShape, false)) return;
if (this.isNucleic || this.isPhosphorusOnly) {
if (this.nucleicRenderer == null) this.nucleicRenderer = J.api.Interface.getInterface("J.renderbio.NucleicRenderer", this.vwr, "render");
this.calcScreenControlPoints();
this.nucleicRenderer.renderNucleic(this);
return;
}var val = this.vwr.getBoolean(603979819);
if (this.helixRockets != val) {
bioShape.falsifyMesh();
this.helixRockets = val;
}this.ribbonTopScreens = this.calcScreens(0.5, this.mads);
this.ribbonBottomScreens = this.calcScreens(-0.5, this.mads);
this.calcRopeMidPoints();
this.renderProtein();
this.vwr.freeTempPoints(this.cordMidPoints);
this.vwr.freeTempPoints(this.ribbonTopScreens);
this.vwr.freeTempPoints(this.ribbonBottomScreens);
}, "J.shapebio.BioShape");
Clazz_defineMethod(c$, "renderProtein", 
function(){
var lastWasSheet = false;
var lastWasHelix = false;
var previousStructure = null;
var thisStructure;
var needRockets = (this.helixRockets || !this.renderArrowHeads);
var doRockets = false;
for (var i = this.monomerCount; --i >= 0; ) {
thisStructure = this.monomers[i].getStructure();
if (thisStructure !== previousStructure) {
lastWasSheet = false;
}previousStructure = thisStructure;
var isHelix = (this.structureTypes[i] === J.c.STR.HELIX);
var isSheet = (this.structureTypes[i] === J.c.STR.SHEET);
if (this.bsVisible.get(i)) {
if (isHelix && needRockets) {
doRockets = true;
} else if (isSheet || isHelix) {
if (lastWasSheet && isSheet || lastWasHelix && isHelix) {
this.renderHermiteRibbon(true, i, true);
} else {
this.renderHermiteArrowHead(i);
}} else {
this.renderHermiteConic(i, true, 7);
}}lastWasSheet = isSheet;
lastWasHelix = isHelix && !this.helixRockets;
}
if (doRockets) this.renderRockets();
});
});
;//5.0.1-v7 Mon Aug 17 10:07:10 MDT 2026
Clazz_declarePackage("J.renderbio");
Clazz_load(["J.renderbio.BioShapeRenderer"], "J.renderbio.BackboneRenderer", ["JU.C"], function(){
var c$ = Clazz_decorateAsClass(function(){
this.isDataFrame = false;
Clazz_instantialize(this, arguments);}, J.renderbio, "BackboneRenderer", J.renderbio.BioShapeRenderer);
Clazz_overrideMethod(c$, "renderBioShape", 
function(bioShape){
var checkPass2 = (!this.isExport && !this.vwr.gdata.isPass2);
this.isDataFrame = this.ms.isJmolDataFrame(bioShape.modelIndex);
var n = this.monomerCount;
var atoms = this.ms.at;
for (var i = this.bsVisible.nextSetBit(0); i >= 0; i = this.bsVisible.nextSetBit(i + 1)) {
var atomA = atoms[this.leadAtomIndices[i]];
var cA = this.colixes[i];
this.mad = this.mads[i];
var i1 = (i + 1) % n;
var atomB = atoms[this.leadAtomIndices[i1]];
var cB = this.colixes[i1];
if (atomA.nBackbonesDisplayed > 0 && atomB.nBackbonesDisplayed > 0 && !this.ms.isAtomHidden(atomB.i) && (this.isDataFrame || atomA.distanceSquared(atomB) < 100)) {
cA = JU.C.getColixInherited(cA, atomA.colixAtom);
cB = JU.C.getColixInherited(cB, atomB.colixAtom);
if (!checkPass2 || this.setBioColix(cA) || this.setBioColix(cB)) {
this.drawSegmentAB(atomA, atomB, cA, cB, 100);
if (this.renderStruts) {
this.setStrutPoint(atomA, null);
this.setStrutPoint(atomB, null);
}}}}
}, "J.shapebio.BioShape");
});
;//5.0.1-v7 Mon Aug 17 10:07:10 MDT 2026
Clazz_declarePackage("J.renderbio");
Clazz_load(["J.renderbio.StrandsRenderer"], "J.renderbio.TraceRenderer", null, function(){
var c$ = Clazz_declareType(J.renderbio, "TraceRenderer", J.renderbio.StrandsRenderer);
Clazz_overrideMethod(c$, "renderBioShape", 
function(bioShape){
if (this.wireframeOnly) this.renderStrands();
 else this.renderTrace();
}, "J.shapebio.BioShape");
Clazz_defineMethod(c$, "renderTrace", 
function(){
this.calcScreenControlPoints();
for (var i = this.bsVisible.nextSetBit(0); i >= 0; i = this.bsVisible.nextSetBit(i + 1)) this.renderHermiteConic(i, false, 7);

});
});
;//5.0.1-v7 Mon Aug 17 10:07:10 MDT 2026
})(Clazz
,Clazz.getClassName
,Clazz.newLongArray
,Clazz.doubleToByte
,Clazz.doubleToInt
,Clazz.doubleToLong
,Clazz.declarePackage
,Clazz.instanceOf
,Clazz.load
,Clazz.instantialize
,Clazz.decorateAsClass
,Clazz.floatToInt
,Clazz.floatToLong
,Clazz.makeConstructor
,Clazz.defineEnumConstant
,Clazz.exceptionOf
,Clazz.newIntArray
,Clazz.newFloatArray
,Clazz.declareType
,Clazz.prepareFields
,Clazz.superConstructor
,Clazz.newByteArray
,Clazz.declareInterface
,Clazz.newShortArray
,Clazz.innerTypeInstance
,Clazz.isClassDefined
,Clazz.prepareCallback
,Clazz.newArray
,Clazz.castNullAs
,Clazz.floatToShort
,Clazz.superCall
,Clazz.decorateAsType
,Clazz.newBooleanArray
,Clazz.newCharArray
,Clazz.implementOf
,Clazz.newDoubleArray
,Clazz.overrideConstructor
,Clazz.clone
,Clazz.doubleToShort
,Clazz.getInheritedLevel
,Clazz.getParamsType
,Clazz.isAF
,Clazz.isAB
,Clazz.isAI
,Clazz.isAS
,Clazz.isASS
,Clazz.isAP
,Clazz.isAFloat
,Clazz.isAII
,Clazz.isAFF
,Clazz.isAFFF
,Clazz.tryToSearchAndExecute
,Clazz.getStackTrace
,Clazz.inheritArgs
,Clazz.alert
,Clazz.defineMethod
,Clazz.overrideMethod
,Clazz.declareAnonymous
//,Clazz.checkPrivateMethod
,Clazz.cloneFinals
);
