diff options
author | Thomas White <taw@physics.org> | 2023-05-19 16:40:27 +0200 |
---|---|---|
committer | Thomas White <taw@physics.org> | 2023-07-28 13:22:05 +0200 |
commit | b0f7eecabf56c54191ac1ed73d5fd47ac0137cb3 (patch) | |
tree | ba9fc77d20568bacabd618f2c1f6827989c2f569 | |
parent | b217ce28524c0f7921bd8cd5a9ef6355443cd1e3 (diff) |
DataTemplate: Track which values came from top level
-rw-r--r-- | libcrystfel/src/datatemplate.c | 46 | ||||
-rw-r--r-- | libcrystfel/src/datatemplate_priv.h | 14 |
2 files changed, 48 insertions, 12 deletions
diff --git a/libcrystfel/src/datatemplate.c b/libcrystfel/src/datatemplate.c index 8d598074..79c6b8db 100644 --- a/libcrystfel/src/datatemplate.c +++ b/libcrystfel/src/datatemplate.c @@ -426,7 +426,8 @@ static int add_flag_value(struct panel_template *p, static int parse_mask(struct panel_template *panel, const char *key_orig, - const char *val) + const char *val, + int def) { int n; char *key; @@ -493,7 +494,8 @@ static int parse_mask(struct panel_template *panel, static int parse_field_for_panel(struct panel_template *panel, const char *key, - const char *val, DataTemplate *det) + const char *val, DataTemplate *det, + int def) { int reject = 0; @@ -512,9 +514,11 @@ static int parse_field_for_panel(struct panel_template *panel, const char *key, } else if ( strcmp(key, "adu_per_eV") == 0 ) { panel->adu_scale = atof(val); panel->adu_scale_unit = ADU_PER_EV; + panel->adu_scale_default = def; } else if ( strcmp(key, "adu_per_photon") == 0 ) { panel->adu_scale = atof(val); panel->adu_scale_unit = ADU_PER_PHOTON; + panel->adu_scale_default = def; } else if ( strcmp(key, "clen") == 0 ) { ERROR("'clen' is a top-level property in this version of CrystFEL.\n"); reject = 1; @@ -522,6 +526,7 @@ static int parse_field_for_panel(struct panel_template *panel, const char *key, } else if ( strcmp(key, "data") == 0 ) { free(panel->data); panel->data = strdup(val); + panel->data_default = def; } else if ( strcmp(key, "mask_edge_pixels") == 0 ) { if ( convert_int(val, &panel->mask_edge_pixels) ) { @@ -529,30 +534,36 @@ static int parse_field_for_panel(struct panel_template *panel, const char *key, panel->name, val); reject = 1; } + panel->mask_edge_pixels_default = def; } else if ( strcmp(key, "mask_bad") == 0 ) { - parse_field_for_panel(panel, "mask0_badbits", val, det); + parse_field_for_panel(panel, "mask0_badbits", val, det, def); } else if ( strcmp(key, "mask_good") == 0 ) { - parse_field_for_panel(panel, "mask0_goodbits", val, det); + parse_field_for_panel(panel, "mask0_goodbits", val, det, def); } else if ( strcmp(key, "mask") == 0 ) { - parse_field_for_panel(panel, "mask0_data", val, det); + parse_field_for_panel(panel, "mask0_data", val, det, def); } else if ( strcmp(key, "mask_file") == 0 ) { - parse_field_for_panel(panel, "mask0_file", val, det); + parse_field_for_panel(panel, "mask0_file", val, det, def); } else if ( strncmp(key, "mask", 4) == 0 ) { - reject = parse_mask(panel, key, val); + reject = parse_mask(panel, key, val, def); } else if ( strcmp(key, "saturation_map") == 0 ) { panel->satmap = strdup(val); + panel->satmap_default = def; } else if ( strcmp(key, "saturation_map_file") == 0 ) { panel->satmap_file = strdup(val); + panel->satmap_file_default = def; } 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; } else if ( strcmp(key, "max_adu") == 0 ) { panel->max_adu = atof(val); + panel->max_adu_default = def; ERROR("WARNING: It's usually better not to set max_adu " "in the geometry file. Use --max-adu during " "merging instead.\n"); @@ -842,7 +853,10 @@ static int parse_toplevel(DataTemplate *dt, } else { - if ( parse_field_for_panel(defaults, key, val, dt) == 0 ) { + /* If there are any panels, the value in 'defaults' gets marked + * as "not default". This will cause it to be written out for + * each subsequent panel. */ + if ( parse_field_for_panel(defaults, key, val, dt, (dt->n_panels==0)) == 0 ) { *defaults_updated = 1; } else { return 1; @@ -1016,9 +1030,12 @@ 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; defaults.mask_edge_pixels = 0; + defaults.mask_edge_pixels_default = 1; defaults.fsx = NAN; defaults.fsy = NAN; defaults.fsz = NAN; @@ -1027,8 +1044,10 @@ DataTemplate *data_template_new_from_string(const char *string_in) defaults.ssz = NAN; defaults.adu_scale = NAN; defaults.adu_scale_unit = ADU_PER_PHOTON; + defaults.adu_scale_default = 1; for ( i=0; i<MAX_FLAG_VALUES; i++ ) defaults.flag_values[i] = 0; for ( i=0; i<MAX_FLAG_VALUES; i++ ) defaults.flag_types[i] = FLAG_NOTHING; + defaults.flag_values_default = 1; for ( i=0; i<MAX_MASKS; i++ ) { defaults.masks[i].data_location = NULL; defaults.masks[i].filename = NULL; @@ -1036,13 +1055,18 @@ DataTemplate *data_template_new_from_string(const char *string_in) defaults.masks[i].bad_bits = 0; } defaults.max_adu = +INFINITY; + defaults.max_adu_default = 1; defaults.satmap = NULL; + defaults.satmap_default = 1; defaults.satmap_file = NULL; + defaults.satmap_file_default = 1; defaults.data = strdup("/data/data"); + defaults.data_default = 1; defaults.name = NULL; defaults.dims[0] = DIM_SS; defaults.dims[1] = DIM_FS; for ( i=2; i<MAX_DIMS; i++ ) defaults.dims[i] = DIM_UNDEFINED; + for ( i=0; i<MAX_DIMS; i++ ) defaults.dims_default[i] = 1; string = strdup(string_in); if ( string == NULL ) return NULL; @@ -1148,11 +1172,9 @@ DataTemplate *data_template_new_from_string(const char *string_in) } if ( panel != NULL ) { - if ( parse_field_for_panel(panel, key, val, - dt) ) reject = 1; + if ( parse_field_for_panel(panel, key, val, dt, 0) ) reject = 1; } else { - if ( parse_field_bad(badregion, key, - val) ) reject = 1; + if ( parse_field_bad(badregion, key, val) ) reject = 1; } free(line); diff --git a/libcrystfel/src/datatemplate_priv.h b/libcrystfel/src/datatemplate_priv.h index aaecf283..5d320c48 100644 --- a/libcrystfel/src/datatemplate_priv.h +++ b/libcrystfel/src/datatemplate_priv.h @@ -108,6 +108,9 @@ struct mask_template /** Bit mask for good pixels * (pixel cannot be good unless all of these are set) */ unsigned int good_bits; + + /** If non-zero, this mask came from the top level */ + int mask_default; }; @@ -127,41 +130,52 @@ struct panel_template /** The offset to be applied from clen */ double cnz_offset; + int cnz_offset_default; /** Mask definitions */ struct mask_template masks[MAX_MASKS]; + int mask_default; /** Location of per-pixel saturation map */ char *satmap; + int satmap_default; /** Filename for saturation map */ char *satmap_file; + int satmap_file_default; /** Mark entire panel as bad if set */ int bad; /** Mark this number of edge rows as bad */ int mask_edge_pixels; + int mask_edge_pixels_default; /** Pixel size in metres */ double pixel_pitch; + int pixel_pitch_default; /** Number of detector intensity units per photon, or eV */ double adu_scale; enum adu_per_unit adu_scale_unit; + int adu_scale_default; /** Treat pixel as unreliable if higher than this */ double max_adu; + int max_adu_default; /** Pixels with exactly this value will be marked as bad */ enum flag_value_type flag_types[MAX_FLAG_VALUES]; signed int flag_values[MAX_FLAG_VALUES]; + int flag_values_default; /** Location of data in file (possibly with placeholders) */ char *data; + int data_default; /** Dimensions (see definitions for DIM_FS etc above) */ signed int dims[MAX_DIMS]; + int dims_default[MAX_DIMS]; /** \name Transformation matrix from pixel coordinates to lab frame */ /*@{*/ |