From 345ee980a092a50470e5cf1f5ea7a916c3c9e487 Mon Sep 17 00:00:00 2001 From: Thomas White Date: Thu, 18 Nov 2010 16:33:23 +0100 Subject: facetron: Refine scaling factor, plot partiality correlation --- src/facetron.c | 57 +++++++++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 45 insertions(+), 12 deletions(-) (limited to 'src/facetron.c') diff --git a/src/facetron.c b/src/facetron.c index c427e0ff..73629eed 100644 --- a/src/facetron.c +++ b/src/facetron.c @@ -37,6 +37,9 @@ #include "beam-parameters.h" +/* Number of iterations of NLSq to do for each image per macrocycle. */ +#define NUM_CYCLES (1) + /* Refineable parameters */ enum { REF_SCALE, @@ -75,6 +78,7 @@ struct refine_args ReflItemList *obs; double *i_full; struct image *image; + FILE *graph; }; @@ -112,10 +116,10 @@ static void apply_shift(struct image *image, int k, double shift) static double mean_partial_dev(struct image *image, struct cpeak *spots, int n, - const char *sym, double *i_full) + const char *sym, double *i_full, FILE *graph) { int h; - double delta_I; + double delta_I = 0.0; for ( h=0; hosf; 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; + if ( graph != NULL ) { + fprintf(graph, "%3i %3i %3i %5.2f %5.2f\n", + hind, kind, lind, + spots[h].p, I_partial / I_full); + } + } return delta_I / (double)n; @@ -157,7 +168,7 @@ static double iterate(struct image *image, double *i_full, const char *sym, gsl_matrix *M; gsl_vector *v; gsl_vector *shifts; - int h, shift; + int h, param; M = gsl_matrix_alloc(NUM_PARAMS, NUM_PARAMS); v = gsl_vector_alloc(NUM_PARAMS); @@ -187,6 +198,7 @@ static double iterate(struct image *image, double *i_full, const char *sym, &xc, &yc, &I_partial, NULL, NULL, 1, 1) ) { continue; } + I_partial *= image->osf; get_asymm(hind, kind, lind, &ha, &ka, &la, sym); I_full = lookup_intensity(i_full, ha, ka, la); @@ -221,13 +233,16 @@ static double iterate(struct image *image, double *i_full, const char *sym, shifts = gsl_vector_alloc(NUM_PARAMS); gsl_linalg_HH_solve(M, v, shifts); - for ( shift=0; shiftosf); free(spots); spots = find_intersections(image, image->indexed_cell, &n, 0); - return mean_partial_dev(image, spots, n, sym, i_full); + return mean_partial_dev(image, spots, n, sym, i_full, NULL); } @@ -239,7 +254,7 @@ static void refine_image(int mytask, void *tasks) double nominal_photon_energy = pargs->image->beam->photon_energy; struct hdfile *hdfile; struct cpeak *spots; - int n; + int n, i; double dev; hdfile = hdfile_open(image->filename); @@ -259,8 +274,12 @@ static void refine_image(int mytask, void *tasks) } spots = find_intersections(image, image->indexed_cell, &n, 0); - dev = iterate(image, pargs->i_full, pargs->sym, spots, n); - STATUS("Iteration %2i: mean dev = %5.2f\n", 0, dev); + for ( i=0; ii_full, pargs->sym, spots, n); + STATUS("Iteration %2i: mean dev = %5.2f\n", i, dev); + } + mean_partial_dev(image, spots, n, pargs->sym, + pargs->i_full, pargs->graph); free(image->data); if ( image->flags != NULL ) free(image->flags); @@ -310,7 +329,7 @@ static void integrate_image(int mytask, void *tasks) } /* Figure out which spots should appear in this pattern */ - spots = find_intersections(image, image->indexed_cell, &n, 1); + spots = find_intersections(image, image->indexed_cell, &n, 0); /* For each reflection, estimate the partiality */ for ( j=0; josf; i_full_est = i_partial / spots[j].p; @@ -364,7 +384,8 @@ static void integrate_image(int mytask, void *tasks) static void refine_all(struct image *images, int n_total_patterns, struct detector *det, const char *sym, - ReflItemList *obs, double *i_full, int nthreads) + ReflItemList *obs, double *i_full, int nthreads, + FILE *graph) { struct refine_args *tasks; int i; @@ -376,6 +397,7 @@ static void refine_all(struct image *images, int n_total_patterns, tasks[i].obs = obs; tasks[i].i_full = i_full; tasks[i].image = &images[i]; + tasks[i].graph = graph; } @@ -633,16 +655,27 @@ int main(int argc, char *argv[]) /* Iterate */ for ( i=0; i