/* * 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 "mapping.h" #include "prealign.h" #include "control.h" void main_do_reconstruction(ControlContext *ctx) { int val = 0; if ( ctx->inputfiletype != INPUT_CACHE ) { prealign_sum_stack(ctx); mapping_create(ctx); } if ( (ctx->inputfiletype != INPUT_CACHE) && !val && ctx->reflectionlist && ctx->savecache ) { cache_save(ctx->filename, ctx->reflectionlist); } if ( (ctx->rmode == RECONSTRUCTION_PREDICTION) && (ctx->reflectionlist) ) { val = ipr_refine(ctx); } if ( !val && (ctx->reflectionlist) ) { ctx->dw = displaywindow_open(ctx); } else { fprintf(stderr, "Reconstruction failed.\n"); gtk_exit(0); } } 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 */ } if ( gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(ctx->checkbox_prealign)) ) { ctx->prealign = TRUE; } else { ctx->prealign = FALSE; } if ( gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(ctx->checkbox_savecache)) ) { ctx->savecache = TRUE; } else { ctx->savecache = FALSE; } gtk_widget_destroy(method_window); while ( gtk_events_pending() ) gtk_main_iteration(); /* Load the input */ 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->reflectionlist = cache_load(ctx->filename); val=0; } if ( val ) { fprintf(stderr, "Reconstruction failed.\n"); gtk_exit(0); } if ( ctx->prealign ) { prealign_do_series(ctx); } else { main_do_reconstruction(ctx); } } 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, 10); table = gtk_table_new(4, 2, FALSE); gtk_table_set_row_spacings(GTK_TABLE(table), 5); 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); 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, 3, 4); 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, 4, 5); 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 = control_ctx_new(); type = INPUT_NONE; if ( qdrp_is_qdrprc(filename) ) { printf("QDRP input file detected.\n"); ctx->inputfiletype = INPUT_QDRP; } else if ( mrc_is_mrcfile(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 { fprintf(stderr, "Unrecognised input file type\n"); return 1; } ctx->filename = strdup(argv[1]); ctx->n_images = 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; }