v1.0.0-rc.148 (#58)
Build Packages / Unit tests (push) Skipped
Build Packages / build:rpm (rocky8_nocuda) (push) Successful in 9m28s
Build Packages / build:rpm (rocky9_nocuda) (push) Successful in 10m9s
Build Packages / build:rpm (ubuntu2404_nocuda) (push) Successful in 9m47s
Build Packages / build:rpm (ubuntu2204_nocuda) (push) Successful in 10m58s
Build Packages / build:rpm (rocky8_sls9) (push) Successful in 11m39s
Build Packages / build:rpm (rocky8) (push) Successful in 11m43s
Build Packages / build:rpm (rocky9_sls9) (push) Successful in 12m59s
Build Packages / Generate python client (push) Successful in 35s
Build Packages / Build documentation (push) Successful in 59s
Build Packages / Create release (push) Skipped
Build Packages / build:rpm (ubuntu2204) (push) Successful in 11m48s
Build Packages / build:rpm (rocky9) (push) Successful in 12m32s
Build Packages / build:rpm (ubuntu2404) (push) Successful in 10m24s
Build Packages / XDS test (durin plugin) (push) Successful in 7m35s
Build Packages / XDS test (neggia plugin) (push) Successful in 6m50s
Build Packages / XDS test (JFJoch plugin) (push) Successful in 7m40s
Build Packages / DIALS test (push) Successful in 11m19s
Build Packages / Unit tests (push) Skipped
Build Packages / build:rpm (rocky8_nocuda) (push) Successful in 9m28s
Build Packages / build:rpm (rocky9_nocuda) (push) Successful in 10m9s
Build Packages / build:rpm (ubuntu2404_nocuda) (push) Successful in 9m47s
Build Packages / build:rpm (ubuntu2204_nocuda) (push) Successful in 10m58s
Build Packages / build:rpm (rocky8_sls9) (push) Successful in 11m39s
Build Packages / build:rpm (rocky8) (push) Successful in 11m43s
Build Packages / build:rpm (rocky9_sls9) (push) Successful in 12m59s
Build Packages / Generate python client (push) Successful in 35s
Build Packages / Build documentation (push) Successful in 59s
Build Packages / Create release (push) Skipped
Build Packages / build:rpm (ubuntu2204) (push) Successful in 11m48s
Build Packages / build:rpm (rocky9) (push) Successful in 12m32s
Build Packages / build:rpm (ubuntu2404) (push) Successful in 10m24s
Build Packages / XDS test (durin plugin) (push) Successful in 7m35s
Build Packages / XDS test (neggia plugin) (push) Successful in 6m50s
Build Packages / XDS test (JFJoch plugin) (push) Successful in 7m40s
Build Packages / DIALS test (push) Successful in 11m19s
This is an UNSTABLE release. The release has significant modifications for data processing - in case of troubles go back to 1.0.0-rc.144. * jfjoch_broker: Improve azimuthal integration (add <I^2> calculation) * jfjoch_broker: Fixes around indexing, aiming to handle multi-lattice crystals (work in progress, it is not fully integrated) * jfjoch_writer: Save mean(I), stddev(I), and count(I) for each azimuthal bin Reviewed-on: #58
This commit was merged in pull request #58.
This commit is contained in:
@@ -8,6 +8,7 @@
|
||||
#include "geom_refinement/XtalOptimizer.h"
|
||||
#include "indexing/AnalyzeIndexing.h"
|
||||
#include "indexing/FFTIndexer.h"
|
||||
#include "indexing/MultiLatticeSearch.h"
|
||||
#include "lattice_search/LatticeSearch.h"
|
||||
#include "scale_merge/ScaleOnTheFly.h"
|
||||
|
||||
@@ -56,7 +57,12 @@ IndexAndRefine::IndexingOutcome IndexAndRefine::DetermineLatticeAndSymmetryRotat
|
||||
auto gon = result->axis;
|
||||
if (gon) {
|
||||
const float angle_deg = gon->GetAngle_deg(msg.number) + gon->GetWedge_deg() / 2.0f;
|
||||
outcome.lattice_candidate = result->lattice.Multiply(gon->GetTransformationAngle(-angle_deg));
|
||||
const auto rot_to_image = gon->GetTransformationAngle(-angle_deg);
|
||||
outcome.lattice_candidate = result->lattice.Multiply(rot_to_image);
|
||||
|
||||
outcome.extra_lattice_candidates.reserve(result->extra_lattices.size());
|
||||
for (const auto &el : result->extra_lattices)
|
||||
outcome.extra_lattice_candidates.push_back(el.Multiply(rot_to_image));
|
||||
}
|
||||
|
||||
outcome.experiment.BeamX_pxl(result->geom.GetBeamX_pxl())
|
||||
@@ -113,6 +119,22 @@ IndexAndRefine::IndexingOutcome IndexAndRefine::DetermineLatticeAndSymmetry(Data
|
||||
};
|
||||
outcome.lattice_candidate = sym_result.conventional;
|
||||
}
|
||||
|
||||
// Multi-lattice search for stills: store rotations that map the reference
|
||||
// lattice to each accepted extra lattice. Candidates are materialized later
|
||||
// in RefineGeometryIfNeeded so they're rooted in the refined (and, for
|
||||
// monoclinic, reordered) main lattice.
|
||||
if (indexer_result.lattice.size() > 1) {
|
||||
auto ml_latt = MultiLatticeSearch(indexer_result.lattice);
|
||||
for (auto &ml : ml_latt) {
|
||||
if (outcome.extra_lattice_rotations.size() >= experiment.GetIndexingSettings().GetMaxExtraLattices())
|
||||
break;
|
||||
outcome.extra_lattice_rotations.push_back(ml.rotation_vector);
|
||||
RotMatrix rot(ml.rotation_vector.Length(), ml.rotation_vector.Normalize());
|
||||
outcome.extra_lattice_candidates.push_back(outcome.lattice_candidate->Multiply(rot));
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -166,6 +188,39 @@ void IndexAndRefine::RefineGeometryIfNeeded(DataMessage &msg, IndexAndRefine::In
|
||||
if (outcome.symmetry.crystal_system == gemmi::CrystalSystem::Monoclinic)
|
||||
outcome.lattice_candidate->ReorderMonoclinic();
|
||||
|
||||
// Rebuild extra-lattice candidates from the refined (and possibly reordered) main
|
||||
// lattice so they share its cell and obtuse-beta convention.
|
||||
if (!outcome.extra_lattice_rotations.empty()) {
|
||||
outcome.extra_lattice_candidates.clear();
|
||||
outcome.extra_lattice_candidates.reserve(outcome.extra_lattice_rotations.size());
|
||||
for (const auto &rv : outcome.extra_lattice_rotations) {
|
||||
RotMatrix rot(rv.Length(), rv.Normalize());
|
||||
outcome.extra_lattice_candidates.push_back(outcome.lattice_candidate->Multiply(rot));
|
||||
}
|
||||
}
|
||||
|
||||
// Quick orientation-only refinement of extra lattices (stills path).
|
||||
// Cell, beam center, detector geometry are taken from the first lattice.
|
||||
if (!experiment.IsRotationIndexing() && !outcome.extra_lattice_candidates.empty()) {
|
||||
for (auto &el : outcome.extra_lattice_candidates) {
|
||||
XtalOptimizerData data_extra{
|
||||
.geom = data.geom,
|
||||
.latt = el,
|
||||
.crystal_system = data.crystal_system,
|
||||
.min_spots = experiment.GetIndexingSettings().GetViableCellMinSpots(),
|
||||
.refine_beam_center = false,
|
||||
.refine_distance_mm = false,
|
||||
.refine_detector_angles = false,
|
||||
.refine_unit_cell = false,
|
||||
.refine_rotation_axis = false,
|
||||
.index_ice_rings = experiment.GetIndexingSettings().GetIndexIceRings(),
|
||||
.max_time = 0.02
|
||||
};
|
||||
XtalOptimizerRotationOnly(data_extra, msg.spots, 0.1);
|
||||
el = data_extra.latt;
|
||||
}
|
||||
}
|
||||
|
||||
if (outcome.beam_center_updated) {
|
||||
msg.beam_corr_x = data.beam_corr_x;
|
||||
msg.beam_corr_y = data.beam_corr_y;
|
||||
@@ -296,7 +351,7 @@ void IndexAndRefine::ProcessImage(DataMessage &msg,
|
||||
if (!outcome.lattice_candidate.has_value())
|
||||
return;
|
||||
|
||||
if (!AnalyzeIndexing(msg, outcome.experiment, *outcome.lattice_candidate))
|
||||
if (!AnalyzeIndexing(msg, outcome.experiment, *outcome.lattice_candidate, outcome.extra_lattice_candidates))
|
||||
return;
|
||||
|
||||
{
|
||||
@@ -433,3 +488,8 @@ std::vector<IntegrationOutcome> &IndexAndRefine::GetIntegrationOutcome() {
|
||||
const std::vector<IntegrationOutcome> &IndexAndRefine::GetIntegrationOutcome() const {
|
||||
return integration_outcome;
|
||||
}
|
||||
|
||||
void IndexAndRefine::ForceRotationIndexerLattice(const CrystalLattice &lattice) {
|
||||
if (rotation_indexer)
|
||||
rotation_indexer->ForceLattice(lattice);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user