/* * main.c * * The Top Level Source File * * (c) 2007 Thomas White * 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" 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_ITERATIVE; 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_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); 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]\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; }