aboutsummaryrefslogtreecommitdiff
path: root/libcrystfel/src/cell.h
diff options
context:
space:
mode:
Diffstat (limited to 'libcrystfel/src/cell.h')
-rw-r--r--libcrystfel/src/cell.h107
1 files changed, 107 insertions, 0 deletions
diff --git a/libcrystfel/src/cell.h b/libcrystfel/src/cell.h
new file mode 100644
index 00000000..b5d31fc6
--- /dev/null
+++ b/libcrystfel/src/cell.h
@@ -0,0 +1,107 @@
+/*
+ * cell.h
+ *
+ * Unit Cell Calculations
+ *
+ * (c) 2006-2010 Thomas White <taw@physics.org>
+ *
+ * Part of CrystFEL - crystallography with a FEL
+ *
+ */
+
+#ifndef CELL_H
+#define CELL_H
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include "utils.h"
+
+/* A 3D vector in reciprocal space */
+struct rvec
+{
+ double u;
+ double v;
+ double w;
+};
+
+
+/**
+ * UnitCell:
+ *
+ * This data structure is opaque. You must use the available accessor functions
+ * to read and write its contents.
+ **/
+typedef struct _unitcell UnitCell;
+
+extern UnitCell *cell_new(void);
+extern UnitCell *cell_new_from_cell(UnitCell *orig);
+extern void cell_free(UnitCell *cell);
+
+/* Lengths in m, angles in radians */
+extern UnitCell *cell_new_from_parameters(double a, double b, double c,
+ double alpha, double beta, double gamma);
+
+extern UnitCell *cell_new_from_reciprocal_axes(struct rvec as, struct rvec bs,
+ struct rvec cs);
+
+extern UnitCell *cell_new_from_direct_axes(struct rvec as, struct rvec bs,
+ struct rvec cs);
+
+extern void cell_set_cartesian(UnitCell *cell,
+ double ax, double ay, double az,
+ double bx, double by, double bz,
+ double cx, double cy, double cz);
+
+extern void cell_set_parameters(UnitCell *cell, double a, double b, double c,
+ double alpha, double beta, double gamma);
+
+extern void cell_set_cartesian_a(UnitCell *cell, double ax, double ay, double az);
+extern void cell_set_cartesian_b(UnitCell *cell, double bx, double by, double bz);
+extern void cell_set_cartesian_c(UnitCell *cell, double cx, double cy, double cz);
+extern void cell_set_spacegroup(UnitCell *cell, const char *sym);
+extern void cell_set_pointgroup(UnitCell *cell, const char *sym);
+
+
+extern int cell_get_parameters(UnitCell *cell, double *a, double *b, double *c,
+ double *alpha, double *beta, double *gamma);
+
+extern int cell_get_cartesian(UnitCell *cell,
+ double *ax, double *ay, double *az,
+ double *bx, double *by, double *bz,
+ double *cx, double *cy, double *cz);
+
+extern int cell_get_reciprocal(UnitCell *cell,
+ double *asx, double *asy, double *asz,
+ double *bsx, double *bsy, double *bsz,
+ double *csx, double *csy, double *csz);
+
+extern void cell_set_reciprocal(UnitCell *cell,
+ double asx, double asy, double asz,
+ double bsx, double bsy, double bsz,
+ double csx, double csy, double csz);
+
+extern const char *cell_get_pointgroup(UnitCell *cell);
+
+extern const char *cell_get_spacegroup(UnitCell *cell);
+
+extern double resolution(UnitCell *cell,
+ signed int h, signed int k, signed int l);
+
+extern UnitCell *cell_rotate(UnitCell *in, struct quaternion quat);
+extern UnitCell *rotate_cell(UnitCell *in, double omega, double phi,
+ double rot);
+
+extern void cell_print(UnitCell *cell);
+
+extern UnitCell *match_cell(UnitCell *cell, UnitCell *template, int verbose,
+ int reduce);
+
+extern UnitCell *match_cell_ab(UnitCell *cell, UnitCell *template);
+
+extern UnitCell *load_cell_from_pdb(const char *filename);
+
+extern int cell_is_sensible(UnitCell *cell);
+
+#endif /* CELL_H */