Revision: 20687 http://sourceforge.net/p/jmol/code/20687 Author: hansonr Date: 2015-08-10 00:15:14 +0000 (Mon, 10 Aug 2015) Log Message: ----------- Jmol.___JmolVersion="14.3.15_2015.08.09"
bug fix: CML reader can fail (e.g. nsc244a.cml) code: refactoring of JmolDataManager Modified Paths: -------------- trunk/Jmol/src/org/jmol/adapter/readers/xml/XmlCmlReader.java trunk/Jmol/src/org/jmol/adapter/readers/xml/XmlReader.java trunk/Jmol/src/org/jmol/api/JmolDataManager.java trunk/Jmol/src/org/jmol/modelset/LabelToken.java trunk/Jmol/src/org/jmol/modelset/ModelLoader.java trunk/Jmol/src/org/jmol/script/ScriptExpr.java trunk/Jmol/src/org/jmol/scriptext/CmdExt.java trunk/Jmol/src/org/jmol/scriptext/IsoExt.java trunk/Jmol/src/org/jmol/scriptext/MathExt.java trunk/Jmol/src/org/jmol/util/Escape.java trunk/Jmol/src/org/jmol/viewer/DataManager.java trunk/Jmol/src/org/jmol/viewer/Jmol.properties trunk/Jmol/src/org/jmol/viewer/PropertyManager.java trunk/Jmol/src/org/jmol/viewer/StateCreator.java trunk/Jmol/src/org/jmol/viewer/Viewer.java Modified: trunk/Jmol/src/org/jmol/adapter/readers/xml/XmlCmlReader.java =================================================================== --- trunk/Jmol/src/org/jmol/adapter/readers/xml/XmlCmlReader.java 2015-08-08 21:47:59 UTC (rev 20686) +++ trunk/Jmol/src/org/jmol/adapter/readers/xml/XmlCmlReader.java 2015-08-10 00:15:14 UTC (rev 20687) @@ -292,12 +292,12 @@ if (atts.containsKey("atomRef1")) { breakOutBondTokens(atts.get("atomRef1")); for (int i = tokenCount; --i >= 0;) - bondArray[i].atomIndex1 = asc.getAtomIndex(tokens[i]); + bondArray[i].atomIndex1 = getAtomIndex(tokens[i]); } if (atts.containsKey("atomRef2")) { breakOutBondTokens(atts.get("atomRef2")); for (int i = tokenCount; --i >= 0;) - bondArray[i].atomIndex2 = asc.getAtomIndex(tokens[i]); + bondArray[i].atomIndex2 = getAtomIndex(tokens[i]); } } else if (name.equals("atomarray")) { state = MOLECULE_ATOM_ARRAY; @@ -442,6 +442,10 @@ } } + private int getAtomIndex(String label) { + return asc.getAtomIndex(isSerial ? label.substring(1) : label); + } + final private static String[] unitCellParamTags = { "a", "b", "c", "alpha", "beta", "gamma" }; Modified: trunk/Jmol/src/org/jmol/adapter/readers/xml/XmlReader.java =================================================================== --- trunk/Jmol/src/org/jmol/adapter/readers/xml/XmlReader.java 2015-08-08 21:47:59 UTC (rev 20686) +++ trunk/Jmol/src/org/jmol/adapter/readers/xml/XmlReader.java 2015-08-10 00:15:14 UTC (rev 20687) @@ -153,7 +153,7 @@ try { thisReader.processXml(this, saxReader); } catch (Exception e) { - return "Error reading XML: " + (parent.vwr.isJS ? e : e.getMessage()); + return "Error reading XML: " + ((parent == null ? vwr : parent.vwr).isJS ? e : e.getMessage()); } return null; } Modified: trunk/Jmol/src/org/jmol/api/JmolDataManager.java =================================================================== --- trunk/Jmol/src/org/jmol/api/JmolDataManager.java 2015-08-08 21:47:59 UTC (rev 20686) +++ trunk/Jmol/src/org/jmol/api/JmolDataManager.java 2015-08-10 00:15:14 UTC (rev 20687) @@ -9,11 +9,18 @@ public interface JmolDataManager { + public static final int DATA_TYPE_LAST = -2; public final static int DATA_TYPE_UNKNOWN = -1; public final static int DATA_TYPE_STRING = 0; public final static int DATA_TYPE_AF = 1; public final static int DATA_TYPE_AFF = 2; public final static int DATA_TYPE_AFFF = 3; + // indexes into Object[] data + public final static int DATA_LABEL = 0; + public final static int DATA_VALUE = 1; + public final static int DATA_SELECTION = 2; + public final static int DATA_TYPE = 3; + public final static int DATA_SAVE_IN_STATE = 4; // optional; defaults to TRUE JmolDataManager set(Viewer vwr); @@ -21,22 +28,16 @@ void clear(); - Object[] getData(String type); + void deleteModelAtoms(int firstAtomIndex, int nAtoms, BS bsDeleted); - float[][] getDataFloat2D(String label); + Object getData(String label, BS bsSelected, int dataType); - float[][][] getDataFloat3D(String label); + float getDataFloatAt(String label, int atomIndex); - float getDataFloat(String label, int atomIndex); - - float[] getDataFloatA(String label, BS bsSelected); - String getDefaultVdwNameOrData(VDW type, BS bs); - void deleteModelAtoms(int firstAtomIndex, int nAtoms, BS bsDeleted); + void setData(String type, Object[] data, int dataType, int ac, + int matchField, int matchFieldColumnCount, int dataField, + int dataFieldColumnCount); - void setData(String type, Object[] data, int arrayCount, int ac, - int matchField, int matchFieldColumnCount, int field, - int fieldColumnCount); - } Modified: trunk/Jmol/src/org/jmol/modelset/LabelToken.java =================================================================== --- trunk/Jmol/src/org/jmol/modelset/LabelToken.java 2015-08-08 21:47:59 UTC (rev 20686) +++ trunk/Jmol/src/org/jmol/modelset/LabelToken.java 2015-08-10 00:15:14 UTC (rev 20687) @@ -37,6 +37,7 @@ import javajs.util.SB; import javajs.util.T3; +import org.jmol.api.JmolDataManager; import org.jmol.script.SV; import org.jmol.script.T; import org.jmol.util.Edge; @@ -405,10 +406,10 @@ String propertyName = strFormat.substring(ich, ichClose).toLowerCase(); if (propertyName.startsWith("property_")) { lt.tok = T.data; - lt.data = vwr.getDataFloat(propertyName, null); + lt.data = vwr.getDataObj(propertyName, null, JmolDataManager.DATA_TYPE_AF); } else if (propertyName.startsWith("validation.")) { lt.tok = T.validation; - lt.data = vwr.getDataFloat("property_" + propertyName.substring(11), null); + lt.data = vwr.getDataObj("property_" + propertyName.substring(11), null, JmolDataManager.DATA_TYPE_AF); } else { T token = T.getTokenFromName(propertyName); if (token != null && isLabelPropertyTok(token.tok)) @@ -427,11 +428,11 @@ break; } String s = strFormat.substring(ich, ichCloseBracket); - lt.data = vwr.getDataFloat(s, null); + lt.data = vwr.getDataObj(s, null, JmolDataManager.DATA_TYPE_AF); // TODO untested j2s issue fix if (lt.data == null) { - lt.data = vwr.getData(s); - if (lt.data instanceof Object[]) {// either that or it is null + lt.data = vwr.getDataObj(s, null, JmolDataManager.DATA_TYPE_UNKNOWN); + if (lt.data != null) { lt.data = ((Object[]) lt.data)[1]; if (lt.data instanceof String) lt.data = PT.split((String) lt.data, "\n"); Modified: trunk/Jmol/src/org/jmol/modelset/ModelLoader.java =================================================================== --- trunk/Jmol/src/org/jmol/modelset/ModelLoader.java 2015-08-08 21:47:59 UTC (rev 20686) +++ trunk/Jmol/src/org/jmol/modelset/ModelLoader.java 2015-08-10 00:15:14 UTC (rev 20687) @@ -458,8 +458,8 @@ } key = "property_" + key.toLowerCase(); Logger.info("creating " + key + " for model " + ms.getModelName(i)); - vwr.setData(key, new Object[] { key, value, bs, Integer.valueOf(JmolDataManager.DATA_TYPE_UNKNOWN), Boolean.FALSE }, ms.ac, 0, - 0, Integer.MAX_VALUE, 0); + vwr.setData(key, new Object[] { key, value, bs, Integer.valueOf(JmolDataManager.DATA_TYPE_UNKNOWN), Boolean.FALSE }, + ms.ac, 0, 0, Integer.MAX_VALUE, 0); } } } @@ -839,7 +839,8 @@ Logger.info(nRead + " atoms created"); } - private void addJmolDataProperties(Model m, Map<String, float[]> jmolDataProperties) { + private void addJmolDataProperties(Model m, + Map<String, float[]> jmolDataProperties) { if (jmolDataProperties == null) return; BS bs = m.bsAtoms; @@ -849,17 +850,28 @@ float[] data = e.getValue(); if (data.length != nAtoms) return; - if (PT.isOneOf(key, ";x;y;z;")) + int tok = (key.startsWith("property_") ? T.property : T + .getTokFromName(key)); + switch (tok) { + default: + if (T.tokAttr(tok, T.settable)) { + vwr.setAtomProperty(bs, tok, 0, 0, null, data, null); + break; + } + // not settable -- must encode as property_ + //$FALL-THROUGH$ + case T.x: + case T.y: + case T.z: key = "property_" + key; - if (key.startsWith("property_")) { + tok = T.property; + //$FALL-THROUGH$ + case T.property: + // must create data set vwr.setData( key, new Object[] { key, data, bs, Integer.valueOf(JmolDataManager.DATA_TYPE_AF) }, 0, 0, 0, 0, 0); - } else { - int tok = T.getTokFromName(key); - if (T.tokAttr(tok, T.settable)) - vwr.setAtomProperty(bs, tok, 0, 0, null, data, null); } } } Modified: trunk/Jmol/src/org/jmol/script/ScriptExpr.java =================================================================== --- trunk/Jmol/src/org/jmol/script/ScriptExpr.java 2015-08-08 21:47:59 UTC (rev 20686) +++ trunk/Jmol/src/org/jmol/script/ScriptExpr.java 2015-08-10 00:15:14 UTC (rev 20687) @@ -966,7 +966,7 @@ if (pc + 2 == code.length) invArg(); if (!chk) - data = vwr.getDataFloat((String) code[++pc].value, null); + data = (float[]) vwr.getDataObj((String) code[++pc].value, null, JmolDataManager.DATA_TYPE_AF); } if (++pc == code.length) invArg(); // compiler would not let this happen, actually @@ -1647,7 +1647,7 @@ ptT = new P3(); break; case T.property: - data = vwr.getDataFloat((String) opValue, null); + data = (float[]) vwr.getDataObj((String) opValue, null, JmolDataManager.DATA_TYPE_AF); break; } Modified: trunk/Jmol/src/org/jmol/scriptext/CmdExt.java =================================================================== --- trunk/Jmol/src/org/jmol/scriptext/CmdExt.java 2015-08-08 21:47:59 UTC (rev 20686) +++ trunk/Jmol/src/org/jmol/scriptext/CmdExt.java 2015-08-10 00:15:14 UTC (rev 20687) @@ -1923,8 +1923,7 @@ default: eval.bad(); } - String dataType = dataLabel + " "; - dataType = dataType.substring(0, dataType.indexOf(" ")).toLowerCase(); + String dataType = dataLabel.substring(0, (dataLabel + " ").indexOf(" ")).toLowerCase(); if (dataType.equals("model") || dataType.equals("append")) { eval.cmdLoad(); return; @@ -1952,30 +1951,30 @@ // not saving this data in the state? if (dataType.equals("element_vdw")) { // vdw for now - d[0] = dataType; - d[1] = dataString.replace(';', '\n'); + d[JmolDataManager.DATA_LABEL] = dataType; + d[JmolDataManager.DATA_VALUE] = dataString.replace(';', '\n'); int n = Elements.elementNumberMax; int[] eArray = new int[n + 1]; for (int ie = 1; ie <= n; ie++) eArray[ie] = ie; - d[2] = eArray; - d[3] = Integer.valueOf(JmolDataManager.DATA_TYPE_STRING); + d[JmolDataManager.DATA_SELECTION] = eArray; + d[JmolDataManager.DATA_TYPE] = Integer.valueOf(JmolDataManager.DATA_TYPE_STRING); vwr.setData("element_vdw", d, n, 0, 0, 0, 0); return; } if (dataType.indexOf("data2d_") == 0) { // data2d_someName - d[0] = dataLabel; - d[1] = parseDataArray(dataString, false); - d[3] = Integer.valueOf(JmolDataManager.DATA_TYPE_AFF); + d[JmolDataManager.DATA_LABEL] = dataLabel; + d[JmolDataManager.DATA_VALUE] = parseDataArray(dataString, false); + d[JmolDataManager.DATA_TYPE] = Integer.valueOf(JmolDataManager.DATA_TYPE_AFF); vwr.setData(dataLabel, d, 0, 0, 0, 0, 0); return; } if (dataType.indexOf("data3d_") == 0) { // data3d_someName - d[0] = dataLabel; - d[1] = parseDataArray(dataString, true); - d[3] = Integer.valueOf(JmolDataManager.DATA_TYPE_AFFF); + d[JmolDataManager.DATA_LABEL] = dataLabel; + d[JmolDataManager.DATA_VALUE] = parseDataArray(dataString, true); + d[JmolDataManager.DATA_TYPE] = Integer.valueOf(JmolDataManager.DATA_TYPE_AFFF); vwr.setData(dataLabel, d, 0, 0, 0, 0, 0); return; } @@ -1983,7 +1982,7 @@ if (dataType.indexOf("property_") == 0 && !(tokens.length == 2 && tokens[1].equals("set"))) { BS bs = vwr.bsA(); - d[0] = dataType; + d[JmolDataManager.DATA_LABEL] = dataType; int atomNumberField = (isOneValue ? 0 : ((Integer) vwr .getP("propertyAtomNumberField")).intValue()); int atomNumberFieldColumnCount = (isOneValue ? 0 : ((Integer) vwr @@ -2027,12 +2026,12 @@ bsTemp.set(atomNo); atomMap[atomNo] = j; } - d[2] = atomMap; + d[JmolDataManager.DATA_SELECTION] = atomMap; } else { - d[2] = BSUtil.copy(bs); + d[JmolDataManager.DATA_SELECTION] = BSUtil.copy(bs); } - d[1] = dataString; - d[3] = Integer.valueOf(JmolDataManager.DATA_TYPE_STRING); + d[JmolDataManager.DATA_VALUE] = dataString; + d[JmolDataManager.DATA_TYPE] = Integer.valueOf(JmolDataManager.DATA_TYPE_STRING); vwr.setData(dataType, d, ac, atomNumberField, atomNumberFieldColumnCount, propertyField, propertyFieldColumnCount); return; @@ -2040,15 +2039,15 @@ if ("occupany".equals(dataType)) dataType = "occupancy"; // legacy misspelling in states int userType = AtomCollection.getUserSettableType(dataType); - if (userType >= 0) { + if (userType > JmolDataManager.DATA_TYPE_UNKNOWN) { // this is a known settable type or "property_xxxx" vwr.setAtomData(userType, dataType, dataString, isDefault); return; } // this is just information to be stored. - d[0] = dataLabel; - d[1] = dataString; - d[3] = Integer.valueOf(JmolDataManager.DATA_TYPE_STRING); + d[JmolDataManager.DATA_LABEL] = dataLabel; + d[JmolDataManager.DATA_VALUE] = dataString; + d[JmolDataManager.DATA_TYPE] = Integer.valueOf(JmolDataManager.DATA_TYPE_STRING); vwr.setData(dataType, d, 0, 0, 0, 0, 0); } @@ -4310,9 +4309,9 @@ case T.data: String dtype = ((len = slen) == 3 ? paramAsStr(2) : null); if (!chk) { - Object[] data = vwr.getData(dtype); + Object[] data = (Object[]) vwr.getDataObj(dtype, null, JmolDataManager.DATA_TYPE_LAST); msg = (data == null ? "no data" : Escape.encapsulateData( - (String) data[0], data[1], ((Integer) data[3]).intValue())); + (String) data[JmolDataManager.DATA_LABEL], data[JmolDataManager.DATA_VALUE], ((Integer) data[JmolDataManager.DATA_TYPE]).intValue())); } break; case T.spacegroup: @@ -4993,10 +4992,10 @@ float min, float max) throws ScriptException { - float[] data = (property == null ? - (float[]) e.getBitsetProperty(bs, tok, null, null, null, null, + float[] data = (float[]) (property == null ? + e.getBitsetProperty(bs, tok, null, null, null, null, false, Integer.MAX_VALUE, false) - : vwr.getDataFloat(property, bs)); + : vwr.getDataObj(property, bs, JmolDataManager.DATA_TYPE_AF)); if (!Float.isNaN(min)) for (int i = 0; i < data.length; i++) if (data[i] < min) Modified: trunk/Jmol/src/org/jmol/scriptext/IsoExt.java =================================================================== --- trunk/Jmol/src/org/jmol/scriptext/IsoExt.java 2015-08-08 21:47:59 UTC (rev 20686) +++ trunk/Jmol/src/org/jmol/scriptext/IsoExt.java 2015-08-10 00:15:14 UTC (rev 20687) @@ -28,6 +28,7 @@ import java.util.Map; import org.jmol.api.Interface; +import org.jmol.api.JmolDataManager; import org.jmol.api.MepCalculationInterface; import org.jmol.api.SymmetryInterface; import org.jmol.atomdata.RadiusData; @@ -1440,7 +1441,7 @@ data = new float[vwr.ms.ac]; if (chk) continue; - data = vwr.getDataFloat(str, null); + data = (float[]) vwr.getDataObj(str, null, JmolDataManager.DATA_TYPE_AF); if (data == null) invArg(); addShapeProperty(propertyList, propertyName, data); @@ -2136,7 +2137,7 @@ nZ = Math.abs(nZ); xyzdata = floatArraySetXYZ(++eval.iToken, nX, nY, nZ); } else if (isXYZV) { - xyzdata = vwr.getDataFloat3D(name); + xyzdata = (float[][][]) vwr.getDataObj(name, null, JmolDataManager.DATA_TYPE_AFFF); } else { xyzdata = vwr.functionXYZ(name, nX, nY, nZ); } @@ -2163,7 +2164,7 @@ nY = Math.abs(nY); fdata = floatArraySet(++eval.iToken, nX, nY); } else if (isXYZ) { - fdata = vwr.getDataFloat2D(name); + fdata = (float[][]) vwr.getDataObj(name, null, JmolDataManager.DATA_TYPE_AFF); nX = (fdata == null ? 0 : fdata.length); nY = 3; } else { Modified: trunk/Jmol/src/org/jmol/scriptext/MathExt.java =================================================================== --- trunk/Jmol/src/org/jmol/scriptext/MathExt.java 2015-08-08 21:47:59 UTC (rev 20686) +++ trunk/Jmol/src/org/jmol/scriptext/MathExt.java 2015-08-10 00:15:14 UTC (rev 20687) @@ -32,6 +32,7 @@ import java.util.regex.Pattern; import org.jmol.api.Interface; +import org.jmol.api.JmolDataManager; import org.jmol.api.JmolNMRInterface; import org.jmol.api.JmolPatternMatcher; import org.jmol.atomdata.RadiusData; @@ -773,7 +774,7 @@ } if (selected.indexOf("data2d_") == 0) { // tab, newline separated data - float[][] f1 = vwr.getDataFloat2D(selected); + float[][] f1 = (float[][]) vwr.getDataObj(selected, null, JmolDataManager.DATA_TYPE_AFF); if (f1 == null) return mp.addXStr(""); if (args.length == 2 && args[1].tok == T.integer) { @@ -790,10 +791,10 @@ // parallel mp.addition of float property data sets if (selected.indexOf("property_") == 0) { - float[] f1 = vwr.getDataFloat(selected, null); + float[] f1 = (float[]) vwr.getDataObj(selected, null, JmolDataManager.DATA_TYPE_AF); if (f1 == null) return mp.addXStr(""); - float[] f2 = (type.indexOf("property_") == 0 ? vwr.getDataFloat(type, null) + float[] f2 = (type.indexOf("property_") == 0 ? (float[]) vwr.getDataObj(selected, null, JmolDataManager.DATA_TYPE_AF) : null); if (f2 != null) { f1 = AU.arrayCopyF(f1, -1); @@ -806,7 +807,7 @@ // some other data type -- just return it //if (args.length == 1) { - Object[] data = vwr.getData(selected); + Object[] data = (Object[]) vwr.getDataObj(selected, null, JmolDataManager.DATA_TYPE_UNKNOWN); return mp.addXStr(data == null ? "" : "" + data[1]); // } } Modified: trunk/Jmol/src/org/jmol/util/Escape.java =================================================================== --- trunk/Jmol/src/org/jmol/util/Escape.java 2015-08-08 21:47:59 UTC (rev 20686) +++ trunk/Jmol/src/org/jmol/util/Escape.java 2015-08-10 00:15:14 UTC (rev 20687) @@ -42,6 +42,7 @@ import javajs.util.T3; import javajs.util.V3; +import org.jmol.api.JmolDataManager; import org.jmol.java.BS; import org.jmol.script.SV; import org.jmol.script.T; @@ -535,12 +536,23 @@ } public static String encapsulateData(String name, Object data, int depth) { - return " DATA \"" + name + "\"\n" + - (depth == 2 ? - escapeFloatAA((float[][]) data, true) + ";\n" - : depth == 3 ? - escapeFloatAAA((float[][][]) data, true) + ";\n" - : data) + " END \"" + name + "\";\n"; + String s; + switch (depth) { + case JmolDataManager.DATA_TYPE_AF: + s = escapeFloatA((float[]) data, false) + ";\n"; + break; + case JmolDataManager.DATA_TYPE_AFF: + s = escapeFloatAA((float[][]) data, true) + ";\n"; + break; + case JmolDataManager.DATA_TYPE_AFFF: + s = escapeFloatAAA((float[][][]) data, true) + ";\n"; + break; + default: + s = data.toString(); + break; + } + return " DATA \"" + name + "\"\n" + s + " END \"" + name + "\";\n"; + } // public static String escapeXml(Object value) { Modified: trunk/Jmol/src/org/jmol/viewer/DataManager.java =================================================================== --- trunk/Jmol/src/org/jmol/viewer/DataManager.java 2015-08-08 21:47:59 UTC (rev 20686) +++ trunk/Jmol/src/org/jmol/viewer/DataManager.java 2015-08-10 00:15:14 UTC (rev 20687) @@ -41,7 +41,6 @@ import javajs.util.PT; import javajs.util.SB; - /* * a class for storing and retrieving user data, * including atom-related and color-related data @@ -51,13 +50,13 @@ public class DataManager implements JmolDataManager { private Map<String, Object[]> dataValues = new Hashtable<String, Object[]>(); - + private Viewer vwr; - + public DataManager() { // for reflection } - + @Override public JmolDataManager set(Viewer vwr) { this.vwr = vwr; @@ -68,13 +67,7 @@ public void clear() { dataValues.clear(); } - - //private final static int DATA_LABEL = 0; - private final static int DATA_VALUE = 1; - private final static int DATA_SELECTION_MAP = 2; - private final static int DATA_TYPE = 3; - private final static int DATA_SAVE_IN_STATE = 4; - + /** * This method needs to be redone using a class instead of Object[] */ @@ -102,7 +95,7 @@ } type = type.toLowerCase(); if (type.equals("element_vdw")) { - String stringData = ((String) data[DATA_VALUE]).trim(); + String stringData = ((String) data[JmolDataManager.DATA_VALUE]).trim(); if (stringData.length() == 0) { vwr.userVdwMars = null; vwr.userVdws = null; @@ -112,27 +105,27 @@ if (vwr.bsUserVdws == null) vwr.setUserVdw(vwr.defaultVdw); Parser.parseFloatArrayFromMatchAndField(stringData, vwr.bsUserVdws, 1, 0, - (int[]) data[DATA_SELECTION_MAP], 2, 0, vwr.userVdws, 1); + (int[]) data[JmolDataManager.DATA_SELECTION], 2, 0, vwr.userVdws, 1); for (int i = vwr.userVdws.length; --i >= 0;) vwr.userVdwMars[i] = (int) Math.floor(vwr.userVdws[i] * 1000); return; } - int depth = ((Integer) data[DATA_TYPE]).intValue(); - Object val = data[DATA_VALUE]; + int depth = getType(data); + Object val = data[JmolDataManager.DATA_VALUE]; if (depth == JmolDataManager.DATA_TYPE_UNKNOWN) - data[DATA_TYPE] = Integer + data[JmolDataManager.DATA_TYPE] = Integer .valueOf(depth = (val instanceof String ? JmolDataManager.DATA_TYPE_STRING : AU.isAF(val) ? JmolDataManager.DATA_TYPE_AF : AU.isAFF(val) ? JmolDataManager.DATA_TYPE_AFF : AU .isAFFF(val) ? JmolDataManager.DATA_TYPE_AFFF : JmolDataManager.DATA_TYPE_UNKNOWN)); - if (data[DATA_SELECTION_MAP] != null && arrayCount > 0) { + if (data[JmolDataManager.DATA_SELECTION] != null && arrayCount > 0) { boolean createNew = (matchField != 0 || field != Integer.MIN_VALUE && field != Integer.MAX_VALUE); Object[] oldData = dataValues.get(type); BS bs; float[] f = (oldData == null || createNew ? new float[actualAtomCount] - : AU.ensureLengthA(((float[]) oldData[1]), actualAtomCount)); + : AU.ensureLengthA(((float[]) oldData[JmolDataManager.DATA_VALUE]), actualAtomCount)); // check to see if the data COULD be interpreted as a string of float values // and if so, do that. This pre-fetches the tokens in that case. @@ -149,14 +142,13 @@ if (field == Integer.MIN_VALUE && (strData = PT.getTokens(stringData)).length > 1) field = 0; - if (field == Integer.MIN_VALUE) { // set the selected data elements to a single value - bs = (BS) data[DATA_SELECTION_MAP]; + bs = (BS) data[JmolDataManager.DATA_SELECTION]; setSelectedFloats(PT.parseFloat(stringData), bs, f); } else if (field == 0 || field == Integer.MAX_VALUE) { // just get the selected token values - bs = (BS) data[DATA_SELECTION_MAP]; + bs = (BS) data[JmolDataManager.DATA_SELECTION]; if (floatData != null) { int n = floatData.length; if (n == bs.cardinality()) { @@ -164,7 +156,8 @@ .nextSetBit(i + 1), pt++) f[i] = floatData[pt]; } else { - for (int i = bs.nextSetBit(0); i >= 0 && i < n; i = bs.nextSetBit(i + 1)) + for (int i = bs.nextSetBit(0); i >= 0 && i < n; i = bs + .nextSetBit(i + 1)) f[i] = floatData[i]; } } else { @@ -173,13 +166,13 @@ } } else if (matchField <= 0) { // get the specified field >= 1 for the selected atoms - bs = (BS) data[DATA_SELECTION_MAP]; + bs = (BS) data[JmolDataManager.DATA_SELECTION]; Parser.parseFloatArrayFromMatchAndField(stringData, bs, 0, 0, null, field, fieldColumnCount, f, 1); } else { // get the selected field, with an integer match in a specified field // in this case, bs is created and indicates which data points were set - int[] iData = (int[]) data[DATA_SELECTION_MAP]; + int[] iData = (int[]) data[JmolDataManager.DATA_SELECTION]; Parser.parseFloatArrayFromMatchAndField(stringData, null, matchField, matchFieldColumnCount, iData, field, fieldColumnCount, f, 1); bs = new BS(); @@ -187,12 +180,14 @@ if (iData[i] >= 0) bs.set(iData[i]); } - if (oldData != null && oldData[DATA_SELECTION_MAP] instanceof BS + if (oldData != null + && oldData[JmolDataManager.DATA_SELECTION] instanceof BS && !createNew) - bs.or((BS) (oldData[DATA_SELECTION_MAP])); - data[DATA_TYPE] = Integer.valueOf(JmolDataManager.DATA_TYPE_AF); - data[DATA_SELECTION_MAP] = bs; - data[DATA_VALUE] = f; + bs.or((BS) (oldData[JmolDataManager.DATA_SELECTION])); + data[JmolDataManager.DATA_TYPE] = Integer + .valueOf(JmolDataManager.DATA_TYPE_AF); + data[JmolDataManager.DATA_SELECTION] = bs; + data[JmolDataManager.DATA_VALUE] = f; if (type.indexOf("property_atom.") == 0) { int tok = T.getSettableTokFromString(type = type.substring(14)); if (tok == T.nada) { @@ -211,6 +206,10 @@ dataValues.put(type, data); } + private int getType(Object[] data) { + return ((Integer) data[JmolDataManager.DATA_TYPE]).intValue(); + } + /** * * @param f @@ -220,52 +219,50 @@ private static void setSelectedFloats(float f, BS bs, float[] data) { boolean isAll = (bs == null); int i0 = (isAll ? 0 : bs.nextSetBit(0)); - for (int i = i0; i >= 0 && i < data.length; i = (isAll ? i + 1 : bs.nextSetBit(i + 1))) + for (int i = i0; i >= 0 && i < data.length; i = (isAll ? i + 1 : bs + .nextSetBit(i + 1))) data[i] = f; } @Override - public Object[] getData(String type) { - if (dataValues.size() == 0 || type == null) + public Object getData(String label, BS bsSelected, int dataType) { + if (dataValues.size() == 0 || label == null) return null; - if (!type.equalsIgnoreCase("types")) - return dataValues.get(type); - String[] info = new String[2]; - info[0] = "types"; - info[1] = ""; - int n = 0; - for (String name : dataValues.keySet()) - info[1] += (n++ > 0 ? "\n" : "") + name; - return info; + switch (dataType) { + case JmolDataManager.DATA_TYPE_UNKNOWN: + case JmolDataManager.DATA_TYPE_LAST: + if (!label.equalsIgnoreCase("types")) + return dataValues.get(label); + String[] info = new String[2]; + info[JmolDataManager.DATA_LABEL] = "types"; + info[JmolDataManager.DATA_VALUE] = ""; + int nv = 0; + for (String name : dataValues.keySet()) + info[JmolDataManager.DATA_VALUE] += (nv++ > 0 ? "\n" : "") + name; + return info; + default: + Object[] data = dataValues.get(label); + if (data == null || getType(data) != dataType) + return null; + if (bsSelected == null) + return data[JmolDataManager.DATA_VALUE]; + // When bsSelected is not null, this returns a truncated array, which must be of type float[] + float[] f = (float[]) data[JmolDataManager.DATA_VALUE]; + float[] fnew = new float[bsSelected.cardinality()]; + // load array + for (int i = 0, n = f.length, p = bsSelected.nextSetBit(0); p >= 0 + && i < n; p = bsSelected.nextSetBit(p + 1)) + fnew[i++] = f[p]; + return fnew; + } } - /** - * When bsSelected is not null, this returns a truncated array - * - */ @Override - public float[] getDataFloatA(String label, BS bsSelected) { - if (dataValues.size() == 0) - return null; - Object[] data = getData(label); - if (data == null || ((Integer)data[DATA_TYPE]).intValue() != JmolDataManager.DATA_TYPE_AF) - return null; - float[] f = (float[]) data[DATA_VALUE]; - if (bsSelected == null) - return f; - float[] fnew = new float[bsSelected.cardinality()]; - // load array - for (int i = 0, n = f.length, p = bsSelected.nextSetBit(0); p >= 0 && i < n; p = bsSelected.nextSetBit(p + 1)) - fnew[i++] = f[p]; - return fnew; - } - - @Override - public float getDataFloat(String label, int atomIndex) { + public float getDataFloatAt(String label, int atomIndex) { if (dataValues.size() > 0) { - Object[] data = getData(label); - if (data != null && ((Integer)data[DATA_TYPE]).intValue() == JmolDataManager.DATA_TYPE_AF) { - float[] f = (float[]) data[DATA_VALUE]; + Object[] data = (Object[]) getData(label, null, 0); + if (data != null && getType(data) == JmolDataManager.DATA_TYPE_AF) { + float[] f = (float[]) data[JmolDataManager.DATA_VALUE]; if (atomIndex < f.length) return f[atomIndex]; } @@ -274,46 +271,17 @@ } @Override - public float[][] getDataFloat2D(String label) { - if (dataValues.size() == 0) - return null; - Object[] data = getData(label); - if (data == null || ((Integer)data[DATA_TYPE]).intValue() != JmolDataManager.DATA_TYPE_AFF) - return null; - return (float[][]) data[DATA_VALUE]; - } - - @Override - public float[][][] getDataFloat3D(String label) { - if (dataValues.size() == 0) - return null; - Object[] data = getData(label); - if (data == null || ((Integer)data[DATA_TYPE]).intValue() != JmolDataManager.DATA_TYPE_AFFF) - return null; - return (float[][][]) data[DATA_VALUE]; - } - - @Override public void deleteModelAtoms(int firstAtomIndex, int nAtoms, BS bsDeleted) { if (dataValues.size() == 0) return; - for (String name: dataValues.keySet()) { + for (String name : dataValues.keySet()) { if (name.indexOf("property_") == 0) { Object[] obj = dataValues.get(name); - BSUtil.deleteBits((BS) obj[2], bsDeleted); - switch (((Integer)obj[3]).intValue()) { - case JmolDataManager.DATA_TYPE_AF: - obj[1] = AU.deleteElements(obj[1], firstAtomIndex, nAtoms); - break; - case JmolDataManager.DATA_TYPE_AFF: - obj[1] = AU.deleteElements(obj[1], firstAtomIndex, nAtoms); - break; - default: - // is there anything else?? - break; - } + BSUtil.deleteBits((BS) obj[DATA_SELECTION], bsDeleted); + obj[DATA_VALUE] = AU.deleteElements(obj[DATA_VALUE], firstAtomIndex, + nAtoms); } - } + } } @Override @@ -325,10 +293,12 @@ int i1 = (isAll ? Elements.elementNumberMax : bs.length()); for (int i = i0; i < i1 && i >= 0; i = (isAll ? i + 1 : bs .nextSetBit(i + 1))) - sb.appendI(i).appendC('\t').appendF( - type == VDW.USER ? vwr.userVdws[i] : Elements - .getVanderwaalsMar(i, type) / 1000f).appendC('\t').append( - Elements.elementSymbolFromNumber(i)).appendC('\n'); + sb.appendI(i) + .appendC('\t') + .appendF( + type == VDW.USER ? vwr.userVdws[i] : Elements.getVanderwaalsMar( + i, type) / 1000f).appendC('\t') + .append(Elements.elementSymbolFromNumber(i)).appendC('\n'); return (bs == null ? sb.toString() : "\n DATA \"element_vdw\"\n" + sb.append(" end \"element_vdw\";\n\n").toString()); } @@ -341,35 +311,39 @@ for (String name : dataValues.keySet()) { if (name.indexOf("property_") == 0) { Object[] obj = dataValues.get(name); - if (obj.length > DATA_SAVE_IN_STATE - && obj[DATA_SAVE_IN_STATE] == Boolean.FALSE) + // default for "save in state" is TRUE + if (obj.length > JmolDataManager.DATA_SAVE_IN_STATE + && !((Boolean) obj[JmolDataManager.DATA_SAVE_IN_STATE]) + .booleanValue()) continue; haveData = true; - Object data = obj[1]; - if (data != null && ((Integer) obj[3]).intValue() == 1) { + Object data = obj[DATA_VALUE]; + if (data != null + && getType(obj) == JmolDataManager.DATA_TYPE_AF) { sc.getAtomicPropertyStateBuffer(sb, AtomCollection.TAINT_MAX, - (BS) obj[2], name, (float[]) data); + (BS) obj[DATA_SELECTION], name, (float[]) data); sb.append("\n"); } else { - sb.append("\n").append(Escape.encapsulateData(name, data, 0));//j2s issue? + // should not be here -- property_xxx is always float[] + sb.append("\n").append( + Escape.encapsulateData(name, data, + JmolDataManager.DATA_TYPE_UNKNOWN));//j2s issue? } - } else if (name.indexOf("data2d") == 0) { - Object[] obj = dataValues.get(name); - Object data = obj[1]; - if (data != null && ((Integer) obj[3]).intValue() == 2) { - haveData = true; - sb.append("\n").append(Escape.encapsulateData(name, data, 2)); - } - } else if (name.indexOf("data3d") == 0) { - Object[] obj = dataValues.get(name); - Object data = obj[1]; - if (data != null && ((Integer) obj[3]).intValue() == 3) { - haveData = true; - sb.append("\n").append(Escape.encapsulateData(name, data, 3)); - } + continue; } + int type = (name.indexOf("data2d") == 0 ? JmolDataManager.DATA_TYPE_AFF + : name.indexOf("data3d") == 0 ? JmolDataManager.DATA_TYPE_AFFF + : JmolDataManager.DATA_TYPE_UNKNOWN); + if (type == JmolDataManager.DATA_TYPE_UNKNOWN) + continue; + Object[] obj = dataValues.get(name); + Object data = obj[DATA_VALUE]; + if (data != null && getType(obj) == type) { + haveData = true; + sb.append("\n").append(Escape.encapsulateData(name, data, type)); + } } return haveData; } - + } Modified: trunk/Jmol/src/org/jmol/viewer/Jmol.properties =================================================================== --- trunk/Jmol/src/org/jmol/viewer/Jmol.properties 2015-08-08 21:47:59 UTC (rev 20686) +++ trunk/Jmol/src/org/jmol/viewer/Jmol.properties 2015-08-10 00:15:14 UTC (rev 20687) @@ -51,8 +51,14 @@ TODO: curved arrows overextend and with width settings do not truncate shaft properly -Jmol.___JmolVersion="14.3.15_2015.08.08" +Jmol.___JmolVersion="14.3.15_2015.08.09" +bug fix: CML reader can fail (e.g. nsc244a.cml) + +code: refactoring of JmolDataManager + +JmolVersion="14.3.15_2015.08.08" + new feature: atom property "monomer" same as %g new feature: atom property "seqcode" same as %r new feature: load "test.pdb" from write property atomno temperature now restores values for atomno and temperature for points on plot Modified: trunk/Jmol/src/org/jmol/viewer/PropertyManager.java =================================================================== --- trunk/Jmol/src/org/jmol/viewer/PropertyManager.java 2015-08-08 21:47:59 UTC (rev 20686) +++ trunk/Jmol/src/org/jmol/viewer/PropertyManager.java 2015-08-10 00:15:14 UTC (rev 20687) @@ -49,6 +49,7 @@ import java.util.Properties; import org.jmol.api.Interface; +import org.jmol.api.JmolDataManager; import org.jmol.api.JmolPropertyManager; import org.jmol.java.BS; import org.jmol.modelset.Atom; @@ -621,7 +622,7 @@ case PROP_CONSOLE_TEXT: return vwr.getProperty("DATA_API", "consoleText", null); case PROP_DATA_INFO: - return vwr.getData(myParam.toString()); + return vwr.getDataObj(myParam.toString(), null, JmolDataManager.DATA_TYPE_UNKNOWN); case PROP_ERROR_MESSAGE: return vwr.getErrorMessageUn(); case PROP_EVALUATE: Modified: trunk/Jmol/src/org/jmol/viewer/StateCreator.java =================================================================== --- trunk/Jmol/src/org/jmol/viewer/StateCreator.java 2015-08-08 21:47:59 UTC (rev 20686) +++ trunk/Jmol/src/org/jmol/viewer/StateCreator.java 2015-08-10 00:15:14 UTC (rev 20687) @@ -23,22 +23,22 @@ package org.jmol.viewer; +import java.util.Arrays; +import java.util.Date; +import java.util.Hashtable; +import java.util.Map; + import javajs.awt.Font; import javajs.util.Lst; +import javajs.util.P3; import javajs.util.PT; import javajs.util.SB; -import java.util.Arrays; -import java.util.Date; -import java.util.Hashtable; - -import java.util.Map; - +import org.jmol.api.JmolDataManager; import org.jmol.api.JmolModulationSet; import org.jmol.api.JmolScriptFunction; import org.jmol.api.SymmetryInterface; import org.jmol.c.PAL; -import org.jmol.c.STER; import org.jmol.c.STR; import org.jmol.c.VDW; import org.jmol.java.BS; @@ -66,14 +66,12 @@ import org.jmol.util.BSUtil; import org.jmol.util.C; import org.jmol.util.ColorEncoder; +import org.jmol.util.Edge; import org.jmol.util.Escape; import org.jmol.util.GData; -import org.jmol.util.Edge; import org.jmol.util.Logger; import org.jmol.util.Vibration; -import javajs.util.P3; - /** * StateCreator handles all aspects of working with the "state" as * generally defined, including @@ -479,11 +477,11 @@ String data = (String) vwr.ligandModels.get(key + "_data"); if (data != null) cmds.append(" ").append( - Escape.encapsulateData("ligand_" + key, data.trim() + "\n", 0)); + Escape.encapsulateData("ligand_" + key, data.trim() + "\n", JmolDataManager.DATA_TYPE_STRING)); data = (String) vwr.ligandModels.get(key + "_file"); if (data != null) cmds.append(" ").append( - Escape.encapsulateData("file_" + key, data.trim() + "\n", 0)); + Escape.encapsulateData("file_" + key, data.trim() + "\n", JmolDataManager.DATA_TYPE_STRING)); } } SB commands = new SB(); Modified: trunk/Jmol/src/org/jmol/viewer/Viewer.java =================================================================== --- trunk/Jmol/src/org/jmol/viewer/Viewer.java 2015-08-08 21:47:59 UTC (rev 20686) +++ trunk/Jmol/src/org/jmol/viewer/Viewer.java 2015-08-10 00:15:14 UTC (rev 20687) @@ -2859,8 +2859,8 @@ } public void setCurrentColorRange(String label) { - float[] data = getDataFloat(label, null); - BS bs = (data == null ? null : (BS) (getDataManager().getData(label))[2]); + float[] data = (float[]) getDataObj(label, null, JmolDataManager.DATA_TYPE_AF); + BS bs = (data == null ? null : (BS) ((Object[])getDataObj(label, null, JmolDataManager.DATA_TYPE_UNKNOWN))[2]); if (bs != null && g.rangeSelected) bs.and(bsA()); cm.setPropertyColorRangeData(data, bs); @@ -2868,31 +2868,99 @@ private Object[] lastData; - public void setData(String type, Object[] data, int arrayCount, - int matchField, int matchFieldColumnCount, int field, - int fieldColumnCount) { - getDataManager().setData(type, lastData = data, arrayCount, ms.ac, - matchField, matchFieldColumnCount, field, fieldColumnCount); + /** + * A general-purpose data storage method. Note that matchFieldCount and + * dataFieldCount should both be positive or both be negative. + * + * @param key + * + * a simple key name for the data, starting with "property_" if user-defined + * + * @param data + * + * data[0] -- label + * + * data[1] -- string or float[] or float[][] or float[][][] + * + * data[2] -- selection bitset or int[] atomMap when field > 0 + * + * data[3] -- arrayDepth 0(String),1(float[]),2(float[][]),3(float[][][]) or -1 + * to indidate that it is set by data type + * + * data[4] -- Boolean.TRUE == saveInState + * + * @param dataType + * + * see JmolDataManager interface + * + * @param matchField + * + * if positive, data must match atomNo in this column + * + * if 0, no match column + * + * @param matchFieldColumnCount + * if positive, this number of characters in match column if 0, + * reference is to tokens, not characters + * + * @param dataField + * + * if positive, column containing the data + * + * if 0, values are a simple list; clear the data + * + * if Integer.MAX_VALUE, values are a simple list; don't clear the data + * + * if Integer.MIN_VALUE, have one SINGLE data value for all selected + * atoms + * + * @param dataFieldColumnCount + * + * if positive, this number of characters in data column + * + * if 0, reference is to tokens, not characters + */ + public void setData(String key, Object[] data, int dataType, + int matchField, int matchFieldColumnCount, int dataField, + int dataFieldColumnCount) { + getDataManager().setData(key, lastData = data, dataType, ms.ac, + matchField, matchFieldColumnCount, dataField, dataFieldColumnCount); } - public Object[] getData(String type) { - return (type == null ? lastData : getDataManager().getData(type)); + /** + * Retrieve a data object + * + * @param key + * + * @param bsSelected + * + * selected atoms; for DATA_AF only + * + * @param dataType + * + * see JmolDataManager interface + * + * @return data object + * + * data[0] -- label (same as key) + * + * data[1] -- string or float[] or float[][] or float[][][] + * + * data[2] -- selection bitset or int[] atomMap when field > 0 + * + * data[3] -- arrayDepth + * 0(String),1(float[]),2(float[][]),3(float[][][]) or -1 to indicate + * that it is set by data type + * + * data[4] -- Boolean.TRUE == saveInState + */ + public Object getDataObj(String key, BS bsSelected, int dataType) { + return (key == null && dataType == JmolDataManager.DATA_TYPE_LAST ? lastData + : getDataManager().getData(key, bsSelected, dataType)); } - public float[] getDataFloat(String label, BS bsSelected) { - return getDataManager().getDataFloatA(label, bsSelected); - } - - public float[][] getDataFloat2D(String label) { - return getDataManager().getDataFloat2D(label); - } - - public float[][][] getDataFloat3D(String label) { - return getDataManager().getDataFloat3D(label); - } - public float getDataFloatAt(String label, int atomIndex) { - return getDataManager().getDataFloat(label, atomIndex); + return getDataManager().getDataFloatAt(label, atomIndex); } // boolean autoLoadOrientation() { @@ -7519,7 +7587,7 @@ nY = Math.abs(nY); float[][] fdata; if (data == null) { - fdata = getDataFloat2D(functionName); + fdata = (float[][]) getDataObj(functionName, null, JmolDataManager.DATA_TYPE_AFF); if (fdata != null) return fdata; data = ""; @@ -7544,7 +7612,7 @@ nZ = Math.abs(nZ); float[][][] xyzdata; if (data == null) { - xyzdata = getDataFloat3D(functionName); + xyzdata = (float[][][]) getDataObj(functionName, null, JmolDataManager.DATA_TYPE_AFF); if (xyzdata != null) return xyzdata; data = ""; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. ------------------------------------------------------------------------------ _______________________________________________ Jmol-commits mailing list Jmol-commits@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/jmol-commits