aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--doc/man/pattern_sim.110
-rw-r--r--src/diffraction-gpu.c17
-rw-r--r--src/diffraction-gpu.h12
-rw-r--r--src/diffraction.c16
-rw-r--r--src/diffraction.h3
-rw-r--r--src/pattern_sim.c8
-rw-r--r--tests/gpu_sim_check.c4
7 files changed, 46 insertions, 24 deletions
diff --git a/doc/man/pattern_sim.1 b/doc/man/pattern_sim.1
index 2ce1f9f0..e71413db 100644
--- a/doc/man/pattern_sim.1
+++ b/doc/man/pattern_sim.1
@@ -1,7 +1,8 @@
.\"
.\" pattern_sim man page
.\"
-.\" Copyright © 2012 Thomas White <taw@physics.org>
+.\" Copyright © 2012-2014 Deutsches Elektronen-Synchrotron DESY,
+.\" a research centre of the Helmholtz Association.
.\"
.\" Part of CrystFEL - crystallography with a FEL
.\"
@@ -137,6 +138,11 @@ Use \fItype\fR of spectrum. \fItype\fR can be one of \fBtophat\fR or \fBsase\fR
.PD
Add \fIn\fR photons of Poisson-distributed background uniformly over the detector surface.
+.PD 0
+.IP \fB--no-fringes\fR
+.PD
+Suppress the subsidiary maxima of the shape transforms by setting I_latt(q) to zero beyond the first minimum of the function.
+
.SH REFLECTION LISTS
@@ -206,7 +212,7 @@ This page was written by Thomas White.
Report bugs to <taw@physics.org>, or visit <http://www.desy.de/~twhite/crystfel>.
.SH COPYRIGHT AND DISCLAIMER
-Copyright © 2012 Deutsches Elektronen-Synchrotron DESY, a research centre of the Helmholtz Association.
+Copyright © 2012-2014 Deutsches Elektronen-Synchrotron DESY, a research centre of the Helmholtz Association.
.P
pattern_sim, and this manual, are part of CrystFEL.
.P
diff --git a/src/diffraction-gpu.c b/src/diffraction-gpu.c
index b5bd2e88..8b165856 100644
--- a/src/diffraction-gpu.c
+++ b/src/diffraction-gpu.c
@@ -73,7 +73,7 @@ struct gpu_context
};
-static void check_sinc_lut(struct gpu_context *gctx, int n)
+static void check_sinc_lut(struct gpu_context *gctx, int n, int no_fringes)
{
cl_int err;
cl_image_format fmt;
@@ -106,7 +106,11 @@ static void check_sinc_lut(struct gpu_context *gctx, int n)
for ( i=1; i<SINC_LUT_ELEMENTS; i++ ) {
double x, val;
x = (double)i/SINC_LUT_ELEMENTS;
- val = fabs(sin(M_PI*n*x)/sin(M_PI*x));
+ if ( no_fringes && (x > 1.0/n) && (1.0-x > 1.0/n) ) {
+ val = 0.0;
+ } else {
+ val = fabs(sin(M_PI*n*x)/sin(M_PI*x));
+ }
gctx->sinc_lut_ptrs[n-1][i] = val;
}
}
@@ -278,7 +282,8 @@ static void do_panels(struct gpu_context *gctx, struct image *image,
void get_diffraction_gpu(struct gpu_context *gctx, struct image *image,
- int na, int nb, int nc, UnitCell *ucell)
+ int na, int nb, int nc, UnitCell *ucell,
+ int no_fringes)
{
double ax, ay, az;
double bx, by, bz;
@@ -297,9 +302,9 @@ void get_diffraction_gpu(struct gpu_context *gctx, struct image *image,
}
/* Ensure all required LUTs are available */
- check_sinc_lut(gctx, na);
- check_sinc_lut(gctx, nb);
- check_sinc_lut(gctx, nc);
+ check_sinc_lut(gctx, na, no_fringes);
+ check_sinc_lut(gctx, nb, no_fringes);
+ check_sinc_lut(gctx, nc, no_fringes);
/* Unit cell */
cell_get_cartesian(ucell, &ax, &ay, &az, &bx, &by, &bz, &cx, &cy, &cz);
diff --git a/src/diffraction-gpu.h b/src/diffraction-gpu.h
index 349a6bff..e7ae23fd 100644
--- a/src/diffraction-gpu.h
+++ b/src/diffraction-gpu.h
@@ -3,11 +3,11 @@
*
* Calculate diffraction patterns by Fourier methods (GPU version)
*
- * Copyright © 2012 Deutsches Elektronen-Synchrotron DESY,
- * a research centre of the Helmholtz Association.
+ * Copyright © 2012-2014 Deutsches Elektronen-Synchrotron DESY,
+ * a research centre of the Helmholtz Association.
*
* Authors:
- * 2010-2012 Thomas White <taw@physics.org>
+ * 2010-2014 Thomas White <taw@physics.org>
*
* This file is part of CrystFEL.
*
@@ -41,7 +41,8 @@ struct gpu_context;
#if HAVE_OPENCL
extern void get_diffraction_gpu(struct gpu_context *gctx, struct image *image,
- int na, int nb, int nc, UnitCell *ucell);
+ int na, int nb, int nc, UnitCell *ucell,
+ int no_fringes);
extern struct gpu_context *setup_gpu(int no_sfac,
const double *intensities,
const unsigned char *flags,
@@ -51,7 +52,8 @@ extern void cleanup_gpu(struct gpu_context *gctx);
#else
static void get_diffraction_gpu(struct gpu_context *gctx, struct image *image,
- int na, int nb, int nc, UnitCell *ucell)
+ int na, int nb, int nc, UnitCell *ucell,
+ int no_fringes)
{
/* Do nothing */
ERROR("This copy of CrystFEL was not compiled with OpenCL support.\n");
diff --git a/src/diffraction.c b/src/diffraction.c
index 0fa9f79b..6383a8b4 100644
--- a/src/diffraction.c
+++ b/src/diffraction.c
@@ -49,7 +49,7 @@
#define SINC_LUT_ELEMENTS (4096)
-static double *get_sinc_lut(int n)
+static double *get_sinc_lut(int n, int no_fringes)
{
int i;
double *lut;
@@ -64,7 +64,11 @@ static double *get_sinc_lut(int n)
for ( i=1; i<SINC_LUT_ELEMENTS; i++ ) {
double x, val;
x = (double)i/SINC_LUT_ELEMENTS;
- val = fabs(sin(M_PI*n*x)/sin(M_PI*x));
+ if ( no_fringes && (x > 1.0/n) && (1.0-x > 1.0/n) ) {
+ val = 0.0;
+ } else {
+ val = fabs(sin(M_PI*n*x)/sin(M_PI*x));
+ }
lut[i] = val;
}
}
@@ -665,7 +669,7 @@ struct sample *generate_twocolour(struct image *image)
void get_diffraction(struct image *image, int na, int nb, int nc,
const double *intensities, const double *phases,
const unsigned char *flags, UnitCell *cell,
- GradientMethod m, const SymOpList *sym)
+ GradientMethod m, const SymOpList *sym, int no_fringes)
{
double ax, ay, az;
double bx, by, bz;
@@ -683,9 +687,9 @@ void get_diffraction(struct image *image, int na, int nb, int nc,
/* Needed later for Lorentz calculation */
image->twotheta = malloc(image->width * image->height * sizeof(double));
- lut_a = get_sinc_lut(na);
- lut_b = get_sinc_lut(nb);
- lut_c = get_sinc_lut(nc);
+ lut_a = get_sinc_lut(na, no_fringes);
+ lut_b = get_sinc_lut(nb, no_fringes);
+ lut_c = get_sinc_lut(nc, no_fringes);
for ( i=0; i<image->nsamples; i++ ) {
diff --git a/src/diffraction.h b/src/diffraction.h
index e397bd3a..28f3ec0a 100644
--- a/src/diffraction.h
+++ b/src/diffraction.h
@@ -51,7 +51,8 @@ typedef enum {
extern void get_diffraction(struct image *image, int na, int nb, int nc,
const double *intensities, const double *phases,
const unsigned char *flags, UnitCell *cell,
- GradientMethod m, const SymOpList *sym);
+ GradientMethod m, const SymOpList *sym,
+ int no_fringes);
extern struct sample *generate_tophat(struct image *image);
diff --git a/src/pattern_sim.c b/src/pattern_sim.c
index a747cd72..b8cc1c68 100644
--- a/src/pattern_sim.c
+++ b/src/pattern_sim.c
@@ -92,6 +92,7 @@ static void show_help(const char *s)
" -x, --spectrum=<type> Type of spectrum to simulate.\n"
" --background=<N> Add N photons of Poisson background (default 0).\n"
" --template=<file> Take orientations from stream <file>.\n"
+" --no-fringes Exclude the side maxima of Bragg peaks.\n"
);
}
@@ -255,6 +256,7 @@ int main(int argc, char *argv[])
int background = 0;
char *template_file = NULL;
Stream *st = NULL;
+ int no_fringes = 0;
/* Long options */
const struct option longopts[] = {
@@ -276,6 +278,7 @@ int main(int argc, char *argv[])
{"type-spectrum", 1, NULL, 'x'},
{"spectrum", 1, NULL, 'x'},
{"really-random", 0, &config_random, 1},
+ {"no-fringes", 0, &no_fringes, 1},
{"gpu-dev", 1, NULL, 2},
{"min-size", 1, NULL, 3},
{"max-size", 1, NULL, 4},
@@ -693,10 +696,11 @@ int main(int argc, char *argv[])
intensities, flags, sym_str,
gpu_dev);
}
- get_diffraction_gpu(gctx, &image, na, nb, nc, cell);
+ get_diffraction_gpu(gctx, &image, na, nb, nc, cell,
+ no_fringes);
} else {
get_diffraction(&image, na, nb, nc, intensities, phases,
- flags, cell, grad, sym);
+ flags, cell, grad, sym, no_fringes);
}
if ( image.data == NULL ) {
ERROR("Diffraction calculation failed.\n");
diff --git a/tests/gpu_sim_check.c b/tests/gpu_sim_check.c
index d2475213..0419d945 100644
--- a/tests/gpu_sim_check.c
+++ b/tests/gpu_sim_check.c
@@ -166,7 +166,7 @@ int main(int argc, char *argv[])
gpu_image.spectrum = generate_tophat(&gpu_image);
start = get_hires_seconds();
- get_diffraction_gpu(gctx, &gpu_image, 8, 8, 8, cell);
+ get_diffraction_gpu(gctx, &gpu_image, 8, 8, 8, cell, 1);
end = get_hires_seconds();
gpu_time = end - start;
@@ -174,7 +174,7 @@ int main(int argc, char *argv[])
start = get_hires_seconds();
get_diffraction(&cpu_image, 8, 8, 8, NULL, NULL, NULL, cell,
- GRADIENT_MOSAIC, sym);
+ GRADIENT_MOSAIC, sym, 1);
end = get_hires_seconds();
cpu_time = end - start;