r121: *** empty log message ***
[ctsim.git] / src / phm2pj.cpp
index fa8d0a98dc1e82ad9d3614e3bd40e221eca47df0..439fa83920e1ea8a6697cac0c9f7189f52856713 100644 (file)
@@ -9,7 +9,7 @@
 **  This is part of the CTSim program
 **  Copyright (C) 1983-2000 Kevin Rosenberg
 **
-**  $Id: phm2pj.cpp,v 1.2 2000/06/19 17:58:13 kevin Exp $
+**  $Id: phm2pj.cpp,v 1.5 2000/06/26 21:15:24 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
@@ -59,6 +59,7 @@ phm2pj_usage (const char *program)
   cout << "     nview        Number of rotated views" << endl;
   cout << "     --phantom    Phantom to use for projection" << endl;
   cout << "        herman    Herman head phantom" << endl;
+  cout << "        bherman   Bordered herman head phantom" << endl;
   cout << "        rowland   Rowland head phantom" << endl;
   cout << "        browland  Bordered Rowland head phantom" << endl;
   cout << "        unitpulse Unit pulse phantom" << endl;
@@ -87,15 +88,15 @@ int
 phm2pj_main (int argc, char* argv[])
 {
   Phantom phm;
-  ScannerGeometry opt_geometry = DETECTOR_PARALLEL;
+  string optGeometryName = Scanner::GEOMETRY_PARALLEL_STR;
   char *opt_outfile = NULL;
   string opt_desc;
-  string opt_phmfilename;
+  string optPhmFileName;
   int opt_ndet;
   int opt_nview;
   int opt_nray = 1;
   int opt_trace = 0;
-  int optPhmNum = -1;
+  string optPhmName = Phantom::PHM_HERMAN_STR;
   int opt_verbose = 0;
   int opt_debug = 0;
   double opt_rotangle = 1;
@@ -119,20 +120,10 @@ phm2pj_main (int argc, char* argv[])
       
       switch (c) {
       case O_PHANTOM:
-       if ((optPhmNum = opt_set_phantom (optarg)) < 0) {
-         phm2pj_usage(argv[0]);
-         return (1);
-       }
-       phm.create (optPhmNum);
+       optPhmName = optarg;
        break;
       case O_PHMFILE:
-#ifdef HAVE_MPI
-       if (mpiWorld.getRank() == 0)
-         cerr << "Can not read phantom from file in MPI mode" << endl;
-       return (1);
-#endif
-       opt_phmfilename = optarg;
-       phm.createFromFile (opt_phmfilename.c_str());
+       optPhmFileName = optarg;
        break;
       case O_VERBOSE:
        opt_verbose = 1;
@@ -185,8 +176,8 @@ phm2pj_main (int argc, char* argv[])
       }
     }
   
-    if (phm.nPElem() == 0) {
-      cerr << "No phantom defined" << endl;
+    if (optPhmName == "" && optPhmFileName == "") {
+      cerr << "No phantom defined" << endl << endl;
       phm2pj_usage(argv[0]);
       return (1);
     }
@@ -212,39 +203,60 @@ phm2pj_main (int argc, char* argv[])
     }
 
     ostringstream desc;
-    desc << "Raysum_Collect: NDet=" << opt_ndet << ", Nview=" << opt_nview << ", NRay=" << opt_nray << ", RotAngle=" << opt_rotangle << ", ";
-    if (opt_phmfilename.length()) {
-      desc << "PhantomFile=" << opt_phmfilename;
-    } else if (optPhmNum != -1) {
-      desc << "Phantom=" << name_of_phantom(optPhmNum);
+    desc << "phm2pj: NDet=" << opt_ndet << ", Nview=" << opt_nview << ", NRay=" << opt_nray << ", RotAngle=" << opt_rotangle << ", ";
+    if (optPhmFileName.length()) {
+      desc << "PhantomFile=" << optPhmFileName;
+    } else if (optPhmName != "") {
+      desc << "Phantom=" << optPhmName;
     }
     if (opt_desc.length()) {
       desc << ": " << opt_desc;
     }
     opt_desc = desc.str();
+
+    if (optPhmName != "") {
+      phm.createFromPhantom (optPhmName.c_str());
+      if (phm.fail()) {
+       cout << phm.failMessage() << endl << endl;
+       phm2pj_usage(argv[0]);
+       return (1);
+      }
+    }
+
+    if (optPhmFileName != "") {
+#ifdef HAVE_MPI
+      cerr << "Can not read phantom from file in MPI mode" << endl;
+      return (1);
+#endif
+      phm.createFromFile (optPhmFileName.c_str());
+    }
+
 #ifdef HAVE_MPI
   }
 #endif
 
 #ifdef HAVE_MPI
   TimerCollectiveMPI timerBcast(mpiWorld.getComm());
+  mpiWorld.BcastString (optPhmName);
   mpiWorld.getComm().Bcast (&opt_rotangle, 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 (&optPhmNum, 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 (mpiWorld.getRank() > 0 && optPhmNum >= 0)
-    phm.create (optPhmNum);
+  if (mpiWorld.getRank() > 0 && optPhmName != "")
+    phm.createFromPhantom (optPhmName.c_str());
 #endif
 
   opt_rotangle *= PI;
-  Scanner scanner (phm, opt_geometry, opt_ndet, opt_nview, opt_nray, opt_rotangle);
-
+  Scanner scanner (phm, optGeometryName.c_str(), opt_ndet, opt_nview, opt_nray, opt_rotangle);
+  if (scanner.fail()) {
+    cout << "Scanner Creation Error: " << scanner.failMessage() << endl;
+    return (1);
+  }
 #ifdef HAVE_MPI
   mpiWorld.setTotalWorkUnits (opt_nview);