// SPDX-FileCopyrightText: 2024 Filip Leonarski, Paul Scherrer Institute // SPDX-License-Identifier: GPL-3.0-only #pragma once #include #include #include #include #include #include "../common/CrystalLattice.h" struct CcHalfByResolutionResult { std::vector cc; std::vector pairs; std::vector shell_mean_one_over_d2; }; inline uint64_t hkl_key_16(int64_t h, int64_t k, int64_t l) { const uint16_t bias = 512; // maps -512..512 -> 0..1024 uint64_t uh = static_cast(std::clamp(h + bias, int64_t(0), int64_t(1024))); uint64_t uk = static_cast(std::clamp(k + bias, int64_t(0), int64_t(1024))); uint64_t ul = static_cast(std::clamp(l + bias, int64_t(0), int64_t(1024))); return uh | (uk << 16) | (ul << 32); } struct HKLData { int64_t h ,k,l; double I = 0.0; double sigma = 0.0; int32_t last_image = 0; int32_t count = 0; float rlp = 0.0; float image_number = -100; std::vector tail; // any remaining numeric columns }; using IntegrateMap = std::unordered_map>; IntegrateMap ParseXdsIntegrateHkl(const std::string& filename); CcHalfByResolutionResult ComputeCcByResolution( const CrystalLattice& lattice, const IntegrateMap& ours, const IntegrateMap& xds, float d_min, float d_max, int32_t nshells);