int readVolumetricHeader() {
		precalculateVoxelData = false;
		try {
			switch (dataType) {
			case SURFACE_SPHERE:
			case SURFACE_ELLIPSOID:
				setupSphere();
				break;
			case SURFACE_LOBE:
				setupLobe();
				break;
			case SURFACE_NOMAP:
			case SURFACE_SOLVENT:
			case SURFACE_MOLECULAR:
			case SURFACE_SASURFACE:
				setupSolvent();
				break;
			case SURFACE_ATOMICORBITAL:
				setupOrbital();
				break;
			case SURFACE_MOLECULARORBITAL:
				setupQMOrbital();
				break;
			case SURFACE_FUNCTIONXY:
				setupFunctionXY();
				break;
			case SURFACE_MEP:
				setupMep();
				break;
			case SURFACE_INFO:
				setupSurfaceInfo();
				break;
			case SURFACE_FILE:
			default:
				readTitleLines();
				readAtomCountAndOrigin();
				if (!isSilent)
					Logger.debug("voxel grid origin:" + volumetricOrigin);
				for (int i = 0; i < 3; ++i) {
					readVoxelVector(i);
					if (!isSilent)
						Logger.debug("voxel grid vector:" + volumetricVectors[i]);
				}
			}

			setupMatrix(volumetricMatrix, volumetricVectors);
			if (dataType != SURFACE_LOBE && center.x != Float.MAX_VALUE)
				offsetCenter();
			readAtoms();
			return readExtraLine();
		}
		catch (Exception e) {
			Logger.error(null, e);
			throw new NullPointerException();
		}
	}