r254: Added binary output of projection file elements
[ctsim.git] / libctsim / scanner.cpp
index ef72c5b4cc99a7672a9d3ba2a25eac03a8d26edf..48f23943a739ec654d361fba8fdcc35f1fad92d5 100644 (file)
@@ -9,7 +9,7 @@
 **  This is part of the CTSim program
 **  Copyright (C) 1983-2000 Kevin Rosenberg
 **
-**  $Id: scanner.cpp,v 1.13 2000/08/31 08:38:58 kevin Exp $
+**  $Id: scanner.cpp,v 1.18 2000/12/16 02:31:00 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
@@ -95,12 +95,13 @@ Scanner::Scanner (const Phantom& phm, const char* const geometryName, int nDet,
     return;
   }
 
-  if (nView < 1)
-    nView = 1;
+  if (nView < 1 || nDet < 1) {
+    m_fail = true;
+    m_failMessage = "nView & nDet must be greater than 0";
+    return;
+  }
   if (nSample < 1)
     m_nSample = 1;
-  if (nDet < 1)
-    nDet = 1;
 
   m_nDet     = nDet;
   m_nView    = nView;
@@ -117,16 +118,18 @@ Scanner::Scanner (const Phantom& phm, const char* const geometryName, int nDet,
   if (m_idGeometry == GEOMETRY_PARALLEL) {
     m_detLen   = m_dFieldOfView;
     m_detInc  = m_detLen / m_nDet;
+    if (m_nDet % 2 == 0) // Adjust for Even number of detectors
+      m_detInc = m_detLen / (m_nDet - 1); // center detector = (nDet/2)-1
     
     double dHalfDetLen = m_detLen / 2;
-    m_initPos.xs1 = m_dXCenter - m_dFocalLength;
-    m_initPos.ys1 = m_dYCenter + dHalfDetLen;
-    m_initPos.xs2 = m_dXCenter + m_dFocalLength;
-    m_initPos.ys2 = m_dYCenter + dHalfDetLen;
-    m_initPos.xd1 = m_dXCenter - m_dFocalLength;
-    m_initPos.yd1 = m_dYCenter - dHalfDetLen;
-    m_initPos.xd2 = m_dXCenter + m_dFocalLength;
-    m_initPos.yd2 = m_dYCenter - dHalfDetLen;
+    m_initPos.xs1 = m_dXCenter - dHalfDetLen;
+    m_initPos.ys1 = m_dYCenter + m_dFocalLength;
+    m_initPos.xs2 = m_dXCenter + dHalfDetLen;
+    m_initPos.ys2 = m_dYCenter + m_dFocalLength;
+    m_initPos.xd1 = m_dXCenter - dHalfDetLen;
+    m_initPos.yd1 = m_dYCenter - m_dFocalLength;
+    m_initPos.xd2 = m_dXCenter + dHalfDetLen;
+    m_initPos.yd2 = m_dYCenter - m_dFocalLength;
     m_initPos.angle = 0.0;
   } else if (m_idGeometry == GEOMETRY_EQUILINEAR) {
 #if 0
@@ -145,6 +148,8 @@ Scanner::Scanner (const Phantom& phm, const char* const geometryName, int nDet,
 
     m_detLen = dHalfDetLen * 2;
     m_detInc  = m_detLen / m_nDet;
+    if (m_nDet % 2 == 0) // Adjust for Even number of detectors
+      m_detInc = m_detLen / (m_nDet - 1); // center detector = (nDet/2)-1
     
     m_initPos.angle = 0.0;
     m_initPos.xs1 = m_dXCenter;
@@ -171,7 +176,8 @@ Scanner::Scanner (const Phantom& phm, const char* const geometryName, int nDet,
 #endif
     m_detLen = 2 * dAngle;
     m_detInc = m_detLen / m_nDet;
-
+    if (m_nDet % 2 == 0) // Adjust for Even number of detectors
+      m_detInc = m_detLen / (m_nDet - 1); // center detector = (nDet/2)-1
     m_dAngularDetIncrement = m_detInc * 2; // Angular Position 2x gamma angle
     m_dAngularDetLen = m_detLen * 2;
     m_initPos.dAngularDet = -m_dAngularDetLen / 2;
@@ -317,8 +323,6 @@ Scanner::collectProjections (Projections& proj, const Phantom& phm, const int iS
     phm.draw (*m_pSGP);
     m_dTextHeight = m_pSGP->getCharHeight ();
 
-    traceShowParam ("Projection Collector", "%s", PROJECTION_TRACE_ROW_TITLE, C_BLACK, " ");
-    traceShowParam ("________________", "%s", PROJECTION_TRACE_ROW_TITLE2, C_LTGRAY, " ");
     traceShowParam ("Phantom:",       "%s", PROJECTION_TRACE_ROW_PHANT_ID, C_BLACK, phm.name().c_str());
     traceShowParam ("Geometry:", "%s", PROJECTION_TRACE_ROW_GEOMETRY, C_BLUE, convertGeometryIDToName(m_idGeometry));
     traceShowParam ("Focal Length Ratio:", "%.2f", PROJECTION_TRACE_ROW_FOCAL_LENGTH, C_BLUE, m_dFocalLengthRatio);
@@ -357,10 +361,12 @@ Scanner::collectProjections (Projections& proj, const Phantom& phm, const int iS
       }
       m_pSGP->setPenWidth (1);
     }
-    if (m_trace >= Trace::TRACE_CONSOLE)
+    if (m_trace > Trace::TRACE_CONSOLE)
       traceShowParam ("Current View:", "%d (%.0f%%)", PROJECTION_TRACE_ROW_CURR_VIEW, C_RED, iView + iStartView, (iView + iStartView) / static_cast<double>(m_nView) * 100.);
 #endif
-           
+    if (m_trace == Trace::TRACE_CONSOLE)
+       cout << "Current View: " << iView+iStartView << endl;
+
     projectSingleView (phm, detArray, xd1, yd1, xd2, yd2, xs1, ys1, xs2, ys2, viewAngle + 3 * HALFPI);
     detArray.setViewAngle (viewAngle);
       
@@ -468,10 +474,10 @@ Scanner::projectSingleView (const Phantom& phm, DetectorArray& detArray, const d
        sum += projectSingleLine (phm, xd, yd, xs, ys);
              
 #ifdef HAVE_SGP
-       if (m_trace >= Trace::TRACE_CLIPPING) {
-         traceShowParam ("Attenuation:", "%s", PROJECTION_TRACE_ROW_ATTEN, C_LTMAGENTA, "        ");
-         traceShowParam ("Attenuation:", "%.3f", PROJECTION_TRACE_ROW_ATTEN, C_LTMAGENTA, sum);
-       }
+       //      if (m_trace >= Trace::TRACE_CLIPPING) {
+       //        traceShowParam ("Attenuation:", "%s", PROJECTION_TRACE_ROW_ATTEN, C_LTMAGENTA, "        ");
+       //        traceShowParam ("Attenuation:", "%.3f", PROJECTION_TRACE_ROW_ATTEN, C_LTMAGENTA, sum);
+       //      }
 #endif
        if (m_idGeometry == GEOMETRY_EQUIANGULAR)
            dAngle += dAngleSampleInc;
@@ -500,7 +506,11 @@ Scanner::traceShowParam (const char *szLabel, const char *fmt, int row, int colo
 {  
   va_list arg;
   va_start(arg, color);
+#ifdef HAVE_SGP
   traceShowParamRasterOp (RO_COPY, szLabel, fmt, row, color, arg);
+#else
+  traceShowParamRasterOp (0, szLabel, fmt, row, color, arg);
+#endif  
   va_end(arg);
 }
 
@@ -509,7 +519,11 @@ Scanner::traceShowParamXOR (const char *szLabel, const char *fmt, int row, int c
 {  
   va_list arg;
   va_start(arg, color);
+#ifdef HAVE_SGP
   traceShowParamRasterOp (RO_XOR, szLabel, fmt, row, color, arg);
+#else
+  traceShowParamRasterOp (0, szLabel, fmt, row, color, arg);
+#endif
   va_end(arg);
 }
 
@@ -518,26 +532,33 @@ Scanner::traceShowParamRasterOp (int iRasterOp, const char *szLabel, const char
 {  
   char szValue[256];
 
+#ifdef MSVC
+  vsprintf (szValue, fmt, args);
+#else
   vsnprintf (szValue, sizeof(szValue), fmt, args);
+#endif
 
   //  cio_set_cpos (raysum_trace_menu_column, row);
   //  cio_set_text_clr (color - 8, 0);
   //  cio_set_text_clr (color, 0);
 
+#ifdef HAVE_SGP
   if (m_pSGP) {
     m_pSGP->setRasterOp (iRasterOp);
     double dYPos = m_dYMaxWin - (row * m_dTextHeight);
     m_pSGP->moveAbs (m_dXMinWin, dYPos);
     m_pSGP->setTextColor (color, -1);
     m_pSGP->drawText (szLabel);
-    double dValueOffset = (m_dXMaxWin - m_dXMinWin) / 5;
+    double dValueOffset = (m_dXMaxWin - m_dXMinWin) / 4;
     m_pSGP->moveAbs (m_dXMinWin + dValueOffset, dYPos);
     m_pSGP->drawText (szValue);
-  } else {
-    cio_put_str (szLabel);
-    cio_put_str (szValue);
-    cio_put_str ("\n");
-  }
+  } else 
+#endif
+    {
+      cio_put_str (szLabel);
+      cio_put_str (szValue);
+      cio_put_str ("\n");
+    }
 }