Revision: 18249 http://sourceforge.net/p/jmol/code/18249 Author: hansonr Date: 2013-05-24 12:52:27 +0000 (Fri, 24 May 2013) Log Message: ----------- ___JmolVersion="13.1.16_dev_2013.05.24"
PyMOL: first phase of reader development complete (working with Jaime Prilusky) -- 104 test models http://ispcsrv3.weizmann.ac.il/a2jmolb/browse -- implementation of standard objects, including: -- atoms with labels -- bonds -- nonbonded stars -- measures -- simple CGO objects -- molecular surfaces -- electron density as points and meshes -- custom colors -- fog and slab -- morphing movies -- JVXL caching of isosurfaces Modified Paths: -------------- trunk/Jmol/src/org/jmol/adapter/readers/pymol/JmolObject.java trunk/Jmol/src/org/jmol/adapter/readers/pymol/PyMOLReader.java trunk/Jmol/src/org/jmol/render/StarsRenderer.java trunk/Jmol/src/org/jmol/script/T.java trunk/Jmol/src/org/jmol/viewer/Jmol.properties trunk/Jmol/src/org/jmol/viewer/TransformManager.java Modified: trunk/Jmol/src/org/jmol/adapter/readers/pymol/JmolObject.java =================================================================== --- trunk/Jmol/src/org/jmol/adapter/readers/pymol/JmolObject.java 2013-05-24 02:59:39 UTC (rev 18248) +++ trunk/Jmol/src/org/jmol/adapter/readers/pymol/JmolObject.java 2013-05-24 12:52:27 UTC (rev 18249) @@ -276,6 +276,9 @@ sb.append(";isosurface cache"); sb.append(";set meshScale ").appendI(size / 500); break; + case T.script: + sb = (SB) info; + break; case JC.SHAPE_CGO: JmolList<Object> cgo = (JmolList<Object>) info; //sID = (String) cgo.get(cgo.size() - 1); Modified: trunk/Jmol/src/org/jmol/adapter/readers/pymol/PyMOLReader.java =================================================================== --- trunk/Jmol/src/org/jmol/adapter/readers/pymol/PyMOLReader.java 2013-05-24 02:59:39 UTC (rev 18248) +++ trunk/Jmol/src/org/jmol/adapter/readers/pymol/PyMOLReader.java 2013-05-24 12:52:27 UTC (rev 18249) @@ -71,7 +71,19 @@ * PyMOL frame: references (a) a state, (b) a script, and (c) a view * * using set LOGFILE, we can dump this to a readable form. - * trajectories are not supported yet + * trajectories are not supported yet. + * + * Basic idea is as follows: + * + * 1) Pickle file is read into a Hashtable. + * 2) Atoms, bonds, and structures are created, as per other readers, from MOLECULE branches + * 3) Rendering of atoms and bonds is interpreted as JmolObject objects + * 3) Other objects such as electron density maps, compiled graphical objects, and + * measures are interpreted, creating more JmolObjects + * 3) JmolObjects are finalized after file reading takes place by a call from ModelLoader + * back here to finalizeModelSet(), which runs JmolObject.finalizeObject. + * + * * * @author Bob Hanson hans...@stolaf.edu * @@ -336,12 +348,12 @@ // set up additional colors // not 100% sure what color clamping is, but this seems to work. - addColors(getMapList(map, "colors"), getBooleanSetting(PyMOL.clamp_colors)); + addColors(getMapList(map, "colors"), booleanSetting(PyMOL.clamp_colors)); // set a few global flags - allStates = getBooleanSetting(PyMOL.all_states); - pymolFrame = (int) getFloatSetting(PyMOL.frame); - pymolState = (int) getFloatSetting(PyMOL.state); + allStates = booleanSetting(PyMOL.all_states); + pymolFrame = (int) floatSetting(PyMOL.frame); + pymolState = (int) floatSetting(PyMOL.state); frameObj = addJmolObject(T.frame, null, (allStates ? Integer.valueOf(-1) : Integer.valueOf(pymolState - 1))); appendLoadNote("frame=" + pymolFrame + " state=" + pymolState @@ -755,17 +767,17 @@ localSettings.put((Integer) setting.get(0), setting); } } - nonBondedSize = getFloatSetting(PyMOL.nonbonded_size); - sphereScale = getFloatSetting(PyMOL.sphere_scale); - valence = getBooleanSetting(PyMOL.valence); - cartoonTranslucency = getFloatSetting(PyMOL.cartoon_transparency); - stickTranslucency = getFloatSetting(PyMOL.stick_transparency); - sphereTranslucency = getFloatSetting(PyMOL.sphere_transparency); - cartoonLadderMode = getBooleanSetting(PyMOL.cartoon_ladder_mode); - cartoonRockets = getBooleanSetting(PyMOL.cartoon_cylindrical_helices); + nonBondedSize = floatSetting(PyMOL.nonbonded_size); + sphereScale = floatSetting(PyMOL.sphere_scale); + valence = booleanSetting(PyMOL.valence); + cartoonTranslucency = floatSetting(PyMOL.cartoon_transparency); + stickTranslucency = floatSetting(PyMOL.stick_transparency); + sphereTranslucency = floatSetting(PyMOL.sphere_transparency); + cartoonLadderMode = booleanSetting(PyMOL.cartoon_ladder_mode); + cartoonRockets = booleanSetting(PyMOL.cartoon_cylindrical_helices); //solventAsSpheres = getBooleanSetting(PyMOL.sphere_solvent); - this is for SA-Surfaces - surfaceMode = (int) getFloatSetting(PyMOL.surface_mode); - surfaceColor = (int) getFloatSetting(PyMOL.surface_color); + surfaceMode = (int) floatSetting(PyMOL.surface_mode); + surfaceColor = (int) floatSetting(PyMOL.surface_color); labelPosition = new P3(); try { JmolList<Object> setting = localSettings.get(Integer @@ -775,9 +787,9 @@ // no problem. } labelPosition.add(labelPosition0); - labelColor = getFloatSetting(PyMOL.label_color); - labelSize = getFloatSetting(PyMOL.label_size); - labelFontId = (int) getFloatSetting(PyMOL.label_font_id); + labelColor = floatSetting(PyMOL.label_color); + labelSize = floatSetting(PyMOL.label_size); + labelFontId = (int) floatSetting(PyMOL.label_font_id); } /** @@ -828,7 +840,7 @@ data.addLast(branchName); JmolObject jo = addJmolObject(JC.SHAPE_CGO, null, data); jo.argb = PyMOL.getRGB(color); - jo.translucency = getFloatSetting(PyMOL.cgo_transparency); + jo.translucency = floatSetting(PyMOL.cgo_transparency); appendLoadNote("CGO " + fixName(branchName)); } @@ -900,6 +912,8 @@ // addName(branchName, bs); // } + final static int[] MEAS_DIGITS = { PyMOL.label_distance_digits, PyMOL.label_angle_digits, PyMOL.label_dihedral_digits }; + /** * Create a MEASURE JmolObject. * @@ -922,7 +936,7 @@ JmolList<Object> list = listAt(measure, pt); JmolList<Object> offsets = listAt(measure, 8); int len = list.size(); - float rad = getFloatSetting(PyMOL.dash_width) / 20; + float rad = floatSetting(PyMOL.dash_width) / 20; if (rad == 0) rad = 0.05f; int index = 0; @@ -937,32 +951,19 @@ MeasurementData md = new MeasurementData(fixName(branchNameID + "_" + index), viewer, points); md.note = branchName; - String strFormat = ""; - int nDigits = 1; - switch (nCoord) { - case 2: - nDigits = (int) getFloatSetting(PyMOL.label_distance_digits); - break; - case 3: - nDigits = (int) getFloatSetting(PyMOL.label_angle_digits); - break; - case 4: - nDigits = (int) getFloatSetting(PyMOL.label_dihedral_digits); - break; - } - if (offsets != null) - strFormat = nCoord + ":%0." + (nDigits < 0 ? 1 : nDigits) + "VALUE"; - else - strFormat = nCoord + ": "; + int nDigits = (int) floatSetting(MEAS_DIGITS[nCoord - 2]); + String strFormat = nCoord + ": " + + (offsets == null ? "" : "%0." + (nDigits < 0 ? 1 : nDigits) + + "VALUE"); + //strFormat += " -- " + branchNameID + " " + floatSetting(PyMOL.surface_color) + " " + Integer.toHexString(c); Text text = newTextLabel(strFormat, offset, colix, - (int) getFloatSetting(PyMOL.label_font_id), - getFloatSetting(PyMOL.label_size)); + (int) floatSetting(PyMOL.label_font_id), + floatSetting(PyMOL.label_size)); md.set(T.define, null, strFormat, "angstroms", null, false, false, null, false, (int) (rad * 2000), colix, text); addJmolObject(JC.SHAPE_MEASURES, bs, md); haveMeasurements = true; } - } /** @@ -1047,9 +1048,9 @@ */ private JmolList<Bond> processMolBonds(JmolList<Object> bonds) { JmolList<Bond> bondList = new JmolList<Bond>(); - int color = (int) getFloatSetting(PyMOL.stick_color); - float radius = getFloatSetting(PyMOL.stick_radius) / 2; - float translucency = getFloatSetting(PyMOL.stick_transparency); + int color = (int) floatSetting(PyMOL.stick_color); + float radius = floatSetting(PyMOL.stick_radius) / 2; + float translucency = floatSetting(PyMOL.stick_transparency); int n = bonds.size(); for (int i = 0; i < n; i++) { JmolList<Object> b = listAt(bonds, i); @@ -1623,13 +1624,13 @@ switch (shapeID) { case PyMOL.REP_NONBONDED: jo = addJmolObject(JC.SHAPE_STARS, bs, null); - jo.rd = new RadiusData(null, getFloatSetting(PyMOL.nonbonded_size) / 2, + jo.rd = new RadiusData(null, floatSetting(PyMOL.nonbonded_size) / 2, RadiusData.EnumType.FACTOR, EnumVdw.AUTO); break; case PyMOL.REP_NBSPHERES: jo = addJmolObject(JC.SHAPE_BALLS, bs, null); jo.translucency = sphereTranslucency; - jo.setSize(getFloatSetting(PyMOL.nonbonded_size) * 2); + jo.setSize(floatSetting(PyMOL.nonbonded_size) * 2); break; case PyMOL.REP_SPHERES: jo = addJmolObject(JC.SHAPE_BALLS, bs, null); @@ -1637,7 +1638,7 @@ break; case PyMOL.REP_DOTS: jo = addJmolObject(JC.SHAPE_DOTS, bs, null); - f = getFloatSetting(PyMOL.sphere_scale); + f = floatSetting(PyMOL.sphere_scale); jo.rd = new RadiusData(null, f, RadiusData.EnumType.FACTOR, EnumVdw.AUTO); break; case PyMOL.REP_CARTOON: @@ -1655,8 +1656,8 @@ if (isHidden) break; // will have to reconsider this if there is a movie, though jo = addJmolObject(T.isosurface, bs, null); - jo.setSize(getFloatSetting(PyMOL.solvent_radius)); - jo.translucency = getFloatSetting(PyMOL.transparency); + jo.setSize(floatSetting(PyMOL.solvent_radius)); + jo.translucency = floatSetting(PyMOL.transparency); break; case PyMOL.REP_SURFACE: // = 2; if (!allowSurface) @@ -1665,9 +1666,9 @@ break; // will have to reconsider this if there is a movie, though surfaceCount++; jo = addJmolObject(T.isosurface, bs, - getBooleanSetting(PyMOL.two_sided_lighting) ? "FULLYLIT" : "FRONTLIT"); - jo.setSize(getFloatSetting(PyMOL.solvent_radius)); - jo.translucency = getFloatSetting(PyMOL.transparency); + booleanSetting(PyMOL.two_sided_lighting) ? "FULLYLIT" : "FRONTLIT"); + jo.setSize(floatSetting(PyMOL.solvent_radius)); + jo.translucency = floatSetting(PyMOL.transparency); if (surfaceColor >= 0) jo.argb = PyMOL.getRGB(surfaceColor); break; @@ -1690,12 +1691,12 @@ createRibbonObject(bs); break; case PyMOL.REP_LINES: - f = getFloatSetting(PyMOL.line_width) / 15; + f = floatSetting(PyMOL.line_width) / 15; jo = addJmolObject(JC.SHAPE_STICKS, bs, null); jo.setSize(f); break; case PyMOL.REP_STICKS: - f = getFloatSetting(PyMOL.stick_radius) * 2; + f = floatSetting(PyMOL.stick_radius) * 2; jo = addJmolObject(JC.SHAPE_STICKS, bs, null); jo.setSize(f); jo.translucency = stickTranslucency; @@ -1721,14 +1722,14 @@ // we will just use cartoons for ladder mode jo = addJmolObject(JC.SHAPE_CARTOON, bsNuc, null); jo.translucency = cartoonTranslucency; - jo.setSize(getFloatSetting(PyMOL.cartoon_tube_radius) * 2); + jo.setSize(floatSetting(PyMOL.cartoon_tube_radius) * 2); bs.andNot(bsNuc); if (bs.isEmpty()) return; } jo = addJmolObject(JC.SHAPE_TRACE, bs, null); jo.translucency = cartoonTranslucency; - jo.setSize(getFloatSetting(PyMOL.cartoon_tube_radius) * 2); + jo.setSize(floatSetting(PyMOL.cartoon_tube_radius) * 2); } /** @@ -1737,13 +1738,13 @@ * @param bs */ private void createPuttyObject(BS bs) { - float[] info = new float[] { getFloatSetting(PyMOL.cartoon_putty_quality), - getFloatSetting(PyMOL.cartoon_putty_radius), - getFloatSetting(PyMOL.cartoon_putty_range), - getFloatSetting(PyMOL.cartoon_putty_scale_min), - getFloatSetting(PyMOL.cartoon_putty_scale_max), - getFloatSetting(PyMOL.cartoon_putty_scale_power), - getFloatSetting(PyMOL.cartoon_putty_transform) }; + float[] info = new float[] { floatSetting(PyMOL.cartoon_putty_quality), + floatSetting(PyMOL.cartoon_putty_radius), + floatSetting(PyMOL.cartoon_putty_range), + floatSetting(PyMOL.cartoon_putty_scale_min), + floatSetting(PyMOL.cartoon_putty_scale_max), + floatSetting(PyMOL.cartoon_putty_scale_power), + floatSetting(PyMOL.cartoon_putty_transform) }; addJmolObject(JC.SHAPE_TRACE, bs, info).translucency = cartoonTranslucency; } @@ -1767,12 +1768,12 @@ // 476Rainbow_New: 10, 8 ==> trace //float smoothing = getFloatSetting(PyMOL.ribbon_smooth); - float sampling = getFloatSetting(PyMOL.ribbon_sampling); + float sampling = floatSetting(PyMOL.ribbon_sampling); boolean isTrace = (sampling > 1); - float r = getFloatSetting(PyMOL.ribbon_radius) * 2; - float rpc = getFloatSetting(PyMOL.ray_pixel_scale); + float r = floatSetting(PyMOL.ribbon_radius) * 2; + float rpc = floatSetting(PyMOL.ray_pixel_scale); if (r == 0) - r = getFloatSetting(PyMOL.ribbon_width) + r = floatSetting(PyMOL.ribbon_width) * (isTrace ? 0.1f : (rpc < 1 ? 1 : rpc) * 0.05f); addJmolObject((isTrace ? JC.SHAPE_TRACE : JC.SHAPE_BACKBONE), bs, null) .setSize(r); @@ -1787,7 +1788,7 @@ return; JmolObject jo = addJmolObject(JC.SHAPE_CARTOON, bs, null); jo.translucency = cartoonTranslucency; - jo.setSize(getFloatSetting(sizeID) * factor); + jo.setSize(floatSetting(sizeID) * factor); } ////// end of molecule-specific JmolObjects ////// @@ -1834,10 +1835,10 @@ JmolObject jo = addJmolObject(tok, null, obj); if (isMep) { } else { - jo.setSize(getFloatSetting(PyMOL.mesh_width)); + jo.setSize(floatSetting(PyMOL.mesh_width)); jo.argb = PyMOL.getRGB(intAt(listAt(obj, 0), 2)); } - jo.translucency = getFloatSetting(PyMOL.transparency); + jo.translucency = floatSetting(PyMOL.transparency); } } } @@ -1924,11 +1925,11 @@ viewer.initialize(true); viewer.setStringProperty("measurementUnits", "ANGSTROMS"); viewer.setBooleanProperty("zoomHeight", true); - setView(view); if (groups != null) setGroupVisibilities(); if (!bsHidden.isEmpty()) addJmolObject(T.hidden, bsHidden, null); + addJmolScript(getViewScript(view).toString()); } /** @@ -1975,26 +1976,26 @@ } } - private void setView(JmolList<Object> view) { + private SB getViewScript(JmolList<Object> view) { SB sb = new SB(); float[] pymolView = getPymolView(view, true); - sb.append(";set slabEnabled true;set zshadePower 1;set traceAlpha " - + getBooleanSetting(PyMOL.cartoon_round_helices)); + sb.append(";set zshadePower 1;set traceAlpha " + + booleanSetting(PyMOL.cartoon_round_helices)); sb.append(";set cartoonRockets " + cartoonRockets); if (cartoonRockets) sb.append(";set rocketBarrels " + cartoonRockets); sb.append(";set cartoonLadders " + haveNucleicLadder); sb.append(";set ribbonBorder " - + getBooleanSetting(PyMOL.cartoon_fancy_helices)); + + booleanSetting(PyMOL.cartoon_fancy_helices)); sb.append(";set cartoonFancy " - + !getBooleanSetting(PyMOL.cartoon_fancy_helices)); + + !booleanSetting(PyMOL.cartoon_fancy_helices)); JmolList<Object> bg = listAt(settings, PyMOL.bg_rgb); String s = "000000" + Integer.toHexString(colorSetting(bg)); s = "[x" + s.substring(s.length() - 6) + "]"; sb.append(";background " + s); sb.append(";moveto 0 PyMOL " + Escape.eAF(pymolView)); sb.append(";"); - addJmolScript(sb.toString()); + return sb; } /** @@ -2006,9 +2007,9 @@ */ private float[] getPymolView(JmolList<Object> view, boolean isViewObj) { float[] pymolView = new float[21]; - boolean depthCue = getBooleanSetting(PyMOL.depth_cue); // 84 - boolean fog = getBooleanSetting(PyMOL.fog); // 88 - float fog_start = getFloatSetting(PyMOL.fog_start); // 192 + boolean depthCue = booleanSetting(PyMOL.depth_cue); // 84 + boolean fog = booleanSetting(PyMOL.fog); // 88 + float fog_start = floatSetting(PyMOL.fog_start); // 192 int pt = 0; int i = 0; @@ -2031,8 +2032,8 @@ for (int j = 0; j < 8; j++) pymolView[pt++] = floatAt(view, i++); - boolean isOrtho = getBooleanSetting(PyMOL.ortho); // 23 - float fov = getFloatSetting(PyMOL.field_of_view); // 152 + boolean isOrtho = booleanSetting(PyMOL.ortho); // 23 + float fov = floatSetting(PyMOL.field_of_view); // 152 pymolView[pt++] = (isOrtho ? fov : -fov); pymolView[pt++] = (depthCue ? 1 : 0); @@ -2057,11 +2058,11 @@ // local and global settings retrieval - private boolean getBooleanSetting(int i) { - return (getFloatSetting(i) != 0); + private boolean booleanSetting(int i) { + return (floatSetting(i) != 0); } - private float getFloatSetting(int i) { + private float floatSetting(int i) { try { JmolList<Object> setting = null; if (localSettings != null) Modified: trunk/Jmol/src/org/jmol/render/StarsRenderer.java =================================================================== --- trunk/Jmol/src/org/jmol/render/StarsRenderer.java 2013-05-24 02:59:39 UTC (rev 18248) +++ trunk/Jmol/src/org/jmol/render/StarsRenderer.java 2013-05-24 12:52:27 UTC (rev 18249) @@ -67,9 +67,13 @@ d -= (d & 1) ^ 1; // round down to odd value int r = d / 2; if (r < 1) - return; + r = 1; if (mar > 0) { width = (int) viewer.scaleToScreen(z, mar); + if (width == 0) + width = 1; + if (width == 1 && g3d.isAntialiased()) + width = 2; } else { // added to strengthen: drawLine(x - r - 1, y + 1, z, x - r - 1 + d, y + 1, z); Modified: trunk/Jmol/src/org/jmol/script/T.java =================================================================== --- trunk/Jmol/src/org/jmol/script/T.java 2013-05-24 02:59:39 UTC (rev 18248) +++ trunk/Jmol/src/org/jmol/script/T.java 2013-05-24 12:52:27 UTC (rev 18249) @@ -728,7 +728,7 @@ public final static int cross = 1 | 2 << 9 | mathfunc; final static int load = 2 | 2 << 9 | mathfunc | scriptCommand; final static int random = 4 | 2 << 9 | mathfunc; - final static int script = 5 | 2 << 9 | mathfunc | scriptCommand; + public final static int script = 5 | 2 << 9 | mathfunc | scriptCommand; public final static int substructure = 6 | 2 << 9 | mathfunc | intproperty | strproperty; final static int search = 7 | 2 << 9 | mathfunc; final static int smiles = 8 | 2 << 9 | mathfunc; Modified: trunk/Jmol/src/org/jmol/viewer/Jmol.properties =================================================================== --- trunk/Jmol/src/org/jmol/viewer/Jmol.properties 2013-05-24 02:59:39 UTC (rev 18248) +++ trunk/Jmol/src/org/jmol/viewer/Jmol.properties 2013-05-24 12:52:27 UTC (rev 18249) @@ -9,8 +9,23 @@ # The quotes above look odd for a parameter file, but they are # important for the JavaScript version of Jmol. -___JmolVersion="13.1.16_dev_2013.05.23a" +___JmolVersion="13.1.16_dev_2013.05.24" +PyMOL: first phase of reader development complete (working with Jaime Prilusky) + -- 104 test models http://ispcsrv3.weizmann.ac.il/a2jmolb/browse + -- implementation of standard objects, including: + -- atoms with labels + -- bonds + -- nonbonded stars + -- measures + -- simple CGO objects + -- molecular surfaces + -- electron density as points and meshes + -- custom colors + -- fog and slab + -- morphing movies + -- JVXL caching of isosurfaces + PyMOL: measurement font/offsets enabled -- adds measure ID "xxx" FONT scale face style -- adds measure ID "xxx" OFFSET [mode, sx, sy, sz, ax, ay, az] Modified: trunk/Jmol/src/org/jmol/viewer/TransformManager.java =================================================================== --- trunk/Jmol/src/org/jmol/viewer/TransformManager.java 2013-05-24 02:59:39 UTC (rev 18248) +++ trunk/Jmol/src/org/jmol/viewer/TransformManager.java 2013-05-24 12:52:27 UTC (rev 18249) @@ -1643,6 +1643,7 @@ int slab = 50 + (int) ((pymolDistanceToCenter - pymolDistanceToSlab) * f); int depth = 50 + (int) ((pymolDistanceToCenter - pymolDistanceToDepth) * f); // could animate these? Does PyMOL? + setSlabEnabled(true); slabToPercent(slab); depthToPercent(depth); if (pymolView.length == 21) { @@ -1651,9 +1652,8 @@ boolean fog = (pymolView[19] != 0); float fogStart = pymolView[20]; // conversion to Jmol zShade, zSlab, zDepth - setPerspectiveDepth(depthCue); + setZShadeEnabled(depthCue); if (depthCue) { - // not 100% sure of fog calc here if (fog) { viewer.setIntProperty("zSlab", (int) Math.min(100, slab + fogStart * (depth - slab))); @@ -2512,7 +2512,7 @@ } viewer.setFloatProperty("slabRange", 0); if (doResetSlab) { - slabEnabled = (mode == MODE_NAVIGATION); + setSlabEnabled(mode == MODE_NAVIGATION); } zoomFactor = Float.MAX_VALUE; zoomPercentSetting = zoomPercent; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. ------------------------------------------------------------------------------ Try New Relic Now & We'll Send You this Cool Shirt New Relic is the only SaaS-based application performance monitoring service that delivers powerful full stack analytics. Optimize and monitor your browser, app, & servers with just a few lines of code. Try New Relic and get this awesome Nerd Life shirt! http://p.sf.net/sfu/newrelic_d2d_may _______________________________________________ Jmol-commits mailing list Jmol-commits@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/jmol-commits