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
|
/*
* index.c
*
* Perform indexing (somehow)
*
* (c) 2006-2010 Thomas White <taw@physics.org>
*
* Part of CrystFEL - crystallography with a FEL
*
*/
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include <string.h>
#include <assert.h>
#include "image.h"
#include "utils.h"
#include "peaks.h"
#include "dirax.h"
#include "sfac.h"
#include "detector.h"
/* x,y in pixels relative to central beam */
int map_position(struct image *image, double x, double y,
double *rx, double *ry, double *rz)
{
/* "Input" space */
double d;
/* Angular description of reflection */
double theta, psi, k;
k = 1.0 / image->lambda;
if ( image->fmode == FORMULATION_CLEN ) {
/* Convert pixels to metres */
x /= image->resolution;
y /= image->resolution; /* Convert pixels to metres */
d = sqrt((x*x) + (y*y));
theta = atan2(d, image->camera_len);
} else if (image->fmode == FORMULATION_PIXELSIZE ) {
/* Convert pixels to metres^-1 */
x *= image->pixel_size;
y *= image->pixel_size; /* Convert pixels to metres^-1 */
d = sqrt((x*x) + (y*y));
theta = atan2(d, k);
} else {
ERROR("Unrecognised formulation mode in mapping_scale.\n");
return -1;
}
psi = atan2(y, x);
*rx = k*sin(theta)*cos(psi);
*ry = k*sin(theta)*sin(psi);
*rz = k - k*cos(theta);
return 0;
}
void index_pattern(struct image *image, int no_index, int dump_peaks,
int use_dirax)
{
int i;
/* Perform 'fine' peak search */
search_peaks(image, dump_peaks);
/* Map positions to 3D */
for ( i=0; i<image_feature_count(image->features); i++ ) {
struct imagefeature *f;
f = image_get_feature(image->features, i);
if ( f->y >=512 ) {
/* Top half of CCD */
map_position(image, f->x-UPPER_CX, f->y-UPPER_CY,
&f->rx, &f->ry, &f->rz);
} else {
/* Lower half of CCD */
map_position(image, f->x-LOWER_CX, f->y-LOWER_CY,
&f->rx, &f->ry, &f->rz);
}
}
if ( use_dirax ) {
run_dirax(image, no_index);
return;
}
}
|