aboutsummaryrefslogtreecommitdiff
path: root/src/gui_merge.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_merge.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_merge.c')
-rw-r--r--src/gui_merge.c135
1 files changed, 135 insertions, 0 deletions
diff --git a/src/gui_merge.c b/src/gui_merge.c
index ae94fd30..11d48117 100644
--- a/src/gui_merge.c
+++ b/src/gui_merge.c
@@ -522,3 +522,138 @@ char **merging_command_line(const char *n_thread_str,
return arg_strings;
}
+
+
+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)
+{
+ FILE *fh;
+ char *exe_path;
+ int i;
+
+ fh = fopen(filename, "w");
+ if ( fh == NULL ) return 1;
+
+ exe_path = get_crystfel_exe("partialator");
+ if ( exe_path == NULL ) return 1;
+ fprintf(fh, "%s \\\n", exe_path);
+
+ for ( i=0; i<input->n_streams; i++ ) {
+ fprintf(fh, "%s \\\n", input->streams[i]);
+ }
+
+ fprintf(fh, " -j %s", n_thread_str);
+ fprintf(fh, " -o %s", out_hkl);
+ fprintf(fh, " -y %s", params->symmetry);
+
+ fprintf(fh, " --polarisation=%s", params->polarisation);
+ fprintf(fh, " --min-measurements=%i", params->min_measurements);
+ fprintf(fh, " --max-adu=%f", params->max_adu);
+ fprintf(fh, " --min-res=%f", params->min_res);
+ fprintf(fh, " --push-res=%f", params->push_res);
+
+ if ( params->twin_sym != NULL ) {
+ fprintf(fh, " -w %s", params->twin_sym);
+ }
+
+ if ( params->custom_split != NULL ) {
+ fprintf(fh, " --custom-split=%s", params->custom_split);
+ }
+
+ if ( !params->scale ) {
+ fprintf(fh, " --no-scale");
+ }
+
+ if ( !params->bscale ) {
+ fprintf(fh, " --no-bscale");
+ }
+
+ if ( !params->postref ) {
+ fprintf(fh, " --no-pr");
+ }
+
+ if ( !params->deltacchalf ) {
+ fprintf(fh, " --no-deltacchalf");
+ }
+
+ fprintf(fh, " --iterations=%i", params->niter);
+
+ fprintf(fh, "\n");
+
+ fclose(fh);
+ return 0;
+}
+
+
+static void add_process_hkl(FILE *fh,
+ const char *exe_path,
+ struct gui_indexing_result *input,
+ struct merging_params *params,
+ const char *out_hkl,
+ const char *extra_arg,
+ const char *out_suffix)
+{
+ int i;
+
+ fprintf(fh, "%s \\\n", exe_path);
+
+ for ( i=0; i<input->n_streams; i++ ) {
+ fprintf(fh, " %s \\\n", input->streams[i]);
+ }
+
+ fprintf(fh, " -o %s%s", out_hkl, out_suffix);
+ fprintf(fh, " -y %s", params->symmetry);
+
+ if ( params->scale ) {
+ fprintf(fh, " --scale");
+ }
+
+ fprintf(fh, " --polarisation=%s", params->polarisation);
+ fprintf(fh, " --min-measurements=%i", params->min_measurements);
+ 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\n", extra_arg);
+}
+
+
+static int write_process_hkl_script(const char *filename,
+ struct gui_indexing_result *input,
+ struct merging_params *params,
+ const char *out_hkl)
+{
+ FILE *fh;
+ char *exe_path;
+
+ fh = fopen(filename, "w");
+ if ( fh == NULL ) return 1;
+
+ 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");
+
+ fclose(fh);
+ return 0;
+}
+
+
+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)
+{
+ if ( strcmp(params->model, "process_hkl") == 0 ) {
+ return write_process_hkl_script(filename, input,
+ params, out_hkl);
+ } else {
+ return write_partialator_script(filename, input, n_thread_str,
+ params, out_hkl);
+ }
+}