Refinement: an exception in a trial slot or in RefineModel no longer ends the run
A slot builder thread that throws (gemmi's topology or hydrogen placement, bad_alloc) would call std::terminate - rugnux or the broker gone. The slot is now left out as one the card cannot take is, with a warning, and MakeOwnSlot's GPU engine catches std::exception, not only JFJochException. Both callers of RefineModel (after the merge, and --mode refine) catch std::exception: the refinement is reported NOT_PERFORMED with "refinement failed: <what>" and the run writes everything else (cell e.s.d.s, unmerged MTZ, report), as the refinement is processing-inert. Test: --mode refine on a cell too large for the bulk-solvent grid comes back with REFINE= NOT_PERFORMED and the reason, not an exception. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_015CeEGgpKdfkCTJb3YNMJcu (cherry picked from commit dc4e99fe4b3da2a9a3fa4290b5f70bfcc8c7bdb8)
This commit is contained in:
1 parent
0143d57eb0
commit
3d382ce0a0
4 files changed
+98
-59
No files matched your search
@@ -998,7 +998,7 @@ std::unique_ptr<OwnSlot> MakeOwnSlot(const gemmi::Structure &before_topology, co
|
||||
if (!ctx.engine)
|
||||
return nullptr;
|
||||
ctx.scale_gpu = std::make_unique<ModelScaleGPUPool>(device, ctx.refl.Size(), 1);
|
||||
} catch (const JFJochException &) {
|
||||
} catch (const std::exception &) {
|
||||
return nullptr;
|
||||
}
|
||||
ctx.device = device;
|
||||
@@ -1299,7 +1299,12 @@ RefinementResult RefineModel(const gemmi::Structure &placed, const std::vector<M
|
||||
#ifdef JFJOCH_USE_CUDA
|
||||
const ScopedGpuPin pin(devices[k] >= 0 ? devices[k] : get_gpu());
|
||||
#endif
|
||||
own[k] = MakeOwnSlot(before_topology, ctx, devices[k], slot_threads, settings);
|
||||
// a slot that cannot be made is left out, as where the card cannot take its engine
|
||||
try {
|
||||
own[k] = MakeOwnSlot(before_topology, ctx, devices[k], slot_threads, settings);
|
||||
} catch (const std::exception &e) {
|
||||
logger.Warning("Refinement: a trial slot could not be made ({}), the trials share fewer", e.what());
|
||||
}
|
||||
});
|
||||
|
||||
RefinePlacement(ctx, settings.group_b, result);
|
||||
|
||||
Reference in new issue
Block a user