1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
|
/*
* image.h
*
* Handle images and image features
*
* (c) 2006-2009 Thomas White <thomas.white@desy.de>
*
* template_index - Indexing diffraction patterns by template matching
*
*/
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
#ifndef IMAGE_H
#define IMAGE_H
#include <stdint.h>
typedef enum {
FORMULATION_CLEN,
FORMULATION_PIXELSIZE
} FormulationMode;
typedef struct imagefeature_struct {
struct image *parent;
double x;
double y;
double intensity;
/* Partner for this feature (in another feature list) or NULL */
struct imagefeature_struct *partner;
/* Distance between this feature and its partner, if any. */
double partner_d;
/* The reflection this was projected from, if any */
struct reflection_struct *reflection;
} ImageFeature;
typedef struct {
ImageFeature *features;
int n_features;
} ImageFeatureList;
struct image {
uint16_t *data;
/* Radians. Defines where the pattern lies in reciprocal space */
double tilt;
/* Radians. Defines where the pattern lies in reciprocal space */
double omega;
/* Image parameters can be given as camera length or pixel size.
* If FORMULATION_CLEN, then camera_len and resolution must be given.
* If FORMULATION_PIXELSIZE, then pixel_size only is needed.*/
FormulationMode fmode;
double pixel_size;
double camera_len;
double resolution; /* pixels per metre */
/* Wavelength must always be given */
double lambda;
int width;
int height;
double x_centre;
double y_centre;
ImageFeatureList *features; /* "Experimental" features */
ImageFeatureList *rflist; /* "Predicted" features */
};
typedef struct imagelist_struct {
int n_images;
struct image *images;
} ImageList;
extern ImageList *image_list_new(void);
extern int image_add(ImageList *list, struct image *image);
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);
extern void image_add_feature_reflection(ImageFeatureList *flist,
double x, double y,
struct image *parent,
double intensity);
extern ImageFeature *image_feature_closest(ImageFeatureList *flist,
double x, double y, double *d,
int *idx);
extern ImageFeature *image_feature_second_closest(ImageFeatureList *flist,
double x, double y, double *d,
int *idx);
#endif /* IMAGE_H */
|