51bf5de0189cd32368d7fb5ddf8db72cd512db48
[ctsim.git] / tools / pjHinterp.cpp
1 /*****************************************************************************
2 * ** FILE IDENTIFICATION
3 * **
4 * **   Name:          phm2helix.cpp
5 * **   Purpose:       Take projections of a phantom object
6 * **   Programmer:    Ian Kay
7 * **   Date Started:  Aug 2001
8 * **
9 * **  This is part of the CTSim program
10 * **  Copyright (C) 1983-2000 Kevin Rosenberg
11 * **
12 * **  $Id$
13 * **
14 * **  This program is free software; you can redistribute it and/or modify
15 * **  it under the terms of the GNU General Public License (version 2) as
16 * **  published by the Free Software Foundation.
17 * **
18 * **  This program is distributed in the hope that it will be useful,
19 * **  but WITHOUT ANY WARRANTY; without even the implied warranty of
20 * **  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
21 * **  GNU General Public License for more details.
22 * **
23 * **  You should have received a copy of the GNU General Public License
24 * **  along with this program; if not, write to the Free Software
25 * **  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
26 * ******************************************************************************/
27
28 #include "ct.h"
29 #include "timer.h"
30
31
32 enum { O_INTERPVIEW, O_VERBOSE, O_TRACE, O_HELP, O_DEBUG, O_VERSION};
33
34
35 static struct option my_options[] =
36 {
37         {"interpview", 1, 0, O_INTERPVIEW},
38         {"trace", 1, 0, O_TRACE},
39         {"debug", 0, 0, O_DEBUG},
40         {"verbose", 0, 0, O_VERBOSE},
41         {"help", 0, 0, O_HELP},
42         {"version", 0, 0, O_VERSION},
43         {0, 0, 0, 0}
44 };
45
46 static const char* g_szIdStr = "$Id$";
47
48 void pjHinterp_usage ( const char *program )
49 {
50   std::cout << "usage: " << fileBasename(program) << " projection-file interp-projection-file [OPTIONS]" << std::endl;
51   std::cout << "Interpolation of helical data in raw data space" << std::endl;
52   std::cout << "  projection-file Input projection file" << std::endl;
53   std::cout << "  interp-file     Output interpolated projection file " << std::endl;
54   std::cout << "  --trace         Set tracing to level" << std::endl;
55   std::cout << "     none         No tracing (default)" << std::endl;
56   std::cout << "     console      Text level tracing" << std::endl;
57   std::cout << "  --verbose       Turn on verbose mode" << std::endl;
58   std::cout << "  --debug         Turn on debug mode" << std::endl;
59   std::cout << "  --version       Print version" << std::endl;
60   std::cout << "  --help          Print this help message" << std::endl;
61 }
62
63
64 int
65 pjHinterp_main(int argc, char * const argv[])
66 {
67   Projections projGlobal;
68   char* pszProjFilename = NULL;
69   char* pszInterpFilename = NULL;
70   bool bOptVerbose = false;
71   bool bOptDebug = 1;
72   int optTrace = Trace::TRACE_NONE;
73   char *endptr = NULL;
74   char *endstr;
75   int opt_interpview=-1;
76
77   while (1) {
78     int c = getopt_long(argc, argv, "", my_options, NULL);
79
80     if (c == -1)
81       break;
82
83     switch (c) {
84     case O_INTERPVIEW:
85       opt_interpview = strtol(optarg, &endptr, 10);
86       endstr = optarg + strlen(optarg);
87       if (endptr != endstr) {
88         std::cerr << "Error setting --interpview to %s" << optarg << std::endl;
89         pjHinterp_usage(argv[0]);
90         return(1);
91       }
92       break;
93     case O_VERBOSE:
94       bOptVerbose = true;
95       break;
96     case O_DEBUG:
97       bOptDebug = true;
98       break;
99     case O_TRACE:
100       if ((optTrace = Trace::convertTraceNameToID(optarg))
101           == Trace::TRACE_INVALID) {
102         pjHinterp_usage(argv[0]);
103         return (1);
104       }
105       break;
106     case O_VERSION:
107 #ifdef VERSION
108       std::cout <<  "Version " <<  VERSION << std::endl <<
109         g_szIdStr << std::endl;
110 #else
111       std::cout << "Unknown version number" << std::endl;
112 #endif
113       return (0);
114
115     case O_HELP:
116     case '?':
117       pjHinterp_usage(argv[0]);
118       return (0);
119     default:
120       pjHinterp_usage(argv[0]);
121       return (1);
122     } // end switch
123   } // end while
124
125   if (optind + 2 != argc) {
126     pjHinterp_usage(argv[0]);
127     return (1);
128   }
129
130   pszProjFilename = argv[optind];
131
132   pszInterpFilename = argv[optind + 1];
133
134   Projections projections;
135   if ( projections.read(pszProjFilename) != true ){
136     std::cerr << "Error reading input file " << pszProjFilename << std::endl;
137     return (1);
138   }
139   if (bOptVerbose) {
140           std::ostringstream os;
141     projections.printScanInfo(os);
142     std::cout << os.str();
143   }
144
145   int status = projections.Helical180LI(opt_interpview);
146   if ( status != 0 )  return (1);
147   status = projections.HalfScanFeather();
148   if ( status != 0 )  return (1);
149   projections.write( pszInterpFilename  );
150
151   return (0);
152 }
153
154
155 #ifndef NO_MAIN
156 int
157 main (int argc, char* argv[])
158 {
159   int retval = 1;
160
161   try {
162     retval = pjHinterp_main(argc, argv);
163   } catch (exception e) {
164       std::cerr << "Exception: " << e.what() << std::endl;
165   } catch (...) {
166       std::cerr << "Unknown exception" << std::endl;
167   }
168
169   return (retval);
170 }
171 #endif