diff options
author | Thomas White <taw@physics.org> | 2021-04-19 16:23:41 +0200 |
---|---|---|
committer | Thomas White <taw@physics.org> | 2021-04-19 16:45:30 +0200 |
commit | bd6f2aea61668638ddd2e934ce89e3715d30307d (patch) | |
tree | 071455c372988dda7217a277155d76e342d0f75c /libcrystfel/src/image.c | |
parent | b126d28c8804fd30ca8934b3987e7a9cd1cfae93 (diff) |
Unify loading of image data and header values
This moves the entry point for loading MsgPack data to a new function,
image_read_data_block. Inside image.c, the image structure can be
created using exactly the same functions as for data files.
Diffstat (limited to 'libcrystfel/src/image.c')
-rw-r--r-- | libcrystfel/src/image.c | 231 |
1 files changed, 159 insertions, 72 deletions
diff --git a/libcrystfel/src/image.c b/libcrystfel/src/image.c index d5029a1c..f41452bb 100644 --- a/libcrystfel/src/image.c +++ b/libcrystfel/src/image.c @@ -43,6 +43,7 @@ #include "detgeom.h" #include "image-hdf5.h" #include "image-cbf.h" +#include "image-msgpack.h" #include "datatemplate.h" #include "datatemplate_priv.h" @@ -375,21 +376,33 @@ static double get_value(struct image *image, const char *from, return NAN; } - } else if ( is_hdf5_file(image->filename) ) { - val = image_hdf5_get_value(from, image->filename, image->ev, - &type); + } else { - } else if ( is_cbf_file(image->filename) ) { - /* FIXME: From headers */ - return NAN; + switch ( image->data_source_type ) { - } else if ( is_cbfgz_file(image->filename) ) { - /* FIXME: From headers */ - return NAN; + case DST_HDF5: + val = image_hdf5_get_value(from, image->filename, + image->ev, &type); + break; + + case DST_CBF: + case DST_CBFGZ: + /* FIXME: Implementation */ + val = NAN; + break; + + case DST_MSGPACK: + val = image_msgpack_get_value(from, image->data_block, + image->data_block_size, + &type); + break; + + default: + ERROR("Unrecognised file type %i\n", image->data_source_type); + return 1; + + } - } else { - ERROR("Unrecognised file type: %s\n", image->filename); - return NAN; } if ( type == 'f' ) { @@ -401,6 +414,29 @@ static double get_value(struct image *image, const char *from, } +static DataSourceType file_type(const char *filename) +{ + if ( !file_exists(filename) ) { + ERROR("File not found: %s\n", filename); + return DST_UNKNOWN; + } + + if ( is_hdf5_file(filename) ) { + return DST_HDF5; + + } else if ( is_cbf_file(filename) ) { + return DST_CBF; + + } else if ( is_cbfgz_file(filename) ) { + return DST_CBFGZ; + + } else { + ERROR("Unrecognised file type: %s\n", filename); + return DST_UNKNOWN; + } +} + + static char *get_value_and_units(struct image *image, const char *from, double *pvalue, int *is_literal_number) @@ -630,28 +666,39 @@ int image_set_zero_mask(struct image *image, static int image_read_image_data(struct image *image, - const DataTemplate *dtempl, - const char *filename, - const char *event) + const DataTemplate *dtempl) { - if ( !file_exists(filename) ) { - ERROR("File not found: %s\n", filename); + if ( (image->filename != NULL) + && (!file_exists(image->filename)) ) + { + ERROR("File not found: %s\n", image->filename); return image_set_zero_data(image, dtempl); } - if ( is_hdf5_file(filename) ) { - return image_hdf5_read(image, dtempl, filename, event); + switch ( image->data_source_type ) { - } else if ( is_cbf_file(filename) ) { - return image_cbf_read(image, dtempl, filename, event, 0); + case DST_HDF5: + return image_hdf5_read(image, dtempl, + image->filename, image->ev); - } else if ( is_cbfgz_file(filename) ) { - return image_cbf_read(image, dtempl, filename, event, 1); + case DST_CBF: + return image_cbf_read(image, dtempl, + image->filename, image->ev, + 0); - } + case DST_CBFGZ: + return image_cbf_read(image, dtempl, + image->filename, image->ev, + 1); - ERROR("Unrecognised file type: %s\n", filename); - return 1; + case DST_MSGPACK: + return image_msgpack_read(image, dtempl, image->data_block, + image->data_block_size); + + default: + ERROR("Unrecognised file type %i\n", image->data_source_type); + return 1; + } } @@ -1084,6 +1131,31 @@ struct image *image_create_for_simulation(const DataTemplate *dtempl) } +static int do_image_read(struct image *image, const DataTemplate *dtempl, + int no_image_data, int no_mask_data) +{ + int i; + + /* Load the image data */ + if ( !no_image_data ) { + if ( image_read_image_data(image, dtempl) ) return 1; + } else { + if ( image_set_zero_data(image, dtempl) ) return 1; + } + + set_image_parameters(image, dtempl); + if ( create_detgeom(image, dtempl) ) return 1; + if ( create_badmap(image, dtempl, no_mask_data) ) return 1; + if ( create_satmap(image, dtempl) ) return 1; + + for ( i=0; i<dtempl->n_headers_to_copy; i++ ) { + get_value(image, dtempl->headers_to_copy[i], NULL); + } + + return 0; +} + + struct image *image_read(const DataTemplate *dtempl, const char *filename, const char *event, @@ -1091,8 +1163,6 @@ struct image *image_read(const DataTemplate *dtempl, int no_mask_data) { struct image *image; - int r; - int i; if ( dtempl == NULL ) { ERROR("NULL data template!\n"); @@ -1111,40 +1181,52 @@ struct image *image_read(const DataTemplate *dtempl, } else { image->ev = strdup("//"); /* Null event */ } + image->data_block = NULL; + image->data_block_size = 0; - /* Load the image data */ - if ( !no_image_data ) { - r = image_read_image_data(image, dtempl, - filename, event); - } else { - r = image_set_zero_data(image, dtempl); - } - if ( r ) { + image->data_source_type = file_type(image->filename); + + if ( do_image_read(image, dtempl, no_image_data, no_mask_data) ) { image_free(image); return NULL; } - set_image_parameters(image, dtempl); + return image; +} - if ( create_detgeom(image, dtempl) ) { - image_free(image); + +struct image *image_read_data_block(const DataTemplate *dtempl, + void *data_block, + size_t data_block_size, + DataSourceType type, + int no_image_data, + int no_mask_data) +{ + struct image *image; + + if ( dtempl == NULL ) { + ERROR("NULL data template!\n"); return NULL; } - if ( create_badmap(image, dtempl, no_mask_data) ) { - image_free(image); + image = image_new(); + if ( image == NULL ) { + ERROR("Couldn't allocate image structure.\n"); return NULL; } - if ( create_satmap(image, dtempl) ) { + image->filename = NULL; + image->ev = NULL; + image->data_block = data_block; + image->data_block_size = data_block_size; + + image->data_source_type = file_type(image->filename); + + if ( do_image_read(image, dtempl, no_image_data, no_mask_data) ) { image_free(image); return NULL; } - for ( i=0; i<dtempl->n_headers_to_copy; i++ ) { - get_value(image, dtempl->headers_to_copy[i], NULL); - } - return image; } @@ -1159,6 +1241,7 @@ void image_free(struct image *image) spectrum_free(image->spectrum); free(image->filename); free(image->ev); + free(image->data_block); if ( image->detgeom != NULL ) { np = image->detgeom->n_panels; @@ -1187,32 +1270,36 @@ void image_free(struct image *image) struct image *image_new() { - struct image *image; - - image = malloc(sizeof(struct image)); - if ( image == NULL ) return NULL; - - image->dp = NULL; - image->bad = NULL; - image->sat = NULL; - image->hit = 0; - image->crystals = NULL; - image->n_crystals = 0; - image->indexed_by = INDEXING_NONE; - image->detgeom = NULL; - image->filename = NULL; - image->ev = NULL; - image->n_cached_headers = 0; - image->id = 0; - image->serial = 0; - image->spectrum = NULL; - image->lambda = -1.0; - image->div = 0.0; - image->bw = -1.0; - image->peak_resolution = -1.0; - image->features = NULL; - - return image; + struct image *image; + + image = malloc(sizeof(struct image)); + if ( image == NULL ) return NULL; + + image->dp = NULL; + image->bad = NULL; + image->sat = NULL; + image->hit = 0; + image->crystals = NULL; + image->n_crystals = 0; + image->indexed_by = INDEXING_NONE; + image->detgeom = NULL; + image->filename = NULL; + image->ev = NULL; + image->data_block = NULL; + image->data_block_size = 0; + image->data_source_type = DST_UNKNOWN; + + image->n_cached_headers = 0; + image->id = 0; + image->serial = 0; + image->spectrum = NULL; + image->lambda = -1.0; + image->div = 0.0; + image->bw = -1.0; + image->peak_resolution = -1.0; + image->features = NULL; + + return image; } |