Revision: 20904 http://sourceforge.net/p/jmol/code/20904 Author: hansonr Date: 2015-12-23 21:59:40 +0000 (Wed, 23 Dec 2015) Log Message: ----------- Jmol.___JmolVersion="14.4.1_2015.12.23b"
bug fix: JavaScript error reporting uses alert() instead of just setting the error message bug fix: PyMOL 1.8 PSE files cannot be read because of missing settings code: more efficient loading of PyMOL .pse session files Modified Paths: -------------- branches/v14_4/Jmol/src/org/jmol/adapter/readers/pymol/PickleReader.java branches/v14_4/Jmol/src/org/jmol/adapter/readers/pymol/PyMOL.java branches/v14_4/Jmol/src/org/jmol/adapter/readers/pymol/PyMOLReader.java branches/v14_4/Jmol/src/org/jmol/adapter/readers/pymol/PyMOLScene.java branches/v14_4/Jmol/src/org/jmol/modelset/AtomCollection.java branches/v14_4/Jmol/src/org/jmol/modelset/ModelLoader.java branches/v14_4/Jmol/src/org/jmol/modelset/ModelSet.java branches/v14_4/Jmol/src/org/jmol/script/ScriptManager.java branches/v14_4/Jmol/src/org/jmol/viewer/Jmol.properties trunk/Jmol/src/org/jmol/adapter/readers/pymol/PickleReader.java trunk/Jmol/src/org/jmol/adapter/readers/pymol/PyMOL.java trunk/Jmol/src/org/jmol/adapter/readers/pymol/PyMOLReader.java trunk/Jmol/src/org/jmol/adapter/readers/pymol/PyMOLScene.java trunk/Jmol/src/org/jmol/modelset/AtomCollection.java trunk/Jmol/src/org/jmol/modelset/ModelLoader.java trunk/Jmol/src/org/jmol/modelset/ModelSet.java trunk/Jmol/src/org/jmol/script/ScriptManager.java trunk/Jmol/src/org/jmol/viewer/Jmol.properties trunk/Jmol/src/org/jmol/viewer/Viewer.java Modified: branches/v14_4/Jmol/src/org/jmol/adapter/readers/pymol/PickleReader.java =================================================================== --- branches/v14_4/Jmol/src/org/jmol/adapter/readers/pymol/PickleReader.java 2015-12-23 08:23:37 UTC (rev 20903) +++ branches/v14_4/Jmol/src/org/jmol/adapter/readers/pymol/PickleReader.java 2015-12-23 21:59:40 UTC (rev 20904) @@ -1,15 +1,13 @@ package org.jmol.adapter.readers.pymol; +import java.util.Hashtable; +import java.util.Map; + import javajs.api.GenericBinaryDocument; import javajs.util.Lst; import javajs.util.SB; import org.jmol.util.Logger; - -import java.util.Hashtable; - -import java.util.Map; - import org.jmol.viewer.Viewer; /** @@ -98,6 +96,7 @@ PickleReader(GenericBinaryDocument doc, Viewer vwr) { binaryDoc = doc; this.vwr = vwr; + stack.ensureCapacity(1000); } private void log(String s) { @@ -386,10 +385,11 @@ private Lst<Object> getObjects(int mark) { int n = stack.size() - mark; Lst<Object> args = new Lst<Object>(); - for (int j = 0; j < n; j++) - args.addLast(null); - for (int j = n, i = stack.size(); --i >= mark;) - args.set(--j, stack.remove(i)); + args.ensureCapacity(n); + for (int i = mark; i < stack.size(); ++i) + args.addLast(stack.get(i)); + for (int i = stack.size(); --i >= mark;) + stack.remove(i); return args; } @@ -417,8 +417,12 @@ switch (markCount) { case 2: thisSection = stack.get(i - 2); - inMovie = "movie".equals(thisSection); - inNames = "names".equals(thisSection); + // BH: Note that JavaScript string == object first converts object to string, then checks. + // This can be very slow if the object is complex. + if (thisSection instanceof String) { + inMovie = "movie".equals(thisSection); + inNames = "names".equals(thisSection); + } break; default: break; Modified: branches/v14_4/Jmol/src/org/jmol/adapter/readers/pymol/PyMOL.java =================================================================== --- branches/v14_4/Jmol/src/org/jmol/adapter/readers/pymol/PyMOL.java 2015-12-23 08:23:37 UTC (rev 20903) +++ branches/v14_4/Jmol/src/org/jmol/adapter/readers/pymol/PyMOL.java 2015-12-23 21:59:40 UTC (rev 20904) @@ -3,6 +3,8 @@ import java.util.Hashtable; import java.util.Map; +import javajs.util.P3; + import org.jmol.util.Logger; /** @@ -471,7 +473,7 @@ final static int offscreen_rendering_for_antialiasing = 695; final static int offscreen_rendering_multiplier = 696; final static int opaque_background = 435; - final static int ortho = 23; + final static int orthoscopic = 23; final static int overlay = 61; final static int overlay_lines = 311; final static int pdb_conect_all = 329; @@ -6243,30 +6245,137 @@ moreColors.put(id, Integer.valueOf(value)); } - public static float getDefaultSetting(int i, int pymolVersion) { + /** + * All settings that Jmol uses should go here + * + * @param i + * @param pymolVersion + * @return setting or 0 + */ + static float getDefaultSetting(int i, int pymolVersion) { switch (i) { - case label_size: - return 14; + case sphere_color: case cartoon_color: case ellipsoid_color: case ribbon_color: case line_color: + case dot_color: case stick_color: + case surface_color: + case dash_color: + case mesh_color: + case cartoon_putty_quality: case label_distance_digits: case label_angle_digits: case label_dihedral_digits: + case two_sided_lighting: return -1; case ray_pixel_scale: case ellipsoid_scale: + case sphere_scale: + case mesh_width: + case cartoon_ladder_mode: + case clamp_colors: + case frame: + case state: + case depth_cue: + case fog: + case cartoon_round_helices: + case cartoon_fancy_helices: + case label_digits: + case ribbon_sampling: return 1; - default: - Logger.info("PyMOL " + pymolVersion + " does not have setting " + i); - //$FALL-THROUGH$ + case sphere_transparency: case ellipsoid_transparency: case ribbon_transparency: case nonbonded_transparency: + case cartoon_transparency: + case stick_transparency: + case transparency: + case bg_rgb: + case cartoon_cylindrical_helices: + case surface_mode: + case surface_solvent: + case all_states: + case valence: + case cgo_transparency: + case cartoon_putty_transform: + case orthoscopic: + case ribbon_radius: + case ribbon_smooth: + case sphere_solvent: + case surface_carve_cutoff: return 0; + case cartoon_loop_radius: + return 0.2F; + case cartoon_rect_length: + return 1.4F; + case nonbonded_size: + return 0.25F; + case fog_start: + return 0.45f; + case label_size: + return 14; + case label_color: + return -6; + case label_font_id: + return 5; + case transparency_mode: + case cartoon_putty_range: + case cartoon_tube_cap: + return 2; + case cartoon_nucleic_acid_mode: + case cartoon_putty_scale_max: + return 4; + case cartoon_putty_radius: + return 0.4f; + case cartoon_putty_scale_min: + return 0.6f; + case cartoon_putty_scale_power: + return 1.5f; + case cartoon_tube_radius: + return 0.5f; + case solvent_radius: + return 1.4f; + case dash_width: + return 2.5f; + case line_width: + return 1.49f; + case ribbon_width: + return 3; + case field_of_view: + return 20; + case movie_fps: + return 30; + case stick_radius: + return 0.25f; + default: + Logger.error("PyMOL " + pymolVersion + " default float setting not found: " + i); + return 0; } } + static P3 getDefaultSettingPt(int i, int pymolVersion, P3 pt) { + switch (i) { + case label_position: + pt.set(0, 0, 0.75f); + break; + default: + Logger.error("PyMOL " + pymolVersion + " default point setting not found: " + i); + break; + } + return pt; + } + + static String getDefaultSettingS(int i, int pymolVersion) { + switch (i) { + case surface_carve_selection: + break; + default: + Logger.info("PyMOL " + pymolVersion + " does not have String setting " + i); + break; + } + return ""; + } + } Modified: branches/v14_4/Jmol/src/org/jmol/adapter/readers/pymol/PyMOLReader.java =================================================================== --- branches/v14_4/Jmol/src/org/jmol/adapter/readers/pymol/PyMOLReader.java 2015-12-23 08:23:37 UTC (rev 20903) +++ branches/v14_4/Jmol/src/org/jmol/adapter/readers/pymol/PyMOLReader.java 2015-12-23 21:59:40 UTC (rev 20904) @@ -183,7 +183,7 @@ sourcePNGJ = false; if (doCache) bsBytesExcluded = new BS(); - logging = false; + //logging = true; // specifically for Pickle super.initializeReader(); } @@ -272,8 +272,9 @@ pymolVersion, haveScenes, baseAtomIndex, baseModelIndex, doCache, filePath); // just log and display some information here - - logging = (vwr.getLogFileName().length() > 0); + String logFile = vwr.getLogFileName(); + logging = (logFile.length() > 0); + Logger.info(logging ? "PyMOL file data streaming to " + logFile : "To view raw PyMOL file data, use 'set logFile \"some_filename\" "); Lst<Object> names = getMapList(map, "names"); for (Map.Entry<String, Object> e : map.entrySet()) { String name = e.getKey(); @@ -332,11 +333,11 @@ // resize frame if (!isStateScript && doResize) { int width = 0, height = 0; - try { - width = intAt(getMapList(map, "main"), 0); - height = intAt(getMapList(map, "main"), 1); - } catch (Exception e) { - // ignore + Lst<Object> main = getMapList(map, "main"); + if (main != null) { + // not all PSE files have this + width = intAt(main, 0); + height = intAt(main, 1); } String note; if (width > 0 && height > 0) { @@ -493,7 +494,7 @@ Lst<Object> setting = (Lst<Object>) mySettings.get(j); int uid = (id << 10) + intAt(setting, 0); uniqueSettings.put(Integer.valueOf(uid), setting); - Logger.info("PyMOL unique setting " + id + " " + setting); + //System.out.println("PyMOL unique setting " + id + " " + setting); } } } @@ -514,7 +515,7 @@ for (int i = colors.size(); --i >= 0;) { Lst<Object> c = listAt(colors, i); PyMOL.addColor((Integer) c.get(1), isClamped ? PyMOLScene.colorSettingClamped(c) - : PyMOLScene.colorSetting(c)); + : PyMOLScene.getColorPt(c.get(2))); } } @@ -899,13 +900,15 @@ Lst<Object> coords = listAt(state, 2); Lst<Object> labelPositions = listAt(state, 8); - if (iState == 0 || !isTrajectory) + if (iState == 0 || !isTrajectory) { + pymolScene.ensureCapacity(n); for (int idx = 0; idx < n; idx++) { P3 a = addAtom(pymolAtoms, intAt(idxToAtm, idx), idx, coords, labelPositions, bsAtoms, iState); if (a != null) trajectoryStep[trajectoryPtr++] = a; } + } addBonds(bonds); addMolStructures(); atoms = asc.atoms; @@ -940,9 +943,10 @@ * @return list of bonds */ private Lst<Bond> getBondList(Lst<Object> bonds) { - Lst<Bond> bondList = new Lst<Bond>(); int asSingle = (pymolScene.booleanSetting(PyMOL.valence) ? 0 : JmolAdapter.ORDER_PYMOL_SINGLE); int n = bonds.size(); + Lst<Bond> bondList = new Lst<Bond>(); + bondList.ensureCapacity(n); for (int i = 0; i < n; i++) { Lst<Object> b = listAt(bonds, i); int order = intAt(b, 2); @@ -1081,7 +1085,7 @@ atom.radius = 1; atom.partialCharge = floatAt(a, 17); int formalCharge = intAt(a, 18); - + BS bsReps = getBsReps(listAt(a, 20)); int intReps = (bsReps == null ? intAt(a, 20) : 0); // Pymol 1.8 int atomColor = intAt(a, 21); @@ -1096,7 +1100,8 @@ atom.vib = V3.new3(uniqueID, cartoonType, Float.NaN); if (a.size() > 46) { float[] data = PyMOLScene.floatsAt(a, 41, new float[8], 6); - asc.setAnisoBorU(atom, data, 12); + if (data[0] != 0) + asc.setAnisoBorU(atom, data, 12); } //if (uniqueID > 0) //pymolScene.setUnique(uniqueID, atom); Modified: branches/v14_4/Jmol/src/org/jmol/adapter/readers/pymol/PyMOLScene.java =================================================================== --- branches/v14_4/Jmol/src/org/jmol/adapter/readers/pymol/PyMOLScene.java 2015-12-23 08:23:37 UTC (rev 20903) +++ branches/v14_4/Jmol/src/org/jmol/adapter/readers/pymol/PyMOLScene.java 2015-12-23 21:59:40 UTC (rev 20904) @@ -212,10 +212,9 @@ this.stateCount = stateCount; } - @SuppressWarnings("unchecked") PyMOLScene(PymolAtomReader reader, Viewer vwr, Lst<Object> settings, - Map<Integer, Lst<Object>> uniqueSettings, int pymolVersion, - boolean haveScenes, int baseAtomIndex, int baseModelIndex, + Map<Integer, Lst<Object>> uniqueSettings, int pymolVersion, + boolean haveScenes, int baseAtomIndex, int baseModelIndex, boolean doCache, String filePath) { this.reader = reader; this.vwr = vwr; @@ -229,11 +228,33 @@ this.surfaceInfoName = filePath + "##JmolSurfaceInfo##"; setVersionSettings(); settings.trimToSize(); - bgRgb = colorSetting(listAt(settings, PyMOL.bg_rgb)); - pointAt((Lst<Object>) listAt(settings, PyMOL.label_position).get(2), - 0, labelPosition0); + bgRgb = colorSetting(PyMOL.bg_rgb); + labelPosition0 = pointSetting(PyMOL.label_position); } + @SuppressWarnings("unchecked") + private int colorSetting(int i) { + Lst<Object> pos = listAt(settings, i); + Object o = (pos == null || pos.size() != 3 ? null : pos.get(2)); + if (o == null) + return (int) PyMOL.getDefaultSetting(i, pymolVersion); + return (o instanceof Integer ? ((Integer) o).intValue() : CU + .colorPtToFFRGB(pointAt((Lst<Object>) o, 0, ptTemp))); + } + + @SuppressWarnings("unchecked") + private P3 pointSetting(int i) { + P3 pt = new P3(); + Lst<Object> pos = listAt(settings, i); + if (pos != null && pos.size() == 3) + return pointAt((Lst<Object>) pos.get(2), 0, pt); + return PyMOL.getDefaultSettingPt(i, pymolVersion, pt); + } + + void ensureCapacity(int n) { + atomColorList.ensureCapacity(atomColorList.size() + n); + } + void setReaderObjectInfo(String name, int type, String groupName, boolean isHidden, Lst<Object> listObjSettings, Lst<Object> listStateSettings, String ext) { @@ -634,7 +655,7 @@ @SuppressWarnings("unchecked") static int getColorPt(Object o) { - return (o instanceof Integer ? ((Integer) o).intValue() : CU + return (o == null ? 0 : o instanceof Integer ? ((Integer) o).intValue() : CU .colorPtToFFRGB(pointAt((Lst<Object>) o, 0, ptTemp))); } @@ -642,10 +663,6 @@ return ((Number) list.get(i)).intValue(); } - static int colorSetting(Lst<Object> c) { - return getColorPt(c.get(2)); - } - void setReaderObjects() { clearReaderData(); finalizeObjects(); @@ -723,7 +740,7 @@ for (int j = 0; j < 8; j++) pymolView[pt++] = floatAt(view, i++); - boolean isOrtho = booleanSetting(PyMOL.ortho); // 23 + boolean isOrtho = booleanSetting(PyMOL.orthoscopic); // 23 float fov = floatSetting(PyMOL.field_of_view); // 152 pymolView[pt++] = (isOrtho ? fov : -fov); @@ -735,12 +752,10 @@ @SuppressWarnings("unchecked") float globalSetting(int i) { - try { - Lst<Object> setting = (Lst<Object>) settings.get(i); + Lst<Object> setting = (Lst<Object>) settings.get(i); + if (setting != null && setting.size() == 3) return ((Number) setting.get(2)).floatValue(); - } catch (Exception e) { - return PyMOL.getDefaultSetting(i, pymolVersion); - } + return PyMOL.getDefaultSetting(i, pymolVersion); } /** @@ -947,21 +962,17 @@ } float floatSetting(int i) { - try { - Lst<Object> setting = getSetting(i); + Lst<Object> setting = getSetting(i); + if (setting != null && setting.size() == 3) return ((Number) setting.get(2)).floatValue(); - } catch (Exception e) { - return PyMOL.getDefaultSetting(i, pymolVersion); - } + return PyMOL.getDefaultSetting(i, pymolVersion); } String stringSetting(int i) { - try { Lst<Object> setting = getSetting(i); - return setting.get(2).toString(); - } catch (Exception e) { - return null; - } + if (setting != null && setting.size() == 3) + return setting.get(2).toString(); + return PyMOL.getDefaultSettingS(i, pymolVersion); } @SuppressWarnings("unchecked") @@ -1105,8 +1116,7 @@ } static int colorSettingClamped(Lst<Object> c) { - return (c.size() < 6 || intAt(c, 4) == 0 ? colorSetting(c) : getColorPt(c - .get(5))); + return getColorPt(c.get(c.size() < 6 || intAt(c, 4) == 0 ? 2 : 5)); } void setAtomColor(int atomColor) { @@ -1685,11 +1695,11 @@ return defs; } - public boolean needSelections() { + boolean needSelections() { return haveScenes || !htCarveSets.isEmpty(); } - public void setUniqueBonds(BS bsBonds, boolean isSticks) { + void setUniqueBonds(BS bsBonds, boolean isSticks) { if (isSticks) { bsStickBonds.or(bsBonds); bsStickBonds.andNot(bsLineBonds); @@ -1734,7 +1744,7 @@ * @param argb * @param trans */ - public void setBondParameters(Bond b, int modelIndex, float rad, float pymolValence, + void setBondParameters(Bond b, int modelIndex, float rad, float pymolValence, int argb, float trans) { if (modelIndex >= 0 && b.atom1.mi != modelIndex) return; @@ -1755,7 +1765,7 @@ } - public void addMesh(int tok, Lst<Object> obj, String objName, boolean isMep) { + void addMesh(int tok, Lst<Object> obj, String objName, boolean isMep) { JmolObject jo = addJmolObject(tok, null, obj); setSceneObject(objName, -1); int meshColor = (int) floatSetting(PyMOL.mesh_color); @@ -1769,7 +1779,7 @@ jo.cacheID = surfaceInfoName; } - public JmolObject addIsosurface(String objectName) { + JmolObject addIsosurface(String objectName) { JmolObject jo = addJmolObject(T.isosurface, null, objectName); jo.cacheID = surfaceInfoName; return jo; Modified: branches/v14_4/Jmol/src/org/jmol/modelset/AtomCollection.java =================================================================== --- branches/v14_4/Jmol/src/org/jmol/modelset/AtomCollection.java 2015-12-23 08:23:37 UTC (rev 20903) +++ branches/v14_4/Jmol/src/org/jmol/modelset/AtomCollection.java 2015-12-23 21:59:40 UTC (rev 20904) @@ -2570,6 +2570,12 @@ atomTensors.remove(toDelete.get(i)); } + + private int atomCapacity; + void setCapacity(int nAtoms) { + atomCapacity += nAtoms; + } + public void setAtomTensors(int atomIndex, Lst<Object> list) { if (list == null || list.size() == 0) return; @@ -2590,6 +2596,16 @@ } } + public void addTensor(Tensor t, String type) { + type = type.toLowerCase(); + Lst<Object> tensors = atomTensors.get(type); + if (tensors == null) { + atomTensors.put(type, tensors = new Lst<Object>()); + tensors.ensureCapacity(atomCapacity); + } + tensors.addLast(t); + } + private static Object[] getTensorList(Lst<Object> list) { int pt = -1; boolean haveTLS = false; @@ -2637,14 +2653,6 @@ return null; } - public void addTensor(Tensor t, String type) { - type = type.toLowerCase(); - Lst<Object> tensors = atomTensors.get(type); - if (tensors == null) - atomTensors.put(type, tensors = new Lst<Object>()); - tensors.addLast(t); - } - public Lst<Object> getAllAtomTensors(String type) { if (atomTensors == null) return null; Modified: branches/v14_4/Jmol/src/org/jmol/modelset/ModelLoader.java =================================================================== --- branches/v14_4/Jmol/src/org/jmol/modelset/ModelLoader.java 2015-12-23 08:23:37 UTC (rev 20903) +++ branches/v14_4/Jmol/src/org/jmol/modelset/ModelLoader.java 2015-12-23 21:59:40 UTC (rev 20904) @@ -771,6 +771,7 @@ boolean addH = false; boolean isLegacyHAddition = false;//vwr.getBoolean(T.legacyhaddition); JmolAdapterAtomIterator iterAtom = adapter.getAtomIterator(asc); + ms.setCapacity(adapter.getAtomCount(asc)); int nRead = 0; Model[] models = ms.am; if (ms.mc > 0) Modified: branches/v14_4/Jmol/src/org/jmol/modelset/ModelSet.java =================================================================== --- branches/v14_4/Jmol/src/org/jmol/modelset/ModelSet.java 2015-12-23 08:23:37 UTC (rev 20903) +++ branches/v14_4/Jmol/src/org/jmol/modelset/ModelSet.java 2015-12-23 21:59:40 UTC (rev 20904) @@ -668,7 +668,7 @@ // full models are deleted for any model containing the specified atoms includeAllRelatedFrames(bsModels); - int nModelsDeleted = BSUtil.cardinalityOf(bsModels); + int nModelsDeleted = bsModels.cardinality(); if (nModelsDeleted == 0) return null; @@ -1310,14 +1310,14 @@ ptCenter.add(at[i]); } } - if (nPoints > 0) + if (nPoints > 1) ptCenter.scale(1.0f / nPoints); return ptCenter; } public P3 getAverageAtomPoint() { if (averageAtomPoint == null) - (averageAtomPoint = new P3()).setT(getAtomSetCenter(vwr.getAllAtoms())); + averageAtomPoint = getAtomSetCenter(vwr.getAllAtoms()); return averageAtomPoint; } @@ -2710,7 +2710,7 @@ + " pseudo-hbond calculation"); calcRasmolHydrogenBonds(bsA, bsB, null, false, Integer.MAX_VALUE, false, bsHBonds); - return -BSUtil.cardinalityOf(bsHBonds); + return -bsHBonds.cardinality(); } Logger.info(haveHAtoms ? "Standard Hbond calculation" : "Jmol pseudo-hbond calculation"); Modified: branches/v14_4/Jmol/src/org/jmol/script/ScriptManager.java =================================================================== --- branches/v14_4/Jmol/src/org/jmol/script/ScriptManager.java 2015-12-23 08:23:37 UTC (rev 20903) +++ branches/v14_4/Jmol/src/org/jmol/script/ScriptManager.java 2015-12-23 21:59:40 UTC (rev 20904) @@ -540,7 +540,7 @@ try { if (fileName.endsWith(".pse")) { cmd = (isCached ? "" : "zap;") + "load SYNC " + PT.esc(fileName) - + " filter 'DORESIZE'"; + + (vwr.isApplet ? "" : " filter 'DORESIZE'"); return; } if (fileName.endsWith("jvxl")) { Modified: branches/v14_4/Jmol/src/org/jmol/viewer/Jmol.properties =================================================================== --- branches/v14_4/Jmol/src/org/jmol/viewer/Jmol.properties 2015-12-23 08:23:37 UTC (rev 20903) +++ branches/v14_4/Jmol/src/org/jmol/viewer/Jmol.properties 2015-12-23 21:59:40 UTC (rev 20904) @@ -7,8 +7,15 @@ # see also http://chemapps.stolaf.edu/jmol/zip for daily updates -Jmol.___JmolVersion="14.4.1_2015.12.23" +Jmol.___JmolVersion="14.4.1_2015.12.23b" +bug fix: JavaScript error reporting uses alert() instead of just setting the error message +bug fix: PyMOL 1.8 PSE files cannot be read because of missing settings + +code: more efficient loading of PyMOL .pse session files + +JmolVersion="14.4.1_2015.12.23" + bug fix: PyMOL 1.8 PSE files cannot be read bug fix: dots broken when colored none bug fix: color cartoons red blue not saved in state Modified: trunk/Jmol/src/org/jmol/adapter/readers/pymol/PickleReader.java =================================================================== --- trunk/Jmol/src/org/jmol/adapter/readers/pymol/PickleReader.java 2015-12-23 08:23:37 UTC (rev 20903) +++ trunk/Jmol/src/org/jmol/adapter/readers/pymol/PickleReader.java 2015-12-23 21:59:40 UTC (rev 20904) @@ -1,15 +1,13 @@ package org.jmol.adapter.readers.pymol; +import java.util.Hashtable; +import java.util.Map; + import javajs.api.GenericBinaryDocument; import javajs.util.Lst; import javajs.util.SB; import org.jmol.util.Logger; - -import java.util.Hashtable; - -import java.util.Map; - import org.jmol.viewer.Viewer; /** @@ -98,6 +96,7 @@ PickleReader(GenericBinaryDocument doc, Viewer vwr) { binaryDoc = doc; this.vwr = vwr; + stack.ensureCapacity(1000); } private void log(String s) { @@ -386,10 +385,11 @@ private Lst<Object> getObjects(int mark) { int n = stack.size() - mark; Lst<Object> args = new Lst<Object>(); - for (int j = 0; j < n; j++) - args.addLast(null); - for (int j = n, i = stack.size(); --i >= mark;) - args.set(--j, stack.remove(i)); + args.ensureCapacity(n); + for (int i = mark; i < stack.size(); ++i) + args.addLast(stack.get(i)); + for (int i = stack.size(); --i >= mark;) + stack.remove(i); return args; } @@ -417,8 +417,12 @@ switch (markCount) { case 2: thisSection = stack.get(i - 2); - inMovie = "movie".equals(thisSection); - inNames = "names".equals(thisSection); + // BH: Note that JavaScript string == object first converts object to string, then checks. + // This can be very slow if the object is complex. + if (thisSection instanceof String) { + inMovie = "movie".equals(thisSection); + inNames = "names".equals(thisSection); + } break; default: break; Modified: trunk/Jmol/src/org/jmol/adapter/readers/pymol/PyMOL.java =================================================================== --- trunk/Jmol/src/org/jmol/adapter/readers/pymol/PyMOL.java 2015-12-23 08:23:37 UTC (rev 20903) +++ trunk/Jmol/src/org/jmol/adapter/readers/pymol/PyMOL.java 2015-12-23 21:59:40 UTC (rev 20904) @@ -3,6 +3,8 @@ import java.util.Hashtable; import java.util.Map; +import javajs.util.P3; + import org.jmol.util.Logger; /** @@ -471,7 +473,7 @@ final static int offscreen_rendering_for_antialiasing = 695; final static int offscreen_rendering_multiplier = 696; final static int opaque_background = 435; - final static int ortho = 23; + final static int orthoscopic = 23; final static int overlay = 61; final static int overlay_lines = 311; final static int pdb_conect_all = 329; @@ -6243,30 +6245,137 @@ moreColors.put(id, Integer.valueOf(value)); } - public static float getDefaultSetting(int i, int pymolVersion) { + /** + * All settings that Jmol uses should go here + * + * @param i + * @param pymolVersion + * @return setting or 0 + */ + static float getDefaultSetting(int i, int pymolVersion) { switch (i) { - case label_size: - return 14; + case sphere_color: case cartoon_color: case ellipsoid_color: case ribbon_color: case line_color: + case dot_color: case stick_color: + case surface_color: + case dash_color: + case mesh_color: + case cartoon_putty_quality: case label_distance_digits: case label_angle_digits: case label_dihedral_digits: + case two_sided_lighting: return -1; case ray_pixel_scale: case ellipsoid_scale: + case sphere_scale: + case mesh_width: + case cartoon_ladder_mode: + case clamp_colors: + case frame: + case state: + case depth_cue: + case fog: + case cartoon_round_helices: + case cartoon_fancy_helices: + case label_digits: + case ribbon_sampling: return 1; - default: - Logger.info("PyMOL " + pymolVersion + " does not have setting " + i); - //$FALL-THROUGH$ + case sphere_transparency: case ellipsoid_transparency: case ribbon_transparency: case nonbonded_transparency: + case cartoon_transparency: + case stick_transparency: + case transparency: + case bg_rgb: + case cartoon_cylindrical_helices: + case surface_mode: + case surface_solvent: + case all_states: + case valence: + case cgo_transparency: + case cartoon_putty_transform: + case orthoscopic: + case ribbon_radius: + case ribbon_smooth: + case sphere_solvent: + case surface_carve_cutoff: return 0; + case cartoon_loop_radius: + return 0.2F; + case cartoon_rect_length: + return 1.4F; + case nonbonded_size: + return 0.25F; + case fog_start: + return 0.45f; + case label_size: + return 14; + case label_color: + return -6; + case label_font_id: + return 5; + case transparency_mode: + case cartoon_putty_range: + case cartoon_tube_cap: + return 2; + case cartoon_nucleic_acid_mode: + case cartoon_putty_scale_max: + return 4; + case cartoon_putty_radius: + return 0.4f; + case cartoon_putty_scale_min: + return 0.6f; + case cartoon_putty_scale_power: + return 1.5f; + case cartoon_tube_radius: + return 0.5f; + case solvent_radius: + return 1.4f; + case dash_width: + return 2.5f; + case line_width: + return 1.49f; + case ribbon_width: + return 3; + case field_of_view: + return 20; + case movie_fps: + return 30; + case stick_radius: + return 0.25f; + default: + Logger.error("PyMOL " + pymolVersion + " default float setting not found: " + i); + return 0; } } + static P3 getDefaultSettingPt(int i, int pymolVersion, P3 pt) { + switch (i) { + case label_position: + pt.set(0, 0, 0.75f); + break; + default: + Logger.error("PyMOL " + pymolVersion + " default point setting not found: " + i); + break; + } + return pt; + } + + static String getDefaultSettingS(int i, int pymolVersion) { + switch (i) { + case surface_carve_selection: + break; + default: + Logger.info("PyMOL " + pymolVersion + " does not have String setting " + i); + break; + } + return ""; + } + } Modified: trunk/Jmol/src/org/jmol/adapter/readers/pymol/PyMOLReader.java =================================================================== --- trunk/Jmol/src/org/jmol/adapter/readers/pymol/PyMOLReader.java 2015-12-23 08:23:37 UTC (rev 20903) +++ trunk/Jmol/src/org/jmol/adapter/readers/pymol/PyMOLReader.java 2015-12-23 21:59:40 UTC (rev 20904) @@ -183,7 +183,7 @@ sourcePNGJ = false; if (doCache) bsBytesExcluded = new BS(); - logging = false; + //logging = true; // specifically for Pickle super.initializeReader(); } @@ -333,12 +333,11 @@ // resize frame if (!isStateScript && doResize) { int width = 0, height = 0; - try { + Lst<Object> main = getMapList(map, "main"); + if (main != null) { // not all PSE files have this - width = intAt(getMapList(map, "main"), 0); - height = intAt(getMapList(map, "main"), 1); - } catch (Exception e) { - // ignore + width = intAt(main, 0); + height = intAt(main, 1); } String note; if (width > 0 && height > 0) { @@ -495,7 +494,7 @@ Lst<Object> setting = (Lst<Object>) mySettings.get(j); int uid = (id << 10) + intAt(setting, 0); uniqueSettings.put(Integer.valueOf(uid), setting); - Logger.info("PyMOL unique setting " + id + " " + setting); + //System.out.println("PyMOL unique setting " + id + " " + setting); } } } @@ -516,7 +515,7 @@ for (int i = colors.size(); --i >= 0;) { Lst<Object> c = listAt(colors, i); PyMOL.addColor((Integer) c.get(1), isClamped ? PyMOLScene.colorSettingClamped(c) - : PyMOLScene.colorSetting(c)); + : PyMOLScene.getColorPt(c.get(2))); } } @@ -901,13 +900,15 @@ Lst<Object> coords = listAt(state, 2); Lst<Object> labelPositions = listAt(state, 8); - if (iState == 0 || !isTrajectory) + if (iState == 0 || !isTrajectory) { + pymolScene.ensureCapacity(n); for (int idx = 0; idx < n; idx++) { P3 a = addAtom(pymolAtoms, intAt(idxToAtm, idx), idx, coords, labelPositions, bsAtoms, iState); if (a != null) trajectoryStep[trajectoryPtr++] = a; } + } addBonds(bonds); addMolStructures(); atoms = asc.atoms; @@ -942,9 +943,10 @@ * @return list of bonds */ private Lst<Bond> getBondList(Lst<Object> bonds) { - Lst<Bond> bondList = new Lst<Bond>(); int asSingle = (pymolScene.booleanSetting(PyMOL.valence) ? 0 : JmolAdapter.ORDER_PYMOL_SINGLE); int n = bonds.size(); + Lst<Bond> bondList = new Lst<Bond>(); + bondList.ensureCapacity(n); for (int i = 0; i < n; i++) { Lst<Object> b = listAt(bonds, i); int order = intAt(b, 2); @@ -1098,7 +1100,8 @@ atom.vib = V3.new3(uniqueID, cartoonType, Float.NaN); if (a.size() > 46) { float[] data = PyMOLScene.floatsAt(a, 41, new float[8], 6); - asc.setAnisoBorU(atom, data, 12); + if (data[0] != 0) + asc.setAnisoBorU(atom, data, 12); } //if (uniqueID > 0) //pymolScene.setUnique(uniqueID, atom); Modified: trunk/Jmol/src/org/jmol/adapter/readers/pymol/PyMOLScene.java =================================================================== --- trunk/Jmol/src/org/jmol/adapter/readers/pymol/PyMOLScene.java 2015-12-23 08:23:37 UTC (rev 20903) +++ trunk/Jmol/src/org/jmol/adapter/readers/pymol/PyMOLScene.java 2015-12-23 21:59:40 UTC (rev 20904) @@ -212,10 +212,9 @@ this.stateCount = stateCount; } - @SuppressWarnings("unchecked") PyMOLScene(PymolAtomReader reader, Viewer vwr, Lst<Object> settings, - Map<Integer, Lst<Object>> uniqueSettings, int pymolVersion, - boolean haveScenes, int baseAtomIndex, int baseModelIndex, + Map<Integer, Lst<Object>> uniqueSettings, int pymolVersion, + boolean haveScenes, int baseAtomIndex, int baseModelIndex, boolean doCache, String filePath) { this.reader = reader; this.vwr = vwr; @@ -229,11 +228,33 @@ this.surfaceInfoName = filePath + "##JmolSurfaceInfo##"; setVersionSettings(); settings.trimToSize(); - bgRgb = colorSetting(listAt(settings, PyMOL.bg_rgb)); - pointAt((Lst<Object>) listAt(settings, PyMOL.label_position).get(2), - 0, labelPosition0); + bgRgb = colorSetting(PyMOL.bg_rgb); + labelPosition0 = pointSetting(PyMOL.label_position); } + @SuppressWarnings("unchecked") + private int colorSetting(int i) { + Lst<Object> pos = listAt(settings, i); + Object o = (pos == null || pos.size() != 3 ? null : pos.get(2)); + if (o == null) + return (int) PyMOL.getDefaultSetting(i, pymolVersion); + return (o instanceof Integer ? ((Integer) o).intValue() : CU + .colorPtToFFRGB(pointAt((Lst<Object>) o, 0, ptTemp))); + } + + @SuppressWarnings("unchecked") + private P3 pointSetting(int i) { + P3 pt = new P3(); + Lst<Object> pos = listAt(settings, i); + if (pos != null && pos.size() == 3) + return pointAt((Lst<Object>) pos.get(2), 0, pt); + return PyMOL.getDefaultSettingPt(i, pymolVersion, pt); + } + + void ensureCapacity(int n) { + atomColorList.ensureCapacity(atomColorList.size() + n); + } + void setReaderObjectInfo(String name, int type, String groupName, boolean isHidden, Lst<Object> listObjSettings, Lst<Object> listStateSettings, String ext) { @@ -634,7 +655,7 @@ @SuppressWarnings("unchecked") static int getColorPt(Object o) { - return (o instanceof Integer ? ((Integer) o).intValue() : CU + return (o == null ? 0 : o instanceof Integer ? ((Integer) o).intValue() : CU .colorPtToFFRGB(pointAt((Lst<Object>) o, 0, ptTemp))); } @@ -642,10 +663,6 @@ return ((Number) list.get(i)).intValue(); } - static int colorSetting(Lst<Object> c) { - return getColorPt(c.get(2)); - } - void setReaderObjects() { clearReaderData(); finalizeObjects(); @@ -723,7 +740,7 @@ for (int j = 0; j < 8; j++) pymolView[pt++] = floatAt(view, i++); - boolean isOrtho = booleanSetting(PyMOL.ortho); // 23 + boolean isOrtho = booleanSetting(PyMOL.orthoscopic); // 23 float fov = floatSetting(PyMOL.field_of_view); // 152 pymolView[pt++] = (isOrtho ? fov : -fov); @@ -735,12 +752,10 @@ @SuppressWarnings("unchecked") float globalSetting(int i) { - try { - Lst<Object> setting = (Lst<Object>) settings.get(i); + Lst<Object> setting = (Lst<Object>) settings.get(i); + if (setting != null && setting.size() == 3) return ((Number) setting.get(2)).floatValue(); - } catch (Exception e) { - return PyMOL.getDefaultSetting(i, pymolVersion); - } + return PyMOL.getDefaultSetting(i, pymolVersion); } /** @@ -947,21 +962,17 @@ } float floatSetting(int i) { - try { - Lst<Object> setting = getSetting(i); + Lst<Object> setting = getSetting(i); + if (setting != null && setting.size() == 3) return ((Number) setting.get(2)).floatValue(); - } catch (Exception e) { - return PyMOL.getDefaultSetting(i, pymolVersion); - } + return PyMOL.getDefaultSetting(i, pymolVersion); } String stringSetting(int i) { - try { Lst<Object> setting = getSetting(i); - return setting.get(2).toString(); - } catch (Exception e) { - return null; - } + if (setting != null && setting.size() == 3) + return setting.get(2).toString(); + return PyMOL.getDefaultSettingS(i, pymolVersion); } @SuppressWarnings("unchecked") @@ -1105,8 +1116,7 @@ } static int colorSettingClamped(Lst<Object> c) { - return (c.size() < 6 || intAt(c, 4) == 0 ? colorSetting(c) : getColorPt(c - .get(5))); + return getColorPt(c.get(c.size() < 6 || intAt(c, 4) == 0 ? 2 : 5)); } void setAtomColor(int atomColor) { @@ -1685,11 +1695,11 @@ return defs; } - public boolean needSelections() { + boolean needSelections() { return haveScenes || !htCarveSets.isEmpty(); } - public void setUniqueBonds(BS bsBonds, boolean isSticks) { + void setUniqueBonds(BS bsBonds, boolean isSticks) { if (isSticks) { bsStickBonds.or(bsBonds); bsStickBonds.andNot(bsLineBonds); @@ -1734,7 +1744,7 @@ * @param argb * @param trans */ - public void setBondParameters(Bond b, int modelIndex, float rad, float pymolValence, + void setBondParameters(Bond b, int modelIndex, float rad, float pymolValence, int argb, float trans) { if (modelIndex >= 0 && b.atom1.mi != modelIndex) return; @@ -1755,7 +1765,7 @@ } - public void addMesh(int tok, Lst<Object> obj, String objName, boolean isMep) { + void addMesh(int tok, Lst<Object> obj, String objName, boolean isMep) { JmolObject jo = addJmolObject(tok, null, obj); setSceneObject(objName, -1); int meshColor = (int) floatSetting(PyMOL.mesh_color); @@ -1769,7 +1779,7 @@ jo.cacheID = surfaceInfoName; } - public JmolObject addIsosurface(String objectName) { + JmolObject addIsosurface(String objectName) { JmolObject jo = addJmolObject(T.isosurface, null, objectName); jo.cacheID = surfaceInfoName; return jo; Modified: trunk/Jmol/src/org/jmol/modelset/AtomCollection.java =================================================================== --- trunk/Jmol/src/org/jmol/modelset/AtomCollection.java 2015-12-23 08:23:37 UTC (rev 20903) +++ trunk/Jmol/src/org/jmol/modelset/AtomCollection.java 2015-12-23 21:59:40 UTC (rev 20904) @@ -2570,6 +2570,12 @@ atomTensors.remove(toDelete.get(i)); } + + private int atomCapacity; + void setCapacity(int nAtoms) { + atomCapacity += nAtoms; + } + public void setAtomTensors(int atomIndex, Lst<Object> list) { if (list == null || list.size() == 0) return; @@ -2590,6 +2596,16 @@ } } + public void addTensor(Tensor t, String type) { + type = type.toLowerCase(); + Lst<Object> tensors = atomTensors.get(type); + if (tensors == null) { + atomTensors.put(type, tensors = new Lst<Object>()); + tensors.ensureCapacity(atomCapacity); + } + tensors.addLast(t); + } + private static Object[] getTensorList(Lst<Object> list) { int pt = -1; boolean haveTLS = false; @@ -2637,14 +2653,6 @@ return null; } - public void addTensor(Tensor t, String type) { - type = type.toLowerCase(); - Lst<Object> tensors = atomTensors.get(type); - if (tensors == null) - atomTensors.put(type, tensors = new Lst<Object>()); - tensors.addLast(t); - } - public Lst<Object> getAllAtomTensors(String type) { if (atomTensors == null) return null; Modified: trunk/Jmol/src/org/jmol/modelset/ModelLoader.java =================================================================== --- trunk/Jmol/src/org/jmol/modelset/ModelLoader.java 2015-12-23 08:23:37 UTC (rev 20903) +++ trunk/Jmol/src/org/jmol/modelset/ModelLoader.java 2015-12-23 21:59:40 UTC (rev 20904) @@ -771,6 +771,7 @@ boolean addH = false; boolean isLegacyHAddition = false;//vwr.getBoolean(T.legacyhaddition); JmolAdapterAtomIterator iterAtom = adapter.getAtomIterator(asc); + ms.setCapacity(adapter.getAtomCount(asc)); int nRead = 0; Model[] models = ms.am; if (ms.mc > 0) Modified: trunk/Jmol/src/org/jmol/modelset/ModelSet.java =================================================================== --- trunk/Jmol/src/org/jmol/modelset/ModelSet.java 2015-12-23 08:23:37 UTC (rev 20903) +++ trunk/Jmol/src/org/jmol/modelset/ModelSet.java 2015-12-23 21:59:40 UTC (rev 20904) @@ -4057,5 +4057,6 @@ } return (asMap ? map : lst); } + } Modified: trunk/Jmol/src/org/jmol/script/ScriptManager.java =================================================================== --- trunk/Jmol/src/org/jmol/script/ScriptManager.java 2015-12-23 08:23:37 UTC (rev 20903) +++ trunk/Jmol/src/org/jmol/script/ScriptManager.java 2015-12-23 21:59:40 UTC (rev 20904) @@ -540,7 +540,7 @@ try { if (fileName.endsWith(".pse")) { cmd = (isCached ? "" : "zap;") + "load SYNC " + PT.esc(fileName) - + " filter 'DORESIZE'"; + + (vwr.isApplet ? "" : " filter 'DORESIZE'"); return; } if (fileName.endsWith("jvxl")) { Modified: trunk/Jmol/src/org/jmol/viewer/Jmol.properties =================================================================== --- trunk/Jmol/src/org/jmol/viewer/Jmol.properties 2015-12-23 08:23:37 UTC (rev 20903) +++ trunk/Jmol/src/org/jmol/viewer/Jmol.properties 2015-12-23 21:59:40 UTC (rev 20904) @@ -62,8 +62,21 @@ TODO: consider if models with no atoms will cause issues in relation to model.firstAtomIndex -Jmol.___JmolVersion="14.5.1_2015.12.23" +Jmol.___JmolVersion="14.5.1_2015.12.23b" +bug fix: JavaScript error reporting uses alert() instead of just setting the error message + +code: more efficient loading of PyMOL .pse session files + +Jmol.___JmolVersion="14.5.1_2015.12.23b" + +bug fix: JavaScript error reporting uses alert() instead of just setting the error message +bug fix: PyMOL 1.8 PSE files cannot be read because of missing settings + +code: more efficient loading of PyMOL .pse session files + +JmolVersion="14.5.1_2015.12.23" + bug fix: PyMOL 1.8 PSE files cannot be read bug fix: dots broken when colored none bug fix: color cartoons red blue not saved in state Modified: trunk/Jmol/src/org/jmol/viewer/Viewer.java =================================================================== --- trunk/Jmol/src/org/jmol/viewer/Viewer.java 2015-12-23 08:23:37 UTC (rev 20903) +++ trunk/Jmol/src/org/jmol/viewer/Viewer.java 2015-12-23 21:59:40 UTC (rev 20904) @@ -99,7 +99,6 @@ import org.jmol.modelset.Atom; import org.jmol.modelset.AtomCollection; import org.jmol.modelset.Bond; -import org.jmol.modelset.Group; import org.jmol.modelset.LabelToken; import org.jmol.modelset.Measurement; import org.jmol.modelset.MeasurementData; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. ------------------------------------------------------------------------------ _______________________________________________ Jmol-commits mailing list Jmol-commits@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/jmol-commits