Clazz.declarePackage ("J.adapter.writers");
Clazz.load (["J.api.JmolWriter"], "J.adapter.writers.PDBWriter", ["java.util.Arrays", "$.Date", "$.Hashtable", "JU.Lst", "$.P3", "$.PT", "JM.LabelToken", "JV.Viewer"], function () {
c$ = Clazz.decorateAsClass (function () {
this.vwr = null;
this.oc = null;
this.isPQR = false;
this.doTransform = false;
this.allTrajectories = false;
Clazz.instantialize (this, arguments);
}, J.adapter.writers, "PDBWriter", null, J.api.JmolWriter);
Clazz.makeConstructor (c$, 
function () {
});
Clazz.overrideMethod (c$, "set", 
function (viewer, oc, data) {
this.vwr = viewer;
this.oc = (oc == null ? this.vwr.getOutputChannel (null, null) : oc);
this.isPQR = (data[0]).booleanValue ();
this.doTransform = (data[1]).booleanValue ();
this.allTrajectories = (data[2]).booleanValue ();
}, "JV.Viewer,JU.OC,~A");
Clazz.overrideMethod (c$, "write", 
function (bs) {
var type = this.oc.getType ();
this.isPQR = new Boolean (this.isPQR | (type != null && type.indexOf ("PQR") >= 0)).valueOf ();
this.doTransform = new Boolean (this.doTransform | (type != null && type.indexOf ("-coord true") >= 0)).valueOf ();
var atoms = this.vwr.ms.at;
var models = this.vwr.ms.am;
var occTemp = "%6.2Q%6.2b          ";
if (this.isPQR) {
occTemp = "%8.4P%7.4V       ";
var charge = 0;
for (var i = bs.nextSetBit (0); i >= 0; i = bs.nextSetBit (i + 1)) charge += atoms[i].getPartialCharge ();

this.oc.append ("REMARK   1 PQR file generated by Jmol " + JV.Viewer.getJmolVersion ()).append ("\nREMARK   1 " + "created " + ( new java.util.Date ())).append ("\nREMARK   1 Forcefield Used: unknown\nREMARK   1").append ("\nREMARK   5").append ("\nREMARK   6 Total charge on this protein: " + charge + " e\nREMARK   6\n");
}var iModel = atoms[bs.nextSetBit (0)].mi;
var iModelLast = -1;
var lastAtomIndex = bs.length () - 1;
var lastModelIndex = atoms[lastAtomIndex].mi;
var isMultipleModels = (iModel != lastModelIndex);
var bsModels = this.vwr.ms.getModelBS (bs, true);
var nModels = bsModels.cardinality ();
var lines =  new JU.Lst ();
var isMultipleBondPDB = models[iModel].isPdbWithMultipleBonds;
var uniqueAtomNumbers = false;
if (nModels > 1) {
var conectArray = null;
for (var nFiles = 0, i = bsModels.nextSetBit (0); i >= 0; i = bsModels.nextSetBit (i + 1)) {
var a = this.vwr.ms.getModelAuxiliaryInfo (i).get ("PDB_CONECT_bonds");
if (a !== conectArray || !this.vwr.ms.am[i].isBioModel) {
conectArray = a;
if (nFiles++ > 0) {
uniqueAtomNumbers = true;
break;
}}}
}var tokens;
var ptTemp =  new JU.P3 ();
var o =  Clazz.newArray (-1, [ptTemp]);
var q = (this.doTransform ? this.vwr.tm.getRotationQ () : null);
var map =  new java.util.Hashtable ();
var isBiomodel = false;
var firstAtomIndexNew = (uniqueAtomNumbers ?  Clazz.newIntArray (nModels, 0) : null);
var modelPt = 0;
for (var i = bs.nextSetBit (0); i >= 0; i = bs.nextSetBit (i + 1)) {
var a = atoms[i];
isBiomodel = models[a.mi].isBioModel;
if (isMultipleModels && a.mi != iModelLast) {
if (iModelLast != -1) {
modelPt = this.fixPDBFormat (lines, map, this.oc, firstAtomIndexNew, modelPt);
this.oc.append ("ENDMDL\n");
}lines =  new JU.Lst ();
iModel = iModelLast = a.mi;
this.oc.append ("MODEL     " + (iModelLast + 1) + "\n");
}var sa = a.getAtomName ();
var leftJustify = (a.getElementSymbol ().length == 2 || sa.length >= 4 || JU.PT.isDigit (sa.charAt (0)));
var isHetero = a.isHetero ();
if (!isBiomodel) tokens = (leftJustify ? JM.LabelToken.compile (this.vwr, "HETATM%5.-5i %-4.4a%1AUNK %1c   1%1E   _XYZ_" + occTemp, '\0', null) : JM.LabelToken.compile (this.vwr, "HETATM%5.-5i  %-3.3a%1AUNK %1c   1%1E   _XYZ_" + occTemp, '\0', null));
 else if (isHetero) tokens = (leftJustify ? JM.LabelToken.compile (this.vwr, "HETATM%5.-5i %-4.4a%1A%3.3n %1c%4.-4R%1E   _XYZ_" + occTemp, '\0', null) : JM.LabelToken.compile (this.vwr, "HETATM%5.-5i  %-3.3a%1A%3.3n %1c%4.-4R%1E   _XYZ_" + occTemp, '\0', null));
 else tokens = (leftJustify ? JM.LabelToken.compile (this.vwr, "ATOM  %5.-5i %-4.4a%1A%3.3n %1c%4.-4R%1E   _XYZ_" + occTemp, '\0', null) : JM.LabelToken.compile (this.vwr, "ATOM  %5.-5i  %-3.3a%1A%3.3n %1c%4.-4R%1E   _XYZ_" + occTemp, '\0', null));
var XX = a.getElementSymbolIso (false).toUpperCase ();
XX = this.pdbKey (a.group.getBioPolymerIndexInModel ()) + this.pdbKey (a.group.groupIndex) + JM.LabelToken.formatLabelAtomArray (this.vwr, a, tokens, '\0', null, ptTemp) + (XX.length == 1 ? " " + XX : XX.substring (0, 2)) + "  ";
this.vwr.ms.getPointTransf (-1, a, q, ptTemp);
var xyz = JU.PT.sprintf ("%8.3p%8.3p%8.3p", "p", o);
if (xyz.length > 24) xyz = JU.PT.sprintf ("%8.2p%8.2p%8.2p", "p", o);
XX = JU.PT.rep (XX, "_XYZ_", xyz);
lines.addLast (XX);
}
this.fixPDBFormat (lines, map, this.oc, firstAtomIndexNew, modelPt);
if (isMultipleModels) this.oc.append ("ENDMDL\n");
modelPt = -1;
iModelLast = -1;
var conectKey = "" + (isMultipleModels ? modelPt : 0);
isBiomodel = false;
for (var i = bs.nextSetBit (0); i >= 0; i = bs.nextSetBit (i + 1)) {
var a = atoms[i];
if (isMultipleModels && a.mi != iModelLast) {
iModelLast = a.mi;
isBiomodel = models[iModelLast].isBioModel;
modelPt++;
}var isHetero = (!isBiomodel || a.isHetero ());
var isCysS = !isHetero && (a.getElementNumber () == 16);
if (isHetero || isMultipleBondPDB || isCysS) {
var bonds = a.bonds;
if (bonds != null) for (var j = 0; j < bonds.length; j++) {
var iThis = a.getAtomNumber ();
var a2 = bonds[j].getOtherAtom (a);
if (!bs.get (a2.i)) continue;
var n = bonds[j].getCovalentOrder ();
if (n == 1 && (isMultipleBondPDB && !isHetero && !isCysS || isCysS && a2.getElementNumber () != 16)) continue;
var iOther = a2.getAtomNumber ();
switch (n) {
case 2:
case 3:
if (iOther < iThis) continue;
case 1:
var inew = map.get (conectKey + "." + Integer.$valueOf (iThis));
var inew2 = map.get (conectKey + "." + Integer.$valueOf (iOther));
if (inew == null || inew2 == null) break;
this.oc.append ("CONECT").append (JU.PT.formatStringS ("%5s", "s", "" + inew));
var s = JU.PT.formatStringS ("%5s", "s", "" + inew2);
for (var k = 0; k < n; k++) this.oc.append (s);

this.oc.append ("\n");
break;
}
}
}}
return this.toString ();
}, "JU.BS");
Clazz.defineMethod (c$, "pdbKey", 
 function (np) {
var xp = (np < 0 ? "~999" : "   " + np);
return xp.substring (xp.length - 4);
}, "~N");
Clazz.defineMethod (c$, "fixPDBFormat", 
 function (lines, map, out, firstAtomIndexNew, modelPt) {
lines.addLast ("~999~999XXXXXX99999999999999999999~99~");
var alines =  new Array (lines.size ());
lines.toArray (alines);
java.util.Arrays.sort (alines);
lines.clear ();
for (var i = 0, n = alines.length; i < n; i++) {
lines.addLast (alines[i]);
}
var lastPoly = null;
var lastLine = null;
var n = lines.size ();
var newAtomNumber = 0;
var iBase = (firstAtomIndexNew == null ? 0 : firstAtomIndexNew[modelPt]);
for (var i = 0; i < n; i++) {
var s = lines.get (i);
var poly = s.substring (0, 4);
s = s.substring (8);
var isTerm = false;
var isLast = (s.indexOf ("~99~") >= 0);
if (!poly.equals (lastPoly) || isLast) {
if (lastPoly != null && !lastPoly.equals ("~999")) {
isTerm = true;
s = "TER   " + lastLine.substring (6, 11) + "      " + lastLine.substring (17, 27);
lines.add (i, poly + "~~~~" + s);
n++;
}lastPoly = poly;
}if (isLast && !isTerm) break;
lastLine = s;
newAtomNumber = i + 1 + iBase;
if (map != null && !isTerm) map.put ("" + modelPt + "." + Integer.$valueOf (JU.PT.parseInt (s.substring (6, 11))), Integer.$valueOf (newAtomNumber));
var si = "     " + newAtomNumber;
out.append (s.substring (0, 6)).append (si.substring (si.length - 5)).append (s.substring (11)).append ("\n");
}
if (firstAtomIndexNew != null && ++modelPt < firstAtomIndexNew.length) firstAtomIndexNew[modelPt] = newAtomNumber;
return modelPt;
}, "JU.Lst,java.util.Map,JU.OC,~A,~N");
Clazz.overrideMethod (c$, "toString", 
function () {
return (this.oc == null ? "" : this.oc.toString ());
});
});
