diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/calibrate_detector.c | 3 | ||||
-rw-r--r-- | src/cubeit.c | 3 | ||||
-rw-r--r-- | src/geometry.c | 52 | ||||
-rw-r--r-- | src/geometry.h | 8 | ||||
-rw-r--r-- | src/image.h | 33 | ||||
-rw-r--r-- | src/indexamajig.c | 8 | ||||
-rw-r--r-- | src/partialator.c | 81 | ||||
-rw-r--r-- | src/pattern_sim.c | 2 | ||||
-rw-r--r-- | src/peaks.c | 140 | ||||
-rw-r--r-- | src/post-refinement.c | 127 | ||||
-rw-r--r-- | src/post-refinement.h | 5 | ||||
-rw-r--r-- | src/reflist.c | 139 | ||||
-rw-r--r-- | src/reflist.h | 69 | ||||
-rw-r--r-- | src/reintegrate.c | 3 | ||||
-rw-r--r-- | src/templates.c | 52 |
15 files changed, 419 insertions, 306 deletions
diff --git a/src/calibrate_detector.c b/src/calibrate_detector.c index 2252842f..9aeae803 100644 --- a/src/calibrate_detector.c +++ b/src/calibrate_detector.c @@ -168,8 +168,7 @@ static void add_image(void *args, int cookie) image.flags = NULL; image.indexed_cell = NULL; image.filename = pargs->filename; - image.cpeaks = NULL; - image.n_cpeaks = 0; + image.reflections = NULL; image.det = NULL; STATUS("%3i: Processing '%s'\n", cookie, pargs->filename); diff --git a/src/cubeit.c b/src/cubeit.c index 808e2e23..7b40f8e5 100644 --- a/src/cubeit.c +++ b/src/cubeit.c @@ -218,8 +218,7 @@ static void sum_image(void *pg, int cookie) image.flags = NULL; image.indexed_cell = NULL; image.filename = apargs->filename; - image.cpeaks = NULL; - image.n_cpeaks = 0; + image.reflections = NULL; image.det = pargs->det; STATUS("Processing '%s'\n", apargs->filename); diff --git a/src/geometry.c b/src/geometry.c index 9bb41d12..9f9b953c 100644 --- a/src/geometry.c +++ b/src/geometry.c @@ -22,6 +22,7 @@ #include "image.h" #include "peaks.h" #include "beam-parameters.h" +#include "reflist.h" #define MAX_CPEAKS (256 * 256) @@ -117,7 +118,7 @@ static double partiality(double r1, double r2, double r) static int check_reflection(struct image *image, double mres, int output, - struct cpeak *cpeaks, int np, + RefList *reflections, signed int h, signed int k, signed int l, double asx, double asy, double asz, double bsx, double bsy, double bsz, @@ -136,6 +137,7 @@ static int check_reflection(struct image *image, double mres, int output, double divergence = image->div; double lambda = image->lambda; double klow, kcen, khigh; /* Wavenumber */ + Reflection *refl; /* "low" gives the largest Ewald sphere, * "high" gives the smallest Ewald sphere. */ @@ -207,17 +209,9 @@ static int check_reflection(struct image *image, double mres, int output, if ( p == -1 ) return 0; /* Add peak to list */ - cpeaks[np].h = h; - cpeaks[np].k = k; - cpeaks[np].l = l; - cpeaks[np].x = xda; - cpeaks[np].y = yda; - cpeaks[np].r1 = rlow; - cpeaks[np].r2 = rhigh; - cpeaks[np].p = part; - cpeaks[np].clamp1 = clamp_low; - cpeaks[np].clamp2 = clamp_high; - np++; + refl = add_refl(reflections, h, k, l); + set_detector_pos(refl, 0.0, xda, yda); + set_partial(refl, rlow, rhigh, part, clamp_low, clamp_high); if ( output ) { printf("%3i %3i %3i %6f (at %5.2f,%5.2f) %5.2f\n", @@ -228,23 +222,18 @@ static int check_reflection(struct image *image, double mres, int output, } -struct cpeak *find_intersections(struct image *image, UnitCell *cell, - int *n, int output) +RefList *find_intersections(struct image *image, UnitCell *cell, + int output) { double asx, asy, asz; double bsx, bsy, bsz; double csx, csy, csz; - struct cpeak *cpeaks; - int np = 0; + RefList *reflections; int hmax, kmax, lmax; double mres; signed int h, k, l; - cpeaks = malloc(sizeof(struct cpeak)*MAX_CPEAKS); - if ( cpeaks == NULL ) { - *n = 0; - return NULL; - } + reflections = reflist_new(); cell_get_reciprocal(cell, &asx, &asy, &asz, &bsx, &bsy, &bsz, @@ -260,29 +249,30 @@ struct cpeak *find_intersections(struct image *image, UnitCell *cell, for ( l=-lmax; l<lmax; l++ ) { /* Ignore central beam */ if ( (h==0) && (k==0) && (l==0) ) continue; - np += check_reflection(image, mres, output, cpeaks, np, h, k, l, - asx,asy,asz,bsx,bsy,bsz,csx,csy,csz); - if ( np == MAX_CPEAKS ) goto out; + check_reflection(image, mres, output, reflections, h, k, l, + asx,asy,asz,bsx,bsy,bsz,csx,csy,csz); } } } -out: - *n = np; - return cpeaks; + return reflections; } -double integrate_all(struct image *image, struct cpeak *cpeaks, int n) +double integrate_all(struct image *image, RefList *reflections) { double itot = 0.0; - int i; + Reflection *refl; - for ( i=0; i<n; i++ ) { + for ( refl = first_refl(reflections); + refl != NULL; + refl = next_refl(refl) ) { float x, y, intensity; + double xp, yp; + get_detector_pos(refl, &xp, &yp); - if ( integrate_peak(image, cpeaks[i].x, cpeaks[i].y, &x, &y, + if ( integrate_peak(image, xp, yp, &x, &y, &intensity, NULL, NULL, 0, 0) ) continue; itot += intensity; diff --git a/src/geometry.h b/src/geometry.h index 0782a3e1..a0761456 100644 --- a/src/geometry.h +++ b/src/geometry.h @@ -17,10 +17,12 @@ #include <config.h> #endif -extern struct cpeak *find_intersections(struct image *image, UnitCell *cell, - int *n, int output); +#include "reflist.h" -extern double integrate_all(struct image *image, struct cpeak *cpeaks, int n); +extern RefList *find_intersections(struct image *image, UnitCell *cell, + int output); + +extern double integrate_all(struct image *image, RefList *reflections); #endif /* GEOMETRY_H */ diff --git a/src/image.h b/src/image.h index 10fb2406..ce0e7343 100644 --- a/src/image.h +++ b/src/image.h @@ -24,6 +24,7 @@ #include "utils.h" #include "cell.h" #include "detector.h" +#include "reflist.h" #define MAX_CELL_CANDIDATES (32) @@ -52,35 +53,6 @@ struct imagefeature { typedef struct _imagefeaturelist ImageFeatureList; -/* This structure represents a predicted peak in an image */ -struct cpeak -{ - /* Indices */ - signed int h; - signed int k; - signed int l; - - double min_distance; - int valid; - - /* Partiality */ - double r1; /* First excitation error */ - double r2; /* Second excitation error */ - double p; /* Partiality */ - int clamp1; /* Clamp status for r1 */ - int clamp2; /* Clamp status for r2 */ - - /* Location in image */ - int x; - int y; - - int scalable; - - /* Intensity */ - double intensity; -}; - - /* Structure describing an image */ struct image { @@ -93,8 +65,7 @@ struct image { struct detector *det; struct beam_params *beam; /* The nominal beam parameters */ char *filename; - struct cpeak *cpeaks; - int n_cpeaks; + RefList *reflections; int id; /* ID number of the thread * handling this image */ diff --git a/src/indexamajig.c b/src/indexamajig.c index 6c01f95e..40d7cbd8 100644 --- a/src/indexamajig.c +++ b/src/indexamajig.c @@ -263,8 +263,7 @@ static struct image *get_simage(struct image *template, int alternate) image->f0 = template->f0; /* Prevent muppetry */ - image->cpeaks = NULL; - image->n_cpeaks = 0; + image->reflections = NULL; return image; } @@ -326,8 +325,7 @@ static void process_image(void *pp, int cookie) image.indexed_cell = NULL; image.id = cookie; image.filename = filename; - image.cpeaks = NULL; - image.n_cpeaks = 0; + image.reflections = NULL; image.det = pargs->static_args.det; STATUS("Processing '%s'\n", image.filename); @@ -434,7 +432,7 @@ done: free(image.data); free(image.flags); image_feature_list_free(image.features); - free(image.cpeaks); + reflist_free(image.reflections); hdfile_close(hdfile); } diff --git a/src/partialator.c b/src/partialator.c index d1ad3768..a4f3381c 100644 --- a/src/partialator.c +++ b/src/partialator.c @@ -34,6 +34,7 @@ #include "beam-parameters.h" #include "post-refinement.h" #include "hrs-scaling.h" +#include "reflist.h" /* Maximum number of iterations of NLSq to do for each image per macrocycle. */ @@ -84,9 +85,9 @@ static void refine_image(int mytask, void *tasks) struct image *image = pargs->image; double nominal_photon_energy = pargs->image->beam->photon_energy; struct hdfile *hdfile; - struct cpeak *spots; - int n, i; + int i; double dev, last_dev; + RefList *reflections; hdfile = hdfile_open(image->filename); if ( hdfile == NULL ) { @@ -110,16 +111,17 @@ static void refine_image(int mytask, void *tasks) a/1.0e-9, b/1.0e-9, c/1.0e-9, rad2deg(al), rad2deg(be), rad2deg(ga)); - spots = find_intersections(image, image->indexed_cell, &n, 0); + /* FIXME: Don't do this each time */ + reflections = find_intersections(image, image->indexed_cell, 0); dev = +INFINITY; i = 0; do { last_dev = dev; - dev = pr_iterate(image, pargs->i_full, pargs->sym, &spots, &n); + dev = pr_iterate(image, pargs->i_full, pargs->sym, reflections); STATUS("Iteration %2i: mean dev = %5.2f\n", i, dev); i++; } while ( (fabs(last_dev - dev) > 1.0) && (i < MAX_CYCLES) ); - mean_partial_dev(image, spots, n, pargs->sym, + mean_partial_dev(image, reflections, pargs->sym, pargs->i_full, pargs->graph); if ( pargs->pgraph ) { fprintf(pargs->pgraph, "%5i %5.2f\n", mytask, dev); @@ -128,7 +130,7 @@ static void refine_image(int mytask, void *tasks) free(image->data); if ( image->flags != NULL ) free(image->flags); hdfile_close(hdfile); - free(spots); + reflist_free(reflections); /* Muppet proofing */ image->data = NULL; @@ -163,22 +165,23 @@ static void refine_all(struct image *images, int n_total_patterns, } -static void uniquify(struct cpeak *spot, const char *sym) +static void uniquify(Reflection *refl, const char *sym) { + signed int h, k, l; signed int ha, ka, la; - get_asymm(spot->h, spot->k, spot->l, &ha, &ka, &la, sym); - spot->h = ha; - spot->k = ka; - spot->l = la; + get_indices(refl, &h, &k, &l); + get_asymm(h, k, l, &ha, &ka, &la, sym); + set_indices(refl, h, k, l); } +/* FIXME: Get rid of this */ static void integrate_image(struct image *image, ReflItemList *obs, const char *sym) { - struct cpeak *spots; - int j, n; + RefList *reflections; + Reflection *refl; struct hdfile *hdfile; double nominal_photon_energy = image->beam->photon_energy; @@ -199,42 +202,39 @@ static void integrate_image(struct image *image, ReflItemList *obs, } /* Figure out which spots should appear in this pattern */ - spots = find_intersections(image, image->indexed_cell, &n, 0); + reflections = find_intersections(image, image->indexed_cell, 0); /* For each reflection, estimate the partiality */ - for ( j=0; j<n; j++ ) { + for ( refl = first_refl(reflections); + refl != NULL; + refl = next_refl(refl) ) { signed int h, k, l; float i_partial; float xc, yc; + double x, y; - uniquify(&spots[j], sym); - - h = spots[j].h; - k = spots[j].k; - l = spots[j].l; + uniquify(refl, sym); + get_indices(refl, &h, &k, &l); /* Don't attempt to use spots with very small * partialities, since it won't be accurate. */ - if ( spots[j].p < 0.1 ) continue; + if ( get_partiality(refl) < 0.1 ) continue; - /* Actual measurement of this reflection from this - * pattern? */ - /* FIXME: Coordinates aren't whole numbers */ - if ( integrate_peak(image, spots[j].x, spots[j].y, + /* Actual measurement of this reflection from this pattern? */ + get_detector_pos(refl, &x, &y); + if ( integrate_peak(image, x, y, &xc, &yc, &i_partial, NULL, NULL, 1, 0) ) { - spots[j].valid = 0; + delete_refl(refl); continue; } - spots[j].intensity = i_partial; - spots[j].valid = 1; + set_int(refl, i_partial); if ( !find_item(obs, h, k, l) ) add_item(obs, h, k, l); } - image->cpeaks = spots; - image->n_cpeaks = n; + image->reflections = reflections; free(image->data); if ( image->flags != NULL ) free(image->flags); @@ -253,21 +253,20 @@ static void select_scalable_reflections(struct image *images, int n) for ( m=0; m<n; m++ ) { - int j; + Reflection *refl; - for ( j=0; j<images[m].n_cpeaks; j++ ) { + for ( refl = first_refl(images[m].reflections); + refl != NULL; + refl = next_refl(refl) ) { int scalable = 1; + double v; - if ( images[m].cpeaks[j].p < 0.1 ) scalable = 0; - if ( !images[m].cpeaks[j].valid ) { - scalable = 0; - } else { - double v = fabs(images[m].cpeaks[j].intensity); - if ( v < 0.1 ) scalable = 0; - } + if ( get_partiality(refl) < 0.1 ) scalable = 0; + v = fabs(get_intensity(refl)); + if ( v < 0.1 ) scalable = 0; - images[m].cpeaks[j].scalable = scalable; + set_scalable(refl, scalable); } @@ -525,7 +524,7 @@ int main(int argc, char *argv[]) /* Clean up */ for ( i=0; i<n_total_patterns; i++ ) { - free(images[i].cpeaks); + reflist_free(images[i].reflections); } free(I_full); delete_items(obs); diff --git a/src/pattern_sim.c b/src/pattern_sim.c index 4584bb3c..90425328 100644 --- a/src/pattern_sim.c +++ b/src/pattern_sim.c @@ -567,7 +567,7 @@ int main(int argc, char *argv[]) find_projected_peaks(&image, cell, 0, 0.1); output_intensities(&image, cell, NULL, 0, 0, stdout, 0, 0.1); - free(image.cpeaks); + reflist_free(image.reflections); } if ( powder_fn != NULL ) { diff --git a/src/peaks.c b/src/peaks.c index 88ac50bf..d1132a3a 100644 --- a/src/peaks.c +++ b/src/peaks.c @@ -32,9 +32,6 @@ #include "diffraction.h" -/* Maximum number of peaks which may be predicted by find_projected_peaks() */ -#define MAX_CPEAKS (8192) - /* How close a peak must be to an indexed position to be considered "close" * for the purposes of double hit detection and sanity checking. */ #define PEAK_CLOSE (30.0) @@ -483,12 +480,11 @@ int find_projected_peaks(struct image *image, UnitCell *cell, double ax, ay, az; double bx, by, bz; double cx, cy, cz; - struct cpeak *cpeaks; - int n_cpeaks = 0; + RefList *reflections; double alen, blen, clen; + int n_reflections = 0; - cpeaks = malloc(sizeof(struct cpeak)*MAX_CPEAKS); - if ( cpeaks == NULL ) return 0; + reflections = reflist_new(); /* "Borrow" direction values to get reciprocal lengths */ cell_get_reciprocal(cell, &ax, &ay, &az, &bx, &by, &bz, &cx, &cy, &cz); @@ -507,8 +503,8 @@ int find_projected_peaks(struct image *image, UnitCell *cell, signed int h, k, l; struct rvec q; double dist; - int found = 0; - int j; + Reflection *refl; + double cur_dist; q = get_q(image, x, y, 1, NULL, 1.0/image->lambda); @@ -535,44 +531,26 @@ int find_projected_peaks(struct image *image, UnitCell *cell, if ( dist > domain_r ) continue; } - for ( j=0; j<n_cpeaks; j++ ) { - if ( (cpeaks[j].h == h) && (cpeaks[j].k == k) - && (cpeaks[j].l == l) ) { - - if ( dist < cpeaks[j].min_distance ) { - cpeaks[j].min_distance = dist; - cpeaks[j].x = x; - cpeaks[j].y = y; - } - - found = 1; - - } - } - - if ( !found ) { - cpeaks[n_cpeaks].min_distance = dist; - cpeaks[n_cpeaks].x = x; - cpeaks[n_cpeaks].y = y; - cpeaks[n_cpeaks].h = h; - cpeaks[n_cpeaks].k = k; - cpeaks[n_cpeaks].l = l; - n_cpeaks++; - if ( n_cpeaks == MAX_CPEAKS ) { - ERROR("Unit cell is insanely large!\n"); - goto out; + refl = find_refl(reflections, h, k, l); + if ( refl != NULL ) { + cur_dist = get_excitation_error(refl); + if ( dist < cur_dist ) { + set_detector_pos(refl, dist, x, y); } + } else { + add_refl_with_det_pos(reflections, h, k, l, x, y, dist); + n_reflections++; } } } -out: - STATUS("Found %i reflections\n", n_cpeaks); - image->cpeaks = cpeaks; - image->n_cpeaks = n_cpeaks; + optimise_reflist(reflections); + + STATUS("Found %i reflections\n", n_reflections); + image->reflections = reflections; - return n_cpeaks; + return n_reflections; } @@ -685,20 +663,14 @@ void output_intensities(struct image *image, UnitCell *cell, int use_closer, FILE *ofh, int circular_domain, double domain_r) { - int i; - int n_found; - int n_indclose = 0; - int n_foundclose = 0; - int n_veto = 0; - int n_veto_second = 0; double asx, asy, asz; double bsx, bsy, bsz; double csx, csy, csz; + Reflection *refl; - if ( image->n_cpeaks == 0 ) { + if ( image->reflections == NULL ) { find_projected_peaks(image, cell, circular_domain, domain_r); } - if ( image->n_cpeaks == 0 ) return; /* Get exclusive access to the output stream if necessary */ if ( mutex != NULL ) pthread_mutex_lock(mutex); @@ -709,16 +681,20 @@ void output_intensities(struct image *image, UnitCell *cell, &bsx, &bsy, &bsz, &csx, &csy, &csz); - for ( i=0; i<image->n_cpeaks; i++ ) { + for ( refl = first_refl(image->reflections); + refl != NULL; + refl = next_refl(refl) ) { float x, y, intensity; double d; int idx; double bg, max; struct panel *p; + double px, py; + signed int h, k, l; - p = find_panel(image->det, image->cpeaks[i].x, - image->cpeaks[i].y); + get_detector_pos(refl, &px, &py); + p = find_panel(image->det, px, py); if ( p == NULL ) continue; if ( p->no_index ) continue; @@ -729,9 +705,7 @@ void output_intensities(struct image *image, UnitCell *cell, if ( image->features != NULL ) { f = image_feature_closest(image->features, - image->cpeaks[i].x, - image->cpeaks[i].y, - &d, &idx); + px, py, &d, &idx); } else { f = NULL; } @@ -754,7 +728,6 @@ void output_intensities(struct image *image, UnitCell *cell, * region. Integration of the same * peak included a bad region this time. */ - n_veto_second++; continue; } intensity = f->intensity; @@ -763,81 +736,36 @@ void output_intensities(struct image *image, UnitCell *cell, int r; - r = integrate_peak(image, - image->cpeaks[i].x, - image->cpeaks[i].y, - &x, &y, &intensity, &bg, &max, + r = integrate_peak(image, px, py, &x, &y, + &intensity, &bg, &max, polar, 1); if ( r ) { /* Plain old ordinary peak veto */ - n_veto++; continue; } } - if ( (f != NULL) && (d < PEAK_CLOSE) ) { - n_indclose++; - } - } else { int r; - r = integrate_peak(image, - image->cpeaks[i].x, - image->cpeaks[i].y, - &x, &y, &intensity, &bg, &max, polar, - 0); + r = integrate_peak(image, px, py, &x, &y, + &intensity, &bg, &max, polar, 0); if ( r ) { /* Plain old ordinary peak veto */ - n_veto++; continue; } } /* Write h,k,l, integrated intensity and centroid coordinates */ + get_indices(refl, &h, &k, &l); fprintf(ofh, "%3i %3i %3i %6f (at %5.2f,%5.2f) max=%6f bg=%6f\n", - image->cpeaks[i].h, image->cpeaks[i].k, image->cpeaks[i].l, - intensity, x, y, max, bg); - - image->cpeaks[i].x = x; - image->cpeaks[i].y = y; - - } - - n_found = image_feature_count(image->features); - for ( i=0; i<n_found; i++ ) { - - struct imagefeature *f; - int j; - - f = image_get_feature(image->features, i); - - if ( f == NULL ) continue; - - for ( j=0; j<image->n_cpeaks; j++ ) { - - double d; - - d = pow(image->cpeaks[j].x-f->x, 2.0) - + pow(image->cpeaks[j].y-f->y, 2.0); - - if ( d < PEAK_CLOSE ) n_foundclose++; - - } + h, l, l, intensity, x, y, max, bg); } - fprintf(ofh, "Peak statistics: %i peaks found by the peak search out of " - "%i were close to indexed positions. " - "%i indexed positions out of %i were close to detected peaks.\n", - n_foundclose, n_found, n_indclose, image->n_cpeaks); - fprintf(ofh, "%i integrations using indexed locations were aborted because " - "they hit one or more bad pixels.\n", n_veto); - fprintf(ofh, "%i integrations using peak search locations were aborted " - "because they hit one or more bad pixels.\n", n_veto_second); /* Blank line at end */ fprintf(ofh, "\n"); diff --git a/src/post-refinement.c b/src/post-refinement.c index b860bb42..25664e69 100644 --- a/src/post-refinement.c +++ b/src/post-refinement.c @@ -65,7 +65,7 @@ static double partiality_rgradient(double r, double profile_radius) /* Return the gradient of parameter 'k' given the current status of 'image'. */ -double gradient(struct image *image, int k, struct cpeak spot, double r) +double gradient(struct image *image, int k, Reflection *refl, double r) { double ds, tt, azi; double nom, den; @@ -74,24 +74,32 @@ double gradient(struct image *image, int k, struct cpeak spot, double r) double bsx, bsy, bsz; double csx, csy, csz; double xl, yl, zl; + signed int hi, ki, li; + double r1, r2, p; + int clamp_low, clamp_high; + + get_indices(refl, &hi, &ki, &li); cell_get_reciprocal(image->indexed_cell, &asx, &asy, &asz, &bsx, &bsy, &bsz, &csx, &csy, &csz); - xl = spot.h*asx + spot.k*bsx + spot.l*csx; - yl = spot.h*asy + spot.k*bsy + spot.l*csy; - zl = spot.h*asz + spot.k*bsz + spot.l*csz; + xl = hi*asx + ki*bsx + li*csx; + yl = hi*asy + ki*bsy + li*csy; + zl = hi*asz + ki*bsz + li*csz; + - ds = 2.0 * resolution(image->indexed_cell, spot.h, spot.k, spot.l); + ds = 2.0 * resolution(image->indexed_cell, hi, ki, li); tt = angle_between(0.0, 0.0, 1.0, xl, yl, zl+k); azi = angle_between(1.0, 0.0, 0.0, xl, yl, 0.0); + get_partial(refl, &r1, &r2, &p, &clamp_low, &clamp_high); + /* Calculate the gradient of partiality wrt excitation error. */ - if ( spot.clamp1 == 0 ) { - g += partiality_gradient(spot.r1, r); + if ( clamp_low == 0 ) { + g += partiality_gradient(r1, r); } - if ( spot.clamp2 == 0 ) { - g += partiality_gradient(spot.r2, r); + if ( clamp_high == 0 ) { + g += partiality_gradient(r2, r); } /* For many gradients, just multiply the above number by the gradient @@ -99,7 +107,7 @@ double gradient(struct image *image, int k, struct cpeak spot, double r) switch ( k ) { case REF_SCALE : - return -spot.p*pow(image->osf, -2.0); + return -p*pow(image->osf, -2.0); case REF_DIV : nom = sqrt(2.0) * ds * sin(image->div/2.0); @@ -107,33 +115,33 @@ double gradient(struct image *image, int k, struct cpeak spot, double r) return (nom/den) * g; case REF_R : - if ( spot.clamp1 == 0 ) { - g += partiality_rgradient(spot.r1, r); + if ( clamp_low == 0 ) { + g += partiality_rgradient(r1, r); } - if ( spot.clamp2 == 0 ) { - g += partiality_rgradient(spot.r2, r); + if ( clamp_high == 0 ) { + g += partiality_rgradient(r2, r); } return g; /* Cell parameters and orientation */ case REF_ASX : - return spot.h * pow(sin(tt), -1.0) * cos(azi) * g; + return hi * pow(sin(tt), -1.0) * cos(azi) * g; case REF_BSX : - return spot.k * pow(sin(tt), -1.0) * cos(azi) * g; + return ki * pow(sin(tt), -1.0) * cos(azi) * g; case REF_CSX : - return spot.l * pow(sin(tt), -1.0) * cos(azi) * g; + return li * pow(sin(tt), -1.0) * cos(azi) * g; case REF_ASY : - return spot.h * pow(sin(tt), -1.0) * sin(azi) * g; + return hi * pow(sin(tt), -1.0) * sin(azi) * g; case REF_BSY : - return spot.k * pow(sin(tt), -1.0) * sin(azi) * g; + return ki * pow(sin(tt), -1.0) * sin(azi) * g; case REF_CSY : - return spot.l * pow(sin(tt), -1.0) * sin(azi) * g; + return li * pow(sin(tt), -1.0) * sin(azi) * g; case REF_ASZ : - return spot.h * pow(cos(tt), -1.0) * g; + return hi * pow(cos(tt), -1.0) * g; case REF_BSZ : - return spot.k * pow(cos(tt), -1.0) * g; + return ki * pow(cos(tt), -1.0) * g; case REF_CSZ : - return spot.l * pow(cos(tt), -1.0) * g; + return li * pow(cos(tt), -1.0) * g; } @@ -218,31 +226,34 @@ void apply_shift(struct image *image, int k, double shift) } -double mean_partial_dev(struct image *image, struct cpeak *spots, int n, +double mean_partial_dev(struct image *image, RefList *reflections, const char *sym, double *i_full, FILE *graph) { - int h, n_used; + int n_used; double delta_I = 0.0; + Reflection *refl; n_used = 0; - for ( h=0; h<n; h++ ) { + for ( refl = first_refl(reflections); + refl != NULL; + refl = next_refl(refl) ) { signed int hind, kind, lind; signed int ha, ka, la; double I_full; float I_partial; float xc, yc; + double x, y; + double p; - hind = spots[h].h; - kind = spots[h].k; - lind = spots[h].l; + get_indices(refl, &hind, &kind, &lind); - if ( !spots[h].scalable ) continue; + if ( !get_scalable(refl) ) continue; - /* Actual measurement of this reflection from this - * pattern? */ - /* FIXME: Coordinates aren't whole numbers */ - if ( integrate_peak(image, spots[h].x, spots[h].y, + /* Actual measurement of this reflection from this pattern? */ + get_detector_pos(refl, &x, &y); + /* FIXME: Get rid of this */ + if ( integrate_peak(image, x, y, &xc, &yc, &I_partial, NULL, NULL, 1, 0) ) { continue; @@ -250,14 +261,15 @@ double mean_partial_dev(struct image *image, struct cpeak *spots, int n, get_asymm(hind, kind, lind, &ha, &ka, &la, sym); I_full = lookup_intensity(i_full, ha, ka, la); - delta_I += fabs(I_partial - (spots[h].p * I_full / image->osf)); + p = get_partiality(refl); + delta_I += fabs(I_partial - (p * I_full / image->osf)); n_used++; if ( graph != NULL ) { fprintf(graph, "%3i %3i %3i %5.2f (at %5.2f,%5.2f)" " %5.2f %5.2f\n", - hind, kind, lind, I_partial/spots[h].p, xc, yc, - spots[h].p, I_partial / I_full); + hind, kind, lind, I_partial/p, xc, yc, + p, I_partial / I_full); } } @@ -268,19 +280,21 @@ double mean_partial_dev(struct image *image, struct cpeak *spots, int n, /* Perform one cycle of post refinement on 'image' against 'i_full' */ double pr_iterate(struct image *image, double *i_full, const char *sym, - struct cpeak **pspots, int *n) + RefList *reflections) { gsl_matrix *M; gsl_vector *v; gsl_vector *shifts; - int h, param; - struct cpeak *spots = *pspots; + int param; + Reflection *refl; M = gsl_matrix_calloc(NUM_PARAMS, NUM_PARAMS); v = gsl_vector_calloc(NUM_PARAMS); /* Construct the equations, one per reflection in this image */ - for ( h=0; h<*n; h++ ) { + for ( refl = first_refl(reflections); + refl != NULL; + refl = next_refl(refl) ) { signed int hind, kind, lind; signed int ha, ka, la; @@ -288,17 +302,17 @@ double pr_iterate(struct image *image, double *i_full, const char *sym, float I_partial; float xc, yc; int k; + double x, y; + double p; - hind = spots[h].h; - kind = spots[h].k; - lind = spots[h].l; + get_indices(refl, &hind, &kind, &lind); - if ( !spots[h].scalable ) continue; + if ( !get_scalable(refl) ) continue; - /* Actual measurement of this reflection from this - * pattern? */ - /* FIXME: Coordinates aren't whole numbers */ - if ( integrate_peak(image, spots[h].x, spots[h].y, + /* Actual measurement of this reflection from this pattern? */ + get_detector_pos(refl, &x, &y); + /* FIXME: Get rid of this */ + if ( integrate_peak(image, x, y, &xc, &yc, &I_partial, NULL, NULL, 1, 0) ) { continue; @@ -306,7 +320,8 @@ double pr_iterate(struct image *image, double *i_full, const char *sym, get_asymm(hind, kind, lind, &ha, &ka, &la, sym); I_full = lookup_intensity(i_full, ha, ka, la); - delta_I = I_partial - (spots[h].p * I_full / image->osf); + p = get_partiality(refl); + delta_I = I_partial - (p * I_full / image->osf); for ( k=0; k<NUM_PARAMS; k++ ) { @@ -319,9 +334,9 @@ double pr_iterate(struct image *image, double *i_full, const char *sym, M_curr = gsl_matrix_get(M, g, k); - M_c = gradient(image, g, spots[h], + M_c = gradient(image, g, refl, image->profile_radius) - * gradient(image, k, spots[h], + * gradient(image, k, refl, image->profile_radius); M_c *= pow(I_full, 2.0); @@ -329,8 +344,7 @@ double pr_iterate(struct image *image, double *i_full, const char *sym, } - gr = gradient(image, k, spots[h], - image->profile_radius); + gr = gradient(image, k, refl, image->profile_radius); v_c = delta_I * I_full * gr; gsl_vector_set(v, k, v_c); @@ -350,8 +364,5 @@ double pr_iterate(struct image *image, double *i_full, const char *sym, gsl_vector_free(v); gsl_vector_free(shifts); - free(spots); - spots = find_intersections(image, image->indexed_cell, n, 0); - *pspots = spots; - return mean_partial_dev(image, spots, *n, sym, i_full, NULL); + return mean_partial_dev(image, reflections, sym, i_full, NULL); } diff --git a/src/post-refinement.h b/src/post-refinement.h index 983ecc28..b3c6c074 100644 --- a/src/post-refinement.h +++ b/src/post-refinement.h @@ -21,6 +21,7 @@ #include <stdio.h> #include "image.h" +#include "reflist.h" /* Refineable parameters */ @@ -44,12 +45,12 @@ enum { void apply_shift(struct image *image, int k, double shift); -double mean_partial_dev(struct image *image, struct cpeak *spots, int n, +double mean_partial_dev(struct image *image, RefList *reflections, const char *sym, double *i_full, FILE *graph); double pr_iterate(struct image *image, double *i_full, const char *sym, - struct cpeak **pspots, int *n); + RefList *reflections); #endif /* POST_REFINEMENT_H */ diff --git a/src/reflist.c b/src/reflist.c new file mode 100644 index 00000000..990bc535 --- /dev/null +++ b/src/reflist.c @@ -0,0 +1,139 @@ +/* + * reflist.c + * + * Fast reflection/peak list + * + * (c) 2011 Thomas White <taw@physics.org> + * + * Part of CrystFEL - crystallography with a FEL + * + */ + + +#include <stdlib.h> + +#include "reflist.h" + + +struct _reflection { + + unsigned int serial; /* Serial number */ + + signed int h; + signed int k; + signed int l; + + double excitation_error; + + /* Partiality */ + double r1; /* First excitation error */ + double r2; /* Second excitation error */ + double p; /* Partiality */ + int clamp1; /* Clamp status for r1 */ + int clamp2; /* Clamp status for r2 */ + + /* Location in image */ + int x; + int y; + + int scalable; + + /* Intensity */ + double intensity; + + +}; + + +struct _reflist { + + struct ref *head; + +}; + + +/**************************** Creation / deletion *****************************/ + +/* Create a reflection list */ +RefList *reflist_new() +{ + RefList *new; + + new = malloc(sizeof(struct _reflist)); + + return new; +} + + +void reflist_free(RefList *list) +{ +} + + +/********************************** Search ************************************/ + +Reflection *find_refl(RefList *list, INDICES) +{ +} + + +/********************************** Getters ***********************************/ + +double get_excitation_error(Reflection *refl) +{ +} + + +void get_detector_pos(Reflection *refl, double *x, double *y) +{ +} + + +void get_indices(Reflection *refl, signed int *h, signed int *k, signed int *l) +{ +} + + +/********************************** Setters ***********************************/ + +void set_detector_pos(Reflection *refl, double exerr, double x, double y) +{ +} + + +void set_partial(Reflection *refl, double r1, double r2, double p, + double clamp_low, double clamp_high) +{ +} + + +/********************************* Insertion **********************************/ + +Reflection *add_refl(RefList *list, INDICES) +{ +} + + +Reflection *add_refl_with_det_pos(RefList *refl, INDICES, double exerr, + double x, double y) +{ +} + + +/********************************* Iteration **********************************/ + +Reflection *first_refl(RefList *list) +{ +} + + +Reflection *next_refl(Reflection *refl) +{ +} + + +/*********************************** Voodoo ***********************************/ + +void optimise_reflist(RefList *list) +{ +} diff --git a/src/reflist.h b/src/reflist.h new file mode 100644 index 00000000..0ba09a3b --- /dev/null +++ b/src/reflist.h @@ -0,0 +1,69 @@ +/* + * reflist.h + * + * Fast reflection/peak list + * + * (c) 2011 Thomas White <taw@physics.org> + * + * Part of CrystFEL - crystallography with a FEL + * + */ + +#ifndef REFLIST_H +#define REFLIST_H + +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + + +typedef struct _reflist RefList; +typedef struct _reflection Reflection; + +#define INDICES signed int h, signed int k, signed int l + +/* Creation/deletion */ +extern RefList *reflist_new(void); +extern void reflist_free(RefList *list); + +/* Search */ +extern Reflection *find_refl(RefList *list, INDICES); + +/* Get */ +extern double get_excitation_error(Reflection *refl); +extern void get_detector_pos(Reflection *refl, double *x, double *y); +extern void get_indices(Reflection *refl, + signed int *h, signed int *k, signed int *l); +extern double get_partiality(Reflection *refl); +extern double get_intensity(Reflection *refl); +extern void get_partial(Reflection *refl, double *r1, double *r2, double *p, + int *clamp_low, int *clamp_high); +extern int get_scalable(Reflection *refl); + +/* Set */ +extern void set_detector_pos(Reflection *refl, double exerr, + double x, double y); +extern void set_partial(Reflection *refl, double r1, double r2, double p, + double clamp_low, double clamp_high); +extern void set_indices(Reflection *refl, + signed int h, signed int k, signed int l); +extern void set_int(Reflection *refl, double intensity); +extern void set_scalable(Reflection *refl, int scalable); + +/* Insertion */ +extern Reflection *add_refl(RefList *list, INDICES); +extern Reflection *add_refl_with_det_pos(RefList *list, INDICES, double exerr, + double x, double y); + + +/* Deletion */ +extern void delete_refl(Reflection *refl); + +/* Iteration */ +extern Reflection *first_refl(RefList *list); +extern Reflection *next_refl(Reflection *refl); + +/* Voodoo */ +extern void optimise_reflist(RefList *list); + +#endif /* REFLIST_H */ diff --git a/src/reintegrate.c b/src/reintegrate.c index 9d882d4b..09634cd7 100644 --- a/src/reintegrate.c +++ b/src/reintegrate.c @@ -110,8 +110,7 @@ static void process_image(void *pg, int cookie) image.flags = NULL; image.indexed_cell = NULL; image.filename = apargs->filename; - image.cpeaks = NULL; - image.n_cpeaks = 0; + image.reflections = NULL; image.det = pargs->det; STATUS("Processing '%s'\n", apargs->filename); diff --git a/src/templates.c b/src/templates.c index 4bd85a76..9abbcb17 100644 --- a/src/templates.c +++ b/src/templates.c @@ -21,6 +21,7 @@ #include "geometry.h" #include "hdf5-file.h" #include "peaks.h" +#include "reflist.h" #include <assert.h> @@ -42,8 +43,7 @@ struct _indexingprivate_template struct template { double omega; double phi; - int n; - struct cpeak *spots; + RefList *spots; }; @@ -164,24 +164,22 @@ IndexingPrivate *generate_templates(UnitCell *cell, const char *filename, for ( omega = 0.0; omega < omega_max-omega_step; omega += omega_step ) { for ( phi = 0.0; phi < phi_max-phi_step; phi += phi_step ) { - int n; - struct cpeak *cpeaks; + RefList *reflections; UnitCell *cell_rot; assert(i < n_templates); cell_rot = rotate_cell(cell, omega, phi, 0.0); - cpeaks = find_intersections(&image, cell_rot, &n, 0); - if ( cpeaks == NULL ) { + reflections = find_intersections(&image, cell_rot, 0); + if ( reflections == NULL ) { ERROR("Template calculation failed.\n"); return NULL; } priv->templates[i].omega = omega; priv->templates[i].phi = phi; - priv->templates[i].n = n; - priv->templates[i].spots = cpeaks; + priv->templates[i].spots = reflections; i++; free(cell_rot); @@ -227,23 +225,28 @@ static int fast_integrate_peak(struct image *image, int xp, int yp) } -static double integrate_all_rot(struct image *image, struct cpeak *cpeaks, - int n, double rot) +static double integrate_all_rot(struct image *image, RefList *reflections, + double rot) { double itot = 0.0; - int i; double cosr, sinr; int num_int = 0; + Reflection *refl; cosr = cos(rot); sinr = sin(rot); - for ( i=0; i<n; i++ ) { + for ( refl = first_refl(reflections); + refl != NULL; + refl = next_refl(refl) ) { float xp, yp; + double x, y; + + get_detector_pos(refl, &x, &y); - xp = cosr*cpeaks[i].x + sinr*cpeaks[i].y; - yp = -sinr*cpeaks[i].x + cosr*cpeaks[i].y; + xp = cosr*x + sinr*y; + yp = -sinr*x + cosr*y; itot += fast_integrate_peak(image, rint(xp), rint(yp)); num_int++; @@ -256,26 +259,31 @@ static double integrate_all_rot(struct image *image, struct cpeak *cpeaks, /* Return the mean of the distances between peaks in the image and peaks from * the given template. */ -static double mean_distance(struct image *image, struct cpeak *cpeaks, - int n, double rot) +static double mean_distance(struct image *image, RefList *reflections, + double rot) { double dtot = 0.0; - int i; double cosr, sinr; int num_dist = 0; + Reflection *refl; cosr = cos(rot); sinr = sin(rot); /* For each template peak */ - for ( i=0; i<n; i++ ) { + for ( refl = first_refl(reflections); + refl != NULL; + refl = next_refl(refl) ) { float xp, yp; int j; double min_dsq; + double x, y; + + get_detector_pos(refl, &x, &y); - xp = cosr*cpeaks[i].x + sinr*cpeaks[i].y; - yp = -sinr*cpeaks[i].x + cosr*cpeaks[i].y; + xp = cosr*x + sinr*y; + yp = -sinr*x + cosr*y; /* Compare to every real peak */ min_dsq = +INFINITY; @@ -328,11 +336,11 @@ void match_templates(struct image *image, IndexingPrivate *ipriv) if ( !peaks ) { val = integrate_all_rot(image, priv->templates[i].spots, - priv->templates[i].n, rot); + rot); best = val > max; } else { val = mean_distance(image, priv->templates[i].spots, - priv->templates[i].n, rot); + rot); best = val < max; } |