X-Git-Url: http://git.kpe.io/?a=blobdiff_plain;f=tools%2Fpjrec.cpp;h=496ace5c93e4f6cc1e16afa4cdcb92e62fe0b219;hb=bd3ff8cf33195aa27dbd82e16b2f2c8eb8780cf9;hp=df9af1ca2bcf4f12f3e594ba8792cb3ab8bc1c8a;hpb=e4c1f7f8eb87558c3abf3bf1d20732361f425351;p=ctsim.git diff --git a/tools/pjrec.cpp b/tools/pjrec.cpp index df9af1c..496ace5 100644 --- a/tools/pjrec.cpp +++ b/tools/pjrec.cpp @@ -9,7 +9,7 @@ ** This is part of the CTSim program ** Copyright (C) 1983-2000 Kevin Rosenberg ** -** $Id: pjrec.cpp,v 1.2 2000/07/15 08:36:13 kevin Exp $ +** $Id: pjrec.cpp,v 1.8 2000/08/03 09:53:09 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 @@ -29,7 +29,7 @@ #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[] = { @@ -38,6 +38,7 @@ 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}, @@ -48,6 +49,7 @@ static struct option my_options[] = {0, 0, 0, 0} }; +static const char* g_szIdStr = "$id$"; void pjrec_usage (const char *program) @@ -89,6 +91,9 @@ 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; @@ -131,10 +136,11 @@ pjrec_main (int argc, char * argv[]) 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 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 @@ -174,8 +180,8 @@ pjrec_main (int argc, char * argv[]) 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); @@ -191,6 +197,9 @@ pjrec_main (int argc, char * argv[]) return(1); } break; + case O_BACKPROJ: + optBackprojName = optarg; + break; case O_VERBOSE: optVerbose = 1; break; @@ -198,14 +207,14 @@ pjrec_main (int argc, char * argv[]) 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 << "Id " << g_szIdStr << endl; #else cout << "Unknown version number" << endl; #endif @@ -239,7 +248,7 @@ pjrec_main (int argc, char * argv[]) 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) @@ -309,7 +318,7 @@ pjrec_main (int argc, char * argv[]) #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"); @@ -318,7 +327,7 @@ pjrec_main (int argc, char * argv[]) 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