aboutsummaryrefslogtreecommitdiff
path: root/src/reflections.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/reflections.c')
-rw-r--r--src/reflections.c230
1 files changed, 0 insertions, 230 deletions
diff --git a/src/reflections.c b/src/reflections.c
deleted file mode 100644
index 4743aeee..00000000
--- a/src/reflections.c
+++ /dev/null
@@ -1,230 +0,0 @@
-/*
- * reflections.c
- *
- * Utilities for handling reflections
- *
- * (c) 2006-2010 Thomas White <taw@physics.org>
- *
- * Part of CrystFEL - crystallography with a FEL
- *
- */
-
-
-#include <stdlib.h>
-#include <math.h>
-#include <stdio.h>
-#include <complex.h>
-#include <string.h>
-
-#include "utils.h"
-#include "cell.h"
-#include "reflections.h"
-#include "beam-parameters.h"
-
-
-double *poisson_esds(double *intensities, ReflItemList *items,
- double adu_per_photon)
-{
- int i;
- double *esds = new_list_sigma();
-
- for ( i=0; i<num_items(items); i++ ) {
-
- struct refl_item *it;
- signed int h, k, l;
- double intensity, sigma;
-
- it = get_item(items, i);
- h = it->h; k = it->k; l = it->l;
-
- intensity = lookup_intensity(intensities, h, k, l);
-
- if ( intensity > 0.0 ) {
- sigma = adu_per_photon * sqrt(intensity/adu_per_photon);
- } else {
- sigma = 0.0;
- }
-
- set_sigma(esds, h, k, l, sigma);
-
- }
-
- return esds;
-}
-
-
-void write_reflections(const char *filename, ReflItemList *items,
- double *intensities, double *esds, double *phases,
- unsigned int *counts, UnitCell *cell)
-{
- FILE *fh;
- int i;
-
- if ( filename == NULL ) {
- fh = stdout;
- } else {
- fh = fopen(filename, "w");
- }
-
- if ( fh == NULL ) {
- ERROR("Couldn't open output file '%s'.\n", filename);
- return;
- }
-
- /* Write spacings and angle if zone axis pattern */
- fprintf(fh, " h k l I phase sigma(I) "
- " 1/d(nm^-1) counts\n");
-
- for ( i=0; i<num_items(items); i++ ) {
-
- struct refl_item *it;
- signed int h, k, l;
-
- it = get_item(items, i);
- h = it->h; k = it->k; l = it->l;
-
- int N;
- double intensity, s, sigma;
- char ph[32];
-
- if ( counts != NULL ) {
- N = lookup_count(counts, h, k, l);
- } else {
- N = 1;
- }
-
- intensity = lookup_intensity(intensities, h, k, l);
-
- if ( phases != NULL ) {
- double p;
- p = lookup_phase(phases, h, k, l);
- snprintf(ph, 31, "%8.6f", p);
- } else {
- strncpy(ph, " -", 31);
- }
-
- if ( cell != NULL ) {
- s = 2.0*resolution(cell, h, k, l);
- } else {
- s = 0.0;
- }
-
- if ( esds != NULL ) {
- sigma = lookup_sigma(esds, h, k, l);
- } else {
- sigma = 0.0;
- }
-
- /* h, k, l, I, sigma(I), s */
- fprintf(fh, "%3i %3i %3i %10.2f %s %10.2f %10.2f %7i\n",
- h, k, l, intensity, ph, sigma, s/1.0e9, N);
-
- }
- fclose(fh);
-}
-
-
-/* Read reflections from file. Returns the list of reflections successfully
- * read in. "intensities", "phases" and "counts" are lists which will be
- * populated with the values read from the file. Existing values in either list
- * will be overwritten if the reflection is read from the file, but other values
- * will be left intact.
- *
- * "intensities", "phases" or "counts" can be NULL, if you don't need them.
- */
-ReflItemList *read_reflections(const char *filename,
- double *intensities, double *phases,
- unsigned int *counts, double *esds)
-{
- FILE *fh;
- char *rval;
- ReflItemList *items;
-
- fh = fopen(filename, "r");
- if ( fh == NULL ) {
- ERROR("Failed to open input file '%s'\n", filename);
- return NULL;
- }
-
- items = new_items();
-
- do {
-
- char line[1024];
- signed int h, k, l;
- float intensity, ph, res, sigma;
- char phs[1024];
- int r;
- int cts;
-
- rval = fgets(line, 1023, fh);
- if ( rval == NULL ) continue;
- r = sscanf(line, "%i %i %i %f %s %f %f %i",
- &h, &k, &l, &intensity, phs, &sigma, &res, &cts);
- if ( r >= 8 ) {
- /* Woohoo */
- } else if ( r >= 7 ) {
- /* No "counts", that's fine.. */
- cts = 1;
- } else if ( r >= 6 ) {
- /* No resolution. Didn't want it anyway. */
- res = 0.0;
- } else if ( r >= 5 ) {
- /* No sigma. It's OK today, but one
- * day I'll get you... */
- sigma = 0.0;
- } else if ( r >= 4 ) {
- /* No phase. Better not need it.. */
- if ( phases != NULL ) {
- ERROR("Need phases and none were specified!\n");
- abort();
- }
- } else {
- /* You lose. */
- continue;
- }
-
- add_item(items, h, k, l);
-
- if ( intensities != NULL ) {
- set_intensity(intensities, h, k, l, intensity);
- }
- if ( phases != NULL ) {
- ph = atof(phs);
- set_phase(phases, h, k, l, ph);
- }
- if ( counts != NULL ) {
- set_count(counts, h, k, l, cts);
- }
- if ( esds != NULL ) {
- set_sigma(esds, h, k, l, sigma);
- }
-
- } while ( rval != NULL );
-
- fclose(fh);
-
- return items;
-}
-
-
-double *ideal_intensities(double complex *sfac)
-{
- double *ref;
- signed int h, k, l;
-
- ref = new_list_intensity();
-
- /* Generate ideal reflections from complex structure factors */
- for ( h=-INDMAX; h<=INDMAX; h++ ) {
- for ( k=-INDMAX; k<=INDMAX; k++ ) {
- for ( l=-INDMAX; l<=INDMAX; l++ ) {
- double complex F = lookup_sfac(sfac, h, k, l);
- double intensity = pow(cabs(F), 2.0);
- set_intensity(ref, h, k, l, intensity);
- }
- }
- }
-
- return ref;
-}