FFTIndexer: Use Niggli Reduction
Build Packages / build:rpm (ubuntu2404_nocuda) (push) Successful in 10m20s
Build Packages / build:rpm (rocky8_nocuda) (push) Successful in 11m47s
Build Packages / build:rpm (ubuntu2204_nocuda) (push) Successful in 12m10s
Build Packages / build:rpm (rocky8_sls9) (push) Successful in 12m51s
Build Packages / build:rpm (rocky8) (push) Successful in 12m52s
Build Packages / build:rpm (rocky9_nocuda) (push) Successful in 13m44s
Build Packages / build:rpm (rocky9_sls9) (push) Successful in 13m56s
Build Packages / XDS test (durin plugin) (push) Successful in 8m32s
Build Packages / Generate python client (push) Successful in 21s
Build Packages / build:rpm (ubuntu2404) (push) Successful in 10m9s
Build Packages / Create release (push) Skipped
Build Packages / Build documentation (push) Successful in 36s
Build Packages / XDS test (neggia plugin) (push) Successful in 8m29s
Build Packages / build:rpm (ubuntu2204) (push) Successful in 10m53s
Build Packages / build:rpm (rocky9) (push) Successful in 12m34s
Build Packages / XDS test (JFJoch plugin) (push) Successful in 9m15s
Build Packages / DIALS test (push) Successful in 12m2s
Build Packages / Unit tests (push) Successful in 56m23s

This commit is contained in:
2026-06-03 13:47:55 +02:00
parent ab9db988dd
commit 5ffe44892c
+13 -17
View File
@@ -97,23 +97,20 @@ std::vector<CrystalLattice> FFTIndexer::ReduceResults(const std::vector<Coord> &
// sort vectors by length for reduction
Sort(A,B,C);
// Lattice reduction
B = B - std::round(B * A / (A * A)) * A;
C = C - std::round(C * A / (A * A)) * A;
C = C - std::round(C * B / (B * B)) * B;
CrystalLattice raw(A, B, C);
CrystalLattice reduced = raw.NiggliReduce(); // Reduce cell
const auto uc = reduced.GetUnitCell();
float alpha = angle_deg(B, C);
float beta = angle_deg(A, C);
float gamma = angle_deg(A, B);
if (uc.a < min_length_A || uc.b < min_length_A || uc.c < min_length_A)
continue;
// Check if values are OK after lattice reduction
if (A.Length() >= min_length_A
&& B.Length() >= min_length_A
&& C.Length() >= min_length_A
&& alpha >= min_angle_deg && alpha <= max_angle_deg
&& beta >= min_angle_deg && beta <= max_angle_deg
&& gamma >= min_angle_deg && gamma <= max_angle_deg)
candidates.emplace_back(A, B, C);
float alpha = uc.alpha, beta = uc.beta, gamma = uc.gamma;
if (alpha < min_angle_deg || alpha > max_angle_deg ||
beta < min_angle_deg || beta > max_angle_deg ||
gamma < min_angle_deg || gamma > max_angle_deg)
continue;
candidates.emplace_back(std::move(reduced));
}
}
}
@@ -141,8 +138,7 @@ std::vector<Coord> FFTIndexer::FilterFFTResults() const {
std::vector<Coord> ret;
// Remove vectors less than 5 deg apart, as most likely these are colinear
constexpr float COS_5_DEG = 0.996194;
const float COS_5_DEG = std::cos(5.0f * M_PI / 180.0f);
// Minimum relative amplitude to accept a shorter vector (fundamental)
// over a longer one (harmonic).