r520: no message
[ctsim.git] / tools / phm2pj.cpp
index 9d53148f53868764d3641e4eb3cad8b74211fd15..687c2906ca1fc3b82355c16f84d1f0a99b0f19d6 100644 (file)
@@ -9,7 +9,7 @@
 **  This is part of the CTSim program
 **  Copyright (C) 1983-2000 Kevin Rosenberg
 **
-**  $Id: phm2pj.cpp,v 1.20 2001/01/02 05:34:57 kevin Exp $
+**  $Id: phm2pj.cpp,v 1.25 2001/02/11 04:56:38 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_PHANTOM, O_DESC, O_NRAY, O_ROTANGLE, O_PHMFILE, O_GEOMETRY, O_FOCAL_LENGTH, O_FIELD_OF_VIEW,
+enum { O_PHANTOM, O_DESC, O_NRAY, O_ROTANGLE, O_PHMFILE, O_GEOMETRY, O_FOCAL_LENGTH, O_VIEW_RATIO, O_SCAN_RATIO,
        O_TRACE, O_VERBOSE, O_HELP, O_DEBUG, O_VERSION };
 
 static struct option phm2pj_options[] = 
@@ -41,7 +41,8 @@ static struct option phm2pj_options[] =
   {"rotangle", 1, 0, O_ROTANGLE},
   {"geometry", 1, 0, O_GEOMETRY},
   {"focal-length", 1, 0, O_FOCAL_LENGTH},
-  {"field-of-view", 1, 0, O_FIELD_OF_VIEW},
+  {"view-ratio", 1, 0, O_VIEW_RATIO},
+  {"scan-ratio", 1, 0, O_SCAN_RATIO},
   {"trace", 1, 0, O_TRACE},
   {"verbose", 0, 0, O_VERBOSE},
   {"help", 0, 0, O_HELP},
@@ -50,7 +51,7 @@ static struct option phm2pj_options[] =
   {0, 0, 0, 0}
 };
 
-static const char* g_szIdStr = "$Id: phm2pj.cpp,v 1.20 2001/01/02 05:34:57 kevin Exp $";
+static const char* g_szIdStr = "$Id: phm2pj.cpp,v 1.25 2001/02/11 04:56:38 kevin Exp $";
 
 
 void 
@@ -71,14 +72,16 @@ phm2pj_usage (const char *program)
   std::cout << "     --desc           Description of raysum\n";
   std::cout << "     --nray           Number of rays per detector (default = 1)\n";
   std::cout << "     --rotangle       Degrees to rotate view through (multiple of PI)\n";
-  std::cout << "                      (default = 1)\n";
+  std::cout << "                      (default = select appropriate for geometry)\n";
   std::cout << "     --geometry       Geometry of scanning\n";
   std::cout << "        parallel      Parallel scan beams (default)\n";
   std::cout << "        equilinear    Equilinear divergent scan beams\n";
   std::cout << "        equiangular   Equiangular divergent scan beams\n";
   std::cout << "     --focal-length   Focal length ratio (ratio to radius of phantom)\n";
   std::cout << "                      (default = 1)\n";
-  std::cout << "     --field-of-view  Field of view (ratio to diameter of phantom square)\n";
+  std::cout << "     --view-ratio     Length to view (view diameter to phantom diameter)\n";
+  std::cout << "                      (default = 1)\n";
+  std::cout << "     --scan-ratio     Length to scan (scan diameter to view diameter)\n";
   std::cout << "                      (default = 1)\n";
   std::cout << "     --trace          Trace level to use\n";
   std::cout << "        none          No tracing (default)\n";
@@ -98,7 +101,7 @@ void GatherProjectionsMPI (MPIWorld& mpiWorld, Projections& pjGlobal, Projection
 #endif
 
 int 
-phm2pj_main (int argc, char* argv[])
+phm2pj_main (int argc, char* const argv[])
 {
   Phantom phm;
   std::string optGeometryName = Scanner::convertGeometryIDToName(Scanner::GEOMETRY_PARALLEL);
@@ -110,11 +113,12 @@ phm2pj_main (int argc, char* argv[])
   int opt_nview;
   int opt_nray = 1;
   double dOptFocalLength = 1.;
-  double dOptFieldOfView = 1.;
+  double dOptViewRatio = 1.;
+  double dOptScanRatio = 1.;
   int opt_trace = Trace::TRACE_NONE;
   int opt_verbose = 0;
   int opt_debug = 0;
-  double opt_rotangle = 1;
+  double opt_rotangle = -1;
   char* endptr = NULL;
   char* endstr;
 
@@ -177,11 +181,20 @@ phm2pj_main (int argc, char* argv[])
          return (1);
        }
        break;
-      case O_FIELD_OF_VIEW:
-       dOptFieldOfView = strtod(optarg, &endptr);
+  case O_VIEW_RATIO:
+       dOptViewRatio = strtod(optarg, &endptr);
        endstr = optarg + strlen(optarg);
        if (endptr != endstr) {
-         std::cerr << "Error setting --field-of-view to " << optarg << std::endl;
+         std::cerr << "Error setting --view-ratio to " << optarg << std::endl;
+         phm2pj_usage(argv[0]);
+         return (1);
+       }
+       break;
+  case O_SCAN_RATIO:
+       dOptScanRatio = strtod(optarg, &endptr);
+       endstr = optarg + strlen(optarg);
+       if (endptr != endstr) {
+         std::cerr << "Error setting --scan-ratio to " << optarg << std::endl;
          phm2pj_usage(argv[0]);
          return (1);
        }
@@ -238,6 +251,13 @@ phm2pj_main (int argc, char* argv[])
       return (1);
     }
 
+    if (opt_rotangle < 0) {
+      if (optGeometryName.compare ("parallel") == 0)
+        opt_rotangle = 1;
+      else
+        opt_rotangle = 2;
+    }
+
     std::ostringstream desc;
     desc << "phm2pj: NDet=" << opt_ndet << ", Nview=" << opt_nview << ", NRay=" << opt_nray << ", RotAngle=" << opt_rotangle << ", Geometry=" << optGeometryName << ", ";
     if (optPhmFileName.length()) {
@@ -275,20 +295,24 @@ phm2pj_main (int argc, char* argv[])
   TimerCollectiveMPI timerBcast(mpiWorld.getComm());
   mpiWorld.BcastString (optPhmName);
   mpiWorld.getComm().Bcast (&opt_rotangle, 1, MPI::DOUBLE, 0);
+  mpiWorld.getComm().Bcast (&dOptFocalLength, 1, MPI::DOUBLE, 0);
+  mpiWorld.getComm().Bcast (&dOptViewRatio, 1, MPI::DOUBLE, 0);
+  mpiWorld.getComm().Bcast (&dOptScanRatio, 1, MPI::DOUBLE, 0);
   mpiWorld.getComm().Bcast (&opt_nview, 1, MPI::INT, 0);
   mpiWorld.getComm().Bcast (&opt_ndet, 1, MPI::INT, 0);
   mpiWorld.getComm().Bcast (&opt_nray, 1, MPI::INT, 0);
   mpiWorld.getComm().Bcast (&opt_verbose, 1, MPI::INT, 0);
   mpiWorld.getComm().Bcast (&opt_debug, 1, MPI::INT, 0);
   mpiWorld.getComm().Bcast (&opt_trace, 1, MPI::INT, 0);
-  timerBcast.timerEndAndReport ("Time to broadcast variables");
+  if (opt_verbose)
+    timerBcast.timerEndAndReport ("Time to broadcast variables");
 
   if (mpiWorld.getRank() > 0 && optPhmName != "")
     phm.createFromPhantom (optPhmName.c_str());
 #endif
 
   opt_rotangle *= PI;
-  Scanner scanner (phm, optGeometryName.c_str(), opt_ndet, opt_nview, opt_nray, opt_rotangle, dOptFocalLength, dOptFieldOfView);
+  Scanner scanner (phm, optGeometryName.c_str(), opt_ndet, opt_nview, opt_nray, opt_rotangle, dOptFocalLength, dOptViewRatio, dOptScanRatio);
   if (scanner.fail()) {
     std::cout << "Scanner Creation Error: " << scanner.failMessage() << std::endl;
     return (1);
@@ -324,26 +348,8 @@ phm2pj_main (int argc, char* argv[])
 
 #else
   Projections pjGlobal (scanner);
-#if HAVE_SGP
-  SGPDriver* pSGPDriver = NULL;
-  SGP* pSGP = NULL;
-  if (opt_trace >= Trace::TRACE_PHANTOM) {
-    pSGPDriver = new SGPDriver ("phm2pj", 600, 600);
-    pSGP = new SGP (*pSGPDriver);
-  }
-  scanner.collectProjections (pjGlobal, phm, opt_trace, pSGP);
-  if (opt_trace >= Trace::TRACE_PHANTOM) {
-    std::cout << "Press enter to continue\n";
-    cio_kb_getc();
-    delete pSGP;  pSGP = NULL;
-    delete pSGPDriver;  pSGPDriver = NULL;
-  }
-
-#else
   scanner.collectProjections (pjGlobal, phm, opt_trace);
 #endif
-
-#endif
   
 #ifdef HAVE_MPI
   if (mpiWorld.getRank() == 0)