r329: *** empty log message ***
[ctsim.git] / libctsim / projections.cpp
index 7de82039d629517652649bf741ede6ae4a5f454b..4c31b3808748681a62e7ae33ad1c25a69ad17307 100644 (file)
@@ -8,7 +8,7 @@
 **  This is part of the CTSim program
 **  Copyright (C) 1983-2000 Kevin Rosenberg
 **
-**  $Id: projections.cpp,v 1.28 2000/12/06 01:46:43 kevin Exp $
+**  $Id: projections.cpp,v 1.34 2001/01/02 06:29:23 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
@@ -71,6 +71,15 @@ Projections::init (const int nView, const int nDet)
   m_nView = nView;
   m_nDet = nDet;
   newProjData ();
+\r
+  time_t t = time (NULL);\r
+  tm* lt = localtime (&t);\r
+  m_year = lt->tm_year;\r
+  m_month = lt->tm_mon;\r
+  m_day = lt->tm_mday;\r
+  m_hour = lt->tm_hour;\r
+  m_minute = lt->tm_min;\r
+  m_second = lt->tm_sec;\r
 }
 
 void
@@ -91,7 +100,7 @@ Projections::initFromScanner (const Scanner& scanner)
 #if 0
   if (m_geometry == Scanner::GEOMETRY_EQUILINEAR) {
     m_detInc /= 2;
-    cout << "Kludge: detInc /= 2 in Projections::initFromScanner" << endl;
+       std::cout << "Kludge: detInc /= 2 in Projections::initFromScanner" << endl;
   }
 #endif
 }
@@ -298,7 +307,7 @@ Projections::headerRead (fnetorderstream& fs)
 }
 
 bool
-Projections::read (const string& filename)
+Projections::read (const std::string& filename)
 {
   return read (filename.c_str());
 }
@@ -307,10 +316,14 @@ Projections::read (const string& filename)
 bool
 Projections::read (const char* filename)
 {
-  frnetorderstream fileRead (filename, ios::in | ios::binary);
-  m_filename = filename;
-
-  if (! fileRead)
+  m_filename = filename;\r
+#ifdef MSVC\r
+  frnetorderstream fileRead (m_filename.c_str(), std::ios::in | std::ios::binary);\r
+#else\r
+  frnetorderstream fileRead (m_filename.c_str(), std::ios::in | std::ios::binary | std::ios::nocreate);\r
+#endif\r
+
+  if (fileRead.fail())
     return false;
 
   if (! headerRead (fileRead))
@@ -329,8 +342,101 @@ Projections::read (const char* filename)
 }
 
 
+bool 
+Projections::copyViewData (const std::string& filename, std::ostream& os, int startView, int endView)
+{
+    return copyViewData (filename.c_str(), os, startView, endView);
+}
+
+bool 
+Projections::copyViewData (const char* const filename, std::ostream& os, int startView, int endView)
+{
+  frnetorderstream is (filename, ios::in | ios::binary);
+  kuint16 sizeHeader, signature;
+  kuint32 _nView, _nDet;
+
+  is.readInt16 (sizeHeader);
+  is.readInt16 (signature);
+  is.readInt32 (_nView);
+  is.readInt32 (_nDet);
+  int nView = _nView;
+  int nDet = _nDet;
+
+  if (signature != m_signature) {
+    sys_error (ERR_FATAL, "Illegal signature in projection file %s", filename);
+    return false;
+  }
+
+  if (startView < 0)
+      startView = 0;
+  if (startView > nView - 1)
+      startView = nView;
+  if (endView < 0 || endView > nView - 1)
+      endView = nView - 1;
+
+  if (startView > endView) { // swap if start > end
+      int tempView = endView;
+      endView = startView;
+      startView = tempView;
+  }
+
+  int sizeView = 8 /* view_angle */ + 4 /* nDet */ + (4 * nDet);
+  unsigned char* pViewData = new unsigned char [sizeView];
+
+  for (int i = startView; i <= endView; i++) {
+      is.seekg (sizeHeader + i * sizeView);
+      is.read (reinterpret_cast<char*>(pViewData), sizeView);
+      os.write (reinterpret_cast<char*>(pViewData), sizeView);
+      if (is.fail() || os.fail())
+         break;
+  }
+
+  delete pViewData;
+  if (is.fail()) 
+    sys_error (ERR_FATAL, "Error reading projection file");
+  if (os.fail()) 
+    sys_error (ERR_FATAL, "Error writing projection file");
+    
+  return (! (is.fail() | os.fail()));
+}
+
+bool 
+Projections::copyHeader (const std::string& filename, std::ostream& os)
+{
+    return copyHeader (filename.c_str(), os);
+}
+
+bool
+Projections::copyHeader (const char* const filename, std::ostream& os)
+{
+  frnetorderstream is (filename, std::ios::in | std::ios::binary);
+  kuint16 sizeHeader, signature;
+  is.readInt16 (sizeHeader);
+  is.readInt16 (signature);
+  is.seekg (0);
+  if (signature != m_signature) {
+    sys_error (ERR_FATAL, "Illegal signature in projection file %s", filename);
+    return false;
+  }
+
+  unsigned char* pHdrData = new unsigned char [sizeHeader];
+  is.read (reinterpret_cast<char*>(pHdrData), sizeHeader);
+  if (is.fail()) {
+      sys_error (ERR_FATAL, "Error reading header");
+      return false;
+  }
+
+  os.write (reinterpret_cast<char*>(pHdrData), sizeHeader);
+  if (os.fail()) {
+      sys_error (ERR_FATAL, "Error writing header");
+      return false;
+  }
+
+  return true;
+}
+
 bool
-Projections::write (const string& filename)
+Projections::write (const std::string& filename)
 {
   return write (filename.c_str());
 }
@@ -338,24 +444,13 @@ Projections::write (const string& filename)
 bool
 Projections::write (const char* filename)
 {
-  frnetorderstream fs (filename, ios::out | ios::binary | ios::trunc | ios::ate);
+  frnetorderstream fs (filename, std::ios::out | std::ios::binary | std::ios::trunc | std::ios::ate);
   m_filename = filename;
   if (! fs) {
     sys_error (ERR_SEVERE, "Error opening file %s for output [projections_create]", filename);
     return false;
   }
 
-#ifdef HAVE_TIME
-  time_t t = time(NULL);
-  tm* lt = localtime(&t);
-  m_year = lt->tm_year;
-  m_month = lt->tm_mon;
-  m_day = lt->tm_mday;
-  m_hour = lt->tm_hour;
-  m_minute = lt->tm_min;
-  m_second = lt->tm_sec;
-#endif
-
   if (! headerWrite (fs))
       return false;
 
@@ -465,7 +560,13 @@ Projections::detarrayWrite (fnetorderstream& fs, const DetectorArray& darray, co
  */
 
 void
-Projections::printProjectionData (void)
+Projections::printProjectionData ()
+{
+  printProjectionData (0, nView() - 1);
+}
+
+void
+Projections::printProjectionData (int startView, int endView)
 {
   printf("Projections Data\n\n");
   printf("Description: %s\n", m_remark.c_str());
@@ -475,18 +576,24 @@ Projections::printProjectionData (void)
   printf("rotStart    = %8.4f       rotInc = %8.4f\n", m_rotStart, m_rotInc);
   printf("detStart    = %8.4f       detInc = %8.4f\n", m_detStart, m_detInc);
   if (m_projData != NULL) {
-      for (int ir = 0; ir < m_nView; ir++) {
-         printf("View %d: angle %f\n", ir, m_projData[ir]->viewAngle());
-         DetectorValue* detval = m_projData[ir]->detValues();
-         for (int id = 0; id < m_projData[ir]->nDet(); id++)
-             printf("%8.4f  ", detval[id]);
-         printf("\n");
-      }
+    if (startView < 0)
+      startView = 0;
+    if (startView > m_nView - 1)
+      startView = m_nView - 1;
+    if (endView > m_nView - 1)
+      endView = m_nView - 1;
+    for (int ir = startView; ir <= endView - 1; ir++) {
+      printf("View %d: angle %f\n", ir, m_projData[ir]->viewAngle());
+      DetectorValue* detval = m_projData[ir]->detValues();
+      for (int id = 0; id < m_projData[ir]->nDet(); id++)
+       printf("%8.4f  ", detval[id]);
+      printf("\n");
+    }
   }
 }
 
 void 
-Projections::printScanInfo (ostringstream& os) const
+Projections::printScanInfo (std::ostringstream& os) const
 {
   os << "Number of detectors: " << m_nDet << "\n";
   os << "    Number of views: " << m_nView<< "\n";