aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--doc/man/render_hkl.15
-rw-r--r--src/render_hkl.c73
2 files changed, 73 insertions, 5 deletions
diff --git a/doc/man/render_hkl.1 b/doc/man/render_hkl.1
index 89dd57d7..ff55e9f0 100644
--- a/doc/man/render_hkl.1
+++ b/doc/man/render_hkl.1
@@ -95,6 +95,11 @@ The default is \fB--weighting=I\fR.
.PD
Write the selected colour scale out to 'key.pdf' in the current directory.
+.PD 0
+.IP \fB--res-ring=\fBres\fR
+.PD
+Draw a resolution ring at \fIres\fR Angstroms. You can use this option multiple times to get more than one ring.
+
.SH AUTHOR
This page was written by Thomas White.
diff --git a/src/render_hkl.c b/src/render_hkl.c
index c08f0776..2eb9ef9a 100644
--- a/src/render_hkl.c
+++ b/src/render_hkl.c
@@ -3,11 +3,11 @@
*
* Draw pretty renderings of reflection lists
*
- * Copyright © 2012 Deutsches Elektronen-Synchrotron DESY,
- * a research centre of the Helmholtz Association.
+ * Copyright © 2012-2013 Deutsches Elektronen-Synchrotron DESY,
+ * a research centre of the Helmholtz Association.
*
* Authors:
- * 2010-2012 Thomas White <taw@physics.org>
+ * 2010-2013 Thomas White <taw@physics.org>
*
* This file is part of CrystFEL.
*
@@ -89,6 +89,8 @@ static void show_help(const char *s)
" rawcts : the raw number of measurements for the\n"
" reflection (no 'epsilon' correction).\n"
"\n"
+" --res-ring=<r> Draw a resolution ring at <r> Angstroms.\n"
+"\n"
" --colour-key Draw (only) the key for the current colour scale.\n"
" The key will be written to 'key.pdf' in the\n"
" current directory.\n"
@@ -393,12 +395,20 @@ static void render_overlined_indices(cairo_t *dctx,
}
+struct resrings
+{
+ double res[100];
+ int n_rings;
+};
+
+
static void render_za(UnitCell *cell, RefList *list,
double boost, const SymOpList *sym, int wght,
int colscale,
signed int xh, signed int xk, signed int xl,
signed int yh, signed int yk, signed int yl,
- const char *outfile, double scale_top, signed int zone)
+ const char *outfile, double scale_top, signed int zone,
+ struct resrings *rings)
{
cairo_surface_t *surface;
cairo_t *dctx;
@@ -420,6 +430,7 @@ static void render_za(UnitCell *cell, RefList *list,
const double border = 200.0;
int png;
double rmin, rmax;
+ int i;
/* Vector product to determine the zone axis. */
zh = yk*xl - yl*xk;
@@ -522,6 +533,29 @@ static void render_za(UnitCell *cell, RefList *list,
cairo_set_source_rgb(dctx, 1.0, 0.0, 0.0);
cairo_fill(dctx);
+ /* Resolution rings */
+ for ( i=0; i<rings->n_rings; i++ ) {
+
+ char label[32];
+ double r = 1.0/(rings->res[i]*1e-10);
+
+ snprintf(label, 31, "%.1f A", rings->res[i]);
+
+ cairo_save(dctx);
+ cairo_arc(dctx, (double)cx, (double)cy, scale*r, 0, 2*M_PI);
+ cairo_set_source_rgb(dctx, 1.0, 0.0, 0.0);
+ cairo_stroke(dctx);
+ cairo_translate(dctx, cx, cy);
+ cairo_rotate(dctx, -M_PI/4.0);
+ cairo_translate(dctx, 0.0, scale*r);
+ cairo_set_font_size(dctx, 17.0);
+ cairo_text_extents(dctx, label, &size);
+ cairo_translate(dctx, -size.width/2.0, 5.0+size.height);
+ cairo_show_text(dctx, label);
+ cairo_fill(dctx);
+ cairo_restore(dctx);
+ }
+
/* Draw indexing lines */
cairo_set_line_cap(dctx, CAIRO_LINE_CAP_ROUND);
cairo_set_line_width(dctx, 2.0);
@@ -684,6 +718,18 @@ static void render_za(UnitCell *cell, RefList *list,
#endif /* HAVE_CAIRO */
+static void add_ring(struct resrings *rings, double res)
+{
+ if ( rings->n_rings == 100 ) {
+ ERROR("Too many resolution rings.\n");
+ return;
+ }
+
+ rings->res[rings->n_rings] = res;
+ rings->n_rings++;
+}
+
+
int main(int argc, char *argv[])
{
int c;
@@ -710,6 +756,10 @@ int main(int argc, char *argv[])
double scale_top = -1.0;
char *endptr;
long int zone = 0;
+ double res;
+ struct resrings rings;
+
+ rings.n_rings = 0;
/* Long options */
const struct option longopts[] = {
@@ -727,6 +777,7 @@ int main(int argc, char *argv[])
{"colour-key", 0, &config_colkey, 1},
{"scale-top", 1, NULL, 2},
{"zone", 1, NULL, 3},
+ {"res-ring", 1, NULL, 4},
{0, 0, NULL, 0}
};
@@ -798,6 +849,18 @@ int main(int argc, char *argv[])
}
break;
+ case 4 :
+ errno = 0;
+ res = strtod(optarg, &endptr);
+ if ( !( (optarg[0] != '\0') && (endptr[0] == '\0') )
+ || (errno != 0) )
+ {
+ ERROR("Invalid resolution ('%s')\n", optarg);
+ return 1;
+ }
+ add_ring(&rings, res);
+ break;
+
case 0 :
break;
@@ -920,7 +983,7 @@ int main(int argc, char *argv[])
}
render_za(cell, list, boost, sym, wght, colscale,
- rh, rk, rl, dh, dk, dl, outfile, scale_top, zone);
+ rh, rk, rl, dh, dk, dl, outfile, scale_top, zone, &rings);
free(pdb);
free_symoplist(sym);