aboutsummaryrefslogtreecommitdiff
path: root/src/process_hkl.c
diff options
context:
space:
mode:
authorThomas White <taw@physics.org>2010-07-14 16:18:58 +0200
committerThomas White <taw@physics.org>2012-02-22 15:26:53 +0100
commit6a476e010468f27e02df6bb90a1ea197bd9d039d (patch)
treed3edead6940f8845be01a1c8ea30cb6912f9e57b /src/process_hkl.c
parentd8c885d3057a05cbb7f3104540f61699d6ef075b (diff)
process_hkl: Restructure and remove all intensity analysis stuff
Diffstat (limited to 'src/process_hkl.c')
-rw-r--r--src/process_hkl.c404
1 files changed, 130 insertions, 274 deletions
diff --git a/src/process_hkl.c b/src/process_hkl.c
index 29288154..b5b6df9a 100644
--- a/src/process_hkl.c
+++ b/src/process_hkl.c
@@ -56,16 +56,7 @@ static void show_help(const char *s)
" --stop-after=<n> Stop after processing n patterns. Zero means\n"
" keep going until the end of the input, and is\n"
" the default.\n"
-" -c, --compare-with=<file> Compare with reflection intensities in this file\n"
"\n"
-" -e, --output-every=<n> Analyse figures of merit after every n patterns\n"
-" Default: 1000. A value of zero means to do the\n"
-" analysis only after reading all the patterns.\n"
-" -r, --rvsq Output lists of R vs |q| (\"Luzzatti plots\")\n"
-" when analysing figures of merit.\n"
-" --detwin Correlate each new pattern with the current\n"
-" model and choose the best fitting out of the\n"
-" allowable twins.\n"
" --scale Scale each pattern for best fit with the current\n"
" model.\n"
" -y, --symmetry=<sym> Merge according to point group <sym>.\n"
@@ -73,113 +64,6 @@ static void show_help(const char *s)
}
-static void write_RvsQ(const char *name, double *ref, double *trueref,
- unsigned int *counts, double scale, UnitCell *cell)
-{
- FILE *fh;
- double smax, sbracket;
- signed int h, k, l;
-
- fh = fopen(name, "w");
-
- smax = 0.0;
- for ( h=-INDMAX; h<INDMAX; h++ ) {
- for ( k=-INDMAX; k<INDMAX; k++ ) {
- for ( l=-INDMAX; l<INDMAX; l++ ) {
- double s = 2.0*resolution(cell, h, k, l);
- if ( (lookup_count(counts, h, k, l) > 0) && (s > smax) ) {
- smax = s;
- }
- }
- }
- }
-
- for ( sbracket=0.0; sbracket<smax; sbracket+=smax/RVQDV ) {
-
- double top = 0.0;
- double bot = 0.0;
- int nhits = 0;
- int nrefl = 0;
- double R;
- double hits_per_refl;
-
- for ( h=-INDMAX; h<INDMAX; h++ ) {
- for ( k=-INDMAX; k<INDMAX; k++ ) {
- for ( l=-INDMAX; l<INDMAX; l++ ) {
-
- double s;
- int c;
-
- if ( (h==0) && (k==0) && (l==0) ) continue;
-
- c = lookup_count(counts, h, k, l);
- s = 2.0*resolution(cell, h, k, l);
- if ((s>=sbracket) && (s<sbracket+smax/RVQDV) && (c>0)) {
-
- double obs, calc, obsi;
-
- obs = lookup_intensity(ref, h, k, l);
- calc = lookup_intensity(trueref, h, k, l);
-
- obsi = obs / (double)c;
- top += pow(obsi - scale*calc, 2.0);
- bot += pow(obsi, 2.0);
- nhits += c;
- nrefl++;
-
- }
-
- }
- }
- }
-
- R = sqrt(top/bot);
- hits_per_refl = nrefl ? (double)nhits/nrefl : 0;
-
- fprintf(fh, "%8.5f %8.5f %5.2f\n", sbracket+smax/(2.0*RVQDV),
- R, hits_per_refl);
-
- }
- fclose(fh);
-}
-
-
-static void process_reflections(double *ref, unsigned int *counts,
- double *trueref, unsigned int *truecounts,
- unsigned int n_patterns,
- UnitCell *cell, int do_rvsq)
-{
- int j;
- double mean_counts;
- int ctot = 0;
- int nmeas = 0;
- double R, scale;
- FILE *fh;
-
- for ( j=0; j<LIST_SIZE; j++ ) {
- ctot += counts[j];
- if ( counts[j] > 0 ) nmeas++;
- }
- mean_counts = (double)ctot/nmeas;
-
- R = stat_r2(ref, counts, trueref, truecounts, &scale);
- STATUS("%8u: R=%5.2f%% (sf=%7.4e) mean meas/refl=%5.2f,"
- " %i reflections measured\n",
- n_patterns, R*100.0, scale, mean_counts, nmeas);
-
- if ( do_rvsq ) {
- /* Record graph of R against q for this N */
- char name[64];
- snprintf(name, 63, "R_vs_q-%u.dat", n_patterns);
- write_RvsQ(name, ref, trueref, counts, scale, cell);
- }
-
- fh = fopen("results/convergence.dat", "a");
- fprintf(fh, "%u %5.2f %5.2f\n", n_patterns, R*100.0, mean_counts);
- fclose(fh);
-}
-
-
/* Note "holo" needn't actually be a holohedral point group, if you want to try
* something strange like resolving from a low-symmetry group into an even
* lower symmetry one.
@@ -321,34 +205,132 @@ static void merge_pattern(double *model, const double *new,
}
+static void merge_all(FILE *fh, double *model, unsigned int *model_counts,
+ int config_maxonly, int config_scale, int config_sum,
+ int config_stopafter,
+ ReflItemList *twins, const char *holo, const char *mero,
+ int n_total_patterns)
+{
+ char *rval;
+ float f0;
+ int n_nof0 = 0;
+ int f0_valid = 0;
+ int n_patterns = 0;
+ double *new_pattern = new_list_intensity();
+ ReflItemList *items = new_items();
+
+ do {
+
+ char line[1024];
+ signed int h, k, l;
+ float intensity;
+ int r;
+
+ rval = fgets(line, 1023, fh);
+ if ( (strncmp(line, "Reflections from indexing", 25) == 0)
+ || (strncmp(line, "New pattern", 11) == 0) ) {
+
+ /* Start of first pattern? */
+ if ( n_patterns == 0 ) {
+ n_patterns++;
+ continue;
+ }
+
+ /* Assume a default I0 if we don't have one by now */
+ if ( config_scale && !f0_valid ) {
+ n_nof0++;
+ f0 = 1.0;
+ }
+
+ /* Scale if requested */
+ if ( config_scale ) {
+ scale_intensities(model, new_pattern,
+ model_counts, items, f0,
+ f0_valid);
+ }
+
+ /* Start of second or later pattern */
+ merge_pattern(model, new_pattern, model_counts,
+ items, config_maxonly, config_sum, twins,
+ holo, mero);
+
+ if ( n_patterns == config_stopafter ) break;
+
+ n_patterns++;
+ clear_items(items);
+
+ progress_bar(n_patterns, n_total_patterns, "Merging");
+
+ f0_valid = 0;
+
+ }
+
+ if ( strncmp(line, "f0 = ", 5) == 0 ) {
+ r = sscanf(line, "f0 = %f", &f0);
+ if ( r != 1 ) {
+ f0 = 1.0;
+ f0_valid = 0;
+ continue;
+ }
+ f0_valid = 1;
+ }
+
+ r = sscanf(line, "%i %i %i %f", &h, &k, &l, &intensity);
+ if ( r != 4 ) continue;
+
+ if ( (h==0) && (k==0) && (l==0) ) continue;
+
+ if ( find_item(items, h, k, l) != 0 ) {
+ ERROR("More than one measurement for %i %i %i in"
+ " pattern number %i\n", h, k, l, n_patterns);
+ }
+ set_intensity(new_pattern, h, k, l, intensity);
+ add_item(items, h, k, l);
+
+ } while ( rval != NULL );
+
+ delete_items(items);
+ free(new_pattern);
+
+ STATUS("%i patterns had no f0 valid value.\n", n_nof0);
+}
+
+
+static int count_patterns(FILE *fh)
+{
+ char *rval;
+
+ int n_total_patterns = 0;
+ do {
+ char line[1024];
+
+ rval = fgets(line, 1023, fh);
+ if ( (strncmp(line, "Reflections from indexing", 25) == 0)
+ || (strncmp(line, "New pattern", 11) == 0) ) {
+ n_total_patterns++;
+ }
+ } while ( rval != NULL );
+
+ return n_total_patterns;
+}
+
+
int main(int argc, char *argv[])
{
int c;
char *filename = NULL;
char *output = NULL;
FILE *fh;
- unsigned int n_patterns;
- double *model, *trueref = NULL;
+ double *model;
unsigned int *model_counts;
- char *rval;
UnitCell *cell;
int config_maxonly = 0;
- int config_every = 1000;
- int config_rvsq = 0;
int config_stopafter = 0;
int config_sum = 0;
- int config_detwin = 0;
int config_scale = 0;
- char *intfile = NULL;
- double *new_pattern = NULL;
unsigned int n_total_patterns;
- unsigned int *truecounts = NULL;
char *sym = NULL;
char *pdb = NULL;
- float f0;
- int f0_valid;
- int n_nof0 = 0;
- ReflItemList *items;
ReflItemList *twins;
int i;
@@ -359,11 +341,8 @@ int main(int argc, char *argv[])
{"output", 1, NULL, 'o'},
{"max-only", 0, &config_maxonly, 1},
{"output-every", 1, NULL, 'e'},
- {"rvsq", 0, NULL, 'r'},
{"stop-after", 1, NULL, 's'},
- {"compare-with", 0, NULL, 'c'},
{"sum", 0, &config_sum, 1},
- {"detwin", 0, &config_detwin, 1},
{"scale", 0, &config_scale, 1},
{"symmetry", 1, NULL, 'y'},
{"pdb", 1, NULL, 'p'},
@@ -387,23 +366,10 @@ int main(int argc, char *argv[])
output = strdup(optarg);
break;
-
- case 'r' :
- config_rvsq = 1;
- break;
-
- case 'e' :
- config_every = atoi(optarg);
- break;
-
case 's' :
config_stopafter = atoi(optarg);
break;
- case 'c' :
- intfile = strdup(optarg);
- break;
-
case 'p' :
pdb = strdup(optarg);
break;
@@ -426,15 +392,6 @@ int main(int argc, char *argv[])
return 1;
}
- if ( intfile != NULL ) {
- truecounts = new_list_count();
- STATUS("Comparing against '%s'\n", intfile);
- trueref = read_reflections(intfile, truecounts, NULL);
- free(intfile);
- } else {
- trueref = NULL;
- }
-
if ( pdb == NULL ) {
pdb = strdup("molecule.pdb");
}
@@ -445,37 +402,10 @@ int main(int argc, char *argv[])
model = new_list_intensity();
model_counts = new_list_count();
- new_pattern = new_list_intensity();
- items = new_items();
cell = load_cell_from_pdb(pdb);
free(pdb);
- if ( strcmp(filename, "-") == 0 ) {
- fh = stdin;
- } else {
- fh = fopen(filename, "r");
- }
- free(filename);
- if ( fh == NULL ) {
- ERROR("Failed to open input file\n");
- return 1;
- }
-
- /* Count the number of patterns in the file */
- n_total_patterns = 0;
- do {
- char line[1024];
-
- rval = fgets(line, 1023, fh);
- if ( (strncmp(line, "Reflections from indexing", 25) == 0)
- || (strncmp(line, "New pattern", 11) == 0) ) {
- n_total_patterns++;
- }
- } while ( rval != NULL );
- rewind(fh);
- STATUS("There are %i patterns to process\n", n_total_patterns);
-
/* Show useful symmetry information */
const char *holo = get_holohedral(sym);
int np = num_general_equivs(holo) / num_general_equivs(sym);
@@ -496,112 +426,38 @@ int main(int argc, char *argv[])
twins = NULL;
}
- n_patterns = 0;
- f0_valid = 0;
- do {
-
- char line[1024];
- signed int h, k, l;
- float intensity;
- int r;
-
- rval = fgets(line, 1023, fh);
- if ( (strncmp(line, "Reflections from indexing", 25) == 0)
- || (strncmp(line, "New pattern", 11) == 0) ) {
-
- /* Start of first pattern? */
- if ( n_patterns == 0 ) {
- n_patterns++;
- continue;
- }
-
- /* Detwin before scaling */
- if ( config_detwin ) {
- detwin_intensities(model, new_pattern,
- model_counts, items);
- }
-
- /* Assume a default I0 if we don't have one by now */
- if ( config_scale && !f0_valid ) {
- n_nof0++;
- f0 = 1.0;
- }
-
- /* Scale if requested */
- if ( config_scale ) {
- scale_intensities(model, new_pattern,
- model_counts, items, f0,
- f0_valid);
- }
-
- /* Start of second or later pattern */
- merge_pattern(model, new_pattern, model_counts,
- items, config_maxonly, config_sum, twins,
- holo, sym);
-
- if ( (trueref != NULL) && config_every
- && (n_patterns % config_every == 0) ) {
- process_reflections(model, model_counts,
- trueref, truecounts,
- n_patterns, cell,
- config_rvsq);
- }
-
- if ( n_patterns == config_stopafter ) break;
-
- n_patterns++;
- clear_items(items);
-
- progress_bar(n_patterns, n_total_patterns, "Merging");
-
- f0_valid = 0;
-
- }
-
- if ( strncmp(line, "f0 = ", 5) == 0 ) {
- r = sscanf(line, "f0 = %f", &f0);
- if ( r != 1 ) {
- f0 = 1.0;
- f0_valid = 0;
- continue;
- }
- f0_valid = 1;
- }
-
- r = sscanf(line, "%i %i %i %f", &h, &k, &l, &intensity);
- if ( r != 4 ) continue;
-
- if ( (h==0) && (k==0) && (l==0) ) continue;
+ /* Open the data stream */
+ if ( strcmp(filename, "-") == 0 ) {
+ fh = stdin;
+ } else {
+ fh = fopen(filename, "r");
+ }
+ free(filename);
+ if ( fh == NULL ) {
+ ERROR("Failed to open input file\n");
+ return 1;
+ }
- if ( find_item(items, h, k, l) != 0 ) {
- ERROR("More than one measurement for %i %i %i in"
- " pattern number %i\n", h, k, l, n_patterns);
- }
- set_intensity(new_pattern, h, k, l, intensity);
- add_item(items, h, k, l);
+ /* Count the number of patterns in the file */
+ n_total_patterns = count_patterns(fh);
+ STATUS("There are %i patterns to process\n", n_total_patterns);
+ rewind(fh);
- } while ( rval != NULL );
+ merge_all(fh, model, model_counts,
+ config_maxonly, config_scale, config_sum, config_stopafter,
+ twins, holo, sym, n_total_patterns);
+ rewind(fh);
fclose(fh);
- if ( trueref != NULL ) {
- process_reflections(model, model_counts, trueref, truecounts,
- n_patterns, cell, config_rvsq);
- }
-
if ( output != NULL ) {
write_reflections(output, model_counts, model, NULL,
0, cell, 1);
}
- STATUS("There were %u patterns.\n", n_patterns);
- STATUS("%i had no f0 valid value.\n", n_nof0);
-
- delete_items(items);
free(sym);
free(model);
free(model_counts);
- free(new_pattern);
free(output);
free(cell);