IndexAndRefine: Use small angle approximation for optimizing rotation data
This commit is contained in:
@@ -9,7 +9,7 @@
|
||||
#include "indexing/AnalyzeIndexing.h"
|
||||
#include "indexing/FFTIndexer.h"
|
||||
#include "lattice_search/LatticeSearch.h"
|
||||
|
||||
#include "geom_refinement/SimpleRotXtalOptimizer.h"
|
||||
|
||||
IndexAndRefine::IndexAndRefine(const DiffractionExperiment &x, IndexerThreadPool *indexer)
|
||||
: index_ice_rings(x.GetIndexingSettings().GetIndexIceRings()),
|
||||
@@ -93,42 +93,49 @@ void IndexAndRefine::RefineGeometryIfNeeded(DataMessage &msg, IndexAndRefine::In
|
||||
if (!outcome.lattice_candidate)
|
||||
return;
|
||||
|
||||
XtalOptimizerData data{
|
||||
.geom = outcome.experiment.GetDiffractionGeometry(),
|
||||
.latt = *outcome.lattice_candidate,
|
||||
.crystal_system = outcome.symmetry.crystal_system,
|
||||
.min_spots = experiment.GetIndexingSettings().GetViableCellMinSpots(),
|
||||
.refine_beam_center = true,
|
||||
.refine_distance_mm = false,
|
||||
.refine_detector_angles = false,
|
||||
.max_time = 0.04 // 40 ms is max allowed time for the operation
|
||||
};
|
||||
|
||||
if (experiment.IsRotationIndexing()) {
|
||||
data.refine_beam_center = false;
|
||||
data.refine_unit_cell = false;
|
||||
}
|
||||
SimpleRotXtalOptimizerData data{
|
||||
.geom = outcome.experiment.GetDiffractionGeometry(),
|
||||
.latt = *outcome.lattice_candidate,
|
||||
.min_spots = experiment.GetIndexingSettings().GetViableCellMinSpots(),
|
||||
};
|
||||
if (SimpleRotXtalOptimizer(data, msg.spots)) {
|
||||
outcome.lattice_candidate = data.latt;
|
||||
}
|
||||
} else {
|
||||
XtalOptimizerData data{
|
||||
.geom = outcome.experiment.GetDiffractionGeometry(),
|
||||
.latt = *outcome.lattice_candidate,
|
||||
.crystal_system = outcome.symmetry.crystal_system,
|
||||
.min_spots = experiment.GetIndexingSettings().GetViableCellMinSpots(),
|
||||
.refine_beam_center = true,
|
||||
.refine_distance_mm = false,
|
||||
.refine_detector_angles = false,
|
||||
.max_time = 0.04 // 40 ms is max allowed time for the operation
|
||||
};
|
||||
|
||||
if (outcome.symmetry.crystal_system == gemmi::CrystalSystem::Trigonal)
|
||||
data.crystal_system = gemmi::CrystalSystem::Hexagonal;
|
||||
|
||||
switch (experiment.GetIndexingSettings().GetGeomRefinementAlgorithm()) {
|
||||
case GeomRefinementAlgorithmEnum::None:
|
||||
break;
|
||||
case GeomRefinementAlgorithmEnum::BeamCenter:
|
||||
if (XtalOptimizer(data, msg.spots)) {
|
||||
outcome.experiment.BeamX_pxl(data.geom.GetBeamX_pxl())
|
||||
.BeamY_pxl(data.geom.GetBeamY_pxl());
|
||||
outcome.beam_center_updated = true;
|
||||
}
|
||||
break;
|
||||
}
|
||||
if (outcome.symmetry.crystal_system == gemmi::CrystalSystem::Trigonal)
|
||||
data.crystal_system = gemmi::CrystalSystem::Hexagonal;
|
||||
|
||||
outcome.lattice_candidate = data.latt;
|
||||
switch (experiment.GetIndexingSettings().GetGeomRefinementAlgorithm()) {
|
||||
case GeomRefinementAlgorithmEnum::None:
|
||||
break;
|
||||
case GeomRefinementAlgorithmEnum::BeamCenter:
|
||||
if (XtalOptimizer(data, msg.spots)) {
|
||||
outcome.experiment.BeamX_pxl(data.geom.GetBeamX_pxl())
|
||||
.BeamY_pxl(data.geom.GetBeamY_pxl());
|
||||
outcome.beam_center_updated = true;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
if (outcome.beam_center_updated) {
|
||||
msg.beam_corr_x = data.beam_corr_x;
|
||||
msg.beam_corr_y = data.beam_corr_y;
|
||||
outcome.lattice_candidate = data.latt;
|
||||
|
||||
if (outcome.beam_center_updated) {
|
||||
msg.beam_corr_x = data.beam_corr_x;
|
||||
msg.beam_corr_y = data.beam_corr_y;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user