aboutsummaryrefslogtreecommitdiff
path: root/libcrystfel/src/detgeom.h
diff options
context:
space:
mode:
Diffstat (limited to 'libcrystfel/src/detgeom.h')
-rw-r--r--libcrystfel/src/detgeom.h275
1 files changed, 275 insertions, 0 deletions
diff --git a/libcrystfel/src/detgeom.h b/libcrystfel/src/detgeom.h
new file mode 100644
index 00000000..6b487c43
--- /dev/null
+++ b/libcrystfel/src/detgeom.h
@@ -0,0 +1,275 @@
+/*
+ * detector.h
+ *
+ * Detector properties
+ *
+ * Copyright © 2012-2020 Deutsches Elektronen-Synchrotron DESY,
+ * a research centre of the Helmholtz Association.
+ * Copyright © 2012 Richard Kirian
+ *
+ * Authors:
+ * 2009-2019 Thomas White <taw@physics.org>
+ * 2011-2012 Richard Kirian <rkirian@asu.edu>
+ * 2014 Valerio Mariani
+ * 2011 Andrew Aquila
+ *
+ * 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/>.
+ *
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#ifndef DETECTOR_H
+#define DETECTOR_H
+
+struct rigid_group;
+struct rg_collection;
+struct detector;
+struct panel;
+struct badregion;
+struct beam_params;
+struct hdfile;
+struct event;
+
+#include "hdf5-file.h"
+#include "image.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * \file detector.h
+ * Detector geometry structure and related functions.
+ */
+
+
+struct rigid_group
+{
+ char *name;
+ struct panel **panels;
+ int n_panels;
+};
+
+
+struct rg_collection
+{
+ char *name;
+ struct rigid_group **rigid_groups;
+ int n_rigid_groups;
+};
+
+
+/**
+ * Represents one panel of a detector
+ */
+struct panel
+{
+ /** Text name for panel */
+ const char *name;
+
+ /** \name Location of corner in units of the pixel size of this panel, \
+ * measured from the interaction point. */
+ /**@{*/
+ double cnx;
+ double cny;
+ double cnz;
+ /**@}*/
+
+ /** Pixel size in metres */
+ double pixel_pitch;
+
+ /** Readout direction (for filtering out clusters of peaks)
+ * ('x' or 'y') */
+ char badrow;
+
+ /** Number of detector intensity units per photon (or electron, etc) */
+ double adu_per_photon;
+
+ /** Treat pixel as unreliable if higher than this */
+ double max_adu;
+
+ /** \name Transformation matrix from pixel coordinates to lab frame */
+ /*@{*/
+ double fsx;
+ double fsy;
+ double fsz;
+ double ssx;
+ double ssy;
+ double ssz;
+ /*@}*/
+
+ /** \name Inverse of 2D part of transformation matrix */
+ /*@{*/
+ double xfs;
+ double yfs;
+ double xss;
+ double yss;
+ /*@}*/
+
+ /** \name Width and height of panel */
+ /*@{*/
+ int w;
+ int h;
+ /*@}*/
+};
+
+
+struct badregion
+{
+ char name[1024];
+ int is_fsss;
+ char *panel;
+
+ double min_x;
+ double max_x;
+ double min_y;
+ double max_y;
+
+ /* Specified INCLUSIVELY */
+ int min_fs;
+ int max_fs;
+ int min_ss;
+ int max_ss;
+
+};
+
+
+struct detector
+{
+ struct panel *panels;
+ int n_panels;
+
+ struct badregion *bad;
+ int n_bad;
+
+ unsigned int mask_bad;
+ unsigned int mask_good;
+
+ struct rigid_group **rigid_groups;
+ int n_rigid_groups;
+
+ struct rg_collection **rigid_group_collections;
+ int n_rg_collections;
+
+ /* Location of the pixel furthest away from the beam position, which
+ * will have the largest value of 2theta regardless of camera length
+ * and wavelength */
+ struct panel *furthest_out_panel;
+ double furthest_out_fs;
+ double furthest_out_ss;
+
+ /* As above, but for the smallest 2theta */
+ struct panel *furthest_in_panel;
+ double furthest_in_fs;
+ double furthest_in_ss;
+};
+
+
+extern struct rvec get_q_for_panel(struct panel *p, double fs, double ss,
+ double *ttp, double k);
+
+extern double get_tt(struct image *image, double xs, double ys, int *err);
+
+extern int in_bad_region(struct detector *det, struct panel *p,
+ double fs, double ss);
+
+extern void record_image(struct image *image, int do_poisson, double background,
+ gsl_rng *rng, double beam_radius, double nphotons);
+
+extern struct panel *find_orig_panel(struct detector *det,
+ double fs, double ss);
+
+extern signed int find_orig_panel_number(struct detector *det,
+ double fs, double ss);
+
+extern int panel_number(const struct detector *det, const struct panel *p);
+
+extern struct detector *get_detector_geometry(const char *filename,
+ struct beam_params *beam);
+
+extern struct detector *get_detector_geometry_2(const char *filename,
+ struct beam_params *beam,
+ char **hdf5_peak_path);
+
+extern struct detector *get_detector_geometry_from_string(const char *string,
+ struct beam_params *beam,
+ char **hdf5_peak_path);
+
+extern void free_detector_geometry(struct detector *det);
+
+extern struct detector *simple_geometry(const struct image *image, int w, int h);
+
+extern void get_pixel_extents(struct detector *det,
+ double *min_x, double *min_y,
+ double *max_x, double *max_y);
+
+extern void fill_in_adu(struct image *image);
+extern void adjust_centering_for_rail(struct panel *p);
+
+extern int panel_is_in_rigid_group(const struct rigid_group *rg,
+ struct panel *p);
+
+extern int rigid_group_is_in_collection(struct rg_collection *c,
+ struct rigid_group *rg);
+
+extern struct detector *copy_geom(const struct detector *in);
+
+extern int reverse_2d_mapping(double x, double y, struct detector *det,
+ struct panel **pp, double *pfs, double *pss);
+
+extern double largest_q(struct image *image);
+
+extern double smallest_q(struct image *image);
+
+extern struct panel *find_panel_by_name(struct detector *det, const char *name);
+
+extern int write_detector_geometry_2(const char *geometry_filename,
+ const char *output_filename,
+ struct detector *det,
+ const char *additional_comment,
+ int write_panel_coffset);
+
+extern int write_detector_geometry_3(const char *geometry_data,
+ const char *output_filename,
+ struct detector *det,
+ const char *additional_comment,
+ int write_panel_coffset);
+
+extern int write_detector_geometry(const char *geometry_filename,
+ const char *output_filename,
+ struct detector *det);
+
+extern void mark_resolution_range_as_bad(struct image *image,
+ double min, double max);
+
+
+extern int single_panel_data_source(struct detector *det, const char *element);
+
+struct rg_collection *find_rigid_group_collection_by_name(struct detector *det,
+ const char *name);
+
+extern int detector_has_clen_references(struct detector *det);
+
+extern int multi_event_geometry(struct detector *det);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* DETECTOR_H */