diff options
author | Thomas White <taw@physics.org> | 2023-05-12 12:10:31 +0200 |
---|---|---|
committer | Thomas White <taw@physics.org> | 2023-07-28 13:22:04 +0200 |
commit | d158adaba362ec856851c7891eb6da6b9d74b2a0 (patch) | |
tree | 87c7e939fcadfee2ae80f7eecd12720568888c84 /src | |
parent | a37e7f302b2b2b06d055304b0987b59049d262b2 (diff) |
adjust_detector: Initial template
Diffstat (limited to 'src')
-rw-r--r-- | src/adjust_detector.c | 196 |
1 files changed, 196 insertions, 0 deletions
diff --git a/src/adjust_detector.c b/src/adjust_detector.c new file mode 100644 index 00000000..2e815677 --- /dev/null +++ b/src/adjust_detector.c @@ -0,0 +1,196 @@ +/* + * adjust_detector.c + * + * Move detector panels + * + * Copyright © 2023 Deutsches Elektronen-Synchrotron DESY, + * a research centre of the Helmholtz Association. + * + * Authors: + * 2023 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 <string.h> +#include <getopt.h> + +#include <datatemplate.h> +#include <utils.h> + +#include "version.h" + + +static void show_syntax(const char *s) +{ + printf("Syntax: %s [options] -g <input.geom> -o <output.geom> [...]\n", s); +} + + +static void show_help(const char *s) +{ + show_syntax(s); + printf("\nMove detector panels.\n" + "\n" + " -g, --geometry=file Input geometry file\n" + " -o, --output=file Output geometry file\n" + " -p, --panel=p Panel (or group) to move\n" + " --mm Interpret shifts as mm, not px\n" + "\n" + " -a Rotation around x-axis\n" + " -b Rotation around y-axis\n" + " -c Rotation around z-axis\n" + " -x Shift in x direction\n" + " -y Shift in y direction\n" + " -z Shift in z direction\n" + "\n" + " -h, --help Display this help message\n" + " --version Print version number and exit\n"); +} + + +static double parse_double(const char *str, char complain) +{ + double v; + char *rval; + + errno = 0; + v = strtod(optarg, &rval); + if ( *rval != '\0' ) { + ERROR("Invalid value for -%c.\n", complain); + exit(1); + } + + return v; +} + + +int main(int argc, char *argv[]) +{ + int c; + char *in_geom = NULL; + char *out_geom = NULL; + double x_shift = 0.0; + double y_shift = 0.0; + double z_shift = 0.0; + double x_rot = 0.0; + double y_rot = 0.0; + double z_rot = 0.0; + int mm = 0; + char *group = strdup("all"); + + /* Long options */ + const struct option longopts[] = { + + {"help", 0, NULL, 'h'}, + {"verbose", 0, NULL, 'v'}, + + {"version", 0, NULL, 'V'}, + {"input", 1, NULL, 'g'}, + {"output", 1, NULL, 'o'}, + {"panel", 1, NULL, 'p'}, + {"mm", 0, NULL, 3}, + + {0, 0, NULL, 0} + }; + + /* Short options */ + while ((c = getopt_long(argc, argv, "hVo:g:i:l:p:x:y:z:a:b:c:", + longopts, NULL)) != -1) + { + + switch (c) { + + case 'h' : + show_help(argv[0]); + return 0; + + case 'V' : + printf("CrystFEL: %s\n", crystfel_version_string()); + printf("%s\n", crystfel_licence_string()); + return 0; + + case 'g' : + case 'i' : + in_geom = strdup(optarg); + break; + + case 'o' : + out_geom = strdup(optarg); + break; + + case 'p' : + free(group); + group = strdup(optarg); + break; + + case 3 : + mm = 1; + break; + + case 'x' : + x_shift = parse_double(optarg, 'x'); + break; + + case 'y' : + x_shift = parse_double(optarg, 'y'); + break; + + case 'z' : + z_shift = parse_double(optarg, 'z'); + break; + + case 'a' : + x_rot = parse_double(optarg, 'a'); + break; + + case 'b' : + y_rot = parse_double(optarg, 'b'); + break; + + case 'c' : + z_rot = parse_double(optarg, 'c'); + break; + + case 0 : + break; + + case '?' : + break; + + default : + ERROR("Unhandled option '%c'\n", c); + break; + + } + + } + + if ( (in_geom == NULL) || (out_geom == NULL) ) { + show_syntax(argv[0]); + return 1; + } + + return 0; +} |