diff options
Diffstat (limited to 'src/partialator.c')
-rw-r--r-- | src/partialator.c | 112 |
1 files changed, 5 insertions, 107 deletions
diff --git a/src/partialator.c b/src/partialator.c index 46353c25..2ad20094 100644 --- a/src/partialator.c +++ b/src/partialator.c @@ -74,7 +74,8 @@ static void show_help(const char *s) " --start-after=<n> Skip <n> crystals at the start of the stream.\n" " --stop-after=<n> Stop after merging <n> crystals.\n" " -n, --iterations=<n> Run <n> cycles of scaling and post-refinement.\n" -" --no-scale Fix all the scaling factors at unity.\n" +" --no-scale Disable scale factor (G, B) refinement.\n" +" --no-pr Disable orientation/physics refinement.\n" " -m, --model=<model> Specify partiality model.\n" " --min-measurements=<n> Minimum number of measurements to require.\n" " --no-polarisation Disable polarisation correction.\n" @@ -84,111 +85,6 @@ static void show_help(const char *s) } -struct refine_args -{ - RefList *full; - Crystal *crystal; - PartialityModel pmodel; - int no_scale; - struct prdata prdata; -}; - - -struct queue_args -{ - int n_started; - int n_done; - Crystal **crystals; - int n_crystals; - struct refine_args task_defaults; - double initial_residual; - double initial_free_residual; - double final_residual; - double final_free_residual; -}; - - -static void refine_image(void *task, int id) -{ - struct refine_args *pargs = task; - Crystal *cr = pargs->crystal; - - pargs->prdata = pr_refine(cr, pargs->full, pargs->pmodel, - pargs->no_scale); -} - - -static void *get_image(void *vqargs) -{ - struct refine_args *task; - struct queue_args *qargs = vqargs; - - task = malloc(sizeof(struct refine_args)); - memcpy(task, &qargs->task_defaults, sizeof(struct refine_args)); - - task->crystal = qargs->crystals[qargs->n_started]; - - qargs->n_started++; - - return task; -} - - -static void done_image(void *vqargs, void *task) -{ - struct queue_args *qargs = vqargs; - struct refine_args *pargs = task; - - qargs->n_done++; - qargs->initial_residual += pargs->prdata.initial_residual; - qargs->initial_free_residual += pargs->prdata.initial_free_residual; - qargs->final_residual += pargs->prdata.final_residual; - qargs->final_free_residual += pargs->prdata.final_free_residual; - - progress_bar(qargs->n_done, qargs->n_crystals, "Refining"); - free(task); -} - - -static void refine_all(Crystal **crystals, int n_crystals, - RefList *full, int nthreads, PartialityModel pmodel, - int no_scale, - double *initial_residual, double *initial_free_residual, - double *final_residual, double *final_free_residual) -{ - struct refine_args task_defaults; - struct queue_args qargs; - - task_defaults.full = full; - task_defaults.crystal = NULL; - task_defaults.pmodel = pmodel; - task_defaults.prdata.refined = 0; - task_defaults.prdata.n_filtered = 0; - task_defaults.no_scale = no_scale; - - qargs.task_defaults = task_defaults; - qargs.n_started = 0; - qargs.n_done = 0; - qargs.n_crystals = n_crystals; - qargs.crystals = crystals; - qargs.initial_residual = 0.0; - qargs.initial_free_residual = 0.0; - qargs.final_residual = 0.0; - qargs.final_free_residual = 0.0; - - /* Don't have threads which are doing nothing */ - if ( n_crystals < nthreads ) nthreads = n_crystals; - - run_threads(nthreads, refine_image, get_image, done_image, - &qargs, n_crystals, 0, 0, 0); - - *initial_residual = qargs.initial_residual; - *initial_free_residual = qargs.initial_free_residual; - *final_residual = qargs.final_residual; - *final_free_residual = qargs.final_free_residual; -} - - static void display_progress(int n_images, int n_crystals) { if ( !isatty(STDERR_FILENO) ) return; @@ -475,6 +371,7 @@ int main(int argc, char *argv[]) int n_crystals_seen = 0; char cmdline[1024]; int no_scale = 0; + int no_pr = 0; Stream *st; Crystal **crystals; char *pmodel_str = NULL; @@ -510,6 +407,7 @@ int main(int argc, char *argv[]) {"res-push", 1, NULL, 5}, /* compat */ {"no-scale", 0, &no_scale, 1}, + {"no-pr", 0, &no_pr, 1}, {"no-polarisation", 0, &polarisation, 0}, {"no-polarization", 0, &polarisation, 0}, {"polarisation", 0, &polarisation, 1}, /* compat */ @@ -831,7 +729,7 @@ int main(int argc, char *argv[]) /* Refine all crystals to get the best fit */ refine_all(crystals, n_crystals, full, nthreads, pmodel, - no_scale, &init_dev, &init_free_dev, + no_scale, no_pr, &init_dev, &init_free_dev, &final_dev, &final_free_dev); STATUS("Overall residual: initial = %e, final = %e\n", |