From: <ha...@us...> - 2010-08-16 17:01:33
|
Revision: 14005 http://jmol.svn.sourceforge.net/jmol/?rev=14005&view=rev Author: hansonr Date: 2010-08-16 17:01:26 +0000 (Mon, 16 Aug 2010) Log Message: ----------- version=12.0.7_dev # bug fix: isosurface colorscheme TRANSLUCENT "xxx" fillTriangle error # bug fix: should not allow isosurface ... map colorscheme "xxx" TRANSLUCENT Modified Paths: -------------- branches/v12_0/Jmol/src/org/jmol/g3d/Graphics3D.java branches/v12_0/Jmol/src/org/jmol/script/ScriptEvaluator.java branches/v12_0/Jmol/src/org/jmol/shapesurface/Isosurface.java branches/v12_0/Jmol/src/org/jmol/shapesurface/IsosurfaceRenderer.java branches/v12_0/Jmol/src/org/jmol/util/ColorEncoder.java branches/v12_0/Jmol/src/org/jmol/viewer/Jmol.properties Modified: branches/v12_0/Jmol/src/org/jmol/g3d/Graphics3D.java =================================================================== --- branches/v12_0/Jmol/src/org/jmol/g3d/Graphics3D.java 2010-08-16 16:48:09 UTC (rev 14004) +++ branches/v12_0/Jmol/src/org/jmol/g3d/Graphics3D.java 2010-08-16 17:01:26 UTC (rev 14005) @@ -214,7 +214,6 @@ short colixCurrent; int[] shadesCurrent; int argbCurrent; - boolean isTranslucent; boolean isScreened; int translucencyMask; int argbNoisyUp, argbNoisyDn; @@ -708,15 +707,6 @@ private int currentShadeIndex; - private void setColixAndShadeIndex(short colix, int shadeIndex) { - if (colix == colixCurrent && currentShadeIndex == shadeIndex) - return; - currentShadeIndex = -1; - setColix(colix); - setColorNoisy(shadeIndex); - } - - /** * sets current color from colix color index * @param colix the color index @@ -728,7 +718,7 @@ int mask = colix & TRANSLUCENT_MASK; if (mask == TRANSPARENT) return false; - isTranslucent = mask != 0; + boolean isTranslucent = mask != 0; isScreened = isTranslucent && mask == TRANSLUCENT_SCREENED; if (!checkTranslucent(isTranslucent && !isScreened)) return false; @@ -1330,32 +1320,6 @@ triangle3d.fillTriangle(xA, yA, zA, xB, yB, zB, xC, yC, zC, false); } */ - public void fillTriangle(Point3i screenA, short colixA, short normixA, - Point3i screenB, short colixB, short normixB, - Point3i screenC, short colixC, short normixC) { - // mesh, isosurface - boolean useGouraud; - if (normixA == normixB && normixA == normixC && - colixA == colixB && colixA == colixC) { - setColixAndShadeIndex(colixA, normix3d.getShadeIndex(normixA)); - useGouraud = false; - } else { - triangle3d.setGouraud(getShades(colixA)[normix3d.getShadeIndex(normixA)], - getShades(colixB)[normix3d.getShadeIndex(normixB)], - getShades(colixC)[normix3d.getShadeIndex(normixC)]); - int translucentCount = 0; - if (isColixTranslucent(colixA)) - ++translucentCount; - if (isColixTranslucent(colixB)) - ++translucentCount; - if (isColixTranslucent(colixC)) - ++translucentCount; - isTranslucent = translucentCount >= 2; - useGouraud = true; - } - triangle3d.fillTriangle(screenA, screenB, screenC, useGouraud); - } - public void fillTriangleTwoSided(short normix, int xScreenA, int yScreenA, int zScreenA, int xScreenB, int yScreenB, int zScreenB, @@ -1378,35 +1342,73 @@ triangle3d.fillTriangle(screenA, screenB, screenC, false); } - public void fillTriangle(Point3i screenA, short colixA, - short normixA, Point3i screenB, - short colixB, short normixB, - Point3i screenC, short colixC, - short normixC, float factor) { + public void fillTriangle(Point3i screenA, short colixA, short normixA, + Point3i screenB, short colixB, short normixB, + Point3i screenC, short colixC, short normixC, + float factor) { // isosurface test showing triangles boolean useGouraud; - if (normixA == normixB && normixA == normixC && colixA == colixB - && colixA == colixC) { - setColixAndShadeIndex(colixA, normix3d.getShadeIndex(normixA)); + if (!isPass2 && normixA == normixB && normixA == normixC + && colixA == colixB && colixA == colixC) { + setTriangleColixAndShadeIndex(colixA, normix3d.getShadeIndex(normixA)); useGouraud = false; } else { + if (!setTriangleTranslucency(colixA, colixB, colixC)) + return; triangle3d.setGouraud(getShades(colixA)[normix3d.getShadeIndex(normixA)], getShades(colixB)[normix3d.getShadeIndex(normixB)], getShades(colixC)[normix3d.getShadeIndex(normixC)]); - int translucentCount = 0; - if (isColixTranslucent(colixA)) - ++translucentCount; - if (isColixTranslucent(colixB)) - ++translucentCount; - if (isColixTranslucent(colixC)) - ++translucentCount; - isTranslucent = translucentCount >= 2; useGouraud = true; } - triangle3d.fillTriangle(screenA, screenB, screenC, factor, - useGouraud); + triangle3d.fillTriangle(screenA, screenB, screenC, factor, useGouraud); } + public void fillTriangle(Point3i screenA, short colixA, short normixA, + Point3i screenB, short colixB, short normixB, + Point3i screenC, short colixC, short normixC) { + // mesh, isosurface + boolean useGouraud; + if (!isPass2 && normixA == normixB && normixA == normixC + && colixA == colixB && colixA == colixC) { + setTriangleColixAndShadeIndex(colixA, normix3d.getShadeIndex(normixA)); + useGouraud = false; + } else { + if (!setTriangleTranslucency(colixA, colixB, colixC)) + return; + triangle3d.setGouraud(getShades(colixA)[normix3d.getShadeIndex(normixA)], + getShades(colixB)[normix3d.getShadeIndex(normixB)], + getShades(colixC)[normix3d.getShadeIndex(normixC)]); + useGouraud = true; + } + triangle3d.fillTriangle(screenA, screenB, screenC, useGouraud); + } + + private void setTriangleColixAndShadeIndex(short colix, int shadeIndex) { + if (colix == colixCurrent && currentShadeIndex == shadeIndex) + return; + currentShadeIndex = -1; + setColix(colix); + setColorNoisy(shadeIndex); + } + + private boolean setTriangleTranslucency(short colixA, short colixB, + short colixC) { + if (!isPass2) + return true; + int maskA = colixA & TRANSLUCENT_MASK; + int maskB = colixB & TRANSLUCENT_MASK; + int maskC = colixC & TRANSLUCENT_MASK; + maskA &= ~TRANSPARENT; + maskB &= ~TRANSPARENT; + maskC &= ~TRANSPARENT; + //if (maskA == 0 && maskB == 0 && maskC == 0) + //return false; + int mask = ((maskA + maskB + maskC) / 3) & TRANSLUCENT_MASK; + // System.out.println(mask >> TRANSLUCENT_SHIFT); + translucencyMask = (mask << ALPHA_SHIFT) | 0xFFFFFF; + return true; + } + /* *************************************************************** * quadrilaterals * ***************************************************************/ Modified: branches/v12_0/Jmol/src/org/jmol/script/ScriptEvaluator.java =================================================================== --- branches/v12_0/Jmol/src/org/jmol/script/ScriptEvaluator.java 2010-08-16 16:48:09 UTC (rev 14004) +++ branches/v12_0/Jmol/src/org/jmol/script/ScriptEvaluator.java 2010-08-16 17:01:26 UTC (rev 14005) @@ -15254,17 +15254,13 @@ i = iToken; break; case Token.colorscheme: - sbCommand.append(" colorScheme"); - // either order OK -- documented for "rwb" TRANSLUCENT + // either order NOT OK -- documented for TRANSLUCENT "rwb" if (tokAt(i + 1) == Token.translucent) { isColorSchemeTranslucent = true; i++; } colorScheme = parameterAsString(++i); - if (tokAt(i + 1) == Token.translucent) { - isColorSchemeTranslucent = true; - i++; - } + sbCommand.append(" colorScheme"); if (isColorSchemeTranslucent) sbCommand.append(" translucent"); sbCommand.append(" ").append(Escape.escape(colorScheme)); Modified: branches/v12_0/Jmol/src/org/jmol/shapesurface/Isosurface.java =================================================================== --- branches/v12_0/Jmol/src/org/jmol/shapesurface/Isosurface.java 2010-08-16 16:48:09 UTC (rev 14004) +++ branches/v12_0/Jmol/src/org/jmol/shapesurface/Isosurface.java 2010-08-16 17:01:26 UTC (rev 14005) @@ -480,7 +480,8 @@ if ("setColorScheme" == propertyName) { String schemeName = ((String) ((Object[]) value)[0]); - setColorCommand(schemeName, true); + boolean isTranslucent = ((Boolean)((Object[]) value)[1]).booleanValue(); + setColorCommand(schemeName, isTranslucent, true); return; } @@ -950,6 +951,7 @@ public void notifySurfaceMappingCompleted() { setModelIndex(); String schemeName = colorEncoder.getColorSchemeName(); + boolean isTranslucentScheme = colorEncoder.isTranslucent(); viewer.setPropertyColorScheme(schemeName, sg.getParams().colorSchemeTranslucent, false); viewer.setCurrentColorRange(jvxlData.valueMappedToRed, jvxlData.valueMappedToBlue); @@ -965,7 +967,7 @@ setPropertySuper("token", new Integer(explicitContours ? Token.nofill : Token.fill), null); setPropertySuper("token", new Integer(explicitContours ? Token.contourlines : Token.nocontourlines), null); // may not be the final color scheme, though. - setColorCommand(schemeName, true); + setColorCommand(schemeName, isTranslucentScheme, true); /* viewer.setCurrentColorRange(jvxlData.mappedDataMin, jvxlData.mappedDataMax); thisMesh.isColorSolid = false; @@ -976,11 +978,13 @@ */ } - private void setColorCommand(String schemeName, boolean useJvxlData) { + private void setColorCommand(String schemeName, boolean isTranslucent, boolean useJvxlData) { if (thisMesh == null) return; - thisMesh.colorCommand = "color $" + thisMesh.thisID + " " - + getUserColorScheme(schemeName) + " range "; + String colors = viewer.getColorSchemeList(schemeName, false); + thisMesh.colorCommand = "color $" + thisMesh.thisID + + (isTranslucent ? " translucent " : " ") + Escape.escape( + colors.length() == 0 ? schemeName : colors) + " range "; if (useJvxlData) { thisMesh.colorCommand += (jvxlData.isColorReversed ? jvxlData.valueMappedToBlue + " " + jvxlData.valueMappedToRed @@ -1112,9 +1116,15 @@ vertexColixes = thisMesh.vertexColixes = new short[thisMesh.vertexCount]; boolean isTranslucent = Graphics3D.isColixTranslucent(thisMesh.colix) && !Graphics3D.isColixTranslucent(viewer.getColixForPropertyValue(Float.NaN)); + boolean isTranslucentScheme = false; + String scheme = viewer.getPropertyColorScheme(); + if (scheme.startsWith("translucent ")) { + isTranslucentScheme = true; + scheme = scheme.substring(12).trim(); + } for (int i = thisMesh.vertexCount; --i >= 0;) { vertexColixes[i] = viewer.getColixForPropertyValue(vertexValues[i]); - if (isTranslucent) + if (isTranslucent && !isTranslucentScheme) vertexColixes[i] = Graphics3D.getColixTranslucent(vertexColixes[i], true, translucentLevel); } Vector[] contours = thisMesh.getContours(); @@ -1140,15 +1150,10 @@ jvxlData.valueMappedToBlue = Math.max(range[0], range[1]); jvxlData.isJvxlPrecisionColor = true; JvxlCoder.jvxlCreateColorData(jvxlData, vertexValues); - setColorCommand(viewer.getPropertyColorScheme(), false); + setColorCommand(scheme, isTranslucentScheme, false); thisMesh.isColorSolid = false; } - private String getUserColorScheme(String schemeName) { - String colors = viewer.getColorSchemeList(schemeName, false); - return "\"" + (colors.length() == 0 ? schemeName : colors) + "\""; - } - public void getPlane(int x) { // only for surface readers } Modified: branches/v12_0/Jmol/src/org/jmol/shapesurface/IsosurfaceRenderer.java =================================================================== --- branches/v12_0/Jmol/src/org/jmol/shapesurface/IsosurfaceRenderer.java 2010-08-16 16:48:09 UTC (rev 14004) +++ branches/v12_0/Jmol/src/org/jmol/shapesurface/IsosurfaceRenderer.java 2010-08-16 17:01:26 UTC (rev 14005) @@ -257,7 +257,7 @@ if (transformedVectors[nC].z < 0) check ^= 4; } - if (fill && check != 7) + if (fill && check == 0) continue; short colixA, colixB, colixC; if (colorSolid) { Modified: branches/v12_0/Jmol/src/org/jmol/util/ColorEncoder.java =================================================================== --- branches/v12_0/Jmol/src/org/jmol/util/ColorEncoder.java 2010-08-16 16:48:09 UTC (rev 14004) +++ branches/v12_0/Jmol/src/org/jmol/util/ColorEncoder.java 2010-08-16 17:01:26 UTC (rev 14005) @@ -194,6 +194,10 @@ public String getColorSchemeName() { return getColorSchemeName(currentPalette); } + + public boolean isTranslucent() { + return currentTranslucent; + } public final static String getColorSchemeName(int i) { int absi = Math.abs(i); Modified: branches/v12_0/Jmol/src/org/jmol/viewer/Jmol.properties =================================================================== --- branches/v12_0/Jmol/src/org/jmol/viewer/Jmol.properties 2010-08-16 16:48:09 UTC (rev 14004) +++ branches/v12_0/Jmol/src/org/jmol/viewer/Jmol.properties 2010-08-16 17:01:26 UTC (rev 14005) @@ -4,6 +4,8 @@ version=12.0.7_dev +# bug fix: isosurface colorscheme TRANSLUCENT "xxx" fillTriangle error +# bug fix: should not allow isosurface ... map colorscheme "xxx" TRANSLUCENT # bug fix: CRYSTAL reader FREQUENCY when input deck is missing VIBRATION record # -------------------------------------------------------------- This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ha...@us...> - 2010-08-17 05:59:32
|
Revision: 14010 http://jmol.svn.sourceforge.net/jmol/?rev=14010&view=rev Author: hansonr Date: 2010-08-17 05:59:24 +0000 (Tue, 17 Aug 2010) Log Message: ----------- version=12.0.7_dev # bug fix: isosurface color range should not carry over to general "color property" # bug fix: isosurface colorscheme TRANSLUCENT "xxx" fillTriangle error # bug fix: should not allow isosurface ... map colorscheme "xxx" TRANSLUCENT # bug fix: CRYSTAL reader FREQUENCY when input deck is missing VIBRATION record Modified Paths: -------------- branches/v12_0/Jmol/src/org/jmol/jvxl/data/JvxlCoder.java branches/v12_0/Jmol/src/org/jmol/jvxl/readers/JvxlXmlReader.java branches/v12_0/Jmol/src/org/jmol/jvxl/readers/SurfaceGenerator.java branches/v12_0/Jmol/src/org/jmol/jvxl/readers/SurfaceReader.java branches/v12_0/Jmol/src/org/jmol/script/ScriptEvaluator.java branches/v12_0/Jmol/src/org/jmol/shape/Shape.java branches/v12_0/Jmol/src/org/jmol/shapesurface/Isosurface.java branches/v12_0/Jmol/src/org/jmol/util/ColorEncoder.java branches/v12_0/Jmol/src/org/jmol/viewer/ColorManager.java branches/v12_0/Jmol/src/org/jmol/viewer/Jmol.properties branches/v12_0/Jmol/src/org/jmol/viewer/Viewer.java Modified: branches/v12_0/Jmol/src/org/jmol/jvxl/data/JvxlCoder.java =================================================================== --- branches/v12_0/Jmol/src/org/jmol/jvxl/data/JvxlCoder.java 2010-08-17 05:58:11 UTC (rev 14009) +++ branches/v12_0/Jmol/src/org/jmol/jvxl/data/JvxlCoder.java 2010-08-17 05:59:24 UTC (rev 14010) @@ -300,11 +300,14 @@ //TODO: again, these really should not be necessary here float min = (jvxlData.mappedDataMin == Float.MAX_VALUE ? 0f : jvxlData.mappedDataMin); + float blue = (jvxlData.isColorReversed ? jvxlData.valueMappedToRed : jvxlData.valueMappedToBlue); + float red = (jvxlData.isColorReversed ? jvxlData.valueMappedToBlue : jvxlData.valueMappedToRed); + if (jvxlData.jvxlColorData != null && jvxlData.jvxlColorData.length() > 0 && !jvxlData.isBicolorMap) { addAttrib(attribs, "\n dataMinimum", "" + min); addAttrib(attribs, "\n dataMaximum", "" + jvxlData.mappedDataMax); - addAttrib(attribs, "\n valueMappedToRed", "" + jvxlData.valueMappedToRed); - addAttrib(attribs, "\n valueMappedToBlue", "" + jvxlData.valueMappedToBlue); + addAttrib(attribs, "\n valueMappedToRed", "" + red); + addAttrib(attribs, "\n valueMappedToBlue", "" + blue); } //TODO: confusing flag insideOut: if (jvxlData.insideOut) Modified: branches/v12_0/Jmol/src/org/jmol/jvxl/readers/JvxlXmlReader.java =================================================================== --- branches/v12_0/Jmol/src/org/jmol/jvxl/readers/JvxlXmlReader.java 2010-08-17 05:58:11 UTC (rev 14009) +++ branches/v12_0/Jmol/src/org/jmol/jvxl/readers/JvxlXmlReader.java 2010-08-17 05:59:24 UTC (rev 14010) @@ -265,8 +265,9 @@ red = -1; blue = 1; } - params.valueMappedToRed = red; - params.valueMappedToBlue = blue; + params.valueMappedToRed = Math.min(red, blue); + params.valueMappedToBlue = Math.max(red, blue); + params.isColorReversed = (red > blue); params.rangeDefined = true; } else { params.valueMappedToRed = 0f; @@ -280,6 +281,7 @@ jvxlData.valueMappedToBlue = params.valueMappedToBlue; jvxlData.mappedDataMin = params.mappedDataMin; jvxlData.mappedDataMax = params.mappedDataMax; + jvxlData.isColorReversed = params.isColorReversed; jvxlData.insideOut = insideOut; if (params.insideOut) jvxlData.insideOut = !jvxlData.insideOut; @@ -412,6 +414,9 @@ .error("You cannot use JVXL data to map onto OTHER data, because it only contains the data for one surface. Use ISOSURFACE \"file.jvxl\" not ISOSURFACE .... MAP \"file.jvxl\"."); return ""; } + colorEncoder.setColorScheme(null, false); + colorEncoder.setRange(params.valueMappedToRed, params.valueMappedToBlue, + params.isColorReversed); fractionPtr = 0; Logger.info("JVXL reading color data mapped min/max: " + params.mappedDataMin + "/" + params.mappedDataMax + " for " + vertexCount + " vertices." @@ -479,7 +484,7 @@ colixes[i] = ((params.isColorReversed ? value > 0 : value <= 0) ? colixNeg : colixPos); } else { - colixes[i] = getColorIndexFromPalette(value); + colixes[i] = colorEncoder.getColorIndex(value); } } if (params.mappedDataMin == Float.MAX_VALUE) { Modified: branches/v12_0/Jmol/src/org/jmol/jvxl/readers/SurfaceGenerator.java =================================================================== --- branches/v12_0/Jmol/src/org/jmol/jvxl/readers/SurfaceGenerator.java 2010-08-17 05:58:11 UTC (rev 14009) +++ branches/v12_0/Jmol/src/org/jmol/jvxl/readers/SurfaceGenerator.java 2010-08-17 05:59:24 UTC (rev 14010) @@ -564,6 +564,12 @@ if ("blue" == propertyName) { params.valueMappedToBlue = ((Float) value).floatValue(); + if (params.valueMappedToRed > params.valueMappedToBlue) { + float f = params.valueMappedToRed; + params.valueMappedToRed = params.valueMappedToBlue; + params.valueMappedToBlue = f; + params.isColorReversed = !params.isColorReversed; + } params.rangeDefined = true; params.rangeAll = false; return true; Modified: branches/v12_0/Jmol/src/org/jmol/jvxl/readers/SurfaceReader.java =================================================================== --- branches/v12_0/Jmol/src/org/jmol/jvxl/readers/SurfaceReader.java 2010-08-17 05:58:11 UTC (rev 14009) +++ branches/v12_0/Jmol/src/org/jmol/jvxl/readers/SurfaceReader.java 2010-08-17 05:59:24 UTC (rev 14010) @@ -323,9 +323,14 @@ if (!readAndSetVolumeParameters()) return false; if (!justForPlane && !Float.isNaN(params.sigma) && !allowSigma) { - Logger.error("Reader does not support SIGMA option -- using cutoff 1.6"); + if (params.sigma > 0) + Logger.error("Reader does not support SIGMA option -- using cutoff 1.6"); params.cutoff = 1.6f; } + // negative sigma just ignores the error message + // and means it was inserted by Jmol as a default option + if (params.sigma < 0) + params.sigma = -params.sigma; nPointsX = voxelCounts[0]; nPointsY = voxelCounts[1]; nPointsZ = voxelCounts[2]; @@ -701,7 +706,8 @@ float valueRed = jvxlData.valueMappedToRed; short minColorIndex = jvxlData.minColorIndex; short maxColorIndex = jvxlData.maxColorIndex; - + colorEncoder.setRange(params.valueMappedToRed, + params.valueMappedToBlue, params.isColorReversed); for (int i = meshData.vertexCount; --i >= 0;) { float value = vertexValues[i]; if (minColorIndex >= 0) { @@ -715,7 +721,7 @@ if (value >= valueBlue) value = valueBlue; - vertexColixes[i] = getColorIndexFromPalette(value); + vertexColixes[i] = colorEncoder.getColorIndex(value); } } @@ -725,10 +731,12 @@ jvxlData.contourValuesUsed = (jvxlData.contourValues == null ? new float[n] : jvxlData.contourValues); float dv = (valueBlue - valueRed) / (n + 1); // n + 1 because we want n lines between n + 1 slices + colorEncoder.setRange(params.valueMappedToRed, + params.valueMappedToBlue, params.isColorReversed); for (int i = 0; i < n; i++) { float v = (jvxlData.contourValues == null ? valueRed + (i + 1) * dv : jvxlData.contourValues[i]); jvxlData.contourValuesUsed[i] = v; - colors[i] = Graphics3D.getColixTranslucent(getArgbFromPalette(v)); + colors[i] = Graphics3D.getColixTranslucent(colorEncoder.getArgb(v)); } //TODO -- this strips translucency jvxlData.contourColors = Graphics3D.getHexCodes(colors); @@ -818,22 +826,6 @@ return max; } - protected short getColorIndexFromPalette(float value) { - if (params.isColorReversed) - return colorEncoder.getColorIndexFromPalette(-value, - -params.valueMappedToBlue, -params.valueMappedToRed); - return colorEncoder.getColorIndexFromPalette(value, - params.valueMappedToRed, params.valueMappedToBlue); - } - - protected int getArgbFromPalette(float value) { - if (params.isColorReversed) - return colorEncoder.getArgbFromPalette(-value, - -params.valueMappedToBlue, -params.valueMappedToRed); - return colorEncoder.getArgbFromPalette(value, - params.valueMappedToRed, params.valueMappedToBlue); - } - void updateTriangles() { if (meshDataServer == null) { meshData.invalidatePolygons(); Modified: branches/v12_0/Jmol/src/org/jmol/script/ScriptEvaluator.java =================================================================== --- branches/v12_0/Jmol/src/org/jmol/script/ScriptEvaluator.java 2010-08-17 05:58:11 UTC (rev 14009) +++ branches/v12_0/Jmol/src/org/jmol/script/ScriptEvaluator.java 2010-08-17 05:59:24 UTC (rev 14010) @@ -7248,6 +7248,7 @@ BitSet bs = null; String prefix = ""; boolean isColor = false; + boolean isIsosurface = (shapeType == JmolConstants.SHAPE_ISOSURFACE); int typeMask = 0; float translucentLevel = Float.MAX_VALUE; if (index < 0) { @@ -7301,7 +7302,7 @@ boolean isByElement = (name.indexOf(ColorEncoder.BYELEMENT_PREFIX) == 0); boolean isColorIndex = (isByElement || name .indexOf(ColorEncoder.BYRESIDUE_PREFIX) == 0); - byte pid = (isColorIndex || shapeType == JmolConstants.SHAPE_ISOSURFACE ? JmolConstants.PALETTE_PROPERTY + byte pid = (isColorIndex || isIsosurface ? JmolConstants.PALETTE_PROPERTY : tok == Token.spacefill ? JmolConstants.PALETTE_CPK : JmolConstants.getPaletteID(name)); // color atoms "cpkScheme" @@ -7321,7 +7322,7 @@ Integer.MAX_VALUE, false); } } else { - if (!isColorIndex && shapeType != JmolConstants.SHAPE_ISOSURFACE) + if (!isColorIndex && !isIsosurface) index++; if (name.equals("property") && Token.tokAttr((tok = getToken(index).tok), @@ -7354,9 +7355,9 @@ if (pid == JmolConstants.PALETTE_PROPERTY) { String scheme = (tokAt(index) == Token.string ? parameterAsString( index++).toLowerCase() : null); - if (scheme != null) { + if (scheme != null && !isIsosurface) { setStringProperty("propertyColorScheme", - (isTranslucent ? "translucent " : "") + scheme); + (isTranslucent && translucentLevel == Float.MAX_VALUE ? "translucent " : "") + scheme); isColorIndex = (scheme.indexOf(ColorEncoder.BYELEMENT_PREFIX) == 0 || scheme .indexOf(ColorEncoder.BYRESIDUE_PREFIX) == 0); } @@ -7367,35 +7368,42 @@ min = floatParameter(index + 1); max = floatParameter(index + 2); index += 3; - if (min == max && shapeType == JmolConstants.SHAPE_ISOSURFACE) { + if (min == max && isIsosurface) { float[] range = (float[]) getShapeProperty(shapeType, "dataRange"); if (range != null) { min = range[0]; max = range[1]; } - } else if (min == max) + } else if (min == max) { max = Float.MAX_VALUE; + } } if (!isSyntaxCheck) { - if (shapeType != JmolConstants.SHAPE_ISOSURFACE - && max != -Float.MAX_VALUE) { - if (data == null) + if (isIsosurface) { + } else if (data == null) { viewer.setCurrentColorRange(name); - else + } else { viewer.setCurrentColorRange((float[]) data, null); } - if (max != Float.MAX_VALUE) - viewer.setCurrentColorRange(min, max); + if (isIsosurface) { + checkLength(index); + isColor = false; + data = new Object[] {scheme, Boolean.valueOf(isTranslucent && translucentLevel == Float.MAX_VALUE), new float[] {min, max} }; + setShapeProperty(shapeType, "remapcolor", data); + showString(getIsosurfaceDataRange(shapeType, "")); + if (translucentLevel == Float.MAX_VALUE) + return; + } else if (max != Float.MAX_VALUE) { + viewer.setCurrentColorRange(min, max); + } } - if (shapeType == JmolConstants.SHAPE_ISOSURFACE) - prefix = "remap"; } else { index++; } + checkLength(index); colorvalue = new Byte((byte) pid); - checkLength(index); } - } + } if (isSyntaxCheck || shapeType < 0) return; switch (shapeType) { @@ -15682,8 +15690,9 @@ } if (firstPass && viewer.getParameter("_fileType").equals("Pdb") && Float.isNaN(sigma) && Float.isNaN(cutoff)) { - addShapeProperty(propertyList, "sigma", new Float(1)); - sbCommand.append(" sigma 1.0"); + // negative sigma just indicates that + addShapeProperty(propertyList, "sigma", new Float(-1)); + sbCommand.append(" sigma -1.0"); } propertyName = (firstPass ? "readFile" : "mapColor"); /* @@ -15873,8 +15882,6 @@ bsSelect = viewer.getSelectionSet(false); setShapeProperty(iShape, "finalize", " select " + Escape.escape(bsSelect) + sbCommand.toString()); - Integer n = (Integer) getShapeProperty(iShape, "count"); - float[] dataRange = (float[]) getShapeProperty(iShape, "dataRange"); String s = (String) getShapeProperty(iShape, "ID"); if (s != null) { cutoff = ((Float) getShapeProperty(iShape, "cutoff")).floatValue(); @@ -15885,11 +15892,8 @@ float[] minMax = (float[]) getShapeProperty(iShape, "minMaxInfo"); if (minMax[0] != Float.MAX_VALUE) s += " min=" + minMax[0] + " max=" + minMax[1]; - s += "; number of isosurfaces = " + n; - if (dataRange != null && dataRange[0] != Float.MAX_VALUE - && dataRange[0] != dataRange[1]) - s += "\ncolor range " + dataRange[2] + " " + dataRange[3] - + "; mapped data range " + dataRange[0] + " to " + dataRange[1]; + s += "; number of isosurfaces = " + getShapeProperty(iShape, "count"); + s += getIsosurfaceDataRange(iShape, "\n"); if (doCalcArea) s += "\nisosurfaceArea = " + Escape.escapeArray(area); if (doCalcVolume) @@ -15907,6 +15911,15 @@ setShapeProperty(iShape, "clear", null); } + private String getIsosurfaceDataRange(int iShape, String sep) { + float[] dataRange = (float[]) getShapeProperty(iShape, "dataRange"); + return (dataRange != null && dataRange[0] != Float.MAX_VALUE + && dataRange[0] != dataRange[1] ? sep + "isosurface" + + " full data range " + dataRange[0] + " to " + dataRange[1] + + " with color scheme spanning " + dataRange[2] + " to " + dataRange[3] + : ""); + } + private static Object testData; // for isosurface private static Object testData2; // for isosurface Modified: branches/v12_0/Jmol/src/org/jmol/shape/Shape.java =================================================================== --- branches/v12_0/Jmol/src/org/jmol/shape/Shape.java 2010-08-17 05:58:11 UTC (rev 14009) +++ branches/v12_0/Jmol/src/org/jmol/shape/Shape.java 2010-08-17 05:59:24 UTC (rev 14010) @@ -325,10 +325,6 @@ paletteID) : colix); } - protected void remapColors() { - - } - public Vector getShapeDetail() { return null; } Modified: branches/v12_0/Jmol/src/org/jmol/shapesurface/Isosurface.java =================================================================== --- branches/v12_0/Jmol/src/org/jmol/shapesurface/Isosurface.java 2010-08-17 05:58:11 UTC (rev 14009) +++ branches/v12_0/Jmol/src/org/jmol/shapesurface/Isosurface.java 2010-08-17 05:59:24 UTC (rev 14010) @@ -201,8 +201,10 @@ } if ("remapcolor" == propertyName) { - if (thisMesh != null) - remapColors(); + if (thisMesh != null) { + Object[] o = (Object[]) value; + remapColors((String) o[0], ((Boolean) o[1]).booleanValue(), (float[]) o[2]); + } return; } @@ -481,7 +483,7 @@ if ("setColorScheme" == propertyName) { String schemeName = ((String) ((Object[]) value)[0]); boolean isTranslucent = ((Boolean)((Object[]) value)[1]).booleanValue(); - setColorCommand(schemeName, isTranslucent, true); + setColorCommand(schemeName, isTranslucent); return; } @@ -545,8 +547,8 @@ if (property == "dataRange") return (thisMesh == null || jvxlData.jvxlPlane != null && !jvxlData.jvxlDataIsColorMapped ? null : new float[] { jvxlData.mappedDataMin, jvxlData.mappedDataMax, - jvxlData.valueMappedToRed, - jvxlData.valueMappedToBlue }); + (jvxlData.isColorReversed ? jvxlData.valueMappedToBlue : jvxlData.valueMappedToRed), + (jvxlData.isColorReversed ? jvxlData.valueMappedToRed : jvxlData.valueMappedToBlue)}); if (property == "moNumber") return new Integer(moNumber); if (property == "area") @@ -952,9 +954,9 @@ setModelIndex(); String schemeName = colorEncoder.getColorSchemeName(); boolean isTranslucentScheme = colorEncoder.isTranslucent(); - viewer.setPropertyColorScheme(schemeName, sg.getParams().colorSchemeTranslucent, false); - viewer.setCurrentColorRange(jvxlData.valueMappedToRed, - jvxlData.valueMappedToBlue); + //viewer.setPropertyColorScheme(schemeName, sg.getParams().colorSchemeTranslucent, false); + //viewer.setCurrentColorRange(jvxlData.valueMappedToRed, + // jvxlData.valueMappedToBlue); thisMesh.isColorSolid = false; thisMesh.colorDensity = jvxlData.colorDensity; thisMesh.getContours(); @@ -967,7 +969,7 @@ setPropertySuper("token", new Integer(explicitContours ? Token.nofill : Token.fill), null); setPropertySuper("token", new Integer(explicitContours ? Token.contourlines : Token.nocontourlines), null); // may not be the final color scheme, though. - setColorCommand(schemeName, isTranslucentScheme, true); + setColorCommand(schemeName, isTranslucentScheme); /* viewer.setCurrentColorRange(jvxlData.mappedDataMin, jvxlData.mappedDataMax); thisMesh.isColorSolid = false; @@ -978,21 +980,16 @@ */ } - private void setColorCommand(String schemeName, boolean isTranslucent, boolean useJvxlData) { + private void setColorCommand(String schemeName, boolean isTranslucent) { if (thisMesh == null) return; String colors = viewer.getColorSchemeList(schemeName, false); - thisMesh.colorCommand = "color $" + thisMesh.thisID - + (isTranslucent ? " translucent " : " ") + Escape.escape( - colors.length() == 0 ? schemeName : colors) + " range "; - if (useJvxlData) { - thisMesh.colorCommand += (jvxlData.isColorReversed ? jvxlData.valueMappedToBlue - + " " + jvxlData.valueMappedToRed - : jvxlData.valueMappedToRed + " " + jvxlData.valueMappedToBlue); - return; - } - float[] range = viewer.getCurrentColorRange(); - thisMesh.colorCommand += range[0] + " " + range[1]; + thisMesh.colorCommand = "color $" + thisMesh.thisID + + (isTranslucent ? " translucent " : " ") + + Escape.escape(colors.length() == 0 ? schemeName : colors) + " range "; + thisMesh.colorCommand += (jvxlData.isColorReversed ? jvxlData.valueMappedToBlue + + " " + jvxlData.valueMappedToRed + : jvxlData.valueMappedToRed + " " + jvxlData.valueMappedToBlue); } public Point3f[] calculateGeodesicSurface(BitSet bsSelected, @@ -1104,7 +1101,14 @@ return V; } - protected void remapColors() { + private void remapColors(String scheme, boolean isTranslucentScheme, float[] range) { + if (scheme == null) { + scheme = viewer.getPropertyColorScheme(); + if (scheme.startsWith("translucent ")) { + isTranslucentScheme = true; + scheme = scheme.substring(12).trim(); + } + } JvxlData jvxlData = thisMesh.jvxlData; float[] vertexValues = thisMesh.vertexValues; short[] vertexColixes = thisMesh.vertexColixes; @@ -1114,17 +1118,26 @@ return; if (vertexColixes == null) vertexColixes = thisMesh.vertexColixes = new short[thisMesh.vertexCount]; - boolean isTranslucent = Graphics3D.isColixTranslucent(thisMesh.colix) - && !Graphics3D.isColixTranslucent(viewer.getColixForPropertyValue(Float.NaN)); - boolean isTranslucentScheme = false; - String scheme = viewer.getPropertyColorScheme(); - if (scheme.startsWith("translucent ")) { - isTranslucentScheme = true; - scheme = scheme.substring(12).trim(); + thisMesh.jvxlData.isColorReversed = (range[0] > range[1]); + if (range[1] != Float.MAX_VALUE) { + jvxlData.valueMappedToRed = Math.min(range[0], range[1]); + jvxlData.valueMappedToBlue = Math.max(range[0], range[1]); } + ColorEncoder ce = new ColorEncoder(); + ce.setColorScheme(scheme, isTranslucentScheme); + ce.setRange(jvxlData.valueMappedToRed, jvxlData.valueMappedToBlue, thisMesh.jvxlData.isColorReversed); + // thisMesh.colix must be translucent if the scheme is translucent + // but may be translucent if the scheme is not translucent + boolean isTranslucent = Graphics3D.isColixTranslucent(thisMesh.colix); + if (isTranslucentScheme) { + if (!isTranslucent) + thisMesh.colix = Graphics3D.getColixTranslucent(thisMesh.colix, isTranslucentScheme, 0.5f); + // still, if the scheme is translucent, we don't want to color the vertices translucent + isTranslucent = false; + } for (int i = thisMesh.vertexCount; --i >= 0;) { - vertexColixes[i] = viewer.getColixForPropertyValue(vertexValues[i]); - if (isTranslucent && !isTranslucentScheme) + vertexColixes[i] = ce.getColorIndex(vertexValues[i]); + if (isTranslucent) vertexColixes[i] = Graphics3D.getColixTranslucent(vertexColixes[i], true, translucentLevel); } Vector[] contours = thisMesh.getContours(); @@ -1132,7 +1145,7 @@ for (int i = contours.length; --i >= 0; ) { float value = ((Float)contours[i].get(JvxlCoder.CONTOUR_VALUE)).floatValue(); short[] colix = ((short[])contours[i].get(JvxlCoder.CONTOUR_COLIX)); - colix[0] = viewer.getColixForPropertyValue(value); + colix[0] = ce.getColorIndex(value); int[] color = ((int[])contours[i].get(JvxlCoder.CONTOUR_COLOR)); color[0] = Graphics3D.getArgb(colix[0]); } @@ -1140,17 +1153,13 @@ //TODO -- still not right. if (thisMesh.contourValues != null) { thisMesh.contourColixes = new short[thisMesh.contourValues.length]; - for (int i = 0; i < thisMesh.contourValues.length; i++) { - thisMesh.contourColixes[i] = viewer.getColixForPropertyValue(thisMesh.contourValues[i]); - } + for (int i = 0; i < thisMesh.contourValues.length; i++) + thisMesh.contourColixes[i] = ce.getColorIndex(thisMesh.contourValues[i]); thisMesh.setDiscreteColixes(null, null); } - float[] range = viewer.getCurrentColorRange(); - jvxlData.valueMappedToRed = Math.min(range[0], range[1]); - jvxlData.valueMappedToBlue = Math.max(range[0], range[1]); jvxlData.isJvxlPrecisionColor = true; JvxlCoder.jvxlCreateColorData(jvxlData, vertexValues); - setColorCommand(scheme, isTranslucentScheme, false); + setColorCommand(scheme, isTranslucentScheme); thisMesh.isColorSolid = false; } Modified: branches/v12_0/Jmol/src/org/jmol/util/ColorEncoder.java =================================================================== --- branches/v12_0/Jmol/src/org/jmol/util/ColorEncoder.java 2010-08-17 05:58:11 UTC (rev 14009) +++ branches/v12_0/Jmol/src/org/jmol/util/ColorEncoder.java 2010-08-17 05:59:24 UTC (rev 14010) @@ -186,9 +186,27 @@ return name; } + private float lo; + private float hi; + private boolean isReversed; + + /** + * + * @param lo + * @param hi + * @param isReversed IGNORED in 12.0 + */ + public void setRange(float lo, float hi, boolean isReversed) { + this.lo = Math.min(lo, hi); + this.hi = Math.max(lo, hi); + this.isReversed = isReversed; + } + public int setColorScheme(String colorScheme, boolean isTranslucent) { currentTranslucent = isTranslucent; - return currentPalette = getColorScheme(colorScheme, false); + if (colorScheme != null) + currentPalette = getColorScheme(colorScheme, false); + return currentPalette; } public String getColorSchemeName() { @@ -364,19 +382,32 @@ private final static int GRAY = 0xFF808080; - public final int getArgbFromPalette(float val, float lo, float hi) { - return getArgbFromPalette(val, lo, hi, currentPalette); + public short getColorIndex(float val) { + return (isReversed ? getColorIndexFromPalette(-val, -hi, -lo, currentPalette, currentTranslucent) + : getColorIndexFromPalette(val, lo, hi, currentPalette, currentTranslucent)); } + public final static short getColorIndexFromPalette(float val, float lo, float hi, int palette, boolean isTranslucent) { short colix = getColorIndex(getArgbFromPalette(val, lo, hi, palette)); - if (isTranslucent) - colix = Graphics3D.getColixTranslucent(colix, true, (hi - val) / (hi - lo)); + if (isTranslucent) { + float f = (hi - val) / (hi - lo); + if (f > 1) + f = 1; // transparent + else if (f < 0.125f) // never fully opaque + f = 0.125f; + colix = Graphics3D.getColixTranslucent(colix, true, f); + } return colix; } + public final int getArgb(float val) { + return (isReversed ? getArgbFromPalette(-val, -hi, -lo, currentPalette) + : getArgbFromPalette(val, lo, hi, currentPalette)); + } + public final static int getArgbFromPalette(float val, float lo, float hi, int palette) { if (Float.isNaN(val)) return GRAY; Modified: branches/v12_0/Jmol/src/org/jmol/viewer/ColorManager.java =================================================================== --- branches/v12_0/Jmol/src/org/jmol/viewer/ColorManager.java 2010-08-17 05:58:11 UTC (rev 14009) +++ branches/v12_0/Jmol/src/org/jmol/viewer/ColorManager.java 2010-08-17 05:59:24 UTC (rev 14010) @@ -44,9 +44,11 @@ private int[] altArgbsCpk; private float colorHi, colorLo; private float[] colorData; - private int palette = 0; - + private int currentPalette = 0; + private boolean currentTranslucent = false; + + ColorManager(Viewer viewer, Graphics3D g3d) { this.viewer = viewer; this.g3d = g3d; @@ -283,22 +285,16 @@ g3d.changeColixArgb((short) (Elements.elementNumberMax + id), argb); } - boolean currentTranslucent = false; - int setColorScheme(String colorScheme, boolean isTranslucent, boolean isOverloaded) { currentTranslucent = isTranslucent; - palette = ColorEncoder.getColorScheme(colorScheme, isOverloaded); - Logger.info("ColorManager: color scheme now \"" + ColorEncoder.getColorSchemeName(palette) + "\" color value range: " + colorLo + " to " + colorHi); - return palette; + currentPalette = ColorEncoder.getColorScheme(colorScheme, isOverloaded); + Logger.info("ColorManager: color scheme now \"" + ColorEncoder.getColorSchemeName(currentPalette) + "\" color value range: " + colorLo + " to " + colorHi); + return currentPalette; } - float[] getCurrentColorRange() { - return new float[] {colorLo, colorHi}; - } - void setCurrentColorRange(float[] data, BitSet bs, String colorScheme) { colorData = data; - palette = ColorEncoder.getColorScheme(colorScheme, false); + currentPalette = ColorEncoder.getColorScheme(colorScheme, false); colorHi = Float.MIN_VALUE; colorLo = Float.MAX_VALUE; if (data == null) @@ -318,7 +314,7 @@ void setCurrentColorRange(float min, float max) { colorHi = max; colorLo = min; - Logger.info("color \"" + ColorEncoder.getColorSchemeName(palette) + "\" range " + colorLo + " " + colorHi); + Logger.info("color \"" + ColorEncoder.getColorSchemeName(currentPalette) + "\" range " + colorLo + " " + colorHi); } static String getState(StringBuffer sfunc) { @@ -330,7 +326,7 @@ } int[] getColorSchemeArray(String colorScheme) { - return ColorEncoder.getColorSchemeArray(colorScheme == null || colorScheme.length() == 0 ? palette : ColorEncoder.getColorScheme(colorScheme, false)); + return ColorEncoder.getColorSchemeArray(colorScheme == null || colorScheme.length() == 0 ? currentPalette : ColorEncoder.getColorScheme(colorScheme, false)); } String getColorSchemeList(String colorScheme, boolean ifDefault) { @@ -341,8 +337,8 @@ short getColixForPropertyValue(float val) { return (colorLo < colorHi ? - ColorEncoder.getColorIndexFromPalette(val, colorLo, colorHi, palette, currentTranslucent) - :ColorEncoder.getColorIndexFromPalette(-val, -colorLo, -colorHi, palette, currentTranslucent)); + ColorEncoder.getColorIndexFromPalette(val, colorLo, colorHi, currentPalette, currentTranslucent) + :ColorEncoder.getColorIndexFromPalette(-val, -colorLo, -colorHi, currentPalette, currentTranslucent)); } } Modified: branches/v12_0/Jmol/src/org/jmol/viewer/Jmol.properties =================================================================== --- branches/v12_0/Jmol/src/org/jmol/viewer/Jmol.properties 2010-08-17 05:58:11 UTC (rev 14009) +++ branches/v12_0/Jmol/src/org/jmol/viewer/Jmol.properties 2010-08-17 05:59:24 UTC (rev 14010) @@ -4,6 +4,7 @@ version=12.0.7_dev +# bug fix: isosurface color range should not carry over to general "color property" # bug fix: isosurface colorscheme TRANSLUCENT "xxx" fillTriangle error # bug fix: should not allow isosurface ... map colorscheme "xxx" TRANSLUCENT # bug fix: CRYSTAL reader FREQUENCY when input deck is missing VIBRATION record Modified: branches/v12_0/Jmol/src/org/jmol/viewer/Viewer.java =================================================================== --- branches/v12_0/Jmol/src/org/jmol/viewer/Viewer.java 2010-08-17 05:58:11 UTC (rev 14009) +++ branches/v12_0/Jmol/src/org/jmol/viewer/Viewer.java 2010-08-17 05:59:24 UTC (rev 14010) @@ -3196,10 +3196,6 @@ colorManager.setCurrentColorRange(min, max); } - public float[] getCurrentColorRange() { - return colorManager.getCurrentColorRange(); - } - public void setData(String type, Object[] data, int atomCount, int matchField, int matchFieldColumnCount, int field, int fieldColumnCount) { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ha...@us...> - 2010-08-17 22:11:58
|
Revision: 14017 http://jmol.svn.sourceforge.net/jmol/?rev=14017&view=rev Author: hansonr Date: 2010-08-17 22:11:52 +0000 (Tue, 17 Aug 2010) Log Message: ----------- version=12.0.7_dev # bug fix: associative arrays as ScriptVariables must be checked for type Modified Paths: -------------- branches/v12_0/Jmol/src/org/jmol/script/ScriptVariable.java branches/v12_0/Jmol/src/org/jmol/viewer/Jmol.properties Modified: branches/v12_0/Jmol/src/org/jmol/script/ScriptVariable.java =================================================================== --- branches/v12_0/Jmol/src/org/jmol/script/ScriptVariable.java 2010-08-17 22:07:21 UTC (rev 14016) +++ branches/v12_0/Jmol/src/org/jmol/script/ScriptVariable.java 2010-08-17 22:11:52 UTC (rev 14017) @@ -224,8 +224,23 @@ return new ScriptVariable(list, x); if (x instanceof Float[]) return new ScriptVariable(listf, x); - if (x instanceof Hashtable) + if (x instanceof Hashtable) { + Hashtable ht = (Hashtable) x; + Enumeration e = ht.keys(); + while (e.hasMoreElements()) { + if (!(ht.get(e.nextElement()) instanceof ScriptVariable)) { + Hashtable x2 = new Hashtable(); + e = ht.keys(); + while (e.hasMoreElements()) { + String key = (String) e.nextElement(); + x2.put(key, ScriptVariable.getVariable(ht.get(key))); + } + x = x2; + break; + } + } return new ScriptVariable(hash, x); + } // all the rest are stored as list Modified: branches/v12_0/Jmol/src/org/jmol/viewer/Jmol.properties =================================================================== --- branches/v12_0/Jmol/src/org/jmol/viewer/Jmol.properties 2010-08-17 22:07:21 UTC (rev 14016) +++ branches/v12_0/Jmol/src/org/jmol/viewer/Jmol.properties 2010-08-17 22:11:52 UTC (rev 14017) @@ -4,6 +4,7 @@ version=12.0.7_dev +# bug fix: associative arrays as ScriptVariables must be checked for type # bug fix: isosurface color range should not carry over to general "color property" # bug fix: isosurface colorscheme TRANSLUCENT "xxx" fillTriangle error # bug fix: should not allow isosurface ... map colorscheme "xxx" TRANSLUCENT This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ha...@us...> - 2010-08-17 23:08:55
|
Revision: 14020 http://jmol.svn.sourceforge.net/jmol/?rev=14020&view=rev Author: hansonr Date: 2010-08-17 23:08:48 +0000 (Tue, 17 Aug 2010) Log Message: ----------- version=12.0.7_dev # bug fix: associative array function .keys should report sorted key list Modified Paths: -------------- branches/v12_0/Jmol/src/org/jmol/script/ScriptMathProcessor.java branches/v12_0/Jmol/src/org/jmol/viewer/Jmol.properties Modified: branches/v12_0/Jmol/src/org/jmol/script/ScriptMathProcessor.java =================================================================== --- branches/v12_0/Jmol/src/org/jmol/script/ScriptMathProcessor.java 2010-08-17 22:34:01 UTC (rev 14019) +++ branches/v12_0/Jmol/src/org/jmol/script/ScriptMathProcessor.java 2010-08-17 23:08:48 UTC (rev 14020) @@ -28,6 +28,7 @@ import java.util.Date; import java.util.Enumeration; import java.util.Hashtable; +import java.util.Map; import java.util.Vector; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -2331,14 +2332,12 @@ case Token.keys: if (x2.tok != Token.hash) return addX(""); - Enumeration e = ((Hashtable)x2.value).keys(); - Vector v = new Vector(); - while (e.hasMoreElements()) - v.add(e.nextElement()); - String[] keys = new String[v.size()]; + Object[] keys = ((Hashtable) x2.value).keySet().toArray(); + Arrays.sort(keys); + String[] ret = new String[keys.length]; for (int i = 0; i < keys.length; i++) - keys[i] = (String) v.get(i); - return addX(keys); + ret[i] = (String) keys[i]; + return addX(ret); case Token.lines: switch (x2.tok) { case Token.matrix3f: Modified: branches/v12_0/Jmol/src/org/jmol/viewer/Jmol.properties =================================================================== --- branches/v12_0/Jmol/src/org/jmol/viewer/Jmol.properties 2010-08-17 22:34:01 UTC (rev 14019) +++ branches/v12_0/Jmol/src/org/jmol/viewer/Jmol.properties 2010-08-17 23:08:48 UTC (rev 14020) @@ -4,6 +4,7 @@ version=12.0.7_dev +# bug fix: associative array function .keys should report sorted key list # bug fix: associative arrays as ScriptVariables must be checked for type # bug fix: isosurface color range should not carry over to general "color property" # bug fix: isosurface colorscheme TRANSLUCENT "xxx" fillTriangle error This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ha...@us...> - 2010-08-18 02:33:18
|
Revision: 14025 http://jmol.svn.sourceforge.net/jmol/?rev=14025&view=rev Author: hansonr Date: 2010-08-18 02:33:12 +0000 (Wed, 18 Aug 2010) Log Message: ----------- version=12.0.7_dev # bug fix: CURSOR_WAIT hourglass not turning off automatically after set picking JmolScript operation Modified Paths: -------------- branches/v12_0/Jmol/src/org/jmol/script/ScriptEvaluator.java branches/v12_0/Jmol/src/org/jmol/viewer/Jmol.properties Modified: branches/v12_0/Jmol/src/org/jmol/script/ScriptEvaluator.java =================================================================== --- branches/v12_0/Jmol/src/org/jmol/script/ScriptEvaluator.java 2010-08-18 02:32:19 UTC (rev 14024) +++ branches/v12_0/Jmol/src/org/jmol/script/ScriptEvaluator.java 2010-08-18 02:33:12 UTC (rev 14025) @@ -2470,7 +2470,7 @@ if (!isSyntaxCheck) { // String s = viewer.getSetHistory(1); // viewer.addCommand(s + CommandHistory.ERROR_FLAG); - viewer.setCursor(Viewer.CURSOR_DEFAULT); + setCursorWait(false); viewer.setBooleanProperty("refreshing", true); viewer.setStringProperty("_errormessage", strUntranslated); } @@ -5224,8 +5224,7 @@ default: error(ERROR_unrecognizedCommand); } - if (!isSyntaxCheck && !tQuiet) - viewer.setCursor(Viewer.CURSOR_DEFAULT); + setCursorWait(false); // at end because we could use continue to avoid it if (executionStepping) { executionPaused = (isCommandDisplayable(pc + 1)); @@ -5233,6 +5232,11 @@ } } + private void setCursorWait(boolean TF) { + if (!isSyntaxCheck) + viewer.setCursor(TF ? Viewer.CURSOR_WAIT : Viewer.CURSOR_DEFAULT); + } + private void processShapeCommand(int tok) throws ScriptException { int iShape = 0; switch (tok) { @@ -8251,10 +8255,7 @@ loadScript.append(sOptions); htParams.put("loadScript", loadScript); } - - if (!isSyntaxCheck) - viewer.setCursor(Viewer.CURSOR_WAIT); - + setCursorWait(true); errMsg = viewer.loadModelFromFile(null, filename, filenames, null, isAppend, htParams, loadScript, tokType); if (os != null) @@ -14613,8 +14614,7 @@ if (moNumber != Integer.MAX_VALUE) { if (tokAt(i + 1) == Token.string) title = parameterAsString(i + 1); - if (!isSyntaxCheck) - viewer.setCursor(Viewer.CURSOR_WAIT); + setCursorWait(true); setMoData(propertyList, moNumber, offset, iModel, title); addShapeProperty(propertyList, "finalize", null); } @@ -14819,8 +14819,7 @@ Point3f[] pts; String str = null; int modelIndex = (isSyntaxCheck ? 0 : viewer.getCurrentModelIndex()); - if (!isSyntaxCheck) - viewer.setCursor(Viewer.CURSOR_WAIT); + setCursorWait(true); boolean idSeen = (initIsosurface(iShape) != null); boolean isWild = (idSeen && getShapeProperty(iShape, "ID") == null); boolean isColorSchemeTranslucent = false; Modified: branches/v12_0/Jmol/src/org/jmol/viewer/Jmol.properties =================================================================== --- branches/v12_0/Jmol/src/org/jmol/viewer/Jmol.properties 2010-08-18 02:32:19 UTC (rev 14024) +++ branches/v12_0/Jmol/src/org/jmol/viewer/Jmol.properties 2010-08-18 02:33:12 UTC (rev 14025) @@ -4,6 +4,7 @@ version=12.0.7_dev +# bug fix: CURSOR_WAIT hourglass not turning off automatically after set picking JmolScript operation # bug fix: associative array function .keys should report sorted key list # bug fix: associative arrays as ScriptVariables must be checked for type # bug fix: isosurface color range should not carry over to general "color property" This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ha...@us...> - 2010-08-18 06:34:19
|
Revision: 14030 http://jmol.svn.sourceforge.net/jmol/?rev=14030&view=rev Author: hansonr Date: 2010-08-18 06:34:12 +0000 (Wed, 18 Aug 2010) Log Message: ----------- version=12.0.7_dev # bug fix: rotation QUATERNION broken by 11.9.36, Mar 25, 2009 - Does not rotation about {0 0 0} Modified Paths: -------------- branches/v12_0/Jmol/src/org/jmol/script/ScriptEvaluator.java branches/v12_0/Jmol/src/org/jmol/viewer/Jmol.properties Modified: branches/v12_0/Jmol/src/org/jmol/script/ScriptEvaluator.java =================================================================== --- branches/v12_0/Jmol/src/org/jmol/script/ScriptEvaluator.java 2010-08-18 05:42:40 UTC (rev 14029) +++ branches/v12_0/Jmol/src/org/jmol/script/ScriptEvaluator.java 2010-08-18 06:34:12 UTC (rev 14030) @@ -9297,13 +9297,14 @@ // -n means number of seconds, not degreesPerSecond -endDegrees / degreesPerSecond : degreesPerSecond); - if (q != null) { - if (nPoints == 0) + // only when there is a translation (4x4 matrix or TRANSLATE) + // do we set the rotation to be the center of the selected atoms or model + if (nPoints == 0 && translation != null) points[0] = viewer.getAtomSetCenter(bsAtoms != null ? bsAtoms : isSelected ? viewer.getSelectionSet(false) : viewer .getModelUndeletedAtomsBitSet(-1)); - if (helicalPath) { + if (helicalPath && translation != null) { points[1] = new Point3f(points[0]); points[1].add(translation); Object[] ret = (Object[]) Measure.computeHelicalAxis(null, Token.array, @@ -9320,7 +9321,8 @@ } if (isSpin && m4 == null) m4 = ScriptMathProcessor.getMatrix4f(q.getMatrix(), translation); - nPoints = 1; + if (points[0] != null) + nPoints = 1; } if (invPoint != null) { viewer.invertAtomCoord(invPoint, bsAtoms); Modified: branches/v12_0/Jmol/src/org/jmol/viewer/Jmol.properties =================================================================== --- branches/v12_0/Jmol/src/org/jmol/viewer/Jmol.properties 2010-08-18 05:42:40 UTC (rev 14029) +++ branches/v12_0/Jmol/src/org/jmol/viewer/Jmol.properties 2010-08-18 06:34:12 UTC (rev 14030) @@ -4,6 +4,7 @@ version=12.0.7_dev +# bug fix: rotation QUATERNION broken by 11.9.36, Mar 25, 2009 - Does not rotation about {0 0 0} # bug fix: CURSOR_WAIT hourglass not turning off automatically after set picking JmolScript operation # bug fix: associative array function .keys should report sorted key list # bug fix: associative arrays as ScriptVariables must be checked for type This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ha...@us...> - 2010-08-18 07:22:00
|
Revision: 14032 http://jmol.svn.sourceforge.net/jmol/?rev=14032&view=rev Author: hansonr Date: 2010-08-18 07:21:53 +0000 (Wed, 18 Aug 2010) Log Message: ----------- 12.0.7 VERSION # bug fix: CRYSTAL reader FREQUENCY needs fragment numbers sorted Modified Paths: -------------- branches/v12_0/Jmol/src/org/jmol/adapter/readers/xtal/CrystalReader.java branches/v12_0/Jmol/src/org/jmol/viewer/Jmol.properties Modified: branches/v12_0/Jmol/src/org/jmol/adapter/readers/xtal/CrystalReader.java =================================================================== --- branches/v12_0/Jmol/src/org/jmol/adapter/readers/xtal/CrystalReader.java 2010-08-18 06:34:57 UTC (rev 14031) +++ branches/v12_0/Jmol/src/org/jmol/adapter/readers/xtal/CrystalReader.java 2010-08-18 07:21:53 UTC (rev 14032) @@ -33,6 +33,7 @@ //import org.jmol.util.SimpleUnitCell; import org.jmol.util.TextFormat; +import java.util.Arrays; import java.util.BitSet; import java.util.Vector; @@ -799,6 +800,8 @@ for (int i = 0, pos = 0; i < numAtomsFrag; i++, pos += 5) atomFrag[i] = getAtomIndexFromPrimitiveIndex(parseInt(tokens[pos]) - 1); + Arrays.sort(atomFrag); // the frequency module needs these sorted + // note: atomFrag[i] will be -1 if this atom is being ignored due to FILTER "conventional" } Modified: branches/v12_0/Jmol/src/org/jmol/viewer/Jmol.properties =================================================================== --- branches/v12_0/Jmol/src/org/jmol/viewer/Jmol.properties 2010-08-18 06:34:57 UTC (rev 14031) +++ branches/v12_0/Jmol/src/org/jmol/viewer/Jmol.properties 2010-08-18 07:21:53 UTC (rev 14032) @@ -2,8 +2,9 @@ # NOTE: Generally only bug fixes should be entered here. # NOTE: New features should be introduced in the trunk version 12.1.x -version=12.0.7_dev +version=12.0.7 +# bug fix: CRYSTAL reader FREQUENCY needs fragment numbers sorted # bug fix: rotation QUATERNION broken by 11.9.36, Mar 25, 2009 - Does not rotation about {0 0 0} # bug fix: CURSOR_WAIT hourglass not turning off automatically after set picking JmolScript operation # bug fix: associative array function .keys should report sorted key list This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ha...@us...> - 2010-08-18 19:29:14
|
Revision: 14047 http://jmol.svn.sourceforge.net/jmol/?rev=14047&view=rev Author: hansonr Date: 2010-08-18 19:29:07 +0000 (Wed, 18 Aug 2010) Log Message: ----------- version=12.0.8_dev # bug fix: GAMESS reader UHF caught on reading orbitals with LZ VALUE line Modified Paths: -------------- branches/v12_0/Jmol/src/org/jmol/adapter/readers/quantum/MOReader.java branches/v12_0/Jmol/src/org/jmol/util/ColorEncoder.java branches/v12_0/Jmol/src/org/jmol/viewer/Jmol.properties Modified: branches/v12_0/Jmol/src/org/jmol/adapter/readers/quantum/MOReader.java =================================================================== --- branches/v12_0/Jmol/src/org/jmol/adapter/readers/quantum/MOReader.java 2010-08-18 18:37:09 UTC (rev 14046) +++ branches/v12_0/Jmol/src/org/jmol/adapter/readers/quantum/MOReader.java 2010-08-18 19:29:07 UTC (rev 14047) @@ -358,6 +358,7 @@ if (str.length() == 0 || str.indexOf("--") >= 0 || str.indexOf(".....") >= 0 || str.indexOf("NBO BASIS") >= 0 // reading NBOs || str.indexOf("CI EIGENVECTORS WILL BE LABELED") >= 0 //this happens when doing MCSCF optimizations + || str.indexOf("LZ VALUE") >= 0 //open-shelled || str.indexOf(" THIS LOCALIZATION HAD") >= 0) { //this happens with certain localization methods if (str.length() == 0) nBlank++; @@ -365,6 +366,8 @@ nBlank = 0; if (nBlank == 2) break; + if (str.indexOf("LZ VALUE") >= 0) + discardLinesUntilBlank(); if (!haveCoeffMap) { haveCoeffMap = true; Modified: branches/v12_0/Jmol/src/org/jmol/util/ColorEncoder.java =================================================================== --- branches/v12_0/Jmol/src/org/jmol/util/ColorEncoder.java 2010-08-18 18:37:09 UTC (rev 14046) +++ branches/v12_0/Jmol/src/org/jmol/util/ColorEncoder.java 2010-08-18 19:29:07 UTC (rev 14047) @@ -117,6 +117,12 @@ int iScheme = getColorScheme(name, false, isOverloaded); if (isOverloaded) switch (iScheme) { + case BW: + palletBW = getPaletteBW(); + break; + case WB: + palletWB = getPaletteWB(); + break; case ROYGB: case BGYOR: argbsRoygb = JmolConstants.argbsRoygbScale; @@ -145,9 +151,16 @@ int iScheme = getColorScheme(name, false, isOverloaded); if (isOverloaded) switch (iScheme) { + case BW: + palletBW = thisScale; + break; + case WB: + palletWB = thisScale; + break; case ROYGB: case BGYOR: argbsRoygb = thisScale; + ihalf = argbsRoygb.length / 3; break; case RWB: case BWR: Modified: branches/v12_0/Jmol/src/org/jmol/viewer/Jmol.properties =================================================================== --- branches/v12_0/Jmol/src/org/jmol/viewer/Jmol.properties 2010-08-18 18:37:09 UTC (rev 14046) +++ branches/v12_0/Jmol/src/org/jmol/viewer/Jmol.properties 2010-08-18 19:29:07 UTC (rev 14047) @@ -4,6 +4,7 @@ version=12.0.8_dev +# bug fix: GAMESS reader UHF caught on reading orbitals with LZ VALUE line # -------------------------------------------------------------- #version=12.0.7 This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ha...@us...> - 2010-08-19 15:01:52
|
Revision: 14056 http://jmol.svn.sourceforge.net/jmol/?rev=14056&view=rev Author: hansonr Date: 2010-08-19 15:01:45 +0000 (Thu, 19 Aug 2010) Log Message: ----------- version=12.0.8_dev # bug fix: obscure error when array variable is in place of required expression Modified Paths: -------------- branches/v12_0/Jmol/src/org/jmol/script/ScriptEvaluator.java branches/v12_0/Jmol/src/org/jmol/viewer/Jmol.properties Modified: branches/v12_0/Jmol/src/org/jmol/script/ScriptEvaluator.java =================================================================== --- branches/v12_0/Jmol/src/org/jmol/script/ScriptEvaluator.java 2010-08-19 06:50:34 UTC (rev 14055) +++ branches/v12_0/Jmol/src/org/jmol/script/ScriptEvaluator.java 2010-08-19 15:01:45 UTC (rev 14056) @@ -3474,21 +3474,24 @@ tokOperator, (String) val) : compareFloat(tokWhat, data, tokOperator, comparisonFloat)); break; - case Token.hash: + case Token.decimal: + case Token.integer: + rpn.addXNum(new ScriptVariable(instruction)); + break; case Token.bitset: case Token.point3f: - case Token.point4f: rpn.addX(value); break; - case Token.decimal: - case Token.integer: - rpn.addXNum(new ScriptVariable(instruction)); - break; default: if (Token.tokAttr(instruction.tok, Token.mathop)) { rpn.addOp(instruction); break; } + if (!(value instanceof String)) { + // catch-all: point4f, hash, list, etc. + rpn.addX(value); + break; + } val = getParameter((String) value, false); if (isInMath) { rpn.addX(val); Modified: branches/v12_0/Jmol/src/org/jmol/viewer/Jmol.properties =================================================================== --- branches/v12_0/Jmol/src/org/jmol/viewer/Jmol.properties 2010-08-19 06:50:34 UTC (rev 14055) +++ branches/v12_0/Jmol/src/org/jmol/viewer/Jmol.properties 2010-08-19 15:01:45 UTC (rev 14056) @@ -4,6 +4,7 @@ version=12.0.8_dev +# bug fix: obscure error when array variable is in place of required expression # bug fix: ColorEncoder not allowing for override of BW and WB palette # bug fix: GAMESS reader UHF caught on reading orbitals with LZ VALUE line # -------------------------------------------------------------- This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ha...@us...> - 2010-08-19 21:42:56
|
Revision: 14067 http://jmol.svn.sourceforge.net/jmol/?rev=14067&view=rev Author: hansonr Date: 2010-08-19 21:42:49 +0000 (Thu, 19 Aug 2010) Log Message: ----------- version=12.0.8_dev # bug fix: QChem reader not indicating symmetry A B properly # bug fix: QChem reader filter "BETA" fails Modified Paths: -------------- branches/v12_0/Jmol/src/org/jmol/adapter/readers/quantum/QchemReader.java branches/v12_0/Jmol/src/org/jmol/viewer/Jmol.properties Modified: branches/v12_0/Jmol/src/org/jmol/adapter/readers/quantum/QchemReader.java =================================================================== --- branches/v12_0/Jmol/src/org/jmol/adapter/readers/quantum/QchemReader.java 2010-08-19 21:41:17 UTC (rev 14066) +++ branches/v12_0/Jmol/src/org/jmol/adapter/readers/quantum/QchemReader.java 2010-08-19 21:42:49 UTC (rev 14067) @@ -69,6 +69,9 @@ private MOInfo[] betas = null; private int nBasis = 0; // # of basis according to qchem + protected void initializeReader() { + energyUnits = "au"; + } /** * @return true if need to read new line @@ -108,13 +111,11 @@ if (moData == null) return true; if (line.indexOf("Orbital Energies (a.u.) and Symmetries") >= 0) { - if (filterMO()) - readESym(true); + readESym(true); return true; } if (line.indexOf("Orbital Energies (a.u.)") >= 0) { - if (filterMO()) - readESym(false); + readESym(false); return true; } if (line.indexOf("MOLECULAR ORBITAL COEFFICIENTS") >= 0) { @@ -139,7 +140,7 @@ private void readAtoms() throws Exception { atomSetCollection.newAtomSet(); - + setMOData(true); discardLines(2); String[] tokens; while (readLine() != null && !line.startsWith(" --")) { @@ -266,7 +267,7 @@ int shellCount = 0; int gaussianCount = 0; // local variables - Vector sdata = new Vector(); + shells = new Vector(); Vector gdata = new Vector(); String[] tokens; @@ -286,21 +287,19 @@ slater[2] = gaussianCount; int nGaussians = parseInt(tokens[1]); slater[3] = nGaussians; - sdata.addElement(slater); + shells.addElement(slater); gaussianCount += nGaussians; for (int i = 0; i < nGaussians; i++) gdata.addElement(getTokens(readLine())); } // now rearrange the gaussians (direct copy from GaussianReader) - float[][] garray = new float[gaussianCount][]; + gaussians = new float[gaussianCount][]; for (int i = 0; i < gaussianCount; i++) { tokens = (String[]) gdata.get(i); - garray[i] = new float[tokens.length]; + gaussians[i] = new float[tokens.length]; for (int j = 0; j < tokens.length; j++) - garray[i][j] = parseFloat(tokens[j]); + gaussians[i][j] = parseFloat(tokens[j]); } - moData.put("shells", sdata); - moData.put("gaussians", garray); if (Logger.debugging) { Logger.debug(shellCount + " slater shells read"); Logger.debug(gaussianCount + " gaussian primitives read"); @@ -309,145 +308,142 @@ tokens = getTokens(line); //nShell = parseInt(tokens[2]); nBasis = parseInt(tokens[5]); - moData.put("calculationType", calculationType); } -// since the orbital coefficients don't show the symmetry, I will read them here + // since the orbital coefficients don't show the symmetry, I will read them here /* * sample output for an unrestricted calculation * - -------------------------------------------------------------- + -------------------------------------------------------------- Orbital Energies (a.u.) and Symmetries - -------------------------------------------------------------- - Warning : Irrep of orbital( 1) could not be determined -.... - Warning : Irrep of orbital( 86) could not be determined - - Alpha MOs, Unrestricted - -- Occupied -- --10.446 -10.446 -10.446 -10.446 -10.412 -10.412 -1.100 -0.998 + -------------------------------------------------------------- + Warning : Irrep of orbital( 1) could not be determined + .... + Warning : Irrep of orbital( 86) could not be determined + + Alpha MOs, Unrestricted + -- Occupied -- + -10.446 -10.446 -10.446 -10.446 -10.412 -10.412 -1.100 -0.998 0 xxx 0 xxx 0 xxx 0 xxx 0 xxx 0 xxx 1 A1g 1 E1u -.... - -0.611 -0.571 -0.569 -0.512 -0.479 + .... + -0.611 -0.571 -0.569 -0.512 -0.479 1 A2u 1 E2g 1 E2g 1 E1g 1 E1g - -- Virtual -- - -0.252 -0.226 -0.102 -0.076 -0.049 -0.039 -0.015 -0.006 + -- Virtual -- + -0.252 -0.226 -0.102 -0.076 -0.049 -0.039 -0.015 -0.006 1 E2u 1 E2u 2 A1g 1 B2g 0 xxx 0 xxx 2 E2g 2 E2g -.... + .... 4.427 5 B1u - Warning : Irrep of orbital( 1) could not be determined -.... - Warning : Irrep of orbital( 57) could not be determined - - Beta MOs, Unrestricted - -- Occupied -- --10.442 -10.442 -10.441 -10.441 -10.413 -10.413 -1.088 -0.978 -.... - -0.577 -0.569 -0.566 -0.473 + Warning : Irrep of orbital( 1) could not be determined + .... + Warning : Irrep of orbital( 57) could not be determined + + Beta MOs, Unrestricted + -- Occupied -- + -10.442 -10.442 -10.441 -10.441 -10.413 -10.413 -1.088 -0.978 + .... + -0.577 -0.569 -0.566 -0.473 1 A2u 2 E2g 2 E2g 1 E1g - -- Virtual -- - -0.416 -0.214 -0.211 -0.100 -0.053 -0.047 -0.039 -0.008 + -- Virtual -- + -0.416 -0.214 -0.211 -0.100 -0.053 -0.047 -0.039 -0.008 1 E1g 1 E2u 1 E2u 3 A1g 1 B2g 0 xxx 0 xxx 3 E2g - .... + .... 4.100 4.433 - 10 E2g 6 B1u - -------------------------------------------------------------- - + 10 E2g 6 B1u + -------------------------------------------------------------- + * * For a restricted open shell * - -------------------------------------------------------------- + -------------------------------------------------------------- Orbital Energies (a.u.) and Symmetries - -------------------------------------------------------------- - Warning : Irrep of orbital( 1) could not be determined -.... - Warning : Irrep of orbital( 86) could not be determined - - Alpha MOs, Restricted - -- Doubly Occupied -- --10.446 -10.446 -10.445 -10.445 -10.413 -10.413 -1.099 -0.996 + -------------------------------------------------------------- + Warning : Irrep of orbital( 1) could not be determined + .... + Warning : Irrep of orbital( 86) could not be determined + + Alpha MOs, Restricted + -- Doubly Occupied -- + -10.446 -10.446 -10.445 -10.445 -10.413 -10.413 -1.099 -0.996 0 xxx 0 xxx 0 xxx 0 xxx 0 xxx 0 xxx 1 A1g 1 E1u -.... - -0.609 -0.572 -0.570 -0.481 + .... + -0.609 -0.572 -0.570 -0.481 1 A2u 2 E2g 2 E2g 1 E1g - -- Singly Occupied (Occupied) -- - -0.507 + -- Singly Occupied (Occupied) -- + -0.507 1 E1g - -- Virtual -- - -0.248 -0.230 -0.102 -0.076 -0.049 -0.039 -0.015 -0.007 + -- Virtual -- + -0.248 -0.230 -0.102 -0.076 -0.049 -0.039 -0.015 -0.007 1 E2u 1 E2u 2 A1g 1 B2g 0 xxx 0 xxx 3 E2g 3 E2g -.... + .... 4.427 6 B1u - - Beta MOs, Restricted - -- Doubly Occupied -- --10.443 -10.443 -10.442 -10.442 -10.413 -10.413 -1.088 -0.980 + + Beta MOs, Restricted + -- Doubly Occupied -- + -10.443 -10.443 -10.442 -10.442 -10.413 -10.413 -1.088 -0.980 0 xxx 0 xxx 0 xxx 0 xxx 0 xxx 0 xxx 1 A1g 1 E1u -.... - -0.578 -0.569 -0.566 -0.470 + .... + -0.578 -0.569 -0.566 -0.470 1 A2u 2 E2g 2 E2g 1 E1g - -- Singly Occupied (Vacant) -- - -0.421 + -- Singly Occupied (Vacant) -- + -0.421 1 E1g - -- Virtual -- - -0.215 -0.212 -0.100 -0.055 -0.047 -0.038 -0.008 -0.004 + -- Virtual -- + -0.215 -0.212 -0.100 -0.055 -0.047 -0.038 -0.008 -0.004 1 E2u 1 E2u 2 A1g 1 B2g 0 xxx 0 xxx 3 E2g 3 E2g -.... + .... 4.433 6 B1u - -------------------------------------------------------------- + -------------------------------------------------------------- * * For a restricted one : only need to read the alpha ones.... * - -------------------------------------------------------------- + -------------------------------------------------------------- Orbital Energies (a.u.) and Symmetries - -------------------------------------------------------------- - - Alpha MOs, Restricted - -- Occupied -- --10.187 -10.187 -10.187 -10.186 -10.186 -10.186 -0.847 -0.740 + -------------------------------------------------------------- + + Alpha MOs, Restricted + -- Occupied -- + -10.187 -10.187 -10.187 -10.186 -10.186 -10.186 -0.847 -0.740 1 A1g 1 E1u 1 E1u 1 E2g 1 E2g 1 B1u 2 A1g 2 E1u -.... - -0.360 -0.340 -0.340 -0.247 -0.246 + .... + -0.360 -0.340 -0.340 -0.247 -0.246 1 A2u 3 E2g 3 E2g 1 E1g 1 E1g - -- Virtual -- + -- Virtual -- 0.004 0.004 0.091 0.145 0.145 0.165 0.182 0.182 1 E2u 1 E2u 4 A1g 4 E1u 4 E1u 1 B2g 4 E2g 4 E2g -.... + .... 4.668 - 10 B1u - - Beta MOs, Restricted - -- Occupied -- --10.187 -10.187 -10.187 -10.186 -10.186 -10.186 -0.847 -0.740 + 10 B1u + + Beta MOs, Restricted + -- Occupied -- + -10.187 -10.187 -10.187 -10.186 -10.186 -10.186 -0.847 -0.740 1 A1g 1 E1u 1 E1u 1 E2g 1 E2g 1 B1u 2 A1g 2 E1u -.... - -0.360 -0.340 -0.340 -0.247 -0.246 + .... + -0.360 -0.340 -0.340 -0.247 -0.246 1 A2u 3 E2g 3 E2g 1 E1g 1 E1g - -- Virtual -- + -- Virtual -- 0.004 0.004 0.091 0.145 0.145 0.165 0.182 0.182 1 E2u 1 E2u 4 A1g 4 E1u 4 E1u 1 B2g 4 E2g 4 E2g -.... + .... 4.668 - 10 B1u - -------------------------------------------------------------- + 10 B1u + -------------------------------------------------------------- * */ private void readESym(boolean haveSym) throws Exception { - String[] tokens, spin = {"A","B"}; alphas = new MOInfo[nBasis]; betas = new MOInfo[nBasis]; MOInfo[] moInfos; - int ne=0; // number of electrons for a particular series of orbitals + int ne = 0; // number of electrons for a particular series of orbitals boolean readBetas = false; - discardLinesUntilStartsWith(" Alpha"); - tokens = getTokens(line); // initialize tokens for later as well + String[] tokens = getTokens(line); // initialize tokens for later as well moInfos = alphas; for (int e = 0; e < 2; e++) { // do for A and B electrons int nMO = 0; @@ -455,7 +451,8 @@ if (line.startsWith(" -- ")) { ne = 0; if (line.indexOf("Vacant") < 0) { - if (line.indexOf("Occupied") > 0) ne = 1; + if (line.indexOf("Occupied") > 0) + ne = 1; } readLine(); } @@ -464,24 +461,26 @@ break; // done.... } int nOrbs = getTokens(line).length; - if (nOrbs == 0 || line.startsWith(" Warning")) { + if (nOrbs == 0 || line.startsWith(" Warning")) { discardLinesUntilStartsWith(" Beta"); // now the beta ones. readBetas = true; moInfos = betas; break; } - if (haveSym) tokens = getTokens(readLine()); - for (int i=0, j=0; i < nOrbs; i++, j+=2) { + if (haveSym) + tokens = getTokens(readLine()); + for (int i = 0, j = 0; i < nOrbs; i++, j += 2) { MOInfo info = new MOInfo(); info.ne = ne; - info.label = spin[e]; - if (haveSym) info.moSymmetry = tokens[j]+tokens[j+1]; + if (haveSym) + info.moSymmetry = tokens[j] + tokens[j + 1] + " "; moInfos[nMO] = info; nMO++; } } } - if (!readBetas) betas=alphas; // no beta symmetry info: Restricted no sym + if (!readBetas) + betas = alphas; // no beta symmetry info: Restricted no sym } /* Restricted orbitals cartesian see H2O-B3LYP-631Gd.out: @@ -556,7 +555,7 @@ private void readQchemMolecularOrbitals() throws Exception { - + /* * Jmol: XX, YY, ZZ, XY, XZ, YZ * qchem: dxx, dxy, dyy, dxz, dyz, dzz : VERIFIED @@ -569,49 +568,49 @@ * */ int nMOs; // total number of MOs that were read - Vector orbitals = new Vector(); String orbitalType = getTokens(line)[0]; // is RESTRICTED or ALPHA - nMOs = readMOs(orbitalType.equals("RESTRICTED"), orbitals, alphas); + alphaBeta = (orbitalType.equals("RESTRICTTED") ? "" : "A"); + nMOs = readMOs(orbitalType.equals("RESTRICTED"), alphas); if (orbitalType.equals("ALPHA")) { // we also have BETA orbitals.... discardLinesUntilContains("BETA"); - nMOs += readMOs(false, orbitals, betas); + alphaBeta = "B"; + nMOs += readMOs(false, betas); } boolean isOK = true; if (dList.length() > 0) { - if (dSpherical) + if (dSpherical) isOK = getDFMap(dList, JmolAdapter.SHELL_D_SPHERICAL, DS_LIST, 2); else isOK = getDFMap(dList, JmolAdapter.SHELL_D_CARTESIAN, DC_LIST, 3); if (!isOK) { - Logger.error("atomic orbital order is unrecognized -- skipping reading of MOs. dList=" + dList); - orbitals = null; - return; + Logger + .error("atomic orbital order is unrecognized -- skipping reading of MOs. dList=" + + dList); + shells = null; } } if (fList.length() > 0) { - if (fSpherical) + if (fSpherical) isOK = getDFMap(fList, JmolAdapter.SHELL_F_SPHERICAL, FS_LIST, 2); else isOK = getDFMap(fList, JmolAdapter.SHELL_F_CARTESIAN, FC_LIST, 3); if (!isOK) { - Logger.error("atomic orbital order is unrecognized -- skipping reading of MOs. fList=" + fList); - orbitals = null; - return; + Logger + .error("atomic orbital order is unrecognized -- skipping reading of MOs. fList=" + + fList); + shells = null; } } - - moData.put("mos", orbitals); - moData.put("energyUnits", "au"); - setMOData(moData); + setMOData(shells == null); + shells = null; // clears mo data upon next model loading } - + String dList = ""; String fList = ""; boolean dSpherical = false; boolean fSpherical = false; - private int readMOs(boolean restricted, - Vector orbitals, MOInfo[] moInfos) throws Exception { + private int readMOs(boolean restricted, MOInfo[] moInfos) throws Exception { Hashtable[] mos = new Hashtable[6]; // max 6 MO's per line float[][] mocoef = new float[6][]; // coefficients for each MO int[] moid = new int[6]; // mo numbers @@ -670,16 +669,25 @@ MOInfo moInfo = moInfos[moid[i]]; mos[i].put("energy", new Float(energy[i])); mos[i].put("coefficients",mocoef[i]); - String label = moInfo.label; + String label = alphaBeta; int ne = moInfo.ne; if (restricted) ne = alphas[moid[i]].ne + betas[moid[i]].ne; mos[i].put("occupancy", new Float(ne)); - if (ne == 2) label = "AB"; - if (ne == 0) { - if (restricted) label = "V"; - else label = "V"+label; // keep spin information for the orbital + switch (ne) { + case 2: + label = "AB"; + break; + case 1: + break; + case 0: + if (restricted) + label = "V"; + else + label = "V" + label; // keep spin information for the orbital + break; } - mos[i].put("symmetry", moInfo.moSymmetry+" "+label +"("+(moid[i]+1)+")"); + mos[i].put("symmetry", moInfo.moSymmetry + label + "(" + + (moid[i] + 1) + ")"); orbitals.addElement(mos[i]); } nMOs += nMO; @@ -691,7 +699,6 @@ // orbital energies and symmetrys block protected class MOInfo { int ne = 0; // 0 or 1 - String label = "???"; - String moSymmetry = "???"; + String moSymmetry = ""; } } Modified: branches/v12_0/Jmol/src/org/jmol/viewer/Jmol.properties =================================================================== --- branches/v12_0/Jmol/src/org/jmol/viewer/Jmol.properties 2010-08-19 21:41:17 UTC (rev 14066) +++ branches/v12_0/Jmol/src/org/jmol/viewer/Jmol.properties 2010-08-19 21:42:49 UTC (rev 14067) @@ -4,6 +4,8 @@ version=12.0.8_dev +# bug fix: QChem reader not indicating symmetry A B properly +# bug fix: QChem reader filter "BETA" fails # bug fix: obscure error when array variable is in place of required expression # bug fix: ColorEncoder not allowing for override of BW and WB palette # bug fix: GAMESS reader UHF caught on reading orbitals with LZ VALUE line This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ha...@us...> - 2010-08-21 03:27:35
|
Revision: 14100 http://jmol.svn.sourceforge.net/jmol/?rev=14100&view=rev Author: hansonr Date: 2010-08-21 03:27:28 +0000 (Sat, 21 Aug 2010) Log Message: ----------- version=12.0.9_dev # bug fix: Writing PDB file with residue number > 9999 trashes file. Now writes "0000" "0001" etc. Modified Paths: -------------- branches/v12_0/Jmol/src/org/jmol/modelset/ModelCollection.java branches/v12_0/Jmol/src/org/jmol/viewer/Jmol.properties Modified: branches/v12_0/Jmol/src/org/jmol/modelset/ModelCollection.java =================================================================== --- branches/v12_0/Jmol/src/org/jmol/modelset/ModelCollection.java 2010-08-21 02:35:42 UTC (rev 14099) +++ branches/v12_0/Jmol/src/org/jmol/modelset/ModelCollection.java 2010-08-21 03:27:28 UTC (rev 14100) @@ -1186,15 +1186,15 @@ : t3x)); else if (a.isHetero()) tokens = (leftJustify ? - (t4h == null ? LabelToken.compile(viewer, "HETATM%5.-5i %-4.4a%1A%3.-3n %1c%4R%1E %8.3x%8.3y%8.3z%6.2Q%6.2b %2[symbol]\n", '\0', null) + (t4h == null ? LabelToken.compile(viewer, "HETATM%5.-5i %-4.4a%1A%3.-3n %1c%4.-4R%1E %8.3x%8.3y%8.3z%6.2Q%6.2b %2[symbol]\n", '\0', null) : t4h) - : (t3h == null ? LabelToken.compile(viewer, "HETATM%5.-5i %-3.3a%1A%3.-3n %1c%4R%1E %8.3x%8.3y%8.3z%6.2Q%6.2b %2[symbol]\n", '\0', null) + : (t3h == null ? LabelToken.compile(viewer, "HETATM%5.-5i %-3.3a%1A%3.-3n %1c%4.-4R%1E %8.3x%8.3y%8.3z%6.2Q%6.2b %2[symbol]\n", '\0', null) : t3h)); else tokens = (leftJustify ? - (t4a == null ? LabelToken.compile(viewer, "ATOM %5.-5i %-4.4a%1A%3.-3n %1c%4R%1E %8.3x%8.3y%8.3z%6.2Q%6.2b %2[symbol]\n", '\0', null) + (t4a == null ? LabelToken.compile(viewer, "ATOM %5.-5i %-4.4a%1A%3.-3n %1c%4.-4R%1E %8.3x%8.3y%8.3z%6.2Q%6.2b %2[symbol]\n", '\0', null) : t4a) - : (t3a == null ? LabelToken.compile(viewer, "ATOM %5.-5i %-3.3a%1A%3.-3n %1c%4R%1E %8.3x%8.3y%8.3z%6.2Q%6.2b %2[symbol]\n", '\0', null) + : (t3a == null ? LabelToken.compile(viewer, "ATOM %5.-5i %-3.3a%1A%3.-3n %1c%4.-4R%1E %8.3x%8.3y%8.3z%6.2Q%6.2b %2[symbol]\n", '\0', null) : t3a)); sb.append(LabelToken.formatLabel(viewer, a, null, tokens, '\0', null)); } Modified: branches/v12_0/Jmol/src/org/jmol/viewer/Jmol.properties =================================================================== --- branches/v12_0/Jmol/src/org/jmol/viewer/Jmol.properties 2010-08-21 02:35:42 UTC (rev 14099) +++ branches/v12_0/Jmol/src/org/jmol/viewer/Jmol.properties 2010-08-21 03:27:28 UTC (rev 14100) @@ -4,6 +4,7 @@ version=12.0.9_dev +# bug fix: Writing PDB file with residue number > 9999 trashes file. Now writes "0000" "0001" etc. # -------------------------------------------------------------- #version=12.0.8 This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ha...@us...> - 2010-08-21 03:37:40
|
Revision: 14102 http://jmol.svn.sourceforge.net/jmol/?rev=14102&view=rev Author: hansonr Date: 2010-08-21 03:37:33 +0000 (Sat, 21 Aug 2010) Log Message: ----------- version=12.0.9_dev # bug fix: JME reader misreading "Br+" Modified Paths: -------------- branches/v12_0/Jmol/src/org/jmol/adapter/readers/simple/JmeReader.java branches/v12_0/Jmol/src/org/jmol/viewer/Jmol.properties Modified: branches/v12_0/Jmol/src/org/jmol/adapter/readers/simple/JmeReader.java =================================================================== --- branches/v12_0/Jmol/src/org/jmol/adapter/readers/simple/JmeReader.java 2010-08-21 03:28:21 UTC (rev 14101) +++ branches/v12_0/Jmol/src/org/jmol/adapter/readers/simple/JmeReader.java 2010-08-21 03:37:33 UTC (rev 14102) @@ -83,17 +83,13 @@ int indexColon = strAtom.indexOf(':'); String elementSymbol = (indexColon > 0 ? strAtom.substring(0, indexColon) : strAtom); - if (elementSymbol.length() > 1) - switch (elementSymbol.charAt(1)) { - case '+': - elementSymbol = TextFormat.trim(elementSymbol, "+"); - atom.formalCharge = 1; - break; - case '-': - elementSymbol = TextFormat.trim(elementSymbol, "-"); - atom.formalCharge = -1; - break; - } + if (elementSymbol.indexOf("+") >= 0) { + elementSymbol = TextFormat.trim(elementSymbol, "+"); + atom.formalCharge = 1; + } else if (elementSymbol.indexOf("-") >= 0) { + elementSymbol = TextFormat.trim(elementSymbol, "-"); + atom.formalCharge = -1; + } atom.elementSymbol = elementSymbol; } /* Modified: branches/v12_0/Jmol/src/org/jmol/viewer/Jmol.properties =================================================================== --- branches/v12_0/Jmol/src/org/jmol/viewer/Jmol.properties 2010-08-21 03:28:21 UTC (rev 14101) +++ branches/v12_0/Jmol/src/org/jmol/viewer/Jmol.properties 2010-08-21 03:37:33 UTC (rev 14102) @@ -4,6 +4,7 @@ version=12.0.9_dev +# bug fix: JME reader misreading "Br+" # bug fix: Writing PDB file with residue number > 9999 trashes file. Now writes "0000" "0001" etc. # -------------------------------------------------------------- This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ha...@us...> - 2010-08-24 12:45:02
|
Revision: 14115 http://jmol.svn.sourceforge.net/jmol/?rev=14115&view=rev Author: hansonr Date: 2010-08-24 12:44:56 +0000 (Tue, 24 Aug 2010) Log Message: ----------- version=12.0.9_dev # bug fix: binary map files within zip directories cannot be read Modified Paths: -------------- branches/v12_0/Jmol/src/org/jmol/util/BinaryDocument.java branches/v12_0/Jmol/src/org/jmol/util/ZipUtil.java branches/v12_0/Jmol/src/org/jmol/viewer/FileManager.java branches/v12_0/Jmol/src/org/jmol/viewer/Jmol.properties Modified: branches/v12_0/Jmol/src/org/jmol/util/BinaryDocument.java =================================================================== --- branches/v12_0/Jmol/src/org/jmol/util/BinaryDocument.java 2010-08-24 12:43:48 UTC (rev 14114) +++ branches/v12_0/Jmol/src/org/jmol/util/BinaryDocument.java 2010-08-24 12:44:56 UTC (rev 14115) @@ -58,7 +58,7 @@ public void close() { try { stream.close(); - } catch (IOException e) { + } catch (Exception e) { // ignore } if (os != null) { Modified: branches/v12_0/Jmol/src/org/jmol/util/ZipUtil.java =================================================================== --- branches/v12_0/Jmol/src/org/jmol/util/ZipUtil.java 2010-08-24 12:43:48 UTC (rev 14114) +++ branches/v12_0/Jmol/src/org/jmol/util/ZipUtil.java 2010-08-24 12:44:56 UTC (rev 14115) @@ -151,11 +151,11 @@ * @param is * @param list * @param listPtr - * @param asInputStream for Pmesh + * @param asBufferedInputStream for Pmesh * @return directory listing or subfile contents */ static public Object getZipFileContents(InputStream is, String[] list, - int listPtr, boolean asInputStream) { + int listPtr, boolean asBufferedInputStream) { StringBuffer ret; if (list == null || listPtr >= list.length) return getZipDirectoryAsStringAndClose(is); @@ -173,8 +173,8 @@ ret.append(name).append('\n'); } String str = ret.toString(); - if (asInputStream) - return (InputStream) new ByteArrayInputStream(str.getBytes()); + if (asBufferedInputStream) + return new BufferedInputStream(new ByteArrayInputStream(str.getBytes())); return str; } boolean asBinaryString = false; @@ -189,9 +189,9 @@ //System.out.println("ZipUtil::ZipEntry.name = " + ze.getName() + " " + bytes.length); if (isZipFile(bytes)) return getZipFileContents(new BufferedInputStream( - new ByteArrayInputStream(bytes)), list, ++listPtr, asInputStream); - if (asInputStream) - return new ByteArrayInputStream(bytes); + new ByteArrayInputStream(bytes)), list, ++listPtr, asBufferedInputStream); + if (asBufferedInputStream) + return new BufferedInputStream(new ByteArrayInputStream(bytes)); if (asBinaryString) { ret = new StringBuffer(); for (int i = 0; i < bytes.length; i++) Modified: branches/v12_0/Jmol/src/org/jmol/viewer/FileManager.java =================================================================== --- branches/v12_0/Jmol/src/org/jmol/viewer/FileManager.java 2010-08-24 12:43:48 UTC (rev 14114) +++ branches/v12_0/Jmol/src/org/jmol/viewer/FileManager.java 2010-08-24 12:44:56 UTC (rev 14115) @@ -511,30 +511,29 @@ return t; try { BufferedInputStream bis = new BufferedInputStream((InputStream) t, 8192); - InputStream is = bis; - if (CompoundDocument.isCompoundDocument(is)) { + if (CompoundDocument.isCompoundDocument(bis)) { CompoundDocument doc = new CompoundDocument(bis); return getBufferedReaderForString(doc.getAllData("Molecule").toString()); - } else if (ZipUtil.isGzip(is)) { + } else if (ZipUtil.isGzip(bis)) { do { - is = new BufferedInputStream(new GZIPInputStream(is)); - } while (ZipUtil.isGzip(is)); - } else if (ZipUtil.isZipFile(is)) { + bis = new BufferedInputStream(new GZIPInputStream(bis)); + } while (ZipUtil.isGzip(bis)); + } else if (ZipUtil.isZipFile(bis)) { if (allowZipStream) - return new ZipInputStream(bis); + return new BufferedInputStream(new ZipInputStream(bis)); if (asInputStream) - return (InputStream) ZipUtil.getZipFileContents(is, subFileList, 1, + return (BufferedInputStream) ZipUtil.getZipFileContents(bis, subFileList, 1, true); // danger -- converting bytes to String here. // we lose 128-156 or so. - String s = (String) ZipUtil.getZipFileContents(is, subFileList, 1, + String s = (String) ZipUtil.getZipFileContents(bis, subFileList, 1, false); - is.close(); + bis.close(); return getBufferedReaderForString(s); } if (asInputStream) - return is; - return new BufferedReader(new InputStreamReader(is)); + return bis; + return new BufferedReader(new InputStreamReader(bis)); } catch (Exception ioe) { return ioe.getMessage(); } Modified: branches/v12_0/Jmol/src/org/jmol/viewer/Jmol.properties =================================================================== --- branches/v12_0/Jmol/src/org/jmol/viewer/Jmol.properties 2010-08-24 12:43:48 UTC (rev 14114) +++ branches/v12_0/Jmol/src/org/jmol/viewer/Jmol.properties 2010-08-24 12:44:56 UTC (rev 14115) @@ -4,6 +4,7 @@ version=12.0.9_dev +# bug fix: binary map files within zip directories cannot be read # bug fix: mouse-based slab does not refresh # bug fix: JME reader misreading "Br+" # bug fix: Writing PDB file with residue number > 9999 trashes file. Now writes "0000" "0001" etc. This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ha...@us...> - 2010-08-24 16:07:49
|
Revision: 14120 http://jmol.svn.sourceforge.net/jmol/?rev=14120&view=rev Author: hansonr Date: 2010-08-24 16:07:42 +0000 (Tue, 24 Aug 2010) Log Message: ----------- version=12.0.9_dev # bug fix: associative array problems with some auxiliaryInfo data saving to state Modified Paths: -------------- branches/v12_0/Jmol/src/org/jmol/script/ScriptMathProcessor.java branches/v12_0/Jmol/src/org/jmol/script/ScriptVariable.java branches/v12_0/Jmol/src/org/jmol/util/Escape.java branches/v12_0/Jmol/src/org/jmol/viewer/Jmol.properties Modified: branches/v12_0/Jmol/src/org/jmol/script/ScriptMathProcessor.java =================================================================== --- branches/v12_0/Jmol/src/org/jmol/script/ScriptMathProcessor.java 2010-08-24 14:12:47 UTC (rev 14119) +++ branches/v12_0/Jmol/src/org/jmol/script/ScriptMathProcessor.java 2010-08-24 16:07:42 UTC (rev 14120) @@ -1273,7 +1273,7 @@ if (pt < args.length) property = PropertyManager.extractProperty(property, args, pt); return addX(ScriptVariable.isVariableType(property) ? property : Escape - .toReadable(property)); + .toReadable(propertyName, property)); } private boolean evaluatePlane(ScriptVariable[] args, int tok) Modified: branches/v12_0/Jmol/src/org/jmol/script/ScriptVariable.java =================================================================== --- branches/v12_0/Jmol/src/org/jmol/script/ScriptVariable.java 2010-08-24 14:12:47 UTC (rev 14119) +++ branches/v12_0/Jmol/src/org/jmol/script/ScriptVariable.java 2010-08-24 16:07:42 UTC (rev 14120) @@ -233,7 +233,8 @@ e = ht.keys(); while (e.hasMoreElements()) { String key = (String) e.nextElement(); - x2.put(key, ScriptVariable.getVariable(ht.get(key))); + Object o = ht.get(key); + x2.put(key, getVariable(isVariableType(o) ? o : Escape.toReadable(key, o))); } x = x2; break; Modified: branches/v12_0/Jmol/src/org/jmol/util/Escape.java =================================================================== --- branches/v12_0/Jmol/src/org/jmol/util/Escape.java 2010-08-24 14:12:47 UTC (rev 14119) +++ branches/v12_0/Jmol/src/org/jmol/util/Escape.java 2010-08-24 16:07:42 UTC (rev 14120) @@ -64,6 +64,7 @@ if (x instanceof String[]) return escape((String[]) x, true); if (x instanceof int[] + || x instanceof int[][] || x instanceof float[] || x instanceof float[][] || x instanceof float[][][]) @@ -249,6 +250,8 @@ } private static String escapeNice(String s) { + if (s == null) + return "null"; float f = Parser.parseFloatStrict(s); return (Float.isNaN(f) ? escape(s) : s); } Modified: branches/v12_0/Jmol/src/org/jmol/viewer/Jmol.properties =================================================================== --- branches/v12_0/Jmol/src/org/jmol/viewer/Jmol.properties 2010-08-24 14:12:47 UTC (rev 14119) +++ branches/v12_0/Jmol/src/org/jmol/viewer/Jmol.properties 2010-08-24 16:07:42 UTC (rev 14120) @@ -4,6 +4,7 @@ version=12.0.9_dev +# bug fix: associative array problems with some auxiliaryInfo data saving to state # bug fix: binary map files within zip directories cannot be read # bug fix: mouse-based slab does not refresh # bug fix: JME reader misreading "Br+" This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ha...@us...> - 2010-08-24 23:53:34
|
Revision: 14125 http://jmol.svn.sourceforge.net/jmol/?rev=14125&view=rev Author: hansonr Date: 2010-08-24 23:53:28 +0000 (Tue, 24 Aug 2010) Log Message: ----------- version=12.0.9_dev # bug fix: undo and smilesurlformat tokens missing # bug fix: isosurface ... map SQUARED ... nonfunctional Modified Paths: -------------- branches/v12_0/Jmol/src/org/jmol/jvxl/readers/SurfaceGenerator.java branches/v12_0/Jmol/src/org/jmol/script/Token.java branches/v12_0/Jmol/src/org/jmol/viewer/Jmol.properties Modified: branches/v12_0/Jmol/src/org/jmol/jvxl/readers/SurfaceGenerator.java =================================================================== --- branches/v12_0/Jmol/src/org/jmol/jvxl/readers/SurfaceGenerator.java 2010-08-24 19:07:10 UTC (rev 14124) +++ branches/v12_0/Jmol/src/org/jmol/jvxl/readers/SurfaceGenerator.java 2010-08-24 23:53:28 UTC (rev 14125) @@ -1054,6 +1054,8 @@ //if (params.dataType == Parameters.SURFACE_FUNCTIONXY) //params.thePlane = new Point4f(0, 0, 1, 0); if (params.thePlane != null) { + boolean isSquared = params.isSquared; + params.isSquared = false; params.cutoff = 0; surfaceReader.setMappingPlane(params.thePlane); surfaceReader.createIsosurface(true);//but don't read volume data yet @@ -1064,6 +1066,7 @@ surfaceReader.discardTempData(true); return; } + params.isSquared = isSquared; params.mappedDataMin = Float.MAX_VALUE; surfaceReader.readTheVolumeData(true, params.thePlane); } else if (!params.colorBySets) { Modified: branches/v12_0/Jmol/src/org/jmol/script/Token.java =================================================================== --- branches/v12_0/Jmol/src/org/jmol/script/Token.java 2010-08-24 19:07:10 UTC (rev 14124) +++ branches/v12_0/Jmol/src/org/jmol/script/Token.java 2010-08-24 23:53:28 UTC (rev 14125) @@ -791,7 +791,8 @@ public final static int picklabel = strparam | 52; public final static int propertycolorscheme = strparam | 54; public final static int quaternionframe = strparam | 58; - public final static int unitcellcolor = strparam | 60; + public final static int smilesurlformat = strparam | 60; + public final static int unitcellcolor = strparam | 62; public final static int axesscale = floatparam | 2; public final static int bondtolerance = floatparam | 4; @@ -984,8 +985,9 @@ public final static int testflag2 = booleanparam | 186; public final static int testflag3 = booleanparam | 188; public final static int testflag4 = booleanparam | 190; - public final static int tracealpha = booleanparam | 192; - public final static int usearcball = booleanparam | 191; + public final static int tracealpha = booleanparam | 191; + public final static int undo = booleanparam | 192; + public final static int usearcball = booleanparam | 193; public final static int useminimizationthread = booleanparam | 194; public final static int usenumberlocalization = booleanparam | 196; public final static int waitformoveto = booleanparam | 197; @@ -2030,6 +2032,7 @@ "pickLabel", new Token(picklabel), "propertyColorScheme", new Token(propertycolorscheme), "quaternionFrame", new Token(quaternionframe), + "smilesUrlFormat", new Token(smilesurlformat), "unitCellColor", new Token(unitcellcolor), // float Modified: branches/v12_0/Jmol/src/org/jmol/viewer/Jmol.properties =================================================================== --- branches/v12_0/Jmol/src/org/jmol/viewer/Jmol.properties 2010-08-24 19:07:10 UTC (rev 14124) +++ branches/v12_0/Jmol/src/org/jmol/viewer/Jmol.properties 2010-08-24 23:53:28 UTC (rev 14125) @@ -4,6 +4,8 @@ version=12.0.9_dev +# bug fix: undo and smilesurlformat tokens missing +# bug fix: isosurface ... map SQUARED ... nonfunctional # bug fix: exit, quit are stopping spinning -- should just be stopping moveTo # unless !exit or !quit. # bug fix: associative array problems with some auxiliaryInfo data saving to state This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ha...@us...> - 2010-08-25 13:39:31
|
Revision: 14133 http://jmol.svn.sourceforge.net/jmol/?rev=14133&view=rev Author: hansonr Date: 2010-08-25 13:39:24 +0000 (Wed, 25 Aug 2010) Log Message: ----------- version=12.0.9 # bug fix: isosurface atomicOrbital not scaling well Modified Paths: -------------- branches/v12_0/Jmol/src/org/jmol/jvxl/readers/IsoShapeReader.java branches/v12_0/Jmol/src/org/jmol/jvxl/readers/Parameters.java branches/v12_0/Jmol/src/org/jmol/jvxl/readers/VolumeDataReader.java branches/v12_0/Jmol/src/org/jmol/viewer/Jmol.properties Modified: branches/v12_0/Jmol/src/org/jmol/jvxl/readers/IsoShapeReader.java =================================================================== --- branches/v12_0/Jmol/src/org/jmol/jvxl/readers/IsoShapeReader.java 2010-08-25 08:32:36 UTC (rev 14132) +++ branches/v12_0/Jmol/src/org/jmol/jvxl/readers/IsoShapeReader.java 2010-08-25 13:39:24 UTC (rev 14133) @@ -26,6 +26,7 @@ import javax.vecmath.Point3f; import org.jmol.jvxl.data.JvxlCoder; +import org.jmol.util.Logger; class IsoShapeReader extends VolumeDataReader { @@ -61,6 +62,7 @@ private float radius; private float ppa; private int maxGrid; + private final Point3f ptPsi = new Point3f(); protected void setup() { precalculateVoxelData = false; @@ -70,7 +72,7 @@ switch (dataType) { case Parameters.SURFACE_ATOMICORBITAL: calcFactors(psi_n, psi_l, psi_m); - radius = autoScaleOrbital(); + autoScaleOrbital(); ppa = 5f; maxGrid = 40; type = "hydrogen-like orbital"; @@ -147,7 +149,7 @@ - (float) Math.sqrt(ptPsi.x * ptPsi.x + ptPsi.y * ptPsi.y + ptPsi.z * ptPsi.z); } - float value = (float) hydrogenAtomPsiAt(ptPsi, psi_n, psi_l, psi_m); + float value = (float) hydrogenAtomPsi(); return (allowNegative || value >= 0 ? value : 0); } @@ -170,22 +172,6 @@ JvxlCoder.jvxlCreateHeaderWithoutTitleOrAtoms(volumeData, jvxlFileHeaderBuffer); } - private float autoScaleOrbital() { - float w = (psi_n * (psi_n + 3) - 5f) / psi_Znuc; - if (w < 1) - w = 1; - if (psi_n < 3) - w += 1; - float aMax = 0; - if (!isAnisotropic) - return w; - for (int i = 3; --i >= 0;) - if (anisotropy[i] > aMax) - aMax = anisotropy[i]; - return w * aMax; - } - - private final static float[] fact = new float[20]; static { fact[0] = 1; @@ -209,37 +195,54 @@ / fact[el - p] / fact[p - abm]; } - private final Point3f ptPsi = new Point3f(); + private void autoScaleOrbital() { + double min = params.cutoff / 2; + for (radius = 100; radius > 0; radius--) { + //System.out.println(radius + " " + radialPart(radius)); + if (radialPart(radius) >= min) + break; + } + radius += 1; + if (isAnisotropic) { + float aMax = 0; + for (int i = 3; --i >= 0;) + if (anisotropy[i] > aMax) + aMax = anisotropy[i]; + radius *= aMax; + } + Logger.info("radial extent set to " + radius + " for cutoff " + + params.cutoff); + } - private double hydrogenAtomPsiAt(Point3f pt, int n, int el, int m) { + private double radialPart(double r) { + double rho = 2d * psi_Znuc * r / psi_n / A0; + double sum = 0; + for (int p = 0; p <= psi_n - psi_l - 1; p++) + sum += Math.pow(-rho, p) * rfactor[p]; + return Math.exp(-rho / 2) * Math.pow(rho, psi_l) * sum; + } + + private double hydrogenAtomPsi() { // ref: http://www.stolaf.edu/people/hansonr/imt/concept/schroed.pdf - int abm = Math.abs(m); - double x2y2 = pt.x * pt.x + pt.y * pt.y; - double r2 = x2y2 + pt.z * pt.z; - double r = Math.sqrt(r2); - double rho = 2d * psi_Znuc * r / n / A0; - double ph, th, cth, sth; - double theta_lm = 0; - double phi_m = 0; + double x2y2 = ptPsi.x * ptPsi.x + ptPsi.y * ptPsi.y; + double rnl = radialPart(Math.sqrt(x2y2 + ptPsi.z * ptPsi.z)); + double ph = Math.atan2(ptPsi.y, ptPsi.x); + double th = Math.atan2(Math.sqrt(x2y2), ptPsi.z); + double cth = Math.cos(th); + double sth = Math.sin(th); + int abm = Math.abs(psi_m); double sum = 0; - for (int p = 0; p <= n - el - 1; p++) - sum += Math.pow(-rho, p) * rfactor[p]; - double rnl = Math.exp(-rho / 2) * Math.pow(rho, el) * sum; - ph = Math.atan2(pt.y, pt.x); - th = Math.atan2(Math.sqrt(x2y2), pt.z); - cth = Math.cos(th); - sth = Math.sin(th); - sum = 0; - for (int p = abm; p <= el; p++) - sum += Math.pow(1 + cth, p - abm) * Math.pow(1 - cth, el - p) + for (int p = abm; p <= psi_l; p++) + sum += Math.pow(1 + cth, p - abm) * Math.pow(1 - cth, psi_l - p) * pfactor[p]; - theta_lm = Math.abs(Math.pow(sth, abm)) * sum; - if (m == 0) + double theta_lm = Math.abs(Math.pow(sth, abm)) * sum; + double phi_m; + if (psi_m == 0) phi_m = 1; - else if (m > 0) - phi_m = Math.cos(m * ph) * ROOT2; + else if (psi_m > 0) + phi_m = Math.cos(psi_m * ph) * ROOT2; else - phi_m = Math.sin(-m * ph) * ROOT2; + phi_m = Math.sin(-psi_m * ph) * ROOT2; if (Math.abs(phi_m) < 0.0000000001) phi_m = 0; return rnl * theta_lm * phi_m; Modified: branches/v12_0/Jmol/src/org/jmol/jvxl/readers/Parameters.java =================================================================== --- branches/v12_0/Jmol/src/org/jmol/jvxl/readers/Parameters.java 2010-08-25 08:32:36 UTC (rev 14132) +++ branches/v12_0/Jmol/src/org/jmol/jvxl/readers/Parameters.java 2010-08-25 13:39:24 UTC (rev 14133) @@ -169,7 +169,7 @@ 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; - final static int SURFACE_ATOMICORBITAL = 14; + 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; @@ -564,13 +564,8 @@ cutoff = cutoff * cutoff; } isCutoffAbsolute = true; - if (state < STATE_DATA_READ && thePlane == null) { - if (colorBySign) { + if (state < STATE_DATA_READ && thePlane == null && colorBySign) isBicolorMap = true; - } - if (resolution == Float.MAX_VALUE) - resolution = 6; - } return (psi_Znuc > 0 && Math.abs(psi_m) <= psi_l && psi_l < psi_n); } Modified: branches/v12_0/Jmol/src/org/jmol/jvxl/readers/VolumeDataReader.java =================================================================== --- branches/v12_0/Jmol/src/org/jmol/jvxl/readers/VolumeDataReader.java 2010-08-25 08:32:36 UTC (rev 14132) +++ branches/v12_0/Jmol/src/org/jmol/jvxl/readers/VolumeDataReader.java 2010-08-25 13:39:24 UTC (rev 14133) @@ -116,9 +116,12 @@ int nGrid = (int) (range * ptsPerAngstrom) + 1; if (nGrid > gridMax) { if ((dataType & Parameters.HAS_MAXGRID) > 0) { - if (resolution != Float.MAX_VALUE) - Logger.info("Maximum number of voxels for index=" + index); - nGrid = gridMax; + if (resolution == Float.MAX_VALUE) { + Logger.info("Maximum number of voxels for index=" + index + " exceeded (" + nGrid + ") -- set to " + gridMax); + nGrid = gridMax; + } else { + Logger.info("Warning -- high number of grid points: " + nGrid); + } } else if (resolution == Float.MAX_VALUE) { nGrid = gridMax; } Modified: branches/v12_0/Jmol/src/org/jmol/viewer/Jmol.properties =================================================================== --- branches/v12_0/Jmol/src/org/jmol/viewer/Jmol.properties 2010-08-25 08:32:36 UTC (rev 14132) +++ branches/v12_0/Jmol/src/org/jmol/viewer/Jmol.properties 2010-08-25 13:39:24 UTC (rev 14133) @@ -4,6 +4,7 @@ version=12.0.9 +# bug fix: isosurface atomicOrbital not scaling well # bug fix: undo and smilesurlformat tokens missing # bug fix: isosurface ... map SQUARED ... nonfunctional # bug fix: exit, quit are stopping spinning -- should just be stopping moveTo This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ha...@us...> - 2010-08-26 10:44:08
|
Revision: 14143 http://jmol.svn.sourceforge.net/jmol/?rev=14143&view=rev Author: hansonr Date: 2010-08-26 10:44:02 +0000 (Thu, 26 Aug 2010) Log Message: ----------- version=12.0.10_dev # bug fix: oops; isosurface atomicOrbital REALLY not scaling well Modified Paths: -------------- branches/v12_0/Jmol/src/org/jmol/jvxl/readers/IsoShapeReader.java branches/v12_0/Jmol/src/org/jmol/viewer/Jmol.properties Modified: branches/v12_0/Jmol/src/org/jmol/jvxl/readers/IsoShapeReader.java =================================================================== --- branches/v12_0/Jmol/src/org/jmol/jvxl/readers/IsoShapeReader.java 2010-08-26 10:41:14 UTC (rev 14142) +++ branches/v12_0/Jmol/src/org/jmol/jvxl/readers/IsoShapeReader.java 2010-08-26 10:44:02 UTC (rev 14143) @@ -199,7 +199,7 @@ double min = params.cutoff / 2; for (radius = 100; radius > 0; radius--) { //System.out.println(radius + " " + radialPart(radius)); - if (radialPart(radius) >= min) + if (Math.abs(radialPart(radius)) >= min) break; } radius += 1; Modified: branches/v12_0/Jmol/src/org/jmol/viewer/Jmol.properties =================================================================== --- branches/v12_0/Jmol/src/org/jmol/viewer/Jmol.properties 2010-08-26 10:41:14 UTC (rev 14142) +++ branches/v12_0/Jmol/src/org/jmol/viewer/Jmol.properties 2010-08-26 10:44:02 UTC (rev 14143) @@ -4,6 +4,8 @@ version=12.0.10_dev +# bug fix: oops; isosurface atomicOrbital REALLY not scaling well + # -------------------------------------------------------------- #version=12.0.9 This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ha...@us...> - 2010-08-27 16:37:53
|
Revision: 14155 http://jmol.svn.sourceforge.net/jmol/?rev=14155&view=rev Author: hansonr Date: 2010-08-27 16:37:47 +0000 (Fri, 27 Aug 2010) Log Message: ----------- version=12.0.10 # bug fix: LcaoCartoon capping/slabbing not saved in state Modified Paths: -------------- branches/v12_0/Jmol/src/org/jmol/jvxl/readers/Parameters.java branches/v12_0/Jmol/src/org/jmol/shapesurface/LcaoCartoon.java branches/v12_0/Jmol/src/org/jmol/viewer/Jmol.properties Modified: branches/v12_0/Jmol/src/org/jmol/jvxl/readers/Parameters.java =================================================================== --- branches/v12_0/Jmol/src/org/jmol/jvxl/readers/Parameters.java 2010-08-27 16:34:14 UTC (rev 14154) +++ branches/v12_0/Jmol/src/org/jmol/jvxl/readers/Parameters.java 2010-08-27 16:37:47 UTC (rev 14155) @@ -389,8 +389,7 @@ cutoff = Float.MIN_VALUE; isCutoffAbsolute = false; isSilent = !logMessages; - script = " center " + Escape.escape(center) + (Float.isNaN(scale) ? "" : " scale " + scale) - + " SPHERE " + radius + ";"; + script = getScriptParams() + " SPHERE " + radius + ";"; } void setEllipsoid(Point4f v) { @@ -432,10 +431,19 @@ cutoff = cutoff * cutoff; } isSilent = !logMessages; - script = " center " + Escape.escape(center) - + (Float.isNaN(scale) ? "" : " scale " + scale) + " LOBE {" + v.x + " " - + v.y + " " + v.z + " " + v.w + "};"; + script = getScriptParams() + " LOBE {" + v.x + " " + + v.y + " " + v.z + " " + v.w + "};"; +} + + private String getScriptParams() { + return (slabbingObject == null ? "" : " slab within " + + Escape.escape(slabbingObject)) + + (cappingObject == null ? "" : " cap within " + + Escape.escape(cappingObject)) + + " center " + + Escape.escape(center) + (Float.isNaN(scale) ? "" : " scale " + scale); } + void setLp(Point4f v) { dataType = SURFACE_LONEPAIR; Modified: branches/v12_0/Jmol/src/org/jmol/shapesurface/LcaoCartoon.java =================================================================== --- branches/v12_0/Jmol/src/org/jmol/shapesurface/LcaoCartoon.java 2010-08-27 16:34:14 UTC (rev 14154) +++ branches/v12_0/Jmol/src/org/jmol/shapesurface/LcaoCartoon.java 2010-08-27 16:37:47 UTC (rev 14155) @@ -190,11 +190,9 @@ if ("slab" == propertyName) { slabbingObject = value; - return; } if ("cap" == propertyName) { cappingObject = value; - return; } //from the state: Modified: branches/v12_0/Jmol/src/org/jmol/viewer/Jmol.properties =================================================================== --- branches/v12_0/Jmol/src/org/jmol/viewer/Jmol.properties 2010-08-27 16:34:14 UTC (rev 14154) +++ branches/v12_0/Jmol/src/org/jmol/viewer/Jmol.properties 2010-08-27 16:37:47 UTC (rev 14155) @@ -4,6 +4,7 @@ version=12.0.10 +# bug fix: LcaoCartoon capping/slabbing not saved in state # bug fix: zip file reading broken in 12.0.9 # bug fix: isosurface planar mapping, contours, atomic orbital speed and scaling problems # code: MarchingSquares total rewrite This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ha...@us...> - 2010-08-27 17:27:24
|
Revision: 14159 http://jmol.svn.sourceforge.net/jmol/?rev=14159&view=rev Author: hansonr Date: 2010-08-27 17:27:17 +0000 (Fri, 27 Aug 2010) Log Message: ----------- version=12.0.10_HOLD # bug fix: reading nth model from a file within a ZIP collection not possible Modified Paths: -------------- branches/v12_0/Jmol/src/org/jmol/adapter/smarter/SmarterJmolAdapter.java branches/v12_0/Jmol/src/org/jmol/script/ScriptEvaluator.java branches/v12_0/Jmol/src/org/jmol/viewer/Jmol.properties Modified: branches/v12_0/Jmol/src/org/jmol/adapter/smarter/SmarterJmolAdapter.java =================================================================== --- branches/v12_0/Jmol/src/org/jmol/adapter/smarter/SmarterJmolAdapter.java 2010-08-27 17:21:41 UTC (rev 14158) +++ branches/v12_0/Jmol/src/org/jmol/adapter/smarter/SmarterJmolAdapter.java 2010-08-27 17:27:17 UTC (rev 14159) @@ -253,20 +253,17 @@ } private static Object staticGetAtomSetCollectionOrBufferedReaderFromZip( - InputStream is, String fileName, - String[] zipDirectory, Hashtable htParams, - int subFilePtr, boolean asBufferedReader) { + InputStream is, + String fileName, + String[] zipDirectory, + Hashtable htParams, + int subFilePtr, + boolean asBufferedReader) { // we're here because user is using | in a load file name // or we are opening a zip file. boolean doCombine = (subFilePtr == 1); - int selectedFile = 0; - if (htParams != null && htParams.containsKey("modelNumber")) { - selectedFile = ((Integer) htParams.get("modelNumber")).intValue(); - if (selectedFile > 0 && doCombine) - htParams.remove("modelNumber"); - } String[] subFileList = (htParams == null ? null : (String[]) htParams .get("subFileList")); if (subFileList == null) @@ -277,6 +274,13 @@ if (subFileName != null && (subFileName.startsWith("/") || subFileName.startsWith("\\"))) subFileName = subFileName.substring(1); + int selectedFile = 0; + if (subFileName == null && htParams != null + && htParams.containsKey("modelNumber")) { + selectedFile = ((Integer) htParams.get("modelNumber")).intValue(); + if (selectedFile > 0 && doCombine) + htParams.remove("modelNumber"); + } // zipDirectory[0] is the manifest if present String manifest = (htParams == null ? null : (String) htParams Modified: branches/v12_0/Jmol/src/org/jmol/script/ScriptEvaluator.java =================================================================== --- branches/v12_0/Jmol/src/org/jmol/script/ScriptEvaluator.java 2010-08-27 17:21:41 UTC (rev 14158) +++ branches/v12_0/Jmol/src/org/jmol/script/ScriptEvaluator.java 2010-08-27 17:27:17 UTC (rev 14159) @@ -1671,7 +1671,7 @@ private int pcEnd; private String scriptExtensions; - // ////////////////////// supporting methods for compilation and loading + // ////////////////////// supporting methods for compilation and loading // ////////// private boolean compileScript(String filename, String strScript, Modified: branches/v12_0/Jmol/src/org/jmol/viewer/Jmol.properties =================================================================== --- branches/v12_0/Jmol/src/org/jmol/viewer/Jmol.properties 2010-08-27 17:21:41 UTC (rev 14158) +++ branches/v12_0/Jmol/src/org/jmol/viewer/Jmol.properties 2010-08-27 17:27:17 UTC (rev 14159) @@ -4,6 +4,7 @@ version=12.0.10_HOLD +# bug fix: reading nth model from a file within a ZIP collection not possible # bug fix: LcaoCartoon capping/slabbing not saved in state # bug fix: zip file reading broken in 12.0.9 # bug fix: isosurface planar mapping, contours, atomic orbital speed and scaling problems This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ha...@us...> - 2010-08-27 19:37:51
|
Revision: 14164 http://jmol.svn.sourceforge.net/jmol/?rev=14164&view=rev Author: hansonr Date: 2010-08-27 19:37:45 +0000 (Fri, 27 Aug 2010) Log Message: ----------- version=12.0.11_dev # bug fix: failure to read old-style JVXL files. Modified Paths: -------------- branches/v12_0/Jmol/src/org/jmol/jvxl/readers/JvxlXmlReader.java branches/v12_0/Jmol/src/org/jmol/shapesurface/IsosurfaceMesh.java branches/v12_0/Jmol/src/org/jmol/viewer/Jmol.properties Modified: branches/v12_0/Jmol/src/org/jmol/jvxl/readers/JvxlXmlReader.java =================================================================== --- branches/v12_0/Jmol/src/org/jmol/jvxl/readers/JvxlXmlReader.java 2010-08-27 19:37:04 UTC (rev 14163) +++ branches/v12_0/Jmol/src/org/jmol/jvxl/readers/JvxlXmlReader.java 2010-08-27 19:37:45 UTC (rev 14164) @@ -641,7 +641,8 @@ return triangles; } - protected void jvxlDecodeContourData(JvxlData jvxlData, String data) throws Exception { + protected void jvxlDecodeContourData(JvxlData jvxlData, String data) + throws Exception { Vector vs = new Vector(); StringBuffer values = new StringBuffer(); StringBuffer colors = new StringBuffer(); @@ -654,32 +655,36 @@ String s = xr.getXmlData("jvxlContour", data.substring(pt), true, false); float value = parseFloat(XmlReader.getXmlAttrib(s, "value")); values.append(" ").append(value); - short colix = Graphics3D.getColix(Graphics3D.getArgbFromString(XmlReader.getXmlAttrib(s, - "color"))); + short colix = Graphics3D.getColix(Graphics3D.getArgbFromString(XmlReader + .getXmlAttrib(s, "color"))); int color = Graphics3D.getArgb(colix); colors.append(" ").append(Escape.escapeColor(color)); - String fData = JvxlCoder.jvxlUncompressString(XmlReader.getXmlAttrib(s, "data")); - BitSet bs = JvxlCoder.jvxlDecodeBitSet(xr.getXmlData("jvxlContour", s, false, false)); + String fData = JvxlCoder.jvxlUncompressString(XmlReader.getXmlAttrib(s, + "data")); + BitSet bs = JvxlCoder.jvxlDecodeBitSet(xr.getXmlData("jvxlContour", s, + false, false)); int n = bs.length(); - IsosurfaceMesh.setContourVector(v, n, bs, value, colix, color, new StringBuffer( - fData)); + IsosurfaceMesh.setContourVector(v, n, bs, value, colix, color, + new StringBuffer(fData)); vs.add(v); } int n = vs.size(); - if (n > 0) + if (n > 0) { jvxlData.vContours = new Vector[n]; - // 3D contour values and colors - jvxlData.contourColixes = params.contourColixes = new short[n]; - jvxlData.contourValues = params.contoursDiscrete = new float[n]; - for (int i = 0; i < n; i++) { - jvxlData.vContours[i] = (Vector) vs.get(i); - jvxlData.contourValues[i] = ((Float) jvxlData.vContours[i].get(2)).floatValue(); - jvxlData.contourColixes[i] = ((short[]) jvxlData.vContours[i].get(3))[0]; + // 3D contour values and colors + jvxlData.contourColixes = params.contourColixes = new short[n]; + jvxlData.contourValues = params.contoursDiscrete = new float[n]; + for (int i = 0; i < n; i++) { + jvxlData.vContours[i] = (Vector) vs.get(i); + jvxlData.contourValues[i] = ((Float) jvxlData.vContours[i].get(2)) + .floatValue(); + jvxlData.contourColixes[i] = ((short[]) jvxlData.vContours[i].get(3))[0]; + } + jvxlData.contourColors = Graphics3D.getHexCodes(jvxlData.contourColixes); + Logger.info("JVXL read: " + n + " discrete contours"); + Logger.info("JVXL read: contour values: " + values); + Logger.info("JVXL read: contour colors: " + colors); } - Logger.info("JVXL read: " + n + " discrete contours"); - Logger.info("JVXL read: contour values: " + values); - Logger.info("JVXL read: contour colors: " + colors); - jvxlData.contourColors = Graphics3D.getHexCodes(jvxlData.contourColixes); } Modified: branches/v12_0/Jmol/src/org/jmol/shapesurface/IsosurfaceMesh.java =================================================================== --- branches/v12_0/Jmol/src/org/jmol/shapesurface/IsosurfaceMesh.java 2010-08-27 19:37:04 UTC (rev 14163) +++ branches/v12_0/Jmol/src/org/jmol/shapesurface/IsosurfaceMesh.java 2010-08-27 19:37:45 UTC (rev 14164) @@ -443,7 +443,7 @@ public void setDiscreteColixes(float[] values, short[] colixes) { if (values != null) jvxlData.contourValues = values; - if (values == null) + if (values == null || values.length == 0) values = jvxlData.contourValues = jvxlData.contourValuesUsed; if (colixes == null && jvxlData.contourColixes != null) { colixes = jvxlData.contourColixes; Modified: branches/v12_0/Jmol/src/org/jmol/viewer/Jmol.properties =================================================================== --- branches/v12_0/Jmol/src/org/jmol/viewer/Jmol.properties 2010-08-27 19:37:04 UTC (rev 14163) +++ branches/v12_0/Jmol/src/org/jmol/viewer/Jmol.properties 2010-08-27 19:37:45 UTC (rev 14164) @@ -4,6 +4,8 @@ version=12.0.11_dev +# bug fix: failure to read old-style JVXL files. + # -------------------------------------------------------------- #version=12.0.10 This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ha...@us...> - 2010-08-28 21:48:20
|
Revision: 14169 http://jmol.svn.sourceforge.net/jmol/?rev=14169&view=rev Author: hansonr Date: 2010-08-28 21:48:12 +0000 (Sat, 28 Aug 2010) Log Message: ----------- version=12.0.11_dev # new feature: lcaoCartoons dsp3 (a,b,c,d,e), d2sp3 (a,b,c,d,e,f) # (added because it is just an extension of lcaoCartoons and has been # asked for repeatedly) # bug fix: "sp3a" not "first bonded atom" Modified Paths: -------------- branches/v12_0/Jmol/src/org/jmol/modelset/AtomCollection.java branches/v12_0/Jmol/src/org/jmol/script/ScriptEvaluator.java branches/v12_0/Jmol/src/org/jmol/shapesurface/Isosurface.java branches/v12_0/Jmol/src/org/jmol/shapesurface/LcaoCartoon.java branches/v12_0/Jmol/src/org/jmol/viewer/Jmol.properties branches/v12_0/Jmol/src/org/jmol/viewer/Viewer.java Modified: branches/v12_0/Jmol/src/org/jmol/modelset/AtomCollection.java =================================================================== --- branches/v12_0/Jmol/src/org/jmol/modelset/AtomCollection.java 2010-08-28 21:46:07 UTC (rev 14168) +++ branches/v12_0/Jmol/src/org/jmol/modelset/AtomCollection.java 2010-08-28 21:48:12 UTC (rev 14169) @@ -26,7 +26,9 @@ package org.jmol.modelset; import java.awt.Rectangle; +import java.util.Arrays; import java.util.BitSet; +import java.util.Comparator; import java.util.Vector; import javax.vecmath.AxisAngle4f; @@ -1200,6 +1202,8 @@ } } + ////// hybridization /////////// + /** * get a list of potential H atom positions based on * elemental valence and formal charge @@ -1238,8 +1242,6 @@ int atomicNumber = atom.getElementNumber(); hAtoms[i] = new Point3f[n]; - //System.out.println(atom.getInfo() + " targetValence=" + targetValence + " nB=" - //+ nBonds + " nVal=" + nVal + " n=" + n); int hPt = 0; if (nBonds == 0) { switch (n) { @@ -1280,20 +1282,20 @@ default: break; case 3: // three bonds needed RC - getHybridizationAndAxes(i, z, x, "sp3a", false, true, -1); - pt = new Point3f(z); + getHybridizationAndAxes(i, z, x, "sp3b", false, true); + pt = new Point3f(); pt.scaleAdd(1.1f, z, atom); hAtoms[i][hPt++] = pt; if (vConnect != null) vConnect.add(atom); - getHybridizationAndAxes(i, z, x, "sp3b", false, true, -1); - pt = new Point3f(z); + getHybridizationAndAxes(i, z, x, "sp3c", false, true); + pt = new Point3f(); pt.scaleAdd(1.1f, z, atom); hAtoms[i][hPt++] = pt; if (vConnect != null) vConnect.add(atom); - getHybridizationAndAxes(i, z, x, "sp3c", false, true, -1); - pt = new Point3f(z); + getHybridizationAndAxes(i, z, x, "sp3d", false, true); + pt = new Point3f(); pt.scaleAdd(1.1f, z, atom); hAtoms[i][hPt++] = pt; if (vConnect != null) @@ -1305,14 +1307,14 @@ boolean isEne = (atomicNumber == 5 || nBonds == 1 && targetValence == 4); getHybridizationAndAxes(i, z, x, (isEne ? "sp2b" - : targetValence == 3 ? "sp3b" : "lpa"), false, true, -1); + : targetValence == 3 ? "sp3c" : "lpa"), false, true); pt = new Point3f(z); pt.scaleAdd(1.1f, z, atom); hAtoms[i][hPt++] = pt; if (vConnect != null) vConnect.add(atom); getHybridizationAndAxes(i, z, x, (isEne ? "sp2c" - : targetValence == 3 ? "sp3c" : "lpb"), false, true, -1); + : targetValence == 3 ? "sp3d" : "lpb"), false, true); pt = new Point3f(z); pt.scaleAdd(1.1f, z, atom); hAtoms[i][hPt++] = pt; @@ -1324,22 +1326,26 @@ // nbonds ......... 2 .. 3 .. 2 ... 1 ... 2 .. 1 .. 1 // nval ........... 2 .. 3 .. 2 ... 1 ... 3 .. 2 .. 3 // targetValence .. 3 .. 4 .. 3 ... 2 ... 4 .. 3 .. 4 - // ................sp3 . sp3 . sp3 . sp2 sp2 . sp + // tV - nbonds .. 1 1 1 1 2 2 3 + // ................ sp2c sp3d sp3d lpa sp2c sp2b sp switch (targetValence - nBonds) { case 1: // sp3 or Boron sp2 - getHybridizationAndAxes(i, z, x, (atomicNumber == 5 ? "sp2c" - : targetValence == 2 ? "sp3b" : "lpa"), false, false, -1); - pt = new Point3f(z); - pt.scaleAdd(1.1f, z, atom); - hAtoms[i][hPt++] = pt; - if (vConnect != null) - vConnect.add(atom); + if (getHybridizationAndAxes(i, z, x, (atomicNumber == 5 ? "sp2c" + : targetValence == 2 ? "sp3d" : "sp3b"), true, false) != null) { + pt = new Point3f(z); + pt.scaleAdd(1.1f, z, atom); + hAtoms[i][hPt++] = pt; + if (vConnect != null) + vConnect.add(atom); + } else { + hAtoms[i] = new Point3f[0]; + } break; case 2: // sp2 getHybridizationAndAxes(i, z, x, (targetValence == 4 ? "sp2c" - : "sp2b"), false, false, -1); + : "sp2b"), false, false); pt = new Point3f(z); pt.scaleAdd(1.1f, z, atom); hAtoms[i][hPt++] = pt; @@ -1348,7 +1354,7 @@ break; case 3: // sp - getHybridizationAndAxes(i, z, x, "sp", false, true, -1); + getHybridizationAndAxes(i, z, x, "sp", false, true); pt = new Point3f(z); pt.scaleAdd(1.1f, z, atom); hAtoms[i][hPt++] = pt; @@ -1364,79 +1370,161 @@ return hAtoms; } - ////// special method for lcaoCartoons + private final static float sqrt3_2 = (float) (Math.sqrt(3) / 2); + private final static Vector3f vRef = new Vector3f(3.14159f, 2.71828f, 1.41421f); + private final static float almost180 = (float) Math.PI * 0.95f; - private static float sqrt3_2 = (float) (Math.sqrt(3) / 2); - public String getHybridizationAndAxes(int atomIndex, Vector3f z, Vector3f x, String lcaoTypeRaw, - boolean hybridizationCompatible, boolean doAlignZ, int atomIndexNot) { + boolean hybridizationCompatible, + boolean doAlignZ) { + + if (lcaoTypeRaw.indexOf("d") >= 0 && !lcaoTypeRaw.equals("sp3d")) + return getHybridizationAndAxesD(atomIndex, z, x, lcaoTypeRaw); + String lcaoType = (lcaoTypeRaw.length() > 0 && lcaoTypeRaw.charAt(0) == '-' ? lcaoTypeRaw .substring(1) : lcaoTypeRaw); Atom atom = atoms[atomIndex]; - String hybridization = ""; + Atom[] attached = getAttached(atom, 4, hybridizationCompatible); + int nAttached = attached.length; + int pt = lcaoType.charAt(lcaoType.length() - 1) - 'a'; + if (pt < 0) + pt = 0; + Vector3f vTemp = new Vector3f(); z.set(0, 0, 0); x.set(0, 0, 0); - Atom atom1 = atom; - Atom atom2 = atom; - Atom atom3; - int nBonds = 0; - float _180 = (float) Math.PI * 0.95f; - Vector3f n = new Vector3f(); - Vector3f x2 = new Vector3f(); - Vector3f x3 = new Vector3f(3.14159f, 2.71828f, 1.41421f); - Vector3f x4 = new Vector3f(); - Vector3f y1 = new Vector3f(); - Vector3f y2 = new Vector3f(); - if (atom.bonds != null) - for (int i = atom.bonds.length; --i >= 0;) - if (atom.bonds[i].isCovalent()) { - ++nBonds; - atom1 = atom.bonds[i].getOtherAtom(atom); - n.sub(atom, atom1); - n.normalize(); - z.add(n); - switch (nBonds) { - case 1: - x.set(n); - atom2 = atom1; + Vector3f[] v = new Vector3f[4]; + for (int i = 0; i < nAttached; i++) { + v[i] = new Vector3f(atom); + v[i].sub(attached[i]); + v[i].normalize(); + z.add(v[i]); + } + if (nAttached > 0) + x.set(v[0]); + boolean isPlanar = false; + if (nAttached >= 3) { + if (x.angle(v[1]) < almost180) + vTemp.cross(x, v[1]); + else + vTemp.cross(x, v[2]); + vTemp.normalize(); + Vector3f vTemp2 = new Vector3f(); + if (v[1].angle(v[2]) < almost180) + vTemp2.cross(v[1], v[2]); + else + vTemp2.cross(x, v[2]); + vTemp2.normalize(); + isPlanar = (Math.abs(vTemp2.dot(vTemp)) >= 0.95f); + } + + boolean isSp3 = (lcaoType.indexOf("sp3") == 0); + boolean isSp2 = (!isSp3 && lcaoType.indexOf("sp2") == 0); + boolean isSp = (!isSp3 && !isSp2 && lcaoType.indexOf("sp") == 0); + boolean isP = (lcaoType.indexOf("p") == 0); + boolean isLp = (lcaoType.indexOf("lp") == 0); + + String hybridization = null; + if (hybridizationCompatible) { + if (nAttached == 0) + return null; + if (isSp3) { + if (pt > 3 || nAttached > 4) + return null; + } else if (isSp2) { + if (pt > 2 || nAttached > 3) + return null; + } else if (isSp) { + if (pt > 1 || nAttached > 2) + return null; + } + switch (nAttached) { + case 1: + if (atom.getElementNumber() == 1 && !isSp3) + return null; + if (isSp3) { + hybridization = "sp3"; + break; + } + switch (attached[0].getCovalentBondCount()) { + case 1: + if (attached[0].getValence() == 3) { + // C-t-C + hybridization = "sp"; break; - case 2: - if (atom1.index == atomIndexNot) { - x2.set(x); - atom2 = atom1; - x.set(n); - } else { - x2.set(n); - } + } + // C=C, no other atoms + // fall through + case 2: + hybridization = "sp2"; + break; + case 3: + // special case, for example R2C=O oxygen + if (!isSp2 && !isP) + return null; + hybridization = "sp2"; + break; + } + break; + case 2: + if (z.length() < 0.1f) { + // linear A--X--B + if (lcaoType.indexOf("2") >= 0 || lcaoType.indexOf("3") >= 0) + return null; + hybridization = "sp"; + break; + } + // bent A--X--B + hybridization = (isSp3 ? "sp3" : "sp2"); + if (lcaoType.indexOf("sp") == 0) { // align z as sp2 orbital + break; + } + if (isLp) { // align z as lone pair + hybridization = "lp"; // any is OK + break; + } + hybridization = lcaoType; + break; + default: + // 3 or 4 bonds + if (isPlanar) { + hybridization = "sp2"; + } else { + if (isLp && nAttached == 3) { + hybridization = "lp"; break; - case 3: - if (atom1.index == atomIndexNot) { - x3.set(x); - atom2 = atom1; - x.set(n); - } else { - x3.set(n); - } - x4.set(-z.x, -z.y, -z.z); - break; - case 4: - x4.set(n); - break; - default: - i = -1; } + hybridization = "sp3"; } - switch (nBonds) { + } + if (hybridization == null) + return null; + if (lcaoType.indexOf("p") == 0) { + if (hybridization == "sp3") + return null; + } else if (lcaoType.indexOf(hybridization) < 0) { + return null; + } + } + + if (pt < nAttached && !lcaoType.startsWith("p") + && !lcaoType.startsWith("l")) { + z.sub(attached[pt], atom); + z.normalize(); + return hybridization; + } + + switch (nAttached) { case 0: - if (lcaoType.equals("sp3b") || lcaoType.equals("sp2a") || lcaoType.equals("lpa")) { + if (lcaoType.equals("sp3c") || lcaoType.equals("sp2d") + || lcaoType.equals("lpa")) { z.set(-0.5f, -0.7f, 1); x.set(1, 0, 0); - } else if (lcaoType.equals("sp3c") || lcaoType.equals("lpb")) { + } else if (lcaoType.equals("sp3b") || lcaoType.equals("lpb")) { z.set(0.5f, -0.7f, -1f); x.set(1, 0, 0); - } else if (lcaoType.equals("sp3d")) { + } else if (lcaoType.equals("sp3a")) { z.set(0, 1, 0); x.set(1, 0, 0); } else { @@ -1445,18 +1533,18 @@ } break; case 1: - if (lcaoType.indexOf("sp3") == 0) { + // X-C + vTemp.set(vRef); + x.cross(vTemp, z); + if (isSp3) { // align z as sp3 orbital // with reference to atoms connected to connecting atom. - // x3 is a pseudo-random vector + // vRef is a pseudo-random vector // z is along the bond - hybridization = "sp3"; - x.cross(x3, z); - for (int i = 0; i < atom1.bonds.length; i++) { - if (atom1.bonds[i].isCovalent() - && atom1.getBondedAtomIndex(i) != atom.index) { - x.set(atom1); - x.sub(atom1.bonds[i].getOtherAtom(atom1)); + for (int i = 0; i < attached[0].bonds.length; i++) { + if (attached[0].bonds[i].isCovalent() + && attached[0].getBondedAtomIndex(i) != atom.index) { + x.sub(attached[0], attached[0].bonds[i].getOtherAtom(attached[0])); x.cross(z, x); x.cross(x, z); break; @@ -1464,177 +1552,142 @@ } x.normalize(); // x is perp to bond - y1.cross(z, x); - y1.normalize(); + vTemp.cross(z, x); + vTemp.normalize(); // y1 is perp to bond and x - y2.set(x); z.normalize(); x.scaleAdd(2.828f, x, z); // 2*sqrt(2) - if (!lcaoType.equals("sp3a") && !lcaoType.equals("sp3")) { + if (pt != 3) { x.normalize(); - AxisAngle4f a = new AxisAngle4f(z.x, z.y, z.z, (lcaoType - .equals("sp3b") ? 1 : -1) * 2.09439507f); // PI*2/3 + AxisAngle4f a = new AxisAngle4f(z.x, z.y, z.z, + (pt == 2 ? 1 : -1) * 2.09439507f); // PI*2/3 Matrix3f m = new Matrix3f(); m.setIdentity(); m.set(a); m.transform(x); } z.set(x); - x.cross(y1, z); + x.cross(vTemp, z); break; } - hybridization = "sp"; - switch (atom1.getCovalentBondCount()) { + // not "sp3" -- sp2 or lone pair + switch (attached[0].getCovalentBondCount()) { case 1: - if (atom1.getValence() == 3) // C-t-C + if (attached[0].getValence() == 3) // C-t-C break; // C=C, no other atoms // fall through case 2: - hybridization = "sp2"; - if (lcaoType.indexOf("a") == 0) - break; // just directing back to other atom - // R-C=C or C=C=C + // R-C=C* or C=C=C* // get third atom boolean isCumulated = false; - while (true) { - Bond[] bonds = atom1.bonds; - atom3 = null; - for (int i = 0; i < bonds.length; i++) { - atom3 = bonds[i].getOtherAtom(atom1); - if (atom3 != atom) { - x3.set(atom3); - x3.sub(atom1); - if (!isCumulated) - x3.cross(x3, x); - break; + Atom a0 = attached[0]; + while (a0 != null) { + Bond[] bonds = a0.bonds; + Atom a = null; + vTemp.set(vRef); + for (int i = 0; i < bonds.length; i++) + if (bonds[i].isCovalent()) { + a = bonds[i].getOtherAtom(a0); + if (a != atom) { + vTemp.sub(a, a0); + if (!isCumulated) + vTemp.cross(vTemp, x); + break; + } } - } - if (atom3 == atom) // allene, no hydrogens - x3.set(3.14159f, 2.71828f, 1.41421f); - if (atom1.getValence() != 4 || atom1.getCovalentBondCount() != 2) + if (a0.getValence() != 4 + || a0.getCovalentBondCount() != 2) break; isCumulated = !isCumulated; - atom = atom1; - atom1 = atom3; + atom = a0; + a0 = a; } // C=C or RC=C - z.cross(x3, x); // perp + z.cross(vTemp, x); // perp z.normalize(); - if (lcaoType.indexOf("b") >= 0) + if (pt == 1) z.scale(-1); - z.set(z.x * sqrt3_2 + x.x / 2, z.y * sqrt3_2 + x.y / 2, z.z * sqrt3_2 - + x.z / 2); + z.scale(sqrt3_2); + z.scaleAdd(0.5f, x, z); break; case 3: // special case, for example R2C=O oxygen - getHybridizationAndAxes(atom1.index, z, x3, lcaoType, false, doAlignZ, atomIndex); - x3.set(x); - if (lcaoType.indexOf("sp2") == 0) { // align z as sp2 orbital - hybridization = "sp2"; - z.scale(-1); + getHybridizationAndAxes(attached[0].index, z, x, "pz", false, + doAlignZ); + vTemp.set(x); + if (isSp2) { // align z as sp2 orbital + z.cross(x, z); + if (pt == 1) + z.scale(-1); + z.scale(sqrt3_2); + z.scaleAdd(-0.5f, x, z); } break; } - x.cross(x3, z); + x.cross(vTemp, z); break; case 2: - if (z.length() < 0.1) { + // two attached atoms -- check for linearity + if (z.length() < 0.1f) { // linear A--X--B - hybridization = "sp"; if (!lcaoType.equals("pz")) { - if (atom1.getCovalentBondCount() != 3) - atom1 = atom2; - if (atom1.getCovalentBondCount() == 3) { + Atom a = attached[0]; + boolean ok = (a.getCovalentBondCount() == 3); + if (!ok) + ok = ((a = attached[1]).getCovalentBondCount() == 3); + if (ok) { // special case, for example R2C=C=CR2 central carbon - getHybridizationAndAxes(atom1.index, x, z, "pz", false, doAlignZ, atomIndex); + getHybridizationAndAxes(a.index, x, z, "pz", false, doAlignZ); if (lcaoType.equals("px")) x.scale(-1); - z.set(x2); break; } } z.set(x); - x.cross(x3, z); + x.cross(vTemp, z); break; } // bent A--X--B - hybridization = (lcaoType.indexOf("sp3") == 0 ? "sp3" : "sp2"); - x3.cross(z, x); - if (lcaoType.indexOf("sp") == 0) { // align z as sp2 orbital - if (lcaoType.equals("sp2a") || lcaoType.equals("sp2b")) { - z.set(lcaoType.indexOf("b") >= 0 ? x2 : x); - z.scale(-1); - } - x.cross(z, x3); + vTemp.cross(z, x); + if (isSp2) { // align z as sp2 orbital + x.cross(z, vTemp); break; } - if (lcaoType.indexOf("lp") == 0) { // align z as lone pair - hybridization = "lp"; // any is OK - x3.normalize(); + if (isSp3 || isLp) { // align z as lone pair + vTemp.normalize(); z.normalize(); - y1.scaleAdd(1.2f, x3, z); - y2.scaleAdd(-1.2f, x3, z); - if (!lcaoType.equals("lp")) - z.set(lcaoType.indexOf("b") >= 0 ? y2 : y1); - x.cross(z, x3); + if (!lcaoType.equals("lp")) { + if (pt == 0 || pt == 2) + z.scaleAdd(-1.2f, vTemp, z); + else + z.scaleAdd(1.2f, vTemp, z); + } + x.cross(z, vTemp); break; } - hybridization = lcaoType; // align z as p orbital - x.cross(z, x3); - z.set(x3); + x.cross(z, vTemp); + z.set(vTemp); if (z.z < 0) { - z.set(-z.x, -z.y, -z.z); - x.set(-x.x, -x.y, -x.z); + z.scale(-1); + x.scale(-1); } break; default: - // 3 or 4 bonds - if (x.angle(x2) < _180) - y1.cross(x, x2); - else - y1.cross(x, x3); - y1.normalize(); - if (x2.angle(x3) < _180) - y2.cross(x2, x3); - else - y2.cross(x, x3); - y2.normalize(); - if (Math.abs(y2.dot(y1)) < 0.95f) { - hybridization = "sp3"; - if (lcaoType.indexOf("sp") == 0) { // align z as sp3 orbital - z - .set(lcaoType.equalsIgnoreCase("sp3") - || lcaoType.indexOf("d") >= 0 ? x4 - : lcaoType.indexOf("c") >= 0 ? x3 - : lcaoType.indexOf("b") >= 0 ? x2 : x); - z.scale(-1); - x.set(y1); - } else { // needs testing here - if (lcaoType.indexOf("lp") == 0 && nBonds == 3) { // align z as lone - // pair - hybridization = "lp"; // any is OK - } - x.cross(z, x); - } + // 3 bonds, sp3 or sp2 and lp/p + if (isSp3) break; - } - hybridization = "sp2"; - if (lcaoType.indexOf("sp") == 0) { // align z as sp2 orbital - z.set(lcaoType.equalsIgnoreCase("sp3") || lcaoType.indexOf("d") >= 0 ? x4 - : lcaoType.indexOf("c") >= 0 ? x3 - : lcaoType.indexOf("b") >= 0 ? x2 : x); - z.scale(-1); - //System.out.println("draw x" + lcaoType + " vector {C13} " + z); - x.set(y1); + if (!isPlanar) { + // not aligned -- really sp3 + x.cross(z, x); break; } // align z as p orbital - z.set(y1); + z.set(vTemp); if (z.z < 0 && doAlignZ) { - z.set(-z.x, -z.y, -z.z); - x.set(-x.x, -x.y, -x.z); + z.scale(-1); + x.scale(-1); } } @@ -1642,21 +1695,207 @@ z.normalize(); if (Logger.debugging) { - Logger.debug(atom.getInfo() + " nBonds=" + nBonds + " " + hybridization); + Logger.debug(atom.getInfo() + " nAttached=" + nAttached + " " + + hybridization); } - if (hybridizationCompatible) { - if (hybridization == "") + return hybridization; + } + + /** + * dsp3 (trigonal bipyramidal, see-saw, T-shaped) + * or d2sp3 (square planar, square pyramidal, octahedral) + * + * @param atomIndex + * @param z + * @param x + * @param lcaoTypeRaw + * @return valid hybridization or null + */ + private String getHybridizationAndAxesD(int atomIndex, Vector3f z, Vector3f x, + String lcaoTypeRaw) { + String lcaoType = (lcaoTypeRaw.length() > 0 && lcaoTypeRaw.charAt(0) == '-' ? lcaoTypeRaw + .substring(1) + : lcaoTypeRaw); + // note -- d2sp3, not sp3d2; dsp3, not sp3d + if (lcaoType.startsWith("sp3d2")) + lcaoType = "d2sp3" + + (lcaoType.length() == 5 ? "a" : lcaoType.substring(5)); + if (lcaoType.startsWith("sp3d")) + lcaoType = "dsp3" + + (lcaoType.length() == 4 ? "a" : lcaoType.substring(4)); + boolean isTrigonal = lcaoType.startsWith("dsp3"); + if (!isTrigonal && !lcaoType.startsWith("d2sp3")) + return null; + int pt = lcaoType.charAt(lcaoType.length() - 1) - 'a'; + Atom atom = atoms[atomIndex]; + Atom[] attached = getAttached(atom, 6, true); + if (attached == null || pt > 5) + return null; + int nAttached = attached.length; + // verify hybridization + int nAngles = nAttached * (nAttached - 1) / 2; + int[][] angles = new int[nAngles][]; + // all attached angles must be around 180, 120, or 90 degrees + int n = 0; + int[] ntypes = new int[3]; + int[][] typePtrs = new int[3][nAngles]; + int _90 = 0; + int _120 = 1; + int _180 = 2; + for (int i = 0; i < nAttached - 1; i++) + for (int j = i + 1; j < nAttached; j++) { + float angle = Measure + .computeAngle(attached[i], atom, attached[j], true); + int itype = (angle >= 85 && angle <= 95 ? _90 : angle >= 115 + && angle <= 125 ? _120 : angle >= 175 ? _180 : -1); + if (itype < 0) + return null; + typePtrs[itype][ntypes[itype]] = n; + ntypes[itype]++; + angles[n++] = new int[] { i, j }; + } + // trigonal must have at least one 120; others must have none + String sType = "" + ntypes[_90] + ntypes[_120] + ntypes[_180]; + if (isTrigonal) { + // 201 see-saw + // 330 see-saw + // 631 trigonal bipyramidal + if (pt > 4 || !Parser.isOneOf(sType, "201;330;631")) return null; - if (lcaoType.indexOf("p") == 0) { - if (hybridization == "sp3") - return null; + } else { + // 201 T-shaped + // 300 no name "corner" + // 402 square planar + // 501 no name "see-saw-like" + // 802 square pyramidal + // 1203 octahedral + if (!Parser.isOneOf(sType, "201;300;402;501;802;1203")) + return null; + } + // if subType a-f is pointing to an attached atom, use it + // otherwise, we need to find the position + boolean isLP = (pt >= nAttached); + if (isLP) { + int[] a; + BitSet bs; + if (isTrigonal) { + switch (ntypes[_120]) { + case 1: + // see-saw + a = angles[typePtrs[_120][0]]; + z.add(attached[a[0]], attached[a[1]]); + z.scaleAdd(-2, atom, z); + pt = -1; + break; + case 0: + z.sub(attached[angles[typePtrs[_90][0]][0]], atom); + x.sub(attached[angles[typePtrs[_90][0]][1]], atom); + z.cross(z, x); + z.normalize(); + if (pt == 4) + z.scale(-1); + bs = findNotAttached(nAttached, angles, typePtrs[_180], ntypes[_180]); + int i = bs.nextSetBit(0); + x.sub(attached[i], atom); + x.normalize(); + x.scale(0.5f); + z.scaleAdd(sqrt3_2, z, x); + pt = -1; + break; + default: + // T-shaped + bs = findNotAttached(nAttached, angles, typePtrs[_120], ntypes[_120]); + pt = bs.nextSetBit(0); + } } else { - if (lcaoType.indexOf(hybridization) < 0) - return null; + boolean isPlanar = false; + switch (nAttached) { + case 4: + switch (ntypes[_180]) { + case 1: + // square pyramidal + bs = findNotAttached(nAttached, angles, typePtrs[_180], + ntypes[_180]); + int i = bs.nextSetBit(0); + if (pt == 4) + pt = i; + else + pt = bs.nextSetBit(i + 1); + break; + default: + isPlanar = true; + } + break; + default: + bs = findNotAttached(nAttached, angles, typePtrs[_180], ntypes[_180]); + int i = bs.nextSetBit(0); + for (int j = nAttached; j < pt && i >= 0; j++) + i = bs.nextSetBit(i + 1); + if (i == -1) + isPlanar = true; + else + pt = i; + break; + } + if (isPlanar) { + // square planar or T-shaped + z.sub(attached[angles[typePtrs[_90][0]][0]], atom); + x.sub(attached[angles[typePtrs[_90][0]][1]], atom); + z.cross(z, x); + if (pt == 4) + z.scale(-1); + pt = -1; + } } } - return hybridization; + if (pt >= 0) + z.sub(attached[pt], atom); + if (isLP) + z.scale(-1); + z.normalize(); + return lcaoType; } + + private Atom[] getAttached(Atom atom, int nMax, boolean doSort) { + int nAttached = atom.getCovalentBondCount(); + if (nAttached > nMax) + return null; + Atom[] attached = new Atom[nAttached]; + if (nAttached > 0) { + Bond[] bonds = atom.getBonds(); + int n = 0; + for (int i = 0; i < bonds.length; i++) + if (bonds[i].isCovalent()) + attached[n++] = bonds[i].getOtherAtom(atom); + if (doSort) + Arrays.sort(attached, new AtomSorter()); + } + return attached; + } + + private BitSet findNotAttached(int nAttached, int[][] angles, int[] ptrs, int nPtrs) { + BitSet bs = new BitSet(nAttached); + bs.set(0, nAttached); + for (int i = 0; i < nAttached; i++) + for (int j = 0; j < nPtrs; j++) { + int[] a = angles[ptrs[j]]; + if (a[0] == i || a[1] == i) + bs.clear(i); + } + return bs; + } + + class AtomSorter implements Comparator { + public int compare(Object arg0, Object arg1) { + return compare((Atom) arg0, (Atom) arg1); + } + private int compare(Atom a1, Atom a2) { + return (a1.index > a2.index ? 1 : a1.index < a2.index ? -1 : 0); + } + + } + + /////////////////////////// protected String getChimeInfo(int tok, BitSet bs) { StringBuffer info = new StringBuffer("\n"); Modified: branches/v12_0/Jmol/src/org/jmol/script/ScriptEvaluator.java =================================================================== --- branches/v12_0/Jmol/src/org/jmol/script/ScriptEvaluator.java 2010-08-28 21:46:07 UTC (rev 14168) +++ branches/v12_0/Jmol/src/org/jmol/script/ScriptEvaluator.java 2010-08-28 21:48:12 UTC (rev 14169) @@ -15181,7 +15181,7 @@ new Vector3f() }; if (!isSyntaxCheck) viewer.getHybridizationAndAxes(atomIndex, axes[0], axes[1], - lcaoType, false); + lcaoType); propertyValue = axes; break; default: Modified: branches/v12_0/Jmol/src/org/jmol/shapesurface/Isosurface.java =================================================================== --- branches/v12_0/Jmol/src/org/jmol/shapesurface/Isosurface.java 2010-08-28 21:46:07 UTC (rev 14168) +++ branches/v12_0/Jmol/src/org/jmol/shapesurface/Isosurface.java 2010-08-28 21:48:12 UTC (rev 14169) @@ -824,6 +824,17 @@ linkedMesh = thisMesh.linkedMesh = meshA; return; } + if (lcaoCartoon.equals("pza") + || lcaoCartoon.indexOf("sp") == 0 + || lcaoCartoon.indexOf("d") == 0 + || lcaoCartoon.indexOf("lp") == 0) { + createLcaoLobe(z, sense, nElectrons); + return; + } + if (lcaoCartoon.equals("pzb")) { + createLcaoLobe(z, -sense, nElectrons); + return; + } if (lcaoCartoon.equals("pxa")) { createLcaoLobe(x, sense, nElectrons); return; @@ -840,18 +851,6 @@ createLcaoLobe(y, -sense, nElectrons); return; } - if (lcaoCartoon.equals("pza")) { - createLcaoLobe(z, sense, nElectrons); - return; - } - if (lcaoCartoon.equals("pzb")) { - createLcaoLobe(z, -sense, nElectrons); - return; - } - if (lcaoCartoon.indexOf("sp") == 0 || lcaoCartoon.indexOf("lp") == 0) { - createLcaoLobe(z, sense, nElectrons); - return; - } if (lcaoCartoon.equals("spacefill") || lcaoCartoon.equals("cpk")) { createLcaoLobe(null, 2 * viewer.getAtomRadius(atomIndex), nElectrons); return; Modified: branches/v12_0/Jmol/src/org/jmol/shapesurface/LcaoCartoon.java =================================================================== --- branches/v12_0/Jmol/src/org/jmol/shapesurface/LcaoCartoon.java 2010-08-28 21:46:07 UTC (rev 14168) +++ branches/v12_0/Jmol/src/org/jmol/shapesurface/LcaoCartoon.java 2010-08-28 21:48:12 UTC (rev 14169) @@ -304,8 +304,7 @@ } if (isMolecular || isCpk || thisType.equalsIgnoreCase("s") - || viewer.getHybridizationAndAxes(iAtom, axes[0], axes[1], thisType, - true) != null) { + || viewer.getHybridizationAndAxes(iAtom, axes[0], axes[1], thisType) != null) { super.setProperty((isRadical ? "radical" : isLonePair ? "lonePair" : "lcaoCartoon"), axes, null); } if (isCpk) { Modified: branches/v12_0/Jmol/src/org/jmol/viewer/Jmol.properties =================================================================== --- branches/v12_0/Jmol/src/org/jmol/viewer/Jmol.properties 2010-08-28 21:46:07 UTC (rev 14168) +++ branches/v12_0/Jmol/src/org/jmol/viewer/Jmol.properties 2010-08-28 21:48:12 UTC (rev 14169) @@ -4,6 +4,10 @@ version=12.0.11_dev +# new feature: lcaoCartoons dsp3 (a,b,c,d,e), d2sp3 (a,b,c,d,e,f) +# (added because it is just an extension of lcaoCartoons and has been +# asked for repeatedly) +# bug fix: "sp3a" not "first bonded atom" # bug fix: failure to read old-style JVXL files. # -------------------------------------------------------------- Modified: branches/v12_0/Jmol/src/org/jmol/viewer/Viewer.java =================================================================== --- branches/v12_0/Jmol/src/org/jmol/viewer/Viewer.java 2010-08-28 21:46:07 UTC (rev 14168) +++ branches/v12_0/Jmol/src/org/jmol/viewer/Viewer.java 2010-08-28 21:48:12 UTC (rev 14169) @@ -2591,10 +2591,9 @@ } public String getHybridizationAndAxes(int atomIndex, Vector3f z, Vector3f x, - String lcaoType, - boolean hybridizationCompatible) { + String lcaoType) { return modelSet.getHybridizationAndAxes(atomIndex, z, x, lcaoType, - hybridizationCompatible, true, -1); + true, true); } public BitSet getMoleculeBitSet(int atomIndex) { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ha...@us...> - 2010-08-28 22:28:48
|
Revision: 14171 http://jmol.svn.sourceforge.net/jmol/?rev=14171&view=rev Author: hansonr Date: 2010-08-28 22:28:42 +0000 (Sat, 28 Aug 2010) Log Message: ----------- version=12.0.11_dev # new feature: lcaoCartoons dsp3 (a,b,c,d,e), d2sp3 (a,b,c,d,e,f) # (added because it is just an extension of lcaoCartoons and has been # asked for repeatedly) # bug fix: "sp3a" not "first bonded atom" Modified Paths: -------------- branches/v12_0/Jmol/src/org/jmol/modelset/AtomCollection.java branches/v12_0/Jmol/src/org/jmol/script/ScriptEvaluator.java Modified: branches/v12_0/Jmol/src/org/jmol/modelset/AtomCollection.java =================================================================== --- branches/v12_0/Jmol/src/org/jmol/modelset/AtomCollection.java 2010-08-28 22:28:21 UTC (rev 14170) +++ branches/v12_0/Jmol/src/org/jmol/modelset/AtomCollection.java 2010-08-28 22:28:42 UTC (rev 14171) @@ -1379,12 +1379,13 @@ boolean hybridizationCompatible, boolean doAlignZ) { - if (lcaoTypeRaw.indexOf("d") >= 0 && !lcaoTypeRaw.equals("sp3d")) - return getHybridizationAndAxesD(atomIndex, z, x, lcaoTypeRaw); - String lcaoType = (lcaoTypeRaw.length() > 0 && lcaoTypeRaw.charAt(0) == '-' ? lcaoTypeRaw .substring(1) : lcaoTypeRaw); + + if (lcaoTypeRaw.indexOf("d") >= 0 && !lcaoTypeRaw.equals("sp3d")) + return getHybridizationAndAxesD(atomIndex, z, x, lcaoType); + Atom atom = atoms[atomIndex]; Atom[] attached = getAttached(atom, 4, hybridizationCompatible); int nAttached = attached.length; @@ -1708,14 +1709,11 @@ * @param atomIndex * @param z * @param x - * @param lcaoTypeRaw + * @param lcaoType * @return valid hybridization or null */ private String getHybridizationAndAxesD(int atomIndex, Vector3f z, Vector3f x, - String lcaoTypeRaw) { - String lcaoType = (lcaoTypeRaw.length() > 0 && lcaoTypeRaw.charAt(0) == '-' ? lcaoTypeRaw - .substring(1) - : lcaoTypeRaw); + String lcaoType) { // note -- d2sp3, not sp3d2; dsp3, not sp3d if (lcaoType.startsWith("sp3d2")) lcaoType = "d2sp3" @@ -1724,18 +1722,28 @@ lcaoType = "dsp3" + (lcaoType.length() == 4 ? "a" : lcaoType.substring(4)); boolean isTrigonal = lcaoType.startsWith("dsp3"); - if (!isTrigonal && !lcaoType.startsWith("d2sp3")) + int pt = lcaoType.charAt(lcaoType.length() - 1) - 'a'; + if (!isTrigonal && (pt > 5 || !lcaoType.startsWith("d2sp3")) + || isTrigonal && pt > 4) return null; - int pt = lcaoType.charAt(lcaoType.length() - 1) - 'a'; + String hybridization = (isTrigonal ? "dsp3" : "d2sp3"); + + // pt: a 0 b 1 c 2 d 3 e 4 f 5 + Atom atom = atoms[atomIndex]; Atom[] attached = getAttached(atom, 6, true); - if (attached == null || pt > 5) + if (attached == null) return null; int nAttached = attached.length; - // verify hybridization + boolean isLP = (pt >= nAttached); + + // determine geometry + int nAngles = nAttached * (nAttached - 1) / 2; int[][] angles = new int[nAngles][]; + // all attached angles must be around 180, 120, or 90 degrees + int n = 0; int[] ntypes = new int[3]; int[][] typePtrs = new int[3][nAngles]; @@ -1754,27 +1762,37 @@ ntypes[itype]++; angles[n++] = new int[] { i, j }; } - // trigonal must have at least one 120; others must have none - String sType = "" + ntypes[_90] + ntypes[_120] + ntypes[_180]; - if (isTrigonal) { - // 201 see-saw + // categorization is done simply by listing + // the number of 90, 120, and 180 angles. + switch (ntypes[_90] * 100 + ntypes[_120] * 10 + ntypes[_180]) { + case 201: + // 201 T-shaped -- could be either + break; + case 210: + case 330: + case 631: + // 210 no name (90-90-120) // 330 see-saw // 631 trigonal bipyramidal - if (pt > 4 || !Parser.isOneOf(sType, "201;330;631")) + if (!isTrigonal) + return null; + break; + case 300: + case 402: + case 501: + case 802: + case 1203: + // 300 no name (90-90-90) + // 402 square planar + // 501 no name (see-saw like, but with 90o angle) + // 802 square pyramidal + // 1203 octahedral + if (isTrigonal) return null; - } else { - // 201 T-shaped - // 300 no name "corner" - // 402 square planar - // 501 no name "see-saw-like" - // 802 square pyramidal - // 1203 octahedral - if (!Parser.isOneOf(sType, "201;300;402;501;802;1203")) - return null; + break; } // if subType a-f is pointing to an attached atom, use it // otherwise, we need to find the position - boolean isLP = (pt >= nAttached); if (isLP) { int[] a; BitSet bs; @@ -1782,10 +1800,15 @@ switch (ntypes[_120]) { case 1: // see-saw - a = angles[typePtrs[_120][0]]; - z.add(attached[a[0]], attached[a[1]]); - z.scaleAdd(-2, atom, z); - pt = -1; + if (pt == 4) { + a = angles[typePtrs[_120][0]]; + z.add(attached[a[0]], attached[a[1]]); + z.scaleAdd(-2, atom, z); + pt = -1; + } else { + bs = findNotAttached(nAttached, angles, typePtrs[_120], ntypes[_120]); + pt = bs.nextSetBit(0); + } break; case 0: z.sub(attached[angles[typePtrs[_90][0]][0]], atom); @@ -1853,7 +1876,7 @@ if (isLP) z.scale(-1); z.normalize(); - return lcaoType; + return hybridization; } private Atom[] getAttached(Atom atom, int nMax, boolean doSort) { Modified: branches/v12_0/Jmol/src/org/jmol/script/ScriptEvaluator.java =================================================================== --- branches/v12_0/Jmol/src/org/jmol/script/ScriptEvaluator.java 2010-08-28 22:28:21 UTC (rev 14170) +++ branches/v12_0/Jmol/src/org/jmol/script/ScriptEvaluator.java 2010-08-28 22:28:42 UTC (rev 14171) @@ -15179,9 +15179,10 @@ addShapeProperty(propertyList, "modelIndex", new Integer(modelIndex)); Vector3f[] axes = { new Vector3f(), new Vector3f(), new Vector3f(pt), new Vector3f() }; - if (!isSyntaxCheck) - viewer.getHybridizationAndAxes(atomIndex, axes[0], axes[1], - lcaoType); + if (!isSyntaxCheck && !lcaoType.equalsIgnoreCase("s") + && viewer.getHybridizationAndAxes(atomIndex, axes[0], axes[1], lcaoType) + == null) + return; propertyValue = axes; break; default: This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ha...@us...> - 2010-08-29 04:08:30
|
Revision: 14185 http://jmol.svn.sourceforge.net/jmol/?rev=14185&view=rev Author: hansonr Date: 2010-08-29 04:08:24 +0000 (Sun, 29 Aug 2010) Log Message: ----------- version=12.0.11_dev # bug fix: % at end of line acts as a line continuation Modified Paths: -------------- branches/v12_0/Jmol/src/org/jmol/script/ScriptCompiler.java branches/v12_0/Jmol/src/org/jmol/viewer/Jmol.properties Modified: branches/v12_0/Jmol/src/org/jmol/script/ScriptCompiler.java =================================================================== --- branches/v12_0/Jmol/src/org/jmol/script/ScriptCompiler.java 2010-08-29 04:06:20 UTC (rev 14184) +++ branches/v12_0/Jmol/src/org/jmol/script/ScriptCompiler.java 2010-08-29 04:08:24 UTC (rev 14185) @@ -2360,6 +2360,7 @@ case ']': case '}': case '.': + case '%': // cmd..... xx % needs to be an end of line break; case '@': case '{': @@ -2372,7 +2373,6 @@ case ',': case '$': case ';': - case '%': case '[': tokLastMath = 1; break; Modified: branches/v12_0/Jmol/src/org/jmol/viewer/Jmol.properties =================================================================== --- branches/v12_0/Jmol/src/org/jmol/viewer/Jmol.properties 2010-08-29 04:06:20 UTC (rev 14184) +++ branches/v12_0/Jmol/src/org/jmol/viewer/Jmol.properties 2010-08-29 04:08:24 UTC (rev 14185) @@ -4,6 +4,7 @@ version=12.0.11_dev +# bug fix: % at end of line acts as a line continuation # new feature: lcaoCartoons dsp3 (a,b,c,d,e), d2sp3 (a,b,c,d,e,f) # (added because it is just an extension of lcaoCartoons and has been # asked for repeatedly) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ha...@us...> - 2010-08-29 18:12:02
|
Revision: 14191 http://jmol.svn.sourceforge.net/jmol/?rev=14191&view=rev Author: hansonr Date: 2010-08-29 18:11:54 +0000 (Sun, 29 Aug 2010) Log Message: ----------- version=12.0.11_dev # bug fix: WRITE xxx should do SHOW not clipboard for application # code: rewrite of calculateHydrogen/hybridization code Modified Paths: -------------- branches/v12_0/Jmol/src/org/jmol/modelset/AtomCollection.java branches/v12_0/Jmol/src/org/jmol/modelset/ModelSet.java branches/v12_0/Jmol/src/org/jmol/script/ScriptEvaluator.java branches/v12_0/Jmol/src/org/jmol/viewer/Jmol.properties branches/v12_0/Jmol/src/org/jmol/viewer/Viewer.java Modified: branches/v12_0/Jmol/src/org/jmol/modelset/AtomCollection.java =================================================================== --- branches/v12_0/Jmol/src/org/jmol/modelset/AtomCollection.java 2010-08-29 18:10:23 UTC (rev 14190) +++ branches/v12_0/Jmol/src/org/jmol/modelset/AtomCollection.java 2010-08-29 18:11:54 UTC (rev 14191) @@ -1215,7 +1215,7 @@ * @param vConnect * @return array of arrays of points added to specific atoms */ - public Point3f[][] getAdditionalHydrogens(BitSet bs, int[] nTotal, + public Point3f[][] calculateHydrogens(BitSet bs, int[] nTotal, boolean doAll, boolean justCarbon, Vector vConnect) { Vector3f z = new Vector3f(); @@ -1332,7 +1332,7 @@ case 1: // sp3 or Boron sp2 if (getHybridizationAndAxes(i, z, x, (atomicNumber == 5 ? "sp2c" - : targetValence == 2 ? "sp3d" : "sp3b"), true, false) != null) { + : "sp3d"), true, false) != null) { pt = new Point3f(z); pt.scaleAdd(1.1f, z, atom); hAtoms[i][hPt++] = pt; Modified: branches/v12_0/Jmol/src/org/jmol/modelset/ModelSet.java =================================================================== --- branches/v12_0/Jmol/src/org/jmol/modelset/ModelSet.java 2010-08-29 18:10:23 UTC (rev 14190) +++ branches/v12_0/Jmol/src/org/jmol/modelset/ModelSet.java 2010-08-29 18:11:54 UTC (rev 14191) @@ -298,7 +298,7 @@ if (mode == AtomData.MODE_GET_ATTACHED_HYDROGENS) { int[] nH = new int[1]; atomData.hAtomRadius = viewer.getVanderwaalsMar(1) / 1000f; - atomData.hAtoms = getAdditionalHydrogens(atomData.bsSelected, nH, false, true, null); + atomData.hAtoms = calculateHydrogens(atomData.bsSelected, nH, false, true, null); atomData.hydrogenAtomCount = nH[0]; return; } Modified: branches/v12_0/Jmol/src/org/jmol/script/ScriptEvaluator.java =================================================================== --- branches/v12_0/Jmol/src/org/jmol/script/ScriptEvaluator.java 2010-08-29 18:10:23 UTC (rev 14190) +++ branches/v12_0/Jmol/src/org/jmol/script/ScriptEvaluator.java 2010-08-29 18:11:54 UTC (rev 14191) @@ -12839,18 +12839,15 @@ } String write(Token[] args) throws ScriptException { - String[] fullPath = new String[1]; int pt = 0, pt0 = 0; - boolean isApplet = viewer.isApplet(); - boolean isCommand = false; - boolean isShow = false; - boolean isImage = false; - String driverList = viewer.getExportDriverList(); + boolean isCommand, isShow; if (args == null) { args = statement; - isCommand = true; pt = pt0 = 1; + isCommand = true; + isShow = (viewer.isApplet() && !viewer.isSignedApplet()); } else { + isCommand = false; isShow = true; } int argCount = (isCommand ? statementLength : args.length); @@ -12859,18 +12856,21 @@ int len = 0; int width = -1; int height = -1; + int quality = Integer.MIN_VALUE; + String driverList = viewer.getExportDriverList(); String type = "SPT"; String data = ""; String type2 = ""; String fileName = null; - boolean isCoord = false; - boolean isExport = false; - BitSet bsFrames = null; String localPath = null; String remotePath = null; String val = null; String msg = null; - int quality = Integer.MIN_VALUE; + String[] fullPath = new String[1]; + boolean isCoord = false; + boolean isExport = false; + boolean isImage = false; + BitSet bsFrames = null; if (tok == Token.string) { Token t = Token.getTokenFromName(ScriptVariable.sValue(args[pt]) .toLowerCase()); @@ -13085,9 +13085,7 @@ type = "XYZ"; } isImage = Parser.isOneOf(type, "GIF;JPEG64;JPEG;JPG64;JPG;PPM;PNG"); - if (isImage && fileName == null) - type = "[image to clipboard]"; - else if (isImage && (isApplet && !viewer.isSignedApplet() || isShow)) + if (isImage && isShow) type = "JPG64"; else if (!isImage && !isExport Modified: branches/v12_0/Jmol/src/org/jmol/viewer/Jmol.properties =================================================================== --- branches/v12_0/Jmol/src/org/jmol/viewer/Jmol.properties 2010-08-29 18:10:23 UTC (rev 14190) +++ branches/v12_0/Jmol/src/org/jmol/viewer/Jmol.properties 2010-08-29 18:11:54 UTC (rev 14191) @@ -4,6 +4,8 @@ version=12.0.11_dev +# code: rewrite of calculateHydrogen/hybridization code +# bug fix: WRITE xxx should do SHOW not clipboard for application # bug fix: % at end of line acts as a line continuation # new feature: lcaoCartoons dsp3 (a,b,c,d,e), d2sp3 (a,b,c,d,e,f) # (added because it is just an extension of lcaoCartoons and has been Modified: branches/v12_0/Jmol/src/org/jmol/viewer/Viewer.java =================================================================== --- branches/v12_0/Jmol/src/org/jmol/viewer/Viewer.java 2010-08-29 18:10:23 UTC (rev 14190) +++ branches/v12_0/Jmol/src/org/jmol/viewer/Viewer.java 2010-08-29 18:11:54 UTC (rev 14191) @@ -4339,7 +4339,7 @@ if (bsAtoms == null) bsAtoms = getSelectionSet(false); int[] nTotal = new int[1]; - Point3f[][] pts = modelSet.getAdditionalHydrogens(bsAtoms, nTotal, doAll, + Point3f[][] pts = modelSet.calculateHydrogens(bsAtoms, nTotal, doAll, justCarbon, vConnections); Point3f[] points = new Point3f[nTotal[0]]; for (int i = 0, pt = 0; i < pts.length; i++) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ha...@us...> - 2010-08-30 20:30:23
|
Revision: 14198 http://jmol.svn.sourceforge.net/jmol/?rev=14198&view=rev Author: hansonr Date: 2010-08-30 20:30:15 +0000 (Mon, 30 Aug 2010) Log Message: ----------- version=12.0.11_dev # bug fix: isosurface "t.jvxl" map property temperature nonfunctional Modified Paths: -------------- branches/v12_0/Jmol/src/org/jmol/atomdata/AtomDataServer.java branches/v12_0/Jmol/src/org/jmol/jvxl/calc/MarchingSquares.java branches/v12_0/Jmol/src/org/jmol/jvxl/data/JvxlCoder.java branches/v12_0/Jmol/src/org/jmol/jvxl/data/JvxlData.java branches/v12_0/Jmol/src/org/jmol/jvxl/data/VolumeData.java branches/v12_0/Jmol/src/org/jmol/jvxl/readers/AtomDataReader.java branches/v12_0/Jmol/src/org/jmol/jvxl/readers/IsoSolventReader.java branches/v12_0/Jmol/src/org/jmol/jvxl/readers/Parameters.java branches/v12_0/Jmol/src/org/jmol/jvxl/readers/SurfaceGenerator.java branches/v12_0/Jmol/src/org/jmol/jvxl/readers/SurfaceReader.java branches/v12_0/Jmol/src/org/jmol/modelset/Model.java branches/v12_0/Jmol/src/org/jmol/modelset/ModelCollection.java branches/v12_0/Jmol/src/org/jmol/script/ScriptEvaluator.java branches/v12_0/Jmol/src/org/jmol/shapesurface/Isosurface.java branches/v12_0/Jmol/src/org/jmol/shapesurface/IsosurfaceMesh.java branches/v12_0/Jmol/src/org/jmol/viewer/Jmol.properties branches/v12_0/Jmol/src/org/jmol/viewer/Viewer.java Added Paths: ----------- branches/v12_0/Jmol/src/org/jmol/jvxl/readers/AtomPropertyMapper.java Modified: branches/v12_0/Jmol/src/org/jmol/atomdata/AtomDataServer.java =================================================================== --- branches/v12_0/Jmol/src/org/jmol/atomdata/AtomDataServer.java 2010-08-30 20:17:18 UTC (rev 14197) +++ branches/v12_0/Jmol/src/org/jmol/atomdata/AtomDataServer.java 2010-08-30 20:30:15 UTC (rev 14198) @@ -3,6 +3,8 @@ import java.io.BufferedInputStream; import java.util.BitSet; +import javax.vecmath.Point3f; + import org.jmol.api.AtomIndexIterator; @@ -14,6 +16,9 @@ public void setIteratorForAtom(AtomIndexIterator iterator, int atomIndex, float distance); + public void setIteratorForPoint(AtomIndexIterator iter, int modelIndex, Point3f pt, + float maxDistance); + public void fillAtomData(AtomData atomData, int mode); public BufferedInputStream getBufferedInputStream(String fullPathName); Modified: branches/v12_0/Jmol/src/org/jmol/jvxl/calc/MarchingSquares.java =================================================================== --- branches/v12_0/Jmol/src/org/jmol/jvxl/calc/MarchingSquares.java 2010-08-30 20:17:18 UTC (rev 14197) +++ branches/v12_0/Jmol/src/org/jmol/jvxl/calc/MarchingSquares.java 2010-08-30 20:30:15 UTC (rev 14198) @@ -103,7 +103,7 @@ this.valueMax = valueMax; } - private int contourVertexCount; + public int contourVertexCount; ContourVertex[] contourVertexes = new ContourVertex[1000]; private static class ContourVertex extends Point3f { @@ -263,7 +263,7 @@ } void setValidity(float min, float max) { - isValid = (contourVertexes[pts[0]].value <= max + isValid &= (contourVertexes[pts[0]].value <= max && contourVertexes[pts[1]].value <= max && contourVertexes[pts[2]].value <= max && contourVertexes[pts[0]].value >= min Modified: branches/v12_0/Jmol/src/org/jmol/jvxl/data/JvxlCoder.java =================================================================== --- branches/v12_0/Jmol/src/org/jmol/jvxl/data/JvxlCoder.java 2010-08-30 20:17:18 UTC (rev 14197) +++ branches/v12_0/Jmol/src/org/jmol/jvxl/data/JvxlCoder.java 2010-08-30 20:30:15 UTC (rev 14198) @@ -504,7 +504,8 @@ int colorFractionRange = jvxlData.colorFractionRange; float valueBlue = jvxlData.valueMappedToBlue; float valueRed = jvxlData.valueMappedToRed; - int vertexCount = jvxlData.vertexCount; + int vertexCount = (jvxlData.saveVertexCount > 0 ? jvxlData.saveVertexCount + : jvxlData.vertexCount); float min = jvxlData.mappedDataMin; float max = jvxlData.mappedDataMax; StringBuffer list1 = new StringBuffer(); Modified: branches/v12_0/Jmol/src/org/jmol/jvxl/data/JvxlData.java =================================================================== --- branches/v12_0/Jmol/src/org/jmol/jvxl/data/JvxlData.java 2010-08-30 20:17:18 UTC (rev 14197) +++ branches/v12_0/Jmol/src/org/jmol/jvxl/data/JvxlData.java 2010-08-30 20:30:15 UTC (rev 14198) @@ -122,6 +122,7 @@ public int nEdges; public int nSurfaceInts; public int vertexCount; + public int saveVertexCount; // contour data is here instead of in MeshData because // sometimes it comes from the file or marching squares Modified: branches/v12_0/Jmol/src/org/jmol/jvxl/data/VolumeData.java =================================================================== --- branches/v12_0/Jmol/src/org/jmol/jvxl/data/VolumeData.java 2010-08-30 20:17:18 UTC (rev 14197) +++ branches/v12_0/Jmol/src/org/jmol/jvxl/data/VolumeData.java 2010-08-30 20:30:15 UTC (rev 14198) @@ -128,6 +128,9 @@ public class VolumeData implements VolumeDataInterface { + public SurfaceReader sr; + public boolean doIterate = true; + public final Point3f volumetricOrigin = new Point3f(); public final float[] origin = new float[3]; public final Vector3f[] volumetricVectors = new Vector3f[3]; @@ -283,13 +286,13 @@ pt3i.set((int) ptXyzTemp.x, (int) ptXyzTemp.y, (int) ptXyzTemp.z); } - public SurfaceReader sr; - public float lookupInterpolatedVoxelValue(Point3f point) { if (sr != null) return sr.getValueAtPoint(point); ptXyzTemp.sub(point, volumetricOrigin); inverseMatrix.transform(ptXyzTemp); + //if (ptXyzTemp.x < -0.1f || ptXyzTemp.y < -0.1f || ptXyzTemp.z < -0.1f) + //return Float.NaN; return getInterpolatedVoxelValue(ptXyzTemp); } @@ -430,7 +433,7 @@ edgeVector.sub(pointB, pointA); contourPoint.scaleAdd(fraction, edgeVector, pointA); float dist; - if (sr == null || valueB == valueA + if (sr == null || !doIterate || valueB == valueA || fraction < 0.01f || fraction > 0.99f || (dist = edgeVector.length()) < 0.01f) return fraction; @@ -443,10 +446,8 @@ - sr.getValueAtPoint(contourPoint)) / (valueB - valueA))) > 0.005f) { contourPoint.scaleAdd(diff, edgeVector, contourPoint); } - fraction = contourPoint.distance(pointA) / dist; - if (fraction > 1) - System.out.println("volumeData ohoh"); - return fraction; + dist = contourPoint.distance(pointA) / dist; + return (dist > 1 || dist < 0 ? fraction : dist); } Modified: branches/v12_0/Jmol/src/org/jmol/jvxl/readers/AtomDataReader.java =================================================================== --- branches/v12_0/Jmol/src/org/jmol/jvxl/readers/AtomDataReader.java 2010-08-30 20:17:18 UTC (rev 14197) +++ branches/v12_0/Jmol/src/org/jmol/jvxl/readers/AtomDataReader.java 2010-08-30 20:30:15 UTC (rev 14198) @@ -44,6 +44,7 @@ abstract class AtomDataReader extends VolumeDataReader { protected AtomDataServer atomDataServer; + protected float maxDistance; AtomDataReader(SurfaceGenerator sg) { super(sg); @@ -67,13 +68,12 @@ protected int myAtomCount; protected int nearbyAtomCount; protected int firstNearbyAtom; - protected BitSet bsMySelected, bsMyIgnored; + protected BitSet bsMySelected, bsMyIgnored, bsNearby; protected boolean doAddHydrogens; protected boolean doUsePlane; protected boolean doUseIterator; - protected void setup() { //CANNOT BE IN HERE IF atomDataServer is not valid params.iUseBitSets = true; @@ -87,6 +87,12 @@ volumeData.setPlaneParameters(params.thePlane); } + /** + * + * @param marginAtoms + * @param doGetAllAtoms UNUSED + * @param addNearbyAtoms + */ protected void getAtoms(float marginAtoms, boolean doGetAllAtoms, boolean addNearbyAtoms) { @@ -129,6 +135,7 @@ BitSet atomSet = BitSetUtil.copy(bsMySelected); int nH = 0; atomProp = null; + float[] props = params.theProperty; if (myAtomCount > 0) { Point3f[] hAtoms = null; if (doAddHydrogens) { @@ -165,7 +172,6 @@ // + hAtoms[i].z + "};"); } myAtomCount = nH; - float[] props = params.theProperty; for (int i = atomSet.nextSetBit(0); i >= 0; i = atomSet.nextSetBit(i + 1)) { if (atomProp != null) atomProp[myAtomCount] = (props != null && i < props.length ? props[i] @@ -201,7 +207,7 @@ return; Point3f pt = new Point3f(); - BitSet bsNearby = new BitSet(); + bsNearby = new BitSet(); for (int i = 0; i < atomCount; i++) { if (atomSet.get(i) || bsMyIgnored.get(i)) continue; @@ -209,6 +215,8 @@ if (params.thePlane != null && Math.abs(volumeData.distancePointToPlane(atomData.atomXyz[i])) > 2 * rA) continue; + if (params.theProperty != null) + rA += maxDistance; pt = atomData.atomXyz[i]; if (pt.x + rA > xyzMin.x && pt.x - rA < xyzMax.x && pt.y + rA > xyzMin.y && pt.y - rA < xyzMax.y && pt.z + rA > xyzMin.z @@ -220,10 +228,16 @@ int nAtoms = myAtomCount; if (nearbyAtomCount != 0) { nAtoms += nearbyAtomCount; - atomRadius = (float[]) ArrayUtil.setLength(atomRadius, nAtoms); + atomRadius = ArrayUtil.setLength(atomRadius, nAtoms); atomXyz = (Point3f[]) ArrayUtil.setLength(atomXyz, nAtoms); + if (props != null) + atomProp = ArrayUtil.setLength(atomProp, nAtoms); for (int i = bsNearby.nextSetBit(0); i >= 0; i = bsNearby .nextSetBit(i + 1)) { + if (props != null) { + atomProp[myAtomCount] = props[i]; + myIndex[i] = myAtomCount; + } atomXyz[myAtomCount] = atomData.atomXyz[i]; atomRadius[myAtomCount++] = atomData.atomRadius[i]; } Added: branches/v12_0/Jmol/src/org/jmol/jvxl/readers/AtomPropertyMapper.java =================================================================== --- branches/v12_0/Jmol/src/org/jmol/jvxl/readers/AtomPropertyMapper.java (rev 0) +++ branches/v12_0/Jmol/src/org/jmol/jvxl/readers/AtomPropertyMapper.java 2010-08-30 20:30:15 UTC (rev 14198) @@ -0,0 +1,114 @@ +/* $RCSfile$ + * $Author: hansonr $ + * $Date: 2007-03-30 11:40:16 -0500 (Fri, 30 Mar 2007) $ + * $Revision: 7273 $ + * + * Copyright (C) 2007 Miguel, Bob, Jmol Development + * + * Contact: ha...@st... + * + * 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 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.jvxl.readers; + +import javax.vecmath.Point3f; + +import org.jmol.util.Logger; + +import org.jmol.api.AtomIndexIterator; + +class AtomPropertyMapper extends AtomDataReader { + + AtomPropertyMapper(SurfaceGenerator sg) { + super(sg); + } + //// maps property data //// + + private boolean doSmoothProperty; + private AtomIndexIterator iter; + + + protected void setup() { + super.setup(); + // MAP only + volumeData.sr = this; + volumeData.doIterate = false; + point = params.point; + doSmoothProperty = params.propertySmoothing; + doUseIterator = true; + maxDistance = 4; + getAtoms(Float.NaN, false, doSmoothProperty); + setHeader("property", params.calculationType); + // for plane mapping + setRangesAndAddAtoms(params.solvent_ptsPerAngstrom, params.solvent_gridMax, 0); + params.cutoff = 0; + } + + protected void initializeMapping() { + if (Logger.debugging) + Logger.startTimer(); + bsMySelected.or(bsNearby); + iter = atomDataServer.getSelectedAtomIterator(bsMySelected, false, true); + } + + protected void finalizeMapping() { + iter.release(); + iter = null; + if (Logger.debugging) + Logger.checkTimer("property mapping time"); + } + + //////////// meshData extensions //////////// + + /////////////// calculation methods ////////////// + + protected void generateCube() { + // not applicable + } + + public float getValueAtPoint(Point3f pt) { + float value = (doSmoothProperty ? 0 : Float.NaN); + float dmin = Float.MAX_VALUE; + float dminNearby = Float.MAX_VALUE; + float vdiv = 0; + atomDataServer.setIteratorForPoint(iter, modelIndex, pt, maxDistance); + while (iter.hasNext()) { + int iAtom = myIndex[iter.next()]; + boolean isNearby = (iAtom >= firstNearbyAtom); + Point3f ptA = atomXyz[iAtom]; + float p = atomProp[iAtom]; + if (Float.isNaN(p)) + continue; + float d = pt.distance(ptA); + if (isNearby) { + if (d < dminNearby) + dminNearby = d; + } else if (d < dmin) { + dmin = d; + if (!doSmoothProperty) + value = p; + } + if (doSmoothProperty) { // fourth-power smoothing + d = 1 / d; + d *= d; + d *= d; + vdiv += d; + value += d * p; + } + } + return (doSmoothProperty ? (vdiv == 0 || dminNearby < dmin ? Float.NaN : value / vdiv) : value); + } + +} Modified: branches/v12_0/Jmol/src/org/jmol/jvxl/readers/IsoSolventReader.java =================================================================== --- branches/v12_0/Jmol/src/org/jmol/jvxl/readers/IsoSolventReader.java 2010-08-30 20:17:18 UTC (rev 14197) +++ branches/v12_0/Jmol/src/org/jmol/jvxl/readers/IsoSolventReader.java 2010-08-30 20:30:15 UTC (rev 14198) @@ -42,8 +42,6 @@ ///// solvent-accessible, solvent-excluded surface ////// - //// also creates a map for properties //// - /* * The surface fragment idea: * @@ -69,8 +67,6 @@ private boolean doCalculateTroughs; private boolean isCavity, isPocket; private float solventRadius; - private boolean isProperty; - private boolean doSmoothProperty; protected void setup() { super.setup(); @@ -82,9 +78,6 @@ isCavity = (params.isCavity && meshDataServer != null); // Jvxl cannot do this calculation on its own. isPocket = (params.pocket != null && meshDataServer != null); - isProperty = (dataType == Parameters.SURFACE_PROPERTY); - doSmoothProperty = isProperty && params.propertySmoothing; - doCalculateTroughs = (atomDataServer != null && !isCavity // Jvxl needs an atom iterator to do this. && solventRadius > 0 && (dataType == Parameters.SURFACE_SOLVENT || dataType == Parameters.SURFACE_MOLECULAR)); doUseIterator = doCalculateTroughs; @@ -147,7 +140,6 @@ /////////////// calculation methods ////////////// - protected void generateCube() { /* * @@ -272,7 +264,7 @@ Point3f ptA; Point3f ptY0 = new Point3f(), ptZ0 = new Point3f(); Point3i pt0 = new Point3i(), pt1 = new Point3i(); - float value = (doSmoothProperty ? Float.NaN : Float.MAX_VALUE); + float value = Float.MAX_VALUE; if (Logger.debugging) Logger.startTimer(); for (int x = 0; x < nPointsX; ++x) @@ -282,16 +274,6 @@ if (dataType == Parameters.SURFACE_NOMAP) return; int atomCount = myAtomCount; - float property[][][] = null; - if (isProperty) { - atomCount = firstNearbyAtom; - property = new float[nPointsX][nPointsY][nPointsZ]; - value = (doSmoothProperty ? 0 : Float.NaN); - for (int x = 0; x < nPointsX; ++x) - for (int y = 0; y < nPointsY; ++y) - for (int z = 0; z < nPointsZ; ++z) - property[x][y][z] = value; - } float maxRadius = 0; float r0 = (isFirstPass && isCavity ? cavityRadius : 0); boolean isWithin = (isFirstPass && distance != Float.MAX_VALUE && point != null); @@ -313,20 +295,9 @@ ptZ0.set(ptXyzTemp); for (int k = pt0.z; k < pt1.z; k++) { float v = ptXyzTemp.distance(ptA) - rA; - if (doSmoothProperty) { - v = 1 / (v + rA); - v *= v; - v *= v; - if (Float.isNaN(voxelData[i][j][k])) - voxelData[i][j][k] = 0; - if (!Float.isNaN(atomProp[iAtom])) - property[i][j][k] += atomProp[iAtom] * v; - voxelData[i][j][k] += v; - } else if (v < voxelData[i][j][k]) { + if (v < voxelData[i][j][k]) { voxelData[i][j][k] = (isNearby || isWithin && ptXyzTemp.distance(point) > distance ? Float.NaN : v); - if (isProperty) - property[i][j][k] = atomProp[iAtom]; } ptXyzTemp.add(volumetricVectors[2]); } @@ -404,18 +375,6 @@ iter.release(); iter = null; } - if (doSmoothProperty) { - for (int x = 0; x < nPointsX; ++x) - for (int y = 0; y < nPointsY; ++y) - for (int z = 0; z < nPointsZ; ++z) - if (!Float.isNaN(voxelData[x][y][z])) - voxelData[x][y][z] = property[x][y][z] / voxelData[x][y][z]; - return; - } else if (isProperty) { - volumeData.voxelData = property; - setVolumeData(volumeData); - initializeVolumetricData(); - } if (params.thePlane == null) { for (int x = 0; x < nPointsX; ++x) for (int y = 0; y < nPointsY; ++y) @@ -438,7 +397,7 @@ } void setGridLimitsForAtom(Point3f ptA, float rA, Point3i pt0, Point3i pt1) { - int n = (isProperty ? 4 : 1); + int n = 1; volumeData.xyzToVoxelPt(ptA.x - rA, ptA.y - rA, ptA.z - rA, pt0); pt0.x -= n; pt0.y -= n; @@ -468,35 +427,32 @@ /* * Checking here for voxels that are in the situation: * - * A------)-- V ---((--))-- S --(------B - * |----d--------| - * or + * A------)(-----S-----)(------B (not actually linear) + * |-----rAS-----|-----rBS-----| + * |-----------dAB-------------| + * ptV + * |--dAV---|---------dBV------| * - * B------)-- V ---((--))-- S --(------A - * |----d--------| - * - * A and B are the two atom centers; V is the voxel; S is a hypothetical - * PROJECTED solvent center based on the position of V in relation to - * first A, then B; ( and ) are atom radii and (( )) are the overlapping - * atom+solvent radii. + * A and B are the two atom centers; S is a hypothetical + * PROJECTED solvent center based on the position of ptV + * in relation to first A, then B. * - * That is, where the projected solvent location for one voxel is + * Where the projected solvent location for one voxel is * within the solvent radius sphere of another, this voxel should * be checked in relation to solvent distance, not atom distance. * * - * S - *++ / \ ++ - * ++ / | \ ++ - * + V + x want V such that angle ASV < angle ASB - * / ****** \ - * A --+--+----B + * S + *+++ / \ +++ + * ++ / | \ ++ + * + V + x want V such that angle ASV < angle ASB + * / ****** \ + * A --+--+----B * b * - * A, B are atoms; S is solvent center; V is voxel point - * objective is to calculate dSV. ++ Here represents the van der Waals - * radius for each atom. ***** is the key "trough" location. - * + * ++ Here represents the van der Waals radius for each atom. + * ***** is the key "trough" location. The objective is to calculate dSV. + * * Getting dVS: * * Known: rAB, rAS, rBS, giving angle BAS (theta) @@ -519,46 +475,51 @@ */ float dAV = ptA.distance(ptV); float dBV = ptB.distance(ptV); - float dVS = Float.NaN; + float dVS; float f = rAS / dAV; if (f > 1) { + // within solvent sphere of atom A + // calculate point on solvent sphere A projected through ptV ptS.set(ptA.x + (ptV.x - ptA.x) * f, ptA.y + (ptV.y - ptA.y) * f, ptA.z + (ptV.z - ptA.z) * f); - if (ptB.distance(ptS) < rBS) { - dVS = solventDistance(ptV, ptA, ptB, rAS, rBS, dAB, dAV, dBV); - if (!voxelIsInTrough(dVS, rAS * rAS, rBS, dAB, dAV, dBV)) - return Float.NaN; - } - return dVS; + // If the distance of this point to B is less than the distance + // of S to B, then we need to check this point + if (ptB.distance(ptS) >= rBS) + return Float.NaN; + // we are somewhere in the triangle ASB, within the solvent sphere of A + dVS = solventDistance(rAS, rBS, dAB, dAV, dBV); + return (voxelIsInTrough(dVS, rAS * rAS, rBS, dAB, dAV) ? dVS : Float.NaN); } f = rBS / dBV; if (f <= 1) - return dVS; + return Float.NaN; // not within solvent sphere of A or B + // calculate point on solvent sphere B projected through ptV ptS.set(ptB.x + (ptV.x - ptB.x) * f, ptB.y + (ptV.y - ptB.y) * f, ptB.z + (ptV.z - ptB.z) * f); - if (ptA.distance(ptS) < rAS) { - dVS = solventDistance(ptV, ptB, ptA, rBS, rAS, dAB, dBV, dAV); - if (!voxelIsInTrough(dVS, rAS * rAS, rBS, dAB, dAV, dBV)) - return Float.NaN; - } - return dVS; + if (ptA.distance(ptS) >= rAS) + return Float.NaN; + // we are somewhere in the triangle ASB, within the solvent sphere of B + dVS = solventDistance(rBS, rAS, dAB, dBV, dAV); + return (voxelIsInTrough(dVS, rAS * rAS, rBS, dAB, dAV) ? dVS : Float.NaN); } - boolean voxelIsInTrough(float dVS, float rAS2, float rBS, float dAB, - float dAV, float dBV) { + private boolean voxelIsInTrough(float dVS, float rAS2, float rBS, float dAB, + float dAV) { //only calculate what we need -- a factor proportional to cos float cosASBf = (rAS2 + rBS * rBS - dAB * dAB) / rBS; // /2 /rAS); float cosASVf = (rAS2 + dVS * dVS - dAV * dAV) / dVS; // /2 /rAS); return (cosASBf < cosASVf); } - float solventDistance(Point3f ptV, Point3f ptA, Point3f ptB, float rAS, - float rBS, float dAB, float dAV, float dBV) { - double angleVAB = Math.acos((dAV * dAV + dAB * dAB - dBV * dBV) + private float solventDistance(float rAS, float rBS, float dAB, float dAV, float dBV) { + double dAV2 = dAV * dAV; + double rAS2 = rAS * rAS; + double dAB2 = dAB * dAB; + double angleVAB = Math.acos((dAV2 + dAB2 - dBV * dBV) / (2 * dAV * dAB)); - double angleBAS = Math.acos((dAB * dAB + rAS * rAS - rBS * rBS) + double angleBAS = Math.acos((dAB2 + rAS2 - rBS * rBS) / (2 * dAB * rAS)); - float dVS = (float) Math.sqrt(rAS * rAS + dAV * dAV - 2 * rAS * dAV + float dVS = (float) Math.sqrt(rAS2 + dAV2 - 2 * rAS * dAV * Math.cos(angleBAS - angleVAB)); return dVS; } Modified: branches/v12_0/Jmol/src/org/jmol/jvxl/readers/Parameters.java =================================================================== --- branches/v12_0/Jmol/src/org/jmol/jvxl/readers/Parameters.java 2010-08-30 20:17:18 UTC (rev 14197) +++ branches/v12_0/Jmol/src/org/jmol/jvxl/readers/Parameters.java 2010-08-30 20:30:15 UTC (rev 14198) @@ -244,6 +244,7 @@ title = null; atomRadiusData = null; rangeAll = false; + rangeSelected = false; } String calculationType = ""; @@ -710,6 +711,7 @@ boolean isPositiveOnly; boolean rangeAll; + boolean rangeSelected; public boolean rangeDefined; float valueMappedToRed, valueMappedToBlue; float mappedDataMin; @@ -732,6 +734,7 @@ public short[] contourColixes; Point3f contourIncrements; public Point3f[] boundingBox; + public Point3f[] mappedDataBox; public BitSet[] bsExcluded; public int contourType; public boolean colorSchemeTranslucent; @@ -743,8 +746,9 @@ mappedDataMax = 1; } if (mappedDataMin == Float.MAX_VALUE || mappedDataMin == mappedDataMax) { - mappedDataMin = surfaceReader.getMinMappedValue(); - mappedDataMax = surfaceReader.getMaxMappedValue(); + float[] minMax = surfaceReader.getMinMaxMappedValues(); + mappedDataMin = minMax[0]; + mappedDataMax = minMax[1]; } if (mappedDataMin == 0 && mappedDataMax == 0) { //just set default -1/1 if there is no obvious data Modified: branches/v12_0/Jmol/src/org/jmol/jvxl/readers/SurfaceGenerator.java =================================================================== --- branches/v12_0/Jmol/src/org/jmol/jvxl/readers/SurfaceGenerator.java 2010-08-30 20:17:18 UTC (rev 14197) +++ branches/v12_0/Jmol/src/org/jmol/jvxl/readers/SurfaceGenerator.java 2010-08-30 20:30:15 UTC (rev 14198) @@ -557,6 +557,11 @@ return true; } + if ("rangeSelected" == propertyName) { + params.rangeSelected = true; + return true; + } + if ("red" == propertyName) { params.valueMappedToRed = ((Float) value).floatValue(); return true; @@ -962,10 +967,12 @@ case Parameters.SURFACE_NOMAP: surfaceReader = new IsoPlaneReader(this); break; + case Parameters.SURFACE_PROPERTY: + surfaceReader = new AtomPropertyMapper(this); + break; case Parameters.SURFACE_SOLVENT: case Parameters.SURFACE_MOLECULAR: case Parameters.SURFACE_SASURFACE: - case Parameters.SURFACE_PROPERTY: surfaceReader = new IsoSolventReader(this); break; case Parameters.SURFACE_MOLECULARORBITAL: Modified: branches/v12_0/Jmol/src/org/jmol/jvxl/readers/SurfaceReader.java =================================================================== --- branches/v12_0/Jmol/src/org/jmol/jvxl/readers/SurfaceReader.java 2010-08-30 20:17:18 UTC (rev 14197) +++ branches/v12_0/Jmol/src/org/jmol/jvxl/readers/SurfaceReader.java 2010-08-30 20:30:15 UTC (rev 14198) @@ -603,7 +603,7 @@ //////////////////////////////////////////////////////////////// void colorIsosurface() { - if (params.isSquared) + if (params.isSquared && volumeData != null) volumeData.filterData(true, Float.NaN); /* if (params.isContoured && marchingSquares == null) { // if (params.isContoured && !(jvxlDataIs2dContour || params.thePlane != null)) { @@ -616,14 +616,17 @@ } if (params.isContoured && marchingSquares != null) { + initializeMapping(); params.setMapRanges(this); marchingSquares.setMinMax(params.valueMappedToRed, params.valueMappedToBlue); + jvxlData.saveVertexCount = marchingSquares.contourVertexCount; contourVertexCount = marchingSquares - .generateContourData(jvxlDataIs2dContour); + .generateContourData(jvxlDataIs2dContour); jvxlData.contourValuesUsed = marchingSquares.getContourValues(); if (meshDataServer != null) meshDataServer.notifySurfaceGenerationCompleted(); + finalizeMapping(); } applyColorScale(); @@ -644,16 +647,11 @@ meshDataServer.fillMeshData(meshData, MeshData.MODE_GET_VERTICES, null); meshDataServer.fillMeshData(meshData, MeshData.MODE_GET_COLOR_INDEXES, null); } - params.setMapRanges(this); //colorBySign is true when colorByPhase is true, but not vice-versa //old: boolean saveColorData = !(params.colorByPhase && !params.isBicolorMap && !params.colorBySign); //sorry! boolean saveColorData = (params.colorDensity || params.isBicolorMap || params.colorBySign || !params.colorByPhase); // colors mappable always now jvxlData.isJvxlPrecisionColor = true;//(jvxlDataIsPrecisionColor || params.isContoured || params.remappable); - jvxlData.valueMappedToRed = params.valueMappedToRed; - jvxlData.valueMappedToBlue = params.valueMappedToBlue; - jvxlData.mappedDataMin = params.mappedDataMin; - jvxlData.mappedDataMax = params.mappedDataMax; jvxlData.vertexCount = (contourVertexCount > 0 ? contourVertexCount : meshData.vertexCount); jvxlData.minColorIndex = -1; @@ -662,34 +660,53 @@ jvxlData.isColorReversed = params.isColorReversed; if (!params.colorDensity) if (params.isBicolorMap && !params.isContoured || params.colorBySign) { - jvxlData.minColorIndex = ColorEncoder - .getColorIndex(params.isColorReversed ? params.colorPos + jvxlData.minColorIndex = Graphics3D.getColix(params.isColorReversed ? params.colorPos : params.colorNeg); - jvxlData.maxColorIndex = ColorEncoder - .getColorIndex(params.isColorReversed ? params.colorNeg + jvxlData.maxColorIndex = Graphics3D.getColix(params.isColorReversed ? params.colorNeg : params.colorPos); } jvxlData.isTruncated = (jvxlData.minColorIndex >= 0 && !params.isContoured); boolean useMeshDataValues = jvxlDataIs2dContour || // !jvxlDataIs2dContour && (params.isContoured && jvxlData.jvxlPlane != null || vertexDataOnly || params.colorDensity || params.isBicolorMap && !params.isContoured; - float value; - if (!useMeshDataValues) + if (!useMeshDataValues) { + float min = Float.MAX_VALUE; + float max = -Float.MAX_VALUE; + float value; + initializeMapping(); for (int i = meshData.vertexCount; --i >= 0;) { /* right, so what we are doing here is setting a range within the * data for which we want red-->blue, but returning the actual * number so it can be encoded more precisely. This turned out to be * the key to making the JVXL contours work. * - */ + */ if (params.colorBySets) value = meshData.vertexSets[i]; else if (params.colorByPhase) value = getPhase(meshData.vertices[i]); + //else if (jvxlDataIs2dContour) + //marchingSquares + // .getInterpolatedPixelValue(meshData.vertices[i]); else value = volumeData.lookupInterpolatedVoxelValue(meshData.vertices[i]); + if (value < min) + min = value; + if (value > max && value != Float.MAX_VALUE) + max = value; meshData.vertexValues[i] = value; } + if (params.rangeSelected && minMax == null) + minMax = new float[] { min, max }; + if (minMax == null) + minMax = new float[] { min, max }; + finalizeMapping(); + } + params.setMapRanges(this); + jvxlData.mappedDataMin = params.mappedDataMin; + jvxlData.mappedDataMax = params.mappedDataMax; + jvxlData.valueMappedToRed = params.valueMappedToRed; + jvxlData.valueMappedToBlue = params.valueMappedToBlue; colorData(); JvxlCoder.jvxlCreateColorData(jvxlData, @@ -698,7 +715,7 @@ if (meshDataServer != null && params.colorBySets) meshDataServer.fillMeshData(meshData, MeshData.MODE_PUT_SETS, null); } - + private void colorData() { float[] vertexValues = meshData.vertexValues; @@ -786,46 +803,45 @@ return 1; } - float getMinMappedValue() { + protected float[] minMax; + + public float[] getMinMaxMappedValues() { + if (minMax != null && minMax[0] != Float.MAX_VALUE) + return minMax; if (params.colorBySets) - return 0; - int vertexCount = (contourVertexCount > 0 ? contourVertexCount - : meshData.vertexCount); - Point3f[] vertexes = meshData.vertices; + return (minMax = new float[] { 0, Math.max(meshData.nSets - 1, 0) }); float min = Float.MAX_VALUE; - boolean useVertexValue = (jvxlDataIs2dContour || vertexDataOnly || params.colorDensity); - for (int i = 0; i < vertexCount; i++) { - float challenger; - if (useVertexValue) - challenger = meshData.vertexValues[i]; - else - challenger = volumeData.lookupInterpolatedVoxelValue(vertexes[i]); - if (challenger < min) - min = challenger; + float max = -Float.MAX_VALUE; + if (params.theProperty != null) { + for (int i = 0; i < params.theProperty.length; i++) { + if (params.rangeSelected && !params.bsSelected.get(i)) + continue; + float p = params.theProperty[i]; + if (Float.isNaN(p)) + continue; + if (p < min) + min = p; + if (p > max) + max = p; + } + return (minMax = new float[] { min, max }); } - return min; - } - - float getMaxMappedValue() { - if (params.colorBySets) - return Math.max(meshData.nSets - 1, 0); int vertexCount = (contourVertexCount > 0 ? contourVertexCount : meshData.vertexCount); Point3f[] vertexes = meshData.vertices; - float max = -Float.MAX_VALUE; boolean useVertexValue = (jvxlDataIs2dContour || vertexDataOnly || params.colorDensity); for (int i = 0; i < vertexCount; i++) { - float challenger; + float v; if (useVertexValue) - challenger = meshData.vertexValues[i]; + v = meshData.vertexValues[i]; else - challenger = volumeData.lookupInterpolatedVoxelValue(vertexes[i]); - if (challenger == Float.MAX_VALUE) - challenger = 0; //for now TESTING ONLY - if (challenger > max && challenger != Float.MAX_VALUE) - max = challenger; + v = volumeData.lookupInterpolatedVoxelValue(vertexes[i]); + if (v < min) + min = v; + if (v > max && v != Float.MAX_VALUE) + max = v; } - return max; + return (minMax = new float[] { min, max }); } void updateTriangles() { @@ -952,9 +968,23 @@ * @param pt * @return value */ + /** + * + * @param pt + * @return value + */ public float getValueAtPoint(Point3f pt) { - // only for readers that can support it (isoShapeReader) + // only for readers that can support it (IsoShapeReader, AtomPropertyMapper) return 0; } + protected void initializeMapping() { + // initiate any iterators + } + + protected void finalizeMapping() { + // release any iterators + } + + } Modified: branches/v12_0/Jmol/src/org/jmol/modelset/Model.java =================================================================== --- branches/v12_0/Jmol/src/org/jmol/modelset/Model.java 2010-08-30 20:17:18 UTC (rev 14197) +++ branches/v12_0/Jmol/src/org/jmol/modelset/Model.java 2010-08-30 20:30:15 UTC (rev 14198) @@ -97,10 +97,7 @@ int hydrogenCount; boolean isPDB; - public boolean isPDB() { - return isPDB; - } - + String loadState = ""; StringBuffer loadScript = new StringBuffer(); Modified: branches/v12_0/Jmol/src/org/jmol/modelset/ModelCollection.java =================================================================== --- branches/v12_0/Jmol/src/org/jmol/modelset/ModelCollection.java 2010-08-30 20:17:18 UTC (rev 14197) +++ branches/v12_0/Jmol/src/org/jmol/modelset/ModelCollection.java 2010-08-30 20:30:15 UTC (rev 14198) @@ -1935,6 +1935,12 @@ bspf.initialize(modelIndex, atoms, viewer.getModelUndeletedAtomsBitSet(modelIndex)); } + public void setIteratorForPoint(AtomIndexIterator iterator, int modelIndex, + Point3f pt, float distance) { + initializeBspt(modelIndex); + iterator.set(modelIndex, models[modelIndex].firstAtomIndex, Integer.MAX_VALUE, pt, distance); + } + public void setIteratorForAtom(AtomIndexIterator iterator, int modelIndex, int atomIndex, float distance) { if (modelIndex < 0) Modified: branches/v12_0/Jmol/src/org/jmol/script/ScriptEvaluator.java =================================================================== --- branches/v12_0/Jmol/src/org/jmol/script/ScriptEvaluator.java 2010-08-30 20:17:18 UTC (rev 14197) +++ branches/v12_0/Jmol/src/org/jmol/script/ScriptEvaluator.java 2010-08-30 20:30:15 UTC (rev 14198) @@ -14910,17 +14910,43 @@ error(ERROR_invalidArgument); continue; case Token.property: - if (dataUse == null) { // mlp or mep + case Token.variable: + if (modelIndex < 0) + error(ERROR_multipleModelsDisplayedNotOK, "ISOSURFACE " + + theToken.value); + if (isCavity) + error(ERROR_invalidArgument); + boolean isVariable = (theTok == Token.variable); + if (dataUse == null) { // not mlp or mep + if (bsSelect == null) { + bsSelect = viewer.getSelectionSet(false); + bsSelect.and(viewer.getModelUndeletedAtomsBitSet(modelIndex)); + addShapeProperty(propertyList, "select", bsSelect); + } + if (surfaceObjectSeen) { + // not for overall surface, just this mapping + sbCommand.append(" select " + Escape.escape(bsSelect)); + bsSelect = null; + } else { + surfaceObjectSeen = true; + addShapeProperty(propertyList, "sasurface", new Float(0)); + sbCommand.append(" vdw"); + } + propertyName = "property"; if (smoothing == null) smoothing = viewer.getIsosurfacePropertySmoothing() ? Boolean.TRUE : Boolean.FALSE; addShapeProperty(propertyList, "propertySmoothing", smoothing); sbCommand.append(" isosurfacePropertySmoothing " + smoothing); + if (viewer.isRangeSelected()) + addShapeProperty(propertyList, "rangeSelected", Boolean.TRUE); + } else { + propertyName = dataUse; } str = parameterAsString(i); sbCommand.append(" ").append(str); - propertyName = (dataUse == null ? "property" : dataUse); - if (!isCavity && str.toLowerCase().indexOf("property_") == 0) { + + if (str.toLowerCase().indexOf("property_") == 0) { data = new float[viewer.getAtomCount()]; if (isSyntaxCheck) continue; @@ -14930,23 +14956,35 @@ addShapeProperty(propertyList, propertyName, data); continue; } - int tokProperty = getToken(++i).tok; - sbCommand.append(" " + theToken.value); + int atomCount = viewer.getAtomCount(); - data = (isCavity ? new float[0] : new float[atomCount]); - if (isCavity)// not implemented: && tokProperty != - // Token.surfacedistance) - error(ERROR_invalidArgument); - if (!isSyntaxCheck && !isCavity) { - Atom[] atoms = viewer.getModelSet().atoms; - viewer.autoCalculate(tokProperty); - for (int iAtom = atomCount; --iAtom >= 0;) { - data[iAtom] = Atom.atomPropertyFloat(viewer, atoms[iAtom], - tokProperty); + data = new float[atomCount]; + + if (isVariable) { + String vname = parameterAsString(++i); + if (vname.length() == 0) { + data = floatParameterSet(i, atomCount, atomCount); + } else { + data = new float[atomCount]; + if (!isSyntaxCheck) + Parser.parseStringInfestedFloatArray("" + + getParameter(vname, false), null, data); } + if (!isSyntaxCheck) + sbCommand.append(" \"\" ").append(Escape.escape(data)); + } else { + int tokProperty = getToken(++i).tok; + if (!isSyntaxCheck) { + sbCommand.append(" " + theToken.value); + Atom[] atoms = viewer.getModelSet().atoms; + viewer.autoCalculate(tokProperty); + for (int iAtom = atomCount; --iAtom >= 0;) + data[iAtom] = Atom.atomPropertyFloat(viewer, atoms[iAtom], + tokProperty); + } + if (tokProperty == Token.color) + colorScheme = "colorRGB"; } - if (tokProperty == Token.color) - colorScheme = "colorRGB"; propertyValue = data; break; case Token.model: @@ -15177,10 +15215,11 @@ addShapeProperty(propertyList, "modelIndex", new Integer(modelIndex)); Vector3f[] axes = { new Vector3f(), new Vector3f(), new Vector3f(pt), new Vector3f() }; - if (!isSyntaxCheck && !lcaoType.equalsIgnoreCase("s") - && viewer.getHybridizationAndAxes(atomIndex, axes[0], axes[1], lcaoType) - == null) - return; + if (!isSyntaxCheck + && !lcaoType.equalsIgnoreCase("s") + && viewer.getHybridizationAndAxes(atomIndex, axes[0], axes[1], + lcaoType) == null) + return; propertyValue = axes; break; default: @@ -15244,18 +15283,6 @@ error(ERROR_noPartialCharges); propertyValue = data; break; - case Token.sasurface: - case Token.solvent: - surfaceObjectSeen = true; - addShapeProperty(propertyList, "bsSolvent", - lookupIdentifierValue("solvent")); - propertyName = (theTok == Token.sasurface ? "sasurface" : "solvent"); - sbCommand.append(" ").append(theToken.value); - float radius = (isFloatParameter(i + 1) ? floatParameter(++i) : viewer - .getSolventProbeRadius()); - propertyValue = new Float(radius); - sbCommand.append(" ").append(radius); - break; case Token.volume: doCalcVolume = !isSyntaxCheck; sbCommand.append(" volume"); @@ -15601,10 +15628,32 @@ sbCommand.append(" modelBased"); break; case Token.molecular: + case Token.sasurface: + case Token.solvent: + if (modelIndex < 0) + error(ERROR_multipleModelsDisplayedNotOK, "ISOSURFACE " + + theToken.value); + if (bsSelect == null) { + bsSelect = viewer.getSelectionSet(false); + bsSelect.and(viewer.getModelUndeletedAtomsBitSet(modelIndex)); + addShapeProperty(propertyList, "select", bsSelect); + } surfaceObjectSeen = true; - propertyName = "molecular"; - propertyValue = new Float(1.4); - sbCommand.append(" molecular"); + float radius; + if (theTok == Token.molecular) { + propertyName = "molecular"; + sbCommand.append(" molecular"); + radius = 1.4f; + } else { + addShapeProperty(propertyList, "bsSolvent", + lookupIdentifierValue("solvent")); + propertyName = (theTok == Token.sasurface ? "sasurface" : "solvent"); + sbCommand.append(" ").append(theToken.value); + radius = (isFloatParameter(i + 1) ? floatParameter(++i) : viewer + .getSolventProbeRadius()); + sbCommand.append(" ").append(radius); + } + propertyValue = Float.valueOf(radius); break; case Token.object: case Token.obj: @@ -15647,21 +15696,6 @@ propertyValue = Boolean.TRUE; sbCommand.append(" squared"); break; - case Token.variable: - propertyName = (dataUse == null ? "property" : dataUse); - String vname = parameterAsString(++i); - int nAtoms = viewer.getAtomCount(); - if (vname.length() == 0) { - data = floatParameterSet(i, nAtoms, nAtoms); - } else { - data = new float[nAtoms]; - if (!isSyntaxCheck) - Parser.parseStringInfestedFloatArray("" - + getParameter(vname, false), null, data); - } - propertyValue = data; - sbCommand.append(" variable \"\" ").append(Escape.escape(data)); - break; case Token.string: String filename = parameterAsString(i); boolean firstPass = (!surfaceObjectSeen && !planeSeen); @@ -15814,13 +15848,6 @@ break; } idSeen = (theTok != Token.delete); - if (propertyName == "property" && !surfaceObjectSeen) { - surfaceObjectSeen = true; - addShapeProperty(propertyList, "bsSolvent", - lookupIdentifierValue("solvent")); - propertyName = "sasurface"; - propertyValue = new Float(0); - } if (isWild && surfaceObjectSeen) error(ERROR_invalidArgument); if (propertyName != null) Modified: branches/v12_0/Jmol/src/org/jmol/shapesurface/Isosurface.java =================================================================== --- branches/v12_0/Jmol/src/org/jmol/shapesurface/Isosurface.java 2010-08-30 20:17:18 UTC (rev 14197) +++ branches/v12_0/Jmol/src/org/jmol/shapesurface/Isosurface.java 2010-08-30 20:30:15 UTC (rev 14198) @@ -1210,6 +1210,8 @@ Point3f[] centers = m.getCenters(); for (int j = centers.length; --j >= 0; ) { Point3f v = centers[j]; + if (v == null) + continue; int d2 = coordinateInRange(x, y, v, dmin2, ptXY); if (d2 >= 0) { if (ptXY.z < minz) { Modified: branches/v12_0/Jmol/src/org/jmol/shapesurface/IsosurfaceMesh.java =================================================================== --- branches/v12_0/Jmol/src/org/jmol/shapesurface/IsosurfaceMesh.java 2010-08-30 20:17:18 UTC (rev 14197) +++ branches/v12_0/Jmol/src/org/jmol/shapesurface/IsosurfaceMesh.java 2010-08-30 20:30:15 UTC (rev 14198) @@ -224,10 +224,13 @@ return centers; centers = new Point3f[polygonCount]; for (int i = 0; i < polygonCount; i++) { + int[] pi = polygonIndexes[i]; + if (pi == null) + continue; Point3f pt = centers[i] = new Point3f(); - pt.add(vertices[polygonIndexes[i][0]]); - pt.add(vertices[polygonIndexes[i][1]]); - pt.add(vertices[polygonIndexes[i][2]]); + pt.add(vertices[pi[0]]); + pt.add(vertices[pi[1]]); + pt.add(vertices[pi[2]]); pt.scale(1/3f); } return centers; @@ -471,6 +474,8 @@ polygonColixes = new short[polygonCount]; for (int i = 0; i < polygonCount; i++) { int[] pi = polygonIndexes[i]; + if (pi == null) + continue; polygonColixes[i] = defaultColix; float v = (vertexValues[pi[0]] + vertexValues[pi[1]] + vertexValues[pi[2]])/3; //System.out.println(i + " " + v); Modified: branches/v12_0/Jmol/src/org/jmol/viewer/Jmol.properties =================================================================== --- branches/v12_0/Jmol/src/org/jmol/viewer/Jmol.properties 2010-08-30 20:17:18 UTC (rev 14197) +++ branches/v12_0/Jmol/src/org/jmol/viewer/Jmol.properties 2010-08-30 20:30:15 UTC (rev 14198) @@ -4,6 +4,8 @@ version=12.0.11_dev +# bug fix: isosurface "t.jvxl" map property temperature nonfunctional +# bug fix: isosurface PROPERTY ("VDW 100%" implied) not working # code: rewrite of calculateHydrogen/hybridization code # bug fix: WRITE xxx should do SHOW not clipboard for application # bug fix: % at end of line acts as a line continuation Modified: branches/v12_0/Jmol/src/org/jmol/viewer/Viewer.java =================================================================== --- branches/v12_0/Jmol/src/org/jmol/viewer/Viewer.java 2010-08-30 20:17:18 UTC (rev 14197) +++ branches/v12_0/Jmol/src/org/jmol/viewer/Viewer.java 2010-08-30 20:30:15 UTC (rev 14198) @@ -2425,6 +2425,11 @@ modelSet.setIteratorForAtom(iterator, -1, atomIndex, distance); } + public void setIteratorForPoint(AtomIndexIterator iterator, int modelIndex, Point3f pt, + float distance) { + modelSet.setIteratorForPoint(iterator, modelIndex, pt, distance); + } + public void fillAtomData(AtomData atomData, int mode) { atomData.programInfo = "Jmol Version " + getJmolVersion(); atomData.fileName = getFileName(); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |