@Override protected boolean gotoAndReadVoxelData(boolean isMapData) { initializeVolumetricData(); if (nPointsX < 0 || nPointsY < 0 || nPointsZ < 0) return true; try { gotoData(params.fileIndex - 1, nPointsX * nPointsY * nPointsZ); if (vertexDataOnly) return true; volumeData.setMappingPlane(params.thePlane); readSurfaceData(isMapData); volumeData.setMappingPlane(null); if (edgeDataCount > 0) jvxlEdgeDataRead = jvxlReadFractionData("edge", edgeDataCount); params.bsExcluded = jvxlData.jvxlExcluded = new BS[4]; hasColorData = (colorDataCount > 0); // for nonXML version of JVXL if (hasColorData) jvxlColorDataRead = jvxlReadFractionData("color", colorDataCount); if (excludedVertexCount > 0) { jvxlData.jvxlExcluded[0] = JvxlCoder.jvxlDecodeBitSet(xr.getXmlData("jvxlExcludedVertexData", null, false, false)); if (xr.isNext("jvxlExcludedPlaneData")) jvxlData.jvxlExcluded[2] = JvxlCoder.jvxlDecodeBitSet( xr.getXmlData("jvxlExcludedPlaneData", null, false, false)); } if (excludedTriangleCount > 0) jvxlData.jvxlExcluded[3] = JvxlCoder.jvxlDecodeBitSet( xr.getXmlData("jvxlExcludedTriangleData", null, false, false)); if (invalidatedVertexCount > 0) jvxlData.jvxlExcluded[1] = JvxlCoder.jvxlDecodeBitSet( xr.getXmlData("jvxlInvalidatedVertexData", null, false, false)); if (haveContourData) jvxlDecodeContourData(jvxlData, xr.getXmlData("jvxlContourData", null, false, false)); if (jvxlDataIsColorMapped && jvxlData.nVertexColors > 0) { jvxlData.vertexColorMap = new Hashtable<String, BS>(); String vdata = xr.getXmlData("jvxlVertexColorData", null, true, false); String baseColor = XmlReader.getXmlAttrib(vdata, "baseColor"); jvxlData.baseColor = (baseColor.length() > 0 ? baseColor : null); for (int i = 0; i < jvxlData.nVertexColors; i++) { String s = xr.getXmlData("jvxlColorMap", vdata, true, false); String color = XmlReader.getXmlAttrib(s, "color"); BS bs = JvxlCoder.jvxlDecodeBitSet(xr.getXmlData("jvxlColorMap", s, false, false)); jvxlData.vertexColorMap.put(color, bs); } } } catch (Exception e) { Logger.error(e.toString()); return false; } return true; }
/** * decode vertex data found within <jvxlVertexData> element as created by jvxlEncodeVertexData * (see above) * * @param data tag and contents * @param asArray or just addVertexCopy * @return Point3f[] if desired * @throws Exception */ public P3[] jvxlDecodeVertexData(String data, boolean asArray) throws Exception { int vertexCount = parseIntStr(XmlReader.getXmlAttrib(data, "count")); if (!asArray) Logger.info("Reading " + vertexCount + " vertices"); int ptCount = vertexCount * 3; P3[] vertices = (asArray ? new P3[vertexCount] : null); P3 p = (asArray ? null : new P3()); float fraction; String vData = XmlReader.getXmlAttrib(data, "data"); String encoding = getEncoding(data); if ("none".equals(encoding)) { if (vData.length() == 0) vData = xr.getXmlData("jvxlVertexData", data, false, false); float[] fdata = PT.parseFloatArray(vData); // first point is count -- ignored. if (fdata[0] != vertexCount * 3) Logger.info( "JvxlXmlReader: vertexData count=" + ((int) fdata[0]) + "; expected " + (vertexCount * 3)); for (int i = 0, pt = 1; i < vertexCount; i++) { p = P3.new3(fdata[pt++], fdata[pt++], fdata[pt++]); if (asArray) vertices[i] = p; else addVertexCopy(p, 0, i); } } else { P3 min = xr.getXmlPoint(data, "min"); P3 range = xr.getXmlPoint(data, "max"); range.sub(min); int colorFractionBase = jvxlData.colorFractionBase; int colorFractionRange = jvxlData.colorFractionRange; String s = JvxlCoder.jvxlDecompressString(vData); if (s.length() == 0) s = xr.getXmlData("jvxlVertexData", data, false, false); for (int i = 0, pt = -1; i < vertexCount; i++) { if (asArray) p = vertices[i] = new P3(); fraction = JvxlCoder.jvxlFractionFromCharacter2( s.charAt(++pt), s.charAt(pt + ptCount), colorFractionBase, colorFractionRange); p.x = min.x + fraction * range.x; fraction = JvxlCoder.jvxlFractionFromCharacter2( s.charAt(++pt), s.charAt(pt + ptCount), colorFractionBase, colorFractionRange); p.y = min.y + fraction * range.y; fraction = JvxlCoder.jvxlFractionFromCharacter2( s.charAt(++pt), s.charAt(pt + ptCount), colorFractionBase, colorFractionRange); p.z = min.z + fraction * range.z; if (!asArray) addVertexCopy(p, 0, i); } } return vertices; }
/** * "edge" data includes two parts -- a compressed bitset indicating exactly which edges, in order * or processing by Jmol, are crossed by the surface, and a set of fractions indicating how far * along that edge (good to 1 part in 8100) that surface crosses that edge. We are just reading he * fractions here. * * <p>"color" data comprises the corresponding sequence of data mapping values, again stored to a * precision of 1 part in 8100, relative to a range of values. * * @param type * @param nPoints * @return data */ protected String jvxlReadFractionData(String type, int nPoints) { String str; try { if (type.equals("edge")) { str = JvxlCoder.jvxlDecompressString(XmlReader.getXmlAttrib(tempDataXml, "data")); } else { String data = xr.getXmlData("jvxlColorData", null, true, false); jvxlData.isJvxlPrecisionColor = getEncoding(data).endsWith("2"); str = JvxlCoder.jvxlDecompressString(XmlReader.getXmlAttrib(data, "data")); } } catch (Exception e) { Logger.error("Error reading " + type + " data " + e); throw new NullPointerException(); } return str; }
protected void readVector(int voxelVectorIndex) throws Exception { String data = xr.getXmlData("jvxlVolumeVector", tempDataXml, true, true); tempDataXml = tempDataXml.substring(tempDataXml.indexOf(data) + data.length()); int n = parseIntStr(XmlReader.getXmlAttrib(data, "count")); if (n == Integer.MIN_VALUE) vertexDataOnly = true; voxelCounts[voxelVectorIndex] = (n < 0 ? 0 : n); volumetricVectors[voxelVectorIndex].setT(xr.getXmlPoint(data, "vector")); if (isAnisotropic) setVectorAnisotropy(volumetricVectors[voxelVectorIndex]); }
protected void jvxlDecodeContourData(JvxlData jvxlData, String data) throws Exception { List<List<Object>> vs = new List<List<Object>>(); SB values = new SB(); SB colors = new SB(); int pt = -1; jvxlData.vContours = null; if (data == null) return; while ((pt = data.indexOf("<jvxlContour", pt + 1)) >= 0) { List<Object> v = new List<Object>(); String s = xr.getXmlData("jvxlContour", data.substring(pt), true, false); float value = parseFloatStr(XmlReader.getXmlAttrib(s, "value")); values.append(" ").appendF(value); int color = getColor(XmlReader.getXmlAttrib(s, "color")); short colix = C.getColix(color); colors.append(" ").append(Escape.escapeColor(color)); String fData = JvxlCoder.jvxlDecompressString(XmlReader.getXmlAttrib(s, "data")); BS bs = JvxlCoder.jvxlDecodeBitSet(xr.getXmlData("jvxlContour", s, false, false)); int n = bs.length(); IsosurfaceMesh.setContourVector(v, n, bs, value, colix, color, SB.newS(fData)); vs.addLast(v); } int n = vs.size(); if (n > 0) { jvxlData.vContours = AU.createArrayOfArrayList(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] = 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 = C.getHexCodes(jvxlData.contourColixes); Logger.info("JVXL read: " + n + " discrete contours"); Logger.info("JVXL read: contour values: " + values); Logger.info("JVXL read: contour colors: " + colors); } }
@Override protected void readParameters() throws Exception { String s = xr.getXmlData("jvxlFileTitle", null, false, false); jvxlFileHeaderBuffer = SB.newS(s); xr.toTag("jvxlVolumeData"); String data = tempDataXml = xr.getXmlData("jvxlVolumeData", null, true, false); volumetricOrigin.setT(xr.getXmlPoint(data, "origin")); isAngstroms = true; readVector(0); readVector(1); readVector(2); line = xr.toTag("jvxlSurfaceSet"); nSurfaces = parseIntStr(XmlReader.getXmlAttrib(line, "count")); Logger.info("jvxl file surfaces: " + nSurfaces); Logger.info("using default edge fraction base and range"); Logger.info("using default color fraction base and range"); cJvxlEdgeNaN = (char) (edgeFractionBase + edgeFractionRange); }
/** * decode triangle data found within <jvxlTriangleData> element as created with * jvxlEncodeTriangleData (see above) * * @param tdata tag and contents * @param edgeData * @param colorData * @throws Exception */ void jvxlDecodeTriangleData(String tdata, String edgeData, String colorData) throws Exception { int nTriangles = parseIntStr(XmlReader.getXmlAttrib(tdata, "count")); if (nTriangles < 0) return; int[] nextc = new int[1]; int nColors = (colorData == null ? -1 : PT.parseIntNext(colorData, nextc)); int color = 0; Logger.info("Reading " + nTriangles + " triangles"); String encoding = getEncoding(tdata); tdata = getData(tdata, "jvxlTriangleData"); String edata = getData(edgeData, "jvxlTriangleEdgeData"); int[] vertex = new int[3]; int[] nextp = new int[1]; int[] nexte = null; int edgeMask = 7; boolean haveEdgeInfo; boolean haveEncoding = !"none".equals(encoding); if (haveEncoding) { tdata = JvxlCoder.jvxlDecompressString(tdata); edata = JvxlCoder.jvxlDecompressString(edata).trim(); haveEdgeInfo = (edata.length() == nTriangles); } else { int n = PT.parseIntNext(tdata, nextp); haveEdgeInfo = (edata.length() > 0); if (haveEdgeInfo) { nexte = new int[1]; PT.parseIntNext(edata, nexte); // throw away count } else if (n > 0) { Logger.info("JvxlXmlReader: jvxlTriangleEdgeData count=" + n + "; expected " + nTriangles); } } for (int i = 0, v = 0, p = 0, pt = -1; i < nTriangles; ) { if (haveEncoding) { char ch = tdata.charAt(++pt); int diff; switch (ch) { case '!': diff = 0; break; case '+': case '.': case ' ': case '\n': case '\r': case '\t': case ',': continue; case '-': case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': nextp[0] = pt; diff = PT.parseIntNext(tdata, nextp); pt = nextp[0] - 1; break; default: diff = ch - 92; // '\' character } v += diff; } else { v = PT.parseIntNext(tdata, nextp) - 1; } vertex[p] = v; if (++p == 3) { p = 0; if (haveEdgeInfo) { edgeMask = (nexte == null ? edata.charAt(i) - '0' : javajs.util.PT.parseIntNext(edata, nexte)); if (edgeMask < 0 || edgeMask > 7) edgeMask = 7; } if (nColors > 0) { int c = PT.parseIntNext(colorData, nextc); if (c == Integer.MIN_VALUE) nColors = 0; else color = c; nColors--; } addTriangleCheck(vertex[0], vertex[1], vertex[2], edgeMask, 0, false, color); i++; } } }
private static String getEncoding(String data) { // original JVXL does not include "encoding" if (XmlReader.getXmlAttrib(data, "len").length() > 0) return ""; String s = XmlReader.getXmlAttrib(data, "encoding"); return (s.length() == 0 ? "none" : s); }
private String getData(String sdata, String name) throws Exception { String data = XmlReader.getXmlAttrib(sdata, "data"); if (data.length() == 0) data = xr.getXmlData(name, sdata, false, false); return data; }
protected void jvxlReadSurfaceInfo() throws Exception { String s; String data = xr.getXmlData("jvxlSurfaceInfo", null, true, true); isXLowToHigh = XmlReader.getXmlAttrib(data, "isXLowToHigh").equals("true"); jvxlCutoff = parseFloatStr(XmlReader.getXmlAttrib(data, "cutoff")); if (!Float.isNaN(jvxlCutoff)) Logger.info("JVXL read: cutoff " + jvxlCutoff); int nContourData = parseIntStr(XmlReader.getXmlAttrib(data, "nContourData")); haveContourData = (nContourData > 0); params.isContoured = XmlReader.getXmlAttrib(data, "contoured").equals("true"); if (params.isContoured) { int nContoursRead = parseIntStr(XmlReader.getXmlAttrib(data, "nContours")); if (nContoursRead <= 0) { nContoursRead = 0; } else { s = XmlReader.getXmlAttrib(data, "contourValues"); if (s.length() > 0) { jvxlData.contourValues = params.contoursDiscrete = parseFloatArrayStr(s); Logger.info("JVXL read: contourValues " + Escape.eAF(jvxlData.contourValues)); } s = XmlReader.getXmlAttrib(data, "contourColors"); if (s.length() > 0) { jvxlData.contourColixes = params.contourColixes = C.getColixArray(s); jvxlData.contourColors = C.getHexCodes(jvxlData.contourColixes); Logger.info("JVXL read: contourColixes " + C.getHexCodes(jvxlData.contourColixes)); } params.contourFromZero = XmlReader.getXmlAttrib(data, "contourFromZero").equals("true"); } params.nContours = (haveContourData ? nContourData : nContoursRead); // TODO ? params.contourFromZero = false; // MEP data to complete the plane } jvxlData.nVertexColors = parseIntStr(XmlReader.getXmlAttrib(data, "nVertexColors")); params.isBicolorMap = XmlReader.getXmlAttrib(data, "bicolorMap").equals("true"); if (params.isBicolorMap) { // TODO -- not quite right, because s = XmlReader.getXmlAttrib(data, "colorPositive"); if (s.length() > 0 && params.colorRgb == Integer.MIN_VALUE && params.colorPos == Parameters.defaultColorPositive) params.colorPos = CU.getArgbFromString(s); s = XmlReader.getXmlAttrib(data, "colorNegative"); if (s.length() > 0 && params.colorRgb == Integer.MIN_VALUE && params.colorNeg == Parameters.defaultColorNegative) params.colorNeg = CU.getArgbFromString(s); } if (params.isBicolorMap || params.colorBySign) jvxlCutoff = 0; jvxlDataIsColorMapped = ((params.colorRgb == Integer.MIN_VALUE || params.colorRgb == Integer.MAX_VALUE) && (params.isBicolorMap || XmlReader.getXmlAttrib(data, "colorMapped").equals("true"))); // isJvxlPrecisionColor is for information only -- will be superceded by encoding attribute of // jvxlColorData jvxlData.isJvxlPrecisionColor = XmlReader.getXmlAttrib(data, "precisionColor").equals("true"); jvxlData.jvxlDataIsColorDensity = params.colorDensity = (params.colorRgb == Integer.MIN_VALUE && XmlReader.getXmlAttrib(data, "colorDensity").equals("true")); if (jvxlData.jvxlDataIsColorDensity && Float.isNaN(params.pointSize)) { s = XmlReader.getXmlAttrib(data, "pointSize"); if (s.length() > 0) jvxlData.pointSize = params.pointSize = parseFloatStr(s); } s = XmlReader.getXmlAttrib(data, "allowVolumeRender"); jvxlData.allowVolumeRender = params.allowVolumeRender = (s.length() == 0 || s.equalsIgnoreCase("true")); s = XmlReader.getXmlAttrib(data, "plane"); if (s.indexOf("{") >= 0) { params.thePlane = null; params.mapLattice = null; try { params.thePlane = (P4) Escape.uP(s); s = XmlReader.getXmlAttrib(data, "maplattice"); Logger.info("JVXL read: plane " + params.thePlane); if (s.indexOf("{") >= 0) { params.mapLattice = (P3) Escape.uP(s); Logger.info("JVXL read: mapLattice " + params.mapLattice); } if (params.scale3d == 0) params.scale3d = parseFloatStr(XmlReader.getXmlAttrib(data, "scale3d")); if (Float.isNaN(params.scale3d)) params.scale3d = 0; } catch (Exception e) { if (params.thePlane == null) { Logger.error("JVXL Error reading plane definition -- setting to 0 0 1 0 (z=0)"); params.thePlane = P4.new4(0, 0, 1, 0); } else { Logger.error("JVXL Error reading mapLattice definition -- ignored"); } } surfaceDataCount = 0; edgeDataCount = 0; } else { params.thePlane = null; surfaceDataCount = parseIntStr(XmlReader.getXmlAttrib(data, "nSurfaceInts")); edgeDataCount = parseIntStr(XmlReader.getXmlAttrib(data, "nBytesUncompressedEdgeData")); } excludedVertexCount = parseIntStr(XmlReader.getXmlAttrib(data, "nExcludedVertexes")); excludedTriangleCount = parseIntStr(XmlReader.getXmlAttrib(data, "nExcludedTriangles")); invalidatedVertexCount = parseIntStr(XmlReader.getXmlAttrib(data, "nInvalidatedVertexes")); s = XmlReader.getXmlAttrib(data, "slabInfo"); if (s.length() > 0) jvxlData.slabInfo = s; colorDataCount = Math.max(0, parseIntStr(XmlReader.getXmlAttrib(data, "nBytesUncompressedColorData"))); jvxlDataIs2dContour = (params.thePlane != null && jvxlDataIsColorMapped); // new Jmol 12.1.50 jvxlData.color = XmlReader.getXmlAttrib(data, "color"); if (jvxlData.color.length() == 0 || jvxlData.color.indexOf("null") >= 0) jvxlData.color = "orange"; jvxlData.translucency = parseFloatStr(XmlReader.getXmlAttrib(data, "translucency")); if (Float.isNaN(jvxlData.translucency)) jvxlData.translucency = 0; s = XmlReader.getXmlAttrib(data, "meshColor"); if (s.length() > 0) jvxlData.meshColor = s; s = XmlReader.getXmlAttrib(data, "rendering"); if (s.length() > 0) jvxlData.rendering = s; jvxlData.colorScheme = XmlReader.getXmlAttrib(data, "colorScheme"); if (jvxlData.colorScheme.length() == 0) jvxlData.colorScheme = null; if (jvxlData.thisSet < 0) { int n = parseIntStr(XmlReader.getXmlAttrib(data, "set")); if (n > 0) jvxlData.thisSet = n - 1; } jvxlData.slabValue = parseIntStr(XmlReader.getXmlAttrib(data, "slabValue")); jvxlData.isSlabbable = (XmlReader.getXmlAttrib(data, "slabbable").equalsIgnoreCase("true")); jvxlData.diameter = parseIntStr(XmlReader.getXmlAttrib(data, "diameter")); if (jvxlData.diameter == Integer.MIN_VALUE) jvxlData.diameter = 0; if (jvxlDataIs2dContour) params.isContoured = true; if (params.colorBySign) params.isBicolorMap = true; boolean insideOut = XmlReader.getXmlAttrib(data, "insideOut").equals("true"); float dataMin = Float.NaN; float dataMax = Float.NaN; float red = Float.NaN; float blue = Float.NaN; if (jvxlDataIsColorMapped) { dataMin = parseFloatStr(XmlReader.getXmlAttrib(data, "dataMinimum")); dataMax = parseFloatStr(XmlReader.getXmlAttrib(data, "dataMaximum")); red = parseFloatStr(XmlReader.getXmlAttrib(data, "valueMappedToRed")); blue = parseFloatStr(XmlReader.getXmlAttrib(data, "valueMappedToBlue")); if (Float.isNaN(dataMin)) { dataMin = red = -1f; dataMax = blue = 1f; } } jvxlSetColorRanges(dataMin, dataMax, red, blue, insideOut); }