diff options
Diffstat (limited to 'libcrystfel/src/datatemplate_priv.h')
-rw-r--r-- | libcrystfel/src/datatemplate_priv.h | 239 |
1 files changed, 239 insertions, 0 deletions
diff --git a/libcrystfel/src/datatemplate_priv.h b/libcrystfel/src/datatemplate_priv.h new file mode 100644 index 00000000..71569273 --- /dev/null +++ b/libcrystfel/src/datatemplate_priv.h @@ -0,0 +1,239 @@ +/* + * 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 + +/* 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) + +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 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; +}; + + +/** + * 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; + /**@}*/ + + /** Location to get \ref cnz from, e.g. from HDF5 file */ + char *cnz_from; + + /** The offset to be applied from \ref clen */ + double cnz_offset; + + /** Mask definitions */ + struct mask_template masks[MAX_MASKS]; + + /** Location of per-pixel saturation map */ + char *satmap; + + /** Filename for saturation map */ + char *satmap_file; + + /** Mark entire panel as bad if set */ + int bad; + + /** Resolution in pixels per metre */ + double pixel_pitch; + + /** Number of detector intensity units per photon, or eV */ + double adu_scale; + enum adu_per_unit adu_scale_unit; + + /** Treat pixel as unreliable if higher than this */ + double max_adu; + + /** 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]; + + /** Location of data in file (possibly with placeholders) */ + char *data; + + /** Dimensions (see definitions for DIM_FS etc above) */ + signed int dims[MAX_DIMS]; + + /** \name Transformation matrix from pixel coordinates to lab frame */ + /*@{*/ + double fsx; + double fsy; + double fsz; + double ssx; + double ssy; + double ssz; + /*@}*/ + + /** \name Rail direction */ + /*@{*/ + double rail_x; + double rail_y; + double rail_z; + /*@}*/ + + /* Value of clen (without coffset) at which beam is centered */ + double clen_for_centering; + + /** \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 _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 rigid_group **rigid_groups; + int n_rigid_groups; + + struct rg_collection **rigid_group_collections; + int n_rg_collections; + + char *peak_list; + enum peak_layout peak_list_type; + + /* Shift of whole detector, in m */ + char *shift_x_from; + char *shift_y_from; +}; + +extern double convert_to_m(double val, int units); + +#endif /* DATATEMPLATE_PRIV_H */ |