aboutsummaryrefslogtreecommitdiff
path: root/libcrystfel
diff options
context:
space:
mode:
authorThomas White <taw@physics.org>2021-03-24 12:25:34 +0100
committerThomas White <taw@physics.org>2021-03-25 16:16:01 +0100
commit8c39ff0eba8265eccddcda227ff9d331ab8c559b (patch)
tree080a14689101dc00263472352cc7f75ccc6ffae2 /libcrystfel
parent66eff85bd922212ffc5b6332abdeffff9c75e761 (diff)
Avoid updating detector geometry structure during prediction refinement
This makes the behaviour consistent with the prediction itself, and removes another bit of mutable state.
Diffstat (limited to 'libcrystfel')
-rw-r--r--libcrystfel/src/predict-refine.c46
1 files changed, 28 insertions, 18 deletions
diff --git a/libcrystfel/src/predict-refine.c b/libcrystfel/src/predict-refine.c
index 5a7c554f..e5250ba4 100644
--- a/libcrystfel/src/predict-refine.c
+++ b/libcrystfel/src/predict-refine.c
@@ -79,15 +79,15 @@ struct reflpeak {
static void twod_mapping(double fs, double ss, double *px, double *py,
- struct detgeom_panel *p)
+ struct detgeom_panel *p, double dx, double dy)
{
double xs, ys;
xs = fs*p->fsx + ss*p->ssx; /* pixels */
ys = fs*p->fsy + ss*p->ssy; /* pixels */
- *px = (xs + p->cnx) * p->pixel_pitch; /* metres */
- *py = (ys + p->cny) * p->pixel_pitch; /* metres */
+ *px = (xs + p->cnx) * p->pixel_pitch + dx; /* metres */
+ *py = (ys + p->cny) * p->pixel_pitch + dy; /* metres */
}
@@ -98,26 +98,28 @@ static double r_dev(struct reflpeak *rp)
}
-static double x_dev(struct reflpeak *rp, struct detgeom *det)
+static double x_dev(struct reflpeak *rp, struct detgeom *det,
+ double dx, double dy)
{
/* Peak position term */
double xpk, ypk, xh, yh;
double fsh, ssh;
- twod_mapping(rp->peak->fs, rp->peak->ss, &xpk, &ypk, rp->panel);
+ twod_mapping(rp->peak->fs, rp->peak->ss, &xpk, &ypk, rp->panel, dx, dy);
get_detector_pos(rp->refl, &fsh, &ssh);
- twod_mapping(fsh, ssh, &xh, &yh, rp->panel);
+ twod_mapping(fsh, ssh, &xh, &yh, rp->panel, dx, dy);
return xh-xpk;
}
-static double y_dev(struct reflpeak *rp, struct detgeom *det)
+static double y_dev(struct reflpeak *rp, struct detgeom *det,
+ double dx, double dy)
{
/* Peak position term */
double xpk, ypk, xh, yh;
double fsh, ssh;
- twod_mapping(rp->peak->fs, rp->peak->ss, &xpk, &ypk, rp->panel);
+ twod_mapping(rp->peak->fs, rp->peak->ss, &xpk, &ypk, rp->panel, dx, dy);
get_detector_pos(rp->refl, &fsh, &ssh);
- twod_mapping(fsh, ssh, &xh, &yh, rp->panel);
+ twod_mapping(fsh, ssh, &xh, &yh, rp->panel, dx, dy);
return yh-ypk;
}
@@ -403,7 +405,7 @@ static int iterate(struct reflpeak *rps, int n, UnitCell *cell,
}
- v_c = x_dev(&rps[i], image->detgeom);
+ v_c = x_dev(&rps[i], image->detgeom, *total_x, *total_y);
v_c *= -gradients[k];
v_curr = gsl_vector_get(v, k);
gsl_vector_set(v, k, v_curr + v_c);
@@ -435,7 +437,7 @@ static int iterate(struct reflpeak *rps, int n, UnitCell *cell,
}
- v_c = y_dev(&rps[i], image->detgeom);
+ v_c = y_dev(&rps[i], image->detgeom, *total_x, *total_y);
v_c *= -gradients[k];
v_curr = gsl_vector_get(v, k);
gsl_vector_set(v, k, v_curr + v_c);
@@ -501,7 +503,8 @@ static int iterate(struct reflpeak *rps, int n, UnitCell *cell,
}
-static double pred_residual(struct reflpeak *rps, int n, struct detgeom *det)
+static double pred_residual(struct reflpeak *rps, int n, struct detgeom *det,
+ double dx, double dy)
{
int i;
double res = 0.0;
@@ -515,13 +518,13 @@ static double pred_residual(struct reflpeak *rps, int n, struct detgeom *det)
r = 0.0;
for ( i=0; i<n; i++ ) {
- r += pow(x_dev(&rps[i], det), 2.0);
+ r += pow(x_dev(&rps[i], det, dx, dy), 2.0);
}
res += r;
r = 0.0;
for ( i=0; i<n; i++ ) {
- r += pow(y_dev(&rps[i], det), 2.0);
+ r += pow(y_dev(&rps[i], det, dx, dy), 2.0);
}
res += r;
@@ -552,6 +555,7 @@ int refine_prediction(struct image *image, Crystal *cr)
double total_x = 0.0;
double total_y = 0.0;
double total_z = 0.0;
+ double orig_shift_x, orig_shift_y;
char tmp[256];
rps = malloc(image_feature_count(image->features)
@@ -568,6 +572,8 @@ int refine_prediction(struct image *image, Crystal *cr)
crystal_set_reflections(cr, reflist);
crystal_get_det_shift(cr, &total_x, &total_y);
+ orig_shift_x = total_x;
+ orig_shift_y = total_y;
/* Normalise the intensities to max 1 */
max_I = -INFINITY;
@@ -584,20 +590,23 @@ int refine_prediction(struct image *image, Crystal *cr)
rps[i].Ih = rps[i].peak->intensity / max_I;
}
- //STATUS("Initial residual = %e\n", pred_residual(rps, n, image->detgeom));
+ //STATUS("Initial residual = %e\n",
+ // pred_residual(rps, n, image->detgeom, total_x, total_y));
/* Refine */
for ( i=0; i<MAX_CYCLES; i++ ) {
update_predictions(cr);
if ( iterate(rps, n, crystal_get_cell(cr), image,
&total_x, &total_y, &total_z) ) return 1;
+ crystal_set_det_shift(cr, total_x, total_y);
//STATUS("Residual after %i = %e\n", i,
- // pred_residual(rps, n, image->detgeom));
+ // pred_residual(rps, n, image->detgeom, total_x, total_y));
}
- //STATUS("Final residual = %e\n", pred_residual(rps, n, image->detgeom));
+ //STATUS("Final residual = %e\n",
+ // pred_residual(rps, n, image->detgeom, total_x, total_y));
snprintf(tmp, 255, "predict_refine/final_residual = %e",
- pred_residual(rps, n, image->detgeom));
+ pred_residual(rps, n, image->detgeom, total_x, total_y));
crystal_add_notes(cr, tmp);
crystal_set_det_shift(cr, total_x, total_y);
@@ -608,6 +617,7 @@ int refine_prediction(struct image *image, Crystal *cr)
n = pair_peaks(image, cr, NULL, rps);
free_rps_noreflist(rps, n);
if ( n < 10 ) {
+ crystal_set_det_shift(cr, orig_shift_x, orig_shift_y);
return 1;
}