From: <ha...@us...> - 2010-12-26 13:18:28
|
Revision: 14901 http://jmol.svn.sourceforge.net/jmol/?rev=14901&view=rev Author: hansonr Date: 2010-12-26 13:18:20 +0000 (Sun, 26 Dec 2010) Log Message: ----------- VERSION Modified Paths: -------------- trunk/Jmol/src/org/jmol/jvxl/data/MeshData.java trunk/Jmol/src/org/jmol/jvxl/readers/IsoShapeReader.java trunk/Jmol/src/org/jmol/jvxl/readers/IsoSolventReader.java trunk/Jmol/src/org/jmol/jvxl/readers/Parameters.java trunk/Jmol/src/org/jmol/script/ScriptEvaluator.java trunk/Jmol/src/org/jmol/script/Token.java trunk/Jmol/src/org/jmol/shapesurface/Isosurface.java trunk/Jmol/src/org/jmol/shapesurface/IsosurfaceMesh.java trunk/Jmol/src/org/jmol/smiles/SmilesBond.java trunk/Jmol/src/org/jmol/smiles/SmilesMeasure.java trunk/Jmol/src/org/jmol/viewer/Jmol.properties trunk/Jmol/src/org/openscience/jmol/app/jmolpanel/AppConsole.java Modified: trunk/Jmol/src/org/jmol/jvxl/data/MeshData.java =================================================================== --- trunk/Jmol/src/org/jmol/jvxl/data/MeshData.java 2010-12-26 05:08:39 UTC (rev 14900) +++ trunk/Jmol/src/org/jmol/jvxl/data/MeshData.java 2010-12-26 13:18:20 UTC (rev 14901) @@ -118,6 +118,7 @@ import java.util.Comparator; import javax.vecmath.Point3f; +import javax.vecmath.Vector3f; import org.jmol.util.MeshSurface; @@ -283,6 +284,48 @@ return (val1 >= 0 && val2 >= 0 && val3 >= 0 || val1 <= 0 && val2 <= 0 && val3 <= 0); } + + public Object calculateVolumes() { + // TODO + return null; + } + + + public Object calculateVolumeOrArea(int thisSet, boolean isArea, boolean getSets) { + if (getSets) + getSurfaceSet(); + boolean justOne = (nSets == 0 || thisSet >= 0); + int n = (justOne ? 1 : nSets); + double[] v = new double[n]; + Vector3f vAB = new Vector3f(); + Vector3f vAC = new Vector3f(); + Vector3f vTemp = new Vector3f(); + for (int i = polygonCount; --i >= 0;) { + if (!setABC(i)) + continue; + int iSet = (nSets == 0 ? 0 : vertexSets[iA]); + if (thisSet >= 0 && iSet != thisSet) + continue; + if (isArea) { + vAB.sub(vertices[iB], vertices[iA]); + vAC.sub(vertices[iC], vertices[iA]); + vTemp.cross(vAB, vAC); + v[justOne ? 0 : iSet] += vTemp.length(); + } else { + // volume + vAB.set(vertices[iB]); + vAC.set(vertices[iC]); + vTemp.cross(vAB, vAC); + vAC.set(vertices[iA]); + v[justOne ? 0 : iSet] += vAC.dot(vTemp); + } + } + for (int i = 0; i < n; i++) + v[i] /= 6; + if (justOne) + return Float.valueOf((float) v[0]); + return v; + } } Modified: trunk/Jmol/src/org/jmol/jvxl/readers/IsoShapeReader.java =================================================================== --- trunk/Jmol/src/org/jmol/jvxl/readers/IsoShapeReader.java 2010-12-26 05:08:39 UTC (rev 14900) +++ trunk/Jmol/src/org/jmol/jvxl/readers/IsoShapeReader.java 2010-12-26 13:18:20 UTC (rev 14901) @@ -214,11 +214,13 @@ if (params.isSquared) min = Math.sqrt(min / 2); } + float r0 = 0; for (radius = 100; radius > 0; radius--) { - if (Math.abs(radialPart(radius)) >= min) - break; + double d = radialPart(radius); + if (Math.abs(d) >= min && r0 == 0) + r0 = radius; } - radius += 1; + radius = r0 + 1; if (isAnisotropic) { float aMax = 0; for (int i = 3; --i >= 0;) Modified: trunk/Jmol/src/org/jmol/jvxl/readers/IsoSolventReader.java =================================================================== --- trunk/Jmol/src/org/jmol/jvxl/readers/IsoSolventReader.java 2010-12-26 05:08:39 UTC (rev 14900) +++ trunk/Jmol/src/org/jmol/jvxl/readers/IsoSolventReader.java 2010-12-26 13:18:20 UTC (rev 14901) @@ -239,6 +239,27 @@ params.cappingObject = null; } } + + @Override + protected void postProcessVertices() { + if (isMsMs) { + // creates two surfaces, one inside, one outside -- + // the inside one will have negative volume. + // TODO -- note that this removes any cavity as well, + // and in principal will leave a cavity's inside cavity. + if (meshDataServer == null) + return; //can't do this without help! + meshDataServer.fillMeshData(meshData, MeshData.MODE_GET_VERTICES, null); + double[] volumes = (double[]) meshData.calculateVolumeOrArea(-1, false, true); + int nSets = meshData.nSets; + for (int i = 0; i < nSets; i++) + if (volumes[i] < 0) + meshData.invalidateSurfaceSet(i); + updateSurfaceData(); + meshDataServer.fillMeshData(meshData, MeshData.MODE_PUT_SETS, null); + meshData = new MeshData(); + } + } private void generateSolventCavity() { //we have a ring of dots around the model. @@ -306,8 +327,11 @@ final Point3f ptXyzTemp = new Point3f(); private AtomIndexIterator iter; - + private boolean isMsMs; + + void generateSolventCubeMsMs() { + isMsMs = true; volumeData.getYzCount(); resetVoxelData(Float.MAX_VALUE); if (dataType == Parameters.SURFACE_NOMAP) @@ -603,9 +627,9 @@ if (type < 10) nFaces[type < 0 ? 0 : type + 1]++; } - for (int i = 0; i < 10; i++) - System.out.print((i-1) + ": " + nFaces[i] + "\t"); - System.out.println("edge types"); + //for (int i = 0; i < 10; i++) + // System.out.print((i-1) + ": " + nFaces[i] + "\t"); + //System.out.println("edge types"); } private Point3f ptY0 = new Point3f(); Modified: trunk/Jmol/src/org/jmol/jvxl/readers/Parameters.java =================================================================== --- trunk/Jmol/src/org/jmol/jvxl/readers/Parameters.java 2010-12-26 05:08:39 UTC (rev 14900) +++ trunk/Jmol/src/org/jmol/jvxl/readers/Parameters.java 2010-12-26 13:18:20 UTC (rev 14901) @@ -416,7 +416,7 @@ float[] anisoB; public void setEllipsoid(float[] bList) { anisoB = bList; - for (int i = 0; i < 6; i++)System.out.print(bList[i] + " ");System.out.println( " in Parameters setEllipsoid" + center); + //for (int i = 0; i < 6; i++)System.out.print(bList[i] + " ");System.out.println( " in Parameters setEllipsoid" + center); dataType = SURFACE_ELLIPSOID3; distance = 0.3f * (Float.isNaN(scale) ? 1f : scale); cutoff = Float.MIN_VALUE; Modified: trunk/Jmol/src/org/jmol/script/ScriptEvaluator.java =================================================================== --- trunk/Jmol/src/org/jmol/script/ScriptEvaluator.java 2010-12-26 05:08:39 UTC (rev 14900) +++ trunk/Jmol/src/org/jmol/script/ScriptEvaluator.java 2010-12-26 13:18:20 UTC (rev 14901) @@ -16034,7 +16034,7 @@ sbCommand.append(" ").append(radius); } propertyValue = Float.valueOf(radius); - if (optParameterAsString(i + 1).equalsIgnoreCase("full")) { + if (tokAt(i + 1) == Token.full) { addShapeProperty(propertyList, "doFullMolecular", null); sbCommand.append(" full"); i++; Modified: trunk/Jmol/src/org/jmol/script/Token.java =================================================================== --- trunk/Jmol/src/org/jmol/script/Token.java 2010-12-26 05:08:39 UTC (rev 14900) +++ trunk/Jmol/src/org/jmol/script/Token.java 2010-12-26 13:18:20 UTC (rev 14901) @@ -1081,10 +1081,11 @@ final static int from = misc | 128;// new public final static int front = misc | 130; final static int frontedges = misc | 132;// new - public final static int frontlit = misc | 134; + public final static int frontlit = misc | 134; public final static int frontonly = misc | 136; - final static int fullplane = misc | 138;// new - public final static int fullylit = misc | 140; + final static int full = misc | 137;// new + final static int fullplane = misc | 138;// new + public final static int fullylit = misc | 140; final static int functionxy = misc | 142;// new final static int functionxyz = misc | 144;// new final static int gridpoints = misc | 146;// new @@ -1921,6 +1922,7 @@ "fps", new Token(fps), "from", new Token(from), "frontEdges", new Token(frontedges), + "full", new Token(full), "fullPlane", new Token(fullplane), "functionXY", new Token(functionxy), "functionXYZ", new Token(functionxyz), Modified: trunk/Jmol/src/org/jmol/shapesurface/Isosurface.java =================================================================== --- trunk/Jmol/src/org/jmol/shapesurface/Isosurface.java 2010-12-26 05:08:39 UTC (rev 14900) +++ trunk/Jmol/src/org/jmol/shapesurface/Isosurface.java 2010-12-26 13:18:20 UTC (rev 14901) @@ -561,9 +561,9 @@ if (property == "moNumber") return Integer.valueOf(moNumber); if (property == "area") - return (thisMesh == null ? new Float(Float.NaN) : thisMesh.calculateArea()); + return (thisMesh == null ? new Float(Float.NaN) : calculateVolumeOrArea(true)); if (property == "volume") - return (thisMesh == null ? new Float(Float.NaN) : thisMesh.calculateVolume()); + return (thisMesh == null ? new Float(Float.NaN) : calculateVolumeOrArea(false)); if (thisMesh == null) return null;//"no current isosurface"; if (property == "cutoff") @@ -587,6 +587,26 @@ return null; } + private Object calculateVolumeOrArea(boolean isArea) { + if (isArea) { + if (thisMesh.calculatedArea != null) + return thisMesh.calculatedArea; + } else { + if (thisMesh.calculatedVolume != null) + return thisMesh.calculatedVolume; + } + MeshData meshData = new MeshData(); + fillMeshData(meshData, MeshData.MODE_GET_VERTICES, null); + meshData.nSets = thisMesh.nSets; + meshData.vertexSets = thisMesh.vertexSets; + Object ret = meshData.calculateVolumeOrArea(thisMesh.thisSet, isArea, false); + if (isArea) + thisMesh.calculatedArea = ret; + else + thisMesh.calculatedVolume = ret; + return ret; + } + public static String getPolygonColorData(int ccount, short[] colixes) { if (colixes == null) return null; Modified: trunk/Jmol/src/org/jmol/shapesurface/IsosurfaceMesh.java =================================================================== --- trunk/Jmol/src/org/jmol/shapesurface/IsosurfaceMesh.java 2010-12-26 05:08:39 UTC (rev 14900) +++ trunk/Jmol/src/org/jmol/shapesurface/IsosurfaceMesh.java 2010-12-26 13:18:20 UTC (rev 14901) @@ -142,55 +142,6 @@ Graphics3D.getColixTranslucent(vertexColixes[i], isTranslucent, iLevel); } - Object calculateArea() { - if (calculatedArea != null) - return calculatedArea; - boolean justOne = (nSets == 0 || thisSet >= 0); - int n = (justOne ? 1 : nSets); - double[] v = new double[n]; - for (int i = polygonCount; --i >= 0;) { - if (!setABC(i)) - continue; - int iSet = (nSets == 0 ? 0 : vertexSets[iA]); - if (thisSet >= 0 && iSet != thisSet) - continue; - vAB.sub(vertices[iB], vertices[iA]); - vAC.sub(vertices[iC], vertices[iA]); - vTemp.cross(vAB, vAC); - v[justOne ? 0 : iSet] += vTemp.length(); - } - for (int i = 0; i < n; i++) - v[i] /= 2; - if (justOne) - return calculatedArea = Float.valueOf((float) v[0]); - return calculatedArea = v; - } - - Object calculateVolume() { - if (calculatedVolume != null) - return calculatedVolume; - boolean justOne = (nSets == 0 || thisSet >= 0); - int n = (justOne ? 1 : nSets); - double[] v = new double[n]; - for (int i = polygonCount; --i >= 0;) { - if (!setABC(i)) - continue; - int iSet = (nSets == 0 ? 0 : vertexSets[iA]); - if (thisSet >= 0 && iSet != thisSet) - continue; - vAB.set(vertices[iB]); - vAC.set(vertices[iC]); - vTemp.cross(vAB, vAC); - vAC.set(vertices[iA]); - v[justOne ? 0 : iSet] += vAC.dot(vTemp); - } - for (int i = 0; i < n; i++) - v[i] /= 6; - if (justOne) - return calculatedVolume = Float.valueOf((float) v[0]); - return calculatedVolume = v; - } - int thisSet = -1; @Override Modified: trunk/Jmol/src/org/jmol/smiles/SmilesBond.java =================================================================== --- trunk/Jmol/src/org/jmol/smiles/SmilesBond.java 2010-12-26 05:08:39 UTC (rev 14900) +++ trunk/Jmol/src/org/jmol/smiles/SmilesBond.java 2010-12-26 13:18:20 UTC (rev 14901) @@ -262,7 +262,6 @@ } void switchAtoms() { - System.out.println("FIXING BOND " + this); SmilesAtom a = atom1; atom1 = atom2; atom2 = a; Modified: trunk/Jmol/src/org/jmol/smiles/SmilesMeasure.java =================================================================== --- trunk/Jmol/src/org/jmol/smiles/SmilesMeasure.java 2010-12-26 05:08:39 UTC (rev 14900) +++ trunk/Jmol/src/org/jmol/smiles/SmilesMeasure.java 2010-12-26 13:18:20 UTC (rev 14901) @@ -77,9 +77,9 @@ boolean check() { for (int i = 0; i < type; i++) { int iAtom = search.patternAtoms[indices[i]].getMatchingAtom(); - System.out.print(iAtom + "-"); + //System.out.print(iAtom + "-"); points[i] = (Point3f) search.jmolAtoms[iAtom]; - System.out.println(points[i]); + //System.out.println(points[i]); } float d = 0; switch (type) { @@ -96,7 +96,7 @@ d = search.v.vTemp1.angle(search.v.vTemp2) / radiansPerDegree * (search.v.vNorm1.dot(search.v.vNorm2) < 0 ? 1 : -1); break; } - System.out.println(type + " " + min + " " + max + " " + d + " " + isNot); + //System.out.println(type + " " + min + " " + max + " " + d + " " + isNot); return ((d < min || d > max) == isNot); } Modified: trunk/Jmol/src/org/jmol/viewer/Jmol.properties =================================================================== --- trunk/Jmol/src/org/jmol/viewer/Jmol.properties 2010-12-26 05:08:39 UTC (rev 14900) +++ trunk/Jmol/src/org/jmol/viewer/Jmol.properties 2010-12-26 13:18:20 UTC (rev 14901) @@ -1,8 +1,10 @@ # Developers: to add a description of changes you have made, # add it on a line starting with # below the "version=..." line -version=12.1.27_dev +version=12.1.27 +# code: System.out.println comments out +# new feature: isosurface molecular FULL # new feature: isosurface solvent [optionalRadius default:1.2] FULL # -- very fast solvent excluded surface # -- FULL option does reduced-surface analysis, @@ -10,7 +12,8 @@ # -- very close fit to MSMS; slightly smaller area and volume # -- replaces work from 12.1.24 # -- use isosurface SET 1 generally -# -- TODO: prevent irrelevant inner surface. +# -- irrelevant inner surface removed due to negative volume. +# TODO: test for this with cavities # bug fix: isosurface sets not sorted by number of vertices # new feature: isosurface MSMS xxxx.vert -- creates isosurface from MSMS output files # -- implies xxxx.face is also present in the same directory as xxxx.vert. Modified: trunk/Jmol/src/org/openscience/jmol/app/jmolpanel/AppConsole.java =================================================================== --- trunk/Jmol/src/org/openscience/jmol/app/jmolpanel/AppConsole.java 2010-12-26 05:08:39 UTC (rev 14900) +++ trunk/Jmol/src/org/openscience/jmol/app/jmolpanel/AppConsole.java 2010-12-26 13:18:20 UTC (rev 14901) @@ -399,6 +399,8 @@ //dumpUndo("undoRedo DONE"); } + private boolean dontsave; + private void undoSave(boolean incrementPtr) { if (undoButton == null) return; @@ -409,7 +411,8 @@ for (int i = undoPointer + 1; i <= MAXUNDO; i++) undoStack[i] = null; Logger.startTimer(); - undoStack[undoPointer] = (String) viewer.getProperty("readable", + try { + undoStack[undoPointer] = (String) viewer.getProperty("readable", "stateInfo", null); //shift stack if full if (incrementPtr && undoPointer == MAXUNDO) { @@ -418,7 +421,10 @@ undoStack[MAXUNDO] = null; } else if (incrementPtr) undoPointer++; - if (Logger.checkTimer(null) > 1000) { + } catch (Error e) { + dontsave = true; + } + if (dontsave || Logger.checkTimer(null) > 1000) { //viewer.setBooleanProperty("undo", false); //undoClear(); Logger.info("command processing slow; undo disabled"); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |