aboutsummaryrefslogtreecommitdiff
path: root/src/reflections.c
blob: 4379e25f4488e5f2a80191fe477b3bb590f5824b (plain)
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) 2006-2010 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;
}