/* * main.c * * The Top Level Source File * * (c) 2007 Thomas White * Gordon Ball * * dtr - Diffraction Tomography Reconstruction * */ #ifdef HAVE_CONFIG_H #include #endif #define _GNU_SOURCE #include #include #include #include #include #include #include #include #include "displaywindow.h" #include "reflections.h" #include "mrc.h" #include "qdrp.h" #include "ipr.h" #include "cache.h" #include "structure.h" static gint main_method_window_response(GtkWidget *method_window, gint response, ControlContext *ctx) { if ( response == GTK_RESPONSE_OK ) { int val = -1; switch ( gtk_combo_box_get_active(GTK_COMBO_BOX(ctx->combo_algorithm)) ) { case 0 : ctx->rmode = RECONSTRUCTION_MAPPING; break; case 1 : ctx->rmode = RECONSTRUCTION_PREDICTION; break; default: abort(); } switch ( gtk_combo_box_get_active(GTK_COMBO_BOX(ctx->combo_peaksearch)) ) { case 0 : ctx->psmode = PEAKSEARCH_THRESHOLD; break; case 1 : ctx->psmode = PEAKSEARCH_ADAPTIVE_THRESHOLD; break; case 2 : ctx->psmode = PEAKSEARCH_LSQ; break; case 3 : ctx->psmode = PEAKSEARCH_ZAEFFERER; break; case 4 : ctx->psmode = PEAKSEARCH_STAT; break; default: ctx->psmode = PEAKSEARCH_NONE; break; /* This happens when reading from a cache file */ } gtk_widget_destroy(method_window); while ( gtk_events_pending() ) gtk_main_iteration(); if ( ctx->inputfiletype == INPUT_QDRP ) { val = qdrp_read(ctx); } else if ( ctx->inputfiletype == INPUT_MRC ) { val = mrc_read(ctx); } else if ( ctx->inputfiletype == INPUT_CACHE ) { ctx->reflectionctx = cache_load(ctx->filename); val=0; } if ( ctx->inputfiletype != INPUT_CACHE ) { printf("Saving reflection block to reflect.cache\n"); cache_save("reflect.cache", ctx->reflectionctx); } if ( !val && (ctx->rmode == RECONSTRUCTION_PREDICTION) ) { val = ipr_reduce(ctx); } //dump_histogram(ctx->reflectionctx); if ( val == 0 ) { displaywindow_open(ctx); } else { fprintf(stderr, "Reconstruction failed.\n"); gtk_exit(0); } } else { gtk_exit(0); } return 0; } void main_method_dialog_open(ControlContext *ctx) { GtkWidget *method_window; GtkWidget *vbox; GtkWidget *hbox; GtkWidget *table; GtkWidget *method_label; GtkWidget *peaksearch_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); 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, 5); table = gtk_table_new(3, 2, FALSE); method_label = gtk_label_new("Reconstruction Algorithm: "); gtk_table_attach_defaults(GTK_TABLE(table), method_label, 1, 2, 1, 2); gtk_misc_set_alignment(GTK_MISC(method_label), 1, 0.5); ctx->combo_algorithm = gtk_combo_box_new_text(); gtk_combo_box_append_text(GTK_COMBO_BOX(ctx->combo_algorithm), "Feature Detection and Mapping"); gtk_combo_box_append_text(GTK_COMBO_BOX(ctx->combo_algorithm), "Iterative Prediction and Refinement"); gtk_combo_box_set_active(GTK_COMBO_BOX(ctx->combo_algorithm), 1); gtk_table_attach_defaults(GTK_TABLE(table), ctx->combo_algorithm, 2, 3, 1, 2); gtk_table_set_row_spacing(GTK_TABLE(table), 1, 5); peaksearch_label = gtk_label_new("Peak Search: "); gtk_table_attach_defaults(GTK_TABLE(table), peaksearch_label, 1, 2, 2, 3); gtk_misc_set_alignment(GTK_MISC(peaksearch_label), 1, 0.5); ctx->combo_peaksearch = gtk_combo_box_new_text(); gtk_combo_box_append_text(GTK_COMBO_BOX(ctx->combo_peaksearch), "Simple Thresholding"); gtk_combo_box_append_text(GTK_COMBO_BOX(ctx->combo_peaksearch), "Adaptive Thresholding"); 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_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_combo_box_append_text(GTK_COMBO_BOX(ctx->combo_peaksearch), "Get 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); } gtk_box_pack_start(GTK_BOX(vbox), GTK_WIDGET(table), TRUE, TRUE, 5); g_signal_connect(G_OBJECT(method_window), "response", G_CALLBACK(main_method_window_response), ctx); gtk_widget_show_all(method_window); } int main(int argc, char *argv[]) { char *filename; ControlContext *ctx; InputFileType type; struct stat stat_buffer; gtk_init(&argc, &argv); if ( gtk_gl_init_check(&argc, &argv) == FALSE ) { fprintf(stderr, "Could not initialise gtkglext\n"); return 1; } if ( gdk_gl_query_extension() == FALSE ) { fprintf(stderr, "OpenGL not supported\n"); return 1; } if ( argc != 2 ) { fprintf(stderr, "Syntax: %s [ | qdrp.rc | reflect.cache]\n", argv[0]); return 1; } filename = basename(argv[1]); ctx = malloc(sizeof(ControlContext)); type = INPUT_NONE; if ( strcmp(filename, "qdrp.rc") == 0 ) { printf("QDRP input file detected.\n"); ctx->inputfiletype = INPUT_QDRP; } 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 ) { printf("reflect.cache detected.\n"); ctx->inputfiletype = INPUT_CACHE; } else { fprintf(stderr, "Unrecognised input file type\n"); return 1; } ctx->filename = strdup(argv[1]); ctx->max_d = 0; if ( stat(argv[1], &stat_buffer) == -1 ) { fprintf(stderr, "File '%s' not found\n", argv[1]); return 1; } main_method_dialog_open(ctx); gtk_main(); free(ctx->filename); free(ctx); return 0; }