From: <ha...@us...> - 2008-07-17 05:10:27
|
Revision: 9605 http://jmol.svn.sourceforge.net/jmol/?rev=9605&view=rev Author: hansonr Date: 2008-07-17 05:10:21 +0000 (Thu, 17 Jul 2008) Log Message: ----------- new Quaternion algorithm uses double precision Modified Paths: -------------- trunk/Jmol/src/org/jmol/shapespecial/Draw.java trunk/Jmol/src/org/jmol/util/Quaternion.java Modified: trunk/Jmol/src/org/jmol/shapespecial/Draw.java =================================================================== --- trunk/Jmol/src/org/jmol/shapespecial/Draw.java 2008-07-16 11:09:13 UTC (rev 9604) +++ trunk/Jmol/src/org/jmol/shapespecial/Draw.java 2008-07-17 05:10:21 UTC (rev 9605) @@ -656,7 +656,6 @@ nVertices = -2; if (isArrow) drawType = JmolConstants.DRAW_ARROW; - System.out.println("DRAW " + ptList[0] + " " + ptList[1]); } else if (nVertices == 3 && isPlane && !isPerpendicular) { // three points define a plane pt = new Point3f(ptList[1]); Modified: trunk/Jmol/src/org/jmol/util/Quaternion.java =================================================================== --- trunk/Jmol/src/org/jmol/util/Quaternion.java 2008-07-16 11:09:13 UTC (rev 9604) +++ trunk/Jmol/src/org/jmol/util/Quaternion.java 2008-07-17 05:10:21 UTC (rev 9605) @@ -83,12 +83,12 @@ q0 = 1; return; } - float fact = (float) (Math.sin(theta / 2 * Math.PI / 180) / Math.sqrt(pt.x + double fact = (Math.sin(theta / 2 * Math.PI / 180) / Math.sqrt(pt.x * pt.x + pt.y * pt.y + pt.z * pt.z)); q0 = (float) (Math.cos(theta / 2 * Math.PI / 180)); - q1 = pt.x * fact; - q2 = pt.y * fact; - q3 = pt.z * fact; + q1 = (float) (pt.x * fact); + q2 = (float) (pt.y * fact); + q3 = (float) (pt.z * fact); fixQ(); } @@ -104,51 +104,145 @@ public Quaternion(Matrix3f mat) { + /* + * Changed 7/16/2008 to double precision for 11.5.48. + * + * <quote> + * + * RayTrace Software Package, release 3.0. May 3, 2006. + * + * Mathematics Subpackage (VrMath) + * + * Author: Samuel R. Buss + * + * Software is "as-is" and carries no warranty. It may be used without + * restriction, but if you modify it, please change the filenames to + * prevent confusion between different versions. Please acknowledge + * all use of the software in any publications or products based on it. + * + * Bug reports: Sam Buss, sb...@uc.... + * Web page: http://math.ucsd.edu/~sbuss/MathCG + + // Use Shepperd's algorithm, which is stable, does not lose + // significant precision and uses only one sqrt. + // J. Guidance and Control, 1 (1978) 223-224. + + * </quote> + * + * Except, that code has errors. + * + * CORRECTIONS (as noted below) of Quaternion.cpp. I have reported the bug. + * + * -- Bob Hanson + * + * theory: + * cos(theta/2)^2 = (cos(theta) + 1)/2 + * and + * trace = (1-x^2)ct + (1-y^2)ct + (1-z^2)ct + 1 = 2cos(theta) + 1 + * or + * cos(theta) = (trace - 1)/2 + * + * so in general, + * + * w = cos(theta/2) + * = sqrt((cos(theta)+1)/2) + * = sqrt((trace-1)/4+1/2) + * = sqrt((trace+1)/4) + * = sqrt(trace+1)/2 + * + * but there are precision issues, so we allow for other situations. + * note -- trace >= 0.5 when cos(theta) >= -0.25 (-104.48 <= theta <= 104.48). + * this code cleverly matches the precision in all four options. + * + */ + + double trace = mat.m00 + mat.m11 + mat.m22; + double temp; + double w, x, y, z; + if (trace >= 0.5) { + w = Math.sqrt(1.0 + trace); + x = (mat.m21 - mat.m12) / w; + y = (mat.m02 - mat.m20) / w; + z = (mat.m10 - mat.m01) / w; + } else if ((temp = mat.m00 + mat.m00 - trace) >= 0.5) { + x = Math.sqrt(1.0 + temp); + w = (mat.m21 - mat.m12) / x; + y = (mat.m10 + mat.m01) / x; + z = (mat.m20 + mat.m02) / x; + } else if ((temp = mat.m11 + mat.m11 - trace) >= 0.5) { + y = Math.sqrt(1.0 + temp); + w = (mat.m02 - mat.m20) / y; + x = (mat.m10 + mat.m01) / y; + z = (mat.m21 + mat.m12) / y; + } else { + z = Math.sqrt(1.0 + mat.m22 + mat.m22 - trace); + w = (mat.m10 - mat.m01) / z; + x = (mat.m20 + mat.m02) / z; // was - + y = (mat.m21 + mat.m12) / z; // was - + } + + q0 = (float) (w * 0.5); + q1 = (float) (x * 0.5); + q2 = (float) (y * 0.5); + q3 = (float) (z * 0.5); + + fixQ(); + /* * Originally from http://www.gamedev.net/community/forums/topic.asp?topic_id=448380 - * The current algorithm is adapted from Visualizing Quaternions, by Andrew J. Hanson + * later algorithm was adapted from Visualizing Quaternions, by Andrew J. Hanson * (Morgan Kaufmann, 2006), page 446 * * HOWEVER, checking with AxisAngle4f and Quat4f equivalents, it was found that * BOTH of these sources produce inverted quaternions. So here we do an inversion. * * This correction was made in 11.5.42 6/19/2008 -- Bob Hanson - * - */ - - float tr = mat.m00 + mat.m11 + mat.m22; /* Matrix trace */ - float s; - float[] q = new float[4]; + * + * former algorithm used: + * / + + double tr = mat.m00 + mat.m11 + mat.m22; //Matrix trace + double s; + double[] q = new double[4]; if (tr > 0) { - s = (float) Math.sqrt(tr + 1); - q0 = 0.5f * s; - s = 0.5f / s; - q1 = (mat.m21 - mat.m12) * s; - q2 = (mat.m02 - mat.m20) * s; - q3 = (mat.m10 - mat.m01) * s; + s = Math.sqrt(tr + 1); + q0 = (float) (0.5 * s); + s = 0.5 / s; // = 1/q0 + q1 = (float) ((mat.m21 - mat.m12) * s); + q2 = (float) ((mat.m02 - mat.m20) * s); + q3 = (float) ((mat.m10 - mat.m01) * s); } else { float[][] m = new float[][] { new float[3], new float[3], new float[3] }; mat.getRow(0, m[0]); mat.getRow(1, m[1]); mat.getRow(2, m[2]); - /* Find out the biggest element along the diagonal */ + //Find out the biggest element along the diagonal float max = Math.max(mat.m11, mat.m00); int i = (mat.m22 > max ? 2 : max == mat.m11 ? 1 : 0); int j = (i + 1) % 3; int k = (j + 1) % 3; - s = -(float) Math.sqrt((m[i][i] - (m[j][j] + m[k][k])) + 1); - q[i] = s * 0.5f; + s = -Math.sqrt(1 + m[i][i] - m[j][j] - m[k][k]); + // 0 = 1 + (1-x^2)ct + x^2 -(1-y^2)ct - y^2 - (1-z^2)ct - z^2 + // 0 = 1 - ct + (x^2 - y^2 - z^2) - (x^2 - y^2 - z^2)ct + // 0 = 1 - ct + 2x^2 - 1 - (2x^2)ct + ct + // 0 = 2x^2(1 - ct) + // theta = 0 (but then trace = 1 + 1 + 1 = 3) + // or x = 0. + q[i] = s * 0.5; if (s != 0) - s = 0.5f / s; + s = 0.5 / s; // = 1/q[i] q[j] = (m[i][j] + m[j][i]) * s; q[k] = (m[i][k] + m[k][i]) * s; - q0 = (m[k][j] - m[j][k]) * s; - q1 = q[0]; // x - q2 = q[1]; // y - q3 = q[2]; // z + q0 = (float) ((m[k][j] - m[j][k]) * s); + q1 = (float) q[0]; // x + q2 = (float) q[1]; // y + q3 = (float) q[2]; // z } - fixQ(); + + */ + + } public static final Quaternion getQuaternionFrame(Vector3f vA, Vector3f vB, @@ -225,7 +319,7 @@ public Quaternion add(float x) { // UNIT addition - return new Quaternion(getNormal(), getTheta() + x); + return new Quaternion(getNormal(), getTheta() + x); } public Quaternion mul(float x) { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ha...@us...> - 2008-07-17 14:22:27
|
Revision: 9607 http://jmol.svn.sourceforge.net/jmol/?rev=9607&view=rev Author: hansonr Date: 2008-07-17 14:20:19 +0000 (Thu, 17 Jul 2008) Log Message: ----------- version=11.5.48_dev sheetsmoothing, messageCallback # bug fix: sheetsmoothing not consistent among structures in multi-chain systems # bug fix: messages not sent to messageCallback Modified Paths: -------------- trunk/Jmol/src/org/jmol/applet/Jmol.java trunk/Jmol/src/org/jmol/modelsetbio/BioPolymer.java trunk/Jmol/src/org/jmol/shapebio/BioShapeRenderer.java trunk/Jmol/src/org/jmol/shapebio/RocketsRenderer.java trunk/Jmol/src/org/jmol/viewer/Jmol.properties Modified: trunk/Jmol/src/org/jmol/applet/Jmol.java =================================================================== --- trunk/Jmol/src/org/jmol/applet/Jmol.java 2008-07-17 05:11:05 UTC (rev 9606) +++ trunk/Jmol/src/org/jmol/applet/Jmol.java 2008-07-17 14:20:19 UTC (rev 9607) @@ -1007,8 +1007,7 @@ if (msWalltime > 0) { // termination -- button legacy notifyScriptTermination(); - } - if (msWalltime < 0 && !doCallback) { + } else if (!doCallback) { //termination messsage ONLY if script callback enabled -- not to message queue //for compatibility reasons doCallback = ((callback = callbacks[type = JmolConstants.CALLBACK_MESSAGE]) != null); Modified: trunk/Jmol/src/org/jmol/modelsetbio/BioPolymer.java =================================================================== --- trunk/Jmol/src/org/jmol/modelsetbio/BioPolymer.java 2008-07-17 05:11:05 UTC (rev 9606) +++ trunk/Jmol/src/org/jmol/modelsetbio/BioPolymer.java 2008-07-17 14:20:19 UTC (rev 9607) @@ -223,7 +223,9 @@ return leadPoints; } - public Point3f[] getControlPoints(boolean isTraceAlpha, float sheetSmoothing) { + public Point3f[] getControlPoints(boolean isTraceAlpha, float sheetSmoothing, boolean invalidate) { + if (invalidate) + sheetPoints = null; if (!isTraceAlpha) return leadMidpoints; else if (sheetSmoothing == 0) @@ -394,7 +396,7 @@ public int getPolymerPointsAndVectors(int last, BitSet bs, Vector vList, boolean isTraceAlpha, float sheetSmoothing) { - Point3f[] points = getControlPoints(isTraceAlpha, sheetSmoothing); + Point3f[] points = getControlPoints(isTraceAlpha, sheetSmoothing, false); Vector3f[] vectors = getWingVectors(); int count = monomerCount; for (int j = 0; j < count; j++) Modified: trunk/Jmol/src/org/jmol/shapebio/BioShapeRenderer.java =================================================================== --- trunk/Jmol/src/org/jmol/shapebio/BioShapeRenderer.java 2008-07-17 05:11:05 UTC (rev 9606) +++ trunk/Jmol/src/org/jmol/shapebio/BioShapeRenderer.java 2008-07-17 14:20:19 UTC (rev 9607) @@ -47,40 +47,77 @@ //ultimately this renderer calls MeshRenderer.render1(mesh) - int aspectRatio; - int hermiteLevel; - float sheetSmoothing; + private boolean invalidateMesh; + private boolean invalidateSheets; + private boolean isHighRes; + private boolean isTraceAlpha; + private boolean ribbonBorder = false; + private boolean haveControlPointScreens; + private int aspectRatio; + private int hermiteLevel; + private float sheetSmoothing; - boolean isHighRes; - boolean isTraceAlpha; - boolean isNucleic; - boolean isCarbohydrate; - boolean ribbonBorder = false; - BitSet bsVisible = new BitSet(); - Point3i[] ribbonTopScreens; - Point3i[] ribbonBottomScreens; + private Mesh[] meshes; + private boolean[] meshReady; + + protected int monomerCount; + protected Monomer[] monomers; - Mesh[] meshes; - boolean[] meshReady; + protected boolean isNucleic; + protected boolean isCarbohydrate; + protected BitSet bsVisible = new BitSet(); + protected Point3i[] ribbonTopScreens; + protected Point3i[] ribbonBottomScreens; + protected Point3f[] controlPoints; + protected Point3i[] controlPointScreens; + + protected int[] leadAtomIndices; + protected Vector3f[] wingVectors; + protected short[] mads; + protected short[] colixes; + protected byte[] structureTypes; - int monomerCount; - Monomer[] monomers; + protected abstract void renderBioShape(BioShape bioShape); - Point3f[] controlPoints; - Point3i[] controlPointScreens; - boolean haveControlPointScreens; - Vector3f[] wingVectors; - short[] mads; - short[] colixes; - - int[] leadAtomIndices; - byte[] structureTypes; - protected void render() { if (shape == null) return; - //frontOnly = viewer.getTestFlag2(); + + invalidateMesh = false; + boolean TF = isGenerator || viewer.getHighResolution(); + if (TF != isHighRes) + invalidateMesh = true; + isHighRes = TF; + + int val = viewer.getRibbonAspectRatio(); + val = Math.min(Math.max(0, val), 20); + if (val != aspectRatio && val != 0) + invalidateMesh = true; + aspectRatio = val; + + val = viewer.getHermiteLevel(); + val = (val <= 0 ? -val : viewer.getInMotion() ? 0 : val); + if (val != hermiteLevel && val != 0) + invalidateMesh = true; + hermiteLevel = Math.min(val, 8); + if (hermiteLevel == 0) + aspectRatio = 0; + + TF = (viewer.getTraceAlpha()); + if (TF != isTraceAlpha) + invalidateMesh = true; + isTraceAlpha = TF; + + invalidateSheets = false; + float fval = viewer.getSheetSmoothing(); + if (fval != sheetSmoothing && isTraceAlpha) { + sheetSmoothing = fval; + invalidateMesh = true; + invalidateSheets = true; + } + BioShapeCollection mps = (BioShapeCollection) shape; + for (int c = mps.bioShapes.length; --c >= 0;) { BioShape bioShape = mps.getBioShape(c); if ((bioShape.modelVisibilityFlags & myVisibilityFlag) == 0) @@ -98,45 +135,13 @@ viewer.freeTempBytes(structureTypes); } - protected abstract void renderBioShape(BioShape bioShape); - - //Point3f[] tempPoints; - private boolean initializePolymer(BioShape bioShape) { - - boolean invalidate = false; - boolean TF = isGenerator || viewer.getHighResolution(); - if (TF != isHighRes) - invalidate = true; - isHighRes = TF; - - TF = (viewer.isJmolDataFrame(bioShape.modelIndex) || viewer.getTraceAlpha()); - if (TF != isTraceAlpha) { - invalidate = true; + if (viewer.isJmolDataFrame(bioShape.modelIndex)) { + controlPoints = bioShape.bioPolymer.getControlPoints(true, 0, false); + } else { + controlPoints = bioShape.bioPolymer.getControlPoints(isTraceAlpha, + sheetSmoothing, invalidateSheets); } - isTraceAlpha = TF; - - int val = viewer.getRibbonAspectRatio(); - val = Math.min(Math.max(0, val), 20); - if (val != aspectRatio && val != 0) - invalidate = true; - aspectRatio = val; - - val = viewer.getHermiteLevel(); - val = (val <= 0 ? -val : viewer.getInMotion() ? 0 : val); - if (val != hermiteLevel && val != 0) - invalidate = true; - hermiteLevel = Math.min(val, 8); - if (hermiteLevel == 0) - aspectRatio = 0; - - float fval = (viewer.isJmolDataFrame(bioShape.modelIndex) ? 0 - : viewer.getSheetSmoothing()); - if (fval != sheetSmoothing && isTraceAlpha) { - sheetSmoothing = fval; - invalidate = true; - } - controlPoints = bioShape.bioPolymer.getControlPoints(isTraceAlpha, sheetSmoothing); monomerCount = bioShape.monomerCount; monomers = bioShape.monomers; leadAtomIndices = bioShape.bioPolymer.getLeadAtomIndices(); @@ -144,7 +149,7 @@ bsVisible.clear(); boolean haveVisible = false; for (int i = monomerCount; --i >= 0;) { - if (invalidate) + if (invalidateMesh) bioShape.falsifyMesh(i, false); if ((monomers[i].shapeVisibilityFlags & myVisibilityFlag) == 0 || modelSet.isAtomHidden(leadAtomIndices[i])) @@ -158,13 +163,13 @@ if (!haveVisible) return false; ribbonBorder = viewer.getRibbonBorder(); - //thisChain = schain; // note that we are not treating a PhosphorusPolymer // as nucleic because we are not calculating the wing // vector correctly. // if/when we do that then this test will become - // isNucleic = schain.bioPolymer.isNucleic(); + // isNucleic = bioShape.bioPolymer.isNucleic(); + isNucleic = bioShape.bioPolymer instanceof NucleicPolymer; isCarbohydrate = bioShape.bioPolymer instanceof CarbohydratePolymer; haveControlPointScreens = false; @@ -187,19 +192,15 @@ structureTypes[monomerCount] = structureTypes[monomerCount - 1]; } - boolean isHelix(int i) { + protected boolean isHelix(int i) { return structureTypes[i] == JmolConstants.PROTEIN_STRUCTURE_HELIX; } - boolean isSheet(int i) { - return structureTypes[i] == JmolConstants.PROTEIN_STRUCTURE_SHEET; - } - - void calcScreenControlPoints() { + protected void calcScreenControlPoints() { calcScreenControlPoints(controlPoints); } - void calcScreenControlPoints(Point3f[] points) { + protected void calcScreenControlPoints(Point3f[] points) { int count = monomerCount + 1; controlPointScreens = viewer.allocTempScreens(count); for (int i = count; --i >= 0;) { @@ -208,8 +209,6 @@ haveControlPointScreens = true; } - final Point3f pointT = new Point3f(); - /** * calculate screen points based on control points and wing positions * (cartoon, strand, meshRibbon, and ribbon) @@ -217,7 +216,7 @@ * @param offsetFraction * @return Point3i array THAT MUST BE LATER FREED */ - Point3i[] calcScreens(float offsetFraction) { + protected Point3i[] calcScreens(float offsetFraction) { int count = controlPoints.length; Point3i[] screens = viewer.allocTempScreens(count); if (offsetFraction == 0) { @@ -232,6 +231,8 @@ return screens; } + private final Point3f pointT = new Point3f(); + private void calc1Screen(Point3f center, Vector3f vector, short mad, float offset_1000, Point3i screen) { pointT.set(vector); @@ -240,7 +241,7 @@ viewer.transformPoint(pointT, screen); } - short getLeadColix(int i) { + protected short getLeadColix(int i) { //System.out.println("bioshaperend " + monomers[i] + " getLeadColix i=" + i + " leadatom = " + monomers[i].getLeadAtom().getInfo() + " index=" + monomers[i].getLeadAtom().getAtomIndex()); return Graphics3D.getColixInherited(colixes[i], monomers[i].getLeadAtom().getColix()); @@ -248,9 +249,9 @@ //// cardinal hermite constant cylinder (meshRibbon, strands) - int iPrev, iNext, iNext2, iNext3; - int diameterBeg, diameterMid, diameterEnd; - boolean doCap0, doCap1; + private int iPrev, iNext, iNext2, iNext3; + private int diameterBeg, diameterMid, diameterEnd; + private boolean doCap0, doCap1; private void setNeighbors(int i) { iPrev = Math.max(i - 1, 0); @@ -259,7 +260,7 @@ iNext3 = Math.min(i + 3, monomerCount); } - final void renderHermiteCylinder(Point3i[] screens, int i) { + protected void renderHermiteCylinder(Point3i[] screens, int i) { //strands colix = getLeadColix(i); if (!g3d.setColix(colix)) @@ -309,7 +310,7 @@ } //cartoons, rockets, trace: - final void renderHermiteConic(int i, boolean thisTypeOnly) { + protected void renderHermiteConic(int i, boolean thisTypeOnly) { setNeighbors(i); colix = getLeadColix(i); if (!g3d.setColix(colix)) @@ -335,7 +336,7 @@ //// cardinal hermite box or flat ribbon or twin strand (cartoons, meshRibbon, ribbon) //cartoons, meshribbon - final void renderHermiteRibbon(boolean doFill, int i, boolean thisTypeOnly) { + protected void renderHermiteRibbon(boolean doFill, int i, boolean thisTypeOnly) { setNeighbors(i); colix = getLeadColix(i); if (!g3d.setColix(colix)) @@ -364,13 +365,13 @@ //// cardinal hermite (box or flat) arrow head (cartoon) - final Point3i screenArrowTop = new Point3i(); - final Point3i screenArrowTopPrev = new Point3i(); - final Point3i screenArrowBot = new Point3i(); - final Point3i screenArrowBotPrev = new Point3i(); + private final Point3i screenArrowTop = new Point3i(); + private final Point3i screenArrowTopPrev = new Point3i(); + private final Point3i screenArrowBot = new Point3i(); + private final Point3i screenArrowBotPrev = new Point3i(); //cartoons - final void renderHermiteArrowHead(int i) { + protected void renderHermiteArrowHead(int i) { colix = getLeadColix(i); if (!g3d.setColix(colix)) return; @@ -413,7 +414,7 @@ } // rockets --not satisfactory yet - void renderCone(int i, Point3f pointBegin, Point3f pointEnd, + protected void renderCone(int i, Point3f pointBegin, Point3f pointEnd, Point3f screenPtBegin, Point3f screenPtEnd) { int coneDiameter = mad + (mad >> 2); coneDiameter = viewer.scaleToScreen((int) Math.floor(screenPtBegin.z), @@ -443,25 +444,25 @@ // know what all the options are, and they aren't important, // until it gets rendered, if ever - final static int ABSOLUTE_MIN_MESH_SIZE = 3; - final static int MIN_MESH_RENDER_SIZE = 8; + private final static int ABSOLUTE_MIN_MESH_SIZE = 3; + private final static int MIN_MESH_RENDER_SIZE = 8; - Point3f[] controlHermites; - Vector3f[] wingHermites; - Point3f[] radiusHermites; + private Point3f[] controlHermites; + private Vector3f[] wingHermites; + private Point3f[] radiusHermites; - final Vector3f Z = new Vector3f(0.1345f, 0.5426f, 0.3675f); //random reference - Vector3f norm = new Vector3f(); - final Vector3f wing = new Vector3f(); - final Vector3f wing0 = new Vector3f(); - final Vector3f wing1 = new Vector3f(); - final Vector3f wingT = new Vector3f(); - final AxisAngle4f aa = new AxisAngle4f(); - final Point3f pt = new Point3f(); - final Point3f pt1 = new Point3f(); - final Point3f ptPrev = new Point3f(); - final Point3f ptNext = new Point3f(); - final Matrix3f mat = new Matrix3f(); + private Vector3f norm = new Vector3f(); + private final Vector3f Z = new Vector3f(0.1345f, 0.5426f, 0.3675f); //random reference + private final Vector3f wing = new Vector3f(); + private final Vector3f wing0 = new Vector3f(); + private final Vector3f wing1 = new Vector3f(); + private final Vector3f wingT = new Vector3f(); + private final AxisAngle4f aa = new AxisAngle4f(); + private final Point3f pt = new Point3f(); + private final Point3f pt1 = new Point3f(); + private final Point3f ptPrev = new Point3f(); + private final Point3f ptNext = new Point3f(); + private final Matrix3f mat = new Matrix3f(); private boolean createMeshCylinder(int i, int madBeg, int madMid, int madEnd, int aspectRatio) { @@ -585,6 +586,7 @@ return (meshReady[i] = true); } + /* void createMeshCone(int i, Point3f pointBegin, Point3f pointEnd, int mad) { int level = 5; int nHermites = (level + 1) * 2 + 1; // (not used) @@ -615,7 +617,7 @@ meshReady[i] = true; mesh.setVisibilityFlags(1); } - + */ /* private void dumpPoint(Point3f pt, short color) { Point3i pt1 = viewer.transformPoint(pt); Modified: trunk/Jmol/src/org/jmol/shapebio/RocketsRenderer.java =================================================================== --- trunk/Jmol/src/org/jmol/shapebio/RocketsRenderer.java 2008-07-17 05:11:05 UTC (rev 9606) +++ trunk/Jmol/src/org/jmol/shapebio/RocketsRenderer.java 2008-07-17 14:20:19 UTC (rev 9607) @@ -30,6 +30,7 @@ import org.jmol.modelsetbio.Monomer; import org.jmol.modelsetbio.ProteinStructure; import org.jmol.modelsetbio.Sheet; +import org.jmol.viewer.JmolConstants; import javax.vecmath.Point3f; import javax.vecmath.Vector3f; @@ -58,6 +59,10 @@ protected Point3f[] cordMidPoints; + protected boolean isSheet(int i) { + return structureTypes[i] == JmolConstants.PROTEIN_STRUCTURE_SHEET; + } + protected void calcRopeMidPoints(boolean isNewStyle) { int midPointCount = monomerCount + 1; cordMidPoints = viewer.allocTempPoints(midPointCount); Modified: trunk/Jmol/src/org/jmol/viewer/Jmol.properties =================================================================== --- trunk/Jmol/src/org/jmol/viewer/Jmol.properties 2008-07-17 05:11:05 UTC (rev 9606) +++ trunk/Jmol/src/org/jmol/viewer/Jmol.properties 2008-07-17 14:20:19 UTC (rev 9607) @@ -2,7 +2,8 @@ # add it on line starting with # below the "version=..." line version=11.5.48_dev - +# bug fix: sheetsmoothing not consistent among structures in multi-chain systems +# bug fix: messages not sent to messageCallback # code: simpler matrix-->quaternion code # bug fix: 11.5.47 shows oddly sized arrow for very first rendering # bug fix: quaternion frame "n" after rotationSelected does not reset NH hydrogen positions This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ha...@us...> - 2009-05-28 19:23:50
|
Revision: 10912 http://jmol.svn.sourceforge.net/jmol/?rev=10912&view=rev Author: hansonr Date: 2009-05-28 19:23:41 +0000 (Thu, 28 May 2009) Log Message: ----------- version=11.7.39_dev # new feature: label %[....] where .... is a property name -- currently just # structureType (helix,sheet,turn,none) # structureId (helix1,helix2,sheet3,turn4... or none) # new feature: color hbonds energy Modified Paths: -------------- trunk/Jmol/src/org/jmol/modelset/Atom.java trunk/Jmol/src/org/jmol/modelset/BondCollection.java trunk/Jmol/src/org/jmol/modelset/Model.java trunk/Jmol/src/org/jmol/modelsetbio/AminoPolymer.java trunk/Jmol/src/org/jmol/modelsetbio/NucleicPolymer.java trunk/Jmol/src/org/jmol/shape/Shape.java trunk/Jmol/src/org/jmol/shape/Sticks.java trunk/Jmol/src/org/jmol/viewer/ColorManager.java trunk/Jmol/src/org/jmol/viewer/Eval.java trunk/Jmol/src/org/jmol/viewer/Jmol.properties trunk/Jmol/src/org/jmol/viewer/JmolConstants.java trunk/Jmol/src/org/jmol/viewer/RepaintManager.java trunk/Jmol/src/org/jmol/viewer/Viewer.java Added Paths: ----------- trunk/Jmol/src/org/jmol/modelset/HBond.java Modified: trunk/Jmol/src/org/jmol/modelset/Atom.java =================================================================== --- trunk/Jmol/src/org/jmol/modelset/Atom.java 2009-05-27 17:15:14 UTC (rev 10911) +++ trunk/Jmol/src/org/jmol/modelset/Atom.java 2009-05-28 19:23:41 UTC (rev 10912) @@ -1024,6 +1024,7 @@ * the list: * * case '%': + case '[': Jmol parameter value case '{': parameter value case 'A': alternate location identifier case 'a': atom name @@ -1231,6 +1232,27 @@ case '%': strT = "%"; break; + case '[': + int ichClose = strFormat.indexOf(']', ich); + if (ichClose > ich) { + String propertyName = strFormat.substring(ich, ichClose); + int type = JmolConstants.getPropertyType(propertyName); + if (type < 0) { + floatT = getPropertyFloat(type); + if (!Float.isNaN(floatT)) { + ich = ichClose + 1; + break; + } + } else if (type > 0) { + strT = getPropertyString(type); + if (strT != null) { + ich = ichClose + 1; + break; + } + } + } + strT = "%" + ch0; + break; case '{': // client property name int ichCloseBracket = strFormat.indexOf('}', ich); if (ichCloseBracket > ich) { // also picks up -1 when no '}' is found @@ -1243,7 +1265,6 @@ break; } } - // malformed will fall into default: strT = "%" + ch0; } @@ -1262,6 +1283,23 @@ return strLabel.intern(); } + private String getPropertyString(int type) { + switch (type) { + case JmolConstants.PROPERTY_STRUCTURE_ID: + int id = group.getProteinStructureID(); + String stype = JmolConstants.getProteinStructureName(group.getProteinStructureType()); + return (id < 0 ? "none" : stype + id); + case JmolConstants.PROPERTY_STRUCTURE_TYPE: + return JmolConstants.getProteinStructureName(group.getProteinStructureType()); + } + return null; + } + + private float getPropertyFloat(int type) { + // TODO + return Float.NaN; + } + public boolean equals(Object obj) { return (this == obj); } Modified: trunk/Jmol/src/org/jmol/modelset/BondCollection.java =================================================================== --- trunk/Jmol/src/org/jmol/modelset/BondCollection.java 2009-05-27 17:15:14 UTC (rev 10911) +++ trunk/Jmol/src/org/jmol/modelset/BondCollection.java 2009-05-28 19:23:41 UTC (rev 10912) @@ -163,10 +163,36 @@ return bonds[i]; } + private Bond getOrAddHBond(Atom atom, Atom atomOther, short order, short mad, + BitSet bsBonds, float energy) { + int i; + if (atom.isBonded(atomOther)) { + i = atom.getBond(atomOther).index; + } else { + if (bondCount == bonds.length) + bonds = (Bond[]) ArrayUtil.setLength(bonds, bondCount + + bondGrowthIncrement); + if (order == JmolConstants.BOND_ORDER_NULL + || order == JmolConstants.BOND_ORDER_ANY) + order = 1; + i = setBond(bondCount++, hBondMutually(atom, atomOther, order, mad, energy)).index; + } + if (bsBonds != null) + bsBonds.set(i); + return bonds[i]; + } + protected Bond setBond(int index, Bond bond) { return bonds[bond.index = index] = bond; } + protected Bond hBondMutually(Atom atom, Atom atomOther, short order, short mad, float energy) { + Bond bond = new HBond(atom, atomOther, order, mad, (short) 0, energy); + addBondToAtom(atom, bond); + addBondToAtom(atomOther, bond); + return bond; + } + protected Bond bondMutually(Atom atom, Atom atomOther, short order, short mad) { Bond bond = new Bond(atom, atomOther, order, mad, (short) 0); addBondToAtom(atom, bond); @@ -232,9 +258,10 @@ * @param order * @param bsA * @param bsB + * @param energy */ void addHydrogenBond(Atom atom1, Atom atom2, short order, BitSet bsA, - BitSet bsB) { + BitSet bsB, float energy) { if (atom1 == null || atom2 == null) return; boolean atom1InSetA = bsA == null || bsA.get(atom1.atomIndex); @@ -242,7 +269,7 @@ boolean atom2InSetA = bsA == null || bsA.get(atom2.atomIndex); boolean atom2InSetB = bsB == null || bsB.get(atom2.atomIndex); if (atom1InSetA && atom2InSetB || atom1InSetB && atom2InSetA) - getOrAddBond(atom1, atom2, order, (short) 1, bsPseudoHBonds); + getOrAddHBond(atom1, atom2, order, (short) 1, bsPseudoHBonds, energy); } protected short getBondOrder(Atom atomA, float bondingRadiusA, Atom atomB, Added: trunk/Jmol/src/org/jmol/modelset/HBond.java =================================================================== --- trunk/Jmol/src/org/jmol/modelset/HBond.java (rev 0) +++ trunk/Jmol/src/org/jmol/modelset/HBond.java 2009-05-28 19:23:41 UTC (rev 10912) @@ -0,0 +1,54 @@ +/* $RCSfile$ + * $Author: hansonr $ + * $Date: 2008-09-16 22:39:58 -0500 (Tue, 16 Sep 2008) $ + * $Revision: 9905 $ + + * + * Copyright (C) 2003-2005 The Jmol Development Team + * + * Contact: jmo...@li... + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +package org.jmol.modelset; + +import org.jmol.util.Logger; + +public class HBond extends Bond { + + private float energy; + private byte paletteID; + + HBond(Atom atom1, Atom atom2, short order, short mad, short colix, float energy) { + super(atom1, atom2, order, mad, colix); + if (Logger.debugging) + Logger.debug("HBond energy = " + energy + " for #" + atom1.getAtomIndex() + " " + atom1.getInfoXYZ(false) + ", #" + atom2.getAtomIndex() + " " + atom2.getInfoXYZ(false)); + this.energy = energy; + } + + public float getEnergy() { + return energy; + } + + public byte getPaletteId() { + return paletteID; + } + + public void setPaletteID(byte paletteID) { + this.paletteID = paletteID; + } + +} Property changes on: trunk/Jmol/src/org/jmol/modelset/HBond.java ___________________________________________________________________ Added: svn:mime-type + text/plain Modified: trunk/Jmol/src/org/jmol/modelset/Model.java =================================================================== --- trunk/Jmol/src/org/jmol/modelset/Model.java 2009-05-27 17:15:14 UTC (rev 10911) +++ trunk/Jmol/src/org/jmol/modelset/Model.java 2009-05-28 19:23:41 UTC (rev 10912) @@ -281,9 +281,9 @@ return modelSet.isAtomHidden(index); } - public void addHydrogenBond(Atom atom1, Atom atom2, short order, BitSet bsA, BitSet bsB) { + public void addHydrogenBond(Atom atom1, Atom atom2, short order, BitSet bsA, BitSet bsB, float energy) { hasCalculatedHBonds = true; - modelSet.addHydrogenBond(atom1, atom2, order, bsA, bsB); + modelSet.addHydrogenBond(atom1, atom2, order, bsA, bsB, energy); //System.out.println("addHB " + atom1.getInfo() + " "+ atom2.getInfo() + " " + atom1.distance(atom2)); } @@ -302,5 +302,5 @@ for (int i = 0; i < bioPolymerCount; i++) bioPolymers[i].recalculateLeadMidpointsAndWingVectors(); BitSetUtil.deleteBits(bsAtoms, bsDeleted); - } + } } Modified: trunk/Jmol/src/org/jmol/modelsetbio/AminoPolymer.java =================================================================== --- trunk/Jmol/src/org/jmol/modelsetbio/AminoPolymer.java 2009-05-27 17:15:14 UTC (rev 10911) +++ trunk/Jmol/src/org/jmol/modelsetbio/AminoPolymer.java 2009-05-28 19:23:41 UTC (rev 10912) @@ -146,9 +146,9 @@ //mainchainHbondOffsets[indexDonor] = (short)(indexDonor - indexMin1); //min1Indexes[indexDonor] = (short)indexMin1; //min1Energies[indexDonor] = (short)energyMin1; - createResidueHydrogenBond(source, indexDonor, indexMin1, bsA, bsB); + createResidueHydrogenBond(source, indexDonor, indexMin1, bsA, bsB, -energyMin1/1000f); if (indexMin2 >= 0) { - createResidueHydrogenBond(source, indexDonor, indexMin2, bsA, bsB); + createResidueHydrogenBond(source, indexDonor, indexMin2, bsA, bsB, -energyMin2/1000f); //min2Indexes[indexDonor] = (short)indexMin2; //min2Energies[indexDonor] = (short)energyMin2; } @@ -207,7 +207,7 @@ } private void createResidueHydrogenBond(AminoMonomer donor, int indexAminoGroup, int indexCarbonylGroup, - BitSet bsA, BitSet bsB) { + BitSet bsA, BitSet bsB, float energy) { short order; int aminoBackboneHbondOffset = indexAminoGroup - indexCarbonylGroup; /* if (debugHbonds) @@ -243,7 +243,7 @@ Atom nitrogen = donor.getNitrogenAtom(); AminoMonomer recipient = (AminoMonomer)monomers[indexCarbonylGroup]; Atom oxygen = recipient.getCarbonylOxygenAtom(); - model.addHydrogenBond(nitrogen, oxygen, order, bsA, bsB); + model.addHydrogenBond(nitrogen, oxygen, order, bsA, bsB, energy); } /* Modified: trunk/Jmol/src/org/jmol/modelsetbio/NucleicPolymer.java =================================================================== --- trunk/Jmol/src/org/jmol/modelsetbio/NucleicPolymer.java 2009-05-27 17:15:14 UTC (rev 10911) +++ trunk/Jmol/src/org/jmol/modelsetbio/NucleicPolymer.java 2009-05-28 19:23:41 UTC (rev 10912) @@ -71,15 +71,15 @@ } } if (bestN3 != null) { - model.addHydrogenBond(myN1, bestN3, HBOND_MASK, bsA, bsB); + model.addHydrogenBond(myN1, bestN3, HBOND_MASK, bsA, bsB, 0); if (myNucleotide.isGuanine()) { model.addHydrogenBond(myNucleotide.getN2(), - bestNucleotide.getO2(), HBOND_MASK, bsA, bsB); + bestNucleotide.getO2(), HBOND_MASK, bsA, bsB, 0); model.addHydrogenBond(myNucleotide.getO6(), - bestNucleotide.getN4(), HBOND_MASK, bsA, bsB); + bestNucleotide.getN4(), HBOND_MASK, bsA, bsB, 0); } else { model.addHydrogenBond(myNucleotide.getN6(), - bestNucleotide.getO4(), HBOND_MASK, bsA, bsB); + bestNucleotide.getO4(), HBOND_MASK, bsA, bsB, 0); } } } Modified: trunk/Jmol/src/org/jmol/shape/Shape.java =================================================================== --- trunk/Jmol/src/org/jmol/shape/Shape.java 2009-05-27 17:15:14 UTC (rev 10911) +++ trunk/Jmol/src/org/jmol/shape/Shape.java 2009-05-28 19:23:41 UTC (rev 10912) @@ -32,6 +32,7 @@ import org.jmol.viewer.Viewer; import org.jmol.g3d.*; import org.jmol.modelset.Atom; +import org.jmol.modelset.Bond; import org.jmol.modelset.ModelSet; import javax.vecmath.Point3f; @@ -185,6 +186,11 @@ paletteID) : colix); } + protected short setColix(short colix, byte paletteID, Bond bond) { + return (colix == Graphics3D.USE_PALETTE ? viewer.getColixBondPalette(bond, + paletteID) : colix); + } + protected void remapColors() { } Modified: trunk/Jmol/src/org/jmol/shape/Sticks.java =================================================================== --- trunk/Jmol/src/org/jmol/shape/Sticks.java 2009-05-27 17:15:14 UTC (rev 10911) +++ trunk/Jmol/src/org/jmol/shape/Sticks.java 2009-05-28 19:23:41 UTC (rev 10912) @@ -40,6 +40,7 @@ import org.jmol.modelset.Atom; import org.jmol.modelset.Bond; import org.jmol.modelset.BondIterator; +import org.jmol.modelset.HBond; public class Sticks extends Shape { @@ -125,14 +126,20 @@ bsColixSet = new BitSet(); short colix = Graphics3D.getColix(value); byte pid = JmolConstants.pidOf(value); - if (pid == JmolConstants.PALETTE_TYPE) { + if (pid == JmolConstants.PALETTE_TYPE || pid == JmolConstants.PALETTE_ENERGY) { //only for hydrogen bonds + boolean isEnergy = (pid == JmolConstants.PALETTE_ENERGY); BondIterator iter = (selectedBonds != null ? modelSet.getBondIterator(selectedBonds) : modelSet.getBondIterator(myMask, bsSelected)); while (iter.hasNext()) { bsColixSet.set(iter.nextIndex()); Bond bond = iter.next(); - bond.setColix(Graphics3D.getColix(JmolConstants.getArgbHbondType(bond.getOrder()))); + if (isEnergy) { + bond.setColix(setColix(colix, pid, bond)); + ((HBond)bond).setPaletteID(pid); + } else { + bond.setColix(Graphics3D.getColix(JmolConstants.getArgbHbondType(bond.getOrder()))); + } } return; } @@ -144,7 +151,8 @@ int iBond = iter.nextIndex(); Bond bond = iter.next(); bond.setColix(colix); - bsColixSet.set(iBond, colix != Graphics3D.INHERIT_ALL); + bsColixSet.set(iBond, (colix != Graphics3D.INHERIT_ALL + && colix != Graphics3D.USE_PALETTE)); } return; } Modified: trunk/Jmol/src/org/jmol/viewer/ColorManager.java =================================================================== --- trunk/Jmol/src/org/jmol/viewer/ColorManager.java 2009-05-27 17:15:14 UTC (rev 10911) +++ trunk/Jmol/src/org/jmol/viewer/ColorManager.java 2009-05-28 19:23:41 UTC (rev 10912) @@ -28,6 +28,8 @@ import java.util.BitSet; import org.jmol.g3d.*; import org.jmol.modelset.Atom; +import org.jmol.modelset.Bond; +import org.jmol.modelset.HBond; import org.jmol.modelset.ModelSet; import org.jmol.util.ColorEncoder; @@ -99,6 +101,16 @@ ? Graphics3D.WHITE : Graphics3D.BLACK); } + short getColixBondPalette(Bond bond, byte pid) { + int argb = 0; + switch (pid) { + case JmolConstants.PALETTE_ENERGY: + return ColorEncoder.getColorIndexFromPalette(((HBond)bond).getEnergy(), + 0.5f, 4.5f, ColorEncoder.BWR); + } + return (argb == 0 ? Graphics3D.RED : Graphics3D.getColix(argb)); + } + short getColixAtomPalette(Atom atom, byte pid) { int argb = 0; int index; Modified: trunk/Jmol/src/org/jmol/viewer/Eval.java =================================================================== --- trunk/Jmol/src/org/jmol/viewer/Eval.java 2009-05-27 17:15:14 UTC (rev 10911) +++ trunk/Jmol/src/org/jmol/viewer/Eval.java 2009-05-28 19:23:41 UTC (rev 10912) @@ -3869,7 +3869,7 @@ : JmolConstants.getPaletteID(name)); // color atoms "cpkScheme" if (pid == JmolConstants.PALETTE_UNKNOWN - || pid == JmolConstants.PALETTE_TYPE + || (pid == JmolConstants.PALETTE_TYPE || pid == JmolConstants.PALETTE_ENERGY) && shapeType != JmolConstants.SHAPE_HSTICKS) error(ERROR_invalidArgument); Object data = null; Modified: trunk/Jmol/src/org/jmol/viewer/Jmol.properties =================================================================== --- trunk/Jmol/src/org/jmol/viewer/Jmol.properties 2009-05-27 17:15:14 UTC (rev 10911) +++ trunk/Jmol/src/org/jmol/viewer/Jmol.properties 2009-05-28 19:23:41 UTC (rev 10912) @@ -3,8 +3,11 @@ version=11.7.39_dev +# new feature: label %[....] where .... is a property name -- currently just +# structureType (helix,sheet,turn,none) +# structureId (helix1,helix2,sheet3,turn4... or none) +# new feature: color hbonds energy # new feature: application flag -L --nosplash no splash screen (For Jmol in Sun Wonderland dev. 5) - # new feature: load XYZ ... loads just the XYZ coordinates, in sequence, based on selected atoms. # lots of potential uses for this: # --NMR files where you want just one model at a time and, once loaded, want to save the positions Modified: trunk/Jmol/src/org/jmol/viewer/JmolConstants.java =================================================================== --- trunk/Jmol/src/org/jmol/viewer/JmolConstants.java 2009-05-27 17:15:14 UTC (rev 10911) +++ trunk/Jmol/src/org/jmol/viewer/JmolConstants.java 2009-05-28 19:23:41 UTC (rev 10912) @@ -1533,18 +1533,19 @@ public final static byte PALETTE_INSERTION = 15; public final static byte PALETTE_JMOL = 16; public final static byte PALETTE_RASMOL = 17; - public final static byte PALETTE_TYPE = 18; //b0001 0010 - public final static byte PALETTE_PROPERTY = 19 | PALETTE_VOLATILE; //b0001 0011 - public final static byte PALETTE_VARIABLE = 20 | PALETTE_VOLATILE; //b0001 0011 + public final static byte PALETTE_TYPE = 18; + public final static byte PALETTE_ENERGY = 19; + public final static byte PALETTE_PROPERTY = 20 | PALETTE_VOLATILE; + public final static byte PALETTE_VARIABLE = 21 | PALETTE_VOLATILE; - public final static byte PALETTE_STRAIGHTNESS = 21 | PALETTE_VOLATILE; + public final static byte PALETTE_STRAIGHTNESS = 22 | PALETTE_VOLATILE; private final static String[] paletteNames = { /* 0 */ "none", "cpk", "partialcharge", "formalcharge", "temperature", /* 5 */ "fixedtemperature", "surfacedistance", "structure", "amino", /* 9 */ "shapely", "chain", "group", "monomer", "molecule", "altloc", /*15 */ "insertion", "jmol", "rasmol", - /*18 */ "type" /* hbonds only */, + /*18 */ "type", "energy" /* hbonds only */, /*19 */ "property", "variable", "straightness" }; @@ -1571,6 +1572,7 @@ PALETTE_JMOL, PALETTE_RASMOL, PALETTE_TYPE, + PALETTE_ENERGY, PALETTE_PROPERTY, PALETTE_VARIABLE, @@ -3000,4 +3002,24 @@ final public static String getQuantumSubshellTag(int shell, int subshell) { return shellOrder[shell][subshell]; } + + // negative numbers would be floats + final public static int PROPERTY_UNKNOWN = 0; + final public static int PROPERTY_STRUCTURE_TYPE = 1; + final public static int PROPERTY_STRUCTURE_ID = 2; + final private static String[] PropertyNames = { + "structureType", "structureId" + }; + + final private static int[] PropertyTypes = { + PROPERTY_STRUCTURE_TYPE, PROPERTY_STRUCTURE_ID + }; + + public static int getPropertyType(String propertyName) { + for (int i = PropertyNames.length; --i >= 0; ) { + if (PropertyNames[i].equalsIgnoreCase(propertyName)) + return PropertyTypes[i]; + } + return PROPERTY_UNKNOWN; + } } Modified: trunk/Jmol/src/org/jmol/viewer/RepaintManager.java =================================================================== --- trunk/Jmol/src/org/jmol/viewer/RepaintManager.java 2009-05-27 17:15:14 UTC (rev 10911) +++ trunk/Jmol/src/org/jmol/viewer/RepaintManager.java 2009-05-28 19:23:41 UTC (rev 10912) @@ -75,7 +75,8 @@ } currentModelIndex = modelIndex; if (ids != null) { - viewer.restoreModelOrientation(modelIndex); + if (modelIndex >= 0) + viewer.restoreModelOrientation(modelIndex); if (isSameSource && ids.indexOf("quaternion") >= 0 && ids.indexOf("ramachandran") < 0) viewer.restoreModelRotation(formerModelIndex); Modified: trunk/Jmol/src/org/jmol/viewer/Viewer.java =================================================================== --- trunk/Jmol/src/org/jmol/viewer/Viewer.java 2009-05-27 17:15:14 UTC (rev 10911) +++ trunk/Jmol/src/org/jmol/viewer/Viewer.java 2009-05-28 19:23:41 UTC (rev 10912) @@ -28,6 +28,7 @@ import org.jmol.modelset.Atom; import org.jmol.modelset.AtomCollection; import org.jmol.modelset.AtomIndexIterator; +import org.jmol.modelset.Bond; import org.jmol.modelset.BoxInfo; import org.jmol.modelset.MeasurementPending; import org.jmol.modelset.ModelLoader; @@ -1381,6 +1382,10 @@ return colorManager.getColixAtomPalette(atom, pid); } + public short getColixBondPalette(Bond bond, byte pid) { + return colorManager.getColixBondPalette(bond, pid); + } + public int[] getColorSchemeArray(String colorScheme) { return colorManager.getColorSchemeArray(colorScheme); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ha...@us...> - 2009-07-08 14:22:22
|
Revision: 11192 http://jmol.svn.sourceforge.net/jmol/?rev=11192&view=rev Author: hansonr Date: 2009-07-08 14:03:15 +0000 (Wed, 08 Jul 2009) Log Message: ----------- version=11.7.47_dev arrays by ref # bug fix: arrays passed to functions by reference do not update if size is increased # new feature: by passing an array to a function, you can make that variable # return a value -- any value, not just an array: # function test(a) { # a = "new value" # } # b = [] # test(b) # print b ==> "new value" # Modified Paths: -------------- trunk/Jmol/src/org/jmol/shape/UccageRenderer.java trunk/Jmol/src/org/jmol/viewer/Jmol.properties trunk/Jmol/src/org/jmol/viewer/ScriptFunction.java trunk/Jmol/src/org/jmol/viewer/ScriptVariable.java Modified: trunk/Jmol/src/org/jmol/shape/UccageRenderer.java =================================================================== --- trunk/Jmol/src/org/jmol/shape/UccageRenderer.java 2009-07-08 03:39:56 UTC (rev 11191) +++ trunk/Jmol/src/org/jmol/shape/UccageRenderer.java 2009-07-08 14:03:15 UTC (rev 11192) @@ -99,7 +99,7 @@ int y = lineheight; String spaceGroup = symmetry.getSpaceGroupName(); - if (spaceGroup != null) { + if (spaceGroup != null & !spaceGroup.equals("-- [--]")) { y += lineheight; g3d.drawStringNoSlab(spaceGroup, null, x, y, 0); } Modified: trunk/Jmol/src/org/jmol/viewer/Jmol.properties =================================================================== --- trunk/Jmol/src/org/jmol/viewer/Jmol.properties 2009-07-08 03:39:56 UTC (rev 11191) +++ trunk/Jmol/src/org/jmol/viewer/Jmol.properties 2009-07-08 14:03:15 UTC (rev 11192) @@ -3,11 +3,22 @@ version=11.7.47_dev +# bug fix: arrays passed to functions by reference do not update if size is increased +# new feature: by passing an array to a function, you can make that variable +# return a value -- any value, not just an array: +# function test(a) { +# a = "new value" +# } +# b = [] +# test(b) +# print b ==> "new value" +# +# bug fix: spacegroup "-- [--]" displayed when load command option SPACEGROUP is used # bug fix: mol2 reader not properly allowing override of CRYSIN unit cell record # bug fix: %r not correct label # bug fix: quaternionFrame default now "p" # bug fix: quaternion difference off by one group -# bug fix: show functions not working +# bug fix: show FUNCTIONS not working # bug fix: draw picking in multimodel context causes null pointer exception # new feature: within("HELIX"), within("SHEET") -- helix and sheet, but not ends # new feature: all.bin(f0, f1, df) -- binning of data to give an integer array of counts Modified: trunk/Jmol/src/org/jmol/viewer/ScriptFunction.java =================================================================== --- trunk/Jmol/src/org/jmol/viewer/ScriptFunction.java 2009-07-08 03:39:56 UTC (rev 11191) +++ trunk/Jmol/src/org/jmol/viewer/ScriptFunction.java 2009-07-08 14:03:15 UTC (rev 11192) @@ -67,18 +67,33 @@ int nParams = (params == null ? 0 : params.size()); for (int i = names.size(); --i >= 0;) { String name = ((String) names.get(i)).toLowerCase(); - contextVariables.put(name, (i < nParameters && i < nParams ? - new ScriptVariable((ScriptVariable) params.get(i)) - : (new ScriptVariable(Token.string, "")).setName(name))); - - -// contextVariables.put(name, (i < nParameters && i < nParams ? -// new ScriptVariable().set((ScriptVariable) params.get(i)) -// : (new ScriptVariable(Token.string, "")).setName(name))); + ScriptVariable var = (i < nParameters && i < nParams ? + (ScriptVariable) params.get(i) : null); + if (var != null && var.tok != Token.list) + var = new ScriptVariable(var); + contextVariables.put(name, (var == null ? + (new ScriptVariable(Token.string, "")).setName(name) : var)); } contextVariables.put("_retval", ScriptVariable.intVariable(0)); } + public void unsetVariables(Hashtable contextVariables, Vector params) { + // set list values in case they have changed. + int nParams = (params == null ? 0 : params.size()); + int nNames = names.size(); + if (nParams == 0 || nNames == 0) + return; + for (int i = 0; i < nNames && i < nParams; i++) { + ScriptVariable global = (ScriptVariable) params.get(i); + if (global.tok != Token.list) + continue; + ScriptVariable local = (ScriptVariable) contextVariables.get(((String) names.get(i)).toLowerCase()); + if (local.tok != Token.list) + continue; + global.value = local.value; + } + } + void addVariable(String name, boolean isParameter) { variables.put(name, name); names.add(name); Modified: trunk/Jmol/src/org/jmol/viewer/ScriptVariable.java =================================================================== --- trunk/Jmol/src/org/jmol/viewer/ScriptVariable.java 2009-07-08 03:39:56 UTC (rev 11191) +++ trunk/Jmol/src/org/jmol/viewer/ScriptVariable.java 2009-07-08 14:03:15 UTC (rev 11192) @@ -502,7 +502,10 @@ } static ScriptVariable selectItem(ScriptVariable var) { - if (var.index != Integer.MAX_VALUE) + // pass bitsets created by the select() or for() commands + // and all arrays by reference + if (var.index != Integer.MAX_VALUE || + var.tok == list && var.intValue == Integer.MAX_VALUE) return var; return (ScriptVariable) selectItem(var, Integer.MIN_VALUE); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ha...@us...> - 2009-10-18 23:49:24
|
Revision: 11594 http://jmol.svn.sourceforge.net/jmol/?rev=11594&view=rev Author: hansonr Date: 2009-10-18 23:49:15 +0000 (Sun, 18 Oct 2009) Log Message: ----------- version=11.9.7_dev isosurface contours # new feature: getproperty shapeinfo better reports contour levels # new feature: isosurface ... map CONTOUR DISCRETE [0.5, 1.0, 1.5, 2.0] # new feature: isosurface ... map CONTOUR INCREMENT {0.0, 1.0, 0.2} Modified Paths: -------------- trunk/Jmol/src/org/jmol/api/JmolRendererInterface.java trunk/Jmol/src/org/jmol/export/Export3D.java trunk/Jmol/src/org/jmol/export/_Exporter.java trunk/Jmol/src/org/jmol/export/_IdtfExporter.java trunk/Jmol/src/org/jmol/export/_PovrayExporter.java trunk/Jmol/src/org/jmol/g3d/Cylinder3D.java trunk/Jmol/src/org/jmol/g3d/Graphics3D.java trunk/Jmol/src/org/jmol/jvxl/api/MeshDataServer.java trunk/Jmol/src/org/jmol/jvxl/calc/MarchingSquares.java trunk/Jmol/src/org/jmol/jvxl/data/JvxlData.java trunk/Jmol/src/org/jmol/jvxl/readers/JvxlReader.java trunk/Jmol/src/org/jmol/jvxl/readers/Parameters.java trunk/Jmol/src/org/jmol/jvxl/readers/SurfaceFileReader.java trunk/Jmol/src/org/jmol/jvxl/readers/SurfaceGenerator.java trunk/Jmol/src/org/jmol/jvxl/readers/SurfaceReader.java trunk/Jmol/src/org/jmol/modelset/Atom.java trunk/Jmol/src/org/jmol/modelset/Bond.java trunk/Jmol/src/org/jmol/modelset/ModelCollection.java trunk/Jmol/src/org/jmol/modelset/ModelSet.java trunk/Jmol/src/org/jmol/script/ScriptEvaluator.java trunk/Jmol/src/org/jmol/script/ScriptMathProcessor.java trunk/Jmol/src/org/jmol/shape/LabelsRenderer.java trunk/Jmol/src/org/jmol/shape/Shape.java trunk/Jmol/src/org/jmol/shape/Text.java trunk/Jmol/src/org/jmol/shapesurface/Isosurface.java trunk/Jmol/src/org/jmol/shapesurface/IsosurfaceMesh.java trunk/Jmol/src/org/jmol/shapesurface/IsosurfaceRenderer.java trunk/Jmol/src/org/jmol/util/Escape.java trunk/Jmol/src/org/jmol/util/Parser.java trunk/Jmol/src/org/jmol/viewer/Jmol.properties trunk/Jmol/src/org/jmol/viewer/Viewer.java Modified: trunk/Jmol/src/org/jmol/api/JmolRendererInterface.java =================================================================== --- trunk/Jmol/src/org/jmol/api/JmolRendererInterface.java 2009-10-16 04:54:23 UTC (rev 11593) +++ trunk/Jmol/src/org/jmol/api/JmolRendererInterface.java 2009-10-18 23:49:15 UTC (rev 11594) @@ -296,10 +296,8 @@ public abstract boolean isClippedXY(int i, int screenX, int screenY); - public abstract int getColixArgb(short colix); + public abstract int getColorArgbOrGray(short colix); - public abstract String getHexColorFromIndex(short colix); - public abstract int calcSurfaceShade(Point3i screenA, Point3i screenB, Point3i screenC); Modified: trunk/Jmol/src/org/jmol/export/Export3D.java =================================================================== --- trunk/Jmol/src/org/jmol/export/Export3D.java 2009-10-16 04:54:23 UTC (rev 11593) +++ trunk/Jmol/src/org/jmol/export/Export3D.java 2009-10-18 23:49:15 UTC (rev 11594) @@ -220,7 +220,7 @@ private void drawHLine(int x, int y, int z, int w) { // hover, labels only - int argbCurrent = g3d.getColixArgb(colix); + int argbCurrent = g3d.getColorArgbOrGray(colix); if (w < 0) { x += w; w = -w; @@ -232,7 +232,7 @@ private void drawVLine(int x, int y, int z, int h) { // hover, labels only - int argbCurrent = g3d.getColixArgb(colix); + int argbCurrent = g3d.getColorArgbOrGray(colix); if (h < 0) { y += h; h = -h; @@ -793,14 +793,10 @@ return g3d.isClipped(x, y); } - public int getColixArgb(short colix) { - return g3d.getColixArgb(colix); + public int getColorArgbOrGray(short colix) { + return g3d.getColorArgbOrGray(colix); } - public String getHexColorFromIndex(short colix) { - return g3d.getHexColorFromIndex(colix); - } - public int calcSurfaceShade(Point3i pointA, Point3i pointB, Point3i pointC) { return g3d.calcSurfaceShade(pointA, pointB, pointC); } Modified: trunk/Jmol/src/org/jmol/export/_Exporter.java =================================================================== --- trunk/Jmol/src/org/jmol/export/_Exporter.java 2009-10-16 04:54:23 UTC (rev 11593) +++ trunk/Jmol/src/org/jmol/export/_Exporter.java 2009-10-18 23:49:15 UTC (rev 11594) @@ -276,13 +276,13 @@ } protected String rgbFromColix(short colix, char sep) { - int argb = g3d.getColixArgb(colix); + int argb = g3d.getColorArgbOrGray(colix); return new StringBuffer().append((argb >> 16) & 0xFF).append(sep).append( (argb >> 8) & 0xFF).append(sep).append((argb) & 0xFF).toString(); } protected String rgbFractionalFromColix(short colix, char sep) { - return rgbFractionalFromArgb(g3d.getColixArgb(colix), sep); + return rgbFractionalFromArgb(g3d.getColorArgbOrGray(colix), sep); } protected String rgbFractionalFromArgb(int argb, char sep) { Modified: trunk/Jmol/src/org/jmol/export/_IdtfExporter.java =================================================================== --- trunk/Jmol/src/org/jmol/export/_IdtfExporter.java 2009-10-16 04:54:23 UTC (rev 11593) +++ trunk/Jmol/src/org/jmol/export/_IdtfExporter.java 2009-10-18 23:49:15 UTC (rev 11594) @@ -1013,7 +1013,7 @@ viewer.transformPoint(center, pt); z = (int)pt.z; } - g3d.plotText(x, y, z, g3d.getColixArgb(colix), text, font3d, jmolRenderer); + g3d.plotText(x, y, z, g3d.getColorArgbOrGray(colix), text, font3d, jmolRenderer); } public void startShapeBuffer(int iShape) { Modified: trunk/Jmol/src/org/jmol/export/_PovrayExporter.java =================================================================== --- trunk/Jmol/src/org/jmol/export/_PovrayExporter.java 2009-10-16 04:54:23 UTC (rev 11593) +++ trunk/Jmol/src/org/jmol/export/_PovrayExporter.java 2009-10-18 23:49:15 UTC (rev 11594) @@ -635,7 +635,7 @@ // the bitmap, but then output to jmolRenderer, which returns control // here via drawPixel. output("// start text " + (++nText) + ": " + text + "\n"); - g3d.plotText(x, y, z, g3d.getColixArgb(colix), text, font3d, jmolRenderer); + g3d.plotText(x, y, z, g3d.getColorArgbOrGray(colix), text, font3d, jmolRenderer); output("// end text " + nText + ": " + text + "\n"); } Modified: trunk/Jmol/src/org/jmol/g3d/Cylinder3D.java =================================================================== --- trunk/Jmol/src/org/jmol/g3d/Cylinder3D.java 2009-10-16 04:54:23 UTC (rev 11593) +++ trunk/Jmol/src/org/jmol/g3d/Cylinder3D.java 2009-10-18 23:49:15 UTC (rev 11594) @@ -90,8 +90,8 @@ dyB = yB - yA; dzB = zB - zA; if (diameter <= 1) { - line3d.plotLineDelta(g3d.getColixArgb(colixA), isScreenedA, g3d - .getColixArgb(colixB), isScreenedB, xA, yA, zA, dxB, dyB, dzB, + line3d.plotLineDelta(g3d.getColorArgbOrGray(colixA), isScreenedA, g3d + .getColorArgbOrGray(colixB), isScreenedB, xA, yA, zA, dxB, dyB, dzB, clipped); return; } @@ -142,8 +142,8 @@ dyBf = yB - yA; dzBf = zB - zA; if (diameter == 0 || diameter == 1) { - line3d.plotLineDelta(g3d.getColixArgb(colixA), isScreenedA, g3d - .getColixArgb(colixB), isScreenedB, (int) xA, (int) yA, (int) zA, + line3d.plotLineDelta(g3d.getColorArgbOrGray(colixA), isScreenedA, g3d + .getColorArgbOrGray(colixB), isScreenedB, (int) xA, (int) yA, (int) zA, (int) dxBf, (int) dyBf, (int) dzBf, clipped); return; } Modified: trunk/Jmol/src/org/jmol/g3d/Graphics3D.java =================================================================== --- trunk/Jmol/src/org/jmol/g3d/Graphics3D.java 2009-10-16 04:54:23 UTC (rev 11593) +++ trunk/Jmol/src/org/jmol/g3d/Graphics3D.java 2009-10-18 23:49:15 UTC (rev 11594) @@ -748,7 +748,7 @@ colixCurrent = colix; shadesCurrent = getShades(colix); currentIntensity = -1; - argbCurrent = argbNoisyUp = argbNoisyDn = getColixArgb(colix); + argbCurrent = argbNoisyUp = argbNoisyDn = getColorArgbOrGray(colix); return true; } @@ -2007,6 +2007,13 @@ return pt; } + public static int colorPtToInt(Point3f pt) { + return 0xFF000000 + | (((int) pt.x) & 0xFF) << 16 + | (((int) pt.y) & 0xFF) << 8 + | (((int) pt.z) & 0xFF); + } + public final static Point3f colorPointFromInt2(int color) { return new Point3f((color >> 16) & 0xFF, (color >> 8) & 0xFF, color & 0xFF); } @@ -2092,7 +2099,7 @@ return applyColorTranslucencyLevel(colix, translucentLevel); } - public int getColixArgb(short colix) { + public int getColorArgbOrGray(short colix) { if (colix < 0) colix = changeableColixMap[colix & UNMASK_CHANGEABLE_TRANSLUCENT]; if (! inGreyscaleMode) @@ -2164,9 +2171,8 @@ } */ - public String getHexColorFromIndex(short colix) { - int argb = getColixArgb(colix); - return getHexColorFromRGB(argb); + public static int getArgb(short colix) { + return Colix3D.getArgb(colix); } public static String getHexColorFromRGB(int argb) { Modified: trunk/Jmol/src/org/jmol/jvxl/api/MeshDataServer.java =================================================================== --- trunk/Jmol/src/org/jmol/jvxl/api/MeshDataServer.java 2009-10-16 04:54:23 UTC (rev 11593) +++ trunk/Jmol/src/org/jmol/jvxl/api/MeshDataServer.java 2009-10-18 23:49:15 UTC (rev 11594) @@ -32,5 +32,4 @@ public abstract void notifySurfaceGenerationCompleted(); public abstract void notifySurfaceMappingCompleted(); public abstract Point3f[] calculateGeodesicSurface(BitSet bsSelected, float envelopeRadius); - public abstract int getColixArgb(short colix); } Modified: trunk/Jmol/src/org/jmol/jvxl/calc/MarchingSquares.java =================================================================== --- trunk/Jmol/src/org/jmol/jvxl/calc/MarchingSquares.java 2009-10-16 04:54:23 UTC (rev 11593) +++ trunk/Jmol/src/org/jmol/jvxl/calc/MarchingSquares.java 2009-10-18 23:49:15 UTC (rev 11594) @@ -107,7 +107,7 @@ } else { nContours = contoursDiscrete.length; nContourSegments = nContours; - contourFromZero = true; + this.contourFromZero = false; } setContourType(); } @@ -459,8 +459,10 @@ //int x, y; //Point3f origin; final int[] vertexes = new int[] {-1, -1, -1, -1 }; + final float[] values = new float[4]; float[][] fractions; int[][] intersectionPoints; + int iOption; PlanarSquare(int index, int nContourSegments) { this.index = index; @@ -610,6 +612,7 @@ if (ps.vertexes[i] == -1) { vertexValues2d[i] = Float.NaN; } + ps.values[i] = vertexValues2d[i]; if (isInside2d(vertexValues2d[i], contourCutoff)) { insideMask |= 1 << i; ++insideCount; @@ -774,7 +777,7 @@ /* * Y * 3 ---c---- 2 - * | | binar edgeMask is dcba 3210 + * | | binary edgeMask is dcba 3210 * | | dcba: 1 is intersection * d b 3210: 1 is Inside * | | @@ -892,7 +895,7 @@ if (thisContour <= 0 || thisContour == contourIndex + 1) { for (int squareIndex = 0; squareIndex < nSquares; squareIndex++) { - //if (squareIndex <= 1738 || squareIndex >= 1740)continue; +// if (squareIndex != 680)continue; /* @@ -920,11 +923,13 @@ if (andMask != 0) { // we have two on same edge for (int i = 0; i < 4; i++) if ((andMask & (1 << i)) != 0) { - lowerFirst = (square.fractions[contourIndex][i] > square.fractions[contourIndex +offset][i]); + lowerFirst = (square.fractions[contourIndex][i] > square.fractions[contourIndex + offset][i]); break; } } + System.out.print("em=" + Integer.toBinaryString(edgeMask) + " em0=" + Integer.toBinaryString(edgeMask0) ); edgeMask ^= edgeMask0 & 0x0F0F; + System.out.println(" em=" + Integer.toBinaryString(edgeMask) ); } } @@ -947,6 +952,7 @@ private void fillSquare(PlanarSquare square, int squareIndex, int contourIndex, int edgeMask, boolean lowerFirst, int offset) { int nIntersect = 0; + int vPt = 0; bsMesh0.clear(); bsMesh1.clear(); @@ -962,15 +968,110 @@ int maskN = (edgeMask >> 4) & 0xF; int maskN0 = (edgeMask >> 8) & 0xF; int maskV = edgeMask & 0xF; - int iOption = -1; - if (maskN == 0xF && maskN0 != 0) { - iOption = 1; - // ambiguity - if (maskN0 == 9 || maskN0 == 6) - iOption = 2; //b1001 or b0110 - } + + /* + * + * The classic ambiguity is when a contour crosses a square twice. + * That is, maskN = 0xF. In this case, we have two options: + * + * Which is it? + * + * / + * 3 -c-----[2]/ + * | / b + * |/ fill /| "option 1" + * d / | + * /| / | + * [0]----a-- 1 + * / + * + * + * \ + * 3 ------c[2] + * \| \f| "option -2" + * d \| + * |\ b + * |f\ |\ + * [0]-a------ 1 + * \ + * + * + * \ + * [3]------c--2 + * \| \ | "option -1" + * d \| + * |\ fill b + * | \ |\ + * 0 -a------[1] + * \ + * + * / + * [3]-c------ 2/ + * |f/ b + * |/ /| "option 2" + * d / | + * /| / f| + * 0 -----a--[1] + * / + * + * Options -1 and 2 have to be handled specially. + * + * The idea here is to go with what was true for the + * PREVIOUS contour. If that contour was 1001 or 0110, + * then we can go with option -1 or -2; + * otherwise we go with option 1 or 2. + * + * Also, if we have "all outside" (maskV = 0000) for the square, we + * still have to know what to do if the previous one was one of these. + * + */ + + boolean newVertex = ((maskV & 1) != 0); + int iOption = 0; + switch (maskN) { + case 0xF: + if (square.iOption < 0) { + iOption = (newVertex ? -2 : -1); + } else { + iOption = (newVertex ? 1 : 2); + } + square.iOption = iOption; + break; + case 0x0: + if (maskN0 == 0xF) { + switch (square.iOption) { + case -1: + iOption = -2; + break; + case 1: + iOption = 2; + break; + case -2: + iOption = -1; + break; + case 2: + iOption = 1; + break; + } + } + square.iOption = iOption; + break; + case 9: // b1001 + case 6: // b0110 + // + square.iOption = -1; + break; + case 12: // b1100 + case 3: // b0011 + // + square.iOption = 1; + break; + default: + square.iOption = 0; + } + System.out.println(contourIndex + " marchingsquares edgemask=" + Integer.toBinaryString(edgeMask) + " " + iOption); for (int i = 0; i < 4; i++) { - boolean newVertex = ((maskV & (1 << i)) != 0); + newVertex = ((maskV & (1 << i)) != 0); boolean thisIntersect = ((maskN & (1 << i)) != 0); boolean lowerIntersect = ((maskN0 & (1 << i)) != 0); @@ -1007,17 +1108,24 @@ lowerFirst = !lowerFirst; } - if (i == 0 && iOption > 0) { + if (i == 0 && iOption == -2) { BitSetUtil.copy(bsMesh1, bsMesh0); pt0 = vPt; } - if (i == 2 && iOption > 0) { + if (i == 2 && iOption == -2) { createTriangleSet(pt0, vPt, nValid, contourIndex, contourIndex + offset); vPt = pt0; pt0 = 0; BitSetUtil.copy(bsMesh0, bsMesh1); } + + if (i == 1 && iOption == 2) { + createTriangleSet(pt0, vPt, nValid, contourIndex, contourIndex + offset); + vPt = 0; + bsMesh1.clear(); + } + } Modified: trunk/Jmol/src/org/jmol/jvxl/data/JvxlData.java =================================================================== --- trunk/Jmol/src/org/jmol/jvxl/data/JvxlData.java 2009-10-16 04:54:23 UTC (rev 11593) +++ trunk/Jmol/src/org/jmol/jvxl/data/JvxlData.java 2009-10-18 23:49:15 UTC (rev 11594) @@ -171,7 +171,8 @@ public int vertexCount; public Vector[] vContours; - public int[] contourColors; + public short[] contourColixes; + public float[] contourValues; public float[] contourValuesUsed; public short minColorIndex = -1; Modified: trunk/Jmol/src/org/jmol/jvxl/readers/JvxlReader.java =================================================================== --- trunk/Jmol/src/org/jmol/jvxl/readers/JvxlReader.java 2009-10-16 04:54:23 UTC (rev 11593) +++ trunk/Jmol/src/org/jmol/jvxl/readers/JvxlReader.java 2009-10-18 23:49:15 UTC (rev 11594) @@ -32,7 +32,7 @@ import org.jmol.shapesurface.IsosurfaceMesh; import org.jmol.util.*; -import org.jmol.jvxl.api.MeshDataServer; +import org.jmol.g3d.Graphics3D; import org.jmol.jvxl.data.JvxlData; import org.jmol.jvxl.data.MeshData; import org.jmol.jvxl.data.VolumeData; @@ -263,6 +263,8 @@ } private void jvxlReadDefinitionLine(boolean showMsg) throws Exception { + // params values come from user adding options to the isosurface command + // jvxlData values are from this file String comment = skipComments(true); if (showMsg) Logger.info("reading jvxl data set: " + comment + line); @@ -307,7 +309,7 @@ .error("Error reading 4 floats for PLANE definition -- setting to 0 0 1 0 (z=0)"); params.thePlane = new Point4f(0, 0, 1, 0); } - Logger.info("JVXL read: {" + params.thePlane.x + " " + params.thePlane.y + Logger.info("JVXL read: plane {" + params.thePlane.x + " " + params.thePlane.y + " " + params.thePlane.z + " " + params.thePlane.w + "}"); if (param2 == -1 && param3 < 0) param3 = -param3; @@ -320,7 +322,15 @@ // could be plane or functionXY params.isContoured = (param3 != 0); int nContoursRead = parseInt(); - if (nContoursRead != Integer.MIN_VALUE) { + if (nContoursRead == Integer.MIN_VALUE) { + if (line.charAt(next[0]) == '[') { + jvxlData.contourValues = params.contoursDiscrete = parseFloatArray(); + Logger.info("JVXL read: contourValues " + Escape.escapeArray(jvxlData.contourValues)); + jvxlData.contourColixes = params.contourColixes = Parser.getColixArray(getNextQuotedString()); + Logger.info("JVXL read: contourColixes " + Escape.escapeColors(jvxlData.contourColixes)); + params.nContours = jvxlData.contourValues.length; + } + } else { if (nContoursRead < 0) { nContoursRead = -1 - nContoursRead; params.contourFromZero = false; //MEP data to complete the plane @@ -367,7 +377,7 @@ } params.mappedDataMin = dataMin; params.mappedDataMax = dataMax; - Logger.info("JVXL read: data min/max: " + params.mappedDataMin + "/" + Logger.info("JVXL read: data_min/max " + params.mappedDataMin + "/" + params.mappedDataMax); } if (!params.rangeDefined) @@ -869,10 +879,23 @@ info.append("\n plane=\"{ " + s + " }\""); } if (jvxlData.isContoured) { - if (isInfo) - info.append("\n nContours=\"" + Math.abs(jvxlData.nContours) + "\""); - else - definitionLine += " " + jvxlData.nContours; + if (jvxlData.contourValues == null) { + if (isInfo) + info.append("\n nContours=\"" + Math.abs(jvxlData.nContours) + "\""); + else + definitionLine += " " + jvxlData.nContours; + } else { + if (isInfo) + info.append("\n contourValues=\"") + .append(Escape.escapeArray(jvxlData.contourValues)) + .append("\"") + .append("\n contourColors=") + .append(Escape.escapeColors(jvxlData.contourColixes)); + else + definitionLine += " " + + Escape.escapeArray(jvxlData.contourValues) + + " " + Escape.escapeColors(jvxlData.contourColixes); + } } // ... mappedDataMin mappedDataMax valueMappedToRed valueMappedToBlue ... float min = (jvxlData.mappedDataMin == Float.MAX_VALUE ? 0f @@ -916,8 +939,7 @@ //0.9e adds color contours for planes and min/max range, contour settings } - public static String jvxlGetFile(MeshDataServer meshDataServer, - JvxlData jvxlData, MeshData meshData, + public static String jvxlGetFile(JvxlData jvxlData, MeshData meshData, String[] title, String msg, boolean includeHeader, int nSurfaces, String state, String comment) { @@ -946,7 +968,7 @@ sb.append("<jvxlSurfaceData>\n"); sb.append(jvxlEncodeTriangleData(meshData.polygonIndexes, meshData.polygonCount, vertexIdNew)); - sb.append(jvxlEncodeVertexData(meshDataServer, jvxlData, vertexIdNew, + sb.append(jvxlEncodeVertexData(jvxlData, vertexIdNew, meshData.vertices, meshData.vertexValues, meshData.vertexCount, meshData.polygonColixes, meshData.polygonCount, jvxlData.jvxlColorData.length() > 0)); @@ -1001,8 +1023,8 @@ sb.append(" value=\"" + contours[i].get(IsosurfaceMesh.CONTOUR_VALUE) + "\""); sb.append(" color=\"" - + Escape.escapeColor(((int[]) contours[i] - .get(IsosurfaceMesh.CONTOUR_COLOR))[0]) + "\""); + + Escape.escapeColor(((short[]) contours[i] + .get(IsosurfaceMesh.CONTOUR_COLIX))[0]) + "\""); sb.append(" npolygons=\"" + nPolygons + "\""); StringBuffer sb1 = new StringBuffer(); jvxlEncodeBitSet((BitSet) contours[i].get(IsosurfaceMesh.CONTOUR_BITSET), @@ -1264,7 +1286,6 @@ * The resultant string is really two strings of length nData * where the first string lists the "high" part of the positions, * and the second string lists the "low" part of the positions. - * @param meshDataServer * * @param jvxlData * @param vertexIdNew @@ -1276,8 +1297,7 @@ * @param addColorData * @return string of encoded data */ - public static String jvxlEncodeVertexData(MeshDataServer meshDataServer, - JvxlData jvxlData, + public static String jvxlEncodeVertexData(JvxlData jvxlData, int[] vertexIdNew, Point3f[] vertices, float[] vertexValues, @@ -1334,7 +1354,7 @@ if (done || polygonColixes[i] != colix) { if (count != 0) list1.append(" ").append(count).append(" ").append( - (colix == 0 ? 0 : meshDataServer.getColixArgb(colix))); + (colix == 0 ? 0 : Graphics3D.getArgb(colix))); if (done) break; colix = polygonColixes[i]; @@ -1396,17 +1416,27 @@ String s = getXmlData("jvxlContour", data.substring(pt), true); int n = parseInt(getXmlAttrib(s, "npolygons")); float value = parseFloat(getXmlAttrib(s, "value")); - int color = Escape.unescapeColor(getXmlAttrib(s, "color")); + short colix = Graphics3D.getColix(Escape.unescapeColor(getXmlAttrib(s, + "color"))); String fData = getXmlAttrib(s, "data"); BitSet bs = jvxlDecodeBitSet(s.substring(s.lastIndexOf("\">") + 2)); - IsosurfaceMesh.setContourVector(v, n, bs, value, color, new StringBuffer(fData)); - //if (s.indexOf("i=\"5\"") >= 0) + IsosurfaceMesh.setContourVector(v, n, bs, value, colix, new StringBuffer( + fData)); vs.add(v); } vContours = new Vector[vs.size()]; - for (int i = 0; i < vs.size(); i++) - vContours[i] = (Vector) vs.get(i); + if (jvxlData.vContours != null) { + // 3D contour values and colors + int n = vs.size(); + jvxlData.contourColixes = params.contourColixes = new short[n]; + jvxlData.contourValues = params.contoursDiscrete = new float[n]; + for (int i = 0; i < n; i++) { + vContours[i] = (Vector) vs.get(i); + jvxlData.contourValues[i] = ((Float) vContours[i].get(2)).floatValue(); + jvxlData.contourColixes[i] = ((short[]) vContours[i].get(3))[0]; + } + } } public static void set3dContourVector(Vector v, int[][] polygonIndexes, Point3f[] vertices) { Modified: trunk/Jmol/src/org/jmol/jvxl/readers/Parameters.java =================================================================== --- trunk/Jmol/src/org/jmol/jvxl/readers/Parameters.java 2009-10-16 04:54:23 UTC (rev 11593) +++ trunk/Jmol/src/org/jmol/jvxl/readers/Parameters.java 2009-10-18 23:49:15 UTC (rev 11594) @@ -220,6 +220,7 @@ nContours = 0; contourIncrements = null; contoursDiscrete = null; + contourColixes = null; pocket = null; rangeDefined = false; resolution = Float.MAX_VALUE; @@ -716,6 +717,7 @@ int downsampleFactor; int maxSet; public float[] contoursDiscrete; + public short[] contourColixes; Point3f contourIncrements; void setMapRanges(SurfaceReader surfaceReader) { Modified: trunk/Jmol/src/org/jmol/jvxl/readers/SurfaceFileReader.java =================================================================== --- trunk/Jmol/src/org/jmol/jvxl/readers/SurfaceFileReader.java 2009-10-16 04:54:23 UTC (rev 11593) +++ trunk/Jmol/src/org/jmol/jvxl/readers/SurfaceFileReader.java 2009-10-18 23:49:15 UTC (rev 11594) @@ -140,6 +140,14 @@ return Parser.parseInt(s, next); } + float[] parseFloatArray() { + return Parser.parseFloatArray(line, next); + } + + String getNextQuotedString() { + return Parser.getNextQuotedString(line, next); + } + protected void skipTo(String info, String what) throws Exception { if (info != null) while ((line = br.readLine()).indexOf(info) < 0) { Modified: trunk/Jmol/src/org/jmol/jvxl/readers/SurfaceGenerator.java =================================================================== --- trunk/Jmol/src/org/jmol/jvxl/readers/SurfaceGenerator.java 2009-10-16 04:54:23 UTC (rev 11593) +++ trunk/Jmol/src/org/jmol/jvxl/readers/SurfaceGenerator.java 2009-10-18 23:49:15 UTC (rev 11594) @@ -577,7 +577,6 @@ params.isBicolorMap = true; surfaceReader.applyColorScale(); } - return true; } @@ -675,6 +674,11 @@ return true; } + if ("colorDiscrete" == propertyName) { + params.contourColixes = (short[])value; + return true; + } + if ("fullPlane" == propertyName) { params.contourFromZero = !((Boolean) value).booleanValue(); return true; @@ -985,7 +989,7 @@ public Object getProperty(String property, int index) { if (property == "jvxlFileData") - return JvxlReader.jvxlGetFile(meshDataServer, jvxlData, null, params.title, "", true, + return JvxlReader.jvxlGetFile(jvxlData, null, params.title, "", true, index, null, null); if (property == "jvxlFileInfo") return jvxlData.jvxlInfoLine; // for Jvxl.java Modified: trunk/Jmol/src/org/jmol/jvxl/readers/SurfaceReader.java =================================================================== --- trunk/Jmol/src/org/jmol/jvxl/readers/SurfaceReader.java 2009-10-16 04:54:23 UTC (rev 11593) +++ trunk/Jmol/src/org/jmol/jvxl/readers/SurfaceReader.java 2009-10-18 23:49:15 UTC (rev 11594) @@ -31,6 +31,7 @@ import javax.vecmath.Vector3f; import org.jmol.util.*; +import org.jmol.g3d.Graphics3D; import org.jmol.jvxl.data.*; import org.jmol.jvxl.api.MeshDataServer; import org.jmol.jvxl.api.VertexDataServer; @@ -345,6 +346,7 @@ jvxlData.jvxlSurfaceData = ""; jvxlData.jvxlEdgeData = ""; jvxlData.jvxlColorData = ""; + //TODO: more resets of jvxlData? edgeCount = 0; edgeFractionBase = JvxlReader.defaultEdgeFractionBase; edgeFractionRange = JvxlReader.defaultEdgeFractionRange; @@ -583,6 +585,7 @@ : meshData.vertexCount); jvxlData.minColorIndex = -1; jvxlData.maxColorIndex = 0; + jvxlData.contourValues = params.contoursDiscrete; jvxlData.isColorReversed = params.isColorReversed; if (params.isBicolorMap && !params.isContoured || params.colorBySign) { jvxlData.minColorIndex = ColorEncoder @@ -651,13 +654,13 @@ } } - if (params.nContours > 0) { + if (params.nContours > 0 && jvxlData.contourColixes == null) { int n = params.nContours; - int[] colors = jvxlData.contourColors = new int[n]; + short[] colors = jvxlData.contourColixes = new short[n]; float dv = (valueBlue - valueRed) / (n + 1); // n + 1 because we want n lines between n + 1 slices for (int i = 0; i < n; i++) - colors[i] = getArgbFromPalette(valueRed + (i + 1) * dv); + colors[i] = Graphics3D.getColix(getArgbFromPalette(valueRed + (i + 1) * dv)); } } Modified: trunk/Jmol/src/org/jmol/modelset/Atom.java =================================================================== --- trunk/Jmol/src/org/jmol/modelset/Atom.java 2009-10-16 04:54:23 UTC (rev 11593) +++ trunk/Jmol/src/org/jmol/modelset/Atom.java 2009-10-18 23:49:15 UTC (rev 11594) @@ -1067,7 +1067,7 @@ case Token.bondcount: return atom.getCovalentBondCount(); case Token.color: - return atom.group.chain.modelSet.viewer.getColixArgb(atom.getColix()); + return atom.group.chain.modelSet.viewer.getColorArgbOrGray(atom.getColix()); case Token.element: case Token.elemno: return atom.getElementNumber(); @@ -1287,7 +1287,7 @@ return atom; case Token.color: return Graphics3D.colorPointFromInt2( - atom.group.chain.modelSet.viewer.getColixArgb(atom.getColix()) + atom.group.chain.modelSet.viewer.getColorArgbOrGray(atom.getColix()) ); } return null; Modified: trunk/Jmol/src/org/jmol/modelset/Bond.java =================================================================== --- trunk/Jmol/src/org/jmol/modelset/Bond.java 2009-10-16 04:54:23 UTC (rev 11593) +++ trunk/Jmol/src/org/jmol/modelset/Bond.java 2009-10-18 23:49:15 UTC (rev 11594) @@ -203,18 +203,10 @@ return Graphics3D.getColixInherited(colix, atom1.colixAtom); } - int getArgb1() { - return atom1.group.chain.modelSet.viewer.getColixArgb(getColix1()); - } - short getColix2() { return Graphics3D.getColixInherited(colix, atom2.colixAtom); } - int getArgb2() { - return atom1.group.chain.modelSet.viewer.getColixArgb(getColix2()); - } - public Atom getOtherAtom(Atom thisAtom) { return (atom1 == thisAtom ? atom2 : atom2 == thisAtom ? atom1 : null); } Modified: trunk/Jmol/src/org/jmol/modelset/ModelCollection.java =================================================================== --- trunk/Jmol/src/org/jmol/modelset/ModelCollection.java 2009-10-16 04:54:23 UTC (rev 11593) +++ trunk/Jmol/src/org/jmol/modelset/ModelCollection.java 2009-10-18 23:49:15 UTC (rev 11594) @@ -2670,7 +2670,7 @@ info.put("clickabilityFlags", new Integer(atom.clickabilityFlags)); info.put("visibilityFlags", new Integer(atom.shapeVisibilityFlags)); info.put("spacefill", new Float(atom.getRadius())); - String strColor = viewer.getHexColorFromIndex(atom.colixAtom); + String strColor = Escape.escapeColor(viewer.getColorArgbOrGray(atom.colixAtom)); if (strColor != null) info.put("color", strColor); info.put("colix", new Integer(atom.colixAtom)); @@ -2732,7 +2732,7 @@ info.put("radius", new Float(bond.mad/2000.)); info.put("length_Ang",new Float(atom1.distance(atom2))); info.put("visible", Boolean.valueOf(bond.shapeVisibilityFlags != 0)); - String strColor = viewer.getHexColorFromIndex(bond.colix); + String strColor = Escape.escapeColor(viewer.getColorArgbOrGray(bond.colix)); if (strColor != null) info.put("color", strColor); info.put("colix", new Integer(bond.colix)); Modified: trunk/Jmol/src/org/jmol/modelset/ModelSet.java =================================================================== --- trunk/Jmol/src/org/jmol/modelset/ModelSet.java 2009-10-16 04:54:23 UTC (rev 11593) +++ trunk/Jmol/src/org/jmol/modelset/ModelSet.java 2009-10-18 23:49:15 UTC (rev 11594) @@ -475,11 +475,8 @@ if (shape != null) { String shapeType = JmolConstants.shapeClassBases[i]; Vector shapeDetail = shape.getShapeDetail(); - if (shapeDetail != null) { - Hashtable shapeinfo = new Hashtable(); - shapeinfo.put("obj", shapeDetail); - info.put(shapeType, shapeinfo); - } + if (shapeDetail != null) + info.put(shapeType, shapeDetail); } } if (commands.length() > 0) Modified: trunk/Jmol/src/org/jmol/script/ScriptEvaluator.java =================================================================== --- trunk/Jmol/src/org/jmol/script/ScriptEvaluator.java 2009-10-16 04:54:23 UTC (rev 11593) +++ trunk/Jmol/src/org/jmol/script/ScriptEvaluator.java 2009-10-18 23:49:15 UTC (rev 11594) @@ -1342,7 +1342,7 @@ } break; case Token.color: - Graphics3D.colorPointFromInt(viewer.getColixArgb(bond.getColix()), + Graphics3D.colorPointFromInt(viewer.getColorArgbOrGray(bond.getColix()), ptT); switch (minmaxtype) { case Token.all: @@ -1464,7 +1464,7 @@ return; case Token.color: if (tokenValue.tok == Token.point3f) - iValue = colorPtToInt((Point3f) tokenValue.value); + iValue = Graphics3D.colorPtToInt((Point3f) tokenValue.value); else if (tokenValue.tok == Token.list) { list = (String[]) tokenValue.value; if ((nValues = list.length) == 0) @@ -1473,7 +1473,7 @@ for (int i = nValues; --i >= 0;) { Object pt = Escape.unescapePoint(list[i]); if (pt instanceof Point3f) - values[i] = colorPtToInt((Point3f) pt); + values[i] = Graphics3D.colorPtToInt((Point3f) pt); else values[i] = Graphics3D.getArgbFromString(list[i]); if (values[i] == 0 @@ -3086,7 +3086,7 @@ float comparisonFloat = Float.NaN; if (val instanceof Point3f) { if (tokWhat == Token.color) { - comparisonValue = colorPtToInt((Point3f) val); + comparisonValue = Graphics3D.colorPtToInt((Point3f) val); tokValue = Token.integer; isIntProperty = true; } @@ -3098,7 +3098,7 @@ if (((String)val).startsWith("{")) { val = Escape.unescapePoint((String) val); if (val instanceof Point3f) - comparisonValue = colorPtToInt((Point3f) val); + comparisonValue = Graphics3D.colorPtToInt((Point3f) val); else comparisonValue = 0; } else { @@ -4004,14 +4004,9 @@ } if (pt == null) error(ERROR_colorExpected); - return colorPtToInt(pt); + return Graphics3D.colorPtToInt(pt); } - static int colorPtToInt(Point3f pt) { - return 0xFF000000 | (((int) pt.x) & 0xFF) << 16 - | (((int) pt.y) & 0xFF) << 8 | (((int) pt.z) & 0xFF); - } - private int getColorTriad(int i) throws ScriptException { int[] colors = new int[3]; int n = 0; @@ -4043,7 +4038,7 @@ continue; case Token.rightsquare: if (n == 3) - return colorPtToInt(new Point3f(colors[0], colors[1], colors[2])); + return Graphics3D.colorPtToInt(new Point3f(colors[0], colors[1], colors[2])); default: error(ERROR_badRGBColor); } @@ -4062,7 +4057,7 @@ if (getToken(++i).tok != Token.rightsquare) error(ERROR_badRGBColor); if (pt != null) - return colorPtToInt(pt); + return Graphics3D.colorPtToInt(pt); if ((n = Graphics3D.getArgbFromString("[" + hex + "]")) == 0) error(ERROR_badRGBColor); return n; @@ -6872,7 +6867,7 @@ case JmolConstants.JMOL_DATA_QUATERNION: viewer.setFrameTitle(modelCount - 1, type + " for model " + viewer.getModelNumberDotted(modelIndex)); - String color = (Escape.escapeColor(viewer.getColixArgb(viewer.getColixBackgroundContrast()))); + String color = (Escape.escapeColor(viewer.getColixBackgroundContrast())); script = "frame 0.0; frame last; reset;" + "select visible; wireframe 0; " + "isosurface quatSphere" + modelCount @@ -12319,14 +12314,9 @@ if (getToken(i + 1).tok == Token.string) { colorScheme = parameterAsString(++i); if (colorScheme.indexOf(" ") > 0) { - String[] colors = Parser.getTokens(colorScheme); - discreteColixes = new short[colors.length]; - for (int j = 0; j < colors.length; j++) { - discreteColixes[j] = Graphics3D.getColix(Graphics3D - .getArgbFromString(colors[j])); - if (discreteColixes[j] == 0) - error(ERROR_badRGBColor); - } + discreteColixes = Parser.getColixArray(colorScheme); + if (discreteColixes == null) + error(ERROR_badRGBColor); } } if ((theTok = tokAt(i + 1)) == Token.translucent @@ -12573,11 +12563,11 @@ colorScheme = parameterAsString(++i); break; } - if (str.equalsIgnoreCase("CONTOUR")) { + if (str.equalsIgnoreCase("CONTOUR") || str.equalsIgnoreCase("CONTOURS")) { propertyName = "contour"; str = optParameterAsString(i + 1); if (str.equalsIgnoreCase("DISCRETE")) { - propertyValue = floatParameterSet(i + 2, 2, Integer.MAX_VALUE); + propertyValue = floatParameterSet(i + 2, 1, Integer.MAX_VALUE); i = iToken; } else if (str.equalsIgnoreCase("INCREMENT")) { Point3f pt = getPoint3f(i + 2, false); @@ -13002,16 +12992,16 @@ s += "\ncolor range " + dataRange[2] + " " + dataRange[3] + "; mapped data range " + dataRange[0] + " to " + dataRange[1]; if (doCalcArea) - s += "\nisosurfaceArea = " + Escape.escapeDoubleArray(area); + s += "\nisosurfaceArea = " + Escape.escapeArray(area); if (doCalcVolume) - s += "\nisosurfaceVolume = " + Escape.escapeDoubleArray(volume); + s += "\nisosurfaceVolume = " + Escape.escapeArray(volume); showString(s); } } else if (doCalcArea || doCalcVolume) { if (doCalcArea) - showString("isosurfaceArea = " + Escape.escapeDoubleArray(area)); + showString("isosurfaceArea = " + Escape.escapeArray(area)); if (doCalcVolume) - showString("isosurfaceVolume = " + Escape.escapeDoubleArray(volume)); + showString("isosurfaceVolume = " + Escape.escapeArray(volume)); } if (translucency != null) setShapeProperty(iShape, "translucency", translucency); Modified: trunk/Jmol/src/org/jmol/script/ScriptMathProcessor.java =================================================================== --- trunk/Jmol/src/org/jmol/script/ScriptMathProcessor.java 2009-10-16 04:54:23 UTC (rev 11593) +++ trunk/Jmol/src/org/jmol/script/ScriptMathProcessor.java 2009-10-18 23:49:15 UTC (rev 11594) @@ -1892,8 +1892,7 @@ return addX(viewer.getColorPointForPropertyValue(ScriptVariable .fValue(x2))); case Token.point3f: - return addX(Escape.escapeColor(ScriptEvaluator - .colorPtToInt((Point3f) x2.value))); + return addX(Escape.escapeColor(Graphics3D.colorPtToInt((Point3f) x2.value))); default: // handle bitset later } Modified: trunk/Jmol/src/org/jmol/shape/LabelsRenderer.java =================================================================== --- trunk/Jmol/src/org/jmol/shape/LabelsRenderer.java 2009-10-16 04:54:23 UTC (rev 11593) +++ trunk/Jmol/src/org/jmol/shape/LabelsRenderer.java 2009-10-18 23:49:15 UTC (rev 11594) @@ -75,7 +75,7 @@ colix = Graphics3D.getColixTranslucent(colix, false, 0); short bgcolix = (bgcolixes == null || i >= bgcolixes.length) ? 0 : bgcolixes[i]; - if (bgcolix == 0 && g3d.getColixArgb(colix) == backgroundColor) + if (bgcolix == 0 && g3d.getColorArgbOrGray(colix) == backgroundColor) colix = backgroundColixContrast; if (!g3d.setColix(colix)) continue; Modified: trunk/Jmol/src/org/jmol/shape/Shape.java =================================================================== --- trunk/Jmol/src/org/jmol/shape/Shape.java 2009-10-16 04:54:23 UTC (rev 11593) +++ trunk/Jmol/src/org/jmol/shape/Shape.java 2009-10-18 23:49:15 UTC (rev 11594) @@ -264,7 +264,7 @@ return "color " + type + " " + encodeTransColor(pid, colix, translucentAllowed); } - private String encodeTransColor(byte pid, short colix, + private static String encodeTransColor(byte pid, short colix, boolean translucentAllowed) { if (pid == JmolConstants.PALETTE_UNKNOWN && colix == Graphics3D.INHERIT_ALL) return ""; @@ -282,10 +282,10 @@ ? JmolConstants.getPaletteName(pid) : encodeColor(colix)); } - String encodeColor(short colix) { + static String encodeColor(short colix) { // used also by labels for background state (no translucent issues there?) return (Graphics3D.isColixColorInherited(colix) ? "none" : Escape - .escapeColor(g3d.getColixArgb(colix))); + .escapeColor(colix)); } private static String getTranslucentLabel(short colix) { Modified: trunk/Jmol/src/org/jmol/shape/Text.java =================================================================== --- trunk/Jmol/src/org/jmol/shape/Text.java 2009-10-16 04:54:23 UTC (rev 11593) +++ trunk/Jmol/src/org/jmol/shape/Text.java 2009-10-18 23:49:15 UTC (rev 11594) @@ -457,13 +457,13 @@ s.append("; color echo"); if (Graphics3D.isColixTranslucent(colix)) s.append(" translucent " + Graphics3D.getColixTranslucencyLevel(colix)); - s.append(" [x").append(g3d.getHexColorFromIndex(colix)).append("]"); + s.append(" ").append(Escape.escapeColor(colix)); if (bgcolix != 0) { s.append("; color echo background"); if (Graphics3D.isColixTranslucent(bgcolix)) s.append(" translucent " + Graphics3D.getColixTranslucencyLevel(bgcolix)); - s.append(" [x").append(g3d.getHexColorFromIndex(bgcolix)).append("]"); + s.append(" ").append(Escape.escapeColor(bgcolix)); } s.append(";\n"); return s.toString(); Modified: trunk/Jmol/src/org/jmol/shapesurface/Isosurface.java =================================================================== --- trunk/Jmol/src/org/jmol/shapesurface/Isosurface.java 2009-10-16 04:54:23 UTC (rev 11593) +++ trunk/Jmol/src/org/jmol/shapesurface/Isosurface.java 2009-10-18 23:49:15 UTC (rev 11594) @@ -182,13 +182,6 @@ ////isosurface-only (no calculation required; no calculation parameters to set) - if ("colorDiscrete" == propertyName) { - if (thisMesh == null) - return; - thisMesh.setDiscreteColixes(sg.getParams().contoursDiscrete, (short[])value); - return; - } - if ("navigate" == propertyName) { navigate(((Integer)value).intValue()); return; @@ -333,7 +326,7 @@ } if ("finalize" == propertyName) { - thisMesh.setDiscreteColixes(sg.getParams().contoursDiscrete, null); + thisMesh.setDiscreteColixes(sg.getParams().contoursDiscrete, sg.getParams().contourColixes); setScriptInfo(); setJvxlInfo(); clearSg(); @@ -457,14 +450,14 @@ meshData = new MeshData(); fillMeshData(meshData, MeshData.MODE_GET_VERTICES); } - return JvxlReader.jvxlGetFile(this, jvxlData, meshData, title, "", true, index, thisMesh + return JvxlReader.jvxlGetFile(jvxlData, meshData, title, "", true, index, thisMesh .getState(myType), (thisMesh.scriptCommand == null ? "" : thisMesh.scriptCommand)); } if (property == "jvxlFileHeader") - return JvxlReader.jvxlGetFile(this, jvxlData, null, title, "HEADERONLY", true, index, thisMesh + return JvxlReader.jvxlGetFile(jvxlData, null, title, "HEADERONLY", true, index, thisMesh .getState(myType), (thisMesh.scriptCommand == null ? "" : thisMesh.scriptCommand)); if (property == "jvxlSurfaceData") // MO only - return JvxlReader.jvxlGetFile(this, jvxlData, null, title, "orbital #" + index, false, 1, thisMesh + return JvxlReader.jvxlGetFile(jvxlData, null, title, "orbital #" + index, false, 1, thisMesh .getState(myType), (thisMesh.scriptCommand == null ? "" : thisMesh.scriptCommand)); if (property == "jvxlFileInfo") return jvxlData.jvxlInfoLine; @@ -895,8 +888,7 @@ info.put("modelIndex", new Integer(mesh.modelIndex)); if (mesh.title != null) info.put("title", mesh.title); - if (mesh.contourValues != null || mesh.jvxlData.vContours != null - || mesh.jvxlData.contourColors != null) + if (mesh.jvxlData.contourValues != null || mesh.jvxlData.contourValuesUsed != null) info.put("contours", mesh.getContourList(viewer)); V.addElement(info); } @@ -923,8 +915,8 @@ if (contours != null) { for (int i = contours.length; --i >= 0; ) { float value = ((Float)contours[i].get(IsosurfaceMesh.CONTOUR_VALUE)).floatValue(); - int[] color = ((int[])contours[i].get(IsosurfaceMesh.CONTOUR_COLOR)); - color[0] = viewer.getColixArgb(viewer.getColixForPropertyValue(value)); + short[] colix = ((short[])contours[i].get(IsosurfaceMesh.CONTOUR_COLIX)); + colix[0] = viewer.getColixForPropertyValue(value); } } float[] range = viewer.getCurrentColorRange(); @@ -1127,8 +1119,7 @@ //System.out.println(ptRet); } - private String findValue(int x, int y, boolean isPicking, - BitSet bsVisible) { + private String findValue(int x, int y, boolean isPicking, BitSet bsVisible) { int dmin2 = MAX_OBJECT_CLICK_DISTANCE_SQUARED; if (g3d.isAntialiased()) { x <<= 1; @@ -1142,24 +1133,27 @@ && !bsVisible.get(m.modelIndex)) continue; Vector[] vs = m.jvxlData.vContours; - if (vs != null) { - for (int j = 0; j < vs.length; j++) { - Vector vc = vs[j]; - int n = vc.size() - 1; - for (int k = IsosurfaceMesh.CONTOUR_POINTS; k < n; k++) { - Point3f v = (Point3f) vc.get(k); - int d2 = coordinateInRange(x, y, v, dmin2, ptXY); - if (d2 >= 0) { - dmin2 = d2; - pickedContour = vc; + if (!viewer.getTestFlag3() && vs != null) { + int thisk = 0; + for (int j = 0; j < vs.length; j++) { + Vector vc = vs[j]; + int n = vc.size() - 1; + for (int k = IsosurfaceMesh.CONTOUR_POINTS; k < n; k++) { + Point3f v = (Point3f) vc.get(k); + int d2 = coordinateInRange(x, y, v, dmin2, ptXY); + if (d2 >= 0) { + dmin2 = d2; + pickedContour = vc; + thisk = k; + } } } - } - if (pickedContour != null) - return pickedContour.get(IsosurfaceMesh.CONTOUR_VALUE).toString(); + if (pickedContour != null) + return pickedContour.get(IsosurfaceMesh.CONTOUR_VALUE).toString() + + " " + i + ":" + thisk; } else if (m.jvxlData.jvxlPlane != null && m.vertexValues != null) { int pickedVertex = -1; - for (int k = m.vertexCount; --k >= m.firstRealVertex; ) { + for (int k = m.vertexCount; --k >= m.firstRealVertex;) { Point3f v = m.vertices[k]; int d2 = coordinateInRange(x, y, v, dmin2, ptXY); if (d2 >= 0) { @@ -1174,8 +1168,4 @@ return null; } - public int getColixArgb(short colix) { - return viewer.getColixArgb(colix); - } - } Modified: trunk/Jmol/src/org/jmol/shapesurface/IsosurfaceMesh.java =================================================================== --- trunk/Jmol/src/org/jmol/shapesurface/IsosurfaceMesh.java 2009-10-16 04:54:23 UTC (rev 11593) +++ trunk/Jmol/src/org/jmol/shapesurface/IsosurfaceMesh.java 2009-10-18 23:49:15 UTC (rev 11594) @@ -76,8 +76,9 @@ isColorSolid = true; vertexColixes = null; vertexValues = null; - contourValues = null; - contourColixes = null; + jvxlData.contourValues = null; + jvxlData.contourValuesUsed = null; + jvxlData.contourColixes = null; assocGridPointMap = null; assocGridPointNormals = null; vertexSets = null; @@ -301,7 +302,7 @@ public static final int CONTOUR_NPOLYGONS = 0; public static final int CONTOUR_BITSET = 1; public static final int CONTOUR_VALUE = 2; - public static final int CONTOUR_COLOR = 3; + public static final int CONTOUR_COLIX = 3; public static final int CONTOUR_FDATA = 4; public static final int CONTOUR_POINTS = 5; @@ -328,7 +329,8 @@ int n = jvxlData.nContours; if (n == 0 || polygonIndexes == null) return null; - if ((havePlanarContours = (jvxlData.jvxlPlane != null)) == true) + havePlanarContours = (jvxlData.jvxlPlane != null); + if (havePlanarContours) return null; // not necessary; if (n < 0) n = -1 - n; @@ -346,32 +348,44 @@ vContours = new Vector[n]; for (int i = 0; i < n; i++) vContours[i] = new Vector(); - float dv = (jvxlData.valueMappedToBlue - jvxlData.valueMappedToRed) - / (n + 1); - // n + 1 because we want n lines between n + 1 slices + if (jvxlData.contourValuesUsed == null) { + float dv = (jvxlData.valueMappedToBlue - jvxlData.valueMappedToRed) + / (n + 1); + // n + 1 because we want n lines between n + 1 slices + for (int i = 0; i < n; i++) { + float value = jvxlData.valueMappedToRed + (i + 1) * dv; + get3dContour(vContours[i], value, jvxlData.contourColixes[i]); + } + Logger.info(n + " contour lines; separation = " + dv); + } else { + for (int i = 0; i < n; i++) { + float value = jvxlData.contourValuesUsed[i]; + get3dContour(vContours[i], value, jvxlData.contourColixes[i]); + } + } + jvxlData.contourColixes = new short[n]; + jvxlData.contourValues = new float[n]; for (int i = 0; i < n; i++) { - float value = jvxlData.valueMappedToRed + (i + 1) * dv; - //if (i == 5) - get3dContour(vContours[i], value, jvxlData.contourColors[i]); + jvxlData.contourValues[i] = ((Float) vContours[i].get(2)).floatValue(); + jvxlData.contourColixes[i] = ((short[]) vContours[i].get(3))[0]; } - Logger.info(n + " contour lines; separation = " + dv); return jvxlData.vContours = vContours; } public static void setContourVector(Vector v, int nPolygons, - BitSet bsContour, float value, int color, + BitSet bsContour, float value, short colix, StringBuffer fData) { v.add(new Integer(nPolygons)); v.add(bsContour); v.add(new Float(value)); - v.add(new int[] { color }); + v.add(new short[] { colix }); v.add(fData); } - private void get3dContour(Vector v, float value, int color) { + private void get3dContour(Vector v, float value, short colix) { BitSet bsContour = new BitSet(polygonCount); StringBuffer fData = new StringBuffer(); - setContourVector(v, polygonCount, bsContour, value, color, fData); + setContourVector(v, polygonCount, bsContour, value, colix, fData); for (int i = 0; i < polygonCount; i++) { if (!setABC(i)) continue; @@ -428,17 +442,19 @@ float[] contourValues; short[] contourColixes; public void setDiscreteColixes(float[] values, short[] colixes) { - this.contourValues = values; - if (colixes == null && this.contourColixes != null) + if (values != null) + jvxlData.contourValues = values; + if (colixes == null && jvxlData.contourColixes != null) return; - this.contourColixes = colixes; + jvxlData.contourColixes = colixes; if (vertices == null || vertexValues == null || values == null) return; int n = values.length; + float vMax = values[n - 1]; isColorSolid = true; colorCommand = null; - boolean haveColixes = (colixes == null && colixes.length > 0); - short defaultColix = (haveColixes ? colixes[0] : 0); + boolean haveColixes = (colixes != null && colixes.length > 0); + short defaultColix = 0; polygonColixes = new short[polygonCount]; for (int i = 0; i < polygonCount; i++) { int[] pi = polygonIndexes[i]; @@ -449,12 +465,12 @@ } v /= 3; for (int j = n; --j >= 0;) { - if (v > values[j]) { - polygonColixes[i] = (haveColixes ? 0 : colixes[j % colixes.length]); + if (v > values[j] && v < vMax) { + polygonColixes[i] = (haveColixes ? colixes[j % colixes.length] : 0); break; } } - } + } } /** @@ -465,33 +481,15 @@ */ Hashtable getContourList(Viewer viewer) { Hashtable ht = new Hashtable(); - if (contourValues != null) - ht.put("values", contourValues); + ht.put("values", (jvxlData.contourValuesUsed == null ? jvxlData.contourValues : jvxlData.contourValuesUsed)); Vector colors = new Vector(); - if (contourColixes != null) { - // user-specified - for (int i = 0;i < contourValues.length - 1; i++) - colors.add(Graphics3D.colorPointFromInt2(viewer - .getColixArgb(contourColixes[i % contourColixes.length]))); - ht.put("colors", colors); - } else if (jvxlData.contourColors != null) { + if (jvxlData.contourColixes != null) { // set in SurfaceReader.colorData() - for (int i = 0; i < jvxlData.contourColors.length; i++) { - colors.add(Graphics3D.colorPointFromInt2(jvxlData.contourColors[i])); + for (int i = 0; i < jvxlData.contourColixes.length; i++) { + colors.add(Graphics3D.colorPointFromInt2(Graphics3D.getArgb(jvxlData.contourColixes[i]))); } ht.put("colors", colors); } - if (jvxlData.vContours != null) { - // 3D contour values and colors - float[] f = new float[jvxlData.vContours.length]; - for (int i = 0; i < jvxlData.vContours.length; i++) { - f[i] = ((Float) jvxlData.vContours[i].get(2)).floatValue(); - } - ht.put("values", f); - } else if (jvxlData.contourValuesUsed != null) { - // determined by Jmol - ht.put("values", jvxlData.contourValuesUsed); - } return ht; } Modified: trunk/Jmol/src/org/jmol/shapesurface/IsosurfaceRenderer.java =================================================================== --- trunk/Jmol/src/org/jmol/shapesurface/IsosurfaceRenderer.java 2009-10-16 04:54:23 UTC (rev 11593) +++ trunk/Jmol/src/org/jmol/shapesurface/IsosurfaceRenderer.java 2009-10-18 23:49:15 UTC (rev 11594) @@ -118,14 +118,14 @@ private void renderContourLines() { Vector[] vContours = imesh.getContours(); - if (vContours == null) + if (viewer.getTestFlag3() || vContours == null) return; for (int i = vContours.length; --i >= 0;) { Vector v = vContours[i]; if (v.size() < IsosurfaceMesh.CONTOUR_POINTS) continue; - if (!g3d.setColix(mesh.fillTriangles ? Graphics3D.BLACK : Graphics3D - .getColix(((int[]) v.get(IsosurfaceMesh.CONTOUR_COLOR))[0]))) + if (!g3d.setColix(mesh.fillTriangles ? Graphics3D.BLACK + : ((short[]) v.get(IsosurfaceMesh.CONTOUR_COLIX))[0])) return; int n = v.size() - 1; for (int j = IsosurfaceMesh.CONTOUR_POINTS; j < n; j++) { @@ -198,7 +198,7 @@ colix = Graphics3D.BLACK; } boolean colorArrayed = (colorSolid && imesh.polygonColixes != null); - + short[] contourColixes = imesh.jvxlData.contourColixes; // two-sided means like a plane, with no front/back distinction for (int i = imesh.polygonCount; --i >= 0;) { int[] vertexIndexes = polygonIndexes[i]; @@ -260,7 +260,8 @@ if (vertexColixes == null) { g3d.drawTriangle(screens[iA], screens[iB], screens[iC], check); } else if (colorArrayed) { - g3d.setColix(imesh.contourColixes[vertexIndexes[4] % imesh.contourColixes.length]); + g3d.setColix(mesh.fillTriangles ? Graphics3D.BLACK + : contourColixes[vertexIndexes[4] % contourColixes.length]); g3d.drawTriangle(screens[iA], screens[iB], screens[iC], check); } else { g3d.drawTriangle(screens[iA], colixA, screens[iB], colixB, Modified: trunk/Jmol/src/org/jmol/util/Escape.java =================================================================== --- trunk/Jmol/src/org/jmol/util/Escape.java 2009-10-16 04:54:23 UTC (rev 11593) +++ trunk/Jmol/src/org/jmol/util/Escape.java 2009-10-18 23:49:15 UTC (rev 11594) @@ -53,6 +53,10 @@ return x.toString(); } + public static String escapeColor(short colix) { + return escapeColor(Graphics3D.getArgb(colix)); + } + public static String escapeColor(int argb) { return "[x" + Graphics3D.getHexColorFromRGB(argb) + "]"; } @@ -175,22 +179,32 @@ return s.toString(); } - public static String escapeDoubleArray(Object x) { + public static String escapeArray(Object x) { // from isosurface area or volume calc if (x == null) return escape(""); if (x instanceof Float) return "" + x; StringBuffer s = new StringBuffer(); - double[] list = (double[]) x; s.append("["); - for (int i = 0; i < list.length; i++) { - if (i > 0) - s.append(", "); - s.append(list[i]); + if (x instanceof double[]) { + double[] dlist = (double[]) x; + for (int i = 0; i < dlist.length; i++) { + if (i > 0) + s.append(", "); + s.append(dlist[i]); + } + } else if (x instanceof float[]) { + float[] flist = (float[]) x; + for (int i = 0; i < flist.length; i++) { + if (i > 0) + s.append(", "); + s.append(flist[i]); + } } s.append("]"); return s.toString(); + } private static String escapeNice(String s) { @@ -306,6 +320,15 @@ return Graphics3D.getArgbFromString(strColor); } + public static String escapeColors(short[] colixes) { + StringBuffer s = new StringBuffer(); + for (int i = 0; i < colixes.length; i++) + s.append(i == 0 ? '"' : ' ') + .append(escapeColor(colixes[i])); + s.append('"'); + return s.toString(); + } + public static String escape(BitSet bs, boolean isAtoms) { char chOpen = (isAtoms ? '(' : '['); char chClose = (isAtoms ? ')' : ']'); Modified: trunk/Jmol/src/org/jmol/util/Parser.java =================================================================== --- trunk/Jmol/src/org/jmol/util/Parser.java 2009-10-16 04:54:23 UTC (rev 11593) +++ trunk/Jmol/src/org/jmol/util/Parser.java 2009-10-18 23:49:15 UTC (rev 11594) @@ -27,6 +27,8 @@ import java.util.BitSet; +import org.jmol.g3d.Graphics3D; + public class Parser { /// general static string-parsing class /// @@ -48,18 +50,45 @@ parseFloatArray(getTokens(str), bs, data); } - public static void parseFloatArray(String[] tokens, BitSet bs, float[] data) { + /** + * @param str + * @param next + * @return array of float values + * + */ + public static float[] parseFloatArray(String str, int[] next) { + int pt = str.indexOf("[", next[0]); + if (pt >= 0) + str = str.substring(pt + 1); + next[0] = pt + 1; + pt = str.indexOf("]"); + if (pt < 0) + pt = str.length(); + else + str = str.substring(0, pt); + next[0] += pt + 1; + String[] to... [truncated message content] |
From: <ha...@us...> - 2010-04-07 13:04:51
|
Revision: 12779 http://jmol.svn.sourceforge.net/jmol/?rev=12779&view=rev Author: hansonr Date: 2010-04-07 13:04:44 +0000 (Wed, 07 Apr 2010) Log Message: ----------- version=12.0.RC4_dev # code: hermite renderer did not need global integer -- causing exception when rendering threads clash # bug fix: write PNG does not properly indicate that it is going to the clipboard Modified Paths: -------------- trunk/Jmol/src/org/jmol/export/image/ImageCreator.java trunk/Jmol/src/org/jmol/g3d/Hermite3D.java trunk/Jmol/src/org/jmol/script/ScriptEvaluator.java trunk/Jmol/src/org/jmol/viewer/Jmol.properties Modified: trunk/Jmol/src/org/jmol/export/image/ImageCreator.java =================================================================== --- trunk/Jmol/src/org/jmol/export/image/ImageCreator.java 2010-04-06 22:02:08 UTC (rev 12778) +++ trunk/Jmol/src/org/jmol/export/image/ImageCreator.java 2010-04-07 13:04:44 UTC (rev 12779) @@ -65,10 +65,10 @@ if (text == null) { Image image = viewer.getScreenImage(); ImageSelection.setClipboard(image); - msg = "OK " + (image.getWidth(null) * image.getHeight(null)); + msg = "OK image to clipboard: " + (image.getWidth(null) * image.getHeight(null)); } else { ImageSelection.setClipboard(text); - msg = "OK " + text.length(); + msg = "OK text to clipboard: " + text.length(); } } catch (Error er) { msg = viewer.getErrorMessage(); Modified: trunk/Jmol/src/org/jmol/g3d/Hermite3D.java =================================================================== --- trunk/Jmol/src/org/jmol/g3d/Hermite3D.java 2010-04-06 22:02:08 UTC (rev 12778) +++ trunk/Jmol/src/org/jmol/g3d/Hermite3D.java 2010-04-07 13:04:44 UTC (rev 12779) @@ -68,7 +68,6 @@ private final float[] sLeft = new float[16]; private final float[] sRight = new float[16]; - int sp; private final Point3f[] pTopLeft = new Point3f[16]; private final Point3f[] pTopRight = new Point3f[16]; @@ -105,7 +104,7 @@ pLeft[0].set(p1); sRight[0] = 1; pRight[0].set(p2); - sp = 0; + int sp = 0; int n=0; int dDiameterFirstHalf = 0; int dDiameterSecondHalf = 0; @@ -209,7 +208,7 @@ sLeft[0] = 0; sRight[0] = 1; needToFill[0] = true; - sp = 0; + int sp = 0; boolean closeEnd = false; do { Point3f a = pTopLeft[sp]; @@ -337,7 +336,7 @@ pLeft[0].set(p1); sRight[0] = 1; pRight[0].set(p2); - sp = 0; + int sp = 0; for (int strands = 2; strands > 0; strands--) { if (strands == 1) { Modified: trunk/Jmol/src/org/jmol/script/ScriptEvaluator.java =================================================================== --- trunk/Jmol/src/org/jmol/script/ScriptEvaluator.java 2010-04-06 22:02:08 UTC (rev 12778) +++ trunk/Jmol/src/org/jmol/script/ScriptEvaluator.java 2010-04-07 13:04:44 UTC (rev 12779) @@ -11735,7 +11735,7 @@ } switch (tokAt(pt, args)) { case Token.nada: - isShow = true; + case Token.clipboard: break; case Token.identifier: case Token.string: @@ -11756,8 +11756,6 @@ if (fileName.equalsIgnoreCase("clipboard")) fileName = null; break; - case Token.clipboard: - break; default: error(ERROR_invalidArgument); } @@ -11797,9 +11795,11 @@ type = "XYZ"; } boolean isImage = Parser.isOneOf(type, "GIF;JPEG64;JPEG;JPG64;JPG;PPM;PNG"); - if (isImage && (isApplet && !viewer.isSignedApplet() || isShow)) + if (isImage && fileName == null) + type = "[image to clipboard]"; + else if (isImage && (isApplet && !viewer.isSignedApplet() || isShow)) type = "JPG64"; - if (!isImage + else if (!isImage && !isExport && !Parser .isOneOf( @@ -11940,20 +11940,21 @@ // load error here scriptStatusOrBuffer((String) bytes); return ""; + } else { + if (bytes == null && (!isImage || fileName != null)) + bytes = data; + if (doDefer) + msg = viewer.streamFileData(fileName, type, type2); + else + msg = viewer.createImage(fileName, type, bytes, quality, width, height, + bsFrames, fullPath); + if (msg != null) { + if (!msg.startsWith("OK")) + evalError(msg, null); + scriptStatusOrBuffer(msg + + (isImage ? "; width=" + width + "; height=" + height : "")); + } } - if (bytes == null && (!isImage || fileName != null)) - bytes = data; - if (doDefer) - msg = viewer.streamFileData(fileName, type, type2); - else - msg = viewer.createImage(fileName, type, bytes, quality, width, height, - bsFrames, fullPath); - if (msg != null) { - if (!msg.startsWith("OK")) - evalError(msg, null); - scriptStatusOrBuffer(msg - + (isImage ? "; width=" + width + "; height=" + height : "")); - } return ""; } Modified: trunk/Jmol/src/org/jmol/viewer/Jmol.properties =================================================================== --- trunk/Jmol/src/org/jmol/viewer/Jmol.properties 2010-04-06 22:02:08 UTC (rev 12778) +++ trunk/Jmol/src/org/jmol/viewer/Jmol.properties 2010-04-07 13:04:44 UTC (rev 12779) @@ -3,6 +3,8 @@ version=12.0.RC4_dev +# code: hermite renderer did not need global integer -- causing exception when rendering threads clash +# bug fix: write PNG does not properly indicate that it is going to the clipboard # code: better handling of VAR local variables # new feature: VAR variables are now local to FOR and WHILE loops, as in Java # new feature: { } will group contexts for VAR variables: This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ha...@us...> - 2011-02-19 19:44:23
|
Revision: 15205 http://jmol.svn.sourceforge.net/jmol/?rev=15205&view=rev Author: hansonr Date: 2011-02-19 19:44:17 +0000 (Sat, 19 Feb 2011) Log Message: ----------- Spartan, trajectories Modified Paths: -------------- trunk/Jmol/src/org/jmol/adapter/readers/quantum/SpartanArchive.java trunk/Jmol/src/org/jmol/adapter/readers/quantum/SpartanSmolReader.java trunk/Jmol/src/org/jmol/modelset/ModelLoader.java Modified: trunk/Jmol/src/org/jmol/adapter/readers/quantum/SpartanArchive.java =================================================================== --- trunk/Jmol/src/org/jmol/adapter/readers/quantum/SpartanArchive.java 2011-02-19 19:12:01 UTC (rev 15204) +++ trunk/Jmol/src/org/jmol/adapter/readers/quantum/SpartanArchive.java 2011-02-19 19:44:17 UTC (rev 15205) @@ -57,7 +57,7 @@ initialize(r, ""); } - SpartanArchive(BasisFunctionReader r, String endCheck) { + SpartanArchive(BasisFunctionReader r, String bondData, String endCheck) { initialize(r, bondData); this.endCheck = endCheck; } Modified: trunk/Jmol/src/org/jmol/adapter/readers/quantum/SpartanSmolReader.java =================================================================== --- trunk/Jmol/src/org/jmol/adapter/readers/quantum/SpartanSmolReader.java 2011-02-19 19:12:01 UTC (rev 15204) +++ trunk/Jmol/src/org/jmol/adapter/readers/quantum/SpartanSmolReader.java 2011-02-19 19:44:17 UTC (rev 15205) @@ -195,7 +195,7 @@ } private void readArchive() throws Exception { - spartanArchive = new SpartanArchive(this, endCheck); + spartanArchive = new SpartanArchive(this, bondData, endCheck); if (readArchiveHeader()) { modelAtomCount = spartanArchive.readArchive(line, false, atomCount, false); if (atomCount == 0 || !isTrajectory) Modified: trunk/Jmol/src/org/jmol/modelset/ModelLoader.java =================================================================== --- trunk/Jmol/src/org/jmol/modelset/ModelLoader.java 2011-02-19 19:12:01 UTC (rev 15204) +++ trunk/Jmol/src/org/jmol/modelset/ModelLoader.java 2011-02-19 19:44:17 UTC (rev 15205) @@ -147,6 +147,8 @@ fileHeader = (String) getModelSetAuxiliaryInfo("fileHeader"); trajectorySteps = (List<Point3f[]>) getModelSetAuxiliaryInfo("trajectorySteps"); isTrajectory = (trajectorySteps != null); + if (isTrajectory) + info.remove("trajectorySteps"); noAutoBond = getModelSetAuxiliaryInfoBoolean("noAutoBond"); is2D = getModelSetAuxiliaryInfoBoolean("is2D"); doMinimize = is2D && getModelSetAuxiliaryInfoBoolean("doMinimize"); @@ -465,7 +467,9 @@ } if (isTrajectory) { // fill in the rest of the data - Logger.info((modelCount - ipt + 1) + " trajectory steps read"); + int n = (modelCount - ipt + 1); + Logger.info(n + " trajectory steps read"); + setModelAuxiliaryInfo(baseModelCount, "trajectoryStepCount", Integer.valueOf(n)); for (int ia = adapterModelCount, i = ipt; i < modelCount; i++) { models[i] = models[baseModelCount]; modelNumbers[i] = adapter.getAtomSetNumber(atomSetCollection, ia++); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ha...@us...> - 2011-06-18 20:26:01
|
Revision: 15618 http://jmol.svn.sourceforge.net/jmol/?rev=15618&view=rev Author: hansonr Date: 2011-06-18 20:25:53 +0000 (Sat, 18 Jun 2011) Log Message: ----------- version=12.1.50 # new feature: tab completion on $... or first word after DRAW or ISOSURFACE Modified Paths: -------------- trunk/Jmol/src/org/jmol/api/JmolViewer.java trunk/Jmol/src/org/jmol/console/JmolConsole.java trunk/Jmol/src/org/jmol/jvxl/data/JvxlCoder.java trunk/Jmol/src/org/jmol/jvxl/data/JvxlData.java trunk/Jmol/src/org/jmol/jvxl/readers/JvxlXmlReader.java trunk/Jmol/src/org/jmol/jvxl/readers/Parameters.java trunk/Jmol/src/org/jmol/jvxl/readers/SurfaceGenerator.java trunk/Jmol/src/org/jmol/jvxl/readers/SurfaceReader.java trunk/Jmol/src/org/jmol/shape/Mesh.java trunk/Jmol/src/org/jmol/shape/MeshCollection.java trunk/Jmol/src/org/jmol/shapespecial/Dipoles.java trunk/Jmol/src/org/jmol/shapespecial/Ellipsoids.java trunk/Jmol/src/org/jmol/shapesurface/Isosurface.java trunk/Jmol/src/org/jmol/shapesurface/IsosurfaceMesh.java trunk/Jmol/src/org/jmol/shapesurface/IsosurfaceRenderer.java trunk/Jmol/src/org/jmol/viewer/Jmol.properties trunk/Jmol/src/org/jmol/viewer/ShapeManager.java trunk/Jmol/src/org/jmol/viewer/Viewer.java Modified: trunk/Jmol/src/org/jmol/api/JmolViewer.java =================================================================== --- trunk/Jmol/src/org/jmol/api/JmolViewer.java 2011-06-18 16:55:04 UTC (rev 15617) +++ trunk/Jmol/src/org/jmol/api/JmolViewer.java 2011-06-18 20:25:53 UTC (rev 15618) @@ -42,6 +42,7 @@ import javax.vecmath.Point3f; import javax.vecmath.Vector3f; +import org.jmol.script.Token; import org.jmol.viewer.Viewer; /** @@ -496,5 +497,14 @@ abstract public boolean checkPrivateKey(double privateKey); public String menuStructure; + + /** + * retrieves list of draw/isosurface objects + * + * @param map + * @param b + * + */ + abstract public void getObjectMap(Map<String, Token> map, boolean b); } Modified: trunk/Jmol/src/org/jmol/console/JmolConsole.java =================================================================== --- trunk/Jmol/src/org/jmol/console/JmolConsole.java 2011-06-18 16:55:04 UTC (rev 15617) +++ trunk/Jmol/src/org/jmol/console/JmolConsole.java 2011-06-18 20:25:53 UTC (rev 15618) @@ -133,6 +133,7 @@ return null; boolean asCommand = splitCmd[2] == null; String notThis = splitCmd[asCommand ? 1 : 2]; + String s = splitCmd[1]; if (notThis.length() == 0) return null; splitCmd = ScriptCompiler.splitCommandLine(strCommand); @@ -145,9 +146,19 @@ if (cmd != null) cmd = splitCmd[0] + splitCmd[1] + q + (cmd == null ? notThis : cmd) + q; } else { - if (!asCommand) - notThis = splitCmd[1]; - cmd = Token.completeCommand(null, splitCmd[1].equalsIgnoreCase("set "), asCommand, asCommand ? splitCmd[1] + Map<String, Token> map = null; + if (!asCommand) { + System.out.println(" tsting " + splitCmd[0] + "///" + splitCmd[1] + "///" + splitCmd[2]); + notThis = s; + if (splitCmd[2].startsWith("$") + || s.equalsIgnoreCase("isosurface ") + || s.equalsIgnoreCase("draw ") + ) { + map = new Hashtable<String, Token>(); + viewer.getObjectMap(map, splitCmd[2].startsWith("$")); + } + } + cmd = Token.completeCommand(map, s.equalsIgnoreCase("set "), asCommand, asCommand ? splitCmd[1] : splitCmd[2], nTab); cmd = splitCmd[0] + (cmd == null ? notThis : asCommand ? cmd : splitCmd[1] + cmd); Modified: trunk/Jmol/src/org/jmol/jvxl/data/JvxlCoder.java =================================================================== --- trunk/Jmol/src/org/jmol/jvxl/data/JvxlCoder.java 2011-06-18 16:55:04 UTC (rev 15617) +++ trunk/Jmol/src/org/jmol/jvxl/data/JvxlCoder.java 2011-06-18 20:25:53 UTC (rev 15618) @@ -89,7 +89,7 @@ return data.toString(); } - boolean verticesOnly = (meshData != null); + boolean vertexDataOnly = (meshData != null); boolean isHeaderOnly = ("HEADERONLY".equals(msg)); if (includeHeader) { XmlUtil.openDocument(data); @@ -102,7 +102,7 @@ XmlUtil.appendCdata(data, "jvxlFileTitle", null, "\n" + jvxlData.jvxlFileTitle); if (jvxlData.moleculeXml != null) data.append(jvxlData.moleculeXml); - String volumeDataXml = (verticesOnly ? null : jvxlData.jvxlVolumeDataXml); + String volumeDataXml = (vertexDataOnly ? null : jvxlData.jvxlVolumeDataXml); if (volumeDataXml == null) volumeDataXml = (new VolumeData()).setVolumetricXml(); data.append(volumeDataXml); @@ -112,13 +112,13 @@ return data.toString(); } StringBuffer sb; - String type = (verticesOnly ? "pmesh" + String type = (vertexDataOnly ? "pmesh" : jvxlData.jvxlPlane == null ? "isosurface" : "plane"); // TODO: contours mentioned here? when discrete? if (jvxlData.jvxlColorData != null && jvxlData.jvxlColorData.length() > 0) type = "mapped " + type; XmlUtil.openTag(data, "jvxlSurface", new String[] { "type", type }); - data.append(jvxlGetInfo(jvxlData, verticesOnly)); + data.append(jvxlGetInfo(jvxlData, vertexDataOnly)); jvxlAppendCommandState(data, comment, state); if (title != null || msg != null && msg.length() > 0) { sb = new StringBuffer(); @@ -132,7 +132,7 @@ sb = new StringBuffer(); XmlUtil.openTag(sb, "jvxlSurfaceData", (jvxlData.jvxlPlane == null ? null : new String[] { "plane", Escape.escape(jvxlData.jvxlPlane) })); - if (verticesOnly) { + if (vertexDataOnly) { jvxlAppendMeshXml(sb, jvxlData, meshData, true); } else if (jvxlData.jvxlPlane == null) { if (jvxlData.jvxlEdgeData == null) @@ -194,7 +194,7 @@ int r = (int) (jvxlData.nBytes > 0 ? ((float) jvxlData.nBytes) / len : ((float) (jvxlData.nPointsX * jvxlData.nPointsY * jvxlData.nPointsZ * 13)) / len); - return TextFormat.simpleReplace(s, "#RATIO#", (r > 0 ? "" + r : "?")); + return TextFormat.simpleReplace(s, "\"not Caculated\"", (r > 0 ? "\"" + r +":1\"": "\"?\"")); } private static void appendXmlEdgeData(StringBuffer sb, JvxlData jvxlData) { @@ -245,16 +245,16 @@ return jvxlGetInfo(jvxlData, jvxlData.vertexDataOnly); } - public static String jvxlGetInfo(JvxlData jvxlData, boolean verticesOnly) { + public static String jvxlGetInfo(JvxlData jvxlData, boolean vertexDataOnly) { if (jvxlData.jvxlSurfaceData == null) return ""; List<String[]> attribs = new ArrayList<String[]>(); int nSurfaceInts = jvxlData.nSurfaceInts;// jvxlData.jvxlSurfaceData.length(); - int bytesUncompressedEdgeData = (verticesOnly ? 0 + int bytesUncompressedEdgeData = (vertexDataOnly ? 0 : jvxlData.jvxlEdgeData.length() - 1); int nColorData = (jvxlData.jvxlColorData == null ? -1 : (jvxlData.jvxlColorData.length() - 1)); - if (!verticesOnly) { + if (!vertexDataOnly) { // informational only: addAttrib(attribs, "\n cutoff", "" + jvxlData.cutoff); addAttrib(attribs, "\n isCutoffAbsolute", "" + jvxlData.isCutoffAbsolute); @@ -313,7 +313,10 @@ addAttrib(attribs, "\n colorScheme", jvxlData.colorScheme); if (jvxlData.rendering != null) addAttrib(attribs, "\n rendering", jvxlData.rendering); - + if (jvxlData.slabValue != Integer.MAX_VALUE) + addAttrib(attribs, "\n slabValue", "" + jvxlData.slabValue); + if (jvxlData.isSlabbable) + addAttrib(attribs, "\n slabbable", "true"); if (jvxlData.nVertexColors > 0) addAttrib(attribs, "\n nVertexColors", "" + jvxlData.nVertexColors); @@ -352,7 +355,7 @@ + (jvxlData.nPointsX - 1) + ")"); addAttrib(attribs, "\n xyzMin", Escape.escape(jvxlData.boundingBox[0])); addAttrib(attribs, "\n xyzMax", Escape.escape(jvxlData.boundingBox[1])); - addAttrib(attribs, "\n approximateCompressionRatio", "#RATIO#:1"); + addAttrib(attribs, "\n approximateCompressionRatio", "not Calculated"); addAttrib(attribs, "\n jmolVersion", jvxlData.version); StringBuffer info = new StringBuffer(); @@ -631,21 +634,25 @@ * @param sb * @param triangles * @param nData - * @param bsInclude + * @param bsSlabDisplay * @param vertexIdNew * @param escapeXml * @return (triangles are present) */ private static boolean appendXmlTriangleData(StringBuffer sb, int[][] triangles, int nData, - BitSet bsInclude, int[] vertexIdNew, boolean escapeXml) { + BitSet bsSlabDisplay, int[] vertexIdNew, boolean escapeXml) { StringBuffer list1 = new StringBuffer(); + StringBuffer list2 = new StringBuffer(); int ilast = 1; int p = 0; int inew = 0; boolean addPlus = false; int nTri = 0; + + // note that the slabbing present becomes irreversible. + for (int i = 0; i < nData;) { - if (triangles[i] == null || (bsInclude != null && !bsInclude.get(i))) { + if (triangles[i] == null || (bsSlabDisplay != null && !bsSlabDisplay.get(i))) { i++; continue; } @@ -673,6 +680,7 @@ addPlus = false; } if (++p % 3 == 0) { + list2.append(triangles[i][3]); p = 0; i++; nTri++; @@ -684,6 +692,10 @@ "count", "" + nTri, "encoding", "jvxltdiff", "data" , jvxlCompressString(list1.toString(), escapeXml) }, null); + XmlUtil.appendTag(sb, "jvxlTriangleEdgeData", new String[] { // Jmol 12.1.50 + "count", "" + nTri, + "encoding", "jvxlsc", + "data" , jvxlCompressString(list2.toString(), escapeXml) }, null); return true; } Modified: trunk/Jmol/src/org/jmol/jvxl/data/JvxlData.java =================================================================== --- trunk/Jmol/src/org/jmol/jvxl/data/JvxlData.java 2011-06-18 16:55:04 UTC (rev 15617) +++ trunk/Jmol/src/org/jmol/jvxl/data/JvxlData.java 2011-06-18 20:25:53 UTC (rev 15618) @@ -157,6 +157,8 @@ public int translucency; public String colorScheme; public String rendering; + public int slabValue = Integer.MAX_VALUE; + public boolean isSlabbable; public void clear() { jvxlSurfaceData = ""; @@ -170,8 +172,10 @@ contourValuesUsed = null; contourColixes = null; contourColors = null; + isSlabbable = false; meshColor = null; nVertexColors = 0; + slabValue = Integer.MAX_VALUE; rendering = null; translucency = 0; vContours = null; Modified: trunk/Jmol/src/org/jmol/jvxl/readers/JvxlXmlReader.java =================================================================== --- trunk/Jmol/src/org/jmol/jvxl/readers/JvxlXmlReader.java 2011-06-18 16:55:04 UTC (rev 15617) +++ trunk/Jmol/src/org/jmol/jvxl/readers/JvxlXmlReader.java 2011-06-18 20:25:53 UTC (rev 15618) @@ -48,7 +48,9 @@ public class JvxlXmlReader extends VolumeFileReader { - protected String JVXL_VERSION = "2.1"; + protected String JVXL_VERSION = "2.2"; + // 2.2 adds full support for return of rendering information, retrieval of triangle edge data when + // edges have been modified by slabbing. protected int surfaceDataCount; protected int edgeDataCount; @@ -253,18 +255,20 @@ jvxlData.color = XmlReader.getXmlAttrib(data, "color"); if (jvxlData.color.length() == 0) jvxlData.color = "orange"; + jvxlData.translucency = parseInt(XmlReader.getXmlAttrib(data, "translucency")); + if (jvxlData.translucency == Integer.MAX_VALUE) + jvxlData.translucency = 0; s = XmlReader.getXmlAttrib(data, "meshColor"); if (s.length() != 0) jvxlData.meshColor = s; - s = XmlReader.getXmlAttrib(data, "rending"); + s = XmlReader.getXmlAttrib(data, "rendering"); if (s.length() != 0) jvxlData.rendering = s; - jvxlData.translucency = parseInt(XmlReader.getXmlAttrib(data, "translucency")); - if (jvxlData.translucency == Integer.MAX_VALUE) - jvxlData.translucency = 0; jvxlData.colorScheme = XmlReader.getXmlAttrib(data, "colorScheme"); if (jvxlData.colorScheme.length() == 0) jvxlData.colorScheme = "rgb"; + jvxlData.slabValue = parseInt(XmlReader.getXmlAttrib(data, "slabValue")); + jvxlData.isSlabbable = (XmlReader.getXmlAttrib(data, "slabbable").equalsIgnoreCase("true")); if (jvxlDataIs2dContour) params.isContoured = true; @@ -584,7 +588,7 @@ } /** - * retrieve Jvxl 2.0 format vertex/triangle/color data found + * retrieve Jvxl 2.0 format vertex/triangle/edge/color data found * within <jvxlSurfaceData> element * * @throws Exception @@ -592,9 +596,10 @@ protected void getEncodedVertexData() throws Exception { String data = xr.getXmlData("jvxlSurfaceData", null, true, false); String tData = xr.getXmlData("jvxlTriangleData", data, true, false); + String edgeData = xr.getXmlData("jvxlTriangleEdgeData", data, true, false); jvxlDecodeVertexData(xr.getXmlData("jvxlVertexData", data, true, false), false); String polygonColorData = xr.getXmlData("jvxlPolygonColorData", data, false, false); - jvxlDecodeTriangleData(tData, polygonColorData); + jvxlDecodeTriangleData(tData, edgeData, polygonColorData); Logger.info("Checking for vertex values"); data = xr.getXmlData("jvxlColorData", data, true, false); jvxlData.isJvxlPrecisionColor = XmlReader.getXmlAttrib(data, "encoding").endsWith("2"); @@ -656,11 +661,12 @@ * * @param data * tag and contents + * @param edgeData * @param colorData * @return int[][] if desired * @throws Exception */ - int[][] jvxlDecodeTriangleData(String data, String colorData) + int[][] jvxlDecodeTriangleData(String data, String edgeData, String colorData) throws Exception { int nColors = (colorData == null ? -1 : 0); int color = 0; @@ -671,8 +677,11 @@ String s = JvxlCoder.jvxlUncompressString(XmlReader.getXmlAttrib(data, "data")); if (s.length() == 0) s = xr.getXmlData("jvxlTriangleData", data, false, false); + String sEdge = JvxlCoder.jvxlUncompressString(XmlReader.getXmlAttrib(edgeData, "data")).trim(); int[] nextp = new int[1]; int[] nextc = new int[1]; + int edgeMask = 7; + boolean haveEdgeInfo = (sEdge.length() == nData); int ilast = 0; int p = 0; int b0 = '\\'; @@ -712,8 +721,11 @@ ilast += idiff; triangle[p] = ilast; if (++p % 3 == 0) { - i++; - p = 0; + if(haveEdgeInfo) { + edgeMask = sEdge.charAt(i) - '0'; + if (edgeMask < 0 || edgeMask > 7) + edgeMask = 7; + } if (nColors >= 0) { if (nColors == 0) { nColors = Parser.parseInt(colorData, nextc); @@ -723,8 +735,10 @@ } nColors--; } - addTriangleCheck(triangle[0], triangle[1], triangle[2], 7, 0, false, + addTriangleCheck(triangle[0], triangle[1], triangle[2], edgeMask, 0, false, color); + i++; + p = 0; } } return triangles; Modified: trunk/Jmol/src/org/jmol/jvxl/readers/Parameters.java =================================================================== --- trunk/Jmol/src/org/jmol/jvxl/readers/Parameters.java 2011-06-18 16:55:04 UTC (rev 15617) +++ trunk/Jmol/src/org/jmol/jvxl/readers/Parameters.java 2011-06-18 20:25:53 UTC (rev 15618) @@ -152,7 +152,7 @@ final public static int IS_SOLVENTTYPE = 1 << 7; final static int HAS_MAXGRID = 1 << 8; final static int IS_POINTMAPPABLE = 1 << 9; - + final static int IS_SLABBABLE = 1 << 10; public int dataType; int surfaceType; @@ -171,20 +171,20 @@ final static int SURFACE_FUNCTIONXYZ = 9; // getSurface or mapColor: - final static int SURFACE_SOLVENT = 11 | IS_SOLVENTTYPE | NO_ANISOTROPY; - final static int SURFACE_SASURFACE = 12 | IS_SOLVENTTYPE | NO_ANISOTROPY; - final static int SURFACE_MOLECULARORBITAL = 13 | NO_ANISOTROPY | HAS_MAXGRID | IS_POINTMAPPABLE; - final static int SURFACE_ATOMICORBITAL = 14 | HAS_MAXGRID; - final static int SURFACE_MEP = 16 | NO_ANISOTROPY | HAS_MAXGRID; - final static int SURFACE_MLP = 17 | NO_ANISOTROPY | HAS_MAXGRID; - final static int SURFACE_MOLECULAR = 19 | IS_SOLVENTTYPE | NO_ANISOTROPY; - final static int SURFACE_NCI = 20 | NO_ANISOTROPY | HAS_MAXGRID | IS_POINTMAPPABLE; - final static int SURFACE_INTERSECT = 21 | NO_ANISOTROPY | HAS_MAXGRID; + final static int SURFACE_SOLVENT = 11 | IS_SOLVENTTYPE | NO_ANISOTROPY | IS_SLABBABLE ; + final static int SURFACE_SASURFACE = 12 | IS_SOLVENTTYPE | NO_ANISOTROPY | IS_SLABBABLE; + final static int SURFACE_MOLECULARORBITAL = 13 | NO_ANISOTROPY | HAS_MAXGRID | IS_POINTMAPPABLE | IS_SLABBABLE; + final static int SURFACE_ATOMICORBITAL = 14 | HAS_MAXGRID | IS_SLABBABLE; + final static int SURFACE_MEP = 16 | NO_ANISOTROPY | HAS_MAXGRID | IS_SLABBABLE; + final static int SURFACE_MLP = 17 | NO_ANISOTROPY | HAS_MAXGRID | IS_SLABBABLE; + final static int SURFACE_MOLECULAR = 19 | IS_SOLVENTTYPE | NO_ANISOTROPY | IS_SLABBABLE; + final static int SURFACE_NCI = 20 | NO_ANISOTROPY | HAS_MAXGRID | IS_POINTMAPPABLE | IS_SLABBABLE; + final static int SURFACE_INTERSECT = 21 | NO_ANISOTROPY | HAS_MAXGRID | IS_SLABBABLE; // mapColor only: - final static int SURFACE_NOMAP = 21 | IS_SOLVENTTYPE | NO_ANISOTROPY; - final static int SURFACE_PROPERTY = 22 | IS_SOLVENTTYPE | NO_ANISOTROPY; + final static int SURFACE_NOMAP = 21 | IS_SOLVENTTYPE | NO_ANISOTROPY | IS_SLABBABLE; + final static int SURFACE_PROPERTY = 22 | IS_SOLVENTTYPE | NO_ANISOTROPY | IS_SLABBABLE; void initialize() { addHydrogens = false; Modified: trunk/Jmol/src/org/jmol/jvxl/readers/SurfaceGenerator.java =================================================================== --- trunk/Jmol/src/org/jmol/jvxl/readers/SurfaceGenerator.java 2011-06-18 16:55:04 UTC (rev 15617) +++ trunk/Jmol/src/org/jmol/jvxl/readers/SurfaceGenerator.java 2011-06-18 20:25:53 UTC (rev 15618) @@ -190,10 +190,6 @@ return params.state == Parameters.STATE_DATA_READ; } - public int getDataType() { - return params.dataType; - } - public String getFileName() { return params.fileName; } @@ -712,6 +708,7 @@ if ("pocket" == propertyName) { params.pocket = (Boolean) value; + params.fullyLit = params.pocket.booleanValue(); return true; } Modified: trunk/Jmol/src/org/jmol/jvxl/readers/SurfaceReader.java =================================================================== --- trunk/Jmol/src/org/jmol/jvxl/readers/SurfaceReader.java 2011-06-18 16:55:04 UTC (rev 15617) +++ trunk/Jmol/src/org/jmol/jvxl/readers/SurfaceReader.java 2011-06-18 20:25:53 UTC (rev 15618) @@ -335,6 +335,7 @@ nPointsX = voxelCounts[0]; nPointsY = voxelCounts[1]; nPointsZ = voxelCounts[2]; + jvxlData.isSlabbable = ((params.dataType & Parameters.IS_SLABBABLE) != 0); jvxlData.insideOut = params.insideOut; jvxlData.dataXYReversed = params.dataXYReversed; jvxlData.isBicolorMap = params.isBicolorMap; @@ -360,8 +361,7 @@ int i = s.indexOf('\n', s.indexOf('\n',s.indexOf('\n') + 1) + 1) + 1; jvxlData.jvxlFileTitle = s.substring(0, i); jvxlData.jvxlFileHeader = s; - if (xyzMin == null) - setBoundingBox(); + setBoundingBox(); if (!params.isSilent) Logger.info("boundbox corners " + Escape.escape(xyzMin) + " " + Escape.escape(xyzMax)); jvxlData.boundingBox = new Point3f[] {xyzMin, xyzMax}; @@ -1023,6 +1023,7 @@ private void setBoundingBox() { if (meshDataServer != null) meshDataServer.fillMeshData(meshData, MeshData.MODE_GET_VERTICES, null); + xyzMin = null; for (int i = 0; i < meshData.vertexCount; i++) { Point3f p = meshData.vertices[i]; if (!Float.isNaN(p.x)) Modified: trunk/Jmol/src/org/jmol/shape/Mesh.java =================================================================== --- trunk/Jmol/src/org/jmol/shape/Mesh.java 2011-06-18 16:55:04 UTC (rev 15617) +++ trunk/Jmol/src/org/jmol/shape/Mesh.java 2011-06-18 20:25:53 UTC (rev 15618) @@ -63,9 +63,7 @@ public boolean visible = true; public int lighting = JmolConstants.FRONTLIT; public Quaternion q; - public int slabValue = Integer.MAX_VALUE; - public float scale = 1; public boolean haveXyPoints; public boolean isPolygonSet; // just a set of flat polygons @@ -149,7 +147,6 @@ slabbingObject = null; cappingObject = null; q = null; - slabValue = Integer.MAX_VALUE; this.meshType = meshType; } Modified: trunk/Jmol/src/org/jmol/shape/MeshCollection.java =================================================================== --- trunk/Jmol/src/org/jmol/shape/MeshCollection.java 2011-06-18 16:55:04 UTC (rev 15617) +++ trunk/Jmol/src/org/jmol/shape/MeshCollection.java 2011-06-18 20:25:53 UTC (rev 15618) @@ -349,8 +349,17 @@ } } + @SuppressWarnings("unchecked") @Override public boolean getProperty(String property, Object[] data) { + if (property == "getNames") { + Map<String, Token> map = (Map<String, Token>) data[0]; + boolean withDollar = ((Boolean) data[1]).booleanValue(); + for (int i = meshCount; --i >= 0;) + if (meshes[i] != null) + map.put((withDollar ? "$" : "") + meshes[i].thisID, Token.tokenOr); // just a placeholder + return true; + } if (property == "getVertices") { Mesh m = getMesh((String) data[0]); if (m == null) @@ -358,7 +367,7 @@ data[1] = m.vertices; data[2] = m.getVisibleVertexBitSet(); return true; - + } if (property == "checkID") { String key = ((String) data[0]).toUpperCase(); @@ -375,13 +384,13 @@ } if (property == "getCenter") { String id = (String) data[0]; - int index = ((Integer)data[1]).intValue(); + int index = ((Integer) data[1]).intValue(); Mesh m; if ((m = getMesh(id)) == null || m.vertices == null) - return false; + return false; if (index == Integer.MAX_VALUE) data[2] = new Point3f(m.index + 1, meshCount, m.vertexCount); - else + else data[2] = m.vertices[m.getVertexIndexFromNumber(index)]; return true; } @@ -390,7 +399,7 @@ @Override public Object getProperty(String property, int index) { - Mesh m; + Mesh m; if (property == "count") { int n = 0; for (int i = 0; i < meshCount; i++) @@ -405,7 +414,8 @@ int k = 0; String id = (property.equals("list") ? null : property.substring(5)); for (int i = 0; i < meshCount; i++) { - if ((m = meshes[i]) == null || m.vertexCount == 0 || id != null && !id.equalsIgnoreCase(m.thisID)) + if ((m = meshes[i]) == null || m.vertexCount == 0 || id != null + && !id.equalsIgnoreCase(m.thisID)) continue; sb.append((++k)).append(" id:" + m.thisID).append( "; model:" + viewer.getModelNumberDotted(m.modelIndex)).append( Modified: trunk/Jmol/src/org/jmol/shapespecial/Dipoles.java =================================================================== --- trunk/Jmol/src/org/jmol/shapespecial/Dipoles.java 2011-06-18 16:55:04 UTC (rev 15617) +++ trunk/Jmol/src/org/jmol/shapespecial/Dipoles.java 2011-06-18 20:25:53 UTC (rev 15618) @@ -356,8 +356,18 @@ Logger.error("Unkown dipole property! " + Token.nameOf(tok)); } +// @SuppressWarnings("unchecked") @Override public boolean getProperty(String property, Object[] data) { + if (property == "getNames") { + /* just implemented for DRAW and ISOSURFACE + Map<String, Token> map = (Map<String, Token>) data[0]; + boolean withDollar = ((Boolean) data[1]).booleanValue(); + for (int i = dipoleCount; --i >= 0;) + map.put((withDollar ? "$" : "") + dipoles[i].thisID, Token.tokenAnd); // just a placeholder + return true; + */ + } if (property == "checkID") { String key = ((String) data[0]).toUpperCase(); boolean isWild = TextFormat.isWild(key); Modified: trunk/Jmol/src/org/jmol/shapespecial/Ellipsoids.java =================================================================== --- trunk/Jmol/src/org/jmol/shapespecial/Ellipsoids.java 2011-06-18 16:55:04 UTC (rev 15617) +++ trunk/Jmol/src/org/jmol/shapespecial/Ellipsoids.java 2011-06-18 20:25:53 UTC (rev 15618) @@ -29,12 +29,14 @@ import java.util.Hashtable; import java.util.Iterator; import java.util.Map; +//import java.util.Map.Entry; import javax.vecmath.Matrix3f; import javax.vecmath.Point3f; import javax.vecmath.Vector3f; import org.jmol.g3d.Graphics3D; +//import org.jmol.script.Token; import org.jmol.shape.AtomShape; import org.jmol.util.Escape; import org.jmol.util.Quadric; @@ -66,7 +68,22 @@ } +// @SuppressWarnings("unchecked") @Override + public boolean getProperty(String property, Object[] data) { +/* just implemented for DRAW and ISOSURFACE + if (property == "getNames") { + Map<String, Token> map = (Map<String, Token>) data[0]; + boolean withDollar = ((Boolean) data[1]).booleanValue(); + for (Entry<String, Ellipsoid>entry : htEllipsoids.entrySet()) + map.put((withDollar ? "$" : "") + entry.getKey(), Token.tokenExpressionBegin); // just a placeholder + return true; + } +*/ + return super.getProperty(property, data); + } + + @Override public int getIndexFromName(String thisID) { return ((ellipsoid = htEllipsoids.get(thisID)) == null ? -1 : 1); Modified: trunk/Jmol/src/org/jmol/shapesurface/Isosurface.java =================================================================== --- trunk/Jmol/src/org/jmol/shapesurface/Isosurface.java 2011-06-18 16:55:04 UTC (rev 15617) +++ trunk/Jmol/src/org/jmol/shapesurface/Isosurface.java 2011-06-18 20:25:53 UTC (rev 15618) @@ -113,7 +113,6 @@ import org.jmol.script.Token; import org.jmol.viewer.Viewer; import org.jmol.viewer.StateManager.Orientation; -import org.jmol.jvxl.readers.Parameters; import java.io.BufferedReader; import java.io.InputStream; @@ -174,7 +173,6 @@ } //private boolean logMessages; private String actualID; - private int lighting; private boolean iHaveBitSets; private boolean explicitContours; private int atomIndex; @@ -406,7 +404,7 @@ if ("slab" == propertyName) { if (value instanceof Integer) { if (thisMesh != null) - thisMesh.slabValue = ((Integer) value).intValue(); + thisMesh.jvxlData.slabValue = ((Integer) value).intValue(); return; } if (thisMesh != null && thisMesh.polygonCount != 0) { @@ -495,9 +493,9 @@ } else if ("plane" == propertyName) { //allowContourLines = false; } else if ("pocket" == propertyName) { - Boolean pocket = (Boolean) value; - lighting = (pocket.booleanValue() ? JmolConstants.FULLYLIT - : JmolConstants.FRONTLIT); + // Boolean pocket = (Boolean) value; + // lighting = (pocket.booleanValue() ? JmolConstants.FULLYLIT + // : JmolConstants.FRONTLIT); } else if ("scale3d" == propertyName) { scale3d = ((Float) value).floatValue(); if (thisMesh != null) { @@ -758,48 +756,48 @@ } private void getMeshCommand(StringBuffer sb, int i) { - Mesh mesh = meshes[i]; - String cmd = mesh.scriptCommand; + IsosurfaceMesh imesh = (IsosurfaceMesh) meshes[i]; + String cmd = imesh.scriptCommand; if (cmd == null) return; - if (mesh.modelIndex >= 0 && modelCount > 1) - appendCmd(sb, "frame " + viewer.getModelNumberDotted(mesh.modelIndex)); + if (imesh.modelIndex >= 0 && modelCount > 1) + appendCmd(sb, "frame " + viewer.getModelNumberDotted(imesh.modelIndex)); cmd = TextFormat.simpleReplace(cmd, "; isosurface map", " map"); cmd = cmd.replace('\t', ' '); cmd = TextFormat.simpleReplace(cmd, ";#", "; #"); int pt = cmd.indexOf("; #"); if (pt >= 0) cmd = cmd.substring(0, pt); - if (mesh.connections != null) - cmd += " connect " + Escape.escape(mesh.connections); + if (imesh.connections != null) + cmd += " connect " + Escape.escape(imesh.connections); cmd = TextFormat.trim(cmd, ";"); - if (mesh.linkedMesh != null) + if (imesh.linkedMesh != null) cmd += " LINK"; // for lcaoCartoon state appendCmd(sb, cmd); - String id = myType + " ID " + Escape.escape(mesh.thisID); - if (mesh.q != null && mesh.q.q0 != 1) - appendCmd(sb, id + " rotate " + mesh.q.toString()); - if (mesh.ptOffset != null) - appendCmd(sb, id + " offset " + Escape.escape(mesh.ptOffset)); - if (mesh.scale3d != 0) - appendCmd(sb, id + " scale3d " + mesh.scale3d); - if (mesh.slabOptions != null) - appendCmd(sb, id + mesh.slabOptions.toString()); - if (mesh.slabValue != Integer.MAX_VALUE) - appendCmd(sb, id + " slab " + mesh.slabValue); + String id = myType + " ID " + Escape.escape(imesh.thisID); + if (imesh.q != null && imesh.q.q0 != 1) + appendCmd(sb, id + " rotate " + imesh.q.toString()); + if (imesh.ptOffset != null) + appendCmd(sb, id + " offset " + Escape.escape(imesh.ptOffset)); + if (imesh.scale3d != 0) + appendCmd(sb, id + " scale3d " + imesh.scale3d); + if (imesh.slabOptions != null) + appendCmd(sb, id + imesh.slabOptions.toString()); + if (imesh.jvxlData.slabValue != Integer.MAX_VALUE) + appendCmd(sb, id + " slab " + imesh.jvxlData.slabValue); if (cmd.charAt(0) != '#') { if (allowMesh) - appendCmd(sb, mesh.getState(myType)); - if (mesh.colorCommand != null) { - if (!mesh.isColorSolid && Graphics3D.isColixTranslucent(mesh.colix)) - appendCmd(sb, getColorCommand(myType, mesh.colix)); - appendCmd(sb, mesh.colorCommand); + appendCmd(sb, imesh.getState(myType)); + if (imesh.colorCommand != null) { + if (!imesh.isColorSolid && Graphics3D.isColixTranslucent(imesh.colix)) + appendCmd(sb, getColorCommand(myType, imesh.colix)); + appendCmd(sb, imesh.colorCommand); } - boolean colorArrayed = (mesh.isColorSolid && ((IsosurfaceMesh) mesh).polygonColixes != null); - if (mesh.isColorSolid && !colorArrayed) - appendCmd(sb, getColorCommand(myType, mesh.colix)); - if (mesh.vertexColorMap != null) - for (Map.Entry<String, BitSet> entry : mesh.vertexColorMap.entrySet()) { + boolean colorArrayed = (imesh.isColorSolid && imesh.polygonColixes != null); + if (imesh.isColorSolid && !colorArrayed) + appendCmd(sb, getColorCommand(myType, imesh.colix)); + if (imesh.vertexColorMap != null) + for (Map.Entry<String, BitSet> entry : imesh.vertexColorMap.entrySet()) { BitSet bs = entry.getValue(); if (!bs.isEmpty()) appendCmd(sb, "color " + myType + " " + Escape.escape(bs, true) @@ -904,7 +902,6 @@ private boolean iHaveModelIndex; private void initializeIsosurface() { - lighting = JmolConstants.FRONTLIT; if (!iHaveModelIndex) modelIndex = viewer.getCurrentModelIndex(); isFixed = (modelIndex < 0); @@ -1213,14 +1210,13 @@ thisMesh.calculatedArea = null; thisMesh.calculatedVolume = null; // from JVXL file: - thisMesh.setColorsFromJvxlData(); thisMesh.initialize(sg.isFullyLit() ? JmolConstants.FULLYLIT - : lighting, null, sg.getPlane()); + : JmolConstants.FRONTLIT, null, sg.getPlane()); + thisMesh.setColorsFromJvxlData(); if (sg.getParams().psi_monteCarloCount > 0) thisMesh.diameter = 1; //if (thisMesh.jvxlData.jvxlPlane != null) //allowContourLines = false; - thisMesh.isSolvent = ((sg.getDataType() & Parameters.IS_SOLVENTTYPE) != 0); } public void notifySurfaceMappingCompleted() { Modified: trunk/Jmol/src/org/jmol/shapesurface/IsosurfaceMesh.java =================================================================== --- trunk/Jmol/src/org/jmol/shapesurface/IsosurfaceMesh.java 2011-06-18 16:55:04 UTC (rev 15617) +++ trunk/Jmol/src/org/jmol/shapesurface/IsosurfaceMesh.java 2011-06-18 20:25:53 UTC (rev 15618) @@ -55,7 +55,6 @@ boolean hasGridPoints; Object calculatedArea; Object calculatedVolume; - public boolean isSolvent; IsosurfaceMesh(String thisID, Graphics3D g3d, short colix, int index) { super(thisID, g3d, colix, index); @@ -67,11 +66,11 @@ super.clear(meshType); jvxlData.clear(); + assocGridPointMap = null; assocGridPointNormals = null; centers = null; colorEncoder = null; - vertexColorMap = null; firstRealVertex = -1; hasGridPoints = iAddGridPoints; isColorSolid = true; @@ -81,9 +80,10 @@ surfaceSet = null; thisSet = -1; vertexColixes = null; + vertexColorMap = null; vertexIncrement = 1; + vertexSets = null; vertexValues = null; - vertexSets = null; } void allocVertexColixes() { @@ -550,10 +550,10 @@ * @param isAll */ void setJvxlColorMap(boolean isAll) { - jvxlData.rendering = getRendering(); jvxlData.color = Graphics3D.getHexCode(colix); jvxlData.meshColor = (meshColix == 0 ? null : Graphics3D.getHexCode(meshColix)); jvxlData.translucency = Graphics3D.getColixTranslucencyLevel(colix); + jvxlData.rendering = getRendering().substring(1); jvxlData.colorScheme = (colorEncoder == null ? null : colorEncoder .getColorScheme()); jvxlData.nVertexColors = (vertexColorMap == null ? 0 : vertexColorMap Modified: trunk/Jmol/src/org/jmol/shapesurface/IsosurfaceRenderer.java =================================================================== --- trunk/Jmol/src/org/jmol/shapesurface/IsosurfaceRenderer.java 2011-06-18 16:55:04 UTC (rev 15617) +++ trunk/Jmol/src/org/jmol/shapesurface/IsosurfaceRenderer.java 2011-06-18 20:25:53 UTC (rev 15618) @@ -61,8 +61,8 @@ imesh = (IsosurfaceMesh) isosurface.meshes[i]; volumeRender = imesh.jvxlData.colorDensity; if (!isNavigationMode) { - int meshSlabValue = imesh.slabValue; - if (meshSlabValue != Integer.MAX_VALUE && imesh.isSolvent) { + int meshSlabValue = imesh.jvxlData.slabValue; + if (meshSlabValue != Integer.MAX_VALUE && imesh.jvxlData.isSlabbable) { Point3f[] points = imesh.jvxlData.boundingBox; pt2f.set(points[0]); pt2f.add(points[1]); @@ -75,7 +75,7 @@ g3d.setTranslucentCoverOnly(imesh.frontOnly); thePlane = imesh.jvxlData.jvxlPlane; vertexValues = imesh.vertexValues; - if (mySlabValue != Integer.MAX_VALUE && imesh.isSolvent) { + if (mySlabValue != Integer.MAX_VALUE && imesh.jvxlData.isSlabbable) { g3d.setSlab(mySlabValue); render1(imesh); g3d.setSlab(slabValue); Modified: trunk/Jmol/src/org/jmol/viewer/Jmol.properties =================================================================== --- trunk/Jmol/src/org/jmol/viewer/Jmol.properties 2011-06-18 16:55:04 UTC (rev 15617) +++ trunk/Jmol/src/org/jmol/viewer/Jmol.properties 2011-06-18 20:25:53 UTC (rev 15618) @@ -3,6 +3,8 @@ version=12.1.50 +# new feature: tab completion on $... or first word after DRAW or ISOSURFACE +# # new feature: JVXL files now save and return color and colorscheme information # as well as rending (mesh, fill, front/back/fullylit) # Modified: trunk/Jmol/src/org/jmol/viewer/ShapeManager.java =================================================================== --- trunk/Jmol/src/org/jmol/viewer/ShapeManager.java 2011-06-18 16:55:04 UTC (rev 15617) +++ trunk/Jmol/src/org/jmol/viewer/ShapeManager.java 2011-06-18 20:25:53 UTC (rev 15618) @@ -164,6 +164,14 @@ return -1; } + public void getObjectMap(Map<String, Token> map, boolean withDollar) { + if (shapes == null) + return; + Boolean bDollar = Boolean.valueOf(withDollar); + for (int i = JmolConstants.SHAPE_MIN_SPECIAL; i < JmolConstants.SHAPE_MAX_MESH_COLLECTION; ++i) + getShapeProperty(i, "getNames", new Object[] { map , bDollar } ); + } + public void setModelVisibility() { if (shapes == null || shapes[JmolConstants.SHAPE_BALLS] == null) return; @@ -486,4 +494,5 @@ minMax[2] = minY; minMax[3] = maxY; } + } Modified: trunk/Jmol/src/org/jmol/viewer/Viewer.java =================================================================== --- trunk/Jmol/src/org/jmol/viewer/Viewer.java 2011-06-18 16:55:04 UTC (rev 15617) +++ trunk/Jmol/src/org/jmol/viewer/Viewer.java 2011-06-18 20:25:53 UTC (rev 15618) @@ -9795,4 +9795,9 @@ return eval.evalFunctionFloat(func, params, values); } + @Override + public void getObjectMap(Map<String, Token> map, boolean withDollar) { + shapeManager.getObjectMap(map, withDollar); + } + } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ha...@us...> - 2012-03-22 22:27:28
|
Revision: 16926 http://jmol.svn.sourceforge.net/jmol/?rev=16926&view=rev Author: hansonr Date: 2012-03-22 22:27:21 +0000 (Thu, 22 Mar 2012) Log Message: ----------- version=12.3.19_dev # bug fix: MOPAC (PUBLIC DOMAIN) output reader can fail on reading vibrations Modified Paths: -------------- trunk/Jmol/src/org/jmol/adapter/readers/quantum/AdfReader.java trunk/Jmol/src/org/jmol/adapter/readers/quantum/GamessReader.java trunk/Jmol/src/org/jmol/adapter/readers/quantum/GaussianReader.java trunk/Jmol/src/org/jmol/adapter/readers/quantum/JaguarReader.java trunk/Jmol/src/org/jmol/adapter/readers/quantum/NWChemReader.java trunk/Jmol/src/org/jmol/adapter/readers/quantum/PsiReader.java trunk/Jmol/src/org/jmol/adapter/readers/quantum/QchemReader.java trunk/Jmol/src/org/jmol/adapter/readers/simple/AmpacReader.java trunk/Jmol/src/org/jmol/adapter/readers/simple/MopacReader.java trunk/Jmol/src/org/jmol/adapter/readers/xtal/CrystalReader.java trunk/Jmol/src/org/jmol/adapter/readers/xtal/DmolReader.java trunk/Jmol/src/org/jmol/adapter/readers/xtal/VaspOutcarReader.java trunk/Jmol/src/org/jmol/adapter/smarter/AtomSetCollectionReader.java trunk/Jmol/src/org/jmol/adapter/smarter/Resolver.java trunk/Jmol/src/org/jmol/viewer/Jmol.properties Modified: trunk/Jmol/src/org/jmol/adapter/readers/quantum/AdfReader.java =================================================================== --- trunk/Jmol/src/org/jmol/adapter/readers/quantum/AdfReader.java 2012-03-22 22:26:56 UTC (rev 16925) +++ trunk/Jmol/src/org/jmol/adapter/readers/quantum/AdfReader.java 2012-03-22 22:27:21 UTC (rev 16926) @@ -218,7 +218,7 @@ atomSetCollection.setAtomSetFrequency(null, null, frequencies[i], null); } readLines(nXX); - fillFrequencyData(iAtom0, atomCount, atomCount, ignore, true, 0, 0, null); + fillFrequencyData(iAtom0, atomCount, atomCount, ignore, true, 0, 0, null, 0); } } @@ -380,7 +380,7 @@ readLine(); sd.mos = ArrayUtil.createArrayOfHashtable(sd.nSFO); String[][] data = new String[sd.nSFO][]; - fillDataBlock(data); + fillDataBlock(data, 0); for (int j = 1; j < nLine; j++) { int pt = sd.basisFunctions[n++]; for (int i = 0; i < sd.nSFO; i++) Modified: trunk/Jmol/src/org/jmol/adapter/readers/quantum/GamessReader.java =================================================================== --- trunk/Jmol/src/org/jmol/adapter/readers/quantum/GamessReader.java 2012-03-22 22:26:56 UTC (rev 16925) +++ trunk/Jmol/src/org/jmol/adapter/readers/quantum/GamessReader.java 2012-03-22 22:27:21 UTC (rev 16926) @@ -189,7 +189,7 @@ } discardLinesUntilBlank(); - fillFrequencyData(iAtom0, atomCount, atomCount, ignore, false, 20, 12, null); + fillFrequencyData(iAtom0, atomCount, atomCount, ignore, false, 20, 12, null, 0); readLines(13); } } Modified: trunk/Jmol/src/org/jmol/adapter/readers/quantum/GaussianReader.java =================================================================== --- trunk/Jmol/src/org/jmol/adapter/readers/quantum/GaussianReader.java 2012-03-22 22:26:56 UTC (rev 16925) +++ trunk/Jmol/src/org/jmol/adapter/readers/quantum/GaussianReader.java 2012-03-22 22:27:21 UTC (rev 16926) @@ -548,7 +548,7 @@ intensities[i]+" KM/Mole"); } discardLinesUntilContains(" AN "); - fillFrequencyData(iAtom0, atomCount, atomCount, ignore, true, 0, 0, null); + fillFrequencyData(iAtom0, atomCount, atomCount, ignore, true, 0, 0, null, 0); } } Modified: trunk/Jmol/src/org/jmol/adapter/readers/quantum/JaguarReader.java =================================================================== --- trunk/Jmol/src/org/jmol/adapter/readers/quantum/JaguarReader.java 2012-03-22 22:26:56 UTC (rev 16925) +++ trunk/Jmol/src/org/jmol/adapter/readers/quantum/JaguarReader.java 2012-03-22 22:27:21 UTC (rev 16926) @@ -340,7 +340,7 @@ break; String[] eigenValues = getTokens(); int n = eigenValues.length - 1; - fillDataBlock(dataBlock); + fillDataBlock(dataBlock, 0); for (int iOrb = 0; iOrb < n; iOrb++) { float[] coefs = new float[moCount]; Map<String, Object> mo = new Hashtable<String, Object>(); @@ -417,7 +417,7 @@ intensities[i + 1] + " km/mol"); } haveLine = true; - fillFrequencyData(iAtom0, atomCount, atomCount, ignore, false, 0, 0, null); + fillFrequencyData(iAtom0, atomCount, atomCount, ignore, false, 0, 0, null, 0); readLine(); readLine(); } Modified: trunk/Jmol/src/org/jmol/adapter/readers/quantum/NWChemReader.java =================================================================== --- trunk/Jmol/src/org/jmol/adapter/readers/quantum/NWChemReader.java 2012-03-22 22:26:56 UTC (rev 16925) +++ trunk/Jmol/src/org/jmol/adapter/readers/quantum/NWChemReader.java 2012-03-22 22:27:21 UTC (rev 16926) @@ -511,7 +511,7 @@ atomSetCollection.setAtomSetFrequency(path, null, tokens[i], null); } readLines(1); - fillFrequencyData(iAtom0, atomCount, atomCount, ignore, false, 0, 0, null); + fillFrequencyData(iAtom0, atomCount, atomCount, ignore, false, 0, 0, null, 0); readLines(3); } Modified: trunk/Jmol/src/org/jmol/adapter/readers/quantum/PsiReader.java =================================================================== --- trunk/Jmol/src/org/jmol/adapter/readers/quantum/PsiReader.java 2012-03-22 22:26:56 UTC (rev 16925) +++ trunk/Jmol/src/org/jmol/adapter/readers/quantum/PsiReader.java 2012-03-22 22:27:21 UTC (rev 16926) @@ -439,7 +439,7 @@ atomSetCollection.cloneLastAtomSet(); atomSetCollection.setAtomSetFrequency(null, null, tokens[1], null); readLines(2); - fillFrequencyData(iAtom0, atomCount, atomCount, ignore, true, 0, 0, null); + fillFrequencyData(iAtom0, atomCount, atomCount, ignore, true, 0, 0, null, 0); readLine(); } } Modified: trunk/Jmol/src/org/jmol/adapter/readers/quantum/QchemReader.java =================================================================== --- trunk/Jmol/src/org/jmol/adapter/readers/quantum/QchemReader.java 2012-03-22 22:26:56 UTC (rev 16925) +++ trunk/Jmol/src/org/jmol/adapter/readers/quantum/QchemReader.java 2012-03-22 22:27:21 UTC (rev 16926) @@ -204,7 +204,7 @@ // position to start reading the displacement vectors discardLinesUntilStartsWith(" X"); - fillFrequencyData(iAtom0, atomCount, atomCount, ignore, true, 0, 0, null); + fillFrequencyData(iAtom0, atomCount, atomCount, ignore, true, 0, 0, null, 0); discardLinesUntilBlank(); } } Modified: trunk/Jmol/src/org/jmol/adapter/readers/simple/AmpacReader.java =================================================================== --- trunk/Jmol/src/org/jmol/adapter/readers/simple/AmpacReader.java 2012-03-22 22:26:56 UTC (rev 16925) +++ trunk/Jmol/src/org/jmol/adapter/readers/simple/AmpacReader.java 2012-03-22 22:27:21 UTC (rev 16926) @@ -198,7 +198,7 @@ atomSetCollection.setAtomSetModelProperty(SmarterJmolAdapter.PATH_KEY, "Frequencies"); } - fillFrequencyData(iAtom0, atomCount, atomCount, ignore, false, 8, 9, null); + fillFrequencyData(iAtom0, atomCount, atomCount, ignore, false, 8, 9, null, 0); readLine(); readLine(); } Modified: trunk/Jmol/src/org/jmol/adapter/readers/simple/MopacReader.java =================================================================== --- trunk/Jmol/src/org/jmol/adapter/readers/simple/MopacReader.java 2012-03-22 22:26:56 UTC (rev 16925) +++ trunk/Jmol/src/org/jmol/adapter/readers/simple/MopacReader.java 2012-03-22 22:27:21 UTC (rev 16926) @@ -239,14 +239,17 @@ int iAtom0 = atomSetCollection.getAtomCount(); int atomCount = atomSetCollection.getLastAtomSetAtomCount(); boolean[] ignore = new boolean[frequencyCount]; + float freq1 = Parser.parseFloatStrict(tokens[0]); + boolean ignoreNegative = (freq1 < 0); for (int i = 0; i < frequencyCount; ++i) { - ignore[i] = done || (done = Parser.parseFloatStrict(tokens[i]) < 1) || !doGetVibration(++vibrationNumber); + ignore[i] = done || (done = (!ignoreNegative && Parser.parseFloatStrict(tokens[i]) < 1)) + || !doGetVibration(++vibrationNumber); if (ignore[i]) continue; bsOK.set(vibrationNumber - 1); atomSetCollection.cloneLastAtomSet(); } - fillFrequencyData(iAtom0, atomCount, atomCount, ignore, false, 0, 0, null); + fillFrequencyData(iAtom0, atomCount, atomCount, ignore, false, 0, 0, null, 2); } String[][] info = new String[vibrationNumber][]; if (line.indexOf("DESCRIPTION") < 0) Modified: trunk/Jmol/src/org/jmol/adapter/readers/xtal/CrystalReader.java =================================================================== --- trunk/Jmol/src/org/jmol/adapter/readers/xtal/CrystalReader.java 2012-03-22 22:26:56 UTC (rev 16925) +++ trunk/Jmol/src/org/jmol/adapter/readers/xtal/CrystalReader.java 2012-03-22 22:27:21 UTC (rev 16926) @@ -941,7 +941,7 @@ } readLine(); fillFrequencyData(iAtom0, freqAtomCount, lastAtomCount, ignore, false, - 14, 10, atomFrag); + 14, 10, atomFrag, 0); readLine(); } return true; Modified: trunk/Jmol/src/org/jmol/adapter/readers/xtal/DmolReader.java =================================================================== --- trunk/Jmol/src/org/jmol/adapter/readers/xtal/DmolReader.java 2012-03-22 22:26:56 UTC (rev 16925) +++ trunk/Jmol/src/org/jmol/adapter/readers/xtal/DmolReader.java 2012-03-22 22:27:21 UTC (rev 16926) @@ -177,7 +177,7 @@ } readLine(); fillFrequencyData(iAtom0, atomCount, lastAtomCount, ignore, false, 5, 13, - null); + null, 0); readLines(2); } } Modified: trunk/Jmol/src/org/jmol/adapter/readers/xtal/VaspOutcarReader.java =================================================================== --- trunk/Jmol/src/org/jmol/adapter/readers/xtal/VaspOutcarReader.java 2012-03-22 22:26:56 UTC (rev 16925) +++ trunk/Jmol/src/org/jmol/adapter/readers/xtal/VaspOutcarReader.java 2012-03-22 22:27:21 UTC (rev 16926) @@ -379,7 +379,7 @@ } readLine(); fillFrequencyData(iAtom0, atomCount, atomCount, ignore, true, 35, 12, - null); + null, 0); iAtom0 += atomCount; readLine(); } Modified: trunk/Jmol/src/org/jmol/adapter/smarter/AtomSetCollectionReader.java =================================================================== --- trunk/Jmol/src/org/jmol/adapter/smarter/AtomSetCollectionReader.java 2012-03-22 22:26:56 UTC (rev 16925) +++ trunk/Jmol/src/org/jmol/adapter/smarter/AtomSetCollectionReader.java 2012-03-22 22:27:21 UTC (rev 16926) @@ -969,12 +969,13 @@ * @param data * @param col0 * @param colWidth + * @param minLineLen TODO * @throws Exception */ - protected void fillDataBlock(String[][] data, int col0, int colWidth) + protected void fillDataBlock(String[][] data, int col0, int colWidth, int minLineLen) throws Exception { if (colWidth == 0) { - fillDataBlock(data); + fillDataBlock(data, minLineLen); return; } int nLines = data.length; @@ -992,12 +993,17 @@ * skipping blank lines in the process * * @param data + * @param minLineLen TODO * @throws Exception */ - protected void fillDataBlock(String[][] data) throws Exception { + protected void fillDataBlock(String[][] data, int minLineLen) throws Exception { int nLines = data.length; - for (int i = 0; i < nLines; i++) + for (int i = 0; i < nLines; i++) { data[i] = getTokens(discardLinesUntilNonBlank()); + if (data[i].length < minLineLen) + --i; + } + } /** @@ -1060,19 +1066,20 @@ * @param atomIndexes * an array either null or indicating exactly which atoms get the * frequencies (used by CrystalReader) + * @param minlineLen TODO * @throws Exception */ protected void fillFrequencyData(int iAtom0, int atomCount, int modelAtomCount, boolean[] ignore, boolean isWide, int col0, int colWidth, - int[] atomIndexes) throws Exception { + int[] atomIndexes, int minLineLen) throws Exception { boolean withSymmetry = (modelAtomCount != atomCount); if (atomIndexes != null) atomCount = atomIndexes.length; int nLines = (isWide ? atomCount : atomCount * 3); int nFreq = ignore.length; String[][] data = new String[nLines][]; - fillDataBlock(data, col0, colWidth); + fillDataBlock(data, col0, colWidth, minLineLen); for (int i = 0, atomPt = 0; i < nLines; i++, atomPt++) { String[] values = data[i]; String[] valuesY = (isWide ? null : data[++i]); Modified: trunk/Jmol/src/org/jmol/adapter/smarter/Resolver.java =================================================================== --- trunk/Jmol/src/org/jmol/adapter/smarter/Resolver.java 2012-03-22 22:26:56 UTC (rev 16925) +++ trunk/Jmol/src/org/jmol/adapter/smarter/Resolver.java 2012-03-22 22:27:21 UTC (rev 16926) @@ -1006,7 +1006,7 @@ private final static String[] mopacContainsRecords = { "Mopac", "MOPAC 93 (c) Fujitsu", "MOPAC2002 (c) Fujitsu", "MOPAC FOR LINUX (PUBLIC DOMAIN VERSION)", - "MOPAC: VERSION 6", "MOPAC 7", "MOPAC2009" }; + "MOPAC: VERSION 6", "MOPAC 7", "MOPAC2009", "MOPAC (PUBLIC" }; private final static String[] qchemContainsRecords = { "Qchem", "Welcome to Q-Chem", "A Quantum Leap Into The Future Of Chemistry" }; Modified: trunk/Jmol/src/org/jmol/viewer/Jmol.properties =================================================================== --- trunk/Jmol/src/org/jmol/viewer/Jmol.properties 2012-03-22 22:26:56 UTC (rev 16925) +++ trunk/Jmol/src/org/jmol/viewer/Jmol.properties 2012-03-22 22:27:21 UTC (rev 16926) @@ -3,6 +3,7 @@ version=12.3.19_dev +# bug fix: MOPAC (PUBLIC DOMAIN) output reader can fail on reading vibrations # bug fix: Spartan 10 archives have .gz and .carc files. This fix adds .gz reading; # not sure what to do about Archive.carc. That's the Gaussian basis functions, so no MOs yet. # bug fix: rotateSelected of models that have had dots at one point retrieved from a state file fails This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ha...@us...> - 2013-06-16 23:52:16
|
Revision: 18339 http://sourceforge.net/p/jmol/code/18339 Author: hansonr Date: 2013-06-16 23:52:10 +0000 (Sun, 16 Jun 2013) Log Message: ----------- ___version=13.0.17_dev_2013.06.16b bug fix: POLYHEDRA with faceCenterOffset not saved in state properly; EDGES option nonfunctional Modified Paths: -------------- trunk/Jmol/src/org/jmol/renderspecial/PolyhedraRenderer.java trunk/Jmol/src/org/jmol/script/ScriptEvaluator.java trunk/Jmol/src/org/jmol/shapespecial/Polyhedra.java trunk/Jmol/src/org/jmol/viewer/Jmol.properties Modified: trunk/Jmol/src/org/jmol/renderspecial/PolyhedraRenderer.java =================================================================== --- trunk/Jmol/src/org/jmol/renderspecial/PolyhedraRenderer.java 2013-06-16 23:51:30 UTC (rev 18338) +++ trunk/Jmol/src/org/jmol/renderspecial/PolyhedraRenderer.java 2013-06-16 23:52:10 UTC (rev 18339) @@ -105,11 +105,11 @@ } private void drawCylinderTriangle(int xA, int yA, int zA, int xB, int yB, - int zB, int xC, int yC, int zC) { - - g3d.fillCylinderScreen(GData.ENDCAPS_SPHERICAL, 3, xA, yA, zA, xB, yB, zB); - g3d.fillCylinderScreen(GData.ENDCAPS_SPHERICAL, 3, xB, yB, zB, xC, yC, zC); - g3d.fillCylinderScreen(GData.ENDCAPS_SPHERICAL, 3, xA, yA, zA, xC, yC, zC); + int zB, int xC, int yC, int zC) { + int d = (g3d.isAntialiased() ? 6 : 3); + g3d.fillCylinderScreen(GData.ENDCAPS_SPHERICAL, d, xA, yA, zA, xB, yB, zB); + g3d.fillCylinderScreen(GData.ENDCAPS_SPHERICAL, d, xB, yB, zB, xC, yC, zC); + g3d.fillCylinderScreen(GData.ENDCAPS_SPHERICAL, d, xA, yA, zA, xC, yC, zC); } private void fillFace(short normix, P3i A, P3i B, P3i C) { Modified: trunk/Jmol/src/org/jmol/script/ScriptEvaluator.java =================================================================== --- trunk/Jmol/src/org/jmol/script/ScriptEvaluator.java 2013-06-16 23:51:30 UTC (rev 18338) +++ trunk/Jmol/src/org/jmol/script/ScriptEvaluator.java 2013-06-16 23:52:10 UTC (rev 18339) @@ -16161,7 +16161,7 @@ int lighting = 0; int nAtomSets = 0; sm.loadShape(JC.SHAPE_POLYHEDRA); - setShapeProperty(JC.SHAPE_POLYHEDRA, "init", null); + setShapeProperty(JC.SHAPE_POLYHEDRA, "init", Boolean.TRUE); String setPropertyName = "centers"; String decimalPropertyName = "radius_"; float translucentLevel = Float.MAX_VALUE; @@ -16302,7 +16302,7 @@ translucentLevel, null); if (lighting != 0) setShapeProperty(JC.SHAPE_POLYHEDRA, "token", Integer.valueOf(lighting)); - setShapeProperty(JC.SHAPE_POLYHEDRA, "init", null); + setShapeProperty(JC.SHAPE_POLYHEDRA, "init", Boolean.FALSE); } private void contact() throws ScriptException { Modified: trunk/Jmol/src/org/jmol/shapespecial/Polyhedra.java =================================================================== --- trunk/Jmol/src/org/jmol/shapespecial/Polyhedra.java 2013-06-16 23:51:30 UTC (rev 18338) +++ trunk/Jmol/src/org/jmol/shapespecial/Polyhedra.java 2013-06-16 23:52:10 UTC (rev 18339) @@ -87,8 +87,9 @@ centers = null; bsVertexCount = new BS(); bondedOnly = isCollapsed = iHaveCenterBitSet = false; - drawEdges = EDGES_NONE; haveBitSetVertices = false; + if (Boolean.TRUE == value) + drawEdges = EDGES_NONE; return; } @@ -596,14 +597,12 @@ BS bs = new BS(); for (int i = 0; i < ptCenter; i++) bs.set(((Atom) vertices[i]).getIndex()); - return " polyhedra ({" + centralAtom.getIndex() + "}) " - + (myDistanceFactor == DEFAULT_DISTANCE_FACTOR ? "" - : " distanceFactor " + myDistanceFactor) - + (myFaceCenterOffset == DEFAULT_FACECENTEROFFSET ? "" - : " faceCenterOffset " + myFaceCenterOffset) + " to " - + Escape.eBS(bs) + (collapsed ? " collapsed" : "") - + (isFullyLit ? " fullyLit" : "" ) + ";" - + (visible ? "" : "polyhedra off;") + "\n"; + return " polyhedra ({" + centralAtom.getIndex() + "}) to " + + Escape.eBS(bs) + (collapsed ? " collapsed" : "") + + " distanceFactor " + myDistanceFactor + + " faceCenterOffset " + myFaceCenterOffset + + (isFullyLit ? " fullyLit" : "" ) + ";" + + (visible ? "" : "polyhedra off;") + "\n"; } } Modified: trunk/Jmol/src/org/jmol/viewer/Jmol.properties =================================================================== --- trunk/Jmol/src/org/jmol/viewer/Jmol.properties 2013-06-16 23:51:30 UTC (rev 18338) +++ trunk/Jmol/src/org/jmol/viewer/Jmol.properties 2013-06-16 23:52:10 UTC (rev 18339) @@ -9,7 +9,8 @@ # The quotes above look odd for a parameter file, but they are # important for the JavaScript version of Jmol. -___JmolVersion="13.1.17_dev_2013.06.16" +___JmolVersion="13.1.17_dev_2013.06.16b" +bug fix: POLYHEDRA with faceCenterOffset not saved in state properly; EDGES option nonfunctional new feature: {atomset1}.distance.min({atomset2}) -- returns an array @@ -30,6 +31,9 @@ -- load trajectory ({0 6}) 1cdr.pdb -- animation MORPH 10 -- animation ON + -- load trajectory "test1.pdb" "test2.pdb" + -- animation MORPH 30 + -- animation ON bug fix: draw ARROW ATOM/BOND broken bug fix: draw ARROW with offset disallows set picking draw adjustments This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ha...@us...> - 2013-06-30 07:21:46
|
Revision: 18382 http://sourceforge.net/p/jmol/code/18382 Author: hansonr Date: 2013-06-30 07:21:27 +0000 (Sun, 30 Jun 2013) Log Message: ----------- Tensor Javadoc and code clean-up Modified Paths: -------------- trunk/Jmol/src/org/jmol/adapter/readers/cifpdb/PdbReader.java trunk/Jmol/src/org/jmol/modelset/AtomCollection.java trunk/Jmol/src/org/jmol/shapespecial/Ellipsoids.java trunk/Jmol/src/org/jmol/symmetry/UnitCell.java trunk/Jmol/src/org/jmol/util/Tensor.java Modified: trunk/Jmol/src/org/jmol/adapter/readers/cifpdb/PdbReader.java =================================================================== --- trunk/Jmol/src/org/jmol/adapter/readers/cifpdb/PdbReader.java 2013-06-29 23:32:44 UTC (rev 18381) +++ trunk/Jmol/src/org/jmol/adapter/readers/cifpdb/PdbReader.java 2013-06-30 07:21:27 UTC (rev 18382) @@ -59,6 +59,11 @@ * see http://repo.or.cz/w/gromacs.git/blob/HEAD:/src/gmxlib/pdbio.c line 244 * see http://repo.or.cz/w/gromacs.git/blob/HEAD:/src/gmxlib/pdbio.c line 323 * + * TLS Motion Determination: + * + * J Painter & E A Merritt (2006) Acta Cryst. D62, 439-450 + * http://skuld.bmsc.washington.edu/~tlsmd + * * symmetry added by Bob Hanson: * * setFractionalCoordinates() @@ -1602,21 +1607,19 @@ tensorType, ' ').replace(':', ' '); //System.out.println("Tensor data = " + s); tokens = getTokensStr(s); - float[][] tensor = new float[3][3]; - tlsGroup.put("t" + tensorType, tensor); + float[][] data = new float[3][3]; + tlsGroup.put("t" + tensorType, data); for (int i = 0; i < tokens.length; i++) { int ti = tokens[i].charAt(0) - '1'; int tj = tokens[i].charAt(1) - '1'; - tensor[ti][tj] = parseFloatStr(tokens[++i]); + data[ti][tj] = parseFloatStr(tokens[++i]); if (ti < tj) - tensor[tj][ti] = tensor[ti][tj]; + data[tj][ti] = data[ti][tj]; } for (int i = 0; i < 3; i++) for (int j = 0; j < 3; j++) - if (Float.isNaN(tensor[i][j])) { - tlsAddError("invalid tensor: " + Escape.escapeFloatAA(tensor, false)); - - } + if (Float.isNaN(data[i][j])) + tlsAddError("invalid tensor: " + Escape.escapeFloatAA(data, false)); //System.out.println("Tensor t" + tensorType + " = " + Escape.escape(tensor)); if (tensorType == 'S' && ++iGroup == nGroups) { Logger.info(nGroups + " TLS groups read"); @@ -1632,10 +1635,10 @@ } } if (tlsGroups != null) { - Hashtable<String, Object> groups = new Hashtable<String, Object>(); - groups.put("groupCount", Integer.valueOf(nGroups)); - groups.put("groups", tlsGroups); - vTlsModels.addLast(groups); + Hashtable<String, Object> tlsModel = new Hashtable<String, Object>(); + tlsModel.put("groupCount", Integer.valueOf(nGroups)); + tlsModel.put("groups", tlsGroups); + vTlsModels.addLast(tlsModel); } return (nGroups < 1); } @@ -1648,7 +1651,8 @@ } /** - * sets the atom property property_tlsGroup based on TLS group ranges + * Sets the atom property property_tlsGroup based on TLS group ranges + * and adds "TLS" key to model's auxiliaryInfo. * * @param iGroup * @param iModel @@ -1656,6 +1660,26 @@ */ @SuppressWarnings("unchecked") private void setTlsGroups(int iGroup, int iModel, SymmetryInterface symmetry) { + + // TLS.groupCount Integer + // TLS.groups JmolList of Map + // .id String + // .ranges JmolList of Map + // .chains String + // .residues int[2] + // .origin P3 + // .tT float[3][3] + // .tL float[3][3] + // .tS float[3][3] + // + // ultimately, each atom gets an associated TLS-U and TLS-R org.jmol.util.Tensor + // that can be visualized using + // + // ellipsoid set "TLS-R" + // ellipsoids ON + // + // + Logger.info("TLS model " + (iModel + 1) + " set " + (iGroup + 1)); Map<String, Object> tlsGroupInfo = vTlsModels.get(iGroup); JmolList<Map<String, Object>> groups = ( JmolList<Map<String, Object>>) tlsGroupInfo Modified: trunk/Jmol/src/org/jmol/modelset/AtomCollection.java =================================================================== --- trunk/Jmol/src/org/jmol/modelset/AtomCollection.java 2013-06-29 23:32:44 UTC (rev 18381) +++ trunk/Jmol/src/org/jmol/modelset/AtomCollection.java 2013-06-30 07:21:27 UTC (rev 18382) @@ -168,7 +168,6 @@ return atomTypes; } - public float[] getPartialCharges() { return partialCharges; } @@ -266,20 +265,13 @@ t.atomIndex2 = -1; t.modelIndex = atoms[atomIndex].modelIndex; addTensor(t, t.type); - int pt = "charge temp TLS-R TLS-U".indexOf(t.type + " "); - // 0 7 14 21 - // "1" is assigned for Born Effective Charges and temperature - // "2" is TLS-R - // "3" is TLS-U - // and no more of that! - if (pt >= 0) { - addTensor(t, t.altType = "" + (pt >= 14 ? pt / 7: 1)); - } + if (t.altType != null) + addTensor(t, t.altType); } } public JmolList<Tensor> getAllAtomTensors(String type) { - return atomTensors.get(type); + return atomTensors.get(type.toLowerCase()); } private Tensor[] getTensorList(JmolList<Tensor> list) { @@ -290,7 +282,7 @@ Tensor t = list.get(i); if (t.forThermalEllipsoid) pt = i; - else if (t.type.equals("TLS-U")) + else if (t.iType == Tensor.TYPE_TLS_U) haveTLS = true; } Tensor[] a = new Tensor[(pt >= 0 || !haveTLS ? 0 : 1) + n]; @@ -317,6 +309,7 @@ } private void addTensor(Tensor t, String type) { + type = type.toLowerCase(); JmolList<Tensor> tensors = atomTensors.get(type); if (tensors == null) atomTensors.put(type, tensors = new JmolList<Tensor>()); Modified: trunk/Jmol/src/org/jmol/shapespecial/Ellipsoids.java =================================================================== --- trunk/Jmol/src/org/jmol/shapespecial/Ellipsoids.java 2013-06-29 23:32:44 UTC (rev 18381) +++ trunk/Jmol/src/org/jmol/shapespecial/Ellipsoids.java 2013-06-30 07:21:27 UTC (rev 18382) @@ -194,7 +194,7 @@ } if ("select" == propertyName) { - typeSelected = (String) value; + typeSelected = ((String) value).toLowerCase(); return; } @@ -210,7 +210,7 @@ short colix = C.getColixO(value); byte pid = EnumPalette.pidOf(value); for (Ellipsoid e : atomEllipsoids.values()) - if (e.tensor.type.equals(typeSelected)) { + if (e.tensor.type.equalsIgnoreCase(typeSelected)) { e.colix = getColixI(colix, pid, e.tensor.atomIndex1); e.pid = pid; } @@ -220,7 +220,7 @@ if ("translucency" == propertyName) { boolean isTranslucent = (value.equals("translucent")); for (Ellipsoid e : atomEllipsoids.values()) - if (e.tensor.type.equals(typeSelected)) + if (e.tensor.type.equalsIgnoreCase(typeSelected)) e.colix = C.getColixTranslucent3(e.colix, isTranslucent, translucentLevel); return; Modified: trunk/Jmol/src/org/jmol/symmetry/UnitCell.java =================================================================== --- trunk/Jmol/src/org/jmol/symmetry/UnitCell.java 2013-06-29 23:32:44 UTC (rev 18381) +++ trunk/Jmol/src/org/jmol/symmetry/UnitCell.java 2013-06-30 07:21:27 UTC (rev 18382) @@ -263,8 +263,10 @@ * The coefficients bij (i,j = 1,2,3) of the various types are defined with * the following constant settings. * - * Type 0: Base = e, c = 2, D = 1 Type 1: Base = e, c = 1, D = l Type 2: - * Base = 2, c = 2, D = l Type 3: Base = 2, c = 1, D = l + * Type 0: Base = e, c = 2, D = 1 + * Type 1: Base = e, c = 1, D = l + * Type 2: Base = 2, c = 2, D = l + * Type 3: Base = 2, c = 1, D = l * * Anisotropic temperature factor Types 4, 5, 8, and 9 use the following * formula for the complete temperature factor, in which a1* , a2*, a3* are @@ -276,7 +278,9 @@ * The coefficients Uij (i,j = 1,2,3) of the various types are defined with * the following constant settings. * - * Type 4: C = 2, D = 1/4 Type 5: C = 1, D = 1/4 Type 8: C = 2, D = 2pi2 + * Type 4: C = 2, D = 1/4 + * Type 5: C = 1, D = 1/4 + * Type 8: C = 2, D = 2pi2 * Type 9: C = 1, D = 2pi2 * * Modified: trunk/Jmol/src/org/jmol/util/Tensor.java =================================================================== --- trunk/Jmol/src/org/jmol/util/Tensor.java 2013-06-29 23:32:44 UTC (rev 18381) +++ trunk/Jmol/src/org/jmol/util/Tensor.java 2013-06-30 07:21:27 UTC (rev 18382) @@ -27,55 +27,110 @@ import java.util.Arrays; import java.util.Comparator; +/** + * @author Bob Hanson ha...@st... 6/30/2013 + * + */ public class Tensor { - private static float TEMPERATURE_FACTOR = (float) (Math.sqrt(0.5) / Math.PI); + // factors that give reasonable first views of ellipsoids. + + private static final float TEMPERATURE_FACTOR = (float) (Math.sqrt(0.5) / Math.PI); private static final float MAGNETIC_SUSCEPTIBILITY_FACTOR = 0.01f; + private static final float ELECTRIC_FIELD_GRADIENT_FACTOR = 1f; private static final float BORN_EFFECTIVE_CHARGE_FACTOR = 1f; private static final float INTERACTION_FACTOR = 0.04f; + + private static TensorSort tSort; // used for sorting eigenvector/values - private static TensorSort tSort; + // base data: + + public String type; + public int iType = TYPE_OTHER; + + // type is an identifier that the reader/creator delivers: + // + // temp -- crystallographic displacement parameters + // - "temperature factors"; t.forThermalEllipsoid = true + // - either anisotropic (ADP) or isotropic (IDP) + // iso -- isotropic displacement parameters; from org.jmol.symmetry.UnitCell + // - changed to "temp" after setting t.isIsotropic = true + // ms -- magnetic susceptibility + // isc -- NMR interaction tensors + // - will have both atomIndex1 and atomIndex2 defined when + // - incorporated into a model + // charge -- Born Effective Charge tensor + // TLS-U -- Translation/Libration/Skew tensor (anisotropic) + // TLS-R -- Translation/Libration/Skew tensor (residual) + + private static final String KNOWN_TYPES = ";iso....;temp...;tls-u..;tls-r..;ms.....;efg....;isc....;charge.;"; + private static int getType(String type) { + int pt = KNOWN_TYPES.indexOf(";" + type.toLowerCase() + "."); + return (pt < 0 ? TYPE_OTHER : pt / 8); + } - private double[][] asymmetricTensor; - + // these may be augmented, but the order should be kept the same within this list - public String type; // iso temp ms isc charge TLS-R TLS-U... + public static final int TYPE_OTHER = -1; + public static final int TYPE_ISO = 0; + public static final int TYPE_TEMP = 1; + public static final int TYPE_TLS_U = 2; + public static final int TYPE_TLS_R = 3; + public static final int TYPE_MS = 4; + public static final int TYPE_EFG = 5; + public static final int TYPE_ISC = 6; + public static final int TYPE_CHARGE = 7; + + public double[][] asymTensor; + public double[][] symTensor; + public V3[] eigenVectors; + public float[] eigenValues; + + // derived type-based information, Jmol-centric, for rendering: + public String altType; // "0" "1" "2" - public float typeFactor = 1; + // altType is somewhat of a legacy - just lets you use + + // ellipsoid SET 1 + // ellipsoid SET 2 + // etc... + + public boolean isIsotropic; // just rendered as balls, not special features + public boolean forThermalEllipsoid; + public int eigenSignMask = 7; // signs of eigenvalues; bits 2,1,0 set to 1 if > 0 + private float typeFactor = 1; // an ellipsoid scaling factor depending upon type + + // added only after passing + // the tensor to ModelLoader: + public int modelIndex; public int atomIndex1 = -1; public int atomIndex2 = -1; - public V3[] eigenVectors; // possibly null (isotropic) - public float[] eigenValues; - - public boolean forThermalEllipsoid = true; - public int eigenSignMask = 7; - public boolean isIsotropic; - public static Tensor copyTensor(Tensor t0) { Tensor t = new Tensor(); + t.setType(t0.type); t.eigenValues = t0.eigenValues; t.eigenVectors = t0.eigenVectors; - t.asymmetricTensor = t0.asymmetricTensor; - t.type = t0.type; - t.typeFactor = t0.typeFactor; + t.asymTensor = t0.asymTensor; + t.symTensor = t0.symTensor; + t.eigenSignMask = t0.eigenSignMask; + t.modelIndex = t0.modelIndex; + t.atomIndex1 = t0.atomIndex1; + t.atomIndex2 = t0.atomIndex2; return t; } - - public double[][] getAsymmetricTensor() { - return asymmetricTensor; - } - /** - * all instantiation must go through one of the static getTensor... methods + * private constructor so that all instantiation must go through one + * of the static getTensor... methods to set fields properly. * */ private Tensor() {} /** + * Standard constructor for QM tensors * * @param asymmetricTensor * @param type @@ -127,10 +182,19 @@ float[] values = new float[3]; eigen.fillArrays(vectors, values); Tensor t = newTensorType(vectors, values, type); - t.asymmetricTensor = asymmetricTensor; + t.asymTensor = asymmetricTensor; + t.symTensor = a; return t; } + /** + * Standard constructor for charge and iso + * + * @param eigenVectors + * @param eigenValues + * @param type + * @return Tensor + */ public static Tensor getTensorFromEigenVectors(V3[] eigenVectors, float[] eigenValues, String type) { float[] values = new float[3]; @@ -139,11 +203,15 @@ vectors[i] = V3.newV(eigenVectors[i]); values[i] = eigenValues[i]; } - Tensor t = newTensorType(vectors, values, type); - t.isIsotropic = "iso".equals(type); - return t; + return newTensorType(vectors, values, type); } + /** + * Standard constructor for ellipsoids based on axes + * + * @param axes + * @return Tensor + */ public static Tensor getTensorFromAxes(V3[] axes) { Tensor t = new Tensor(); t.eigenValues = new float[3]; @@ -160,30 +228,76 @@ || Math.abs(t.eigenVectors[2].dot(t.eigenVectors[0])) > 0.0001f) return null; sort(t.eigenVectors, t.eigenValues); - return t; + return t.setType("other"); } - public static Tensor getTensorFromThermalEquation(double[] coef) { + /** + * standard constructor for thermal ellipsoids convention beta + * (see http://www.iucr.org/iucr-top/comm/cnom/adp/finrepone/finrepone.html) + * + * @param coefs + * @return Tensor + */ + public static Tensor getTensorFromThermalEquation(double[] coefs) { Tensor t = new Tensor(); t.eigenValues = new float[3]; t.eigenVectors = new V3[3]; // assumes an ellipsoid centered on 0,0,0 - // called by UnitCell for the initial creation of Object[] ellipsoid + // called by UnitCell for the initial creation from PDB/CIF ADP data double[][] mat = new double[3][3]; - mat[0][0] = coef[0]; //XX - mat[1][1] = coef[1]; //YY - mat[2][2] = coef[2]; //ZZ - mat[0][1] = mat[1][0] = coef[3] / 2; //XY - mat[0][2] = mat[2][0] = coef[4] / 2; //XZ - mat[1][2] = mat[2][1] = coef[5] / 2; //YZ + mat[0][0] = coefs[0]; //XX + mat[1][1] = coefs[1]; //YY + mat[2][2] = coefs[2]; //ZZ + mat[0][1] = mat[1][0] = coefs[3] / 2; //XY + mat[0][2] = mat[2][0] = coefs[4] / 2; //XZ + mat[1][2] = mat[2][1] = coefs[5] / 2; //YZ Eigen.getUnitVectors(mat, t.eigenVectors, t.eigenValues); sort(t.eigenVectors, t.eigenValues); t.typeFactor = TEMPERATURE_FACTOR; - t.type = "temp"; - t.setTypeFactor(); - return t; + return t.setType("temp"); } + /** + * Note that type may be null here to skip type initialization + * and allow later setting of type; this should be used with care. + * + * @param type + * @return "this" for convenience only + */ + public Tensor setType(String type) { + if (this.type == null || type == null) + this.type = type; + if (type != null) + processType(); + return this; + } + + /** + * Returns a factored eigenvalue; thermal ellipsoids use sqrt(abs(eigenvalue)) for + * ellipsoid axes; others use just use abs(eigenvalue); all cases get factored by + * typeFactor + * + * @param i + * @return factored eigenvalue + */ + public float getFactoredValue(int i) { + float f = Math.abs(eigenValues[i]); + return (forThermalEllipsoid ? (float) Math.sqrt(f) : f) * typeFactor; + } + + public void setAtomIndexes(int index1, int index2) { + atomIndex1 = index1; + atomIndex2 = index2; + } + + /** + * common processing of eigenvectors. + * + * @param vectors + * @param values + * @param type + * @return Tensor + */ private static Tensor newTensorType(V3[] vectors, float[] values, String type) { Tensor t = new Tensor(); t.eigenValues = values; @@ -197,62 +311,64 @@ return t; } - private void setTypeFactor() { + /** + * Sets typeFactor, altType, isIsotropic, forThermalEllipsoid; + * type "iso" changed to "temp" here. + * + */ + private void processType() { + forThermalEllipsoid = false; - switch ("iso temp ms isc chargeTLS-UTLS-R".indexOf(type)) { - // 0 5 10 15 20 25 30 - default: // TLS, other - typeFactor = 1; - break; - case 0: // iso + isIsotropic = false; + altType = null; + typeFactor = 1; + + switch (iType = getType(type)) { + case TYPE_ISO: forThermalEllipsoid = true; - typeFactor = 1; + isIsotropic = true; + altType = "1"; + type = "temp"; break; - case 5: // temp + case TYPE_TEMP: forThermalEllipsoid = true; typeFactor = TEMPERATURE_FACTOR; + altType = "1"; break; - case 10: // ms + case TYPE_MS: typeFactor = MAGNETIC_SUSCEPTIBILITY_FACTOR; break; - case 15: // isc + case TYPE_EFG: + typeFactor = ELECTRIC_FIELD_GRADIENT_FACTOR; + break; + case TYPE_ISC: typeFactor = INTERACTION_FACTOR; break; - case 20: // charge + case TYPE_CHARGE: typeFactor = BORN_EFFECTIVE_CHARGE_FACTOR; break; + case TYPE_TLS_R: + altType = "2"; + break; + case TYPE_TLS_U: + altType = "3"; + break; } } - public Tensor setType(String type) { - if (this.type == null || type == null) - this.type = type; - setTypeFactor(); - return this; - } - - public float getFactoredValue(int i) { - float f = Math.abs(eigenValues[i]); - return (forThermalEllipsoid ? (float) Math.sqrt(f) : f) * typeFactor; - } - - public void setAtomIndexes(int index1, int index2) { - atomIndex1 = index1; - atomIndex2 = index2; - } - private static int[] sortOrder = { 1, 0, 2 }; /** - * sorts EigenVectors by + * sorts EigenVectors by * + * |sigma_3 - sigma_iso| >= |sigma_1 - sigma_iso| >= |sigma_2 - sigma_iso| + * * and normalize the eigenVectors * * @param eigenVectors * @param eigenValues */ private static void sort(V3[] eigenVectors, float[] eigenValues) { - // |sigma_3 - sigma_iso| >= |sigma_1 - sigma_iso| >= |sigma_2 - sigma_iso| // first sorted 3 2 1, then 1 and 2 are switched using the sortOrder above. Object[][] o = new Object[][] { new Object[] { eigenVectors[0], Float.valueOf(eigenValues[0]) }, This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ha...@us...> - 2014-02-26 20:04:46
|
Revision: 19393 http://sourceforge.net/p/jmol/code/19393 Author: hansonr Date: 2014-02-26 20:04:40 +0000 (Wed, 26 Feb 2014) Log Message: ----------- ___JmolVersion="14.1.11_2014.02.26" bug fix: Jmol math fix for new . notation. -- needs testing -- examples: -- note that .. notatino works with numbers and in all expressions b = [1 2 3 [ 1 2 [1 2 [1 [testing:"here"] 3]]]] print b..4..3..1 b..2 = 34 b..2..1 = 33 print b..2..1 -- alternative single dot notation also on both sides -- associative arrays only b = [testing:"here"] b.testing= 33 print b.testing -- note that sequential brackets for arrays work only on the left side of an assignment b = [ [2] 10 11 ] b[1][2]= 33 #NOT print b[1][2] (that's a range) b = [1 2 3 [ 1 2 [1 2 [1 [testing:"here"] 3]]]] b[4][3][3][2].more = "yes" #NOT print b[4][3] (that's a range) -- extends to matrices b = quaternion()%"matrix" b[1] = [1 2 3] b[-1] = [1 2 3] b[2][3] = 2 -- extends to string b = "testing" b[1] = "T" b[1][3] = "T" b["t"] = "T" -- extends to points p = {3 3 3} p.x = 10 p.y = 5 p.z = 3 -- extends to bitsets a = {*} a.color = "red" a.property_x = {*}.temperature.all Modified Paths: -------------- trunk/Jmol/src/org/jmol/script/SV.java trunk/Jmol/src/org/jmol/script/ScriptCompiler.java trunk/Jmol/src/org/jmol/script/ScriptEvaluator.java trunk/Jmol/src/org/jmol/script/ScriptMathProcessor.java trunk/Jmol/src/org/jmol/scriptext/ScriptExt.java trunk/Jmol/src/org/jmol/viewer/Jmol.properties Modified: trunk/Jmol/src/org/jmol/script/SV.java =================================================================== --- trunk/Jmol/src/org/jmol/script/SV.java 2014-02-26 03:18:42 UTC (rev 19392) +++ trunk/Jmol/src/org/jmol/script/SV.java 2014-02-26 20:04:40 UTC (rev 19393) @@ -978,9 +978,9 @@ case matrix3f: case matrix4f: len = (tok == matrix3f ? 3 : 4); - if (pt1 > 10) { - int col = pt1; - int row = pt2; + if (pt2 != Integer.MAX_VALUE) { + int col = pt2; + int row = pt1; if (col > 0 && col <= len && row <= len) { if (tok == matrix3f) ((M3) value).setElement(row - 1, col - 1, fValue(var)); @@ -1023,7 +1023,7 @@ if (pt2 == Integer.MAX_VALUE){ pt2 = pt1; } else { - if (pt2 <= 0) + if (--pt2 < 0) pt2 = pt + pt2; while (pt2 >= str.length()) str += " "; @@ -1031,6 +1031,7 @@ if (pt2 >= pt1) value = str.substring(0, pt1) + sValue(var) + str.substring(++pt2); + intValue = index = Integer.MAX_VALUE; break; case varray: len = getList().size(); @@ -1178,11 +1179,6 @@ return sb.toString(); } - @Override - public String toString() { - return toString2() + "[" + myName + " index =" + index + " intValue=" + intValue + "]"; - } - @SuppressWarnings("unchecked") public static BS getBitSet(SV x, boolean allowNull) { switch (x.tok) { @@ -1457,4 +1453,10 @@ return null; } + @Override + public String toString() { + return toString2() + "[" + myName + " index =" + index + " intValue=" + intValue + "]"; + } + + } Modified: trunk/Jmol/src/org/jmol/script/ScriptCompiler.java =================================================================== --- trunk/Jmol/src/org/jmol/script/ScriptCompiler.java 2014-02-26 03:18:42 UTC (rev 19392) +++ trunk/Jmol/src/org/jmol/script/ScriptCompiler.java 2014-02-26 20:04:40 UTC (rev 19393) @@ -294,6 +294,7 @@ iBrace = 0; braceCount = 0; parenCount = 0; + isDotDot= false; ptSemi = -10; cchToken = 0; lnLength = 8; @@ -365,7 +366,7 @@ || errorStr(ERROR_missingEnd, T.nameOf(flowContext.token.tok))); } - if (nTokens > 0) { + if (nTokens > 0 && !isDotDot) { switch (checkSpecialParameterSyntax()) { case CONTINUE: continue; @@ -627,7 +628,7 @@ } if (wasImpliedScript()) return CONTINUE; - if (isNewSet && nTokens > 72 && tokAt(2) == T.per + if (isNewSet && nTokens > 2 && tokAt(2) == T.per && (tokAt(3) == T.sort || tokAt(3) == T.reverse || tokAt(3) == T.push || tokAt(3) == T.pop)) { // check for x.sort or x.reverse or a.push(xxx) // x.sort / x.reverse ==> x = x.sort / x = x.reverse @@ -1859,7 +1860,8 @@ bracketCount = 0; setEqualPt = Integer.MAX_VALUE; ptNewSetModifier = (isNewSet ? (ident.equals("(") ? 2 : 1) : Integer.MAX_VALUE); - return ((isSetBrace || theToken.tok == T.plusPlus || theToken.tok == T.minusMinus)? theToken : T.o(T.identifier, ident)); + // unfortunately we have to look here for defaultLattice, because it must not turn into a string. + return ((isSetBrace || theToken.tok == T.defaultlattice || theToken.tok == T.plusPlus || theToken.tok == T.minusMinus)? theToken : T.o(T.identifier, ident)); } private void checkUnquotedFileName() { @@ -2567,7 +2569,7 @@ return Integer.MAX_VALUE; cchToken = ichT - ichToken; try { - int val = Integer.parseInt(script.substring(ichToken, ichT)); + int val = Integer.parseInt(ident = script.substring(ichToken, ichT)); return val; } catch (NumberFormatException e) { // ignore @@ -2707,7 +2709,7 @@ tokLastMath = 1; break; default: - if (!Character.isLetter(ch)) + if (!Character.isLetter(ch) && !isDotDot) return false; //$FALL-THROUGH$ case '~': Modified: trunk/Jmol/src/org/jmol/script/ScriptEvaluator.java =================================================================== --- trunk/Jmol/src/org/jmol/script/ScriptEvaluator.java 2014-02-26 03:18:42 UTC (rev 19392) +++ trunk/Jmol/src/org/jmol/script/ScriptEvaluator.java 2014-02-26 20:04:40 UTC (rev 19393) @@ -747,20 +747,24 @@ private List<SV> parameterExpressionList(int pt, int ptAtom, boolean isArrayItem) throws ScriptException { + + // isArrayItem will be true for centerParameter with $id[n] + // in which case pt will be negative + return (List<SV>) parameterExpression(pt, -1, null, true, true, ptAtom, - isArrayItem, null, null); + isArrayItem, null, null, false); } private String parameterExpressionString(int pt, int ptMax) throws ScriptException { return (String) parameterExpression(pt, ptMax, "", true, false, -1, false, - null, null); + null, null, false); } private boolean parameterExpressionBoolean(int pt, int ptMax) throws ScriptException { return ((Boolean) parameterExpression(pt, ptMax, null, true, false, -1, - false, null, null)).booleanValue(); + false, null, null, false)).booleanValue(); } private SV parameterExpressionToken(int pt) throws ScriptException { @@ -775,14 +779,14 @@ * also uses the RPN class.] * * @param pt - * token index in statement start of expression + * token index in statement start of expression or negative for one + * expression only. * @param ptMax * token index in statement end of expression * @param key * variable name for debugging reference only -- null indicates return * Boolean -- "" indicates return String * @param ignoreComma - * * @param asVector * a flag passed on to RPN; * @param ptAtom @@ -794,6 +798,7 @@ * variables * @param localVar * x or y in above for(), select() examples + * @param isAssignment TODO * @return either a vector or a value, caller's choice. * @throws ScriptException * errors are thrown directly to the Eval error system. @@ -801,7 +806,7 @@ private Object parameterExpression(int pt, int ptMax, String key, boolean ignoreComma, boolean asVector, int ptAtom, boolean isArrayItem, - Map<String, SV> localVars, String localVar) + Map<String, SV> localVars, String localVar, boolean isAssignment) throws ScriptException { /* @@ -821,20 +826,21 @@ boolean isOneExpressionOnly = (pt < 0); boolean returnBoolean = (!asVector && key == null); boolean returnString = (!asVector && key != null && key.length() == 0); - int nSquare = 0; if (isOneExpressionOnly) pt = -pt; + int nSquare = 0; int nParen = 0; - ScriptMathProcessor rpn = new ScriptMathProcessor(this, isArrayItem, - asVector, false); - if (pt == 0 && ptMax == 0) // set command with v[...] = .... - pt = 2; + boolean topLevel = true; + ScriptMathProcessor rpn = new ScriptMathProcessor(this, isAssignment, isArrayItem, asVector, + false); if (ptMax < pt) ptMax = slen; + int ptEq = (isAssignment ? 0 : 1); out: for (int i = pt; i < ptMax; i++) { v = null; int tok = getToken(i).tok; if (isImplicitAtomProperty && tokAt(i + 1) != T.per) { + // local variable definition SV token = (localVars != null && localVars.containsKey(theToken.value) ? null : getBitsetPropertySelector(i, false, false)); if (token != null) { @@ -853,14 +859,15 @@ switch (tok) { case T.rightsquare: case T.rightbrace: - if (!ignoreComma && nParen == 0 && nSquare == 0) + if (!ignoreComma && topLevel) + // end of an associative array break out; if (tok == T.rightbrace) invArg(); - break; + if (isAssignment && nSquare == 1 && tokAt(i + 1) == T.opEQ) + isAssignment = rpn.endAssignment(); } - int ptEq = (isArrayItem && !isOneExpressionOnly ? 0 : 1); switch (tok) { case T.define: // @{@x} or @{@{x}} or @{@1} -- also userFunction(@1) @@ -881,7 +888,7 @@ if (localVars == null) localVars = new Hashtable<String, SV>(); res = parameterExpression(++i, -1, null, ignoreComma, false, -1, false, - localVars, localVar); + localVars, localVar, isAssignment); boolean TF = ((Boolean) res).booleanValue(); int iT = iToken; if (getToken(iT++).tok != T.semicolon) @@ -891,12 +898,12 @@ if (tokAt(iF++) != T.semicolon) invArg(); parameterExpression(-iF, -1, null, ignoreComma, false, 1, false, - localVars, localVar); + localVars, localVar, isAssignment); int iEnd = iToken; if (tokAt(iEnd) != T.rightparen) invArg(); v = parameterExpression(TF ? iT : iF, TF ? iF : iEnd, "XXX", - ignoreComma, false, 1, false, localVars, localVar); + ignoreComma, false, 1, false, localVars, localVar, isAssignment); i = iEnd; break; case T.forcmd: @@ -970,7 +977,7 @@ t.index = j; res = parameterExpression(i, pt2, (isFor ? "XXX" : null), ignoreComma, isFor, j, false, localVars, isFunctionOfX ? null - : dummy); + : dummy, isAssignment); if (isFor) { if (res == null || ((List<?>) res).size() == 0) invArg(); @@ -1087,17 +1094,19 @@ i++; break out; case T.comma: // ignore commas - if (!ignoreComma && nParen == 0 && nSquare == 0) + if (!ignoreComma && topLevel) break out; if (!rpn.addOp(theToken)) invArg(); break; case T.perper: case T.per: - if (ptEq == 0 && nParen == 0 && tokAt(i + 1) != T.nada) { - if (tokAt(i + 1) == T.nada) - invArg(); + if (isAssignment && topLevel && tokAt(i + 2) == T.opEQ) + isAssignment = rpn.endAssignment(); + if (ptEq == 0 && topLevel) { switch (tokAt(i + 1)) { + case T.nada: + break; //?? or invArg?? case T.size: case T.keys: case T.type: @@ -1163,29 +1172,38 @@ } switch (theTok) { case T.opEQ: - if (nParen == 0) + if (topLevel) ptEq = i; break; case T.leftparen: nParen++; + topLevel = false; break; case T.rightparen: - if (--nParen <= 0 && nSquare == 0 && isOneExpressionOnly) { - iToken++; - break out; + if (--nParen <= 0 && nSquare == 0) { + if (isOneExpressionOnly) { + iToken++; + break out; + } + topLevel = true; } break; case T.leftsquare: nSquare++; + topLevel = false; break; case T.rightsquare: - if (--nSquare == 0 && nParen == 0 && isOneExpressionOnly) { - iToken++; - break out; + if (--nSquare == 0 && nParen == 0) { + if (isOneExpressionOnly) { + iToken++; + break out; + } + topLevel = true; } break; } } else { + // must be a variable name // first check to see if the variable has been defined already String name = parameterAsString(i).toLowerCase(); boolean haveParens = (tokAt(i + 1) == T.leftparen); @@ -1293,8 +1311,9 @@ String key = optParameterAsString(i++); if (tokAt(i++) != T.colon) invArg(); + // look to end of array or next comma List<SV> v = (List<SV>) parameterExpression(i, 0, null, false, true, -1, - false, null, null); + false, null, null, false); ht.put(key, v.get(0)); i = iToken; if (tokAt(i) != T.comma) @@ -2089,16 +2108,9 @@ return Integer.valueOf(modelIndex < 0 ? 0 : viewer .getModelFileNumber(modelIndex)); } - return SV.nValue((SV) getVariableOrParameter(var, false)); + return SV.nValue((SV) getParameter(var, T.variable)); } - public Object getVariableOrParameter(String var, boolean isEscaped) { - SV v = getContextVariableAsVariable(var); - if (v == null) - v = SV.getVariable(viewer.getParameter(var)); - return (isEscaped ? v.escape() : v); - } - public SV getContextVariableAsVariable(String var) { if (var.equals("expressionBegin")) return null; @@ -3546,7 +3558,7 @@ tempStatement = st; st = code; } - ScriptMathProcessor rpn = new ScriptMathProcessor(this, false, false, + ScriptMathProcessor rpn = new ScriptMathProcessor(this, false, false, false, mustBeBitSet); Object val; int comparisonValue = Integer.MAX_VALUE; @@ -11134,34 +11146,7 @@ } if (!justShow) { - int tok2 = (tokAt(1) == T.expressionBegin ? 0 : tokAt(2)); - int setType = st[0].intValue; - // recasted by compiler: - // var c.xxx = - // c.xxx = - // {...}[n].xxx = - // not supported: - // a[...][...].xxx = - // var a[...][...].xxx = - - int pt = (tok2 == T.opEQ ? 3 - // set x = ... - : setType == '=' && !key.equals("return") && tok2 != T.opEQ ? 0 - // {c}.xxx = - // {...}.xxx = - // {{...}[n]}.xxx = - : 2 - // var a[...].xxx = - // a[...].xxx = - // var c = ... - // var c = [ - // c = [ - // c = ... - // set x ... - // a[...] = - ); - - setVariable(pt, 0, key, (setType == '[')); + setVariable(1, 0, key, true); if (!isJmolSet) return; } @@ -11743,200 +11728,152 @@ * @param key * the variable name to save the result in. This must be a standard * user variable, either local or global - * @param isArrayItem - * indicates the context a[xxxx] = yyyyy and that the stack will - * contain the variable name and array pointer when it returns + * @param isSet + * from Set ... or Var .... or just xxx .... + * * @return a variable or null * @throws ScriptException */ @SuppressWarnings("unchecked") - private SV setVariable(int pt, int ptMax, String key, boolean isArrayItem) + private SV setVariable(int pt, int ptMax, String key, boolean isSet) throws ScriptException { BS bs = null; String propertyName = ""; - int tokProperty = T.nada; - boolean settingProperty = false; - boolean isExpression = false; boolean settingData = key.startsWith("property_"); boolean isThrown = key.equals("thrown_value"); - boolean isNull = key.equals("all"); - SV t = (settingData || isNull ? null : getContextVariableAsVariable(key)); - boolean isUserVariable = (t != null); - if (pt > 0 && tokAt(pt - 1) == T.expressionBegin) { - bs = atomExpressionAt(pt - 1); - pt = iToken + 1; - isExpression = true; - } - if (tokAt(pt) == T.per) { - SV token = getBitsetPropertySelector(++pt, true, isExpression); - if (token == null) - invArg(); - switch (tokAt(pt + 1)) { + boolean isExpression = (tokAt(1) == T.expressionBegin); + // boolean isNull = key.equals("all"); + + SV t = (settingData ? null : getContextVariableAsVariable(key)); + + // determine whether this is some sort of special assignment + // of a known variable + if (isSet && !isExpression) { + // pt will be 1 unless... + switch (tokAt(2)) { + case T.spacebeforesquare: + case T.leftsquare: + if (st[0].intValue == '=') + pt = 2; + break; case T.per: case T.perper: - case T.leftsquare: - //xxx.y.z... - isArrayItem = true; - pt--; break; case T.opEQ: - pt += 2; - settingProperty = true; - tokProperty = token.intValue; - propertyName = (String) token.value; + // var a = ... + pt = 3; break; default: - invArg(); + // a = ... + // set a ... + pt = 2; + break; } + if (pt == 1) + key = null; } - if (isExpression && !settingProperty) - invArg(); + List<SV> v = (List<SV>) parameterExpression(pt, ptMax, key, true, true, -1, + false, null, null, isSet && pt == 1); - // get value - - List<SV> v = (List<SV>) parameterExpression(pt, ptMax, key, true, true, -1, - isArrayItem, null, null); - if (isNull) - return null; int nv = v.size(); - if (nv == 0 || !isArrayItem && nv > 1 || isArrayItem - && (nv < 3 || nv % 2 != 1)) + if (nv == 0) invArg(); if (chk) return null; - // x[3][4] = ?? - SV tv = v.get(isArrayItem ? v.size() - 1 : 0); + SV tv = SV.newS("").setv(v.get(nv - 1)); + if (nv > 1) { + SV sel = (nv > 2 ? v.get(1) : null); + t = v.get(0); + // -- hash, key, value + // -- array, index, value + // -- string, index, value + // -- matrix, index/index, value + // -- bitset, property, value + boolean selectOne = false; + switch (t.tok) { + case T.hash: + case T.context: + t.mapPut(sel.asString(), tv); + break; + case T.varray: + t = SV.selectItemVar(t); + if (sel == null) { + t.setv(tv); + break; + } + selectOne = true; + break; + case T.string: + if (sel.tok != T.integer) { + // stringVar["t"] = ..... + t.value = PT.rep(t.asString(), sel.asString(), tv.asString()); + t.intValue = Integer.MAX_VALUE; + break; + } + //$FALL-THROUGH$ + case T.matrix3f: + case T.matrix4f: + if (t.intValue == Integer.MAX_VALUE) + selectOne = true; + else + t.setSelectedValue(t.intValue, sel.asInt(), tv); + break; + case T.point3f: + P3 p = (P3) t.value; + float f = tv.asFloat(); + switch (T.getTokFromName(sel.asString())) { + case T.x: + p.x = f; + break; + case T.y: + p.y = f; + break; + case T.z: + p.z = f; + break; + } + break; + case T.bitset: + propertyName = sel.asString(); + bs = SV.getBitSet(t, true); + int nAtoms = viewer.getAtomCount(); + int nbs = bs.cardinality(); + if (propertyName.startsWith("property_")) { + Object obj = (tv.tok == T.varray ? SV.flistValue(tv, tv.getList() + .size() == nbs ? nbs : nAtoms) : tv.asString()); + viewer.setData( + propertyName, + new Object[] { propertyName, obj, BSUtil.copy(bs), + Integer.valueOf(tv.tok == T.varray ? 1 : 0) }, nAtoms, 0, 0, + tv.tok == T.varray ? Integer.MAX_VALUE : Integer.MIN_VALUE, 0); + break; + } + setBitsetProperty(bs, T.getTokFromName(propertyName), tv.asInt(), + tv.asFloat(), tv); + } + if (selectOne) + t.setSelectedValue(sel.intValue, Integer.MAX_VALUE, tv); + return null; + } + + // -- simple assignment; single value only + // create user variable if needed for list now, so we can do the copying + // no variable needed if it's a String, integer, float, or boolean. - boolean needVariable = (!isUserVariable && !isExpression && !settingData && (isArrayItem - || settingProperty || isThrown || !(tv.value instanceof String - || tv.tok == T.integer || tv.value instanceof Integer + boolean needVariable = (!settingData && t == null && (isThrown || !(tv.value instanceof String + || tv.tok == T.integer + || tv.value instanceof Integer || tv.value instanceof Float || tv.value instanceof Boolean))); if (needVariable) { if (key.startsWith("_") - || (t = viewer.getOrSetNewVariable(key, !isArrayItem)) == null) + || (t = viewer.getOrSetNewVariable(key, true)) == null) errorStr(ERROR_invalidArgument, key); - isUserVariable = true; } - if (isArrayItem) { - SV tnew = SV.newS("").setv(tv); - int nParam = v.size() / 2; - for (int i = 0; i < nParam; i++) { - boolean isLast = (i + 1 == nParam); - SV vv = v.get(i * 2); - // stack is selector [ selector [ selector [ ... VALUE - if (t.tok == T.bitset) { - t.tok = T.hash; - t.value = new Hashtable<String, SV>(); - } - switch (t.tok) { - case T.context: - case T.hash: - String hkey = vv.asString(); - if (isLast) { - t.mapPut(hkey, tnew); - break; - } - t = t.mapValue(hkey); - break; - default: - int ipt = vv.asInt(); - // in the case of for (x in y) where y is an array, we need to select the item before continuing - if (t.tok == T.varray) - t = SV.selectItemVar(t); - switch (t.tok) { - case T.varray: - List<SV> list = t.getList(); - if (ipt > list.size() || isLast) - break; - if (ipt <= 0) - ipt = list.size() + ipt; - if (--ipt < 0) - ipt = 0; - t = list.get(ipt); - continue; - case T.matrix3f: - case T.matrix4f: - // check for row/column replacement - int dim = (t.tok == T.matrix3f ? 3 : 4); - if (nParam == 1 && Math.abs(ipt) >= 1 && Math.abs(ipt) <= dim - && tnew.tok == T.varray && tnew.getList().size() == dim) - break; - if (nParam == 2) { - int ipt2 = v.get(2).asInt(); - if (ipt2 >= 1 && ipt2 <= dim - && (tnew.tok == T.integer || tnew.tok == T.decimal)) { - i++; - t.setSelectedValue(ipt, ipt2, tnew); - break; - } - } - // change to an array and continue; - t.toArray(); - --i; - continue; - case T.string: - // check for a["t"] = xxx - if (vv.tok == T.string) { - t.value = PT.rep((String) t.value, (String) vv.value, - tnew.asString()); - continue; - } - if (nParam == 2) { - int ipt2 = v.get(2).asInt(); - t.setSelectedValue(ipt, ipt2, tnew); - i++; - continue; - } - break; - } - t.setSelectedValue(ipt, Integer.MAX_VALUE, tnew); - nParam = 0; - break; - } - } - return t; - } - if (settingProperty) { - if (!isExpression) { - switch (t.tok) { - case T.hash: - case T.context: - if (viewer.allowArrayDotNotation) { - t.mapPut(propertyName, tv); - return null; - } - //$FALL-THROUGH$ - default: - bs = SV.getBitSet(t, true); - if (bs == null) - invArg(); - } - } - if (propertyName.startsWith("property_")) { - viewer - .setData( - propertyName, - new Object[] { - propertyName, - (tv.tok == T.varray ? SV.flistValue( - tv, - ((List<?>) tv.value).size() == bs.cardinality() ? bs - .cardinality() : viewer.getAtomCount()) : tv - .asString()), BSUtil.copy(bs), - Integer.valueOf(tv.tok == T.varray ? 1 : 0) }, viewer - .getAtomCount(), 0, 0, - tv.tok == T.varray ? Integer.MAX_VALUE : Integer.MIN_VALUE, 0); - return null; - } - setBitsetProperty(bs, tokProperty, tv.asInt(), tv.asFloat(), tv); - return null; - } - - if (isUserVariable) { + if (t != null) { t.setv(tv); t.setModified(true); return t; @@ -11944,9 +11881,10 @@ Object vv = SV.oValue(tv); - if (key.startsWith("property_")) { + if (settingData) { if (tv.tok == T.varray) vv = tv.asString(); + // very inefficient! viewer.setData(key, new Object[] { key, "" + vv, BSUtil.copy(viewer.getSelectedAtoms()), Integer.valueOf(0) }, viewer.getAtomCount(), 0, 0, @@ -11962,10 +11900,6 @@ setFloatProperty(key, ((Float) vv).floatValue()); } else if (vv instanceof String) { setStringProperty(key, (String) vv); - } else if (vv instanceof BondSet) { - setStringProperty(key, Escape.eBond((BS) vv)); - } else if (vv instanceof BS || vv instanceof P3 || vv instanceof P4) { - setStringProperty(key, Escape.e(vv)); } else { Logger.error("ERROR -- return from propertyExpression was " + vv); } Modified: trunk/Jmol/src/org/jmol/script/ScriptMathProcessor.java =================================================================== --- trunk/Jmol/src/org/jmol/script/ScriptMathProcessor.java 2014-02-26 03:18:42 UTC (rev 19392) +++ trunk/Jmol/src/org/jmol/script/ScriptMathProcessor.java 2014-02-26 20:04:40 UTC (rev 19393) @@ -92,10 +92,14 @@ private int ptid = 0; private int ptx = Integer.MAX_VALUE; private int pto = Integer.MAX_VALUE; + private boolean isAssignment; + private boolean doSelections = true; + private boolean assignLeft; - ScriptMathProcessor(ScriptEvaluator eval, boolean isArrayItem, + ScriptMathProcessor(ScriptEvaluator eval, boolean isAssignment, boolean isArrayItem, boolean asVector, boolean asBitSet) { this.eval = eval; + this.isAssignment = assignLeft = isAssignment; this.viewer = eval.viewer; this.debugHigh = eval.debugHigh; this.chk = wasSyntaxCheck = eval.chk; @@ -107,16 +111,27 @@ Logger.debug("initialize RPN"); } + public boolean endAssignment() { + assignLeft = false; + return (doSelections = false); + } + @SuppressWarnings("unchecked") SV getResult(boolean allowUnderflow) throws ScriptException { boolean isOK = true; - while (isOK && oPt >= 0) + while (isOK && oPt >= 0 && oStack[oPt] != null) isOK = operate(); if (isOK) { if (asVector) { List<SV> result = new List<SV>(); for (int i = 0; i <= xPt; i++) - result.addLast(SV.selectItemVar(xStack[i])); + result.addLast(isAssignment ? xStack[i] : SV.selectItemVar(xStack[i])); + if (lastAssignedString != null) { + result.remove(0); + result.add(0, lastAssignedString); + lastAssignedString.intValue = xStack[0].intValue; + } + return SV.newV(T.vector, result); } if (xPt == 0) { @@ -341,6 +356,7 @@ } private boolean skipping; + private SV lastAssignedString; /** * addOp The primary driver of the Reverse Polish Notation evaluation engine. @@ -383,7 +399,7 @@ } // are we skipping due to a ( ? : ) construct? - int tok0 = (oPt >= 0 ? oStack[oPt].tok : T.nada); + int tok0 = (oPt >= 0 && oStack[oPt] != null ? oStack[oPt].tok : T.nada); skipping = (ifPt >= 0 && (ifStack[ifPt] == 'F' || ifStack[ifPt] == 'X')); if (skipping) return checkSkip(op, tok0); @@ -598,8 +614,8 @@ break; case T.rightsquare: wasX = true; - if (squareCount-- <= 0 || oPt < 0) - return false; + if (squareCount-- <= 0 || oPt < 0 || !doSelections) + return !doSelections; if (oStack[oPt].tok == T.array) return evaluateFunction(T.leftsquare); oPt--; @@ -638,8 +654,11 @@ case T.minusMinus: break; case T.opEQ: - if (squareCount == 0) + if (squareCount == 0) { + doSelections = true; + assignLeft = false; equalCount++; + } wasX = false; break; default: @@ -653,6 +672,9 @@ // immediate operation check: switch (op.tok) { case T.propselector: + if (!doSelections) { + + } return (((op.intValue & ~T.minmaxmask) == T.function && op.intValue != T.function)? evaluateFunction(T.nada) : true); case T.plusPlus: @@ -706,20 +728,29 @@ } SV var1 = xStack[xPt--]; SV var = xStack[xPt]; - if (var.tok == T.varray && var1.tok == T.string - && var.intValue != Integer.MAX_VALUE) { - // allow for x[1]["test"][1]["here"] - // common in getproperty business - // prior to 12.2/3.18, x[1]["id"] was misread as x[1][0] - var = (SV) SV.selectItemTok(var, Integer.MIN_VALUE); - } - if (var.tok == T.hash || var.tok == T.context) { - SV v = var.mapValue(SV.sValue(var1)); - xStack[xPt] = (v == null ? SV.newS("") : v); + if (var.tok == T.varray && var.intValue != Integer.MAX_VALUE) + + if (var1.tok == T.string || assignLeft && squareCount == 1) { + // immediate drill-down + // allow for x[1]["test"][1]["here"] + // common in getproperty business + // also x[1][2][3] = .... + // prior to 12.2/3.18, x[1]["id"] was misread as x[1][0] + xStack[xPt] = var = (SV) SV.selectItemTok(var, Integer.MIN_VALUE); + } + if (assignLeft && var.tok != T.string) + lastAssignedString = null; + switch (var.tok) { + case T.hash: + case T.context: + if (doSelections) { + SV v = var.mapValue(SV.sValue(var1)); + xStack[xPt] = (v == null ? SV.newS("") : v); + } else { + xPt++; + putOp(null); // final operations terminator + } return true; - } - int i = var1.asInt(); - switch (var.tok) { default: var = SV.newS(SV.sValue(var)); //$FALL-THROUGH$ @@ -728,7 +759,17 @@ case T.string: case T.matrix3f: case T.matrix4f: - xStack[xPt] = (SV) SV.selectItemTok(var, i); + if (doSelections || var.tok == T.varray + && var.intValue == Integer.MAX_VALUE) { + xStack[xPt] = (SV) SV.selectItemTok(var, var1.asInt()); + if (assignLeft && var.tok == T.string && squareCount == 1) + lastAssignedString = var; + } else { + xPt++; + } + if (!doSelections) + putOp(null); // final operations terminator + break; } return true; @@ -741,7 +782,7 @@ Logger.debug("\n"); for (int i = 0; i <= oPt; i++) Logger.debug("o[" + i + "]: " + oStack[i] + " prec=" - + T.getPrecedence(oStack[i].tok)); + + (oStack[i] == null ? "--" : "" + T.getPrecedence(oStack[i].tok))); Logger.debug(" ifStack = " + (new String(ifStack)).substring(0, ifPt + 1)); } @@ -796,11 +837,11 @@ dumpStacks("operate: " + op); } - // check for a[3][2] - if (isArrayItem && squareCount == 0 && equalCount == 1 && oPt < 0 - && (op.tok == T.opEQ)) { + // check for a[3][2] + if (op.tok == T.opEQ + && (isArrayItem && squareCount == 0 && equalCount == 1 && oPt < 0 || oPt >= 0 + && oStack[oPt] == null)) return true; - } SV x2 = getX(); if (x2 == T.tokenArraySelector) @@ -1691,5 +1732,5 @@ return null; return xStack[xPt--]; } - + } Modified: trunk/Jmol/src/org/jmol/scriptext/ScriptExt.java =================================================================== --- trunk/Jmol/src/org/jmol/scriptext/ScriptExt.java 2014-02-26 03:18:42 UTC (rev 19392) +++ trunk/Jmol/src/org/jmol/scriptext/ScriptExt.java 2014-02-26 20:04:40 UTC (rev 19393) @@ -5683,7 +5683,7 @@ case T.json: case T.var: str = parameterAsString(len++); - SV v = (SV) eval.getVariableOrParameter(str, false); + SV v = (SV) eval.getParameter(str, T.variable); if (tok == T.json) { msg = v.toJSON(); } else { @@ -5702,7 +5702,7 @@ if (str.indexOf(" ") >= 0) showString(str); else - showString(str + " = " + eval.getVariableOrParameter(str, true)); + showString(str + " = " + ((SV) eval.getParameter(str, T.variable)).escape()); } } Modified: trunk/Jmol/src/org/jmol/viewer/Jmol.properties =================================================================== --- trunk/Jmol/src/org/jmol/viewer/Jmol.properties 2014-02-26 03:18:42 UTC (rev 19392) +++ trunk/Jmol/src/org/jmol/viewer/Jmol.properties 2014-02-26 20:04:40 UTC (rev 19393) @@ -12,8 +12,70 @@ # important for the JavaScript version of Jmol. -___JmolVersion="14.1.11_2014.02.25" +___JmolVersion="14.1.11_2014.02.26" +bug fix: Jmol math fix for new . notation. + -- needs testing + -- examples: + + -- note that .. notatino works with numbers + and in all expressions + + b = [1 2 3 [ 1 2 [1 2 [1 [testing:"here"] 3]]]] + print b..4..3..1 + b..2 = 34 + + b..2..1 = 33 + print b..2..1 + + -- alternative single dot notation also on both sides + -- associative arrays only + + b = [testing:"here"] + b.testing= 33 + print b.testing + + -- note that sequential brackets for arrays + work only on the left side of an assignment + + b = [ [2] 10 11 ] + b[1][2]= 33 + #NOT print b[1][2] (that's a range) + + b = [1 2 3 [ 1 2 [1 2 [1 [testing:"here"] 3]]]] + b[4][3][3][2].more = "yes" + #NOT print b[4][3] (that's a range) + + -- extends to matrices + + b = quaternion()%"matrix" + b[1] = [1 2 3] + b[-1] = [1 2 3] + b[2][3] = 2 + + -- extends to string + + b = "testing" + b[1] = "T" + b[1][3] = "T" + b["t"] = "T" + + -- extends to points + + p = {3 3 3} + p.x = 10 + p.y = 5 + p.z = 3 + + -- extends to bitsets + + a = {*} + a.color = "red" + a.property_x = {*}.temperature.all + + +JmolVersion="14.1.11_2014.02.25" + new feature: color(color1, color2, n, asHSL) -- returns a color scheme as a string -- colors can be of any nature -- string or point, name or rgb This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ha...@us...> - 2014-07-30 08:11:01
|
Revision: 19894 http://sourceforge.net/p/jmol/code/19894 Author: hansonr Date: 2014-07-30 08:10:48 +0000 (Wed, 30 Jul 2014) Log Message: ----------- Selection fixes for annotations and validation Modified Paths: -------------- trunk/Jmol/src/org/jmol/dssx/AnnotationParser.java trunk/Jmol/src/org/jmol/script/ScriptEval.java trunk/Jmol/src/org/jmol/viewer/FileManager.java trunk/Jmol/src/org/jmol/viewer/Jmol.properties Modified: trunk/Jmol/src/org/jmol/dssx/AnnotationParser.java =================================================================== --- trunk/Jmol/src/org/jmol/dssx/AnnotationParser.java 2014-07-29 09:38:43 UTC (rev 19893) +++ trunk/Jmol/src/org/jmol/dssx/AnnotationParser.java 2014-07-30 08:10:48 UTC (rev 19894) @@ -979,7 +979,7 @@ if (lst != null) { for (int i = lst.size(); --i >= 0;) { Map<String, Object> bpInfo = lst.get(i); - BasePair.add(bpInfo, setPhos(vwr, 1, bpInfo, bs, htChains), setPhos( + BasePair.add(bpInfo, setDSSRPhos(vwr, 1, bpInfo, bs, htChains), setDSSRPhos( vwr, 2, bpInfo, bs, htChains)); } } @@ -988,19 +988,19 @@ Map<String, Object> bp = lst1.get(i); Lst<Object> resnos = (Lst<Object>) bp.get("resnos"); for (int j = resnos.size(); --j >= 0;) - setRes(vwr, (String) resnos.get(j), bs, htChains); + setDSSRRes(vwr, (String) resnos.get(j), bs, htChains); } } - private NucleicMonomer setPhos(Viewer vwr, int n, Map<String, Object> bp, + private NucleicMonomer setDSSRPhos(Viewer vwr, int n, Map<String, Object> bp, BS bs, Map<String, BS> htChains) { - return setRes(vwr, (String) bp.get("res" + n), bs, htChains); + return setDSSRRes(vwr, (String) bp.get("res" + n), bs, htChains); } - private NucleicMonomer setRes(Viewer vwr, String res, BS bs, + private NucleicMonomer setDSSRRes(Viewer vwr, String res, BS bs, Map<String, BS> htChains) { bs.clearAll(); - getBsAtoms(vwr, res, null, bs, htChains); + getDSSRAtoms(vwr, res, null, bs, htChains); NucleicMonomer group = (NucleicMonomer) vwr.ms.at[bs.nextSetBit(0)] .getGroup(); ((NucleicPolymer) group.bioPolymer).isDssrSet = true; @@ -1392,10 +1392,12 @@ */ @SuppressWarnings("unchecked") private void findAnnotationAtoms(Viewer vwr, String name, - SV map, String key, BS bs) { + SV map, String key, BS bs, String dataKey) { if (map == null) return; System.out.println("Checking " + name + " for " + key); + if (map.getMap().containsKey(dataKey)) + map = map.getMap().get(dataKey); Object data = vwr.extractProperty(map, "[" + key + "]", -1); Lst<SV> list = null; if (data instanceof Lst) { @@ -1563,42 +1565,33 @@ if (!doCache) { key = PT.rep(key, "NOCACHE","").trim(); } - String s = key.toLowerCase(); - if (!isAnnotations && !isValidation) { - // Check to see if we have already asked for pairs or the data type - // does not have the "basePairs" key - if (s.indexOf("pairs") < 0 && s.indexOf("kissingloops") < 0 - && s.indexOf("linkedby") < 0 && s.indexOf("multiplets") < 0 - && s.indexOf("singlestrand") < 0) - key += ".basePairs"; - if (s.indexOf(".nt") < 0 && s.indexOf(".res") < 0 - && s.indexOf("[select res") < 0 && s.indexOf("[select nt") < 0) - key += ".res*"; - } + if (!isAnnotations && !isValidation) + key = fixKeyDSSR(key); BS bs = (doCache ? (BS) dssrCache.get(key) : null); if (bs != null) return bs; bs = new BS(); + if (doCache) + dssrCache.put(key, bs); try { - if (doCache) - dssrCache.put(key, bs); - Object data; if (!isAnnotations && !isValidation) { - Map<String, BS> htChains = new Hashtable<String, BS>(); - data = vwr.extractProperty(dbObj, key, -1); - if (data instanceof Lst<?>) - getBsAtoms(vwr, null, (Lst<SV>) data, bs, htChains); + Object data = vwr.extractProperty(dbObj, key, -1); + if (data instanceof Lst<?>) { + Map<String, BS> htChains = new Hashtable<String, BS>(); + getDSSRAtoms(vwr, null, (Lst<SV>) data, bs, htChains); + } return bs; - } - + } SV main = initializeAnnotation((SV) dbObj, type); SV svMap = main; Map<String, SV> map = svMap.getMap(); + String dataKey = getDataKey(type); // select within(annotations,"InterPro.* where identifier like '*-like'") - int pt = s.indexOf(" where "); + int pt = key.toLowerCase().indexOf(" where "); String tableName = PT.rep((pt < 0 ? key : key.substring(0, pt)), " ",""); - if (tableName.indexOf(".") < 0) + if (tableName.indexOf(".") < 0 && isAnnotations) tableName += ".*"; + String[] keys = PT.split(tableName, "."); boolean isWild = false; int i = 0; @@ -1619,18 +1612,18 @@ break; } } - String newKey = "select " + (map == null ? "*" : getDataKey(type)) + (pt < 0 ? "" : key.substring(pt)); + String newKey = "select * " + (pt < 0 ? "" : key.substring(pt)); Logger.info("looking for " + newKey + " in " + tableName); // this is either the right map or we have a wildcard. if (i == 0 && map != null) { for (String b : main.getMap().keySet()) for (String a : (map = main.getMap().get(b).getMap()).keySet()) - findAnnotationAtoms(vwr, b + "." + a, map.get(a), newKey, bs); + findAnnotationAtoms(vwr, b + "." + a, map.get(a), newKey, bs, dataKey); } else if (isWild) { for (String a : map.keySet()) - findAnnotationAtoms(vwr, a, map.get(a), newKey, bs); + findAnnotationAtoms(vwr, a, map.get(a), newKey, bs, dataKey); } else { - findAnnotationAtoms(vwr, tableName, svMap, newKey, bs); + findAnnotationAtoms(vwr, tableName, svMap, newKey, bs, dataKey); } bs.and(bsModel); } catch (Exception e) { @@ -1640,6 +1633,20 @@ return bs; } + private String fixKeyDSSR(String key) { + String s = key.toLowerCase(); + // Check to see if we have already asked for pairs or the data type + // does not have the "basePairs" key + if (s.indexOf("pairs") < 0 && s.indexOf("kissingloops") < 0 + && s.indexOf("linkedby") < 0 && s.indexOf("multiplets") < 0 + && s.indexOf("singlestrand") < 0) + key += ".basePairs"; + if (s.indexOf(".nt") < 0 && s.indexOf(".res") < 0 + && s.indexOf("[select res") < 0 && s.indexOf("[select nt") < 0) + key += ".res*"; + return key; + } + /** * parsing a residue designation for tokens in DSSR. * @@ -1649,7 +1656,7 @@ * @param bs * @param htChains */ - private void getBsAtoms(Viewer vwr, String res, Lst<?> lst, BS bs, + private void getDSSRAtoms(Viewer vwr, String res, Lst<?> lst, BS bs, Map<String, BS> htChains) { String[] tokens; if (lst == null) { @@ -1664,7 +1671,7 @@ if (o instanceof SV) o = ((SV) o).value; if (o instanceof Lst<?>) { - getBsAtoms(vwr, null, (Lst<?>) o, bs, htChains); + getDSSRAtoms(vwr, null, (Lst<?>) o, bs, htChains); } else { String s = (o instanceof SV ? ((SV) o).asString() : o.toString()); tokens[i] = (s.startsWith("[") ? s.substring(s.indexOf("]") + 1) : s); Modified: trunk/Jmol/src/org/jmol/script/ScriptEval.java =================================================================== --- trunk/Jmol/src/org/jmol/script/ScriptEval.java 2014-07-29 09:38:43 UTC (rev 19893) +++ trunk/Jmol/src/org/jmol/script/ScriptEval.java 2014-07-30 08:10:48 UTC (rev 19894) @@ -803,7 +803,6 @@ //ignore } boolean exec0 = executing; - System.out.println(exec0 + " " + this); Object o = (e.evaluate(expr, asVariable, compileOnly)); executing = exec0; return o; Modified: trunk/Jmol/src/org/jmol/viewer/FileManager.java =================================================================== --- trunk/Jmol/src/org/jmol/viewer/FileManager.java 2014-07-29 09:38:43 UTC (rev 19893) +++ trunk/Jmol/src/org/jmol/viewer/FileManager.java 2014-07-30 08:10:48 UTC (rev 19894) @@ -422,7 +422,8 @@ Logger.info("FileManager opening 1 " + name); // note that in the case of JS, this is a javajs.util.SB. ret = vwr.apiPlatform.getURLContents(url, outputBytes, post, false); - if (ret instanceof String && ((String) ret).startsWith("java.") + if ((ret instanceof SB && ((SB) ret).length() < 3 + || ret instanceof String && ((String) ret).startsWith("java.")) && name.startsWith("http://ves-hx-89.ebi.ac.uk")) { // temporary bypass for EBI firewalled development server // defaulting to current directory and JSON file Modified: trunk/Jmol/src/org/jmol/viewer/Jmol.properties =================================================================== --- trunk/Jmol/src/org/jmol/viewer/Jmol.properties 2014-07-29 09:38:43 UTC (rev 19893) +++ trunk/Jmol/src/org/jmol/viewer/Jmol.properties 2014-07-30 08:10:48 UTC (rev 19894) @@ -13,6 +13,7 @@ TODO: select BONDS and select MEASURES not documented TODO: design and implement sidechain mutation -- MUTATE command ? +TODO: clashes in EBI API JSON return are showing H atoms but should not ___JmolVersion="14.3.3_2014.07.29b" This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ha...@us...> - 2015-07-07 18:20:34
|
Revision: 20640 http://sourceforge.net/p/jmol/code/20640 Author: hansonr Date: 2015-07-07 18:20:31 +0000 (Tue, 07 Jul 2015) Log Message: ----------- JSmol text writing broken in just-released Jmol 14.3.15 Modified Paths: -------------- trunk/Jmol/src/org/jmol/awtjs2d/Image.java trunk/Jmol/src/org/jmol/awtjs2d/Platform.java trunk/Jmol/src/org/jmol/viewer/Jmol.properties Modified: trunk/Jmol/src/org/jmol/awtjs2d/Image.java =================================================================== --- trunk/Jmol/src/org/jmol/awtjs2d/Image.java 2015-07-07 08:57:37 UTC (rev 20639) +++ trunk/Jmol/src/org/jmol/awtjs2d/Image.java 2015-07-07 18:20:31 UTC (rev 20640) @@ -158,24 +158,6 @@ } /** - * @param canvas - * @param backgroundTransparent - * @return context - */ - static Object getStaticGraphics(Object canvas, boolean backgroundTransparent) { - // for text processing; - /** - * @j2sNative - * - * return this.getGraphics(canvas); - * - */ - { - return null; - } - } - - /** * @param vwr * @param title * @param imageMap Modified: trunk/Jmol/src/org/jmol/awtjs2d/Platform.java =================================================================== --- trunk/Jmol/src/org/jmol/awtjs2d/Platform.java 2015-07-07 08:57:37 UTC (rev 20639) +++ trunk/Jmol/src/org/jmol/awtjs2d/Platform.java 2015-07-07 18:20:31 UTC (rev 20640) @@ -320,7 +320,16 @@ @Override public Object getStaticGraphics(Object image, boolean backgroundTransparent) { - return Image.getStaticGraphics(image, backgroundTransparent); + // for text processing; + /** + * @j2sNative + * + * return this.getGraphics(image); + * + */ + { + return null; + } } @Override Modified: trunk/Jmol/src/org/jmol/viewer/Jmol.properties =================================================================== --- trunk/Jmol/src/org/jmol/viewer/Jmol.properties 2015-07-07 08:57:37 UTC (rev 20639) +++ trunk/Jmol/src/org/jmol/viewer/Jmol.properties 2015-07-07 18:20:31 UTC (rev 20640) @@ -50,9 +50,14 @@ Jmol.___JmolVersion="14.3.15_2015.07.07" +new feature: JSmol Jmol._persistentMenu = true + -- allows menu to persist and not be removed + +new feature: JSmol <div id=JmolApplet0_console></div> sets a place on the page for the JSmol console. + new feature: load xxx filter "latticeScaling=1.2" -- scales model based on a crystal lattice - -- allows volume matching for crystal comparison + -- allows volume matching for crystal comparison bug fix: SMARTS processing with "." may not find substructure This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ha...@us...> - 2015-10-01 13:11:41
|
Revision: 20804 http://sourceforge.net/p/jmol/code/20804 Author: hansonr Date: 2015-10-01 13:11:38 +0000 (Thu, 01 Oct 2015) Log Message: ----------- JmolVersion="14.3.16_2015.09.30" new feature: calculate hydrogens TRUE -- calculates hydrogens and multiple bonding -- same as calculate hydrogens connect aromatic modify calculate aromatic -- similar to, but not identical to set pdbAddHydrogens -- allows reasonable addition of multiple bonds to proteins after loading bug fix: connect aromatic should not touch H atoms or atoms with 4 or more covalent bonds bug fix: calculate hydrogen should consider backbone N sp2 bug fix: {backbone} should include attached H atoms bug fix: calculate hydrogens should not place H atoms on water Modified Paths: -------------- trunk/Jmol/src/org/jmol/modelset/Atom.java trunk/Jmol/src/org/jmol/modelset/AtomCollection.java trunk/Jmol/src/org/jmol/modelset/BondCollection.java trunk/Jmol/src/org/jmol/modelset/ModelSet.java trunk/Jmol/src/org/jmol/viewer/Jmol.properties Modified: trunk/Jmol/src/org/jmol/modelset/Atom.java =================================================================== --- trunk/Jmol/src/org/jmol/modelset/Atom.java 2015-10-01 06:15:23 UTC (rev 20803) +++ trunk/Jmol/src/org/jmol/modelset/Atom.java 2015-10-01 13:11:38 UTC (rev 20804) @@ -444,6 +444,9 @@ valence = (byte) (nBonds < 0 ? 0 : nBonds < 0xEF ? nBonds : 0xEF); } + /** + * return the total bond order for this atom + */ @Override public int getValence() { if (isDeleted()) Modified: trunk/Jmol/src/org/jmol/modelset/AtomCollection.java =================================================================== --- trunk/Jmol/src/org/jmol/modelset/AtomCollection.java 2015-10-01 06:15:23 UTC (rev 20803) +++ trunk/Jmol/src/org/jmol/modelset/AtomCollection.java 2015-10-01 13:11:38 UTC (rev 20804) @@ -1236,12 +1236,14 @@ int targetValence = aaRet[0]; int hybridization = aaRet[2]; int nBonds = aaRet[3]; - + if (nBonds == 0 && atom.isHetero()) + continue; // no adding to water hAtoms[i] = new P3[n]; int hPt = 0; if (nBonds == 0) { switch (n) { case 4: + // methane z.set(0.635f, 0.635f, 0.635f); pt = P3.newP(z); pt.add(atom); @@ -1250,6 +1252,7 @@ vConnect.addLast(atom); //$FALL-THROUGH$ case 3: + // nitrogen z.set(-0.635f, -0.635f, 0.635f); pt = P3.newP(z); pt.add(atom); @@ -1258,6 +1261,7 @@ vConnect.addLast(atom); //$FALL-THROUGH$ case 2: + // oxygen z.set(-0.635f, 0.635f, -0.635f); pt = P3.newP(z); pt.add(atom); Modified: trunk/Jmol/src/org/jmol/modelset/BondCollection.java =================================================================== --- trunk/Jmol/src/org/jmol/modelset/BondCollection.java 2015-10-01 06:15:23 UTC (rev 20803) +++ trunk/Jmol/src/org/jmol/modelset/BondCollection.java 2015-10-01 13:11:38 UTC (rev 20804) @@ -586,7 +586,7 @@ */ private boolean assignAromaticSingleForAtom(Atom atom, int notBondIndex) { Bond[] bonds = atom.bonds; - if (bonds == null || assignAromaticSingleHetero(atom)) + if (bonds == null)// || assignAromaticMustBeSingle(atom)) return false; for (int i = bonds.length; --i >= 0;) { Bond bond = bonds[i]; @@ -613,7 +613,7 @@ Bond[] bonds = atom.bonds; if (bonds == null) return false; - boolean haveDouble = assignAromaticSingleHetero(atom); + boolean haveDouble = false;//assignAromaticMustBeSingle(atom); int lastBond = -1; for (int i = bonds.length; --i >= 0;) { if (bsAromaticDouble.get(bonds[i].index)) @@ -636,7 +636,20 @@ return haveDouble; } - private boolean assignAromaticSingleHetero(Atom atom) { + protected boolean allowAromaticBond(Bond b) { + if (assignAromaticMustBeSingle(b.atom1) + || assignAromaticMustBeSingle(b.atom2)) + return false; + switch (b.getCovalentOrder()) { + case Edge.BOND_COVALENT_SINGLE: + case Edge.BOND_COVALENT_DOUBLE: + return b.atom1.getCovalentBondCount() <= 3 && b.atom2.getCovalentBondCount() <= 3; + default: + return false; + } + } + + private boolean assignAromaticMustBeSingle(Atom atom) { // only C N O S may be a problematic: int n = atom.getElementNumber(); switch (n) { Modified: trunk/Jmol/src/org/jmol/modelset/ModelSet.java =================================================================== --- trunk/Jmol/src/org/jmol/modelset/ModelSet.java 2015-10-01 06:15:23 UTC (rev 20803) +++ trunk/Jmol/src/org/jmol/modelset/ModelSet.java 2015-10-01 13:11:38 UTC (rev 20804) @@ -2436,9 +2436,7 @@ || checkDistance && !isInRange(atomA, atomB, minD, maxD, minDIsFrac, maxDIsFrac, isFractional) - || isAromatic - && (atomA.getElementNumber() == 1 || atomA.getCovalentBondCount() > 3 - || atomB.getElementNumber() == 1 || atomB.getCovalentBondCount() > 3) + || isAromatic && !allowAromaticBond(bondAB) ) continue; if (bondAB == null) { Modified: trunk/Jmol/src/org/jmol/viewer/Jmol.properties =================================================================== --- trunk/Jmol/src/org/jmol/viewer/Jmol.properties 2015-10-01 06:15:23 UTC (rev 20803) +++ trunk/Jmol/src/org/jmol/viewer/Jmol.properties 2015-10-01 13:11:38 UTC (rev 20804) @@ -75,10 +75,13 @@ connect aromatic modify calculate aromatic + -- similar to, but not identical to set pdbAddHydrogens + -- allows reasonable addition of multiple bonds to proteins after loading -bug fix: calculate aromatic should not touch atoms with 4 groups or H atoms +bug fix: connect aromatic should not touch H atoms or atoms with 4 or more covalent bonds bug fix: calculate hydrogen should consider backbone N sp2 bug fix: {backbone} should include attached H atoms +bug fix: calculate hydrogens should not place H atoms on water JmolVersion="14.3.16_2015.09.29" This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ha...@us...> - 2008-07-17 19:19:18
|
Revision: 9609 http://jmol.svn.sourceforge.net/jmol/?rev=9609&view=rev Author: hansonr Date: 2008-07-17 19:17:59 +0000 (Thu, 17 Jul 2008) Log Message: ----------- version=11.5.48_dev quaternion arrows;connect aromatic auto # bug fix: quaternion derivative DRAW arrows placed on residue i+1 instead of residue i # bug fix: connect aromatic auto; select connected([bond type],...) Modified Paths: -------------- trunk/Jmol/src/org/jmol/modelset/Bond.java trunk/Jmol/src/org/jmol/modelset/BondCollection.java trunk/Jmol/src/org/jmol/modelsetbio/BioPolymer.java trunk/Jmol/src/org/jmol/viewer/Jmol.properties Modified: trunk/Jmol/src/org/jmol/modelset/Bond.java =================================================================== --- trunk/Jmol/src/org/jmol/modelset/Bond.java 2008-07-17 15:06:52 UTC (rev 9608) +++ trunk/Jmol/src/org/jmol/modelset/Bond.java 2008-07-17 19:17:59 UTC (rev 9609) @@ -246,7 +246,7 @@ } public boolean is(int bondType) { - return (order & ~JmolConstants.BOND_NEW) != bondType; + return (order & ~JmolConstants.BOND_NEW) == bondType; } } Modified: trunk/Jmol/src/org/jmol/modelset/BondCollection.java =================================================================== --- trunk/Jmol/src/org/jmol/modelset/BondCollection.java 2008-07-17 15:06:52 UTC (rev 9608) +++ trunk/Jmol/src/org/jmol/modelset/BondCollection.java 2008-07-17 19:17:59 UTC (rev 9609) @@ -520,7 +520,7 @@ for (int i = bondCount; --i >= 0;) if (bsBonds == null || bsBonds.get(i)) { bond = bonds[i]; - if (bond.is(JmolConstants.BOND_AROMATIC) + if (!bond.is(JmolConstants.BOND_AROMATIC) || bsAromaticDouble.get(i) || bsAromaticSingle.get(i)) continue; if (!assignAromaticDouble(bond)) Modified: trunk/Jmol/src/org/jmol/modelsetbio/BioPolymer.java =================================================================== --- trunk/Jmol/src/org/jmol/modelsetbio/BioPolymer.java 2008-07-17 15:06:52 UTC (rev 9608) +++ trunk/Jmol/src/org/jmol/modelsetbio/BioPolymer.java 2008-07-17 19:17:59 UTC (rev 9609) @@ -639,7 +639,7 @@ // helices and sheets are missed // (in terms of assigning structure from quaternions). Atom atemp = a; - a = aprev; + monomer = (Monomer) (a = aprev).getGroup(); aprev = atemp; // save this dq as dq' dqprev = dq; @@ -675,7 +675,6 @@ : p instanceof NucleicPolymer ? ((NucleicMonomer) monomer).getQuaternionFrameCenter(qtype) : new Point3f()); - if (isDraw) { if (bsSelected != null && !bsSelected.get(a.getAtomIndex())) continue; @@ -712,7 +711,7 @@ new Point3f[] { ptCenter } }); if (qtype == 'n' && isAmino) strExtra += TextFormat.sprintf(" %10.5p %10.5p %10.5p", - new Object[] { new Point3f[] { ((AminoMonomer) a.getGroup()) + new Object[] { new Point3f[] { ((AminoMonomer) monomer) .getNitrogenHydrogenPoint() } }); } if (pdbATOM == null) Modified: trunk/Jmol/src/org/jmol/viewer/Jmol.properties =================================================================== --- trunk/Jmol/src/org/jmol/viewer/Jmol.properties 2008-07-17 15:06:52 UTC (rev 9608) +++ trunk/Jmol/src/org/jmol/viewer/Jmol.properties 2008-07-17 19:17:59 UTC (rev 9609) @@ -3,8 +3,10 @@ version=11.5.48_dev +# bug fix: quaternion derivative DRAW arrows placed on residue i+1 instead of residue i +# bug fix: connect aromatic auto; select connected([bond type],...) # bug fix: queue thread termination when applets are off screen -# bug fix: sheetsmoothing not consistent among structures in multi-chain systems +# bug fix : sheetsmoothing not consistent among structures in multi-chain systems # bug fix: messages not sent to messageCallback # code: simpler matrix-->quaternion code # bug fix: 11.5.47 shows oddly sized arrow for very first rendering This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ha...@us...> - 2008-07-18 12:44:54
|
Revision: 9614 http://jmol.svn.sourceforge.net/jmol/?rev=9614&view=rev Author: hansonr Date: 2008-07-18 12:44:50 +0000 (Fri, 18 Jul 2008) Log Message: ----------- version=11.5.48_dev PDB site definition / DEFINE compilation # code: compiler error reporting improved # bug fix: PDB site definition does not ignore empty site definitions # bug fix: DEFINE can cause compiling error, e.g. "[2MO]" in 1tmo Modified Paths: -------------- trunk/Jmol/src/org/jmol/adapter/smarter/AtomSetCollectionReader.java trunk/Jmol/src/org/jmol/modelset/ModelLoader.java trunk/Jmol/src/org/jmol/viewer/Compiler.java trunk/Jmol/src/org/jmol/viewer/Jmol.properties Modified: trunk/Jmol/src/org/jmol/adapter/smarter/AtomSetCollectionReader.java =================================================================== --- trunk/Jmol/src/org/jmol/adapter/smarter/AtomSetCollectionReader.java 2008-07-18 12:43:45 UTC (rev 9613) +++ trunk/Jmol/src/org/jmol/adapter/smarter/AtomSetCollectionReader.java 2008-07-18 12:44:50 UTC (rev 9614) @@ -466,6 +466,8 @@ name = name.substring(0, i) + "_" + name.substring(i + 1); String seqNum = (String) htSite.get("seqNum"); String groups = (String) htSite.get("groups"); + if (groups.length() == 0) + continue; addJmolScript("@site_" + name + " " + groups); addJmolScript("@" + seqNum + " " + groups); addJmolScript("site_" + name + " = \"" + groups + "\".split(\",\")"); Modified: trunk/Jmol/src/org/jmol/modelset/ModelLoader.java =================================================================== --- trunk/Jmol/src/org/jmol/modelset/ModelLoader.java 2008-07-18 12:43:45 UTC (rev 9613) +++ trunk/Jmol/src/org/jmol/modelset/ModelLoader.java 2008-07-18 12:44:50 UTC (rev 9614) @@ -45,7 +45,8 @@ * * This subclass contains only the private methods * used to load a model. Methods exclusively after - * file loading are included only in the superclass, Frame. + * file loading are included only in the superclass, ModelSet, + * and its superclasses, ModelCollection, BondCollection, and AtomCollection. * * Bob Hanson, 5/2007 * Modified: trunk/Jmol/src/org/jmol/viewer/Compiler.java =================================================================== --- trunk/Jmol/src/org/jmol/viewer/Compiler.java 2008-07-18 12:43:45 UTC (rev 9613) +++ trunk/Jmol/src/org/jmol/viewer/Compiler.java 2008-07-18 12:44:50 UTC (rev 9614) @@ -393,6 +393,8 @@ if (thisFunction != null && thisFunction.cmdpt0 < 0) { thisFunction.cmdpt0 = iCommand; } + if (parenCount > 0 || bracketCount > 0 || braceCount > 0) + return error(ERROR_endOfCommandUnexpected); if (!compileCommand()) return false; if (!tokAttr(tokCommand, Token.noeval) @@ -580,7 +582,8 @@ addTokenToPrefix(new Token(Token.integer, val, intString)); continue; } - if (lastToken.tok == Token.select || !tokenAttr(lastToken, Token.mathfunc)) { + if (lastToken.tok == Token.select + || !tokenAttr(lastToken, Token.mathfunc)) { // don't want to mess up x.distance({1 2 3}) // if you want to use a bitset there, you must use // bitsets properly: x.distance( ({1 2 3}) ) @@ -618,20 +621,31 @@ token = new Token(Token.identifier, ident); } int tok = token.tok; - if (tok == Token.leftparen || tok == Token.leftbrace) { + switch (tok) { + case Token.leftparen: + case Token.leftbrace: + parenCount++; // the select() function uses dual semicolon notation // but we must differentiate from isosurface select(...) and set picking select if (nTokens > 1 && (lastToken.tok == Token.select)) - nSemiSkip += 2; - parenCount++; - } - if (tok == Token.rightparen || tok == Token.rightbrace) { - if (parenCount == 0) - return error(ERROR_leftParenthesisExpected); + nSemiSkip += 2; + break; + case Token.rightparen: + case Token.rightbrace: parenCount--; + if (parenCount < 0) + return error(ERROR_tokenUnexpected, (String) token.value); // we need to remove the semiskip if parentheses or braces have been closed. 11.5.46 if (parenCount == 0) nSemiSkip = 0; + break; + case Token.leftsquare: + bracketCount++; + break; + case Token.rightsquare: + bracketCount--; + if (bracketCount < 0) + return error(ERROR_tokenUnexpected, "]"); } switch (tokCommand) { // special cases @@ -727,14 +741,14 @@ } if (nTokens == 2) { if (tok != Token.leftparen) - return error(ERROR_leftParenthesisExpected); + return error(ERROR_tokenExpected, "("); break; } if (nTokens == 3 && tok == Token.rightparen) break; if (nTokens % 2 == 0) { if (tok != Token.comma && tok != Token.rightparen) - return error(ERROR_commaOrCloseExpected); + return error(ERROR_tokenExpected, ", / )"); break; } thisFunction.addVariable(ident, true); @@ -832,10 +846,17 @@ } } break; + case Token.restrict: + case Token.select: + case Token.display: + case Token.hide: + case Token.delete: case Token.define: - if (nTokens == 1) { - // we are looking at the variable name - if (tok != Token.identifier) { + if (tok == Token.define) { + if (nTokens == 1) { + // we are looking at the variable name + if (tok == Token.identifier) + break; if (preDefining) { if (!tokAttr(tok, Token.predefinedset)) return error("ERROR IN Token.java or JmolConstants.java -- the following term was used in JmolConstants.java but not listed as predefinedset in Token.java: " @@ -855,38 +876,25 @@ tok = token.tok = Token.identifier; Token.addToken(ident, token); } + break; } - } else if (nTokens == 2 && tok == Token.opEQ) { - // we are looking at @x =.... just insert a SET command - // and ignore the =. It's the same as set @x ... - ltoken.insertElementAt(Token.tokenSet, 0); - continue; - } else { - // we are looking at the expression - if (tok != Token.identifier && tok != Token.set - && !(tokAttr(tok, Token.expression))) - return error(ERROR_invalidExpressionToken, ident); + if (nTokens == 2 && tok == Token.opEQ) { + // we are looking at @x =.... just insert a SET command + // and ignore the =. It's the same as set @x ... + ltoken.insertElementAt(Token.tokenSet, 0); + continue; + } } + if (bracketCount == 0 && tok != Token.identifier + && !tokAttr(tok, Token.expression) + && tok != Token.min && tok != Token.max) + return error(ERROR_invalidExpressionToken, ident); break; case Token.center: if (tok != Token.identifier && tok != Token.dollarsign && !tokAttr(tok, Token.expression)) return error(ERROR_invalidExpressionToken, ident); break; - case Token.restrict: - case Token.select: - case Token.display: - case Token.hide: - case Token.delete: - if (tok == Token.leftsquare) - bracketCount++; - if (tok == Token.rightsquare) - bracketCount--; - //ensure anything goes for inside brackets - if (tok != Token.identifier && !tokAttr(tok, Token.expression) - && tok != Token.min && tok != Token.max && bracketCount == 0) - return error(ERROR_invalidExpressionToken, ident); - break; } addTokenToPrefix(token); continue; @@ -1810,7 +1818,7 @@ if (!clauseOr(true)) return false; if (!addNextTokenIf(Token.rightparen)) - return error(ERROR_rightParenthesisExpected); + return error(ERROR_tokenExpected, ")"); return checkForItemSelector(); case Token.leftbrace: return checkForCoordinate(isImplicitExpression); @@ -1859,7 +1867,7 @@ while (!tokPeek(Token.rightbrace)) { boolean haveComma = addNextTokenIf(Token.comma); if (!clauseOr(false)) - return (haveComma || n < 3? false : error(ERROR_rightBraceExpected)); + return (haveComma || n < 3? false : error(ERROR_tokenExpected, "}")); n++; } isCoordinate = (n >= 2); // could be {1 -2 3} @@ -1885,7 +1893,7 @@ if (!clauseItemSelector()) return false; if (!addNextTokenIf(Token.rightsquare)) - return error(ERROR_rightBracketExpected); + return error(ERROR_tokenExpected, "]"); } return true; } @@ -1988,7 +1996,7 @@ if (!clauseOr(false)) return error(ERROR_unrecognizedParameter,"WITHIN", ": ?"); if (!addNextTokenIf(Token.rightparen)) - return error(ERROR_commaOrCloseExpected); + return error(ERROR_tokenExpected, ", / )"); addTokenToPostfix(Token.tokenExpressionEnd); break; case Token.define: @@ -2001,11 +2009,11 @@ } } } else if (!clauseOr(allowComma)) {// *expression* - return error(ERROR_endOfCommandUnexpected); + return error(ERROR_badArgumentCount); } } if (!addNextTokenIf(Token.rightparen)) - return error(ERROR_rightParenthesisExpected); + return error(ERROR_tokenExpected, ")"); return true; } @@ -2054,7 +2062,7 @@ break; } if (!addNextTokenIf(Token.rightparen)) - return error(ERROR_rightParenthesisExpected); + return error(ERROR_tokenExpected, ")"); return true; } @@ -2062,9 +2070,9 @@ if (!addNextTokenIf(Token.leftparen)) return false; if (!addNextTokenIf(Token.string)) - return error(ERROR_stringExpected); + return error(ERROR_tokenExpected, "\"...\""); if (!addNextTokenIf(Token.rightparen)) - return error(ERROR_rightParenthesisExpected); + return error(ERROR_tokenExpected, ")"); return true; } @@ -2089,7 +2097,7 @@ Token tokenAtomProperty = tokenNext(); Token tokenComparator = tokenNext(); if (!tokenAttr(tokenComparator, Token.comparator)) - return error(ERROR_comparisonOperatorExpected); + return error(ERROR_tokenExpected, "== != < > <= >="); if (getToken() == null) return error(ERROR_unrecognizedExpressionToken, "" + valuePeek()); boolean isNegative = (isToken(Token.minus)); @@ -2124,7 +2132,7 @@ Point3f cell = new Point3f(); tokenNext(); // CELL if (!tokenNext(Token.opEQ)) // = - return error(ERROR_equalSignExpected); + return error(ERROR_tokenExpected, "="); if (getToken() == null) return error(ERROR_coordinateExpected); // 555 = {1 1 1} @@ -2478,58 +2486,46 @@ private final static int ERROR_badArgumentCount = 0; private final static int ERROR_badContext = 1; private final static int ERROR_commandExpected = 2; - private final static int ERROR_commaOrCloseExpected = 3; - private final static int ERROR_comparisonOperatorExpected = 4; - private final static int ERROR_coordinateExpected = 5; - private final static int ERROR_endOfCommandUnexpected = 6; - private final static int ERROR_endOfExpressionExpected = 7; - private final static int ERROR_equalSignExpected = 8; - private final static int ERROR_identifierOrResidueSpecificationExpected = 9; - private final static int ERROR_invalidAtomSpecification = 10; - private final static int ERROR_invalidChainSpecification = 11; - private final static int ERROR_invalidExpressionToken = 12; - private final static int ERROR_invalidModelSpecification = 13; - private final static int ERROR_leftParenthesisExpected = 14; - private final static int ERROR_missingEnd = 15; - private final static int ERROR_numberExpected = 16; - private final static int ERROR_numberOrVariableNameExpected = 17; - private final static int ERROR_residueSpecificationExpected = 18; - private final static int ERROR_rightBraceExpected = 19; - private final static int ERROR_rightBracketExpected = 20; - private final static int ERROR_rightParenthesisExpected = 21; - private final static int ERROR_stringExpected = 22; - private final static int ERROR_unrecognizedExpressionToken = 23; - private final static int ERROR_unrecognizedParameter = 24; - private final static int ERROR_unrecognizedToken = 25; + private final static int ERROR_coordinateExpected = 3; + private final static int ERROR_endOfCommandUnexpected = 4; + private final static int ERROR_endOfExpressionExpected = 5; + private final static int ERROR_identifierOrResidueSpecificationExpected = 6; + private final static int ERROR_invalidAtomSpecification = 7; + private final static int ERROR_invalidChainSpecification = 8; + private final static int ERROR_invalidExpressionToken = 9; + private final static int ERROR_invalidModelSpecification = 10; + private final static int ERROR_missingEnd = 11; + private final static int ERROR_numberExpected = 12; + private final static int ERROR_numberOrVariableNameExpected = 13; + private final static int ERROR_residueSpecificationExpected = 14; + private final static int ERROR_tokenExpected = 15; + private final static int ERROR_tokenUnexpected = 16; + private final static int ERROR_unrecognizedExpressionToken = 17; + private final static int ERROR_unrecognizedParameter = 18; + private final static int ERROR_unrecognizedToken = 19; private final static String[] errors = { GT._("bad argument count"), // 0 GT._("invalid context for {0}"), // 1 GT._("command expected"), // 2 - GT._("comma or right parenthesis expected"), // 3 - GT._("comparison operator expected"), // 4 - GT._("{ number number number } expected"), // 5 - GT._("unexpected end of script command"), // 6 - GT._("end of expression expected"), // 7 - GT._("equal sign expected"), // 8 - GT._("identifier or residue specification expected"), // 9 - GT._("invalid atom specification"), // 10 - GT._("invalid chain specification"), // 11 - GT._("invalid expression token: {0}"), // 12 - GT._("invalid model specification"), // 13 - GT._("left parenthesis expected"), // 14 - GT._("missing END for {0}"), // 15 - GT._("number expected"), // 16 - GT._("number or variable name expected"), // 17 - GT._("residue specification (ALA, AL?, A*) expected"), // 18 - GT._("right brace expected"), // 19 - GT._("right bracket expected"), // 20 - GT._("right parenthesis expected"), // 21 - GT._("quoted string expected"), // 22 - GT._("unrecognized expression token: {0}"), // 23 - GT._("unrecognized {0} parameter"), // 24 - GT._("unrecognized token: {0}"), // 25 + GT._("{ number number number } expected"), // 3 + GT._("unexpected end of script command"), // 4 + GT._("end of expression expected"), // 5 + GT._("identifier or residue specification expected"), // 6 + GT._("invalid atom specification"), // 7 + GT._("invalid chain specification"), // 8 + GT._("invalid expression token: {0}"), // 9 + GT._("invalid model specification"), // 10 + GT._("missing END for {0}"), // 11 + GT._("number expected"), // 12 + GT._("number or variable name expected"), // 13 + GT._("residue specification (ALA, AL?, A*) expected"), // 14 + GT._("{0} expected"), // 15 + GT._("{0} unexpected"), // 16 + GT._("unrecognized expression token: {0}"), // 17 + GT._("unrecognized {0} parameter"), // 18 + GT._("unrecognized token: {0}"), // 19 }; private boolean commandExpected() { Modified: trunk/Jmol/src/org/jmol/viewer/Jmol.properties =================================================================== --- trunk/Jmol/src/org/jmol/viewer/Jmol.properties 2008-07-18 12:43:45 UTC (rev 9613) +++ trunk/Jmol/src/org/jmol/viewer/Jmol.properties 2008-07-18 12:44:50 UTC (rev 9614) @@ -3,6 +3,9 @@ version=11.5.48_dev +# code: compiler error reporting improved +# bug fix: PDB site definition does not ignore empty site definitions +# bug fix: DEFINE can cause compiling error, e.g. "[2MO]" in 1tmo # bug fix: quaternion derivative DRAW arrows placed on residue i+1 instead of residue i # bug fix: connect aromatic auto; select connected([bond type],...) # bug fix: queue thread termination when applets are off screen This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ha...@us...> - 2008-07-19 14:04:45
|
Revision: 9616 http://jmol.svn.sourceforge.net/jmol/?rev=9616&view=rev Author: hansonr Date: 2008-07-19 14:04:07 +0000 (Sat, 19 Jul 2008) Log Message: ----------- version=11.5.48_dev mol file bond 8;PDB site definition # new feature: mol file bond type 8 as partial # code: compiler error reporting improved # bug fix: PDB site definition does not ignore empty site definitions Modified Paths: -------------- trunk/Jmol/src/org/jmol/adapter/readers/cifpdb/PdbReader.java trunk/Jmol/src/org/jmol/adapter/readers/molxyz/MolReader.java trunk/Jmol/src/org/jmol/modelset/ModelLoader.java trunk/Jmol/src/org/jmol/modelsetbio/AlphaPolymer.java trunk/Jmol/src/org/jmol/viewer/Eval.java trunk/Jmol/src/org/jmol/viewer/Jmol.properties Modified: trunk/Jmol/src/org/jmol/adapter/readers/cifpdb/PdbReader.java =================================================================== --- trunk/Jmol/src/org/jmol/adapter/readers/cifpdb/PdbReader.java 2008-07-19 05:52:13 UTC (rev 9615) +++ trunk/Jmol/src/org/jmol/adapter/readers/cifpdb/PdbReader.java 2008-07-19 14:04:07 UTC (rev 9616) @@ -729,6 +729,10 @@ htHetero = new Hashtable(); String groupName = parseToken(line, 11, 14); String hetName = parseTrimmed(line, 15, 70); + if (groupName == null) { + System.out.println("ERROR: HETNAM record does not contain a group name: " + line); + return; + } String htName = (String) htHetero.get(groupName); if (htName != null) hetName = htName + hetName; Modified: trunk/Jmol/src/org/jmol/adapter/readers/molxyz/MolReader.java =================================================================== --- trunk/Jmol/src/org/jmol/adapter/readers/molxyz/MolReader.java 2008-07-19 05:52:13 UTC (rev 9615) +++ trunk/Jmol/src/org/jmol/adapter/readers/molxyz/MolReader.java 2008-07-19 14:04:07 UTC (rev 9616) @@ -220,17 +220,24 @@ int atomIndex2 = parseInt(line, 3, 6); int order = parseInt(line, 6, 9); switch (order) { + case 1: + case 2: + case 3: + break; case 4: order = JmolAdapter.ORDER_AROMATIC; break; + case 5: + order = JmolAdapter.ORDER_PARTIAL12; + break; case 6: order = JmolAdapter.ORDER_AROMATIC_SINGLE; break; case 7: order = JmolAdapter.ORDER_AROMATIC_DOUBLE; break; - case 5: - order = JmolAdapter.ORDER_PARTIAL12; + case 8: + order = JmolAdapter.ORDER_PARTIAL01; break; } atomSetCollection Modified: trunk/Jmol/src/org/jmol/modelset/ModelLoader.java =================================================================== --- trunk/Jmol/src/org/jmol/modelset/ModelLoader.java 2008-07-19 05:52:13 UTC (rev 9615) +++ trunk/Jmol/src/org/jmol/modelset/ModelLoader.java 2008-07-19 14:04:07 UTC (rev 9616) @@ -541,8 +541,6 @@ models[iLast].firstAtomIndex = i; models[iLast].bsAtoms = null; } - //if (uFactors != null) - //System.out.println(Escape.escape(uFactors, false)); } private void addAtom(int modelIndex, BitSet atomSymmetry, int atomSite, @@ -608,7 +606,6 @@ if (specialAtomName != null) { Integer boxedI = new Integer(i); htAtom.put(specialAtomName, boxedI); - //System.out.println("atom: "+specialAtomName+" "+i); } } } Modified: trunk/Jmol/src/org/jmol/modelsetbio/AlphaPolymer.java =================================================================== --- trunk/Jmol/src/org/jmol/modelsetbio/AlphaPolymer.java 2008-07-19 05:52:13 UTC (rev 9615) +++ trunk/Jmol/src/org/jmol/modelsetbio/AlphaPolymer.java 2008-07-19 14:04:07 UTC (rev 9616) @@ -52,7 +52,7 @@ //these two can be the same if this is a carbon-only polymer if (indexEnd < indexStart) { - Logger.error("structure definition error\n" + + Logger.error("AlphaPolymer:addSecondaryStructure error: " + " indexStart:" + indexStart + " indexEnd:" + indexEnd); return; Modified: trunk/Jmol/src/org/jmol/viewer/Eval.java =================================================================== --- trunk/Jmol/src/org/jmol/viewer/Eval.java 2008-07-19 05:52:13 UTC (rev 9615) +++ trunk/Jmol/src/org/jmol/viewer/Eval.java 2008-07-19 14:04:07 UTC (rev 9616) @@ -8344,9 +8344,10 @@ checkStatementLength(iToken + 1); if (isSyntaxCheck) return true; - if (bs != null) + if (bs == null) + setShapeProperty(JmolConstants.SHAPE_LABELS, str, propertyValue); + else viewer.setShapeProperty(JmolConstants.SHAPE_LABELS, str, propertyValue, bs); - else setShapeProperty(JmolConstants.SHAPE_LABELS, str, propertyValue); return true; } Modified: trunk/Jmol/src/org/jmol/viewer/Jmol.properties =================================================================== --- trunk/Jmol/src/org/jmol/viewer/Jmol.properties 2008-07-19 05:52:13 UTC (rev 9615) +++ trunk/Jmol/src/org/jmol/viewer/Jmol.properties 2008-07-19 14:04:07 UTC (rev 9616) @@ -3,6 +3,7 @@ version=11.5.48_dev +# new feature: mol file bond type 8 as partial # code: compiler error reporting improved # bug fix: PDB site definition does not ignore empty site definitions # bug fix: DEFINE can cause compiling error, e.g. "[2MO]" in 1tmo This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ha...@us...> - 2008-07-23 00:46:00
|
Revision: 9628 http://jmol.svn.sourceforge.net/jmol/?rev=9628&view=rev Author: hansonr Date: 2008-07-23 00:45:55 +0000 (Wed, 23 Jul 2008) Log Message: ----------- code simplification/cleaning Modified Paths: -------------- trunk/Jmol/src/org/jmol/jvxl/data/VolumeData.java trunk/Jmol/src/org/jmol/jvxl/readers/IsoShapeReader.java trunk/Jmol/src/org/jmol/jvxl/readers/JvxlReader.java trunk/Jmol/src/org/jmol/jvxl/readers/VoxelReader.java trunk/Jmol/src/org/jmol/modelset/ModelCollection.java trunk/Jmol/src/org/jmol/modelsetbio/BioPolymer.java trunk/Jmol/src/org/jmol/shape/Measures.java trunk/Jmol/src/org/jmol/shape/Mesh.java trunk/Jmol/src/org/jmol/viewer/Jmol.properties Modified: trunk/Jmol/src/org/jmol/jvxl/data/VolumeData.java =================================================================== --- trunk/Jmol/src/org/jmol/jvxl/data/VolumeData.java 2008-07-22 19:08:50 UTC (rev 9627) +++ trunk/Jmol/src/org/jmol/jvxl/data/VolumeData.java 2008-07-23 00:45:55 UTC (rev 9628) @@ -186,7 +186,6 @@ pt.scaleAdd(x, volumetricVectors[0], volumetricOrigin); pt.scaleAdd(y, volumetricVectors[1], pt); pt.scaleAdd(z, volumetricVectors[2], pt); - return; } public void setUnitVectors() { @@ -206,29 +205,25 @@ return (vector.dot(unitVolumetricVectors[voxelVectorIndex]) / volumetricVectorLengths[voxelVectorIndex]); } - private void xyzToVoxelPt(Point3f point, Point3f pt2) { - pointVector.set(point); - pointVector.sub(volumetricOrigin); - pt2.x = scaleByVoxelVector(pointVector, 0); - pt2.y = scaleByVoxelVector(pointVector, 1); - pt2.z = scaleByVoxelVector(pointVector, 2); + public void xyzToVoxelPt(float x, float y, float z, Point3i pt3i) { + pointVector.set(x, y, z); + setVoxelPoint(); + pt3i.set((int) ptXyzTemp.x, (int) ptXyzTemp.y, (int) ptXyzTemp.z); } - public void xyzToVoxelPt(float x, float y, float z, Point3i pt2) { - pointVector.set(x, y, z); + private void setVoxelPoint() { pointVector.sub(volumetricOrigin); ptXyzTemp.x = scaleByVoxelVector(pointVector, 0); ptXyzTemp.y = scaleByVoxelVector(pointVector, 1); ptXyzTemp.z = scaleByVoxelVector(pointVector, 2); - pt2.set((int) ptXyzTemp.x, (int) ptXyzTemp.y, (int) ptXyzTemp.z); } - + public float lookupInterpolatedVoxelValue(Point3f point) { //ARGH!!! ONLY FOR ORTHOGONAL AXES!!!!! //the dot product presumes axes are PERPENDICULAR. - Point3f pt = new Point3f(); - xyzToVoxelPt(point, pt); - return getInterpolatedVoxelValue(pt); + pointVector.set(point); + setVoxelPoint(); + return getInterpolatedVoxelValue(ptXyzTemp); } private float getInterpolatedVoxelValue(Point3f pt) { Modified: trunk/Jmol/src/org/jmol/jvxl/readers/IsoShapeReader.java =================================================================== --- trunk/Jmol/src/org/jmol/jvxl/readers/IsoShapeReader.java 2008-07-22 19:08:50 UTC (rev 9627) +++ trunk/Jmol/src/org/jmol/jvxl/readers/IsoShapeReader.java 2008-07-23 00:45:55 UTC (rev 9628) @@ -38,10 +38,6 @@ sphere_radiusAngstroms = radius; } - IsoShapeReader(SurfaceGenerator sg) { - super(sg); - } - IsoShapeReader(SurfaceGenerator sg, int n, int l, int m, float z_eff) { super(sg); psi_n = n; @@ -114,7 +110,14 @@ protected float getValue(int x, int y, int z) { volumeData.voxelPtToXYZ(x, y, z, ptPsi); - getCalcPoint(ptPsi); + ptPsi.sub(center); + if (isEccentric) + eccentricityMatrixInverse.transform(ptPsi); + if (isAnisotropic) { + ptPsi.x /= anisotropy[0]; + ptPsi.y /= anisotropy[1]; + ptPsi.z /= anisotropy[2]; + } if (sphere_radiusAngstroms > 0) { if (params.anisoB != null) { @@ -137,18 +140,7 @@ float value = (float) hydrogenAtomPsiAt(ptPsi, psi_n, psi_l, psi_m); return (allowNegative || value >= 0 ? value : 0); } - - private void getCalcPoint(Point3f pt) { - pt.sub(center); - if (isEccentric) - eccentricityMatrixInverse.transform(pt); - if (isAnisotropic) { - pt.x /= anisotropy[0]; - pt.y /= anisotropy[1]; - pt.z /= anisotropy[2]; - } - } - + private void setHeader(String line1) { jvxlFileHeaderBuffer = new StringBuffer(line1); if(sphere_radiusAngstroms > 0) { Modified: trunk/Jmol/src/org/jmol/jvxl/readers/JvxlReader.java =================================================================== --- trunk/Jmol/src/org/jmol/jvxl/readers/JvxlReader.java 2008-07-22 19:08:50 UTC (rev 9627) +++ trunk/Jmol/src/org/jmol/jvxl/readers/JvxlReader.java 2008-07-23 00:45:55 UTC (rev 9628) @@ -447,14 +447,14 @@ } protected float readSurfacePoint(float cutoff, boolean isCutoffAbsolute, float valueA, - float valueB, Point3f pointA, Vector3f edgeVector, float[] fReturn) { - float fraction; + float valueB, Point3f pointA, Vector3f edgeVector, + float[] fReturn, Point3f ptReturn) { if (edgeDataCount <= 0) return super.readSurfacePoint(cutoff, isCutoffAbsolute, valueA, valueB, - pointA, edgeVector, fReturn); - fraction = jvxlGetNextFraction(edgeFractionBase, edgeFractionRange, 0.5f); - ptTemp.scaleAdd(fraction, edgeVector, pointA); - return fReturn[0] = fraction; + pointA, edgeVector, fReturn, ptReturn); + ptReturn.scaleAdd(fReturn[0] = jvxlGetNextFraction(edgeFractionBase, edgeFractionRange, 0.5f), + edgeVector, pointA); + return fReturn[0]; } private int fractionPtr; Modified: trunk/Jmol/src/org/jmol/jvxl/readers/VoxelReader.java =================================================================== --- trunk/Jmol/src/org/jmol/jvxl/readers/VoxelReader.java 2008-07-22 19:08:50 UTC (rev 9627) +++ trunk/Jmol/src/org/jmol/jvxl/readers/VoxelReader.java 2008-07-23 00:45:55 UTC (rev 9628) @@ -206,6 +206,8 @@ protected Vector3f[] volumetricVectors; protected int[] voxelCounts; protected float[][][] voxelData; + +// boolean mustCalcPoint = true; // for now void setVolumeData(VolumeData v) { nBytes = 0; @@ -214,7 +216,9 @@ voxelCounts = v.voxelCounts; voxelData = v.voxelData; volumeData = v; - } +/* if (mustCalcPoint) + v.setDataSource(this); +*/ } abstract void readVolumeParameters(); @@ -409,7 +413,7 @@ Point3f pointA, Vector3f edgeVector, boolean isContourType) { float thisValue = readSurfacePoint(cutoff, isCutoffAbsolute, valueA, - valueB, pointA, edgeVector, fReturn); + valueB, pointA, edgeVector, fReturn, ptTemp); /* * In the case of a setup for a Marching Squares calculation, * we are collecting just the desired type of intersection for the 2D marching @@ -439,13 +443,14 @@ protected float readSurfacePoint(float cutoff, boolean isCutoffAbsolute, float valueA, float valueB, Point3f pointA, - Vector3f edgeVector, float[] fReturn) { + Vector3f edgeVector, + float[] fReturn, Point3f ptReturn) { //JvxlReader may or may not call this - float fraction, thisValue; + float diff = valueB - valueA; - fraction = (cutoff - valueA) / diff; + float fraction = (cutoff - valueA) / diff; if (isCutoffAbsolute && (fraction < 0 || fraction > 1)) fraction = (-cutoff - valueA) / diff; @@ -459,9 +464,9 @@ fractionData.append(JvxlReader.jvxlFractionAsCharacter(fraction, edgeFractionBase, edgeFractionRange)); - thisValue = valueA + fraction * diff; - ptTemp.scaleAdd(fraction, edgeVector, pointA); - return thisValue; + ptReturn.scaleAdd(fraction, edgeVector, pointA); + //System.out.println("VoxelReader " + ptReturn + " " + (valueA + fraction * diff)); + return valueA + fraction * diff; } public int addVertexCopy(Point3f vertexXYZ, float value, int assocVertex) { @@ -754,4 +759,8 @@ if (meshDataServer != null) meshDataServer.fillMeshData(meshData, MeshData.MODE_PUT_SETS); } + + public void getCalcPoint(Point3f pt) { + // for VertexDataServer - isoShapeReader only + } } Modified: trunk/Jmol/src/org/jmol/modelset/ModelCollection.java =================================================================== --- trunk/Jmol/src/org/jmol/modelset/ModelCollection.java 2008-07-22 19:08:50 UTC (rev 9627) +++ trunk/Jmol/src/org/jmol/modelset/ModelCollection.java 2008-07-23 00:45:55 UTC (rev 9628) @@ -50,6 +50,7 @@ import org.jmol.util.TextFormat; import org.jmol.viewer.JmolConstants; import org.jmol.viewer.Token; +import org.jmol.viewer.Viewer; abstract public class ModelCollection extends BondCollection { @@ -840,7 +841,7 @@ Model model = models[i]; int nPoly = model.getBioPolymerCount(); for (int p = 0; p < nPoly; p++) - model.bioPolymers[p].getPdbData('w','p', 1, false, null, null, null, null); + model.bioPolymers[p].getPdbData('s','p', 2, false, null, null, null, null); } } @@ -954,7 +955,8 @@ return s; String remark = "REMARK 6 Jmol PDB-encoded data: " + type + ";"; if (ctype != 'R') - remark += " quaternionFrame = \"" + qtype + "\""; + remark += " quaternionFrame = \"" + qtype + "\""; + remark += "\nREMARK 6 Jmol Version " + Viewer.getJmolVersion(); String data; switch (ctype) { default: Modified: trunk/Jmol/src/org/jmol/modelsetbio/BioPolymer.java =================================================================== --- trunk/Jmol/src/org/jmol/modelsetbio/BioPolymer.java 2008-07-22 19:08:50 UTC (rev 9627) +++ trunk/Jmol/src/org/jmol/modelsetbio/BioPolymer.java 2008-07-23 00:45:55 UTC (rev 9628) @@ -474,14 +474,6 @@ BitSet bsAtoms, StringBuffer pdbATOM, StringBuffer pdbCONECT, BitSet bsSelected) { int atomno = Integer.MIN_VALUE; - Quaternion qlast = null; - Quaternion qprev = null; - Quaternion dq = null; - Quaternion dqprev = null; - Quaternion ddq = null; - float factor = (ctype == 'R' ? 1f : 10f); - float x = 0, y = 0, z = 0, w = 0; - //boolean isQuaternion = ("wxyz".indexOf(ctype) >= 0); boolean isRamachandran = (ctype == 'R'); if (isRamachandran && !p.calcPhiPsiAngles()) return; @@ -492,35 +484,49 @@ * * 'c' C-alpha, as defined by Andy Hanson, U. of Indiana (unpublished results) * - * X: CA-C (carbonyl carbon) - * Z: (CA-C) x (CA-N) + * X: CA->C (carbonyl carbon) + * Z: X x (CA->N) * Y: Z x X * * 'p' Peptide plane as defined by Bob Hanson, St. Olaf College (unpublished results) * - * X: CA- + * X: C->CA + * Z: X x (C->N') + * Y: Z x X + * + * 'n' NMR frame using Beta = 17 degrees (Quine, Cross, et al.) + * + * Y: (N->H) x (N->CA) + * X: R[Y,-17](N->H) + * Z: X x Y * - * - * - * * quaternion types: * * w, x, y, z : which of the q-terms to expunge in order to display * the other three. * + * * a : absolute (standard) derivative * r : relative (commuted) derivative + * s : same as w but for calculating straightness * */ Atom aprev = null; + Quaternion qprev = null; + Quaternion dq = null; + Quaternion dqprev = null; + float factor = (ctype == 'R' ? 1f : 10f); + float x = 0, y = 0, z = 0, w = 0; String strExtra = ""; boolean isAmino = (p instanceof AminoPolymer); boolean isRelativeAlias = (ctype == 'r'); + if (derivType == 2 && isRelativeAlias) + ctype = 'w'; + if (ctype == 's') + derivType = 2; String prefix = (derivType > 0 ? "dq" + (derivType == 2 ? "2" : "") : "q"); float psiLast = Float.NaN; - if (derivType == 2 && isRelativeAlias) - ctype = 'w'; Quaternion q; for (int m = 0; m < p.monomerCount; m++) { Monomer monomer = p.monomers[m]; @@ -528,6 +534,9 @@ Atom a = monomer.getLeadAtom(); char cid = monomer.getChainID(); String id = "" + monomer.getResno() + (cid == '\0' ? "" : "" + cid); + cid = monomer.getLeadAtom().getAlternateLocationID(); + if (cid != '\0') + id += cid; if (isRamachandran) { x = monomer.getPhi(); y = monomer.getPsi(); @@ -536,8 +545,7 @@ z += 360; z -= 180; // center on 0 if (Float.isNaN(x) || Float.isNaN(y) || Float.isNaN(z)) - continue; - + continue; if (isDraw) { if (bsSelected != null && !bsSelected.get(a.getAtomIndex())) continue; @@ -560,7 +568,6 @@ .append(" color ").append(qColor[1]).append('\n'); continue; } - w = a.getPartialCharge(); float phiNext = (m == p.monomerCount - 1 ? Float.NaN : p.monomers[m + 1].getPhi()); @@ -579,72 +586,73 @@ z = angle; } } else { - cid = monomer.getLeadAtom().getAlternateLocationID(); - if (cid != '\0') - id += cid; - q = monomer.getQuaternion(qtype); - if (q == null) { - qlast = null; - atomno = Integer.MIN_VALUE; - continue; - } - if (derivType > 0) { - if (aprev == null) { - qprev = q; - aprev = a; - continue; - } - // get dq or dq* - if (isRelativeAlias) { - // ctype = 'r'; - // relative quaterion derivative = Q(i_inverse) * Q(i+1) - // R = Q(i_inverse) * Q(i+1) * (0, v) * Q(i+1_inverse) * Q(i) - // used for aligning all standard amino acids along X axis - // in the second derivative and in an ellipse in the first derivative - dq = qprev.inv().mul(q); + // quaternion + if ((q = monomer.getQuaternion(qtype)) == null) { + qprev = null; + } else if (derivType > 0) { + Atom anext = a; + Quaternion qnext = q; + if (qprev == null) { + q = null; + dqprev = null; } else { - // ctype = 'a' or 'w' - // the standard difference dq - // absolute quaterion derivative = Q(i+1) * Q(i_inverse) - // R = Q(i+1) * Q(i_inverse) * (0, v) * Q(i) * Q(i+1_inverse) - // used for definition of the local helical axis - dq = q.mul(qprev.inv()); - } - // save this q as q' - qprev = q; - if (derivType == 2) { - // SECOND derivative: - if (dqprev == null) { - dqprev = dq; - aprev = a; - continue; + // back up to previous frame pointer + a = aprev; + q = qprev; + monomer = (Monomer) a.getGroup(); + // get dq or dq* for PREVIOUS atom + if (isRelativeAlias) { + // ctype = 'r'; + // dq*[i] = q[i] \ q[i+1] + // R(v) = q[i] \ q(i+1) * (0, v) * q[i+1] \ q[i] + // used for aligning all standard amino acids along X axis + // in the second derivative and in an ellipse in the first derivative + dq = q.inv().mul(qnext); + } else { + // ctype = 'a' or 'w' or 's' + // the standard "absolute" difference dq + // dq[i] = q[i+1] / q[i] + // R(v) = q[i+1] / q[i] * (0, v) * q[i] / q[i+1] + // used for definition of the local helical axis + dq = qnext.mul(q.inv()); } - // standard second deriv. - ddq = dq.mul(dqprev.inv()); + if (derivType == 1) { + // first deriv: + q = dq; + } else if (dqprev == null) { + q = null; + } else { + /* + * standard second deriv. + + ddq[i] =defined= (q[i+1] \/ q[i]) / (q[i] \/ q[i-1]) + + Relative to the previous atom as "i" (which is now "a"), we have: + + dqprev = q[i] \/ q[i-1] + dq = q[i+1] \/ q[i] + + and so + + ddq[i] = dq / dqprev + + Looks odd, perhaps, because it is written "dq[i] / dq[i-1]" + but this is correct; we are assigning ddq to the correct atom. + + */ + q = dq.mul(dqprev.inv()); + if (ctype == 's') + a.getGroup().setStraightness(getStraightness(id, dqprev, dq)); + } dqprev = dq; - q = ddq; - } else { - // first deriv: - q = dq; } - if (derivType == 1 && aprev != null && qlast != null - && ctype == 'w') - aprev.getGroup().setStraightness(getStraightness(id, qlast, q)); - - // and assign a to aprev so that the proper - // residue gets reported. - // without these next three lines, the first - // residues of helices and sheets are missed; - // with these lines, the last residues of - // helices and sheets are missed - // (in terms of assigning structure from quaternions). - Atom atemp = a; - monomer = (Monomer) (a = aprev).getGroup(); - aprev = atemp; - // save this dq as dq' - dqprev = dq; + aprev = anext; + qprev = qnext; } - qlast = q; + if (q == null) { + atomno = Integer.MIN_VALUE; + continue; + } switch (ctype) { default: x = q.q1; Modified: trunk/Jmol/src/org/jmol/shape/Measures.java =================================================================== --- trunk/Jmol/src/org/jmol/shape/Measures.java 2008-07-22 19:08:50 UTC (rev 9627) +++ trunk/Jmol/src/org/jmol/shape/Measures.java 2008-07-23 00:45:55 UTC (rev 9628) @@ -401,7 +401,7 @@ } private void deleteMeasurement(int i) { - viewer.setStatusMeasuring("measureDeleted", i, ""); + viewer.setStatusMeasuring("measureDeleted", i, measurements[i].toVector().toString()); System.arraycopy(measurements, i + 1, measurements, i, measurementCount - i - 1); --measurementCount; @@ -489,7 +489,7 @@ return; if (measurementPending.getCount() > 1) viewer.setStatusMeasuring("measurePending", - measurementPending.getCount(), measurementPending.getString()); + measurementPending.getCount(), measurementPending.toVector().toString()); } private void reformatDistances() { Modified: trunk/Jmol/src/org/jmol/shape/Mesh.java =================================================================== --- trunk/Jmol/src/org/jmol/shape/Mesh.java 2008-07-22 19:08:50 UTC (rev 9627) +++ trunk/Jmol/src/org/jmol/shape/Mesh.java 2008-07-23 00:45:55 UTC (rev 9628) @@ -203,7 +203,7 @@ polygonIndexes = new int[polygonCount][]; } - public int addVertexCopy(Point3f vertex) { //used by mps + public int addVertexCopy(Point3f vertex) { //used by mps and surfaceGenerator if (vertexCount == 0) vertices = new Point3f[SEED_COUNT]; else if (vertexCount == vertices.length) Modified: trunk/Jmol/src/org/jmol/viewer/Jmol.properties =================================================================== --- trunk/Jmol/src/org/jmol/viewer/Jmol.properties 2008-07-22 19:08:50 UTC (rev 9627) +++ trunk/Jmol/src/org/jmol/viewer/Jmol.properties 2008-07-23 00:45:55 UTC (rev 9628) @@ -3,6 +3,9 @@ version=11.5.50_dev +# code: various cleaning/simplifying +# code: way cleaner quaternion derivative calculation code + # ----------------------------------------------------------------------------- #version=11.5.49 This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ha...@us...> - 2008-07-23 07:27:56
|
Revision: 9629 http://jmol.svn.sourceforge.net/jmol/?rev=9629&view=rev Author: hansonr Date: 2008-07-23 07:27:54 +0000 (Wed, 23 Jul 2008) Log Message: ----------- version=11.5.50_dev # bug fix: $ptx[2] notation broken in 11.5.49 Modified Paths: -------------- trunk/Jmol/src/org/jmol/shapespecial/Draw.java trunk/Jmol/src/org/jmol/viewer/Jmol.properties Modified: trunk/Jmol/src/org/jmol/shapespecial/Draw.java =================================================================== --- trunk/Jmol/src/org/jmol/shapespecial/Draw.java 2008-07-23 00:45:55 UTC (rev 9628) +++ trunk/Jmol/src/org/jmol/shapespecial/Draw.java 2008-07-23 07:27:54 UTC (rev 9629) @@ -377,7 +377,7 @@ if ((pt2 = axisID.lastIndexOf("]")) < pt) pt2 = axisID.length(); try { - vertexIndex = Integer.parseInt(axisID.substring(pt + 1), pt2) - 1; + vertexIndex = Integer.parseInt(axisID.substring(pt + 1, pt2)) - 1; } catch (Exception e) { // ignore } Modified: trunk/Jmol/src/org/jmol/viewer/Jmol.properties =================================================================== --- trunk/Jmol/src/org/jmol/viewer/Jmol.properties 2008-07-23 00:45:55 UTC (rev 9628) +++ trunk/Jmol/src/org/jmol/viewer/Jmol.properties 2008-07-23 07:27:54 UTC (rev 9629) @@ -3,6 +3,7 @@ version=11.5.50_dev +# bug fix: $ptx[2] notation broken in 11.5.49 # code: various cleaning/simplifying # code: way cleaner quaternion derivative calculation code This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ha...@us...> - 2008-07-26 04:42:20
|
Revision: 9648 http://jmol.svn.sourceforge.net/jmol/?rev=9648&view=rev Author: hansonr Date: 2008-07-26 04:42:17 +0000 (Sat, 26 Jul 2008) Log Message: ----------- 11.5.51 (b) VERSION (fixes axes position [xx yy] bug in 11.5.51) Modified Paths: -------------- trunk/Jmol/src/org/jmol/shape/AxesRenderer.java trunk/Jmol/src/org/jmol/viewer/Jmol.properties Modified: trunk/Jmol/src/org/jmol/shape/AxesRenderer.java =================================================================== --- trunk/Jmol/src/org/jmol/shape/AxesRenderer.java 2008-07-26 00:00:10 UTC (rev 9647) +++ trunk/Jmol/src/org/jmol/shape/AxesRenderer.java 2008-07-26 04:42:17 UTC (rev 9648) @@ -74,7 +74,7 @@ } else if (isXY) { nPoints = 3; labelPtr = 9; - } if (axesMode == JmolConstants.AXES_MODE_BOUNDBOX) { + } else if (axesMode == JmolConstants.AXES_MODE_BOUNDBOX) { nPoints = 6; labelPtr = (viewer.getAxesOrientationRasmol() ? 15 : 9); } Modified: trunk/Jmol/src/org/jmol/viewer/Jmol.properties =================================================================== --- trunk/Jmol/src/org/jmol/viewer/Jmol.properties 2008-07-26 00:00:10 UTC (rev 9647) +++ trunk/Jmol/src/org/jmol/viewer/Jmol.properties 2008-07-26 04:42:17 UTC (rev 9648) @@ -1,7 +1,7 @@ # Developers: to add a description of changes you have made, # add it on line starting with # below the "version=..." line -version=11.5.51 +version=11.5.51 (b) # bug fix: 11.5.49 and 11.5.50 broken for ".max" This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ha...@us...> - 2008-07-30 03:06:15
|
Revision: 9654 http://jmol.svn.sourceforge.net/jmol/?rev=9654&view=rev Author: hansonr Date: 2008-07-30 03:06:09 +0000 (Wed, 30 Jul 2008) Log Message: ----------- version=11.5.52_dev # new feature: calculate pointGroup -- preliminary only -- untested Modified Paths: -------------- trunk/Jmol/src/org/jmol/modelset/Model.java trunk/Jmol/src/org/jmol/modelset/ModelSet.java trunk/Jmol/src/org/jmol/util/Quaternion.java trunk/Jmol/src/org/jmol/viewer/Eval.java trunk/Jmol/src/org/jmol/viewer/Jmol.properties trunk/Jmol/src/org/jmol/viewer/Token.java trunk/Jmol/src/org/jmol/viewer/Viewer.java Added Paths: ----------- trunk/Jmol/src/org/jmol/symmetry/PointGroup.java Modified: trunk/Jmol/src/org/jmol/modelset/Model.java =================================================================== --- trunk/Jmol/src/org/jmol/modelset/Model.java 2008-07-29 23:30:17 UTC (rev 9653) +++ trunk/Jmol/src/org/jmol/modelset/Model.java 2008-07-30 03:06:09 UTC (rev 9654) @@ -27,6 +27,7 @@ import java.util.Hashtable; import java.util.Properties; +import org.jmol.symmetry.PointGroup; import org.jmol.util.BitSetUtil; import org.jmol.viewer.StateManager.Orientation; @@ -132,6 +133,8 @@ Orientation orientation; + PointGroup pointGroup; + Model(ModelSet modelSet, int modelIndex, int trajectoryBaseIndex, String jmolData, Properties properties, Hashtable auxiliaryInfo) { this.modelSet = modelSet; @@ -156,6 +159,10 @@ } } + PointGroup getPointGroup() { + return pointGroup; + } + void setNAltLocs(int nAltLocs) { this.nAltLocs = nAltLocs; } Modified: trunk/Jmol/src/org/jmol/modelset/ModelSet.java =================================================================== --- trunk/Jmol/src/org/jmol/modelset/ModelSet.java 2008-07-29 23:30:17 UTC (rev 9653) +++ trunk/Jmol/src/org/jmol/modelset/ModelSet.java 2008-07-30 03:06:09 UTC (rev 9654) @@ -32,6 +32,7 @@ import org.jmol.viewer.Token; import org.jmol.atomdata.AtomData; import org.jmol.shape.Shape; +import org.jmol.symmetry.PointGroup; import java.util.BitSet; import java.util.Hashtable; @@ -422,6 +423,16 @@ } } + public String calculatePointGroup(BitSet bsAtoms) { + int iAtom = BitSetUtil.firstSetBit(bsAtoms); + int modelIndex = atoms[iAtom].getModelIndex(); + for (int i = 0; i < atomCount; i++) + if (bsAtoms.get(i) && atoms[i].modelIndex != modelIndex) + bsAtoms.clear(i); + PointGroup pg = new PointGroup(atoms, bsAtoms); + models[modelIndex].pointGroup = pg; + return pg.getName(); + } private BitSet modelsOf(BitSet bsAtoms, BitSet bsAllAtoms) { BitSet bsModels = new BitSet(modelCount); Added: trunk/Jmol/src/org/jmol/symmetry/PointGroup.java =================================================================== --- trunk/Jmol/src/org/jmol/symmetry/PointGroup.java (rev 0) +++ trunk/Jmol/src/org/jmol/symmetry/PointGroup.java 2008-07-30 03:06:09 UTC (rev 9654) @@ -0,0 +1,627 @@ +/* $RCSfile$ + * $Author: egonw $ + * $Date: 2005-11-10 09:52:44 -0600 (Thu, 10 Nov 2005) $ + * $Revision: 4255 $ + * + * Copyright (C) 2003-2005 Miguel, Jmol Development, www.jmol.org + * + * Contact: mi...@jm... + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +package org.jmol.symmetry; + +import java.util.BitSet; +import javax.vecmath.Point3f; +import javax.vecmath.Vector3f; + +import org.jmol.modelset.Atom; +import org.jmol.util.BitSetUtil; +import org.jmol.util.Escape; +import org.jmol.util.Logger; +import org.jmol.util.Quaternion; + +/* + * Bob Hanson 7/2008 + * + * brute force -- preliminary from BCCE20 meeting 2008 + * + */ + +public class PointGroup { + + private String name = "C_1"; + + public String getName() { + return name; + } + + private int nOperations = 0; + + public int getOperationCount() { + return nOperations; + } + + private Operation[] operations; + + public Operation getOperation(int i) { + if (i >= nOperations) + return null; + return operations[i]; + } + + private final Vector3f vTemp = new Vector3f(); + private int centerAtomIndex = -1; + + final private Point3f center = new Point3f(); + + public PointGroup(Atom[] atomset, BitSet bsAtoms) { + Point3f[] atoms; + if ((atoms = getCenter(atomset, bsAtoms)) == null) + return; + int[] elements = new int[atoms.length]; + int n = 0; + for (int i = atomset.length; --i >= 0;) + if (bsAtoms.get(i)) + elements[n++] = atomset[i].getElementNumber(); + boolean haveInversionCenter = haveInversionCenter(atoms, elements); + if (isLinear(atoms)) { + if (haveInversionCenter) { + name = "D_(infinity)h"; + nOperations = 2; + operations = new Operation[2]; + operations[0] = new Operation(vTemp, 0); + operations[1] = new Operation(vTemp); + } else { + name = "C_(infinity)v"; + nOperations = 1; + operations = new Operation[2]; + operations[0] = new Operation(vTemp, 0); + } + return; + } + int[] nC = new int[9]; + Operation[][] axes = new Operation[9][]; + Operation[] planes = null; + int nPlanes = 0; + findAxes(atoms, elements, nC, axes, false); + for (n = 9; --n > 1 && nC[n] == 0;) { + } + n = findAxesByElement(atoms, elements, nC, axes, haveInversionCenter); + if (nC[3] > 1) { + // must be Ix, Ox, or Tx + if (nC[5] > 1) { + planes = new Operation[20]; + nPlanes = findPlanes(atoms, elements, nC, planes, axes[2], nC[2]); + if (haveInversionCenter) { + name = "I_h"; + } else { + name = "I"; + } + } else if (nC[4] > 1) { + if (haveInversionCenter) { + name = "O_h"; + } else { + name = "O"; + } + } else { + planes = new Operation[6]; + nPlanes = findPlanes(atoms, elements, nC, planes, axes[2], nC[2]); + if (nPlanes > 0) { + if (haveInversionCenter) { + name = "T_h"; + } else { + name = "T_d"; + } + } else { + name = "T"; + } + } + } else { + // options Dnh, Dnd, Dn, Cnh, Cnv, Cn, Sn, Ci, Cs + planes = new Operation[9]; + nPlanes = findPlanes(atoms, elements, nC, planes, axes[2], nC[2]); + if (nPlanes > 1 && nPlanes <= 8 && nC[nPlanes] == 0) { + vTemp.cross(planes[0].normalOrAxis, planes[1].normalOrAxis); + if (!checkAxisOrder(atoms, elements, nC, nPlanes, vTemp, axes, center, + false) + && nPlanes > 2) { + vTemp.cross(planes[1].normalOrAxis, planes[2].normalOrAxis); + checkAxisOrder(atoms, elements, nC, nPlanes - 1, vTemp, axes, center, + false); + } + } + for (n = 9; --n > 1 && nC[n] == 0;) { + } + if (nC[2] == 0 && nPlanes > 0) { + for (int i = 0; i < nPlanes - 1; i++) { + for (int j = i + 1; j < nPlanes; j++) { + vTemp.add(planes[1].normalOrAxis, planes[2].normalOrAxis); + checkAxisOrder(atoms, elements, nC, 2, vTemp, axes, center, false); + } + } + + } + if (n < 2) { + if (nPlanes == 1) { + // C_s, C_i, S_n, C_1 + name = "C_s"; + nOperations = 1; + operations = new Operation[1]; + operations[0] = planes[0]; + return; + } + if (haveInversionCenter) { + name = "C_i"; + nOperations = 1; + operations = new Operation[1]; + operations[0] = new Operation(); + return; + } + name = "C_1?"; + } else if ((n % 2) == 1 && nC[2] > 0 || (n % 2) == 0 && nC[2] > 1) { + // Dnh, Dnd, Dn + switch (nPlanes - n) { + case 1: + name = "D_" + n + "h"; + break; + case 0: + name = "D_" + n + "d"; + break; + default: + if (axes[n][0].type == OPERATION_IMPROPER_AXIS) { + name = "S_" + n; + } else { + name = "D_" + n; + } + } + } else if (nPlanes == 1) { + name = "C_" + n + "h"; + } else if (nPlanes == n) { + name = "C_" + n + "v"; + } else { + if (axes[n][0].type == OPERATION_IMPROPER_AXIS) { + name = "S_" + n; + } else { + name = "C_" + n; + } + } + } + dumpAxes(nC, axes); + dumpPlanes(nPlanes, planes); + } + + private Atom[] getCenter(Atom[] atomset, BitSet bsAtoms) { + int atomCount = BitSetUtil.cardinalityOf(bsAtoms); + if (atomCount > 100) { + Logger.error("Too many atoms for point group calculation"); + return null; + } + Atom[] atoms = new Atom[atomCount]; + int nAtoms = 0; + for (int i = BitSetUtil.length(bsAtoms); --i >= 0;) + if (bsAtoms.get(i)) { + atoms[nAtoms] = atomset[i]; + center.add(atoms[nAtoms++]); + } + if (nAtoms < 2) + return null; + center.scale(1f / nAtoms); + for (int i = nAtoms; --i >= 0;) + if (atoms[i].distance(center) < 0.1) { + centerAtomIndex = i; + break; + } + return atoms; + } + + private boolean haveInversionCenter(Point3f[] atoms, int[] elements) { + return checkOperation(atoms, elements, null, center, true); + } + + private boolean checkOperation(Point3f[] atoms, int[] elements, Quaternion q, + Point3f center, boolean isInversion) { + Point3f pt = new Point3f(); + int nFound = 0; + out: for (int i = atoms.length; --i >= 0 && nFound < atoms.length;) + if (i == centerAtomIndex) { + nFound++; + } else { + Point3f a1 = atoms[i]; + int e1 = elements[i]; + if (q != null) { + pt.set(a1); + pt.sub(center); + q.transform(pt, pt); + pt.add(center); + } else { + pt.set(a1); + } + if (isInversion) { + vTemp.sub(center, pt); + pt.scaleAdd(2, vTemp, pt); + } + if ((q != null || isInversion) && pt.distance(a1) < 0.1) { + nFound++; + continue; + } + for (int j = atoms.length; --j >= 0;) { + if (j == i || elements[j] != e1) + continue; + Point3f a2 = atoms[j]; + if (pt.distance(a2) < 0.1) { + nFound++; + continue out; + } + } + } + return nFound == atoms.length; + } + + private boolean isLinear(Point3f[] atoms) { + Vector3f v1 = null; + for (int i = atoms.length; --i >= 0;) { + if (i == centerAtomIndex) + continue; + if (v1 == null) { + v1 = new Vector3f(); + v1.sub(atoms[i], center); + v1.normalize(); + vTemp.set(v1); + continue; + } + vTemp.sub(atoms[i], center); + vTemp.normalize(); + if (!isParallel(v1, vTemp)) + return false; + } + return true; + } + + private final static float LINEAR_DOT_MINIMUM = 0.9999f; + + private static boolean isParallel(Vector3f v1, Vector3f v2) { + return (Math.abs(v1.dot(v2)) >= LINEAR_DOT_MINIMUM); + } + + final static int[] axesMaxN = new int[] { 0, 0, 15, 10, 6, 6, 1, 1, 1 }; + + private Operation findAxes(Point3f[] atoms, int[] elements, int[] nC, + Operation[][] axes, boolean isImproper) { + Point3f pt = new Point3f(); + Point3f pt1 = new Point3f(); + Vector3f v1 = new Vector3f(); + Vector3f v2 = new Vector3f(); + Vector3f v3 = new Vector3f(); + for (int i = atoms.length; --i >= 0;) { + if (i == centerAtomIndex) + continue; + Point3f a1 = atoms[i]; + int e1 = elements[i]; + for (int j = atoms.length; --j > i;) { + Point3f a2 = atoms[j]; + if (elements[j] != e1) + continue; + if (isImproper) { + v1.sub(center, a1); + pt1.scaleAdd(2, v1, a1); + } else { + pt1.set(a1); + } + pt.add(pt1, a2); + pt.scale(0.5f); + v1.sub(a1, center); + v2.sub(a2, center); + v1.normalize(); + v2.normalize(); + if (isParallel(v1, v2)) { + if (!isImproper) { + for (int o = 2; o <= 8; o++) + checkAxisOrder(atoms, elements, nC, o, v1, axes, center, false); + } + continue; + } + if (nC[2] < axesMaxN[2]) { + v3.set(pt); + if (checkAxisOrder(atoms, elements, nC, 2, v3, axes, center, + isImproper) && !isImproper) + checkAxisOrder(atoms, elements, nC, -4, v3, axes, center, + true); + } + float order = (float) (2 * Math.PI / v1.angle(v2)); + int iOrder = (int) (order + 0.01f); + boolean isIntegerOrder =(order - iOrder <= 0.02f); + if (!isIntegerOrder) + continue; // not an integer order + if (isImproper) { + if (iOrder != 4 && iOrder != 6) + continue; + } + if (iOrder <= 8 && nC[iOrder] < axesMaxN[iOrder]) { + // not a valid order, or plenty of these already + v3.cross(v1, v2); + checkAxisOrder(atoms, elements, nC, iOrder, v3, axes, center, + isImproper); + } + } + } + if (isImproper) + return null; + Vector3f[] vs = new Vector3f[nC[2] * 2]; + for (int i = 0; i < vs.length; i++) + vs[i] = new Vector3f(); + int n = 0; + for (int i = 0; i < nC[2]; i++) { + vs[n++].set(axes[2][i].normalOrAxis); + vs[n].set(axes[2][i].normalOrAxis); + vs[n++].scale(-1); + } + for (int i = vs.length; --i >= 2;) + for (int j = i; --j >= 1;) + for (int k = j; --k >= 0;) { + v3.set(vs[i]); + v3.add(vs[j]); + v3.add(vs[k]); + if (v3.length() < 1.0) + continue; + checkAxisOrder(atoms, elements, nC, 3, v3, axes, center, false); + } + return null; + } + + private int findAxesByElement(Point3f[] atoms, int[] elements, int[] nC, + Operation[][] axes, boolean isInversion) { + Vector3f v1 = new Vector3f(); + Vector3f v2 = new Vector3f(); + Vector3f v3 = new Vector3f(); + Vector3f[] vs = new Vector3f[120]; + int[] eCounts = new int[120]; + int maxElement = 0; + for (int i = atoms.length; --i >= 0;) { + Point3f a1 = atoms[i]; + int e1 = elements[i]; + if (vs[e1] == null) + vs[e1] = new Vector3f(); + vs[e1].add(a1); + eCounts[e1]++; + if (e1 > maxElement) + maxElement = e1; + } + int nMin = Integer.MAX_VALUE; + int iMin = -1; + for (int i = 0; i <= maxElement; i++) + if (vs[i] != null) { + if (eCounts[i] < nMin && eCounts[i] > 1) { + nMin = eCounts[i]; + iMin = i; + } + vs[i].scale(1f / eCounts[i]); + } + if (!isInversion) { + for (int i = 0; i <= maxElement; i++) + if (vs[i] != null) + for (int j = 0; j <= maxElement; j++) { + if (i == j || vs[j] == null) + continue; + v1.set(vs[i]); + v1.sub(vs[j]); + //if (isInversion)v1.set(0,0,1); + //System.out.println("draw " + Escape.escape(center) + Escape.escape(v1)); + for (int o = 8; o >= 2; o--) { + checkAxisOrder(atoms, elements, nC, o, v1, axes, center, + isInversion); +// if (nC[o] > 0) + // return o; + } + } + } + out: for (int i = 0; i < atoms.length - 2; i++) + if (elements[i] == iMin) + for (int j = i + 1; j < atoms.length - 1; j++) + if (elements[j] == iMin) + for (int k = j + 1; k < atoms.length; k++) + if (elements[k] == iMin) { + v1.sub(atoms[i], atoms[j]); + v2.sub(atoms[i], atoms[k]); + v1.normalize(); + v2.normalize(); + v3.cross(v1, v2); + //System.out.println(v3 + " " + (v1.dot(v2)/Math.PI * 180)); + for (int o = 8; o >= 2; o--) { + if (!checkAxisOrder(atoms, elements, nC, o, v3, axes, center, + isInversion)) + checkAxisOrder(atoms, elements, nC, o, v3, axes, center, + !isInversion); + } + if (nC[5] > 2) + break out; + } + int n; + for (n = 9; --n > 1 && nC[n] == 0;) { + } + return n; + } + + private boolean checkAxisOrder(Point3f[] atoms, int[] elements, int[] nC, + int iOrder, Vector3f v, Operation[][] axes, + Point3f center, boolean doInversion) { + v.normalize(); + int aiOrder = Math.abs(iOrder); + if (haveAxis(nC, iOrder, v, axes[aiOrder])) + return false; + Quaternion q = new Quaternion(v, 360 / (iOrder < 0 ? -iOrder : iOrder)); + if (!checkOperation(atoms, elements, q, center, doInversion)) + return false; + addAxis(nC, (iOrder < 0 ? iOrder : doInversion ? -iOrder : iOrder), v, axes); + switch (iOrder) { + case 4: + addAxis(nC, 2, v, axes); + break; + case 6: + addAxis(nC, 2, v, axes); + addAxis(nC, 3, v, axes); + break; + case 8: + addAxis(nC, 2, v, axes); + addAxis(nC, 4, v, axes); + break; + } + return true; + } + + private void addAxis(int[] nC, int iOrder, Vector3f v, Operation[][] axes) { + int aiOrder = Math.abs(iOrder); + if (haveAxis(nC, iOrder, v, axes[aiOrder])) + return; + Operation[] axesSet = axes[aiOrder]; + if (axesSet == null) + axesSet = axes[aiOrder] = new Operation[axesMaxN[aiOrder]]; + axesSet[nC[aiOrder]++] = new Operation(v, iOrder); + } + + private boolean haveAxis(int[] nC, int iOrder, Vector3f v, Operation[] axes) { + iOrder = Math.abs(iOrder); + if (nC[iOrder] > 0) + for (int i = nC[iOrder]; --i >= 0;) { + if (isParallel(v, axes[i].normalOrAxis)) + return true; + } + return false; + } + + private int findPlanes(Point3f[] atoms, int[] elements, int[] nC, + Operation[] planes, Operation[] axesC2, int nC2) { + Point3f pt = new Point3f(); + Vector3f v1 = new Vector3f(); + Vector3f v2 = new Vector3f(); + Vector3f v3 = new Vector3f(); + int nPlanes = 0; + for (int i = atoms.length; --i >= 0;) { + if (i == centerAtomIndex) + continue; + Point3f a1 = atoms[i]; + int e1 = elements[i]; + for (int j = atoms.length; --j > i;) { + if (elements[j] != e1) + continue; + Point3f a2 = atoms[j]; + pt.add(a1, a2); + pt.scale(0.5f); + v1.sub(a1, center); + v2.sub(a2, center); + if (isParallel(v1, v2)) { + v3.set(v1); + } else { + v3.cross(v1, v2); + } + v3.normalize(); + if (!haveAxis(nC, 0, v3, planes) + && checkOperation(atoms, elements, new Quaternion(v3, 180), center, + true)) + nPlanes = addPlane(nC, v3, planes); + v3.set(a2); + v3.sub(a1); + v3.normalize(); + if (!haveAxis(nC, 0, v3, planes) + && checkOperation(atoms, elements, new Quaternion(v3, 180), pt, + true)) + nPlanes = addPlane(nC, v3, planes); + if (nPlanes == planes.length) + return nPlanes; + } + } + for (int i = 0; i < nC2; i++) { + v3 = axesC2[i].normalOrAxis; + if (!haveAxis(nC, 0, v3, planes) + && checkOperation(atoms, elements, new Quaternion(v3, 180), center, + true)) + nPlanes = addPlane(nC, v3, planes); + } + return nPlanes; + } + + private int addPlane(int[] nC, Vector3f v3, Operation[] planes) { + planes[nC[0]++] = new Operation(v3); + return nC[0]; + } + + final static int OPERATION_AXIS = 0; + final static int OPERATION_PLANE = 1; + final static int OPERATION_IMPROPER_AXIS = 2; + final static int OPERATION_INVERSION_CENTER = 3; + + final static String[] typeNames = { "axis", "plane", "improper axis", "center of inversion" }; + + public class Operation { + + int type; + int order; + Vector3f normalOrAxis; + + Operation() { + type = OPERATION_INVERSION_CENTER; + Logger.info("new operation -- " + typeNames[type]); + order = 1; + } + + Operation(Vector3f v, int i) { + type = (i < 0 ? OPERATION_IMPROPER_AXIS : OPERATION_AXIS); + order = i; + normalOrAxis = new Vector3f(v); + normalOrAxis.normalize(); + Logger.info("new operation -- " + typeNames[type] + " order = " + i + " " + normalOrAxis); + } + + Operation(Vector3f v) { + type = OPERATION_PLANE; + normalOrAxis = new Vector3f(v); + normalOrAxis.normalize(); + Logger.info("new operation -- " + typeNames[type] + " " + normalOrAxis ); + } + + public String toString() { + return type + " " + order + " " + normalOrAxis; + } + } + + private void dumpAxes(int[] nC, Operation[][] axes) { + Vector3f v = new Vector3f(); + for (int i = 2; i <= 8; i++) { + for (int j = 0; j < nC[i]; j++) { + v.set(axes[i][j].normalOrAxis); + String s = "draw va" + i + "_" + j + " scale 5.0 " + Escape.escape(v); + v.scale(-1); + s += Escape.escape(v); + System.out.println(s); + } + } + System.out.println("#NOTE: THIS IS AN INCOMPLETE LIST"); + } + + private void dumpPlanes(int n, Operation[] planes) { + Vector3f v = new Vector3f(); + for (int j = 0; j < n; j++) { + v.set(planes[j].normalOrAxis); + v.set(planes[j].normalOrAxis); + String s = "draw vp" + j + " scale 3.0 plane perp " + Escape.escape(v); + v.scale(-1); + s += Escape.escape(v); + System.out.println(s); + } + System.out.println("#NOTE: THIS IS AN INCOMPLETE LIST"); + } + +} Modified: trunk/Jmol/src/org/jmol/util/Quaternion.java =================================================================== --- trunk/Jmol/src/org/jmol/util/Quaternion.java 2008-07-29 23:30:17 UTC (rev 9653) +++ trunk/Jmol/src/org/jmol/util/Quaternion.java 2008-07-30 03:06:09 UTC (rev 9654) @@ -406,6 +406,12 @@ return ptNew; } + public void transform(Point3f pt, Point3f ptNew) { + if (mat == null) + setMatrix(); + mat.transform(pt, ptNew); + } + public Vector3f transform(Vector3f v) { if (mat == null) setMatrix(); Modified: trunk/Jmol/src/org/jmol/viewer/Eval.java =================================================================== --- trunk/Jmol/src/org/jmol/viewer/Eval.java 2008-07-29 23:30:17 UTC (rev 9653) +++ trunk/Jmol/src/org/jmol/viewer/Eval.java 2008-07-30 03:06:09 UTC (rev 9654) @@ -6173,6 +6173,7 @@ private void calculate() throws ScriptException { boolean isSurface = false; + BitSet bs; if ((iToken = statementLength) >= 2) { clearPredefined(JmolConstants.predefinedVariable); switch (getToken(1).tok) { @@ -6182,10 +6183,18 @@ viewer.addStateScript(thisCommand, false, true); } return; + case Token.pointgroup: + if (isSyntaxCheck) + return; + int modelIndex = viewer.getCurrentModelIndex(); + if (modelIndex < 0) + error(ERROR_multipleModelsNotOK, "CALCULATE SYMMETRY"); + showString(viewer.calculatePointGroup()); + return; case Token.surface: isSurface = true; - //deprecated - //fall through + //deprecated + //fall through case Token.surfacedistance: /* preferred: * @@ -6202,14 +6211,14 @@ isFrom = true; iToken--; } else if (!isSurface) { - isFrom = true; + isFrom = true; } - BitSet bsSelected = (iToken + 1 < statementLength ? expression(++iToken) - : viewer.getSelectionSet()); + bs = (iToken + 1 < statementLength ? expression(++iToken) : viewer + .getSelectionSet()); checkLength(++iToken); if (isSyntaxCheck) return; - viewer.calculateSurface(bsSelected, (isFrom ? Float.MAX_VALUE : -1)); + viewer.calculateSurface(bs, (isFrom ? Float.MAX_VALUE : -1)); return; case Token.identifier: if (parameterAsString(1).equalsIgnoreCase("AROMATIC")) { @@ -6226,17 +6235,19 @@ viewer.autoHbond(null); return; case Token.structure: - BitSet bs = (statementLength == 2 ? null : expression(2)); + bs = (statementLength == 2 ? null : expression(2)); if (isSyntaxCheck) return; if (bs == null) bs = viewer.getModelAtomBitSet(-1, false); - viewer.calculateStructures(bs); + viewer.calculateStructures(bs); viewer.addStateScript(thisCommand, false, true); return; } } - error(ERROR_what, "CALCULATE", + error( + ERROR_what, + "CALCULATE", "aromatic? hbonds? polymers? straightness? structure? surfaceDistance FROM? surfaceDistance WITHIN?"); } Modified: trunk/Jmol/src/org/jmol/viewer/Jmol.properties =================================================================== --- trunk/Jmol/src/org/jmol/viewer/Jmol.properties 2008-07-29 23:30:17 UTC (rev 9653) +++ trunk/Jmol/src/org/jmol/viewer/Jmol.properties 2008-07-30 03:06:09 UTC (rev 9654) @@ -3,6 +3,8 @@ version=11.5.52_dev +# new feature: calculate pointGroup -- preliminary only -- untested + # ----------------------------------------------------------------------------- #version=11.5.51 Modified: trunk/Jmol/src/org/jmol/viewer/Token.java =================================================================== --- trunk/Jmol/src/org/jmol/viewer/Token.java 2008-07-29 23:30:17 UTC (rev 9653) +++ trunk/Jmol/src/org/jmol/viewer/Token.java 2008-07-30 03:06:09 UTC (rev 9654) @@ -994,6 +994,7 @@ final static int pdbheader = misc | 39; final static int play = misc | 40; final static int playrev = misc | 41; + final static int pointgroup = misc | 411; final static int polymer = misc | 42; final static int prev = misc | 43; final static int range = misc | 44; @@ -1406,6 +1407,7 @@ "play", new Token(play), "playRev", new Token(playrev), "point", new Token(point), + "pointGroup", new Token(pointgroup), "polymerLength", new Token(polymerLength), "previous", new Token(prev), "prev", null, Modified: trunk/Jmol/src/org/jmol/viewer/Viewer.java =================================================================== --- trunk/Jmol/src/org/jmol/viewer/Viewer.java 2008-07-29 23:30:17 UTC (rev 9653) +++ trunk/Jmol/src/org/jmol/viewer/Viewer.java 2008-07-30 03:06:09 UTC (rev 9654) @@ -6804,4 +6804,8 @@ void setQuaternionFrame(String qType) { global.quaternionFrame = "" + (qType.toLowerCase()+"c").charAt(0); } + + String calculatePointGroup() { + return modelSet.calculatePointGroup(selectionManager.bsSelection); + } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ha...@us...> - 2008-07-30 21:03:25
|
Revision: 9657 http://jmol.svn.sourceforge.net/jmol/?rev=9657&view=rev Author: hansonr Date: 2008-07-30 21:03:13 +0000 (Wed, 30 Jul 2008) Log Message: ----------- version=11.5.52_dev pointGroup # new feature: calculate pointGroup # new feature: draw pointGroup # new feature: write pointGroup # including x = script("write pointGroup") Modified Paths: -------------- trunk/Jmol/src/org/jmol/modelset/ModelSet.java trunk/Jmol/src/org/jmol/symmetry/PointGroup.java trunk/Jmol/src/org/jmol/viewer/Eval.java trunk/Jmol/src/org/jmol/viewer/Jmol.properties trunk/Jmol/src/org/jmol/viewer/Viewer.java Modified: trunk/Jmol/src/org/jmol/modelset/ModelSet.java =================================================================== --- trunk/Jmol/src/org/jmol/modelset/ModelSet.java 2008-07-30 13:04:14 UTC (rev 9656) +++ trunk/Jmol/src/org/jmol/modelset/ModelSet.java 2008-07-30 21:03:13 UTC (rev 9657) @@ -434,6 +434,14 @@ return pg.getName(); } + public String getPointGroupDraw(int modelIndex) { + if (modelIndex < 0) + return ""; + if (models[modelIndex].pointGroup == null) + calculatePointGroup(viewer.getSelectionSet()); + return models[modelIndex].pointGroup.drawInfo(); + } + private BitSet modelsOf(BitSet bsAtoms, BitSet bsAllAtoms) { BitSet bsModels = new BitSet(modelCount); for (int i = 0; i < atomCount; i++) { Modified: trunk/Jmol/src/org/jmol/symmetry/PointGroup.java =================================================================== --- trunk/Jmol/src/org/jmol/symmetry/PointGroup.java 2008-07-30 13:04:14 UTC (rev 9656) +++ trunk/Jmol/src/org/jmol/symmetry/PointGroup.java 2008-07-30 21:03:13 UTC (rev 9657) @@ -43,32 +43,53 @@ public class PointGroup { - private String name = "C_1"; + private final static int[] axesMaxProperN = new int[] { + 0, // not used + 0, // not used + 15,// C2 + 10,// C3 + 6, // C4 + 6, // C5 + 10, // C6,S6 + }; + private final static int[] axesMaxImproperN = new int[] { + 9, // S2 planes + 0, // not used + 0, // n/a + 0, // n/a + 1, // S4 + 0, // C5 + 10, // S6 + 0, // not used + 1, // S8 + 0, // not used + 6, // S10 + 0, // not used + 1 // S12 + }; + + private static int maxProper = axesMaxProperN.length; + private static int maxImproper = axesMaxImproperN.length; + + private int[] nC; + private Operation[][] axes; + + private String name = "C_1?"; + public String getName() { return name; } - private int nOperations = 0; - - public int getOperationCount() { - return nOperations; - } - - private Operation[] operations; - - public Operation getOperation(int i) { - if (i >= nOperations) - return null; - return operations[i]; - } - private final Vector3f vTemp = new Vector3f(); private int centerAtomIndex = -1; - + private boolean haveInversionCenter; + final private Point3f center = new Point3f(); - + public PointGroup(Atom[] atomset, BitSet bsAtoms) { + nC = new int[maxImproper]; + axes = new Operation[maxImproper][]; Point3f[] atoms; if ((atoms = getCenter(atomset, bsAtoms)) == null) return; @@ -77,35 +98,35 @@ for (int i = atomset.length; --i >= 0;) if (bsAtoms.get(i)) elements[n++] = atomset[i].getElementNumber(); - boolean haveInversionCenter = haveInversionCenter(atoms, elements); + getElementArrays(atoms, elements); + + haveInversionCenter = haveInversionCenter(atoms, elements); + if (isLinear(atoms)) { if (haveInversionCenter) { name = "D_(infinity)h"; - nOperations = 2; - operations = new Operation[2]; - operations[0] = new Operation(vTemp, 0); - operations[1] = new Operation(vTemp); } else { name = "C_(infinity)v"; - nOperations = 1; - operations = new Operation[2]; - operations[0] = new Operation(vTemp, 0); } return; } - int[] nC = new int[9]; - Operation[][] axes = new Operation[9][]; - Operation[] planes = null; + axes[0] = new Operation[9]; int nPlanes = 0; - findAxes(atoms, elements, nC, axes, false); - for (n = 9; --n > 1 && nC[n] == 0;) { - } - n = findAxesByElement(atoms, elements, nC, axes, haveInversionCenter); + //findAxes(atoms, elements, false); + + // n = findAxesByElement(atoms, elements, haveInversionCenter); + + findCAxes(atoms, elements); + nPlanes = findPlanes(atoms, elements); + findAdditionalAxes(nPlanes, atoms, elements); + + /* flow chart contribution of Dean Johnston */ + + n = getHighestOrder(nC); + if (nC[3] > 1) { // must be Ix, Ox, or Tx if (nC[5] > 1) { - planes = new Operation[20]; - nPlanes = findPlanes(atoms, elements, nC, planes, axes[2], nC[2]); if (haveInversionCenter) { name = "I_h"; } else { @@ -118,8 +139,6 @@ name = "O"; } } else { - planes = new Operation[6]; - nPlanes = findPlanes(atoms, elements, nC, planes, axes[2], nC[2]); if (nPlanes > 0) { if (haveInversionCenter) { name = "T_h"; @@ -132,78 +151,75 @@ } } else { // options Dnh, Dnd, Dn, Cnh, Cnv, Cn, Sn, Ci, Cs - planes = new Operation[9]; - nPlanes = findPlanes(atoms, elements, nC, planes, axes[2], nC[2]); - if (nPlanes > 1 && nPlanes <= 8 && nC[nPlanes] == 0) { - vTemp.cross(planes[0].normalOrAxis, planes[1].normalOrAxis); - if (!checkAxisOrder(atoms, elements, nC, nPlanes, vTemp, axes, center, - false) - && nPlanes > 2) { - vTemp.cross(planes[1].normalOrAxis, planes[2].normalOrAxis); - checkAxisOrder(atoms, elements, nC, nPlanes - 1, vTemp, axes, center, - false); - } - } - for (n = 9; --n > 1 && nC[n] == 0;) { - } - if (nC[2] == 0 && nPlanes > 0) { - for (int i = 0; i < nPlanes - 1; i++) { - for (int j = i + 1; j < nPlanes; j++) { - vTemp.add(planes[1].normalOrAxis, planes[2].normalOrAxis); - checkAxisOrder(atoms, elements, nC, 2, vTemp, axes, center, false); - } - } - - } if (n < 2) { if (nPlanes == 1) { - // C_s, C_i, S_n, C_1 + // C_s, C_i, S_2, C_1 name = "C_s"; - nOperations = 1; - operations = new Operation[1]; - operations[0] = planes[0]; return; } if (haveInversionCenter) { name = "C_i"; - nOperations = 1; - operations = new Operation[1]; - operations[0] = new Operation(); return; } - name = "C_1?"; + name = "C_1"; } else if ((n % 2) == 1 && nC[2] > 0 || (n % 2) == 0 && nC[2] > 1) { - // Dnh, Dnd, Dn - switch (nPlanes - n) { - case 1: - name = "D_" + n + "h"; - break; - case 0: - name = "D_" + n + "d"; - break; - default: + // here based on the presence of C2 axes in any odd-order group + // and more than one C2 if even order (since the one will be part of the + // principal axis + + // Dnh, Dnd, Dn, Sn + if (nPlanes == 0) { if (axes[n][0].type == OPERATION_IMPROPER_AXIS) { name = "S_" + n; } else { name = "D_" + n; } + } else { + if (axes[n][0].type == OPERATION_IMPROPER_AXIS) + n /= 2; + if (nPlanes == n) { + name = "D_" + n + "d"; + } else { + name = "D_" + n + "h"; + } } - } else if (nPlanes == 1) { - name = "C_" + n + "h"; - } else if (nPlanes == n) { - name = "C_" + n + "v"; - } else { + } else if (nPlanes == 0) { if (axes[n][0].type == OPERATION_IMPROPER_AXIS) { name = "S_" + n; } else { name = "C_" + n; } + } else if (nPlanes == n) { + name = "C_" + n + "v"; + } else { + name = "C_" + n + "h"; } } - dumpAxes(nC, axes); - dumpPlanes(nPlanes, planes); + System.out.println(drawInfo()); } + private void findAdditionalAxes(int nPlanes, Point3f[] atoms, int[] elements) { + + Operation[] planes = axes[0]; + // first, cross pairs of plane normals. We don't need many. + if (nPlanes > 1 && nPlanes < maxProper && nC[nPlanes] == 0) { + vTemp.cross(planes[0].normalOrAxis, planes[1].normalOrAxis); + if (!checkAxisOrder(atoms, elements, nPlanes, vTemp, center) + && nPlanes > 2) { + vTemp.cross(planes[1].normalOrAxis, planes[2].normalOrAxis); + checkAxisOrder(atoms, elements, nPlanes - 1, vTemp, center); + } + } + if (nC[2] == 0 && nPlanes > 2) { + for (int i = 0; i < nPlanes - 1; i++) { + for (int j = i + 1; j < nPlanes; j++) { + vTemp.add(planes[1].normalOrAxis, planes[2].normalOrAxis); + checkAxisOrder(atoms, elements, 2, vTemp, center); + } + } + } + } + private Atom[] getCenter(Atom[] atomset, BitSet bsAtoms) { int atomCount = BitSetUtil.cardinalityOf(bsAtoms); if (atomCount > 100) { @@ -296,9 +312,8 @@ private static boolean isParallel(Vector3f v1, Vector3f v2) { return (Math.abs(v1.dot(v2)) >= LINEAR_DOT_MINIMUM); } - - final static int[] axesMaxN = new int[] { 0, 0, 15, 10, 6, 6, 1, 1, 1 }; - + +/* private Operation findAxes(Point3f[] atoms, int[] elements, int[] nC, Operation[][] axes, boolean isImproper) { Point3f pt = new Point3f(); @@ -315,6 +330,9 @@ Point3f a2 = atoms[j]; if (elements[j] != e1) continue; + + //define *pt* based on cross-products + //this is for Dnh and Cnh, ferrocene-types if (isImproper) { v1.sub(center, a1); pt1.scaleAdd(2, v1, a1); @@ -330,17 +348,15 @@ if (isParallel(v1, v2)) { if (!isImproper) { for (int o = 2; o <= 8; o++) - checkAxisOrder(atoms, elements, nC, o, v1, axes, center, false); + checkAxisOrder(atoms, elements, o, v1, center); } continue; } if (nC[2] < axesMaxN[2]) { v3.set(pt); - if (checkAxisOrder(atoms, elements, nC, 2, v3, axes, center, - isImproper) && !isImproper) - checkAxisOrder(atoms, elements, nC, -4, v3, axes, center, - true); + checkAxisOrder(atoms, elements, 2, v3, center); } + float order = (float) (2 * Math.PI / v1.angle(v2)); int iOrder = (int) (order + 0.01f); boolean isIntegerOrder =(order - iOrder <= 0.02f); @@ -353,8 +369,7 @@ if (iOrder <= 8 && nC[iOrder] < axesMaxN[iOrder]) { // not a valid order, or plenty of these already v3.cross(v1, v2); - checkAxisOrder(atoms, elements, nC, iOrder, v3, axes, center, - isImproper); + checkAxisOrder(atoms, elements, iOrder, v3, center); } } } @@ -377,11 +392,189 @@ v3.add(vs[k]); if (v3.length() < 1.0) continue; - checkAxisOrder(atoms, elements, nC, 3, v3, axes, center, false); + checkAxisOrder(atoms, elements, 3, v3, center); } return null; } +*/ + int maxElement = 0; + int[] eCounts; + private void getElementArrays(Point3f[] atoms, int[] elements) { + for (int i = atoms.length; --i >= 0;) { + int e1 = elements[i]; + if (e1 > maxElement) + maxElement = e1; + } + eCounts = new int[++maxElement]; + for (int i = atoms.length; --i >= 0;) + eCounts[elements[i]]++; + } + + private int findCAxes(Point3f[] atoms, int[] elements) { + Vector3f v1 = new Vector3f(); + Vector3f v2 = new Vector3f(); + Vector3f v3 = new Vector3f(); + Point3f pt = new Point3f(); + // look for the proper and improper axes relating pairs of atoms + + for (int i = atoms.length; --i >= 0;) { + if (i == centerAtomIndex) + continue; + Point3f a1 = atoms[i]; + int e1 = elements[i]; + for (int j = atoms.length; --j > i;) { + Point3f a2 = atoms[j]; + if (elements[j] != e1) + continue; + + // look for all axes to average position of A and B + // or including A and B if A - 0 - B is linear + + pt.add(a1, a2); + pt.scale(0.5f); + v1.sub(a1, center); + v2.sub(a2, center); + v1.normalize(); + v2.normalize(); + if (isParallel(v1, v2)){ + getAllAxes(v1, atoms, elements); + continue; + } + if (nC[2] < axesMaxProperN[2]) { + v3.set(pt); + getAllAxes(v3, atoms, elements); + } + + // look for the axis perpendicular to the A -- 0 -- B plane + + float order = (float) (2 * Math.PI / v1.angle(v2)); + int iOrder = (int) (order + 0.01f); + boolean isIntegerOrder =(order - iOrder <= 0.02f); + if (!isIntegerOrder) + continue; + if (nC[iOrder] < axesMaxProperN[iOrder]) { + v3.cross(v1, v2); + checkAxisOrder(atoms, elements, iOrder, v3, center); + } + } + } + + // check all C2 axes for C3-related axes + + Vector3f[] vs = new Vector3f[nC[2] * 2]; + for (int i = 0; i < vs.length; i++) + vs[i] = new Vector3f(); + int n = 0; + for (int i = 0; i < nC[2]; i++) { + vs[n++].set(axes[2][i].normalOrAxis); + vs[n].set(axes[2][i].normalOrAxis); + vs[n++].scale(-1); + } + for (int i = vs.length; --i >= 2;) + for (int j = i; --j >= 1;) + for (int k = j; --k >= 0;) { + v3.set(vs[i]); + v3.add(vs[j]); + v3.add(vs[k]); + if (v3.length() < 1.0) + continue; + checkAxisOrder(atoms, elements, 3, v3, center); + } + + // Check all pairs of atoms for C2 relationships + + + // Now check for triples of elements that will define + // axes using the element with the smallest + // number of atoms n, with n >= 3 + // cross all triples of vectors looking for standard + // principal axes quantities. + + // Also check for vectors from {0 0 0} to + // the midpoint of each triple of atoms + + int nMin = Integer.MAX_VALUE; + int iMin = -1; + for (int i = 0; i < maxElement; i++) { + if (eCounts[i] < nMin && eCounts[i] > 2) { + nMin = eCounts[i]; + iMin = i; + } + } + + + out: for (int i = 0; i < atoms.length - 2; i++) + if (elements[i] == iMin) + for (int j = i + 1; j < atoms.length - 1; j++) + if (elements[j] == iMin) + for (int k = j + 1; k < atoms.length; k++) + if (elements[k] == iMin) { + v1.sub(atoms[i], atoms[j]); + v2.sub(atoms[i], atoms[k]); + v1.normalize(); + v2.normalize(); + v3.cross(v1, v2); + checkAxisOrder(atoms, elements, 3, v3, center); + pt.set(atoms[i]); + pt.add(atoms[j]); + pt.add(atoms[k]); + v1.set(pt); + v1.normalize(); + if (!isParallel(v1, v3)) + getAllAxes(v1, atoms, elements); + if (nC[5] == axesMaxProperN[5]) + break out; + } + + // get minimum element count > 2 + + if (!haveInversionCenter) { + + //check for C2 by looking for axes along element-based geometric centers + + vs = new Vector3f[maxElement]; + for (int i = atoms.length; --i >= 0;) { + int e1 = elements[i]; + if (vs[e1] == null) + vs[e1] = new Vector3f(); + vs[e1].add(atoms[i]); + } + for (int i = 0; i < maxElement; i++) + if (vs[i] != null) + vs[i].scale(1f / eCounts[i]); + + // check for vectors from {0 0 0} to + // the midpoint of each pair of atoms + // within the same element + + for (int i = 0; i < maxElement; i++) + if (vs[i] != null) + for (int j = 0; j < maxElement; j++) { + if (i == j || vs[j] == null) + continue; + v1.set(vs[i]); + v1.sub(vs[j]); + checkAxisOrder(atoms, elements, 2, v1, center); + } + } + + return getHighestOrder(nC); + } + + private void getAllAxes(Vector3f v3, Point3f[] atoms, int[] elements) { + for (int o = maxProper; --o >= 2;) + if (nC[o] < axesMaxProperN[o]) + checkAxisOrder(atoms, elements, o, v3, center); + } + + private int getHighestOrder(int[] nC) { + int n; + for (n = maxImproper; --n > 1 && nC[n] == 0;) { + } + return n; + } +/* private int findAxesByElement(Point3f[] atoms, int[] elements, int[] nC, Operation[][] axes, boolean isInversion) { Vector3f v1 = new Vector3f(); @@ -418,14 +611,7 @@ continue; v1.set(vs[i]); v1.sub(vs[j]); - //if (isInversion)v1.set(0,0,1); - //System.out.println("draw " + Escape.escape(center) + Escape.escape(v1)); - for (int o = 8; o >= 2; o--) { - checkAxisOrder(atoms, elements, nC, o, v1, axes, center, - isInversion); -// if (nC[o] > 0) - // return o; - } + getAllAxes(v1, atoms, elements); } } out: for (int i = 0; i < atoms.length - 2; i++) @@ -440,70 +626,87 @@ v2.normalize(); v3.cross(v1, v2); //System.out.println(v3 + " " + (v1.dot(v2)/Math.PI * 180)); - for (int o = 8; o >= 2; o--) { - if (!checkAxisOrder(atoms, elements, nC, o, v3, axes, center, - isInversion)) - checkAxisOrder(atoms, elements, nC, o, v3, axes, center, - !isInversion); - } + getAllAxes(v3, atoms, elements); if (nC[5] > 2) break out; } - int n; - for (n = 9; --n > 1 && nC[n] == 0;) { + return getHighestOrder(nC); + } +*/ + private boolean checkAxisOrder(Point3f[] atoms, int[] elements, + int iOrder, Vector3f v, Point3f center) { + switch (iOrder) { + case 6: + case 4: + if (nC[5] > 0) + return false; + break; + case 5: + if (nC[4] > 0 || nC[6] > 0) + return false; + break; } - return n; - } - - private boolean checkAxisOrder(Point3f[] atoms, int[] elements, int[] nC, - int iOrder, Vector3f v, Operation[][] axes, - Point3f center, boolean doInversion) { + v.normalize(); - int aiOrder = Math.abs(iOrder); - if (haveAxis(nC, iOrder, v, axes[aiOrder])) + if (haveAxis(iOrder, v)) return false; Quaternion q = new Quaternion(v, 360 / (iOrder < 0 ? -iOrder : iOrder)); - if (!checkOperation(atoms, elements, q, center, doInversion)) + if (!checkOperation(atoms, elements, q, center, iOrder < 0)) return false; - addAxis(nC, (iOrder < 0 ? iOrder : doInversion ? -iOrder : iOrder), v, axes); + addAxis(iOrder, v); switch (iOrder) { + case 2: + checkAxisOrder(atoms, elements, -4, v, center); + break; + case 3: + checkAxisOrder(atoms, elements, -6, v, center); + break; case 4: - addAxis(nC, 2, v, axes); + addAxis(2, v); + checkAxisOrder(atoms, elements, -8, v, center); break; + case 5: + checkAxisOrder(atoms, elements, -10, v, center); + break; case 6: - addAxis(nC, 2, v, axes); - addAxis(nC, 3, v, axes); + addAxis(2, v); + addAxis(3, v); break; case 8: - addAxis(nC, 2, v, axes); - addAxis(nC, 4, v, axes); + addAxis(2, v); + addAxis(4, v); break; } return true; } - private void addAxis(int[] nC, int iOrder, Vector3f v, Operation[][] axes) { + private void addAxis(int iOrder, Vector3f v) { int aiOrder = Math.abs(iOrder); - if (haveAxis(nC, iOrder, v, axes[aiOrder])) + if (haveAxis(iOrder, v)) return; - Operation[] axesSet = axes[aiOrder]; - if (axesSet == null) - axesSet = axes[aiOrder] = new Operation[axesMaxN[aiOrder]]; - axesSet[nC[aiOrder]++] = new Operation(v, iOrder); + if (axes[aiOrder] == null) + axes[aiOrder] = new Operation[Math.max( + (aiOrder < maxProper ? axesMaxProperN[aiOrder] : 0), + axesMaxImproperN[aiOrder])]; + axes[aiOrder][nC[aiOrder]++] = new Operation(v, iOrder); } - private boolean haveAxis(int[] nC, int iOrder, Vector3f v, Operation[] axes) { - iOrder = Math.abs(iOrder); - if (nC[iOrder] > 0) - for (int i = nC[iOrder]; --i >= 0;) { - if (isParallel(v, axes[i].normalOrAxis)) + private boolean haveAxis(int iOrder, Vector3f v) { + int aiOrder = Math.abs(iOrder); + if (nC[aiOrder] == (iOrder > 0 ? axesMaxProperN[aiOrder] : axesMaxImproperN[aiOrder])) + return true; + if (nC[aiOrder] > 0) + for (int i = nC[aiOrder]; --i >= 0;) { + if (isParallel(v, axes[aiOrder][i].normalOrAxis)) return true; } return false; } - private int findPlanes(Point3f[] atoms, int[] elements, int[] nC, - Operation[] planes, Operation[] axesC2, int nC2) { + private int findPlanes(Point3f[] atoms, int[] elements) { + Operation[] axesC2 = axes[2]; + int nC2 = nC[2]; + Point3f pt = new Point3f(); Vector3f v1 = new Vector3f(); Vector3f v2 = new Vector3f(); @@ -517,44 +720,47 @@ for (int j = atoms.length; --j > i;) { if (elements[j] != e1) continue; + + // plane are treated as S2 axes here + + // first, check planes through two atoms and the center + // or perpendicular to a linear A -- 0 -- B set + Point3f a2 = atoms[j]; pt.add(a1, a2); pt.scale(0.5f); v1.sub(a1, center); v2.sub(a2, center); - if (isParallel(v1, v2)) { - v3.set(v1); - } else { + if (!isParallel(v1, v2)) { v3.cross(v1, v2); + v3.normalize(); + nPlanes = getPlane(nPlanes, v3, atoms, elements, center); } - v3.normalize(); - if (!haveAxis(nC, 0, v3, planes) - && checkOperation(atoms, elements, new Quaternion(v3, 180), center, - true)) - nPlanes = addPlane(nC, v3, planes); + + // second, look for planes perpendicular to the A -- B line + v3.set(a2); v3.sub(a1); v3.normalize(); - if (!haveAxis(nC, 0, v3, planes) - && checkOperation(atoms, elements, new Quaternion(v3, 180), pt, - true)) - nPlanes = addPlane(nC, v3, planes); - if (nPlanes == planes.length) + nPlanes = getPlane(nPlanes, v3, atoms, elements, center); + if (nPlanes == axesMaxImproperN[0]) return nPlanes; } } - for (int i = 0; i < nC2; i++) { - v3 = axesC2[i].normalOrAxis; - if (!haveAxis(nC, 0, v3, planes) - && checkOperation(atoms, elements, new Quaternion(v3, 180), center, - true)) - nPlanes = addPlane(nC, v3, planes); - } + + // also look for planes normal to any C2 axis + + for (int i = 0; i < nC2; i++) + nPlanes = getPlane(nPlanes, axesC2[i].normalOrAxis, atoms, elements, center); return nPlanes; } - private int addPlane(int[] nC, Vector3f v3, Operation[] planes) { - planes[nC[0]++] = new Operation(v3); + private int getPlane(int nPlanes, Vector3f v3, Point3f[] atoms, int[] elements, + Point3f center2) { + if (!haveAxis(0, v3) + && checkOperation(atoms, elements, new Quaternion(v3, 180), + center, true)) + axes[0][nC[0]++] = new Operation(v3); return nC[0]; } @@ -579,49 +785,63 @@ Operation(Vector3f v, int i) { type = (i < 0 ? OPERATION_IMPROPER_AXIS : OPERATION_AXIS); - order = i; - normalOrAxis = new Vector3f(v); - normalOrAxis.normalize(); + order = Math.abs(i); + normalOrAxis = new Quaternion(v, 180).getNormal(); Logger.info("new operation -- " + typeNames[type] + " order = " + i + " " + normalOrAxis); } Operation(Vector3f v) { type = OPERATION_PLANE; - normalOrAxis = new Vector3f(v); - normalOrAxis.normalize(); + normalOrAxis = new Quaternion(v, 180).getNormal(); Logger.info("new operation -- " + typeNames[type] + " " + normalOrAxis ); } public String toString() { return type + " " + order + " " + normalOrAxis; } + + public String getLabel() { + switch(type) { + case OPERATION_PLANE: + return ""; + case OPERATION_IMPROPER_AXIS: + return "S" + order; + default: + return "C" + order; + } + } } - private void dumpAxes(int[] nC, Operation[][] axes) { + public String drawInfo() { Vector3f v = new Vector3f(); - for (int i = 2; i <= 8; i++) { + Operation op; + int nAxes = 0; + for (int i = 1; i < maxImproper; i++) + nAxes += nC[i]; + StringBuffer sb = new StringBuffer("# name=" + name + ", nPlanes=" + nC[0] + ", nAxes=" + nAxes + ";\n"); + sb.append("draw p0" + (haveInversionCenter ? "inv " : " ") + center + + (haveInversionCenter ? "\"i\";\n" : ";\n")); + for (int i = 2; i < maxImproper; i++) { for (int j = 0; j < nC[i]; j++) { - v.set(axes[i][j].normalOrAxis); - String s = "draw va" + i + "_" + j + " scale 5.0 " + Escape.escape(v); - v.scale(-1); - s += Escape.escape(v); - System.out.println(s); + op=axes[i][j]; + v.set(op.normalOrAxis); + v.add(center); + float scale = 4.0f + op.order / 4.0f; + sb.append("draw va").append(i).append("_").append(j) + .append(" scale -" + scale + " ").append(Escape.escape(v)); + v.scaleAdd(-2, op.normalOrAxis, v); + sb.append(Escape.escape(v)) + .append("\""+op.getLabel()+"\"").append(";\n"); } } - System.out.println("#NOTE: THIS IS AN INCOMPLETE LIST"); - } - - private void dumpPlanes(int n, Operation[] planes) { - Vector3f v = new Vector3f(); - for (int j = 0; j < n; j++) { - v.set(planes[j].normalOrAxis); - v.set(planes[j].normalOrAxis); - String s = "draw vp" + j + " scale 3.0 plane perp " + Escape.escape(v); + for (int j = 0; j < nC[0]; j++) { + v.set((op=axes[0][j]).normalOrAxis); + v.set(op.normalOrAxis); + sb.append("draw vp").append(j).append(" scale 3.0 plane perp ").append(Escape.escape(v)); v.scale(-1); - s += Escape.escape(v); - System.out.println(s); + sb.append(Escape.escape(v)) + .append("\""+op.getLabel()+"\"").append(";\n"); } - System.out.println("#NOTE: THIS IS AN INCOMPLETE LIST"); + return sb.toString(); } - } Modified: trunk/Jmol/src/org/jmol/viewer/Eval.java =================================================================== --- trunk/Jmol/src/org/jmol/viewer/Eval.java 2008-07-30 13:04:14 UTC (rev 9656) +++ trunk/Jmol/src/org/jmol/viewer/Eval.java 2008-07-30 21:03:13 UTC (rev 9657) @@ -6189,7 +6189,10 @@ int modelIndex = viewer.getCurrentModelIndex(); if (modelIndex < 0) error(ERROR_multipleModelsNotOK, "CALCULATE SYMMETRY"); - showString(viewer.calculatePointGroup()); + if (tokAt(0) == Token.draw) + runScript(viewer.getPointGroupDraw(modelIndex)); + else + showString(viewer.calculatePointGroup()); return; case Token.surface: isSurface = true; @@ -8663,6 +8666,10 @@ tok = t.tok; } switch (tok) { + case Token.pointgroup: + type = "PGRP"; + pt++; + break; case Token.quaternion: pt++; type2 = Token.sValue(tokenAt(pt, args)).toLowerCase(); @@ -8835,12 +8842,12 @@ if (!isImage && !isExport && !Parser.isOneOf(type, - "SPT;HIS;MO;ISO;VAR;FILE;XYZ;MOL;PDB;QUAT;RAMA;FUNCS;")) + "SPT;HIS;MO;ISO;VAR;FILE;XYZ;MOL;PDB;PGRP;QUAT;RAMA;FUNCS;")) evalError(GT ._( "write what? {0} or {1} \"filename\"", new Object[] { - "COORDS|FILE|FUNCTIONS|HISTORY|IMAGE|ISOSURFACE|MO|QUATERNION [w,x,y,z] [derivative]" + "COORDS|FILE|FUNCTIONS|HISTORY|IMAGE|ISOSURFACE|MO|POINTGROUP|QUATERNION [w,x,y,z] [derivative]" + "|RAMACHANDRAN|STATE|VAR x CLIPBOARD", "JPG|JPG64|PNG|PPM|SPT|JVXL|XYZ|MOL|PDB|" + driverList.toUpperCase().replace(';', '|') })); @@ -8863,6 +8870,8 @@ scriptStatus("Created " + fileName + ".ini:\n\n" + data); return ""; } + } else if (data == "PGRP") { + data = viewer.getPointGroupDraw(viewer.getCurrentModelIndex()); } else if (data == "PDB") { data = viewer.getPdbData(null); } else if (data == "XYZ" || data == "MOL") { @@ -9508,16 +9517,21 @@ private void draw() throws ScriptException { viewer.loadShape(JmolConstants.SHAPE_DRAW); - if (tokAt(1) == Token.list && listIsosurface(JmolConstants.SHAPE_DRAW)) + switch (tokAt(1)) { + case Token.list: + if (listIsosurface(JmolConstants.SHAPE_DRAW)) + return; + break; + case Token.pointgroup: + calculate(); return; - if (tokAt(1) == Token.quaternion) { + case Token.quaternion: dataFrame(JmolConstants.JMOL_DATA_QUATERNION); return; - } - if (tokAt(1) == Token.ramachandran) { + case Token.ramachandran: dataFrame(JmolConstants.JMOL_DATA_RAMACHANDRAN); return; - } + } boolean havePoints = false; boolean isInitialized = false; boolean isSavedState = false; @@ -10132,8 +10146,8 @@ private int lastMoNumber = 0; private boolean mo(boolean isInitOnly) throws ScriptException { + int offset = Integer.MAX_VALUE; int modelIndex = viewer.getDisplayModelIndex(); - int offset = Integer.MAX_VALUE; if (!isSyntaxCheck && modelIndex < 0) error(ERROR_multipleModelsNotOK, "MO isosurfaces"); viewer.loadShape(JmolConstants.SHAPE_MO); Modified: trunk/Jmol/src/org/jmol/viewer/Jmol.properties =================================================================== --- trunk/Jmol/src/org/jmol/viewer/Jmol.properties 2008-07-30 13:04:14 UTC (rev 9656) +++ trunk/Jmol/src/org/jmol/viewer/Jmol.properties 2008-07-30 21:03:13 UTC (rev 9657) @@ -3,6 +3,10 @@ version=11.5.52_dev +# new feature: calculate pointGroup +# new feature: draw pointGroup +# new feature: write pointGroup +# including x = script("write pointGroup") # new feature: webexport now compresses data files over 512 MB # new feature: calculate pointGroup -- preliminary only -- untested Modified: trunk/Jmol/src/org/jmol/viewer/Viewer.java =================================================================== --- trunk/Jmol/src/org/jmol/viewer/Viewer.java 2008-07-30 13:04:14 UTC (rev 9656) +++ trunk/Jmol/src/org/jmol/viewer/Viewer.java 2008-07-30 21:03:13 UTC (rev 9657) @@ -6808,4 +6808,8 @@ String calculatePointGroup() { return modelSet.calculatePointGroup(selectionManager.bsSelection); } + + public String getPointGroupDraw(int modelIndex) { + return modelSet.getPointGroupDraw(modelIndex); + } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ha...@us...> - 2008-07-31 14:12:22
|
Revision: 9665 http://jmol.svn.sourceforge.net/jmol/?rev=9665&view=rev Author: hansonr Date: 2008-07-31 14:12:00 +0000 (Thu, 31 Jul 2008) Log Message: ----------- version=11.5.53_dev draw *xxx # new feature: wildcard at beginning for draw/pmesh/isosurface/etc. *xxx on/off/delete allowed # bug fix in draw pointGroup -- height of cylinder was too small Modified Paths: -------------- trunk/Jmol/src/org/jmol/modelset/Atom.java trunk/Jmol/src/org/jmol/modelset/AtomCollection.java trunk/Jmol/src/org/jmol/modelset/Group.java trunk/Jmol/src/org/jmol/shape/MeshCollection.java trunk/Jmol/src/org/jmol/symmetry/PointGroup.java trunk/Jmol/src/org/jmol/util/TextFormat.java trunk/Jmol/src/org/jmol/viewer/Eval.java trunk/Jmol/src/org/jmol/viewer/Jmol.properties Modified: trunk/Jmol/src/org/jmol/modelset/Atom.java =================================================================== --- trunk/Jmol/src/org/jmol/modelset/Atom.java 2008-07-30 22:29:20 UTC (rev 9664) +++ trunk/Jmol/src/org/jmol/modelset/Atom.java 2008-07-31 14:12:00 UTC (rev 9665) @@ -490,42 +490,13 @@ screenDiameter = viewer.scaleToScreen(screenZ, Math.abs(madAtom)); } - String getAtomNameOrNull() { - String[] atomNames = group.chain.modelSet.atomNames; - return atomNames == null ? null : atomNames[atomIndex]; - } - + // note: atomName cannot be null + // note: atomNames cannot be null + String getAtomName() { - String atomName = getAtomNameOrNull(); - return (atomName != null ? atomName : getElementSymbol()); + return group.chain.modelSet.atomNames[atomIndex]; } - String getPdbAtomName4() { - String atomName = getAtomNameOrNull(); - return atomName != null ? atomName : ""; - } - - /** - * matches atom name possibly with wildcard - * @param strPattern -- for efficiency, upper case already - * @return true/false - */ - boolean isAtomNameMatch(String strPattern) { - String atomName = getAtomNameOrNull(); - int cchAtomName = atomName == null ? 0 : atomName.length(); - int cchPattern = strPattern.length(); - int ich; - for (ich = 0; ich < cchPattern; ++ich) { - char charWild = strPattern.charAt(ich); - if (charWild == '?') - continue; - if (ich >= cchAtomName || - charWild != Character.toUpperCase(atomName.charAt(ich))) - return false; - } - return ich >= cchAtomName; - } - public int getAtomNumber() { int[] atomSerials = group.chain.modelSet.atomSerials; return (atomSerials != null ? atomSerials[atomIndex] : atomIndex); @@ -781,13 +752,11 @@ } if (!allInfo) return info.toString(); - String atomName = getAtomNameOrNull(); - if (atomName != null) { - if (info.length() > 0) - info.append("."); - info.append(atomName); - } + if (info.length() > 0) + info.append("."); + info.append(getAtomName()); if (info.length() == 0) { + // since atomName cannot be null, this is unreachable info.append(getElementSymbol()); info.append(" "); info.append(getAtomNumber()); @@ -818,10 +787,6 @@ return group.isGroup3(group3); } - boolean isGroup3Match(String strWildcard) { - return group.isGroup3Match(strWildcard); - } - boolean isProtein() { return group.isProtein(); } @@ -858,11 +823,6 @@ return group.getResno(); } - boolean isGroup3OrNameMatch(String strPattern) { - return (getGroup3().length() > 0 ? isGroup3Match(strPattern) - : isAtomNameMatch(strPattern)); - } - public boolean isClickable() { // certainly if it is not visible, then it can't be clickable if (!isVisible()) Modified: trunk/Jmol/src/org/jmol/modelset/AtomCollection.java =================================================================== --- trunk/Jmol/src/org/jmol/modelset/AtomCollection.java 2008-07-30 22:29:20 UTC (rev 9664) +++ trunk/Jmol/src/org/jmol/modelset/AtomCollection.java 2008-07-31 14:12:00 UTC (rev 9665) @@ -1425,8 +1425,9 @@ return getIdentifierOrNull((String) specInfo); case Token.spec_atom: String atomSpec = ((String) specInfo).toUpperCase(); + /// here xx*yy is NOT changed to "xx??????????yy" for (int i = atomCount; --i >= 0;) - if (atoms[i].isAtomNameMatch(atomSpec)) + if (isAtomNameMatch(atoms[i], atomSpec, false)) bs.set(i); return bs; case Token.spec_alternate: @@ -1472,20 +1473,20 @@ //H3? //in the case of a ?, we take the whole thing - - BitSet bs = getSpecNameOrNull(identifier); + // * can be used here, but not with ? + //first check with * option OFF + BitSet bs = getSpecNameOrNull(identifier, false); if (bs != null || identifier.indexOf("?") > 0) return bs; - - int pt = identifier.indexOf("*"); - if (pt > 0) - return getSpecNameOrNull(identifier.substring(0, pt) + "??????????" - + identifier.substring(pt + 1)); + // now check with * option ON + if (identifier.indexOf("*") > 0) + return getSpecNameOrNull(identifier, true); + int len = identifier.length(); - pt = 0; + int pt = 0; while (pt < len && Character.isLetter(identifier.charAt(pt))) ++pt; - bs = getSpecNameOrNull(identifier.substring(0, pt)); + bs = getSpecNameOrNull(identifier.substring(0, pt), false); if (pt == len) return bs; if (bs == null) @@ -1533,29 +1534,49 @@ } private BitSet getSpecName(String name) { - BitSet bs = getSpecNameOrNull(name); + // * can be used here with ? + BitSet bs = getSpecNameOrNull(name, false); if (bs != null) return bs; - int pt = name.indexOf("*"); - if (pt > 0) { - bs = getSpecNameOrNull(name.substring(0, pt) + "??????????" - + name.substring(pt + 1)); - } + if (name.indexOf("*") > 0) + bs = getSpecNameOrNull(name, true); return (bs == null ? new BitSet() : bs); } - private BitSet getSpecNameOrNull(String name) { + private BitSet getSpecNameOrNull(String name, boolean checkStar) { + /// here xx*yy is changed to "xx??????????yy" when coming from getSpecName + /// but not necessarily when coming from getIdentifierOrNull BitSet bs = null; name = name.toUpperCase(); - for (int i = atomCount; --i >= 0;) - if (atoms[i].isGroup3OrNameMatch(name)) { + for (int i = atomCount; --i >= 0;) { + String g3 = atoms[i].getGroup3(); + if (g3.length() > 0) { + if (TextFormat.isMatch(g3, name, checkStar, true)) { + if (bs == null) + bs = new BitSet(i + 1); + bs.set(i); + while (--i >= 0 && atoms[i].getGroup3().equals(g3)) + bs.set(i); + i++; + } + } else if (isAtomNameMatch(atoms[i], name, checkStar)) { if (bs == null) bs = new BitSet(i + 1); bs.set(i); } + } return bs; } + boolean isAtomNameMatch(Atom atom, String strPattern, boolean checkStar) { + /// here xx*yy is changed to "xx??????????yy" when coming from getSpecName + /// but not necessarily when coming from getIdentifierOrNull + /// and NOT when coming from getAtomBits with Token.spec_atom + /// because it is presumed that some names can include "*" + return TextFormat.isMatch(atom.getAtomName().toUpperCase(), strPattern, + checkStar, false); + } + protected BitSet getSeqcodeBits(int seqcode, boolean returnEmpty) { BitSet bs = new BitSet(); int seqNum = Group.getSequenceNumber(seqcode); Modified: trunk/Jmol/src/org/jmol/modelset/Group.java =================================================================== --- trunk/Jmol/src/org/jmol/modelset/Group.java 2008-07-30 22:29:20 UTC (rev 9664) +++ trunk/Jmol/src/org/jmol/modelset/Group.java 2008-07-31 14:12:00 UTC (rev 9665) @@ -149,33 +149,6 @@ return groupID; } - final boolean isGroup3Match(String strWildcard) { - int cchWildcard = strWildcard.length(); - int ichWildcard = 0; - String group3 = group3Names[groupID]; - int cchGroup3 = group3.length(); - if (cchWildcard < cchGroup3) - return false; - while (cchWildcard > cchGroup3) { - // wildcard is too long - // so strip '?' from the beginning and the end, if possible - if (strWildcard.charAt(ichWildcard) == '?') { - ++ichWildcard; - } else if (strWildcard.charAt(ichWildcard + cchWildcard - 1) != '?') { - return false; - } - --cchWildcard; - } - for (int i = cchGroup3; --i >= 0; ) { - char charWild = strWildcard.charAt(ichWildcard + i); - if (charWild == '?') - continue; - if (charWild != group3.charAt(i)) - return false; - } - return true; - } - public final char getChainID() { return chain.chainID; } Modified: trunk/Jmol/src/org/jmol/shape/MeshCollection.java =================================================================== --- trunk/Jmol/src/org/jmol/shape/MeshCollection.java 2008-07-30 22:29:20 UTC (rev 9664) +++ trunk/Jmol/src/org/jmol/shape/MeshCollection.java 2008-07-31 14:12:00 UTC (rev 9665) @@ -60,7 +60,7 @@ private Mesh setMesh(String thisID) { linkedMesh = null; - if (thisID == null || thisID.indexOf("*") >= 0) { + if (thisID == null || TextFormat.isWild(thisID)) { currentMesh = null; return null; } @@ -179,16 +179,15 @@ if (currentMesh != null) { currentMesh.visible = isOn; } else { - int i = 0; String key = (explicitID && previousMeshID != null - && (i = previousMeshID.indexOf("*")) >= 0 ? - previousMeshID.substring(0, i).toLowerCase() : null); + && TextFormat.isWild(previousMeshID) ? + previousMeshID.toUpperCase() : null); if (key == null || key.length() == 0) { - for (i = meshCount; --i >= 0;) + for (int i = meshCount; --i >= 0;) meshes[i].visible = isOn; } else { - for (i = 0; i < meshCount; i++) { - if (meshes[i].thisID.toLowerCase().indexOf(key) == 0) + for (int i = 0; i < meshCount; i++) { + if (TextFormat.isMatch(meshes[i].thisID.toUpperCase(), key, true, true)) meshes[i].visible = isOn; } } @@ -352,8 +351,8 @@ deleteMesh(i); } else { String key = (explicitID && previousMeshID != null - && (i = previousMeshID.indexOf("*")) >= 0 ? - previousMeshID.substring(0, i).toLowerCase() : null); + && TextFormat.isWild(previousMeshID) ? + previousMeshID.toUpperCase() : null); if (key == null || key.length() == 0) { for (i = meshCount; --i >= 0; ) meshes[i] = null; @@ -361,7 +360,7 @@ nUnnamed = 0; } else { for (i = meshCount; --i >= 0; ) { - if (meshes[i].thisID.toLowerCase().indexOf(key) == 0) + if (TextFormat.isMatch(meshes[i].thisID.toUpperCase(), key, true, true)) deleteMesh(i); } } Modified: trunk/Jmol/src/org/jmol/symmetry/PointGroup.java =================================================================== --- trunk/Jmol/src/org/jmol/symmetry/PointGroup.java 2008-07-30 22:29:20 UTC (rev 9664) +++ trunk/Jmol/src/org/jmol/symmetry/PointGroup.java 2008-07-31 14:12:00 UTC (rev 9665) @@ -44,28 +44,28 @@ public class PointGroup { private final static int[] axesMaxProperN = new int[] { - 0, // not used - 0, // not used + 0, // n/a + 0, // n/a 15,// C2 10,// C3 6, // C4 6, // C5 - 10, // C6,S6 + 10,// C6 }; private final static int[] axesMaxImproperN = new int[] { - 9, // S2 planes - 0, // not used + 9, // used for plane count + 0, // n/a + 0, // not used -- would be S2 (inversion) 0, // n/a - 0, // n/a 1, // S4 - 0, // C5 - 10, // S6 - 0, // not used + 0, // n/a + 10,// S6 + 0, // n/a 1, // S8 - 0, // not used + 0, // n/a 6, // S10 - 0, // not used + 0, // n/a 1 // S12 }; @@ -313,90 +313,6 @@ return (Math.abs(v1.dot(v2)) >= LINEAR_DOT_MINIMUM); } -/* - private Operation findAxes(Point3f[] atoms, int[] elements, int[] nC, - Operation[][] axes, boolean isImproper) { - Point3f pt = new Point3f(); - Point3f pt1 = new Point3f(); - Vector3f v1 = new Vector3f(); - Vector3f v2 = new Vector3f(); - Vector3f v3 = new Vector3f(); - for (int i = atoms.length; --i >= 0;) { - if (i == centerAtomIndex) - continue; - Point3f a1 = atoms[i]; - int e1 = elements[i]; - for (int j = atoms.length; --j > i;) { - Point3f a2 = atoms[j]; - if (elements[j] != e1) - continue; - - //define *pt* based on cross-products - //this is for Dnh and Cnh, ferrocene-types - if (isImproper) { - v1.sub(center, a1); - pt1.scaleAdd(2, v1, a1); - } else { - pt1.set(a1); - } - pt.add(pt1, a2); - pt.scale(0.5f); - v1.sub(a1, center); - v2.sub(a2, center); - v1.normalize(); - v2.normalize(); - if (isParallel(v1, v2)) { - if (!isImproper) { - for (int o = 2; o <= 8; o++) - checkAxisOrder(atoms, elements, o, v1, center); - } - continue; - } - if (nC[2] < axesMaxN[2]) { - v3.set(pt); - checkAxisOrder(atoms, elements, 2, v3, center); - } - - float order = (float) (2 * Math.PI / v1.angle(v2)); - int iOrder = (int) (order + 0.01f); - boolean isIntegerOrder =(order - iOrder <= 0.02f); - if (!isIntegerOrder) - continue; // not an integer order - if (isImproper) { - if (iOrder != 4 && iOrder != 6) - continue; - } - if (iOrder <= 8 && nC[iOrder] < axesMaxN[iOrder]) { - // not a valid order, or plenty of these already - v3.cross(v1, v2); - checkAxisOrder(atoms, elements, iOrder, v3, center); - } - } - } - if (isImproper) - return null; - Vector3f[] vs = new Vector3f[nC[2] * 2]; - for (int i = 0; i < vs.length; i++) - vs[i] = new Vector3f(); - int n = 0; - for (int i = 0; i < nC[2]; i++) { - vs[n++].set(axes[2][i].normalOrAxis); - vs[n].set(axes[2][i].normalOrAxis); - vs[n++].scale(-1); - } - for (int i = vs.length; --i >= 2;) - for (int j = i; --j >= 1;) - for (int k = j; --k >= 0;) { - v3.set(vs[i]); - v3.add(vs[j]); - v3.add(vs[k]); - if (v3.length() < 1.0) - continue; - checkAxisOrder(atoms, elements, 3, v3, center); - } - return null; - } -*/ int maxElement = 0; int[] eCounts; private void getElementArrays(Point3f[] atoms, int[] elements) { @@ -837,11 +753,11 @@ for (int j = 0; j < nC[0]; j++) { op=axes[0][j]; v.set(op.normalOrAxis); - v.scale(0.01f); + v.scale(0.025f); v.add(center); sb.append("draw vp").append(j).append("disk width 6.0 cylinder ") .append(Escape.escape(v)); - v.scaleAdd(-0.02f, op.normalOrAxis, v); + v.scaleAdd(-0.05f, op.normalOrAxis, v); sb.append(Escape.escape(v)).append(" color translucent;\n"); v.set(op.normalOrAxis); Modified: trunk/Jmol/src/org/jmol/util/TextFormat.java =================================================================== --- trunk/Jmol/src/org/jmol/util/TextFormat.java 2008-07-30 22:29:20 UTC (rev 9664) +++ trunk/Jmol/src/org/jmol/util/TextFormat.java 2008-07-31 14:12:00 UTC (rev 9665) @@ -26,7 +26,6 @@ package org.jmol.util; import java.text.DecimalFormat; - import javax.vecmath.Point3f; public class TextFormat { @@ -399,4 +398,58 @@ return (f + " ").substring(0,n); } + public static boolean isWild(String s) { + return s.indexOf("*") >= 0 || s.indexOf("?") >= 0; + } + + public static boolean isMatch(String s, String strWildcard, + boolean checkStar, boolean allowInitialStar) { + + int ich = 0; + int cchWildcard = strWildcard.length(); + int cchs = s.length(); + if (cchs == 0 || cchWildcard == 0) + return false; + if (checkStar) { + if (allowInitialStar && strWildcard.charAt(0) == '*') + strWildcard = "??????????" + strWildcard.substring(1); + if (strWildcard.charAt(ich = strWildcard.length() - 1) == '*') + strWildcard = strWildcard.substring(0, ich) + "??????????"; + cchWildcard = strWildcard.length(); + } + + if (cchWildcard < cchs) + return false; + + ich = 0; + + // atom name variant (trimLeadingMarks == false) + + // -- each ? matches ONE character if not at end + // -- extra ? at end ignored + + //group3 variant (trimLeadingMarks == true) + + // -- each ? matches ONE character if not at end + // -- extra ? at beginning reduced to match length + // -- extra ? at end ignored + + while (cchWildcard > cchs) { + if (allowInitialStar && strWildcard.charAt(ich) == '?') { + ++ich; + } else if (strWildcard.charAt(ich + cchWildcard - 1) != '?') { + return false; + } + --cchWildcard; + } + + for (int i = cchs; --i >= 0;) { + char charWild = strWildcard.charAt(ich + i); + if (charWild == '?') + continue; + if (charWild != s.charAt(i)) + return false; + } + return true; + } } Modified: trunk/Jmol/src/org/jmol/viewer/Eval.java =================================================================== --- trunk/Jmol/src/org/jmol/viewer/Eval.java 2008-07-30 22:29:20 UTC (rev 9664) +++ trunk/Jmol/src/org/jmol/viewer/Eval.java 2008-07-31 14:12:00 UTC (rev 9665) @@ -1542,7 +1542,7 @@ case Token.spec_atom: case Token.spec_name_pattern: case Token.spec_alternate: - rpn.addX(viewer.getAtomBits(instruction.tok, (String) value)); + rpn.addX(getAtomBits(instruction.tok, (String) value)); break; case Token.spec_model: // from select */1002 or */1000002 or */1.2 @@ -1750,9 +1750,8 @@ } private BitSet getAtomBits(int tokType, Object specInfo) { - if (isSyntaxCheck) - return new BitSet(); - return viewer.getAtomBits(tokType, specInfo); + return (isSyntaxCheck ? new BitSet() + : viewer.getAtomBits(tokType, specInfo)); } void deleteAtomsInVariables(BitSet bsDeleted) { @@ -5704,11 +5703,12 @@ case Token.integer: mad = intParameter(1); break; + case Token.times: case Token.identifier: viewer.loadShape(JmolConstants.SHAPE_ELLIPSOIDS); if (parameterAsString(i).equalsIgnoreCase("ID")) i++; - setShapeId(JmolConstants.SHAPE_ELLIPSOIDS, i, false); + i = setShapeId(JmolConstants.SHAPE_ELLIPSOIDS, i, false); for (++i; i < statementLength; i++) { String key = parameterAsString(i); Object value = null; @@ -5778,8 +5778,23 @@ if (idSeen) error(ERROR_invalidArgument); String id = parameterAsString(i); + boolean isWild = (id.equals("*")); if (id.length() == 0) error(ERROR_invalidArgument); + if (isWild) { + switch(tokAt(i + 1)) { + case Token.nada: + case Token.on: + case Token.off: + case Token.color: + case Token.delete: + break; + default: + id += optParameterAsString(++i); + } + } + if (tokAt(i + 1) == Token.times) + id += parameterAsString(++i); setShapeProperty(iShape, "thisID", id.toLowerCase()); return i; } @@ -6026,10 +6041,11 @@ case Token.calculate: propertyName = "calculate"; break; + case Token.times: case Token.identifier: String cmd = parameterAsString(i); if (cmd.equalsIgnoreCase("id")) { - setShapeId(JmolConstants.SHAPE_DIPOLES, ++i, idSeen); + i = setShapeId(JmolConstants.SHAPE_DIPOLES, ++i, idSeen); break; } if (cmd.equalsIgnoreCase("cross")) { @@ -6068,7 +6084,7 @@ propertyValue = new Float(floatParameter(++i)); break; } - setShapeId(JmolConstants.SHAPE_DIPOLES, i, idSeen); + i = setShapeId(JmolConstants.SHAPE_DIPOLES, i, idSeen); break; default: error(ERROR_invalidArgument); @@ -9392,17 +9408,11 @@ String propertyName = null; Object propertyValue = null; int tok = getToken(i).tok; - if (i == 1 && tokAt(2) == Token.times) - tok = Token.nada; switch (tok) { - case Token.nada: - propertyName = "thisID"; - propertyValue = parameterAsString(i) + getToken(++i).value; - break; case Token.identifier: String str = parameterAsString(i); if (str.equalsIgnoreCase("id")) { - setShapeId(JmolConstants.SHAPE_PMESH, ++i, idSeen); + i = setShapeId(JmolConstants.SHAPE_PMESH, ++i, idSeen); break; } if (str.equalsIgnoreCase("FIXED")) { @@ -9546,13 +9556,7 @@ String propertyName = null; Object propertyValue = null; int tok = getToken(i).tok; - if (i == 1 && tokAt(2) == Token.times) - tok = Token.nada; switch (tok) { - case Token.nada: - propertyName = "thisID"; - propertyValue = parameterAsString(i) + getToken(++i).value; - break; case Token.leftbrace: case Token.point4f: case Token.point3f: @@ -9627,10 +9631,11 @@ intScale = intParameter(i); } break; + case Token.times: case Token.identifier: String str = parameterAsString(i); if (str.equalsIgnoreCase("id")) { - setShapeId(JmolConstants.SHAPE_DRAW, ++i, idSeen); + i = setShapeId(JmolConstants.SHAPE_DRAW, ++i, idSeen); break; } if (str.equalsIgnoreCase("FIXED")) { @@ -9719,7 +9724,7 @@ propertyName = "width"; break; } - setShapeId(JmolConstants.SHAPE_DRAW, i, idSeen); + i = setShapeId(JmolConstants.SHAPE_DRAW, i, idSeen); break; case Token.dollarsign: // $drawObject[m] @@ -10424,13 +10429,7 @@ String propertyName = null; Object propertyValue = null; int tok = getToken(i).tok; - if (i == 1 && tokAt(2) == Token.times) - tok = Token.nada; switch (tok) { - case Token.nada: - propertyName = "thisID"; - propertyValue = parameterAsString(i) + getToken(++i).value; - break; case Token.within: float distance = floatParameter(++i); propertyValue = centerParameter(++i); @@ -10560,7 +10559,7 @@ case Token.identifier: str = parameterAsString(i); if (str.equalsIgnoreCase("id")) { - setShapeId(iShape, ++i, idSeen); + i = setShapeId(iShape, ++i, idSeen); break; } if (str.equalsIgnoreCase("REMAPPABLE")) { // testing only Modified: trunk/Jmol/src/org/jmol/viewer/Jmol.properties =================================================================== --- trunk/Jmol/src/org/jmol/viewer/Jmol.properties 2008-07-30 22:29:20 UTC (rev 9664) +++ trunk/Jmol/src/org/jmol/viewer/Jmol.properties 2008-07-31 14:12:00 UTC (rev 9665) @@ -3,6 +3,8 @@ version=11.5.53_dev +# new feature: wildcard at beginning for draw/pmesh/isosurface/etc. *xxx on/off/delete allowed +# bug fix in draw pointGroup -- height of cylinder was too small # ----------------------------------------------------------------------------- #version=11.5.52 This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ha...@us...> - 2008-08-05 18:40:24
|
Revision: 9670 http://jmol.svn.sourceforge.net/jmol/?rev=9670&view=rev Author: hansonr Date: 2008-08-05 18:40:14 +0000 (Tue, 05 Aug 2008) Log Message: ----------- version=11.5.53_dev pointgroups # new feature: pointgroups with vibration vectors # bug fix: more testing with pointgroups Modified Paths: -------------- trunk/Jmol/src/org/jmol/modelset/ModelSet.java trunk/Jmol/src/org/jmol/shapespecial/Vectors.java trunk/Jmol/src/org/jmol/symmetry/PointGroup.java trunk/Jmol/src/org/jmol/viewer/Eval.java trunk/Jmol/src/org/jmol/viewer/Jmol.properties trunk/Jmol/src/org/jmol/viewer/TransformManager.java trunk/Jmol/src/org/jmol/viewer/Viewer.java Modified: trunk/Jmol/src/org/jmol/modelset/ModelSet.java =================================================================== --- trunk/Jmol/src/org/jmol/modelset/ModelSet.java 2008-08-05 17:32:28 UTC (rev 9669) +++ trunk/Jmol/src/org/jmol/modelset/ModelSet.java 2008-08-05 18:40:14 UTC (rev 9670) @@ -424,22 +424,38 @@ } public String calculatePointGroup(BitSet bsAtoms) { + int modelIndex = calculatePointGroupForFirstModel(bsAtoms, true); + return models[modelIndex].pointGroup.getName(); + } + + private int calculatePointGroupForFirstModel(BitSet bsAtoms, boolean forceNew) { int iAtom = BitSetUtil.firstSetBit(bsAtoms); - int modelIndex = atoms[iAtom].getModelIndex(); - for (int i = 0; i < atomCount; i++) - if (bsAtoms.get(i) && atoms[i].modelIndex != modelIndex) - bsAtoms.clear(i); - PointGroup pg = new PointGroup(atoms, bsAtoms); - models[modelIndex].pointGroup = pg; - return pg.getName(); + int modelIndex = (iAtom < 0 ? -1 : atoms[iAtom].getModelIndex()); + if (modelIndex < 0) { + modelIndex = BitSetUtil.firstSetBit(viewer.getVisibleFramesBitSet()); + bsAtoms = null; + } + if (forceNew || models[modelIndex].pointGroup == null) { + BitSet bs = getModelAtomBitSet(modelIndex, true); + if (bsAtoms != null) + for (int i = 0; i < atomCount; i++) + if (atoms[i].modelIndex == modelIndex) + if (!bsAtoms.get(i)) + bs.clear(i); + iAtom = BitSetUtil.firstSetBit(bs); + Object obj = getShapeProperty(JmolConstants.SHAPE_VECTORS, "mad", iAtom); + boolean haveVibration = (obj != null && ((Integer)obj).intValue() != 0 + || viewer.isVibrationOn()); + PointGroup pg = new PointGroup(atoms, bs, haveVibration); + models[modelIndex].pointGroup = pg; + } + return modelIndex; } - public String getPointGroupDraw(int modelIndex) { - if (modelIndex < 0) - return ""; - if (models[modelIndex].pointGroup == null) - calculatePointGroup(viewer.getSelectionSet()); - return models[modelIndex].pointGroup.drawInfo(); + public String getPointGroupDraw(BitSet bsAtoms) { + int modelIndex = calculatePointGroupForFirstModel(bsAtoms, false); + return (modelCount > 1 ? "frame " + getModelNumberDotted(modelIndex) + "; " : "") + + models[modelIndex].pointGroup.drawInfo(); } private BitSet modelsOf(BitSet bsAtoms, BitSet bsAllAtoms) { Modified: trunk/Jmol/src/org/jmol/shapespecial/Vectors.java =================================================================== --- trunk/Jmol/src/org/jmol/shapespecial/Vectors.java 2008-08-05 17:32:28 UTC (rev 9669) +++ trunk/Jmol/src/org/jmol/shapespecial/Vectors.java 2008-08-05 18:40:14 UTC (rev 9670) @@ -42,6 +42,12 @@ super.setProperty(propertyName, value, bsSelected); } + public Object getProperty(String propertyName, int param) { + if (propertyName == "mad") + return new Integer(mads == null || mads.length <= param ? 0 : mads[param]); + return super.getProperty(propertyName, param); + } + public String getShapeState() { return (isActive ? super.getShapeState() : ""); } Modified: trunk/Jmol/src/org/jmol/symmetry/PointGroup.java =================================================================== --- trunk/Jmol/src/org/jmol/symmetry/PointGroup.java 2008-08-05 17:32:28 UTC (rev 9669) +++ trunk/Jmol/src/org/jmol/symmetry/PointGroup.java 2008-08-05 18:40:14 UTC (rev 9670) @@ -100,7 +100,7 @@ final private Point3f center = new Point3f(); - public PointGroup(Atom[] atomset, BitSet bsAtoms) { + public PointGroup(Atom[] atomset, BitSet bsAtoms, boolean haveVibration) { nAxes = new int[maxAxis]; axes = new Operation[maxAxis][]; Point3f[] atoms; @@ -117,6 +117,16 @@ elements[n++] = atomset[i].getElementNumber() * bondIndex; } getElementArrays(atoms, elements); + if (haveVibration) { + Point3f[] atomVibs = new Point3f[atoms.length]; + for (int i = atoms.length; --i >= 0;) { + atomVibs[i] = new Point3f(atoms[i]); + Vector3f v = ((Atom)atoms[i]).getVibrationVector(); + if (v != null) + atomVibs[i].add(v); + } + atoms = atomVibs; + } findInversionCenter(atoms, elements); if (isLinear(atoms)) { Modified: trunk/Jmol/src/org/jmol/viewer/Eval.java =================================================================== --- trunk/Jmol/src/org/jmol/viewer/Eval.java 2008-08-05 17:32:28 UTC (rev 9669) +++ trunk/Jmol/src/org/jmol/viewer/Eval.java 2008-08-05 18:40:14 UTC (rev 9670) @@ -6214,11 +6214,8 @@ case Token.pointgroup: if (isSyntaxCheck) return; - int modelIndex = viewer.getCurrentModelIndex(); - if (modelIndex < 0) - error(ERROR_multipleModelsNotOK, "CALCULATE SYMMETRY"); if (tokAt(0) == Token.draw) - runScript(viewer.getPointGroupDraw(modelIndex)); + runScript(viewer.getPointGroupDraw()); else showString(viewer.calculatePointGroup()); return; @@ -8909,7 +8906,7 @@ return ""; } } else if (data == "PGRP") { - data = viewer.getPointGroupDraw(viewer.getCurrentModelIndex()); + data = viewer.getPointGroupDraw(); } else if (data == "PDB") { data = viewer.getPdbData(null); } else if (data == "XYZ" || data == "MOL") { Modified: trunk/Jmol/src/org/jmol/viewer/Jmol.properties =================================================================== --- trunk/Jmol/src/org/jmol/viewer/Jmol.properties 2008-08-05 17:32:28 UTC (rev 9669) +++ trunk/Jmol/src/org/jmol/viewer/Jmol.properties 2008-08-05 18:40:14 UTC (rev 9670) @@ -3,6 +3,7 @@ version=11.5.53_dev +# new feature: pointgroups with vibration vectors # bug fix: more testing with pointgroups # new feature: spacefill/dots/geosurface/cartoon/trace/etc. ONLY # -- show only this rendering type Modified: trunk/Jmol/src/org/jmol/viewer/TransformManager.java =================================================================== --- trunk/Jmol/src/org/jmol/viewer/TransformManager.java 2008-08-05 17:32:28 UTC (rev 9669) +++ trunk/Jmol/src/org/jmol/viewer/TransformManager.java 2008-08-05 18:40:14 UTC (rev 9670) @@ -1952,6 +1952,10 @@ private VibrationThread vibrationThread; + boolean isVibrationOn() { + return vibrationOn; + } + private void setVibrationOn(boolean vibrationOn) { if (!vibrationOn) { if (vibrationThread != null) { Modified: trunk/Jmol/src/org/jmol/viewer/Viewer.java =================================================================== --- trunk/Jmol/src/org/jmol/viewer/Viewer.java 2008-08-05 17:32:28 UTC (rev 9669) +++ trunk/Jmol/src/org/jmol/viewer/Viewer.java 2008-08-05 18:40:14 UTC (rev 9670) @@ -1145,6 +1145,10 @@ float getVibrationPeriod() { return global.vibrationPeriod; } + + public boolean isVibrationOn() { + return transformManager.vibrationOn; + } public void setVibrationScale(float scale) { //Eval @@ -6816,7 +6820,7 @@ return modelSet.calculatePointGroup(selectionManager.bsSelection); } - public String getPointGroupDraw(int modelIndex) { - return modelSet.getPointGroupDraw(modelIndex); + public String getPointGroupDraw() { + return modelSet.getPointGroupDraw(selectionManager.bsSelection); } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |