org.jmol.jvxl.readers
Class JvxlReader

java.lang.Object
  extended by org.jmol.jvxl.readers.SurfaceReader
      extended by org.jmol.jvxl.readers.SurfaceFileReader
          extended by org.jmol.jvxl.readers.VolumeFileReader
              extended by org.jmol.jvxl.readers.JvxlReader
All Implemented Interfaces:
VertexDataServer

public class JvxlReader
extends VolumeFileReader


Field Summary
private  int colorDataCount
           
static int defaultColorFractionBase
           
static int defaultColorFractionRange
           
static int defaultEdgeFractionBase
           
static int defaultEdgeFractionRange
           
private  int edgeDataCount
           
private  int fractionPtr
           
private  boolean haveContourData
           
private static java.lang.String JVXL_VERSION
           
private  int nThisValue
           
private  java.lang.String strFractionTemp
           
private  int surfaceDataCount
           
private  boolean thisInside
           
 
Fields inherited from class org.jmol.jvxl.readers.VolumeFileReader
atomCount, canDownsample, endOfData, isAngstroms, negativeAtomCount
 
Fields inherited from class org.jmol.jvxl.readers.SurfaceFileReader
binarydoc, br, line, next
 
Fields inherited from class org.jmol.jvxl.readers.SurfaceReader
ANGSTROMS_PER_BOHR, cJvxlEdgeNaN, colorEncoder, colorFractionBase, colorFractionRange, contourVertexCount, defaultCutoff, defaultMappedDataMax, defaultMappedDataMin, edgeFractionBase, edgeFractionRange, fractionData, hasColorData, isApbsDx, isJvxl, isProgressive, isXLowToHigh, jvxlColorDataRead, jvxlCutoff, jvxlData, jvxlDataIs2dContour, jvxlDataIsColorMapped, jvxlDataIsPrecisionColor, jvxlEdgeDataRead, jvxlFileHeaderBuffer, jvxlNSurfaceInts, jvxlVoxelBitSet, marchingSquares, meshData, meshDataServer, nBytes, nDataPoints, nPointsX, nPointsY, nPointsZ, params, ptTemp, sg, vContours, vertexDataOnly, volumeData, volumetricOrigin, volumetricVectors, voxelCounts, voxelData
 
Constructor Summary
JvxlReader(SurfaceGenerator sg, java.io.BufferedReader br)
           
 
Method Summary
private  int countData(java.lang.String str)
           
private  void getEncodedVertexData()
          retrieve Jvxl 2.0 format vertex/triangle/color data found within element
protected  float getNextVoxelValue(java.lang.StringBuffer sb)
           
protected  float getSurfacePointAndFraction(float cutoff, boolean isCutoffAbsolute, float valueA, float valueB, javax.vecmath.Point3f pointA, javax.vecmath.Vector3f edgeVector, float[] fReturn, javax.vecmath.Point3f ptReturn)
           
protected  java.util.BitSet getVoxelBitSet(int nPoints)
           
private static java.lang.String getXmlAttrib(java.lang.String data, java.lang.String what)
           
private  java.lang.String getXmlData(java.lang.String name, java.lang.String data, boolean withTag)
          a relatively simple XML reader for this specific application.
protected  boolean gotoAndReadVoxelData(boolean isMapData)
           
protected  void gotoData(int n, int nPoints)
           
protected  void initializeVoxelData()
           
private static void jvxlAddDummyAtomList(VolumeData v, java.lang.StringBuffer bs)
           
private static void jvxlAppendCharacter2(float value, float min, float max, int base, int range, java.lang.StringBuffer list1, java.lang.StringBuffer list2)
           
protected static boolean jvxlCheckAtomLine(boolean isXLowToHigh, boolean isAngstroms, java.lang.String strAtomCount, java.lang.String atomLine, java.lang.StringBuffer bs)
          checks an atom line for "ANGSTROMS", possibly overriding the data's natural units, BOHR (similar to Gaussian CUBE files).
static java.lang.String jvxlCompressString(java.lang.String data)
           
static void jvxlCreateColorData(JvxlData jvxlData, float[] vertexValues)
           
protected static void jvxlCreateHeader(VolumeData v, int nAtoms, javax.vecmath.Point3f[] atomXyz, int[] atomNo, java.lang.StringBuffer sb)
           
protected static void jvxlCreateHeaderWithoutTitleOrAtoms(VolumeData v, java.lang.StringBuffer bs)
           
private static java.util.BitSet jvxlDecodeBitSet(java.lang.String data)
           
private  void jvxlDecodeContourData(java.lang.String data)
           
(package private)  int[][] jvxlDecodeTriangleData(java.lang.String data, java.lang.String colorData, boolean asArray)
          decode triangle data found within element as created with jvxlEncodeTriangleData (see above)
 javax.vecmath.Point3f[] jvxlDecodeVertexData(java.lang.String data, boolean asArray)
          decode vertex data found within element as created by jvxlEncodeVertexData (see above)
private static int jvxlEncodeBitSet(java.util.BitSet bs, int nPoints, java.lang.StringBuffer sb)
           
private static void jvxlEncodeContourData(java.util.Vector[] contours, java.lang.StringBuffer sb)
           
static java.lang.String jvxlEncodeTriangleData(int[][] triangles, int nData, int[] vertexIdNew)
          encode triangle data -- [ia ib ic] [ia ib ic] [ia ib ic] ...
static java.lang.String jvxlEncodeVertexData(MeshDataServer meshDataServer, JvxlData jvxlData, int[] vertexIdNew, javax.vecmath.Point3f[] vertices, float[] vertexValues, int vertexCount, short[] polygonColixes, int polygonCount, boolean addColorData)
          encode the vertex data.
protected static java.lang.String jvxlExtraLine(JvxlData jvxlData, int n)
           
static char jvxlFractionAsCharacter(float fraction)
           
protected static char jvxlFractionAsCharacter(float fraction, int base, int range)
           
protected static float jvxlFractionFromCharacter(int ich, int base, int range, float fracOffset)
           
protected static float jvxlFractionFromCharacter2(int ich1, int ich2, int base, int range)
           
static java.lang.String jvxlGetDefinitionLine(JvxlData jvxlData, boolean isInfo)
           
static java.lang.String jvxlGetFile(MeshDataServer meshDataServer, JvxlData jvxlData, MeshData meshData, java.lang.String[] title, java.lang.String msg, boolean includeHeader, int nSurfaces, java.lang.String state, java.lang.String comment)
           
private  float jvxlGetNextFraction(int base, int range, float fracOffset)
           
protected static void jvxlReadAtoms(java.io.BufferedReader br, java.lang.StringBuffer bs, int atomCount, VolumeData v)
           
private  java.lang.String jvxlReadData(java.lang.String type, int nPoints)
           
private  void jvxlReadDefinitionLine(boolean showMsg)
           
private  void jvxlSkipData(int nPoints, boolean doSkipColorData)
           
private  void jvxlSkipDataBlock(int nPoints, boolean isInt)
           
private static java.lang.String jvxlUncompressString(java.lang.String data)
           
protected static void jvxlUpdateInfo(JvxlData jvxlData, java.lang.String[] title, int nBytes)
           
static void jvxlUpdateInfoLines(JvxlData jvxlData)
           
static void jvxlUpdateSurfaceData(JvxlData jvxlData, float[] vertexValues, int vertexCount, int vertexIncrement, char isNaN)
           
protected static char jvxlValueAsCharacter(float value, float min, float max, int base, int range)
           
protected static float jvxlValueFromCharacter2(int ich, int ich2, float min, float max, int base, int range)
           
protected  void readAtomCountAndOrigin()
           
protected  java.lang.String readColorData()
           
protected  int readExtraLine()
           
protected  void readSurfaceData(boolean isMapDataIgnored)
           
protected  void readTitleLines()
           
protected  boolean readVolumeData(boolean isMapData)
           
static void set3dContourVector(java.util.Vector v, int[][] polygonIndexes, javax.vecmath.Point3f[] vertices)
           
private static int setNext(java.lang.String data, java.lang.String what, int[] next, int offset)
          shift pointer to a new tag or field contents
protected static void setSurfaceInfo(JvxlData jvxlData, javax.vecmath.Point4f thePlane, int nSurfaceInts, java.lang.StringBuffer surfaceData)
           
static void setSurfaceInfoFromBitSet(JvxlData jvxlData, java.util.BitSet bs, javax.vecmath.Point4f thePlane)
           
 
Methods inherited from class org.jmol.jvxl.readers.VolumeFileReader
getNextVoxelValue, nextVoxel, readVolumeParameters, readVolumetricHeader, readVoxelVector, skipComments, skipData
 
Methods inherited from class org.jmol.jvxl.readers.SurfaceFileReader
determineFileType, discardTempData, getTokens, parseFloat, parseFloat, parseInt, parseInt, parseIntNext, skipTo
 
Methods inherited from class org.jmol.jvxl.readers.SurfaceReader
addTriangleCheck, addVertexCopy, applyColorScale, colorIsosurface, createIsosurface, excludeMaximumSet, excludeMinimumSet, getArgbFromPalette, getColorIndexFromPalette, getColorPhaseIndex, getMaxMappedValue, getMinMappedValue, getSurfacePointIndexAndFraction, getValue, initializeVolumetricData, jvxlUpdateInfo, resetIsosurface, selectPocket, setVolumeData, updateSurfaceData, updateTriangles
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Field Detail

JVXL_VERSION

private static final java.lang.String JVXL_VERSION
See Also:
Constant Field Values

defaultEdgeFractionBase

public static final int defaultEdgeFractionBase
See Also:
Constant Field Values

defaultEdgeFractionRange

public static final int defaultEdgeFractionRange
See Also:
Constant Field Values

defaultColorFractionBase

public static final int defaultColorFractionBase
See Also:
Constant Field Values

defaultColorFractionRange

public static final int defaultColorFractionRange
See Also:
Constant Field Values

surfaceDataCount

private int surfaceDataCount

edgeDataCount

private int edgeDataCount

colorDataCount

private int colorDataCount

haveContourData

private boolean haveContourData

nThisValue

private int nThisValue

thisInside

private boolean thisInside

fractionPtr

private int fractionPtr

strFractionTemp

private java.lang.String strFractionTemp
Constructor Detail

JvxlReader

JvxlReader(SurfaceGenerator sg,
           java.io.BufferedReader br)
Method Detail

jvxlUpdateInfo

protected static void jvxlUpdateInfo(JvxlData jvxlData,
                                     java.lang.String[] title,
                                     int nBytes)

jvxlUpdateInfoLines

public static void jvxlUpdateInfoLines(JvxlData jvxlData)

readVolumeData

protected boolean readVolumeData(boolean isMapData)
Overrides:
readVolumeData in class VolumeFileReader

gotoAndReadVoxelData

protected boolean gotoAndReadVoxelData(boolean isMapData)
Overrides:
gotoAndReadVoxelData in class SurfaceReader

initializeVoxelData

protected void initializeVoxelData()

readSurfaceData

protected void readSurfaceData(boolean isMapDataIgnored)
                        throws java.lang.Exception
Overrides:
readSurfaceData in class VolumeFileReader
Throws:
java.lang.Exception

readTitleLines

protected void readTitleLines()
                       throws java.lang.Exception
Overrides:
readTitleLines in class VolumeFileReader
Throws:
java.lang.Exception

jvxlCheckAtomLine

protected static boolean jvxlCheckAtomLine(boolean isXLowToHigh,
                                           boolean isAngstroms,
                                           java.lang.String strAtomCount,
                                           java.lang.String atomLine,
                                           java.lang.StringBuffer bs)
checks an atom line for "ANGSTROMS", possibly overriding the data's natural units, BOHR (similar to Gaussian CUBE files).

Parameters:
isXLowToHigh -
isAngstroms -
strAtomCount -
atomLine -
bs -
Returns:
isAngstroms

readAtomCountAndOrigin

protected void readAtomCountAndOrigin()
                               throws java.lang.Exception
Overrides:
readAtomCountAndOrigin in class VolumeFileReader
Throws:
java.lang.Exception

jvxlReadAtoms

protected static void jvxlReadAtoms(java.io.BufferedReader br,
                                    java.lang.StringBuffer bs,
                                    int atomCount,
                                    VolumeData v)
                             throws java.lang.Exception
Throws:
java.lang.Exception

readExtraLine

protected int readExtraLine()
                     throws java.lang.Exception
Overrides:
readExtraLine in class VolumeFileReader
Throws:
java.lang.Exception

jvxlReadDefinitionLine

private void jvxlReadDefinitionLine(boolean showMsg)
                             throws java.lang.Exception
Throws:
java.lang.Exception

jvxlReadData

private java.lang.String jvxlReadData(java.lang.String type,
                                      int nPoints)

jvxlCompressString

public static java.lang.String jvxlCompressString(java.lang.String data)

jvxlUncompressString

private static java.lang.String jvxlUncompressString(java.lang.String data)

getVoxelBitSet

protected java.util.BitSet getVoxelBitSet(int nPoints)
                                   throws java.lang.Exception
Overrides:
getVoxelBitSet in class VolumeFileReader
Throws:
java.lang.Exception

getNextVoxelValue

protected float getNextVoxelValue(java.lang.StringBuffer sb)
                           throws java.lang.Exception
Throws:
java.lang.Exception

setSurfaceInfoFromBitSet

public static void setSurfaceInfoFromBitSet(JvxlData jvxlData,
                                            java.util.BitSet bs,
                                            javax.vecmath.Point4f thePlane)

jvxlEncodeBitSet

private static int jvxlEncodeBitSet(java.util.BitSet bs,
                                    int nPoints,
                                    java.lang.StringBuffer sb)

jvxlDecodeBitSet

private static java.util.BitSet jvxlDecodeBitSet(java.lang.String data)

setSurfaceInfo

protected static void setSurfaceInfo(JvxlData jvxlData,
                                     javax.vecmath.Point4f thePlane,
                                     int nSurfaceInts,
                                     java.lang.StringBuffer surfaceData)

getSurfacePointAndFraction

protected float getSurfacePointAndFraction(float cutoff,
                                           boolean isCutoffAbsolute,
                                           float valueA,
                                           float valueB,
                                           javax.vecmath.Point3f pointA,
                                           javax.vecmath.Vector3f edgeVector,
                                           float[] fReturn,
                                           javax.vecmath.Point3f ptReturn)
Overrides:
getSurfacePointAndFraction in class SurfaceReader

jvxlGetNextFraction

private float jvxlGetNextFraction(int base,
                                  int range,
                                  float fracOffset)

readColorData

protected java.lang.String readColorData()
Overrides:
readColorData in class SurfaceReader

gotoData

protected void gotoData(int n,
                        int nPoints)
                 throws java.lang.Exception
Overrides:
gotoData in class VolumeFileReader
Throws:
java.lang.Exception

jvxlSkipData

private void jvxlSkipData(int nPoints,
                          boolean doSkipColorData)
                   throws java.lang.Exception
Throws:
java.lang.Exception

jvxlSkipDataBlock

private void jvxlSkipDataBlock(int nPoints,
                               boolean isInt)
                        throws java.lang.Exception
Throws:
java.lang.Exception

countData

private int countData(java.lang.String str)

jvxlCreateHeaderWithoutTitleOrAtoms

protected static void jvxlCreateHeaderWithoutTitleOrAtoms(VolumeData v,
                                                          java.lang.StringBuffer bs)

jvxlCreateHeader

protected static void jvxlCreateHeader(VolumeData v,
                                       int nAtoms,
                                       javax.vecmath.Point3f[] atomXyz,
                                       int[] atomNo,
                                       java.lang.StringBuffer sb)

jvxlAddDummyAtomList

private static void jvxlAddDummyAtomList(VolumeData v,
                                         java.lang.StringBuffer bs)

jvxlGetDefinitionLine

public static java.lang.String jvxlGetDefinitionLine(JvxlData jvxlData,
                                                     boolean isInfo)

jvxlExtraLine

protected static java.lang.String jvxlExtraLine(JvxlData jvxlData,
                                                int n)

jvxlGetFile

public static java.lang.String jvxlGetFile(MeshDataServer meshDataServer,
                                           JvxlData jvxlData,
                                           MeshData meshData,
                                           java.lang.String[] title,
                                           java.lang.String msg,
                                           boolean includeHeader,
                                           int nSurfaces,
                                           java.lang.String state,
                                           java.lang.String comment)

jvxlEncodeContourData

private static void jvxlEncodeContourData(java.util.Vector[] contours,
                                          java.lang.StringBuffer sb)

jvxlFractionFromCharacter

protected static float jvxlFractionFromCharacter(int ich,
                                                 int base,
                                                 int range,
                                                 float fracOffset)

jvxlValueFromCharacter2

protected static float jvxlValueFromCharacter2(int ich,
                                               int ich2,
                                               float min,
                                               float max,
                                               int base,
                                               int range)

jvxlFractionFromCharacter2

protected static float jvxlFractionFromCharacter2(int ich1,
                                                  int ich2,
                                                  int base,
                                                  int range)

jvxlValueAsCharacter

protected static char jvxlValueAsCharacter(float value,
                                           float min,
                                           float max,
                                           int base,
                                           int range)

jvxlFractionAsCharacter

public static char jvxlFractionAsCharacter(float fraction)

jvxlFractionAsCharacter

protected static char jvxlFractionAsCharacter(float fraction,
                                              int base,
                                              int range)

jvxlAppendCharacter2

private static void jvxlAppendCharacter2(float value,
                                         float min,
                                         float max,
                                         int base,
                                         int range,
                                         java.lang.StringBuffer list1,
                                         java.lang.StringBuffer list2)

jvxlUpdateSurfaceData

public static void jvxlUpdateSurfaceData(JvxlData jvxlData,
                                         float[] vertexValues,
                                         int vertexCount,
                                         int vertexIncrement,
                                         char isNaN)

jvxlCreateColorData

public static void jvxlCreateColorData(JvxlData jvxlData,
                                       float[] vertexValues)

jvxlEncodeTriangleData

public static java.lang.String jvxlEncodeTriangleData(int[][] triangles,
                                                      int nData,
                                                      int[] vertexIdNew)
encode triangle data -- [ia ib ic] [ia ib ic] [ia ib ic] ... algorithm written by Bob Hanson, 11/2008. The principle is that not all vertices may be represented -- we only need the used vertices here. Capitalizing on the fact that triangle sets tend to have common edges and similar numbers for sequential triangles. a) Renumbering vertices as they appear in the triangle set [2456 2457 2458] [2456 2459 2458] becomes [ 1 2 3] [ 1 4 3] b) This allows efficient encoding of differences, not absolute numbers. 0 1 2 -2 3 -1 c) Which can then be represented often using a single ASCII character. I chose \ to be 0, and replace that with !. ASCII: -30 -20 -10 0 +10 +20 +30 <=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{| So the above sequence would simply be: !]^Z_[ When the range falls outside of +/-32, we simply use a number. When a positive number follows another number, we add a "+" to it. !]^Z_[-33+250]230-210]] Preliminary trials indicated that on average a triangle can be encoded in about 7 bytes, or roughly half the 12 bytes necessary for standard binary encoding of integers. The advantage here is that we have an ASCII-readable file and no little-/big-endian issue.

Parameters:
triangles -
nData -
vertexIdNew -
Returns:
encoded data string

jvxlEncodeVertexData

public static java.lang.String jvxlEncodeVertexData(MeshDataServer meshDataServer,
                                                    JvxlData jvxlData,
                                                    int[] vertexIdNew,
                                                    javax.vecmath.Point3f[] vertices,
                                                    float[] vertexValues,
                                                    int vertexCount,
                                                    short[] polygonColixes,
                                                    int polygonCount,
                                                    boolean addColorData)
encode the vertex data. This must be done AFTER encoding the triangles, because the triangles redefine the order of vertices. Bob Hanson 11/2008 If another program has created the triangles, we probably do not know the grid that was used for Marching Cubes, or quite possibly no grid was used. In that case, we just save the vertex/triangle/value data in a compact form. For the we use an extension of the way edge points are encoded. We simply identify the minimum and maximum x, y, and z coordinates and then express the point as a fraction along each of those directions. Thus, the x, y, and z coordinate are within the interval [0,1]. We opt for the two-byte double-precision JVXL character compression. This allows a 1 part in 8100 resolution, which is plenty for these purposes. The tag will indicate the minimum and maximum values: The resultant string is really two strings of length nData where the first string lists the "high" part of the positions, and the second string lists the "low" part of the positions.

Parameters:
meshDataServer -
jvxlData -
vertexIdNew -
vertices -
vertexValues -
vertexCount -
polygonColixes -
polygonCount -
addColorData -
Returns:
string of encoded data

getEncodedVertexData

private void getEncodedVertexData()
                           throws java.lang.Exception
retrieve Jvxl 2.0 format vertex/triangle/color data found within element

Throws:
java.lang.Exception

jvxlDecodeContourData

private void jvxlDecodeContourData(java.lang.String data)
                            throws java.lang.Exception
Throws:
java.lang.Exception

set3dContourVector

public static void set3dContourVector(java.util.Vector v,
                                      int[][] polygonIndexes,
                                      javax.vecmath.Point3f[] vertices)

getXmlData

private java.lang.String getXmlData(java.lang.String name,
                                    java.lang.String data,
                                    boolean withTag)
                             throws java.lang.Exception
a relatively simple XML reader for this specific application.

Parameters:
name -
data -
withTag -
Returns:
trimmed contents or tag + contents, never closing tag
Throws:
java.lang.Exception

jvxlDecodeVertexData

public javax.vecmath.Point3f[] jvxlDecodeVertexData(java.lang.String data,
                                                    boolean asArray)
decode vertex data found within element as created by jvxlEncodeVertexData (see above)

Parameters:
data - tag and contents
asArray - or just addVertexCopy
Returns:
Point3f[] if desired

jvxlDecodeTriangleData

int[][] jvxlDecodeTriangleData(java.lang.String data,
                               java.lang.String colorData,
                               boolean asArray)
decode triangle data found within element as created with jvxlEncodeTriangleData (see above)

Parameters:
data - tag and contents
colorData -
asArray - or just addTriangleCheck
Returns:
int[][] if desired

getXmlAttrib

private static java.lang.String getXmlAttrib(java.lang.String data,
                                             java.lang.String what)

setNext

private static int setNext(java.lang.String data,
                           java.lang.String what,
                           int[] next,
                           int offset)
shift pointer to a new tag or field contents

Parameters:
data - string of data
what - tag or field name
next - current pointer into data
offset - offset past end of "what" for pointer
Returns:
pointer to data