diff options
author | taw27 <taw27@bf6ca9ba-c028-0410-8290-897cf20841d1> | 2007-10-03 23:15:53 +0000 |
---|---|---|
committer | taw27 <taw27@bf6ca9ba-c028-0410-8290-897cf20841d1> | 2007-10-03 23:15:53 +0000 |
commit | 6c4cc88d5248507a3ce9970e1ed8eca60b60952a (patch) | |
tree | 83b1a1f4ab5846bfed8774f2091c76993dd9e0e5 /src | |
parent | 2314f19f1502e713cf9aa54330273820e652e6f6 (diff) |
Alter the semantics of caching
git-svn-id: svn://cook.msm.cam.ac.uk:745/diff-tomo/dtr@152 bf6ca9ba-c028-0410-8290-897cf20841d1
Diffstat (limited to 'src')
-rw-r--r-- | src/cache.c | 35 | ||||
-rw-r--r-- | src/cache.h | 3 | ||||
-rw-r--r-- | src/control.h | 7 | ||||
-rw-r--r-- | src/displaywindow.c | 41 | ||||
-rw-r--r-- | src/displaywindow.h | 3 | ||||
-rw-r--r-- | src/main.c | 68 |
6 files changed, 82 insertions, 75 deletions
diff --git a/src/cache.c b/src/cache.c index ad47ca2..8c328b3 100644 --- a/src/cache.c +++ b/src/cache.c @@ -35,7 +35,7 @@ ReflectionList *cache_load(const char *filename) { ReflectionList *reflectionlist; size_t cachedreflection_size; int i; - + cachedreflection_size = sizeof(Reflection) - sizeof(Reflection *); reflectionlist = reflectionlist_new(); @@ -73,7 +73,7 @@ ReflectionList *cache_load(const char *filename) { return reflectionlist; } -int cache_save(const char *input_filename, ReflectionList *reflectionlist) { +int cache_save(ReflectionList *reflectionlist, char *cache_filename) { FILE *f; CacheHeader ch; @@ -81,11 +81,7 @@ int cache_save(const char *input_filename, ReflectionList *reflectionlist) { int count; const char top[16] = "DTRCACHE\0\0\0\0\0\0\0\0"; size_t cachedreflection_size; - char *cache_filename; - cache_filename = malloc(strlen(input_filename)+7); - strcpy(cache_filename, input_filename); - strcat(cache_filename, ".cache"); printf("Caching reflections to %s\n", cache_filename); cachedreflection_size = sizeof(Reflection) - sizeof(Reflection *); @@ -98,7 +94,7 @@ int cache_save(const char *input_filename, ReflectionList *reflectionlist) { }; f = fopen(cache_filename, "wb"); - free(cache_filename); + if ( f == NULL ) { printf("Couldn't save reflection cache\n"); return -1; @@ -122,28 +118,3 @@ int cache_save(const char *input_filename, ReflectionList *reflectionlist) { } -unsigned int cache_is_cachefile(const char *filename) { - - FILE *fh; - CacheHeader ch; - size_t nread; - - fh = fopen(filename, "rb"); - if ( !fh ) { - printf("Couldn't open file '%s'\n", filename); - return 0; - } - nread = fread(&ch, sizeof(CacheHeader), 1, fh); - fclose(fh); - - if ( nread != 1 ) { - return 0; - } - - if ( strncmp(ch.top, "DTRCACHE", 8) == 0 ) { - return 1; - } - - return 0; - -} diff --git a/src/cache.h b/src/cache.h index a52edfe..04dbdb9 100644 --- a/src/cache.h +++ b/src/cache.h @@ -18,8 +18,7 @@ #endif extern ReflectionList *cache_load(const char *filename); -extern int cache_save(const char *filename, ReflectionList *reflectionlist); -extern unsigned int cache_is_cachefile(const char *filename); +extern int cache_save(ReflectionList *reflectionlist, char *cache_filename); #endif /*CACHE_H_*/ diff --git a/src/control.h b/src/control.h index 17a41bd..6d318e9 100644 --- a/src/control.h +++ b/src/control.h @@ -39,7 +39,8 @@ typedef enum { PEAKSEARCH_ADAPTIVE_THRESHOLD, PEAKSEARCH_LSQ, PEAKSEARCH_ZAEFFERER, - PEAKSEARCH_STAT + PEAKSEARCH_STAT, + PEAKSEARCH_CACHED } PeakSearchMode; typedef struct imagerecord_struct { @@ -75,12 +76,11 @@ typedef struct cctx_struct { InputFileType inputfiletype; PeakSearchMode psmode; unsigned int prealign; - unsigned int savecache; unsigned int have_centres; - unsigned int use_dirax; /* Input filename */ char *filename; + char *cache_filename; /* Basic parameters, stored here solely so they can be copied * into the ImageRecord(s) more easily */ @@ -115,6 +115,7 @@ typedef struct cctx_struct { GtkWidget *checkbox_prealign; GtkWidget *checkbox_savecache; GtkWidget *checkbox_dirax; + GtkWidget *cache_file_selector; /* IPR stuff */ int ipr_cur_image; diff --git a/src/displaywindow.c b/src/displaywindow.c index 8e99411..5d4a8c2 100644 --- a/src/displaywindow.c +++ b/src/displaywindow.c @@ -33,6 +33,7 @@ #include "basis.h" #include "dirax.h" #include "reproject.h" +#include "cache.h" enum { DW_ORTHO, @@ -275,8 +276,6 @@ static void displaywindow_gl_create_list(DisplayWindow *dw) { dw->gl_ref_vertex_array = vertices; dw->gl_ref_normal_array = normals; } - } else { - printf("Drawing no 'measured' reflections\n"); } /* Marker "reflections" */ @@ -848,6 +847,35 @@ static gint displaywindow_changelines(GtkWidget *widget, DisplayWindow *dw) { return 0; } +static gint displaywindow_savecache_response(GtkWidget *widget, gint response, ControlContext *ctx) { + + if ( response == GTK_RESPONSE_ACCEPT ) { + char *cache_filename; + cache_filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(widget)); + cache_save(ctx->reflectionlist, cache_filename); + g_free(cache_filename); + } + + gtk_widget_destroy(widget); + + return 0; + +} + +static gint displaywindow_savecache(GtkWidget *widget, DisplayWindow *dw) { + + dw->savecache_window = gtk_file_chooser_dialog_new("Save Reflections to Cache", GTK_WINDOW(dw->window), + GTK_FILE_CHOOSER_ACTION_SAVE, + GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, + GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT, + NULL); + g_signal_connect(G_OBJECT(dw->savecache_window), "response", G_CALLBACK(displaywindow_savecache_response), dw->ctx); + gtk_widget_show_all(dw->savecache_window); + + return 0; + +} + static void displaywindow_addmenubar(DisplayWindow *dw) { GtkActionEntry entries[] = { @@ -859,8 +887,9 @@ static void displaywindow_addmenubar(DisplayWindow *dw) { { "ToolsAction", NULL, "_Tools", NULL, NULL, NULL }, { "DirAxAction", GTK_STOCK_EXECUTE, "Start _DirAx", "<Ctrl>D", NULL, G_CALLBACK(displaywindow_dirax) }, - { "StopDirAxAction", GTK_STOCK_CLOSE, "Stop DirAx", "<Ctrl>D", NULL, G_CALLBACK(displaywindow_dirax_stop) }, - { "ReprojectAction", NULL, "_Reproject Diffraction Patterns", "<Ctrl>R", NULL, G_CALLBACK(displaywindow_reproject) }, + { "StopDirAxAction", GTK_STOCK_CLOSE, "Stop DirAx", NULL, NULL, G_CALLBACK(displaywindow_dirax_stop) }, + { "ReprojectAction", NULL, "_Reproject Diffraction Patterns", NULL, NULL, G_CALLBACK(displaywindow_reproject) }, + { "SaveCacheAction", NULL, "Save Reflections to _Cache", NULL, NULL, G_CALLBACK(displaywindow_savecache) }, { "HelpAction", NULL, "_Help", NULL, NULL, NULL }, { "AboutAction", GTK_STOCK_ABOUT, "_About DTR...", NULL, NULL, G_CALLBACK(displaywindow_about) }, @@ -873,8 +902,8 @@ static void displaywindow_addmenubar(DisplayWindow *dw) { }; guint n_radios = G_N_ELEMENTS(radios); GtkToggleActionEntry toggles[] = { - { "CubeAction", NULL, "Show 100 nm^-1 _Cube", "<Ctrl>C", NULL, G_CALLBACK(displaywindow_changecube), dw->cube }, - { "LinesAction", NULL, "Show Indexing Lines", "<Ctrl>L", NULL, G_CALLBACK(displaywindow_changelines), dw->lines }, + { "CubeAction", NULL, "Show 100 nm^-1 _Cube", NULL, NULL, G_CALLBACK(displaywindow_changecube), dw->cube }, + { "LinesAction", NULL, "Show Indexing Lines", NULL, NULL, G_CALLBACK(displaywindow_changelines), dw->lines }, }; guint n_toggles = G_N_ELEMENTS(toggles); diff --git a/src/displaywindow.h b/src/displaywindow.h index fa49faf..ab9298b 100644 --- a/src/displaywindow.h +++ b/src/displaywindow.h @@ -32,7 +32,8 @@ typedef struct dw_struct { GtkWidget *status_bar; int view; GtkWidget *drawing_area; - //int pad1; + GtkWidget *savecache_window; + /* Low-level OpenGL stuff */ GLuint gl_list_id; /* Display list for "everything else" */ int gl_use_buffers; /* 0=use vertex arrays only, otherwise use VBOs */ @@ -37,15 +37,14 @@ void main_do_reconstruction(ControlContext *ctx) { - if ( (ctx->inputfiletype != INPUT_CACHE) && (ctx->inputfiletype != INPUT_DRX) ) { + if ( ctx->cache_filename ) { prealign_sum_stack(ctx); + ctx->reflectionlist = cache_load(ctx->cache_filename); + printf("Loading cached reflections from '%s'\n", ctx->cache_filename); + } else if ( ctx->inputfiletype != INPUT_DRX ) { mapping_create(ctx); } - if ( (ctx->inputfiletype != INPUT_CACHE) && ctx->reflectionlist && ctx->savecache ) { - cache_save(ctx->filename, ctx->reflectionlist); - } - if ( ctx->reflectionlist ) { ctx->dw = displaywindow_open(ctx); } else { @@ -67,6 +66,7 @@ static gint main_method_window_response(GtkWidget *method_window, gint response, case 2 : ctx->psmode = PEAKSEARCH_LSQ; break; case 3 : ctx->psmode = PEAKSEARCH_ZAEFFERER; break; case 4 : ctx->psmode = PEAKSEARCH_STAT; break; + case 5 : ctx->psmode = PEAKSEARCH_CACHED; break; default: ctx->psmode = PEAKSEARCH_NONE; break; /* This happens when reading from a cache file */ } @@ -76,11 +76,7 @@ static gint main_method_window_response(GtkWidget *method_window, gint response, ctx->prealign = FALSE; } - if ( gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(ctx->checkbox_savecache)) ) { - ctx->savecache = TRUE; - } else { - ctx->savecache = FALSE; - } + ctx->cache_filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(ctx->cache_file_selector)); gtk_widget_destroy(method_window); while ( gtk_events_pending() ) gtk_main_iteration(); @@ -90,9 +86,6 @@ static gint main_method_window_response(GtkWidget *method_window, gint response, val = qdrp_read(ctx); } else if ( ctx->inputfiletype == INPUT_MRC ) { val = mrc_read(ctx); - } else if ( ctx->inputfiletype == INPUT_CACHE ) { - ctx->reflectionlist = cache_load(ctx->filename); - if ( !ctx->reflectionlist ) val = 1; } else if ( ctx->inputfiletype == INPUT_DRX ) { ctx->reflectionlist = dirax_load(ctx->filename); if ( !ctx->reflectionlist ) val = 1; @@ -117,6 +110,18 @@ static gint main_method_window_response(GtkWidget *method_window, gint response, } +static gint main_peaksearch_changed(GtkWidget *method_window, ControlContext *ctx) { + + if ( gtk_combo_box_get_active(GTK_COMBO_BOX(ctx->combo_peaksearch)) == 5 ) { + gtk_widget_set_sensitive(GTK_WIDGET(ctx->cache_file_selector), TRUE); + } else { + gtk_widget_set_sensitive(GTK_WIDGET(ctx->cache_file_selector), FALSE); + } + + return 0; + +} + void main_method_dialog_open(ControlContext *ctx) { GtkWidget *method_window; @@ -124,14 +129,16 @@ void main_method_dialog_open(ControlContext *ctx) { GtkWidget *hbox; GtkWidget *table; GtkWidget *peaksearch_label; + GtkWidget *cache_file_selector_label; method_window = gtk_dialog_new_with_buttons("Reconstruction Parameters", NULL, GTK_DIALOG_DESTROY_WITH_PARENT, GTK_STOCK_CANCEL, GTK_RESPONSE_CLOSE, GTK_STOCK_OK, GTK_RESPONSE_OK, NULL); + gtk_window_set_default_size(GTK_WINDOW(method_window), 400, -1); vbox = gtk_vbox_new(FALSE, 0); hbox = gtk_hbox_new(TRUE, 0); gtk_box_pack_start(GTK_BOX(GTK_DIALOG(method_window)->vbox), GTK_WIDGET(hbox), FALSE, FALSE, 7); - gtk_box_pack_start(GTK_BOX(hbox), GTK_WIDGET(vbox), FALSE, FALSE, 10); + gtk_box_pack_start(GTK_BOX(hbox), GTK_WIDGET(vbox), FALSE, TRUE, 10); table = gtk_table_new(3, 2, FALSE); gtk_table_set_row_spacings(GTK_TABLE(table), 5); @@ -145,17 +152,22 @@ void main_method_dialog_open(ControlContext *ctx) { gtk_combo_box_append_text(GTK_COMBO_BOX(ctx->combo_peaksearch), "Least-Squares Fit"); gtk_combo_box_append_text(GTK_COMBO_BOX(ctx->combo_peaksearch), "Zaefferer Gradient Search"); gtk_combo_box_append_text(GTK_COMBO_BOX(ctx->combo_peaksearch), "Iterative Statistical Analysis"); + gtk_combo_box_append_text(GTK_COMBO_BOX(ctx->combo_peaksearch), "Get From Cache File"); gtk_combo_box_set_active(GTK_COMBO_BOX(ctx->combo_peaksearch), 3); gtk_table_attach_defaults(GTK_TABLE(table), ctx->combo_peaksearch, 2, 3, 1, 2); + g_signal_connect(G_OBJECT(ctx->combo_peaksearch), "changed", G_CALLBACK(main_peaksearch_changed), ctx); - ctx->checkbox_prealign = gtk_check_button_new_with_label("Pre-align image stack"); - gtk_table_attach_defaults(GTK_TABLE(table), ctx->checkbox_prealign, 1, 3, 2, 3); + cache_file_selector_label = gtk_label_new("Cache File to Load: "); + gtk_table_attach_defaults(GTK_TABLE(table), cache_file_selector_label, 1, 2, 2, 3); + gtk_misc_set_alignment(GTK_MISC(cache_file_selector_label), 1, 0.5); + ctx->cache_file_selector = gtk_file_chooser_button_new("Select Cache File to Load", GTK_FILE_CHOOSER_ACTION_OPEN); + gtk_table_attach_defaults(GTK_TABLE(table), ctx->cache_file_selector, 2, 3, 2, 3); + gtk_widget_set_sensitive(GTK_WIDGET(ctx->cache_file_selector), FALSE); - ctx->checkbox_savecache = gtk_check_button_new_with_label("Save 3D mapping cache file"); - gtk_table_attach_defaults(GTK_TABLE(table), ctx->checkbox_savecache, 1, 3, 3, 4); + ctx->checkbox_prealign = gtk_check_button_new_with_label("Manually pre-align the image stack"); + gtk_table_attach_defaults(GTK_TABLE(table), ctx->checkbox_prealign, 1, 3, 3, 4); if ( ctx->inputfiletype == INPUT_CACHE ) { - gtk_combo_box_append_text(GTK_COMBO_BOX(ctx->combo_peaksearch), "3D coordinates from cache file"); gtk_widget_set_sensitive(GTK_WIDGET(ctx->combo_peaksearch), FALSE); gtk_combo_box_set_active(GTK_COMBO_BOX(ctx->combo_peaksearch), 5); } @@ -176,7 +188,6 @@ void main_method_dialog_open(ControlContext *ctx) { int main(int argc, char *argv[]) { - char *filename; ControlContext *ctx; struct stat stat_buffer; FILE *fh; @@ -198,26 +209,23 @@ int main(int argc, char *argv[]) { return 1; } - filename = argv[1]; ctx = control_ctx_new(); + ctx->filename = strdup(argv[1]); - fh = fopen(filename, "r"); + fh = fopen(ctx->filename, "r"); if ( !fh ) { - printf("Couldn't open file '%s'\n", filename); + printf("Couldn't open file '%s'\n", ctx->filename); return 1; } fclose(fh); - if ( qdrp_is_qdrprc(filename) ) { + if ( qdrp_is_qdrprc(ctx->filename) ) { printf("QDRP input file detected.\n"); ctx->inputfiletype = INPUT_QDRP; - } else if ( mrc_is_mrcfile(filename) ) { + } else if ( mrc_is_mrcfile(ctx->filename) ) { printf("MRC tomography file detected.\n"); ctx->inputfiletype = INPUT_MRC; - } else if ( cache_is_cachefile(filename) ) { - printf("Cached reflection file detected.\n"); - ctx->inputfiletype = INPUT_CACHE; - } else if ( dirax_is_drxfile(filename) ) { + } else if ( dirax_is_drxfile(ctx->filename) ) { printf("Dirax input file detected.\n"); ctx->inputfiletype = INPUT_DRX; } else { @@ -225,8 +233,6 @@ int main(int argc, char *argv[]) { return 1; } - ctx->filename = strdup(argv[1]); - if ( stat(argv[1], &stat_buffer) == -1 ) { fprintf(stderr, "File '%s' not found\n", argv[1]); return 1; |