r99: *** empty log message ***
[ctsim.git] / libctsim / options.cpp
diff --git a/libctsim/options.cpp b/libctsim/options.cpp
new file mode 100644 (file)
index 0000000..9bbb585
--- /dev/null
@@ -0,0 +1,271 @@
+/*****************************************************************************
+**  This is part of the CTSim program
+**  Copyright (C) 1983-2000 Kevin Rosenberg
+**
+**  $Id: options.cpp,v 1.1 2000/06/19 02:59:34 kevin Exp $
+**
+**  This program is free software; you can redistribute it and/or modify
+**  it under the terms of the GNU General Public License (version 2) as
+**  published by the Free Software Foundation.
+**
+**  This program 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 this program; if not, write to the Free Software
+**  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+******************************************************************************/
+#include "ct.h"
+
+int 
+opt_set_trace (const char *optarg)
+{
+  int opt;
+
+  if (strcmp(optarg, O_TRACE_NONE_STR) == 0)
+    opt = TRACE_NONE;
+  else if (strcmp(optarg, O_TRACE_TEXT_STR) == 0)
+    opt = TRACE_TEXT;
+  else if (strcmp(optarg, O_TRACE_PHM_STR) == 0)
+    opt = TRACE_PHM;
+  else if (strcmp(optarg, O_TRACE_PLOT_STR) == 0)
+    opt = TRACE_PLOT;
+  else if (strcmp(optarg, O_TRACE_CLIPPING_STR) == 0)
+    opt = TRACE_CLIPPING;
+  else if (strcmp(optarg, O_TRACE_RAYS_STR) == 0)
+    opt = TRACE_RAYS;
+  else {
+    sys_error(ERR_WARNING,"Invalid trace option %s\n", optarg);
+    opt = -1;
+  }
+
+  return (opt);
+}
+
+const char *
+name_of_phantom (const int phmnum)
+{
+  const char *name = "Unknown phantom";
+
+  if (phmnum == O_PHM_HERMAN)
+    name = O_PHM_HERMAN_STR;
+  else if (phmnum == O_PHM_ROWLAND)
+    name = O_PHM_ROWLAND_STR;
+  else if (phmnum == O_PHM_BROWLAND)
+    name = O_PHM_BROWLAND_STR;
+  else if (phmnum == O_PHM_UNITPULSE)
+    name = O_PHM_UNITPULSE_STR;
+
+  return (name);
+}
+      
+int 
+opt_set_phantom (const char *optarg)
+{
+  int opt;
+
+  if (strcmp(optarg, O_PHM_HERMAN_STR) == 0)
+    opt = O_PHM_HERMAN;
+  else if (strcmp(optarg, O_PHM_ROWLAND_STR) == 0)
+    opt = O_PHM_ROWLAND;
+  else if (strcmp(optarg, O_PHM_BROWLAND_STR) == 0)
+    opt = O_PHM_BROWLAND;
+  else if (strcmp(optarg, O_PHM_UNITPULSE_STR) == 0)
+    opt = O_PHM_UNITPULSE;
+  else {
+    sys_error(ERR_WARNING,"Invalid phantom option %s\n", optarg);
+    opt = -1;
+  }
+
+  return (opt);
+
+}
+  
+InterpolationType 
+opt_set_interpolation (const char *optarg)
+{
+  InterpolationType opt;
+
+  if (strcmp(optarg, O_INTERP_NEAREST_STR) == 0)
+    opt = I_NEAREST;
+  else if (strcmp(optarg, O_INTERP_LINEAR_STR) == 0)
+    opt = I_LINEAR;
+#if HAVE_BSPLINE_INTERP
+  else if (strcmp(optarg, O_INTERP_BSPLINE_STR) == 0)
+    opt = I_BSPLINE;
+#endif
+  else {
+    sys_error(ERR_WARNING, "Invalid interpolation type %s\n", optarg);
+    opt = static_cast<InterpolationType>(-1);
+  }
+    
+  return (opt);
+}
+
+FilterType 
+opt_set_filter (const char *optarg)
+{
+  FilterType opt;
+
+  if (strcmp(optarg, O_FILTER_BANDLIMIT_STR) == 0)
+    opt = FILTER_BANDLIMIT;
+  else if (strcmp(optarg, O_FILTER_HAMMING_STR) == 0)
+    opt = FILTER_G_HAMMING;
+  else if (strcmp(optarg, O_FILTER_SINC_STR) == 0)
+    opt = FILTER_SINC;
+  else if (strcmp(optarg, O_FILTER_COS_STR) == 0)
+    opt = FILTER_COSINE;
+  else if (strcmp(optarg, O_FILTER_TRIANGLE_STR) == 0)
+    opt = FILTER_TRIANGLE;
+  else if (strcmp(optarg, O_FILTER_ABS_BANDLIMIT_STR) == 0)
+    opt = FILTER_ABS_BANDLIMIT;
+  else if (strcmp(optarg, O_FILTER_ABS_HAMMING_STR) == 0)
+    opt = FILTER_ABS_G_HAMMING;
+  else if (strcmp(optarg, O_FILTER_ABS_SINC_STR) == 0)
+    opt = FILTER_ABS_SINC;
+  else if (strcmp(optarg, O_FILTER_ABS_COS_STR) == 0)
+    opt = FILTER_ABS_COSINE;
+  else if (strcmp(optarg, O_FILTER_SHEPP_STR) == 0)
+    opt = FILTER_SHEPP;
+  else {
+    sys_error(ERR_WARNING, "Invalid filter type %s\n", optarg);
+    opt = static_cast<FilterType>(-1);
+  }
+
+  return (opt);
+}
+
+const char *
+name_of_filter (const int filter)
+{
+  const char *name = "Unknown filter";
+
+  if (filter == FILTER_SHEPP)
+    name = O_FILTER_SHEPP_STR;
+  else if (filter == FILTER_ABS_COSINE)
+    name = O_FILTER_ABS_COS_STR;
+  else if (filter == FILTER_ABS_SINC)
+    name = O_FILTER_ABS_SINC_STR;
+  else if (filter == FILTER_ABS_G_HAMMING)
+    name = O_FILTER_ABS_HAMMING_STR;
+  else if (filter == FILTER_ABS_BANDLIMIT)
+    name = O_FILTER_ABS_BANDLIMIT_STR;
+  else if (filter == FILTER_COSINE)
+    name = O_FILTER_COS_STR;
+  else if (filter == FILTER_SINC)
+    name = O_FILTER_SINC_STR;
+  else if (filter == FILTER_G_HAMMING)
+    name = O_FILTER_HAMMING_STR;
+  else if (filter == FILTER_BANDLIMIT)
+    name = O_FILTER_BANDLIMIT_STR;
+  else if (filter == FILTER_TRIANGLE)
+    name = O_FILTER_TRIANGLE_STR;
+           
+  return (name);
+}
+      
+DomainType
+opt_set_filter_domain (const char *optarg)
+{
+  DomainType opt;
+
+  if (strcmp(optarg, D_SPATIAL_STR) == 0)
+    opt = D_SPATIAL;
+  else if (strcmp(optarg, D_FREQ_STR) == 0)
+    opt = D_FREQ;
+  else {
+    sys_error(ERR_WARNING, "Invalid filter domain %s\n", optarg);
+    opt = static_cast<DomainType>(-1);
+  }
+
+  return (opt);
+}
+
+const char *
+name_of_filter_domain (const DomainType domain)
+{
+  const char *name = "Unknown domain";
+
+  if (domain == D_SPATIAL)
+    return(D_SPATIAL_STR);
+  else if (domain == D_FREQ)
+    return(D_FREQ_STR);
+
+  return (name);
+}
+
+
+BackprojType
+opt_set_backproj (const char *optarg)
+{
+  BackprojType opt;
+
+  if (strcmp(optarg, O_BPROJ_TRIG_STR) == 0)
+    opt = O_BPROJ_TRIG;
+  else if (strcmp(optarg, O_BPROJ_TABLE_STR) == 0)
+    opt = O_BPROJ_TABLE;
+  else if (strcmp(optarg, O_BPROJ_DIFF_STR) == 0)
+    opt = O_BPROJ_DIFF;
+  else if (strcmp(optarg, O_BPROJ_DIFF2_STR) == 0)
+    opt = O_BPROJ_DIFF2;
+  else if (strcmp(optarg, O_BPROJ_IDIFF2_STR) == 0)
+    opt = O_BPROJ_IDIFF2;
+  else {
+    sys_error(ERR_WARNING, "Invalid backprojection method %s\n", optarg);
+    opt = static_cast<BackprojType>(-1);
+  }
+
+  return (opt);
+}
+
+const char *
+name_of_backproj(const BackprojType bproj)
+{
+  const char *name = "Unknown backprojection method";
+
+  if (bproj == O_BPROJ_TRIG)
+    name = O_BPROJ_TRIG_STR;
+  else if (bproj == O_BPROJ_TABLE)
+    name = O_BPROJ_TABLE_STR;
+  else if (bproj == O_BPROJ_DIFF)
+    name = O_BPROJ_DIFF_STR;
+  else if (bproj == O_BPROJ_DIFF2)
+    name = O_BPROJ_DIFF2_STR;
+  else if (bproj == O_BPROJ_IDIFF2)
+    name = O_BPROJ_IDIFF2_STR;
+
+  return (name);
+}
+
+
+
+/* NAME
+ *     name_of_interp                  Return name of interpolation method
+ *
+ * SYNOPSIS
+ *     name = name_of_interp (interp_type)
+ *     char *name                      Name of interpolation method
+ *     int interp_type                 Method of interpolation
+ *
+ * NOTES
+ *     Returns NULL if interp_type is invalid
+ */
+
+const char *
+name_of_interpolation (int interp_type)
+{
+  if (interp_type == I_NEAREST)
+    return (O_INTERP_NEAREST_STR);
+  else if (interp_type == I_LINEAR)
+    return (O_INTERP_LINEAR_STR);
+#if HAVE_BSPLINE_INTERP
+  else if (interp_type == I_BSPLINE)
+    return (O_INTERP_BSPLINE_STR);
+#endif
+  else
+    return ("Unknown interpolation method");
+}
+
+