aboutsummaryrefslogtreecommitdiff
path: root/libcrystfel
diff options
context:
space:
mode:
authorThomas White <taw@physics.org>2013-01-10 13:49:11 +0100
committerThomas White <taw@physics.org>2013-01-10 15:13:18 +0100
commita1e0854a972a988a7153df04f74dcee3ff9e75b9 (patch)
tree5621bd3af2387822a3feb6094b44b5b870841de5 /libcrystfel
parent10a8969c10ac739aa2aa3de826f6bf2aa9940262 (diff)
indexamajig: Add --integrate-found
Diffstat (limited to 'libcrystfel')
-rw-r--r--libcrystfel/src/geometry.c60
-rw-r--r--libcrystfel/src/geometry.h5
2 files changed, 63 insertions, 2 deletions
diff --git a/libcrystfel/src/geometry.c b/libcrystfel/src/geometry.c
index 60fab488..79a438ec 100644
--- a/libcrystfel/src/geometry.c
+++ b/libcrystfel/src/geometry.c
@@ -33,6 +33,7 @@
#include <stdlib.h>
#include <assert.h>
+#include <fenv.h>
#include "utils.h"
#include "cell.h"
@@ -276,6 +277,65 @@ RefList *find_intersections(struct image *image, UnitCell *cell)
}
+RefList *select_intersections(struct image *image, UnitCell *cell)
+{
+ double ax, ay, az;
+ double bx, by, bz;
+ double cx, cy, cz;
+ const double min_dist = 0.25;
+ RefList *list;
+ int i;
+
+ /* Round towards nearest */
+ fesetround(1);
+
+ /* Cell basis vectors for this image */
+ cell_get_cartesian(cell, &ax, &ay, &az, &bx, &by, &bz, &cx, &cy, &cz);
+
+ list = reflist_new();
+ if ( list == NULL ) return NULL;
+
+ /* Loop over peaks, checking proximity to nearest reflection */
+ for ( i=0; i<image_feature_count(image->features); i++ ) {
+
+ struct imagefeature *f;
+ struct rvec q;
+ double h, k, l, hd, kd, ld;
+ double dsq;
+
+ f = image_get_feature(image->features, i);
+ if ( f == NULL ) continue;
+
+ /* Reciprocal space position of found peak */
+ q = get_q(image, f->fs, f->ss, NULL, 1.0/image->lambda);
+
+ /* Decimal and fractional Miller indices of nearest
+ * reciprocal lattice point */
+ hd = q.u * ax + q.v * ay + q.w * az;
+ kd = q.u * bx + q.v * by + q.w * bz;
+ ld = q.u * cx + q.v * cy + q.w * cz;
+ h = lrint(hd);
+ k = lrint(kd);
+ l = lrint(ld);
+
+ /* Check distance */
+ dsq = pow(h-hd, 2.0) + pow(k-kd, 2.0) + pow(l-ld, 2.0);
+
+ if ( sqrt(dsq) < min_dist ) {
+
+ Reflection *refl;
+
+ refl = add_refl(list, h, k, l);
+ set_detector_pos(refl, sqrt(dsq), f->fs, f->ss);
+
+ }
+
+ }
+
+ return list;
+}
+
+
/* Calculate partialities and apply them to the image's reflections */
void update_partialities(struct image *image)
{
diff --git a/libcrystfel/src/geometry.h b/libcrystfel/src/geometry.h
index 94b496e6..14a3a7d6 100644
--- a/libcrystfel/src/geometry.h
+++ b/libcrystfel/src/geometry.h
@@ -43,9 +43,10 @@
extern "C" {
#endif
-RefList *find_intersections(struct image *image, UnitCell *cell);
+extern RefList *find_intersections(struct image *image, UnitCell *cell);
+extern RefList *select_intersections(struct image *image, UnitCell *cell);
-void update_partialities(struct image *image);
+extern void update_partialities(struct image *image);
#ifdef __cplusplus
}