** This is part of the CTSim program
** Copyright (C) 1983-2000 Kevin Rosenberg
**
-** $Id: pjrec.cpp,v 1.1 2000/07/13 07:01:35 kevin Exp $
+** $Id: pjrec.cpp,v 1.10 2000/08/03 09:57:29 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
#include "timer.h"
-enum {O_INTERP, O_FILTER, O_FILTER_METHOD, O_ZEROPAD, O_FILTER_PARAM, O_BACKPROJ, O_PREINTERPOLATION_FACTOR, O_VERBOSE, O_TRACE, O_HELP, O_DEBUG, O_VERSION};
+enum {O_INTERP, O_FILTER, O_FILTER_METHOD, O_ZEROPAD, O_FILTER_PARAM, O_FREQUENCY_FILTER, O_BACKPROJ, O_PREINTERPOLATION_FACTOR, O_VERBOSE, O_TRACE, O_HELP, O_DEBUG, O_VERSION};
static struct option my_options[] =
{
{"filter", 1, 0, O_FILTER},
{"filter-method", 1, 0, O_FILTER_METHOD},
{"zeropad", 1, 0, O_ZEROPAD},
+ {"frequency-filter", 1, 0, O_FREQUENCY_FILTER},
{"filter-param", 1, 0, O_FILTER_PARAM},
{"backproj", 1, 0, O_BACKPROJ},
{"trace", 1, 0, O_TRACE},
{0, 0, 0, 0}
};
+static const char* g_szIdStr = "$Id: pjrec.cpp,v 1.10 2000/08/03 09:57:29 kevin Exp $";
void
pjrec_usage (const char *program)
#endif
cout << " --zeropad n Set zeropad level (default = 0)\n";
cout << " set n to number of powers to two to pad\n";
+ cout << " --frequency-filter Set type of frequency filter\n";
+ cout << " direct_frequency Use direct frequency filter\n";
+ cout << " inverse_spatial Use inverse fourier transform of spatial filter\n";
cout << " --backproj Backprojection Method" << endl;
cout << " trig Trigometric functions at every point" << endl;
cout << " table Trigometric functions with precalculated table" << endl;
int optZeroPad = 0;
int optTrace = TRACE_NONE;
double optFilterParam = -1;
- string optFilterName = SignalFilter::FILTER_ABS_BANDLIMIT_STR;
- string optFilterMethodName = SignalFilter::FILTER_METHOD_CONVOLUTION_STR;
- string optInterpName = Backprojector::INTERP_LINEAR_STR;
- string optBackprojName = Backprojector::BPROJ_IDIFF2_STR;
- // string optFilterMethodName = SignalFilter::FILTER_METHOD_CONVOLUTION_STR;
+ string optFilterName (SignalFilter::convertFilterIDToName (SignalFilter::FILTER_ABS_BANDLIMIT));
+ string optFilterMethodName (SignalFilter::convertFilterMethodIDToName (SignalFilter::FILTER_METHOD_CONVOLUTION));
+ string optFrequencyFilterName (SignalFilter::convertFrequencyFilterIDToName (SignalFilter::FREQUENCY_FILTER_INVERSE_SPATIAL));
+ string optInterpName (Backprojector::convertInterpIDToName (Backprojector::INTERP_LINEAR));
+ string optBackprojName (Backprojector::convertBackprojectIDToName (Backprojector::BPROJ_IDIFF3));
int optPreinterpolationFactor = 1;
int nx, ny;
#ifdef HAVE_MPI
case O_FILTER_METHOD:
optFilterMethodName = optarg;
break;
- case O_BACKPROJ:
- optBackprojName = optarg;
+ case O_FREQUENCY_FILTER:
+ optFrequencyFilterName = optarg;
break;
case O_FILTER_PARAM:
optFilterParam = strtod(optarg, &endptr);
return(1);
}
break;
+ case O_BACKPROJ:
+ optBackprojName = optarg;
+ break;
case O_VERBOSE:
optVerbose = 1;
break;
optDebug = 1;
break;
case O_TRACE:
- if ((optTrace = convertTraceNameToID(optarg)) == TRACE_INVALID) {
+ if ((optTrace = TraceLevel::convertTraceNameToID(optarg)) == TRACE_INVALID) {
pjrec_usage(argv[0]);
return (1);
}
break;
case O_VERSION:
#ifdef VERSION
- cout << "Version " << VERSION << endl;
+ cout << "Version " << VERSION << endl << g_szIdStr << endl;
#else
cout << "Unknown version number" << endl;
#endif
filterDesc << optFilterName;
ostringstream label;
- label << "pjrec: " << nx << "x" << ny << ", " << filterDesc.str() << ", " << optInterpName << ", preinterpolation=" << optPreinterpolationFactor << ", " << optBackprojName;
+ label << "pjrec: " << nx << "x" << ny << ", " << filterDesc.str() << ", " << optInterpName << ", preinterpolationFactor=" << optPreinterpolationFactor << ", " << optBackprojName;
remark = label.str();
if (optVerbose)
#ifdef HAVE_MPI
TimerCollectiveMPI timerReconstruct (mpiWorld.getComm());
- projLocal.reconstruct (*imLocal, optFilterName.c_str(), optFilterParam, optFilterMethodName.c_str(), optZeroPad, optInterpName.c_str(), optPreinterpolationFactor, optBackprojName.c_str(), optTrace);
+ projLocal.reconstruct (*imLocal, optFilterName.c_str(), optFilterParam, optFilterMethodName.c_str(), optZeroPad, optFrequencyFilterName.c_str(), optInterpName.c_str(), optPreinterpolationFactor, optBackprojName.c_str(), optTrace);
if (optVerbose)
timerReconstruct.timerEndAndReport ("Time to reconstruct");
if (optVerbose)
timerReduce.timerEndAndReport ("Time to reduce image");
#else
- projGlobal.reconstruct (*imGlobal, optFilterName.c_str(), optFilterParam, optFilterMethodName.c_str(), optZeroPad, optInterpName.c_str(), optPreinterpolationFactor, optBackprojName.c_str(), optTrace);
+ projGlobal.reconstruct (*imGlobal, optFilterName.c_str(), optFilterParam, optFilterMethodName.c_str(), optZeroPad, optFrequencyFilterName.c_str(), optInterpName.c_str(), optPreinterpolationFactor, optBackprojName.c_str(), optTrace);
#endif
#ifdef HAVE_MPI