diff options
Diffstat (limited to 'src/main.c')
-rw-r--r-- | src/main.c | 183 |
1 files changed, 183 insertions, 0 deletions
diff --git a/src/main.c b/src/main.c new file mode 100644 index 0000000..272c9a8 --- /dev/null +++ b/src/main.c @@ -0,0 +1,183 @@ +/* + * main.c + * + * The Top Level Source File + * + * (c) 2007 Thomas White <taw27@cam.ac.uk> + * dtr - Diffraction Tomography Reconstruction + * + */ + +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#define _GNU_SOURCE +#include <string.h> +#include <stdarg.h> +#include <stdlib.h> +#include <gtk/gtk.h> +#include <math.h> +#include <gdk/gdkgl.h> +#include <gtk/gtkgl.h> +#include <sys/stat.h> + +#include "displaywindow.h" +#include "reflections.h" +#include "mrc.h" +#include "qdrp.h" +#include "ipr.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; + default: abort(); + } + + 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); + } + + if ( ctx->rmode == RECONSTRUCTION_PREDICTION ) { + ipr_reduce(ctx); + } + + 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_set_active(GTK_COMBO_BOX(ctx->combo_peaksearch), 3); + gtk_table_attach_defaults(GTK_TABLE(table), ctx->combo_peaksearch, 2, 3, 2, 3); + + 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 [<MRC file> | qdrp.rc]\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 { + fprintf(stderr, "Input file must either be an MRC tomography file or a QDRP-style control file.\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; + +} |