diff options
author | taw27 <taw27@bf6ca9ba-c028-0410-8290-897cf20841d1> | 2007-03-31 00:19:35 +0000 |
---|---|---|
committer | taw27 <taw27@bf6ca9ba-c028-0410-8290-897cf20841d1> | 2007-03-31 00:19:35 +0000 |
commit | 8810e9ff13e9fb0db420dbdc529ef2f9dfe89d7c (patch) | |
tree | f256152050817b789554e0d18974fafcfbdf9644 | |
parent | 3db95bb6d650a56eefd8c6d7dbd6bdc57e0e2350 (diff) |
Fussiness:
Disable choice of peak detection algorithm when cached reflections used
Fix formatting and namespace convention in cache.{c,h}
Prevent reading beyond bounds of Reflection struct when saving cache
Handle caching when no reflections were found
(Temporarily?) disable octtree hooks
Tweak some credits anad syntax message
Other (mostly trivial) tweaks
git-svn-id: svn://cook.msm.cam.ac.uk:745/diff-tomo/dtr@15 bf6ca9ba-c028-0410-8290-897cf20841d1
-rw-r--r-- | src/cache.c | 148 | ||||
-rw-r--r-- | src/cache.h | 41 | ||||
-rw-r--r-- | src/displaywindow.c | 10 | ||||
-rw-r--r-- | src/displaywindow.h | 1 | ||||
-rw-r--r-- | src/main.c | 21 | ||||
-rw-r--r-- | src/reflections.h | 2 |
6 files changed, 125 insertions, 98 deletions
diff --git a/src/cache.c b/src/cache.c index 1dac3ec..a146eb1 100644 --- a/src/cache.c +++ b/src/cache.c @@ -4,77 +4,91 @@ * Save the reflection datablock to save having to recalculate it * * (c) 2007 Gordon Ball <gfb21@cam.ac.uk> + * Thomas White <taw27@cam.ac.uk> + * * dtr - Diffraction Tomography Reconstruction * */ - -#include "reflections.h" -#include "cache.h" + +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + #include <stdlib.h> #include <stdio.h> #include <stdint.h> #include <string.h> - - ReflectionContext *load_rctx_from_file(const char *filename) { - FILE *f; - CacheHeader ch; - ReflectionContext *rctx; - Reflection r; - Reflection *cr; - Reflection_NoPointer rnp; - rctx = reflection_init(); - f = fopen(filename, "rb"); - fread(&ch,sizeof(CacheHeader),1,f); - - int i; - for (i=0;i<ch.count;i++) { - - fread(&rnp,sizeof(Reflection_NoPointer),1,f); - - cr = malloc(sizeof(Reflection)); - memcpy(cr,&rnp,sizeof(Reflection)); - //printf("reading (%f,%f,%f) i=%f (%d,%d,%d) %d\n",cr->x,cr->y,cr->z,cr->intensity,cr->h,cr->k,cr->l,cr->type); - reflection_add_from_reflection(rctx,cr); - } - - fclose(f); - return rctx; - } - - int save_rctx_to_file(const char *filename, ReflectionContext *rctx) { - FILE *f; - CacheHeader ch; - Reflection *r; - Reflection_NoPointer *rnp; - char top[16] = "DTR-CACHE"; - int count=0; - - rnp = malloc(sizeof(Reflection_NoPointer)); - - r = rctx->reflections; - do { - count++; - } while ((r = r->next) != NULL ); - - - f = fopen(filename, "wb"); - memcpy(&ch.top,&top,sizeof(top)); - ch.count = count; - ch.scale = 0.; //temp, currently doesn't do anything - fwrite(&ch,sizeof(CacheHeader),1,f); - - r = rctx->reflections; - - do { - memcpy(rnp,r,sizeof(Reflection_NoPointer)); - //printf("writing (%f,%f,%f) i=%f (%d,%d,%d) %d\n",rnp->x,rnp->y,rnp->z,rnp->intensity,rnp->h,rnp->k,rnp->l,rnp->type); - fwrite(rnp,sizeof(Reflection_NoPointer),1,f); - //fwrite(r,sizeof(Reflection_NoPointer),1,f); - } while ((r = r->next) != NULL ); - - fclose(f); - return 0; - } - - -
\ No newline at end of file + +#include "reflections.h" +#include "cache.h" + +ReflectionContext *cache_load(const char *filename) { + + FILE *f; + CacheHeader ch; + ReflectionContext *rctx; + + rctx = reflection_init(); + f = fopen(filename, "rb"); + fread(&ch, sizeof(CacheHeader), 1, f); + + int i; + for ( i=0; i<ch.count; i++ ) { + + CachedReflection rnp; + Reflection *cr; + + fread(&rnp, sizeof(CachedReflection), 1, f); + + cr = malloc(sizeof(Reflection)); + memcpy(cr, &rnp, sizeof(CachedReflection)); + cr->next = NULL; /* Guarantee swift failure in the event of a screw-up */ + //printf("reading (%f,%f,%f) i=%f (%d,%d,%d) %d\n",cr->x,cr->y,cr->z,cr->intensity,cr->h,cr->k,cr->l,cr->type); + reflection_add_from_reflection(rctx, cr); + + } + + fclose(f); + + return rctx; +} + +int cache_save(const char *filename, ReflectionContext *rctx) { + + FILE *f; + CacheHeader ch; + Reflection *r; + CachedReflection *rnp; + int count; + char top[16] = "DTRCACHE\0\0\0\0\0\0\0\0"; + + count = 0; + r = rctx->reflections; + while ( r != NULL ) { + count++; + r = r->next; + }; + + f = fopen(filename, "wb"); + memcpy(&ch.top, &top, sizeof(top)); + ch.count = count; + ch.scale = 0.; //temp, currently doesn't do anything + fwrite(&ch, sizeof(CacheHeader), 1, f); + + r = rctx->reflections; + rnp = malloc(sizeof(CachedReflection)); + while ( r != NULL ) { + + memcpy(rnp, r, sizeof(CachedReflection)); + //printf("writing (%f,%f,%f) i=%f (%d,%d,%d) %d\n",rnp->x,rnp->y,rnp->z,rnp->intensity,rnp->h,rnp->k,rnp->l,rnp->type); + fwrite(rnp, sizeof(CachedReflection), 1, f); + r = r->next; + + }; + free(rnp); + + fclose(f); + + return 0; + +} diff --git a/src/cache.h b/src/cache.h index 9320703..38371e4 100644 --- a/src/cache.h +++ b/src/cache.h @@ -1,18 +1,31 @@ -#ifndef CACHE_H_ -#define CACHE_H_ - - +/* + * cache.c + * + * Save the reflection datablock to save having to recalculate it + * + * (c) 2007 Gordon Ball <gfb21@cam.ac.uk> + * Thomas White <taw27@cam.ac.uk> + * + * dtr - Diffraction Tomography Reconstruction + * + */ + +#ifndef CACHE_H +#define CACHE_H + +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif typedef struct struct_cacheheader { char top[16]; int count; double scale; } CacheHeader; -/* - * Necessary to define this because I'm developing this on an amd64 machine, - * so pointers are 8 bytes instead of 4 on i386, so can't just dump reflection structs to disk -*/ -typedef struct struct_specialreflect { + +/* Can't just use Reflection type because size of a pointer may vary */ +typedef struct struct_cachedreflection { + double x; double y; double z; @@ -23,12 +36,10 @@ typedef struct struct_specialreflect { signed int l; ReflectionType type; -} Reflection_NoPointer; - -extern ReflectionContext *load_rctx_from_file(const char *filename); - -int save_rctx_to_file(const char *filename, ReflectionContext *rctx); + +} CachedReflection; +extern ReflectionContext *cache_load(const char *filename); +extern int cache_save(const char *filename, ReflectionContext *rctx); #endif /*CACHE_H_*/ - diff --git a/src/displaywindow.c b/src/displaywindow.c index 1ed6493..f4a8b4a 100644 --- a/src/displaywindow.c +++ b/src/displaywindow.c @@ -447,7 +447,6 @@ static gint displaywindow_gl_expose(GtkWidget *widget, GdkEventExpose *event, Co } /* Zero plane */ - /* glBegin(GL_QUADS); glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, yellow_glass); glVertex3f(50, 50, 0.0); @@ -455,10 +454,9 @@ static gint displaywindow_gl_expose(GtkWidget *widget, GdkEventExpose *event, Co glVertex3f(-50, -50, 0.0); glVertex3f(-50, 50, 0.0); glEnd(); - */ //octtree bit - temporary - glBegin(GL_LINES); + /*glBegin(GL_LINES); glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, blue); disp_oct_stack(o); @@ -466,7 +464,7 @@ static gint displaywindow_gl_expose(GtkWidget *widget, GdkEventExpose *event, Co glBegin(GL_POINTS); glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, red); disp_oct_list(ol); - glEnd(); + glEnd();*/ if ( gdk_gl_drawable_is_double_buffered(gldrawable) ) { @@ -539,11 +537,11 @@ void displaywindow_open(ControlContext *ctx) { char *title; GdkGLConfig *glconfig; - o = gen_octtree(ctx->reflectionctx,15); + /*o = gen_octtree(ctx->reflectionctx,15); print_octtree(o); int count=0; ol = find_sparse_trees(o,3,1,&count); - + */ filename = basename(ctx->filename); title = malloc(10+strlen(filename)); strcpy(title, "dtr: "); diff --git a/src/displaywindow.h b/src/displaywindow.h index 6eae540..f4a7f27 100644 --- a/src/displaywindow.h +++ b/src/displaywindow.h @@ -8,7 +8,6 @@ * */ - #ifdef HAVE_CONFIG_H #include <config.h> #endif @@ -4,6 +4,8 @@ * The Top Level Source File * * (c) 2007 Thomas White <taw27@cam.ac.uk> + * Gordon Ball <gfb21@cam.ac.uk> + * * dtr - Diffraction Tomography Reconstruction * */ @@ -59,21 +61,20 @@ static gint main_method_window_response(GtkWidget *method_window, gint response, } else if ( ctx->inputfiletype == INPUT_MRC ) { val = mrc_read(ctx); } else if ( ctx->inputfiletype == INPUT_CACHE ) { - ctx->reflectionctx = load_rctx_from_file(ctx->filename); + ctx->reflectionctx = cache_load(ctx->filename); val=0; } - if (ctx->inputfiletype == INPUT_QDRP || ctx->inputfiletype == INPUT_MRC) { + if ( ctx->inputfiletype != INPUT_CACHE ) { printf("Saving reflection block to reflect.cache\n"); - save_rctx_to_file("reflect.cache",ctx->reflectionctx); + cache_save("reflect.cache", ctx->reflectionctx); } - if ( !val && (ctx->rmode == RECONSTRUCTION_PREDICTION) ) { val = ipr_reduce(ctx); } - dump_histogram(ctx->reflectionctx); + //dump_histogram(ctx->reflectionctx); if ( val == 0 ) { displaywindow_open(ctx); @@ -130,6 +131,10 @@ void main_method_dialog_open(ControlContext *ctx) { gtk_combo_box_append_text(GTK_COMBO_BOX(ctx->combo_peaksearch), "Iterative Statistical"); gtk_combo_box_set_active(GTK_COMBO_BOX(ctx->combo_peaksearch), 3); gtk_table_attach_defaults(GTK_TABLE(table), ctx->combo_peaksearch, 2, 3, 2, 3); + + if ( ctx->inputfiletype == INPUT_CACHE ) { + gtk_widget_set_sensitive(GTK_WIDGET(ctx->combo_peaksearch), FALSE); + } gtk_box_pack_start(GTK_BOX(vbox), GTK_WIDGET(table), TRUE, TRUE, 5); @@ -160,7 +165,7 @@ int main(int argc, char *argv[]) { } if ( argc != 2 ) { - fprintf(stderr, "Syntax: %s [<MRC file> | qdrp.rc]\n", argv[0]); + fprintf(stderr, "Syntax: %s [<MRC file> | qdrp.rc | reflect.cache]\n", argv[0]); return 1; } @@ -174,11 +179,11 @@ int main(int argc, char *argv[]) { } else if ( strcmp(filename+(strlen(filename)-4), ".mrc") == 0 ) { printf("MRC tomography file detected.\n"); ctx->inputfiletype = INPUT_MRC; - } else if (strcmp(filename, "reflect.cache") == 0 ) { + } else if ( strcmp(filename, "reflect.cache") == 0 ) { printf("reflect.cache detected.\n"); ctx->inputfiletype = INPUT_CACHE; } else { - fprintf(stderr, "Input file must either be an MRC tomography file or a QDRP-style control file.\n"); + fprintf(stderr, "Unrecognised input file type\n"); return 1; } ctx->filename = strdup(argv[1]); diff --git a/src/reflections.h b/src/reflections.h index a3a3993..ac08133 100644 --- a/src/reflections.h +++ b/src/reflections.h @@ -34,7 +34,7 @@ typedef struct reflection_struct { ReflectionType type; - struct reflection_struct *next; + struct reflection_struct *next; /* MUST BE LAST in order for caching to work */ } Reflection; |