aboutsummaryrefslogtreecommitdiff
path: root/libcrystfel
diff options
context:
space:
mode:
authorThomas White <taw@physics.org>2013-01-09 16:00:59 +0100
committerThomas White <taw@physics.org>2013-01-09 16:00:59 +0100
commit6c970262e0d41252b0ada1a80a6c6293ddcdfec9 (patch)
treebe71c37e8e9002c9f15efba3438e94dd35e16b53 /libcrystfel
parentefb829adf0c494a3ed632cef472ac1e8e5267765 (diff)
GrainSpotter interface (works)
Diffstat (limited to 'libcrystfel')
-rw-r--r--libcrystfel/src/grainspotter.c165
1 files changed, 152 insertions, 13 deletions
diff --git a/libcrystfel/src/grainspotter.c b/libcrystfel/src/grainspotter.c
index 06f65f08..b7e5ce0a 100644
--- a/libcrystfel/src/grainspotter.c
+++ b/libcrystfel/src/grainspotter.c
@@ -50,9 +50,10 @@
#include "image.h"
-#include "grainspotter.h"
#include "utils.h"
#include "peaks.h"
+#include "cell.h"
+#include "cell-utils.h"
#define GRAINSPOTTER_VERBOSE 0
@@ -70,30 +71,99 @@ struct grainspotter_data {
};
+static int read_matrix(struct image *image)
+{
+ FILE *fh;
+ int d1;
+ float d2;
+ float ubi11, ubi12, ubi13;
+ float ubi21, ubi22, ubi23;
+ float ubi31, ubi32, ubi33;
+ char filename[1024];
+ char line[1024];
+ int r;
+
+ snprintf(filename, 1023, "xfel-%i.gff", image->id);
+
+ fh = fopen(filename, "r");
+ if ( fh == NULL ) {
+ ERROR("Can't open '%s'\n", filename);
+ return 1;
+ }
+
+ /* Read and discard first line */
+ if ( fgets(line, 1024, fh) == NULL ) {
+ ERROR("Failed to read GFF file.\n");
+ return 1;
+ }
+
+ /* One line per grain */
+ if ( fgets(line, 1024, fh) == NULL ) {
+ ERROR("Failed to read GFF file.\n");
+ return 1;
+ }
+
+ STATUS("'%s'\n", line);
+
+ r = sscanf(line,
+ "%i %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f",
+ &d1, &d2, &d2, &d2, &d2, &d2, &d2, &d2, &d2, &d2, &d2, &d2, &d2, &d2, &d2,
+ &ubi11, &ubi12, &ubi13, &ubi21, &ubi22, &ubi23, &ubi31, &ubi32, &ubi33);
+
+ if ( r != 24 ) {
+ ERROR("Only %i parameters in GFF file\n", r);
+ return 1;
+ }
+
+ fclose(fh);
+
+ image->candidate_cells[0] = cell_new();
+
+// cell_set_cartesian(image->candidate_cells[0],
+// ubi11/1e10, ubi12/1e10, ubi13/1e10,
+// ubi21/1e10, ubi22/1e10, ubi23/1e10,
+// ubi31/1e10, ubi32/1e10, ubi33/1e10);
+
+ cell_set_cartesian(image->candidate_cells[0],
+ ubi12/1e10, ubi13/1e10, ubi11/1e10,
+ ubi22/1e10, ubi23/1e10, ubi21/1e10,
+ ubi32/1e10, ubi33/1e10, ubi31/1e10);
+
+
+ image->ncells = 1;
+ cell_print(image->candidate_cells[0]);
+
+ return 0;
+}
+
+
static int grainspotter_readable(struct image *image,
struct grainspotter_data *grainspotter)
{
int rval;
rval = read(grainspotter->pty,
- grainspotter->rbuffer+grainspotter->rbufpos,
- grainspotter->rbuflen-grainspotter->rbufpos);
+ grainspotter->rbuffer, grainspotter->rbuflen);
- if ( (rval == -1) || (rval == 0) ) return 1;
+ if ( rval == -1 ) {
+ ERROR("Read failed: %s\n", strerror(errno));
+ return 1;
+ }
+
+ grainspotter->rbuffer[rval] = '\0';
- /* FIXME! (if needed) */
- //grainspotter->rbufpos += rval;
- //assert(grainspotter->rbufpos <= grainspotter->rbuflen);
+ printf("GrainSpotter: '%s'\n", grainspotter->rbuffer);
return 0;
}
-static void write_gve(struct image *image)
+static void write_gve(struct image *image, UnitCell *cell)
{
FILE *fh;
int i;
char filename[1024];
+ double a, b, c, al, be, ga;
snprintf(filename, 1023, "xfel-%i.gve", image->id);
@@ -102,7 +172,14 @@ static void write_gve(struct image *image)
ERROR("Couldn't open temporary file '%s'\n", filename);
return;
}
- fprintf(fh, "%f\n", 0.5); /* Lie about the wavelength. */
+
+ cell_get_parameters(cell, &a, &b, &c, &al, &be, &ga);
+ fprintf(fh, "%.6f %.6f %.6f %.6f %.6f %.6f P\n", a*1e10, b*1e10, c*1e10,
+ rad2deg(al), rad2deg(be), rad2deg(ga));
+ fprintf(fh, "# wavelength = %.6f\n", image->lambda*1e10);
+ fprintf(fh, "# wedge = 0.000000\n");
+ fprintf(fh, "# ds h k l\n");
+ fprintf(fh, "# xr yr zr xc yc ds eta omega\n");
for ( i=0; i<image_feature_count(image->features); i++ ) {
@@ -111,11 +188,60 @@ static void write_gve(struct image *image)
f = image_get_feature(image->features, i);
if ( f == NULL ) continue;
- fprintf(fh, "%10f %10f %10f %8f\n",
- f->rx/1e10, f->ry/1e10, f->rz/1e10, 1.0);
+ fprintf(fh, "%.6f %.6f %.6f 0 0 %.6f %.6f %.6f 0\n",
+ f->rz/1e10, f->rx/1e10, f->ry/1e10,
+ modulus(f->rx, f->ry, f->rz)/1e10, /* dstar */
+ atan2(f->ry, f->rx), 0.0); /* eta, omega */
+
+ }
+ fclose(fh);
+}
+
+
+static char *write_ini(struct image *image)
+{
+ FILE *fh;
+ char *filename;
+ double tt;
+
+ filename = malloc(1024);
+ if ( filename == NULL ) return NULL;
+ snprintf(filename, 1023, "xfel-%i.ini", image->id);
+
+ fh = fopen(filename, "w");
+ if ( !fh ) {
+ ERROR("Couldn't open temporary file '%s'\n", filename);
+ free(filename);
+ return NULL;
}
+
+ get_q_for_panel(image->det->furthest_out_panel,
+ image->det->furthest_out_fs,
+ image->det->furthest_out_ss,
+ &tt, 1.0/image->lambda);
+
+ fprintf(fh, "spacegroup 96\n");
+ fprintf(fh, "!dsrange 0 1.3\n");
+ fprintf(fh, "tthrange 0 %.2f\n", 20.0);
+ fprintf(fh, "etarange 0 360\n");
+ fprintf(fh, "domega 1\n");
+ fprintf(fh, "omegarange -0.5 0.5\n");
+ fprintf(fh, "filespecs xfel-%i.gve xfel-%i.log\n",
+ image->id, image->id);
+ fprintf(fh, "cuts 3 0.1 0.5\n");
+ fprintf(fh, "eulerstep 8\n");
+ fprintf(fh, "uncertainties 0.1 0.2 .5\n");
+ fprintf(fh, "nsigmas 2\n");
+ fprintf(fh, "minfracg 0.95\n");
+ fprintf(fh, "Nhkls_in_indexing 500\n");
+ fprintf(fh, "random 10000\n");
+ fprintf(fh, "!positionfit\n");
+ fprintf(fh, "genhkl\n");
+
fclose(fh);
+
+ return filename;
}
@@ -125,8 +251,15 @@ void run_grainspotter(struct image *image, UnitCell *cell)
int status;
int rval;
struct grainspotter_data *grainspotter;
+ char *ini_filename;
+
+ write_gve(image, cell);
+ ini_filename = write_ini(image);
- write_gve(image);
+ if ( ini_filename == NULL ) {
+ ERROR("Failed to write ini file for GrainSpotter.\n");
+ return;
+ }
grainspotter = malloc(sizeof(struct grainspotter_data));
if ( grainspotter == NULL ) {
@@ -149,11 +282,13 @@ void run_grainspotter(struct image *image, UnitCell *cell)
t.c_lflag &= ~(ECHO | ECHOE | ECHOK | ECHONL);
tcsetattr(STDIN_FILENO, TCSANOW, &t);
- execlp("GrainSpotter.0.90", "", (char *)NULL);
+ STATUS("Running GrainSpotter.0.90 '%s'\n", ini_filename);
+ execlp("GrainSpotter.0.90", "", ini_filename, (char *)NULL);
ERROR("Failed to invoke GrainSpotter.\n");
_exit(0);
}
+ free(ini_filename);
grainspotter->rbuffer = malloc(256);
grainspotter->rbuflen = 256;
@@ -210,5 +345,9 @@ void run_grainspotter(struct image *image, UnitCell *cell)
ERROR("GrainSpotter doesn't seem to be working properly.\n");
}
+ if ( read_matrix(image) != 0 ) {
+ ERROR("Failed to read matrix\n");
+ }
+
free(grainspotter);
}