From 189da15810deabd739d7c11c6e95fea55739fe60 Mon Sep 17 00:00:00 2001 From: Thomas White Date: Sat, 1 Aug 2020 15:13:49 +0200 Subject: Initial import from archive --- src/data.c | 162 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 162 insertions(+) create mode 100644 src/data.c (limited to 'src/data.c') diff --git a/src/data.c b/src/data.c new file mode 100644 index 0000000..5a2829f --- /dev/null +++ b/src/data.c @@ -0,0 +1,162 @@ +/* + * data.c + * + * Handle the input data + * + * (c) 2006-2008 Thomas White + * + * Synth2d - two-dimensional Fourier synthesis + * + */ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include +#include +#include +#include + +#include "main.h" +#include "data.h" +#include "reflist.h" +#include "displaywindow.h" + +signed int data_width_hidden = 512; +signed int data_height_hidden = 512; +float data_a_hidden = 1; +float data_b_hidden = 1; +float data_c_hidden = 1; +double data_gamma_hidden = M_PI_2; +ReflectionList *data_reflections = NULL; +int data_image_scale = 500; + +unsigned int data_width() { return data_width_hidden; } +unsigned int data_height() { return data_height_hidden; } +double data_a() { return data_a_hidden; } +double data_b() { return data_b_hidden; } +double data_c() { return data_c_hidden; } +double data_gamma() { return data_gamma_hidden; } +unsigned int data_get_image_scale() { return data_image_scale; } + +static void data_calculatesize() { + data_width_hidden = data_a_hidden*data_image_scale; + data_height_hidden = data_b_hidden*data_image_scale; +} + +void data_dividecell(unsigned int na, unsigned int nb, unsigned int nc) { + data_a_hidden /= na; + data_b_hidden /= nb; + data_c_hidden /= nc; + data_calculatesize(); +} + +int data_read(const char *filename) { + + FILE *fh; + char *line; + char *rval; + unsigned int whoops = 0; + float gamma_angle = 90; + signed int laue = 0; + + if ( data_reflections ) { + free(data_reflections); + } + data_reflections = reflist_new(); + + fh = fopen(filename, "r"); + if ( !fh ) { + fprintf(stderr, "DA: Couldn't open file %s\n", filename); + return 1; + } + line = malloc(1024); + rval = "hello"; + while ( rval ) { + + signed int h, k, l; + float am, intensity; + float ph = 0; + int res; + + rval = fgets(line, 1023, fh); + if ( ferror(fh) && !feof(fh) ) { + whoops = 1; + break; + } + if ( strlen(line) > 1 ) { + if ( line[strlen(line)-1] == '\n' ) { + line[strlen(line)-1] = '\0'; /* Cut off trailing newline. */ + } + } else { + line[0] = '\0'; + } + + res = sscanf(line, "%3i %3i %3i %f %f", &h, &k, &l, &intensity, &ph); + if ( intensity > 0.0) am = sqrt(intensity); + if ( (res < 4) && gamma_angle ) { + sscanf(line, "angle %f", &gamma_angle); + sscanf(line, "a %f", &data_a_hidden); + sscanf(line, "b %f", &data_b_hidden); + sscanf(line, "c %f", &data_c_hidden); + sscanf(line, "scale %i", &data_image_scale); + } else { + if ( res == 5 ) { + + if ( (h==0) && (k==0) && (l==0) ) { + printf("DA: Data contains a zero-order beam value.\n"); + } else if ( (h==0) && (k==0) ) { + printf("DA: Data may contain a zero-order beam value.\n"); + } + if ( (l != laue) && (laue != 999999) ) { + //printf("DA: WARNING: Data is from more than one Laue zone\n"); + } else { + laue = l; + reflist_addref_am_ph(data_reflections, h, k, l, am, ph); + } + } else { + if ( (h==0) && (k==0) && (l==0) ) { + printf("DA: Data contains a zero-order beam value.\n"); + } else if ( (h==0) && (k==0) ) { + printf("DA: Data may contain a zero-order beam value.\n"); + } + if ( (l != laue) && (laue != 999999) ) { + //printf("DA: WARNING: Data is from more than one Laue zone\n"); + } else { + laue = l; + reflist_addref_am(data_reflections, h, k, l, am); + } + } + } + + line[0] = '\0'; /* Prevent this line from being parsed twice. */ + + } + + fclose(fh); + free(line); + + if ( whoops ) { + fprintf(stderr, "Couldn't read file %s\n", filename); + return 1; + } + + data_calculatesize(); + printf("a=%f, b=%f, width=%i, height=%i, gamma=%f\n", data_a_hidden, data_b_hidden, data_width_hidden, data_height_hidden, gamma_angle); + data_gamma_hidden = (gamma_angle/180)*M_PI; + + return 0; + +} + +ReflectionList *data_getreflections() { + return data_reflections; +} + +void data_free() { + + reflist_free(data_reflections); + +} -- cgit v1.2.3