diff --git a/image_analysis/scale_merge/HKLKey.cpp b/image_analysis/scale_merge/HKLKey.cpp index ffa28162..3f05db05 100644 --- a/image_analysis/scale_merge/HKLKey.cpp +++ b/image_analysis/scale_merge/HKLKey.cpp @@ -6,8 +6,16 @@ #include "HKLKey.h" #include "gemmi/symmetry.hpp" -HKLKeyGenerator::HKLKeyGenerator(bool merge_friedel, const std::optional &sg) -: merge_friedel(merge_friedel), sg(sg) {} +HKLKeyGenerator::HKLKeyGenerator(bool merge_friedel, int32_t space_group_number) + : HKLKeyGenerator(merge_friedel, *gemmi::find_spacegroup_by_number(space_group_number)) { +} + +HKLKeyGenerator::HKLKeyGenerator(bool merge_friedel, const gemmi::SpaceGroup &sg) + : merge_friedel(merge_friedel), + sg(sg), + ops(sg.operations()), + asu(&sg) { +} HKLKey HKLKeyGenerator::operator()(const MergedReflection &r) const { return operator()(r.h, r.k, r.l); @@ -20,7 +28,7 @@ HKLKey HKLKeyGenerator::operator()(const Reflection &r) const { HKLKey HKLKeyGenerator::operator()(int32_t h, int32_t k, int32_t l) const { HKLKey key{h, k, l, true}; - if (!sg.has_value()) { + if (sg.number == 1) { const HKLKey neg{-h, -k, -l, true}; if (std::tie(key.h, key.k, key.l) < std::tie(neg.h, neg.k, neg.l)) { key.h = -key.h; @@ -29,10 +37,6 @@ HKLKey HKLKeyGenerator::operator()(int32_t h, int32_t k, int32_t l) const { key.plus = merge_friedel; } } else { - const auto sg_local = sg.value(); - const auto ops = sg_local.operations(); - const gemmi::ReciprocalAsu asu(&sg_local); - const gemmi::Op::Miller in{h, k, l}; const auto [hkl, sign_plus] = asu.to_asu_sign(in, ops); diff --git a/image_analysis/scale_merge/HKLKey.h b/image_analysis/scale_merge/HKLKey.h index 93c5d505..8084d8e9 100644 --- a/image_analysis/scale_merge/HKLKey.h +++ b/image_analysis/scale_merge/HKLKey.h @@ -23,9 +23,13 @@ struct HKLKey { class HKLKeyGenerator { bool merge_friedel; - std::optional sg; + gemmi::SpaceGroup sg; + gemmi::GroupOps ops; + gemmi::ReciprocalAsu asu; + public: - HKLKeyGenerator(bool merge_friedel, const std::optional &sg); + HKLKeyGenerator(bool merge_friedel, int32_t space_group_number); + HKLKeyGenerator(bool merge_friedel, const gemmi::SpaceGroup &sg); HKLKey operator()(const Reflection &r) const; HKLKey operator()(const MergedReflection &r) const; HKLKey operator()(int32_t h, int32_t k, int32_t l) const; diff --git a/image_analysis/scale_merge/Merge.cpp b/image_analysis/scale_merge/Merge.cpp index 186d4c1e..9f049362 100644 --- a/image_analysis/scale_merge/Merge.cpp +++ b/image_analysis/scale_merge/Merge.cpp @@ -41,7 +41,7 @@ namespace { auto scaling_settings = x.GetScalingSettings(); - HKLKeyGenerator key_generator(scaling_settings.GetMergeFriedel(), x.GetGemmiSpaceGroup() ); + HKLKeyGenerator key_generator(scaling_settings.GetMergeFriedel(), x.GetSpaceGroupNumber().value_or(1) ); for (const auto &image: observations) { for (const auto &r: image) { diff --git a/image_analysis/scale_merge/ScaleOnTheFly.cpp b/image_analysis/scale_merge/ScaleOnTheFly.cpp index 99c29b7b..d2057fbe 100644 --- a/image_analysis/scale_merge/ScaleOnTheFly.cpp +++ b/image_analysis/scale_merge/ScaleOnTheFly.cpp @@ -92,10 +92,10 @@ ScaleOnTheFly::ScaleOnTheFly(const std::vector &ref, const Dif model(x.GetPartialityModel()), s(x.GetScalingSettings()), rot_wedge_deg(x.GetRotationWedgeForScaling()), - refine_rot_wedge(x.GetRefineRotationWedgeInScaling()) { - const HKLKeyGenerator key_generator(s.GetMergeFriedel(), sg); + refine_rot_wedge(x.GetRefineRotationWedgeInScaling()), + hkl_key_generator(s.GetMergeFriedel(), x.GetSpaceGroupNumber().value_or(1)) { for (const auto &r: ref) { - const auto key = key_generator(r); + const auto key = hkl_key_generator(r); reference_data[key] = r.I; } } @@ -137,13 +137,12 @@ ScaleOnTheFlyResult ScaleOnTheFly::Scale(std::vector &reflections, s } size_t n_reflections = 0; - HKLKeyGenerator key_generator(s.GetMergeFriedel(), sg); for (const auto &r: reflections) { - const HKLKey key = key_generator(r); - if (!Accept(r)) continue; + const HKLKey key = hkl_key_generator(r); + if (!reference_data.contains(key)) continue; diff --git a/image_analysis/scale_merge/ScaleOnTheFly.h b/image_analysis/scale_merge/ScaleOnTheFly.h index b037ed16..c491c4a5 100644 --- a/image_analysis/scale_merge/ScaleOnTheFly.h +++ b/image_analysis/scale_merge/ScaleOnTheFly.h @@ -28,6 +28,7 @@ class ScaleOnTheFly { const ScalingSettings s; const std::optional rot_wedge_deg; const bool refine_rot_wedge; + const HKLKeyGenerator hkl_key_generator; std::map reference_data; bool Accept(const Reflection &r); diff --git a/tests/MergeScaleTest.cpp b/tests/MergeScaleTest.cpp index b821b8d8..534871d7 100644 --- a/tests/MergeScaleTest.cpp +++ b/tests/MergeScaleTest.cpp @@ -5,14 +5,14 @@ #include "../image_analysis/scale_merge/HKLKey.h" TEST_CASE("HKLKey_NoSG_noMergeFriedel") { - HKLKeyGenerator hkl_key_gen(false, std::nullopt); + HKLKeyGenerator hkl_key_gen(false, 1); CHECK(hkl_key_gen(-1, -2, -3) != hkl_key_gen(1,2,3)); CHECK(hkl_key_gen(-1,-2,-3) == hkl_key_gen(-1,-2,-3)); CHECK(hkl_key_gen(-1,-2,-3) != hkl_key_gen(1,-2,-3)); } TEST_CASE("HKLKey_NoSG_MergeFriedel") { - HKLKeyGenerator hkl_key_gen(true, std::nullopt); + HKLKeyGenerator hkl_key_gen(true, 1); CHECK(hkl_key_gen(-1, -2, -3) == hkl_key_gen(1,2,3)); CHECK(hkl_key_gen(-1,-2,-3) == hkl_key_gen(-1,-2,-3)); CHECK(hkl_key_gen(-1,-2,-3) != hkl_key_gen(1,-2,-3));