jfjoch_process: Add orientation-only refinement

This commit is contained in:
2026-05-28 16:02:52 +02:00
parent c22b566503
commit 058468a0b3
4 changed files with 31 additions and 17 deletions
+22 -13
View File
@@ -55,7 +55,7 @@ void print_usage() {
std::cout << " -X, --indexing-algorithm <txt> Indexing algorithm (FFBIDX|FFT|FFTW|Auto|None)" << std::endl;
std::cout << " -S, --space-group <num> Space group number - used for both indexing and scaling" << std::endl;
std::cout << " -C, --unit-cell <cell> Fix reference unit cell: \"a,b,c,alpha,beta,gamma\"" << std::endl;
std::cout << " --no-beam-center-refine No least-square beam center refinement" << std::endl;
std::cout << " -r, --refine <txt> Geometry refinement algorithm (none|orientation|beam_and_lattice)" << std::endl;
std::cout << std::endl;
std::cout << " Scaling and merging" << std::endl;
@@ -77,7 +77,6 @@ enum {
OPT_SPOT_THRESHOLD,
OPT_SPOT_RESOLUTION,
OPT_MAX_SPOTS,
OPT_NO_BEAM_CENTER_REFINE,
OPT_MIN_PARTIALITY,
OPT_MIN_IMAGE_CC,
OPT_SCALING_ITERATIONS,
@@ -102,12 +101,12 @@ static option long_options[] = {
{"refine-bfactor", no_argument, nullptr, 'B'},
{"wedge", optional_argument, nullptr, 'w'},
{"scale-merge", no_argument, nullptr, 'M'},
{"refine", required_argument, nullptr, 'r'},
{"spot-sigma", required_argument, nullptr, OPT_SPOT_SIGMA},
{"spot-threshold", required_argument, nullptr, OPT_SPOT_THRESHOLD},
{"spot-high-resolution", required_argument, nullptr, OPT_SPOT_RESOLUTION},
{"max-spots", required_argument, nullptr, OPT_MAX_SPOTS},
{"no-beam-center-refine", no_argument, nullptr, OPT_NO_BEAM_CENTER_REFINE},
{"min-partiality", required_argument, nullptr, OPT_MIN_PARTIALITY},
{"min-image-cc", required_argument, nullptr, OPT_MIN_IMAGE_CC},
{"scaling-iterations", required_argument, nullptr, OPT_SCALING_ITERATIONS},
@@ -199,7 +198,6 @@ int main(int argc, char **argv) {
bool verbose = false;
bool rotation_indexing = false;
std::optional<float> rotation_indexing_range;
bool refine_beam_center = true;
bool run_scaling = false;
bool anomalous_mode = false;
std::optional<int64_t> space_group_number;
@@ -216,6 +214,7 @@ int main(int argc, char **argv) {
int64_t scaling_iter = 3;
IndexingAlgorithmEnum indexing_algorithm = IndexingAlgorithmEnum::Auto;
GeomRefinementAlgorithmEnum refinement_algorithm = GeomRefinementAlgorithmEnum::BeamCenter;
IntensityFormat intensity_format = IntensityFormat::MTZ;
PartialityModel partiality_model = PartialityModel::Fixed;
@@ -230,7 +229,7 @@ int main(int argc, char **argv) {
int opt;
int option_index = 0;
const char *short_opts = "vo:N:s:e:t:R::X:C:z:FABw::S:MP:";
const char *short_opts = "vo:N:s:e:t:R::X:C:z:FABw::S:MP:r:";
while ((opt = getopt_long(argc, argv, short_opts, long_options, &option_index)) != -1) {
switch (opt) {
@@ -278,6 +277,23 @@ int main(int argc, char **argv) {
}
break;
}
case 'r': {
std::string alg = optarg ? optarg : "";
std::transform(alg.begin(), alg.end(), alg.begin(),
[](unsigned char c) { return static_cast<char>(std::tolower(c)); });
if (alg == "none")
refinement_algorithm = GeomRefinementAlgorithmEnum::None;
else if (alg == "beam_and_lattice")
refinement_algorithm = GeomRefinementAlgorithmEnum::BeamCenter;
else if (alg == "orientation")
refinement_algorithm = GeomRefinementAlgorithmEnum::OrientationOnly;
else {
logger.Error("Invalid geom refinement algorithm: {}", alg);
print_usage();
exit(EXIT_FAILURE);
}
break;
}
case 'C': {
auto uc = parse_unit_cell_arg(optarg);
if (!uc.has_value()) {
@@ -345,9 +361,6 @@ int main(int argc, char **argv) {
max_spot_count_override = atoll(optarg);
logger.Info("Max spot count overridden to {}", max_spot_count_override.value());
break;
case OPT_NO_BEAM_CENTER_REFINE:
refine_beam_center = false;
break;
case 'M':
run_scaling = true;
break;
@@ -476,11 +489,7 @@ int main(int argc, char **argv) {
indexing_settings.RotationIndexing(rotation_indexing);
if (rotation_indexing_range.has_value())
indexing_settings.RotationIndexingMinAngularRange_deg(rotation_indexing_range.value());
if (refine_beam_center)
indexing_settings.GeomRefinementAlgorithm(GeomRefinementAlgorithmEnum::BeamCenter);
else
indexing_settings.GeomRefinementAlgorithm(GeomRefinementAlgorithmEnum::None);
indexing_settings.GeomRefinementAlgorithm(refinement_algorithm);
experiment.ImportIndexingSettings(indexing_settings);
ScalingSettings scaling_settings;