diff --git a/src/main/java/azgracompress/cli/functions/MeasurePlaneErrorFunction.java b/src/main/java/azgracompress/cli/functions/MeasurePlaneErrorFunction.java
index 2fac49bdcd488f1d9ecf5fe300f50660e3709239..9c46c05d89da276216dcd1bcfd666198d9e71667 100644
--- a/src/main/java/azgracompress/cli/functions/MeasurePlaneErrorFunction.java
+++ b/src/main/java/azgracompress/cli/functions/MeasurePlaneErrorFunction.java
@@ -17,85 +17,152 @@ public class MeasurePlaneErrorFunction extends CustomFunctionBase {
         super(options);
     }
 
+    private final String COMP_FILE_ch0 = "D:\\biology\\tiff_data\\benchmark\\fused_tp_10_ch_0_16bit.raw";
+    private final String COMP_FILE_ch1 = "D:\\biology\\tiff_data\\benchmark\\fused_tp_10_ch_1_16bit.raw";
+
     @Override
     public boolean run() {
-//        if (reportPlaneDifference(
-//                "D:\\biology\\tiff_data\\quantized\\middle_frame\\fused_tp_10_ch_1_16bit_sq_cb256.raw",
-//                "D:\\biology\\tiff_data\\quantized\\middle_frame\\plane_diff_ch1\\sq_cb256_plane_log.data")) {
-//            return false;
-//        }
-
-//        if (reportPlaneDifference(
-//                "D:\\biology\\tiff_data\\quantized\\middle_frame\\fused_tp_10_ch_1_16bit_vq3x3_cb128.raw",
-//                "D:\\biology\\tiff_data\\quantized\\middle_frame\\plane_diff_ch1\\vq3x3_cb128_plane_log.data")) {
-//            return false;
-//        }
-//
-//        if (reportPlaneDifference(
-//                "D:\\biology\\tiff_data\\quantized\\middle_frame\\fused_tp_10_ch_1_16bit_vq3x3_cb64.raw",
-//                "D:\\biology\\tiff_data\\quantized\\middle_frame\\plane_diff_ch1\\vq3x3_cb64_plane_log.data")) {
-//            return false;
-//        }
-//
-//        if (reportPlaneDifference(
-//                "D:\\biology\\tiff_data\\quantized\\middle_frame\\fused_tp_10_ch_1_16bit_vq3x3_cb32.raw",
-//                "D:\\biology\\tiff_data\\quantized\\middle_frame\\plane_diff_ch1\\vq3x3_cb32_plane_log.data")) {
-//            return false;
-//        }
-//
-//        if (reportPlaneDifference(
-//                "D:\\biology\\tiff_data\\quantized\\middle_frame\\fused_tp_10_ch_1_16bit_vq3x3_cb16.raw",
-//                "D:\\biology\\tiff_data\\quantized\\middle_frame\\plane_diff_ch1\\vq3x3_cb16_plane_log.data")) {
-//            return false;
-//        }
-//
-//        if (reportPlaneDifference(
-//                "D:\\biology\\tiff_data\\quantized\\middle_frame\\fused_tp_10_ch_1_16bit_vq3x3_cb8.raw",
-//                "D:\\biology\\tiff_data\\quantized\\middle_frame\\plane_diff_ch1\\vq3x3_cb8_plane_log.data")) {
-//            return false;
-//        }
-//
+        final int channel = 1;
+        assert (channel == 0 || channel == 1);
+        final String comp_file = channel == 0 ? COMP_FILE_ch0 : COMP_FILE_ch1;
+        final String method = "sq";
+        final String type = "plane_codebook";
+        final String folder = "D:\\biology\\tiff_data\\quantized";
+
+        if (reportPlaneDifference(
+                String.format("%s\\%s\\fused_tp_10_ch_%d_16bit_%s_cb256.raw", folder, type, channel, method),
+                String.format("%s\\%s\\plane_diff_ch%d\\%s_cb256_plane_log.data", folder, type, channel, method),
+                comp_file)) {
+            return false;
+        }
+
+        if (reportPlaneDifference(
+                String.format("%s\\%s\\fused_tp_10_ch_%d_16bit_%s_cb128.raw", folder, type, channel, method),
+                String.format("%s\\%s\\plane_diff_ch%d\\%s_cb128_plane_log.data", folder, type, channel, method),
+                comp_file)) {
+            return false;
+        }
+
         if (reportPlaneDifference(
-                "D:\\biology\\tiff_data\\quantized\\middle_frame\\fused_tp_10_ch_1_16bit_sq_cb4.raw",
-                "D:\\biology\\tiff_data\\quantized\\middle_frame\\plane_diff_ch1\\sq_cb4_plane_log.data")) {
+                String.format("%s\\%s\\fused_tp_10_ch_%d_16bit_%s_cb64.raw", folder, type, channel, method),
+                String.format("%s\\%s\\plane_diff_ch%d\\%s_cb64_plane_log.data", folder, type, channel, method),
+                comp_file)) {
             return false;
         }
 
+        if (reportPlaneDifference(
+                String.format("%s\\%s\\fused_tp_10_ch_%d_16bit_%s_cb32.raw", folder, type, channel, method),
+                String.format("%s\\%s\\plane_diff_ch%d\\%s_cb32_plane_log.data", folder, type, channel, method),
+                comp_file)) {
+            return false;
+        }
+
+        if (reportPlaneDifference(
+                String.format("%s\\%s\\fused_tp_10_ch_%d_16bit_%s_cb16.raw", folder, type, channel, method),
+                String.format("%s\\%s\\plane_diff_ch%d\\%s_cb16_plane_log.data", folder, type, channel, method),
+                comp_file)) {
+            return false;
+        }
+
+        if (reportPlaneDifference(
+                String.format("%s\\%s\\fused_tp_10_ch_%d_16bit_%s_cb8.raw", folder, type, channel, method),
+                String.format("%s\\%s\\plane_diff_ch%d\\%s_cb8_plane_log.data", folder, type, channel, method),
+                comp_file)) {
+            return false;
+        }
+
+        if (reportPlaneDifference(
+                String.format("%s\\%s\\fused_tp_10_ch_%d_16bit_%s_cb4.raw", folder, type, channel, method),
+                String.format("%s\\%s\\plane_diff_ch%d\\%s_cb4_plane_log.data", folder, type, channel, method),
+                comp_file)) {
+            return false;
+        }
+
+        //        if (reportPlaneDifference(
+        //                "D:\\biology\\tiff_data\\quantized\\plane_codebook\\fused_tp_10_ch_1_16bit_sq_cb4.raw",
+        //                "D:\\biology\\tiff_data\\quantized\\plane_codebook\\plane_diff_ch1\\sq_cb4_plane_log.data",
+        //                comp_file)) {
+        //            return false;
+        //        }
+
 
         return true;
     }
 
-    private boolean reportPlaneDifference(final String compressedFile, final String reportFile) {
-        final String referenceFile = "D:\\biology\\tiff_data\\benchmark\\fused_tp_10_ch_1_16bit.raw";
-
+    private boolean reportPlaneDifference(final String compressedFile, final String reportFile, final String compFile) {
+        final String referenceFile = compFile;
+        final int workerCount = 8;
         final V3i dims = new V3i(1041, 996, 946);
         final int planePixelCount = dims.getX() * dims.getY();
         System.out.println(options.report());
         System.out.println("Run custom function.");
-        ImageU16 compressedPlane = null;
-        ImageU16 originalPlane = null;
-        ImageU16 differencePlane = null;
+        //        ImageU16 compressedPlane = null;
+        //        ImageU16 originalPlane = null;
+        //        ImageU16 differencePlane = null;
 
         PlaneError[] planeErrors = new PlaneError[dims.getZ()];
 
-        for (int planeIndex = 0; planeIndex < dims.getZ(); planeIndex++) {
-            try {
-                originalPlane = RawDataIO.loadImageU16(referenceFile, dims, planeIndex);
-                compressedPlane = RawDataIO.loadImageU16(compressedFile, dims, planeIndex);
-            } catch (IOException e) {
-                e.printStackTrace();
-                return true;
-            }
-            final int[] diffData = Utils.getDifference(originalPlane.getData(), compressedPlane.getData());
-            Utils.applyAbsFunction(diffData);
+        Thread[] workers = new Thread[workerCount];
+        final int workSize = dims.getZ() / workerCount;
+
+        for (int wId = 0; wId < workerCount; wId++) {
+            final int fromIndex = wId * workSize;
+            final int toIndex = (wId == workerCount - 1) ? dims.getZ() : (workSize + (wId * workSize));
 
+            workers[wId] = new Thread(() -> {
 
-            final double absDiffSum = Arrays.stream(diffData).mapToDouble(v -> v).sum();
-            final double meanPixelError = absDiffSum / (double) planePixelCount;
+                ImageU16 originalPlane, compressedPlane, differencePlane;
+                for (int planeIndex = fromIndex; planeIndex < toIndex; planeIndex++) {
+                    try {
+                        originalPlane = RawDataIO.loadImageU16(referenceFile, dims, planeIndex);
+                        compressedPlane = RawDataIO.loadImageU16(compressedFile, dims, planeIndex);
+                    } catch (IOException e) {
+                        e.printStackTrace();
+                        break;
+                    }
 
-            planeErrors[planeIndex] = new PlaneError(planeIndex, absDiffSum, meanPixelError);
-            //            System.out.println("Finished plane: " + planeIndex);
+
+                    final int[] diffData = Utils.getDifference(originalPlane.getData(), compressedPlane.getData());
+                    Utils.applyAbsFunction(diffData);
+
+                    final double absDiffSum = Arrays.stream(diffData).mapToDouble(v -> v).sum();
+                    final double meanPixelError = absDiffSum / (double) planePixelCount;
+
+                    planeErrors[planeIndex] = new PlaneError(planeIndex, absDiffSum, meanPixelError);
+                }
+            });
+
+            workers[wId].start();
         }
+        try {
+            for (int wId = 0; wId < workerCount; wId++) {
+                workers[wId].join();
+            }
+        } catch (InterruptedException e) {
+            e.printStackTrace();
+        }
+
+
+        //        for (int planeIndex = 0; planeIndex < dims.getZ(); planeIndex++) {
+        //            try {
+        //                originalPlane = RawDataIO.loadImageU16(referenceFile, dims, planeIndex);
+        //                compressedPlane = RawDataIO.loadImageU16(compressedFile, dims, planeIndex);
+        //            } catch (IOException e) {
+        //                e.printStackTrace();
+        //                return true;
+        //            }
+        //
+        //
+        //            final int[] diffData = Utils.getDifference(originalPlane.getData(), compressedPlane.getData());
+        //            Utils.applyAbsFunction(diffData);
+        //
+        //
+        //            final double absDiffSum = Arrays.stream(diffData).mapToDouble(v -> v).sum();
+        //            final double meanPixelError = absDiffSum / (double) planePixelCount;
+        //
+        //            planeErrors[planeIndex] = new PlaneError(planeIndex, absDiffSum, meanPixelError);
+        //            //            System.out.println("Finished plane: " + planeIndex);
+        //        }
 
         try (FileOutputStream fos = new FileOutputStream(reportFile, false);
              OutputStreamWriter writer = new OutputStreamWriter(fos)) {