aboutsummaryrefslogtreecommitdiff
path: root/src/pattern_sim.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/pattern_sim.c')
-rw-r--r--src/pattern_sim.c165
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 );
}