aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas White <taw@physics.org>2012-05-30 11:21:04 +0200
committerThomas White <taw@physics.org>2012-05-30 11:21:04 +0200
commit3ff6058ee1e87b9f0730aa42b9c1961f1d754976 (patch)
treed06be152495aee2d29045b48d6a06a378d294ffd
parent3c334ff43e0b36251b3912ee7af06facda56421d (diff)
parent025dce7c678d59ff63ea664692e23761d0c9f4ff (diff)
Merge branch 'tom/max_adu'
-rw-r--r--doc/man/crystfel_geometry.54
-rw-r--r--libcrystfel/src/detector.c4
-rw-r--r--libcrystfel/src/detector.h1
-rw-r--r--libcrystfel/src/peaks.c6
-rw-r--r--tests/integration_check.c1
5 files changed, 16 insertions, 0 deletions
diff --git a/doc/man/crystfel_geometry.5 b/doc/man/crystfel_geometry.5
index 3254232b..006af722 100644
--- a/doc/man/crystfel_geometry.5
+++ b/doc/man/crystfel_geometry.5
@@ -170,6 +170,10 @@ peak_sep = 6.0
.br
; in which case the value will be used for all *subsequent* panels.
+; The maximum value, in ADU, before the pixel will be considered as bad.
+.br
+max_adu = 3500
+
.PP
See the "examples" folder for some examples (look at the ones ending in .geom).
diff --git a/libcrystfel/src/detector.c b/libcrystfel/src/detector.c
index 94af656f..b7d809df 100644
--- a/libcrystfel/src/detector.c
+++ b/libcrystfel/src/detector.c
@@ -606,6 +606,8 @@ static int parse_field_for_panel(struct panel *panel, const char *key,
panel->coffset = atof(val);
} else if ( strcmp(key, "res") == 0 ) {
panel->res = atof(val);
+ } else if ( strcmp(key, "max_adu") == 0 ) {
+ panel->max_adu = atof(val);
} else if ( strcmp(key, "peak_sep") == 0 ) {
panel->peak_sep = atof(val);
} else if ( strcmp(key, "badrow_direction") == 0 ) {
@@ -743,6 +745,7 @@ struct detector *get_detector_geometry(const char *filename)
det->defaults.ssy = 1.0;
det->defaults.rigid_group = NULL;
det->defaults.adu_per_eV = NAN;
+ det->defaults.max_adu = +INFINITY;
strncpy(det->defaults.name, "", 1023);
do {
@@ -1254,6 +1257,7 @@ int write_detector_geometry(const char *filename, struct detector *det)
fprintf(fh, "%s/corner_x = %g\n", p->name, p->cnx);
fprintf(fh, "%s/corner_y = %g\n", p->name, p->cny);
fprintf(fh, "%s/adu_per_eV = %g\n", p->name, p->adu_per_eV);
+ fprintf(fh, "%s/max_adu = %g\n", p->name, p->max_adu);
if ( p->no_index ) {
fprintf(fh, "%s/no_index = 1\n", p->name);
diff --git a/libcrystfel/src/detector.h b/libcrystfel/src/detector.h
index 02d66cd4..2b4ac5c6 100644
--- a/libcrystfel/src/detector.h
+++ b/libcrystfel/src/detector.h
@@ -65,6 +65,7 @@ struct panel
double peak_sep; /* Characteristic peak separation */
char *rigid_group; /* Rigid group, or -1 for none */
double adu_per_eV; /* Number of ADU per eV */
+ double max_adu; /* Treat pixel as unreliable if higher than this */
double fsx;
double fsy;
diff --git a/libcrystfel/src/peaks.c b/libcrystfel/src/peaks.c
index 78a68185..477d9345 100644
--- a/libcrystfel/src/peaks.c
+++ b/libcrystfel/src/peaks.c
@@ -211,6 +211,9 @@ static int integrate_peak(struct image *image, int cfs, int css,
val = image->data[idx];
+ /* Veto peak if it contains saturation in bg region */
+ if ( val > p->max_adu ) return 1;
+
bg_tot += val;
bg_tot_sq += pow(val, 2.0);
bg_counts++;
@@ -259,6 +262,9 @@ static int integrate_peak(struct image *image, int cfs, int css,
val = image->data[idx] - bg_mean;
+ /* Veto peak if it contains saturation */
+ if ( image->data[idx] > p->max_adu ) return 1;
+
pk_counts++;
pk_total += val;
diff --git a/tests/integration_check.c b/tests/integration_check.c
index 7e812ad5..2d18ac5a 100644
--- a/tests/integration_check.c
+++ b/tests/integration_check.c
@@ -197,6 +197,7 @@ int main(int argc, char *argv[])
image.det->panels[0].clen = 1.0;
image.det->panels[0].res = 1.0;
image.det->panels[0].adu_per_eV = 1.0/1000.0; /* -> 1 adu per photon */
+ image.det->panels[0].max_adu = +INFINITY; /* No cutoff */
image.width = 128;
image.height = 128;