diff options
Diffstat (limited to 'src/pattern_sim.c')
-rw-r--r-- | src/pattern_sim.c | 165 |
1 files changed, 102 insertions, 63 deletions
diff --git a/src/pattern_sim.c b/src/pattern_sim.c index ea7ed053..5e2df13b 100644 --- a/src/pattern_sim.c +++ b/src/pattern_sim.c @@ -35,35 +35,84 @@ static void show_help(const char *s) { printf("Syntax: %s\n\n", s); printf("Simulate diffraction patterns from small crystals\n"); - printf(" probed with femosecond pulses from a free electron laser\n\n"); - printf(" -h, --help Display this help message\n"); - printf(" --simulation-details Show details of the simulation\n"); + printf(" probed with femosecond pulses from a free electron laser.\n\n"); + printf(" -h, --help Display this help message\n"); + printf(" --simulation-details Show details of the simulation\n"); + printf(" --near-bragg Output h,k,l,I near Bragg conditions\n"); + printf(" -r, --random-orientation Use a randomly generated orientation\n"); + printf(" (a new orientation will be used for each image)\n"); + printf(" -n, --number=<N> Generate N images. Default 1\n"); } -static void show_details(const char *s) +static void show_details() { - printf("%s: Simulation Details\n\n", s); - printf("Simulates diffraction patterns from small crystals\n"); - printf("probed with femtosecond pulses from a free electron laser\n\n"); + printf("This program simulates diffraction patterns from small crystals illuminated\n"); + printf("with femtosecond X-ray pulses from a free electron laser.\n\n"); + printf("Scattering Factors\n"); + printf("------------------\n"); + printf("Scattering factors\n"); +} + + +static struct quaternion read_quaternion() +{ + do { + + int r; + float w, x, y, z; + char line[1024]; + char *rval; + + printf("Please input quaternion: w x y z\n"); + rval = fgets(line, 1023, stdin); + if ( rval == NULL ) return invalid_quaternion(); + chomp(line); + + r = sscanf(line, "%f %f %f %f", &w, &x, &y, &z); + if ( r == 4 ) { + + struct quaternion quat; + + quat.w = w; + quat.x = x; + quat.y = y; + quat.z = z; + + return quat; + + } else { + fprintf(stderr, "Invalid rotation '%s'\n", line); + } + + } while ( 1 ); } int main(int argc, char *argv[]) { - int c, done; + int c; struct image image; char filename[1024]; - int number = 1; int config_simdetails = 0; + int config_nearbragg = 0; + int config_randomquat = 0; + int number = 1; /* Index for the current image */ + int n_images = 1; /* Generate one image by default */ + int done = 0; + /* Long options */ const struct option longopts[] = { - {"help", 0, NULL, 'h'}, - {"simulation-details", 0, &config_simdetails, 1}, - {0, 0, NULL, 0} + {"help", 0, NULL, 'h'}, + {"simulation-details", 0, &config_simdetails, 1}, + {"near-bragg", 0, &config_nearbragg, 1}, + {"random-orientation", 0, NULL, 'r'}, + {"number", 1, NULL, 'n'}, + {0, 0, NULL, 0} }; - while ((c = getopt_long(argc, argv, "h", longopts, NULL)) != -1) { + /* Short options */ + while ((c = getopt_long(argc, argv, "hrn:", longopts, NULL)) != -1) { switch (c) { case 'h' : { @@ -71,6 +120,16 @@ int main(int argc, char *argv[]) return 0; } + case 'r' : { + config_randomquat = 1; + break; + } + + case 'n' : { + n_images = atoi(optarg); + break; + } + case 0 : { break; } @@ -83,7 +142,7 @@ int main(int argc, char *argv[]) } if ( config_simdetails ) { - show_details(argv[0]); + show_details(); return 0; } @@ -102,64 +161,44 @@ int main(int argc, char *argv[]) /* Splurge a few useful numbers */ printf("Wavelength is %f nm\n", image.lambda/1.0e-9); -again: - - /* Read quaternion from stdin */ - done = 0; do { - int r; - float w, x, y, z; - char line[1024]; - char *rval; - - printf("Please input quaternion: w x y z\n"); - rval = fgets(line, 1023, stdin); - if ( rval == NULL ) return 0; - chomp(line); - - r = sscanf(line, "%f %f %f %f", &w, &x, &y, &z); - if ( r == 4 ) { - - printf("Rotation is: %f %f %f %f (modulus=%f)\n", - w, x, y, z, sqrtf(w*w + x*x + y*y + z*z)); - - image.orientation.w = w; - image.orientation.x = x; - image.orientation.y = y; - image.orientation.z = z; - - done = 1; - + /* Read quaternion from stdin */ + if ( config_randomquat ) { + image.orientation = random_quaternion(); } else { - fprintf(stderr, "Invalid rotation '%s'\n", line); + image.orientation = read_quaternion(); } - } while ( !done ); + if ( quaternion_valid(image.orientation) ) { + fprintf(stderr, "Orientation modulus is not zero!\n"); + return 1; + } + + /* Ensure no residual information */ + image.qvecs = NULL; + image.sfacs = NULL; + image.data = NULL; + image.twotheta = NULL; + image.hdr = NULL; - /* Ensure no residual information */ - image.qvecs = NULL; - image.sfacs = NULL; - image.data = NULL; - image.twotheta = NULL; - image.hdr = NULL; + get_diffraction(&image); + record_image(&image); - get_diffraction(&image); - record_image(&image); + snprintf(filename, 1023, "results/sim-%i.h5", number); + number++; - snprintf(filename, 1023, "results/sim-%i.h5", number); - number++; + /* Write the output file */ + hdf5_write(filename, image.data, image.width, image.height); - /* Write the output file */ - hdf5_write(filename, image.data, image.width, image.height); + /* Clean up */ + free(image.data); + free(image.qvecs); + free(image.hdr); + free(image.sfacs); + free(image.twotheta); - /* Clean up */ - free(image.data); - free(image.qvecs); - free(image.hdr); - free(image.sfacs); - free(image.twotheta); + if ( n_images && (number >= n_images) ) done = 1; - /* Do it all again */ - goto again; + } while ( !done ); } |