aboutsummaryrefslogtreecommitdiff
path: root/src/hrs-scaling.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/hrs-scaling.c')
-rw-r--r--src/hrs-scaling.c48
1 files changed, 45 insertions, 3 deletions
diff --git a/src/hrs-scaling.c b/src/hrs-scaling.c
index 99490251..e2adaaf6 100644
--- a/src/hrs-scaling.c
+++ b/src/hrs-scaling.c
@@ -35,6 +35,45 @@
#define MAX_CYCLES (30)
+char *find_common_reflections(struct image *images, int n)
+{
+ int i;
+ char *cref;
+
+ cref = calloc(n*n, sizeof(char));
+
+ for ( i=0; i<n; i++ ) {
+
+ Reflection *refl;
+ RefListIterator *iter;
+
+ for ( refl = first_refl(images[i].reflections, &iter);
+ refl != NULL;
+ refl = next_refl(refl, iter) ) {
+
+ signed int h, k, l;
+ int j;
+
+ get_indices(refl, &h, &k, &l);
+
+ for ( j=0; j<i; j++ ) {
+ Reflection *r2;
+ r2 = find_refl(images[j].reflections, h, k, l);
+ if ( r2 != NULL ) {
+ cref[i+n*j] = 1;
+ cref[j+n*i] = 1;
+ break;
+ }
+ }
+
+ }
+
+ }
+
+ return cref;
+}
+
+
static void s_uhavha(signed int hat, signed int kat, signed int lat,
struct image *image, double *uha, double *vha)
{
@@ -97,7 +136,7 @@ static double s_vh(struct image *images, int n,
static double iterate_scale(struct image *images, int n,
- ReflItemList *obs, const char *sym)
+ ReflItemList *obs, const char *sym, char *cref)
{
gsl_matrix *M;
gsl_vector *v;
@@ -181,6 +220,9 @@ static double iterate_scale(struct image *images, int n,
/* Matrix is symmetric */
if ( b > a ) continue;
+ /* Zero if no common reflections */
+ if ( cref[a+n*b] != 0 ) continue;
+
uhb = uha_arr[b];
vhb = vha_arr[b];
rhb = vhb - image_b->osf * uhb * Ih;
@@ -336,7 +378,7 @@ static void normalise_osfs(struct image *images, int n)
/* Scale the stack of images */
double *scale_intensities(struct image *images, int n, const char *sym,
- ReflItemList *obs)
+ ReflItemList *obs, char *cref)
{
int m;
double *I_full;
@@ -350,7 +392,7 @@ double *scale_intensities(struct image *images, int n, const char *sym,
i = 0;
do {
- max_shift = iterate_scale(images, n, obs, sym);
+ max_shift = iterate_scale(images, n, obs, sym, cref);
STATUS("Iteration %2i: max shift = %5.2f\n", i, max_shift);
i++;
normalise_osfs(images, n);