diff --git a/czi-format/benchmark_results/16Bit-ZStack_c_1.jpg b/czi-format/benchmark_results/16_bit_z_stack/16Bit-ZStack_c_1.jpg similarity index 100% rename from czi-format/benchmark_results/16Bit-ZStack_c_1.jpg rename to czi-format/benchmark_results/16_bit_z_stack/16Bit-ZStack_c_1.jpg diff --git a/czi-format/benchmark_results/16Bit-ZStack_c_2.jpg b/czi-format/benchmark_results/16_bit_z_stack/16Bit-ZStack_c_2.jpg similarity index 100% rename from czi-format/benchmark_results/16Bit-ZStack_c_2.jpg rename to czi-format/benchmark_results/16_bit_z_stack/16Bit-ZStack_c_2.jpg diff --git a/czi-format/benchmark_results/16bit_z_stack.csv b/czi-format/benchmark_results/16_bit_z_stack/16bit_z_stack.csv similarity index 100% rename from czi-format/benchmark_results/16bit_z_stack.csv rename to czi-format/benchmark_results/16_bit_z_stack/16bit_z_stack.csv diff --git a/czi-format/benchmark_results/16bit_z_stack_continuous.csv b/czi-format/benchmark_results/16_bit_z_stack/16bit_z_stack_continuous.csv similarity index 100% rename from czi-format/benchmark_results/16bit_z_stack_continuous.csv rename to czi-format/benchmark_results/16_bit_z_stack/16bit_z_stack_continuous.csv diff --git a/czi-format/benchmark_results/16_bit_z_stack/cont2.csv b/czi-format/benchmark_results/16_bit_z_stack/cont2.csv new file mode 100644 index 0000000000000000000000000000000000000000..be8bc4d2ab19bd9b9e881742439a3679411c73b7 --- /dev/null +++ b/czi-format/benchmark_results/16_bit_z_stack/cont2.csv @@ -0,0 +1,28 @@ +filename;subblock;pixel;width;height;compression;level;originalSize;compressedSize;compressedZ;compressionRatio;compressionRatioZ;compressionTime;compressionTimeZ +16Bit-ZStack.czi;999;Gray16;0;0;GZIP;1;31457280;21706534;21415370;1.44921;1.46891;11678.00000;13538.00000 +16Bit-ZStack.czi;999;Gray16;0;0;LZMA2;1;31457280;18234356;17989964;1.72517;1.74860;83573.00000;83512.00000 +16Bit-ZStack.czi;999;Gray16;0;0;BZIP2;1;31457280;16811950;17070792;1.87113;1.84275;56895.00000;55434.00000 +16Bit-ZStack.czi;999;Gray16;0;0;GZIP;2;31457280;21591821;21323216;1.45691;1.47526;12449.00000;11485.00000 +16Bit-ZStack.czi;999;Gray16;0;0;LZMA2;2;31457280;18204064;18028864;1.72804;1.74483;104041.00000;105380.00000 +16Bit-ZStack.czi;999;Gray16;0;0;BZIP2;2;31457280;16651274;16889420;1.88918;1.86254;55824.00000;54975.00000 +16Bit-ZStack.czi;999;Gray16;0;0;GZIP;4;31457280;21596789;21318920;1.45657;1.47556;26670.00000;19498.00000 +16Bit-ZStack.czi;999;Gray16;0;0;LZMA2;4;31457280;17228332;17036472;1.82590;1.84647;129261.00000;128921.00000 +16Bit-ZStack.czi;999;Gray16;0;0;BZIP2;4;31457280;16562542;16762954;1.89930;1.87660;56634.00000;56815.00000 +16Bit-ZStack.czi;999;Gray16;0;0;GZIP;3;31457280;21442671;21217301;1.46704;1.48262;14582.00000;15215.00000 +16Bit-ZStack.czi;999;Gray16;0;0;LZMA2;3;31457280;18188892;18055964;1.72948;1.74221;131293.00000;129141.00000 +16Bit-ZStack.czi;999;Gray16;0;0;BZIP2;3;31457280;16592079;16803872;1.89592;1.87203;56129.00000;56221.00000 +16Bit-ZStack.czi;999;Gray16;0;0;GZIP;5;31457280;21534975;21269344;1.46075;1.47900;32021.00000;26092.00000 +16Bit-ZStack.czi;999;Gray16;0;0;LZMA2;5;31457280;17217048;17049480;1.82710;1.84506;132761.00000;132771.00000 +16Bit-ZStack.czi;999;Gray16;0;0;BZIP2;5;31457280;16528830;16719271;1.90318;1.88150;56316.00000;57042.00000 +16Bit-ZStack.czi;999;Gray16;0;0;GZIP;6;31457280;21320230;21074519;1.47547;1.49267;41487.00000;48189.00000 +16Bit-ZStack.czi;999;Gray16;0;0;LZMA2;6;31457280;17216344;17046576;1.82718;1.84537;133741.00000;134992.00000 +16Bit-ZStack.czi;999;Gray16;0;0;BZIP2;6;31457280;16505227;16698103;1.90590;1.88388;56457.00000;57019.00000 +16Bit-ZStack.czi;999;Gray16;0;0;GZIP;7;31457280;21313059;21067513;1.47596;1.49317;44391.00000;46510.00000 +16Bit-ZStack.czi;999;Gray16;0;0;LZMA2;7;31457280;17217068;17058500;1.82710;1.84408;136071.00000;135122.00000 +16Bit-ZStack.czi;999;Gray16;0;0;BZIP2;7;31457280;16482554;16672843;1.90852;1.88674;57403.00000;58249.00000 +16Bit-ZStack.czi;999;Gray16;0;0;GZIP;9;31457280;21313063;21067526;1.47596;1.49316;47200.00000;49093.00000 +16Bit-ZStack.czi;999;Gray16;0;0;LZMA2;9;31457280;17217716;17057428;1.82703;1.84420;137389.00000;137355.00000 +16Bit-ZStack.czi;999;Gray16;0;0;BZIP2;9;31457280;16456890;16645416;1.91150;1.88985;58076.00000;58180.00000 +16Bit-ZStack.czi;999;Gray16;0;0;GZIP;8;31457280;21313063;21067526;1.47596;1.49316;48028.00000;46358.00000 +16Bit-ZStack.czi;999;Gray16;0;0;LZMA2;8;31457280;17217716;17057428;1.82703;1.84420;139170.00000;137580.00000 +16Bit-ZStack.czi;999;Gray16;0;0;BZIP2;8;31457280;16466766;16661084;1.91035;1.88807;57603.00000;57905.00000 diff --git a/czi-format/benchmark_results/16bit_z_stack_continuous_sorted.csv b/czi-format/benchmark_results/16bit_z_stack_continuous_sorted.csv deleted file mode 100644 index b21681d707a5730baff298f03ac8c1831dc6e996..0000000000000000000000000000000000000000 --- a/czi-format/benchmark_results/16bit_z_stack_continuous_sorted.csv +++ /dev/null @@ -1,4 +0,0 @@ -filename;subblock;pixel;width;height;compression;level;originalSize;compressedSize;compressedZ;compressionRatio;compressionRatioZ;compressionTime;compressionTimeZ -16Bit-ZStack.czi;999;Gray16;0;0;GZIP;8;31457280;21313063;21067526;1.47596;1.49316;2014.00000;1985.00000 -16Bit-ZStack.czi;999;Gray16;0;0;LZMA2;8;31457280;17217716;17057428;1.82703;1.84420;15858.00000;21924.00000 -16Bit-ZStack.czi;999;Gray16;0;0;BZIP2;8;31457280;16466766;16661084;1.91035;1.88807;2958.00000;3136.00000 diff --git a/czi-format/benchmark_results/8bit_z_stack.csv b/czi-format/benchmark_results/8_bit_z_stack/8bit_z_stack.csv similarity index 100% rename from czi-format/benchmark_results/8bit_z_stack.csv rename to czi-format/benchmark_results/8_bit_z_stack/8bit_z_stack.csv diff --git a/czi-format/benchmark_results/8bit_z_stack_continuous.csv b/czi-format/benchmark_results/8_bit_z_stack/8bit_z_stack_continuous.csv similarity index 100% rename from czi-format/benchmark_results/8bit_z_stack_continuous.csv rename to czi-format/benchmark_results/8_bit_z_stack/8bit_z_stack_continuous.csv diff --git a/czi-format/benchmark_results/AxioZoom_Artemia_AT-1Ch-Z_sect.jpg b/czi-format/benchmark_results/AxioZoom_Artemia_AT-1Ch-Z_sect.jpg deleted file mode 100644 index ecf763829e1226d8f97d2a3becadd4bdea83c6ad..0000000000000000000000000000000000000000 Binary files a/czi-format/benchmark_results/AxioZoom_Artemia_AT-1Ch-Z_sect.jpg and /dev/null differ diff --git a/czi-format/benchmark_results/artemia_at_z_sect/AxioZoom_Artemia_AT-1Ch-Z_sect.jpg b/czi-format/benchmark_results/artemia_at_z_sect/AxioZoom_Artemia_AT-1Ch-Z_sect.jpg new file mode 100644 index 0000000000000000000000000000000000000000..e466a1408751f9f22470e4abd684c2fc1c723acb Binary files /dev/null and b/czi-format/benchmark_results/artemia_at_z_sect/AxioZoom_Artemia_AT-1Ch-Z_sect.jpg differ diff --git a/czi-format/benchmark_results/artemia_at_1ch_z_sect.csv b/czi-format/benchmark_results/artemia_at_z_sect/artemia_at_1ch_z_sect.csv similarity index 100% rename from czi-format/benchmark_results/artemia_at_1ch_z_sect.csv rename to czi-format/benchmark_results/artemia_at_z_sect/artemia_at_1ch_z_sect.csv diff --git a/czi-format/benchmark_results/artemia_at_1ch_z_sect_continuous.csv b/czi-format/benchmark_results/artemia_at_z_sect/artemia_at_1ch_z_sect_continuous.csv similarity index 100% rename from czi-format/benchmark_results/artemia_at_1ch_z_sect_continuous.csv rename to czi-format/benchmark_results/artemia_at_z_sect/artemia_at_1ch_z_sect_continuous.csv diff --git a/czi-format/benchmark_results/artemia_at_z_sect/cont2.csv b/czi-format/benchmark_results/artemia_at_z_sect/cont2.csv new file mode 100644 index 0000000000000000000000000000000000000000..fd2f80b7b97395713a00a26683e5a8112da318d3 --- /dev/null +++ b/czi-format/benchmark_results/artemia_at_z_sect/cont2.csv @@ -0,0 +1,4 @@ +filename;subblock;pixel;width;height;compression;level;originalSize;compressedSize;compressedZ;compressionRatio;compressionRatioZ;compressionTime;compressionTimeZ +AxioZoom_Artemia_AT-1Ch-Z_sect.czi;999;Gray16;0;0;GZIP;9;112594560;41693860;39222947;2.70051;2.87063;117712.00000;161881.00000 +AxioZoom_Artemia_AT-1Ch-Z_sect.czi;999;Gray16;0;0;LZMA2;9;112594560;31991164;31405776;3.51955;3.58515;205168.00000;199336.00000 +AxioZoom_Artemia_AT-1Ch-Z_sect.czi;999;Gray16;0;0;BZIP2;9;112594560;31016055;31077959;3.63020;3.62297;9036.00000;8966.00000 diff --git a/czi-format/benchmark_results/artemia_flash_z_sect/40x075_Artemia-Flash-AT-1Ch-Z-sect.jpg b/czi-format/benchmark_results/artemia_flash_z_sect/40x075_Artemia-Flash-AT-1Ch-Z-sect.jpg new file mode 100644 index 0000000000000000000000000000000000000000..09bfbcbfb445c593bde9ba9634f2150da8281b35 Binary files /dev/null and b/czi-format/benchmark_results/artemia_flash_z_sect/40x075_Artemia-Flash-AT-1Ch-Z-sect.jpg differ diff --git a/czi-format/benchmark_results/artemia_flash.csv b/czi-format/benchmark_results/artemia_flash_z_sect/artemia_flash.csv similarity index 100% rename from czi-format/benchmark_results/artemia_flash.csv rename to czi-format/benchmark_results/artemia_flash_z_sect/artemia_flash.csv diff --git a/czi-format/benchmark_results/llc_emerald/llc_emarald_cherry_cont.csv b/czi-format/benchmark_results/llc_emerald/llc_emarald_cherry_cont.csv index c98e53912ca6f5ce4d40f29529cde17aaab5d02d..b0c47e1ca8404c909f0479018d81c77532995edb 100644 --- a/czi-format/benchmark_results/llc_emerald/llc_emarald_cherry_cont.csv +++ b/czi-format/benchmark_results/llc_emerald/llc_emarald_cherry_cont.csv @@ -1,7 +1,14 @@ filename;subblock;pixel;width;height;compression;level;originalSize;compressedSize;compressedZ;compressionRatio;compressionRatioZ;compressionTime;compressionTimeZ +LLC-PK1_TubX-emerald_H2B-mCherry-2chZ(SD).czi;999;Gray16;0;0;GZIP;6;109051904;77916943;76868930;1.3996;1.4187;; +LLC-PK1_TubX-emerald_H2B-mCherry-2chZ(SD).czi;999;Gray16;0;0;GZIP;8;109051904;77917145;76861800;1.3996;1.4188;; +LLC-PK1_TubX-emerald_H2B-mCherry-2chZ(SD).czi;999;Gray16;0;0;GZIP;9;109051904;77917145;76861800;1.3996;1.4188;; LLC-PK1_TubX-emerald_H2B-mCherry-2chZ(SD).czi;999;Gray16;0;0;LZMA;5;109051904;66187466;65277759;1.64762;1.67060;59000;54000 LLC-PK1_TubX-emerald_H2B-mCherry-2chZ(SD).czi;999;Gray16;0;0;LZMA;6;109051904;66179814;65281171;1.64780;1.67050;; +LLC-PK1_TubX-emerald_H2B-mCherry-2chZ(SD).czi;999;Gray16;0;0;LZMA;9;109051904;66192740;65375130;1.6475;1.6681;; LLC-PK1_TubX-emerald_H2B-mCherry-2chZ(SD).czi;999;Gray16;0;0;BZIP2;5;109051904;64453164;64496632;1.692;1.6908;; LLC-PK1_TubX-emerald_H2B-mCherry-2chZ(SD).czi;999;Gray16;0;0;BZIP2;6;109051904;64442979;64488307;1.6922;1.691;; LLC-PK1_TubX-emerald_H2B-mCherry-2chZ(SD).czi;999;Gray16;0;0;BZIP2;8;109051904;64399634;64472449;1.6934;1.6914;; -LLC-PK1_TubX-emerald_H2B-mCherry-2chZ(SD).czi;999;Gray16;0;0;BZIP2;8;109051904;64381885;64458062;1.6938;1.6918;; +LLC-PK1_TubX-emerald_H2B-mCherry-2chZ(SD).czi;999;Gray16;0;0;BZIP2;9;109051904;64381885;64458062;1.6938;1.6918;; + + + diff --git a/czi-format/czi-parser/compression/benchmark.h b/czi-format/czi-parser/compression/benchmark.h index 93c90e56165d6d82694643ebe9736fe92abc9670..28f673df16901b4d5a4467c92b69d89e70bffd9f 100644 --- a/czi-format/czi-parser/compression/benchmark.h +++ b/czi-format/czi-parser/compression/benchmark.h @@ -3,6 +3,7 @@ #include "../czi_file.h" #include "../file_system.h" #include <iomanip> +#include <thread> struct BenchmarkRecord { @@ -69,29 +70,77 @@ void write_report(const std::vector<BenchmarkRecord> &results, const std::string } } +static void compression_thread_work(const ByteArray &data, CompressionMethod method, int compressionLevel, CompressionResult &result, const char *info) +{ + auto compResult = test_compression_method(data, method, compressionLevel); + result = compResult; + printf("Completed: %s\n", info); +} + static std::vector<BenchmarkRecord> benchmark_continuos_compression_one_level(const ByteArray &data, const ByteArray &zOrderedData, int compressionLevel) { + // // CompressionMethod_GZIP + // CompressionResult gzipResult = test_compression_method(data, CompressionMethod_GZIP, compressionLevel); + // CompressionResult gzipZResult = test_compression_method(zOrderedData, CompressionMethod_GZIP, compressionLevel); + + // BenchmarkRecord gzipRecord(gzipResult, gzipZResult); + // gzipRecord.compressionLevel = compressionLevel; + // gzipRecord.compressionMethod = GZIP_NAME; + + // // CompressionMethod_LZMA + // CompressionResult lzmaResult = test_compression_method(data, CompressionMethod_LZMA, compressionLevel); + // CompressionResult lzmaZResult = test_compression_method(zOrderedData, CompressionMethod_LZMA, compressionLevel); + + // BenchmarkRecord lzmaRecord(lzmaResult, lzmaZResult); + // lzmaRecord.compressionLevel = compressionLevel; + // lzmaRecord.compressionMethod = LZMA2_NAME; + + // // CompressionMethod_BZIP2 + // CompressionResult bzip2Result = test_compression_method(data, CompressionMethod_BZIP2, compressionLevel); + // CompressionResult bzip2ZResult = test_compression_method(zOrderedData, CompressionMethod_BZIP2, compressionLevel); + + // BenchmarkRecord bzip2Record(bzip2Result, bzip2ZResult); + // bzip2Record.compressionLevel = compressionLevel; + // bzip2Record.compressionMethod = BZIP2_NAME; // CompressionMethod_GZIP - CompressionResult gzipResult = test_compression_method(data, CompressionMethod_GZIP, compressionLevel); - CompressionResult gzipZResult = test_compression_method(zOrderedData, CompressionMethod_GZIP, compressionLevel); + CompressionResult gzipResult = {}; + CompressionResult gzipZResult = {}; + + // CompressionMethod_LZMA + CompressionResult lzmaResult = {}; + CompressionResult lzmaZResult = {}; + + // CompressionMethod_BZIP2 + CompressionResult bzip2Result = {}; + CompressionResult bzip2ZResult = {}; + + std::vector<std::thread> workers; + workers.resize(6); + // We know that lzma is slowest, let's run all three in threads. + workers[0] = std::thread(compression_thread_work, std::ref(data), CompressionMethod_GZIP, compressionLevel, std::ref(gzipResult), "Gzip normal order"); + workers[1] = std::thread(compression_thread_work, std::ref(zOrderedData), CompressionMethod_GZIP, compressionLevel, std::ref(gzipZResult), "Gzip Z order"); + + workers[2] = std::thread(compression_thread_work, std::ref(data), CompressionMethod_LZMA, compressionLevel, std::ref(lzmaResult), "LZMA normal order"); + workers[3] = std::thread(compression_thread_work, std::ref(zOrderedData), CompressionMethod_LZMA, compressionLevel, std::ref(lzmaZResult), "LZMA Z order"); + + workers[4] = std::thread(compression_thread_work, std::ref(data), CompressionMethod_BZIP2, compressionLevel, std::ref(bzip2Result), "Bzip2 normal order"); + workers[5] = std::thread(compression_thread_work, std::ref(zOrderedData), CompressionMethod_BZIP2, compressionLevel, std::ref(bzip2ZResult), "Bzip2 Z order"); + + for (size_t i = 0; i < workers.size(); i++) + { + workers[i].join(); + } + printf("All threads completed.\n"); BenchmarkRecord gzipRecord(gzipResult, gzipZResult); gzipRecord.compressionLevel = compressionLevel; gzipRecord.compressionMethod = GZIP_NAME; - // CompressionMethod_LZMA - CompressionResult lzmaResult = test_compression_method(data, CompressionMethod_LZMA, compressionLevel); - CompressionResult lzmaZResult = test_compression_method(zOrderedData, CompressionMethod_LZMA, compressionLevel); - BenchmarkRecord lzmaRecord(lzmaResult, lzmaZResult); lzmaRecord.compressionLevel = compressionLevel; lzmaRecord.compressionMethod = LZMA2_NAME; - // CompressionMethod_BZIP2 - CompressionResult bzip2Result = test_compression_method(data, CompressionMethod_BZIP2, compressionLevel); - CompressionResult bzip2ZResult = test_compression_method(zOrderedData, CompressionMethod_BZIP2, compressionLevel); - BenchmarkRecord bzip2Record(bzip2Result, bzip2ZResult); bzip2Record.compressionLevel = compressionLevel; bzip2Record.compressionMethod = BZIP2_NAME; diff --git a/czi-format/czi-parser/czi_file.cpp b/czi-format/czi-parser/czi_file.cpp index 2d0b8971036dae6689f0c15b741d49edf36f730e..0e4d065515f2d826a6e36ebc17bca4da66e9d11b 100644 --- a/czi-format/czi-parser/czi_file.cpp +++ b/czi-format/czi-parser/czi_file.cpp @@ -365,7 +365,8 @@ ByteArray CziFile::get_continuous_image_data(const bool ZCurveOrdered) const size_t bufferEnd = 0; // Rather than simply putting images one after the other, order them by channels. -#if 1 + // Compression ratios aren't better, so we won't waste time with sorting right now. +#if 0 int loaded = 0; for (size_t channel = 0; channel < subBlockDirectory.channelCount; channel++) { diff --git a/czi-format/czi-parser/main.cpp b/czi-format/czi-parser/main.cpp index 95667376be721cb54fbb909d24588cec3e55775b..5372f053a30e0edfcefacebd41565232ef8c5bb0 100644 --- a/czi-format/czi-parser/main.cpp +++ b/czi-format/czi-parser/main.cpp @@ -18,6 +18,7 @@ int main(int argc, char **argv) args::HelpFlag helpMethod(mainMethodGroup, "help", "Print help", {'h', "help"}); args::Flag reportMethod(mainMethodGroup, "report", "Basic information about CZI file. [verbose]", {"report"}); args::Flag compressionTestMethod(mainMethodGroup, "compression-test", "Compress subblocks and output compression ratios <compression method>", {"compression-test"}); + args::Flag versionMethod(mainMethodGroup, "Version test", "Check version", {"version", 'V'}); args::Flag benchmarkMethod(mainMethodGroup, "Compression benchmark", "Start compression benchmark for selected CZI file. <report-file> [continuos] [verbose].", {"benchmark"}); args::Flag exportDataMethod(mainMethodGroup, "Export binary dat", "Export raw image data <folder> [continuos]", {"dump-data"}); args::Flag exportImagesMethod(mainMethodGroup, "Export images", "Export images to ppm files <folder>", {"dump-images"}); @@ -54,6 +55,16 @@ int main(int argc, char **argv) return 1; } + if (versionMethod) + { +#if DEBUG + printf("DEBUG\n"); +#else + printf("RELEASE\n"); +#endif + return 0; + } + CziParser parser(dontParseMetadataOption.Get()); auto parsedFile = parser.parse_czi_file(cziFile.Get());