From 7e874c2629b8e4aa8c388d72566d6ca00673da77 Mon Sep 17 00:00:00 2001 From: Thomas White Date: Sat, 1 Jun 2013 19:01:52 -0700 Subject: Rigid group stuff --- libcrystfel/src/detector.c | 99 ++++++++++++++++++++++++++----------------- libcrystfel/src/detector.h | 15 +++++-- libcrystfel/src/integration.c | 9 ++++ libcrystfel/src/reax.c | 12 +++--- 4 files changed, 88 insertions(+), 47 deletions(-) diff --git a/libcrystfel/src/detector.c b/libcrystfel/src/detector.c index f7ff135e..a30d3ccf 100644 --- a/libcrystfel/src/detector.c +++ b/libcrystfel/src/detector.c @@ -480,11 +480,12 @@ static struct panel *new_panel(struct detector *det, const char *name) new = &det->panels[det->n_panels-1]; memcpy(new, &det->defaults, sizeof(struct panel)); + strcpy(new->name, name); + /* Create a new copy of the camera length location if needed */ if ( new->clen_from != NULL ) { new->clen_from = strdup(new->clen_from); } - strcpy(new->name, name); return new; } @@ -537,32 +538,68 @@ static struct badregion *find_bad_region_by_name(struct detector *det, } -static char *find_or_add_rg(struct detector *det, const char *name) +static struct rigid_group *find_or_add_rg(struct detector *det, + const char *name) { int i; - char **new; - char *tmp; + struct rigid_group **new; + struct rigid_group *rg; - for ( i=0; inum_rigid_groups; i++ ) { + for ( i=0; in_rigid_groups; i++ ) { - if ( strcmp(det->rigid_groups[i], name) == 0 ) { + if ( strcmp(det->rigid_groups[i]->name, name) == 0 ) { return det->rigid_groups[i]; } } new = realloc(det->rigid_groups, - (1+det->num_rigid_groups)*sizeof(char *)); + (1+det->n_rigid_groups)*sizeof(struct rigid_group *)); if ( new == NULL ) return NULL; det->rigid_groups = new; - tmp = strdup(name); - det->rigid_groups[det->num_rigid_groups] = tmp; + rg = malloc(sizeof(struct rigid_group)); + if ( rg == NULL ) return NULL; - det->num_rigid_groups++; + det->rigid_groups[det->n_rigid_groups++] = rg; - return tmp; + rg->name = strdup(name); + rg->panels = NULL; + rg->n_panels = 0; + + return rg; +} + + +static void add_to_rigid_group(struct rigid_group *rg, struct panel *p) +{ + struct panel **pn; + + pn = realloc(rg->panels, (1+rg->n_panels)*sizeof(struct panel *)); + if ( pn == NULL ) { + ERROR("Couldn't add panel to rigid group.\n"); + return; + } + + assert(p->rigid_group == rg); + rg->panels = pn; + rg->panels[rg->n_panels++] = p; +} + + +static void fix_up_rigid_groups(struct detector *det) +{ + int i; + + for ( i=0; in_panels; i++ ) { + + struct panel *p = &det->panels[i]; + if ( p->rigid_group != NULL ) { + add_to_rigid_group(p->rigid_group, p); + } + + } } @@ -775,7 +812,7 @@ struct detector *get_detector_geometry(const char *filename) det->mask_good = 0; det->mask_bad = 0; det->mask = NULL; - det->num_rigid_groups = 0; + det->n_rigid_groups = 0; det->rigid_groups = NULL; /* The default defaults... */ @@ -1012,6 +1049,10 @@ out: } + /* Fix up rigid group panel pointers now that the panels and RGs have + * stopped being realloc()ed */ + fix_up_rigid_groups(det); + find_min_max_d(det); if ( reject ) return NULL; @@ -1026,9 +1067,6 @@ void free_detector_geometry(struct detector *det) { int i; - for ( i=0; inum_rigid_groups; i++ ) { - free(det->rigid_groups[i]); - } free(det->rigid_groups); for ( i=0; in_panels; i++ ) { @@ -1062,18 +1100,6 @@ struct detector *copy_geom(const struct detector *in) out->bad = malloc(out->n_bad * sizeof(struct badregion)); memcpy(out->bad, in->bad, out->n_bad * sizeof(struct badregion)); - if ( in->rigid_groups != NULL ) { - - out->rigid_groups = malloc(out->num_rigid_groups*sizeof(char *)); - memcpy(out->rigid_groups, in->rigid_groups, - out->num_rigid_groups*sizeof(char *)); - - for ( i=0; inum_rigid_groups; i++ ) { - out->rigid_groups[i] = strdup(in->rigid_groups[i]); - } - - } - for ( i=0; in_panels; i++ ) { struct panel *p; @@ -1088,22 +1114,19 @@ struct detector *copy_geom(const struct detector *in) } - for ( i=0; inum_rigid_groups; i++ ) { + for ( i=0; in_panels; i++ ) { - int j; - char *rg = in->rigid_groups[i]; - char *rgn = out->rigid_groups[i]; + struct rigid_group *rg; - for ( j=0; jn_panels; j++ ) { + rg = in->panels[i].rigid_group; + if ( rg == NULL ) continue; - if ( in->panels[j].rigid_group == rg ) { - out->panels[j].rigid_group = rgn; - } - - } + out->panels[i].rigid_group = find_or_add_rg(out, rg->name); } + fix_up_rigid_groups(out); + return out; } @@ -1303,7 +1326,7 @@ int write_detector_geometry(const char *filename, struct detector *det) if ( p->rigid_group != NULL ) { fprintf(fh, "%s/rigid_group = %s\n", - p->name, p->rigid_group); + p->name, p->rigid_group->name); } } diff --git a/libcrystfel/src/detector.h b/libcrystfel/src/detector.h index 0f9be817..b6a90fbf 100644 --- a/libcrystfel/src/detector.h +++ b/libcrystfel/src/detector.h @@ -46,6 +46,15 @@ struct hdfile; extern "C" { #endif + +struct rigid_group +{ + char *name; + struct panel **panels; + int n_panels; +}; + + struct panel { char name[1024]; /* Name for this panel */ @@ -62,7 +71,7 @@ struct panel double res; /* Resolution in pixels per metre */ char badrow; /* 'x' or 'y' */ int no_index; /* Don't index peaks in this panel if non-zero */ - char *rigid_group; /* Rigid group name */ + struct rigid_group *rigid_group; /* Rigid group */ double adu_per_eV; /* Number of ADU per eV */ double max_adu; /* Treat pixel as unreliable if higher than this */ @@ -106,8 +115,8 @@ struct detector unsigned int mask_bad; unsigned int mask_good; - char **rigid_groups; - int num_rigid_groups; + struct rigid_group **rigid_groups; + int n_rigid_groups; /* Location of the pixel furthest away from the beam position, which * will have the largest value of 2theta regardless of camera length diff --git a/libcrystfel/src/integration.c b/libcrystfel/src/integration.c index 967ffb9c..1a2c0585 100644 --- a/libcrystfel/src/integration.c +++ b/libcrystfel/src/integration.c @@ -1095,6 +1095,11 @@ static int suitable_reference(struct intcontext *ic, struct peak_box *bx) } +static void refine_rigid_groups(struct intcontext *ic) +{ +} + + static void measure_all_intensities(IntegrationMethod meth, RefList *list, struct image *image, UnitCell *cell, double ir_inn, double ir_mid, double ir_out) @@ -1245,6 +1250,8 @@ static void measure_all_intensities(IntegrationMethod meth, RefList *list, } } + refine_rigid_groups(&ic); + free_intcontext(&ic); image->num_saturated_peaks = n_saturated; @@ -1646,6 +1653,8 @@ static void integrate_rings(IntegrationMethod meth, Crystal *cr, } + refine_rigid_groups(&ic); + free_intcontext(&ic); crystal_set_num_saturated_reflections(cr, n_saturated); diff --git a/libcrystfel/src/reax.c b/libcrystfel/src/reax.c index 2a599b40..cfc86ba4 100644 --- a/libcrystfel/src/reax.c +++ b/libcrystfel/src/reax.c @@ -128,7 +128,7 @@ struct reax_private static void fill_and_transform(struct dvec *dir, ImageFeatureList *flist, int nel, double pmax, double *fft_in, fftw_complex *fft_out, fftw_plan plan, - const char *rg, struct detector *det) + const struct rigid_group *rg, struct detector *det) { int n, i; @@ -191,7 +191,7 @@ static double check_dir(struct dvec *dir, ImageFeatureList *flist, int nel, double pmax, double *fft_in, fftw_complex *fft_out, fftw_plan plan, struct reax_search *s, - const char *rg, struct detector *det) + const struct rigid_group *rg, struct detector *det) { int i; double tot; @@ -553,7 +553,7 @@ static struct reax_search *search_all_axes(UnitCell *cell, double pmax) static double get_model_phase(double x, double y, double z, ImageFeatureList *f, int nel, double pmax, double *fft_in, fftw_complex *fft_out, fftw_plan plan, - int smin, int smax, const char *rg, + int smin, int smax, const struct rigid_group *rg, struct detector *det) { struct dvec dir; @@ -589,7 +589,7 @@ static double get_model_phase(double x, double y, double z, ImageFeatureList *f, static void refine_rigid_group(struct image *image, UnitCell *cell, - const char *rg, double pmax, + const struct rigid_group *rg, double pmax, double *fft_in, fftw_complex *fft_out, fftw_plan plan, int smin, int smax, struct detector *det, struct reax_private *pr) @@ -716,8 +716,8 @@ static UNUSED void refine_all_rigid_groups(struct image *image, UnitCell *cell, { int i; - for ( i=0; idet->num_rigid_groups; i++ ) { - refine_rigid_group(image, cell, image->det->rigid_groups[i], + for ( i=0; idet->n_rigid_groups; i++ ) { + refine_rigid_group(image, cell, &image->det->rigid_groups[i], pmax, fft_in, fft_out, plan, smin, smax, det, p); } -- cgit v1.2.3