aboutsummaryrefslogtreecommitdiff
path: root/libcrystfel/src/hdf5-file.c
diff options
context:
space:
mode:
Diffstat (limited to 'libcrystfel/src/hdf5-file.c')
-rw-r--r--libcrystfel/src/hdf5-file.c280
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;
+
+ }
}