aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--configure.ac2
-rw-r--r--data/displaywindow.ui19
-rw-r--r--src/control.c1
-rw-r--r--src/control.h4
-rw-r--r--src/dirax.c4
-rw-r--r--src/displaywindow.c178
-rw-r--r--src/displaywindow.h5
-rw-r--r--src/imagedisplay.c33
-rw-r--r--src/imagedisplay.h2
-rw-r--r--src/mapping.c5
-rw-r--r--src/refine.c108
-rw-r--r--src/refine.h3
-rw-r--r--src/reproject.c108
-rw-r--r--src/reproject.h2
14 files changed, 256 insertions, 218 deletions
diff --git a/configure.ac b/configure.ac
index 1345495..42432a4 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1,6 +1,6 @@
dnl Process this file with autoconf to produce a configure script.
-AC_INIT(dtr, 1.0.6, taw27@cam.ac.uk)
+AC_INIT(dtr, 1.0.7, taw27@cam.ac.uk)
VERSION=AC_PACKAGE_VERSION
AM_CONFIG_HEADER(config.h)
diff --git a/data/displaywindow.ui b/data/displaywindow.ui
index 83be71c..d94f8ef 100644
--- a/data/displaywindow.ui
+++ b/data/displaywindow.ui
@@ -20,8 +20,8 @@
<menuitem name="dirax" action="DirAxAction" />
<menuitem name="diraxrerun" action="DirAxReRunAction" />
<menuitem name="diraxstop" action="StopDirAxAction" />
- <menuitem name="reproject" action="ReprojectAction" />
- <menuitem name="refine" action="RefineAction" />
+ <menuitem name="refinestep" action="RefineStepAction" />
+ <menuitem name="refineseq" action="RefineSeqAction" />
<separator />
<menuitem name="setaxis" action="SetAxisAction" />
<menuitem name="incraxis" action="IncrAxisAction" />
@@ -34,5 +34,20 @@
</menubar>
+ <toolbar name="displaywindowtoolbar">
+
+ <toolitem name="tiltaxis" action="ButtonTiltAxisAction" />
+ <toolitem name="dirax" action="ButtonDirAxAction" />
+ <separator />
+ <toolitem name="first" action="ButtonFirstImageAction" />
+ <toolitem name="prev" action="ButtonPrevImageAction" />
+ <toolitem name="next" action="ButtonNextImageAction" />
+ <toolitem name="last" action="ButtonLastImageAction" />
+ <separator />
+ <toolitem name="refinestep" action="ButtonRefineStepAction" />
+ <toolitem name="refineseq" action="ButtonRefineSeqAction" />
+
+ </toolbar>
+
</ui>
diff --git a/src/control.c b/src/control.c
index 0346e7a..5c66713 100644
--- a/src/control.c
+++ b/src/control.c
@@ -31,7 +31,6 @@ ControlContext *control_ctx_new() {
ctx->reflectionlist = NULL;
ctx->refine_window = NULL;
ctx->cell_lattice = NULL;
- ctx->reproject_id = NULL;
return ctx;
diff --git a/src/control.h b/src/control.h
index 4bb828d..c6e1306 100644
--- a/src/control.h
+++ b/src/control.h
@@ -102,10 +102,6 @@ typedef struct cctx_struct {
int dirax_step;
int dirax_read_cell;
- /* Reprojection stuff */
- int reproject_cur_image;
- struct imagedisplay_struct *reproject_id;
-
/* Refinement stuff */
GtkWidget *refine_window;
diff --git a/src/dirax.c b/src/dirax.c
index e57be11..e58983a 100644
--- a/src/dirax.c
+++ b/src/dirax.c
@@ -33,6 +33,7 @@
#include "utils.h"
#include "basis.h"
#include "displaywindow.h"
+#include "reproject.h"
typedef enum {
DIRAX_INPUT_NONE,
@@ -98,6 +99,7 @@ static void dirax_parseline(const char *line, ControlContext *ctx) {
ctx->cell->a.z = z1*1e10; ctx->cell->b.z = z2*1e10; ctx->cell->c.z = z3*1e10;
printf("DX: Read a reciprocal unit cell\n");
displaywindow_update(ctx->dw);
+ reproject_lattice_changed(ctx);
ctx->dirax_read_cell = 0;
return;
}
@@ -331,7 +333,7 @@ void dirax_invoke(ControlContext *ctx) {
int saved_stderr;
if ( ctx->dirax ) {
- printf("DX: DirAx is already running.\n");
+ dirax_rerun(ctx);
return;
}
diff --git a/src/displaywindow.c b/src/displaywindow.c
index 25a48a4..9769a07 100644
--- a/src/displaywindow.c
+++ b/src/displaywindow.c
@@ -35,6 +35,7 @@
#include "cache.h"
#include "mapping.h"
#include "refine.h"
+#include "imagedisplay.h"
static void displaywindow_gl_set_ortho(DisplayWindow *dw, GLfloat w, GLfloat h) {
@@ -940,10 +941,6 @@ static void displaywindow_dirax(GtkWidget *widget, DisplayWindow *dw) {
dirax_invoke(dw->ctx);
}
-static void displaywindow_reproject(GtkWidget *widget, DisplayWindow *dw) {
- reproject_open(dw->ctx);
-}
-
static void displaywindow_dirax_stop(GtkWidget *widget, DisplayWindow *dw) {
dirax_stop(dw->ctx);
}
@@ -1092,8 +1089,44 @@ static gint displaywindow_setaxis(GtkWidget *widget, DisplayWindow *dw) {
}
-static gint displaywindow_refine(GtkWidget *widget, DisplayWindow *dw) {
- refine_open(dw->ctx);
+static gint displaywindow_image_first(GtkWidget *widget, DisplayWindow *dw) {
+
+ dw->cur_image = 0;
+ displaywindow_update_imagestack(dw);
+
+ return 0;
+}
+
+static gint displaywindow_image_prev(GtkWidget *widget, DisplayWindow *dw) {
+
+ if ( dw->cur_image > 0 ) {
+ dw->cur_image--;
+ displaywindow_update_imagestack(dw);
+ }
+ return 0;
+}
+
+static gint displaywindow_image_next(GtkWidget *widget, DisplayWindow *dw) {
+ if ( dw->cur_image < dw->ctx->images->n_images-1 ) {
+ dw->cur_image++;
+ displaywindow_update_imagestack(dw);
+ }
+ return 0;
+}
+
+static gint displaywindow_image_last(GtkWidget *widget, DisplayWindow *dw) {
+ dw->cur_image = dw->ctx->images->n_images-1;
+ displaywindow_update_imagestack(dw);
+ return 0;
+}
+
+static gint displaywindow_refinestep(GtkWidget *widget, DisplayWindow *dw) {
+ refine_do_image(dw->ctx);
+ return 0;
+}
+
+static gint displaywindow_refinestack(GtkWidget *widget, DisplayWindow *dw) {
+ refine_do_stack(dw->ctx);
return 0;
}
@@ -1111,15 +1144,24 @@ static void displaywindow_addmenubar(DisplayWindow *dw) {
{ "DirAxAction", GTK_STOCK_EXECUTE, "Start _DirAx", "<Ctrl>D", NULL, G_CALLBACK(displaywindow_dirax) },
{ "DirAxReRunAction", NULL, "Run another DirAx cycle", NULL, NULL, G_CALLBACK(displaywindow_dirax_rerun) },
{ "StopDirAxAction", NULL, "Stop DirAx", NULL, NULL, G_CALLBACK(displaywindow_dirax_stop) },
- { "ReprojectAction", NULL, "_Reproject Diffraction Patterns", NULL, NULL, G_CALLBACK(displaywindow_reproject) },
- { "RefineAction", GTK_STOCK_EXECUTE, "Refine Reconstruction", NULL, NULL, G_CALLBACK(displaywindow_refine) },
+ { "RefineStepAction", GTK_STOCK_EXECUTE, "Refine Current Image", NULL, NULL, G_CALLBACK(displaywindow_refinestep) },
+ { "RefineSeqAction", GTK_STOCK_EXECUTE, "Refine Entire Stack", NULL, NULL, G_CALLBACK(displaywindow_refinestack) },
{ "SetAxisAction", NULL, "Set Tilt Axis Position", NULL, NULL, G_CALLBACK(displaywindow_setaxis) },
{ "IncrAxisAction", NULL, "Increase Tilt Axis Position", "<Ctrl>Up", NULL, G_CALLBACK(displaywindow_incraxis) },
{ "DecrAxisAction", NULL, "Decrease Tilt Axis Position", "<Ctrl>Down", NULL, G_CALLBACK(displaywindow_decraxis) },
{ "HelpAction", NULL, "_Help", NULL, NULL, NULL },
{ "AboutAction", GTK_STOCK_ABOUT, "_About DTR...", NULL, NULL, G_CALLBACK(displaywindow_about) },
-
+
+ { "ButtonDirAxAction", GTK_STOCK_EXECUTE, "Run _DirAx", NULL, NULL, G_CALLBACK(displaywindow_dirax) },
+ { "ButtonTiltAxisAction", GTK_STOCK_PROPERTIES, "Adjust Tilt Axis", NULL, NULL, G_CALLBACK(displaywindow_setaxis) },
+ { "ButtonRefineStepAction", GTK_STOCK_EXECUTE, "Refine Image", NULL, NULL, G_CALLBACK(displaywindow_refinestep) },
+ { "ButtonRefineSeqAction", GTK_STOCK_EXECUTE, "Refine Stack", NULL, NULL, G_CALLBACK(displaywindow_refinestack) },
+ { "ButtonFirstImageAction", GTK_STOCK_GOTO_FIRST, "First Image", NULL, NULL, G_CALLBACK(displaywindow_image_first) },
+ { "ButtonPrevImageAction", GTK_STOCK_GO_BACK, "Previous Image", NULL, NULL, G_CALLBACK(displaywindow_image_prev) },
+ { "ButtonNextImageAction", GTK_STOCK_GO_FORWARD, "Next Image", NULL, NULL, G_CALLBACK(displaywindow_image_next) },
+ { "ButtonLastImageAction", GTK_STOCK_GOTO_LAST, "Last Image", NULL, NULL, G_CALLBACK(displaywindow_image_last) },
+
};
guint n_entries = G_N_ELEMENTS(entries);
GtkRadioActionEntry radios[] = {
@@ -1154,12 +1196,93 @@ static void displaywindow_addmenubar(DisplayWindow *dw) {
}
+/* Notify that something about the image stack display needs to be changed.
+ eg. marks, tilt axis, image to be displayed. */
+void displaywindow_update_imagestack(DisplayWindow *dw) {
+
+ ImageFeatureList *flist;
+ size_t j;
+ ImageRecord *image;
+ GtkWidget *d;
+
+ imagedisplay_clear_marks(dw->stack);
+ imagedisplay_put_data(dw->stack, dw->ctx->images->images[dw->cur_image]);
+
+ image = &dw->ctx->images->images[dw->cur_image];
+
+ if ( dw->ctx->cell_lattice ) {
+
+ /* Perform relrod projection if necessary */
+ if ( !image->rflist ) {
+ image->rflist = reproject_get_reflections(image, dw->ctx->cell_lattice);
+ }
+
+ /* Draw the reprojected peaks */
+ for ( j=0; j<image->rflist->n_features; j++ ) {
+ imagedisplay_add_mark(dw->stack, image->rflist->features[j].x, image->rflist->features[j].y,
+ IMAGEDISPLAY_MARK_CIRCLE_1, image->rflist->features[j].intensity);
+ }
+
+ }
+
+ if ( image->features ) {
+ /* Now draw the original measured peaks */
+ flist = image->features;
+ for ( j=0; j<flist->n_features; j++ ) {
+ imagedisplay_add_mark(dw->stack, flist->features[j].x, flist->features[j].y,
+ IMAGEDISPLAY_MARK_CIRCLE_2, flist->features[j].intensity);
+ }
+ }
+
+ if ( image->features && dw->ctx->cell_lattice ) {
+ /* Now connect partners */
+ for ( j=0; j<image->rflist->n_features; j++ ) {
+ if ( image->rflist->features[j].partner ) {
+ imagedisplay_add_line(dw->stack, image->rflist->features[j].x, image->rflist->features[j].y,
+ image->rflist->features[j].partner->x, image->rflist->features[j].partner->y,
+ IMAGEDISPLAY_MARK_LINE_1);
+ }
+ }
+ }
+
+ if ( dw->cur_image == 0 ) {
+ d = gtk_ui_manager_get_widget(dw->ui, "/ui/displaywindowtoolbar/first");
+ gtk_widget_set_sensitive(GTK_WIDGET(d), FALSE);
+ d = gtk_ui_manager_get_widget(dw->ui, "/ui/displaywindowtoolbar/prev");
+ gtk_widget_set_sensitive(GTK_WIDGET(d), FALSE);
+ d = gtk_ui_manager_get_widget(dw->ui, "/ui/displaywindowtoolbar/next");
+ gtk_widget_set_sensitive(GTK_WIDGET(d), TRUE);
+ d = gtk_ui_manager_get_widget(dw->ui, "/ui/displaywindowtoolbar/last");
+ gtk_widget_set_sensitive(GTK_WIDGET(d), TRUE);
+ } else if ( dw->cur_image == dw->ctx->images->n_images-1 ) {
+ d = gtk_ui_manager_get_widget(dw->ui, "/ui/displaywindowtoolbar/first");
+ gtk_widget_set_sensitive(GTK_WIDGET(d), TRUE);
+ d = gtk_ui_manager_get_widget(dw->ui, "/ui/displaywindowtoolbar/prev");
+ gtk_widget_set_sensitive(GTK_WIDGET(d), TRUE);
+ d = gtk_ui_manager_get_widget(dw->ui, "/ui/displaywindowtoolbar/next");
+ gtk_widget_set_sensitive(GTK_WIDGET(d), FALSE);
+ d = gtk_ui_manager_get_widget(dw->ui, "/ui/displaywindowtoolbar/last");
+ gtk_widget_set_sensitive(GTK_WIDGET(d), FALSE);
+ } else {
+ d = gtk_ui_manager_get_widget(dw->ui, "/ui/displaywindowtoolbar/first");
+ gtk_widget_set_sensitive(GTK_WIDGET(d), TRUE);
+ d = gtk_ui_manager_get_widget(dw->ui, "/ui/displaywindowtoolbar/prev");
+ gtk_widget_set_sensitive(GTK_WIDGET(d), TRUE);
+ d = gtk_ui_manager_get_widget(dw->ui, "/ui/displaywindowtoolbar/next");
+ gtk_widget_set_sensitive(GTK_WIDGET(d), TRUE);
+ d = gtk_ui_manager_get_widget(dw->ui, "/ui/displaywindowtoolbar/last");
+ gtk_widget_set_sensitive(GTK_WIDGET(d), TRUE);
+ }
+
+}
+
DisplayWindow *displaywindow_open(ControlContext *ctx) {
const char *filename;
char *title;
GdkGLConfig *glconfig;
DisplayWindow *dw;
+ GtkWidget *notebook;
dw = malloc(sizeof(DisplayWindow));
@@ -1168,6 +1291,9 @@ DisplayWindow *displaywindow_open(ControlContext *ctx) {
strcpy(title, filename);
strcat(title, " - dtr");
+ dw->ctx = ctx;
+ ctx->dw = dw;
+
dw->gl_use_buffers = 1;
dw->view = DW_ORTHO;
dw->distance = 150;
@@ -1177,24 +1303,27 @@ DisplayWindow *displaywindow_open(ControlContext *ctx) {
dw->view_quat[1] = 0.0;
dw->view_quat[2] = 0.0;
dw->view_quat[3] = 1.0;
- dw->ctx = ctx;
dw->cube = TRUE;
dw->lines = FALSE;
dw->background = TRUE;
+ dw->cur_image = 0;
dw->window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_set_title(GTK_WINDOW(dw->window), title);
free(title);
- dw->bigvbox = gtk_vbox_new(FALSE, FALSE);
+ dw->bigvbox = gtk_vbox_new(FALSE, 0);
gtk_container_add(GTK_CONTAINER(dw->window), dw->bigvbox);
displaywindow_addmenubar(dw);
-
+
dw->status_bar = gtk_statusbar_new();
gtk_statusbar_set_has_resize_grip(GTK_STATUSBAR(dw->status_bar), FALSE);
gtk_box_pack_end(GTK_BOX(dw->bigvbox), dw->status_bar, FALSE, FALSE, 0);
-
+
g_signal_connect(GTK_OBJECT(dw->window), "destroy", G_CALLBACK(displaywindow_closedown), dw);
+ notebook = gtk_notebook_new();
+ gtk_box_pack_end(GTK_BOX(dw->bigvbox), notebook, TRUE, TRUE, 0);
+
/* GL stuff */
glconfig = gdk_gl_config_new_by_mode(GDK_GL_MODE_RGB | GDK_GL_MODE_DEPTH | GDK_GL_MODE_DOUBLE);
if ( glconfig == NULL ) {
@@ -1205,7 +1334,7 @@ DisplayWindow *displaywindow_open(ControlContext *ctx) {
dw->drawing_area = gtk_drawing_area_new();
gtk_widget_set_size_request(dw->drawing_area, 640, 640);
gtk_widget_set_gl_capability(dw->drawing_area, glconfig, NULL, TRUE, GDK_GL_RGBA_TYPE);
- gtk_box_pack_start(GTK_BOX(dw->bigvbox), dw->drawing_area, TRUE, TRUE, 0);
+ gtk_notebook_append_page(GTK_NOTEBOOK(notebook), dw->drawing_area, gtk_label_new("Reconstruction"));
gtk_widget_add_events(dw->drawing_area, GDK_BUTTON1_MOTION_MASK | GDK_BUTTON_PRESS_MASK | GDK_VISIBILITY_NOTIFY_MASK);
g_signal_connect(GTK_OBJECT(dw->drawing_area), "configure_event", G_CALLBACK(displaywindow_gl_configure), dw);
g_signal_connect(GTK_OBJECT(dw->drawing_area), "realize", G_CALLBACK(displaywindow_gl_realise), dw);
@@ -1213,8 +1342,14 @@ DisplayWindow *displaywindow_open(ControlContext *ctx) {
g_signal_connect(GTK_OBJECT(dw->drawing_area), "button_press_event", G_CALLBACK(displaywindow_gl_button_press), dw);
g_signal_connect(GTK_OBJECT(dw->drawing_area), "motion_notify_event", G_CALLBACK(displaywindow_gl_motion_notify), dw);
+ dw->stack = imagedisplay_new_nowindow(ctx->images->images[dw->cur_image], IMAGEDISPLAY_SHOW_TILT_AXIS | IMAGEDISPLAY_SHOW_CENTRE, NULL, NULL, NULL);
+ gtk_notebook_append_page(GTK_NOTEBOOK(notebook), dw->stack->vbox, gtk_label_new("Image Stack"));
+ displaywindow_update_imagestack(dw);
+
+ displaywindow_enable_cell_functions(dw, FALSE);
displaywindow_update_dirax(ctx, dw);
+ gtk_window_set_default_size(GTK_WINDOW(dw->window), 800, 750);
gtk_widget_show_all(dw->window);
return dw;
@@ -1262,3 +1397,18 @@ void displaywindow_error(const char *msg, DisplayWindow *dw) {
}
+void displaywindow_enable_cell_functions(DisplayWindow *dw, gboolean g) {
+
+ GtkWidget *d;
+
+ d = gtk_ui_manager_get_widget(dw->ui, "/ui/displaywindow/tools/refinestep");
+ gtk_widget_set_sensitive(d, g);
+ d = gtk_ui_manager_get_widget(dw->ui, "/ui/displaywindow/tools/refineseq");
+ gtk_widget_set_sensitive(d, g);
+ d = gtk_ui_manager_get_widget(dw->ui, "/ui/displaywindowtoolbar/refineseq");
+ gtk_widget_set_sensitive(d, g);
+ d = gtk_ui_manager_get_widget(dw->ui, "/ui/displaywindowtoolbar/refinestep");
+ gtk_widget_set_sensitive(d, g);
+
+}
+
diff --git a/src/displaywindow.h b/src/displaywindow.h
index fbd1ab5..6484b33 100644
--- a/src/displaywindow.h
+++ b/src/displaywindow.h
@@ -72,6 +72,9 @@ typedef struct dw_struct {
float x_start;
float y_start;
+ int cur_image;
+ struct imagedisplay_struct *stack;
+
/* Tilt axis adjustment window */
GtkWidget *tiltaxis_window;
GtkWidget *tiltaxis_entry;
@@ -79,10 +82,12 @@ typedef struct dw_struct {
} DisplayWindow;
extern DisplayWindow *displaywindow_open(ControlContext *ctx);
+extern void displaywindow_update_imagestack(DisplayWindow *dw);
extern void displaywindow_update(DisplayWindow *dw);
extern void displaywindow_update_dirax(ControlContext *ctx, DisplayWindow *dw);
extern void displaywindow_error(const char *msg, DisplayWindow *dw);
+extern void displaywindow_enable_cell_functions(DisplayWindow *dw, gboolean g);
#endif /* DISPLAYWINDOW_H */
diff --git a/src/imagedisplay.c b/src/imagedisplay.c
index 9c3f6cd..9774a33 100644
--- a/src/imagedisplay.c
+++ b/src/imagedisplay.c
@@ -162,7 +162,9 @@ static void imagedisplay_destroyed(GtkWidget *widget, ImageDisplay *imagedisplay
void imagedisplay_close(ImageDisplay *imagedisplay) {
imagedisplay->flags = (imagedisplay->flags | IMAGEDISPLAY_QUIT_IF_CLOSED)^IMAGEDISPLAY_QUIT_IF_CLOSED;
- gtk_widget_destroy(imagedisplay->window);
+ if ( imagedisplay->window ) {
+ gtk_widget_destroy(imagedisplay->window);
+ }
}
#define imagedisplay_draw_line(gc,x1,y1,x2,y2) (gdk_draw_line(drawingarea->window,gc, \
@@ -295,32 +297,27 @@ static gint imagedisplay_realize(GtkWidget *widget, ImageDisplay *imagedisplay)
}
-/* Display an image */
-ImageDisplay *imagedisplay_open_with_message(ImageRecord imagerecord, const char *title, const char *message,
- ImageDisplayFlags flags, GCallback mouse_click_func, gpointer callback_data) {
+ImageDisplay *imagedisplay_new_nowindow(ImageRecord imagerecord, ImageDisplayFlags flags, const char *message,
+ GCallback mouse_click_func, gpointer callback_data) {
ImageDisplay *imagedisplay;
- GdkGeometry geom;
imagedisplay = malloc(sizeof(ImageDisplay));
imagedisplay->imagerecord = imagerecord;
imagedisplay->view_width = 512;
imagedisplay->view_height = 512;
- imagedisplay->title = strdup(title);
imagedisplay->message = message;
- imagedisplay->window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
imagedisplay->mouse_click_func = mouse_click_func;
imagedisplay->flags = flags;
imagedisplay->marks = NULL;
imagedisplay->pixbuf = NULL;
imagedisplay->pixbuf_scaled = NULL;
imagedisplay->realised = FALSE;
- gtk_window_set_title(GTK_WINDOW(imagedisplay->window), imagedisplay->title);
+ imagedisplay->window = NULL;
imagedisplay_put_data(imagedisplay, imagerecord);
imagedisplay->vbox = gtk_vbox_new(FALSE, 0);
- gtk_container_add(GTK_CONTAINER(imagedisplay->window), imagedisplay->vbox);
if ( message ) {
GtkWidget *label;
@@ -343,6 +340,24 @@ ImageDisplay *imagedisplay_open_with_message(ImageRecord imagerecord, const char
g_signal_connect(GTK_OBJECT(imagedisplay->drawingarea), "configure_event", G_CALLBACK(imagedisplay_configure_event), imagedisplay);
g_signal_connect(GTK_OBJECT(imagedisplay->drawingarea), "expose-event", G_CALLBACK(imagedisplay_redraw), imagedisplay);
+ return imagedisplay;
+
+}
+
+/* Display an image */
+ImageDisplay *imagedisplay_open_with_message(ImageRecord imagerecord, const char *title, const char *message,
+ ImageDisplayFlags flags, GCallback mouse_click_func, gpointer callback_data) {
+
+ ImageDisplay *imagedisplay;
+ GdkGeometry geom;
+
+ imagedisplay = imagedisplay_new_nowindow(imagerecord, flags, message, mouse_click_func, callback_data);
+
+ imagedisplay->window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
+ gtk_container_add(GTK_CONTAINER(imagedisplay->window), imagedisplay->vbox);
+ imagedisplay->title = strdup(title);
+ gtk_window_set_title(GTK_WINDOW(imagedisplay->window), imagedisplay->title);
+
geom.min_width = 128; geom.min_height = 128;
gtk_window_set_geometry_hints(GTK_WINDOW(imagedisplay->window), GTK_WIDGET(imagedisplay->drawingarea), &geom, GDK_HINT_MIN_SIZE);
diff --git a/src/imagedisplay.h b/src/imagedisplay.h
index 681de79..325ea96 100644
--- a/src/imagedisplay.h
+++ b/src/imagedisplay.h
@@ -82,6 +82,8 @@ typedef struct imagedisplay_struct {
extern ImageDisplay *imagedisplay_open(ImageRecord image, const char *title, ImageDisplayFlags flags);
extern ImageDisplay *imagedisplay_open_with_message(ImageRecord image, const char *title, const char *message,
ImageDisplayFlags flags, GCallback mouse_click_func, gpointer callback_data);
+extern ImageDisplay *imagedisplay_new_nowindow(ImageRecord imagerecord, ImageDisplayFlags flags, const char *message,
+ GCallback mouse_click_func, gpointer callback_data);
extern void imagedisplay_add_mark(ImageDisplay *imagedisplay, double x, double y, ImageDisplayMarkType type, double weight);
extern void imagedisplay_add_line(ImageDisplay *imagedisplay, double x1, double y1, double x2, double y2, ImageDisplayMarkType type);
extern void imagedisplay_force_redraw(ImageDisplay *imagedisplay);
diff --git a/src/mapping.c b/src/mapping.c
index e1e59c5..bc6e062 100644
--- a/src/mapping.c
+++ b/src/mapping.c
@@ -167,7 +167,10 @@ void mapping_adjust_axis(ControlContext *ctx, double offset) {
}
mapping_map_features(ctx);
- if ( ctx->dw ) displaywindow_update(ctx->dw);
+ if ( ctx->dw ) {
+ displaywindow_update_imagestack(ctx->dw);
+ displaywindow_update(ctx->dw);
+ }
}
diff --git a/src/refine.c b/src/refine.c
index 8b6c716..25c4243 100644
--- a/src/refine.c
+++ b/src/refine.c
@@ -52,9 +52,6 @@ static ImageFeature *refine_fit_image(Basis *cell, ImageRecord *image, Reflectio
double day = 0.0, dby = 0.0, dcy = 0.0;
double dlx = 0.0, dly = 0.0, dlz = 0.0;
- if ( !image->rflist ) {
- image->rflist = reproject_get_reflections(image, cell_lattice);
- }
flist = image->features;
M = gsl_matrix_alloc(3, 3);
@@ -199,7 +196,7 @@ static int refine_sequence_sweep(ControlContext *ctx, double *fit, double *warp)
int series_dev_n = 0;
/* Ensure that ctx->cell_lattice is set up */
- reproject_lattice_changed(ctx);
+ reproject_cell_to_lattice(ctx);
for ( i=0; i<ctx->images->n_images; i++ ) {
@@ -210,8 +207,9 @@ static int refine_sequence_sweep(ControlContext *ctx, double *fit, double *warp)
image = &ctx->images->images[i];
/* Fit this image and update ctx->cell_lattice, index the selected pattern */
+ if ( !image->rflist ) image->rflist = reproject_get_reflections(image, ctx->cell_lattice);
refine_fit_image(ctx->cell, image, ctx->cell_lattice);
- reproject_lattice_changed(ctx);
+ reproject_cell_to_lattice(ctx);
image->rflist = reproject_get_reflections(image, ctx->cell_lattice);
n = 0;
@@ -247,7 +245,7 @@ static int refine_sequence_sweep(ControlContext *ctx, double *fit, double *warp)
}
-static gint refine_dialog_sequence(GtkWidget *widget, ControlContext *ctx) {
+void refine_do_stack(ControlContext *ctx) {
double omega_offs;
GtkWidget *window_fit;
@@ -257,21 +255,16 @@ static gint refine_dialog_sequence(GtkWidget *widget, ControlContext *ctx) {
GtkWidget *graph_warp;
double *warp_vals;
size_t idx;
- ImageDisplay *id;
fit_vals = malloc(401*sizeof(double));
warp_vals = malloc(401*sizeof(double));
idx = 0;
- if ( !ctx->cell ) {
+ if ( !ctx->cell_lattice ) {
displaywindow_error("No reciprocal unit cell has been found.", ctx->dw);
- return 0;
+ return;
}
- /* Temporarily disable ImageDisplay stuff */
- id = ctx->reproject_id;
- ctx->reproject_id = NULL;
-
for ( omega_offs=-2.0; omega_offs<=2.0; omega_offs+=0.01 ) {
double fit, warp;
@@ -285,7 +278,6 @@ static gint refine_dialog_sequence(GtkWidget *widget, ControlContext *ctx) {
if ( refine_sequence_sweep(ctx, &fit, &warp) ) {
printf("RF: Sequencer sweep failed\n");
- return 0;
}
printf("RF: omega_offs=%f, fit=%f, warp=%f\n", omega_offs, fit, warp);
fit_vals[idx] = fit;
@@ -298,7 +290,7 @@ static gint refine_dialog_sequence(GtkWidget *widget, ControlContext *ctx) {
}
- ctx->reproject_id = id;
+ displaywindow_update(ctx->dw);
reproject_lattice_changed(ctx);
window_fit = gtk_window_new(GTK_WINDOW_TOPLEVEL);
@@ -317,88 +309,22 @@ static gint refine_dialog_sequence(GtkWidget *widget, ControlContext *ctx) {
gtk_container_add(GTK_CONTAINER(window_warp), graph_warp);
gtk_widget_show_all(window_warp);
- return 0;
-
}
-static gint refine_dialog_fit_image(GtkWidget *step_button, ControlContext *ctx) {
+void refine_do_image(ControlContext *ctx) {
- if ( (ctx->reproject_id) && (ctx->cell_lattice) ) {
-
- ImageFeature *fitted;
-
- fitted = refine_fit_image(ctx->cell, &ctx->images->images[ctx->reproject_cur_image], ctx->cell_lattice);
-
- ctx->images->images[ctx->reproject_cur_image].rflist = NULL;
- reproject_lattice_changed(ctx);
- displaywindow_update(ctx->dw);
-
- if ( fitted ) {
- imagedisplay_add_mark(ctx->reproject_id, fitted->x,fitted->y, IMAGEDISPLAY_MARK_CIRCLE_3, fitted->intensity);
- }
-
- } else {
- displaywindow_error("Please first open the reprojection window and select the image to fit", ctx->dw);
+ if ( !ctx->cell_lattice ) {
+ displaywindow_error("No reciprocal unit cell has been found.", ctx->dw);
+ return;
}
-
- return 0;
-
-}
-
-static gint refine_dialog_response(GtkWidget *refine_window, gint response, ControlContext *ctx) {
-
- ctx->refine_window = NULL;
- gtk_widget_destroy(refine_window);
-
- return 0;
-
-}
-
-void refine_open(ControlContext *ctx) {
-
- GtkWidget *vbox;
- GtkWidget *hbox;
- GtkWidget *table;
- GtkWidget *label;
- GtkWidget *step_button;
- GtkWidget *sequence_button;
-
- if ( ctx->refine_window ) return;
- ctx->refine_window = gtk_dialog_new_with_buttons("Refine Reconstruction", GTK_WINDOW(ctx->dw->window),
- GTK_DIALOG_DESTROY_WITH_PARENT, GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE, NULL);
- gtk_window_set_default_size(GTK_WINDOW(ctx->refine_window), 280, -1);
+ ImageFeature *fitted;
- vbox = gtk_vbox_new(FALSE, 0);
- hbox = gtk_hbox_new(TRUE, 0);
- gtk_box_pack_start(GTK_BOX(GTK_DIALOG(ctx->refine_window)->vbox), GTK_WIDGET(hbox), FALSE, TRUE, 7);
- gtk_box_pack_start(GTK_BOX(hbox), GTK_WIDGET(vbox), FALSE, TRUE, 5);
+ fitted = refine_fit_image(ctx->cell, &ctx->images->images[ctx->dw->cur_image], ctx->cell_lattice);
- table = gtk_table_new(5, 1, FALSE);
- gtk_table_set_row_spacings(GTK_TABLE(table), 5);
- gtk_table_set_col_spacings(GTK_TABLE(table), 5);
- gtk_box_pack_start(GTK_BOX(vbox), GTK_WIDGET(table), FALSE, TRUE, 0);
-
- label = gtk_label_new("Steps");
- gtk_label_set_markup(GTK_LABEL(label), "<span weight=\"bold\">Steps</span>");
- gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
- gtk_table_attach_defaults(GTK_TABLE(table), label, 1, 2, 1, 2);
- step_button = gtk_button_new_with_label("Refine Lattice to Fit Current Pattern");
- gtk_table_attach_defaults(GTK_TABLE(table), step_button, 1, 2, 2, 3);
- g_signal_connect(G_OBJECT(step_button), "clicked", G_CALLBACK(refine_dialog_fit_image), ctx);
-
- label = gtk_label_new("Sequencing");
- gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
- gtk_label_set_markup(GTK_LABEL(label), "<span weight=\"bold\">Sequencing</span>");
- gtk_table_attach_defaults(GTK_TABLE(table), label, 1, 2, 4, 5);
-
- sequence_button = gtk_button_new_with_label("Run Sequencer");
- gtk_table_attach_defaults(GTK_TABLE(table), sequence_button, 1, 2, 5, 6);
- g_signal_connect(G_OBJECT(sequence_button), "clicked", G_CALLBACK(refine_dialog_sequence), ctx);
-
- g_signal_connect(G_OBJECT(ctx->refine_window), "response", G_CALLBACK(refine_dialog_response), ctx);
- gtk_widget_show_all(ctx->refine_window);
-
-
+ ctx->images->images[ctx->dw->cur_image].rflist = NULL;
+ reproject_lattice_changed(ctx);
+ displaywindow_update(ctx->dw);
+
}
diff --git a/src/refine.h b/src/refine.h
index f52d130..7a01e83 100644
--- a/src/refine.h
+++ b/src/refine.h
@@ -18,7 +18,8 @@
#include "control.h"
-extern void refine_open(ControlContext *ctx);
+extern void refine_do_stack(ControlContext *ctx);
+extern void refine_do_image(ControlContext *ctx);
#endif /* REFINE_H */
diff --git a/src/reproject.c b/src/reproject.c
index 2bb33dc..dc19e9a 100644
--- a/src/reproject.c
+++ b/src/reproject.c
@@ -204,108 +204,32 @@ ImageFeatureList *reproject_get_reflections(ImageRecord *image, ReflectionList *
}
-static void reproject_mark_peaks(ControlContext *ctx) {
+/* Ensure ctx->cell_lattice matches ctx->cell */
+void reproject_cell_to_lattice(ControlContext *ctx) {
- ImageFeatureList *flist;
- size_t j;
- ImageRecord *image;
-
- image = &ctx->images->images[ctx->reproject_cur_image];
-
- /* Draw the reprojected peaks */
- if ( !image->rflist ) {
- image->rflist = reproject_get_reflections(image, ctx->cell_lattice);
- }
- for ( j=0; j<image->rflist->n_features; j++ ) {
- imagedisplay_add_mark(ctx->reproject_id, image->rflist->features[j].x, image->rflist->features[j].y,
- IMAGEDISPLAY_MARK_CIRCLE_1, image->rflist->features[j].intensity);
- }
-
- /* Now draw the original measured peaks */
- flist = image->features;
- for ( j=0; j<flist->n_features; j++ ) {
- imagedisplay_add_mark(ctx->reproject_id, flist->features[j].x, flist->features[j].y,
- IMAGEDISPLAY_MARK_CIRCLE_2, image->rflist->features[j].intensity);
- }
-
- /* Now connect partners */
- for ( j=0; j<image->rflist->n_features; j++ ) {
- if ( image->rflist->features[j].partner ) {
- imagedisplay_add_line(ctx->reproject_id, image->rflist->features[j].x, image->rflist->features[j].y,
- image->rflist->features[j].partner->x, image->rflist->features[j].partner->y,
- IMAGEDISPLAY_MARK_LINE_1);
- }
- }
-
-}
-
-static void reproject_update(ControlContext *ctx) {
-
- imagedisplay_clear_marks(ctx->reproject_id);
-
- reproject_mark_peaks(ctx);
-
- imagedisplay_put_data(ctx->reproject_id, ctx->images->images[ctx->reproject_cur_image]);
-
-}
-
-static gint reproject_clicked(GtkWidget *widget, GdkEventButton *event, ControlContext *ctx) {
-
- ctx->reproject_cur_image++;
- if ( ctx->reproject_cur_image == ctx->images->n_images ) ctx->reproject_cur_image = 0;
-
- reproject_update(ctx);
+ int i;
- return 0;
-
-}
-
-void reproject_lattice_changed(ControlContext *ctx) {
-
if ( ctx->cell_lattice ) {
reflection_list_from_new_cell(ctx->cell_lattice, ctx->cell);
} else {
ctx->cell_lattice = reflection_list_from_cell(ctx->cell);
}
- if ( ctx->reproject_id ) reproject_update(ctx);
-
-}
-
-static gint reproject_closed(GtkWidget *widget, ControlContext *ctx) {
- ctx->reproject_id = NULL;
- return 0;
-}
-
-void reproject_open(ControlContext *ctx) {
-
- if ( ctx->reproject_id ) {
- displaywindow_error("Reprojection window is already open.", ctx->dw);
- return;
- }
-
- if ( !ctx->cell ) {
- printf("RP: No current cell\n");
- displaywindow_error("No reciprocal unit cell has been specified.", ctx->dw);
- return;
- }
+ displaywindow_enable_cell_functions(ctx->dw, TRUE);
- if ( !ctx->images ) {
- printf("RP: No images!\n");
- displaywindow_error("No images to reproject!", ctx->dw);
- return;
+ /* Invalidate all the reprojected feature lists */
+ for ( i=0; i<ctx->images->n_images; i++ ) {
+ image_feature_list_free(ctx->images->images[i].rflist);
+ ctx->images->images[i].rflist = NULL;
}
- ctx->reproject_cur_image = 0;
- reproject_lattice_changed(ctx);
-
- ctx->reproject_id = imagedisplay_open_with_message(ctx->images->images[ctx->reproject_cur_image],
- "Reprojected Diffraction Pattern", "Click to change image",
- IMAGEDISPLAY_SHOW_CENTRE | IMAGEDISPLAY_SHOW_TILT_AXIS, G_CALLBACK(reproject_clicked), ctx);
-
- reproject_mark_peaks(ctx);
-
- g_signal_connect(GTK_OBJECT(ctx->reproject_id->drawingarea), "destroy", G_CALLBACK(reproject_closed), ctx);
-
+}
+
+/* Notify that ctx->cell has changed (also need to call displaywindow_update) */
+void reproject_lattice_changed(ControlContext *ctx) {
+
+ reproject_cell_to_lattice(ctx);
+ displaywindow_update_imagestack(ctx->dw);
+
}
diff --git a/src/reproject.h b/src/reproject.h
index 79aa919..26d28bb 100644
--- a/src/reproject.h
+++ b/src/reproject.h
@@ -21,7 +21,7 @@
extern ImageFeatureList *reproject_get_reflections(ImageRecord *image, ReflectionList *reflectionlist);
extern void reproject_partner_features(ImageFeatureList *rflist, ImageRecord *image);
-extern void reproject_open(ControlContext *ctx);
+extern void reproject_cell_to_lattice(ControlContext *ctx);
extern void reproject_lattice_changed(ControlContext *ctx);
#endif /* REPROJECT_H */