XtalOptimizer: Bring back standard loss function for least squares

This commit is contained in:
2026-01-30 14:02:09 +01:00
parent 06e50b85a3
commit af3fea3e66
@@ -126,10 +126,9 @@ struct XtalResidual {
auto e_pred_hkl = e_latt.transpose() * e_obs_recip;
T dh = exp_h - e_pred_hkl[0];
T dk = exp_k - e_pred_hkl[1];
T dl = exp_l - e_pred_hkl[2];
residual[0] = ceres::sqrt(dh * dh + dk * dk + dl * dl);
residual[0] = exp_h - e_pred_hkl[0];
residual[1] = exp_k - e_pred_hkl[1];
residual[2] = exp_l - e_pred_hkl[2];
return true;
}
@@ -456,14 +455,14 @@ bool XtalOptimizerInternal(XtalOptimizerData &data,
continue;
problem.AddResidualBlock(
new ceres::AutoDiffCostFunction<XtalResidual, 1, 1, 1, 1, 2, 3, 3, 3>(
new ceres::AutoDiffCostFunction<XtalResidual, 3, 1, 1, 1, 2, 3, 3, 3>(
new XtalResidual(pt.x, pt.y,
data.geom.GetWavelength_A(),
data.geom.GetPixelSize_mm(),
gonio_back_rot,
h, k, l,
data.crystal_system)),
new ceres::CauchyLoss(loss_scale),
nullptr,
&beam_x,
&beam_y,
&distance_mm,
@@ -608,5 +607,6 @@ bool XtalOptimizerInternal(XtalOptimizerData &data,
bool XtalOptimizer(XtalOptimizerData &data, const std::vector<SpotToSave> &spots) {
if (!XtalOptimizerInternal(data, spots, 0.3))
return false;
XtalOptimizerInternal(data, spots, 0.2);
return XtalOptimizerInternal(data, spots, 0.1);
}