1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
|
/*
* reflections.c
*
* Utilities for handling reflections
*
* (c) 2007-2009 Thomas White <taw@physics.org>
*
* Part of CrystFEL - crystallography with a FEL
*
*/
#include <stdlib.h>
#include <math.h>
#include <stdio.h>
#include <complex.h>
#include <string.h>
#include "utils.h"
#include "cell.h"
#include "reflections.h"
void write_reflections(const char *filename, unsigned int *counts,
double *ref, int zone_axis, UnitCell *cell)
{
FILE *fh;
signed int h, k, l;
if ( filename == NULL ) {
fh = stdout;
} else {
fh = fopen(filename, "w");
}
if ( fh == NULL ) {
ERROR("Couldn't open output file!\n");
return;
}
/* Write spacings and angle if zone axis pattern */
if ( zone_axis ) {
double a, b, c, alpha, beta, gamma;
cell_get_parameters(cell, &a, &b, &c, &alpha, &beta, &gamma);
fprintf(fh, "a %5.3f nm\n", a*1e9);
fprintf(fh, "b %5.3f nm\n", b*1e9);
fprintf(fh, "angle %5.3f deg\n", rad2deg(gamma));
fprintf(fh, "scale 10\n");
}
for ( h=-INDMAX; h<INDMAX; h++ ) {
for ( k=-INDMAX; k<INDMAX; k++ ) {
for ( l=-INDMAX; l<INDMAX; l++ ) {
int N;
double F;
if ( counts ) {
N = lookup_count(counts, h, k, l);
if ( N == 0 ) continue;
} else {
N = 1;
}
F = lookup_intensity(ref, h, k, l) / N;
if ( zone_axis && (l != 0) ) continue;
fprintf(fh, "%3i %3i %3i %f\n", h, k, l, F);
}
}
}
fclose(fh);
}
double *ideal_intensities(double complex *sfac)
{
double *ref;
signed int h, k, l;
ref = new_list_intensity();
/* Generate ideal reflections from complex structure factors */
for ( h=-INDMAX; h<=INDMAX; h++ ) {
for ( k=-INDMAX; k<=INDMAX; k++ ) {
for ( l=-INDMAX; l<=INDMAX; l++ ) {
double complex F = lookup_sfac(sfac, h, k, l);
double intensity = pow(cabs(F), 2.0);
set_intensity(ref, h, k, l, intensity);
}
}
}
return ref;
}
|