/* * index.c * * Perform indexing (somehow) * * (c) 2006-2009 Thomas White * * Part of CrystFEL - crystallography with a FEL * */ #ifdef HAVE_CONFIG_H #include #endif #include #include #include #include #include #include "image.h" #include "utils.h" #include "peaks.h" #include "dirax.h" static int map_position(struct image *image, double x, double y, double *rx, double *ry, double *rz) { /* "Input" space */ double d; /* Angular description of reflection */ double theta, psi, k; x -= image->x_centre; y -= image->y_centre; k = 1.0 / image->lambda; /* FIXME: Don't process lower CCD for now */ if ( y < 0 ) return 0; if ( image->fmode == FORMULATION_CLEN ) { /* Convert pixels to metres */ x /= image->resolution; y /= image->resolution; /* Convert pixels to metres */ d = sqrt((x*x) + (y*y)); theta = atan2(d, image->camera_len); } else if (image->fmode == FORMULATION_PIXELSIZE ) { /* Convert pixels to metres^-1 */ x *= image->pixel_size; y *= image->pixel_size; /* Convert pixels to metres^-1 */ d = sqrt((x*x) + (y*y)); theta = atan2(d, k); } else { ERROR("Unrecognised formulation mode in mapping_scale.\n"); return -1; } psi = atan2(y, x); *rx = k*sin(theta)*cos(psi); *ry = k*sin(theta)*sin(psi); *rz = k - k*cos(theta); return 0; } void index_pattern(struct image *image, int no_index, int dump_peaks, int use_dirax) { int i; /* Perform 'fine' peak search */ search_peaks(image, dump_peaks); /* Map positions to 3D. FIXME: Handle lower detector */ for ( i=0; ifeatures); i++ ) { struct imagefeature *f; f = image_get_feature(image->features, i); map_position(image, f->x, f->y, &f->rx, &f->ry, &f->rz); } if ( use_dirax ) { run_dirax(image, no_index); return; } }