aboutsummaryrefslogtreecommitdiff
path: root/libcrystfel/src/xds.c
diff options
context:
space:
mode:
Diffstat (limited to 'libcrystfel/src/xds.c')
-rw-r--r--libcrystfel/src/xds.c119
1 files changed, 95 insertions, 24 deletions
diff --git a/libcrystfel/src/xds.c b/libcrystfel/src/xds.c
index 9660b5bc..92619d65 100644
--- a/libcrystfel/src/xds.c
+++ b/libcrystfel/src/xds.c
@@ -253,25 +253,30 @@ static int read_cell(const char *filename, struct image *image,
do {
rval = fgets(line, 1023, fh);
+ if ( rval == NULL ) return 0;
} while ( strcmp(line, " # COORDINATES OF REC. BASIS VECTOR"
" LENGTH 1/LENGTH\n") != 0 );
/* Free line after chunk */
rval = fgets(line, 1023, fh);
+ if ( rval == NULL ) return 0;
rval = fgets(line, 1023, fh);
+ if ( rval == NULL ) return 0;
memcpy(asx, line+7, 10); asx[10] = '\0';
memcpy(asy, line+17, 10); asy[10] = '\0';
memcpy(asz, line+27, 10); asz[10] = '\0';
rval = fgets(line, 1023, fh);
+ if ( rval == NULL ) return 0;
memcpy(bsx, line+7, 10); bsx[10] = '\0';
memcpy(bsy, line+17, 10); bsy[10] = '\0';
memcpy(bsz, line+27, 10); bsz[10] = '\0';
rval = fgets(line, 1023, fh);
+ if ( rval == NULL ) return 0;
memcpy(csx, line+7, 10); csx[10] = '\0';
memcpy(csy, line+17, 10); csy[10] = '\0';
@@ -377,21 +382,88 @@ static void write_spot(struct image *image, const char *filename)
}
-static char *write_inp(struct image *image)
+/* Turn what we know about the unit cell into something which we can give to
+ * XDS to make it give us only indexing results compatible with the cell. */
+static const char *spacegroup_for_lattice(UnitCell *cell)
{
- FILE *fh;
- char *filename;
+ LatticeType latt;
+ char centering;
+ char *g = NULL;
+
+ latt = cell_get_lattice_type(cell);
+ centering = cell_get_centering(cell);
+
+ switch ( latt )
+ {
+ case L_TRICLINIC :
+ g = "1";
+ break;
+
+ case L_MONOCLINIC :
+ if ( centering == 'P' ) {
+ g = "3";
+ } else {
+ g = "5";
+ }
+ break;
+
+ case L_ORTHORHOMBIC :
+ if ( centering == 'P' ) {
+ g = "16";
+ } else if ( centering == 'C' ) {
+ g = "20";
+ } else if ( centering == 'F' ) {
+ g = "22";
+ } else {
+ g = "23";
+ }
+ break;
+
+ case L_TETRAGONAL :
+ if ( centering == 'P' ) {
+ g = "75";
+ } else {
+ g = "79";
+ }
+ break;
+
+ case L_RHOMBOHEDRAL :
+ if ( centering == 'P' ) {
+ g = "143";
+ } else {
+ g = "146";
+ }
+ break;
+
+ case L_HEXAGONAL :
+ g = "168";
+ break;
+
+ case L_CUBIC :
+ if ( centering == 'P' ) {
+ g = "195";
+ } else if ( centering == 'F' ) {
+ g = "196";
+ } else {
+ g = "197";
+ }
+ break;
+ }
+ assert(g != NULL);
+
+ return g;
+}
- filename = malloc(1024);
- if ( filename == NULL ) return NULL;
- snprintf(filename, 1023, "XDS.INP");
+static int write_inp(struct image *image, struct xds_private *xp)
+{
+ FILE *fh;
+ double a, b, c, al, be, ga;
- fh = fopen(filename, "w");
+ fh = fopen("XDS.INP", "w");
if ( !fh ) {
- ERROR("Couldn't open temporary file '%s'\n", filename);
- free(filename);
- return NULL;
+ ERROR("Couldn't open XDS.INP\n");
+ return 0;
}
fprintf(fh, "JOB= IDXREF\n");
@@ -399,16 +471,17 @@ static char *write_inp(struct image *image)
fprintf(fh, "ORGY= 1500\n");
fprintf(fh, "DETECTOR_DISTANCE= 99.00\n"); //IMPORTANT
fprintf(fh, "OSCILLATION_RANGE= 0.300\n");
- fprintf(fh, "X-RAY_WAVELENGTH= 1.32\n"); // IMPORTANT
- fprintf(fh, "NAME_TEMPLATE_OF_DATA_FRAMES=/home/dikay/insu/data_exp1/ins_ssad_1_???.img \n");
+ fprintf(fh, "X-RAY_WAVELENGTH= %.6f\n", image->lambda*1e10);
+ fprintf(fh, "NAME_TEMPLATE_OF_DATA_FRAMES=/home/ins_ssad_1_???.img \n");
fprintf(fh, "DATA_RANGE=1 1\n");
fprintf(fh, "SPOT_RANGE=1 1\n");
- fprintf(fh, "SPACE_GROUP_NUMBER= 94\n"); //CatB 94
- fprintf(fh, "UNIT_CELL_CONSTANTS= 126.2 126.2 54.2 90 90 90\n"); //CatB 125.4 125.4 54.56 90 90 90
- //fprintf(fh, "SPACE_GROUP_NUMBER=194\n"); //PS1 194
- //fprintf(fh, "UNIT_CELL_CONSTANTS=281 281 165.2 90 90 120\n"); //PS1 281 281 165.2 90 90 120
- //fprintf(fh, "SPACE_GROUP_NUMBER= 0\n"); //LYS 96
- //fprintf(fh, "UNIT_CELL_CONSTANTS= 0 0 0 0 0 0\n"); //LYS 77.32 77.32 38.16 90 90 90
+ fprintf(fh, "SPACE_GROUP_NUMBER= %s\n",
+ spacegroup_for_lattice(xp->cell));
+ cell_get_parameters(xp->cell, &a, &b, &c, &al, &be, &ga);
+ fprintf(fh, "UNIT_CELL_CONSTANTS= %.2f %.2f %.2f %.2f %.2f %.2f\n",
+ a*1e10, b*1e10, c*1e10,rad2deg(al), rad2deg(be), rad2deg(ga));
+ //fprintf(fh, "SPACE_GROUP_NUMBER= 0\n");
+ //fprintf(fh, "UNIT_CELL_CONSTANTS= 0 0 0 0 0 0\n");
fprintf(fh, "NX= 3000\n");
fprintf(fh, "NY= 3000\n");
fprintf(fh, "QX= 0.07\n");
@@ -429,7 +502,7 @@ static char *write_inp(struct image *image)
fclose(fh);
- return filename;
+ return 0;
}
@@ -440,7 +513,6 @@ int run_xds(struct image *image, IndexingPrivate *priv)
int rval;
int n;
struct xds_data *xds;
- char *inp_filename;
struct xds_private *xp = (struct xds_private *)priv;
xds = malloc(sizeof(struct xds_data));
@@ -451,10 +523,9 @@ int run_xds(struct image *image, IndexingPrivate *priv)
xds->target_cell = xp->cell;
- write_inp(image);
- inp_filename = write_inp(image);
-
- if ( inp_filename == NULL ) {
+ write_inp(image, xp);
+
+ if ( write_inp == NULL ) {
ERROR("Failed to write XDS.INP file for XDS.\n");
return 0;
}