diff options
author | Thomas White <taw@physics.org> | 2020-08-21 16:07:02 +0200 |
---|---|---|
committer | Thomas White <taw@physics.org> | 2020-08-21 16:07:02 +0200 |
commit | 9c57e7d61658fb79967e1b1a46c98995a1fed020 (patch) | |
tree | a75e25d5ec05d9c50cdf9657a4eff4455272be1b | |
parent | 0f0ff14be48f5e4d9679f30286614db3d9c062d3 (diff) |
Framework for backend parameters via GUI
-rw-r--r-- | CMakeLists.txt | 3 | ||||
-rw-r--r-- | meson.build | 1 | ||||
-rw-r--r-- | src/crystfel_gui.c | 11 | ||||
-rw-r--r-- | src/crystfel_gui.h | 4 | ||||
-rw-r--r-- | src/gui_backend_local.c | 10 | ||||
-rw-r--r-- | src/gui_backend_local.h | 2 | ||||
-rw-r--r-- | src/gui_backend_slurm.c | 82 | ||||
-rw-r--r-- | src/gui_backend_slurm.h | 36 | ||||
-rw-r--r-- | src/gui_index.c | 130 | ||||
-rw-r--r-- | src/gui_project.h | 3 |
10 files changed, 235 insertions, 47 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt index 25abff90..222cb534 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -406,7 +406,8 @@ if (GTK_FOUND) set(CRYSTFEL_GUI_SOURCES src/crystfel_gui.c src/crystfelimageview.c src/gui_peaksearch.c src/gui_index.c src/gui_backend_local.c - src/gui_project.c src/crystfelindexingopts.c) + src/gui_project.c src/crystfelindexingopts.c + src/gui_backend_slurm.c) add_executable(crystfel ${CRYSTFEL_GUI_SOURCES} ${CMAKE_CURRENT_BINARY_DIR}/version.c) diff --git a/meson.build b/meson.build index 2ceeed4f..81719e20 100644 --- a/meson.build +++ b/meson.build @@ -202,6 +202,7 @@ if gtkdep.found() 'src/gui_peaksearch.c', 'src/gui_index.c', 'src/gui_backend_local.c', + 'src/gui_backend_slurm.c', 'src/gui_project.c', versionc], dependencies : [mdep, libcrystfeldep, gtkdep, gsldep], diff --git a/src/crystfel_gui.c b/src/crystfel_gui.c index 7254119d..ffd62e57 100644 --- a/src/crystfel_gui.c +++ b/src/crystfel_gui.c @@ -48,9 +48,10 @@ #include "crystfel_gui.h" #include "gui_peaksearch.h" #include "gui_index.h" -#include "gui_backend_local.h" #include "gui_project.h" #include "version.h" +#include "gui_backend_local.h" +#include "gui_backend_slurm.h" static void show_help(const char *s) @@ -803,6 +804,9 @@ static void add_gui_message(enum log_msg_type type, const char *msg, } +const struct crystfel_backend *backends[16]; + + int main(int argc, char *argv[]) { int c; @@ -816,6 +820,11 @@ int main(int argc, char *argv[]) GtkWidget *toolbar; GtkWidget *button; + backends[0] = backend_local; + backends[1] = backend_slurm; + backends[2] = NULL; + /* Max 16 */ + /* Long options */ const struct option longopts[] = { {"help", 0, NULL, 'h'}, diff --git a/src/crystfel_gui.h b/src/crystfel_gui.h index 683c9261..27b2e8b6 100644 --- a/src/crystfel_gui.h +++ b/src/crystfel_gui.h @@ -33,6 +33,8 @@ struct crystfel_backend { const char *name; + const char *friendly_name; + GtkWidget *(*make_parameters)(void); int (*run_unitcell)(struct crystfelproject *proj, const char *algo); void (*cancel)(struct crystfelproject *proj); @@ -40,6 +42,8 @@ struct crystfel_backend { void (*shutdown)(struct crystfelproject *proj); }; +extern const struct crystfel_backend *backends[]; + extern void remove_infobar(struct crystfelproject *proj); diff --git a/src/gui_backend_local.c b/src/gui_backend_local.c index e485ed35..fc729a41 100644 --- a/src/gui_backend_local.c +++ b/src/gui_backend_local.c @@ -284,13 +284,21 @@ static void init_backend(struct crystfelproject *proj) } +static GtkWidget *make_parameters(void) +{ + return gtk_label_new("Local params"); +} + + struct crystfel_backend _backend_local = { .name = "local", + .friendly_name = "Local (run on this computer)", + .make_parameters = make_parameters, .init = init_backend, .shutdown = shutdown_backend, .run_unitcell = run_unitcell, .cancel = cancel, }; -struct crystfel_backend *backend_local = &_backend_local; +const struct crystfel_backend *backend_local = &_backend_local; diff --git a/src/gui_backend_local.h b/src/gui_backend_local.h index 4bb3d0b3..94724e98 100644 --- a/src/gui_backend_local.h +++ b/src/gui_backend_local.h @@ -31,6 +31,6 @@ #include "crystfel_gui.h" -extern struct crystfel_backend *backend_local; +extern const struct crystfel_backend *backend_local; #endif diff --git a/src/gui_backend_slurm.c b/src/gui_backend_slurm.c new file mode 100644 index 00000000..1ac0328b --- /dev/null +++ b/src/gui_backend_slurm.c @@ -0,0 +1,82 @@ +/* + * gui_backend_slurm.c + * + * GUI backend for running jobs via SLURM + * + * Copyright © 2020 Deutsches Elektronen-Synchrotron DESY, + * a research centre of the Helmholtz Association. + * + * Authors: + * 2020 Thomas White <taw@physics.org> + * + * This file is part of CrystFEL. + * + * CrystFEL is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * CrystFEL is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with CrystFEL. If not, see <http://www.gnu.org/licenses/>. + * + */ + +#include <pty.h> +#include <glib.h> +#include <sys/wait.h> +#include <gtk/gtk.h> + +#include "crystfel_gui.h" + + +struct slurm_backend_priv +{ + int dummy; +}; + + +static void init_backend(struct crystfelproject *proj) +{ +} + + +static void shutdown_backend(struct crystfelproject *proj) +{ +} + + +static void cancel(struct crystfelproject *proj) +{ +} + + +static int run_unitcell(struct crystfelproject *proj, + const char *algo) +{ + return 0; +} + + +static GtkWidget *make_parameters(void) +{ + return gtk_label_new("SLURM params"); +} + + +const struct crystfel_backend _backend_slurm = + { + .name = "slurm", + .friendly_name = "SLURM", + .make_parameters = make_parameters, + .init = init_backend, + .shutdown = shutdown_backend, + .run_unitcell = run_unitcell, + .cancel = cancel, + }; + +const struct crystfel_backend *backend_slurm = &_backend_slurm; diff --git a/src/gui_backend_slurm.h b/src/gui_backend_slurm.h new file mode 100644 index 00000000..9865aa2a --- /dev/null +++ b/src/gui_backend_slurm.h @@ -0,0 +1,36 @@ +/* + * gui_backend_slurm.h + * + * GUI backend for running jobs via SLURM + * + * Copyright © 2020 Deutsches Elektronen-Synchrotron DESY, + * a research centre of the Helmholtz Association. + * + * Authors: + * 2020 Thomas White <taw@physics.org> + * + * This file is part of CrystFEL. + * + * CrystFEL is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * CrystFEL is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with CrystFEL. If not, see <http://www.gnu.org/licenses/>. + * + */ + +#ifndef GUI_BACKEND_SLURM_H +#define GUI_BACKEND_SLURM_H + +#include "crystfel_gui.h" + +extern const struct crystfel_backend *backend_slurm; + +#endif diff --git a/src/gui_index.c b/src/gui_index.c index 86ecab35..9fdc0c4e 100644 --- a/src/gui_index.c +++ b/src/gui_index.c @@ -80,12 +80,33 @@ static void index_all_response_sig(GtkWidget *dialog, gint resp, } +static void backend_changed_sig(GtkWidget *combo, + struct crystfelproject *proj) +{ + int backend_idx; + + backend_idx = gtk_combo_box_get_active(GTK_COMBO_BOX(combo)); + if ( backend_idx < 0 ) return; + + if ( proj->backend_opts != NULL ) { + gtk_widget_destroy(proj->backend_opts); + } + proj->backend_opts = backends[backend_idx]->make_parameters(); + + gtk_box_pack_start(GTK_BOX(proj->backend_opts_box), + GTK_WIDGET(proj->backend_opts), + FALSE, FALSE, 0); + gtk_widget_show_all(proj->backend_opts); +} + + static GtkWidget *make_backend_opts(struct crystfelproject *proj) { GtkWidget *box; GtkWidget *hbox; GtkWidget *label; GtkWidget *combo; + int i; box = gtk_box_new(GTK_ORIENTATION_VERTICAL, 8); gtk_container_set_border_width(GTK_CONTAINER(box), 8); @@ -96,55 +117,31 @@ static GtkWidget *make_backend_opts(struct crystfelproject *proj) label = gtk_label_new("Batch system:"); gtk_box_pack_start(GTK_BOX(hbox), GTK_WIDGET(label), FALSE, FALSE, 0); + combo = gtk_combo_box_text_new(); gtk_box_pack_start(GTK_BOX(hbox), GTK_WIDGET(combo), FALSE, FALSE, 0); - gtk_combo_box_text_append(GTK_COMBO_BOX_TEXT(combo), "local", - "Local (run on this computer)"); - gtk_combo_box_text_append(GTK_COMBO_BOX_TEXT(combo), "slurm", - "SLURM"); - return box; -} - - -gint index_all_sig(GtkWidget *widget, struct crystfelproject *proj) -{ - GtkWidget *dialog; - GtkWidget *content_area; - GtkWidget *vbox; - GtkWidget *indexing_opts; - - if ( proj->indexing_opts != NULL ) return FALSE; - - dialog = gtk_dialog_new_with_buttons("Index all frames", - GTK_WINDOW(proj->window), - GTK_DIALOG_DESTROY_WITH_PARENT, - "Cancel", GTK_RESPONSE_CANCEL, - "Run", GTK_RESPONSE_OK, - NULL); - - g_signal_connect(G_OBJECT(dialog), "response", - G_CALLBACK(index_all_response_sig), proj); - - vbox = gtk_vbox_new(FALSE, 0.0); - content_area = gtk_dialog_get_content_area(GTK_DIALOG(dialog)); - gtk_container_add(GTK_CONTAINER(content_area), vbox); - gtk_container_set_border_width(GTK_CONTAINER(content_area), 8); - - indexing_opts = crystfel_indexing_opts_new(); - gtk_box_pack_start(GTK_BOX(vbox), GTK_WIDGET(indexing_opts), - FALSE, FALSE, 8.0); - - gtk_notebook_append_page(GTK_NOTEBOOK(indexing_opts), - make_backend_opts(proj), - gtk_label_new("Cluster/batch system")); + i = 0; + do { + gtk_combo_box_text_append(GTK_COMBO_BOX_TEXT(combo), + backends[i]->name, + backends[i]->friendly_name); + } while ( backends[++i] != NULL ); + + proj->backend_opts_box = gtk_box_new(GTK_ORIENTATION_VERTICAL, + 0); + gtk_box_pack_start(GTK_BOX(box), + GTK_WIDGET(proj->backend_opts_box), + FALSE, FALSE, 0); + proj->backend_opts = NULL; - gtk_dialog_set_default_response(GTK_DIALOG(dialog), - GTK_RESPONSE_OK); - gtk_widget_show_all(dialog); + /* proj->backend_opts{_box} must exist before the following */ + g_signal_connect(G_OBJECT(combo), "changed", + G_CALLBACK(backend_changed_sig), proj); + gtk_combo_box_set_active(GTK_COMBO_BOX(combo), 0); - return FALSE; + return box; } @@ -189,6 +186,53 @@ static void get_indexing_opts(struct crystfelproject *proj, } +gint index_all_sig(GtkWidget *widget, struct crystfelproject *proj) +{ + GtkWidget *dialog; + GtkWidget *content_area; + GtkWidget *vbox; + GtkWidget *backend_page; + + if ( proj->indexing_opts != NULL ) return FALSE; + + dialog = gtk_dialog_new_with_buttons("Index all frames", + GTK_WINDOW(proj->window), + GTK_DIALOG_DESTROY_WITH_PARENT, + "Cancel", GTK_RESPONSE_CANCEL, + "Run", GTK_RESPONSE_OK, + NULL); + + g_signal_connect(G_OBJECT(dialog), "response", + G_CALLBACK(index_all_response_sig), proj); + + vbox = gtk_vbox_new(FALSE, 0.0); + content_area = gtk_dialog_get_content_area(GTK_DIALOG(dialog)); + gtk_container_add(GTK_CONTAINER(content_area), vbox); + gtk_container_set_border_width(GTK_CONTAINER(content_area), 8); + + proj->indexing_opts = crystfel_indexing_opts_new(); + gtk_box_pack_start(GTK_BOX(vbox), GTK_WIDGET(proj->indexing_opts), + FALSE, FALSE, 8.0); + set_indexing_opts(proj, + CRYSTFEL_INDEXING_OPTS(proj->indexing_opts)); + + backend_page = make_backend_opts(proj), + gtk_notebook_append_page(GTK_NOTEBOOK(proj->indexing_opts), + backend_page, + gtk_label_new("Cluster/batch system")); + proj->backend_opts_box = gtk_vbox_new(FALSE, 0.0); + gtk_box_pack_start(GTK_BOX(backend_page), + proj->backend_opts_box, + FALSE, FALSE, 8.0); + + gtk_dialog_set_default_response(GTK_DIALOG(dialog), + GTK_RESPONSE_OK); + gtk_widget_show_all(dialog); + + return FALSE; +} + + static IndexingFlags indexing_flags(struct index_params *params) { IndexingFlags fl = 0; diff --git a/src/gui_project.h b/src/gui_project.h index 313a748a..1a6688dc 100644 --- a/src/gui_project.h +++ b/src/gui_project.h @@ -125,6 +125,9 @@ struct crystfelproject { GtkWidget *peak_params; /* Peak search parameter widgets */ struct peak_params original_params; + GtkWidget *backend_opts; + GtkWidget *backend_opts_box; + GtkWidget *info_bar; void (*infobar_callback)(struct crystfelproject *proj); GtkWidget *progressbar; |