Files
Jungfraujoch/gemmi_gph/gemmi/logger.hpp
T
leonarski_f fc68a9baed
Build Packages / Unit tests (push) Skipped
Build Packages / build:rpm (ubuntu2404_nocuda) (push) Successful in 8m34s
Build Packages / build:rpm (ubuntu2204_nocuda) (push) Successful in 10m0s
Build Packages / build:rpm (rocky8_nocuda) (push) Successful in 10m23s
Build Packages / build:rpm (rocky8_sls9) (push) Successful in 10m23s
Build Packages / build:rpm (rocky9_nocuda) (push) Successful in 11m16s
Build Packages / build:rpm (rocky9_sls9) (push) Successful in 11m49s
Build Packages / build:rpm (ubuntu2404) (push) Successful in 8m32s
Build Packages / build:rpm (ubuntu2204) (push) Successful in 9m15s
Build Packages / XDS test (durin plugin) (push) Successful in 7m16s
Build Packages / Generate python client (push) Successful in 16s
Build Packages / build:rpm (rocky9) (push) Successful in 10m12s
Build Packages / Create release (push) Skipped
Build Packages / Build documentation (push) Successful in 47s
Build Packages / DIALS test (push) Successful in 10m18s
Build Packages / XDS test (JFJoch plugin) (push) Successful in 5m46s
Build Packages / build:rpm (rocky8) (push) Successful in 1h41m2s
Build Packages / XDS test (neggia plugin) (push) Successful in 1h59m18s
v1.0.0-rc.146 (#56)
This is an UNSTABLE release. The release has significant modifications for data processing - in case of troubles go back to 1.0.0-rc.144.

jfjoch_process: Generate a dedicated file (_process.h5), which can be used as a replacement for the _master.h5 file for a reanalyzed dataset.
jfjoch_process: Improve the performance of scaling and merging, implement on the fly scaling.
jfjoch_writer: All final data analysis results are repopulated in the _master.h5 file.
jfjoch_scale: Dedicated tool for rescaling/merging existing data.
jfjoch_viewer: Fix bugs where pixel labels where displayed on a wrong pixel.

WARNING! Scaling and merging are experimental at the moment, and may not provide reasonable results for the time being.

Reviewed-on: #56
2026-05-28 18:48:35 +02:00

72 lines
2.6 KiB
C++

// Copyright Global Phasing Ltd.
//
// Logger - a tiny utility for passing messages through a callback.
#ifndef GEMMI_LOGGER_HPP_
#define GEMMI_LOGGER_HPP_
#include <cstdio> // for fprintf
#include <functional> // for function
#include "fail.hpp" // for GEMMI_COLD
#include "util.hpp" // for cat
namespace gemmi {
/// Passes messages (including warnings/errors) to a callback function.
/// Messages are passed as strings without a trailing newline.
/// They have syslog-like severity levels: 8=debug, 6=info, 5=notice, 3=error,
/// allowing the use of a threshold to filter them.
/// Quirk: Errors double as both errors and warnings. Unrecoverable errors
/// don't go through this class; Logger only handles errors that can
/// be downgraded to warnings. If a callback is set, the error is passed
/// as a warning message. Otherwise, it's thrown as std::runtime_error.
struct Logger {
/// A function that handles messages.
std::function<void(const std::string&)> callback;
/// Pass messages of this level and all lower (more severe) levels:
/// 8=all, 6=all but debug, 5=notes and warnings, 3=warnings, 0=none
int threshold = 6;
/// suspend() and resume() are used internally to avoid duplicate messages
/// when the same function is called (internally) multiple times.
void suspend() { threshold -= 100; }
void resume() { threshold += 100; }
/// Send a message without any prefix on with a numeric threshold N.
template<int N, class... Args> void level(Args const&... args) const {
if (threshold >= N && callback)
callback(cat(args...));
}
/// Send a debug message.
template<class... Args> void debug(Args const&... args) const { level<8>("Debug: ", args...); }
/// Send a message without any prefix.
template<class... Args> void mesg(Args const&... args) const { level<6>(args...); }
/// Send a note (a notice, a significant message).
template<class... Args> void note(Args const&... args) const { level<5>("Note: ", args...); }
/// Send a warning/error (see Quirk above).
template<class... Args> GEMMI_COLD void err(Args const&... args) const {
if (threshold >= 3) {
std::string msg = cat(args...);
if (callback == nullptr)
fail(msg);
callback("Warning: " + msg);
}
}
// predefined callbacks
/// to be used as: logger.callback = Logger::to_stderr;
static void to_stderr(const std::string& s) {
std::fprintf(stderr, "%s\n", s.c_str());
}
/// to be used as: logger.callback = Logger::to_stdout;
static void to_stdout(const std::string& s) {
std::fprintf(stdout, "%s\n", s.c_str());
}
};
} // namespace gemmi
#endif