aboutsummaryrefslogtreecommitdiff
path: root/libcrystfel/src/datatemplate_priv.h
blob: ab40ac2f74402cb6bec02402afd930460106b171 (plain)
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
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
/*
 * datatemplate_priv.h
 *
 * Data template structure (private parts)
 *
 * Copyright © 2019-2021 Deutsches Elektronen-Synchrotron DESY,
 *                       a research centre of the Helmholtz Association.
 *
 * Authors:
 *   2019-2021 Thomas White <taw@physics.org>
 *
 * This file is part of CrystFEL.
 *
 * CrystFEL is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * CrystFEL is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with CrystFEL.  If not, see <http://www.gnu.org/licenses/>.
 *
 */

/* NB This file is NOT part of the public API, and should NOT
 * be installed, but rather stays in the libcrystfel source folder. */

#ifndef DATATEMPLATE_PRIV_H
#define DATATEMPLATE_PRIV_H

#include "detgeom.h"

/* Maximum number of dimensions expected in data files */
#define MAX_DIMS (16)

/* Maximum number of placeholders expected in path structure */
#define MAX_PATH_PARTS (16)

/* Maximum number of panel groups */
#define MAX_PANEL_GROUPS (256)

/* Maximum number of panel groups that can derive from one panel */
#define MAX_PANEL_GROUP_CHILDREN (64)

enum adu_per_unit
{
	ADU_PER_PHOTON,
	ADU_PER_EV
};


enum wavelength_unit
{
	WAVELENGTH_M,
	WAVELENGTH_A,
	WAVELENGTH_ELECTRON_KV,
	WAVELENGTH_ELECTRON_V,
	WAVELENGTH_PHOTON_KEV,
	WAVELENGTH_PHOTON_EV
};

#define MAX_FLAG_VALUES (16)

enum flag_value_type
{
	FLAG_NOTHING,
	FLAG_EQUAL,
	FLAG_MORETHAN,
	FLAG_LESSTHAN
};

enum peak_layout
{
	PEAK_LIST_AUTO,
	PEAK_LIST_CXI,
	PEAK_LIST_LIST3
};

/* Special values for dimension IDs */
#define DIM_FS (-1)
#define DIM_SS (-2)
#define DIM_UNDEFINED (-3)
#define DIM_PLACEHOLDER (-4)

/* Maximum number of headers to cache, in addition to anything already
 * referenced by the DataTemplate */
#define MAX_COPY_HEADERS (32)

/* Maximum number of masks per panel */
#define MAX_MASKS (8)

struct mask_template
{
	/** Location of mask data */
	char *data_location;

	/** Filename for mask data */
	char *filename;

	/** Bit mask for bad pixels
	 * (pixel is bad if any of these are set) */
	unsigned int bad_bits;

	/** Bit mask for good pixels
	 * (pixel cannot be good unless all of these are set) */
	unsigned int good_bits;

	/** If non-zero, this mask came from the top level */
	int mask_default;
};


/**
 * Represents one panel of a detector
 */
struct panel_template
{
	/** Text name for panel */
	char *name;

	/** \name Location of corner in units of the pixel size of this panel */
	/**@{*/
	double cnx;
	double cny;
	/**@}*/

	/** The offset to be applied from clen */
	double cnz_offset;
	int cnz_offset_default;

	/** Mask definitions */
	struct mask_template masks[MAX_MASKS];

	/** Location of per-pixel saturation map */
	char *satmap;
	int satmap_default;

	/** Filename for saturation map */
	char *satmap_file;
	int satmap_file_default;

	/** Mark entire panel as bad if set */
	int bad;

	/** Mark this number of edge rows as bad */
	int mask_edge_pixels;
	int mask_edge_pixels_default;

	/** Pixel size in metres */
	double pixel_pitch;
	int pixel_pitch_default;

	/** Number of detector intensity units per photon, or eV */
	double adu_scale;
	enum adu_per_unit adu_scale_unit;
	int adu_scale_default;

	/** Treat pixel as unreliable if higher than this */
	double max_adu;
	int max_adu_default;

	/** Pixels with exactly this value will be marked as bad */
	enum flag_value_type flag_types[MAX_FLAG_VALUES];
	signed int flag_values[MAX_FLAG_VALUES];
	int flag_values_default;

	/** Location of data in file (possibly with placeholders) */
	char *data;
	int data_default;

	/** Dimensions (see definitions for DIM_FS etc above) */
	signed int dims[MAX_DIMS];
	int dims_default[MAX_DIMS];

	/** \name Transformation matrix from pixel coordinates to lab frame */
	/*@{*/
	double fsx;
	double fsy;
	double fsz;
	double ssx;
	double ssy;
	double ssz;
	/*@}*/

	/** \name Position of the panel in the data block in the file. */
	/*@{*/
	int orig_min_fs;
	int orig_max_fs;
	int orig_min_ss;
	int orig_max_ss;
	/*@}*/
};


#define PANEL_WIDTH(p) ((p)->orig_max_fs - (p)->orig_min_fs + 1)
#define PANEL_HEIGHT(p) ((p)->orig_max_ss - (p)->orig_min_ss + 1)


struct dt_badregion
{
	char name[1024];
	int is_fsss;

	double min_x;
	double max_x;
	double min_y;
	double max_y;

	/* Coordinates are specified INCLUSIVELY */
	int      panel_number;
	char    *panel_name;
	int      min_fs;
	int      max_fs;
	int      min_ss;
	int      max_ss;

};


struct panel_group_template
{
	char *name;
	int n_children;
	struct panel_group_template *children[MAX_PANEL_GROUP_CHILDREN];
};


struct _datatemplate
{
	struct panel_template     *panels;
	int                        n_panels;

	struct dt_badregion       *bad;
	int                        n_bad;

	char                      *wavelength_from;
	enum wavelength_unit       wavelength_unit;

	double                     bandwidth;

	struct panel_group_template *groups[MAX_PANEL_GROUPS];
	int                          n_groups;

	char                      *peak_list;
	enum peak_layout           peak_list_type;

	/* Shift of whole detector, in m */
	char                      *shift_x_from;
	char                      *shift_y_from;

	/** Location to get detector z from, e.g. from HDF5 file */
	char                      *cnz_from;

	char                      *headers_to_copy[MAX_COPY_HEADERS];
	int                        n_headers_to_copy;
};

extern double convert_to_m(double val, int units);
extern struct detgeom *create_detgeom(struct image *image,
                                      const DataTemplate *dtempl,
                                      int two_d_only);

#endif	/* DATATEMPLATE_PRIV_H */