aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/crystfel_gui.c17
-rw-r--r--src/crystfel_gui.h2
-rw-r--r--src/gui_ambi.c17
-rw-r--r--src/gui_ambi.h7
-rw-r--r--src/gui_backend_local.c159
-rw-r--r--src/gui_backend_slurm.c175
-rw-r--r--src/gui_index.c12
-rw-r--r--src/gui_index.h4
-rw-r--r--src/gui_merge.c45
-rw-r--r--src/gui_merge.h5
10 files changed, 267 insertions, 176 deletions
diff --git a/src/crystfel_gui.c b/src/crystfel_gui.c
index ff66b6c3..91b91413 100644
--- a/src/crystfel_gui.c
+++ b/src/crystfel_gui.c
@@ -1500,3 +1500,20 @@ char *make_new_job_title(const char *orig_old_title)
return new_title;
}
}
+
+
+char *relative_to_cwd(GFile *workdir, const char *filename)
+{
+ GFile *current_dir;
+ GFile *gfile;
+ char *rel;
+
+ current_dir = g_file_new_for_path(".");
+
+ gfile = g_file_get_child(workdir, filename);
+ rel = g_file_get_relative_path(current_dir, gfile);
+ g_object_unref(gfile);
+ g_object_unref(current_dir);
+
+ return rel;
+}
diff --git a/src/crystfel_gui.h b/src/crystfel_gui.h
index 868b4cb8..3b2cdacd 100644
--- a/src/crystfel_gui.h
+++ b/src/crystfel_gui.h
@@ -72,4 +72,6 @@ extern void force_refls_on(struct crystfelproject *proj);
extern char *make_new_job_title(const char *old_title);
+extern char *relative_to_cwd(GFile *workdir, const char *filename);
+
#endif
diff --git a/src/gui_ambi.c b/src/gui_ambi.c
index 6e28f194..fd997a9d 100644
--- a/src/gui_ambi.c
+++ b/src/gui_ambi.c
@@ -482,7 +482,12 @@ int write_ambigator_script(const char *filename,
struct gui_indexing_result *input,
const char *n_thread_str,
struct ambi_params *params,
- const char *out_stream)
+ const char *out_stream,
+ const char *stdout_filename,
+ const char *stderr_filename,
+ const char *fg_filename,
+ const char *intermediate_rel_filename,
+ const char *harvest_filename)
{
FILE *fh;
char *exe_path;
@@ -495,13 +500,13 @@ int write_ambigator_script(const char *filename,
fprintf(fh, "cat \\\n");
for ( i=0; i<input->n_streams; i++ ) {
- fprintf(fh, "\"../%s\" \\\n", input->streams[i]);
+ fprintf(fh, "\"%s\" \\\n", input->streams[i]);
}
- fprintf(fh, " > ambigator-input.stream\n");
+ fprintf(fh, " > %s\n", intermediate_rel_filename);
exe_path = get_crystfel_exe("ambigator");
if ( exe_path == NULL ) return 1;
- fprintf(fh, "%s ambigator-input.stream \\\n", exe_path);
+ fprintf(fh, "%s %s \\\n", exe_path, intermediate_rel_filename);
fprintf(fh, " -j %s", n_thread_str);
fprintf(fh, " -o \"%s\"", out_stream);
@@ -522,8 +527,8 @@ int write_ambigator_script(const char *filename,
}
fprintf(fh, " --iterations=%i", params->niter);
- fprintf(fh, " --fg-graph=fg.dat");
- fprintf(fh, " >stdout.log 2>stderr.log\n");
+ fprintf(fh, " --fg-graph=%s", fg_filename);
+ fprintf(fh, " >%s 2>%s\n", stdout_filename, stderr_filename);
fclose(fh);
return 0;
diff --git a/src/gui_ambi.h b/src/gui_ambi.h
index c6b68b35..06bafe64 100644
--- a/src/gui_ambi.h
+++ b/src/gui_ambi.h
@@ -40,7 +40,12 @@ extern int write_ambigator_script(const char *filename,
struct gui_indexing_result *input,
const char *n_thread_str,
struct ambi_params *params,
- const char *out_stream);
+ const char *out_stream,
+ const char *stdout_filename,
+ const char *stderr_filename,
+ const char *fg_filename,
+ const char *intermediate_rel_filename,
+ const char *harvest_filename);
extern double read_ambigator_progress(char *logfile_str, int niter);
diff --git a/src/gui_backend_local.c b/src/gui_backend_local.c
index d78fc037..ba56bd7c 100644
--- a/src/gui_backend_local.c
+++ b/src/gui_backend_local.c
@@ -116,11 +116,7 @@ static int write_file_list(GFile *workdir,
if ( fh == NULL ) return 1;
for ( i=0; i<n_frames; i++ ) {
- if ( filenames[i][0] != '/' ) {
- fprintf(fh, "../%s", filenames[i]);
- } else {
- fprintf(fh, "%s", filenames[i]);
- }
+ fprintf(fh, "%s", filenames[i]);
if ( events[i] != NULL ) {
fprintf(fh, " %s\n", events[i]);
} else {
@@ -177,7 +173,7 @@ static struct local_job *start_local_job(char **args,
r = g_spawn_async_with_pipes(NULL, args, NULL,
G_SPAWN_SEARCH_PATH
| G_SPAWN_DO_NOT_REAP_CHILD,
- setup_subprocess, workdir_str,
+ setup_subprocess, NULL,
&job->pid,
NULL, NULL, &ch_stderr,
&error);
@@ -387,29 +383,37 @@ static void *run_ambi(const char *job_title,
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;
+ gchar *sc_rel_filename;
+ gchar *stream_rel_filename;
+ gchar *stderr_rel_filename;
+ gchar *stdout_rel_filename;
+ gchar *fg_rel_filename;
+ gchar *intermediate_rel_filename;
+ gchar *harvest_rel_filename;
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);
+ stream_rel_filename = relative_to_cwd(workdir, "ambi.stream");
+ stdout_rel_filename = relative_to_cwd(workdir, "stdout.log");
+ stderr_rel_filename = relative_to_cwd(workdir, "stderr.log");
+ sc_rel_filename = relative_to_cwd(workdir, "run_ambigator.sh");
+ fg_rel_filename = relative_to_cwd(workdir, "fg.dat");
+ intermediate_rel_filename = relative_to_cwd(workdir, "ambigator-input.stream");
+ harvest_rel_filename = relative_to_cwd(workdir, "parameters.json");
snprintf(n_thread_str, 64, "%i", opts->n_threads);
- sc_gfile = g_file_get_child(workdir, "run_ambigator.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) )
+
+ if ( !write_ambigator_script(sc_rel_filename, input, n_thread_str,
+ &proj->ambi_params, stream_rel_filename,
+ stdout_rel_filename, stderr_rel_filename,
+ fg_rel_filename,
+ intermediate_rel_filename,
+ harvest_rel_filename) )
{
char *args[3];
args[0] = "sh";
- args[1] = sc_filename;
+ args[1] = sc_rel_filename;
args[2] = NULL;
job = start_local_job(args, job_title, workdir,
proj, GUI_JOB_AMBIGATOR);
@@ -419,10 +423,18 @@ static void *run_ambi(const char *job_title,
}
if ( job != NULL ) {
- add_indexing_result(proj, job_title, &stream_str, 1);
+ add_indexing_result(proj, job_title, &stream_rel_filename, 1);
}
g_object_unref(workdir);
+ free(sc_rel_filename);
+ free(stream_rel_filename);
+ free(stdout_rel_filename);
+ free(stderr_rel_filename);
+ free(fg_rel_filename);
+ free(intermediate_rel_filename);
+ free(harvest_rel_filename);
+
return job;
}
@@ -437,25 +449,32 @@ static void *run_merging(const char *job_title,
struct local_job *job;
struct local_merging_opts *opts = opts_priv;
GFile *workdir;
- GFile *sc_gfile;
- gchar *sc_filename;
+ gchar *sc_rel_filename;
+ gchar *output_rel_filename;
+ gchar *stderr_rel_filename;
+ gchar *stdout_rel_filename;
+ gchar *harvest_rel_filename;
workdir = make_job_folder(job_title, job_notes);
if ( workdir == NULL ) return NULL;
+ sc_rel_filename = relative_to_cwd(workdir, "run_merge.sh");
+ output_rel_filename = relative_to_cwd(workdir, "crystfel.hkl");
+ stdout_rel_filename = relative_to_cwd(workdir, "stdout.log");
+ stderr_rel_filename = relative_to_cwd(workdir, "stderr.log");
+ harvest_rel_filename = relative_to_cwd(workdir, "parameters.json");
+
snprintf(n_thread_str, 63, "%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_merge_script(sc_filename, input, n_thread_str,
- &proj->merging_params, "crystfel.hkl") )
+ if ( !write_merge_script(sc_rel_filename, input, n_thread_str,
+ &proj->merging_params, output_rel_filename,
+ stdout_rel_filename, stderr_rel_filename,
+ harvest_rel_filename) )
{
char *args[3];
enum gui_job_type type;
args[0] = "sh";
- args[1] = sc_filename;
+ args[1] = sc_rel_filename;
args[2] = NULL;
if ( strcmp(proj->merging_params.model, "process_hkl") == 0 ) {
if ( proj->merging_params.scale ) {
@@ -470,34 +489,27 @@ static void *run_merging(const char *job_title,
} else {
job = NULL;
}
- g_free(sc_filename);
if ( job != NULL ) {
- GFile *hkl_gfile;
- char *hkl;
char *hkl1;
char *hkl2;
- 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(workdir, "crystfel.hkl1");
- hkl1 = 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);
+ hkl1 = relative_to_cwd(workdir, "crystfel.hkl1");
+ hkl2 = relative_to_cwd(workdir, "crystfel.hkl2");
- add_merge_result(proj, job_title, hkl, hkl1, hkl2);
- g_free(hkl);
+ add_merge_result(proj, job_title, output_rel_filename,
+ hkl1, hkl2);
g_free(hkl1);
g_free(hkl2);
}
g_object_unref(workdir);
+ g_free(sc_rel_filename);
+ free(output_rel_filename);
+ free(stdout_rel_filename);
+ free(stderr_rel_filename);
+ free(harvest_rel_filename);
return job;
}
@@ -513,9 +525,12 @@ static void *run_indexing(const char *job_title,
struct local_job *job;
char n_thread_str[64];
GFile *workdir;
- GFile *sc_gfile;
- gchar *sc_filename;
- GFile *stderr_gfile;
+ gchar *sc_rel_filename;
+ gchar *stdout_rel_filename;
+ gchar *stderr_rel_filename;
+ gchar *files_rel_filename;
+ gchar *stream_rel_filename;
+ gchar *harvest_rel_filename;
workdir = make_job_folder(job_title, job_notes);
if ( workdir == NULL ) return NULL;
@@ -530,16 +545,23 @@ static void *run_indexing(const char *job_title,
}
snprintf(n_thread_str, 63, "%i", opts->n_processes);
- sc_gfile = g_file_get_child(workdir, "run_indexamajig.sh");
- sc_filename = g_file_get_path(sc_gfile);
- g_object_unref(sc_gfile);
- if ( sc_filename == NULL ) return NULL;
- if ( !write_indexamajig_script(sc_filename,
+
+ sc_rel_filename = relative_to_cwd(workdir, "run_indexamajig.sh");
+ stdout_rel_filename = relative_to_cwd(workdir, "stdout.log");
+ stderr_rel_filename = relative_to_cwd(workdir, "stderr.log");
+ files_rel_filename = relative_to_cwd(workdir, "files.lst");
+ stream_rel_filename = relative_to_cwd(workdir, "crystfel.stream");
+ harvest_rel_filename = relative_to_cwd(workdir, "parameters.json");
+
+ if ( !write_indexamajig_script(sc_rel_filename,
proj->geom_filename,
n_thread_str,
- "files.lst",
- "crystfel.stream",
- NULL, 1,
+ files_rel_filename,
+ stream_rel_filename,
+ stdout_rel_filename,
+ stderr_rel_filename,
+ harvest_rel_filename,
+ NULL,
&proj->peak_search_params,
&proj->indexing_params,
wavelength_estimate,
@@ -547,7 +569,7 @@ static void *run_indexing(const char *job_title,
{
char *args[3];
args[0] = "sh";
- args[1] = sc_filename;
+ args[1] = sc_rel_filename;
args[2] = NULL;
job = start_local_job(args, job_title, workdir,
proj, GUI_JOB_INDEXING);
@@ -557,23 +579,20 @@ static void *run_indexing(const char *job_title,
if ( job != NULL ) {
- char *stream_fn;
-
/* Indexing-specific job data */
job->n_frames = proj->n_frames;
+ job->stderr_filename = strdup(stderr_rel_filename);
+ add_indexing_result(proj, job_title, &stream_rel_filename, 1);
- stderr_gfile = g_file_get_child(workdir, "stderr.log");
- job->stderr_filename = g_file_get_path(stderr_gfile);
- g_object_unref(stderr_gfile);
-
- GFile *stream_gfile = g_file_get_child(job->workdir,
- "crystfel.stream");
- stream_fn = g_file_get_path(stream_gfile);
- g_object_unref(stream_gfile);
- add_indexing_result(proj, job_title, &stream_fn, 1);
- g_free(stream_fn);
+ } else {
}
g_object_unref(workdir);
+ free(sc_rel_filename);
+ free(files_rel_filename);
+ free(stream_rel_filename);
+ free(stdout_rel_filename);
+ free(stderr_rel_filename);
+ free(harvest_rel_filename);
return job;
}
diff --git a/src/gui_backend_slurm.c b/src/gui_backend_slurm.c
index e0f74b10..d07675be 100644
--- a/src/gui_backend_slurm.c
+++ b/src/gui_backend_slurm.c
@@ -172,13 +172,10 @@ static double indexing_progress(struct slurm_job *job, int *running)
for ( i=0; i<job->n_blocks; i++ ) {
char tmp[128];
- GFile *stderr_gfile;
char *stderr_filename;
snprintf(tmp, 127, "stderr-%i.log", i);
- stderr_gfile = g_file_get_child(job->workdir, tmp);
- stderr_filename = g_file_get_path(stderr_gfile);
- g_object_unref(stderr_gfile);
+ stderr_filename = relative_to_cwd(job->workdir, tmp);
n_proc += read_number_processed(stderr_filename);
g_free(stderr_filename);
@@ -469,8 +466,8 @@ static struct slurm_job *start_slurm_job(enum gui_job_type type,
struct slurm_job *job;
job_desc_msg_t job_desc_msg;
submit_response_msg_t *resp;
- GFile *stderr_gfile;
int r;
+ GFile *cwd_gfile;
script = load_entire_file(script_filename);
if ( script == NULL ) return NULL;
@@ -483,6 +480,8 @@ static struct slurm_job *start_slurm_job(enum gui_job_type type,
job->type = type;
+ cwd_gfile = g_file_new_for_path(".");
+
env = create_env(&n_env, NULL);
slurm_init_job_desc_msg(&job_desc_msg);
@@ -499,7 +498,7 @@ static struct slurm_job *start_slurm_job(enum gui_job_type type,
job_desc_msg.name = safe_strdup(jobname);
job_desc_msg.std_err = strdup(stderr_filename);
job_desc_msg.std_out = strdup(stdout_filename);
- job_desc_msg.work_dir = g_file_get_path(workdir);
+ job_desc_msg.work_dir = g_file_get_path(cwd_gfile);
job_desc_msg.script = script;
job_desc_msg.environment = env;
job_desc_msg.env_size = n_env;
@@ -507,6 +506,8 @@ static struct slurm_job *start_slurm_job(enum gui_job_type type,
job_desc_msg.account = safe_strdup(opts->account);
job_desc_msg.array_inx = safe_strdup(array_inx);
+ g_object_unref(cwd_gfile);
+
r = slurm_submit_batch_job(&job_desc_msg, &resp);
free(job_desc_msg.mail_user);
free(job_desc_msg.partition);
@@ -529,10 +530,7 @@ static struct slurm_job *start_slurm_job(enum gui_job_type type,
job->job_id = resp->job_id;
slurm_free_submit_response_response_msg(resp);
- stderr_gfile = g_file_get_child(workdir, stderr_filename);
- job->stderr_filename = g_file_get_path(stderr_gfile);
- g_object_unref(stderr_gfile);
-
+ job->stderr_filename = strdup(stderr_filename);
job->workdir = g_file_dup(workdir);
return job;
@@ -560,11 +558,7 @@ static void write_partial_file_list(GFile *workdir,
(i<(j+1)*block_size) && (i<n_frames);
i++ )
{
- if ( filenames[i][0] != '/' ) {
- fprintf(fh, "../%s", filenames[i]);
- } else {
- fprintf(fh, "%s", filenames[i]);
- }
+ fprintf(fh, "%s", filenames[i]);
if ( events[i] != NULL ) {
fprintf(fh, " %s\n", events[i]);
} else {
@@ -590,11 +584,15 @@ static void *run_indexing(const char *job_title,
int i;
char **streams;
GFile *workdir;
- GFile *sc_gfile;
- char *sc_filename;
int n_blocks;
char array_inx[128];
char serial_offs[128];
+ gchar *sc_rel_filename;
+ gchar *stdout_rel_filename;
+ gchar *stderr_rel_filename;
+ gchar *files_rel_filename;
+ gchar *stream_rel_filename;
+ gchar *harvest_rel_filename;
workdir = make_job_folder(job_title, job_notes);
if ( workdir == NULL ) return NULL;
@@ -611,7 +609,6 @@ static void *run_indexing(const char *job_title,
char file_list[128];
char stream_filename[128];
- GFile *stream_gfile;
/* Create (sub-)list of files */
snprintf(file_list, 127, "files-%i.lst", i);
@@ -625,44 +622,46 @@ static void *run_indexing(const char *job_title,
/* Work out the stream filename */
snprintf(stream_filename, 127, "crystfel-%i.stream", i);
- stream_gfile = g_file_get_child(workdir,
- stream_filename);
- streams[i] = g_file_get_path(stream_gfile);
- g_object_unref(stream_gfile);
+ streams[i] = relative_to_cwd(workdir, stream_filename);
}
- sc_gfile = g_file_get_child(workdir, "run_indexamajig.sh");
- sc_filename = g_file_get_path(sc_gfile);
- g_object_unref(sc_gfile);
- if ( sc_filename == NULL ) return NULL;
-
snprintf(array_inx, 127, "0-%i", n_blocks-1);
snprintf(serial_offs, 127, "$((${SLURM_ARRAY_TASK_ID}*%i+1))",
opts->block_size);
- if ( !write_indexamajig_script(sc_filename,
+ sc_rel_filename = relative_to_cwd(workdir, "run_indexamajig.sh");
+ files_rel_filename = relative_to_cwd(workdir,
+ "files-${SLURM_ARRAY_TASK_ID}.lst");
+ stream_rel_filename = relative_to_cwd(workdir,
+ "crystfel-${SLURM_ARRAY_TASK_ID}.stream");
+ stdout_rel_filename = relative_to_cwd(workdir, "stdout-%a.log");
+ stderr_rel_filename = relative_to_cwd(workdir, "stderr-%a.log");
+ harvest_rel_filename = relative_to_cwd(workdir, "parameters.json");
+
+ if ( !write_indexamajig_script(sc_rel_filename,
proj->geom_filename,
"`nproc`",
- "files-${SLURM_ARRAY_TASK_ID}.lst",
- "crystfel-${SLURM_ARRAY_TASK_ID}.stream",
- serial_offs, 0,
+ files_rel_filename,
+ stream_rel_filename,
+ NULL, NULL,
+ harvest_rel_filename,
+ serial_offs,
&proj->peak_search_params,
&proj->indexing_params,
wavelength_estimate,
clen_estimate) )
{
job = start_slurm_job(GUI_JOB_INDEXING,
- sc_filename,
+ sc_rel_filename,
job_title,
array_inx,
workdir,
- "stdout-%a.log",
- "stderr-%a.log",
+ stdout_rel_filename,
+ stderr_rel_filename,
&opts->common);
} else {
job = NULL;
}
- g_free(sc_filename);
if ( job != NULL ) {
job->n_frames = proj->n_frames;
@@ -675,6 +674,12 @@ static void *run_indexing(const char *job_title,
}
free(streams);
+ free(sc_rel_filename);
+ free(files_rel_filename);
+ free(stream_rel_filename);
+ free(stdout_rel_filename);
+ free(stderr_rel_filename);
+ free(harvest_rel_filename);
g_object_unref(workdir);
return job;
@@ -856,37 +861,47 @@ static void *run_ambi(const char *job_title,
struct slurm_job *job;
struct slurm_ambi_opts *opts = opts_priv;
GFile *workdir;
- GFile *sc_gfile;
- char *sc_filename;
- GFile *stream_gfile;
- char *stream_str;
+ char *sc_rel_filename;
+ char *stream_rel_filename;
+ char *stdout_rel_filename;
+ char *stderr_rel_filename;
+ char *fg_rel_filename;
+ char *intermediate_rel_filename;
+ char *harvest_rel_filename;
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);
-
- sc_gfile = g_file_get_child(workdir, "run_ambigator.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, "`nproc`",
- &proj->ambi_params, stream_str) )
+ stream_rel_filename = relative_to_cwd(workdir, "ambi.stream");
+ sc_rel_filename = relative_to_cwd(workdir, "run_ambigator.sh");
+ stdout_rel_filename = relative_to_cwd(workdir, "stdout.log");
+ stderr_rel_filename = relative_to_cwd(workdir, "stderr.log");
+ fg_rel_filename = relative_to_cwd(workdir, "fg.dat");
+ intermediate_rel_filename = relative_to_cwd(workdir, "ambigator-input.stream");
+ harvest_rel_filename = relative_to_cwd(workdir, "parameters.json");
+
+ if ( !write_ambigator_script(sc_rel_filename, input, "`nproc`",
+ &proj->ambi_params, stream_rel_filename,
+ stdout_rel_filename, stderr_rel_filename,
+ fg_rel_filename,
+ intermediate_rel_filename,
+ harvest_rel_filename) )
{
job = start_slurm_job(GUI_JOB_AMBIGATOR,
- sc_filename, job_title, NULL, workdir,
- "stdout.log", "stderr.log", &opts->common);
+ sc_rel_filename, job_title, NULL, workdir,
+ stdout_rel_filename, stderr_rel_filename,
+ &opts->common);
job->niter = proj->ambi_params.niter;
} else {
job = NULL;
}
- g_free(sc_filename);
+ g_free(sc_rel_filename);
+ g_free(stdout_rel_filename);
+ g_free(stderr_rel_filename);
+ g_free(harvest_rel_filename);
if ( job != NULL ) {
- add_indexing_result(proj, job_title, &stream_str, 1);
+ add_indexing_result(proj, job_title, &stream_rel_filename, 1);
}
g_object_unref(workdir);
@@ -903,19 +918,25 @@ static void *run_merging(const char *job_title,
struct slurm_job *job;
struct slurm_merging_opts *opts = opts_priv;
GFile *workdir;
- GFile *sc_gfile;
- char *sc_filename;
+ char *sc_rel_filename;
+ char *output_rel_filename;
+ char *stdout_rel_filename;
+ char *stderr_rel_filename;
+ char *harvest_rel_filename;
workdir = make_job_folder(job_title, job_notes);
if ( workdir == NULL ) return NULL;
- 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;
+ sc_rel_filename = relative_to_cwd(workdir, "run_merge.sh");
+ output_rel_filename = relative_to_cwd(workdir, "crystfel.hkl");
+ stdout_rel_filename = relative_to_cwd(workdir, "stdout.log");
+ stderr_rel_filename = relative_to_cwd(workdir, "stderr.log");
+ harvest_rel_filename = relative_to_cwd(workdir, "parameters.json");
- if ( !write_merge_script(sc_filename, input, "`nproc`",
- &proj->merging_params, "crystfel.hkl") )
+ if ( !write_merge_script(sc_rel_filename, input, "`nproc`",
+ &proj->merging_params, output_rel_filename,
+ stdout_rel_filename, stderr_rel_filename,
+ harvest_rel_filename) )
{
enum gui_job_type type;
if ( strcmp(proj->merging_params.model, "process_hkl") == 0 ) {
@@ -927,40 +948,34 @@ static void *run_merging(const char *job_title,
} else {
type = GUI_JOB_PARTIALATOR;
}
- job = start_slurm_job(type, sc_filename, job_title, NULL,
- workdir, "stdout.log", "stderr.log",
+ job = start_slurm_job(type, sc_rel_filename, job_title, NULL,
+ workdir, stdout_rel_filename,
+ stderr_rel_filename,
&opts->common);
} else {
job = NULL;
}
- g_free(sc_filename);
if ( job != NULL ) {
- GFile *hkl_gfile;
- char *hkl;
char *hkl1;
char *hkl2;
- 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(workdir, "crystfel.hkl1");
- hkl1 = 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);
+ hkl1 = relative_to_cwd(workdir, "crystfel.hkl1");
+ hkl2 = relative_to_cwd(workdir, "crystfel.hkl2");
- add_merge_result(proj, job_title, hkl, hkl1, hkl2);
- g_free(hkl);
+ add_merge_result(proj, job_title, output_rel_filename,
+ hkl1, hkl2);
g_free(hkl1);
g_free(hkl2);
}
g_object_unref(workdir);
+ g_free(sc_rel_filename);
+ g_free(stdout_rel_filename);
+ g_free(stderr_rel_filename);
+ g_free(output_rel_filename);
+ g_free(harvest_rel_filename);
return job;
}
diff --git a/src/gui_index.c b/src/gui_index.c
index ad1206e0..645af05e 100644
--- a/src/gui_index.c
+++ b/src/gui_index.c
@@ -811,6 +811,7 @@ static char **indexamajig_command_line(const char *geom_filename,
const char *n_thread_str,
const char *files_list,
const char *stream_filename,
+ const char *harvest_filename,
const char *serial_start,
struct peak_params *peak_search_params,
struct index_params *indexing_params,
@@ -975,7 +976,7 @@ static char **indexamajig_command_line(const char *geom_filename,
add_arg_string(args, n_args++, "serial-start", serial_start);
}
- add_arg_string(args, n_args++, "harvest-file", "parameters.json");
+ add_arg_string(args, n_args++, "harvest-file", harvest_filename);
args[n_args] = NULL;
return args;
@@ -1022,8 +1023,10 @@ int write_indexamajig_script(const char *script_filename,
const char *n_thread_str,
const char *files_list,
const char *stream_filename,
+ const char *stdout_filename,
+ const char *stderr_filename,
+ const char *harvest_filename,
const char *serial_start,
- int redirect_output,
struct peak_params *peak_search_params,
struct index_params *indexing_params,
double wavelength_estimate,
@@ -1037,6 +1040,7 @@ int write_indexamajig_script(const char *script_filename,
n_thread_str,
files_list,
stream_filename,
+ harvest_filename,
serial_start,
peak_search_params,
indexing_params,
@@ -1056,8 +1060,8 @@ int write_indexamajig_script(const char *script_filename,
i++;
};
free(cmdline);
- if ( redirect_output ) {
- fprintf(fh, ">stdout.log 2>stderr.log\n");
+ if ( stdout_filename != NULL ) {
+ fprintf(fh, ">%s 2>%s\n", stdout_filename, stderr_filename);
}
fclose(fh);
diff --git a/src/gui_index.h b/src/gui_index.h
index 991ba08e..b2b18939 100644
--- a/src/gui_index.h
+++ b/src/gui_index.h
@@ -48,8 +48,10 @@ extern int write_indexamajig_script(const char *script_filename,
const char *n_thread_str,
const char *files_list,
const char *stream_filename,
+ const char *stdout_filename,
+ const char *stderr_filename,
+ const char *harvest_filename,
const char *serial_start,
- int redirect_output,
struct peak_params *peak_search_params,
struct index_params *indexing_params,
double wavelength_estimate,
diff --git a/src/gui_merge.c b/src/gui_merge.c
index bef6d7b7..b911fa5a 100644
--- a/src/gui_merge.c
+++ b/src/gui_merge.c
@@ -349,7 +349,10 @@ static int write_partialator_script(const char *filename,
struct gui_indexing_result *input,
const char *n_thread_str,
struct merging_params *params,
- const char *out_hkl)
+ const char *out_hkl,
+ const char *stdout_filename,
+ const char *stderr_filename,
+ const char *harvest_filename)
{
FILE *fh;
char *exe_path;
@@ -365,7 +368,7 @@ static int write_partialator_script(const char *filename,
fprintf(fh, "%s \\\n", exe_path);
for ( i=0; i<input->n_streams; i++ ) {
- fprintf(fh, "\"../%s\" \\\n", input->streams[i]);
+ fprintf(fh, "\"%s\" \\\n", input->streams[i]);
}
fprintf(fh, " --model=%s", params->model);
@@ -405,9 +408,9 @@ static int write_partialator_script(const char *filename,
}
fprintf(fh, " --iterations=%i", params->niter);
- fprintf(fh, " --harvest-file=parameters.json");
+ fprintf(fh, " --harvest-file=%s", harvest_filename);
- fprintf(fh, " >stdout.log 2>stderr.log\n");
+ fprintf(fh, " >%s 2>%s\n", stdout_filename, stderr_filename);
fclose(fh);
return 0;
@@ -419,6 +422,8 @@ static void add_process_hkl(FILE *fh,
struct gui_indexing_result *input,
struct merging_params *params,
const char *out_hkl,
+ const char *stdout_filename,
+ const char *stderr_filename,
const char *extra_arg,
const char *out_suffix)
{
@@ -427,7 +432,7 @@ static void add_process_hkl(FILE *fh,
fprintf(fh, "%s \\\n", exe_path);
for ( i=0; i<input->n_streams; i++ ) {
- fprintf(fh, " \"../%s\" \\\n", input->streams[i]);
+ fprintf(fh, " \"%s\" \\\n", input->streams[i]);
}
fprintf(fh, " -o \"%s%s\"", out_hkl, out_suffix);
@@ -442,14 +447,17 @@ static void add_process_hkl(FILE *fh,
fprintf(fh, " --max-adu=%f", params->max_adu);
fprintf(fh, " --min-res=%f", params->min_res);
fprintf(fh, " --push-res=%f", params->push_res);
- fprintf(fh, " %s >>stdout.log 2>>stderr.log\n", extra_arg);
+ fprintf(fh, " %s >>%s 2>>%s\n",
+ extra_arg, stdout_filename, stderr_filename);
}
static int write_process_hkl_script(const char *filename,
struct gui_indexing_result *input,
struct merging_params *params,
- const char *out_hkl)
+ const char *out_hkl,
+ const char *stdout_filename,
+ const char *stderr_filename)
{
FILE *fh;
char *exe_path;
@@ -462,9 +470,12 @@ static int write_process_hkl_script(const char *filename,
exe_path = get_crystfel_exe("process_hkl");
if ( exe_path == NULL ) return 1;
- add_process_hkl(fh, exe_path, input, params, out_hkl, "", "");
- add_process_hkl(fh, exe_path, input, params, out_hkl, "--even-only", "1");
- add_process_hkl(fh, exe_path, input, params, out_hkl, "--odd-only", "2");
+ add_process_hkl(fh, exe_path, input, params, out_hkl,
+ stdout_filename, stderr_filename, "", "");
+ add_process_hkl(fh, exe_path, input, params, out_hkl,
+ stdout_filename, stderr_filename, "--even-only", "1");
+ add_process_hkl(fh, exe_path, input, params, out_hkl,
+ stdout_filename, stderr_filename, "--odd-only", "2");
fclose(fh);
return 0;
@@ -475,14 +486,22 @@ int write_merge_script(const char *filename,
struct gui_indexing_result *input,
const char *n_thread_str,
struct merging_params *params,
- const char *out_hkl)
+ const char *out_hkl,
+ const char *stdout_filename,
+ const char *stderr_filename,
+ const char *harvest_filename)
{
if ( strcmp(params->model, "process_hkl") == 0 ) {
return write_process_hkl_script(filename, input,
- params, out_hkl);
+ params, out_hkl,
+ stdout_filename,
+ stderr_filename);
} else {
return write_partialator_script(filename, input, n_thread_str,
- params, out_hkl);
+ params, out_hkl,
+ stdout_filename,
+ stderr_filename,
+ harvest_filename);
}
}
diff --git a/src/gui_merge.h b/src/gui_merge.h
index e3f947c7..36b077aa 100644
--- a/src/gui_merge.h
+++ b/src/gui_merge.h
@@ -41,7 +41,10 @@ extern int write_merge_script(const char *filename,
struct gui_indexing_result *input,
const char *n_thread_str,
struct merging_params *params,
- const char *out_hkl);
+ const char *out_hkl,
+ const char *stdout_filename,
+ const char *stderr_filename,
+ const char *harvest_filename);
extern double read_merge_progress(const char *logfile_str,
enum gui_job_type type);