aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/process_hkl.c38
1 files changed, 30 insertions, 8 deletions
diff --git a/src/process_hkl.c b/src/process_hkl.c
index 54d0c8b4..d5fba397 100644
--- a/src/process_hkl.c
+++ b/src/process_hkl.c
@@ -51,6 +51,7 @@
#include "crystal.h"
#include "thread-pool.h"
#include "geometry.h"
+#include "cell-utils.h"
static void show_help(const char *s)
@@ -83,6 +84,7 @@ static void show_help(const char *s)
" have I > n * sigma(I). Default: -infinity.\n"
" --max-adu=<n> Maximum peak value. Default: infinity.\n"
" --min-res=<n> Merge only crystals which diffract above <n> A.\n"
+" --push-res=<n> Integrate higher than apparent resolution cutoff.\n"
);
}
@@ -199,7 +201,8 @@ static int merge_crystal(RefList *model, struct image *image, Crystal *cr,
RefList *reference, const SymOpList *sym,
double **hist_vals, signed int hist_h,
signed int hist_k, signed int hist_l, int *hist_n,
- int config_nopolar, double min_snr, double max_adu)
+ int config_nopolar, double min_snr, double max_adu,
+ double push_res)
{
Reflection *refl;
RefListIterator *iter;
@@ -229,6 +232,7 @@ static int merge_crystal(RefList *model, struct image *image, Crystal *cr,
Reflection *model_version;
double w;
double temp, delta, R, mean, M2, sumweight;
+ double res, max_res;
refl_intensity = scale * get_intensity(refl);
refl_sigma = scale * get_esd_intensity(refl);
@@ -242,6 +246,10 @@ static int merge_crystal(RefList *model, struct image *image, Crystal *cr,
get_indices(refl, &h, &k, &l);
+ max_res = push_res + crystal_get_resolution_limit(cr);
+ res = 2.0*resolution(crystal_get_cell(cr), h, k, l);
+ if ( res > max_res ) continue;
+
/* Put into the asymmetric unit for the target group */
get_asymm(sym, h, k, l, &h, &k, &l);
@@ -309,7 +317,8 @@ static int merge_all(Stream *st, RefList *model, RefList *reference,
signed int hist_k, signed int hist_l,
int *hist_i, int config_nopolar, int min_measurements,
double min_snr, double max_adu,
- int start_after, int stop_after, double min_res)
+ int start_after, int stop_after, double min_res,
+ double push_res)
{
int rval;
int n_images = 0;
@@ -348,7 +357,7 @@ static int merge_all(Stream *st, RefList *model, RefList *reference,
r = merge_crystal(model, &image, cr, reference, sym,
hist_vals, hist_h, hist_k, hist_l,
hist_i, config_nopolar, min_snr,
- max_adu);
+ max_adu, push_res);
if ( r == 0 ) n_crystals_used++;
@@ -420,6 +429,7 @@ int main(int argc, char *argv[])
double min_snr = -INFINITY;
double max_adu = +INFINITY;
double min_res = 0.0;
+ double push_res = +INFINITY;
/* Long options */
const struct option longopts[] = {
@@ -427,9 +437,8 @@ int main(int argc, char *argv[])
{"input", 1, NULL, 'i'},
{"output", 1, NULL, 'o'},
{"max-only", 0, &config_maxonly, 1},
- {"output-every", 1, NULL, 'e'},
- {"start-after", 1, NULL, 's'},
- {"stop-after", 1, NULL, 'f'},
+ {"start-after", 1, NULL, 's'},
+ {"stop-after", 1, NULL, 'f'},
{"sum", 0, &config_sum, 1},
{"scale", 0, &config_scale, 1},
{"no-polarisation", 0, &config_nopolar, 1},
@@ -441,6 +450,8 @@ int main(int argc, char *argv[])
{"min-snr", 1, NULL, 3},
{"max-adu", 1, NULL, 4},
{"min-res", 1, NULL, 5},
+ {"push-res", 1, NULL, 6},
+ {"res-push", 1, NULL, 6}, /* compat */
{0, 0, NULL, 0}
};
@@ -533,6 +544,16 @@ int main(int argc, char *argv[])
min_res = 1e10/min_res;
break;
+ case 6 :
+ errno = 0;
+ push_res = strtod(optarg, &rval);
+ if ( *rval != '\0' ) {
+ ERROR("Invalid value for --push-res.\n");
+ return 1;
+ }
+ push_res = push_res*1e9;
+ break;
+
case '?' :
break;
@@ -614,7 +635,7 @@ int main(int argc, char *argv[])
hist_i = 0;
r = merge_all(st, model, NULL, sym, &hist_vals, hist_h, hist_k, hist_l,
&hist_i, config_nopolar, min_measurements, min_snr,
- max_adu, start_after, stop_after, min_res);
+ max_adu, start_after, stop_after, min_res, push_res);
fprintf(stderr, "\n");
if ( r ) {
ERROR("Error while reading stream.\n");
@@ -646,7 +667,8 @@ int main(int argc, char *argv[])
r = merge_all(st, model, reference, sym,
&hist_vals, hist_h, hist_k, hist_l, &hist_i,
config_nopolar, min_measurements, min_snr,
- max_adu, start_after, stop_after, min_res);
+ max_adu, start_after, stop_after, min_res,
+ push_res);
fprintf(stderr, "\n");
if ( r ) {
ERROR("Error while reading stream.\n");