r11859: Canonicalize whitespace
[ctsim.git] / tools / pjrec.cpp
index dd4ad81b6695334ecf4daa1506f36fb3bb4407d8..427c5a82fc9acd9f65319432467d85089ed4edec 100644 (file)
@@ -9,7 +9,7 @@
 **  This is part of the CTSim program
 **  Copyright (C) 1983-2000 Kevin Rosenberg
 **
-**  $Id: pjrec.cpp,v 1.3 2000/07/20 11:17:31 kevin Exp $
+**  $Id$
 **
 **  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
@@ -28,8 +28,7 @@
 #include "ct.h"
 #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_FILTER_GENERATION, O_BACKPROJ, O_PREINTERPOLATION_FACTOR, O_VERBOSE, O_TRACE, O_HELP, O_DEBUG, O_VERSION};
 
 static struct option my_options[] =
 {
@@ -38,6 +37,7 @@ static struct option my_options[] =
   {"filter", 1, 0, O_FILTER},
   {"filter-method", 1, 0, O_FILTER_METHOD},
   {"zeropad", 1, 0, O_ZEROPAD},
+  {"filter-generation", 1, 0, O_FILTER_GENERATION},
   {"filter-param", 1, 0, O_FILTER_PARAM},
   {"backproj", 1, 0, O_BACKPROJ},
   {"trace", 1, 0, O_TRACE},
@@ -48,95 +48,97 @@ static struct option my_options[] =
   {0, 0, 0, 0}
 };
 
+static const char* g_szIdStr = "$Id$";
 
-void 
+void
 pjrec_usage (const char *program)
 {
-  cout << "usage: " << fileBasename(program) << " raysum-file image-file nx-image ny-image [OPTIONS]" << endl;
-  cout << "Image reconstruction from raysum projections" << endl;
-  cout << endl;
-  cout << "  raysum-file     Input raysum file" << endl;
-  cout << "  image-file      Output image file in SDF2D format" << endl;
-  cout << "  nx-image        Number of columns in output image" << endl;
-  cout << "  ny-image        Number of rows in output image" << endl;
-  cout << "  --interp        Interpolation method during backprojection" << endl;
-  cout << "    nearest     Nearest neighbor interpolation" << endl;
-  cout << "    linear      Linear interpolation" << endl;
+  std::cout << "usage: " << fileBasename(program) << " raysum-file image-file nx-image ny-image [OPTIONS]" << std::endl;
+  std::cout << "Image reconstruction from raysum projections" << std::endl;
+  std::cout << std::endl;
+  std::cout << "  raysum-file     Input raysum file" << std::endl;
+  std::cout << "  image-file      Output image file in SDF2D format" << std::endl;
+  std::cout << "  nx-image        Number of columns in output image" << std::endl;
+  std::cout << "  ny-image        Number of rows in output image" << std::endl;
+  std::cout << "  --interp        Interpolation method during backprojection" << std::endl;
+  std::cout << "    nearest         Nearest neighbor interpolation" << std::endl;
+  std::cout << "    linear          Linear interpolation (default)" << std::endl;
+  std::cout << "    cubic           Cubic interpolation\n";
 #if HAVE_BSPLINE_INTERP
-  cout << "    bspline     B-spline interpolation" << endl;
+  std::cout << "    bspline         B-spline interpolation" << std::endl;
 #endif
-  cout << "  --preinterpolate  Preinterpolation factor (default = 1)\n";
-  cout << "                    Used only with frequency-based filtering\n";
-  cout << "  --filter       Filter name" << endl;
-  cout << "    abs_bandlimit Abs * Bandlimiting (default)" << endl;
-  cout << "    abs_sinc      Abs * Sinc" << endl;
-  cout << "    abs_cos       Abs * Cosine" << endl;
-  cout << "    abs_hamming   Abs * Hamming" << endl;
-  cout << "    shepp         Shepp-Logan" << endl;
-  cout << "    bandlimit     Bandlimiting" << endl;
-  cout << "    sinc          Sinc" << endl;
-  cout << "    cos           Cosine" << endl;
-  cout << "    triangle      Triangle" << endl;
-  cout << "    hamming       Hamming" << endl;
-  cout << "  --filter-method  Filter method before backprojections\n";;
-  cout << "    convolution      Spatial filtering (default)\n";
-  cout << "    fourier          Frequency filtering with discete fourier\n";
-  cout << "    fourier_table    Frequency filtering with table lookup fourier\n";
-  cout << "    fft              Fast Fourier Transform\n";
+  std::cout << "  --preinterpolate  Preinterpolation factor (default = 1)\n";
+  std::cout << "                    Used only with frequency-based filtering\n";
+  std::cout << "  --filter       Filter name" << std::endl;
+  std::cout << "    abs_bandlimit  Abs * Bandlimiting (default)" << std::endl;
+  std::cout << "    abs_sinc       Abs * Sinc" << std::endl;
+  std::cout << "    abs_cosine     Abs * Cosine" << std::endl;
+  std::cout << "    abs_hamming    Abs * Hamming" << std::endl;
+  std::cout << "    abs_hanning    Abs * Hanning" << std::endl;
+  std::cout << "    shepp          Shepp-Logan" << std::endl;
+  std::cout << "    bandlimit      Bandlimiting" << std::endl;
+  std::cout << "    sinc           Sinc" << std::endl;
+  std::cout << "    cosine         Cosine" << std::endl;
+  std::cout << "    triangle       Triangle" << std::endl;
+  std::cout << "    hamming        Hamming" << std::endl;
+  std::cout << "    hanning        Hanning" << std::endl;
+  std::cout << "  --filter-method  Filter method before backprojections\n";;
+  std::cout << "    convolution      Spatial filtering (default)\n";
+  std::cout << "    fourier          Frequency filtering with discete fourier\n";
+  std::cout << "    fourier_table    Frequency filtering with table lookup fourier\n";
+  std::cout << "    fft              Fast Fourier Transform\n";
 #if HAVE_FFTW
-  cout << "    fftw             Fast Fourier Transform West library\n";
-  cout << "    rfftw            Fast Fourier Transform West (real-mode) library\n";
+  std::cout << "    fftw             Fast Fourier Transform West library\n";
+  std::cout << "    rfftw            Fast Fourier Transform West (real-mode) library\n";
 #endif
-  cout << "  --zeropad n   Set zeropad level (default = 0)\n";
-  cout << "                set n to number of powers to two to pad\n";
-  cout << "  --backproj    Backprojection Method" << endl;
-  cout << "    trig        Trigometric functions at every point" << endl;
-  cout << "    table       Trigometric functions with precalculated table" << endl;
-  cout << "    diff        Difference method" << endl;
-  cout << "    diff2       Optimized difference method (default)" << endl;
-  cout << "    idiff2      Optimized difference method with integer math" << endl;
-  cout << "    idiff3      Highly-optimized difference method with integer math" << endl;
-  cout << "  --filter-param Alpha level for Hamming filter" << endl;
-  cout << "  --trace        Set tracing to level" << endl;
-  cout << "     none      No tracing (default)" << endl;
-  cout << "     text      Text level tracing" << endl;
-  cout << "     phm       Trace phantom" << endl;
-  cout << "     rays      Trace allrays" << endl;
-  cout << "     plot      Trace plotting" << endl;
-  cout << "     clipping  Trace clipping" << endl;
-  cout << "  --verbose      Turn on verbose mode" << endl;
-  cout << "  --debug        Turn on debug mode" << endl;
-  cout << "  --version      Print version" << endl;
-  cout << "  --help         Print this help message" << endl;
+  std::cout << "  --zeropad n   Set zeropad level (default = 0)\n";
+  std::cout << "                set n to number of powers to two to pad\n";
+  std::cout << "  --filter-generation  Filter Generation mode\n";
+  std::cout << "    direct       Use direct filter in spatial or frequency domain (default)\n";
+  std::cout << "    inverse_fourier  Use inverse fourier transform of inverse filter\n";
+  std::cout << "  --backproj    Backprojection Method" << 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 << "    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 << "  --verbose      Turn on verbose mode" << std::endl;
+  std::cout << "  --debug        Turn on debug mode" << std::endl;
+  std::cout << "  --version      Print version" << std::endl;
+  std::cout << "  --help         Print this help message" << std::endl;
 }
 
 
 #ifdef HAVE_MPI
-static void ScatterProjectionsMPI (MPIWorld& mpiWorld, Projections& projGlobal, Projections& projLocal, const int debug);
+static void ScatterProjectionsMPI (MPIWorld& mpiWorld, Projections& projGlobal, Projections& projLocal, const bool bDebug);
 static void ReduceImageMPI (MPIWorld& mpiWorld, ImageFile* imLocal, ImageFile* imGlobal);
 #endif
 
 
-int 
-pjrec_main (int argc, char * argv[])
+int
+pjrec_main (int argc, char * const argv[])
 {
   Projections projGlobal;
   ImageFile* imGlobal = NULL;
-  char* filenameProj = NULL;
-  char* filenameImage = NULL;
-  string remark;
-  char *endptr;
-  int optVerbose = 0;
-  int optDebug = 0;
-  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;
-  int optPreinterpolationFactor = 1;
+  char* pszFilenameProj = NULL;
+  char* pszFilenameImage = NULL;
+  std::string sRemark;
+  bool bOptVerbose = false;
+  bool bOptDebug = 1;
+  int iOptZeropad = 1;
+  int optTrace = Trace::TRACE_NONE;
+  double dOptFilterParam = -1;
+  std::string sOptFilterName (SignalFilter::convertFilterIDToName (SignalFilter::FILTER_ABS_BANDLIMIT));
+  std::string sOptFilterMethodName (ProcessSignal::convertFilterMethodIDToName (ProcessSignal::FILTER_METHOD_CONVOLUTION));
+  std::string sOptFilterGenerationName (ProcessSignal::convertFilterGenerationIDToName (ProcessSignal::FILTER_GENERATION_DIRECT));
+  std::string sOptInterpName (Backprojector::convertInterpIDToName (Backprojector::INTERP_LINEAR));
+  std::string sOptBackprojectName (Backprojector::convertBackprojectIDToName (Backprojector::BPROJ_IDIFF));
+  int iOptPreinterpolationFactor = 1;
   int nx, ny;
+  char *endptr;
 #ifdef HAVE_MPI
   ImageFile* imLocal;
   int mpi_nview, mpi_ndet;
@@ -152,107 +154,113 @@ pjrec_main (int argc, char * argv[])
     while (1) {
       int c = getopt_long(argc, argv, "", my_options, NULL);
       char *endptr = NULL;
-      
+
       if (c == -1)
-       break;
-      
+        break;
+
       switch (c)
-       {
-       case O_INTERP:
-         optInterpName = optarg;
-         break;
-       case O_PREINTERPOLATION_FACTOR:
-         optPreinterpolationFactor = strtol(optarg, &endptr, 10);
-         if (endptr != optarg + strlen(optarg)) {
-           pjrec_usage(argv[0]);
-           return(1);
-         }
-         break;
-       case O_FILTER:
-         optFilterName = 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:
-         optFilterMethodName = 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_BACKPROJ:
-         optBackprojName = optarg;
-         break;
-       case O_FILTER_PARAM:
-         optFilterParam = strtod(optarg, &endptr);
-         if (endptr != optarg + strlen(optarg)) {
-           pjrec_usage(argv[0]);
-           return(1);
-         }
-         break;
-       case O_ZEROPAD:
-         optZeroPad = strtol(optarg, &endptr, 10);
-         if (endptr != optarg + strlen(optarg)) {
-           pjrec_usage(argv[0]);
-           return(1);
-         }
-         break;
-       case O_VERBOSE:
-         optVerbose = 1;
-         break;
-       case O_DEBUG:
-         optDebug = 1;
-         break;
-       case O_TRACE:
-         if ((optTrace = TraceLevel::convertTraceNameToID(optarg)) == TRACE_INVALID) {
-           pjrec_usage(argv[0]);
-           return (1);
-         }
-         break;
         case O_VERSION:
 #ifdef VERSION
-         cout <<  "Version " <<  VERSION << endl;
+          std::cout <<  "Version " <<  VERSION << std::endl << g_szIdStr << std::endl;
 #else
-          cout << "Unknown version number" << endl;
+          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);
     }
 
-    filenameProj = argv[optind];
-  
-    filenameImage = argv[optind + 1];
-  
+    pszFilenameProj = argv[optind];
+
+    pszFilenameImage = argv[optind + 1];
+
     nx = strtol(argv[optind + 2], &endptr, 10);
     ny = strtol(argv[optind + 3], &endptr, 10);
-  
-    ostringstream filterDesc;
-    if (optFilterParam >= 0)
-      filterDesc << optFilterName << ": alpha=" << optFilterParam; 
+
+    std::ostringstream filterDesc;
+    if (dOptFilterParam >= 0)
+      filterDesc << sOptFilterName << ": alpha=" << dOptFilterParam;
     else
-      filterDesc << optFilterName;
-
-    ostringstream label;
-    label << "pjrec: " << nx << "x" << ny << ", " << filterDesc.str() << ", " << optInterpName << ", preinterpolation=" << optPreinterpolationFactor << ", " << optBackprojName;
-    remark = label.str();
-  
-    if (optVerbose)
-      cout << "Remark: " << remark << endl;
+      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
   }
 #endif
 
 #ifdef HAVE_MPI
   if (mpiWorld.getRank() == 0) {
-    projGlobal.read (filenameProj);
-    if (optVerbose)
-      projGlobal.printScanInfo();
+    projGlobal.read (pszFilenameProj);
+    if (bOptVerbose) {
+      ostringstream os;
+      projGlobal.printScanInfo (os);
+      std::cout << os.str();
+    }
 
     mpi_ndet = projGlobal.nDet();
     mpi_nview = projGlobal.nView();
@@ -262,16 +270,16 @@ pjrec_main (int argc, char * argv[])
   }
 
   TimerCollectiveMPI timerBcast (mpiWorld.getComm());
-  mpiWorld.BcastString (optBackprojName);
-  mpiWorld.BcastString (optFilterName);
-  mpiWorld.BcastString (optFilterMethodName);
-  mpiWorld.BcastString (optInterpName);
-  mpiWorld.getComm().Bcast (&optVerbose, 1, MPI::INT, 0);
-  mpiWorld.getComm().Bcast (&optDebug, 1, MPI::INT, 0);
+  mpiWorld.BcastString (sOptBackprojectName);
+  mpiWorld.BcastString (sOptFilterName);
+  mpiWorld.BcastString (sOptFilterMethodName);
+  mpiWorld.BcastString (sOptInterpName);
+  mpiWorld.getComm().Bcast (&bOptVerbose, 1, MPI::INT, 0);
+  mpiWorld.getComm().Bcast (&bOptDebug, 1, MPI::INT, 0);
   mpiWorld.getComm().Bcast (&optTrace, 1, MPI::INT, 0);
-  mpiWorld.getComm().Bcast (&optFilterParam, 1, MPI::DOUBLE, 0);
-  mpiWorld.getComm().Bcast (&optZeroPad, 1, MPI::INT, 0);
-  mpiWorld.getComm().Bcast (&optPreinterpolationFactor, 1, MPI::INT, 0);
+  mpiWorld.getComm().Bcast (&dOptFilterParam, 1, MPI::DOUBLE, 0);
+  mpiWorld.getComm().Bcast (&iOptZeropad, 1, MPI::INT, 0);
+  mpiWorld.getComm().Bcast (&iOptPreinterpolationFactor, 1, MPI::INT, 0);
   mpiWorld.getComm().Bcast (&mpi_ndet, 1, MPI::INT, 0);
   mpiWorld.getComm().Bcast (&mpi_nview, 1, MPI::INT, 0);
   mpiWorld.getComm().Bcast (&mpi_detinc, 1, MPI::DOUBLE, 0);
@@ -279,7 +287,7 @@ pjrec_main (int argc, char * argv[])
   mpiWorld.getComm().Bcast (&mpi_rotinc, 1, MPI::DOUBLE, 0);
   mpiWorld.getComm().Bcast (&nx, 1, MPI::INT, 0);
   mpiWorld.getComm().Bcast (&ny, 1, MPI::INT, 0);
-  if (optVerbose)
+  if (bOptVerbose)
       timerBcast.timerEndAndReport ("Time to broadcast variables");
 
   mpiWorld.setTotalWorkUnits (mpi_nview);
@@ -290,8 +298,8 @@ pjrec_main (int argc, char * argv[])
   projLocal.setRotInc (mpi_rotinc);
 
   TimerCollectiveMPI timerScatter (mpiWorld.getComm());
-  ScatterProjectionsMPI (mpiWorld, projGlobal, projLocal, optDebug);
-  if (optVerbose)
+  ScatterProjectionsMPI (mpiWorld, projGlobal, projLocal, bOptDebug);
+  if (bOptVerbose)
       timerScatter.timerEndAndReport ("Time to scatter projections");
 
   if (mpiWorld.getRank() == 0) {
@@ -300,37 +308,57 @@ pjrec_main (int argc, char * argv[])
 
   imLocal = new ImageFile (nx, ny);
 #else
-  projGlobal.read (filenameProj);
-  if (optVerbose)
-    projGlobal.printScanInfo();
+
+  if (! projGlobal.read (pszFilenameProj)) {
+    fprintf(stderr, "Unable to read projectfile file %s\n", pszFilenameProj);
+    exit(1);
+  }
+
+  if (bOptVerbose) {
+    std::ostringstream os;
+    projGlobal.printScanInfo(os);
+    std::cout << os.str();
+  }
 
   imGlobal = new ImageFile (nx, ny);
 #endif
 
 #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);
-  if (optVerbose)
+
+  Reconstructor reconstruct (projLocal, *imLocal, sOptFilterName.c_str(), dOptFilterParam, sOptFilterMethodName.c_str(), iOptZeropad, sOptFilterGenerationName.c_str(), sOptInterpName.c_str(), iOptPreinterpolationFactor, sOptBackprojectName.c_str(), optTrace);
+  if (reconstruct.fail()) {
+    std::cout << reconstruct.failMessage();
+    return (1);
+  }
+  reconstruct.reconstructAllViews();
+
+  if (bOptVerbose)
       timerReconstruct.timerEndAndReport ("Time to reconstruct");
 
   TimerCollectiveMPI timerReduce (mpiWorld.getComm());
   ReduceImageMPI (mpiWorld, imLocal, imGlobal);
-  if (optVerbose)
+  if (bOptVerbose)
       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);
+  Reconstructor reconstruct (projGlobal, *imGlobal, sOptFilterName.c_str(), dOptFilterParam, sOptFilterMethodName.c_str(), iOptZeropad, sOptFilterGenerationName.c_str(), sOptInterpName.c_str(), iOptPreinterpolationFactor, sOptBackprojectName.c_str(), optTrace);
+  if (reconstruct.fail()) {
+    std::cout << reconstruct.failMessage();
+    return (1);
+  }
+  reconstruct.reconstructAllViews();
 #endif
 
 #ifdef HAVE_MPI
   if (mpiWorld.getRank() == 0)
 #endif
     {
-      double calcTime = timerProgram.timerEnd();
+      double dCalcTime = timerProgram.timerEnd();
       imGlobal->labelAdd (projGlobal.getLabel());
-      imGlobal->labelAdd (Array2dFileLabel::L_HISTORY, remark.c_str(), calcTime);
-      imGlobal->fileWrite (filenameImage);
-      if (optVerbose)
-       cout << "Run time: " << calcTime << " seconds" << endl;
+      imGlobal->labelAdd (Array2dFileLabel::L_HISTORY, sRemark.c_str(), dCalcTime);
+      imGlobal->fileWrite (pszFilenameImage);
+      if (bOptVerbose)
+        std::cout << "Run time: " << dCalcTime << " seconds" << std::endl;
     }
 #ifdef HAVE_MPI
   MPI::Finalize();
@@ -346,19 +374,19 @@ pjrec_main (int argc, char * argv[])
 //////////////////////////////////////////////////////////////////////////////////////
 
 #ifdef HAVE_MPI
-static void ScatterProjectionsMPI (MPIWorld& mpiWorld, Projections& projGlobal, Projections& projLocal, const int optDebug)
+static void ScatterProjectionsMPI (MPIWorld& mpiWorld, Projections& projGlobal, Projections& projLocal, const bool bOptDebug)
 {
   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);
       }
     }
   }
@@ -381,7 +409,7 @@ ReduceImageMPI (MPIWorld& mpiWorld, ImageFile* imLocal, ImageFile* imGlobal)
 {
   ImageFileArray vLocal = imLocal->getArray();
 
-  for (int ix = 0; ix < imLocal->nx(); ix++) {
+  for (unsigned int ix = 0; ix < imLocal->nx(); ix++) {
     void *recvbuf = NULL;
     if (mpiWorld.getRank() == 0) {
       ImageFileArray vGlobal = imGlobal->getArray();
@@ -395,7 +423,7 @@ ReduceImageMPI (MPIWorld& mpiWorld, ImageFile* imLocal, ImageFile* imGlobal)
 
 
 #ifndef NO_MAIN
-int 
+int
 main (int argc, char* argv[])
 {
   int retval = 1;
@@ -403,9 +431,9 @@ main (int argc, char* argv[])
   try {
     retval = pjrec_main(argc, argv);
   } catch (exception e) {
-    cerr << "Exception: " << e.what() << endl;
+          std::cerr << "Exception: " << e.what() << std::endl;
   } catch (...) {
-    cerr << "Unknown exception" << endl;
+          std::cerr << "Unknown exception" << std::endl;
   }
 
   return (retval);