jfjoch_process: Add orientation-only refinement
This commit is contained in:
@@ -7,7 +7,7 @@
|
||||
#include <cstdint>
|
||||
|
||||
enum class IndexingAlgorithmEnum {FFBIDX, FFT, FFTW, Auto, None};
|
||||
enum class GeomRefinementAlgorithmEnum {None, BeamCenter};
|
||||
enum class GeomRefinementAlgorithmEnum {None, OrientationOnly, BeamCenter};
|
||||
|
||||
class IndexingSettings {
|
||||
IndexingAlgorithmEnum algorithm;
|
||||
|
||||
@@ -128,6 +128,11 @@ void IndexAndRefine::RefineGeometryIfNeeded(DataMessage &msg, IndexAndRefine::In
|
||||
switch (experiment.GetIndexingSettings().GetGeomRefinementAlgorithm()) {
|
||||
case GeomRefinementAlgorithmEnum::None:
|
||||
break;
|
||||
case GeomRefinementAlgorithmEnum::OrientationOnly:
|
||||
XtalOptimizerRotationOnly(data, msg.spots, 0.2);
|
||||
XtalOptimizerRotationOnly(data, msg.spots, 0.1);
|
||||
XtalOptimizerRotationOnly(data, msg.spots, 0.05);
|
||||
break;
|
||||
case GeomRefinementAlgorithmEnum::BeamCenter:
|
||||
if (XtalOptimizer(data, msg.spots)) {
|
||||
outcome.experiment.BeamX_pxl(data.geom.GetBeamX_pxl())
|
||||
|
||||
@@ -825,9 +825,9 @@ bool XtalOptimizerRotationOnly(XtalOptimizerData &data,
|
||||
ceres::AngleAxisToRotationMatrix(rot_aa, R_raw); // row-major 3x3
|
||||
|
||||
Eigen::Matrix3d R;
|
||||
R << R_raw[0], R_raw[1], R_raw[2],
|
||||
R_raw[3], R_raw[4], R_raw[5],
|
||||
R_raw[6], R_raw[7], R_raw[8];
|
||||
R << R_raw[0], R_raw[3], R_raw[6],
|
||||
R_raw[1], R_raw[4], R_raw[7],
|
||||
R_raw[2], R_raw[5], R_raw[8];
|
||||
|
||||
const Eigen::Vector3d A(a0.x, a0.y, a0.z);
|
||||
const Eigen::Vector3d B(b0.x, b0.y, b0.z);
|
||||
|
||||
+22
-13
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user