diff --git a/src/main.cpp b/src/main.cpp index 19657bd..1809767 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -128,6 +128,7 @@ int main(int argc, char** argv) { std::string input_file; std::string output_file; int verbose_level = -1; + std::string root_compression_algorithm = "LZMA"; CLI::App app{"mclient"}; @@ -152,7 +153,10 @@ int main(int argc, char** argv) { ->check(CLI::Range(0, 4)); app.add_flag("--read-only", readOnly, "Read-only mode") ->group("General"); - // format option, defaults to "root", can be any value of "root", "aqs", "ascii" or multiple + app.add_flag("--share-buffer", shareBuffer, "Share buffer")->group("General"); + app.add_option("--root-compression-algorithm", root_compression_algorithm, "Root compression algorithm (default: LZMA)") + ->group("File Options") + ->check(CLI::IsMember({"ZLIB", "LZMA", "LZ4"})); CLI11_PARSE(app, argc, argv); @@ -161,6 +165,8 @@ int main(int argc, char** argv) { verbose = 1; } + mclient_storage::StorageManager::Instance().compression_algorithm = root_compression_algorithm; + femarray.verbose = verbose; cmdfetcher.verbose = verbose; diff --git a/src/root/storage.cpp b/src/root/storage.cpp index 08319b1..31eeed1 100644 --- a/src/root/storage.cpp +++ b/src/root/storage.cpp @@ -37,7 +37,17 @@ void StorageManager::Initialize(const string& filename) { } file = std::make_unique(filename.c_str(), "RECREATE"); - file->SetCompressionAlgorithm(ROOT::kLZMA); // biggest compression ratio but slowest + + if (compression_algorithm == "ZLIB") { + file->SetCompressionAlgorithm(ROOT::kZLIB); // good compression ratio and fast (old root default) + } else if (compression_algorithm == "LZ4") { + file->SetCompressionAlgorithm(ROOT::kLZ4); // good compression ratio and fast (new root default) + } else if (compression_algorithm == "LZMA") { + file->SetCompressionAlgorithm(ROOT::kLZMA); // biggest compression ratio but slowest + } else { + throw std::runtime_error("Unknown compression algorithm: " + compression_algorithm); + } + // file->SetCompressionLevel(9); // max compression level, but it's very slow, probably not worth it cout << "ROOT file will be saved to " << file->GetName() << endl; diff --git a/src/root/storage.h b/src/root/storage.h index d3a9417..8562d28 100644 --- a/src/root/storage.h +++ b/src/root/storage.h @@ -71,6 +71,8 @@ class StorageManager { std::unique_ptr run_tree; Event event; + std::string compression_algorithm; + unsigned long long run_number = 0; unsigned long long run_time_start = 0;