aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libcrystfel/src/image.c4
-rw-r--r--libcrystfel/src/image.h2
-rw-r--r--src/im-asapo.c3
-rw-r--r--src/im-asapo.h5
-rw-r--r--src/im-sandbox.c29
-rw-r--r--src/process_image.c33
-rw-r--r--src/process_image.h5
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;
};