From 26aab0b1039e9f66d6716fa7c650b47382e3d043 Mon Sep 17 00:00:00 2001 From: Thomas White Date: Thu, 20 Sep 2018 14:50:35 +0200 Subject: Factorise CBF data read --- libcrystfel/src/image.c | 162 ++++++++++++------------------------------------ 1 file changed, 39 insertions(+), 123 deletions(-) (limited to 'libcrystfel') diff --git a/libcrystfel/src/image.c b/libcrystfel/src/image.c index 20f53849..31125725 100644 --- a/libcrystfel/src/image.c +++ b/libcrystfel/src/image.c @@ -619,7 +619,7 @@ static float *convert_sint16_float(int16_t *data, int w, int h) } -static int read_cbf(struct imagefile *f, struct image *image) +static float *read_cbf_data(struct imagefile *f, int *w, int *h, cbf_handle *pcbfh) { cbf_handle cbfh; FILE *fh; @@ -631,27 +631,22 @@ static int read_cbf(struct imagefile *f, struct image *image) void *data; float *dataf; - if ( image->det == NULL ) { - ERROR("read_cbf() needs a geometry\n"); - return 1; - } - if ( cbf_make_handle(&cbfh) ) { ERROR("Failed to allocate CBF handle\n"); - return 1; + return NULL; } fh = fopen(f->filename, "rb"); if ( fh == NULL ) { ERROR("Failed to open '%s'\n", f->filename); - return 1; + return NULL; } /* CBFlib calls fclose(fh) when it's ready */ if ( cbf_read_widefile(cbfh, fh, 0) ) { ERROR("Failed to read CBF file '%s'\n", f->filename); cbf_free_handle(cbfh); - return 1; + return NULL; } /* Select row 0 in data column inside array_data */ @@ -672,46 +667,46 @@ static int read_cbf(struct imagefile *f, struct image *image) ERROR("Failed to read CBF array parameters: %s\n", err); free(err); cbf_free_handle(cbfh); - return 1; + return NULL; } if ( dimslow != 0 ) { ERROR("CBF data array is 3D - don't know what to do with it\n"); cbf_free_handle(cbfh); - return 1; + return NULL; } if ( dimfast*dimmid*elsize > 10e9 ) { ERROR("CBF data is far too big (%i x %i x %i bytes).\n", (int)dimfast, (int)dimmid, (int)elsize); cbf_free_handle(cbfh); - return 1; + return NULL; } if ( (elsize != 4) && (elsize != 2) ) { STATUS("Don't know what to do with element size %i\n", (int)elsize); cbf_free_handle(cbfh); - return 1; + return NULL; } if ( !elsigned ) { STATUS("Don't know what to do with unsigned data (yet)\n"); cbf_free_handle(cbfh); - return 1; + return NULL; } if ( strcmp(byteorder, "little_endian") != 0 ) { STATUS("Don't know what to do with non-little-endian datan\n"); cbf_free_handle(cbfh); - return 1; + return NULL; } data = malloc(elsize*dimfast*dimmid); if ( data == NULL ) { ERROR("Failed to allocate memory for CBF data\n"); cbf_free_handle(cbfh); - return 1; + return NULL; } r = cbf_get_integerarray(cbfh, &binary_id, data, elsize, 1, @@ -721,7 +716,7 @@ static int read_cbf(struct imagefile *f, struct image *image) ERROR("Failed to read CBF array: %s\n", err); free(err); cbf_free_handle(cbfh); - return 1; + return NULL; } if ( elsize == 4 ) { @@ -730,10 +725,29 @@ static int read_cbf(struct imagefile *f, struct image *image) if ( elsize == 2 ) { dataf = convert_sint16_float(data, dimfast, dimmid); } + free(data); - unpack_panels(image, dataf, dimfast, dimmid); + *w = dimfast; + *h = dimmid; + *pcbfh = cbfh; + return dataf; +} + + +static int read_cbf(struct imagefile *f, struct image *image) +{ + float *data; + int w, h; + cbf_handle cbfh; + + data = read_cbf_data(f, &w, &h, &cbfh); + if ( data == NULL ) { + ERROR("Failed to read CBF data\n"); + return 1; + } + + unpack_panels(image, data, w, h); free(data); - free(dataf); if ( image->beam != NULL ) { cbf_fill_in_beam_parameters(image->beam, f, image); @@ -753,122 +767,24 @@ static int read_cbf(struct imagefile *f, struct image *image) static int read_cbf_simple(struct imagefile *f, struct image *image) { + float *data; + int w, h; cbf_handle cbfh; - FILE *fh; - int r; - unsigned int compression; - int binary_id, minelement, maxelement, elsigned, elunsigned; - size_t elsize, elements, elread, dimfast, dimmid, dimslow, padding; - const char *byteorder; - void *data; - - if ( cbf_make_handle(&cbfh) ) { - ERROR("Failed to allocate CBF handle\n"); - return 1; - } - - fh = fopen(f->filename, "rb"); - if ( fh == NULL ) { - ERROR("Failed to open '%s'\n", f->filename); - return 1; - } - /* CBFlib calls fclose(fh) when it's ready */ - if ( cbf_read_widefile(cbfh, fh, 0) ) { - ERROR("Failed to read CBF file '%s'\n", f->filename); - cbf_free_handle(cbfh); - return 1; - } - - /* Select row 0 in data column inside array_data */ - cbf_find_category(cbfh, "array_data"); - cbf_find_column(cbfh, "data"); - cbf_select_row(cbfh, 0); - - /* Get parameters for array read */ - r = cbf_get_integerarrayparameters_wdims(cbfh, &compression, &binary_id, - &elsize, &elsigned, &elunsigned, - &elements, - &minelement, &maxelement, - &byteorder, - &dimfast, &dimmid, &dimslow, - &padding); - if ( r ) { - char *err = cbf_strerr(r); - ERROR("Failed to read CBF array parameters: %s\n", err); - free(err); - cbf_free_handle(cbfh); - return 1; - } - - if ( dimslow != 0 ) { - ERROR("CBF data array is 3D - don't know what to do with it\n"); - cbf_free_handle(cbfh); - return 1; - } - - if ( dimfast*dimmid*elsize > 10e9 ) { - ERROR("CBF data is far too big (%i x %i x %i bytes).\n", - (int)dimfast, (int)dimmid, (int)elsize); - cbf_free_handle(cbfh); - return 1; - } - - if ( (elsize != 4) && (elsize != 2) ) { - STATUS("Don't know what to do with element size %i\n", - (int)elsize); - cbf_free_handle(cbfh); - return 1; - } - - if ( !elsigned ) { - STATUS("Don't know what to do with unsigned data (yet)\n"); - cbf_free_handle(cbfh); - return 1; - } - - if ( strcmp(byteorder, "little_endian") != 0 ) { - STATUS("Don't know what to do with non-little-endian data\n"); - cbf_free_handle(cbfh); - return 1; - } - - data = malloc(elsize*dimfast*dimmid); + data = read_cbf_data(f, &w, &h, &cbfh); if ( data == NULL ) { - ERROR("Failed to allocate memory for CBF data\n"); - cbf_free_handle(cbfh); - return 1; - } - - r = cbf_get_integerarray(cbfh, &binary_id, data, elsize, 1, - elsize*dimfast*dimmid, &elread); - if ( r ) { - char *err = cbf_strerr(r); - ERROR("Failed to read CBF array: %s\n", err); - free(err); - cbf_free_handle(cbfh); + ERROR("Failed to read CBF data\n"); return 1; } - image->det = simple_geometry(image, dimfast, dimmid); + image->det = simple_geometry(image, w, h); image->dp = malloc(sizeof(float *)); if ( image->dp == NULL ) { ERROR("Failed to allocate dp array\n"); return 1; } - if ( elsize == 4 ) { - image->dp[0] = convert_sint32_float(data, dimfast, dimmid); - } - if ( elsize == 2 ) { - image->dp[0] = convert_sint16_float(data, dimfast, dimmid); - } - free(data); - - if ( image->dp[0] == NULL ) { - ERROR("Failed to allocate dp array\n"); - return 1; - } + image->dp[0] = data; if ( image->beam != NULL ) { cbf_fill_in_beam_parameters(image->beam, f, image); -- cgit v1.2.3