aboutsummaryrefslogtreecommitdiff
path: root/src/crystfelindexingopts.c
diff options
context:
space:
mode:
authorThomas White <taw@physics.org>2020-11-20 17:34:47 +0100
committerThomas White <taw@physics.org>2020-11-20 17:36:49 +0100
commite9087293e5b7b92e64cb9cb7636e21f52611ac7c (patch)
tree8450d81e5defccaa3e49e6ba5ef3710134f93d35 /src/crystfelindexingopts.c
parentc570bbe16cb68cfb340e4ce3bc8c66831a08a306 (diff)
GUI: Add stream output options including metadata to copy
Diffstat (limited to 'src/crystfelindexingopts.c')
-rw-r--r--src/crystfelindexingopts.c248
1 files changed, 231 insertions, 17 deletions
diff --git a/src/crystfelindexingopts.c b/src/crystfelindexingopts.c
index b7b0e9ba..0b6cf515 100644
--- a/src/crystfelindexingopts.c
+++ b/src/crystfelindexingopts.c
@@ -43,6 +43,7 @@
#include <index.h>
#include "crystfelindexingopts.h"
+#include "gtk-util-routines.h"
G_DEFINE_TYPE(CrystFELIndexingOpts,
@@ -460,6 +461,126 @@ static GtkWidget *integration_parameters(CrystFELIndexingOpts *io)
}
+static void add_metadata_item(GtkListStore *model, const char *string)
+{
+ GtkTreeIter iter;
+ gtk_list_store_append(model, &iter);
+ gtk_list_store_set(model, &iter, 0, strdup(string), -1);
+}
+
+
+static gboolean add_metadata_sig(GtkWidget *button, GtkListStore *model)
+{
+ add_metadata_item(model, "/instrument/something");
+ return FALSE;
+}
+
+
+static gboolean edit_metadata_sig(GtkCellRendererText *cell,
+ const gchar *path_str,
+ const gchar *new_text,
+ GtkListStore *model)
+{
+ GtkTreeIter iter;
+ gchar *old_text;
+ GtkTreePath *path = gtk_tree_path_new_from_string(path_str);
+ gtk_tree_model_get_iter(GTK_TREE_MODEL(model), &iter, path);
+ gtk_tree_path_free(path);
+ gtk_tree_model_get(GTK_TREE_MODEL(model), &iter, 0, &old_text, -1);
+ g_free(old_text);
+ gtk_list_store_set(model, &iter,
+ 0, g_strdup(new_text),
+ -1);
+ return FALSE;
+}
+
+
+static gboolean remove_metadata_sig(GtkWidget *button,
+ GtkTreeView *treeview)
+{
+ GtkTreeSelection *sel;
+ GtkTreeIter iter;
+ GtkTreeModel *model;
+
+ model = gtk_tree_view_get_model(treeview);
+ sel = gtk_tree_view_get_selection(treeview);
+ if ( gtk_tree_selection_get_selected(sel, NULL, &iter) != 0 ) {
+ gchar *old_text;
+ gtk_tree_model_get(GTK_TREE_MODEL(model), &iter, 0, &old_text, -1);
+ g_free(old_text);
+ gtk_list_store_remove(GTK_LIST_STORE(model), &iter);
+ }
+
+ return FALSE;
+}
+
+
+static GtkWidget *stream_parameters(CrystFELIndexingOpts *io)
+{
+ GtkWidget *box;
+ GtkWidget *treeview;
+ GtkCellRenderer *renderer;
+ GtkWidget *button;
+ GtkWidget *hbox;
+
+ box = gtk_box_new(GTK_ORIENTATION_VERTICAL, 8);
+ gtk_container_set_border_width(GTK_CONTAINER(box), 8);
+
+ /* --no-non-hits-in-stream */
+ io->exclude_nonhits = gtk_check_button_new_with_label("Exclude skipped frames from stream");
+ gtk_box_pack_start(GTK_BOX(box), GTK_WIDGET(io->exclude_nonhits),
+ FALSE, FALSE, 0);
+
+ /* --no-peaks-in-stream */
+ io->no_peaks_in_stream = gtk_check_button_new_with_label("Exclude peak search results from stream");
+ gtk_box_pack_start(GTK_BOX(box), GTK_WIDGET(io->no_peaks_in_stream),
+ FALSE, FALSE, 0);
+
+ /* --no-refls-in-stream */
+ io->no_refls_in_stream = gtk_check_button_new_with_label("Exclude integrated intensities from stream");
+ gtk_box_pack_start(GTK_BOX(box), GTK_WIDGET(io->no_refls_in_stream),
+ FALSE, FALSE, 0);
+
+ io->copy_metadata_store = gtk_list_store_new(1, G_TYPE_STRING);
+
+ treeview = gtk_tree_view_new_with_model(GTK_TREE_MODEL(io->copy_metadata_store));
+
+ renderer = gtk_cell_renderer_text_new();
+ g_object_set(renderer, "editable", TRUE, NULL);
+ g_signal_connect(G_OBJECT(renderer), "edited",
+ G_CALLBACK(edit_metadata_sig),
+ io->copy_metadata_store);
+ gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(treeview),
+ -1,
+ "Metadata to copy to stream",
+ renderer,
+ "text", 0,
+ NULL);
+
+ gtk_box_pack_start(GTK_BOX(box), GTK_WIDGET(treeview),
+ FALSE, FALSE, 0);
+
+ hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 4);
+ gtk_container_set_border_width(GTK_CONTAINER(hbox), 8);
+ button = gtk_button_new_from_icon_name("list-add", GTK_ICON_SIZE_BUTTON);
+ gtk_button_set_label(GTK_BUTTON(button), "Add item");
+ g_signal_connect(G_OBJECT(button), "clicked",
+ G_CALLBACK(add_metadata_sig), io->copy_metadata_store);
+ gtk_box_pack_start(GTK_BOX(hbox), GTK_WIDGET(button),
+ FALSE, FALSE, 0);
+ button = gtk_button_new_from_icon_name("list-remove", GTK_ICON_SIZE_BUTTON);
+ gtk_button_set_label(GTK_BUTTON(button), "Remove item");
+ g_signal_connect(G_OBJECT(button), "clicked",
+ G_CALLBACK(remove_metadata_sig), treeview);
+ gtk_box_pack_start(GTK_BOX(hbox), GTK_WIDGET(button),
+ FALSE, FALSE, 0);
+ gtk_box_pack_start(GTK_BOX(box), GTK_WIDGET(hbox),
+ FALSE, FALSE, 0);
+
+ return box;
+}
+
+
GtkWidget *crystfel_indexing_opts_new()
{
CrystFELIndexingOpts *io;
@@ -476,6 +597,10 @@ GtkWidget *crystfel_indexing_opts_new()
integration_parameters(io),
gtk_label_new("Integration"));
+ io->stream_params = stream_parameters(io);
+ gtk_notebook_append_page(GTK_NOTEBOOK(io), io->stream_params,
+ gtk_label_new("Stream contents"));
+
return GTK_WIDGET(io);
}
@@ -671,6 +796,83 @@ float crystfel_indexing_opts_get_push_res(CrystFELIndexingOpts *opts)
}
+void crystfel_indexing_opts_get_integration_radii(CrystFELIndexingOpts *opts,
+ float *ir_inn,
+ float *ir_mid,
+ float *ir_out)
+{
+ *ir_inn = get_float(opts->ir_inn);
+ *ir_mid = get_float(opts->ir_mid);
+ *ir_out = get_float(opts->ir_out);
+}
+
+
+int crystfel_indexing_opts_get_exclude_blanks(CrystFELIndexingOpts *opts)
+{
+ return gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(opts->exclude_nonhits));
+}
+
+
+int crystfel_indexing_opts_get_exclude_peaks(CrystFELIndexingOpts *opts)
+{
+ return gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(opts->no_peaks_in_stream));
+}
+
+
+int crystfel_indexing_opts_get_exclude_reflections(CrystFELIndexingOpts *opts)
+{
+ return gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(opts->no_refls_in_stream));
+}
+
+
+char **crystfel_indexing_opts_get_metadata_to_copy(CrystFELIndexingOpts *opts,
+ int *pn)
+{
+ GtkTreeIter iter;
+ gboolean r;
+ int n, i;
+ char **arr;
+
+ n = gtk_tree_model_iter_n_children(GTK_TREE_MODEL(opts->copy_metadata_store),
+ NULL);
+
+ arr = malloc(n*sizeof(char *));
+ if ( arr == NULL ) return NULL;
+
+ r = gtk_tree_model_get_iter_first(GTK_TREE_MODEL(opts->copy_metadata_store),
+ &iter);
+ if ( r == FALSE ) return NULL;
+
+ i = 0;
+ do {
+ gchar *header;
+ gtk_tree_model_get(GTK_TREE_MODEL(opts->copy_metadata_store),
+ &iter, 0, &header, -1);
+ if ( i == n ) return NULL;
+ arr[i++] = strdup(header);
+ } while ( gtk_tree_model_iter_next(GTK_TREE_MODEL(opts->copy_metadata_store),
+ &iter) != FALSE );
+
+ *pn = n;
+ return arr;
+}
+
+
+/********************** Setters *************************/
+
+
+void crystfel_indexing_opts_set_show_stream_opts(CrystFELIndexingOpts *opts,
+ int val)
+{
+ opts->show_stream_opts = val;
+ if ( val ) {
+ gtk_widget_show_all(opts->stream_params);
+ } else {
+ gtk_widget_hide(opts->stream_params);
+ }
+}
+
+
void crystfel_indexing_opts_set_cell_file(CrystFELIndexingOpts *opts,
const char *cell_file)
{
@@ -878,27 +1080,39 @@ void crystfel_indexing_opts_set_integration_radii(CrystFELIndexingOpts *opts,
}
-static void get_float_val(GtkEntry *entry, float *pval)
+void crystfel_indexing_opts_set_metadata_to_copy(CrystFELIndexingOpts *opts,
+ char *const *headers,
+ int n)
{
- float val;
- char *rval;
- const gchar *text = gtk_entry_get_text(entry);
- errno = 0;
- val = strtod(text, &rval);
- if ( *rval != '\0' ) {
- printf("Invalid integration radius '%s'\n", text);
- } else {
- *pval = val;
+ int i;
+ gtk_list_store_clear(opts->copy_metadata_store);
+ if ( headers == NULL ) return;
+ for ( i=0; i<n; i++ ) {
+ add_metadata_item(opts->copy_metadata_store,
+ headers[i]);
}
}
-void crystfel_indexing_opts_get_integration_radii(CrystFELIndexingOpts *opts,
- float *ir_inn,
- float *ir_mid,
- float *ir_out)
+void crystfel_indexing_opts_set_exclude_blanks(CrystFELIndexingOpts *opts,
+ int flag)
+{
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(opts->exclude_nonhits),
+ flag);
+}
+
+
+void crystfel_indexing_opts_set_exclude_peaks(CrystFELIndexingOpts *opts,
+ int flag)
+{
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(opts->no_peaks_in_stream),
+ flag);
+}
+
+
+void crystfel_indexing_opts_set_exclude_reflections(CrystFELIndexingOpts *opts,
+ int flag)
{
- get_float_val(GTK_ENTRY(opts->ir_inn), ir_inn);
- get_float_val(GTK_ENTRY(opts->ir_mid), ir_mid);
- get_float_val(GTK_ENTRY(opts->ir_out), ir_out);
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(opts->no_refls_in_stream),
+ flag);
}