aboutsummaryrefslogtreecommitdiff
path: root/src/intensities.c
blob: 96c7ad15ca1da21166121c0bcc50a484c5f77cb6 (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
97
98
99
100
101
102
103
104
105
106
107
108
109
/*
 * intensities.c
 *
 * Extract integrated intensities by relrod estimation
 *
 * (c) 2007 Thomas White <taw27@cam.ac.uk>
 *
 *  dtr - Diffraction Tomography Reconstruction
 *
 */

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

#include "control.h"
#include "reflections.h"
#include "image.h"
#include "reproject.h"

/* Extract integrated reflection intensities by estimating the spike function
 * based on the observed intensity and the calculated excitation error from
 * the lattice refinement.  Easy.	*/
void intensities_extract(ControlContext *ctx) {

	int i, j;
	int n_meas, n_dupl, n_notf;
	double max;
	Reflection *reflection;

	/* Free previous analysis if required */
	if ( ctx->integrated != NULL ) {
		reflectionlist_free(ctx->integrated);
	}
	ctx->integrated = reflectionlist_new();
	
	n_meas = 0;
	n_dupl = 0;
	n_notf = 0;
	max = 0;
	for ( i=0; i<ctx->images->n_images; i++ ) {
	
		ImageRecord *image;
		
		image = &ctx->images->images[i];
		if ( image->rflist == NULL ) image->rflist = reproject_get_reflections(image, ctx->cell_lattice);
		
		for ( j=0; j<image->rflist->n_features; j++ ) {
		
			ImageFeature *feature;
			signed int h, k, l;
			
			feature = &image->rflist->features[j];
			
			h = feature->reflection->h;
			k = feature->reflection->k;
			l = feature->reflection->l;
				
			if ( feature->partner != NULL ) {
			
				if ( (h!=0) || (k!=0) || (l!=0) ) {
				
					double intensity;
					Reflection *new;
					
					/* Perform relrod calculation of doom here.
					 * TODO: Figure out if this is even possible. */
					intensity = feature->partner->intensity;
					
					new = reflection_add(ctx->integrated,
							feature->reflection->x, feature->reflection->y, feature->reflection->z,
							intensity, REFLECTION_GENERATED);
					
					if ( new != NULL ) {
						new->h = h;
						new->k = k;
						new->l = l;
						//printf("IN: Adding %3i %3i %3i, intensity=%f\n", h, k, l, intensity);
						if ( intensity > max ) max = intensity;
						n_meas++;
					} else {
						printf("IN: Duplicate measurement for %3i %3i %3i\n", h, k, l);
						n_dupl++;
					}
				
				}
				
			} else {
				//printf("IN: %3i %3i %3i not found\n", h, k, l);
				n_notf++;
			}
		
		}
		
	}
	
	/* Normalise all reflections to the most intense reflection */
	reflection = ctx->integrated->reflections;
	while ( reflection ) {
		reflection->intensity /= max;
		reflection = reflection->next;
	}
	
	printf("IN: %5i intensities measured\n", n_meas);
	printf("IN: %5i duplicated measurements\n", n_dupl);
	printf("IN: %5i predicted reflections not found\n", n_notf);

}