From: <ha...@us...> - 2008-07-08 15:58:59
|
Revision: 9573 http://jmol.svn.sourceforge.net/jmol/?rev=9573&view=rev Author: hansonr Date: 2008-07-08 08:58:55 -0700 (Tue, 08 Jul 2008) Log Message: ----------- version=11.5.46_dev # new feature: isosurface functionXY can be used for mapping. Modified Paths: -------------- trunk/Jmol/src/org/jmol/jvxl/calc/MarchingSquares.java trunk/Jmol/src/org/jmol/jvxl/readers/IsoFxyReader.java trunk/Jmol/src/org/jmol/jvxl/readers/Parameters.java trunk/Jmol/src/org/jmol/jvxl/readers/SurfaceGenerator.java trunk/Jmol/src/org/jmol/shape/Mesh.java trunk/Jmol/src/org/jmol/shape/MeshCollection.java trunk/Jmol/src/org/jmol/shapespecial/Isosurface.java trunk/Jmol/src/org/jmol/viewer/Eval.java trunk/Jmol/src/org/jmol/viewer/Jmol.properties trunk/Jmol/src/org/jmol/viewer/Viewer.java trunk/Jmol/src/org/openscience/jmol/app/Jmol.java Modified: trunk/Jmol/src/org/jmol/jvxl/calc/MarchingSquares.java =================================================================== --- trunk/Jmol/src/org/jmol/jvxl/calc/MarchingSquares.java 2008-07-08 14:39:14 UTC (rev 9572) +++ trunk/Jmol/src/org/jmol/jvxl/calc/MarchingSquares.java 2008-07-08 15:58:55 UTC (rev 9573) @@ -272,9 +272,10 @@ * note that this may be out of the actual range of data * */ - planarOrigin.set(0, 0, 0); - if (contourVertexCount == 0) + if (contourVertexCount == 0) { + planarOrigin.set(0, 0, 0); return; + } float minX = Float.MAX_VALUE; float minY = Float.MAX_VALUE; Modified: trunk/Jmol/src/org/jmol/jvxl/readers/IsoFxyReader.java =================================================================== --- trunk/Jmol/src/org/jmol/jvxl/readers/IsoFxyReader.java 2008-07-08 14:39:14 UTC (rev 9572) +++ trunk/Jmol/src/org/jmol/jvxl/readers/IsoFxyReader.java 2008-07-08 15:58:55 UTC (rev 9573) @@ -40,7 +40,7 @@ protected void setup() { //isAngstroms = params.isAngstroms; - isPlanarMapping = (params.thePlane != null); + isPlanarMapping = (params.thePlane != null || params.state == SurfaceGenerator.STATE_DATA_COLORED); functionName = (String) params.functionXYinfo.get(0); jvxlFileHeaderBuffer = new StringBuffer(); jvxlFileHeaderBuffer.append("functionXY\n").append(functionName).append("\n"); Modified: trunk/Jmol/src/org/jmol/jvxl/readers/Parameters.java =================================================================== --- trunk/Jmol/src/org/jmol/jvxl/readers/Parameters.java 2008-07-08 14:39:14 UTC (rev 9572) +++ trunk/Jmol/src/org/jmol/jvxl/readers/Parameters.java 2008-07-08 15:58:55 UTC (rev 9573) @@ -215,6 +215,7 @@ solventAtomRadiusFactor = 1; solventAtomRadiusOffset = 0; solventExtendedAtomRadius = 0; + state = 0; thePlane = null; theProperty = null; thisContour = -1; @@ -225,7 +226,8 @@ } String calculationType = ""; - + int state = 0; + //solvent/molecular-related: boolean addHydrogens; float solventRadius; @@ -364,8 +366,8 @@ cutoff = Float.MIN_VALUE; isCutoffAbsolute = false; isSilent = !logMessages; - script = " center " + Escape.escape(center) + " SPHERE " - + radius; + //script = " center " + Escape.escape(center) + " SPHERE " + // + radius + ";"; } void setEllipsoid(Point4f v) { @@ -375,9 +377,9 @@ cutoff = Float.MIN_VALUE; isCutoffAbsolute = false; isSilent = !logMessages; - script = " center " + Escape.escape(center) - + (Float.isNaN(scale) ? "" : " scale " + scale) + " ELLIPSOID {" + v.x - + " " + v.y + " " + v.z + " " + v.w + "}"; + //script = " center " + Escape.escape(center) + // + (Float.isNaN(scale) ? "" : " scale " + scale) + " ELLIPSOID {" + v.x + //+ " " + v.y + " " + v.z + " " + v.w + "};"; } float[] anisoB; @@ -393,9 +395,9 @@ center.set(0, 0, 0); if (resolution == Float.MAX_VALUE) resolution = 6; - script = " center " + Escape.escape(center) - + (Float.isNaN(scale) ? "" : " scale " + scale) + " ELLIPSOID {" + bList[0] - + " " + bList[1] + " " + bList[2] + " " + bList[3] + " " + bList[4] + " " + bList[5] + "}"; + //script = " center " + Escape.escape(center) + // + (Float.isNaN(scale) ? "" : " scale " + scale) + " ELLIPSOID {" + bList[0] + //+ " " + bList[1] + " " + bList[2] + " " + bList[3] + " " + bList[4] + " " + bList[5] + "};"; } void setLobe(Point4f v) { @@ -409,7 +411,7 @@ isSilent = !logMessages; script = " center " + Escape.escape(center) + (Float.isNaN(scale) ? "" : " scale " + scale) + " LOBE {" + v.x + " " - + v.y + " " + v.z + " " + v.w + "}"; + + v.y + " " + v.z + " " + v.w + "};"; } String lcaoType; @@ -647,6 +649,7 @@ Point4f thePlane; boolean isContoured; + int nContours; int thisContour; boolean contourFromZero; Modified: trunk/Jmol/src/org/jmol/jvxl/readers/SurfaceGenerator.java =================================================================== --- trunk/Jmol/src/org/jmol/jvxl/readers/SurfaceGenerator.java 2008-07-08 14:39:14 UTC (rev 9572) +++ trunk/Jmol/src/org/jmol/jvxl/readers/SurfaceGenerator.java 2008-07-08 15:58:55 UTC (rev 9573) @@ -282,9 +282,9 @@ return jvxlData.wasCubic; } - private final static int STATE_INITIALIZED = 1; - private final static int STATE_DATA_READ = 2; - private final static int STATE_DATA_COLORED = 3; + public final static int STATE_INITIALIZED = 1; + public final static int STATE_DATA_READ = 2; + public final static int STATE_DATA_COLORED = 3; ////////////////////////////////////////////////////////////// @@ -319,7 +319,7 @@ params.script = (String) value; return false; //more to do } - + if ("finalize" == propertyName) { initializeIsosurface(); return true; @@ -509,7 +509,7 @@ propertyName = "mapColor"; } else { colorEncoder.setColorScheme(colorScheme); - if(state == STATE_DATA_COLORED) + if (state == STATE_DATA_COLORED) voxelReader.applyColorScale(); return true; } @@ -612,7 +612,6 @@ if ("plane" == propertyName) { params.setPlane((Point4f) value); -// ++state; return true; } @@ -649,8 +648,7 @@ else if (value instanceof float[]) params.setEllipsoid((float[]) value); else - return true; - // params.setEllipsoid((Object[]) value); + return true; voxelReader = new IsoShapeReader(this, params.distance); generateSurface(); return true; @@ -683,10 +681,9 @@ params.setFunctionXY((Vector) value); if (params.isContoured) volumeData.setPlaneParameters(new Point4f(0, 0, 1, 0)); //xy plane through origin - if (((String)params.functionXYinfo.get(0)).indexOf("_xyz") >= 0) { + if (((String) params.functionXYinfo.get(0)).indexOf("_xyz") >= 0) getFunctionZfromXY(); - } - generateSurface(); + processState(); return true; } @@ -699,7 +696,7 @@ if (++state != STATE_DATA_READ) return true; if (params.center.x == Float.MAX_VALUE) - params.center.set((Vector3f)value); + params.center.set((Vector3f) value); return false; } @@ -756,15 +753,15 @@ } params.colorBySets = true; } else { - if ((voxelReader = setFileData(value)) == null) { - Logger.error("Could not set the mapping data"); - return true; - } + if ((voxelReader = setFileData(value)) == null) { + Logger.error("Could not set the mapping data"); + return true; + } } mapSurface(value); return true; } - + // continue with operations in calling class... return false; } @@ -851,8 +848,11 @@ state++; if (++state != STATE_DATA_COLORED) return; + params.state = state; setReader(); params.doCapIsosurface = false; + //if (params.dataType == Parameters.SURFACE_FUNCTIONXY) + //params.thePlane = new Point4f(0, 0, 1, 0); if (params.thePlane != null) { params.cutoff = 0; voxelReader.createIsosurface(true);//but don't read volume data yet Modified: trunk/Jmol/src/org/jmol/shape/Mesh.java =================================================================== --- trunk/Jmol/src/org/jmol/shape/Mesh.java 2008-07-08 14:39:14 UTC (rev 9572) +++ trunk/Jmol/src/org/jmol/shape/Mesh.java 2008-07-08 15:58:55 UTC (rev 9573) @@ -166,7 +166,8 @@ public final Vector3f vAC = new Vector3f(); protected boolean haveCheckByte; - public Vector data; + public Vector data1; + public Vector data2; public void sumVertexNormals(Vector3f[] vectorSums) { final Vector3f vNormalizedNormal = new Vector3f(); Modified: trunk/Jmol/src/org/jmol/shape/MeshCollection.java =================================================================== --- trunk/Jmol/src/org/jmol/shape/MeshCollection.java 2008-07-08 14:39:14 UTC (rev 9572) +++ trunk/Jmol/src/org/jmol/shape/MeshCollection.java 2008-07-08 15:58:55 UTC (rev 9573) @@ -121,9 +121,9 @@ } if ("commandOption" == propertyName) { - String s = " # " + (String) value; + String s = "# " + (String) value; if (script.indexOf(s) < 0) - script += s; + script += " " + s; return; } @@ -422,14 +422,22 @@ cmd += "# MODEL({" + mesh.modelIndex + "})"; if (mesh.linkedMesh != null) cmd += " LINK"; - if (mesh.data != null) { - String name = ((String) mesh.data.elementAt(0)).toLowerCase(); + if (mesh.data1 != null) { + String name = ((String) mesh.data1.elementAt(0)).toLowerCase(); if (name.indexOf("data2d_") != 0) name = "data2d_" + name; name = TextFormat.simpleReplace(name, "_xyz", "_"); - cmd = Escape.encapsulateData(name, mesh.data.elementAt(5)) + cmd = Escape.encapsulateData(name, mesh.data1.elementAt(5)) + " " + cmd + "# DATA=\"" + name + "\""; } + if (mesh.data2 != null) { + String name = ((String) mesh.data2.elementAt(0)).toLowerCase(); + if (name.indexOf("data2d_") != 0) + name = "data2d_" + name; + name = TextFormat.simpleReplace(name, "_xyz", "_"); + cmd = Escape.encapsulateData(name, mesh.data2.elementAt(5)) + + " " + cmd + "# DATA2=\"" + name + "\""; + } if (mesh.modelIndex >= 0 && modelCount > 1) appendCmd(s, "frame " + viewer.getModelNumberDotted(mesh.modelIndex)); Modified: trunk/Jmol/src/org/jmol/shapespecial/Isosurface.java =================================================================== --- trunk/Jmol/src/org/jmol/shapespecial/Isosurface.java 2008-07-08 14:39:14 UTC (rev 9572) +++ trunk/Jmol/src/org/jmol/shapespecial/Isosurface.java 2008-07-08 15:58:55 UTC (rev 9573) @@ -270,6 +270,11 @@ moNumber = ((Integer) value).intValue(); } + if (propertyName == "functionXY") { + if (sg.getState() == SurfaceGenerator.STATE_DATA_READ) + setScriptInfo(); // for script DATA1 + } + if ("center" == propertyName) { center.set((Point3f) value); } @@ -355,7 +360,7 @@ } return; } - + // processed by meshCollection setPropertySuper(propertyName, value, bs); @@ -739,7 +744,7 @@ String script = sg.getScript(); thisMesh.bitsets = null; if (script != null) { - if (script.charAt(0) == ' ') { + if (script.charAt(0) == ' ') { // lobe only script = myType + " " + thisMesh.thisID + script; } else if (sg.getIUseBitSets()) { thisMesh.bitsets = new BitSet[3]; @@ -749,7 +754,11 @@ } } thisMesh.scriptCommand = script; - thisMesh.data = (Vector) sg.getProperty("functionXYinfo", 0); + Vector v = (Vector) sg.getProperty("functionXYinfo", 0); + if (thisMesh.data1 == null) + thisMesh.data1 = v; + else + thisMesh.data2 = v; } private void setJvxlInfo() { Modified: trunk/Jmol/src/org/jmol/viewer/Eval.java =================================================================== --- trunk/Jmol/src/org/jmol/viewer/Eval.java 2008-07-08 14:39:14 UTC (rev 9572) +++ trunk/Jmol/src/org/jmol/viewer/Eval.java 2008-07-08 15:58:55 UTC (rev 9573) @@ -104,6 +104,7 @@ } private String thisCommand; + private String fullCommand; private short[] lineNumbers; private int[] lineIndices; private Token[][] aatoken; @@ -862,12 +863,13 @@ // when checking scripts, we can't check statments // containing @{...} if (!setStatement(pc)) { - Logger.info(getCommand() + " -- STATEMENT CONTAINING @{} SKIPPED"); + Logger.info(getCommand(pc) + " -- STATEMENT CONTAINING @{} SKIPPED"); continue; } if (lineNumbers[pc] > lineEnd) break; - thisCommand = getCommand(); + thisCommand = getCommand(pc); + fullCommand = thisCommand + getNextComment(); iToken = 0; String script = viewer.getInterruptScript(); if (script != "") @@ -1320,12 +1322,13 @@ return lineNumbers[pc]; } - private String getCommand() { + private String getCommand(int pc) { + if (pc >= lineIndices.length) + return ""; int ichBegin = lineIndices[pc]; int ichEnd = (pc + 1 == lineIndices.length || lineIndices[pc + 1] == 0 ? script .length() : lineIndices[pc + 1]); - String s = ""; try { s = script.substring(ichBegin, ichEnd); @@ -1365,7 +1368,7 @@ strbufLog.append(s).append(statementAsString()); viewer.scriptStatus(strbufLog.toString()); } else { - String cmd = getCommand(); + String cmd = getCommand(pc); if (cmd.length() > 0 && cmd.lastIndexOf(";") == cmd.length() - 1) cmd = cmd.substring(0, cmd.length() - 1); viewer.scriptStatus(cmd); @@ -9491,8 +9494,8 @@ } private String extractCommandOption(String name) { - int i = thisCommand.indexOf(name + "="); - return (i < 0 ? null : Parser.getNextQuotedString(thisCommand, i)); + int i = fullCommand.indexOf(name + "="); + return (i < 0 ? null : Parser.getNextQuotedString(fullCommand, i)); } private void draw() throws ScriptException { @@ -10316,14 +10319,14 @@ //handle isosurface/mo/pmesh delete and id delete here - setShapeProperty(iShape, "init", thisCommand); + setShapeProperty(iShape, "init", fullCommand); iToken = 0; if (tokAt(1) == Token.delete || tokAt(2) == Token.delete && tokAt(++iToken) == Token.all) { setShapeProperty(iShape, "delete", null); iToken += 2; if (statementLength > iToken) { - setShapeProperty(iShape, "init", thisCommand); + setShapeProperty(iShape, "init", fullCommand); setShapeProperty(iShape, "thisID", JmolConstants.PREVIOUS_MESH_ID); } return; @@ -10336,6 +10339,11 @@ } } + private String getNextComment() { + String nextCommand = getCommand(pc + 1); + return (nextCommand.startsWith("#") ? nextCommand : ""); + } + private boolean listIsosurface(int iShape) throws ScriptException { if (getToken(1).value instanceof String[]) // not just the word "list" return false; @@ -10355,6 +10363,7 @@ boolean surfaceObjectSeen = false; boolean planeSeen = false; boolean isCavity = false; + boolean isFxy = false; float[] nlmZ = new float[5]; float[] data = null; int nFiles = 0; @@ -10396,8 +10405,8 @@ case Token.property: setShapeProperty(iShape, "propertySmoothing", viewer .getIsosurfacePropertySmoothing() ? Boolean.TRUE : Boolean.FALSE); + str = parameterAsString(i); propertyName = "property"; - str = parameterAsString(i); if (!isCavity && str.toLowerCase().indexOf("property_") == 0) { data = new float[viewer.getAtomCount()]; if (isSyntaxCheck) @@ -10408,8 +10417,8 @@ propertyValue = data; break; } + int tokProperty = getToken(++i).tok; int atomCount = viewer.getAtomCount(); - int tokProperty = getToken(++i).tok; data = (isCavity ? new float[0] : new float[atomCount]); if (isCavity)//not implemented: && tokProperty != Token.surfacedistance) error(ERROR_invalidArgument); @@ -10724,14 +10733,12 @@ if (str.equalsIgnoreCase("functionXY")) { // isosurface functionXY "functionName"|"data2d_xxxxx" // {origin} {ni ix iy iz} {nj jx jy jz} {nk kx ky kz} - - surfaceObjectSeen = true; Vector v = new Vector(); if (getToken(++i).tok != Token.string) - error(ERROR_invalidArgument); + error(ERROR_what, "functionXY must be followed by a function name in quotes."); String fName = parameterAsString(i++); //override of function or data name when saved as a state - String dataName = extractCommandOption("# DATA"); + String dataName = extractCommandOption("# DATA" + (isFxy ? "2" : "")); if (dataName != null) fName = dataName; boolean isXYZ = (fName.indexOf("data2d_xyz") == 0); @@ -10760,20 +10767,20 @@ } if (fdata == null) { iToken = ptX; - error(ERROR_what,"fdata is null"); + error(ERROR_what,"fdata is null."); } if (fdata.length != nX && !isXYZ) { iToken = ptX; - error(ERROR_what,"fdata length is not correct: " + fdata.length + " " + nX); + error(ERROR_what,"fdata length is not correct: " + fdata.length + " " + nX + "."); } for (int j = 0; j < nX; j++) { if (fdata[j] == null) { iToken = ptY; - error(ERROR_what,"fdata[" + j + "] is null"); + error(ERROR_what,"fdata[" + j + "] is null."); } if (fdata[j].length != nY) { iToken = ptY; - error(ERROR_what,"fdata[" + j + "] is not the right length: " + fdata[j].length + " " + nY); + error(ERROR_what,"fdata[" + j + "] is not the right length: " + fdata[j].length + " " + nY + "."); } } v.addElement(fdata); //(5) = float[][] data @@ -10781,6 +10788,7 @@ i = iToken; propertyName = "functionXY"; propertyValue = v; + isFxy = surfaceObjectSeen = true; break; } if (str.equalsIgnoreCase("molecular")) { @@ -11202,7 +11210,7 @@ GT._("unrecognized {0} parameter"), // 39 GT._("unrecognized {0} parameter in Jmol state script (set anyway)"), // 40 GT._("unrecognized SHOW parameter -- use {0}"), // 41 - "{0}?", // 42 + "{0}", // 42 }; static final String SCRIPT_COMPLETED = "Script completed"; Modified: trunk/Jmol/src/org/jmol/viewer/Jmol.properties =================================================================== --- trunk/Jmol/src/org/jmol/viewer/Jmol.properties 2008-07-08 14:39:14 UTC (rev 9572) +++ trunk/Jmol/src/org/jmol/viewer/Jmol.properties 2008-07-08 15:58:55 UTC (rev 9573) @@ -3,6 +3,9 @@ version=11.5.46_dev +# new feature: isosurface functionXY can be used for mapping. +# +# bug fix: 11.5.39 could break isosurface/pmesh save/write state in certain cases. # bug fix: Popin.png in WebExport replaced, was too large, causing dialog box to default to too big on small screens. # bug fix: zap 2.1 for quaternion frame causes exception # bug fix: quaternion r derivative2 nonfunctional in 11.5.45 Modified: trunk/Jmol/src/org/jmol/viewer/Viewer.java =================================================================== --- trunk/Jmol/src/org/jmol/viewer/Viewer.java 2008-07-08 14:39:14 UTC (rev 9572) +++ trunk/Jmol/src/org/jmol/viewer/Viewer.java 2008-07-08 15:58:55 UTC (rev 9573) @@ -6391,14 +6391,23 @@ * @return nX by nY array of floating values */ public float[][] functionXY(String functionName, int nX, int nY) { - if (functionName.indexOf("file:") < 0) + String data = null; + if (functionName.indexOf("file:") == 0) + data = getFileAsString(functionName.substring(5)); + else if (functionName.indexOf("data2d_") != 0) return statusManager.functionXY(functionName, nX, nY); - String data = getFileAsString(functionName.substring(5)); nX = Math.abs(nX); nY = Math.abs(nY); + float[][] fdata; + if (data == null) { + fdata = getDataFloat2D(functionName); + if (fdata != null) + return fdata; + data = ""; + } + fdata = new float[nX][nY]; float[] f = new float[nX * nY]; Parser.parseFloatArray(data, null, f); - float[][] fdata = new float[nX][nY]; for (int i = 0, n = 0; i < nX; i++) for (int j = 0; j < nY; j++) fdata[i][j] = f[n++]; Modified: trunk/Jmol/src/org/openscience/jmol/app/Jmol.java =================================================================== --- trunk/Jmol/src/org/openscience/jmol/app/Jmol.java 2008-07-08 14:39:14 UTC (rev 9572) +++ trunk/Jmol/src/org/openscience/jmol/app/Jmol.java 2008-07-08 15:58:55 UTC (rev 9573) @@ -1922,7 +1922,19 @@ } public float[][] functionXY(String functionName, int nX, int nY) { - return new float[Math.abs(nX)][Math.abs(nY)]; // for user-defined isosurface functions (testing only -- bob hanson) + nX = Math.abs(nX); + nY = Math.abs(nY); + float[][] f = new float[nX][nY]; + boolean isSecond = (functionName.indexOf("2") >= 0); + + for (int i = nX; --i >= 0; ) + for (int j = nY; --j >= 0; ) { + f[i][j] = (isSecond ? (float) ((i + j - nX) / (2f)) : (float)Math.sqrt(Math.abs(i*i + j*j))/2f); + //if (i < 10 && j < 10) + //System.out.println(" functionXY " + i + " " + j + " " + f[i][j]); + } + + return f; // for user-defined isosurface functions (testing only -- bob hanson) } public Hashtable getRegistryInfo() { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |