diff options
author | Thomas White <taw@physics.org> | 2016-04-12 13:56:37 +0200 |
---|---|---|
committer | Thomas White <taw@physics.org> | 2016-04-12 13:56:37 +0200 |
commit | 57381ed7e7e787ff0fd35e0eec2c7ed4cdae0357 (patch) | |
tree | f58a00581d2b5ae2d072f34a4133b2389f64fa0c /libcrystfel/src/hdf5-file.c | |
parent | b62b7f7356f529ab904dabefb4618afc8f2211ec (diff) | |
parent | 52a9c0b1a891f2adfbcdbe4d69b070e837b8e7cb (diff) |
Merge branch 'tom/testing'
Diffstat (limited to 'libcrystfel/src/hdf5-file.c')
-rw-r--r-- | libcrystfel/src/hdf5-file.c | 280 |
1 files changed, 160 insertions, 120 deletions
diff --git a/libcrystfel/src/hdf5-file.c b/libcrystfel/src/hdf5-file.c index ee352f03..0fb388b4 100644 --- a/libcrystfel/src/hdf5-file.c +++ b/libcrystfel/src/hdf5-file.c @@ -464,10 +464,17 @@ int get_peaks(struct image *image, struct hdfile *f, const char *p) float *buf; herr_t r; int tw; + char *np; - dh = H5Dopen2(f->fh, p, H5P_DEFAULT); + if ( image->event != NULL ) { + np = retrieve_full_path(image->event, p); + } else { + np = strdup(p); + } + + dh = H5Dopen2(f->fh, np, H5P_DEFAULT); if ( dh < 0 ) { - ERROR("Peak list (%s) not found.\n", p); + ERROR("Peak list (%s) not found.\n", np); return 1; } @@ -475,6 +482,7 @@ int get_peaks(struct image *image, struct hdfile *f, const char *p) if ( sh < 0 ) { H5Dclose(dh); ERROR("Couldn't get dataspace for peak list.\n"); + free(np); return 1; } @@ -483,6 +491,7 @@ int get_peaks(struct image *image, struct hdfile *f, const char *p) H5Sget_simple_extent_ndims(sh)); H5Sclose(sh); H5Dclose(dh); + free(np); return 1; } @@ -493,6 +502,7 @@ int get_peaks(struct image *image, struct hdfile *f, const char *p) H5Sclose(sh); H5Dclose(dh); ERROR("Peak list has the wrong dimensions.\n"); + free(np); return 1; } @@ -501,6 +511,7 @@ int get_peaks(struct image *image, struct hdfile *f, const char *p) H5Sclose(sh); H5Dclose(dh); ERROR("Couldn't reserve memory for the peak list.\n"); + free(np); return 1; } r = H5Dread(dh, H5T_NATIVE_FLOAT, H5S_ALL, H5S_ALL, @@ -508,6 +519,7 @@ int get_peaks(struct image *image, struct hdfile *f, const char *p) if ( r < 0 ) { ERROR("Couldn't read peak list.\n"); free(buf); + free(np); return 1; } @@ -539,6 +551,7 @@ int get_peaks(struct image *image, struct hdfile *f, const char *p) } free(buf); + free(np); H5Sclose(sh); H5Dclose(dh); @@ -2434,17 +2447,15 @@ int check_path_existence(hid_t fh, const char *path) static herr_t parse_file_event_structure(hid_t loc_id, char *name, const H5L_info_t *info, - void *operator_data) + struct parse_params *pp) { - struct parse_params *pp; char *substituted_path; char *ph_loc; char *truncated_path; htri_t check; herr_t herrt_iterate, herrt_info; struct H5O_info_t object_info; - pp = (struct parse_params *)operator_data; if ( !pp->top_level ) { @@ -2468,7 +2479,7 @@ static herr_t parse_file_event_structure(hid_t loc_id, char *name, truncated_path = strdup(substituted_path); ph_loc = strstr(substituted_path,"%"); if ( ph_loc != NULL) { - strncpy(&truncated_path[ph_loc-substituted_path],"\0",1); + truncated_path[ph_loc-substituted_path] = '\0'; } herrt_iterate = 0; @@ -2488,8 +2499,9 @@ static herr_t parse_file_event_structure(hid_t loc_id, char *name, return -1; } - if ( pp->curr_event->path_length == pp->path_dim && - object_info.type == H5O_TYPE_DATASET ) { + if ( pp->curr_event->path_length == pp->path_dim + && object_info.type == H5O_TYPE_DATASET ) + { int fail_append; @@ -2528,159 +2540,187 @@ static herr_t parse_file_event_structure(hid_t loc_id, char *name, } -struct event_list *fill_event_list(struct hdfile *hdfile, struct detector *det) +static int fill_paths(struct hdfile *hdfile, struct detector *det, int pi, + struct event_list *master_el) { - int pi; - int evi; - herr_t check; - struct event_list *master_el; - struct event_list *master_el_with_dims; - - master_el = initialize_event_list(); + struct parse_params pparams; + struct event *empty_event; + struct event_list *panel_ev_list; + int ei; + int check; - if ( det->path_dim != 0 ) { + empty_event = initialize_event(); + panel_ev_list = initialize_event_list(); + if ( (empty_event == NULL) || (panel_ev_list == NULL) ) + { + ERROR("Failed to allocate memory for event list.\n"); + return 1; + } - for ( pi=0; pi<det->n_panels; pi++ ) { + pparams.path = det->panels[pi].data; + pparams.hdfile = hdfile; + pparams.path_dim = det->path_dim; + pparams.curr_event = empty_event; + pparams.top_level = 1; + pparams.ev_list = panel_ev_list; - struct parse_params pparams; - struct event *empty_event; - struct event_list *panel_ev_list; - int ei; + check = parse_file_event_structure(hdfile->fh, NULL, NULL, &pparams); + if ( check < 0 ) { + free_event(empty_event); + free_event_list(panel_ev_list); + return 1; + } - empty_event = initialize_event(); - panel_ev_list = initialize_event_list(); + for ( ei=0; ei<panel_ev_list->num_events; ei++ ) { - pparams.path = det->panels[pi].data; - pparams.hdfile = hdfile; - pparams.path_dim = det->path_dim; - pparams.curr_event = empty_event; - pparams.top_level = 1; - pparams.ev_list = panel_ev_list; + int fail_add; - check = parse_file_event_structure(hdfile->fh, NULL, - NULL, - (void *)&pparams); + fail_add = add_non_existing_event_to_event_list(master_el, + panel_ev_list->events[ei]); + if ( fail_add ) { + free_event(empty_event); + free_event_list(panel_ev_list); + return 1; + } - if ( check < 0 ) { - free_event(empty_event); - free_event_list(panel_ev_list); - return NULL; - } + } - for ( ei=0; ei<panel_ev_list->num_events; ei++ ) { + free_event(empty_event); + free_event_list(panel_ev_list); - int fail_add; + return 0; +} - fail_add = add_non_existing_event_to_event_list( - master_el, - panel_ev_list->events[ei]); - if ( fail_add ) { - free_event(empty_event); - free_event_list(panel_ev_list); - return NULL; - } - } +static int fill_dims(struct hdfile *hdfile, struct panel *p, struct event *ev, + struct event_list *events) +{ + char *full_panel_path; + hid_t dh; + hid_t sh; + int dims; + hsize_t *size; + hsize_t *max_size; + int hsdi; + int panel_path_dim = 0; + int global_path_dim = -1; + int mlwd; + struct dim_structure *panel_dim_structure; - free_event(empty_event); - free_event_list(panel_ev_list); - } + /* Get the full path for this panel in this event */ + full_panel_path = retrieve_full_path(ev, p->data); + dh = H5Dopen2(hdfile->fh, full_panel_path, H5P_DEFAULT); + if ( dh < 0 ) { + ERROR("Failed to enumerate events. " + "Check your geometry file.\n"); + return 1; } - if ( det->dim_dim > 0 ) { - - if ( master_el->num_events == 0 ) { + sh = H5Dget_space(dh); + dims = H5Sget_simple_extent_ndims(sh); + size = malloc(dims*sizeof(hsize_t)); + max_size = malloc(dims*sizeof(hsize_t)); + if ( (size==NULL) || (max_size==NULL) ) { + ERROR("Failed to allocate memory for dimensions\n"); + return 1; + } - struct event *empty_ev; - empty_ev = initialize_event(); - append_event_to_event_list(master_el, empty_ev); - free(empty_ev); + dims = H5Sget_simple_extent_dims(sh, size, max_size); + panel_dim_structure = p->dim_structure; + for ( hsdi=0; hsdi<panel_dim_structure->num_dims; hsdi++ ) { + if ( panel_dim_structure->dims[hsdi] == HYSL_PLACEHOLDER ) { + panel_path_dim = size[hsdi]; + break; } + } - master_el_with_dims = initialize_event_list(); + if ( global_path_dim == -1 ) { - for (evi=0; evi<master_el->num_events; evi++ ) { + global_path_dim = panel_path_dim; - int global_path_dim = -1; - int pai; - int mlwd; + } else if ( panel_path_dim != global_path_dim ) { - for ( pai=0; pai<det->n_panels; pai++ ) { + ERROR("Data blocks paths for panels must have the same number" + " of placeholders\n"); + free(size); + free(max_size); + return 1; + } - char *full_panel_path; - hid_t dh; - hid_t sh; - int dims; - hsize_t *size; - hsize_t *max_size; - int hsdi; - int panel_path_dim = 0; - full_panel_path = retrieve_full_path( - master_el->events[evi], - det->panels[pai].data); + for ( mlwd=0; mlwd<global_path_dim; mlwd++ ) { - dh = H5Dopen2(hdfile->fh, full_panel_path, - H5P_DEFAULT); - if ( dh < 0 ) { - ERROR("Failed to enumerate events. " - "Check your geometry file.\n"); - return NULL; - } - sh = H5Dget_space(dh); - dims = H5Sget_simple_extent_ndims(sh); - - size = malloc(dims*sizeof(hsize_t)); - max_size = malloc(dims*sizeof(hsize_t)); - - dims = H5Sget_simple_extent_dims(sh, size, - max_size); - - for ( hsdi=0; - hsdi<det->panels[pai].dim_structure->num_dims; - hsdi++ ) { - if (det->panels[pai].dim_structure->dims[hsdi] == - HYSL_PLACEHOLDER ) { - panel_path_dim = size[hsdi]; - break; - } - } + struct event *mlwd_ev; + mlwd_ev = copy_event(ev); + push_dim_entry_to_event(mlwd_ev, mlwd); + append_event_to_event_list(events, mlwd_ev); + free(mlwd_ev); + } - if ( global_path_dim == -1 ) { + return 0; +} - global_path_dim = panel_path_dim; - } else if ( panel_path_dim != global_path_dim ) { +struct event_list *fill_event_list(struct hdfile *hdfile, struct detector *det) +{ + struct event_list *master_el; - ERROR("Data blocks paths for panels must " - "have the same number of placeholders"); - free(size); - free(max_size); - return NULL; - } + master_el = initialize_event_list(); + if ( master_el == NULL ) { + ERROR("Failed to allocate event list.\n"); + return NULL; + } + /* First expand any placeholders in the HDF5 paths */ + if ( det->path_dim != 0 ) { + int pi; + for ( pi=0; pi<det->n_panels; pi++ ) { + if ( fill_paths(hdfile, det, pi, master_el) ) { + ERROR("Failed to enumerate paths.\n"); + return NULL; } + } + } - for ( mlwd=0; mlwd<global_path_dim; mlwd++ ) { + /* Now enumerate the placeholder dimensions */ + if ( det->dim_dim > 0 ) { - struct event *mlwd_ev; + struct event_list *master_el_with_dims; + int evi; - mlwd_ev = copy_event(master_el->events[evi]); - push_dim_entry_to_event(mlwd_ev, mlwd); - append_event_to_event_list(master_el_with_dims, - mlwd_ev); - free(mlwd_ev); - } + /* If there were no HDF5 path placeholders, add a dummy event */ + if ( master_el->num_events == 0 ) { + struct event *empty_ev; + empty_ev = initialize_event(); + append_event_to_event_list(master_el, empty_ev); + free(empty_ev); + } + + master_el_with_dims = initialize_event_list(); + /* For each event so far, expand the dimensions */ + for ( evi=0; evi<master_el->num_events; evi++ ) { + int pi; + for ( pi=0; pi<det->n_panels; pi++ ) { + if ( fill_dims(hdfile, &det->panels[pi], + master_el->events[evi], + master_el_with_dims) ) + { + ERROR("Failed to enumerate dims.\n"); + return NULL; + } + } } free_event_list(master_el); return master_el_with_dims; - } + } else { - return master_el; + return master_el; + + } } |