aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas White <taw@physics.org>2010-07-30 18:44:04 +0200
committerThomas White <taw@physics.org>2012-02-22 15:26:55 +0100
commite09a64256a29547943a432ac5d41819835f8483a (patch)
tree3f4dfca844b770f6959e5d443396606c902c576b
parent63129a826c8156b1e7cd075e4dc5a23f3641e22a (diff)
Add facetron program for profile fitting and post-refinement
-rw-r--r--.gitignore1
-rwxr-xr-xscripts/test-facetron8
-rw-r--r--src/Makefile.am5
-rw-r--r--src/Makefile.in22
-rw-r--r--src/cell.c3
-rw-r--r--src/cell.h11
-rw-r--r--src/facetron.c133
-rw-r--r--src/image.h9
8 files changed, 174 insertions, 18 deletions
diff --git a/.gitignore b/.gitignore
index c0e36603..0bd94740 100644
--- a/.gitignore
+++ b/.gitignore
@@ -15,4 +15,5 @@ src/compare_hkl
src/powder_plot
src/render_hkl
src/calibrate_detector
+src/facetron
*~
diff --git a/scripts/test-facetron b/scripts/test-facetron
new file mode 100755
index 00000000..e10132d7
--- /dev/null
+++ b/scripts/test-facetron
@@ -0,0 +1,8 @@
+#!/bin/sh
+
+echo $1 | indexamajig --indexing=dirax -i - \
+ -g ~/crystfel/examples/lcls-dec.geom \
+ -p ~/lcls/1JB0.pdb \
+ --near-bragg --filter-cm \
+ 2>/dev/null | grep 'star' | cut -d"=" -f 2 | cut -d" " -f 1-4 \
+ | ~/crystfel/src/facetron
diff --git a/src/Makefile.am b/src/Makefile.am
index a61ebb6b..8f88ead7 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -1,5 +1,5 @@
bin_PROGRAMS = pattern_sim process_hkl get_hkl indexamajig compare_hkl \
- powder_plot render_hkl calibrate_detector
+ powder_plot render_hkl calibrate_detector facetron
if HAVE_GTK
bin_PROGRAMS += hdfsee
@@ -55,4 +55,7 @@ calibrate_detector_SOURCES = calibrate_detector.c utils.c hdf5-file.c image.c \
sfac.c
calibrate_detector_LDADD = @LIBS@
+facetron_SOURCES = facetron.c cell.c
+facetron_LDADD = @LIBS@
+
INCLUDES = "-I$(top_srcdir)/data"
diff --git a/src/Makefile.in b/src/Makefile.in
index 7cd5226c..85dc14ee 100644
--- a/src/Makefile.in
+++ b/src/Makefile.in
@@ -35,7 +35,7 @@ POST_UNINSTALL = :
bin_PROGRAMS = pattern_sim$(EXEEXT) process_hkl$(EXEEXT) \
get_hkl$(EXEEXT) indexamajig$(EXEEXT) compare_hkl$(EXEEXT) \
powder_plot$(EXEEXT) render_hkl$(EXEEXT) \
- calibrate_detector$(EXEEXT) $(am__EXEEXT_1)
+ calibrate_detector$(EXEEXT) facetron$(EXEEXT) $(am__EXEEXT_1)
@HAVE_GTK_TRUE@am__append_1 = hdfsee
@HAVE_OPENCL_TRUE@am__append_2 = diffraction-gpu.c cl-utils.c
@HAVE_OPENCL_TRUE@am__append_3 = diffraction-gpu.c cl-utils.c
@@ -63,6 +63,9 @@ am_compare_hkl_OBJECTS = compare_hkl.$(OBJEXT) sfac.$(OBJEXT) \
statistics.$(OBJEXT) symmetry.$(OBJEXT)
compare_hkl_OBJECTS = $(am_compare_hkl_OBJECTS)
compare_hkl_DEPENDENCIES =
+am_facetron_OBJECTS = facetron.$(OBJEXT) cell.$(OBJEXT)
+facetron_OBJECTS = $(am_facetron_OBJECTS)
+facetron_DEPENDENCIES =
am_get_hkl_OBJECTS = get_hkl.$(OBJEXT) sfac.$(OBJEXT) cell.$(OBJEXT) \
utils.$(OBJEXT) reflections.$(OBJEXT) symmetry.$(OBJEXT)
get_hkl_OBJECTS = $(am_get_hkl_OBJECTS)
@@ -134,12 +137,13 @@ AM_V_GEN = $(am__v_GEN_$(V))
am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY))
am__v_GEN_0 = @echo " GEN " $@;
SOURCES = $(calibrate_detector_SOURCES) $(compare_hkl_SOURCES) \
- $(get_hkl_SOURCES) $(hdfsee_SOURCES) $(indexamajig_SOURCES) \
- $(pattern_sim_SOURCES) $(powder_plot_SOURCES) \
- $(process_hkl_SOURCES) $(render_hkl_SOURCES)
+ $(facetron_SOURCES) $(get_hkl_SOURCES) $(hdfsee_SOURCES) \
+ $(indexamajig_SOURCES) $(pattern_sim_SOURCES) \
+ $(powder_plot_SOURCES) $(process_hkl_SOURCES) \
+ $(render_hkl_SOURCES)
DIST_SOURCES = $(calibrate_detector_SOURCES) $(compare_hkl_SOURCES) \
- $(get_hkl_SOURCES) $(am__hdfsee_SOURCES_DIST) \
- $(am__indexamajig_SOURCES_DIST) \
+ $(facetron_SOURCES) $(get_hkl_SOURCES) \
+ $(am__hdfsee_SOURCES_DIST) $(am__indexamajig_SOURCES_DIST) \
$(am__pattern_sim_SOURCES_DIST) $(powder_plot_SOURCES) \
$(process_hkl_SOURCES) $(render_hkl_SOURCES)
ETAGS = etags
@@ -272,6 +276,8 @@ calibrate_detector_SOURCES = calibrate_detector.c utils.c hdf5-file.c image.c \
sfac.c
calibrate_detector_LDADD = @LIBS@
+facetron_SOURCES = facetron.c cell.c
+facetron_LDADD = @LIBS@
INCLUDES = "-I$(top_srcdir)/data"
all: all-am
@@ -350,6 +356,9 @@ calibrate_detector$(EXEEXT): $(calibrate_detector_OBJECTS) $(calibrate_detector_
compare_hkl$(EXEEXT): $(compare_hkl_OBJECTS) $(compare_hkl_DEPENDENCIES)
@rm -f compare_hkl$(EXEEXT)
$(AM_V_CCLD)$(LINK) $(compare_hkl_OBJECTS) $(compare_hkl_LDADD) $(LIBS)
+facetron$(EXEEXT): $(facetron_OBJECTS) $(facetron_DEPENDENCIES)
+ @rm -f facetron$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(facetron_OBJECTS) $(facetron_LDADD) $(LIBS)
get_hkl$(EXEEXT): $(get_hkl_OBJECTS) $(get_hkl_DEPENDENCIES)
@rm -f get_hkl$(EXEEXT)
$(AM_V_CCLD)$(LINK) $(get_hkl_OBJECTS) $(get_hkl_LDADD) $(LIBS)
@@ -387,6 +396,7 @@ distclean-compile:
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/diffraction.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dirax.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/displaywindow.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/facetron.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/filters.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/get_hkl.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hdf5-file.Po@am__quote@
diff --git a/src/cell.c b/src/cell.c
index 3edcc8ef..79261249 100644
--- a/src/cell.c
+++ b/src/cell.c
@@ -150,8 +150,7 @@ UnitCell *cell_new_from_parameters(double a, double b, double c,
}
-static UnitCell *cell_new_from_axes(struct rvec as, struct rvec bs,
- struct rvec cs)
+UnitCell *cell_new_from_axes(struct rvec as, struct rvec bs, struct rvec cs)
{
UnitCell *cell;
diff --git a/src/cell.h b/src/cell.h
index ab67a594..113e6512 100644
--- a/src/cell.h
+++ b/src/cell.h
@@ -16,6 +16,14 @@
#include <config.h>
#endif
+/* A 3D vector in reciprocal space */
+struct rvec
+{
+ double u;
+ double v;
+ double w;
+};
+
typedef struct _unitcell UnitCell;
extern UnitCell *cell_new(void);
@@ -25,6 +33,9 @@ extern UnitCell *cell_new_from_cell(UnitCell *orig);
extern UnitCell *cell_new_from_parameters(double a, double b, double c,
double alpha, double beta, double gamma);
+extern UnitCell *cell_new_from_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,
diff --git a/src/facetron.c b/src/facetron.c
new file mode 100644
index 00000000..bcaaac48
--- /dev/null
+++ b/src/facetron.c
@@ -0,0 +1,133 @@
+/*
+ * facetron.c
+ *
+ * Profile fitting for coherent nanocrystallography
+ *
+ * (c) 2006-2010 Thomas White <taw@physics.org>
+ *
+ * Part of CrystFEL - crystallography with a FEL
+ *
+ */
+
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <stdarg.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <unistd.h>
+#include <getopt.h>
+
+#include "image.h"
+#include "cell.h"
+
+
+static void show_help(const char *s)
+{
+ printf("Syntax: %s [options]\n\n", s);
+ printf(
+"Profile fitting for coherent nanocrystallography.\n"
+"\n"
+" -h, --help Display this help message.\n"
+"\n"
+" -i, --input=<filename> Specify the name of the image to work on.\n"
+" -m, --matrix=<filename> Specify the file which contains the initial\n"
+" orientation matrix. Can be '-' for stdin,\n"
+" which is the default. Units are nm^-1.\n"
+);
+}
+
+
+static UnitCell *read_orientation_matrix(const char *filename)
+{
+ FILE *mfh;
+ float u, v, w;
+ struct rvec as, bs, cs;
+ UnitCell *cell;
+
+ if ( (filename == NULL) || (strcmp(filename, "-") == 0) ) {
+ mfh = stdin;
+ } else {
+ mfh = fopen(filename, "r");
+ }
+ if ( mfh == NULL ) {
+ ERROR("Failed to open matrix file '%s'\n", filename);
+ return NULL;
+ }
+
+ if ( fscanf(mfh, "%f %f %f", &u, &v, &w) != 3 ) {
+ ERROR("Couldn't read a-star\n");
+ return NULL;
+ }
+ as.u = u*1e9; as.v = v*1e9; as.w = w*1e9;
+ if ( fscanf(mfh, "%f %f %f", &u, &v, &w) != 3 ) {
+ ERROR("Couldn't read b-star\n");
+ return NULL;
+ }
+ bs.u = u*1e9; bs.v = v*1e9; bs.w = w*1e9;
+ if ( fscanf(mfh, "%f %f %f", &u, &v, &w) != 3 ) {
+ ERROR("Couldn't read c-star\n");
+ return NULL;
+ }
+ cs.u = u*1e9; cs.v = v*1e9; cs.w = w*1e9;
+ cell = cell_new_from_axes(as, bs, cs);
+ fclose(mfh);
+
+ return cell;
+}
+
+
+int main(int argc, char *argv[])
+{
+ int c;
+ char *infile = NULL;
+ char *matrix = NULL;
+ UnitCell *cell;
+
+ /* Long options */
+ const struct option longopts[] = {
+ {"help", 0, NULL, 'h'},
+ {"input", 1, NULL, 'i'},
+ {"matrix", 1, NULL, 'm'},
+ {0, 0, NULL, 0}
+ };
+
+ /* Short options */
+ while ((c = getopt_long(argc, argv, "hi:m:", longopts, NULL)) != -1) {
+
+ switch (c) {
+ case 'h' :
+ show_help(argv[0]);
+ return 0;
+
+ case 'i' :
+ infile = strdup(optarg);
+ break;
+
+ case 'm' :
+ matrix = strdup(optarg);
+ break;
+
+ case 0 :
+ break;
+
+ default :
+ return 1;
+ }
+
+ }
+
+ cell = read_orientation_matrix(matrix);
+ free(matrix);
+ if ( cell == NULL ) {
+ ERROR("Couldn't read initial orientation matrix.\n");
+ return 1;
+ }
+
+ cell_print(cell);
+
+ return 0;
+}
diff --git a/src/image.h b/src/image.h
index 3b31b2fa..613b0989 100644
--- a/src/image.h
+++ b/src/image.h
@@ -58,15 +58,6 @@ struct imagefeature {
typedef struct _imagefeaturelist ImageFeatureList;
-/* A 3D vector in reciprocal space */
-struct rvec
-{
- double u;
- double v;
- double w;
-};
-
-
struct reflhit {
signed int h;
signed int k;