aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas White <taw@physics.org>2022-12-20 14:40:43 +0100
committerThomas White <taw@physics.org>2022-12-20 14:40:43 +0100
commit0e764604b51609f50801108c8789ced0d310000e (patch)
tree71841176ebecf91e03b0ff1b068e4c3543a99d73
parentf0b4c3deb0f44c5d1f64e52e033164406bb5bcef (diff)
CrystFELFoMGraph: Adjust y-axis for FoMs that don't have a sensible range
-rw-r--r--src/crystfelfomgraph.c66
1 files changed, 47 insertions, 19 deletions
diff --git a/src/crystfelfomgraph.c b/src/crystfelfomgraph.c
index 62a8075f..a80b3012 100644
--- a/src/crystfelfomgraph.c
+++ b/src/crystfelfomgraph.c
@@ -99,25 +99,51 @@ static void fom_colour(enum fom_type t, double *col)
}
-static void fom_range(enum fom_type t, double *min, double *max)
+static void fom_range(enum fom_type t, double *vals, int n_shells,
+ double *min, double *max)
{
+ double cmin, cmax;
+
switch ( t ) {
- case FOM_R1I: *min = 0.0; *max = 0.8; break;
- case FOM_R1F: *min = 0.0; *max = 0.8; break;
- case FOM_R2: *min = 0.0; *max = 0.8; break;
- case FOM_RSPLIT: *min = 0.0; *max = 0.8; break;
- case FOM_CC: *min = 0.9; *max = 1.0; break;
- case FOM_CCSTAR: *min = 0.9; *max = 1.0; break;
- case FOM_CCANO: *min = 0.9; *max = 1.0; break;
- case FOM_CRDANO: *min = 0.9; *max = 1.0; break;
- case FOM_RANO: *min = 0.0; *max = 0.7; break;
- case FOM_RANORSPLIT: *min = 0.0; *max = 8.0; break;
- case FOM_D1SIG: *min = 0.0; *max = 1.0; break;
- case FOM_D2SIG: *min = 0.0; *max = 1.0; break;
- case FOM_REDUNDANCY: *min = 0.0; *max = 100; break;
- case FOM_SNR: *min = 0.0; *max = 10.0; break;
- case FOM_COMPLETENESS: *min = 0.0; *max = 1.0; break;
- default: *min = 0.0; *max = 1.0; break;
+ case FOM_R1I: cmin = 0.0; cmax = 0.8; break;
+ case FOM_R1F: cmin = 0.0; cmax = 0.8; break;
+ case FOM_R2: cmin = 0.0; cmax = 0.8; break;
+ case FOM_RSPLIT: cmin = 0.0; cmax = 0.8; break;
+ case FOM_CC: cmin = 0.9; cmax = 1.0; break;
+ case FOM_CCSTAR: cmin = 0.9; cmax = 1.0; break;
+ case FOM_CCANO: cmin = 0.9; cmax = 1.0; break;
+ case FOM_CRDANO: cmin = 0.5; cmax = 1.0; break;
+ case FOM_RANO: cmin = 0.0; cmax = 0.8; break;
+ case FOM_RANORSPLIT: cmin = NAN; cmax = NAN; break;
+ case FOM_D1SIG: cmin = 0.0; cmax = 1.0; break;
+ case FOM_D2SIG: cmin = 0.0; cmax = 1.0; break;
+ case FOM_REDUNDANCY: cmin = 0.0; cmax = NAN; break;
+ case FOM_SNR: cmin = 0.0; cmax = NAN; break;
+ case FOM_COMPLETENESS: cmin = 0.0; cmax = 1.0; break;
+ default: cmin = 0.0; cmax = 1.0; break;
+ }
+
+ if ( isnan(cmin) || isnan(cmax) ) {
+ int i;
+ double vmin = INFINITY;
+ double vmax = -INFINITY;
+ for ( i=0; i<n_shells; i++ ) {
+ if ( vals[i] < vmin ) vmin = vals[i];
+ if ( vals[i] > vmax ) vmax = vals[i];
+ }
+ if ( isnan(cmin) ) {
+ *min = vmin;
+ } else {
+ *min = cmin;
+ }
+ if ( isnan(cmax) ) {
+ *max = vmax;
+ } else {
+ *max = cmax;
+ }
+ } else {
+ *min = cmin;
+ *max = cmax;
}
}
@@ -248,7 +274,8 @@ static gint draw_sig(GtkWidget *window, cairo_t *cr, CrystFELFoMGraph *fg)
double col[3];
double y1, y2;
fom_colour(fg->fom_types[j], col);
- fom_range(fg->fom_types[j], &y1, &y2);
+ fom_range(fg->fom_types[j], fg->fom_values[j], fg->n_shells,
+ &y1, &y2);
cairo_set_source_rgb(cr, col[0], col[1], col[2]);
draw_y_axis(cr, h, axsp, y1, y2, fom_name(fg->fom_types[j]));
ox += yaxsp;
@@ -274,7 +301,8 @@ static gint draw_sig(GtkWidget *window, cairo_t *cr, CrystFELFoMGraph *fg)
double col[3];
double y1, y2;
int split = 1;
- fom_range(fg->fom_types[j], &y1, &y2);
+ fom_range(fg->fom_types[j], fg->fom_values[j], fg->n_shells,
+ &y1, &y2);
for ( i=0; i<fg->n_shells; i++ ) {
double fv = fg->fom_values[j][i];
if ( !isnan(fv) ) {