aboutsummaryrefslogtreecommitdiff
path: root/src/main.c
diff options
context:
space:
mode:
authortaw27 <taw27@bf6ca9ba-c028-0410-8290-897cf20841d1>2007-02-05 21:12:57 +0000
committertaw27 <taw27@bf6ca9ba-c028-0410-8290-897cf20841d1>2007-02-05 21:12:57 +0000
commit05b5d261682b9136fb46476a64eab6980b0dba64 (patch)
treed7faa450b69cf2104ffff7fc89a95914284d23af /src/main.c
Initial import
git-svn-id: svn://cook.msm.cam.ac.uk:745/diff-tomo/dtr@1 bf6ca9ba-c028-0410-8290-897cf20841d1
Diffstat (limited to 'src/main.c')
-rw-r--r--src/main.c183
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;
+
+}