aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authortaw27 <taw27@bf6ca9ba-c028-0410-8290-897cf20841d1>2007-10-03 23:15:53 +0000
committertaw27 <taw27@bf6ca9ba-c028-0410-8290-897cf20841d1>2007-10-03 23:15:53 +0000
commit6c4cc88d5248507a3ce9970e1ed8eca60b60952a (patch)
tree83b1a1f4ab5846bfed8774f2091c76993dd9e0e5 /src
parent2314f19f1502e713cf9aa54330273820e652e6f6 (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.c35
-rw-r--r--src/cache.h3
-rw-r--r--src/control.h7
-rw-r--r--src/displaywindow.c41
-rw-r--r--src/displaywindow.h3
-rw-r--r--src/main.c68
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 */
diff --git a/src/main.c b/src/main.c
index 1a93483..374f3e8 100644
--- a/src/main.c
+++ b/src/main.c
@@ -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;