Files
Jungfraujoch/image_analysis/scale_merge/HKLKey.cpp
T
leonarski_f d5b928fa73
Build Packages / build:rpm (ubuntu2404_nocuda) (push) Successful in 13m55s
Build Packages / build:rpm (ubuntu2204_nocuda) (push) Successful in 14m4s
Build Packages / build:rpm (rocky8_nocuda) (push) Successful in 14m34s
Build Packages / build:rpm (rocky9_nocuda) (push) Successful in 15m45s
Build Packages / build:rpm (rocky8_sls9) (push) Successful in 16m22s
Build Packages / build:rpm (rocky9_sls9) (push) Successful in 17m11s
Build Packages / build:rpm (rocky8) (push) Successful in 9m49s
Build Packages / build:rpm (ubuntu2204) (push) Successful in 11m39s
Build Packages / Generate python client (push) Successful in 35s
Build Packages / build:rpm (rocky9) (push) Successful in 13m9s
Build Packages / Create release (push) Skipped
Build Packages / Build documentation (push) Successful in 50s
Build Packages / build:rpm (ubuntu2404) (push) Successful in 13m19s
Build Packages / XDS test (durin plugin) (push) Successful in 11m24s
Build Packages / XDS test (neggia plugin) (push) Successful in 10m32s
Build Packages / XDS test (JFJoch plugin) (push) Successful in 11m2s
Build Packages / DIALS test (push) Successful in 14m40s
Build Packages / Unit tests (push) Successful in 56m52s
Merge: Simplify code for merging, make it more efficient
2026-05-13 12:27:50 +02:00

99 lines
3.0 KiB
C++

// SPDX-FileCopyrightText: 2025 Filip Leonarski, Paul Scherrer Institute <filip.leonarski@psi.ch>
// SPDX-License-Identifier: GPL-3.0-only
#include <cmath>
#include "HKLKey.h"
#include "gemmi/symmetry.hpp"
uint64_t HKLKey::pack_no_anom() const {
constexpr int bits = 21;
constexpr int bias = 1 << (bits - 1); // 1,048,576
constexpr int max_value = bias - 1;
constexpr int min_value = -bias;
constexpr std::uint64_t mask = (1ULL << bits) - 1ULL;
if (h < min_value || h > max_value ||
k < min_value || k > max_value ||
l < min_value || l > max_value) {
throw std::out_of_range("HKL index outside packable range");
}
const std::uint64_t hh = static_cast<std::uint64_t>(h + bias) & mask;
const std::uint64_t kk = static_cast<std::uint64_t>(k + bias) & mask;
const std::uint64_t ll = static_cast<std::uint64_t>(l + bias) & mask;
return hh | (kk << bits) | (ll << (2 * bits));
}
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);
}
HKLKey HKLKeyGenerator::operator()(const Reflection &r) const {
return operator()(r.h, r.k, r.l);
}
HKLKey HKLKeyGenerator::operator()(int32_t h, int32_t k, int32_t l) const {
HKLKey key{h, k, l, true};
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;
key.k = -key.k;
key.l = -key.l;
key.plus = merge_friedel;
}
} else {
const gemmi::Op::Miller in{h, k, l};
const auto [hkl, sign_plus] = asu.to_asu_sign(in, ops);
key.h = hkl[0];
key.k = hkl[1];
key.l = hkl[2];
key.plus = merge_friedel ? true : sign_plus;
}
return key;
}
bool AcceptReflection(const Reflection &r, std::optional<double> d_min_limit) {
if (!std::isfinite(r.I))
return false;
if (!std::isfinite(r.d) || r.d <= 0.0f)
return false;
if (d_min_limit && r.d < d_min_limit)
return false;
if (!std::isfinite(r.rlp) || r.rlp == 0.0f)
return false;
if (!std::isfinite(r.sigma) || r.sigma <= 0.0)
return false;
return true;
}
bool AcceptReflection(const Reflection &r, double d_min_limit) {
if (!std::isfinite(r.I))
return false;
if (!std::isfinite(r.d) || r.d <= 0.0f)
return false;
if (d_min_limit > 0.0 && r.d < d_min_limit)
return false;
if (!std::isfinite(r.rlp) || r.rlp == 0.0f)
return false;
if (!std::isfinite(r.sigma) || r.sigma <= 0.0)
return false;
return true;
}