From de8e8d3a64ff18b0622ef04bb7e1b863bb38f187 Mon Sep 17 00:00:00 2001 From: Filip Leonarski Date: Wed, 11 Feb 2026 16:26:36 +0100 Subject: [PATCH] jfjoch_process: More options --- tools/jfjoch_process.cpp | 37 ++++++++++++++++++++++++++++++++++++- 1 file changed, 36 insertions(+), 1 deletion(-) diff --git a/tools/jfjoch_process.cpp b/tools/jfjoch_process.cpp index c3c359a0..664c86ee 100644 --- a/tools/jfjoch_process.cpp +++ b/tools/jfjoch_process.cpp @@ -40,6 +40,8 @@ void print_usage(Logger &logger) { logger.Info(" -d High resolution limit for spot finding (default: 1.5)"); logger.Info(" -S Space group number"); logger.Info(" -M Scale and merge (refine mosaicity) and write scaled.hkl + image.dat"); + logger.Info(" -L Use log-scaling residual"); + logger.Info(" -m Mosaicity refinement none|fixed|image (default: image)"); } int main(int argc, char **argv) { @@ -62,6 +64,10 @@ int main(int argc, char **argv) { bool run_scaling = false; std::optional space_group_number; + bool log_residual = false; + enum class MosaicityRefinementMode { None, Fixed, Image }; + MosaicityRefinementMode mosaicity_refinement_mode = MosaicityRefinementMode::Image; + float d_high = 1.5; if (argc == 1) { @@ -106,6 +112,22 @@ int main(int argc, char **argv) { case 'M': run_scaling = true; break; + case 'L': + log_residual = true; + break; + case 'm': + if (strcmp(optarg, "none") == 0) + mosaicity_refinement_mode = MosaicityRefinementMode::None; + else if (strcmp(optarg, "fixed") == 0) + mosaicity_refinement_mode = MosaicityRefinementMode::Fixed; + else if (strcmp(optarg, "image") == 0) + mosaicity_refinement_mode = MosaicityRefinementMode::Image; + else { + logger.Error("Invalid mosaicity refinement mode: {}", optarg); + print_usage(logger); + exit(EXIT_FAILURE); + } + break; default: print_usage(logger); exit(EXIT_FAILURE); @@ -395,7 +417,20 @@ int main(int argc, char **argv) { scale_opts.refine_mosaicity = true; scale_opts.max_num_iterations = 500; scale_opts.max_solver_time_s = 240.0; // generous cutoff for now - + scale_opts.log_scaling_residual = log_residual; + switch (mosaicity_refinement_mode) { + case MosaicityRefinementMode::None: + scale_opts.refine_mosaicity = false; + break; + case MosaicityRefinementMode::Fixed: + scale_opts.refine_mosaicity = true; + scale_opts.per_image_mosaicity = false; + break; + case MosaicityRefinementMode::Image: + scale_opts.refine_mosaicity = true; + scale_opts.per_image_mosaicity = true; + break; + } if (space_group) scale_opts.space_group = *space_group; else