r158: *** empty log message ***
[ctsim.git] / libctsim / scanner.cpp
index 1d7eaf71bb4110c0982b8c34e173addeb9a88c7e..ae665f207894f1e43e790c577969029a446b7443 100644 (file)
@@ -9,7 +9,7 @@
 **  This is part of the CTSim program
 **  Copyright (C) 1983-2000 Kevin Rosenberg
 **
-**  $Id: scanner.cpp,v 1.1 2000/06/19 02:59:34 kevin Exp $
+**  $Id: scanner.cpp,v 1.5 2000/07/22 15:45:33 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
 #include "ct.h"
 
 
+const int Scanner::GEOMETRY_INVALID = -1;
+const int Scanner::GEOMETRY_PARALLEL = 0;
+const int Scanner::GEOMETRY_EQUILINEAR = 1;
+const int Scanner::GEOMETRY_EQUIANGULAR = 2;
+
+const char* Scanner::s_aszGeometryName[] = 
+{
+  {"parallel"},
+  {"equilinear"},
+  {"equiangular"},
+};
+
+const char* Scanner::s_aszGeometryTitle[] = 
+{
+  {"Parallel"},
+  {"Equilinear"},
+  {"Equiangular"},
+};
+
+const int Scanner::s_iGeometryCount = sizeof(s_aszGeometryName) / sizeof(const char*);
+
+
 // NAME
 //   DetectorArray      Construct a DetectorArray
 
@@ -60,10 +82,19 @@ DetectorArray::~DetectorArray (void)
  *   int nSample               Number of rays per detector
  */
 
-Scanner::Scanner (const Phantom& phm, const ScannerGeometry geometry, int nDet, int nView, int nSample, const double rot_anglen)
+Scanner::Scanner (const Phantom& phm, const char* const geometryName, int nDet, int nView, int nSample, const double rot_anglen)
 {
   m_phmLen = phm.maxAxisLength();      // maximal length along an axis
 
+  m_fail = false;
+  m_idGeometry = convertGeometryNameToID (geometryName);
+  if (m_idGeometry == GEOMETRY_INVALID) {
+    m_fail = true;
+    m_failMessage = "Invalid geometry name ";
+    m_failMessage += geometryName;
+    return;
+  }
+
   if (nView < 1)
     nView = 1;
   if (nSample < 1)
@@ -73,7 +104,6 @@ Scanner::Scanner (const Phantom& phm, const ScannerGeometry geometry, int nDet,
   if ((nDet % 2) == 0)
     ++nDet;            // ensure odd number of detectors
 
-  m_geometry = geometry;
   m_nDet     = nDet;
   m_nView    = nView;
   m_nSample  = nSample;
@@ -101,6 +131,42 @@ Scanner::~Scanner (void)
 }
 
 
+const char*
+Scanner::convertGeometryIDToName (const int geomID)
+{
+  const char *name = "";
+
+  if (geomID >= 0 && geomID < s_iGeometryCount)
+      return (s_aszGeometryName[geomID]);
+
+  return (name);
+}
+
+const char*
+Scanner::convertGeometryIDToTitle (const int geomID)
+{
+  const char *title = "";
+
+  if (geomID >= 0 && geomID < s_iGeometryCount)
+      return (s_aszGeometryName[geomID]);
+
+  return (title);
+}
+      
+int
+Scanner::convertGeometryNameToID (const char* const geomName) 
+{
+  int id = GEOMETRY_INVALID;
+
+  for (int i = 0; i < s_iGeometryCount; i++)
+      if (strcasecmp (geomName, s_aszGeometryName[i]) == 0) {
+         id = i;
+         break;
+      }
+
+  return (id);
+}
+  
 
 /* NAME
  *   raysum_collect                            Calculate ray sums for a Phantom
@@ -281,7 +347,7 @@ Scanner::projectSingleView (const Phantom& phm, DetectorArray& detArray, const d
       double xs = xs_maj;
       double ys = ys_maj;
       double sum = 0.0;
-      for (int i = 0; i < m_nSample; i++) {
+      for (unsigned int i = 0; i < m_nSample; i++) {
 #ifdef HAVE_SGP
        if (m_trace >= TRACE_RAYS) {
          sgp2_move_abs (xs, ys);