aboutsummaryrefslogtreecommitdiff
path: root/src/gui_backend_local.c
diff options
context:
space:
mode:
authorThomas White <taw@physics.org>2021-02-17 17:22:28 +0100
committerThomas White <taw@physics.org>2021-02-17 17:22:28 +0100
commite0437375017e504124cab53e5d19f4da499e88e7 (patch)
tree2963056cf418fbaeecf0e398b5e7a1000b004cd7 /src/gui_backend_local.c
parent5a549e4fdc6265748fa2eabacb19f5ff850d27eb (diff)
GUI: Re-work local backend plumbing
A single command line is not expressive enough for at least two cases: process_hkl, which needs to be run two extra times to generate the splits, and ambigator, which needs to have its input streams concatenated first. This also splits out the routine for creating the working folder and writing the notes file.
Diffstat (limited to 'src/gui_backend_local.c')
-rw-r--r--src/gui_backend_local.c201
1 files changed, 147 insertions, 54 deletions
diff --git a/src/gui_backend_local.c b/src/gui_backend_local.c
index 3af63ea0..21d12aad 100644
--- a/src/gui_backend_local.c
+++ b/src/gui_backend_local.c
@@ -38,6 +38,7 @@
#include "gui_project.h"
#include "gui_index.h"
#include "gui_merge.h"
+#include "gui_ambi.h"
struct local_indexing_opts
@@ -123,14 +124,23 @@ static gboolean index_readable(GIOChannel *source, GIOCondition cond,
}
-static int write_file_list(char **filenames,
+static int write_file_list(GFile *workdir,
+ const char *listname,
+ char **filenames,
char **events,
int n_frames)
{
FILE *fh;
int i;
+ GFile *list_gfile;
+ char *list_str;
- fh = fopen("files.lst", "w");
+ list_gfile = g_file_get_child(workdir, listname);
+ list_str = g_file_get_path(list_gfile);
+ if ( list_str == NULL ) return 1;
+
+ fh = fopen(list_str, "w");
+ free(list_str);
if ( fh == NULL ) return 1;
for ( i=0; i<n_frames; i++ ) {
@@ -157,21 +167,11 @@ void setup_subprocess(gpointer user_data)
}
-static struct local_job *start_local_job(char **args,
- const char *job_title,
- const char *job_notes,
- struct crystfelproject *proj,
- GIOFunc readable_func)
+static GFile *make_job_folder(const char *job_title,
+ const char *job_notes)
{
- GIOChannel *ioch;
- int i;
- int r;
- int ch_stderr;
- GError *error;
- struct local_job *job;
struct stat s;
char *workdir;
- const char *old_pwd;
GFile *workdir_file;
GFile *cwd_file;
GFile *notes_file;
@@ -197,6 +197,7 @@ static struct local_job *start_local_job(char **args,
workdir_file = g_file_get_child(cwd_file, workdir);
g_object_unref(cwd_file);
+ /* Write the notes into notes.txt */
notes_file = g_file_get_child(workdir_file, "notes.txt");
notes_path = g_file_get_path(notes_file);
fh = fopen(notes_path, "w");
@@ -205,18 +206,31 @@ static struct local_job *start_local_job(char **args,
g_free(notes_path);
g_object_unref(notes_file);
+ return workdir_file;
+}
+
+
+
+static struct local_job *start_local_job(char **args,
+ const char *job_title,
+ GFile *workdir_file,
+ struct crystfelproject *proj,
+ GIOFunc readable_func)
+{
+ GIOChannel *ioch;
+ int i;
+ int r;
+ int ch_stderr;
+ GError *error;
+ struct local_job *job;
+ char *workdir_str;
+
+ workdir_str = g_file_get_path(workdir_file);
+ if ( workdir_str == NULL ) return NULL;
+
job = malloc(sizeof(struct local_job));
if ( job == NULL ) return NULL;
- old_pwd = getcwd(NULL, 0);
- chdir(workdir);
- if ( write_file_list(proj->filenames, proj->events, proj->n_frames) ) {
- STATUS("Failed to write list\n");
- free(job);
- return NULL;
- }
- chdir(old_pwd);
-
job->frac_complete = 0.0;
job->workdir = workdir_file;
@@ -227,17 +241,16 @@ static struct local_job *start_local_job(char **args,
}
STATUS("\n");
+ error = NULL;
r = g_spawn_async_with_pipes(NULL, args, NULL,
G_SPAWN_SEARCH_PATH
| G_SPAWN_DO_NOT_REAP_CHILD,
- setup_subprocess, workdir,
+ setup_subprocess, workdir_str,
&job->pid,
NULL, NULL, &ch_stderr,
&error);
if ( r == FALSE ) {
- ERROR("Failed to start program: %s\n",
- error->message);
- g_object_unref(workdir_file);
+ ERROR("Failed to start program: %s\n", error->message);
free(job);
return NULL;
}
@@ -442,13 +455,63 @@ static gboolean merge_readable(GIOChannel *source, GIOCondition cond,
}
+static gboolean ambi_readable(GIOChannel *source, GIOCondition cond,
+ void *vp)
+{
+ /* FIXME: Implementation */
+ return TRUE;
+}
+
+
static void *run_ambi(const char *job_title,
const char *job_notes,
struct crystfelproject *proj,
struct gui_indexing_result *input,
void *opts_priv)
{
- return NULL;
+ char n_thread_str[64];
+ struct local_job *job;
+ struct local_merging_opts *opts = opts_priv;
+ GFile *workdir;
+ GFile *sc_gfile;
+ gchar *sc_filename;
+ GFile *stream_gfile;
+ char *stream_str;
+
+ workdir = make_job_folder(job_title, job_notes);
+ if ( workdir == NULL ) return NULL;
+
+ stream_gfile = g_file_get_child(workdir, "ambi.stream");
+ stream_str = g_file_get_path(stream_gfile);
+ g_object_unref(stream_gfile);
+
+ snprintf(n_thread_str, 64, "%i", opts->n_threads);
+ sc_gfile = g_file_get_child(workdir, "run_merge.sh");
+ sc_filename = g_file_get_path(sc_gfile);
+ g_object_unref(sc_gfile);
+ if ( sc_filename == NULL ) return NULL;
+ if ( !write_ambigator_script(sc_filename, input, n_thread_str,
+ &proj->ambi_params, stream_str) )
+ {
+ char *args[2];
+ args[0] = "run_ambigator.sh";
+ args[1] = NULL;
+ job = start_local_job(args, job_title, workdir,
+ proj, ambi_readable);
+ } else {
+ job = NULL;
+ }
+
+ if ( job != NULL ) {
+ char **streams = malloc(sizeof(char *));
+ if ( streams != NULL ) {
+ streams[0] = stream_str;
+ add_indexing_result(proj, strdup(job_title), streams, 1);
+ }
+ }
+
+ g_object_unref(workdir);
+ return job;
}
@@ -459,41 +522,58 @@ static void *run_merging(const char *job_title,
void *opts_priv)
{
char n_thread_str[64];
- char **args;
struct local_job *job;
struct local_merging_opts *opts = opts_priv;
- GFile *hkl_gfile;
- char *hkl;
- char *hkl1;
- char *hkl2;
+ GFile *workdir;
+ GFile *sc_gfile;
+ gchar *sc_filename;
+
+ workdir = make_job_folder(job_title, job_notes);
+ if ( workdir == NULL ) return NULL;
snprintf(n_thread_str, 63, "%i", opts->n_threads);
- args = merging_command_line(n_thread_str,
- input,
- &proj->merging_params);
+ sc_gfile = g_file_get_child(workdir, "run_merge.sh");
+ sc_filename = g_file_get_path(sc_gfile);
+ g_object_unref(sc_gfile);
+ if ( sc_filename == NULL ) return NULL;
+
+ if ( !write_merge_script(sc_filename, input, n_thread_str,
+ &proj->merging_params, "crystfel.hkl") )
+ {
+ char *args[3];
+ args[0] = "sh";
+ args[1] = sc_filename;
+ args[2] = NULL;
+ job = start_local_job(args, job_title, workdir,
+ proj, merge_readable);
+ } else {
+ job = NULL;
+ }
+ g_free(sc_filename);
- job = start_local_job(args, job_title, job_notes, proj,
- merge_readable);
+ if ( job != NULL ) {
- if ( job == NULL ) return NULL;
+ GFile *hkl_gfile;
+ char *hkl;
+ char *hkl1;
+ char *hkl2;
- hkl_gfile = g_file_get_child(job->workdir,
- "crystfel.hkl");
- hkl = g_file_get_path(hkl_gfile);
- g_object_unref(hkl_gfile);
+ hkl_gfile = g_file_get_child(workdir, "crystfel.hkl");
+ hkl = g_file_get_path(hkl_gfile);
+ g_object_unref(hkl_gfile);
- hkl_gfile = g_file_get_child(job->workdir,
- "crystfel.hkl1");
- hkl1 = g_file_get_path(hkl_gfile);
- g_object_unref(hkl_gfile);
+ hkl_gfile = g_file_get_child(workdir, "crystfel.hkl1");
+ hkl1 = g_file_get_path(hkl_gfile);
+ g_object_unref(hkl_gfile);
- hkl_gfile = g_file_get_child(job->workdir,
- "crystfel.hkl2");
- hkl2 = g_file_get_path(hkl_gfile);
- g_object_unref(hkl_gfile);
+ hkl_gfile = g_file_get_child(workdir, "crystfel.hkl2");
+ hkl2 = g_file_get_path(hkl_gfile);
+ g_object_unref(hkl_gfile);
- add_merge_result(proj, strdup(job_title), hkl, hkl1, hkl2);
+ add_merge_result(proj, strdup(job_title), hkl, hkl1, hkl2);
+ }
+ g_object_unref(workdir);
return job;
}
@@ -509,6 +589,19 @@ static void *run_indexing(const char *job_title,
char **args;
char **streams;
int i;
+ GFile *workdir;
+
+ workdir = make_job_folder(job_title, job_notes);
+ if ( workdir == NULL ) return NULL;
+
+ if ( write_file_list(workdir, "files.lst",
+ proj->filenames,
+ proj->events,
+ proj->n_frames) )
+ {
+ STATUS("Failed to write list\n");
+ return NULL;
+ }
snprintf(n_thread_str, 63, "%i", opts->n_processes);
args = indexamajig_command_line(proj->geom_filename,
@@ -524,8 +617,8 @@ static void *run_indexing(const char *job_title,
}
STATUS("\n");
- job = start_local_job(args, job_title, job_notes, proj,
- index_readable);
+ job = start_local_job(args, job_title, workdir,
+ proj, index_readable);
if ( job == NULL ) return NULL;
/* Indexing-specific job data */