v1.0.0-rc.177 (#87)
Build Packages / Create release (push) Successful in 7s
Build Packages / build:portable:macos-arm64:nocuda (push) Successful in 4m53s
Build Packages / build:rugnux:linux-aarch64:cuda (push) Successful in 9m27s
Build Packages / build:portable:linux-x86_64:nocuda (push) Successful in 15m0s
Build Packages / build:portable:linux-x86_64:cuda (push) Successful in 20m4s
Build Packages / build:portable:windows-x86_64:nocuda (push) Successful in 21m33s
Build Packages / build:jfjoch:ubuntu2204:nocuda (push) Successful in 22m4s
Build Packages / build:jfjoch:rocky8:nocuda (push) Successful in 25m16s
Build Packages / build:portable:windows-x86_64:cuda (push) Successful in 26m14s
Build Packages / build:jfjoch:rocky9:nocuda (push) Successful in 27m26s
Build Packages / HDF5 consumer tests (DIALS, XDS) (push) Successful in 30m26s
Build Packages / build:jfjoch:ubuntu2404:nocuda (push) Successful in 22m20s
Build Packages / Generate python client (push) Successful in 32s
Build Packages / Build documentation (push) Successful in 1m20s
Build Packages / build:jfjoch:rocky8:cuda-sls9 (push) Successful in 23m28s
Build Packages / build:jfjoch:rocky9:cuda-sls9 (push) Successful in 26m23s
Build Packages / build:jfjoch:ubuntu2204:cuda (push) Successful in 20m35s
Build Packages / build:jfjoch:rocky8:cuda (push) Successful in 25m59s
Build Packages / build:jfjoch:rocky9:cuda (push) Successful in 26m27s
Build Packages / build:jfjoch:ubuntu2404:cuda (push) Successful in 22m15s
Build Packages / Unit tests (push) Successful in 1h26m38s
Build Packages / Validation Battery (push) Successful in 32m11s

* jfjoch_broker: Faster live Rugnux analysis, with the GPU indexers prepared at the start of a collection and kept between collections; Rugnux no longer writes `.ccp4` maps (the map coefficients are in `<prefix>_maps.mtz`).

Reviewed-on: #87
Co-authored-by: Filip Leonarski <filip.leonarski@psi.ch>
This commit was merged in pull request #87.
This commit is contained in:
leonarski_f authored and leonarski_f committed 2026-10-19 16:07:31 +02:00
1 parent 8261b7354e
commit 7ed32b899f
183 files changed
+797 -445

No files matched your search

+36 -2
View File
@@ -574,10 +574,9 @@ TEST_CASE("ModelValidation_FindsTheDatasDescriptionOfTheLattice", "[ModelValidat
const auto moved = ValidateAgainstModel(obs, data_cell, ReadModel(other_setting), logger, data_sg,
/*probe_indexing_ambiguity=*/false, 1, 1.0);
REQUIRE(moved.ok);
// The maps come back in memory: their coefficients always, the maps themselves only when asked for.
// The map coefficients come back in memory.
REQUIRE(moved.maps);
CHECK(moved.maps->coefficients.columns.size() == 12);
CHECK_FALSE(moved.maps->map_2fofc);
logger.Info("Change of basis test: took {} out of {}, R-work {:.4f}",
moved.change_of_basis_op.triplet(), moved.setting_as_read, moved.r_work);
CHECK_FALSE(moved.change_of_basis_op == gemmi::Op::identity());
@@ -864,6 +863,41 @@ TEST_CASE("ModelValidation_CCModelFollowsTheSignalByShell", "[ModelValidation]")
std::filesystem::remove(path);
}
// A warm-up (WarmUpModelValidation) only loads what the GPU loads on first use: the validation after it,
// which waits for it, gives what it gives without one.
TEST_CASE("ModelValidation_WarmUpChangesNothing", "[ModelValidation]") {
Logger logger("ModelValidation_WarmUpChangesNothing");
const auto path = WriteTemp("warm_up_test.pdb", ClusterPdb().c_str());
auto obs = ModelReferenceIntensities(ReadModel(path), {}, {}, 2.5, logger);
REQUIRE(obs.size() > 1000);
std::mt19937 rng(20261019);
std::normal_distribution<double> normal(0.0, 1.0);
for (size_t i = 0; i < obs.size(); i++) {
obs[i].I = static_cast<float>(obs[i].I * (1.0 + 0.1 * normal(rng)));
obs[i].F = std::sqrt(std::max(0.0f, obs[i].I));
obs[i].rfree_flag = (i % 20) == 0;
}
const UnitCell cell{.a = 30, .b = 34, .c = 38, .alpha = 90, .beta = 90, .gamma = 90};
const auto model = std::make_shared<const RugnuxModel>(ReadModel(path));
const gemmi::SpaceGroup *sg = gemmi::find_spacegroup_by_name("P 21 21 21");
const auto cold = ValidateAgainstModel(obs, cell, *model, logger, sg, false, 4);
WarmUpModelValidation(model, 4, logger);
const auto warm = ValidateAgainstModel(obs, cell, *model, logger, sg, false, 4);
REQUIRE(cold.ok);
REQUIRE(warm.ok);
CHECK(warm.r_work == cold.r_work);
CHECK(warm.r_free == cold.r_free);
CHECK(warm.rigid_body_angle_deg == cold.rigid_body_angle_deg);
CHECK(warm.null_r_work_mean == cold.null_r_work_mean);
CHECK(warm.null_r_work_sd == cold.null_r_work_sd);
CHECK(warm.r_work_sigma == cold.r_work_sigma);
std::filesystem::remove(path);
}
// The model path's structure factors come from FFTW; they must be gemmi's own transform to float
// precision, in the same layout, so prepare_asu_data() reads the same reflections from either.