aboutsummaryrefslogtreecommitdiff
path: root/tests/scaling_check.c
diff options
context:
space:
mode:
authorThomas White <taw@physics.org>2018-05-11 10:03:09 +0200
committerThomas White <taw@physics.org>2018-05-11 10:03:09 +0200
commit16b647bbef917ad5189e8439876a9a8c665c37b4 (patch)
treece3c524d431370ab0294c8d5d85b0a0b415275f7 /tests/scaling_check.c
parent3264e6d54bb6c7ea72cb18de4a8887acd54d099c (diff)
New scaling test
Not just for linear scaling
Diffstat (limited to 'tests/scaling_check.c')
-rw-r--r--tests/scaling_check.c138
1 files changed, 138 insertions, 0 deletions
diff --git a/tests/scaling_check.c b/tests/scaling_check.c
new file mode 100644
index 00000000..96df9cf0
--- /dev/null
+++ b/tests/scaling_check.c
@@ -0,0 +1,138 @@
+/*
+ * scaling_check.c
+ *
+ * Check that scaling works
+ *
+ * Copyright © 2017-2018 Deutsches Elektronen-Synchrotron DESY,
+ * a research centre of the Helmholtz Association.
+ *
+ * Authors:
+ * 2017-2018 Thomas White <taw@physics.org>
+ *
+ * This file is part of CrystFEL.
+ *
+ * CrystFEL is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * CrystFEL is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with CrystFEL. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+
+#include <stdlib.h>
+#include <stdio.h>
+
+#include <reflist.h>
+#include <cell-utils.h>
+
+#include "../src/scaling.h"
+
+int test_scaling(double G, double B, int scaleflags, int do_partials,
+ gsl_rng *rng)
+{
+ int i;
+ Crystal *cr;
+ RefList *list1;
+ RefList *list2;
+ int r;
+ UnitCell *cell;
+
+ list1 = reflist_new();
+ list2 = reflist_new();
+
+ cell = cell_new();
+ cell_set_parameters(cell, 50e-10, 50e-10, 50e-10,
+ deg2rad(90), deg2rad(90), deg2rad(90));
+
+ for ( i=0; i<50; i++ ) {
+
+ signed int h, k, l;
+ Reflection *refl1;
+ Reflection *refl2;
+ double intens, p, s, L;
+
+ h = gsl_rng_uniform_int(rng, 20) - gsl_rng_uniform_int(rng, 40);
+ k = gsl_rng_uniform_int(rng, 20) - gsl_rng_uniform_int(rng, 40);
+ l = gsl_rng_uniform_int(rng, 20) - gsl_rng_uniform_int(rng, 40);
+
+ refl1 = add_refl(list1, h, k, l);
+ refl2 = add_refl(list2, h, k, l);
+ intens = gsl_rng_uniform(rng); /* [0,1) */
+ p = do_partials ? gsl_rng_uniform(rng) : 1.0;
+ L = gsl_rng_uniform(rng);
+
+ s = resolution(cell, h, k, l);
+
+ /* Reference */
+ set_intensity(refl2, intens);
+ set_partiality(refl2, 1.0);
+ set_lorentz(refl2, 1.0);
+ set_redundancy(refl2, 2);
+
+ /* Crystal */
+ set_intensity(refl1, intens * G * exp(-B*s*s) * p / L);
+ set_partiality(refl1, p);
+ set_lorentz(refl1, L);
+
+ }
+
+ cr = crystal_new();
+ crystal_set_reflections(cr, list1);
+ crystal_set_cell(cr, cell);
+
+ crystal_set_osf(cr, 999.0);
+ crystal_set_Bfac(cr, 999.0);
+
+ r = scale_one_crystal(cr, list2, scaleflags | SCALE_VERBOSE_ERRORS);
+ STATUS("Scaling result: %i, G = %8.4f, B = %8.4f A^2\n", r,
+ crystal_get_osf(cr), crystal_get_Bfac(cr)*1e20);
+
+ if ( fabs(G - crystal_get_osf(cr)) > 0.001 ) r = 1;
+ if ( fabs(B - crystal_get_Bfac(cr)) > 0.001e-20 ) r = 1;
+
+ reflist_free(list1);
+ reflist_free(list2);
+ cell_free(cell);
+ crystal_free(cr);
+
+ if ( r ) {
+ STATUS(" (should be: G = %8.4f, B = %8.4f A^2), %s partials\n",
+ G, B*1e20, do_partials ? "with" : "no");
+ }
+
+ return r;
+}
+
+
+int main(int argc, char *argv[])
+{
+ int fail = 0;
+ gsl_rng *rng;
+
+ rng = gsl_rng_alloc(gsl_rng_mt19937);
+
+ fail += test_scaling(2.0, 0.0, SCALE_NO_B, 0, rng);
+ fail += test_scaling(2.0, 0.0, SCALE_NONE, 0, rng);
+ fail += test_scaling(2.0, 10.0e-20, SCALE_NONE, 0, rng);
+ fail += test_scaling(5.0, 30.0e-20, SCALE_NONE, 0, rng);
+ fail += test_scaling(2.0, 0.0, SCALE_NO_B, 1, rng);
+ fail += test_scaling(2.0, 0.0, SCALE_NONE, 1, rng);
+ fail += test_scaling(2.0, 10.0e-20, SCALE_NONE, 1, rng);
+ fail += test_scaling(5.0, 30.0e-20, SCALE_NONE, 1, rng);
+
+ gsl_rng_free(rng);
+
+ return fail;
+}