** Date Started: Aug 1984
**
** This is part of the CTSim program
-** Copyright (C) 1983-2000 Kevin Rosenberg
-**
-** $Id: pjrec.cpp,v 1.24 2001/02/16 00:28:42 kevin Exp $
+** Copyright (C) 1983-2009 Kevin Rosenberg
**
** 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
{0, 0, 0, 0}
};
-static const char* g_szIdStr = "$Id: pjrec.cpp,v 1.24 2001/02/16 00:28:42 kevin Exp $";
+static const char* g_szIdStr = "$Id$";
-void
+void
pjrec_usage (const char *program)
{
std::cout << "usage: " << fileBasename(program) << " raysum-file image-file nx-image ny-image [OPTIONS]" << std::endl;
std::cout << " trig Trigometric functions at every point" << std::endl;
std::cout << " table Trigometric functions with precalculated table" << std::endl;
std::cout << " diff Difference method" << std::endl;
- std::cout << " diff2 Optimized difference method (default)" << std::endl;
- std::cout << " idiff2 Optimized difference method with integer math" << std::endl;
- std::cout << " idiff3 Highly-optimized difference method with integer math" << std::endl;
+ std::cout << " idiff Difference method with integer math [default]" << std::endl;
std::cout << " --filter-param Alpha level for Hamming filter" << std::endl;
std::cout << " --trace Set tracing to level" << std::endl;
std::cout << " none No tracing (default)" << std::endl;
std::cout << " console Text level tracing" << std::endl;
- std::cout << " phantom Trace phantom" << std::endl;
- std::cout << " proj Trace allrays" << std::endl;
- std::cout << " plot Trace plotting" << std::endl;
- std::cout << " clipping Trace clipping" << std::endl;
std::cout << " --verbose Turn on verbose mode" << std::endl;
std::cout << " --debug Turn on debug mode" << std::endl;
std::cout << " --version Print version" << std::endl;
#endif
-int
+int
pjrec_main (int argc, char * const argv[])
{
Projections projGlobal;
while (1) {
int c = getopt_long(argc, argv, "", my_options, NULL);
char *endptr = NULL;
-
+
if (c == -1)
- break;
-
+ break;
+
switch (c)
- {
- case O_INTERP:
- sOptInterpName = optarg;
- break;
- case O_PREINTERPOLATION_FACTOR:
- iOptPreinterpolationFactor = strtol(optarg, &endptr, 10);
- if (endptr != optarg + strlen(optarg)) {
- pjrec_usage(argv[0]);
- return(1);
- }
- break;
- case O_FILTER:
- sOptFilterName = optarg;
- break;
+ {
+ case O_INTERP:
+ sOptInterpName = optarg;
+ break;
+ case O_PREINTERPOLATION_FACTOR:
+ iOptPreinterpolationFactor = strtol(optarg, &endptr, 10);
+ if (endptr != optarg + strlen(optarg)) {
+ pjrec_usage(argv[0]);
+ return(1);
+ }
+ break;
+ case O_FILTER:
+ sOptFilterName = optarg;
+ break;
case O_FILTER_METHOD:
- sOptFilterMethodName = optarg;
+ sOptFilterMethodName = optarg;
+ break;
+ case O_FILTER_GENERATION:
+ sOptFilterGenerationName = optarg;
+ break;
+ case O_FILTER_PARAM:
+ dOptFilterParam = strtod(optarg, &endptr);
+ if (endptr != optarg + strlen(optarg)) {
+ pjrec_usage(argv[0]);
+ return(1);
+ }
+ break;
+ case O_ZEROPAD:
+ iOptZeropad = strtol(optarg, &endptr, 10);
+ if (endptr != optarg + strlen(optarg)) {
+ pjrec_usage(argv[0]);
+ return(1);
+ }
+ break;
+ case O_BACKPROJ:
+ sOptBackprojectName = optarg;
+ break;
+ case O_VERBOSE:
+ bOptVerbose = true;
+ break;
+ case O_DEBUG:
+ bOptDebug = true;
+ break;
+ case O_TRACE:
+ if ((optTrace = Trace::convertTraceNameToID(optarg)) == Trace::TRACE_INVALID) {
+ pjrec_usage(argv[0]);
+ return (1);
+ }
break;
- case O_FILTER_GENERATION:
- sOptFilterGenerationName = optarg;
- break;
- case O_FILTER_PARAM:
- dOptFilterParam = strtod(optarg, &endptr);
- if (endptr != optarg + strlen(optarg)) {
- pjrec_usage(argv[0]);
- return(1);
- }
- break;
- case O_ZEROPAD:
- iOptZeropad = strtol(optarg, &endptr, 10);
- if (endptr != optarg + strlen(optarg)) {
- pjrec_usage(argv[0]);
- return(1);
- }
- break;
- case O_BACKPROJ:
- sOptBackprojectName = optarg;
- break;
- case O_VERBOSE:
- bOptVerbose = true;
- break;
- case O_DEBUG:
- bOptDebug = true;
- break;
- case O_TRACE:
- if ((optTrace = Trace::convertTraceNameToID(optarg)) == Trace::TRACE_INVALID) {
- pjrec_usage(argv[0]);
- return (1);
- }
- break;
case O_VERSION:
#ifdef VERSION
- std::cout << "Version " << VERSION << std::endl << g_szIdStr << std::endl;
+ std::cout << "Version " << VERSION << std::endl << g_szIdStr << std::endl;
#else
std::cout << "Unknown version number" << std::endl;
#endif
- return (0);
- case O_HELP:
- case '?':
- pjrec_usage(argv[0]);
- return (0);
- default:
- pjrec_usage(argv[0]);
- return (1);
- }
+ return (0);
+ case O_HELP:
+ case '?':
+ pjrec_usage(argv[0]);
+ return (0);
+ default:
+ pjrec_usage(argv[0]);
+ return (1);
+ }
}
-
+
if (optind + 4 != argc) {
pjrec_usage(argv[0]);
return (1);
}
pszFilenameProj = argv[optind];
-
+
pszFilenameImage = argv[optind + 1];
-
+
nx = strtol(argv[optind + 2], &endptr, 10);
ny = strtol(argv[optind + 3], &endptr, 10);
-
+
std::ostringstream filterDesc;
if (dOptFilterParam >= 0)
- filterDesc << sOptFilterName << ": alpha=" << dOptFilterParam;
+ filterDesc << sOptFilterName << ": alpha=" << dOptFilterParam;
else
filterDesc << sOptFilterName;
std::ostringstream label;
label << "pjrec: " << nx << "x" << ny << ", " << filterDesc.str() << ", " << sOptInterpName << ", preinterpolationFactor=" << iOptPreinterpolationFactor << ", " << sOptBackprojectName;
sRemark = label.str();
-
+
if (bOptVerbose)
std::cout << "SRemark: " << sRemark << std::endl;
#ifdef HAVE_MPI
imLocal = new ImageFile (nx, ny);
#else
- projGlobal.read (pszFilenameProj);
+
+ if (! projGlobal.read (pszFilenameProj)) {
+ fprintf(stderr, "Unable to read projectfile file %s\n", pszFilenameProj);
+ exit(1);
+ }
+
if (bOptVerbose) {
std::ostringstream os;
projGlobal.printScanInfo(os);
imGlobal->labelAdd (Array2dFileLabel::L_HISTORY, sRemark.c_str(), dCalcTime);
imGlobal->fileWrite (pszFilenameImage);
if (bOptVerbose)
- std::cout << "Run time: " << dCalcTime << " seconds" << std::endl;
+ std::cout << "Run time: " << dCalcTime << " seconds" << std::endl;
}
#ifdef HAVE_MPI
MPI::Finalize();
if (mpiWorld.getRank() == 0) {
for (int iProc = 0; iProc < mpiWorld.getNumProcessors(); iProc++) {
for (int iw = mpiWorld.getStartWorkUnit(iProc); iw <= mpiWorld.getEndWorkUnit(iProc); iw++) {
- DetectorArray& detarray = projGlobal.getDetectorArray( iw );
- int nDet = detarray.nDet();
- DetectorValue* detval = detarray.detValues();
-
- double viewAngle = detarray.viewAngle();
- mpiWorld.getComm().Send(&nDet, 1, MPI::INT, iProc, 0);
- mpiWorld.getComm().Send(&viewAngle, 1, MPI::DOUBLE, iProc, 0);
- mpiWorld.getComm().Send(detval, nDet, MPI::FLOAT, iProc, 0);
+ DetectorArray& detarray = projGlobal.getDetectorArray( iw );
+ int nDet = detarray.nDet();
+ DetectorValue* detval = detarray.detValues();
+
+ double viewAngle = detarray.viewAngle();
+ mpiWorld.getComm().Send(&nDet, 1, MPI::INT, iProc, 0);
+ mpiWorld.getComm().Send(&viewAngle, 1, MPI::DOUBLE, iProc, 0);
+ mpiWorld.getComm().Send(detval, nDet, MPI::FLOAT, iProc, 0);
}
}
}
#ifndef NO_MAIN
-int
+int
main (int argc, char* argv[])
{
int retval = 1;
try {
retval = pjrec_main(argc, argv);
} catch (exception e) {
- std::cerr << "Exception: " << e.what() << std::endl;
+ std::cerr << "Exception: " << e.what() << std::endl;
} catch (...) {
- std::cerr << "Unknown exception" << std::endl;
+ std::cerr << "Unknown exception" << std::endl;
}
return (retval);