// SPDX-FileCopyrightText: 2026 Filip Leonarski, Paul Scherrer Institute // SPDX-License-Identifier: GPL-3.0-only #pragma once #include #include #include "gemmi/dencalc.hpp" // DensityCalculator #include "gemmi/grid.hpp" #include "gemmi/it92.hpp" // IT92 x-ray form factors #include "gemmi/model.hpp" // gemmi's gridding of a model - the density of DensityCalculator::put_model_density_on_grid() and the // bulk-solvent mask of SolventMasker(AtomicRadiiSet::Refmac).put_mask_on_grid() - spread over // `nthreads` threads of ParallelFor's pool. Every grid point receives the same operations in the same // order as in gemmi's serial loops, so the grids are the same on any number of threads: the mask is gemmi's // bit for bit, the density gemmi's but for the last bits (its points are placed in single precision, as the // Apple GPU places them). // The points gemmi's Grid::symmetrize() reduces the orbits of this grid's size and space group into // (empty in P1). Both functions below take them, for a grid of the same size. std::vector OrbitLeaders(const gemmi::Grid &grid, size_t nthreads); // `dc` set up as for put_model_density_on_grid(): d_min, rate, blur, the grid's cell and group. On macOS the // Apple GPU puts the density on the grid (ModelDensityMetal.h), to the same bits; `gpu` false keeps it on the // CPU. void PutModelDensityOnGrid(gemmi::DensityCalculator, float> &dc, const gemmi::Model &model, const std::vector &orbit_leaders, size_t nthreads, bool gpu = true); // `grid` sized, with its cell and group set. void PutMaskOnGrid(gemmi::Grid &grid, const gemmi::Model &model, const std::vector &orbit_leaders, size_t nthreads); // The number of points of the grid a model's structure factors to d_min are computed on at DensityCalculator's // `rate` (a spacing of d_min / (2 rate)) in this cell and space group: the grid's size, without making it. size_t ModelGridPoints(const gemmi::UnitCell &cell, const gemmi::SpaceGroup *sg, double d_min, double rate = 1.5); // What computing a model's structure factors on the CPU holds at its peak, per point of that grid: the density // and the bulk-solvent mask grids, and for each of them its transform's input copy, spectrum and coefficients, // with the two made at once (ModelValidation's compute_model_factors). constexpr size_t MODEL_FACTORS_BYTES_PER_GRID_POINT = 32; // What a molecular-replacement placement's structure factors and rigid body hold on the CPU at their peak, per // point of that grid: measured at under half of the above. constexpr size_t MODEL_PLACEMENT_BYTES_PER_GRID_POINT = 16;