diff options
author | Thomas White <taw@physics.org> | 2010-09-13 10:54:34 +0200 |
---|---|---|
committer | Thomas White <taw@physics.org> | 2012-02-22 15:26:57 +0100 |
commit | 4a235243ee6838b2745d9b3e8999d29fa76c394a (patch) | |
tree | 6440b10da74abba99edeaa2dcc72bf440bc39c68 /src | |
parent | fcee934f899225e8e65aec86dea5106b7133c1a5 (diff) |
facetron: Add options
Diffstat (limited to 'src')
-rw-r--r-- | src/facetron.c | 167 | ||||
-rw-r--r-- | src/indexamajig.c | 40 | ||||
-rw-r--r-- | src/utils.c | 41 | ||||
-rw-r--r-- | src/utils.h | 6 |
4 files changed, 93 insertions, 161 deletions
diff --git a/src/facetron.c b/src/facetron.c index 42589526..c7c22e30 100644 --- a/src/facetron.c +++ b/src/facetron.c @@ -39,7 +39,10 @@ static void show_help(const char *s) "\n" " -i, --input=<filename> Specify the name of the input stream.\n" " Can be '-' for stdin.\n" -" -g. --geometry=<file> Get detector geometry from file.\n" +" -g. --geometry=<file> Get detector geometry from file.\n" +" -x, --prefix=<p> Prefix filenames from input file with <p>.\n" +" --basename Remove the directory parts of the filenames.\n" +" --no-check-prefix Don't attempt to correct the --prefix.\n" ); } @@ -113,122 +116,28 @@ static int find_chunk(FILE *fh, UnitCell **cell, char **filename) } -static void get_trial_cell(UnitCell *out, UnitCell *in, int i, double step) +static char *twiddle_filename(char *filename, int config_basename, + const char *prefix) { - double asx, asy, asz; - double bsx, bsy, bsz; - double csx, csy, csz; - - cell_get_reciprocal(in, &asx, &asy, &asz, &bsx, &bsy, &bsz, - &csx, &csy, &csz); - - switch ( i ) { - case 0 : asx += step; break; - case 1 : asx -= step; break; - case 2 : asy += step; break; - case 3 : asy -= step; break; - case 4 : asz += step; break; - case 5 : asz -= step; break; - case 6 : bsx += step; break; - case 7 : bsx -= step; break; - case 8 : bsy += step; break; - case 9 : bsy -= step; break; - case 10 : bsz += step; break; - case 11 : bsz -= step; break; - case 12 : csx += step; break; - case 13 : csx -= step; break; - case 14 : csy += step; break; - case 15 : csy -= step; break; - case 16 : csz += step; break; - case 17 : csz -= step; break; - default : break; + char *f3; + size_t len; + + if ( config_basename ) { + char *f2; + /* Happy with either the GNU or non-GNU versions of basename() + * here. Because _GNU_SOURCE is defined in configure.ac, we + * should have the GNU version. */ + f2 = strdup(basename(filename)); + free(filename); + filename = f2; } - cell_set_reciprocal(out, asx, asy, asz, bsx, bsy, bsz, csx, csy, csz); -} - - -static void try_refine(struct image *image, UnitCell *cell, - double da, double dw, double step) -{ - struct reflhit *hits; - int np; - double itot; - UnitCell *trial_cell; - int did_something; - - trial_cell = cell_new(); - - hits = find_intersections(image, cell, da, dw, &np, 0); - itot = integrate_all(image, hits, np); - STATUS("%f\n", itot); - - do { - - int i; - - did_something = 0; - - for ( i=0; i<18; i++ ) { - - struct reflhit *trial_hits; - double trial_itot; - - get_trial_cell(trial_cell, cell, i, step); - - trial_hits = find_intersections(image, trial_cell, - da, dw, &np, 0); - trial_itot = integrate_all(image, hits, np); - - if ( trial_itot > itot ) { - - double asx, asy, asz; - double bsx, bsy, bsz; - double csx, csy, csz; - - cell_get_reciprocal(trial_cell, &asx, &asy, - &asz, &bsx, &bsy, &bsz, - &csx, &csy, &csz); - cell_set_reciprocal(cell, asx, asy, asz, bsx, - bsy, bsz, csx, csy, csz); - - itot = trial_itot; - free(hits); - hits = trial_hits; - - did_something = 1; + len = strlen(prefix)+strlen(filename)+1; + f3 = malloc(len); + snprintf(f3, len, "%s%s", prefix, filename); - } else { - - free(trial_hits); - - } - } - - } while ( did_something ); - - free(trial_cell); -} - - -/* Predict peaks */ -static void pre_refine(struct image *image, UnitCell *cell, - double *da, double *dw) -{ - double asx, asy, asz; - double bsx, bsy, bsz; - double csx, csy, csz; - double istep, step; - - /* Start by changing parameters by 1% */ - cell_get_reciprocal(cell, &asx, &asy, - &asz, &bsx, &bsy, &bsz, - &csx, &csy, &csz); - istep = (asx+asy+asz+bsx+bsy+bsz+csx+csy+csz)/900.0; - - for ( step=istep; step>istep/100.0; step-=istep/100.0 ) { - try_refine(image, cell, *da, *dw, step); - } + free(filename); + return f3; } @@ -241,17 +150,23 @@ int main(int argc, char *argv[]) char *filename; struct detector *det; char *geometry = NULL; + char *prefix = NULL; + int config_basename = 0; + int config_checkprefix = 1; /* Long options */ const struct option longopts[] = { {"help", 0, NULL, 'h'}, {"input", 1, NULL, 'i'}, {"geometry", 1, NULL, 'g'}, + {"prefix", 1, NULL, 'x'}, + {"basename", 0, &config_basename, 1}, + {"no-check-prefix", 0, &config_checkprefix, 0}, {0, 0, NULL, 0} }; /* Short options */ - while ((c = getopt_long(argc, argv, "hi:g:", longopts, NULL)) != -1) { + while ((c = getopt_long(argc, argv, "hi:g:x:", longopts, NULL)) != -1) { switch (c) { case 'h' : @@ -266,6 +181,10 @@ int main(int argc, char *argv[]) geometry = strdup(optarg); break; + case 'x' : + prefix = strdup(optarg); + break; + case 0 : break; @@ -287,6 +206,14 @@ int main(int argc, char *argv[]) return ENOENT; } + if ( prefix == NULL ) { + prefix = strdup(""); + } else { + if ( config_checkprefix ) { + prefix = check_prefix(prefix); + } + } + det = get_detector_geometry(geometry); if ( det == NULL ) { ERROR("Failed to read detector geometry from '%s'\n", geometry); @@ -299,9 +226,11 @@ int main(int argc, char *argv[]) struct image image; struct hdfile *hdfile; - double da, dw; + struct reflhit *hits; int np; + filename = twiddle_filename(filename, config_basename, prefix); + STATUS("Integrating intensities from '%s'\n", filename); image.det = det; @@ -316,12 +245,7 @@ int main(int argc, char *argv[]) hdf5_read(hdfile, &image, 0); - da = 5.0e-3; /* Initial divergence */ - dw = 3.0/100.0; /* Initial bandwidth */ - - pre_refine(&image, cell, &da, &dw); - - find_intersections(&image, cell, da, dw, &np, 1); + hits = find_intersections(&image, cell, 5.0e-3, 0.0001, &np, 1); hdfile_close(hdfile); cell_free(cell); @@ -334,6 +258,7 @@ int main(int argc, char *argv[]) free(det->panels); free(det); fclose(fh); + free(prefix); return 0; } diff --git a/src/indexamajig.c b/src/indexamajig.c index f63936c5..39905fb4 100644 --- a/src/indexamajig.c +++ b/src/indexamajig.c @@ -24,8 +24,6 @@ #include <gsl/gsl_errno.h> #include <pthread.h> #include <sys/time.h> -#include <sys/types.h> -#include <sys/stat.h> #include "utils.h" #include "hdf5-file.h" @@ -171,44 +169,6 @@ static void show_help(const char *s) } -static char *check_prefix(char *prefix) -{ - int r; - struct stat statbuf; - char *new; - size_t len; - - /* Is "prefix" a directory? */ - r = stat(prefix, &statbuf); - if ( r != 0 ) { - /* "prefix" probably doesn't exist. This is fine - assume - * the user knows what they're doing, and that "prefix" - * suffixed with the actual filename will produce something - * sensible. */ - return prefix; - } - - if ( !S_ISDIR(statbuf.st_mode) ) { - /* Also fine, as above. */ - return prefix; - } - - /* Does the prefix end in a slash? */ - if ( prefix[strlen(prefix)-1] == '/' ) { - /* This looks sensible. */ - return prefix; - } - - STATUS("Your prefix ('%s') is a directory, but doesn't end" - " with a slash. I'm going to add it for you.\n", prefix); - len = strlen(prefix)+2; - new = malloc(len); - snprintf(new, len, "%s/", prefix); - free(prefix); - return new; -} - - static struct image *get_simage(struct image *template, int alternate) { struct image *image; diff --git a/src/utils.c b/src/utils.c index a47f234f..196cda3f 100644 --- a/src/utils.c +++ b/src/utils.c @@ -13,6 +13,8 @@ #include <string.h> #include <stdio.h> #include <unistd.h> +#include <sys/types.h> +#include <sys/stat.h> #include "utils.h" #include "image.h" @@ -442,3 +444,42 @@ ReflItemList *intersection_items(ReflItemList *i1, ReflItemList *i2) return res; } + + +char *check_prefix(char *prefix) +{ + int r; + struct stat statbuf; + char *new; + size_t len; + + /* Is "prefix" a directory? */ + r = stat(prefix, &statbuf); + if ( r != 0 ) { + /* "prefix" probably doesn't exist. This is fine - assume + * the user knows what they're doing, and that "prefix" + * suffixed with the actual filename will produce something + * sensible. */ + return prefix; + } + + if ( !S_ISDIR(statbuf.st_mode) ) { + /* Also fine, as above. */ + return prefix; + } + + /* Does the prefix end in a slash? */ + if ( prefix[strlen(prefix)-1] == '/' ) { + /* This looks sensible. */ + return prefix; + } + + STATUS("Your prefix ('%s') is a directory, but doesn't end" + " with a slash. I'm going to add it for you.\n", prefix); + STATUS("If this isn't what you want, run with --no-check-prefix.\n"); + len = strlen(prefix)+2; + new = malloc(len); + snprintf(new, len, "%s/", prefix); + free(prefix); + return new; +} diff --git a/src/utils.h b/src/utils.h index a8d7aa2d..dfd1913f 100644 --- a/src/utils.h +++ b/src/utils.h @@ -203,10 +203,16 @@ extern void union_op_items(ReflItemList *items, ReflItemList *newi); extern void union_items(ReflItemList *items, ReflItemList *newi); extern ReflItemList *intersection_items(ReflItemList *i1, ReflItemList *i2); + /* ------------------------------ Message macros ---------------------------- */ #define ERROR(...) fprintf(stderr, __VA_ARGS__) #define STATUS(...) fprintf(stderr, __VA_ARGS__) +/* ------------------------------ File handling ----------------------------- */ + +extern char *check_prefix(char *prefix); + + #endif /* UTILS_H */ |