aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas White <taw@physics.org>2010-10-13 19:11:33 +0200
committerThomas White <taw@physics.org>2012-02-22 15:27:03 +0100
commite9803e863335882f161295af184d91ebd5e9e02c (patch)
tree3ca6dfccaa46bab288877b7211cf5e6ef824f868
parent0b478031e18a0028b535a5f296a3050e7a6f26a9 (diff)
compare_hkl: Generate completeness etc
-rw-r--r--src/compare_hkl.c165
1 files changed, 155 insertions, 10 deletions
diff --git a/src/compare_hkl.c b/src/compare_hkl.c
index 9baf3e29..959f1fed 100644
--- a/src/compare_hkl.c
+++ b/src/compare_hkl.c
@@ -48,12 +48,22 @@ static void show_help(const char *s)
static void plot_shells(const double *ref1, const double *ref2,
- ReflItemList *items, double scale, UnitCell *cell)
+ ReflItemList *items, double scale, UnitCell *cell,
+ const char *sym, ReflItemList *characterise,
+ unsigned int *char_counts)
{
double num[NBINS];
int cts[NBINS];
+ int possible[NBINS];
+ unsigned int *counted;
+ unsigned int measurements[NBINS];
+ unsigned int measured[NBINS];
+ double total_vol, vol_per_shell;
+ double rmins[NBINS];
+ double rmaxs[NBINS];
double den;
- double rmin, rmax, rstep;
+ double rmin, rmax;
+ signed int h, k, l;
int i;
int ctot;
FILE *fh;
@@ -72,6 +82,9 @@ static void plot_shells(const double *ref1, const double *ref2,
for ( i=0; i<NBINS; i++ ) {
num[i] = 0.0;
cts[i] = 0;
+ possible[i] = 0;
+ measured[i] = 0;
+ measurements[i] = 0;
}
rmin = +INFINITY;
@@ -90,7 +103,119 @@ static void plot_shells(const double *ref1, const double *ref2,
if ( d < rmin ) rmin = d;
}
- rstep = (rmax-rmin) / NBINS;
+
+ STATUS("%f -> %f\n", rmin/1e9, rmax/1e9);
+
+ /* Increase the max just a little bit */
+ rmax += 0.001e9;
+
+ total_vol = pow(rmax, 3.0) - pow(rmin, 3.0);
+ vol_per_shell = total_vol / NBINS;
+ rmins[0] = rmin;
+ for ( i=1; i<NBINS; i++ ) {
+
+ double r;
+
+ r = vol_per_shell + pow(rmins[i-1], 3.0);
+ r = pow(r, 1.0/3.0);
+
+ rmaxs[i-1] = r;
+ rmins[i] = r;
+
+ STATUS("Shell %i: %f to %f\n", i-1,
+ rmins[i-1]/1e9, rmaxs[i-1]/1e9);
+
+ }
+ rmaxs[NBINS-1] = rmax;
+ STATUS("Shell %i: %f to %f\n", NBINS-1,
+ rmins[NBINS-1]/1e9, rmaxs[NBINS-1]/1e9);
+
+#if 0
+ /* FIXME: Fixed resolution shells */
+ rmins[0] = 0.121065; rmaxs[0] = 0.552486;
+ rmins[1] = 0.552486; rmaxs[1] = 0.690186;
+ rmins[2] = 0.690186; rmaxs[2] = 0.787787;
+ rmins[3] = 0.787787; rmaxs[3] = 0.865813;
+ rmins[4] = 0.865813; rmaxs[4] = 0.931853;
+ rmins[5] = 0.931853; rmaxs[5] = 0.989663;
+ rmins[6] = 0.989663; rmaxs[6] = 1.041409;
+ rmins[7] = 1.041409; rmaxs[7] = 1.088467;
+ rmins[8] = 1.088467; rmaxs[8] = 1.131775;
+ rmins[9] = 1.131775; rmaxs[9] = 1.172000;
+ for ( i=0; i<NBINS; i++ ) {
+ rmins[i] *= 1e9;
+ rmaxs[i] *= 1e9;
+ }
+#endif
+
+ /* Count the number of reflections possible in each shell */
+ counted = new_list_count();
+ for ( h=-50; h<=+50; h++ ) {
+ for ( k=-50; k<=+50; k++ ) {
+ for ( l=-50; l<=+50; l++ ) {
+
+ double d;
+ signed int hs, ks, ls;
+ int bin;
+
+ /* FIXME: Reflection condition */
+ // if ( (h==0) && (k==0) && (l%2) ) continue;
+
+ get_asymm(h, k, l, &hs, &ks, &ls, sym);
+ if ( lookup_count(counted, hs, ks, ls) ) continue;
+ set_count(counted, hs, ks, ls, 1);
+
+ d = resolution(cell, h, k, l) * 2.0;
+
+ bin = -1;
+ for ( i=0; i<NBINS; i++ ) {
+ if ( (d>rmins[i]) && (d<=rmaxs[i]) ) {
+ bin = i;
+ break;
+ }
+ }
+ if ( bin == -1 ) continue;
+
+ possible[bin]++;
+
+ }
+ }
+ }
+ free(counted);
+
+ /* Characterise the first data set (only) */
+ for ( i=0; i<num_items(characterise); i++ ) {
+
+ struct refl_item *it;
+ signed int h, k, l;
+ double d;
+ int bin;
+ int j;
+
+ it = get_item(characterise, i);
+ h = it->h; k = it->k; l = it->l;
+
+ /* FIXME: Reflection condition */
+ //if ( (h==0) && (k==0) && (l%2) ) continue;
+
+ d = resolution(cell, h, k, l) * 2.0;
+
+ bin = -1;
+ for ( j=0; j<NBINS; j++ ) {
+ if ( (d>rmins[j]) && (d<=rmaxs[j]) ) {
+ bin = j;
+ break;
+ }
+ }
+ if ( bin == -1 ) {
+ ERROR("Warnung! %i %i %i %f\n", h, k, l, d/1e9);
+ continue;
+ }
+
+ measured[bin]++;
+ measurements[bin] += lookup_count(char_counts, h, k, l);
+
+ }
den = 0.0;
ctot = 0;
@@ -101,14 +226,28 @@ static void plot_shells(const double *ref1, const double *ref2,
double d;
int bin;
double i1, i2, f1, f2;
+ int j;
it = get_item(items, i);
h = it->h; k = it->k; l = it->l;
+ /* FIXME: Reflection condition */
+ //if ( (h==0) && (k==0) && (l%2) ) continue;
+
d = resolution(cell, h, k, l) * 2.0;
- bin = (d-rmin)/rstep;
- if ( bin == NBINS ) bin = NBINS-1;
+ bin = -1;
+ for ( j=0; j<NBINS; j++ ) {
+ if ( (d>rmins[j]) && (d<=rmaxs[j]) ) {
+ bin = j;
+ break;
+ }
+ }
+ if ( bin == -1 ) {
+ ERROR("Warnung! %i %i %i %f\n", h, k, l, d/1e9);
+ abort();
+ continue;
+ }
i1 = lookup_intensity(ref1, h, k, l);
if ( i1 < 0.0 ) continue;
@@ -120,17 +259,20 @@ static void plot_shells(const double *ref1, const double *ref2,
num[bin] += fabs(f1 - f2);
den += (f1 + f2) / 2.0;
- cts[bin]++;
ctot++;
+ cts[bin]++;
}
for ( i=0; i<NBINS; i++ ) {
double r, cen;
- cen = rmin + rstep*i + rstep/2.0;
+ cen = rmins[i] + (rmaxs[i] - rmins[i])/2.0;
r = (num[i]/den)*((double)ctot/cts[i]);
- fprintf(fh, "%f %f %i\n", cen*1.0e-9, r*100.0, cts[i]);
+ fprintf(fh, "%f %f %i %i %i %f\n", cen*1.0e-9, r*100.0,
+ measured[i],
+ possible[i], measurements[i],
+ (float)measurements[i]/measured[i]);
}
@@ -159,6 +301,7 @@ int main(int argc, char *argv[])
double *esd2;
int rej1 = 0;
int rej2 = 0;
+ unsigned int *cts1;
/* Long options */
const struct option longopts[] = {
@@ -220,7 +363,8 @@ int main(int argc, char *argv[])
ref1 = new_list_intensity();
esd1 = new_list_sigma();
- i1 = read_reflections(afile, ref1, NULL, NULL, esd1);
+ cts1 = new_list_count();
+ i1 = read_reflections(afile, ref1, NULL, cts1, esd1);
if ( i1 == NULL ) {
ERROR("Couldn't open file '%s'\n", afile);
return 1;
@@ -326,7 +470,8 @@ int main(int argc, char *argv[])
pearson);
if ( config_shells ) {
- plot_shells(ref1, ref2_transformed, icommon, scale_rdig, cell);
+ plot_shells(ref1, ref2_transformed, icommon, scale_rdig, cell,
+ sym, i1, cts1);
}
if ( outfile != NULL ) {