void jvxlReadDefinitionLine(boolean showMsg) throws Exception {
		while ((line = br.readLine()) != null && line.length() == 0 || line.charAt(0) == '#') {
		}
		if (showMsg)
			Logger.info("reading jvxl data set: " + line);

		jvxlCutoff = parseFloat(line);
		Logger.info("JVXL read: cutoff " + jvxlCutoff);

		// cutoff param1 param2 param3
		// | | |
		// when | | > 0 ==> 1-byte jvxlDataIsColorMapped
		// when | | == -1 ==> not color mapped
		// when | | < -1 ==> 2-byte jvxlDataIsPrecisionColor
		// when == -1 && == -1 ==> noncontoured plane
		// when == -1 && == -2 ==> contourable plane
		// when < -1 && > 0 ==> contourable functionXY
		// when > 0 && < 0 ==> jvxlDataisBicolorMap

		// early on I wasn't contouring planes, so it's possible that a plane would
		// not be contoured (-1 -1), but that is NOT a possibility anymore with Jmol.
		// instead, we just set "contour 1" to indicate just one contour to demo that.
		// In addition, now we consider contouring functionXY, so in that case we would
		// have surface data, edge data, and color data

		int param1 = parseInt();
		int param2 = parseInt();
		int param3 = parseInt();
		if (param3 == Integer.MIN_VALUE || param3 == -1)
			param3 = 0;

		if (param1 == -1) {
			// a plane is defined
			try {
				thePlane = new Point4f(parseFloat(), parseFloat(), parseFloat(), parseFloat());
			}
			catch (Exception e) {
				Logger.error("Error reading 4 floats for PLANE definition -- setting to 0 0 1 0  (z=0)");
				thePlane = new Point4f(0, 0, 1, 0);
			}
			Logger.info("JVXL read: {" + thePlane.x + " " + thePlane.y + " " + thePlane.z + " " + thePlane.w + "}");
		}
		else {
			thePlane = null;
		}
		if (param1 < 0 && param2 != -1) {
			isContoured = (param3 != 0);
			// contours are defined (possibly overridden -- this is just a display option
			// could be plane or functionXY
			int nContoursRead = parseInt();
			if (nContours == 0 && nContoursRead != Integer.MIN_VALUE && nContoursRead != 0
					&& nContoursRead <= nContourMax) {
				nContours = nContoursRead;
				Logger.info("JVXL read: contours " + nContours);
			}
		}
		else {
			isContoured = false;
		}

		jvxlDataIsPrecisionColor = (param1 == -1 && param2 == -2 || param3 < 0);
		isBicolorMap = jvxlDataisBicolorMap = (param1 > 0 && param2 < 0);
		jvxlDataIsColorMapped = (param3 != 0);
		jvxlDataIs2dContour = (jvxlDataIsColorMapped && isContoured);

		if (isBicolorMap || colorBySign)
			jvxlCutoff = 0;
		jvxlSurfaceDataCount = (param1 < -1 ? -param1 : param1 > 0 ? param1 : 0);
		if (param1 == -1)
			jvxlEdgeDataCount = 0; // plane
		else jvxlEdgeDataCount = (param2 < -1 ? -param2 : param2 > 0 ? param2 : 0);
		jvxlColorDataCount = (param3 < -1 ? -param3 : param3 > 0 ? param3 : 0);

		if (jvxlDataIsColorMapped) {
			float dataMin = parseFloat();
			float dataMax = parseFloat();
			float red = parseFloat();
			float blue = parseFloat();
			if (!Float.isNaN(dataMin) && !Float.isNaN(dataMax)) {
				if (dataMax == 0 && dataMin == 0) {
					// set standard -1/1; bit of a hack
					dataMin = -1;
					dataMax = 1;
				}
				mappedDataMin = dataMin;
				mappedDataMax = dataMax;
				Logger.info("JVXL read: data min/max: " + mappedDataMin + "/" + mappedDataMax);
			}
			if (!rangeDefined)
				if (!Float.isNaN(red) && !Float.isNaN(blue)) {
					if (red == 0 && blue == 0) {
						// set standard -1/1; bit of a hack
						red = -1;
						blue = 1;
					}
					valueMappedToRed = red;
					valueMappedToBlue = blue;
					rangeDefined = true;
				}
				else {
					valueMappedToRed = 0f;
					valueMappedToBlue = 1f;
					rangeDefined = true;
				}
			Logger.info("JVXL read: color red/blue: " + valueMappedToRed + " " + valueMappedToBlue);
		}
	}