aboutsummaryrefslogtreecommitdiff
path: root/libcrystfel/src/image.h
diff options
context:
space:
mode:
Diffstat (limited to 'libcrystfel/src/image.h')
-rw-r--r--libcrystfel/src/image.h184
1 files changed, 184 insertions, 0 deletions
diff --git a/libcrystfel/src/image.h b/libcrystfel/src/image.h
new file mode 100644
index 00000000..4d4ac2d7
--- /dev/null
+++ b/libcrystfel/src/image.h
@@ -0,0 +1,184 @@
+/*
+ * image.h
+ *
+ * Handle images and image features
+ *
+ * (c) 2006-2011 Thomas White <taw@physics.org>
+ *
+ * Part of CrystFEL - crystallography with a FEL
+ *
+ */
+
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#ifndef IMAGE_H
+#define IMAGE_H
+
+#include <stdint.h>
+#include <complex.h>
+#include <sys/types.h>
+
+#include "utils.h"
+#include "cell.h"
+#include "detector.h"
+#include "reflist.h"
+
+
+#define MAX_CELL_CANDIDATES (32)
+
+
+/* Structure describing a feature in an image */
+struct imagefeature {
+
+ struct image *parent;
+ double fs;
+ double ss;
+ double intensity;
+
+ /* Reciprocal space coordinates (m^-1 of course) of this feature */
+ double rx;
+ double ry;
+ double rz;
+
+ /* Internal use only */
+ int valid;
+
+ const char *name;
+};
+
+/* An opaque type representing a list of image features */
+typedef struct _imagefeaturelist ImageFeatureList;
+
+
+/**
+ * image:
+ *
+ * <programlisting>
+ * struct image
+ * {
+ * float *data;
+ * uint16_t *flags;
+ * double *twotheta;
+ *
+ * UnitCell *indexed_cell;
+ * UnitCell *candidate_cells[MAX_CELL_CANDIDATES];
+ * int ncells;
+
+ * struct detector *det;
+ * struct beam_params *beam;
+ * char *filename;
+ * const struct copy_hdf5_field *copyme;
+ *
+ * int id;
+ *
+ * double m;
+ *
+ * double lambda;
+ * double div;
+ * double bw;
+ * double i0;
+ * int i0_available;
+ * double osf;
+ * double profile_radius;
+ * int pr_dud;
+ *
+ * int width;
+ * int height;
+ *
+ * RefList *reflections;
+ *
+ * ImageFeatureList *features;
+ * };
+ * </programlisting>
+ *
+ * The field <structfield>data</structfield> contains the raw image data, if it
+ * is currently available. The data might be available throughout the
+ * processing of an experimental pattern, but it might not be available when
+ * simulating, scaling or merging patterns. Similarly,
+ * <structfield>flags</structfield> contains an array of the same dimensions
+ * as <structfield>data</structfield> to contain the bad pixel flags.
+ * <structfield>twotheta</structfield> likewise contains an array of 2*theta
+ * (scattering angle) values in radians, since these values are generated as a
+ * by-product of the scattering vector calculation and can be used later for
+ * calculating intensities from differential scattering cross sections.
+ *
+ * <structfield>candidate_cells</structfield> is an array of unit cells directly
+ * returned by the low-level indexing system. <structfield>ncells</structfield>
+ * is the number of candidate unit cells which were found. The maximum number
+ * of cells which may be returned is <function>MAX_CELL_CANDIDATES</function>.
+ * <structfield>indexed_cell</structfield> contains the "correct" unit cell
+ * after cell reduction or matching has been performed. The job of the cell
+ * reduction is to convert the list of candidate cells into a single indexed
+ * cell, or <function>NULL</function> on failure.
+ *
+ * <structfield>copyme</structfield> represents a list of HDF5 fields to copy
+ * to the output stream.
+ **/
+struct image;
+
+struct image {
+
+ float *data;
+ uint16_t *flags;
+ double *twotheta;
+
+ UnitCell *indexed_cell;
+ UnitCell *candidate_cells[MAX_CELL_CANDIDATES];
+ int ncells;
+
+ struct detector *det;
+ struct beam_params *beam; /* The nominal beam parameters */
+ char *filename;
+ const struct copy_hdf5_field *copyme;
+
+ int id; /* ID number of the thread
+ * handling this image */
+
+ /* Information about the crystal */
+ double m; /* Mosaicity in radians */
+
+ /* Per-shot radiation values */
+ double lambda; /* Wavelength in m */
+ double div; /* Divergence in radians */
+ double bw; /* Bandwidth as a fraction */
+ double i0; /* Incident intensity */
+ int i0_available; /* 0 if f0 wasn't available
+ * from the input. */
+ double osf; /* Overall scaling factor */
+ double profile_radius; /* Radius of reflection */
+ int pr_dud; /* Post refinement failed */
+
+ int width;
+ int height;
+
+ /* Integrated (or about-to-be-integrated) reflections */
+ RefList *reflections;
+
+ /* Detected peaks */
+ ImageFeatureList *features;
+
+};
+
+
+/* Feature lists */
+extern ImageFeatureList *image_feature_list_new(void);
+
+extern void image_feature_list_free(ImageFeatureList *flist);
+
+extern void image_add_feature(ImageFeatureList *flist, double x, double y,
+ struct image *parent, double intensity,
+ const char *name);
+
+extern void image_remove_feature(ImageFeatureList *flist, int idx);
+
+extern struct imagefeature *image_feature_closest(ImageFeatureList *flist,
+ double fs, double ss,
+ double *d, int *idx);
+
+extern int image_feature_count(ImageFeatureList *flist);
+extern struct imagefeature *image_get_feature(ImageFeatureList *flist, int idx);
+
+#endif /* IMAGE_H */