aboutsummaryrefslogtreecommitdiff
path: root/libcrystfel/src/datatemplate.c
diff options
context:
space:
mode:
Diffstat (limited to 'libcrystfel/src/datatemplate.c')
-rw-r--r--libcrystfel/src/datatemplate.c128
1 files changed, 73 insertions, 55 deletions
diff --git a/libcrystfel/src/datatemplate.c b/libcrystfel/src/datatemplate.c
index df0ad343..a7b8950f 100644
--- a/libcrystfel/src/datatemplate.c
+++ b/libcrystfel/src/datatemplate.c
@@ -90,21 +90,13 @@ static struct panel_group_template *add_group(const char *name, DataTemplate *dt
}
-static int parse_group(const char *name, DataTemplate *dt, const char *val)
+static int add_group_members(const char *name, DataTemplate *dt,
+ char **members, int n_members)
{
struct panel_group_template *gt;
- int n_members;
- char **members;
int i;
int fail = 0;
- gt = add_group(name, dt);
- if ( gt == NULL ) {
- ERROR("Failed to add group\n");
- return 1;
- }
-
- n_members = assplode(val, ",", &members, ASSPLODE_NONE);
if ( n_members == 0 ) {
ERROR("Panel group '%s' has no members\n", name);
fail = 1;
@@ -113,33 +105,58 @@ static int parse_group(const char *name, DataTemplate *dt, const char *val)
if ( n_members > MAX_PANEL_GROUP_CHILDREN ) {
ERROR("Panel group '%s' has too many members\n", name);
fail = 1;
- } else {
+ }
- /* A simple typo in the geometry file can segfault other
- * stuff, so check */
- for ( i=0; i<n_members; i++ ) {
- int j;
- for ( j=0; j<i; j++ ) {
- if ( strcmp(members[i], members[j]) == 0 ) {
- ERROR("Duplicate member '%s' in group '%s'\n",
- members[i], name);
- fail = 1;
- }
- }
- }
- for ( i=0; i<n_members; i++ ) {
- gt->children[i] = find_group(dt, members[i]);
- if ( gt->children[i] == NULL ) {
- ERROR("Unknown panel group '%s'\n", members[i]);
+ /* A simple typo in the geometry file can segfault other
+ * stuff, so check */
+ for ( i=0; i<n_members; i++ ) {
+ int j;
+ for ( j=0; j<i; j++ ) {
+ if ( strcmp(members[i], members[j]) == 0 ) {
+ ERROR("Duplicate member '%s' in group '%s'\n",
+ members[i], name);
fail = 1;
}
}
+ }
+
+ if ( fail ) return fail;
- gt->n_children = n_members;
+ gt = add_group(name, dt);
+ if ( gt == NULL ) {
+ ERROR("Failed to add group\n");
+ return 1;
+ }
+ for ( i=0; i<n_members; i++ ) {
+ gt->children[i] = find_group(dt, members[i]);
+ if ( gt->children[i] == NULL ) {
+ ERROR("Unknown panel group '%s'\n", members[i]);
+ ERROR("Make sure the hierarchy groups definitions are AFTER the "
+ "panel definitions in the geometry file, and start from "
+ "the lowest hierachy level.\n");
+ fail = 1;
+ }
}
+ gt->n_children = n_members;
+
+ return fail;
+}
+
+
+static int parse_group(const char *name, DataTemplate *dt, const char *val)
+{
+ int n_members;
+ char **members;
+ int i;
+ int fail = 0;
+
+ n_members = assplode(val, ",", &members, ASSPLODE_NONE);
+
+ fail = add_group_members(name, dt, members, n_members);
+
for ( i=0; i<n_members; i++ ) cffree(members[i]);
cffree(members);
@@ -147,7 +164,6 @@ static int parse_group(const char *name, DataTemplate *dt, const char *val)
}
-
static struct panel_template *new_panel(DataTemplate *det,
const char *name,
struct panel_template *defaults)
@@ -575,7 +591,6 @@ static int parse_field_for_panel(struct panel_template *panel, const char *key,
} else if ( strcmp(key, "coffset") == 0) {
panel->cnz_offset = atof(val);
- panel->cnz_offset_default = def;
} else if ( strcmp(key, "res") == 0 ) {
panel->pixel_pitch = 1.0/atof(val);
panel->pixel_pitch_default = def;
@@ -1051,7 +1066,6 @@ DataTemplate *data_template_new_from_string(const char *string_in)
defaults.cnx = NAN;
defaults.cny = NAN;
defaults.cnz_offset = 0.0;
- defaults.cnz_offset_default = 1;
defaults.pixel_pitch = -1.0;
defaults.pixel_pitch_default = 1;
defaults.bad = 0;
@@ -1400,10 +1414,20 @@ DataTemplate *data_template_new_from_string(const char *string_in)
cffree(defaults.masks[i].filename);
}
- /* If this is a single-panel detector, there should only be one group
- * called "all" which points to the panel */
- if ( (dt->n_panels == 1) && (dt->n_groups == 1) ) {
- parse_group("all", dt, dt->groups[0]->name);
+ /* If no groups are defined, put everything in one group.
+ * This allows at least basic geometry refinement to work. */
+ if ( dt->n_groups == dt->n_panels ) {
+ char **allg = malloc(dt->n_groups*sizeof(char *));
+ if ( allg == NULL ) {
+ ERROR("Failed to create top group\n");
+ } else {
+ int i;
+ for ( i=0; i<dt->n_groups; i++ ) {
+ allg[i] = dt->groups[i]->name;
+ }
+ add_group_members("all", dt, allg, dt->n_groups);
+ free(allg);
+ }
}
cffree(string_orig);
@@ -2377,7 +2401,6 @@ int data_template_write_to_fh(const DataTemplate *dtempl, FILE *fh)
}
/* Other top-levels */
- int cnz_offset_done = 0;
int mask_done[MAX_MASKS] = {0};
int satmap_done = 0;
int satmap_file_done = 0;
@@ -2393,11 +2416,6 @@ int data_template_write_to_fh(const DataTemplate *dtempl, FILE *fh)
const struct panel_template *p = &dtempl->panels[i];
int j;
- if ( p->cnz_offset_default && !cnz_offset_done ) {
- fprintf(fh, "coffset = %f\n", p->cnz_offset);
- cnz_offset_done = 1;
- }
-
for ( j=0; j<MAX_MASKS; j++ ) {
if ( p->masks[j].data_location == NULL ) continue;
if ( !p->masks[j].mask_default ) continue;
@@ -2405,7 +2423,7 @@ int data_template_write_to_fh(const DataTemplate *dtempl, FILE *fh)
fprintf(fh, "mask%i_data = %s\n",
j, p->masks[j].data_location);
if ( p->masks[j].filename != NULL ) {
- fprintf(fh, "mask%i_filename = %s\n",
+ fprintf(fh, "mask%i_file = %s\n",
j, p->masks[j].filename);
}
fprintf(fh, "mask%i_goodbits = 0x%x\n",
@@ -2501,17 +2519,19 @@ int data_template_write_to_fh(const DataTemplate *dtempl, FILE *fh)
/* Bad regions */
for ( i=0; i<dtempl->n_bad; i++ ) {
const struct dt_badregion *bad = &dtempl->bad[i];
+ assert(strncmp(bad->name, "bad", 3) == 0);
if ( bad->is_fsss ) {
- fprintf(fh, "bad_%s/panel = %s\n", bad->name, bad->panel_name);
- fprintf(fh, "bad_%s/min_fs = %i\n", bad->name, bad->min_fs);
- fprintf(fh, "bad_%s/max_fs = %i\n", bad->name, bad->max_fs);
- fprintf(fh, "bad_%s/min_ss = %i\n", bad->name, bad->min_ss);
- fprintf(fh, "bad_%s/max_ss = %i\n", bad->name, bad->max_ss);
+ const struct panel_template *p = &dtempl->panels[bad->panel_number];
+ fprintf(fh, "%s/panel = %s\n", bad->name, p->name);
+ fprintf(fh, "%s/min_fs = %i\n", bad->name, bad->min_fs+p->orig_min_fs);
+ fprintf(fh, "%s/max_fs = %i\n", bad->name, bad->max_fs+p->orig_min_fs);
+ fprintf(fh, "%s/min_ss = %i\n", bad->name, bad->min_ss+p->orig_min_ss);
+ fprintf(fh, "%s/max_ss = %i\n", bad->name, bad->max_ss+p->orig_min_ss);
} else {
- fprintf(fh, "bad_%s/min_x = %f\n", bad->name, bad->min_x);
- fprintf(fh, "bad_%s/max_x = %f\n", bad->name, bad->max_x);
- fprintf(fh, "bad_%s/min_y = %f\n", bad->name, bad->min_y);
- fprintf(fh, "bad_%s/max_y = %f\n", bad->name, bad->max_y);
+ fprintf(fh, "%s/min_x = %f\n", bad->name, bad->min_x);
+ fprintf(fh, "%s/max_x = %f\n", bad->name, bad->max_x);
+ fprintf(fh, "%s/min_y = %f\n", bad->name, bad->min_y);
+ fprintf(fh, "%s/max_y = %f\n", bad->name, bad->max_y);
}
fprintf(fh, "\n");
}
@@ -2533,9 +2553,7 @@ int data_template_write_to_fh(const DataTemplate *dtempl, FILE *fh)
fprintf(fh, "%s/ss = %fx %+fy %+fz\n", p->name,
p->ssx, p->ssy, p->ssz);
- if ( !p->cnz_offset_default ) {
- fprintf(fh, "%s/coffset = %f\n", p->name, p->cnz_offset);
- }
+ fprintf(fh, "%s/coffset = %f\n", p->name, p->cnz_offset);
for ( j=0; j<MAX_MASKS; j++ ) {
if ( p->masks[j].data_location == NULL ) continue;
@@ -2543,7 +2561,7 @@ int data_template_write_to_fh(const DataTemplate *dtempl, FILE *fh)
fprintf(fh, "%s/mask%i_data = %s\n",
p->name, j, p->masks[j].data_location);
if ( p->masks[j].filename != NULL ) {
- fprintf(fh, "%smask%i_filename = %s\n",
+ fprintf(fh, "%smask%i_file = %s\n",
p->name, j, p->masks[j].filename);
}
fprintf(fh, "%s/mask%i_goodbits = 0x%x\n",