pattern_sim.c 3.25 KB
Newer Older
1
2
3
4
5
/*
 * main.c
 *
 * (c) 2006-2009 Thomas White <thomas.white@desy.de>
 *
6
 * pattern_sim - Simulate diffraction patterns from small crystals
7
8
9
10
11
12
13
14
15
16
17
18
19
 *
 */


#ifdef HAVE_CONFIG_H
#include <config.h>
#endif

#include <stdarg.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
Thomas White's avatar
Thomas White committed
20
#include <getopt.h>
21

22
#include "image.h"
Thomas White's avatar
Thomas White committed
23
#include "diffraction.h"
24
#include "cell.h"
25
26
#include "utils.h"
#include "hdf5-file.h"
Thomas White's avatar
Thomas White committed
27
#include "detector.h"
28
29
30
31


/* Crystal size in metres */
#define CRYSTAL_SIZE (500.0e-9)
32

33

Thomas White's avatar
Thomas White committed
34
static void show_help(const char *s)
35
{
Thomas White's avatar
Thomas White committed
36
37
38
39
40
41
42
43
44
45
46
47
48
	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");
}


static void show_details(const char *s)
{
	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");
49
50
51
52
53
}


int main(int argc, char *argv[])
{
54
	int c, done;
55
	struct image image;
56
57
	char filename[1024];
	int number = 1;
Thomas White's avatar
Thomas White committed
58
59
60
61
62
63
64
	int config_simdetails = 0;

	const struct option longopts[] = {
	      {"help", 0, NULL, 'h'},
	      {"simulation-details", 0, &config_simdetails, 1},
	      {0, 0, NULL, 0}
	};
65

Thomas White's avatar
Thomas White committed
66
	while ((c = getopt_long(argc, argv, "h", longopts, NULL)) != -1) {
67

Thomas White's avatar
Thomas White committed
68
69
70
71
72
		switch (c) {
		case 'h' : {
			show_help(argv[0]);
			return 0;
		}
73

Thomas White's avatar
Thomas White committed
74
75
76
		case 0 : {
			break;
		}
77

Thomas White's avatar
Thomas White committed
78
79
80
		default : {
			return 1;
		}
81
82
83
84
		}

	}

Thomas White's avatar
Thomas White committed
85
86
87
88
89
	if ( config_simdetails ) {
		show_details(argv[0]);
		return 0;
	}

Thomas White's avatar
Thomas White committed
90
	/* Define image parameters */
Thomas White's avatar
Thomas White committed
91
92
	image.width = 1024;
	image.height = 1024;
Thomas White's avatar
Thomas White committed
93
	image.fmode = FORMULATION_CLEN;
Thomas White's avatar
Thomas White committed
94
95
	image.x_centre = 512.5;
	image.y_centre = 512.5;
Thomas White's avatar
Thomas White committed
96
	image.camera_len = 0.05;  /* 5 cm (front CCD can move from 5cm-20cm) */
Thomas White's avatar
Thomas White committed
97
	image.resolution = 13333.3; /* 75 micron pixel size */
Thomas White's avatar
Thomas White committed
98
99
100
101
102
103
104
	image.xray_energy = eV_to_J(2.0e3); /* 2 keV energy */
	image.lambda = ph_en_to_lambda(image.xray_energy);  /* Wavelength */
	image.molecule = NULL;

	/* Splurge a few useful numbers */
	printf("Wavelength is %f nm\n", image.lambda/1.0e-9);

105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
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;

		} else {
			fprintf(stderr, "Invalid rotation '%s'\n", line);
		}

	} while ( !done );

Thomas White's avatar
Thomas White committed
140
	/* Ensure no residual information */
Thomas White's avatar
Thomas White committed
141
142
143
	image.qvecs = NULL;
	image.sfacs = NULL;
	image.data = NULL;
Thomas White's avatar
Thomas White committed
144
	image.twotheta = NULL;
Thomas White's avatar
Thomas White committed
145
	image.hdr = NULL;
Thomas White's avatar
Thomas White committed
146

147
	get_diffraction(&image);
Thomas White's avatar
Thomas White committed
148
	record_image(&image);
Thomas White's avatar
Thomas White committed
149

150
151
	snprintf(filename, 1023, "results/sim-%i.h5", number);
	number++;
152

153
154
	/* Write the output file */
	hdf5_write(filename, image.data, image.width, image.height);
Thomas White's avatar
Thomas White committed
155
156
157
158
159
160
161
162
163

	/* Clean up */
	free(image.data);
	free(image.qvecs);
	free(image.hdr);
	free(image.sfacs);
	free(image.twotheta);

	/* Do it all again */
164
	goto again;
165
}