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