diff options
author | Thomas White <taw@physics.org> | 2022-05-03 15:28:46 +0200 |
---|---|---|
committer | Thomas White <taw@physics.org> | 2022-06-02 12:15:38 +0200 |
commit | 992e25b007f8a418fd7860cc34a441932cdf023c (patch) | |
tree | b949c905232ece7bbce237eacde6b4834d4a08e4 | |
parent | 7cae8ed0e420173b17aec11329411d4284de32cd (diff) |
indexamajig: Track metadata (e.g. for ASAP::O)
-rw-r--r-- | libcrystfel/src/image.c | 4 | ||||
-rw-r--r-- | libcrystfel/src/image.h | 2 | ||||
-rw-r--r-- | src/im-asapo.c | 3 | ||||
-rw-r--r-- | src/im-asapo.h | 5 | ||||
-rw-r--r-- | src/im-sandbox.c | 29 | ||||
-rw-r--r-- | src/process_image.c | 33 | ||||
-rw-r--r-- | src/process_image.h | 5 |
7 files changed, 61 insertions, 20 deletions
diff --git a/libcrystfel/src/image.c b/libcrystfel/src/image.c index 1bad7d00..10c05525 100644 --- a/libcrystfel/src/image.c +++ b/libcrystfel/src/image.c @@ -1385,6 +1385,7 @@ struct image *image_read(const DataTemplate *dtempl, struct image *image_read_data_block(const DataTemplate *dtempl, void *data_block, size_t data_block_size, + char *meta_data, DataSourceType type, int serial, int no_image_data, @@ -1407,6 +1408,7 @@ struct image *image_read_data_block(const DataTemplate *dtempl, image->ev = NULL; image->data_block = data_block; image->data_block_size = data_block_size; + image->meta_data = meta_data; image->data_source_type = type; @@ -1431,6 +1433,7 @@ void image_free(struct image *image) free(image->filename); free(image->ev); free(image->data_block); + free(image->meta_data); if ( image->detgeom != NULL ) { np = image->detgeom->n_panels; @@ -1476,6 +1479,7 @@ struct image *image_new() image->ev = NULL; image->data_block = NULL; image->data_block_size = 0; + image->meta_data = NULL; image->data_source_type = DATA_SOURCE_TYPE_UNKNOWN; image->n_cached_headers = 0; diff --git a/libcrystfel/src/image.h b/libcrystfel/src/image.h index 3746e115..6c7e2a50 100644 --- a/libcrystfel/src/image.h +++ b/libcrystfel/src/image.h @@ -148,6 +148,7 @@ struct image * filenename/ev OR this should be filled in, but not both */ void *data_block; size_t data_block_size; + char *meta_data; /** A list of metadata read from the stream */ struct header_cache_entry *header_cache[HEADER_CACHE_SIZE]; @@ -225,6 +226,7 @@ extern struct image *image_create_for_simulation(const DataTemplate *dtempl); extern struct image *image_read_data_block(const DataTemplate *dtempl, void *data_block, size_t data_block_size, + char *meta_data, DataSourceType type, int serial, int no_image_data, diff --git a/src/im-asapo.c b/src/im-asapo.c index 48a32ee4..a095c82e 100644 --- a/src/im-asapo.c +++ b/src/im-asapo.c @@ -244,7 +244,7 @@ static void skip_to_stream_end(struct im_asapo *a) void *im_asapo_fetch(struct im_asapo *a, size_t *pdata_size, - char **pfilename, char **pevent) + char **pmeta, char **pfilename, char **pevent) { void *data_copy; AsapoMessageMetaHandle meta; @@ -295,6 +295,7 @@ void *im_asapo_fetch(struct im_asapo *a, size_t *pdata_size, } memcpy(data_copy, asapo_message_data_get_as_chars(data), msg_size); + *pmeta = strdup(asapo_message_meta_get_metadata(meta)); *pfilename = strdup(asapo_message_meta_get_name(meta)); *pevent = strdup("//"); diff --git a/src/im-asapo.h b/src/im-asapo.h index 26546a88..719b5bf1 100644 --- a/src/im-asapo.h +++ b/src/im-asapo.h @@ -45,7 +45,7 @@ extern struct im_asapo *im_asapo_connect(const char *endpoint, extern void im_asapo_shutdown(struct im_asapo *a); extern void *im_asapo_fetch(struct im_asapo *a, size_t *pdata_size, - char **pfilename, char **pevent); + char **pmeta, char **pfilename, char **pevent); extern char *im_asapo_make_unique_group_id(const char *endpoint, const char *token); @@ -66,9 +66,10 @@ static UNUSED void im_asapo_shutdown(struct im_asapo *a) } static UNUSED void *im_asapo_fetch(struct im_asapo *a, size_t *psize, - char **pfilename, char **pevent) + char **pmeta, char **pfilename, char **pevent) { *psize = 0; + *pmeta = NULL; *pfilename = NULL; *pevent = NULL; return NULL; diff --git a/src/im-sandbox.c b/src/im-sandbox.c index 6e4b7fcd..8137db9e 100644 --- a/src/im-sandbox.c +++ b/src/im-sandbox.c @@ -456,6 +456,13 @@ static int run_work(const struct index_args *iargs, Stream *st, free(line); ok = 0; + /* Default values */ + pargs.zmq_data = NULL; + pargs.zmq_data_size = 0; + pargs.asapo_data = NULL; + pargs.asapo_data_size = 0; + pargs.asapo_meta = NULL; + if ( sb->zmq ) { do { @@ -474,15 +481,14 @@ static int run_work(const struct index_args *iargs, Stream *st, char *filename; char *event; - /* Temporary (?) abuse of "zmq_data", even though - * data comes via ASAP::O */ profile_start("asapo-fetch"); - pargs.zmq_data = im_asapo_fetch(asapostuff, - &pargs.zmq_data_size, - &filename, - &event); + pargs.asapo_data = im_asapo_fetch(asapostuff, + &pargs.asapo_data_size, + &pargs.asapo_meta, + &filename, + &event); profile_end("asapo-fetch"); - if ( pargs.zmq_data != NULL ) { + if ( pargs.asapo_data != NULL ) { ok = 1; /* ASAP::O provides a meaningful filename, which @@ -494,8 +500,6 @@ static int run_work(const struct index_args *iargs, Stream *st, } } else { - pargs.zmq_data = NULL; - pargs.zmq_data_size = 0; ok = 1; } @@ -507,9 +511,10 @@ static int run_work(const struct index_args *iargs, Stream *st, profile_end("process-image"); } - /* pargs.zmq_data will be copied into the image structure, so - * that it can be queried for "header" values etc. It will - * eventually be freed by image_free() under process_image() */ + /* NB pargs.zmq_data, pargs.asapo_data and pargs.asapo_meta + * will be copied into the image structure, so + * that it can be queried for "header" values etc. They will + * eventually be freed by image_free() under process_image(). */ if ( sb->profile ) { profile_print_and_reset(); diff --git a/src/process_image.c b/src/process_image.c index 71be87cc..de2d8792 100644 --- a/src/process_image.c +++ b/src/process_image.c @@ -188,22 +188,45 @@ void process_image(const struct index_args *iargs, struct pattern_args *pargs, int any_crystals; if ( pargs->zmq_data != NULL ) { - set_last_task(last_task, "unpacking messagepack object"); - profile_start("read-data-block"); + + set_last_task(last_task, "unpacking ZMQ data"); + profile_start("read-zmq-data"); image = image_read_data_block(iargs->dtempl, pargs->zmq_data, pargs->zmq_data_size, + NULL, + iargs->data_format, + serial, + iargs->no_image_data, + iargs->no_mask_data); + profile_end("read-zmq-data"); + if ( image == NULL ) return; + + /* image_read_data_block() will leave the filename/event as + * NULL, because there's no file (duh). Fill them in now with + * the values passed down to us. For ZMQ, these values are just + * placeholders. */ + image->filename = strdup(pargs->filename); + image->ev = strdup(pargs->event); + + } else if ( pargs->asapo_data != NULL ) { + + set_last_task(last_task, "unpacking ASAP::O data"); + profile_start("read-asapo-data"); + image = image_read_data_block(iargs->dtempl, + pargs->asapo_data, + pargs->asapo_data_size, + pargs->asapo_meta, iargs->data_format, serial, iargs->no_image_data, iargs->no_mask_data); - profile_end("read-data-block"); + profile_end("read-asapo-data"); if ( image == NULL ) return; /* image_read_data_block() will leave the filename/event as * NULL, because there's no file (duh). Fill them in now with - * the values passed down to us. These values might be - * meaningful (e.g. ASAP::O), or just placeholders. */ + * the values passed down to us from ASAP::O. */ image->filename = strdup(pargs->filename); image->ev = strdup(pargs->event); diff --git a/src/process_image.h b/src/process_image.h index cbf2713b..5e12ff29 100644 --- a/src/process_image.h +++ b/src/process_image.h @@ -119,8 +119,13 @@ struct pattern_args /* "Input" */ char *filename; char *event; + void *zmq_data; size_t zmq_data_size; + + char *asapo_data; + size_t asapo_data_size; + char *asapo_meta; }; |