From 4a1380a1edfcaa29ce8658ceecdc8c99d0e02d8f Mon Sep 17 00:00:00 2001 From: Thomas White Date: Tue, 19 Jan 2010 18:26:20 +0100 Subject: Improve the operation of --dump-peaks --- src/indexamajig.c | 6 ++-- src/peaks.c | 82 +++++++++++++++++++++++++++++++++++++++++++------------ src/peaks.h | 4 +-- 3 files changed, 70 insertions(+), 22 deletions(-) diff --git a/src/indexamajig.c b/src/indexamajig.c index 3cd3a408..2604dd14 100644 --- a/src/indexamajig.c +++ b/src/indexamajig.c @@ -141,12 +141,14 @@ int main(int argc, char *argv[]) hdf5_read(hdfile, &image); /* Perform 'fine' peak search */ - search_peaks(&image, config_dumpfound); + search_peaks(&image); - if ( image_feature_count(image.features) > 25 ) { + if ( image_feature_count(image.features) > 5 ) { n_hits++; + if ( config_dumpfound ) dump_peaks(&image); + if ( !config_noindex ) { /* Calculate orientation matrix (by magic) */ diff --git a/src/peaks.c b/src/peaks.c index 00fb95f2..502c5dad 100644 --- a/src/peaks.c +++ b/src/peaks.c @@ -24,6 +24,7 @@ #include "utils.h" #include "index.h" #include "peaks.h" +#include "detector.h" #define PEAK_WINDOW_SIZE (10) @@ -188,7 +189,32 @@ int image_fom(struct image *image) } -void search_peaks(struct image *image, int dump_peaks) +static int is_hot_pixel(struct image *image, int x, int y) +{ + int dx, dy; + int w, v; + + w = image->width; + v = (1*image->data[x+w*y])/2; + + if ( x+1 >= image->width ) return 0; + if ( x-1 < 0 ) return 0; + if ( y+1 >= image->height ) return 0; + if ( y-1 < 0 ) return 0; + + /* Must be at least one adjacent bright pixel */ + for ( dx=-1; dx<=+1; dx++ ) { + for ( dy=-1; dy<=+1; dy++ ) { + if ( (dx==0) && (dy==0) ) continue; + if ( image->data[(x+dx)+w*(y+dy)] >= v ) return 0; + } + } + + return 1; +} + + +void search_peaks(struct image *image) { int x, y, width, height; int16_t *data; @@ -202,10 +228,6 @@ void search_peaks(struct image *image, int dump_peaks) } image->features = image_feature_list_new(); - if ( dump_peaks ) { - printf("x/px\ty/px\t|q|/nm^-1\tPeak I\n"); - } - for ( x=1; xwidth-1; x++ ) { for ( y=1; yheight-1; y++ ) { @@ -279,6 +301,9 @@ void search_peaks(struct image *image, int dump_peaks) /* Too far from foot point? */ if ( distance(mask_x, mask_y, x, y) > 50.0 ) continue; + /* Isolated hot pixel? */ + if ( is_hot_pixel(image, mask_x, mask_y) ) continue; + /* Check for a feature at exactly the * same coordinates */ image_feature_closest(image->features, mask_x, mask_y, @@ -286,30 +311,51 @@ void search_peaks(struct image *image, int dump_peaks) if ( d > 1.0 ) { - /* Map and record reflection */ - if ( dump_peaks ) { + image_add_feature(image->features, + mask_x, mask_y, image, + data[mask_x+width*mask_y]); + + } + + } - double q, rx, ry, rz; - map_position(image, mask_x, mask_y, - &rx, &ry, &rz); + } + } +} - q = modulus(rx, ry, rz); +void dump_peaks(struct image *image) +{ + int i; - printf("%i\t%i\t%f\t%i\n", x, y, q/1.0e9, - data[mask_x+width*mask_y]); + printf("x/px\ty/px\t|q|/nm^-1\tPeak I\n"); - } + for ( i=0; ifeatures); i++ ) { - image_add_feature(image->features, - mask_x, mask_y, image, 1.0); + double q, rx, ry, rz; + int x, y; + struct imagefeature *f; - } + f = image_get_feature(image->features, i); + x = f->x; + y = f->y; + + if ( f->y >=512 ) { + /* Top half of CCD */ + map_position(image, f->x-UPPER_CX, f->y-UPPER_CY, + &rx, &ry, &rz); + } else { + /* Lower half of CCD */ + map_position(image, f->x-LOWER_CX, f->y-LOWER_CY, + &rx, &ry, &rz); } + q = modulus(rx, ry, rz); + + printf("%i\t%i\t%f\t%i\n", x, y, q/1.0e9, + image->data[x+image->width*y]); - } } } diff --git a/src/peaks.h b/src/peaks.h index 85501af2..2e868342 100644 --- a/src/peaks.h +++ b/src/peaks.h @@ -19,7 +19,7 @@ extern int image_fom(struct image *image); -extern void search_peaks(struct image *image, int dump_peaks); - +extern void search_peaks(struct image *image); +extern void dump_peaks(struct image *image); #endif /* PEAKS_H */ -- cgit v1.2.3