diff options
Diffstat (limited to 'src/process_image.c')
-rw-r--r-- | src/process_image.c | 306 |
1 files changed, 114 insertions, 192 deletions
diff --git a/src/process_image.c b/src/process_image.c index b785705a..d3355f38 100644 --- a/src/process_image.c +++ b/src/process_image.c @@ -3,11 +3,11 @@ * * The processing pipeline for one image * - * Copyright © 2012-2020 Deutsches Elektronen-Synchrotron DESY, + * Copyright © 2012-2021 Deutsches Elektronen-Synchrotron DESY, * a research centre of the Helmholtz Association. * * Authors: - * 2010-2019 Thomas White <taw@physics.org> + * 2010-2020 Thomas White <taw@physics.org> * 2014-2017 Valerio Mariani <valerio.mariani@desy.de> * 2017 Stijn de Graaf * @@ -33,32 +33,31 @@ #endif #include <stdlib.h> -#include <hdf5.h> #include <gsl/gsl_errno.h> #include <gsl/gsl_statistics_double.h> #include <gsl/gsl_sort.h> #include <unistd.h> #include <sys/stat.h> -#include "utils.h" -#include "hdf5-file.h" -#include "index.h" -#include "peaks.h" -#include "detector.h" -#include "filters.h" -#include "thread-pool.h" -#include "geometry.h" -#include "stream.h" -#include "reflist-utils.h" +#include <utils.h> +#include <index.h> +#include <peaks.h> +#include <filters.h> +#include <thread-pool.h> +#include <geometry.h> +#include <stream.h> +#include <reflist-utils.h> +#include <integration.h> +#include <detgeom.h> +#include <image-msgpack.h> + #include "process_image.h" -#include "integration.h" #include "predict-refine.h" #include "im-sandbox.h" -#include "time-accounts.h" #include "im-zmq.h" +#include "time-accounts.h" - -static float **backup_image_data(float **dp, struct detector *det) +static float **backup_image_data(float **dp, struct detgeom *det) { float **bu; int i; @@ -86,7 +85,7 @@ static float **backup_image_data(float **dp, struct detector *det) } -static void restore_image_data(float **dp, struct detector *det, float **bu) +static void restore_image_data(float **dp, struct detgeom *det, float **bu) { int i; @@ -100,16 +99,22 @@ static void restore_image_data(float **dp, struct detector *det, float **bu) } -static int file_wait_open_read(struct sb_shm *sb_shared, struct image *image, - TimeAccounts *taccs, char *last_task, - signed int wait_for_file, int cookie, - struct imagefile **pimfile) +static struct image *file_wait_open_read(const char *filename, + const char *event, + DataTemplate *dtempl, + struct sb_shm *sb_shared, + TimeAccounts *taccs, + char *last_task, + signed int wait_for_file, + int cookie, + int no_image_data, + int no_mask_data) { signed int file_wait_time = wait_for_file; int wait_message_done = 0; int read_retry_done = 0; int r; - struct imagefile *imfile; + struct image *image; time_accounts_set(taccs, TACC_WAITFILE); set_last_task(last_task, "wait for file"); @@ -119,14 +124,14 @@ static int file_wait_open_read(struct sb_shm *sb_shared, struct image *image, struct stat statbuf; sb_shared->pings[cookie]++; - r = stat(image->filename, &statbuf); + r = stat(filename, &statbuf); if ( r ) { if ( (wait_for_file != 0) && (file_wait_time != 0) ) { if ( !wait_message_done ) { STATUS("Waiting for '%s'\n", - image->filename); + filename); wait_message_done = 1; } @@ -138,8 +143,8 @@ static int file_wait_open_read(struct sb_shm *sb_shared, struct image *image, } - ERROR("File %s not found\n", image->filename); - return 1; + ERROR("File %s not found\n", filename); + return NULL; } } while ( r ); @@ -149,44 +154,29 @@ static int file_wait_open_read(struct sb_shm *sb_shared, struct image *image, sb_shared->pings[cookie]++; do { - imfile = imagefile_open(image->filename); - if ( imfile == NULL ) { - if ( wait_for_file && !read_retry_done ) { - read_retry_done = 1; - r = 1; - STATUS("File '%s' exists but could not be opened." - " Trying again after 10 seconds.\n", - image->filename); - sleep(10); - continue; - } - ERROR("Couldn't open file: %s\n", image->filename); - return 1; - } time_accounts_set(taccs, TACC_HDF5READ); set_last_task(last_task, "read file"); sb_shared->pings[cookie]++; - r = imagefile_read(imfile, image, image->event); - if ( r ) { + image = image_read(dtempl, filename, event, + no_image_data, no_mask_data); + if ( image == NULL ) { if ( wait_for_file && !read_retry_done ) { read_retry_done = 1; - imagefile_close(imfile); STATUS("File '%s' exists but could not be read." " Trying again after 10 seconds.\n", - image->filename); + filename); sleep(10); continue; } - ERROR("Couldn't open file: %s\n", image->filename); - return 1; + ERROR("Couldn't open file: %s\n", filename); + return NULL; } } while ( r ); - *pimfile = imfile; - return 0; + return image; } @@ -195,8 +185,7 @@ void process_image(const struct index_args *iargs, struct pattern_args *pargs, int serial, struct sb_shm *sb_shared, TimeAccounts *taccs, char *last_task) { - struct imagefile *imfile = NULL; - struct image image; + struct image *image; int i; int r; int ret; @@ -204,27 +193,21 @@ void process_image(const struct index_args *iargs, struct pattern_args *pargs, float **prefilter; int any_crystals; - image.features = NULL; - image.copyme = iargs->copyme; - image.id = cookie; - image.beam = iargs->beam; - image.det = copy_geom(iargs->det); - image.crystals = NULL; - image.n_crystals = 0; - image.serial = serial; - image.indexed_by = INDEXING_NONE; - - image.filename = pargs->filename_p_e->filename; - image.event = pargs->filename_p_e->ev; if ( pargs->msgpack_obj != NULL ) { set_last_task(last_task, "unpacking messagepack object"); - if ( unpack_msgpack_data(pargs->msgpack_obj, &image, - iargs->no_image_data) ) return; + image = image_msgpack_read(iargs->dtempl, + pargs->msgpack_obj, + iargs->no_image_data); + if ( image == NULL ) return; } else { - if ( file_wait_open_read(sb_shared, &image, taccs, last_task, - iargs->wait_for_file, cookie, - &imfile) ) - { + image = file_wait_open_read(pargs->filename, pargs->event, + iargs->dtempl, + sb_shared, taccs, last_task, + iargs->wait_for_file, + cookie, + iargs->no_image_data, + iargs->no_mask_data); + if ( image == NULL ) { if ( iargs->wait_for_file != 0 ) { pthread_mutex_lock(&sb_shared->totals_lock); sb_shared->should_shutdown = 1; @@ -234,62 +217,43 @@ void process_image(const struct index_args *iargs, struct pattern_args *pargs, } } - image.bw = iargs->beam->bandwidth; + image->serial = serial; /* Take snapshot of image before applying horrible noise filters */ time_accounts_set(taccs, TACC_FILTER); set_last_task(last_task, "image filter"); sb_shared->pings[cookie]++; - prefilter = backup_image_data(image.dp, image.det); + prefilter = backup_image_data(image->dp, image->detgeom); if ( iargs->median_filter > 0 ) { - filter_median(&image, iargs->median_filter); + filter_median(image, iargs->median_filter); } if ( iargs->noisefilter ) { - filter_noise(&image); + filter_noise(image); } time_accounts_set(taccs, TACC_RESRANGE); set_last_task(last_task, "resolution range"); sb_shared->pings[cookie]++; - mark_resolution_range_as_bad(&image, iargs->highres, +INFINITY); + mark_resolution_range_as_bad(image, iargs->highres, +INFINITY); time_accounts_set(taccs, TACC_PEAKSEARCH); sb_shared->pings[cookie]++; switch ( iargs->peaks ) { - struct hdfile *hdfile; - case PEAK_HDF5: - set_last_task(last_task, "peaksearch:hdf5"); - hdfile = imagefile_get_hdfile(imfile); - if ( (hdfile == NULL) - || (get_peaks_2(&image, hdfile, iargs->hdf5_peak_path, - iargs->half_pixel_shift)) ) - { - ERROR("Failed to get peaks from HDF5 file.\n"); - } - if ( !iargs->no_revalidate ) { - validate_peaks(&image, iargs->min_snr, - iargs->pk_inn, iargs->pk_mid, - iargs->pk_out, iargs->use_saturated, - iargs->check_hdf5_snr); - } - break; - case PEAK_CXI: - set_last_task(last_task, "peaksearch:cxi"); - hdfile = imagefile_get_hdfile(imfile); - if ( (hdfile == NULL) - || (get_peaks_cxi_2(&image, hdfile, iargs->hdf5_peak_path, - pargs->filename_p_e, - iargs->half_pixel_shift)) ) - { - ERROR("Failed to get peaks from CXI file.\n"); + set_last_task(last_task, "peaksearch:hdf5orcxi"); + image->features = image_read_peaks(iargs->dtempl, + pargs->filename, + pargs->event, + iargs->half_pixel_shift); + if ( image->features == NULL ) { + ERROR("Failed to get peaks from HDF5 file.\n"); } if ( !iargs->no_revalidate ) { - validate_peaks(&image, iargs->min_snr, + validate_peaks(image, iargs->min_snr, iargs->pk_inn, iargs->pk_mid, iargs->pk_out, iargs->use_saturated, iargs->check_hdf5_snr); @@ -298,7 +262,7 @@ void process_image(const struct index_args *iargs, struct pattern_args *pargs, case PEAK_ZAEF: set_last_task(last_task, "peaksearch:zaef"); - search_peaks(&image, iargs->threshold, + search_peaks(image, iargs->threshold, iargs->min_sq_gradient, iargs->min_snr, iargs->pk_inn, iargs->pk_mid, iargs->pk_out, iargs->use_saturated); @@ -306,30 +270,24 @@ void process_image(const struct index_args *iargs, struct pattern_args *pargs, case PEAK_PEAKFINDER8: set_last_task(last_task, "peaksearch:pf8"); - if ( search_peaks_peakfinder8(&image, 2048, - iargs->threshold, - iargs->min_snr, - iargs->min_pix_count, - iargs->max_pix_count, - iargs->local_bg_radius, - iargs->min_res, - iargs->max_res, - iargs->use_saturated) ) { - if ( image.event != NULL ) { - ERROR("Failed to find peaks in image %s" - "(event %s).\n", image.filename, - get_event_string(image.event)); - } else { - ERROR("Failed to find peaks in image %s.", - image.filename); - } - + if ( search_peaks_peakfinder8(image, 2048, + iargs->threshold, + iargs->min_snr, + iargs->min_pix_count, + iargs->max_pix_count, + iargs->local_bg_radius, + iargs->min_res, + iargs->max_res, + iargs->use_saturated) ) { + ERROR("Failed to find peaks in image %s" + "(event %s).\n", + image->filename, image->ev); } break; case PEAK_PEAKFINDER9: set_last_task(last_task, "peaksearch:pf9"); - if ( search_peaks_peakfinder9(&image, + if ( search_peaks_peakfinder9(image, iargs->min_snr_biggest_pix, iargs->min_snr_peak_pix, iargs->min_snr, @@ -337,31 +295,29 @@ void process_image(const struct index_args *iargs, struct pattern_args *pargs, iargs->min_peak_over_neighbour, iargs->local_bg_radius) ) { - if ( image.event != NULL ) { - ERROR("Failed to find peaks in image %s" - "(event %s).\n", image.filename, - get_event_string(image.event)); - } else { - ERROR("Failed to find peaks in image %s.", - image.filename); - } + ERROR("Failed to find peaks in image %s" + "(event %s).\n", + image->filename, image->ev); } break; case PEAK_MSGPACK: - get_peaks_msgpack(pargs->msgpack_obj, &image, - iargs->half_pixel_shift); + image->features = image_msgpack_read_peaks(iargs->dtempl, + pargs->msgpack_obj, + iargs->half_pixel_shift); break; case PEAK_NONE: + case PEAK_ERROR: break; } - image.peak_resolution = estimate_peak_resolution(image.features, - image.lambda); + image->peak_resolution = estimate_peak_resolution(image->features, + image->lambda, + image->detgeom); - restore_image_data(image.dp, image.det, prefilter); + restore_image_data(image->dp, image->detgeom, prefilter); rn = getcwd(NULL, 0); @@ -369,33 +325,24 @@ void process_image(const struct index_args *iargs, struct pattern_args *pargs, if ( r ) { ERROR("Failed to chdir to temporary folder: %s\n", strerror(errno)); - imagefile_close(imfile); return; } /* Set beam parameters */ if ( iargs->fix_divergence >= 0.0 ) { - image.div = iargs->fix_divergence; + image->div = iargs->fix_divergence; } else { - image.div = 0.0; - } - /* Set beam spectrum */ - if ( iargs->spectrum != NULL ) { - image.spectrum = iargs->spectrum; - } else { - image.spectrum = spectrum_generate_gaussian(image.lambda, - image.bw); + image->div = 0.0; } - if ( image_feature_count(image.features) < iargs->min_peaks ) { + if ( image_feature_count(image->features) < iargs->min_peaks ) { r = chdir(rn); if ( r ) { ERROR("Failed to chdir: %s\n", strerror(errno)); - imagefile_close(imfile); return; } free(rn); - image.hit = 0; + image->hit = 0; if ( iargs->stream_nonhits ) { goto streamwrite; @@ -403,18 +350,17 @@ void process_image(const struct index_args *iargs, struct pattern_args *pargs, goto out; } } - image.hit = 1; + image->hit = 1; /* Index the pattern */ time_accounts_set(taccs, TACC_INDEXING); set_last_task(last_task, "indexing"); - index_pattern_3(&image, iargs->ipriv, &sb_shared->pings[cookie], + index_pattern_3(image, iargs->ipriv, &sb_shared->pings[cookie], last_task); r = chdir(rn); if ( r ) { ERROR("Failed to chdir: %s\n", strerror(errno)); - imagefile_close(imfile); return; } free(rn); @@ -423,22 +369,22 @@ void process_image(const struct index_args *iargs, struct pattern_args *pargs, time_accounts_set(taccs, TACC_PREDPARAMS); set_last_task(last_task, "prediction params"); if ( iargs->fix_profile_r >= 0.0 ) { - for ( i=0; i<image.n_crystals; i++ ) { - crystal_set_profile_radius(image.crystals[i], + for ( i=0; i<image->n_crystals; i++ ) { + crystal_set_profile_radius(image->crystals[i], iargs->fix_profile_r); - crystal_set_mosaicity(image.crystals[i], 0.0); + crystal_set_mosaicity(image->crystals[i], 0.0); } } else { - for ( i=0; i<image.n_crystals; i++ ) { - crystal_set_profile_radius(image.crystals[i], 0.02e9); - crystal_set_mosaicity(image.crystals[i], 0.0); + for ( i=0; i<image->n_crystals; i++ ) { + crystal_set_profile_radius(image->crystals[i], 0.02e9); + crystal_set_mosaicity(image->crystals[i], 0.0); } } if ( iargs->fix_profile_r < 0.0 ) { - for ( i=0; i<image.n_crystals; i++ ) { - if ( refine_radius(image.crystals[i], &image) ) { + for ( i=0; i<image->n_crystals; i++ ) { + if ( refine_radius(image->crystals[i], image) ) { ERROR("WARNING: Radius determination failed\n"); } } @@ -448,7 +394,7 @@ void process_image(const struct index_args *iargs, struct pattern_args *pargs, time_accounts_set(taccs, TACC_INTEGRATION); set_last_task(last_task, "integration"); sb_shared->pings[cookie]++; - integrate_all_5(&image, iargs->int_meth, PMODEL_XSPHERE, + integrate_all_5(image, iargs->int_meth, PMODEL_XSPHERE, iargs->push_res, iargs->ir_inn, iargs->ir_mid, iargs->ir_out, iargs->int_diag, iargs->int_diag_h, @@ -459,21 +405,18 @@ streamwrite: time_accounts_set(taccs, TACC_WRITESTREAM); set_last_task(last_task, "stream write"); sb_shared->pings[cookie]++; - ret = write_chunk(st, &image, imfile, - iargs->stream_peaks, iargs->stream_refls, - pargs->filename_p_e->ev); + ret = stream_write_chunk(st, image, iargs->stream_flags); if ( ret != 0 ) { ERROR("Error writing stream file.\n"); } int n = 0; - for ( i=0; i<image.n_crystals; i++ ) { - n += crystal_get_num_implausible_reflections(image.crystals[i]); + for ( i=0; i<image->n_crystals; i++ ) { + n += crystal_get_num_implausible_reflections(image->crystals[i]); } if ( n > 0 ) { STATUS("WARNING: %i implausibly negative reflection%s in %s " - "%s\n", n, n>1?"s":"", image.filename, - get_event_string(image.event)); + "%s\n", n, n>1?"s":"", image->filename, image->ev); } out: @@ -483,40 +426,19 @@ out: sb_shared->pings[cookie]++; pthread_mutex_lock(&sb_shared->totals_lock); any_crystals = 0; - for ( i=0; i<image.n_crystals; i++ ) { - if ( crystal_get_user_flag(image.crystals[i]) == 0 ) { + for ( i=0; i<image->n_crystals; i++ ) { + if ( crystal_get_user_flag(image->crystals[i]) == 0 ) { sb_shared->n_crystals++; any_crystals = 1; } } sb_shared->n_processed++; - sb_shared->n_hits += image.hit; + sb_shared->n_hits += image->hit; sb_shared->n_hadcrystals += any_crystals; pthread_mutex_unlock(&sb_shared->totals_lock); - for ( i=0; i<image.n_crystals; i++ ) { - cell_free(crystal_get_cell(image.crystals[i])); - reflist_free(crystal_get_reflections(image.crystals[i])); - crystal_free(image.crystals[i]); - } - free(image.crystals); - - /* Free spectrum only if we generated it for this image */ - if ( iargs->spectrum == NULL ) { - spectrum_free(image.spectrum); - } - - for ( i=0; i<image.det->n_panels; i++ ) { - free(image.dp[i]); - free(image.bad[i]); - free(image.sat[i]); - } - free(image.dp); - free(image.bad); - free(image.sat); + /* Free image (including detgeom) */ + image_free(image); - image_feature_list_free(image.features); - free_detector_geometry(image.det); - if ( imfile != NULL ) imagefile_close(imfile); set_last_task(last_task, "sandbox"); } |